Advertisement
mihay111

chainsawv2

Jul 26th, 2019
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 25.62 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <fakemeta>
  3. #include <hamsandwich>
  4. #include <zombieplague>
  5.  
  6. #define CustomItem(%0) (pev(%0, pev_impulse) == WEAPON_SPECIAL_CODE)
  7.  
  8. enum _: e_AnimList
  9. {
  10. WEAPON_ANIM_IDLE = 0,
  11. WEAPON_ANIM_DRAW,
  12. WEAPON_ANIM_DRAW_EMPTY,
  13. WEAPON_ANIM_ATTACK_START,
  14. WEAPON_ANIM_ATTACK_LOOP,
  15. WEAPON_ANIM_ATTACK_END,
  16. WEAPON_ANIM_RELOAD,
  17. WEAPON_ANIM_SLASH1,
  18. WEAPON_ANIM_SLASH2,
  19. WEAPON_ANIM_SLASH3,
  20. WEAPON_ANIM_SLASH4,
  21. WEAPON_ANIM_IDLE_EMPTY
  22. };
  23.  
  24. enum _: e_HitResultList
  25. {
  26. SLASH_HIT_NONE = 0,
  27. SLASH_HIT_WORLD,
  28. SLASH_HIT_ENTITY
  29. };
  30.  
  31. enum _: e_AttackState
  32. {
  33. STATE_NONE = 0,
  34. STATE_IN_LOOP,
  35. STATE_IN_END
  36. };
  37.  
  38. // From model: Frames/FPS
  39. #define WEAPON_ANIM_IDLE_TIME 151/30.0
  40. #define WEAPON_ANIM_DRAW_TIME 46/30.0
  41. #define WEAPON_ANIM_ATTACK_START_TIME 16/30.0
  42. #define WEAPON_ANIM_ATTACK_LOOP_TIME 16/30.0
  43. #define WEAPON_ANIM_ATTACK_END_TIME 46/30.0
  44. #define WEAPON_ANIM_RELOAD_TIME 94/30.0
  45. #define WEAPON_ANIM_SLASH_TIME 46/30.0
  46.  
  47. #define WEAPON_SPECIAL_CODE 3000
  48. #define WEAPON_REFERENCE "weapon_m249"
  49. #define WEAPON_NEW_NAME "x/weapon_chainsaw"
  50.  
  51. #define WEAPON_ITEM_NAME "Ripper (PowerSaw)"
  52. #define WEAPON_ITEM_COST 200
  53.  
  54. #define WEAPON_MODEL_VIEW "models/x/v_chainsaw.mdl"
  55. #define WEAPON_MODEL_PLAYER "models/x/p_chainsaw.mdl"
  56. #define WEAPON_MODEL_WORLD "models/x/w_chainsaw.mdl"
  57. #define WEAPON_BODY 0
  58.  
  59. #define WEAPON_SOUND_ATTACK_LOOP "weapons/chainsaw_attack1_loop.wav"
  60. #define WEAPON_SOUND_ATTACK_HIT "weapons/chainsaw_hit1.wav"
  61. #define WEAPON_SOUND_SLASH_HIT "weapons/chainsaw_hit2.wav"
  62. #define WEAPON_SOUND_SLASH_HIT_EMPTY "weapons/chainsaw_hit3.wav"
  63.  
  64. #define WEAPON_MAX_CLIP 200
  65. #define WEAPON_DEFAULT_AMMO 200
  66. #define WEAPON_RATE 0.075
  67.  
  68. #define WEAPON_ANIM_EXTENSION_A "m249" // Original CSO: chainsaw (aim, reload, shoot)
  69. #define WEAPON_ANIM_EXTENSION_B "knife" // Original CSO: chainsaw (shoot2)
  70.  
  71. #define WEAPON_ATTACK_DISTANCE 90.0
  72. #define WEAPON_ATTACK_DAMAGE 50.0
  73.  
  74. #define WEAPON_SLASH_DISTANCE 140.0
  75. #define WEAPON_SLASH_DAMAGE 200.0
  76. #define WEAPON_SLASH_KNOCKBACK 500.0
  77.  
  78. new Float: flSendAnglesAttack[] = { 0.0 };
  79. new Float: flSendAnglesUpAttack[] = { 0.0 };
  80.  
  81. new Float: flSendAnglesSlash[] = { 0.0, -10.0, 10.0, -20.0, 20.0 };
  82. new Float: flSendAnglesUpSlash[] = { 0.0, 0.0, 0.0, 0.0, 0.0 };
  83.  
  84. new const iWeaponList[] =
  85. {
  86. 3, 200,-1, -1, 0, 4, 20, 0 // weapon_m249
  87. };
  88.  
  89. #define DONT_BLEED -1
  90. #define ACT_RANGE_ATTACK1 28
  91.  
  92. // Linux extra offsets
  93. #define linux_diff_animating 4
  94. #define linux_diff_weapon 4
  95. #define linux_diff_player 5
  96.  
  97. // CWeaponBox
  98. #define m_rgpPlayerItems_CWeaponBox 34
  99.  
  100. // CBaseAnimating
  101. #define m_flFrameRate 36
  102. #define m_flGroundSpeed 37
  103. #define m_flLastEventCheck 38
  104. #define m_fSequenceFinished 39
  105. #define m_fSequenceLoops 40
  106.  
  107. // CBasePlayerItem
  108. #define m_pPlayer 41
  109. #define m_pNext 42
  110. #define m_iId 43
  111.  
  112. // CBasePlayerWeapon
  113. #define m_flNextPrimaryAttack 46
  114. #define m_flNextSecondaryAttack 47
  115. #define m_flTimeWeaponIdle 48
  116. #define m_iPrimaryAmmoType 49
  117. #define m_iClip 51
  118. #define m_fInReload 54
  119. #define m_iWeaponState 74
  120.  
  121. // CBaseMonster
  122. #define m_Activity 73
  123. #define m_IdealActivity 74
  124. #define m_LastHitGroup 75
  125. #define m_flNextAttack 83
  126.  
  127. // CBasePlayer
  128. #define m_flPainShock 108
  129. #define m_iPlayerTeam 114
  130. #define m_flLastAttackTime 220
  131. #define m_rpgPlayerItems 367
  132. #define m_pActiveItem 373
  133. #define m_rgAmmo 376
  134. #define m_szAnimExtention 492
  135.  
  136. new g_iszAllocString_Entity,
  137. g_iszAllocString_ModelView,
  138. g_iszAllocString_ModelPlayer,
  139.  
  140. g_iszModelIndexBloodSpray,
  141. g_iszModelIndexBloodDrop,
  142.  
  143. g_iMsgID_Weaponlist,
  144. g_iItemID;
  145.  
  146. public plugin_init()
  147. {
  148. register_plugin("[ZP] Weapon: Ripper (PowerSaw)", "1.0", "xUnicorn (t3rkecorejz) / Batcoh: Code base");
  149.  
  150. g_iItemID = zp_register_extra_item(WEAPON_ITEM_NAME, WEAPON_ITEM_COST, ZP_TEAM_HUMAN);
  151.  
  152. register_forward(FM_UpdateClientData, "FM_Hook_UpdateClientData_Post", true);
  153. register_forward(FM_SetModel, "FM_Hook_SetModel_Pre", false);
  154.  
  155. RegisterHam(Ham_Item_Holster, WEAPON_REFERENCE, "CWeapon__Holster_Post", true);
  156. RegisterHam(Ham_Item_Deploy, WEAPON_REFERENCE, "CWeapon__Deploy_Post", true);
  157. RegisterHam(Ham_Item_PostFrame, WEAPON_REFERENCE, "CWeapon__PostFrame_Pre", false);
  158. RegisterHam(Ham_Item_AddToPlayer, WEAPON_REFERENCE, "CWeapon__AddToPlayer_Post", true);
  159. RegisterHam(Ham_Weapon_Reload, WEAPON_REFERENCE, "CWeapon__Reload_Pre", false);
  160. RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_REFERENCE, "CWeapon__WeaponIdle_Pre", false);
  161. RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_REFERENCE, "CWeapon__PrimaryAttack_Pre", false);
  162. RegisterHam(Ham_Weapon_SecondaryAttack, WEAPON_REFERENCE, "CWeapon__SecondaryAttack_Pre", false);
  163.  
  164. g_iMsgID_Weaponlist = get_user_msgid("WeaponList");
  165. }
  166.  
  167. public plugin_precache()
  168. {
  169. // Hook weapon
  170. register_clcmd(WEAPON_NEW_NAME, "Command_HookWeapon");
  171.  
  172. // Precache models
  173. engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_VIEW);
  174. engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_PLAYER);
  175. engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_WORLD);
  176.  
  177. // Precache generic
  178. UTIL_PrecacheSpritesFromTxt(WEAPON_NEW_NAME);
  179.  
  180. // Precache sounds
  181. engfunc(EngFunc_PrecacheSound, WEAPON_SOUND_ATTACK_LOOP);
  182. engfunc(EngFunc_PrecacheSound, WEAPON_SOUND_ATTACK_HIT);
  183. engfunc(EngFunc_PrecacheSound, WEAPON_SOUND_SLASH_HIT);
  184. engfunc(EngFunc_PrecacheSound, WEAPON_SOUND_SLASH_HIT_EMPTY);
  185.  
  186. UTIL_PrecacheSoundsFromModel(WEAPON_MODEL_VIEW);
  187.  
  188. // Other
  189. g_iszAllocString_Entity = engfunc(EngFunc_AllocString, WEAPON_REFERENCE);
  190. g_iszAllocString_ModelView = engfunc(EngFunc_AllocString, WEAPON_MODEL_VIEW);
  191. g_iszAllocString_ModelPlayer = engfunc(EngFunc_AllocString, WEAPON_MODEL_PLAYER);
  192.  
  193. // Model Index
  194. g_iszModelIndexBloodSpray = engfunc(EngFunc_PrecacheModel, "sprites/bloodspray.spr");
  195. g_iszModelIndexBloodDrop = engfunc(EngFunc_PrecacheModel, "sprites/blood.spr");
  196. }
  197.  
  198. // [ Amxx ]
  199. public zp_extra_item_selected(iPlayer, iItem)
  200. {
  201. if(iItem == g_iItemID)
  202. Command_GiveWeapon(iPlayer);
  203. }
  204.  
  205. public Command_HookWeapon(iPlayer)
  206. {
  207. engclient_cmd(iPlayer, WEAPON_REFERENCE);
  208. return PLUGIN_HANDLED;
  209. }
  210.  
  211. public Command_GiveWeapon(iPlayer)
  212. {
  213. static iEntity; iEntity = engfunc(EngFunc_CreateNamedEntity, g_iszAllocString_Entity);
  214. if(iEntity <= 0) return 0;
  215.  
  216. set_pev(iEntity, pev_impulse, WEAPON_SPECIAL_CODE);
  217. ExecuteHam(Ham_Spawn, iEntity);
  218. UTIL_DropWeapon(iPlayer, 1);
  219.  
  220. if(!ExecuteHamB(Ham_AddPlayerItem, iPlayer, iEntity))
  221. {
  222. set_pev(iEntity, pev_flags, pev(iEntity, pev_flags) | FL_KILLME);
  223. return 0;
  224. }
  225.  
  226. ExecuteHamB(Ham_Item_AttachToPlayer, iEntity, iPlayer);
  227. set_pdata_int(iEntity, m_iClip, WEAPON_MAX_CLIP, linux_diff_weapon);
  228.  
  229. new iAmmoType = m_rgAmmo + get_pdata_int(iEntity, m_iPrimaryAmmoType, linux_diff_weapon);
  230. if(get_pdata_int(iPlayer, m_rgAmmo, linux_diff_player) < WEAPON_DEFAULT_AMMO)
  231. set_pdata_int(iPlayer, iAmmoType, WEAPON_DEFAULT_AMMO, linux_diff_player);
  232.  
  233. emit_sound(iPlayer, CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
  234. return 1;
  235. }
  236.  
  237. // [ Fakemeta ]
  238. public FM_Hook_UpdateClientData_Post(iPlayer, SendWeapons, CD_Handle)
  239. {
  240. if(get_cd(CD_Handle, CD_DeadFlag) != DEAD_NO) return;
  241.  
  242. static iItem; iItem = get_pdata_cbase(iPlayer, m_pActiveItem, 5);
  243. if(iItem <= 0 || !CustomItem(iItem)) return;
  244.  
  245. set_cd(CD_Handle, CD_flNextAttack, get_gametime() + 0.001);
  246. }
  247.  
  248. public FM_Hook_SetModel_Pre(iEntity)
  249. {
  250. static i, szClassName[32], iItem;
  251. pev(iEntity, pev_classname, szClassName, charsmax(szClassName));
  252.  
  253. if(!equal(szClassName, "weaponbox")) return FMRES_IGNORED;
  254.  
  255. for(i = 0; i < 6; i++)
  256. {
  257. iItem = get_pdata_cbase(iEntity, m_rgpPlayerItems_CWeaponBox + i, linux_diff_weapon);
  258.  
  259. if(iItem > 0 && CustomItem(iItem))
  260. {
  261. engfunc(EngFunc_SetModel, iEntity, WEAPON_MODEL_WORLD);
  262. set_pev(iEntity, pev_body, WEAPON_BODY);
  263.  
  264. return FMRES_SUPERCEDE;
  265. }
  266. }
  267.  
  268. return FMRES_IGNORED;
  269. }
  270.  
  271. // [ HamSandwich ]
  272. public CWeapon__Holster_Post(iItem)
  273. {
  274. if(!CustomItem(iItem)) return;
  275. static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, linux_diff_weapon);
  276.  
  277. emit_sound(iPlayer, CHAN_ITEM, "common/null.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
  278. set_pdata_int(iItem, m_iWeaponState, STATE_NONE, linux_diff_weapon);
  279. }
  280.  
  281. public CWeapon__Deploy_Post(iItem)
  282. {
  283. if(!CustomItem(iItem)) return;
  284.  
  285. static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, linux_diff_weapon);
  286.  
  287. set_pev_string(iPlayer, pev_viewmodel2, g_iszAllocString_ModelView);
  288. set_pev_string(iPlayer, pev_weaponmodel2, g_iszAllocString_ModelPlayer);
  289.  
  290. UTIL_SendWeaponAnim(iPlayer, WEAPON_ANIM_DRAW);
  291.  
  292. set_pdata_float(iPlayer, m_flNextAttack, WEAPON_ANIM_DRAW_TIME, linux_diff_player);
  293. set_pdata_float(iItem, m_flTimeWeaponIdle, WEAPON_ANIM_DRAW_TIME, linux_diff_weapon);
  294. set_pdata_string(iPlayer, m_szAnimExtention * 4, WEAPON_ANIM_EXTENSION_A, -1, linux_diff_player * linux_diff_animating);
  295. }
  296.  
  297. public CWeapon__PostFrame_Pre(iItem)
  298. {
  299. if(!CustomItem(iItem)) return HAM_IGNORED;
  300.  
  301. static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, linux_diff_weapon);
  302. static iClip; iClip = get_pdata_int(iItem, m_iClip, linux_diff_weapon);
  303. static iButton; iButton = pev(iPlayer, pev_button);
  304. static iWeaponState; iWeaponState = get_pdata_int(iItem, m_iWeaponState, linux_diff_weapon);
  305.  
  306. switch(iWeaponState)
  307. {
  308. case STATE_NONE:
  309. {
  310. if(get_pdata_int(iItem, m_fInReload, linux_diff_weapon) == 1)
  311. {
  312. static iAmmoType; iAmmoType = m_rgAmmo + get_pdata_int(iItem, m_iPrimaryAmmoType, linux_diff_weapon);
  313. static iAmmo; iAmmo = get_pdata_int(iPlayer, iAmmoType, linux_diff_player);
  314. static j; j = min(WEAPON_MAX_CLIP - iClip, iAmmo);
  315.  
  316. set_pdata_int(iItem, m_iClip, iClip + j, linux_diff_weapon);
  317. set_pdata_int(iPlayer, iAmmoType, iAmmo - j, linux_diff_player);
  318. set_pdata_int(iItem, m_fInReload, 0, linux_diff_weapon);
  319. }
  320.  
  321. if(iButton & IN_ATTACK2 && get_pdata_float(iItem, m_flNextSecondaryAttack, linux_diff_weapon) < 0.0)
  322. {
  323. ExecuteHamB(Ham_Weapon_SecondaryAttack, iItem);
  324.  
  325. iButton &= ~IN_ATTACK2;
  326. set_pev(iPlayer, pev_button, iButton);
  327. }
  328. }
  329. case STATE_IN_LOOP:
  330. {
  331. if((pev(iPlayer, pev_weaponanim) == WEAPON_ANIM_ATTACK_START || pev(iPlayer, pev_weaponanim) == WEAPON_ANIM_ATTACK_LOOP) && !(iButton & IN_ATTACK) || !iClip)
  332. {
  333. set_pdata_int(iItem, m_iWeaponState, STATE_IN_END, linux_diff_weapon);
  334. }
  335. }
  336. case STATE_IN_END:
  337. {
  338. UTIL_SendWeaponAnim(iPlayer, WEAPON_ANIM_ATTACK_END);
  339.  
  340. set_pdata_int(iItem, m_iWeaponState, STATE_NONE, linux_diff_weapon);
  341. set_pdata_float(iPlayer, m_flNextAttack, WEAPON_ANIM_ATTACK_END_TIME, linux_diff_player);
  342. set_pdata_float(iItem, m_flTimeWeaponIdle, WEAPON_ANIM_ATTACK_END_TIME, linux_diff_weapon);
  343. }
  344. }
  345.  
  346. return HAM_IGNORED;
  347. }
  348.  
  349. public CWeapon__AddToPlayer_Post(iItem, iPlayer)
  350. {
  351. switch(pev(iItem, pev_impulse))
  352. {
  353. case WEAPON_SPECIAL_CODE: UTIL_WeaponList(iPlayer, true);
  354. case 0: UTIL_WeaponList(iPlayer, false);
  355. }
  356. }
  357.  
  358. public CWeapon__Reload_Pre(iItem)
  359. {
  360. if(!CustomItem(iItem)) return HAM_IGNORED;
  361. static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, linux_diff_weapon);
  362.  
  363. static iClip; iClip = get_pdata_int(iItem, m_iClip, linux_diff_weapon);
  364. if(iClip >= WEAPON_MAX_CLIP) return HAM_SUPERCEDE;
  365.  
  366. static iAmmoType; iAmmoType = m_rgAmmo + get_pdata_int(iItem, m_iPrimaryAmmoType, linux_diff_weapon);
  367. if(get_pdata_int(iPlayer, iAmmoType, linux_diff_player) <= 0) return HAM_SUPERCEDE
  368.  
  369. set_pdata_int(iItem, m_iClip, 0, linux_diff_weapon);
  370. ExecuteHam(Ham_Weapon_Reload, iItem);
  371. set_pdata_int(iItem, m_iClip, iClip, linux_diff_weapon);
  372. set_pdata_int(iItem, m_fInReload, 1, linux_diff_weapon);
  373.  
  374. if(get_pdata_int(iItem, m_iWeaponState, linux_diff_weapon) == STATE_IN_LOOP)
  375. set_pdata_int(iItem, m_iWeaponState, STATE_IN_END, linux_diff_weapon);
  376.  
  377. UTIL_SendWeaponAnim(iPlayer, WEAPON_ANIM_RELOAD);
  378.  
  379. static szAnimation[64];
  380. formatex(szAnimation, charsmax(szAnimation), pev(iPlayer, pev_flags) & FL_DUCKING ? "crouch_reload_%s" : "ref_reload_%s", WEAPON_ANIM_EXTENSION_A);
  381. UTIL_PlayerAnimation(iPlayer, szAnimation);
  382.  
  383. set_pdata_float(iItem, m_flNextPrimaryAttack, WEAPON_ANIM_RELOAD_TIME, linux_diff_weapon);
  384. set_pdata_float(iItem, m_flNextSecondaryAttack, WEAPON_ANIM_RELOAD_TIME, linux_diff_weapon);
  385. set_pdata_float(iItem, m_flTimeWeaponIdle, WEAPON_ANIM_RELOAD_TIME, linux_diff_weapon);
  386. set_pdata_float(iPlayer, m_flNextAttack, WEAPON_ANIM_RELOAD_TIME, linux_diff_player);
  387.  
  388. return HAM_SUPERCEDE;
  389. }
  390.  
  391. public CWeapon__WeaponIdle_Pre(iItem)
  392. {
  393. if(!CustomItem(iItem) || get_pdata_float(iItem, m_flTimeWeaponIdle, linux_diff_weapon) > 0.0) return HAM_IGNORED;
  394. static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, linux_diff_weapon);
  395.  
  396. UTIL_SendWeaponAnim(iPlayer, WEAPON_ANIM_IDLE);
  397. set_pdata_float(iItem, m_flTimeWeaponIdle, WEAPON_ANIM_IDLE_TIME, linux_diff_weapon);
  398.  
  399. return HAM_SUPERCEDE;
  400. }
  401.  
  402. public CWeapon__PrimaryAttack_Pre(iItem)
  403. {
  404. if(!CustomItem(iItem)) return HAM_IGNORED;
  405. static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, linux_diff_weapon);
  406. static iClip; iClip = get_pdata_int(iItem, m_iClip, linux_diff_weapon);
  407. static iWeaponState; iWeaponState = get_pdata_int(iItem, m_iWeaponState, linux_diff_weapon);
  408. static szAnimation[64];
  409.  
  410. if(iClip == 0)
  411. {
  412. ExecuteHam(Ham_Weapon_PlayEmptySound, iItem);
  413. set_pdata_float(iItem, m_flNextPrimaryAttack, 0.2, linux_diff_weapon);
  414.  
  415. return HAM_SUPERCEDE;
  416. }
  417.  
  418. switch(iWeaponState)
  419. {
  420. case STATE_NONE:
  421. {
  422. UTIL_SendWeaponAnim(iPlayer, WEAPON_ANIM_ATTACK_START);
  423.  
  424. set_pdata_int(iItem, m_iWeaponState, STATE_IN_LOOP, linux_diff_weapon);
  425. set_pdata_float(iItem, m_flNextPrimaryAttack, WEAPON_ANIM_ATTACK_START_TIME, linux_diff_weapon);
  426. set_pdata_float(iItem, m_flNextSecondaryAttack, WEAPON_ANIM_ATTACK_START_TIME, linux_diff_weapon);
  427. set_pdata_float(iItem, m_flTimeWeaponIdle, WEAPON_ANIM_ATTACK_START_TIME, linux_diff_weapon);
  428. }
  429. case STATE_IN_LOOP:
  430. {
  431. if(pev(iPlayer, pev_weaponanim) != WEAPON_ANIM_ATTACK_LOOP)
  432. UTIL_SendWeaponAnim(iPlayer, WEAPON_ANIM_ATTACK_LOOP);
  433.  
  434. FakeTraceLine(iPlayer, iItem, 0, WEAPON_ATTACK_DISTANCE, WEAPON_ATTACK_DAMAGE, flSendAnglesAttack, flSendAnglesUpAttack, sizeof flSendAnglesAttack);
  435.  
  436. formatex(szAnimation, charsmax(szAnimation), pev(iPlayer, pev_flags) & FL_DUCKING ? "crouch_shoot_%s" : "ref_shoot_%s", WEAPON_ANIM_EXTENSION_A);
  437. UTIL_PlayerAnimation(iPlayer, szAnimation);
  438.  
  439. set_pdata_int(iItem, m_iClip, iClip - 1, linux_diff_weapon);
  440. set_pdata_float(iItem, m_flNextPrimaryAttack, WEAPON_RATE, linux_diff_weapon);
  441. set_pdata_float(iItem, m_flNextSecondaryAttack, WEAPON_ANIM_ATTACK_LOOP_TIME, linux_diff_weapon);
  442. set_pdata_float(iItem, m_flTimeWeaponIdle, WEAPON_ANIM_ATTACK_LOOP_TIME, linux_diff_weapon);
  443. }
  444. }
  445.  
  446. return HAM_SUPERCEDE;
  447. }
  448.  
  449. public CWeapon__SecondaryAttack_Pre(iItem)
  450. {
  451. if(!CustomItem(iItem)) return HAM_IGNORED;
  452. static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, linux_diff_weapon);
  453. static iClip; iClip = get_pdata_int(iItem, m_iClip, linux_diff_weapon);
  454. static Float: vecPunchangle[3];
  455. static szAnimation[64];
  456.  
  457. switch(iClip)
  458. {
  459. case 0: UTIL_SendWeaponAnim(iPlayer, random_num(WEAPON_ANIM_SLASH3, WEAPON_ANIM_SLASH4));
  460. default: UTIL_SendWeaponAnim(iPlayer, random_num(WEAPON_ANIM_SLASH1, WEAPON_ANIM_SLASH2));
  461. }
  462.  
  463. vecPunchangle[0] = -5.0;
  464. vecPunchangle[1] = random_float(-2.5, 2.5);
  465. set_pev(iPlayer, pev_punchangle, vecPunchangle);
  466.  
  467. FakeTraceLine(iPlayer, iItem, 1, WEAPON_SLASH_DISTANCE, WEAPON_SLASH_DAMAGE, flSendAnglesSlash, flSendAnglesUpSlash, sizeof flSendAnglesSlash);
  468.  
  469. formatex(szAnimation, charsmax(szAnimation), pev(iPlayer, pev_flags) & FL_DUCKING ? "crouch_shoot_%s" : "ref_shoot_%s", WEAPON_ANIM_EXTENSION_B);
  470. UTIL_PlayerAnimation(iPlayer, szAnimation);
  471.  
  472. set_pdata_float(iItem, m_flNextPrimaryAttack, WEAPON_ANIM_SLASH_TIME - 0.3, linux_diff_weapon);
  473. set_pdata_float(iItem, m_flNextSecondaryAttack, WEAPON_ANIM_SLASH_TIME - 0.3, linux_diff_weapon);
  474. set_pdata_float(iItem, m_flTimeWeaponIdle, WEAPON_ANIM_SLASH_TIME - 0.3, linux_diff_weapon);
  475.  
  476. return HAM_SUPERCEDE;
  477. }
  478.  
  479. // [ Stocks ]
  480. public FakeTraceLine(iPlayer, iItem, iSlash, Float: flDistance, Float: flDamage, Float:flSendAngles[], Float:flSendAnglesUp[], iSendAngles)
  481. {
  482. new Float: flOrigin[3], Float: flAngle[3], Float: flEnd[3], Float: flViewOfs[3];
  483. new Float: flForw[3], Float: flUp[3], Float: flRight[3];
  484.  
  485. pev(iPlayer, pev_origin, flOrigin);
  486. pev(iPlayer, pev_view_ofs, flViewOfs);
  487.  
  488. flOrigin[0] += flViewOfs[0];
  489. flOrigin[1] += flViewOfs[1];
  490. flOrigin[2] += flViewOfs[2];
  491.  
  492. pev(iPlayer, pev_v_angle, flAngle);
  493. engfunc(EngFunc_AngleVectors, flAngle, flForw, flRight, flUp);
  494.  
  495. new iTrace = create_tr2();
  496.  
  497. new Float: flTan;
  498. new Float: flMul;
  499.  
  500. static Float: flFraction, pHit;
  501. static pHitEntity; pHitEntity = SLASH_HIT_NONE;
  502. static iHitResult; iHitResult = SLASH_HIT_NONE;
  503.  
  504. for(new i; i < iSendAngles; i++)
  505. {
  506. flTan = floattan(flSendAngles[i], degrees);
  507.  
  508. flEnd[0] = (flForw[0] * flDistance) + (flRight[0] * flTan * flDistance) + flUp[0] * flSendAnglesUp[i];
  509. flEnd[1] = (flForw[1] * flDistance) + (flRight[1] * flTan * flDistance) + flUp[1] * flSendAnglesUp[i];
  510. flEnd[2] = (flForw[2] * flDistance) + (flRight[2] * flTan * flDistance) + flUp[2] * flSendAnglesUp[i];
  511.  
  512. flMul = (flDistance/vector_length(flEnd));
  513. flEnd[0] *= flMul;
  514. flEnd[1] *= flMul;
  515. flEnd[2] *= flMul;
  516.  
  517. flEnd[0] = flEnd[0] + flOrigin[0];
  518. flEnd[1] = flEnd[1] + flOrigin[1];
  519. flEnd[2] = flEnd[2] + flOrigin[2];
  520.  
  521. engfunc(EngFunc_TraceLine, flOrigin, flEnd, DONT_IGNORE_MONSTERS, iPlayer, iTrace);
  522. get_tr2(iTrace, TR_flFraction, flFraction);
  523.  
  524. if(flFraction == 1.0)
  525. {
  526. engfunc(EngFunc_TraceHull, flOrigin, flEnd, HULL_HEAD, iPlayer, iTrace);
  527. get_tr2(iTrace, TR_flFraction, flFraction);
  528.  
  529. engfunc(EngFunc_TraceLine, flOrigin, flEnd, DONT_IGNORE_MONSTERS, iPlayer, iTrace);
  530. pHit = get_tr2(iTrace, TR_pHit);
  531. }
  532. else
  533. {
  534. pHit = get_tr2(iTrace, TR_pHit);
  535. }
  536.  
  537. if(flFraction != 1.0)
  538. {
  539. if(!iHitResult) iHitResult = SLASH_HIT_WORLD;
  540. }
  541.  
  542. if(pHit > 0 && pHitEntity != pHit)
  543. {
  544. if(pev(pHit, pev_solid) == SOLID_BSP && !(pev(pHit, pev_spawnflags) & SF_BREAK_TRIGGER_ONLY))
  545. {
  546. ExecuteHamB(Ham_TakeDamage, pHit, iPlayer, iPlayer, flDamage, DMG_NEVERGIB | DMG_CLUB);
  547. }
  548. else
  549. {
  550. FakeTraceAttack(pHit, iPlayer, flDamage, flForw, iTrace, DMG_NEVERGIB | DMG_CLUB);
  551. if(iSlash) FakeKnockBack(pHit, flForw, WEAPON_SLASH_KNOCKBACK);
  552. }
  553.  
  554. iHitResult = SLASH_HIT_ENTITY;
  555. pHitEntity = pHit;
  556. }
  557. }
  558.  
  559. free_tr2(iTrace);
  560.  
  561. static iClip; iClip = get_pdata_int(iItem, m_iClip, linux_diff_weapon);
  562.  
  563. switch(iHitResult)
  564. {
  565. case SLASH_HIT_NONE:
  566. {
  567. if(!iSlash) emit_sound(iPlayer, CHAN_ITEM, WEAPON_SOUND_ATTACK_LOOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
  568. }
  569. case SLASH_HIT_WORLD, SLASH_HIT_ENTITY:
  570. {
  571. if(iSlash)
  572. {
  573. if(iClip) emit_sound(iPlayer, CHAN_WEAPON, WEAPON_SOUND_SLASH_HIT, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
  574. else emit_sound(iPlayer, CHAN_WEAPON, WEAPON_SOUND_SLASH_HIT_EMPTY, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
  575. }
  576. else
  577. {
  578. static Float: vecPunchangle[3];
  579. vecPunchangle[0] = random_float(-1.7, 1.7);
  580. vecPunchangle[1] = random_float(-1.7, 1.7);
  581. set_pev(iPlayer, pev_punchangle, vecPunchangle);
  582.  
  583. emit_sound(iPlayer, CHAN_WEAPON, WEAPON_SOUND_ATTACK_HIT, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
  584. }
  585. }
  586. }
  587. }
  588.  
  589. public FakeTraceAttack(iVictim, iAttacker, Float: flDamage, Float: vecDirection[3], iTrace, ibitsDamageBits)
  590. {
  591. static Float: flTakeDamage; pev(iVictim, pev_takedamage, flTakeDamage);
  592.  
  593. if(flTakeDamage == DAMAGE_NO) return 0;
  594. if(!(is_user_alive(iVictim))) return 0;
  595.  
  596. if(is_user_connected(iVictim))
  597. {
  598. if(get_pdata_int(iVictim, m_iPlayerTeam, linux_diff_player) == get_pdata_int(iAttacker, m_iPlayerTeam, linux_diff_player))
  599. return 0;
  600. }
  601.  
  602. static iHitgroup; iHitgroup = get_tr2(iTrace, TR_iHitgroup);
  603. static Float: vecEndPos[3]; get_tr2(iTrace, TR_vecEndPos, vecEndPos);
  604. static iBloodColor; iBloodColor = ExecuteHamB(Ham_BloodColor, iVictim);
  605.  
  606. set_pdata_int(iVictim, m_LastHitGroup, iHitgroup, linux_diff_player);
  607.  
  608. switch(iHitgroup)
  609. {
  610. case HIT_HEAD: flDamage *= 3.0;
  611. case HIT_LEFTARM, HIT_RIGHTARM: flDamage *= 0.75;
  612. case HIT_LEFTLEG, HIT_RIGHTLEG: flDamage *= 0.75;
  613. case HIT_STOMACH: flDamage *= 1.5;
  614. }
  615.  
  616. ExecuteHamB(Ham_TakeDamage, iVictim, iAttacker, iAttacker, flDamage, ibitsDamageBits);
  617.  
  618. if(zp_get_user_zombie(iVictim))
  619. {
  620. if(iBloodColor != DONT_BLEED)
  621. {
  622. ExecuteHamB(Ham_TraceBleed, iVictim, flDamage, vecDirection, iTrace, ibitsDamageBits);
  623. UTIL_BloodDrips(vecEndPos, iBloodColor, floatround(flDamage));
  624. }
  625. }
  626.  
  627. return 1;
  628. }
  629.  
  630. public FakeKnockBack(iVictim, Float: vecDirection[3], Float: flKnockBack)
  631. {
  632. if(!(is_user_alive(iVictim) && zp_get_user_zombie(iVictim))) return 0;
  633.  
  634. set_pdata_float(iVictim, m_flPainShock, 1.0, linux_diff_player);
  635.  
  636. static Float:vecVelocity[3]; pev(iVictim, pev_velocity, vecVelocity);
  637.  
  638. if(pev(iVictim, pev_flags) & FL_DUCKING)
  639. flKnockBack *= 0.7;
  640.  
  641. vecVelocity[0] = vecDirection[0] * flKnockBack;
  642. vecVelocity[1] = vecDirection[1] * flKnockBack;
  643. vecVelocity[2] = 200.0;
  644.  
  645. set_pev(iVictim, pev_velocity, vecVelocity);
  646.  
  647. return 1;
  648. }
  649.  
  650. public UTIL_BloodDrips(Float:vecOrigin[3], iColor, iAmount)
  651. {
  652. if(iAmount > 255) iAmount = 255;
  653.  
  654. engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vecOrigin, 0);
  655. write_byte(TE_BLOODSPRITE);
  656. engfunc(EngFunc_WriteCoord, vecOrigin[0]);
  657. engfunc(EngFunc_WriteCoord, vecOrigin[1]);
  658. engfunc(EngFunc_WriteCoord, vecOrigin[2]);
  659. write_short(g_iszModelIndexBloodSpray);
  660. write_short(g_iszModelIndexBloodDrop);
  661. write_byte(iColor);
  662. write_byte(min(max(3,iAmount/10),16));
  663. message_end();
  664. }
  665.  
  666. stock UTIL_SendWeaponAnim(iPlayer, iAnim)
  667. {
  668. set_pev(iPlayer, pev_weaponanim, iAnim);
  669.  
  670. message_begin(MSG_ONE, SVC_WEAPONANIM, _, iPlayer);
  671. write_byte(iAnim);
  672. write_byte(0);
  673. message_end();
  674. }
  675.  
  676. stock UTIL_DropWeapon(iPlayer, iSlot)
  677. {
  678. static iEntity, iNext, szWeaponName[32];
  679. iEntity = get_pdata_cbase(iPlayer, m_rpgPlayerItems + iSlot, linux_diff_player);
  680.  
  681. if(iEntity > 0)
  682. {
  683. do
  684. {
  685. iNext = get_pdata_cbase(iEntity, m_pNext, linux_diff_weapon);
  686.  
  687. if(get_weaponname(get_pdata_int(iEntity, m_iId, linux_diff_weapon), szWeaponName, charsmax(szWeaponName)))
  688. engclient_cmd(iPlayer, "drop", szWeaponName);
  689. }
  690.  
  691. while((iEntity = iNext) > 0);
  692. }
  693. }
  694.  
  695. stock UTIL_PrecacheSoundsFromModel(const szModelPath[])
  696. {
  697. new iFile;
  698.  
  699. if((iFile = fopen(szModelPath, "rt")))
  700. {
  701. new szSoundPath[64];
  702.  
  703. new iNumSeq, iSeqIndex;
  704. new iEvent, iNumEvents, iEventIndex;
  705.  
  706. fseek(iFile, 164, SEEK_SET);
  707. fread(iFile, iNumSeq, BLOCK_INT);
  708. fread(iFile, iSeqIndex, BLOCK_INT);
  709.  
  710. for(new k, i = 0; i < iNumSeq; i++)
  711. {
  712. fseek(iFile, iSeqIndex + 48 + 176 * i, SEEK_SET);
  713. fread(iFile, iNumEvents, BLOCK_INT);
  714. fread(iFile, iEventIndex, BLOCK_INT);
  715. fseek(iFile, iEventIndex + 176 * i, SEEK_SET);
  716.  
  717. for(k = 0; k < iNumEvents; k++)
  718. {
  719. fseek(iFile, iEventIndex + 4 + 76 * k, SEEK_SET);
  720. fread(iFile, iEvent, BLOCK_INT);
  721. fseek(iFile, 4, SEEK_CUR);
  722.  
  723. if(iEvent != 5004)
  724. continue;
  725.  
  726. fread_blocks(iFile, szSoundPath, 64, BLOCK_CHAR);
  727.  
  728. if(strlen(szSoundPath))
  729. {
  730. strtolower(szSoundPath);
  731. engfunc(EngFunc_PrecacheSound, szSoundPath);
  732. }
  733. }
  734. }
  735. }
  736.  
  737. fclose(iFile);
  738. }
  739.  
  740. stock UTIL_PrecacheSpritesFromTxt(const szWeaponList[])
  741. {
  742. new szTxtDir[64], szSprDir[64];
  743. new szFileData[128], szSprName[48], temp[1];
  744.  
  745. format(szTxtDir, charsmax(szTxtDir), "sprites/%s.txt", szWeaponList);
  746. engfunc(EngFunc_PrecacheGeneric, szTxtDir);
  747.  
  748. new iFile = fopen(szTxtDir, "rb");
  749. while(iFile && !feof(iFile))
  750. {
  751. fgets(iFile, szFileData, charsmax(szFileData));
  752. trim(szFileData);
  753.  
  754. if(!strlen(szFileData))
  755. continue;
  756.  
  757. new pos = containi(szFileData, "640");
  758.  
  759. if(pos == -1)
  760. continue;
  761.  
  762. format(szFileData, charsmax(szFileData), "%s", szFileData[pos+3]);
  763. trim(szFileData);
  764.  
  765. strtok(szFileData, szSprName, charsmax(szSprName), temp, charsmax(temp), ' ', 1);
  766. trim(szSprName);
  767.  
  768. format(szSprDir, charsmax(szSprDir), "sprites/%s.spr", szSprName);
  769. engfunc(EngFunc_PrecacheGeneric, szSprDir);
  770. }
  771.  
  772. if(iFile) fclose(iFile);
  773. }
  774.  
  775. stock UTIL_WeaponList(iPlayer, bool: bEnabled)
  776. {
  777. message_begin(MSG_ONE, g_iMsgID_Weaponlist, _, iPlayer);
  778. write_string(bEnabled ? WEAPON_NEW_NAME : WEAPON_REFERENCE);
  779. write_byte(iWeaponList[0]);
  780. write_byte(bEnabled ? WEAPON_DEFAULT_AMMO : iWeaponList[1]);
  781. write_byte(iWeaponList[2]);
  782. write_byte(iWeaponList[3]);
  783. write_byte(iWeaponList[4]);
  784. write_byte(iWeaponList[5]);
  785. write_byte(iWeaponList[6]);
  786. write_byte(iWeaponList[7]);
  787. message_end();
  788. }
  789.  
  790. stock UTIL_PlayerAnimation(const iPlayer, const szAnim[])
  791. {
  792. new iAnimDesired, Float: flFrameRate, Float: flGroundSpeed, bool: bLoops;
  793.  
  794. if((iAnimDesired = lookup_sequence(iPlayer, szAnim, flFrameRate, bLoops, flGroundSpeed)) == -1)
  795. {
  796. iAnimDesired = 0;
  797. }
  798.  
  799. new Float: flGameTime = get_gametime();
  800.  
  801. set_pev(iPlayer, pev_frame, 0.0);
  802. set_pev(iPlayer, pev_framerate, 1.0);
  803. set_pev(iPlayer, pev_animtime, flGameTime);
  804. set_pev(iPlayer, pev_sequence, iAnimDesired);
  805.  
  806. set_pdata_int(iPlayer, m_fSequenceLoops, bLoops, linux_diff_animating);
  807. set_pdata_int(iPlayer, m_fSequenceFinished, 0, linux_diff_animating);
  808.  
  809. set_pdata_float(iPlayer, m_flFrameRate, flFrameRate, linux_diff_animating);
  810. set_pdata_float(iPlayer, m_flGroundSpeed, flGroundSpeed, linux_diff_animating);
  811. set_pdata_float(iPlayer, m_flLastEventCheck, flGameTime , linux_diff_animating);
  812.  
  813. set_pdata_int(iPlayer, m_Activity, ACT_RANGE_ATTACK1, linux_diff_player);
  814. set_pdata_int(iPlayer, m_IdealActivity, ACT_RANGE_ATTACK1, linux_diff_player);
  815. set_pdata_float(iPlayer, m_flLastAttackTime, flGameTime , linux_diff_player);
  816. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement