04:41
ОбновитьСмайлыУправление мини-чатом
МИНИ-ЧАТ
Главная страница!

 



 
          





Рекомендуем:





Последние Файлы GTA 4 Последние Файлы GTA-MP Реклама
Скрипт GTA 4 элементы Watch... 07.09.2014
Ferrari 360 Spider [EPM con... 13.12.2013
Porsche Cayenne Turbo 2012 ... 13.12.2013
Shelby Terlingua Mustang v1... 13.12.2013
Hamann Lamborghini Gallardo... 27.10.2013
[GM] The Big PEN1:LS v2.00 ... 04.12.2017
Dgun (AvnanceRP,SampRP,Dimo... 19.03.2016
SAMP скрипт SX Events (MySQ... 03.03.2016
Карта ASL мэрия для SAMP се... 03.03.2016
AIM для SA-MP 0.3.7 22.02.2016
  • Страница 1 из 1
  • 1
Модератор форума: Dima-kun  
Создать NPC бота в SAMP (Урок)
EzonДата: Вторник, 15.04.2014, 12:22 | Сообщение # 1
Освоившийся
Группа: Продвинутые
Сообщений: 136
Награды: 0
Репутация: 31
Замечания: 0%
Статус:
Мы создадим простейшего NPC и будем его усложнять.

#include <a_samp>
#include <fcnpc> // подгружаем наши include, находящиеся в D:\serv\ pawno\include
enum npcInfo { // создаем enum для создания таблицы с данными
npc_Name[MAX_PLAYER_NAME],
npc_Skin,
npc_FightStyle,
Float:npc_X,
Float:npc_Y,
Float:npc_Z,
Float:npc_A,
npc_ID,
}
new npc[][npcInfo] = {
{"Test_NPC", 255, FIGHT_STYLE_BOXING, 368.2780,1864.0972,7.6719,185.1584}
};
// согласно enum’у выше создаем нашего NPC с именем Test_NPC, скином 255, стилем боя боксом, координатами x,y,z и углом поворота.
public OnFilterScriptInit() // что произойдет при загрузке скрипта
{
SetTimer("spawnNPC", 3500, 0); // таймер необязателен, но пусть прогрузится.
return 1;
}

public OnFilterScriptExit() //что произойдет при отключении скрипта
{
for (new npcids = 0; npcids < sizeof(npc); npcids++) {
FCNPC_Destroy(npc[npcids][npc_ID]);} // удаляем всех созданных NPC в скрипте
return 1;}
}
forward spawnNPC(); // паблик, где создается наш NPC
public spawnNPC()
{
for (new npcids = 0; npcids < sizeof(npc); npcids++) { //для всех npc в enum’е
npc[npcids][npc_ID] = FCNPC_Create(npc[npcids][npc_Name]); //делаем ID, а не имя
FCNPC_Spawn(npc[npcids][npc_ID], npc[npcids][npc_Skin], npc[npcids][npc_X], npc[npcids][npc_Y], npc[npcids][npc_Z]); //спавним NPC
FCNPC_SetAngle(npc[npcids][npc_ID], npc[npcids][npc_A]); // задаем угол
FCNPC_StopAttack(npc[npcids][npc_ID]); //при спавне NPC тупит, остановим
}
}
Вот пример простейшего скрипта, у нас создается NPC с 255 скином по таким-то координатам и угол поворота такой-то. Усложним скрипт, ведь если мы убьем нашего NPC он же не возродиться, поможем ему обрести жизнь, для этого рекомендуется перейти на версию плагина 0.3x для виндовс, ибо тут мы NPC не убьем, хотя на некоторых серверах убиваются, и у меня убивались, но кто знает, что за сервер у Вас, но если все же вам влом что-то менять, то убьём NPC скриптово, чисто для теста функции, добавим в скрипт:
forward NPC_Death(npcid);
public NPC_Death(npcid)
{
FCNPC_Respawn(npcid);
}
public FCNPC_OnDeath(npcid)
{
SetTimerEx("NPC_Death",5000,0,"dd",npcid);
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if(!strcmp(cmdtext, "/killnpc", true))
{
for (new npcids = 0; npcids < 1; npcids++) {
FCNPC_Kill(npc[npcids][npc_ID]);
}
return 1;
}
return 0;
}
Итак мы пишем /killnpc, наш NPC умирает, выполняется паблик OnDeath, данный паблик у нас работает для всех NPC вообще, так как мы не указали для кого именно выполнять таймер, то для всех NPC это будет работать, но можно сделать и для одного NPC конкретно, так как данный NPC у нас единственный допишем в паблик OnDeath:
public FCNPC_OnDeath(npcid)
{
for (new npcids = 0; npcids < 1; npcids++) {
SetTimerEx("NPC_Death",5000,0,"dd",npcid);}
}
Теперь только для нашего NPC будет осуществлен переход в паблик NPC_Death, где собственное и выполнится функция по респавну (оживлению NPC), NPC респавнится там, где вы его убили, а не там, где он был изначально. Для чего мы задали выполнять перерождение лишь для NPC под номером 0 нашего цикла? Потому что другие NPC могут иметь и другой таймер, вдруг вам захочется сделать какого-нибудь NPC-босса с таймером в полчаса, а может вы и вовсе захотите, чтобы вашего NPC нельзя было убить. Если это так, допишем паблик:
public FCNPC_OnTakeDamage()
{
for (new npcids = 0; npcids < 1; npcids++) {
FCNPC_SetHealth(npc[npcids][npc_ID],100);
}
}
Теперь при нанесении урона по NPC он будет лечиться на 100 хп, обычно сверхдамаг не проходит и этого вполне достаточно, впрочем, это лишь пример, можно вообще игнорить дамаг, но NPC все ещё можно убить с ножа сзади, перерезав горло, чтобы этого не было, проверяйте кнопки игрока, если игрок рядом с NPC, то чтобы ПКМ и ЛКМ не работали, ну это для каких-то особых NPC, которых Вы не хотели бы убивать.

Взято из группы про SAMP вконтакте (автор там указан не был, к сожалению...)



Если хочешь быть как я - ошибка в том, что ты хочешь быть как кто-то. Я никогда не на кого не ровняюсь.
  • Страница 1 из 1
  • 1
Поиск:





 


 


 
Хостинг от uCoz samp.at.ua