Advertisement
Guest User

Untitled

a guest
Aug 30th, 2014
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 53.96 KB | None | 0 0
  1. /**
  2. *
  3. * Weapon Balance Mod
  4. * by Numb
  5. *
  6. *
  7. * Description:
  8. * This plugin ensures that all firearms will be useful. In other words, less popular
  9. * weapons are just as deadly now as normally mostly used ones. However due to large weapon
  10. * choice what Counter-Strike offers, this plugin isn't designed only to balance the
  11. * weapons power and how useful they are. It as well brings in new strategies - all weapons
  12. * are more balanced up, but some are more useful in various tactical situations than
  13. * others.
  14. *
  15. *
  16. * Requires:
  17. * FakeMeta
  18. * HamSandWich
  19. *
  20. *
  21. * Cvars:
  22. *
  23. * + "shotgun_tracers" - shotgun bullet tracers (just add the numbers).
  24. * - "1" - First-Person special tracers.
  25. * - "2" - Non-First-Person tracers. [default]
  26. * - "4" - First-Person tracers (1 must be disabled).
  27. *
  28. * + "shotgun_doubleshot" - shotgun ability to perform a double-shot.
  29. * - "0" - disabled. [default]
  30. * - "1" - enabled.
  31. *
  32. * + "weapon_autoswitch_fix" - smart autoswitch if _cl_autowepswitch is enabled.
  33. * - "0" - disabled.
  34. * - "1" - enabled. [default]
  35. *
  36. * + "weapon_silentpickup" - silent weapon pick up ability.
  37. * - "0" - disabled.
  38. * - "1" - enabled. [default]
  39. *
  40. * + "sniper_zoom_reset" - resets awp and scout zoom after fire.
  41. * - "0" - disabled.
  42. * - "1" - enabled.
  43. * - "2" - doesn't reset awp zoom, forces scout zoom to stay.
  44. * - "3" - resets awp zoom, forces scout zoom to stay. [default]
  45. *
  46. * + "glock_recoil" - visual recoil for glock.
  47. * - "0" - disabled.
  48. * - "1" - enabled. [default]
  49. *
  50. *
  51. * Additional info:
  52. * Tested in Counter-Strike 1.6 with amxmodx 1.8.3 (dev build hg83). You may find servers
  53. * what are using this plugin by pasting "weapon_balance" cvar in search options.
  54. *
  55. *
  56. * Notes:
  57. * This plugin only modifies bullet power, accuracy in some cases, and recoil percentage -
  58. * it does not change recoil to anything totally new. It took several months for this
  59. * plugin to see daylight; initial event what triggered creation of this mod is VALVe's
  60. * ( http://www.valvesoftware.com/ ) statement that Counter-Strike: Global Offensive
  61. * ( http://store.steampowered.com/app/1800/ ) will have balanced weapons.
  62. *
  63. *
  64. * Warnings:
  65. * It is highly recommended to install Accuracy Fix
  66. * ( http://forums.alliedmods.net/showthread.php?p=1549133 ), Rate of Fire Fix
  67. * ( http://forums.alliedmods.net/showthread.php?t=188182 ), Sniper Crosshairs
  68. * ( http://forums.alliedmods.net/showthread.php?t=188976 ) and Reload Animation Fix
  69. * ( http://forums.alliedmods.net/showthread.php?p=1620401 ) plugins before this one (in
  70. * that order). Also it is not suggested to pause this plugin non-manually.
  71. *
  72. *
  73. * Credits:
  74. * I would like to thank Arkshine ( http://forums.alliedmods.net/member.php?u=7779 ) for
  75. * CS-SDK ( https://github.com/Arkshine/CSSDK/ ), ConnorMcLeod
  76. * ( http://forums.alliedmods.net/member.php?u=18946 ) for some useful tips, xPaw
  77. * ( http://forums.alliedmods.net/member.php?u=39377 ) and n0br41ner
  78. * ( http://forums.alliedmods.net/member.php?u=182852 ) for helping in alpha version tests,
  79. * p3tsin ( http://forums.alliedmods.net/member.php?u=7025 ) creator of Potti - a
  80. * controllable fakeplayer ( http://forums.alliedmods.net/showthread.php?p=255078 ) plugin
  81. * what helped me in pre-beta tests, and ProClashGamers Clan
  82. * ( http://www.proclashgamers.com/ ) for help in beta tests.
  83. *
  84. *
  85. * Change-Log:
  86. *
  87. * + 1.9
  88. * - Added: More zoom reset options.
  89. *
  90. * + 1.8
  91. * - Fixed: Scout delay between empty clicking sound and reload.
  92. *
  93. * + 1.7
  94. * - Added: glock_recoil cvar to enable or disable glock recoil.
  95. * - Fixed: Ability to move during freezetime.
  96. *
  97. * + 1.6
  98. * - Added: sniper_zoom_reset cvar to reset awp and scout zoom after fire.
  99. *
  100. * + 1.5
  101. * - Fixed: Recoil change doesn't effect screen shake when taking damage.
  102. *
  103. * + 1.4
  104. * - Fixed: Shotgun recoil calculation.
  105. *
  106. * + 1.3
  107. * - Fixed: Minor code improvements.
  108. *
  109. * + 1.2
  110. * - Fixed: With Rate of Fire Fix while zoomed with SG552 or AUG, recoil is smaller.
  111. *
  112. * + 1.1
  113. * - Fixed: Is user walking check when not in water.
  114. *
  115. * + 1.0
  116. * - First release.
  117. *
  118. *
  119. * Downloads:
  120. * Amx Mod X forums: http://forums.alliedmods.net/showthread.php?p=1752298#post1752298
  121. *
  122. **/
  123.  
  124. /**
  125. *
  126. * Weapon Information v1.9:
  127. * (% means compared to original)
  128. *
  129. * + Glock18
  130. * - Power: 152.5%
  131. * - Recoil: Only visual.
  132. * - Accuracy: Improved.
  133. * - Most efficient: From close to average ranges.
  134. * - Notes: None.
  135. *
  136. * * USP
  137. * - Power: 102.5%
  138. * - Recoil: 80%
  139. * - Accuracy: Same.
  140. * - Most efficient: From close-average to average-long ranges.
  141. * - Notes: None.
  142. *
  143. * + P228
  144. * - Power: 122.5%
  145. * - Recoil: 70%
  146. * - Accuracy: Same.
  147. * - Most efficient: From close-average to long ranges.
  148. * - Notes: Acts almost as USP, but is more powerful and easier to control. A good choice
  149. * for a secondary weapon.
  150. *
  151. * + Deagle
  152. * - Power: 95%
  153. * - Recoil: 90%
  154. * - Accuracy: Same.
  155. * - Most efficient: With Accuracy Fix plugin from average to long ranges. Else from
  156. * close-average to average.
  157. * - Notes: Most powerful pistol, however as a backup weapon it doesn't have the best fire
  158. * ratio.
  159. *
  160. * + FiveSeven
  161. * - Power: 117.5%
  162. * - Recoil: 60%
  163. * - Accuracy: Same.
  164. * - Most efficient: From close to long ranges.
  165. * - Notes: Acts almost as Glock18, but is more powerful on long ranges. However it still
  166. * has some recoil.
  167. *
  168. * + Elites
  169. * - Power: 132.5%
  170. * - Recoil: 60%.
  171. * - Accuracy: Improved.
  172. * - Most efficient: From close to close-average ranges.
  173. * - Notes: A good choice to have as secondary, when primary weapon runs out of bullets on
  174. * close shooting ranges.
  175. *
  176. * + M3
  177. * - Power: 85%
  178. * - Recoil: Same.
  179. * - Accuracy: 75% better.
  180. * - Most efficient: From close-average to average-long ranges.
  181. * - Notes: Bullet spread is improved much. A good weapon to have when in tight corners.
  182. *
  183. * + XM1014
  184. * - Power: 82.5%
  185. * - Recoil: Same.
  186. * - Accuracy: 72.5% better.
  187. * - Most efficient: From close to average-long ranges.
  188. * - Notes: Bullet spread is improved much. A good weapon to have when in tight corners.
  189. *
  190. * + TMP
  191. * - Power: 145%
  192. * - Recoil: 55%
  193. * - Accuracy: Improved.
  194. * - Most efficient: From close to average ranges.
  195. * - Notes: A stealthy killing machine.
  196. *
  197. * + MAC10
  198. * - Power: With Rate of Fire Fix plugin 117.5% Else 147.5%
  199. * - Recoil: 55%
  200. * - Accuracy: Improved.
  201. * - Most efficient: From close to average ranges.
  202. * - Notes: If you compare TMP to M4A1, than this one is AK47 counter-version.
  203. *
  204. * + MP5Navy
  205. * - Power: 142.5%
  206. * - Recoil: 80%
  207. * - Accuracy: Improved.
  208. * - Most efficient: From close-average to average-long ranges.
  209. * - Notes: Second best long range sub-machine-gun.
  210. *
  211. * + UMP45
  212. * - Power: 140%
  213. * - Recoil: 55%
  214. * - Accuracy: Improved much.
  215. * - Most efficient: From average-long to long ranges.
  216. * - Notes: If ducked, all bullets will go in the middle of the crosshair. Else it's
  217. * upwards line. However due to long rate of fire it isn't a good choice for close combats.
  218. *
  219. * + P90
  220. * - Power: 137.5%
  221. * - Recoil: 50%
  222. * - Accuracy: Same.
  223. * - Most efficient: From close-average to average-long ranges.
  224. * - Notes: Due to 50 bullets clip weapon doesn't run on empty so often, therefor it's
  225. * easier to survive a situation when attacked by many enemies at once.
  226. *
  227. * + Galil
  228. * - Power: 112.5%
  229. * - Recoil: 80%
  230. * - Accuracy: Improved.
  231. * - Most efficient: From close to average-long ranges.
  232. * - Notes: None.
  233. *
  234. * + Famas
  235. * - Power: With Rate of Fire Fix plugin 85% Else 105%
  236. * - Recoil: 80%
  237. * - Accuracy: Same.
  238. * - Most efficient: From close-average to long ranges.
  239. * - Notes: None.
  240. *
  241. * + AK47
  242. * - Power: 97.5%
  243. * - Recoil: 70%
  244. * - Accuracy: Same.
  245. * - Most efficient: From close to average-long ranges.
  246. * - Notes: None.
  247. *
  248. * + M4A1
  249. * - Power: 102.5%
  250. * - Recoil: 80%
  251. * - Accuracy: Same.
  252. * - Most efficient: From close-average to long ranges.
  253. * - Notes: None.
  254. *
  255. * + SG552
  256. * - Power: 107.5%
  257. * - Recoil: With Rate of Fire Fix zoomed 65% Else 75%
  258. * - Accuracy: Same.
  259. * - Most efficient: From close-average to average-long ranges.
  260. * - Notes: Good choice for a terrorist rifle when in long range combat.
  261. *
  262. * + AUG
  263. * - Power: 112.5%
  264. * - Recoil: With Rate of Fire Fix zoomed 55% Else 65%
  265. * - Accuracy: Same.
  266. * - Most efficient: From average to long ranges.
  267. * - Notes: Good choice for a CT rifle when in long range combat.
  268. *
  269. * + Scout
  270. * - Power: 87.5%
  271. * - Recoil: Same.
  272. * - Accuracy: Improved when un-zoomed.
  273. * - Most efficient: From average-long to long ranges.
  274. * - Notes: Acts like a shotgun due to faster rate of fire, and is accurate when running
  275. * while un-zoomed.
  276. *
  277. * + AWP
  278. * - Power: 97.5%
  279. * - Recoil: Same.
  280. * - Accuracy: Same.
  281. * - Most efficient: From average-long to long ranges.
  282. * - Notes: AWP does a massive amount of damage, but be prepared to take out your pistol to
  283. * finish what you started. Good pistol choice is crucial. However you may zoom-in while
  284. * reloading your bullet. Also after you fired, your speed is auto-reset - there is no
  285. * need to tap Q twice.
  286. *
  287. * + SG550
  288. * - Power: 112.5%
  289. * - Recoil: Same.
  290. * - Accuracy: Improved when un-zoomed.
  291. * - Most efficient: From average to long ranges.
  292. * - Notes: Just like Scout, this weapon is accurate while running un-zoomed.
  293. *
  294. * + G3SG1
  295. * - Power: 107.5%
  296. * - Recoil: Same.
  297. * - Accuracy: Improved when un-zoomed.
  298. * - Most efficient: From average to long ranges.
  299. * - Notes: Just like Scout and SG550, this weapon is accurate while running un-zoomed.
  300. *
  301. * + M249
  302. * - Power: With Rate of Fire Fix plugin 90% Else 130%
  303. * - Recoil: 60%
  304. * - Accuracy: Same.
  305. * - Most efficient: From close-average to long ranges.
  306. * - Notes: Spray and pray. Except 100 bullets will do all the praying for you. The most
  307. * money required and in a sense the best automatic weapon in the game. But due to its
  308. * weight, you might not want to go in the middle of the field on low bullets - it takes time to reload or run away.
  309. *
  310. **/
  311.  
  312.  
  313. #include <amxmodx>
  314. #include <fakemeta>
  315. #include <hamsandwich>
  316.  
  317. #define PLUGIN_NAME "Weapon Balance Mod"
  318. #define PLUGIN_VERSION "1.9"
  319. #define PLUGIN_AUTHOR "Numb"
  320.  
  321. #define PLUGIN_INFO "http://forums.alliedmods.net/showthread.php?p=1752299#post1752299"
  322.  
  323. #define m_flStartThrow 30
  324. #define m_pPlayer 41
  325. #define m_iId 43
  326. #define m_flNextPrimaryAttack 46
  327. #define m_flNextSecondaryAttack 47
  328. #define m_flTimeWeaponIdle 48
  329. #define m_iClip 51
  330. #define m_fInReload 54
  331. #define m_fInSpecialReload 55
  332. #define m_flAccuracy 62
  333. #define m_iShotsFired 64
  334. #define m_fWeaponState 74
  335. #define WEAPONSTATE_GLOCK18_BURST_MODE (1<<1)
  336. #define WEAPONSTATE_FAMAS_BURST_MODE (1<<4)
  337.  
  338. #define m_LastHitGroup 75
  339. #define m_flNextAttack 83
  340. #define m_iLastZoom 109
  341. #define m_bResumeZoom 110
  342. #define m_iFOV 363
  343. #define m_pActiveItem 373
  344. #define m_iClAutoWepSwitch 509
  345.  
  346. #define SetPlayerBit(%1,%2) ( %1 |= ( 1 << ( %2 & 31 ) ) )
  347. #define ClearPlayerBit(%1,%2) ( %1 &= ~( 1 << ( %2 & 31 ) ) )
  348. #define CheckPlayerBit(%1,%2) ( %1 & ( 1 << ( %2 & 31 ) ) )
  349.  
  350.  
  351. new g_iMaxPlayers;
  352. new g_iConnected;
  353. new g_iAlive;
  354. new g_iOldClip;
  355.  
  356. new g_iFMFwd_TraceLine_Pre;
  357. new g_iFMFwd_PlrPostThink_Post;
  358. new g_iShotgunOwner;
  359. new g_iTraceBeam;
  360. new Float:g_fAimTo[3];
  361. new Float:g_fAimFrom[3];
  362. new Float:g_fBackupSpeed[3];
  363. new Float:g_fBackupAngle[3];
  364. new bool:g_bDoubleShot;
  365. new bool:g_bM3;
  366. new bool:g_bFakedFov;
  367. new bool:g_bFakedSpeed;
  368.  
  369. new g_iOldWpn;
  370. new g_iDefaultAutoSwitch = -1;
  371. new bool:g_bPickedUpWeapon;
  372. new Float:g_fLastAttack[33];
  373. new g_iUserInWalk;
  374.  
  375. new g_iShotgunTracers;
  376. new g_iCvarShotgunTracers;
  377. new g_iCvarShotGunDoubleShot;
  378. new g_iCvarAutoSwitchFix;
  379. new g_iCvarSilentPickUp;
  380. new g_iCvarSniperReset;
  381. new g_iCvarGlockRecoil;
  382.  
  383. new g_iMsgId_TextMsg;
  384. new g_iMsgId_Crosshair;
  385.  
  386. new bool:g_bRateOfFireFix;
  387. new bool:g_bInFreezeTime;
  388.  
  389. public plugin_precache()
  390. g_iTraceBeam = precache_model("sprites/zbeam6.spr");
  391.  
  392. public plugin_init()
  393. {
  394. register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
  395.  
  396. register_cvar("weapon_balance", PLUGIN_VERSION, (FCVAR_SERVER|FCVAR_SPONLY));
  397.  
  398. g_iCvarShotgunTracers = register_cvar("shotgun_tracers", "2");
  399. // 1 = see first person special tracer
  400. // 2 = see non-first person tracers
  401. // 4 = see first person normal tracers (1 must be disabled)
  402. g_iCvarShotGunDoubleShot = register_cvar("shotgun_doubleshot", "0");
  403. g_iCvarAutoSwitchFix = register_cvar("weapon_autoswitch_fix", "1");
  404. g_iCvarSilentPickUp = register_cvar("weapon_silentpickup", "1");
  405. g_iCvarSniperReset = register_cvar("sniper_zoom_reset", "3");
  406. g_iCvarGlockRecoil = register_cvar("glock_recoil", "1");
  407.  
  408. register_event("SetFOV", "Event_SetFOV", "be", "1!90");
  409. register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0");
  410.  
  411. register_logevent("LogEvent_RoundStart", 2, "1=Round_Start");
  412.  
  413. register_forward(FM_CmdStart, "FM_CmdStart_Post", 1);
  414. register_forward(FM_EmitSound, "FM_EmitSound_Pre", 0);
  415.  
  416. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_glock18", "Ham_Attack_glock_Pre", 0);
  417. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_glock18", "Ham_Attack_glock_Post", 1);
  418. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_usp", "Ham_Attack_Pre", 0);
  419. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_usp", "Ham_Attack_usp_Post", 1);
  420. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_p228", "Ham_Attack_Pre", 0);
  421. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_p228", "Ham_Attack_p228_Post", 1);
  422. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_deagle", "Ham_Attack_Pre", 0);
  423. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_deagle", "Ham_Attack_deagle_Post", 1);
  424. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_fiveseven", "Ham_Attack_Pre", 0);
  425. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_fiveseven", "Ham_Attack_57_Post", 1);
  426. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_elite", "Ham_Attack_elite_Pre", 0);
  427. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_elite", "Ham_Attack_elite_Post", 1);
  428.  
  429. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_m3", "Ham_Attack_shotgun_Pre", 0);
  430. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_m3", "Ham_Attack_shotgun_Post", 1);
  431. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_xm1014", "Ham_Attack_shotgun_Pre", 0);
  432. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_xm1014", "Ham_Attack_shotgun_Post", 1);
  433.  
  434. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_tmp", "Ham_Attack_tmp_Pre", 0);
  435. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_tmp", "Ham_Attack_subgun_Post", 1);
  436. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_mac10", "Ham_Attack_mac10_Pre", 0);
  437. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_mac10", "Ham_Attack_subgun_Post", 1);
  438. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_mp5navy", "Ham_Attack_mp5_Pre", 0);
  439. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_mp5navy", "Ham_Attack_mp5_Post", 1);
  440. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_ump45", "Ham_Attack_ump45_Pre", 0);
  441. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_ump45", "Ham_Attack_subgun_Post", 1);
  442. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_p90", "Ham_Attack_Pre", 0);
  443. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_p90", "Ham_Attack_p90_Post", 1);
  444.  
  445. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_galil", "Ham_Attack_galil_Pre", 0);
  446. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_galil", "Ham_Attack_galil_Post", 1);
  447. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_famas", "Ham_Attack_Pre", 0);
  448. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_famas", "Ham_Attack_famas_Post", 1);
  449. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_ak47", "Ham_Attack_Pre", 0);
  450. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_ak47", "Ham_Attack_ak47_Post", 1);
  451. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_m4a1", "Ham_Attack_Pre", 0);
  452. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_m4a1", "Ham_Attack_m4a1_Post", 1);
  453. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_sg552", "Ham_Attack_Pre", 0);
  454. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_sg552", "Ham_Attack_sg552_Post", 1);
  455. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_aug", "Ham_Attack_Pre", 0);
  456. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_aug", "Ham_Attack_aug_Post", 1);
  457. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_scout", "Ham_Attack_scout_Pre", 0);
  458. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_scout", "Ham_Attack_scout_Post", 1);
  459. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_awp", "Ham_Attack_awp_Pre", 0);
  460. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_awp", "Ham_Attack_awp_Post", 1);
  461. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_sg550", "Ham_Attack_sniper_Pre", 0);
  462. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_sg550", "Ham_Attack_sniper_Post", 1);
  463. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_g3sg1", "Ham_Attack_sniper_Pre", 0);
  464. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_g3sg1", "Ham_Attack_sniper_Post", 1);
  465. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_m249", "Ham_Attack_Pre", 0);
  466. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_m249", "Ham_Attack_m249_Post", 1);
  467.  
  468. RegisterHam(Ham_Item_Deploy, "weapon_glock18", "Ham_Deploy_glock_Post", 1);
  469. RegisterHam(Ham_Item_Deploy, "weapon_famas", "Ham_Deploy_famas_Post", 1);
  470. RegisterHam(Ham_Item_Deploy, "weapon_m3", "Ham_Deploy_shotgun_Post", 1);
  471. RegisterHam(Ham_Item_Deploy, "weapon_xm1014", "Ham_Deploy_shotgun_Post", 1);
  472. RegisterHam(Ham_Item_Deploy, "weapon_scout", "Ham_Deploy_scout_Post", 1);
  473. RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_scout", "Ham_SecAttack_sniper_Post", 1);
  474. RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_awp", "Ham_SecAttack_sniper_Post", 1);
  475.  
  476. RegisterHam(Ham_Player_PostThink, "player", "Ham_Player_PostThink_Pre", 0);
  477. RegisterHam(Ham_AddPlayerItem, "player", "Ham_AddPlayerItem_Pre", 0);
  478.  
  479. RegisterHam(Ham_Spawn, "player", "Ham_Spawn_player_Post", 1);
  480. RegisterHam(Ham_Killed, "player", "Ham_Killed_player_Post", 1);
  481. RegisterHam(Ham_TakeDamage, "player", "Ham_TakeDamage_Pre", 0);
  482.  
  483. g_iMsgId_TextMsg = get_user_msgid("TextMsg");
  484.  
  485. g_iMaxPlayers = clamp(get_maxplayers(), 1, 32);
  486. }
  487.  
  488. public clcmd_wpnbalance(iPlrId)
  489. {
  490. client_print(iPlrId, print_notify, "* %s %s plugin ensures that all firearms will be useful.", PLUGIN_NAME, PLUGIN_VERSION);
  491. client_print(iPlrId, print_notify, "* More information: %s", PLUGIN_INFO);
  492.  
  493. client_print(iPlrId, print_chat, "* %s %s plugin ensures that all firearms will be useful.", PLUGIN_NAME, PLUGIN_VERSION);
  494. client_print(iPlrId, print_chat, "* More information: %s", PLUGIN_INFO);
  495.  
  496. new iBuffer[32];
  497. formatex(iBuffer, 31, "%s v%s", PLUGIN_NAME, PLUGIN_VERSION);
  498. show_motd(iPlrId, PLUGIN_INFO, iBuffer);
  499. }
  500.  
  501. public plugin_unpause()
  502. {
  503. g_iConnected = 0;
  504. g_iAlive = 0;
  505. g_iUserInWalk = 0;
  506.  
  507. for( new iPlrId=1; iPlrId<=g_iMaxPlayers; iPlrId++ )
  508. {
  509. if( is_user_alive(iPlrId) )
  510. {
  511. SetPlayerBit(g_iConnected, iPlrId);
  512. SetPlayerBit(g_iAlive, iPlrId);
  513. }
  514. else if( is_user_connected(iPlrId) )
  515. SetPlayerBit(g_iConnected, iPlrId);
  516.  
  517. g_fLastAttack[iPlrId] = 0.0;
  518. }
  519. g_bInFreezeTime = false;
  520. }
  521.  
  522. public client_putinserver(iPlrId)
  523. {
  524. SetPlayerBit(g_iConnected, iPlrId);
  525.  
  526. ClearPlayerBit(g_iUserInWalk, iPlrId);
  527. g_fLastAttack[iPlrId] = 0.0;
  528. }
  529.  
  530. public client_disconnect(iPlrId)
  531. {
  532. ClearPlayerBit(g_iConnected, iPlrId);
  533.  
  534. ClearPlayerBit(g_iUserInWalk, iPlrId);
  535. g_fLastAttack[iPlrId] = 0.0;
  536. }
  537.  
  538. public Event_CurWeapon(iPlrId)
  539. {
  540. static s_iFov;
  541. if( CheckPlayerBit(g_iAlive, iPlrId) )
  542. s_iFov = get_pdata_int(iPlrId, m_iFOV, 5); //pev(iPlrId, pev_fov, s_fFov);
  543. else if( pev(iPlrId, pev_iuser1)==4 )
  544. {
  545. static s_iSpectated;
  546. s_iSpectated = pev(iPlrId, pev_iuser2);
  547. if( 0<s_iSpectated<=g_iMaxPlayers )
  548. {
  549. if( CheckPlayerBit(g_iAlive, s_iSpectated) )
  550. s_iFov = get_pdata_int(s_iSpectated, m_iFOV, 5); //pev(iSpectated, pev_fov, s_fFov);
  551. else
  552. return;
  553. }
  554. else
  555. return;
  556. }
  557. else
  558. return;
  559.  
  560. if( s_iFov!=90 )
  561. return;
  562.  
  563. message_begin(MSG_ONE, g_iMsgId_Crosshair, _, iPlrId);
  564. write_byte(1);
  565. message_end();
  566.  
  567. return;
  568. }
  569.  
  570. public Event_SetFOV(iPlrId)
  571. {
  572. if( g_bInFreezeTime )
  573. return;
  574.  
  575. new iWpnEnt = get_pdata_cbase(iPlrId, m_pActiveItem, 5);
  576. if( iWpnEnt<=0 )
  577. return;
  578.  
  579. switch( get_pdata_int(iWpnEnt, m_iId, 4) )
  580. {
  581. case CSW_SCOUT, CSW_AWP:
  582. {
  583. new Float:fSpeed;
  584. ExecuteHamB(Ham_CS_Item_GetMaxSpeed, iWpnEnt, fSpeed);
  585. engfunc(EngFunc_SetClientMaxspeed, iPlrId, fSpeed);
  586. set_pev(iPlrId, pev_maxspeed, fSpeed);
  587. }
  588. default: return;
  589. }
  590. }
  591.  
  592. public Event_NewRound()
  593. g_bInFreezeTime = true;
  594.  
  595. public LogEvent_RoundStart()
  596. g_bInFreezeTime = false;
  597.  
  598. public FM_CmdStart_Post(iPlrId, iUcHandle, iSpeed)
  599. {
  600. static Float:s_fForwardMove, Float:s_fSideMove, Float:s_fUpMove, Float:s_fOldSpeed[33];
  601. get_uc(iUcHandle, UC_ForwardMove, s_fForwardMove);
  602. get_uc(iUcHandle, UC_SideMove, s_fSideMove);
  603. if( pev(iPlrId, pev_waterlevel)>=2 )
  604. get_uc(iUcHandle, UC_UpMove, s_fUpMove);
  605. else
  606. s_fUpMove = 0.0;
  607.  
  608. if( ((s_fForwardMove*s_fForwardMove)+(s_fSideMove*s_fSideMove)+(s_fUpMove*s_fUpMove))>22500.0 ) // 150*150 (wants to move at speed above 150)
  609. ClearPlayerBit(g_iUserInWalk, iPlrId);
  610. else if( s_fForwardMove || s_fSideMove || s_fUpMove ) // wants to move at speed below 150
  611. {
  612. SetPlayerBit(g_iUserInWalk, iPlrId);
  613. s_fOldSpeed[iPlrId] = 0.0;
  614. }
  615. else if( CheckPlayerBit(g_iUserInWalk, iPlrId) ) // doesn't want to move at all
  616. {
  617. static Float:s_fVelocity[3], Float:s_fSpeed;
  618. pev(iPlrId, pev_velocity, s_fVelocity);
  619. s_fSpeed = ((s_fVelocity[0]*s_fVelocity[0])+(s_fVelocity[1]*s_fVelocity[1])+(s_fVelocity[2]*s_fVelocity[2]));
  620.  
  621. if( !s_fSpeed || (s_fSpeed>22500.0) ) // stopped moving after walking
  622. ClearPlayerBit(g_iUserInWalk, iPlrId); // or was pushed to speed above 150 after walking
  623. else
  624. {
  625. if( !s_fOldSpeed[iPlrId] )
  626. s_fOldSpeed[iPlrId] = s_fSpeed;
  627. else if( s_fSpeed>=s_fOldSpeed[iPlrId] )
  628. ClearPlayerBit(g_iUserInWalk, iPlrId); // was pushed when slowing down
  629. else
  630. s_fOldSpeed[iPlrId] = s_fSpeed;
  631. }
  632. }
  633.  
  634. g_iDefaultAutoSwitch = (get_pdata_int(iPlrId, m_iClAutoWepSwitch, 5)?1:0);
  635. g_bPickedUpWeapon = false;
  636. g_iOldWpn = 0;
  637. }
  638.  
  639. public FM_PlayerPostThink_Post(iPlrId)
  640. {
  641. g_bM3 = false;
  642.  
  643. if( g_iFMFwd_TraceLine_Pre )
  644. {
  645. unregister_forward(FM_TraceLine, g_iFMFwd_TraceLine_Pre, 0);
  646. g_iFMFwd_TraceLine_Pre = 0;
  647. }
  648.  
  649. if( g_iFMFwd_PlrPostThink_Post )
  650. {
  651. unregister_forward(FM_PlayerPostThink, g_iFMFwd_PlrPostThink_Post, 1);
  652. g_iFMFwd_PlrPostThink_Post = 0;
  653. }
  654. }
  655.  
  656. public FM_TraceLine_Pre(Float:fStart[3], Float:fEnd[3], iNoMonsters, iEntToSkip, iTraceResult)
  657. {
  658. if( g_fAimFrom[0]!=fStart[0] || g_fAimFrom[1]!=fStart[1] || g_fAimFrom[2]!=fStart[2] )
  659. return FMRES_IGNORED;
  660.  
  661. static Float:s_fTraceEnd[3];
  662. if( g_bM3 )
  663. {
  664. if( g_bDoubleShot )
  665. {
  666. s_fTraceEnd[0] = (fEnd[0]-g_fAimTo[0])*0.475;
  667. s_fTraceEnd[1] = (fEnd[1]-g_fAimTo[1])*0.475;
  668. s_fTraceEnd[2] = (fEnd[2]-g_fAimTo[2])*0.475;
  669. }
  670. else
  671. {
  672. s_fTraceEnd[0] = (fEnd[0]-g_fAimTo[0])*0.25;
  673. s_fTraceEnd[1] = (fEnd[1]-g_fAimTo[1])*0.25;
  674. s_fTraceEnd[2] = (fEnd[2]-g_fAimTo[2])*0.25;
  675. }
  676. }
  677. else if( g_bDoubleShot )
  678. {
  679. s_fTraceEnd[0] = (fEnd[0]-g_fAimTo[0])*0.525;
  680. s_fTraceEnd[1] = (fEnd[1]-g_fAimTo[1])*0.525;
  681. s_fTraceEnd[2] = (fEnd[2]-g_fAimTo[2])*0.525;
  682. }
  683. else
  684. {
  685. s_fTraceEnd[0] = (fEnd[0]-g_fAimTo[0])*0.275;
  686. s_fTraceEnd[1] = (fEnd[1]-g_fAimTo[1])*0.275;
  687. s_fTraceEnd[2] = (fEnd[2]-g_fAimTo[2])*0.275;
  688. }
  689. s_fTraceEnd[0] += g_fAimTo[0];
  690. s_fTraceEnd[1] += g_fAimTo[1];
  691. s_fTraceEnd[2] += g_fAimTo[2];
  692.  
  693. engfunc(EngFunc_TraceLine, fStart, s_fTraceEnd, iNoMonsters, iEntToSkip, iTraceResult);
  694. get_tr2(iTraceResult, TR_vecEndPos, s_fTraceEnd);
  695.  
  696. if( !g_iShotgunTracers )
  697. return FMRES_SUPERCEDE;
  698.  
  699. for( new iPlrId=1; iPlrId<=g_iMaxPlayers; iPlrId++ )
  700. {
  701. if( CheckPlayerBit(g_iConnected, iPlrId) )
  702. {
  703. if( iPlrId==g_iShotgunOwner || (!CheckPlayerBit(g_iAlive, iPlrId) && pev(iPlrId, pev_iuser1)==4 && pev(iPlrId, pev_iuser2)==g_iShotgunOwner) )
  704. {
  705. if( g_iShotgunTracers&1 )
  706. {
  707. message_begin(MSG_ONE, SVC_TEMPENTITY, _, iPlrId);
  708. write_byte(TE_BEAMPOINTS);
  709. engfunc(EngFunc_WriteCoord, fStart[0]);
  710. engfunc(EngFunc_WriteCoord, fStart[1]);
  711. engfunc(EngFunc_WriteCoord, fStart[2]);
  712. engfunc(EngFunc_WriteCoord, s_fTraceEnd[0]);
  713. engfunc(EngFunc_WriteCoord, s_fTraceEnd[1]);
  714. engfunc(EngFunc_WriteCoord, s_fTraceEnd[2]);
  715. write_short(g_iTraceBeam);
  716. write_byte(0); // starting frame
  717. write_byte(1); // frame rate in 0.1's
  718. write_byte(1); // life in 0.1's
  719. write_byte(2); // line width in 0.1's
  720. write_byte(0); // noise amplitude in 0.01's
  721. write_byte(255); // red
  722. write_byte(255); // green
  723. write_byte(31); // blue
  724. write_byte(15); // brightness
  725. write_byte(15); // scroll speed in 0.1's
  726. message_end();
  727. }
  728. else if( g_iShotgunTracers&4 )
  729. {
  730. message_begin(MSG_ONE, SVC_TEMPENTITY, _, iPlrId);
  731. write_byte(TE_TRACER)
  732. engfunc(EngFunc_WriteCoord, fStart[0]);
  733. engfunc(EngFunc_WriteCoord, fStart[1]);
  734. engfunc(EngFunc_WriteCoord, fStart[2]);
  735. engfunc(EngFunc_WriteCoord, s_fTraceEnd[0]);
  736. engfunc(EngFunc_WriteCoord, s_fTraceEnd[1]);
  737. engfunc(EngFunc_WriteCoord, s_fTraceEnd[2]);
  738. message_end();
  739. }
  740. }
  741. else if( g_iShotgunTracers&2 )
  742. {
  743. message_begin(MSG_ONE, SVC_TEMPENTITY, _, iPlrId);
  744. write_byte(TE_TRACER)
  745. engfunc(EngFunc_WriteCoord, fStart[0]);
  746. engfunc(EngFunc_WriteCoord, fStart[1]);
  747. engfunc(EngFunc_WriteCoord, fStart[2]);
  748. engfunc(EngFunc_WriteCoord, s_fTraceEnd[0]);
  749. engfunc(EngFunc_WriteCoord, s_fTraceEnd[1]);
  750. engfunc(EngFunc_WriteCoord, s_fTraceEnd[2]);
  751. message_end();
  752. }
  753. }
  754. }
  755.  
  756. return FMRES_SUPERCEDE;
  757. }
  758.  
  759. public FM_EmitSound_Pre(iEnt, iChannel, iSample[], Float:fVolume, Float:fAttenuation, iFlags, iPitch)
  760. {
  761. if( 0<iEnt<=g_iMaxPlayers )
  762. {
  763. if( g_bPickedUpWeapon && iChannel==CHAN_ITEM && equal(iSample, "items/gunpickup2.wav") && fVolume==VOL_NORM && fAttenuation==ATTN_NORM && !iFlags && iPitch==PITCH_NORM && get_pcvar_num(g_iCvarSilentPickUp)>0 )
  764. {
  765. //if( get_pdata_int(iEnt, m_iClAutoWepSwitch, 5) )
  766. if( g_iOldWpn!=get_pdata_cbase(iEnt, m_pActiveItem, 5) )
  767. return FMRES_IGNORED;
  768.  
  769. static Float:s_fVelocity[3];
  770. pev(iEnt, pev_velocity, s_fVelocity);
  771. if( ((s_fVelocity[0]*s_fVelocity[0])+(s_fVelocity[1]*s_fVelocity[1])+(s_fVelocity[2]*s_fVelocity[2]))<=22500 )
  772. {
  773. client_cmd(iEnt, "spk ^"items/gunpickup1(t40)^"");
  774. return FMRES_SUPERCEDE;
  775. }
  776. }
  777. }
  778.  
  779. return FMRES_IGNORED;
  780. }
  781.  
  782. public Ham_Attack_Pre(iEnt)
  783. {
  784. g_iOldClip = get_pdata_int(iEnt, m_iClip, 4);
  785. pev(get_pdata_cbase(iEnt, m_pPlayer, 4), pev_punchangle, g_fBackupAngle);
  786. }
  787.  
  788. public Ham_Attack_glock_Pre(iEnt)
  789. {
  790. g_iOldClip = get_pdata_int(iEnt, m_iClip, 4);
  791. pev(get_pdata_cbase(iEnt, m_pPlayer, 4), pev_punchangle, g_fBackupAngle);
  792.  
  793. if( g_iOldClip>0 && (get_pdata_int(iEnt, m_iShotsFired, 4)<=0 || get_pdata_int(iEnt, m_fWeaponState, 4)&WEAPONSTATE_GLOCK18_BURST_MODE) && get_pdata_float(iEnt, m_flAccuracy, 4)<0.73 )
  794. set_pdata_float(iEnt, m_flAccuracy, 0.73, 4);
  795. }
  796.  
  797. public Ham_Attack_glock_Post(iEnt)
  798. {
  799. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  800. {
  801. if( get_pcvar_num(g_iCvarGlockRecoil)>0 )
  802. {
  803. static s_iOwner, Float:s_fPunchAngle[3];
  804. s_iOwner = get_pdata_cbase(iEnt, m_pPlayer, 4);
  805.  
  806. pev(s_iOwner, pev_punchangle, s_fPunchAngle);
  807. if( s_fPunchAngle[0]>-25.0 )
  808. {
  809. s_fPunchAngle[0] -= 1.8;
  810. if( s_fPunchAngle[0]<-25.0 )
  811. s_fPunchAngle[0] = -25.0;
  812. }
  813. set_pev(s_iOwner, pev_punchangle, s_fPunchAngle);
  814.  
  815. g_fLastAttack[s_iOwner] = (get_gametime()+0.5);
  816. }
  817. else
  818. g_fLastAttack[get_pdata_cbase(iEnt, m_pPlayer, 4)] = (get_gametime()+0.5);
  819. }
  820. }
  821.  
  822. public Ham_Attack_usp_Post(iEnt)
  823. {
  824. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  825. fix_vertical_recoil(get_pdata_cbase(iEnt, m_pPlayer, 4), 0.8, 0.15, 0.1, 0.25);
  826. }
  827.  
  828. public Ham_Attack_p228_Post(iEnt)
  829. {
  830. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  831. fix_vertical_recoil(get_pdata_cbase(iEnt, m_pPlayer, 4), 0.7, 0.15, 0.1, 0.3);
  832. }
  833.  
  834. public Ham_Attack_deagle_Post(iEnt)
  835. {
  836. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  837. fix_vertical_recoil(get_pdata_cbase(iEnt, m_pPlayer, 4), 0.9, 0.25, 0.05, 0.3);
  838. }
  839.  
  840. public Ham_Attack_57_Post(iEnt)
  841. {
  842. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  843. fix_vertical_recoil(get_pdata_cbase(iEnt, m_pPlayer, 4), 0.6, 0.15, 0.1, 0.3);
  844. }
  845.  
  846. public Ham_Attack_elite_Pre(iEnt)
  847. {
  848. g_iOldClip = get_pdata_int(iEnt, m_iClip, 4);
  849. pev(get_pdata_cbase(iEnt, m_pPlayer, 4), pev_punchangle, g_fBackupAngle);
  850.  
  851. if( g_iOldClip>0 && get_pdata_int(iEnt, m_iShotsFired, 4)<=0 && get_pdata_float(iEnt, m_flAccuracy, 4)<0.7 )
  852. set_pdata_float(iEnt, m_flAccuracy, 0.7, 4);
  853. }
  854.  
  855. public Ham_Attack_elite_Post(iEnt)
  856. {
  857. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  858. fix_vertical_recoil(get_pdata_cbase(iEnt, m_pPlayer, 4), 0.6, 0.25, 0.1, 0.4);
  859. }
  860.  
  861. public Ham_Attack_shotgun_Pre(iEnt)
  862. {
  863. if( (g_iOldClip=get_pdata_int(iEnt, m_iClip, 4))>0 )
  864. {
  865. if( pev((g_iShotgunOwner=get_pdata_cbase(iEnt, m_pPlayer, 4)), pev_waterlevel)!=3 )
  866. {
  867. g_iShotgunTracers = clamp(get_pcvar_num(g_iCvarShotgunTracers), 0, 7);
  868.  
  869. static Float:s_fViewOfs[3], Float:s_fAngle[3];
  870. pev(g_iShotgunOwner, pev_origin, g_fAimFrom);
  871. pev(g_iShotgunOwner, pev_view_ofs, s_fViewOfs);
  872. pev(g_iShotgunOwner, pev_v_angle, s_fAngle);
  873. g_fAimFrom[0] += s_fViewOfs[0];
  874. g_fAimFrom[1] += s_fViewOfs[1];
  875. g_fAimFrom[2] += s_fViewOfs[2];
  876. pev(g_iShotgunOwner, pev_punchangle, s_fViewOfs);
  877. s_fAngle[0] += s_fViewOfs[0];
  878. s_fAngle[1] += s_fViewOfs[1];
  879. s_fAngle[2] += s_fViewOfs[2];
  880.  
  881. s_fAngle[0] *= -1;
  882. if( get_pdata_int(iEnt, m_iId, 4)==CSW_M3 )
  883. {
  884. SphereToCartesian(g_fAimTo, g_fAimFrom, s_fAngle, Float:{0.0, 0.0, 3000.0});
  885. g_bM3 = true;
  886. }
  887. else
  888. {
  889. SphereToCartesian(g_fAimTo, g_fAimFrom, s_fAngle, Float:{0.0, 0.0, 3048.0});
  890. g_bM3 = false;
  891. }
  892.  
  893. if( g_iFMFwd_TraceLine_Pre )
  894. unregister_forward(FM_TraceLine, g_iFMFwd_TraceLine_Pre, 0);
  895. if( g_iFMFwd_PlrPostThink_Post )
  896. unregister_forward(FM_PlayerPostThink, g_iFMFwd_PlrPostThink_Post, 1);
  897.  
  898. g_iFMFwd_TraceLine_Pre = register_forward(FM_TraceLine, "FM_TraceLine_Pre", 0);
  899. g_iFMFwd_PlrPostThink_Post = register_forward(FM_PlayerPostThink, "FM_PlayerPostThink_Post", 1);
  900.  
  901. pev(g_iShotgunOwner, pev_punchangle, g_fBackupAngle);
  902. }
  903. }
  904. }
  905.  
  906. public Ham_Attack_shotgun_Post(iEnt)
  907. {
  908. if( g_iFMFwd_TraceLine_Pre )
  909. {
  910. unregister_forward(FM_TraceLine, g_iFMFwd_TraceLine_Pre, 0);
  911. g_iFMFwd_TraceLine_Pre = 0;
  912. }
  913.  
  914. if( g_iFMFwd_PlrPostThink_Post )
  915. {
  916. unregister_forward(FM_PlayerPostThink, g_iFMFwd_PlrPostThink_Post, 1);
  917. g_iFMFwd_PlrPostThink_Post = 0;
  918. }
  919.  
  920. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  921. {
  922. g_fLastAttack[g_iShotgunOwner] = (get_gametime()+0.5);
  923.  
  924. if( !g_bDoubleShot )
  925. {
  926. if( g_iOldClip>1 && get_pcvar_num(g_iCvarShotGunDoubleShot)>0 && pev(g_iShotgunOwner, pev_button)&IN_ATTACK2 )
  927. {
  928. static Float:s_fAngleDifference, Float:s_fOldAngle;
  929. set_pdata_float(iEnt, m_flNextPrimaryAttack, 0.0, 4);
  930. set_pdata_float(iEnt, m_flNextSecondaryAttack, 0.0, 4);
  931. set_pev(g_iShotgunOwner, pev_punchangle, g_fBackupAngle);
  932. s_fOldAngle = g_fBackupAngle[0];
  933. g_bDoubleShot = true;
  934. ExecuteHamB(Ham_Weapon_PrimaryAttack, iEnt);
  935. g_bDoubleShot = false;
  936. pev(g_iShotgunOwner, pev_punchangle, g_fBackupAngle);
  937. s_fAngleDifference = (g_fBackupAngle[0]-s_fOldAngle);
  938. if( get_pdata_int(iEnt, m_iId, 4)==CSW_XM1014 )
  939. {
  940. if( g_fBackupAngle[0]>-25.0 && g_fBackupAngle[0]<0.0 )
  941. {
  942. s_fAngleDifference *= 1.6;
  943. g_fBackupAngle[0] = (s_fOldAngle+s_fAngleDifference);
  944. if( g_fBackupAngle[0]<-25.0 )
  945. g_fBackupAngle[0] = -25.0;
  946. set_pev(g_iShotgunOwner, pev_punchangle, g_fBackupAngle);
  947. }
  948.  
  949. set_pdata_float(iEnt, m_flNextPrimaryAttack, 0.45, 4); // animation 2 (super), 1 (normal)
  950. set_pdata_float(iEnt, m_flNextSecondaryAttack, 0.45, 4); // but uh... ping will mess up animations
  951. }
  952. else if( g_fBackupAngle[0]>-25.0 && g_fBackupAngle[0]<0.0 )
  953. {
  954. s_fAngleDifference *= 2.1;
  955. g_fBackupAngle[0] = (s_fOldAngle+s_fAngleDifference);
  956. if( g_fBackupAngle[0]<-25.0 )
  957. g_fBackupAngle[0] = -25.0;
  958. set_pev(g_iShotgunOwner, pev_punchangle, g_fBackupAngle);
  959. }
  960. }
  961. else if( get_pdata_int(iEnt, m_iId, 4)==CSW_M3 ) // speedup bullet reload from 0.875 to 0.75
  962. {
  963. set_pdata_float(iEnt, m_flNextPrimaryAttack, 0.75, 4); // animation 1 (super), 2 (normal)
  964. set_pdata_float(iEnt, m_flNextSecondaryAttack, 0.75, 4); // but uh... ping will mess up animations
  965. }
  966. }
  967. }
  968.  
  969. g_bM3 = false;
  970. }
  971.  
  972. public Ham_Attack_tmp_Pre(iEnt)
  973. {
  974. g_iOldClip = get_pdata_int(iEnt, m_iClip, 4);
  975. pev(get_pdata_cbase(iEnt, m_pPlayer, 4), pev_punchangle, g_fBackupAngle);
  976.  
  977. if( get_pdata_float(iEnt, m_flAccuracy, 4)>0.9 )
  978. set_pdata_float(iEnt, m_flAccuracy, 0.9, 4);
  979. }
  980.  
  981. public Ham_Attack_mac10_Pre(iEnt)
  982. {
  983. g_iOldClip = get_pdata_int(iEnt, m_iClip, 4);
  984. pev(get_pdata_cbase(iEnt, m_pPlayer, 4), pev_punchangle, g_fBackupAngle);
  985.  
  986. if( get_pdata_float(iEnt, m_flAccuracy, 4)>0.95 )
  987. set_pdata_float(iEnt, m_flAccuracy, 0.95, 4);
  988. }
  989.  
  990. public Ham_Attack_mp5_Pre(iEnt)
  991. {
  992. g_iOldClip = get_pdata_int(iEnt, m_iClip, 4);
  993. pev(get_pdata_cbase(iEnt, m_pPlayer, 4), pev_punchangle, g_fBackupAngle);
  994.  
  995. if( get_pdata_float(iEnt, m_flAccuracy, 4)>0.4 )
  996. set_pdata_float(iEnt, m_flAccuracy, 0.4, 4);
  997. }
  998.  
  999. public Ham_Attack_mp5_Post(iEnt)
  1000. {
  1001. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  1002. fix_punchangle_2d(get_pdata_cbase(iEnt, m_pPlayer, 4), 0.8, 0.2, 0.1, 0.3);
  1003. }
  1004.  
  1005. public Ham_Attack_ump45_Pre(iEnt)
  1006. {
  1007. g_iOldClip = get_pdata_int(iEnt, m_iClip, 4);
  1008. pev(get_pdata_cbase(iEnt, m_pPlayer, 4), pev_punchangle, g_fBackupAngle);
  1009.  
  1010. if( get_pdata_float(iEnt, m_flAccuracy, 4)>0.3 )
  1011. set_pdata_float(iEnt, m_flAccuracy, 0.3, 4);
  1012. }
  1013.  
  1014. public Ham_Attack_subgun_Post(iEnt)
  1015. {
  1016. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  1017. fix_punchangle_2d(get_pdata_cbase(iEnt, m_pPlayer, 4), 0.55, 0.25, 0.1, 0.3);
  1018. }
  1019.  
  1020. public Ham_Attack_p90_Post(iEnt)
  1021. {
  1022. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  1023. fix_punchangle_2d(get_pdata_cbase(iEnt, m_pPlayer, 4), 0.5, 0.15, 0.1, 0.3);
  1024. }
  1025.  
  1026.  
  1027. public Ham_Attack_galil_Pre(iEnt)
  1028. {
  1029. g_iOldClip = get_pdata_int(iEnt, m_iClip, 4);
  1030. pev(get_pdata_cbase(iEnt, m_pPlayer, 4), pev_punchangle, g_fBackupAngle);
  1031.  
  1032. if( g_iOldClip>0 && pev(get_pdata_cbase(iEnt, m_pPlayer, 4), pev_waterlevel)!=3 && get_pdata_float(iEnt, m_flAccuracy, 4)<0.95 )
  1033. set_pdata_float(iEnt, m_flAccuracy, 0.95, 4);
  1034. }
  1035.  
  1036. public Ham_Attack_galil_Post(iEnt)
  1037. {
  1038. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  1039. fix_punchangle_2d(get_pdata_cbase(iEnt, m_pPlayer, 4), 0.8, 0.2, 0.1, 0.25);
  1040. }
  1041.  
  1042. public Ham_Attack_famas_Post(iEnt)
  1043. {
  1044. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  1045. fix_punchangle_2d(get_pdata_cbase(iEnt, m_pPlayer, 4), 0.8, 0.15, 0.1, 0.25);
  1046. }
  1047.  
  1048. public Ham_Attack_ak47_Post(iEnt)
  1049. {
  1050. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  1051. fix_punchangle_2d(get_pdata_cbase(iEnt, m_pPlayer, 4), 0.7, 0.2, 0.15, 0.3);
  1052. }
  1053.  
  1054. public Ham_Attack_m4a1_Post(iEnt)
  1055. {
  1056. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  1057. fix_punchangle_2d(get_pdata_cbase(iEnt, m_pPlayer, 4), 0.8, 0.2, 0.15, 0.3);
  1058. }
  1059.  
  1060. public Ham_Attack_sg552_Post(iEnt)
  1061. {
  1062. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  1063. {
  1064. if( g_bRateOfFireFix )
  1065. {
  1066. static s_iOwner;
  1067. s_iOwner = get_pdata_cbase(iEnt, m_pPlayer, 4);
  1068. fix_punchangle_2d(s_iOwner, ((0<get_pdata_int(s_iOwner, m_iFOV, 5)<90)?0.65:0.75), 0.2, 0.15, 0.3);
  1069. }
  1070. else
  1071. fix_punchangle_2d(get_pdata_cbase(iEnt, m_pPlayer, 4), 0.75, 0.2, 0.15, 0.3);
  1072. }
  1073. }
  1074.  
  1075. public Ham_Attack_aug_Post(iEnt)
  1076. {
  1077. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  1078. {
  1079. static s_iOwner, Float:s_fPunchAngle[3];
  1080. s_iOwner = get_pdata_cbase(iEnt, m_pPlayer, 4);
  1081.  
  1082. pev(s_iOwner, pev_punchangle, s_fPunchAngle);
  1083. if( g_bRateOfFireFix )
  1084. {
  1085. static s_iOwner;
  1086. s_iOwner = get_pdata_cbase(iEnt, m_pPlayer, 4);
  1087. fix_punchangle_2d(s_iOwner, ((0<get_pdata_int(s_iOwner, m_iFOV, 5)<90)?0.55:0.65), 0.2, 0.15, 0.3);
  1088. }
  1089. else
  1090. fix_punchangle_2d(get_pdata_cbase(iEnt, m_pPlayer, 4), 0.65, 0.2, 0.15, 0.3);
  1091. }
  1092. }
  1093.  
  1094. public Ham_Attack_scout_Pre(iEnt)
  1095. {
  1096. g_iOldClip = get_pdata_int(iEnt, m_iClip, 4);
  1097.  
  1098. if( g_iOldClip<=0 && !get_pdata_int(iEnt, m_fInReload, 4) )
  1099. {
  1100. ExecuteHamB(Ham_Weapon_PlayEmptySound, iEnt);
  1101. set_pdata_float(iEnt, m_flNextPrimaryAttack, 0.2, 4);
  1102. return HAM_SUPERCEDE;
  1103. }
  1104. else if( g_iOldClip>0 )
  1105. {
  1106. static s_iOwner, Float:s_fFov;
  1107. s_iOwner = get_pdata_cbase(iEnt, m_pPlayer, 4);
  1108. pev(s_iOwner, pev_fov, s_fFov);
  1109.  
  1110. if( s_fFov==90.0 )
  1111. {
  1112. pev(s_iOwner, pev_velocity, g_fBackupSpeed);
  1113.  
  1114. if( ((g_fBackupSpeed[0]*g_fBackupSpeed[0])+(g_fBackupSpeed[1]*g_fBackupSpeed[1]))<=19600.0 ) // 140*140
  1115. {
  1116. set_pev(s_iOwner, pev_fov, 40.0);
  1117. g_bFakedFov = true;
  1118. g_bFakedSpeed = false;
  1119. }
  1120. else
  1121. {
  1122. set_pev(s_iOwner, pev_velocity, Float:{170.0, 0.0, 0.0});
  1123. g_bFakedFov = false;
  1124. g_bFakedSpeed = true;
  1125. }
  1126. }
  1127. else
  1128. {
  1129. g_bFakedFov = false;
  1130. g_bFakedSpeed = false;
  1131. }
  1132. }
  1133. else
  1134. {
  1135. g_bFakedFov = false;
  1136. g_bFakedSpeed = false;
  1137. }
  1138.  
  1139. return HAM_IGNORED;
  1140. }
  1141.  
  1142. public Ham_Attack_scout_Post(iEnt)
  1143. {
  1144. static s_iOwner;
  1145. s_iOwner = get_pdata_cbase(iEnt, m_pPlayer, 4);
  1146.  
  1147. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  1148. {
  1149. set_pdata_float(iEnt, m_flNextPrimaryAttack, 0.55, 4);
  1150. set_pdata_float(iEnt, m_flNextSecondaryAttack, 0.0, 4);
  1151. set_pdata_float(s_iOwner, m_flNextAttack, 0.0, 5);
  1152.  
  1153. if( get_pdata_int(s_iOwner, m_bResumeZoom, 5) )
  1154. {
  1155. static s_iZoomReset;
  1156. s_iZoomReset = get_pcvar_num(g_iCvarSniperReset);
  1157. if( s_iZoomReset&2 )
  1158. {
  1159. static s_iFov;
  1160. s_iFov = get_pdata_int(s_iOwner, m_iLastZoom, 5);
  1161. set_pdata_int(s_iOwner, m_bResumeZoom, 0, 5);
  1162. set_pdata_int(s_iOwner, m_iFOV, s_iFov, 5);
  1163. set_pev(s_iOwner, pev_fov, float(s_iFov));
  1164. }
  1165. else
  1166. {
  1167. static Float:s_fSpeed;
  1168. ExecuteHamB(Ham_CS_Item_GetMaxSpeed, iEnt, s_fSpeed);
  1169. engfunc(EngFunc_SetClientMaxspeed, s_iOwner, s_fSpeed);
  1170. set_pev(s_iOwner, pev_maxspeed, s_fSpeed);
  1171.  
  1172. if( s_iZoomReset&1 )
  1173. {
  1174. //set_pdata_int(s_iOwner, m_iLastZoom, 90, 5);
  1175. set_pdata_int(s_iOwner, m_bResumeZoom, 0, 5);
  1176. set_pev(s_iOwner, pev_fov, 90.0);
  1177. }
  1178. }
  1179. }
  1180.  
  1181. g_fLastAttack[s_iOwner] = (get_gametime()+0.5);
  1182. }
  1183.  
  1184. if( g_bFakedFov )
  1185. {
  1186. //set_pdata_int(s_iOwner, m_iLastZoom, 90, 5);
  1187. set_pdata_int(s_iOwner, m_bResumeZoom, 0, 5);
  1188. set_pev(s_iOwner, pev_fov, 90.0);
  1189. g_bFakedFov = false;
  1190. }
  1191.  
  1192. if( g_bFakedSpeed )
  1193. {
  1194. set_pev(s_iOwner, pev_velocity, g_fBackupSpeed);
  1195. g_bFakedSpeed = false;
  1196. }
  1197. }
  1198.  
  1199. public Ham_Deploy_scout_Post(iEnt)
  1200. {
  1201. set_pdata_float(iEnt, m_flNextPrimaryAttack, 0.75, 4);
  1202. set_pdata_float(iEnt, m_flNextSecondaryAttack, 0.75, 4);
  1203. set_pdata_float(get_pdata_cbase(iEnt, m_pPlayer, 4), m_flNextAttack, 0.75, 5);
  1204. }
  1205.  
  1206.  
  1207. public Ham_Attack_awp_Pre(iEnt)
  1208. {
  1209. g_iOldClip = get_pdata_int(iEnt, m_iClip, 4);
  1210. if( g_iOldClip<=0 && !get_pdata_int(iEnt, m_fInReload, 4) )
  1211. {
  1212. ExecuteHamB(Ham_Weapon_PlayEmptySound, iEnt);
  1213. set_pdata_float(iEnt, m_flNextPrimaryAttack, 0.2, 4);
  1214. return HAM_SUPERCEDE;
  1215. }
  1216.  
  1217. return HAM_IGNORED;
  1218. }
  1219.  
  1220. public Ham_Attack_awp_Post(iEnt)
  1221. {
  1222. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  1223. {
  1224. static s_iOwner;
  1225. s_iOwner = get_pdata_cbase(iEnt, m_pPlayer, 4);
  1226.  
  1227. if( get_pdata_int(s_iOwner, m_bResumeZoom, 5) )
  1228. {
  1229. static s_iFov, Float:s_fSpeed;
  1230. s_iFov = get_pdata_int(s_iOwner, m_iFOV, 5);
  1231. set_pdata_int(s_iOwner, m_iFOV, 90, 5);
  1232.  
  1233. ExecuteHamB(Ham_CS_Item_GetMaxSpeed, iEnt, s_fSpeed);
  1234. engfunc(EngFunc_SetClientMaxspeed, s_iOwner, s_fSpeed);
  1235. set_pev(s_iOwner, pev_maxspeed, s_fSpeed);
  1236.  
  1237. if( get_pcvar_num(g_iCvarSniperReset)&1 )
  1238. {
  1239. //set_pdata_int(s_iOwner, m_iLastZoom, 90, 5);
  1240. set_pdata_int(s_iOwner, m_bResumeZoom, 0, 5);
  1241. set_pev(s_iOwner, pev_fov, 90.0);
  1242. }
  1243. else
  1244. set_pdata_int(s_iOwner, m_iFOV, s_iFov, 5);
  1245. }
  1246.  
  1247. set_pdata_float(iEnt, m_flNextSecondaryAttack, 0.0, 4);
  1248. set_pdata_float(s_iOwner, m_flNextAttack, 0.0, 5);
  1249.  
  1250. g_fLastAttack[s_iOwner] = (get_gametime()+0.5);
  1251. }
  1252. }
  1253.  
  1254. public Ham_SecAttack_sniper_Post(iEnt)
  1255. {
  1256. if( get_pdata_float(iEnt, m_flNextPrimaryAttack, 4)>0.0 )
  1257. {
  1258. new iOwner;
  1259. iOwner = get_pdata_cbase(iEnt, m_pPlayer, 4);
  1260. if( get_pdata_int(iOwner, m_bResumeZoom, 5) )
  1261. {
  1262. set_pdata_int(iOwner, m_bResumeZoom, 0, 5);
  1263. /*switch( get_pdata_int(iOwner, m_iLastZoom, 5) ) // this commented part makes zooming
  1264. { // during reload more complicated
  1265. case 90:
  1266. {
  1267. set_pdata_int(iOwner, m_iFOV, 40, 5);
  1268. set_pev(iOwner, pev_fov, 40.0);
  1269. }
  1270. case 40:
  1271. {
  1272. if( get_pdata_int(iEnt, m_iId, 4)==CSW_AWP )
  1273. {
  1274. set_pdata_int(iOwner, m_iLastZoom, 10, 5);
  1275. set_pdata_int(iOwner, m_iFOV, 10, 5);
  1276. set_pev(iOwner, pev_fov, 10.0);
  1277. }
  1278. else
  1279. {
  1280. set_pdata_int(iOwner, m_iLastZoom, 15, 5);
  1281. set_pdata_int(iOwner, m_iFOV, 15, 5);
  1282. set_pev(iOwner, pev_fov, 15.0);
  1283. }
  1284. }
  1285. default:
  1286. {
  1287. set_pdata_int(iOwner, m_iLastZoom, 90, 5);
  1288. set_pdata_int(iOwner, m_iFOV, 90, 5);
  1289. set_pev(iOwner, pev_fov, 90.0);
  1290. }
  1291. }
  1292.  
  1293. new Float:fSpeed;
  1294. ExecuteHamB(Ham_CS_Item_GetMaxSpeed, iEnt, fSpeed);
  1295. engfunc(EngFunc_SetClientMaxspeed, iOwner, fSpeed);
  1296. set_pev(iOwner, pev_maxspeed, fSpeed);*/
  1297. }
  1298. }
  1299. }
  1300.  
  1301. public Ham_Attack_sniper_Pre(iEnt)
  1302. {
  1303. g_iOldClip = get_pdata_int(iEnt, m_iClip, 4);
  1304.  
  1305. if( g_iOldClip>0 )
  1306. {
  1307. static s_iOwner, Float:s_fFov;
  1308. s_iOwner = get_pdata_cbase(iEnt, m_pPlayer, 4);
  1309. pev(s_iOwner, pev_fov, s_fFov);
  1310.  
  1311. if( s_fFov==90.0 )
  1312. {
  1313. pev(s_iOwner, pev_velocity, g_fBackupSpeed);
  1314.  
  1315. if( ((g_fBackupSpeed[0]*g_fBackupSpeed[0])+(g_fBackupSpeed[1]*g_fBackupSpeed[1]))<=19600.0 ) // 140*140
  1316. {
  1317. set_pev(s_iOwner, pev_velocity, Float:{0.0, 0.0, 0.0});
  1318. set_pev(s_iOwner, pev_fov, 40.0);
  1319. g_bFakedFov = true;
  1320. g_bFakedSpeed = false;
  1321. }
  1322. else
  1323. {
  1324. set_pev(s_iOwner, pev_velocity, Float:{0.0, 0.0, 0.0});
  1325. g_bFakedFov = false;
  1326. g_bFakedSpeed = true;
  1327. }
  1328. }
  1329. else
  1330. {
  1331. g_bFakedFov = false;
  1332. g_bFakedSpeed = false;
  1333. }
  1334. }
  1335. else
  1336. {
  1337. g_bFakedFov = false;
  1338. g_bFakedSpeed = false;
  1339. }
  1340. }
  1341.  
  1342. public Ham_Attack_sniper_Post(iEnt)
  1343. {
  1344. static s_iOwner;
  1345. s_iOwner = get_pdata_cbase(iEnt, m_pPlayer, 4);
  1346.  
  1347. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  1348. g_fLastAttack[s_iOwner] = (get_gametime()+0.5);
  1349.  
  1350. if( g_bFakedFov )
  1351. {
  1352. static Float:s_fVelocity[3];
  1353. pev(s_iOwner, pev_velocity, s_fVelocity);
  1354. g_fBackupSpeed[0] += s_fVelocity[0];
  1355. g_fBackupSpeed[1] += s_fVelocity[1];
  1356. g_fBackupSpeed[2] += s_fVelocity[2];
  1357. set_pev(s_iOwner, pev_velocity, g_fBackupSpeed);
  1358.  
  1359. set_pev(s_iOwner, pev_fov, 90.0);
  1360. g_bFakedFov = false;
  1361. }
  1362. else if( g_bFakedSpeed )
  1363. {
  1364. static Float:s_fVelocity[3];
  1365. pev(s_iOwner, pev_velocity, s_fVelocity);
  1366. g_fBackupSpeed[0] += s_fVelocity[0];
  1367. g_fBackupSpeed[1] += s_fVelocity[1];
  1368. g_fBackupSpeed[2] += s_fVelocity[2];
  1369. set_pev(s_iOwner, pev_velocity, g_fBackupSpeed);
  1370.  
  1371. g_bFakedSpeed = false;
  1372. }
  1373. }
  1374.  
  1375. public Ham_Attack_m249_Post(iEnt)
  1376. {
  1377. if( g_iOldClip>get_pdata_int(iEnt, m_iClip, 4) )
  1378. fix_punchangle_2d(get_pdata_cbase(iEnt, m_pPlayer, 4), 0.6, 0.25, 0.1, 0.3);
  1379. }
  1380.  
  1381. public Ham_Player_PostThink_Pre(iPlrId)
  1382. {
  1383. g_iOldClip = 0;
  1384.  
  1385. if( g_bPickedUpWeapon )
  1386. {
  1387. if( g_iDefaultAutoSwitch>0 )
  1388. set_pdata_int(iPlrId, m_iClAutoWepSwitch, g_iDefaultAutoSwitch, 5);
  1389. g_bPickedUpWeapon = false;
  1390. }
  1391.  
  1392. g_iDefaultAutoSwitch = -1;
  1393. g_iOldWpn = 0;
  1394. }
  1395.  
  1396. public Ham_AddPlayerItem_Pre(iPlrId, iEnt)
  1397. {
  1398. if( g_iDefaultAutoSwitch!=-1 )
  1399. {
  1400. if( g_bPickedUpWeapon )
  1401. return HAM_IGNORED;
  1402.  
  1403. if( g_iDefaultAutoSwitch && should_block_autoswitch(iPlrId, get_pdata_cbase(iPlrId, m_pActiveItem, 5)) )
  1404. {
  1405. set_pdata_int(iPlrId, m_iClAutoWepSwitch, 0, 5);
  1406.  
  1407. //client_print(iPlrId, print_center, "We've detected that you may not want%cauto-weapon-switch this time", 13);
  1408. }
  1409.  
  1410. g_iOldWpn = get_pdata_cbase(iPlrId, m_pActiveItem, 5);
  1411.  
  1412. g_bPickedUpWeapon = true;
  1413. }
  1414.  
  1415. return HAM_IGNORED;
  1416. }
  1417.  
  1418. public Ham_Deploy_glock_Post(iEnt)
  1419. {
  1420. if( get_pdata_int(iEnt, m_fWeaponState, 4)&WEAPONSTATE_GLOCK18_BURST_MODE )
  1421. {
  1422. message_begin(MSG_ONE, g_iMsgId_TextMsg, _, get_pdata_cbase(iEnt, m_pPlayer, 4));
  1423. write_byte(print_center);
  1424. write_string("#Switch_To_BurstFire");
  1425. message_end();
  1426. }
  1427. }
  1428.  
  1429. public Ham_Deploy_famas_Post(iEnt)
  1430. {
  1431. if( get_pdata_int(iEnt, m_fWeaponState, 4)&WEAPONSTATE_FAMAS_BURST_MODE )
  1432. {
  1433. message_begin(MSG_ONE, g_iMsgId_TextMsg, _, get_pdata_cbase(iEnt, m_pPlayer, 4));
  1434. write_byte(print_center);
  1435. write_string("#Switch_To_BurstFire");
  1436. message_end();
  1437. }
  1438. }
  1439.  
  1440. public Ham_Deploy_shotgun_Post(iEnt)
  1441. {
  1442. if( get_pcvar_num(g_iCvarShotGunDoubleShot)>0 )
  1443. client_print(get_pdata_cbase(iEnt, m_pPlayer, 4), print_center, "Hold down secondary attack%cto use double shot", 13);
  1444. }
  1445.  
  1446. public Ham_Killed_player_Post(iPlrId, iAttackerId, iShouldGib)
  1447. {
  1448. ClearPlayerBit(g_iUserInWalk, iPlrId);
  1449. g_fLastAttack[iPlrId] = 0.0;
  1450.  
  1451. if( is_user_alive(iPlrId) )
  1452. SetPlayerBit(g_iAlive, iPlrId);
  1453. else
  1454. ClearPlayerBit(g_iAlive, iPlrId);
  1455. }
  1456.  
  1457. public Ham_TakeDamage_Pre(iPlrId, iInfectorId, iAttackerId, Float:fDamage, iDamageBits)
  1458. {
  1459. if( 0<iAttackerId<=g_iMaxPlayers )
  1460. {
  1461. if( iInfectorId!=iAttackerId )
  1462. return HAM_IGNORED;
  1463.  
  1464. static s_iWpnEnt;
  1465. if( (s_iWpnEnt=get_pdata_cbase(iAttackerId, m_pActiveItem, 5))<=0 )
  1466. return HAM_IGNORED;
  1467.  
  1468. switch( get_pdata_int(s_iWpnEnt, m_iId, 4) )
  1469. {
  1470. case CSW_GLOCK18: SetHamParamFloat(4, (fDamage*1.525));
  1471. case CSW_USP: SetHamParamFloat(4, (fDamage*1.025));
  1472. case CSW_P228: SetHamParamFloat(4, (fDamage*1.225));
  1473. case CSW_DEAGLE: SetHamParamFloat(4, (fDamage*0.95));
  1474. case CSW_FIVESEVEN: SetHamParamFloat(4, (fDamage*1.175));
  1475. case CSW_ELITE: SetHamParamFloat(4, (fDamage*1.325));
  1476. case CSW_M3:
  1477. {
  1478. if( g_bDoubleShot )
  1479. SetHamParamFloat(4, (fDamage*0.625));
  1480. else
  1481. SetHamParamFloat(4, (fDamage*0.85));
  1482. }
  1483. case CSW_XM1014:
  1484. {
  1485. if( g_bDoubleShot )
  1486. SetHamParamFloat(4, (fDamage*0.65));
  1487. else
  1488. SetHamParamFloat(4, (fDamage*0.825));
  1489. }
  1490. case CSW_TMP: SetHamParamFloat(4, (fDamage*1.45));
  1491. case CSW_MAC10: SetHamParamFloat(4, (g_bRateOfFireFix?(fDamage*1.175):(fDamage*1.475)));
  1492. case CSW_MP5NAVY: SetHamParamFloat(4, (fDamage*1.425));
  1493. case CSW_UMP45: SetHamParamFloat(4, (fDamage*1.4));
  1494. case CSW_P90: SetHamParamFloat(4, (fDamage*1.375));
  1495. case CSW_GALIL: SetHamParamFloat(4, (fDamage*1.125));
  1496. case CSW_FAMAS:
  1497. {
  1498. if( !g_bRateOfFireFix || get_pdata_int(s_iWpnEnt, m_fWeaponState, 4)&WEAPONSTATE_GLOCK18_BURST_MODE )
  1499. SetHamParamFloat(4, (fDamage*1.05));
  1500. else
  1501. SetHamParamFloat(4, (fDamage*0.85));
  1502. }
  1503. case CSW_AK47: SetHamParamFloat(4, (fDamage*0.975));
  1504. case CSW_M4A1: SetHamParamFloat(4, (fDamage*1.025));
  1505. case CSW_SG552: SetHamParamFloat(4, (fDamage*1.075));
  1506. case CSW_AUG: SetHamParamFloat(4, (fDamage*1.125));
  1507. case CSW_SCOUT: SetHamParamFloat(4, (fDamage*0.875));
  1508. case CSW_AWP: SetHamParamFloat(4, (fDamage*1.000));
  1509. case CSW_SG550: SetHamParamFloat(4, (fDamage*1.125));
  1510. case CSW_G3SG1: SetHamParamFloat(4, (fDamage*1.075));
  1511. case CSW_M249: SetHamParamFloat(4, (g_bRateOfFireFix?(fDamage*0.9):(fDamage*1.3)));
  1512. default: return HAM_IGNORED;
  1513. }
  1514. return HAM_HANDLED;
  1515. }
  1516.  
  1517. return HAM_IGNORED;
  1518. }
  1519.  
  1520. Float:get_recoil_fraction(iPlrId, Float:fSpeedFraction, Float:fDuckFraction, Float:fAirFraction)
  1521. {
  1522. static iFlags;
  1523. if( (iFlags=pev(iPlrId, pev_flags))&FL_ONGROUND )
  1524. {
  1525. static Float:s_fVelocity[3], Float:s_fMaxSpeed;
  1526. pev(iPlrId, pev_velocity, s_fVelocity);
  1527. pev(iPlrId, pev_maxspeed, s_fMaxSpeed);
  1528.  
  1529. if( iFlags&FL_DUCKING )
  1530. return ((floatclamp(floatsqroot(((s_fVelocity[0]*s_fVelocity[0])+(s_fVelocity[1]*s_fVelocity[1])/(s_fMaxSpeed*s_fMaxSpeed))), 0.0, 1.0)*fSpeedFraction)-fDuckFraction);
  1531.  
  1532. return (floatclamp(floatsqroot(((s_fVelocity[0]*s_fVelocity[0])+(s_fVelocity[1]*s_fVelocity[1])/(s_fMaxSpeed*s_fMaxSpeed))), 0.0, 1.0)*fSpeedFraction);
  1533. }
  1534.  
  1535. return fAirFraction;
  1536. }
  1537.  
  1538. fix_vertical_recoil(iPlrId, Float:fFraction, Float:s_fSpeedFraction, Float:s_fDuckFraction, Float:s_fAirFraction)
  1539. {
  1540. static Float:s_fPunchAngle[3], Float:s_fPunchDifference;
  1541. pev(iPlrId, pev_punchangle, s_fPunchAngle);
  1542. s_fPunchDifference = (s_fPunchAngle[0]-g_fBackupAngle[0]);
  1543.  
  1544. if( s_fPunchDifference )
  1545. {
  1546. static Float:s_fRate;
  1547. s_fRate = (fFraction+get_recoil_fraction(iPlrId, s_fSpeedFraction, s_fDuckFraction, s_fAirFraction));
  1548. if( s_fRate<1.0 )
  1549. {
  1550. s_fPunchAngle[0] = (s_fPunchDifference*s_fRate);
  1551. set_pev(iPlrId, pev_punchangle, s_fPunchAngle);
  1552. }
  1553. else if( s_fRate>1.0 )
  1554. {
  1555. if( s_fPunchAngle[0]>-25.0 )
  1556. {
  1557. s_fPunchAngle[0] = (s_fPunchDifference*s_fRate);
  1558. if( s_fPunchAngle[0]<-25.0 )
  1559. s_fPunchAngle[0] = -25.0;
  1560. set_pev(iPlrId, pev_punchangle, s_fPunchAngle);
  1561. }
  1562. }
  1563. }
  1564. g_fLastAttack[iPlrId] = (get_gametime()+0.5);
  1565. }
  1566.  
  1567. fix_punchangle_2d(iPlrId, Float:fFraction, Float:fSpeedFraction, Float:fDuckFraction, Float:fAirFraction)
  1568. {
  1569. static Float:s_fPunchAngle[3], Float:s_fPunchDifference[2], Float:s_fFraction;
  1570. pev(iPlrId, pev_punchangle, s_fPunchAngle);
  1571. s_fFraction = (fFraction+get_recoil_fraction(iPlrId, fSpeedFraction, fDuckFraction, fAirFraction));
  1572. s_fPunchDifference[0] = ((s_fPunchAngle[0]-g_fBackupAngle[0])*s_fFraction);
  1573. s_fPunchDifference[1] = ((s_fPunchAngle[1]-g_fBackupAngle[1])*s_fFraction);
  1574.  
  1575. if( (s_fPunchAngle[0]>-25.0 || 0.0<=fFraction<=1.0) && s_fPunchAngle[0]<0.0 )
  1576. {
  1577. s_fPunchAngle[0] = (g_fBackupAngle[0]+s_fPunchDifference[0]);
  1578. if( s_fPunchAngle[0]<-25.0 && fFraction>1.0 )
  1579. s_fPunchAngle[0] = -25.0;
  1580. }
  1581. if( -4.0<=s_fPunchAngle[1]<=4.0 || 0.0<=fFraction<=1.0 )
  1582. {
  1583. s_fPunchAngle[1] = (g_fBackupAngle[1]+s_fPunchDifference[1]);
  1584. if( fFraction>1.0 )
  1585. {
  1586. if( s_fPunchAngle[1]>4.0 )
  1587. s_fPunchAngle[1] = 4.0;
  1588. else if( s_fPunchAngle[1]<-4.0 )
  1589. s_fPunchAngle[1] = -4.0;
  1590. }
  1591. }
  1592. set_pev(iPlrId, pev_punchangle, s_fPunchAngle);
  1593. g_fLastAttack[iPlrId] = (get_gametime()+0.5);
  1594. }
  1595.  
  1596. // This function is useful cause when vertical angle isn't 0, horizontal angle isn't what we expect
  1597. // it to be. Trust me - if we look up, than 45 degrees to the left isn't the edge of our screen,
  1598. // but is directly up. Well, this one fixes it. Baiscally what it does is gives us a position what
  1599. // we want to our cam-pos, cam-angle, and radius. Something like get_user_aiming(), but here we
  1600. // can choose distance and angle and angle within an angle what we want.
  1601. //
  1602. // dest - return origin
  1603. // origin - cam position
  1604. // view - cam angle
  1605. // anlge - angle to where "dest" should be (![z] is the distance/radius we want - not angle!)
  1606. //
  1607. // NOTES: ".ha" = horizontal (Y) or [1]; ".va" = vertical (X) or [0]; ".r" = (Z) or [2]
  1608. // "angle.r" is angle[2] what actually is a radius or a distance we want from "origin" to "dest",
  1609. // so don't get confused. WARNING: fView and fAngle variables do change within the function.
  1610.  
  1611. bool:SphereToCartesian(Float:fDest[3], Float:fOrigin[3], Float:fView[3], Float:fAngle[3])
  1612. {
  1613. fView[1] *= (M_PI/180.0); // and now angle[0] and angle[1] has no effect?
  1614. fView[0] *= (M_PI/180.0);
  1615.  
  1616. fAngle[0] *= (M_PI/-180.0);
  1617. fAngle[1] *= (M_PI/180.0);
  1618.  
  1619. static Float:s_fSin0, Float:s_fCos0, Float:s_fSin1, Float:s_fCos1;
  1620. s_fSin0 = floatsin((fAngle[0]+(M_PI*0.5)), radian);
  1621.  
  1622. fDest[0] = fAngle[2]*s_fSin0*floatcos(fAngle[1], radian);
  1623. fDest[1] = fAngle[2]*s_fSin0*floatsin(fAngle[1], radian);
  1624. fDest[2] = fAngle[2]*floatcos((fAngle[0]+(M_PI*0.5)), radian);
  1625.  
  1626.  
  1627. s_fSin0 = floatsin(fView[0], radian);
  1628. s_fCos0 = floatcos(fView[0], radian);
  1629. s_fSin1 = floatsin(fView[1], radian);
  1630. s_fCos1 = floatcos(fView[1], radian);
  1631.  
  1632. static Float:s_fTemp[3];
  1633. s_fTemp[0] = (fDest[0]*s_fCos0*s_fCos1)-(fDest[1]*s_fSin1)+(fDest[2]*s_fSin0*s_fCos1);
  1634. s_fTemp[1] = (fDest[0]*s_fCos0*s_fSin1)+(fDest[1]*s_fCos1)+(fDest[2]*s_fSin1*s_fSin0);
  1635. s_fTemp[2] = (fDest[2]*s_fCos0)-(fDest[0]*s_fSin0);
  1636.  
  1637. fDest[0] = (fOrigin[0]+s_fTemp[0]);
  1638. fDest[1] = (fOrigin[1]+s_fTemp[1]);
  1639. fDest[2] = (fOrigin[2]-s_fTemp[2]);
  1640.  
  1641. return true;
  1642. }
  1643.  
  1644. bool:should_block_autoswitch(iPlrId, iActiveItem)
  1645. {
  1646. if( !CheckPlayerBit(g_iAlive, iPlrId) ) // respawn pickup
  1647. return false;
  1648.  
  1649. if( get_pcvar_num(g_iCvarAutoSwitchFix)<=0 )
  1650. return false;
  1651.  
  1652. if( CheckPlayerBit(g_iUserInWalk, iPlrId) || pev(iPlrId, pev_flags)&FL_DUCKING || g_fLastAttack[iPlrId]>get_gametime() || pev(iPlrId, pev_fov)!=90 )
  1653. return true;
  1654.  
  1655. static s_iButtons;
  1656. s_iButtons = pev(iPlrId, pev_button);
  1657. if( s_iButtons&IN_ATTACK || s_iButtons&IN_ATTACK2 || s_iButtons&IN_USE )
  1658. return true;
  1659.  
  1660. if( iActiveItem>0 )
  1661. {
  1662. if( get_pdata_int(iActiveItem, m_fInReload, 4) || get_pdata_int(iActiveItem, m_fInSpecialReload, 4) )
  1663. return true;
  1664. else
  1665. {
  1666. switch( get_pdata_int(iActiveItem, m_iId, 4) )
  1667. {
  1668. case CSW_KNIFE: return true;
  1669. case CSW_FLASHBANG, CSW_HEGRENADE, CSW_SMOKEGRENADE:
  1670. {
  1671. if( get_pdata_float(iActiveItem, m_flStartThrow, 3) && get_pdata_float(iActiveItem, m_flTimeWeaponIdle, 4)<=0.0 )
  1672. return true;
  1673. }
  1674. }
  1675. }
  1676. }
  1677.  
  1678. static Float:s_fVelocity[3];
  1679. pev(iPlrId, pev_velocity, s_fVelocity);
  1680.  
  1681. if( !s_fVelocity[0] && !s_fVelocity[1] && !s_fVelocity[2] )
  1682. {
  1683. pev(iPlrId, pev_basevelocity, s_fVelocity)
  1684. if( !s_fVelocity[0] && !s_fVelocity[1] && !s_fVelocity[2] )
  1685. return true;
  1686. }
  1687.  
  1688. return false;
  1689. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement