Does anyone knows why this plugin doesn't work? because im out of ideas.
PHP Code:
#include <amxmodx>
#include <engine>
#include <amxmisc>
#include <cstrike>
#include <fun>
#include <fakemeta>
#include <hamsandwich>
#include <colorchat>
#define PLUGIN "JailBreak Pets"
#define VERSION "1.0"
#define AUTHOR "OverGame"
#pragma tabsize 0
new g_Cvar[5]
new const gModel[] = "models/player/wolf/wolf.mdl"
new const gClassname[] = "JBDog"
new g_Name[32], g_Temp[10]
new Players[32], Num, Player
new g_Attack, g_AScore
enum _:GIBS
{
HEAD,
LEG,
BONE,
LUNG,
GIB
}
new gModelGibs[GIBS]
new gSpriteBlood
new iNPC_ID
new iPlayer_ID
new Float:fNPCOrigin[3]
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_think(gClassname, "NPCThink")
g_Cvar[1] = register_cvar("jbdog_health", "200")
g_Cvar[2] = register_cvar("jbdog_speed", "350")
g_Cvar[3] = register_cvar("jbdog_distance", "100")
register_clcmd("petsmenu", "pets_menu")
register_dictionary("jbpets_lang.txt")
}
public plugin_precache()
{
precache_model( gModel )
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 pets_menu(id)
{
static s_MenuItem[64]
formatex(s_MenuItem, charsmax(s_MenuItem), "\d[%L]\r %L", LANG_PLAYER, "PRIFIX", LANG_PLAYER, "MENU_NAME1")
new menu = menu_create(s_MenuItem, "pets_hand" )
if ( get_user_flags(id) & ADMIN_LEVEL_C && get_user_team(id) == 2 )
{
menu_additem(menu, "\yУстановить координаты","1")
menu_additem(menu, "\yСоздатель питомца","2")
menu_additem(menu, "\yНатравить на игрока","3")
menu_additem(menu, "\yСледовать за игроком","4")
menu_additem(menu, "\yПозвать к себе","5")
} else {
menu_additem(menu, "\dУстановить координаты","1")
menu_additem(menu, "\dСоздатель питомца","2")
menu_additem(menu, "\dНатравить на игрока","3")
menu_additem(menu, "\dСледовать за игроком","4")
menu_additem(menu, "\dПозвать к себе","5")
}
menu_setprop(menu, MPROP_BACKNAME, "Назад")
menu_setprop(menu, MPROP_NEXTNAME, "Далее")
menu_setprop(menu, MPROP_EXITNAME, "Выход")
menu_display(id,menu,0)
return PLUGIN_HANDLED
}
public pets_hand(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED
}
new data[6], iName[64], access, callback
menu_item_getinfo(menu, item, access, data, 5, iName, 63, callback)
new key = str_to_num(data)
switch(key)
{
case 1:{
if ( get_user_flags(id) & ADMIN_LEVEL_C && get_user_team(id) == 2 )
{
ColorChat(id,NORMAL,"^4[%L]^1 %L", LANG_PLAYER, "PRIFIX", LANG_PLAYER, "Y_X_PET")
NPCOrigin(id)
pets_menu(id)
} else {
ColorChat(id,NORMAL,"^4[%L]^1 %L^3 %L", LANG_PLAYER, "PRIFIX", LANG_PLAYER, "FLAG_NO", LANG_PLAYER, "FLAG_ON_PET")
pets_menu(id)
}
}
case 2:{
if ( get_user_flags(id) & ADMIN_LEVEL_C && get_user_team(id) == 2 )
{
NPCCreate(id)
pets_menu(id)
} else {
ColorChat(id,NORMAL,"^4[%L]^1 %L^3 %L", LANG_PLAYER, "PRIFIX", LANG_PLAYER, "FLAG_NO", LANG_PLAYER, "FLAG_ON_PET")
pets_menu(id)
}
}
case 3:{
if ( get_user_flags(id) & ADMIN_LEVEL_C && get_user_team(id) == 2 )
{
pets_attack_menu(id)
g_Attack = 0
} else {
ColorChat(id,NORMAL,"^4[%L]^1 %L^3 %L", LANG_PLAYER, "PRIFIX", LANG_PLAYER, "FLAG_NO", LANG_PLAYER, "FLAG_ON_PET")
pets_menu(id)
}
}
case 4:{
if ( get_user_flags(id) & ADMIN_LEVEL_C && get_user_team(id) == 2 )
{
pets_go_menu(id)
g_Attack = 0
} else {
ColorChat(id,NORMAL,"^4[%L]^1 %L^3 %L", LANG_PLAYER, "PRIFIX", LANG_PLAYER, "FLAG_NO", LANG_PLAYER, "FLAG_ON_PET")
pets_menu(id)
}
}
case 5:{
if ( get_user_flags(id) & ADMIN_LEVEL_C && get_user_team(id) == 2 )
{
iPlayer_ID = id
g_Attack = 0
} else {
ColorChat(id,NORMAL,"^4[%L]^1 %L^3 %L", LANG_PLAYER, "PRIFIX", LANG_PLAYER, "FLAG_NO", LANG_PLAYER, "FLAG_ON_PET")
pets_menu(id)
}
}
}
return PLUGIN_HANDLED
}
public pets_go_menu(id)
{
static s_MenuItem2[255]
formatex(s_MenuItem2, charsmax(s_MenuItem2), "\d[%L]\r %L", LANG_PLAYER, "PRIFIX", LANG_PLAYER, "MENU_NAME2")
new menu = menu_create(s_MenuItem2, "pgo_hand")
get_players(Players, Num, "ch")
for(new i; i< Num; i++)
{
Player = Players[i]
get_user_name(Player, g_Name, charsmax(g_Name))
num_to_str(Player, g_Temp, charsmax(g_Temp))
menu_additem(menu, g_Name, g_Temp, 0)
}
menu_setprop(menu, MPROP_NEXTNAME, "Далее")
menu_setprop(menu, MPROP_BACKNAME, "Назад")
menu_setprop(menu, MPROP_EXITNAME, "Выход^n^n\dАвтор: OverGame^nСайт: WwW.OVERCS.Ru")
menu_display(id, menu)
return PLUGIN_HANDLED
}
public pgo_hand(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED;
}
new s_Data[6], s_Name[64], i_Access, i_Callback
menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
Player = str_to_num(s_Data)
iPlayer_ID = Player
return PLUGIN_HANDLED
}
public pets_attack_menu(id)
{
static s_MenuItem2[255]
formatex(s_MenuItem2, charsmax(s_MenuItem2), "\d[%L]\r %L", LANG_PLAYER, "PRIFIX", LANG_PLAYER, "MENU_NAME2")
new menu = menu_create(s_MenuItem2, "pattack_hand")
get_players(Players, Num, "ch")
for(new i; i< Num; i++)
{
Player = Players[i]
get_user_name(Player, g_Name, charsmax(g_Name))
num_to_str(Player, g_Temp, charsmax(g_Temp))
menu_additem(menu, g_Name, g_Temp, 0)
}
menu_setprop(menu, MPROP_NEXTNAME, "Далее")
menu_setprop(menu, MPROP_BACKNAME, "Назад")
menu_setprop(menu, MPROP_EXITNAME, "Выход^n^n\dАвтор: OverGame^nСайт: WwW.OVERCS.Ru")
menu_display(id, menu)
return PLUGIN_HANDLED
}
public pattack_hand(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED;
}
new s_Data[6], s_Name[64], i_Access, i_Callback
menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
Player = str_to_num(s_Data)
iPlayer_ID = Player
g_Attack = 1
return PLUGIN_HANDLED
}
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
if(iNPC_ID)
{
remove_entity(iNPC_ID)
iNPC_ID = 0
}
iNPC_ID = create_entity("info_target")
if(pev_valid( iNPC_ID ))
{
ColorChat(id,NORMAL,"^4[%L]^1 %L", LANG_PLAYER, "PRIFIX", LANG_PLAYER, "PET_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)
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)
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)
return PLUGIN_HANDLED
}
public damage_attack(id)
{
if ( g_AScore <= 6 )
{
set_user_health(Player, get_user_health(Player) - 5)
g_AScore += 1
if ( g_AScore == 5 )
{
g_Attack = 0
}
}
}
public NPCThink( iEntity )
{
if(!is_valid_ent( iEntity ))
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")
if ( g_Attack == 1 )
{
if ( is_user_connected(Player) && is_user_alive(Player) )
{
set_task(2.0,"damage_attack",0,_,_,"a",5)
g_AScore = 0
}
}
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") //Выводим сообщение что ли
}