#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <zombieplague>
#define PLUGIN "[ZP] Extra Item : Speed Boost"
#define VERSION "1.2"
#define AUTHOR "Fry!"
//#define FOR_ADMINS_A_FLAG
#if defined FOR_ADMINS_A_FLAG
#define ADMINACCESS ADMIN_LEVEL_A
#endif
#define TRAILFREQUENCY 0.1
#define STEPFREQUENCY 0.3
new g_item_name[] = "Speed Boost"
new g_itemid_speed, g_sb_cost, g_sb_maxspeed, g_sb_time
new g_sb_red, g_sb_green, g_sb_blue, g_sb_fire_sprite, g_sb_smoke_sprite,
g_sb_bar, g_cur_speed_bar, g_sb_trail, g_sb_spritemodel
new g_sb_sprite_size[2] = {5, 1}
new g_sb_sprite_standoffset[2] = {33, 30}
new g_sb_sprite_duckoffset[2] = {14, 12}
new g_sb_sprite_brightness[2] = {160, 255}
new g_sb_sprite_calculatedoffset[33][2]
new bool:g_hasSpeedBoost[33]
new Float:nextstep[33], Float:nexttrail[33]
new g_origin[33][3], g_last_origin[33][3]
/*
This array holds the speeddata for the players
[0] = running speed; [1] = walking speed
[2] = boolean(1/0 running/walking); [3] = SuperfastSpeed (trail)
*/
new g_data[33][4]
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_cvar("zp_extra_speed_boost",VERSION,FCVAR_SERVER|FCVAR_EXTDLL|FCVAR_UNLOGGED|FCVAR_SPONLY)
g_sb_cost = register_cvar("zp_sb_cost", "15")
g_sb_maxspeed = register_cvar("zp_sb_maxspeed", "455.0")
g_sb_time = register_cvar("zp_sb_time", "25.0")
g_sb_red = register_cvar("zp_sb_red_color", "150")
g_sb_green = register_cvar("zp_sb_green_color", "0")
g_sb_blue = register_cvar("zp_sb_blue_color", "100")
g_sb_bar = register_cvar("zp_sb_bar", "0")
g_cur_speed_bar = register_cvar("zp_current_speed_bar", "0")
g_sb_trail = register_cvar("zp_sb_trail", "0")
g_sb_spritemodel = register_cvar("zp_sb_sprite_type", "0")
g_itemid_speed = zp_register_extra_item(g_item_name, get_pcvar_num(g_sb_cost), 0)
register_clcmd("say /sboost", "buy_sboost", ADMIN_ALL)
register_clcmd("say_team /sboost", "buy_sboost", ADMIN_ALL)
register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
register_forward(FM_PlayerPreThink, "fw_PlayerPreThink_Post", 1)
register_event("DeathMsg", "death", "a")
register_event("HLTV", "new_round_start", "a", "1=0", "2=0")
}
public plugin_precache()
{
g_sb_fire_sprite = precache_model("sprites/flame.spr")
g_sb_smoke_sprite = precache_model("sprites/xsmoke4.spr")
}
public client_connect(id)
{
g_hasSpeedBoost[id] = false
g_data[id][0] = get_pcvar_num(g_sb_maxspeed)
set_task(2.0, "cur_speed_bar", id, "", 0, "b")
return PLUGIN_HANDLED
}
public client_disconnect(id)
{
g_hasSpeedBoost[id] = false
}
public death()
{
g_hasSpeedBoost[read_data(2)] = false
}
public new_round_start()
{
for (new i = 1; i <= 32; i++)
g_hasSpeedBoost[i] = false
}
public zp_extra_item_selected(player, itemid)
{
if ( itemid == g_itemid_speed )
{
#if defined FOR_ADMINS_A_FLAG
if ( !( get_user_flags(id) & ADMINACCESS) )
return PLUGIN_CONTINUE
#endif
g_hasSpeedBoost[player] = true
fm_set_rendering(player, kRenderFxGlowShell, get_pcvar_num(g_sb_red), get_pcvar_num(g_sb_green), get_pcvar_num(g_sb_blue), kRenderNormal, 255)
set_pev(player, pev_maxspeed, get_pcvar_float(g_sb_maxspeed))
set_task(get_pcvar_float(g_sb_time), "boost_over", player)
set_task(get_pcvar_float(g_sb_time), "sb_bar", player)
client_print(player, print_chat, "[ZP] You've purchased Speed Booster")
}
return PLUGIN_CONTINUE
}
public buy_sboost(id)
{
#if defined FOR_ADMINS_A_FLAG
if ( !( get_user_flags(id) & ADMINACCESS) )
{
client_print(id, print_chat, "[ZP] Speed Boost is only available to admins")
return PLUGIN_CONTINUE
}
#endif
new money = zp_get_user_ammo_packs(id)
new cost = get_pcvar_num(g_sb_cost)
if (!is_user_alive(id))
{
client_print(id, print_chat, "[ZP] Dead people can't purchase Speed Boost")
return PLUGIN_HANDLED
}
if (g_hasSpeedBoost[id])
{
client_print(id, print_chat, "[ZP] You already purchased Speed Boost")
return PLUGIN_HANDLED
}
if (money < cost)
{
client_print(id, print_chat, "[ZP] You don't have enough ammo packs to buy Speed Boost", get_pcvar_num(g_sb_cost))
return PLUGIN_HANDLED
}
zp_set_user_ammo_packs(id, money - cost)
g_hasSpeedBoost[id] = true
fm_set_rendering(id, kRenderFxGlowShell, get_pcvar_num(g_sb_red), get_pcvar_num(g_sb_green), get_pcvar_num(g_sb_blue), kRenderNormal, 255)
set_pev(id, pev_maxspeed, get_pcvar_float(g_sb_maxspeed))
set_task(get_pcvar_float(g_sb_time), "boost_over")
set_task(get_pcvar_float(g_sb_time), "sb_bar", id)
client_print(id, print_chat, "[ZP] You've purchased Speed Booster")
return PLUGIN_HANDLED
}
public fw_PlayerPreThink(id)
{
if ( !is_user_alive(id) )
return FMRES_IGNORED
#if defined FOR_ADMINS_A_FLAG
if ( !( get_user_flags(id) & ADMINACCESS) )
{
client_print(id, print_chat, "[ZP] Speed Boost is only available to admins")
return FMRES_IGNORED
}
#endif
if ( g_hasSpeedBoost[id] )
{
fm_set_rendering(id, kRenderFxGlowShell, get_pcvar_num(g_sb_red), get_pcvar_num(g_sb_green), get_pcvar_num(g_sb_blue), kRenderNormal, 255)
set_pev(id, pev_maxspeed, get_pcvar_float(g_sb_maxspeed))
}
return FMRES_IGNORED
}
public fw_PlayerPreThink_Post(id)
{
if ( !is_user_alive(id) )
return FMRES_IGNORED
if ( g_hasSpeedBoost[id] )
{
if (get_pcvar_num(g_sb_bar) == 1 && (!task_exists(id)))
{
set_task(get_pcvar_float(g_sb_time), "sb_bar", id, "", 0, "b")
}
new Float:gametime = get_gametime()
if (nextstep[id] < gametime)
{
if ((pev(id,pev_flags) & FL_ONGROUND) && (current_speed(id) > g_data[id][1]))
{
if (!g_data[id][2])
{
g_data[id][2] = 1
nextstep[id] = gametime + STEPFREQUENCY
}
}
else
{
if (g_data[id][2])
{
g_data[id][2] = 0
nextstep[id] = gametime + STEPFREQUENCY
}
}
}
if ((nexttrail[id] < gametime) && get_pcvar_num(g_sb_trail) == 1)
{
if ((pev(id,pev_flags) & FL_ONGROUND) && (current_speed(id) > g_data[id][3]))
{
nexttrail[id] = gametime + TRAILFREQUENCY
get_user_origin(id, g_origin[id])
if (pev(id,pev_flags) & FL_DUCKING)
{
g_sb_sprite_calculatedoffset[id][0] = g_sb_sprite_duckoffset[0] - 19
g_sb_sprite_calculatedoffset[id][1] = g_sb_sprite_duckoffset[1] - 18
}
else
{
g_sb_sprite_calculatedoffset[id][0] = g_sb_sprite_standoffset[0]
g_sb_sprite_calculatedoffset[id][1] = g_sb_sprite_standoffset[1]
}
g_last_origin[id][0] = g_origin[id][0]
g_last_origin[id][1] = g_origin[id][1]
g_last_origin[id][2] = g_origin[id][2]
}
else
{
trailmessage(id)
get_user_origin(id, g_origin[id])
g_last_origin[id][0] = g_origin[id][0]
g_last_origin[id][1] = g_origin[id][1]
g_last_origin[id][2] = g_origin[id][2]
}
}
}
return FMRES_IGNORED
}
public boost_over(id)
{
g_hasSpeedBoost[id] = false
fm_set_rendering(id, kRenderFxNone, 0, 0 ,0, kRenderNormal, 255)
set_task(1.0, "cur_speed_bar", id)
client_print(id, print_chat, "[ZP] Speed Boost is over")
}
public sb_bar(id)
{
if (get_pcvar_num(g_sb_bar) == 1)
{
set_hudmessage(255, 255, 255, -1.0, 0.0, 0, 0.0, 1.0, 0.0, 0.0, 1)
show_hudmessage(id, "Current Speed: %.2f speed [ Max Speed 325.0 ]", current_speed(id))
}
else
{
remove_task(id)
}
if (get_pcvar_num(g_sb_bar) == 0)
return PLUGIN_HANDLED
return PLUGIN_CONTINUE
}
public cur_speed_bar(id)
{
if (get_pcvar_num(g_cur_speed_bar) == 1)
{
set_hudmessage(255, 255, 255, -1.0, 0.0, 0, 0.0, 1.0, 0.0, 0.0, 1)
show_hudmessage(id, "Current Speed: %.2f speed", current_speed(id))
}
else
{
remove_task(id)
}
if (get_pcvar_num(g_cur_speed_bar) == 0)
return PLUGIN_HANDLED
return PLUGIN_CONTINUE
}
public trailmessage(id)
{
new sprite = get_pcvar_num(g_sb_spritemodel)
//#define TE_SPRITE 17
message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
write_byte(TE_SPRITE)
write_coord(g_last_origin[id][0])
write_coord(g_last_origin[id][1])
write_coord(g_last_origin[id][2] - (sprite ? g_sb_sprite_calculatedoffset[id][1] : g_sb_sprite_calculatedoffset[id][0]))
write_short(sprite ? g_sb_fire_sprite : g_sb_smoke_sprite)
write_byte(sprite ? g_sb_sprite_size[1] : g_sb_sprite_size[0])
write_byte(sprite ? g_sb_sprite_brightness[1] : g_sb_sprite_brightness[0])
message_end()
return PLUGIN_HANDLED
}
stock Float:current_speed(entity)
{
new Float:Vel[3]
pev(entity, pev_velocity, Vel)
return (vector_length(Vel))
}
stock fm_set_user_maxspeed(index, Float:speed = -1.0)
{
engfunc(EngFunc_SetClientMaxspeed, index, speed)
set_pev(index, pev_maxspeed, speed)
return 1
}
stock fm_set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16)
{
new Float:RenderColor[3]
RenderColor[0] = float(r)
RenderColor[1] = float(g)
RenderColor[2] = float(b)
set_pev(entity, pev_renderfx, fx);
set_pev(entity, pev_rendercolor, RenderColor)
set_pev(entity, pev_rendermode, render)
set_pev(entity, pev_renderamt, float(amount))
return 1
}