A1ex | Дата: Понедельник, 11.07.2011, 22:53 | Сообщение # 1 |
.::Offline::.
Новичок
Сообщений: 73
[ 67 ]
Награды: 8
Статус
отсутствует
| Проблемы нужно решать по мере их появления. Писал мод, появилась идея сделать такси npc, который мог останавливаться возле игрока. Бот в автомобиле просто двигался по заданному маршруту, но если возле автомобиля находился игрок, бот останавливался на некоторое время, чтобы игрок успел сесть в авто. Покопался в wiki, ничего похожего не нашел.
К делу. Пришел к более-менее оптимальному варианту. Суть: Из скрипта отправляется сообщение к боту => У бота срабатывает паблик и он выполняет определенные функции.
Код. Запускаем таймер, определяющий положение игроков относительно автомобиля робота: Code public OnFilterScriptInit() { SetTimer("DetectStop",1500,1); //Время - полтора секунды ConnectNPC("Taxi","taxi");//подключаю бота Taxi = CreateVehicle(420,2063.5691,-1800.6869,1473.9557, 0.0, 0, 0, 5000); //автомобиль бота return 1; }
Не буду описывать все функции скрипта: спавн бота, настройка скинов и т.п.
Теперь нужно придумать определенный код, при получении которого бот будет выполнять определенные действия. Есть небольшой минус - если этот код отправит в чат один из игроков, бот сработает. Так что нужно придумать код посложнее. В нашем случае - bot-taxi-pause15465465er5asg1b45
Паблик, вызываемый таймером: Code forward DetectStop(); public DetectStop() { for (new i = 0; i < MAX_PLAYERS; i++) { if((!IsPlayerInVehicle(i,Taxi))&&(!IsPlayerNPC(i))) { new Float:vehx, Float:vehy, Float:vehz; GetVehiclePos(Taxi, vehx, vehy, vehz); if(IsPlayerInRangeOfPoint(i, 5.0, vehx, vehy, vehz)) { SetVehicleVelocity(Taxi,0.0, 0.0, 0.0); SendClientMessage(taxid,0x000000,"bot-taxi-pause15465465er5asg1b45");//Вот этот код =)
} } } }
Тут суть такая. Если один из игроков находится возле авто, отправляется код боту.
Теперь бот: Code new stop=0; public OnClientMessage(color, text[]) { if((strfind(text,"bot-taxi-pause15465465er5asg1b45") != -1)&&(stop==0)) PauseRecordingPlayback(); SetTimer("Resume",8500,0); stop=1;
} forward Resume(); publicResume() { if(stop==1) { ResumeRecordingPlayback(); stop=0; } }
Небольшое описание к написанному выше. Пришлось ввести переменную stop, чтобы скрипт работал правильно. Если бот получает наш код, воспроизведение останавливается и ставится таймер, по истечению которого возобновится воспроизведение бота. Переменная stop лишь дает возможность определенное время не обрабатывать полученный код.
Вот вроде бы и все. Если есть вопросы - пишите
Автор: A1ex
|
|
| |