Урок посвящен созданию нового npc с нуля.
Запись файла путей
Для начала нам необходимо записать файл путей для нашего npc. Для этого заходим на сервер, логинимся как ркон админ. Загружем фильтрскрипт npc_record ("/rcon loadfs npc_record" ) (если он не был загружен до этого). Скрипт npc_record содержит три основные команды:
/vrecord <filename> - Начинает запись путей транспорта в указанный файл
/ofrecord <filename> - Начинает запись путей пешехода в указанный файл
/stoprecord - Останавливает запись файла
В этом уроке мы будем делать NPC управляющего транспортом. Поэтому садимся в тачку и пишем /vrecord mynpc
Далее катаемся по пути где будет ездить наш будущий npc
Когда закончим останавливаем запись файла /stoprecord
Выходим из игры и идем в папку scriptfiles, там нас должен ожидать файл mynpc.rec. Перемещаем его в папку /npcmodes/recordings/
Все запись путей для NPC закончена!
Управление NPC
Как вы наверно заметили в папке npcmodes много маленьких pwn скриптов. Они управляют поведением NPC. Теперь создадим скрипт который будет управлять нашим NPC. Скрипт будет следующего содержания:
Quote
#define RECORDING "mynpc" //Это имя файла путей, который мы только что записали
#define RECORDING_TYPE 1//1 для водителя 2 для пешехода
#include <a_npc>
main(){}
public OnRecordingPlaybackEnd() StartRecordingPlayback(RECORDING_TYPE, RECORDING);
public OnNPCEnterVehicle(vehicleid, seatid) StartRecordingPlayback(RECORDING_TYPE, RECORDING);
publicOnNPCExitVehicle() StopRecordingPlayback();
Рассмотрим каждую строчку подробнее:
Quote
#define RECORDING "mynpc" //Это имя файла путей, который мы только что записали
Как говорит комментарий - это имя файла путей который мы записали. Имя указывается без расширения!
Quote
#define RECORDING_TYPE 1//1 для водителя 2 для пешехода
Это тип записи. Для NPC водителя указываем 1, для NPC пешехода 2
Подключаем инклуд содержащий функции для работы с NPC
Quote
public OnRecordingPlaybackEnd() StartRecordingPlayback(RECORDING_TYPE, RECORDING);
Благодаря этой строчке, когда npc проедет весь свой путь, прописанный в его файле, воспроизведение начнется сначало.
Quote
public OnNPCEnterVehicle(vehicleid, seatid) StartRecordingPlayback(RECORDING_TYPE, RECORDING);
Эта строка начинает воспроизведение файла пути когда NPC садиться в транспорт
Quote
publicOnNPCExitVehicle() StopRecordingPlayback();
Эта строка останавливает воспроизведение, если по какой то причине NPC покинет транспорт.
Как видите все просто! Теперь компилируем скрипт mynpc.pwn и отправляем его в папку /npcmodes
Присоединение NPC
Итак у нас уже есть готовый файл путей и скрипт управляющий NPC. Теперь нам нужно загрузить NPC в моде или фильтрскрипте. Для этих целей существует функция ConnectNPC
Синтаксис:
Quote
ConnectNPC("Dave","mynpc");
где, Dave - имя NPC, благодаря которому можно различать между собой разных NPC и заставлять их выполнять различные действия.
mynpc - имя скрипта (без расширения), управляющего NPC
Итак, используя эту функцию загрузим NPC в моде:
Quote
public OnGameModeInit()
{
print("my gamemode");
ConnectNPC("MyFirstNPC","mynpc");
return 1;
}
или в фс
Quote
public OnFilterScriptInit()
{
print("my filterscript");
ConnectNPC("MyFirstNPC","mynpc");
return 1;
}
Теперь когда у нас есть маршрут по которому будет кататься NPC, нужно создать ему транспорт на котором он будет кататься:
Quote
new MyFirstNPCVehicle;
public OnGameModeInit()
{
print("my gamemode");
ConnectNPC("MyFirstNPC","mynpc");
MyFirstNPCVehicle = CreateVehicle(400, 0.0, 0.0, 5.0, 0.0, 3, 3, 5000);
return 1;
}
Положение транспорта не имеет значение, поскольку он будет телепортирован к NPC, когда начнется воспроизведение файла пути.
Еще одна вещь, которую нужно сделать - это посадить NPC в транспорт. Это можно реализовать так:
Quote
public OnPlayerSpawn(playerid)
{
if(IsPlayerNPC(playerid))//Если игрок - NPC.
{
new npcname[MAX_PLAYER_NAME];
GetPlayerName(playerid, npcname, sizeof(npcname));//Получаем имя NPC
if(!strcmp(npcname, "MyFirstNPC", true)) //Проверяем если имя NPC - MyFirstNPC
{
PutPlayerInVehicle(playerid, MyFirstNPCVehicle, 0); //Сажаем NPC в созданный для него транспорт
}
return 1;
}
//Остальной код для обычных игроков
return 1;
}
Большое спасибо за внимание! Вылаживайте что получиться