HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /**
  2.  *
  3.  * Anti Silent-Run
  4.  * by Numb
  5.  *
  6.  *
  7.  * Description:
  8.  * Permanently blocks player ability to silent-run (this exploit also is known as russian-walk).
  9.  * Permanently blocks player ability to expoit silent-ladder climb.
  10.  * Removes double-duck stuck bug.
  11.  *
  12.  *
  13.  * Requires:
  14.  * FakeMeta
  15.  *
  16.  *
  17.  * Additional Info:
  18.  * + Tested in Counter-Strike 1.6 with amxmodx 1.8.1. But should work with all Half-Life mods and some older amxx versions.
  19.  *
  20.  *
  21.  * Notes:
  22.  * + 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.
  23.  *
  24.  *
  25.  * ChangeLog:
  26.  *
  27.  * + 1.1
  28.  * - Fixed: Wrong (water) step sound was played on some wooden surfaces.
  29.  *
  30.  * + 1.0
  31.  * - First release.
  32.  *
  33.  *
  34.  * Downloads:
  35.  * Amx Mod X forums: http://forums.alliedmods.net/showthread.php?p=968319#post968319
  36.  *
  37. **/
  38.  
  39.  
  40. #include <amxmodx>
  41. #include <fakemeta>
  42.  
  43. #define PLUGIN_NAME "Anti Silent-run"
  44. #define PLUGIN_VERSION "1.1"
  45. #define PLUGIN_AUTHOR "Numb"
  46.  
  47. #define FOOTSTEPS_SOUND_SPEED 151.0
  48.  
  49. //--- sound/materials.txt ---
  50. //
  51. // 'M' metal
  52. // 'V' ventillation
  53. // 'D' dirt
  54. // 'S' slosh liquid
  55. // 'T' tile
  56. // 'G' grate (Concrete is the default)
  57. // 'W' wood
  58. // 'P' computer
  59. // 'Y' glass
  60. // 'N' snow
  61. //
  62. // Comments:
  63. // * '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
  64. // amxx pdata cbase list: http://wiki.alliedmods.net/CBasePlayer_(CS)
  65. // * Default one actually is 'C' what isn't even in materials.txt list
  66. // * Creating this plugin I checked pdata_int and pdata_cbase offsets from 0 to 2048, and found that there is no "m_chTextureType" offset
  67. // * Creating this plugin I checked "m_iStepLeft" offset with pdata_int and pdata_cbase, and found out that this offset always returns 0
  68.  
  69.  
  70. #define TEXTURE_CONCRETE 'C'
  71. #define TEXTURE_METAL 'M'
  72. #define TEXTURE_DIRT 'D'
  73. #define TEXTURE_VENT 'V'
  74. #define TEXTURE_GRATE 'G'
  75. #define TEXTURE_TILE 'T'
  76. #define TEXTURE_SLOSH 'S'
  77. #define TEXTURE_SNOW 'N'
  78.  
  79. #define DOUBLE_DUCK_VOLUME 0.75
  80. #define SILENT_LADDER_VOLUME 0.75
  81.  
  82. new bool:g_bIsUserDead[33];
  83. new g_iCvarP_footsteps;
  84.  
  85. public plugin_init()
  86. {
  87. register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
  88.  
  89. register_event("ResetHUD", "Event_ResetHUD", "be");
  90. register_event("Health", "Event_Health", "bd", "1=0");
  91.  
  92. g_iCvarP_footsteps = get_cvar_pointer("mp_footsteps");
  93.  
  94. register_forward(FM_PlayerPreThink, "FM_PlayerPreThink_Post", 1);
  95. }
  96.  
  97. public plugin_precache()
  98. {
  99. precache_sound("player/pl_step1.wav");
  100. precache_sound("player/pl_step2.wav");
  101. precache_sound("player/pl_step3.wav");
  102. precache_sound("player/pl_step4.wav");
  103.  
  104. precache_sound("player/pl_metal1.wav");
  105. precache_sound("player/pl_metal2.wav");
  106. precache_sound("player/pl_metal3.wav");
  107. precache_sound("player/pl_metal4.wav");
  108.  
  109. precache_sound("player/pl_dirt1.wav");
  110. precache_sound("player/pl_dirt2.wav");
  111. precache_sound("player/pl_dirt3.wav");
  112. precache_sound("player/pl_dirt4.wav");
  113.  
  114. precache_sound("player/pl_duct1.wav");
  115. precache_sound("player/pl_duct2.wav");
  116. precache_sound("player/pl_duct3.wav");
  117. precache_sound("player/pl_duct4.wav");
  118.  
  119. precache_sound("player/pl_grate1.wav");
  120. precache_sound("player/pl_grate2.wav");
  121. precache_sound("player/pl_grate3.wav");
  122. precache_sound("player/pl_grate4.wav");
  123.  
  124. precache_sound("player/pl_tile1.wav");
  125. precache_sound("player/pl_tile2.wav");
  126. precache_sound("player/pl_tile3.wav");
  127. precache_sound("player/pl_tile4.wav");
  128. precache_sound("player/pl_tile5.wav");
  129.  
  130. precache_sound("player/pl_slosh1.wav");
  131. precache_sound("player/pl_slosh2.wav");
  132. precache_sound("player/pl_slosh3.wav");
  133. precache_sound("player/pl_slosh4.wav");
  134.  
  135. precache_sound("player/pl_wade1.wav");
  136. precache_sound("player/pl_wade2.wav");
  137. precache_sound("player/pl_wade3.wav");
  138. precache_sound("player/pl_wade4.wav");
  139.  
  140. precache_sound("player/pl_snow1.wav");
  141. precache_sound("player/pl_snow2.wav");
  142. precache_sound("player/pl_snow3.wav");
  143. precache_sound("player/pl_snow4.wav");
  144. precache_sound("player/pl_snow5.wav");
  145. precache_sound("player/pl_snow6.wav");
  146.  
  147. precache_sound("player/pl_ladder1.wav");
  148. precache_sound("player/pl_ladder2.wav");
  149. precache_sound("player/pl_ladder3.wav");
  150. precache_sound("player/pl_ladder4.wav");
  151. }
  152.  
  153. public client_connect(iPlrId)
  154. g_bIsUserDead[iPlrId] = true;
  155.  
  156. public Event_ResetHUD(iPlrId)
  157. g_bIsUserDead[iPlrId] = false;
  158.  
  159. public Event_Health(iPlrId)
  160. g_bIsUserDead[iPlrId] = true;
  161.  
  162. public FM_PlayerPreThink_Post(iPlrId)
  163. {
  164. if( g_bIsUserDead[iPlrId] )
  165. return FMRES_IGNORED;
  166.  
  167. if( !get_pcvar_num(g_iCvarP_footsteps) )
  168. return FMRES_IGNORED;
  169.  
  170. static s_iFlags, bool:bOnLadder;
  171. s_iFlags = pev(iPlrId, pev_flags);
  172. bOnLadder = (pev(iPlrId, pev_movetype)==MOVETYPE_FLY)?true:false;
  173.  
  174. if( bOnLadder && !(s_iFlags&FL_ONGROUND) )
  175. {
  176. if( !(pev(iPlrId, pev_oldbuttons)&IN_DUCK) && pev(iPlrId, pev_button)&IN_DUCK )
  177. {
  178. static Float:s_fVelocity[3];
  179. pev(iPlrId, pev_velocity, s_fVelocity);
  180. if( vector_length(s_fVelocity)<FOOTSTEPS_SOUND_SPEED )
  181. return FMRES_IGNORED;
  182.  
  183. switch( random(4) )
  184. {
  185. // right foot
  186. case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_ladder1.wav", SILENT_LADDER_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  187. case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_ladder2.wav", SILENT_LADDER_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  188. // left foot
  189. case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_ladder3.wav", SILENT_LADDER_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  190. case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_ladder4.wav", SILENT_LADDER_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  191. }
  192. }
  193. return FMRES_IGNORED;
  194. }
  195.  
  196. if( pev(iPlrId, pev_bInDuck) && s_iFlags&FL_ONGROUND && pev(iPlrId, pev_oldbuttons)&IN_DUCK && !(pev(iPlrId, pev_button)&IN_DUCK) )
  197. {
  198. switch( is_doubleduck_valid(iPlrId) )
  199. {
  200. case 0:
  201. {
  202. set_pev(iPlrId, pev_bInDuck, false);
  203. set_pev(iPlrId, pev_flags, (s_iFlags|FL_DUCKING));
  204. engfunc(EngFunc_SetSize, iPlrId, Float:{-16.0, -16.0, -25.0}, Float:{16.0, 16.0, 25.0});
  205.  
  206. return FMRES_IGNORED;
  207. }
  208. case -1: return FMRES_IGNORED;
  209. }
  210.  
  211. static Float:s_fVelocity[3];
  212. pev(iPlrId, pev_velocity, s_fVelocity);
  213.  
  214. if( floatsqroot(floatpower(s_fVelocity[0], 2.0)+floatpower(s_fVelocity[1], 2.0))>=FOOTSTEPS_SOUND_SPEED )
  215. {
  216. if( bOnLadder )
  217. {
  218. switch( random(4) )
  219. {
  220. // right foot
  221. case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_ladder1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  222. case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_ladder2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  223. // left foot
  224. case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_ladder3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  225. case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_ladder4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  226. }
  227.  
  228. return FMRES_IGNORED;
  229. }
  230.  
  231. switch( pev(iPlrId, pev_waterlevel) )
  232. {
  233. case 1, 2:
  234. {
  235. switch( random(4) )
  236. {
  237. // right foot
  238. case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_wade1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  239. case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_wade2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  240. // left foot
  241. case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_wade3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  242. case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_wade4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  243. }
  244.  
  245. return FMRES_IGNORED;
  246. }
  247. case 3: return FMRES_IGNORED;
  248. }
  249.  
  250. switch( get_player_texture_type(iPlrId) )
  251. {
  252. case TEXTURE_METAL:
  253. {
  254. switch( random(4) )
  255. {
  256. // right foot
  257. case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_metal1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  258. case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_metal3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  259. // left foot
  260. case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_metal2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  261. case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_metal4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  262. }
  263. }
  264. case TEXTURE_DIRT:
  265. {
  266. switch( random(4) )
  267. {
  268. // right foot
  269. case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_dirt1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  270. case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_dirt3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  271. // left foot
  272. case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_dirt2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  273. case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_dirt4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  274. }
  275. }
  276. case TEXTURE_VENT:
  277. {
  278. switch( random(4) )
  279. {
  280. // right foot
  281. case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_duct1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  282. case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_duct3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  283. // left foot
  284. case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_duct2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  285. case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_duct4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  286. }
  287. }
  288. case TEXTURE_GRATE:
  289. {
  290. switch( random(4) )
  291. {
  292. // right foot
  293. case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_grate1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  294. case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_grate3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  295. // left foot
  296. case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_grate2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  297. case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_grate4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  298. }
  299. }
  300. case TEXTURE_TILE:
  301. {
  302. switch( (random(5)?random(4):4) )
  303. {
  304. // right foot
  305. case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_tile1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  306. case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_tile3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  307. // left foot
  308. case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_tile2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  309. case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_tile4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  310. // editional sounds
  311. case 4: emit_sound(iPlrId, CHAN_BODY, "player/pl_tile5.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  312. }
  313. }
  314. case TEXTURE_SLOSH:
  315. {
  316. switch( random(4) )
  317. {
  318. // right foot
  319. case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_slosh1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  320. case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_slosh3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  321. // left foot
  322. case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_slosh2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  323. case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_slosh4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  324. }
  325. }
  326. case TEXTURE_SNOW:
  327. {
  328. switch( (random(5)?random(4):random_num(4,5)) )
  329. {
  330. // right foot
  331. case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_snow1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  332. case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_snow2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  333. // left foot
  334. case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_snow3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  335. case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_snow4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  336. // editional sounds
  337. case 4: emit_sound(iPlrId, CHAN_BODY, "player/pl_snow5.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  338. case 5: emit_sound(iPlrId, CHAN_BODY, "player/pl_snow6.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  339. }
  340. }
  341. default: // case TEXTURE_CONCRETE: // and others what weren't finished by valve
  342. {
  343. switch( random(4) )
  344. {
  345. // right foot
  346. case 0: emit_sound(iPlrId, CHAN_BODY, "player/pl_step1.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  347. case 1: emit_sound(iPlrId, CHAN_BODY, "player/pl_step3.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  348. // left foot
  349. case 2: emit_sound(iPlrId, CHAN_BODY, "player/pl_step2.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  350. case 3: emit_sound(iPlrId, CHAN_BODY, "player/pl_step4.wav", DOUBLE_DUCK_VOLUME, ATTN_NORM, 0, PITCH_NORM);
  351. }
  352. }
  353. }
  354. }
  355. }
  356.  
  357. return FMRES_IGNORED;
  358. }
  359.  
  360. is_doubleduck_valid(iPlrId)
  361. {
  362. static Float:s_fStartOrigin[3], Float:s_fDDEndOrigin[3];
  363. pev(iPlrId, pev_origin, s_fStartOrigin);
  364. s_fDDEndOrigin = s_fStartOrigin;
  365. s_fDDEndOrigin[2] += 18.0;
  366.  
  367. engfunc(EngFunc_TraceHull, s_fStartOrigin, s_fDDEndOrigin, DONT_IGNORE_MONSTERS, HULL_HUMAN, iPlrId, 0);
  368.  
  369. if( !get_tr2(0, TR_StartSolid) && !get_tr2(0, TR_AllSolid) && get_tr2(0, TR_InOpen) )
  370. {
  371. static Float:s_fDDFraction;
  372. get_tr2(0, TR_flFraction, s_fDDFraction);
  373.  
  374. if( s_fDDFraction==1.0 )
  375. return 1;
  376. }
  377. else
  378. return -1;
  379.  
  380. return 0;
  381. }
  382.  
  383. get_player_texture_type(iPlrId)
  384. {
  385. static Float:s_fOrigin[3], Float:s_fEndOrigin[3];
  386. pev(iPlrId, pev_origin, s_fOrigin);
  387. pev(iPlrId, pev_absmin, s_fEndOrigin);
  388. s_fEndOrigin[0] = s_fOrigin[0];
  389. s_fEndOrigin[1] = s_fOrigin[1];
  390. s_fEndOrigin[2] += 1.0;
  391. s_fEndOrigin[2] -= (s_fOrigin[2]-s_fEndOrigin[2]);
  392.  
  393. static Float:s_fFraction;
  394. engfunc(EngFunc_TraceLine, s_fOrigin, s_fEndOrigin, IGNORE_MONSTERS, iPlrId, 0);
  395. get_tr2(0, TR_flFraction, s_fFraction);
  396.  
  397. if( s_fFraction>0.5 )
  398. return 'C';
  399.  
  400. static s_iGroundEnt;
  401. if( pev(iPlrId, pev_groundentity)!=(((s_iGroundEnt=get_tr2(0, TR_pHit))==-1)?(s_iGroundEnt=0):s_iGroundEnt) )
  402. return 'C';
  403.  
  404. s_fEndOrigin[2] = (s_fOrigin[2]-8192.0);
  405. static s_iTextureName[64];
  406. engfunc(EngFunc_TraceTexture, s_iGroundEnt, s_fOrigin, s_fEndOrigin, s_iTextureName, 63);
  407.  
  408. return dllfunc(DLLFunc_PM_FindTextureType, s_iTextureName);
  409. }
  410.