• Страница 1 из 1
  • 1
Управление npc через filterscript
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 лишь дает возможность определенное время не обрабатывать полученный код.

Вот вроде бы и все. Если есть вопросы - пишите smile

Автор: A1ex
 
  • Страница 1 из 1
  • 1
Поиск:


Copyright www.SAMP-TEAM.com (c) 2009-2024
Правила использования материалов сайта

При копировании материалов из нашего сайта
ссылка на www.SAMP-TEAM.com обязательна!
Нарушители правил будут строго наказаны!

Хостинг от uCoz   
Для корректного просмотра мы рекомендуем Вам использовать браузер Google Chrome.
Яндекс.Метрика
Яндекс.Метрика