Code:
#include <amxmodx>
#include <fakemeta>
#include <fun>
#include <zp50_core>
new const VERSION[] = "1.0.1"
new const BREATHING_SOUND[] = "zombie_plague/sprint_post.wav"
new g_bitAlivePlayers, g_bitSprintingPlayers, g_bitAllowedPlayers, g_bitCoolDownPlayers
#define MarkUserAlive(%0) g_bitAlivePlayers |= (1 << (%0 & 31))
#define ClearUserAlive(%0) g_bitAlivePlayers &= ~(1 << (%0 & 31))
#define IsUserAlive(%0) g_bitAlivePlayers & (1 << (%0 & 31))
#define MarkUserSprinting(%0) g_bitSprintingPlayers |= (1 << (%0 & 31))
#define ClearUserSprinting(%0) g_bitSprintingPlayers &= ~(1 << (%0 & 31))
#define IsUserSprinting(%0) g_bitSprintingPlayers & (1 << (%0 & 31))
#define MarkUserAllowed(%0) g_bitAllowedPlayers |= (1 << (%0 & 31))
#define ClearUserAllowed(%0) g_bitAllowedPlayers &= ~(1 << (%0 & 31))
#define IsUserAllowed(%0) g_bitAllowedPlayers & (1 << (%0 & 31))
#define MarkUserCoolDown(%0) g_bitCoolDownPlayers |= (1 << (%0 & 31))
#define ClearUserCoolDown(%0) g_bitCoolDownPlayers &= ~(1 << (%0 & 31))
#define IsUserCoolDown(%0) g_bitCoolDownPlayers & (1 << (%0 & 31))
#define ADVERTISE_SPRINT 60.0
new cvar_sprintspeedadder, cvar_sprintmaxduration, cvar_mintimeforsoundeffect
new Float:flSprintSpeedAdder, Float:flSprintMaxDuration, Float:flMinTimeForSoundEffect
new Float:flSprintDuration[33], iCurWeapon[33]
new iMaxPlayers
public plugin_precache()
{
precache_sound(BREATHING_SOUND)
}
public plugin_init()
{
register_plugin("[ZP] Addon: Sprinting", VERSION, "Excalibur.007")
register_clcmd("sprint", "command_sprint")
register_clcmd("say /sprint", "menu_permission")
register_clcmd("say_team /sprint", "menu_permission")
cvar_sprintspeedadder = register_cvar("zp_sprint_speed_adder", "50")
cvar_sprintmaxduration = register_cvar("zp_sprint_max_duration", "7.0")
cvar_mintimeforsoundeffect = register_cvar("zp_sprint_min_time_for_sound", "5.0")
register_event("HLTV", "event_new_round", "a", "1=0", "2=0")
register_event("DeathMsg", "event_DeathMsg", "a")
register_event("CurWeapon", "event_CurWeapon", "be")
register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
iMaxPlayers = get_maxplayers()
}
public plugin_cfg()
{
flSprintSpeedAdder = get_pcvar_float(cvar_sprintspeedadder)
flSprintMaxDuration = get_pcvar_float(cvar_sprintmaxduration)
flMinTimeForSoundEffect = get_pcvar_float(cvar_mintimeforsoundeffect)
set_task(ADVERTISE_SPRINT, "advertisement_text", 0)
}
public advertisement_text(id)
{
client_print(0, print_chat, "[Sprint] Type ^"/sprint^" to enable/disable sprint realism through a menu")
client_print(0, print_chat, "[Sprint] You will be still able to sprint even it's disabled. Just that it will not be realistic.")
}
public client_putinserver(id)
{
set_task(5.0, "menu_permission", id)
}
public client_disconnect(id)
{
ClearUserAlive(id)
ClearUserSprinting(id)
ClearUserCoolDown(id)
if(IsUserAllowed(id))
{
client_cmd(id, "cl_bob 0.01")
ClearUserAllowed(id)
}
}
public event_new_round()
{
flSprintSpeedAdder = get_pcvar_float(cvar_sprintspeedadder)
flSprintMaxDuration = get_pcvar_float(cvar_sprintmaxduration)
flMinTimeForSoundEffect = get_pcvar_float(cvar_mintimeforsoundeffect)
for(new i = 0; i < iMaxPlayers; i++)
{
ClearUserSprinting(i)
ClearUserCoolDown(i)
if(IsUserAllowed(i))
client_cmd(i, "cl_bob 0.01")
}
}
public event_DeathMsg()
{
new iVictim = read_data(2)
ClearUserAlive(iVictim)
ClearUserSprinting(iVictim)
ClearUserCoolDown(iVictim)
if(IsUserAllowed(iVictim))
client_cmd(iVictim, "cl_bob 0.01")
}
public event_CurWeapon(id)
{
if(~IsUserAlive(id) || !zp_core_is_zombie(id))
return PLUGIN_CONTINUE
iCurWeapon[id] = read_data(2)
return PLUGIN_CONTINUE
}
public fw_PlayerPreThink(id)
{
if(~IsUserAlive(id) || !zp_core_is_zombie(id))
return FMRES_IGNORED
if(IsUserSprinting(id))
cs_set_user_sprint_speed(id)
return FMRES_IGNORED
}
public zp_fw_core_spawn_post(id)
{
if(!is_user_alive(id))
return PLUGIN_CONTINUE
MarkUserAlive(id)
ClearUserSprinting(id)
ClearUserCoolDown(id)
if(IsUserAllowed(id))
client_cmd(id, "cl_bob 0.01")
return PLUGIN_CONTINUE
}
public command_sprint(id)
{
if(~IsUserAlive(id) || !zp_core_is_zombie(id) || IsUserCoolDown(id))
return PLUGIN_CONTINUE
if(IsUserSprinting(id))
{
ClearUserSprinting(id)
if(IsUserAllowed(id))
client_cmd(id, "cl_bob 0.01")
if(flSprintDuration[id] >= flMinTimeForSoundEffect)
client_cmd(id, "spk %s", BREATHING_SOUND)
set_task(flSprintDuration[id], "reset_vars", id)
}
else
{
new IsDucking = (pev(id, pev_flags) & (FL_DUCKING | FL_ONGROUND) == (FL_DUCKING | FL_ONGROUND))
if(!IsDucking)
{
MarkUserSprinting(id)
if(IsUserAllowed(id))
client_cmd(id, "cl_bob 0.05")
set_task(0.25, "hook_sprint_duration", id)
}
}
return PLUGIN_CONTINUE
}
public hook_sprint_duration(id)
{
if(~IsUserAlive(id) || !zp_core_is_zombie(id) || ~IsUserSprinting(id))
return PLUGIN_CONTINUE
new IsDucking = (pev(id, pev_flags) & (FL_DUCKING | FL_ONGROUND) == (FL_DUCKING | FL_ONGROUND))
if(IsDucking)
{
ClearUserSprinting(id)
if(IsUserAllowed(id))
client_cmd(id, "cl_bob 0.01")
MarkUserCoolDown(id)
if(flSprintDuration[id] >= flMinTimeForSoundEffect)
client_cmd(id, "spk %s", BREATHING_SOUND)
set_task(flSprintDuration[id], "reset_vars", id)
return PLUGIN_CONTINUE
}
flSprintDuration[id] += 0.25
if(flSprintDuration[id] >= flSprintMaxDuration)
{
ClearUserSprinting(id)
if(IsUserAllowed(id))
client_cmd(id, "cl_bob 0.01")
MarkUserCoolDown(id)
if(flSprintDuration[id] >= flMinTimeForSoundEffect)
client_cmd(id, "spk %s", BREATHING_SOUND)
set_task(flSprintDuration[id], "reset_vars", id)
}
set_task(0.25, "hook_sprint_duration", id)
return PLUGIN_CONTINUE
}
public reset_vars(id)
{
client_cmd(id, "stopsound")
if(~IsUserAlive(id))
return PLUGIN_CONTINUE
ClearUserCoolDown(id)
flSprintDuration[id] = 0.0
return PLUGIN_CONTINUE
}
public menu_permission(id)
{
new menu = menu_create("\yDo you allow ^"Sprint^" plugin to edit your CVar for realism?", "menu_handler")
menu_additem(menu, "\wYes", "1", 0)
menu_additem(menu, "\wNo", "2", 0)
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
menu_display(id, menu, 0)
}
public menu_handler(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED
}
new data[6], szName[64]
new access, callback
menu_item_getinfo(menu, item, access, data, charsmax(data), szName,charsmax(szName), callback)
new key = str_to_num(data)
switch(key)
{
case 1:
{
MarkUserAllowed(id)
client_print(id, print_chat, "[Sprint] Sprint realism is now enabled.")
client_print(id, print_chat, "[Sprint] Open up your console(~) and bind a key to sprint. e.g. bind v sprint")
menu_destroy(menu)
return PLUGIN_HANDLED
}
case 2:
{
ClearUserAllowed(id)
client_cmd(id, "cl_bob 0.01")
client_print(id, print_chat, "[Sprint] Sprint realism is now disabled.")
menu_destroy(menu)
return PLUGIN_HANDLED
}
}
menu_destroy(menu)
return PLUGIN_HANDLED
}
stock cs_set_user_sprint_speed(id)
{
new Float:flMaxSpeed
switch(iCurWeapon[id])
{
case CSW_SG550, CSW_AWP, CSW_G3SG1 : flMaxSpeed = (210.0 + flSprintSpeedAdder)
case CSW_M249 : flMaxSpeed = (220.0 + flSprintSpeedAdder)
case CSW_AK47 : flMaxSpeed = (221.0 + flSprintSpeedAdder)
case CSW_M3, CSW_M4A1 : flMaxSpeed = (230.0 + flSprintSpeedAdder)
case CSW_SG552 : flMaxSpeed = (235.0 + flSprintSpeedAdder)
case CSW_XM1014, CSW_AUG, CSW_GALIL, CSW_FAMAS : flMaxSpeed = (240.0 + flSprintSpeedAdder)
case CSW_P90 : flMaxSpeed = (245.0 + flSprintSpeedAdder)
case CSW_SCOUT : flMaxSpeed = (260.0 + flSprintSpeedAdder)
default : flMaxSpeed = (250.0 + flSprintSpeedAdder)
}
set_user_maxspeed(id, flMaxSpeed)
}
Also, players have to manually bind a button to "sprint". Example: bind v sprint