#include #include #include #include #include #include #define PLUGIN "[ZP] Zombie Class: Jockey (L4D2)" #define VERSION "1.0" #define AUTHOR "Dias" #define TASK_AURA 100 #define DEFAULT_HUMAN_SPEED 200.0 // Zombie Attributes new const zclass_name[] = "Jockey" // name new const zclass_info[] = "jumping grab" // description new const zclass_model[] = "JockeyL4D2" // model new const zclass_clawmodel[] = "v_jockey_hand.mdl" // claw model const zclass_health = 325 // health const zclass_speed = 300 // speed const Float:zclass_gravity = 1.0 // gravity const Float:zclass_knockback = 1.0 // knockback new sound_attack[]="jockey/jockey_attackloop01.wav" new g_zclass_jockey new g_jumping[33], g_start[33], g_can_use[33], Float:g_last_jump[33] new g_controlling[33], g_controlled[33], g_controlling2[33], g_controlled2[33] new cvar_cooldown, cvar_highjump public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) RegisterHam(Ham_Spawn, "player", "fw_spawn_post", 1) register_forward(FM_Touch, "fw_Touch") register_forward(FM_CmdStart, "fw_CmdStart") register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1) RegisterHam(Ham_Player_PreThink,"player","client_PostThink") //RegisterHam(Ham_TakeDamage, "player", "fw_takedamage") cvar_cooldown = register_cvar("zp_jockey_cooldown", "10.0") cvar_highjump = register_cvar("zp_jockey_highjump", "400.0") g_zclass_jockey = zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback) } public plugin_precache(){ precache_sound(sound_attack) } public zp_user_infected_post(id) { g_controlling[id] = 0 g_controlling2[id] = 0 g_controlled[id] = 0 g_controlled2[id] = 0 if(zp_get_user_zombie_class(id) == g_zclass_jockey) { g_can_use[id] = 1 client_print(id, print_center, zclass_info) } } public fw_spawn_post(id) { if(!is_user_alive(id) || !is_user_connected(id)) return HAM_IGNORED g_controlling[id] = 0 g_controlling2[id] = 0 g_controlled[id] = 0 g_controlled2[id] = 0 return HAM_HANDLED } /*public fw_takedamage(victim, inflictor, attacker, Float:damage, damagebits) { if(!is_user_alive(victim) || !is_user_connected(victim)) return HAM_IGNORED if(!is_user_alive(attacker) || !is_user_connected(attacker)) return HAM_IGNORED if(g_controlled2[victim]) { set_pev(g_controlled[victim], pev_maxspeed, DEFAULT_HUMAN_SPEED) //set_pev(id, pev_maxspeed, zclass_speed) g_controlled2[victim] = 0 g_controlling[g_controlled[victim]] = 0 g_controlling2[g_controlled[victim]] = 0 g_controlled[victim] = 0 } return HAM_HANDLED }*/ public make_aura(ent) { ent -= TASK_AURA static Float:origin[3] pev(ent, pev_origin, origin) message_begin(MSG_BROADCAST,SVC_TEMPENTITY); write_byte(27) write_coord(floatround(origin[0])) write_coord(floatround(origin[1])) write_coord(floatround(origin[2]-10.0)) write_byte(10) write_byte(255) write_byte(255) write_byte(0) write_byte(100) write_byte(100) message_end() } public fw_CmdStart(id, uc_handle, seed) { if(!is_user_alive(id) || !is_user_connected(id)) return FMRES_IGNORED static CurButton CurButton = get_uc(uc_handle, UC_Buttons) if(CurButton & IN_ATTACK2) { if(zp_get_user_zombie(id) && zp_get_user_zombie_class(id) == g_zclass_jockey) { if(g_can_use[id]) { static Float:CurTime CurTime = get_gametime() if((CurTime - 3.0 > g_last_jump[id]) && !(pev(id, pev_oldbuttons) & IN_ATTACK2)) { do_jump(id) g_jumping[id] = 1 g_last_jump[id] = CurTime } } CurButton &= ~IN_ATTACK2 set_uc(uc_handle, UC_Buttons, CurButton) } if(g_controlling2[id]) { CurButton &= ~IN_ATTACK2 set_uc(uc_handle, UC_Buttons, CurButton) } } if(zp_get_user_zombie(id) && zp_get_user_zombie_class(id) == g_zclass_jockey) { if(g_controlled2[id]) { set_pev(id, pev_gravity, 100.0) } else { set_pev(id, pev_gravity, zclass_gravity) remove_task(id-TASK_AURA) } } if(CurButton & IN_ATTACK) { if(g_controlling2[id]) { CurButton &= ~IN_ATTACK set_uc(uc_handle, UC_Buttons, CurButton) } } return FMRES_HANDLED } public fw_Touch(id, touched) { if(!pev_valid(id)) return FMRES_IGNORED if(!is_user_alive(id) || !is_user_connected(id)) return FMRES_IGNORED if(!zp_get_user_zombie(id) || zp_get_user_zombie_class(id) != g_zclass_jockey) return FMRES_IGNORED if(!g_can_use[id]) return FMRES_IGNORED if(g_jumping[id]) { if(is_user_alive(touched) && is_user_connected(touched)) { if(!zp_get_user_zombie(touched)){ emit_sound(id,CHAN_VOICE,sound_attack,VOL_NORM,ATTN_NORM,0,PITCH_NORM) static Float:Origin[3] pev(touched, pev_origin, Origin) Origin[2] += 75.0 set_pev(id, pev_origin, Origin) g_start[id] = 0 g_controlling[touched] = id g_controlling2[touched] = 1 g_controlled[id] = touched g_controlled2[id] = 1 set_task(1.0, "set_time_start", id) set_task(get_pcvar_float(cvar_cooldown), "reset_cooldown", id) set_task(0.1, "make_aura", id+TASK_AURA, _, _, "b") set_pev(id, pev_maxspeed, zclass_speed - 100.0) g_can_use[id] = 0 } } g_jumping[id] = 0 } return FMRES_HANDLED } public set_time_start(id) { g_start[id] = 1 } public reset_cooldown(id) { if(!is_user_alive(id) || !is_user_connected(id)) return PLUGIN_HANDLED if(!zp_get_user_zombie(id) || zp_get_user_zombie_class(id) != g_zclass_jockey) return PLUGIN_HANDLED g_can_use[id] = 1 return PLUGIN_HANDLED } public fw_UpdateClientData_Post(id, sendweapons, cd_handle) { if(!is_user_alive(id) || !is_user_connected(id)) return FMRES_IGNORED if(get_user_weapon(id) != CSW_KNIFE) return FMRES_IGNORED if(g_controlling2[id]) set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001) if(zp_get_user_zombie(id) && zp_get_user_zombie_class(id) == g_zclass_jockey) set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001) return FMRES_HANDLED } public client_PostThink(id) { if(!pev_valid(id)) return if(!is_user_alive(id) || !is_user_connected(id)) return if(zp_get_user_zombie(id) && zp_get_user_zombie_class(id) == g_zclass_jockey && g_controlled2[id]) { if(pev(g_controlled[id], pev_maxspeed) != 0.1) { set_pev(g_controlled[id], pev_maxspeed, 0.1) } static Float:Origin[3], Float:Origin2[3], Distance pev(g_controlled[id], pev_origin, Origin) pev(id, pev_origin, Origin2) Distance = floatround(Origin2[2] - Origin[2]) if(Distance != 72 && Distance == 54) { hook_ent(g_controlled[id], id, 1000.0) } else if(Distance != 54 && Distance == 72) { hook_ent(g_controlled[id], id, 1000.0) } else { if(g_start[id]) { set_pev(g_controlled[id], pev_maxspeed, DEFAULT_HUMAN_SPEED) //set_pev(id, pev_maxspeed, zclass_speed) g_controlled2[id] = 0 g_controlling[g_controlled[id]] = 0 g_controlling2[g_controlled[id]] = 0 g_controlled[id] = 0 } } } if(g_controlling2[id]) { if(get_user_weapon(id) != CSW_KNIFE) engclient_cmd(id, "weapon_knife") } } public do_jump(id) { static Float:Origin[3], Float:AimOrigin[3] pev(id, pev_origin, Origin) fm_get_aim_origin(id, AimOrigin) new Float:TempOrigin[3] new Float:len = floatabs(floatsqroot((AimOrigin[0] - Origin[0]) * (AimOrigin[0] - Origin[0]) + (AimOrigin[1] - Origin[1]) * (AimOrigin[1] - Origin[1]) + (AimOrigin[2] - Origin[2]) * (AimOrigin[2] - Origin[2]))) / 10 TempOrigin[0] = (AimOrigin[0] - Origin[0]) / len TempOrigin[1] = (AimOrigin[1] - Origin[1]) / len TempOrigin[2] = (AimOrigin[2] - Origin[2]) / len new Float:Velocity[3] Velocity[0] = TempOrigin[0] * 30.0 Velocity[1] = TempOrigin[1] * 30.0 Velocity[2] = get_pcvar_float(cvar_highjump) set_pev(id, pev_velocity, Velocity) } public hook_ent(ent, victim, Float:speed) { static Float:fl_Velocity[3] static Float:VicOrigin[3], Float:EntOrigin[3] pev(ent, pev_origin, EntOrigin) pev(victim, pev_origin, VicOrigin) static Float:distance_f distance_f = get_distance_f(EntOrigin, VicOrigin) if (distance_f > 1.0) { new Float:fl_Time = distance_f / speed fl_Velocity[0] = (VicOrigin[0] - EntOrigin[0]) / fl_Time fl_Velocity[1] = (VicOrigin[1] - EntOrigin[1]) / fl_Time fl_Velocity[2] = 0.0 //(VicOrigin[2] - EntOrigin[2]) / fl_Time } else { fl_Velocity[0] = 0.0 fl_Velocity[1] = 0.0 fl_Velocity[2] = 0.0 } entity_set_vector(ent, EV_VEC_velocity, fl_Velocity) }