As dori sa adaugati un cvar in care sa pot seta viata smokerului si distanta de unde poate sa traga un player(ma refer sa poatra trage de la 20m). Daca este mai departe de 20m, sa-l nu-l lase sa traga si sa ii apara in chat, Nu esti la distanta necesara.
Code: Select all
#include <amxmodx>
#include <biohazard>
#include <fakemeta>
#include <hamsandwich>
#include <engine>
#define PLUGIN "Class: Smoker (trage oamenii)"
#define AUTHOR "MaHu"
#define VERSION "0.1"
//Main Class, modelT & Sprite Beam
new g_Line
#define ICON_HIDE 0
#define ICON_SHOW 1
#define ICON_FLASH 2
//Sounds
new g_sndMiss[] = "left4dead/Smoker_TongueHit_miss.wav"
new g_sndDrag[] = "left4dead/Smoker_TongueHit_drag.wav"
//Some vars
new g_hooked[33], g_hooksLeft[33], g_unable2move[33], g_ovr_dmg[33]
new Float:g_lastHook[33]
new bool: g_drag_i[33] = false
//Cvars
new cvar_maxdrags, cvar_dragspeed, cvar_cooldown, cvar_dmg2stop, cvar_mates, cvar_unb2move
new g_class
public plugin_precache( )
{
precache_sound(g_sndDrag)
precache_sound(g_sndMiss)
g_Line = precache_model("sprites/zbeam4.spr")
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
cvar_dragspeed = register_cvar("smoker_dragspeed", "220")
cvar_maxdrags = register_cvar("smoker_maxdrags", "25")
cvar_cooldown = register_cvar("smoker_cooldown", "1")
cvar_dmg2stop = register_cvar("smoker_dmg2stop", "17")
cvar_mates = register_cvar("smoker_mates", "0")
cvar_unb2move = register_cvar("smoker_unable_move", "1")
register_event("ResetHUD", "newSpawn", "b")
register_event("DeathMsg", "smoker_death", "a")
register_forward(FM_CmdStart, "FwdCmdStart");
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
g_class = register_class("Smoker (trage oamenii)", "pe E")
if(g_class != -1)
{
set_class_data(g_class, DATA_HEALTH, 555.0)
set_class_data(g_class, DATA_SPEED, 290.0)
set_class_data(g_class, DATA_GRAVITY, 1.0)
set_class_data(g_class, DATA_DEFENCE, 0.087)
set_class_data(g_class, DATA_HITSPEED, 0.95)
set_class_data(g_class, DATA_HITDELAY, 0.15)
set_class_data(g_class, DATA_REGENDLY, 0.20)
set_class_data(g_class, DATA_HITREGENDLY, 2.2)
set_class_data(g_class, DATA_KNOCKBACK, 0.0)
}
}
public event_infect(victim, attacker)
{
if(get_user_class(victim) == g_class)
{
g_hooksLeft[victim] = get_pcvar_num(cvar_maxdrags)
}
if(is_user_zombie(victim) && g_hooked[victim])
{
drag_end(victim)
}
}
public newSpawn(id)
{
if (g_hooked[id])
drag_end(id)
}
public drag_start(id) // starts drag, checks if player is Smoker, checks cvars
{
if (is_user_zombie(id) && (get_user_class(id) == g_class) && !g_drag_i[id]) {
static Float:cdown
cdown = get_pcvar_float(cvar_cooldown)
if (!is_user_alive(id)) {
client_print(id, print_chat, "Nu poti trage mort!")
return PLUGIN_HANDLED
}
if (g_hooksLeft[id] <= 0) {
client_print(id, print_chat, "Nu poti trage!")
return PLUGIN_HANDLED
}
if (get_gametime() - g_lastHook[id] < cdown) {
client_print(id, print_chat, "Asteapta %.f0 sec.!", get_pcvar_float(cvar_cooldown) - (get_gametime() - g_lastHook[id]))
return PLUGIN_HANDLED
}
new hooktarget, body
get_user_aiming(id, hooktarget, body)
if (is_user_alive(hooktarget)) {
if (!is_user_zombie(hooktarget))
{
g_hooked[id] = hooktarget
emit_sound(hooktarget, CHAN_BODY, g_sndDrag, 1.0, ATTN_NORM, 0, PITCH_HIGH)
}
else
{
if (get_pcvar_num(cvar_mates) == 1)
{
g_hooked[id] = hooktarget
emit_sound(hooktarget, CHAN_BODY, g_sndDrag, 1.0, ATTN_NORM, 0, PITCH_HIGH)
}
else
{
client_print(id, print_chat, "Este coechipier!")
return PLUGIN_HANDLED
}
}
if (get_pcvar_float(cvar_dragspeed) <= 0.0)
cvar_dragspeed = 1
new parm[2]
parm[0] = id
parm[1] = hooktarget
set_task(0.1, "smoker_reelin", id, parm, 2, "b")
harpoon_target(parm)
g_hooksLeft[id]--
client_print(id, print_chat, "Poti trage de %d time%s", g_hooksLeft[id], (g_hooksLeft[id] < 2) ? "" : "s")
g_drag_i[id] = true
if(get_pcvar_num(cvar_unb2move) == 1)
g_unable2move[hooktarget] = true
if(get_pcvar_num(cvar_unb2move) == 2)
g_unable2move[id] = true
if(get_pcvar_num(cvar_unb2move) == 3)
{
g_unable2move[hooktarget] = true
g_unable2move[id] = true
}
} else {
g_hooked[id] = 33
noTarget(id)
emit_sound(hooktarget, CHAN_BODY, g_sndMiss, 1.0, ATTN_NORM, 0, PITCH_HIGH)
g_drag_i[id] = true
g_hooksLeft[id]--
client_print(id, print_chat, "Poti trage de %d time%s", g_hooksLeft[id], (g_hooksLeft[id] < 2) ? "" : "s")
}
}
else
return PLUGIN_HANDLED
return PLUGIN_CONTINUE
}
public smoker_reelin(parm[]) // dragging player to smoker
{
new id = parm[0]
new victim = parm[1]
if (!g_hooked[id] || !is_user_alive(victim) || is_user_zombie(victim))
{
drag_end(id)
return
}
new Float:fl_Velocity[3]
new idOrigin[3], vicOrigin[3]
get_user_origin(victim, vicOrigin)
get_user_origin(id, idOrigin)
new distance = get_distance(idOrigin, vicOrigin)
if (distance > 1) {
new Float:fl_Time = distance / get_pcvar_float(cvar_dragspeed)
fl_Velocity[0] = (idOrigin[0] - vicOrigin[0]) / fl_Time
fl_Velocity[1] = (idOrigin[1] - vicOrigin[1]) / fl_Time
fl_Velocity[2] = (idOrigin[2] - vicOrigin[2]) / fl_Time
} else {
fl_Velocity[0] = 0.0
fl_Velocity[1] = 0.0
fl_Velocity[2] = 0.0
}
entity_set_vector(victim, EV_VEC_velocity, fl_Velocity) //<- rewritten. now uses engine
}
public drag_end(id) // drags end function
{
g_hooked[id] = 0
beam_remove(id)
remove_task(id)
if (g_drag_i[id])
g_lastHook[id] = get_gametime()
g_drag_i[id] = false
g_unable2move[id] = false
}
public smoker_death() // if smoker dies drag off
{
new id = read_data(2)
beam_remove(id)
if (g_hooked[id])
drag_end(id)
}
public fw_TakeDamage(victim, inflictor, attacker, Float:damage) // if take damage drag off
{
if (is_user_alive(attacker) && (get_pcvar_num(cvar_dmg2stop) > 0))
{
g_ovr_dmg[victim] = g_ovr_dmg[victim] + floatround(damage)
if (g_ovr_dmg[victim] >= get_pcvar_num(cvar_dmg2stop))
{
g_ovr_dmg[victim] = 0
drag_end(victim)
return HAM_IGNORED;
}
}
return HAM_IGNORED;
}
public FwdCmdStart(id, uc_handle)
{
if (!is_user_alive(id) || !is_user_zombie(id))
return
static Button, OldButtons;
Button = get_uc(uc_handle, UC_Buttons);
OldButtons = pev(id, pev_oldbuttons);
if((Button & IN_USE) && (OldButtons & IN_USE))
{
drag_start(id)
}
if(!(Button & IN_USE) && (OldButtons & IN_USE))
{
drag_end(id)
}
if (!g_drag_i[id])
{
g_unable2move[id] = false
}
if (g_unable2move[id] && get_pcvar_num(cvar_unb2move) > 0)
{
set_pev(id, pev_maxspeed, 1.0)
}
}
public harpoon_target(parm[]) // set beam (ex. tongue:) if target is player
{
new id = parm[0]
new hooktarget = parm[1]
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(8) // TE_BEAMENTS
write_short(id)
write_short(hooktarget)
write_short(g_Line) // sprite index
write_byte(0) // start frame
write_byte(0) // framerate
write_byte(200) // life
write_byte(8) // width
write_byte(1) // noise
write_byte(155) // r, g, b
write_byte(155) // r, g, b
write_byte(55) // r, g, b
write_byte(90) // brightness
write_byte(10) // speed
message_end()
}
public noTarget(id) // set beam if target isn't player
{
new endorigin[3]
get_user_origin(id, endorigin, 3)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte( TE_BEAMENTPOINT ); // TE_BEAMENTPOINT
write_short(id)
write_coord(endorigin[0])
write_coord(endorigin[1])
write_coord(endorigin[2])
write_short(g_Line) // sprite index
write_byte(0) // start frame
write_byte(0) // framerate
write_byte(200) // life
write_byte(8) // width
write_byte(1) // noise
write_byte(155) // r, g, b
write_byte(155) // r, g, b
write_byte(55) // r, g, b
write_byte(75) // brightness
write_byte(0) // speed
message_end()
}
public beam_remove(id) // remove beam
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(99) //TE_KILLBEAM
write_short(id) //entity
message_end()
}