^_^
09.01.2014, 20:43
Доброго времени суток дорогие форумчане, в данном уроке вы подробно узнаете как создать своего собственного NPC бота.
Предисловие: За время моей практики я уже написал ещё один урок по созданию NPC бота, но к сожалению к тому времени у меня было мало опыта и допустил не мало ошибок. В данном уроке я попытаюсь исправить все мои допущенные ошибки, ну а также учту все нововведения появившийся с того момента.
Некоторые часто задаваемые вопросы:
Q:Что такое NPC?
A:NPC (Non-Playing Characters или 'боты') это нововведение в версии SA-MP 0.3. Данная нововведение позволяет вам добавить одного или несколько NPC на вашем сервере. Боты будут работать как "виртуальные игроки", при этом будут занимать 1 слот, также как нормальный игрок. (Подробнее: КЛАЦ (http://wiki.sa-mp.com/wiki/Category:NPC))
Q:Нужны ли определённые дополнения (плагин к примеру) для создания NPC?
A:Нет, всё нужное встроено в клиентах версии 0.3+. Если же, в папках .../pawno/include/ отсутствуют инлкюды a_npc или a_samp, вы можете их скопировать с официального сайта sa-mp.
I. Создание NPC
1) Заходим в корневую папку вашего сервера, находим файл server.cfg, открываем в Блокноте, и добавляем/изменяем после строчки "maxnpc" значение на *количество ботов которых вы хотите создать*.
http://breedpmnr.ru/i/b78a4baca10d74d23766eadd0a07.jpg
2) Открываем pawno, и создаём новый файл. Заменяем всё содержимое на:
#include <a_samp>
#tryinclude <dc_cmd>
#if defined DC_CMD
CMD:startrecrod(playerid, params[])
{
if(!strlen(params[0])) return SendClientMessage(playerid,0xFF0000FF,"Использвание: /startrecord {Название записи}");
if(!IsPlayerInAnyVehicle(playerid)) StartRecordingPlayerData(playerid,PLAYER_RECORDING_TYPE_DRIVER,params[0]);
else StartRecordingPlayerData(playerid,PLAYER_RECORDING_TYPE_ONFOOT,params[0]);
SendClientMessage(playerid,0xFF0000FF,"Запись началась.");
return 1;
}
CMD:stoprecord(playerid, params[])
{
StopRecordingPlayerData(playerid);
SendClientMessage(playerid,0xFF0000FF,"Запись остановлена.");
return 1;
}
#else
#include "../include/gl_common.inc"
public OnPlayerCommandText(playerid, cmdtext[])
{
new cmd[256];
new idx;
cmd = strtok(cmdtext, idx);
if(strcmp(cmd, "/startrecord", true) == 0){
new tmp[512];
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid,0xFF0000FF,"Использвание: /startrecord {Название записи}");
if(!IsPlayerInAnyVehicle(playerid)) StartRecordingPlayerData(playerid,PLAYER_RECORDING_TYPE_DRIVER,tmp);
else StartRecordingPlayerData(playerid,PLAYER_RECORDING_TYPE_ONFOOT,tmp);
SendClientMessage(playerid,0xFF0000FF,"Запись началась.");
return 1;
}
if(strcmp(cmd, "/stoprecord", true) == 0) {
StopRecordingPlayerData(playerid);
SendClientMessage(playerid,0xFF0000FF,"Запись остановлена.");
return 1;
}
return 0;
}
#endif
Компилируем под названием record в каталог(папку) filterscripts.
*Команды данного скрипта скомпилируются на DC_CMD (при наличии includa <dc_cmd>) либо на стандартный командный процессор.
http://breedpmnr.ru/i/39cf031f4377d4e72dc5e2f42d7f.jpg
3) Вводим в консоль команду "loadfs record"(без кавычек), либо в игре: /rcon loadfs record (сперва нужно авторизоваться как администратор).
http://breedpmnr.ru/i/dcc4ef069154f41597cdfa9b39f9.jpg
4) Заходим в игру и пишем /startrecrod "Название записи" с позиции старта/повтора записи бота.
После того как мы повторили точные движения бота, вводим /stoprecord.
-"Запись началась"
-"Запись остановлена."
5) Открываем каталог \scriptfiles и находим в нём файл с ранее указанным названием (расширение .rec).
6) Копируем/вырезаем файл в каталоге \npcmodes\recordings
7) Открываем компилятор, создаём новый файл, и заменяем всё содержимое на:
#define RECORDING "Название записи" //ковычки оставляем
#define RECORDING_TYPE 1// Заменяем на любое другое число если запись
#define RECORDING_REPLAY 1// Повтор записи, 1 - да, 0 - нет
#include <a_npc>
main(){}
#if RECORDING_REPLAY == 1
public OnRecordingPlaybackEnd() StartRecordingPlayback(RECORDING_TYPE, RECORDING);
#endif
#if RECORDING_TYPE == 1
public OnNPCEnterVehicle(vehicleid, seatid) StartRecordingPlayback(RECORDING_TYPE, RECORDING);
public OnNPCExitVehicle() StopRecordingPlayback();
#else
public OnNPCSpawn() StartRecordingPlayback(RECORDING_TYPE, RECORDING);
#endif
Компилируем в каталог \npcmodes с тем же названием что и у записи.
*Не забываем изменить директивы #define на нужные нам параметры.
*Вы также можете использовать в данный скрипт и другие NPC калбэки, полный список всех NPC калбэков: КЛАЦ (http://wiki.sa-mp.com/wiki/Category:NPC)
8) Подключаем бота при помощи функции ConnectNPC(name[], script[]) - желательно в OnGameModeInit*.
public OnGameModeInit()
{
ConnectNPC("Nick_Name","MyRec");
return 1;
}
*Так, у бота, без всякого риска останется свободный слот.
9) Если запись бота происходила а автомобиле, обязательно создавать его (при помощи функции CreateVehicle/AddStaticVehicle). Также, не обязательно указывать точные координаты спавна автомобиля, так как бот сам телепортирует её к месту старта записи, но не нужно забывать про PutPlayerInVehicle.
Пример:
new botcar;
public OnGameModeInit()
{
ConnectNPC("Nick_Name","MyRec");
botcar = CreateVehicle(*carid*, 0.0, 0.0, 5.0, 0.0,
*цвет1*, *цвет2*, 5000);
return 1;
}
public OnPlayerSpawn(playerid)
{
if(IsPlayerNPC(playerid))
{
new npcname[MAX_PLAYER_NAME+1];
GetPlayerName(playerid, npcname, sizeof(npcname));
if(!strcmp(npcname, "Nick_Name", true))
{
PutPlayerInVehicle(playerid, botcar, 0);
SetSpawnInfo(playerid,0,*skinid*,0.0,0.0,0.0,0.0,0,0,0,0,0,0);
}
return 1;
}
return 1;
}
10) ПРИМЕЧАНИЕ: После его подключение, бот ведёт себя как обычный игрок, и по мимо калбэков в NPC скрипте, он отвечает на обычных калбэков для игроков. Иногда это удобно, но при этом есть некоторые калбэки или функцие которые NPC не сможет пройти, к примеру вашу Реггистрацию, Анти-Чит телепорта и т.д. Следовательно, в данных калбэков нужно исключить NPC простой проверки:
if(IsPlayerNPC(playerid)) return 1;
*Можно экспериментировать калбэками (КЛАЦ (http://wiki.sa-mp.com/wiki/Category:Scripting_Callbacks)) и обычными функциями и создать весьма интересные системы ; ).
Данный урок посвящается порталу pro-pawn.ru, просьба не копировать на посторонних источниках.
Автор: ^_^
Тема будет дополнятся.
Предисловие: За время моей практики я уже написал ещё один урок по созданию NPC бота, но к сожалению к тому времени у меня было мало опыта и допустил не мало ошибок. В данном уроке я попытаюсь исправить все мои допущенные ошибки, ну а также учту все нововведения появившийся с того момента.
Некоторые часто задаваемые вопросы:
Q:Что такое NPC?
A:NPC (Non-Playing Characters или 'боты') это нововведение в версии SA-MP 0.3. Данная нововведение позволяет вам добавить одного или несколько NPC на вашем сервере. Боты будут работать как "виртуальные игроки", при этом будут занимать 1 слот, также как нормальный игрок. (Подробнее: КЛАЦ (http://wiki.sa-mp.com/wiki/Category:NPC))
Q:Нужны ли определённые дополнения (плагин к примеру) для создания NPC?
A:Нет, всё нужное встроено в клиентах версии 0.3+. Если же, в папках .../pawno/include/ отсутствуют инлкюды a_npc или a_samp, вы можете их скопировать с официального сайта sa-mp.
I. Создание NPC
1) Заходим в корневую папку вашего сервера, находим файл server.cfg, открываем в Блокноте, и добавляем/изменяем после строчки "maxnpc" значение на *количество ботов которых вы хотите создать*.
http://breedpmnr.ru/i/b78a4baca10d74d23766eadd0a07.jpg
2) Открываем pawno, и создаём новый файл. Заменяем всё содержимое на:
#include <a_samp>
#tryinclude <dc_cmd>
#if defined DC_CMD
CMD:startrecrod(playerid, params[])
{
if(!strlen(params[0])) return SendClientMessage(playerid,0xFF0000FF,"Использвание: /startrecord {Название записи}");
if(!IsPlayerInAnyVehicle(playerid)) StartRecordingPlayerData(playerid,PLAYER_RECORDING_TYPE_DRIVER,params[0]);
else StartRecordingPlayerData(playerid,PLAYER_RECORDING_TYPE_ONFOOT,params[0]);
SendClientMessage(playerid,0xFF0000FF,"Запись началась.");
return 1;
}
CMD:stoprecord(playerid, params[])
{
StopRecordingPlayerData(playerid);
SendClientMessage(playerid,0xFF0000FF,"Запись остановлена.");
return 1;
}
#else
#include "../include/gl_common.inc"
public OnPlayerCommandText(playerid, cmdtext[])
{
new cmd[256];
new idx;
cmd = strtok(cmdtext, idx);
if(strcmp(cmd, "/startrecord", true) == 0){
new tmp[512];
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid,0xFF0000FF,"Использвание: /startrecord {Название записи}");
if(!IsPlayerInAnyVehicle(playerid)) StartRecordingPlayerData(playerid,PLAYER_RECORDING_TYPE_DRIVER,tmp);
else StartRecordingPlayerData(playerid,PLAYER_RECORDING_TYPE_ONFOOT,tmp);
SendClientMessage(playerid,0xFF0000FF,"Запись началась.");
return 1;
}
if(strcmp(cmd, "/stoprecord", true) == 0) {
StopRecordingPlayerData(playerid);
SendClientMessage(playerid,0xFF0000FF,"Запись остановлена.");
return 1;
}
return 0;
}
#endif
Компилируем под названием record в каталог(папку) filterscripts.
*Команды данного скрипта скомпилируются на DC_CMD (при наличии includa <dc_cmd>) либо на стандартный командный процессор.
http://breedpmnr.ru/i/39cf031f4377d4e72dc5e2f42d7f.jpg
3) Вводим в консоль команду "loadfs record"(без кавычек), либо в игре: /rcon loadfs record (сперва нужно авторизоваться как администратор).
http://breedpmnr.ru/i/dcc4ef069154f41597cdfa9b39f9.jpg
4) Заходим в игру и пишем /startrecrod "Название записи" с позиции старта/повтора записи бота.
После того как мы повторили точные движения бота, вводим /stoprecord.
-"Запись началась"
-"Запись остановлена."
5) Открываем каталог \scriptfiles и находим в нём файл с ранее указанным названием (расширение .rec).
6) Копируем/вырезаем файл в каталоге \npcmodes\recordings
7) Открываем компилятор, создаём новый файл, и заменяем всё содержимое на:
#define RECORDING "Название записи" //ковычки оставляем
#define RECORDING_TYPE 1// Заменяем на любое другое число если запись
#define RECORDING_REPLAY 1// Повтор записи, 1 - да, 0 - нет
#include <a_npc>
main(){}
#if RECORDING_REPLAY == 1
public OnRecordingPlaybackEnd() StartRecordingPlayback(RECORDING_TYPE, RECORDING);
#endif
#if RECORDING_TYPE == 1
public OnNPCEnterVehicle(vehicleid, seatid) StartRecordingPlayback(RECORDING_TYPE, RECORDING);
public OnNPCExitVehicle() StopRecordingPlayback();
#else
public OnNPCSpawn() StartRecordingPlayback(RECORDING_TYPE, RECORDING);
#endif
Компилируем в каталог \npcmodes с тем же названием что и у записи.
*Не забываем изменить директивы #define на нужные нам параметры.
*Вы также можете использовать в данный скрипт и другие NPC калбэки, полный список всех NPC калбэков: КЛАЦ (http://wiki.sa-mp.com/wiki/Category:NPC)
8) Подключаем бота при помощи функции ConnectNPC(name[], script[]) - желательно в OnGameModeInit*.
public OnGameModeInit()
{
ConnectNPC("Nick_Name","MyRec");
return 1;
}
*Так, у бота, без всякого риска останется свободный слот.
9) Если запись бота происходила а автомобиле, обязательно создавать его (при помощи функции CreateVehicle/AddStaticVehicle). Также, не обязательно указывать точные координаты спавна автомобиля, так как бот сам телепортирует её к месту старта записи, но не нужно забывать про PutPlayerInVehicle.
Пример:
new botcar;
public OnGameModeInit()
{
ConnectNPC("Nick_Name","MyRec");
botcar = CreateVehicle(*carid*, 0.0, 0.0, 5.0, 0.0,
*цвет1*, *цвет2*, 5000);
return 1;
}
public OnPlayerSpawn(playerid)
{
if(IsPlayerNPC(playerid))
{
new npcname[MAX_PLAYER_NAME+1];
GetPlayerName(playerid, npcname, sizeof(npcname));
if(!strcmp(npcname, "Nick_Name", true))
{
PutPlayerInVehicle(playerid, botcar, 0);
SetSpawnInfo(playerid,0,*skinid*,0.0,0.0,0.0,0.0,0,0,0,0,0,0);
}
return 1;
}
return 1;
}
10) ПРИМЕЧАНИЕ: После его подключение, бот ведёт себя как обычный игрок, и по мимо калбэков в NPC скрипте, он отвечает на обычных калбэков для игроков. Иногда это удобно, но при этом есть некоторые калбэки или функцие которые NPC не сможет пройти, к примеру вашу Реггистрацию, Анти-Чит телепорта и т.д. Следовательно, в данных калбэков нужно исключить NPC простой проверки:
if(IsPlayerNPC(playerid)) return 1;
*Можно экспериментировать калбэками (КЛАЦ (http://wiki.sa-mp.com/wiki/Category:Scripting_Callbacks)) и обычными функциями и создать весьма интересные системы ; ).
Данный урок посвящается порталу pro-pawn.ru, просьба не копировать на посторонних источниках.
Автор: ^_^
Тема будет дополнятся.