В данной статье я постараюсь рассказать - как создать NPC(бота на amxx), которого вы сможете запрограммировать на любые действия - если конечно присутствует серое вещество, а не опилки..
В статье мы разберем непосредственное создание npc, перемещение по карте и его смерть
Приступаем!
Я не буду расписывать каждую строку отдельно, а буду приводить отдельные функции со всеми комментариями и пометками.
Для начала создадим шаблон, с которым можно работать. Сразу же включим в него все необходимые модули, массив, переменные и функции
Ну собственно код выглядит так. Я надеюсь ни у кого не составит труда понять что к чему
- Код: Выделить всё
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#define PLUGIN "TestNPC"
#define VERSION "1.0"
#define AUTHOR "CrAsH"
new g_Cvar[5] //квары
new const gModel[] = "models/player/vip/vip.mdl" //Модель NPC
new const gClassname[] = "TestNPC" //Класснейм NPC
//Флагменты костей(разрыв npc на части хД)
enum _:GIBS
{
HEAD,
LEG,
BONE,
LUNG,
GIB
}
new gModelGibs[GIBS] //Прекаши костей
new gSpriteBlood //прекаш спрайта
new iNPC_ID //Идентификатор созданного NPC
new iPlayer_ID //Идентификатор игрока, который создал NPC
new Float:fNPCOrigin[3] //Координаты точки появление NPC
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR) //Ну думаю тут ясно
register_think(gClassname, "NPCThink") //Событие действий NPC
g_Cvar[1] = register_cvar("testnpc_health", "100") //жизни npc
g_Cvar[2] = register_cvar("testnpc_speed", "100") //Скорость noc
g_Cvar[3] = register_cvar("testnpc_distance", "100") //Минимальная дистанция при которой он побежит за вами
register_clcmd("say /npc_origin", "NPCOrigin") //Команда создание координат появление
register_clcmd("say /npc_create", "NPCCreate") //Команда непосредственного создания
}
public plugin_precache()
{
precache_model( gModel ) //Прекаш модели NPC
//Костей
gModelGibs[HEAD] = precache_model("models/gib_skull.mdl")
gModelGibs[LEG] = precache_model("models/gib_legbone.mdl")
gModelGibs[BONE] = precache_model("models/gib_b_bone.mdl")
gModelGibs[LUNG] = precache_model("models/gib_lung.mdl")
gModelGibs[GIB] = precache_model("models/gib_b_gib.mdl")
//Крови
gSpriteBlood = precache_model("sprites/blood.spr")
}
Думаю здесь всё понятно. Как видите у меня зарегистрировано 2 команды для создание координат и создания самого npc.
Давайте рассмотрим создание координат
- Код: Выделить всё
public NPCOrigin(id)
{
entity_get_vector(id, EV_VEC_origin, fNPCOrigin) //Записываем координаты
client_print(id, print_chat, "[NPC]Origin create") //выводим сообщение
}
Как видите здесь ничего сложного нет. В уже подготовленный массив fNPCOrigin мы записываем координаты своего положения, чтобы на это место поставить NPC.
Давайте рассмотрим создание NPC
- Код: Выделить всё
public NPCCreate(id)
{
iPlayer_ID = id //Записываем идентификатор игрока, запустившего создание NPC
if(iNPC_ID) //Если npc уже был создан
{
remove_entity(iNPC_ID) //Убираем его
iNPC_ID = 0 //Сбрасываем идентификатор
}
iNPC_ID = create_entity("info_target") //Создаем объект
if(pev_valid( iNPC_ID )) //Проверяем, создан ли объект
{
client_print(id, print_chat, "[NPC]Create") //Если да, пишем, что создан
}else{
client_print(id, print_chat, "[NPC]Error create") //Иначе выводим
return PLUGIN_HANDLED //Прекращаем дальшейнее выполнение функции
}
entity_set_origin(iNPC_ID, fNPCOrigin) //Ставим на координаты, созданные нами ранее
entity_set_float(iNPC_ID, EV_FL_takedamage,1.0) //Делаем смертным
new Float:fHealth = float( get_pcvar_num( g_Cvar[1] )) //Получаем значение квара и конвертируем в дробное число
entity_set_float(iNPC_ID, EV_FL_health, fHealth) //Присваиваем количество жизней
entity_set_model(iNPC_ID, gModel) //Присваем модель
entity_set_string(iNPC_ID, EV_SZ_classname, gClassname) //Присваиваем класс
entity_set_int(iNPC_ID, EV_INT_solid, SOLID_BBOX) //Делаем его материальным
entity_set_int(iNPC_ID, EV_INT_movetype, MOVETYPE_PUSHSTEP) //NPC может передвигаться по карте
entity_set_size(iNPC_ID, Float:{-16.0, -16.0, -36.0}, Float:{16.0, 16.0, 36.0}) //Задаем размеры( не путать с размером модели )
entity_set_float(iNPC_ID, EV_FL_nextthink, halflife_time() + 0.01) //Заводим think
//Задаем свойства
set_pev(iNPC_ID, pev_enemy, 0)
entity_set_int(iNPC_ID, EV_INT_gamestate,1)
entity_set_int(iNPC_ID, EV_INT_sequence, 1) //Задаем начальную анимацию
entity_set_float(iNPC_ID, EV_FL_animtime, get_gametime()) //Задаем время анимации
entity_set_float(iNPC_ID, EV_FL_framerate, 1.0) //Задаем скорость анимации
entity_set_float(iNPC_ID, EV_FL_frame, 0.0) //Задаем начальный кадр
RegisterHamFromEntity(Ham_Killed, iNPC_ID, "NPCKilled") //Задаем событие смерти
//Создаем в руках оружие
new iWeapon = create_entity("info_target")
entity_set_int(iWeapon, EV_INT_solid, SOLID_NOT) //Не задаем никаких физичиских свойств
entity_set_int(iWeapon, EV_INT_movetype, MOVETYPE_FOLLOW) //Задаем свойство следования объекта за игроком
entity_set_edict(iWeapon, EV_ENT_aiment, iNPC_ID) //Непосредственно прикрепление объекта к NPC
entity_set_model(iWeapon, "models/p_ak47.mdl") //Задаем модель( можете хоть гранатомет ему давать )
return PLUGIN_HANDLED //конец
}
Как вы наверное поняли мы создадим NPC, который будет в моделе vip и дадим в руки модель ak47.Это придаст достаточно видимости, что перед нами реальный игрок и отличить от настоящего игрока будет не совсем просто.
Следующим шагом будет создание think`а npc. Это самая важная часть плагина, которая отвечает за передвижение игрока.Без него он тупо будет стоять и ворон считать. Не будем стоять на месте и создаем
- Код: Выделить всё
public NPCThink( iEntity )
{
if(!is_valid_ent( iEntity )) //Если NPC не существует
return FMRES_IGNORED //Прекращаем дальшейнее выполнение функции
if(!is_user_alive( iPlayer_ID ) || !is_user_connected( iPlayer_ID )) //Если игрок мертв или отсоеденился
{
remove_entity( iEntity ) //Убираем NPC
iNPC_ID = 0 //Сбрасываем идентификатор
return FMRES_IGNORED //Прекращаем дальшейнее выполнение функции
}
new Float:fNOrigin[3], Float:fPOrigin[3] //Сюда запишем координаты NPC и игрока
new Float:fDistance //Сюда запишем расстяние между ними
pev(iEntity, pev_origin, fNOrigin) //Получаем координаты NPC
pev(iPlayer_ID, pev_origin, fPOrigin) //Получаем координаты игрока
fDistance = get_distance_f(fNOrigin, fPOrigin) //Получаем дистанцию между ними
if(fDistance <= float( get_pcvar_num( g_Cvar[3] ) )) //Если дистация межде указанной
{
client_print(iPlayer_ID, print_center, "[NPC]I caught up with you") //Чисто для прикола выводим, что NPC догнал нас
if(pev(iEntity, pev_sequence) != 1) //Если анимация npc установлена не стоячая
{
entity_set_int(iEntity, EV_INT_sequence, 1) //Задаем анимацию бега
entity_set_float(iEntity, EV_FL_animtime, get_gametime()) //Задаем время анимации
entity_set_float(iEntity, EV_FL_framerate, 1.0) //Задаем скорость анимации
entity_set_float(iEntity, EV_FL_frame, 0.0) //Задаем начальный кадр
}
}else{
if(pev(iEntity, pev_sequence) != 4) //Если анимация npc установлена не бега
{
entity_set_int(iEntity, EV_INT_sequence, 4) //Задаем анимацию бега
entity_set_float(iEntity, EV_FL_animtime, get_gametime()) //Задаем время анимации
entity_set_float(iEntity, EV_FL_framerate, 1.0) //Задаем скорость анимации
entity_set_float(iEntity, EV_FL_frame, 0.0) //Задаем начальный кадр
}
new Float:fAngles[3] //Сюда запишем координаты, куда должен будет смотреть NPC
new Float:fVelocity[3] //Сюда запишем координаты, куда будет бежать NPC
entity_get_vector(iEntity, EV_VEC_angles, fAngles) //Получаем
new Float:fX = fPOrigin[0] - fNOrigin[0] //Расчитываем координаты x
new Float:fZ = fPOrigin[1] - fNOrigin[1] //Расчитываем координаты z
new Float:fRadian
fRadian = floatatan(fZ/fX, radian) //Получаем угол
fAngles[1] = fRadian * (180 / 3.14) //Приваиваем координаты
if(fPOrigin[0] < fNOrigin[0]) //Если координаты игрока относительно x меньше NPC`овскивх
{
fAngles[1] = fAngles[1] - 180.0 //Разворачиваем его
}else{
fAngles[1] = fRadian * (180 / 3.14) //Записываем координаты
}
new Float:fSpeed = fDistance / float( get_pcvar_num( g_Cvar[2] ) ) //Задаем скорость
//Записываем координаты куда бежать
fVelocity[0] = (fPOrigin[0] - fNOrigin[0]) / fSpeed
fVelocity[1] = (fPOrigin[1] - fNOrigin[1]) / fSpeed
fVelocity[2] = (fPOrigin[2] - fNOrigin[2]) / fSpeed
entity_set_vector(iEntity, EV_VEC_angles, fAngles) //Присваиваем новые координаты куда смотреть
entity_set_vector(iEntity, EV_VEC_velocity, fVelocity) //Присваиваем новые координаты куда бежать
}
entity_set_float(iEntity, EV_FL_nextthink, halflife_time() + 0.01) //Повторяем
return FMRES_HANDLED
}
По комментариям думаю всё ясно и понятно. NPC будет бегать за тем, кто создал его. Разумеется вы сможете сделать бег за всеми, кто ближе к примеру. Суть не меняется. Всё зависит только от вашей фантазии
Ну и последнее, что мы сделаем - это его смерть.
- Код: Выделить всё
public NPCKilled( iEntity )
{
new iEntity2 = create_entity("info_target") //Создаем нового, тот пропал
if(pev_valid( iEntity2 )) //Проверяем, создан ли объект
{
client_print(iPlayer_ID, print_chat, "[NPC]Create Dead create") //Если да, пишем, что создан
}else{
client_print(iPlayer_ID, print_chat, "[NPC]Error create") //Иначе выводим
return PLUGIN_HANDLED //Прекращаем дальшейнее выполнение функции
}
new Float:fOrigin[3], Float:fAngles[3] //Запишем, как стоял старый NPC
pev(iEntity, pev_origin, fOrigin) //Получаем координаты
pev(iEntity, pev_angles, fAngles) //Получаем куда смотрит
entity_set_origin(iEntity2, fOrigin) //Присваиваем
entity_set_vector(iEntity2, EV_VEC_angles, fAngles) //Присваиваем
entity_set_model(iEntity2, gModel) //Задаем модель
entity_set_size(iNPC_ID, Float:{-16.0, -16.0, -36.0}, Float:{16.0, 16.0, 36.0}) //Задаем размеры( не путать с размером модели )
entity_set_int(iEntity2, EV_INT_sequence, 108) //Задаем анимацию смерти
entity_set_float(iEntity2, EV_FL_animtime, get_gametime()) //Задаем время анимации
entity_set_float(iEntity2, EV_FL_framerate, 1.0) //Задаем скорость анимации
entity_set_float(iEntity2, EV_FL_frame, 0.0) //Задаем начальный кадр
set_task(10.0, "GibsNPC", iEntity2) //Разорвем на куски npc через 10 сек и уничтожим его.
return PLUGIN_HANDLED //конец
}
public GibsNPC( iEntity )
{
new Float:fOrigin[3] //Куда запишем
pev(iEntity, pev_origin, fOrigin) //Получаем координаты
for(new i; i < sizeof gModelGibs; i++) //Разбрасываем кости
{
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(TE_MODEL)
engfunc(EngFunc_WriteCoord, fOrigin[0])
engfunc(EngFunc_WriteCoord, fOrigin[1])
engfunc(EngFunc_WriteCoord, fOrigin[2])
write_coord(random_num(100, 400))
write_coord(random_num(100, 400))
write_coord(random_num(100, 400))
write_angle(random( 361 ))
write_short(gModelGibs[i])
write_byte(1)
write_byte(125)
message_end()
}
//Создаем кровь
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BLOODSPRITE)
engfunc(EngFunc_WriteCoord, fOrigin[0])
engfunc(EngFunc_WriteCoord, fOrigin[1])
engfunc(EngFunc_WriteCoord, fOrigin[2])
write_short(gSpriteBlood)
write_short(gSpriteBlood)
write_byte(250)
write_byte(20)
message_end()
remove_entity( iEntity ) //Уничтожаем его нахер
client_print(iPlayer_ID, print_chat, "[NPC]Terminated") //Выводим сообщение что ли
}
Ну вот и всё. Я чет устал писать, но думаю я делал это не зря. На форуме уже 3 человека попросили статью про npc - получите.
Полный исходный код выглядит так:
- Код: Выделить всё
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#define PLUGIN "TestNPC"
#define VERSION "1.0"
#define AUTHOR "CrAsH"
new g_Cvar[5] //квары
new const gModel[] = "models/player/vip/vip.mdl" //Модель NPC
new const gClassname[] = "TestNPC" //Класснейм NPC
//Флагменты костей(разрыв npc на части хД)
enum _:GIBS
{
HEAD,
LEG,
BONE,
LUNG,
GIB
}
new gModelGibs[GIBS] //Прекаши костей
new gSpriteBlood //прекаш спрайта
new iNPC_ID //Идентификатор созданного NPC
new iPlayer_ID //Идентификатор игрока, который создал NPC
new Float:fNPCOrigin[3] //Координаты точки появление NPC
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR) //Ну думаю тут ясно
register_think(gClassname, "NPCThink") //Событие действий NPC
g_Cvar[1] = register_cvar("testnpc_health", "100") //жизни npc
g_Cvar[2] = register_cvar("testnpc_speed", "100") //Скорость noc
g_Cvar[3] = register_cvar("testnpc_distance", "100") //Минимальная дистанция при которой он побежит за вами
register_clcmd("say /npc_origin", "NPCOrigin") //Команда создание координат появление
register_clcmd("say /npc_create", "NPCCreate") //Команда непосредственного создания
}
public plugin_precache()
{
precache_model( gModel ) //Прекаш модели NPC
//Костей
gModelGibs[HEAD] = precache_model("models/gib_skull.mdl")
gModelGibs[LEG] = precache_model("models/gib_legbone.mdl")
gModelGibs[BONE] = precache_model("models/gib_b_bone.mdl")
gModelGibs[LUNG] = precache_model("models/gib_lung.mdl")
gModelGibs[GIB] = precache_model("models/gib_b_gib.mdl")
//Крови
gSpriteBlood = precache_model("sprites/blood.spr")
}
public NPCOrigin(id)
{
entity_get_vector(id, EV_VEC_origin, fNPCOrigin)
client_print(id, print_chat, "[NPC]Origin create")
}
public NPCCreate(id)
{
iPlayer_ID = id //Записываем идентификатор игрока, запустившего создание NPC
if(iNPC_ID) //Если npc уже был создан
{
remove_entity(iNPC_ID) //Убираем его
iNPC_ID = 0 //Сбрасываем идентификатор
}
iNPC_ID = create_entity("info_target") //Создаем объект
if(pev_valid( iNPC_ID )) //Проверяем, создан ли объект
{
client_print(id, print_chat, "[NPC]Create") //Если да, пишем, что создан
}else{
client_print(id, print_chat, "[NPC]Error create") //Иначе выводим
return PLUGIN_HANDLED //Прекращаем дальшейнее выполнение функции
}
entity_set_origin(iNPC_ID, fNPCOrigin) //Ставим на координаты, созданные нами ранее
entity_set_float(iNPC_ID, EV_FL_takedamage,1.0) //Делаем смертным
new Float:fHealth = float( get_pcvar_num( g_Cvar[1] )) //Получаем значение квара и конвертируем в дробное число
entity_set_float(iNPC_ID, EV_FL_health, fHealth) //Присваиваем количество жизней
entity_set_model(iNPC_ID, gModel) //Присваем модель
entity_set_string(iNPC_ID, EV_SZ_classname, gClassname) //Присваиваем класс
entity_set_int(iNPC_ID, EV_INT_solid, SOLID_BBOX) //Делаем его материальным
entity_set_int(iNPC_ID, EV_INT_movetype, MOVETYPE_PUSHSTEP) //NPC может передвигаться по карте
entity_set_size(iNPC_ID, Float:{-16.0, -16.0, -36.0}, Float:{16.0, 16.0, 36.0}) //Задаем размеры( не путать с размером модели )
entity_set_float(iNPC_ID, EV_FL_nextthink, halflife_time() + 0.01) //Заводим think
//Задаем свойства
set_pev(iNPC_ID, pev_enemy, 0)
entity_set_int(iNPC_ID, EV_INT_gamestate,1)
entity_set_int(iNPC_ID, EV_INT_sequence, 1) //Задаем начальную анимацию
entity_set_float(iNPC_ID, EV_FL_animtime, get_gametime()) //Задаем время анимации
entity_set_float(iNPC_ID, EV_FL_framerate, 1.0) //Задаем скорость анимации
entity_set_float(iNPC_ID, EV_FL_frame, 0.0) //Задаем начальный кадр
RegisterHamFromEntity(Ham_Killed, iNPC_ID, "NPCKilled") //Задаем событие смерти
//Создаем в руках оружие
new iWeapon = create_entity("info_target")
entity_set_int(iWeapon, EV_INT_solid, SOLID_NOT) //Не задаем никаких физичиских свойств
entity_set_int(iWeapon, EV_INT_movetype, MOVETYPE_FOLLOW) //Задаем свойство следования объекта за игроком
entity_set_edict(iWeapon, EV_ENT_aiment, iNPC_ID) //Непосредственно прикрепление объекта к NPC
entity_set_model(iWeapon, "models/p_ak47.mdl") //Задаем модель( можете хоть гранатомет ему давать )
return PLUGIN_HANDLED //конец
}
public NPCThink( iEntity )
{
if(!is_valid_ent( iEntity )) //Если NPC не существует
return FMRES_IGNORED //Прекращаем дальшейнее выполнение функции
if(!is_user_alive( iPlayer_ID ) || !is_user_connected( iPlayer_ID )) //Если игрок мертв или отсоеденился
{
remove_entity( iEntity ) //Убираем NPC
iNPC_ID = 0 //Сбрасываем идентификатор
return FMRES_IGNORED //Прекращаем дальшейнее выполнение функции
}
new Float:fNOrigin[3], Float:fPOrigin[3] //Сюда запишем координаты NPC и игрока
new Float:fDistance //Сюда запишем расстяние между ними
pev(iEntity, pev_origin, fNOrigin) //Получаем координаты NPC
pev(iPlayer_ID, pev_origin, fPOrigin) //Получаем координаты игрока
fDistance = get_distance_f(fNOrigin, fPOrigin) //Получаем дистанцию между ними
if(fDistance <= float( get_pcvar_num( g_Cvar[3] ) )) //Если дистация межде указанной
{
client_print(iPlayer_ID, print_center, "[NPC]I caught up with you") //Чисто для прикола выводим, что NPC догнал нас
if(pev(iEntity, pev_sequence) != 1) //Если анимация npc установлена не стоячая
{
entity_set_int(iEntity, EV_INT_sequence, 1) //Задаем анимацию стоячую
entity_set_float(iEntity, EV_FL_animtime, get_gametime()) //Задаем время анимации
entity_set_float(iEntity, EV_FL_framerate, 1.0) //Задаем скорость анимации
entity_set_float(iEntity, EV_FL_frame, 0.0) //Задаем начальный кадр
}
}else{
if(pev(iEntity, pev_sequence) != 4) //Если анимация npc установлена не бега
{
entity_set_int(iEntity, EV_INT_sequence, 4) //Задаем анимацию бега
entity_set_float(iEntity, EV_FL_animtime, get_gametime()) //Задаем время анимации
entity_set_float(iEntity, EV_FL_framerate, 1.0) //Задаем скорость анимации
entity_set_float(iEntity, EV_FL_frame, 0.0) //Задаем начальный кадр
}
new Float:fAngles[3] //Сюда запишем координаты, куда должен будет смотреть NPC
new Float:fVelocity[3] //Сюда запишем координаты, куда будет бежать NPC
entity_get_vector(iEntity, EV_VEC_angles, fAngles) //Получаем
new Float:fX = fPOrigin[0] - fNOrigin[0] //Расчитываем координаты x
new Float:fZ = fPOrigin[1] - fNOrigin[1] //Расчитываем координаты z
new Float:fRadian
fRadian = floatatan(fZ/fX, radian) //Получаем угол
fAngles[1] = fRadian * (180 / 3.14) //Приваиваем координаты
if(fPOrigin[0] < fNOrigin[0]) //Если координаты игрока относительно x меньше NPC`овскивх
{
fAngles[1] = fAngles[1] - 180.0 //Разворачиваем его
}else{
fAngles[1] = fRadian * (180 / 3.14) //Записываем координаты
}
new Float:fSpeed = fDistance / float( get_pcvar_num( g_Cvar[2] ) ) //Задаем скорость
//Записываем координаты куда бежать
fVelocity[0] = (fPOrigin[0] - fNOrigin[0]) / fSpeed
fVelocity[1] = (fPOrigin[1] - fNOrigin[1]) / fSpeed
fVelocity[2] = (fPOrigin[2] - fNOrigin[2]) / fSpeed
entity_set_vector(iEntity, EV_VEC_angles, fAngles) //Присваиваем новые координаты куда смотреть
entity_set_vector(iEntity, EV_VEC_velocity, fVelocity) //Присваиваем новые координаты куда бежать
}
entity_set_float(iEntity, EV_FL_nextthink, halflife_time() + 0.01) //Повторяем
return FMRES_HANDLED
}
public NPCKilled( iEntity )
{
new iEntity2 = create_entity("info_target") //Создаем нового, тот пропал
if(pev_valid( iEntity2 )) //Проверяем, создан ли объект
{
client_print(iPlayer_ID, print_chat, "[NPC]Create Dead create") //Если да, пишем, что создан
}else{
client_print(iPlayer_ID, print_chat, "[NPC]Error create") //Иначе выводим
return PLUGIN_HANDLED //Прекращаем дальшейнее выполнение функции
}
new Float:fOrigin[3], Float:fAngles[3] //Запишем, как стоял старый NPC
pev(iEntity, pev_origin, fOrigin) //Получаем координаты
pev(iEntity, pev_angles, fAngles) //Получаем куда смотрит
entity_set_origin(iEntity2, fOrigin) //Присваиваем
entity_set_vector(iEntity2, EV_VEC_angles, fAngles) //Присваиваем
entity_set_model(iEntity2, gModel) //Задаем модель
entity_set_size(iNPC_ID, Float:{-16.0, -16.0, -36.0}, Float:{16.0, 16.0, 36.0}) //Задаем размеры( не путать с размером модели )
entity_set_int(iEntity2, EV_INT_sequence, 108) //Задаем анимацию смерти
entity_set_float(iEntity2, EV_FL_animtime, get_gametime()) //Задаем время анимации
entity_set_float(iEntity2, EV_FL_framerate, 1.0) //Задаем скорость анимации
entity_set_float(iEntity2, EV_FL_frame, 0.0) //Задаем начальный кадр
set_task(10.0, "GibsNPC", iEntity2) //Разорвем на куски npc через 10 сек и уничтожим его.
return PLUGIN_HANDLED //конец
}
public GibsNPC( iEntity )
{
new Float:fOrigin[3] //Куда запишем
pev(iEntity, pev_origin, fOrigin) //Получаем координаты
for(new i; i < sizeof gModelGibs; i++) //Разбрасываем кости
{
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(TE_MODEL)
engfunc(EngFunc_WriteCoord, fOrigin[0])
engfunc(EngFunc_WriteCoord, fOrigin[1])
engfunc(EngFunc_WriteCoord, fOrigin[2])
write_coord(random_num(100, 400))
write_coord(random_num(100, 400))
write_coord(random_num(100, 400))
write_angle(random( 361 ))
write_short(gModelGibs[i])
write_byte(1)
write_byte(125)
message_end()
}
//Создаем кровь
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BLOODSPRITE)
engfunc(EngFunc_WriteCoord, fOrigin[0])
engfunc(EngFunc_WriteCoord, fOrigin[1])
engfunc(EngFunc_WriteCoord, fOrigin[2])
write_short(gSpriteBlood)
write_short(gSpriteBlood)
write_byte(250)
write_byte(20)
message_end()
remove_entity( iEntity ) //Уничтожаем его нахер
client_print(iPlayer_ID, print_chat, "[NPC]Terminated") //Выводим сообщение что ли
}
Видео демонстрация:
У кого есть идеи, предложения, замечания - прошу высказывать. Всё будет учтено в продолжении статьи в скором времени
При копировании материала активная ссылка на amx-x.ru и указания автора обязательно