#include <amxmodx>
#include <fakemeta>
#include <fakemeta_util>
#include <engine>
#include <zombieplague>
#include <fun>
#include <hero>
#define PLUGIN "NST Zombie Class Deimos"
#define VERSION "1.0"
#define AUTHOR "NST"
const Float:zclass_speed = 255.0
const Float:zclass_gravity = 0.8
new const light_classname[] = "nst_deimos_skill"
new class_deimos[33]
const skill_dmg = 300
const Float:skill_time_wait = 7.0
new const sound_skill_start[] = "zombie_plague/deimos_skill_start.wav"
new const sound_skill_hit[] = "zombie_plague/deimos_skill_hit2.wav"
new sprites_exp_index, sprites_trail_index
new g_wait[33]
new g_useskill[33]
new g_maxplayers
new g_msgSayText, g_msgScreenFade, g_msgScreenShake
new g_roundend, index_deimos
const WPN_NOT_DROP = ((1<<2)|(1<<CSW_HEGRENADE)|(1<<CSW_SMOKEGRENADE)|(1<<CSW_FLASHBANG)|(1<<CSW_KNIFE)|(1<<CSW_C4))
enum (+= 100)
{
TASK_WAIT = 2000,
TASK_ATTACK,
TASK_BOT_USE_SKILL,
TASK_USE_SKILL
}
#define ID_WAIT (taskid - TASK_WAIT)
#define ID_ATTACK (taskid - TASK_ATTACK)
#define ID_BOT_USE_SKILL (taskid - TASK_BOT_USE_SKILL)
#define ID_USE_SKILL (taskid - TASK_USE_SKILL)
new DEIMOS_V_MODEL[64] = "models/zombie_plague/v_knife_deimos_zombi.mdl"
new const g_vgrenade[] = "models/zombie_plague/bomb/v_zombibomb_deimos.mdl"
const UNIT_SECOND = (1<<12)
const FFADE_IN = 0x0000
const m_flTimeWeaponIdle = 48
const m_flNextAttack = 83
public plugin_precache()
{
sprites_exp_index = precache_model("sprites/deimosexp.spr")
sprites_trail_index = precache_model("sprites/laserbeam.spr")
precache_sound(sound_skill_start)
precache_sound(sound_skill_hit)
index_deimos = precache_model("models/player/deimos_zombi_origin/deimos_zombi_origin.mdl")
precache_model(DEIMOS_V_MODEL)
precache_model(g_vgrenade)
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
register_event("DeathMsg", "Death", "a")
register_logevent("logevent_round_end", 2, "1=Round_End")
register_event("CurWeapon","EventCurWeapon","be","1=1")
register_forward(FM_CmdStart, "fw_CmdStart")
register_forward(FM_Touch, "fw_Touch")
register_clcmd("drop", "use_skill")
g_maxplayers = get_maxplayers()
g_msgSayText = get_user_msgid("SayText")
g_msgScreenFade = get_user_msgid("ScreenFade")
g_msgScreenShake = get_user_msgid("ScreenShake")
}
public plugin_natives()
{
register_native("give_deimos", "native_give_deimos", 1)
register_native("deimos_reset_value_player", "native_deimos_reset_value", 1)
}
public native_give_deimos(id)
{
give_deimos(id)
}
public native_deimos_reset_value(id)
{
deimos_reset_value_player(id)
}
public client_putinserver(id)
{
deimos_reset_value_player(id)
}
public client_disconnect(id)
{
deimos_reset_value_player(id)
}
public event_round_start()
{
g_roundend = 0
for (new id=1; id<=g_maxplayers; id++)
{
if (!is_user_connected(id)) continue;
deimos_reset_value_player(id)
}
}
public logevent_round_end()
{
g_roundend = 1
}
public Death()
{
new victim = read_data(2)
deimos_reset_value_player(victim)
}
public give_deimos(id)
{
deimos_reset_value_player(id)
class_deimos[id] = true
fm_strip_user_weapons(id)
fm_give_item(id, "weapon_knife")
zp_override_user_model(id, "deimos_zombi_origin")
set_pdata_int(id, 491, index_deimos, 5)
set_user_maxspeed(id, zclass_speed)
set_user_gravity(id, zclass_gravity)
zp_colored_print(id, "^x04[Zombie: The Hero]^x01 Gomb^x03 [G]^x01 hogy használd a fény tamadást")
}
public zp_user_humanized_post(id)
{
deimos_reset_value_player(id)
}
public use_skill(id)
{
if (g_roundend) return PLUGIN_CONTINUE
if (!is_user_alive(id) || !zp_get_user_zombie(id) || zp_get_user_nemesis(id)) return PLUGIN_CONTINUE
new health = get_user_health(id) - skill_dmg
if (class_deimos[id] && !g_wait[id] && health>0 && get_user_weapon(id)==CSW_KNIFE)
{
g_useskill[id] = 1
g_wait[id] = 1
fm_set_user_health(id, health)
set_task(skill_time_wait, "RemoveWait", id+TASK_WAIT)
return PLUGIN_HANDLED
}
return PLUGIN_CONTINUE
}
public bot_use_skill(taskid)
{
new id = ID_BOT_USE_SKILL
if (!is_user_alive(id)) return;
use_skill(id)
set_task(random_float(5.0,15.0), "bot_use_skill", id+TASK_BOT_USE_SKILL)
}
public task_use_skill(taskid)
{
new id = ID_USE_SKILL
play_weapon_anim(id, 8)
set_weapons_timeidle(id, skill_time_wait)
set_player_nextattack(id, 0.5)
PlayEmitSound(id, sound_skill_start)
entity_set_int(id, EV_INT_sequence, 10)
set_task(0.5, "launch_light", id+TASK_ATTACK)
}
public launch_light(taskid)
{
new id = ID_ATTACK
if (!is_user_alive(id)) return;
new Float:vecAngle[3],Float:vecOrigin[3],Float:vecVelocity[3],Float:vecForward[3]
new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
fm_get_user_startpos(id,5.0,2.0,-1.0,vecOrigin)
pev(id,pev_angles,vecAngle)
engfunc(EngFunc_MakeVectors,vecAngle)
global_get(glb_v_forward,vecForward)
velocity_by_aim(id,2000,vecVelocity)
set_pev(ent,pev_origin,vecOrigin)
set_pev(ent,pev_angles,vecAngle)
set_pev(ent,pev_classname,light_classname)
set_pev(ent,pev_movetype,MOVETYPE_FLY)
set_pev(ent,pev_solid,SOLID_BBOX)
engfunc(EngFunc_SetSize,ent,{-1.0,-1.0,-1.0},{1.0,1.0,1.0})
engfunc(EngFunc_SetModel,ent,"models/w_hegrenade.mdl")
set_pev(ent,pev_owner,id)
set_pev(ent,pev_velocity,vecVelocity)
set_rendering(ent, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 0)
message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
write_byte(TE_BEAMFOLLOW)
write_short(ent)
write_short(sprites_trail_index)
write_byte(5)
write_byte(3)
write_byte(209)
write_byte(120)
write_byte(9)
write_byte(200)
message_end()
return;
}
public EventCurWeapon(id)
{
if(!is_user_alive(id)) return PLUGIN_CONTINUE;
replace_weapon_models(id, read_data(2))
if(class_deimos[id]) set_user_maxspeed(id, zclass_speed)
new weap = get_user_weapon(id)
if(weap == CSW_SMOKEGRENADE && class_deimos[id] && zp_get_user_zombie(id))
{
entity_set_string(id, EV_SZ_viewmodel, g_vgrenade)
}
return PLUGIN_HANDLED
}
public fw_Touch(ent, victim)
{
if (!pev_valid(ent)) return FMRES_IGNORED
new EntClassName[32]
entity_get_string(ent, EV_SZ_classname, EntClassName, charsmax(EntClassName))
if (equal(EntClassName, light_classname))
{
light_exp(ent, victim)
return FMRES_IGNORED
}
return FMRES_IGNORED
}
light_exp(ent, victim)
{
if (!pev_valid(ent)) return;
if (is_user_alive(victim) && !zp_get_user_zombie(victim) && !zp_get_user_survivor(victim))
{
new wpn, wpnname[32]
wpn = get_user_weapon(victim)
if(!(WPN_NOT_DROP & (1<<wpn)) && get_weaponname(wpn, wpnname, charsmax(wpnname)) && !revo_get_user_hero(victim))
{
engclient_cmd(victim, "drop", wpnname)
}
message_begin(MSG_ONE, g_msgScreenFade, _, victim)
write_short(UNIT_SECOND)
write_short(0)
write_short(FFADE_IN)
write_byte(209)
write_byte(120)
write_byte(9)
write_byte (255)
message_end()
message_begin(MSG_ONE, g_msgScreenShake, _, victim)
write_short(UNIT_SECOND*4)
write_short(UNIT_SECOND*2)
write_short(UNIT_SECOND*10)
message_end()
}
PlayEmitSound(ent, sound_skill_hit)
static Float:origin[3]
pev(ent, pev_origin, origin)
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(TE_EXPLOSION)
write_coord(floatround(origin[0]))
write_coord(floatround(origin[1]))
write_coord(floatround(origin[2]))
write_short(sprites_exp_index)
write_byte(40)
write_byte(30)
write_byte(14)
message_end()
remove_entity(ent)
}
public RemoveWait(taskid)
{
new id = ID_WAIT
g_wait[id] = 0
zp_colored_print(id, "^x04[Zombie: The Hero]^x01 A^x04 Fény tamadás^x01 készen áll.")
}
public fw_CmdStart(id, uc_handle, seed)
{
if (!is_user_alive(id) || !zp_get_user_zombie(id)) return FMRES_IGNORED
if (class_deimos[id])
{
if (g_useskill[id])
{
set_uc(uc_handle, UC_Buttons, IN_ATTACK2)
g_useskill[id] = 0
remove_task(id+TASK_USE_SKILL)
set_task(0.1, "task_use_skill", id+TASK_USE_SKILL)
}
}
return FMRES_IGNORED
}
PlayEmitSound(id, const sound[])
{
emit_sound(id, CHAN_WEAPON, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
}
play_weapon_anim(player, anim)
{
set_pev(player, pev_weaponanim, anim)
message_begin(MSG_ONE, SVC_WEAPONANIM, {0, 0, 0}, player)
write_byte(anim)
write_byte(pev(player, pev_body))
message_end()
}
get_weapon_ent(id, weaponid)
{
static wname[32], weapon_ent
get_weaponname(weaponid, wname, charsmax(wname))
weapon_ent = find_ent_by_owner(-1, wname, id)
return weapon_ent
}
set_weapons_timeidle(id, Float:timeidle)
{
new entwpn = get_weapon_ent(id, get_user_weapon(id))
if (pev_valid(entwpn)) set_pdata_float(entwpn, m_flTimeWeaponIdle, timeidle+3.0, 4)
}
set_player_nextattack(id, Float:nexttime)
{
set_pdata_float(id, m_flNextAttack, nexttime, 4)
}
fm_get_user_startpos(id,Float:forw,Float:right,Float:up,Float:vStart[])
{
new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
pev(id, pev_origin, vOrigin)
pev(id, pev_v_angle, vAngle)
engfunc(EngFunc_MakeVectors, vAngle)
global_get(glb_v_forward, vForward)
global_get(glb_v_right, vRight)
global_get(glb_v_up, vUp)
vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
}
replace_weapon_models(id, weaponid)
{
switch (weaponid)
{
case CSW_KNIFE:
{
if(!zp_get_user_zombie(id))
return;
if(class_deimos[id])
{
set_pev(id, pev_viewmodel2, DEIMOS_V_MODEL)
set_pev(id, pev_weaponmodel2, "")
}
}
}
}
deimos_reset_value_player(id)
{
g_wait[id] = 0
g_useskill[id] = 0
class_deimos[id] = false
remove_task(id+TASK_WAIT)
remove_task(id+TASK_ATTACK)
remove_task(id+TASK_BOT_USE_SKILL)
remove_task(id+TASK_USE_SKILL)
}
stock fm_strip_user_weapons2(id)
{
static ent
ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "player_weaponstrip"))
if (!pev_valid(ent)) return;
dllfunc(DLLFunc_Spawn, ent)
dllfunc(DLLFunc_Use, ent, id)
engfunc(EngFunc_RemoveEntity, ent)
}
zp_colored_print(target, const message[], any:...)
{
static buffer[512], i, argscount
argscount = numargs()
if (!target)
{
static player
for (player = 1; player <= g_maxplayers; player++)
{
if (!is_user_connected(player))
continue;
static changed[5], changedcount
changedcount = 0
for (i = 2; i < argscount; i++)
{
if (getarg(i) == LANG_PLAYER)
{
setarg(i, 0, player)
changed[changedcount] = i
changedcount++
}
}
vformat(buffer, charsmax(buffer), message, 3)
message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, player)
write_byte(player)
write_string(buffer)
message_end()
for (i = 0; i < changedcount; i++)
setarg(changed[i], 0, LANG_PLAYER)
}
}
else
{
vformat(buffer, charsmax(buffer), message, 3)
message_begin(MSG_ONE, g_msgSayText, _, target)
write_byte(target)
write_string(buffer)
message_end()
}
}