/**
*
* Anti Silent-Run
* by Numb
*
*
* Description:
* Permanently blocks player ability to silent-run (this exploit also is known as russian-walk).
* Permanently blocks player ability to expoit silent-ladder climb.
* Removes double-duck stuck bug.
*
*
* Requires:
* FakeMeta
*
*
* Additional Info:
* + Tested in Counter-Strike 1.6 with amxmodx 1.8.1. But should work with all Half-Life mods and some older amxx versions.
*
*
* Notes:
* + Yes high ping players will hear their doubleduck emitted step sound with a delay what depends on their ping and there is no way to fix it using amxx.
*
*
* ChangeLog:
*
* + 1.1
* - Fixed: Wrong (water) step sound was played on some wooden surfaces.
*
* + 1.0
* - First release.
*
*
* Downloads:
* Amx Mod X forums: http://forums.alliedmods.net/showthread.php?p=968319#post968319
*
**/
#include <amxmodx>
#include <fakemeta>
#define PLUGIN_NAME "Anti Silent-run"
#define PLUGIN_VERSION "1.1"
#define PLUGIN_AUTHOR "Numb"
#define FOOTSTEPS_SOUND_SPEED 151.0
//--- sound/materials.txt ---
//
// 'M' metal
// 'V' ventillation
// 'D' dirt
// 'S' slosh liquid
// 'T' tile
// 'G' grate (Concrete is the default)
// 'W' wood
// 'P' computer
// 'Y' glass
// 'N' snow
//
// Comments:
// * 'P', 'Y', 'W' and 'F' ("flesh" what can be found in amxx pdata cbase list) do not even exist or weren't added cause were forgotten
// amxx pdata cbase list: http://wiki.alliedmods.net/CBasePlayer_(CS)
// * Default one actually is 'C' what isn't even in materials.txt list
// * Creating this plugin I checked pdata_int and pdata_cbase offsets from 0 to 2048, and found that there is no "m_chTextureType" offset
// * Creating this plugin I checked "m_iStepLeft" offset with pdata_int and pdata_cbase, and found out that this offset always returns 0
#define TEXTURE_CONCRETE 'C'
#define TEXTURE_METAL 'M'
#define TEXTURE_DIRT 'D'
#define TEXTURE_VENT 'V'
#define TEXTURE_GRATE 'G'
#define TEXTURE_TILE 'T'
#define TEXTURE_SLOSH 'S'
#define TEXTURE_SNOW 'N'
#define DOUBLE_DUCK_VOLUME 0.75
#define SILENT_LADDER_VOLUME 0.75
new bool:g_bIsUserDead[33];
new g_iCvarP_footsteps;
public plugin_init()
{
register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
register_event("ResetHUD", "Event_ResetHUD", "be");
register_event("Health", "Event_Health", "bd", "1=0");
g_iCvarP_footsteps = get_cvar_pointer("mp_footsteps");
register_forward(FM_PlayerPreThink, "FM_PlayerPreThink_Post", 1);
}
public plugin_precache()
{
precache_sound("player/pl_step1.wav");
precache_sound("player/pl_step2.wav");
precache_sound("player/pl_step3.wav");
precache_sound("player/pl_step4.wav");
precache_sound("player/pl_metal1.wav");
precache_sound("player/pl_metal2.wav");
precache_sound("player/pl_metal3.wav");
precache_sound("player/pl_metal4.wav");
precache_sound("player/pl_dirt1.wav");
precache_sound("player/pl_dirt2.wav");
precache_sound("player/pl_dirt3.wav");
precache_sound("player/pl_dirt4.wav");
precache_sound("player/pl_duct1.wav");
precache_sound("player/pl_duct2.wav");
precache_sound("player/pl_duct3.wav");
precache_sound("player/pl_duct4.wav");
precache_sound("player/pl_grate1.wav");
precache_sound("player/pl_grate2.wav");
precache_sound("player/pl_grate3.wav");
precache_sound("player/pl_grate4.wav");
precache_sound("player/pl_tile1.wav");
precache_sound("player/pl_tile2.wav");
precache_sound("player/pl_tile3.wav");
precache_sound("player/pl_tile4.wav");
precache_sound("player/pl_tile5.wav");
precache_sound("player/pl_slosh1.wav");
precache_sound("player/pl_slosh2.wav");
precache_sound("player/pl_slosh3.wav");
precache_sound("player/pl_slosh4.wav");
precache_sound("player/pl_wade1.wav");
precache_sound("player/pl_wade2.wav");
precache_sound("player/pl_wade3.wav");
precache_sound("player/pl_wade4.wav");
precache_sound("player/pl_snow1.wav");
precache_sound("player/pl_snow2.wav");
precache_sound("player/pl_snow3.wav");
precache_sound("player/pl_snow4.wav");
precache_sound("player/pl_snow5.wav");
precache_sound("player/pl_snow6.wav");
precache_sound("player/pl_ladder1.wav");
precache_sound("player/pl_ladder2.wav");
precache_sound("player/pl_ladder3.wav");
precache_sound("player/pl_ladder4.wav");
}
public client_connect(iPlrId)
g_bIsUserDead[iPlrId] = true;
public Event_ResetHUD(iPlrId)
g_bIsUserDead[iPlrId] = false;
public Event_Health(iPlrId)
g_bIsUserDead[iPlrId] = true;
public FM_PlayerPreThink_Post(iPlrId)
{
if( g_bIsUserDead[iPlrId] )
return FMRES_IGNORED;
if( !get_pcvar_num(g_iCvarP_footsteps) )
return FMRES_IGNORED;
static s_iFlags, bool:bOnLadder;
s_iFlags = pev(iPlrId, pev_flags);
bOnLadder = (pev(iPlrId, pev_movetype)==MOVETYPE_FLY)?true:false;
if( bOnLadder && !(s_iFlags&FL_ONGROUND) )
{
if( !(pev(iPlrId, pev_oldbuttons)&IN_DUCK) && pev(iPlrId, pev_button)&IN_DUCK )
{
static Float:s_fVelocity[3];
pev(iPlrId, pev_velocity, s_fVelocity);
if( vector_length(s_fVelocity)<FOOTSTEPS_SOUND_SPEED )
return FMRES_IGNORED;
switch( random(4) )
{
// right foot
case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_ladder1.wav", SILENT_LADDER_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_ladder2.wav", SILENT_LADDER_VOLUME, ATTN_NORM, 0, PITCH_NORM);
// left foot
case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_ladder3.wav", SILENT_LADDER_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_ladder4.wav", SILENT_LADDER_VOLUME, ATTN_NORM, 0, PITCH_NORM);
}
}
return FMRES_IGNORED;
}
if( pev(iPlrId, pev_bInDuck) && s_iFlags&FL_ONGROUND && pev(iPlrId, pev_oldbuttons)&IN_DUCK && !(pev(iPlrId, pev_button)&IN_DUCK) )
{
switch( is_doubleduck_valid(iPlrId) )
{
case 0:
{
set_pev(iPlrId, pev_bInDuck, false);
set_pev(iPlrId, pev_flags, (s_iFlags|FL_DUCKING));
engfunc(EngFunc_SetSize, iPlrId, Float:{-16.0, -16.0, -25.0}, Float:{16.0, 16.0, 25.0});
return FMRES_IGNORED;
}
case -1: return FMRES_IGNORED;
}
static Float:s_fVelocity[3];
pev(iPlrId, pev_velocity, s_fVelocity);
if( floatsqroot(floatpower(s_fVelocity[0], 2.0)+floatpower(s_fVelocity[1], 2.0))>=FOOTSTEPS_SOUND_SPEED )
{
if( bOnLadder )
{
switch( random(4) )
{
// right foot
case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_ladder1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_ladder2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
// left foot
case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_ladder3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_ladder4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
}
return FMRES_IGNORED;
}
switch( pev(iPlrId, pev_waterlevel) )
{
case 1, 2:
{
switch( random(4) )
{
// right foot
case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_wade1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_wade2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
// left foot
case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_wade3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_wade4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
}
return FMRES_IGNORED;
}
case 3: return FMRES_IGNORED;
}
switch( get_player_texture_type(iPlrId) )
{
case TEXTURE_METAL:
{
switch( random(4) )
{
// right foot
case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_metal1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_metal3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
// left foot
case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_metal2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_metal4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
}
}
case TEXTURE_DIRT:
{
switch( random(4) )
{
// right foot
case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_dirt1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_dirt3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
// left foot
case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_dirt2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_dirt4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
}
}
case TEXTURE_VENT:
{
switch( random(4) )
{
// right foot
case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_duct1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_duct3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
// left foot
case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_duct2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_duct4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
}
}
case TEXTURE_GRATE:
{
switch( random(4) )
{
// right foot
case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_grate1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_grate3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
// left foot
case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_grate2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_grate4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
}
}
case TEXTURE_TILE:
{
switch( (random(5)?random(4):4) )
{
// right foot
case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_tile1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_tile3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
// left foot
case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_tile2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_tile4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
// editional sounds
case 4: emit_sound(iPlrId, CHAN_BODY, "player/pl_tile5.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
}
}
case TEXTURE_SLOSH:
{
switch( random(4) )
{
// right foot
case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_slosh1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_slosh3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
// left foot
case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_slosh2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_slosh4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
}
}
case TEXTURE_SNOW:
{
switch( (random(5)?random(4):random_num(4,5)) )
{
// right foot
case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_snow1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_snow2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
// left foot
case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_snow3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_snow4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
// editional sounds
case 4: emit_sound(iPlrId, CHAN_BODY, "player/pl_snow5.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 5: emit_sound(iPlrId, CHAN_BODY, "player/pl_snow6.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
}
}
default: // case TEXTURE_CONCRETE: // and others what weren't finished by valve
{
switch( random(4) )
{
// right foot
case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_step1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_step3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
// left foot
case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_step2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_step4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
}
}
}
}
}
return FMRES_IGNORED;
}
is_doubleduck_valid(iPlrId)
{
static Float:s_fStartOrigin[3], Float:s_fDDEndOrigin[3];
pev(iPlrId, pev_origin, s_fStartOrigin);
s_fDDEndOrigin = s_fStartOrigin;
s_fDDEndOrigin[2] += 18.0;
engfunc(EngFunc_TraceHull, s_fStartOrigin, s_fDDEndOrigin, DONT_IGNORE_MONSTERS, HULL_HUMAN, iPlrId, 0);
if( !get_tr2(0, TR_StartSolid) && !get_tr2(0, TR_AllSolid) && get_tr2(0, TR_InOpen) )
{
static Float:s_fDDFraction;
get_tr2(0, TR_flFraction, s_fDDFraction);
if( s_fDDFraction==1.0 )
return 1;
}
else
return -1;
return 0;
}
get_player_texture_type(iPlrId)
{
static Float:s_fOrigin[3], Float:s_fEndOrigin[3];
pev(iPlrId, pev_origin, s_fOrigin);
pev(iPlrId, pev_absmin, s_fEndOrigin);
s_fEndOrigin[0] = s_fOrigin[0];
s_fEndOrigin[1] = s_fOrigin[1];
s_fEndOrigin[2] += 1.0;
s_fEndOrigin[2] -= (s_fOrigin[2]-s_fEndOrigin[2]);
static Float:s_fFraction;
engfunc(EngFunc_TraceLine, s_fOrigin, s_fEndOrigin, IGNORE_MONSTERS, iPlrId, 0);
get_tr2(0, TR_flFraction, s_fFraction);
if( s_fFraction>0.5 )
return 'C';
static s_iGroundEnt;
if( pev(iPlrId, pev_groundentity)!=(((s_iGroundEnt=get_tr2(0, TR_pHit))==-1)?(s_iGroundEnt=0):s_iGroundEnt) )
return 'C';
s_fEndOrigin[2] = (s_fOrigin[2]-8192.0);
static s_iTextureName[64];
engfunc(EngFunc_TraceTexture, s_iGroundEnt, s_fOrigin, s_fEndOrigin, s_iTextureName, 63);
return dllfunc(DLLFunc_PM_FindTextureType, s_iTextureName);
}