HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <engine>
  3. #include <fakemeta_util>
  4. #include <hamsandwich>
  5. #include <cstrike>
  6. #include <zombieplague>
  7.  
  8. #define PLUGIN "[CSO] Melee Item: Thanatos-9"
  9. #define VERSION "2.0.beta" // Not Code Skull-Axe!
  10. #define AUTHOR "Dev!l" //Original Author Code
  11.  
  12. #define THANATOS9_RANGE_SLASH 110.0
  13. #define THANATOS9_RANGE_STAB 80.0
  14. #define THANATOS9_NEXTATTACK_SLASH 2.0
  15. #define THANATOS9_NEXTATTACK_STAB 1.0
  16.  
  17. #define THANATOS9_DAMAGE_SLASH 500.0
  18. #define THANATOS9_DAMAGE_STAB 100.0
  19.  
  20. #define THANATOS9_CHANGEA 5.0
  21. #define THANATOS9_CHANGEB 3.5
  22.  
  23. #define THANATOS9_SHOOT_START 1.0
  24. #define THANATOS9_SHOOT_END 1.0
  25.  
  26. #define DRAW_TIMEA 1.0
  27. #define DRAW_TIMEB 1.0
  28.  
  29. const OFFSET_WEAPONOWNER = 41
  30. const OFFSET_LINUX_WEAPONS = 4
  31. const m_flNextAttack = 83
  32.  
  33. #define CSW_THANATOS9 CSW_KNIFE
  34. #define weapon_thanatos9 "weapon_knife"
  35.  
  36. new v_model[] = "models/cso/v_thanatos9.mdl"
  37. new p_modela[] = "models/cso/p_thanatos9a.mdl"
  38. new p_modelb[] = "models/cso/p_thanatos9b.mdl"
  39.  
  40. new const hit_wall[] = "weapons/balrog9_wall.wav"
  41. new const hit_sound[] = "weapons/skullaxe_hit.wav"
  42.  
  43. new const thanatos9_sound[][] =
  44. {
  45. "weapons/thanatos9_drawa.wav",
  46. "weapons/thanatos9_shoota1.wav",
  47. "weapons/thanatos9_shoota2.wav",
  48. "weapons/thanatos9_shootb_end.wav",
  49. "weapons/thanatos9_shootb_loop.wav",
  50. "weapons/thanatos9_changea_1.wav",
  51. "weapons/thanatos9_changea_2.wav",
  52. "weapons/thanatos9_changea_3.wav",
  53. "weapons/thanatos9_changea_4.wav",
  54. "weapons/thanatos9_changeb_1.wav",
  55. "weapons/thanatos9_changeb_2.wav"
  56. }
  57.  
  58. enum
  59. {
  60. THANATOS9_ANIM_DRAWA = 0,
  61. THANATOS9_ANIM_SHOOTB_LOOP,
  62. THANATOS9_ANIM_SHOOTB_START,
  63. THANATOS9_ANIM_SHOOTB_END,
  64. THANATOS9_ANIM_IDLEB,
  65. THANATOS9_ANIM_IDLEA,
  66. THANATOS9_ANIM_DRAWB,
  67. THANATOS9_ANIM_SHOOTA1,
  68. THANATOS9_ANIM_SHOOTA2,
  69. THANATOS9_ANIM_CHANGEA,
  70. THANATOS9_ANIM_CHANGEB
  71. }
  72.  
  73. enum
  74. {
  75. MODE_SLASH = 1,
  76. MODE_CHANGEA,
  77. MODE_CHANGEB,
  78. MODE_STAB,
  79. MODE_STAB_ACTION
  80. }
  81.  
  82. enum
  83. {
  84. HIT_NOTHING = 0,
  85. HIT_ENEMY,
  86. HIT_WALL
  87. }
  88.  
  89. #define TASK_SLASHING 215842
  90.  
  91. new const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10", "weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550", "weapon_p228", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
  92. "weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",
  93. "weapon_ak47", "weapon_knife", "weapon_p90" }
  94.  
  95. new m_iBlood[2]
  96. new g_has_thanatos9[33], g_item
  97. new g_MaxPlayers, g_mode[33]
  98.  
  99. new Float:g_thanatos_swing_range = 1.8,Float:g_thanatos_stab_range = 0.8
  100.  
  101. public plugin_init()
  102. {
  103. register_plugin(PLUGIN, VERSION, AUTHOR)
  104.  
  105. register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0")
  106. register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
  107.  
  108. RegisterHam(Ham_Spawn, "player", "Player_Spawn", 1)
  109. RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
  110. RegisterHam(Ham_Weapon_WeaponIdle, "weapon_knife", "fw_thanatosidleanim", 1)
  111.  
  112. register_forward(FM_EmitSound, "fw_EmitSound")
  113. register_forward(FM_CmdStart, "fw_CmdStart")
  114. register_forward(FM_TraceLine, "fw_TraceLine")
  115. register_forward(FM_TraceHull, "fw_TraceHull")
  116. RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack")
  117.  
  118. for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
  119. if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1)
  120.  
  121. g_MaxPlayers = get_maxplayers()
  122.  
  123. g_item = zp_register_extra_item("Thanatos-9", 40, ZP_TEAM_HUMAN)
  124. }
  125.  
  126. public plugin_precache()
  127. {
  128. precache_model(v_model)
  129. precache_model(p_modela)
  130. precache_model(p_modelb)
  131.  
  132. precache_sound(hit_wall)
  133. precache_sound(hit_sound)
  134.  
  135. for(new i = 0; i < sizeof thanatos9_sound; i++)
  136. precache_sound(thanatos9_sound[i])
  137.  
  138. m_iBlood[0] = precache_model("sprites/blood.spr")
  139. m_iBlood[1] = precache_model("sprites/bloodspray.spr")
  140. }
  141.  
  142. public zp_extra_item_selected(id, item)
  143. {
  144. if(item == g_item)
  145. {
  146. get_thanatos9(id)
  147. }
  148. }
  149.  
  150. public client_connect(id) remove_thanatos9(id)
  151. public client_disconnect(id) remove_thanatos9(id)
  152. public Player_Spawn(id) remove_thanatos9(id)
  153. public fw_PlayerKilled(id) remove_thanatos9(id)
  154. public zp_user_infected_post(id) remove_thanatos9(id)
  155. public zp_user_humanized_post(id) remove_thanatos9(id)
  156.  
  157. public get_thanatos9(id)
  158. {
  159. g_has_thanatos9[id] = 1
  160. g_mode[id] = MODE_SLASH
  161.  
  162. if(get_user_weapon(id) == CSW_KNIFE)
  163. {
  164. set_pev(id, pev_viewmodel2, v_model)
  165.  
  166. set_weapon_anim(id, THANATOS9_ANIM_DRAWA)
  167. set_weapons_timeidle(id, CSW_THANATOS9, DRAW_TIMEA)
  168. set_player_nextattack(id, DRAW_TIMEA)
  169.  
  170. static ent; ent = fm_get_user_weapon_entity(id, CSW_THANATOS9)
  171. set_pdata_float(ent, 47, 9999.0, OFFSET_LINUX_WEAPONS)
  172. } else {
  173. engclient_cmd(id, weapon_thanatos9)
  174. }
  175. }
  176.  
  177. public remove_thanatos9(id)
  178. {
  179. g_has_thanatos9[id] = 0
  180. g_mode[id] = 0
  181. if(g_mode[id] == MODE_STAB_ACTION)
  182. {
  183. g_mode[id] = MODE_STAB
  184. shoot_b_end(id)
  185. }
  186. }
  187.  
  188. public fw_Item_Deploy_Post(weapon_ent)
  189. {
  190. static owner
  191. owner = fm_cs_get_weapon_ent_owner(weapon_ent)
  192.  
  193. if(g_has_thanatos9[owner])
  194. {
  195. set_weapons_timeidle(owner, CSW_THANATOS9, 1.7)
  196. // set_player_nextattack(owner, 1.7)
  197. }
  198. }
  199.  
  200. public Event_CurWeapon(id)
  201. {
  202. if(!is_user_alive(id))
  203. return 1
  204. if(get_user_weapon(id) != CSW_THANATOS9)
  205. return 1
  206. if(!g_has_thanatos9[id])
  207. return 1
  208.  
  209. set_pev(id, pev_viewmodel2, v_model)
  210.  
  211. if(g_has_thanatos9[id])
  212. {
  213. if(g_mode[id] == MODE_SLASH)
  214. {
  215. set_pev(id, pev_weaponmodel2, p_modela)
  216. set_weapon_anim(id, THANATOS9_ANIM_DRAWA)
  217. set_weapons_timeidle(id, CSW_THANATOS9, DRAW_TIMEA)
  218. set_player_nextattack(id, DRAW_TIMEA)
  219. } else if(g_mode[id] == MODE_STAB)
  220. {
  221. set_pev(id, pev_weaponmodel2, p_modelb)
  222. set_weapon_anim(id, THANATOS9_ANIM_DRAWB)
  223. set_weapons_timeidle(id, CSW_THANATOS9, DRAW_TIMEB)
  224. set_player_nextattack(id, DRAW_TIMEB)
  225. } else if(g_mode[id] == MODE_STAB_ACTION)
  226. {
  227. set_pev(id, pev_weaponmodel2, p_modela)
  228. set_weapon_anim(id, THANATOS9_ANIM_DRAWA)
  229. set_weapons_timeidle(id, CSW_THANATOS9, DRAW_TIMEA)
  230. set_player_nextattack(id, DRAW_TIMEA)
  231. g_mode[id] = MODE_STAB
  232. shoot_b_end(id)
  233. }
  234. }
  235.  
  236. return 0
  237. }
  238.  
  239. public Event_NewRound()
  240. {
  241. for(new i = 0; i < g_MaxPlayers; i++)
  242. remove_thanatos9(i)
  243. }
  244.  
  245. stock fm_cs_get_weapon_ent_owner(ent)
  246. {
  247. return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS)
  248. }
  249.  
  250. public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
  251. {
  252. if(!is_user_connected(id))
  253. return FMRES_IGNORED
  254. if(get_user_weapon(id) != CSW_THANATOS9 || !g_has_thanatos9[id])
  255. return FMRES_IGNORED
  256.  
  257. if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
  258. {
  259. if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
  260. {
  261. if(g_mode[id] == MODE_SLASH)
  262. {
  263. set_weapons_timeidle(id, CSW_THANATOS9, 1.2)
  264. set_player_nextattack(id, 1.2)
  265.  
  266. emit_sound(id, CHAN_WEAPON, thanatos9_sound[random_num(2,3)], 1.0, ATTN_NORM, 0, PITCH_NORM)
  267. }
  268. return FMRES_SUPERCEDE
  269. }
  270. if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't') // hit
  271. {
  272. if (sample[17] == 'w') // wall
  273. {
  274. if(g_mode[id] == MODE_SLASH)
  275. {
  276. set_weapons_timeidle(id, CSW_THANATOS9, 1.2)
  277. set_player_nextattack(id, 1.2)
  278.  
  279. emit_sound(id, CHAN_WEAPON, hit_wall, 1.0, ATTN_NORM, 0, PITCH_NORM)
  280. }
  281. return FMRES_SUPERCEDE
  282. }
  283. else
  284. {
  285. if(g_mode[id] == MODE_SLASH)
  286. {
  287. set_weapons_timeidle(id, CSW_THANATOS9, 1.2)
  288. set_player_nextattack(id, 1.2)
  289.  
  290. emit_sound(id, CHAN_WEAPON, hit_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
  291. }
  292. return FMRES_SUPERCEDE
  293. }
  294. }
  295. if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a') // stab
  296. {
  297. if(g_mode[id] == MODE_SLASH)
  298. {
  299. set_weapons_timeidle(id, CSW_THANATOS9, 1.2)
  300. set_player_nextattack(id, 1.2)
  301.  
  302. emit_sound(id, CHAN_WEAPON, hit_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
  303. }
  304. return FMRES_SUPERCEDE;
  305. }
  306. }
  307.  
  308. return FMRES_IGNORED
  309. }
  310.  
  311. public fw_thanatosidleanim(Weapon)
  312. {
  313. new id = get_pdata_cbase(Weapon, 41, 4)
  314.  
  315. if(!is_user_alive(id) || zp_get_user_zombie(id) || !g_has_thanatos9[id] || get_user_weapon(id) != CSW_THANATOS9)
  316. return HAM_IGNORED;
  317.  
  318. if(g_mode[id] == MODE_SLASH && get_pdata_float(Weapon, 48, 4) <= 0.25)
  319. {
  320. set_weapon_anim(id, THANATOS9_ANIM_IDLEA)
  321. set_pdata_float(Weapon, 48, 20.0, 4)
  322. return HAM_SUPERCEDE;
  323. }
  324.  
  325. if(g_mode[id] == MODE_STAB && get_pdata_float(Weapon, 48, 4) <= 0.25)
  326. {
  327. set_weapon_anim(id, THANATOS9_ANIM_IDLEB)
  328. set_pdata_float(Weapon, 48, 20.0, 4)
  329. return HAM_SUPERCEDE;
  330. }
  331.  
  332. return HAM_IGNORED;
  333. }
  334.  
  335. public fw_CmdStart(id, uc_handle, seed)
  336. {
  337. if (!is_user_alive(id))
  338. return
  339. if(get_user_weapon(id) != CSW_THANATOS9)
  340. return
  341. if(!g_has_thanatos9[id])
  342. return
  343.  
  344. static ent
  345. ent = find_ent_by_owner(-1, weapon_thanatos9, id)
  346.  
  347. if(!pev_valid(ent))
  348. return
  349. if(get_pdata_float(ent, 46, 4) > 0.0 || get_pdata_float(ent, 47, 4) > 0.0)
  350. return
  351.  
  352. static CurButton
  353. CurButton = get_uc(uc_handle, UC_Buttons)
  354.  
  355. if(CurButton & IN_ATTACK)
  356. {
  357. if(get_pdata_float(id, 83, 5) > 0.0)
  358. return
  359.  
  360. set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK)
  361.  
  362. if(g_mode[id] == MODE_SLASH)
  363. {
  364. g_mode[id] = MODE_SLASH
  365. set_weapons_timeidle(id, CSW_THANATOS9, THANATOS9_NEXTATTACK_SLASH)
  366. set_player_nextattack(id, THANATOS9_NEXTATTACK_SLASH)
  367. set_weapon_anim(id, random_num(THANATOS9_ANIM_SHOOTA1, THANATOS9_ANIM_SHOOTA2))
  368.  
  369. set_task(1.2, "Do_Slashing", id+TASK_SLASHING)
  370. }
  371. else if(g_mode[id] == MODE_STAB)
  372. {
  373. g_mode[id] = MODE_STAB
  374. shoot_b_start(id)
  375. set_weapons_timeidle(id, CSW_THANATOS9, 0.1)
  376. set_player_nextattack(id, THANATOS9_NEXTATTACK_STAB)
  377. }
  378. } else if (CurButton & IN_ATTACK2) {
  379. if(get_pdata_float(ent, 47, OFFSET_LINUX_WEAPONS) > 0.0)
  380. return
  381.  
  382. if(g_mode[id] == MODE_SLASH)
  383. {
  384. set_weapons_timeidle(id, CSW_THANATOS9, 0.1)
  385. set_player_nextattack(id, 0.1)
  386. g_mode[id] = MODE_CHANGEA
  387. set_task(0.1, "change_modea", id)
  388. }
  389. else if(g_mode[id] == MODE_STAB)
  390. {
  391. set_weapons_timeidle(id, CSW_THANATOS9, 0.1)
  392. set_player_nextattack(id, 0.1)
  393. g_mode[id] = MODE_CHANGEB
  394. set_task(0.1, "change_modeb", id)
  395. }
  396. }
  397. }
  398.  
  399. public Do_Slashing(id)
  400. {
  401. id -= TASK_SLASHING
  402.  
  403. if(!is_user_alive(id))
  404. return
  405. if(get_user_weapon(id) != CSW_THANATOS9 || !g_has_thanatos9[id])
  406. return
  407.  
  408. static Ent
  409. Ent = find_ent_by_owner(-1, weapon_thanatos9, id)
  410. new Float:origin[3]
  411. pev(Ent, pev_origin, origin)
  412.  
  413. new a = FM_NULLENT
  414.  
  415. while((a = find_ent_in_sphere(a, origin, 80.0)) != 0)
  416. {
  417. if (id == a)
  418. continue
  419.  
  420. if (zp_get_user_zombie(id))
  421. return
  422.  
  423. if(pev(a, pev_takedamage) != DAMAGE_NO)
  424. {
  425. ExecuteHamB(Ham_TakeDamage, a, id, id, 400.0, DMG_BULLET)
  426. }
  427. }
  428.  
  429. if(!Check_Attack(id, 1))
  430. {
  431. emit_sound(id, CHAN_WEAPON, thanatos9_sound[random_num(2,3)], 1.0, ATTN_NORM, 0, PITCH_NORM)
  432. } else {
  433. emit_sound(id, CHAN_WEAPON, hit_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
  434. }
  435. }
  436.  
  437. public change_modea(id)
  438. {
  439. if(g_mode[id] == MODE_CHANGEA)
  440. {
  441. set_weapons_timeidle(id, CSW_THANATOS9, THANATOS9_CHANGEA)
  442. set_player_nextattack(id, THANATOS9_CHANGEA)
  443. set_weapon_anim(id, THANATOS9_ANIM_CHANGEA)
  444. set_pev(id, pev_weaponmodel2, p_modelb)
  445.  
  446. g_mode[id] = MODE_SLASH
  447. set_task(THANATOS9_CHANGEA, "mode_b", id)
  448. }
  449. }
  450.  
  451. public mode_b(id)
  452. {
  453. g_mode[id] = MODE_STAB
  454. }
  455.  
  456. public change_modeb(id)
  457. {
  458. if(g_mode[id] == MODE_CHANGEB)
  459. {
  460. set_weapons_timeidle(id, CSW_THANATOS9, THANATOS9_CHANGEB)
  461. set_player_nextattack(id, THANATOS9_CHANGEB)
  462. set_weapon_anim(id, THANATOS9_ANIM_CHANGEB)
  463. set_pev(id, pev_weaponmodel2, p_modela)
  464.  
  465. g_mode[id] = MODE_SLASH
  466. }
  467. }
  468.  
  469. public shoot_b_start(id)
  470. {
  471. if(g_mode[id] == MODE_STAB)
  472. {
  473. set_weapons_timeidle(id, CSW_THANATOS9, THANATOS9_SHOOT_START)
  474. set_player_nextattack(id, THANATOS9_SHOOT_START)
  475. set_weapon_anim(id, THANATOS9_ANIM_SHOOTB_START)
  476.  
  477. g_mode[id] = MODE_STAB_ACTION
  478. set_task(THANATOS9_SHOOT_START, "shoot_b_loop", id)
  479. }
  480. }
  481.  
  482. public shoot_b_loop(id)
  483. {
  484. if(g_mode[id] == MODE_STAB_ACTION)
  485. {
  486. set_weapons_timeidle(id, CSW_THANATOS9, 6.0)
  487. set_player_nextattack(id, 0.0)
  488. set_weapon_anim(id, THANATOS9_ANIM_SHOOTB_LOOP)
  489. action_thanatos(id)
  490. emit_sound(id, CHAN_WEAPON, thanatos9_sound[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
  491.  
  492. g_mode[id] = MODE_STAB_ACTION
  493. }
  494. }
  495.  
  496. public shoot_b_end(id)
  497. {
  498. if(g_mode[id] == MODE_STAB)
  499. {
  500. remove_task(id)
  501. emit_sound(id, CHAN_WEAPON, "common/null.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
  502.  
  503. g_mode[id] = MODE_STAB
  504. set_task(0.1, "shoot_b_end_finish", id)
  505. }
  506. }
  507.  
  508. public shoot_b_end_finish(id)
  509. {
  510. if(g_mode[id] == MODE_STAB)
  511. {
  512. set_weapons_timeidle(id, CSW_THANATOS9, THANATOS9_SHOOT_END)
  513. set_player_nextattack(id, THANATOS9_SHOOT_END)
  514. set_weapon_anim(id, THANATOS9_ANIM_SHOOTB_END)
  515.  
  516. g_mode[id] = MODE_CHANGEB
  517. set_task(THANATOS9_SHOOT_END, "change_modeb", id)
  518. }
  519. }
  520.  
  521. public action_thanatos(id)
  522. {
  523. static Ent
  524. Ent = find_ent_by_owner(-1, weapon_thanatos9, id)
  525.  
  526. Damage_thanatos(Ent)
  527. set_task(0.1, "action_thanatos", id)
  528. }
  529.  
  530. public Damage_thanatos(Ent)
  531. {
  532. static id; id = pev(Ent, pev_owner)
  533. new Float:origin[3]
  534. pev(Ent, pev_origin, origin)
  535.  
  536. new a = FM_NULLENT
  537.  
  538. while((a = find_ent_in_sphere(a, origin, 80.0)) != 0)
  539. {
  540. if (id == a)
  541. continue
  542.  
  543. if (zp_get_user_zombie(id))
  544. return
  545.  
  546. if(pev(a, pev_takedamage) != DAMAGE_NO)
  547. {
  548. ExecuteHamB(Ham_TakeDamage, a, id, id, 400.0, DMG_BULLET)
  549. }
  550. }
  551. set_task(0.1, "damage_thanatos9", id)
  552. }
  553.  
  554.  
  555. public damage_thanatos9(id)
  556. {
  557. static Float:Max_Distance
  558.  
  559. if(g_mode[id] == MODE_STAB_ACTION)
  560. {
  561. Max_Distance = THANATOS9_RANGE_STAB
  562. }
  563.  
  564. static Float:VicOrigin[3], Float:MyOrigin[3]
  565. pev(id, pev_origin, MyOrigin)
  566.  
  567. static Have_Victim; Have_Victim = 0
  568. static ent
  569. ent = find_ent_by_owner(-1, weapon_thanatos9, id)
  570.  
  571. if(!pev_valid(ent))
  572. return 0
  573.  
  574. for(new i = 0; i < get_maxplayers(); i++)
  575. {
  576. if(!is_user_alive(i))
  577. continue
  578. if(id == i)
  579. continue
  580. if(entity_range(id, i) > Max_Distance)
  581. continue
  582. pev(i, pev_origin, VicOrigin)
  583. if(!is_in_viewcone(id, VicOrigin, 1))
  584. continue
  585. if(is_wall_between_points(MyOrigin, VicOrigin, id))
  586. continue
  587.  
  588. if(!Have_Victim) Have_Victim = 1
  589. if(g_mode[id] == MODE_STAB_ACTION)
  590. {
  591. do_attack(id, i, ent, THANATOS9_DAMAGE_STAB)
  592. }
  593. }
  594.  
  595. stop_damage(id)
  596.  
  597. if(Have_Victim)
  598. return 1
  599. else
  600. return 0
  601.  
  602. return 0
  603. }
  604.  
  605. public stop_damage(id)
  606. {
  607. set_task(6.0, "shoot_b_end", id)
  608. g_mode[id] = MODE_STAB
  609. }
  610.  
  611. public Check_Attack(id, First_Check)
  612. {
  613. static Float:Max_Distance
  614.  
  615. if(g_mode[id] == MODE_SLASH)
  616. {
  617. Max_Distance = THANATOS9_RANGE_SLASH
  618. }
  619.  
  620. static Float:VicOrigin[3], Float:MyOrigin[3]
  621. pev(id, pev_origin, MyOrigin)
  622.  
  623. static Have_Victim; Have_Victim = 0
  624. static ent
  625. ent = find_ent_by_owner(-1, weapon_thanatos9, id)
  626.  
  627. if(!pev_valid(ent))
  628. return 0
  629.  
  630. for(new i = 0; i < get_maxplayers(); i++)
  631. {
  632. if(!is_user_alive(i))
  633. continue
  634. if(id == i)
  635. continue
  636. if(entity_range(id, i) > Max_Distance)
  637. continue
  638. pev(i, pev_origin, VicOrigin)
  639. if(!is_in_viewcone(id, VicOrigin, 1))
  640. continue
  641. if(is_wall_between_points(MyOrigin, VicOrigin, id))
  642. continue
  643.  
  644. if(!Have_Victim) Have_Victim = 1
  645. if(g_mode[id] == MODE_SLASH)
  646. {
  647. do_attack(id, i, ent, THANATOS9_DAMAGE_SLASH)
  648. if(!First_Check && cs_get_user_team(id) != cs_get_user_team(i))
  649. {
  650. // do_attack(id, i, ent, THANATOS9_DAMAGE_SLASH)
  651. }
  652. }
  653. }
  654.  
  655. if(Have_Victim)
  656. return 1
  657. else
  658. return 0
  659.  
  660. return 0
  661. }
  662.  
  663. public fw_TraceLine(Float:fStart[3], Float:fEnd[3], conditions, id, ptr){
  664. return vTrace(id, ptr,fStart,fEnd,conditions)
  665. }
  666.  
  667. public fw_Tracehull(Float:fStart[3], Float:fEnd[3], conditions, hull, id, ptr){
  668. return vTrace(id, ptr,fStart,fEnd,conditions,true,hull)
  669. }
  670.  
  671. vTrace(id, ptr,Float:fStart[3],Float:fEnd[3],iNoMonsters,bool:hull = false,iHull = 0)
  672. {
  673. if(is_user_alive(id) && get_user_weapon(id) == CSW_THANATOS9 && g_has_thanatos9[id]){
  674. new Float:scalar
  675.  
  676. if(g_mode[id] == MODE_SLASH) scalar = g_thanatos_swing_range
  677. else if(g_mode[id] == MODE_STAB_ACTION) scalar = g_thanatos_stab_range
  678. else scalar = 0.0
  679.  
  680. xs_vec_sub(fEnd,fStart,fEnd)
  681. xs_vec_mul_scalar(fEnd,scalar,fEnd);
  682. xs_vec_add(fEnd,fStart,fEnd);
  683.  
  684. hull ? engfunc(EngFunc_TraceHull,fStart,fEnd,iNoMonsters,iHull,id,ptr) : engfunc(EngFunc_TraceLine,fStart,fEnd,iNoMonsters, id,ptr)
  685. }
  686.  
  687. return FMRES_IGNORED;
  688. }
  689.  
  690. public fw_TraceAttack(Victim, Attacker, Float:Damage, Float:Direction[3], TraceHandle, DamageBit, ptr)
  691. {
  692. if(!is_user_alive(Attacker))
  693. return HAM_IGNORED
  694. if(get_user_weapon(Attacker) != CSW_THANATOS9)
  695. return HAM_IGNORED
  696. if(!g_has_thanatos9[Attacker])
  697. return HAM_IGNORED
  698.  
  699.  
  700.  
  701. return HAM_IGNORED
  702. }
  703.  
  704. do_attack(Attacker, Victim, Inflictor, Float:fDamage)
  705. {
  706. fake_player_trace_attack(Attacker, Victim, fDamage)
  707. fake_take_damage(Attacker, Victim, fDamage, Inflictor)
  708. }
  709.  
  710. fake_player_trace_attack(iAttacker, iVictim, &Float:fDamage)
  711. {
  712. // get fDirection
  713. new Float:fAngles[3], Float:fDirection[3]
  714. pev(iAttacker, pev_angles, fAngles)
  715. angle_vector(fAngles, ANGLEVECTOR_FORWARD, fDirection)
  716.  
  717. // get fStart
  718. new Float:fStart[3], Float:fViewOfs[3]
  719. pev(iAttacker, pev_origin, fStart)
  720. pev(iAttacker, pev_view_ofs, fViewOfs)
  721. xs_vec_add(fViewOfs, fStart, fStart)
  722.  
  723. // get aimOrigin
  724. new iAimOrigin[3], Float:fAimOrigin[3]
  725. get_user_origin(iAttacker, iAimOrigin, 3)
  726. IVecFVec(iAimOrigin, fAimOrigin)
  727.  
  728. // TraceLine from fStart to AimOrigin
  729. new ptr = create_tr2()
  730. engfunc(EngFunc_TraceLine, fStart, fAimOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr)
  731. new pHit = get_tr2(ptr, TR_pHit)
  732. new iHitgroup = get_tr2(ptr, TR_iHitgroup)
  733. new Float:fEndPos[3]
  734. get_tr2(ptr, TR_vecEndPos, fEndPos)
  735.  
  736. // get target & body at aiming
  737. new iTarget, iBody
  738. get_user_aiming(iAttacker, iTarget, iBody)
  739.  
  740. // if aiming find target is iVictim then update iHitgroup
  741. if (iTarget == iVictim)
  742. {
  743. iHitgroup = iBody
  744. }
  745.  
  746. // if ptr find target not is iVictim
  747. else if (pHit != iVictim)
  748. {
  749. // get AimOrigin in iVictim
  750. new Float:fVicOrigin[3], Float:fVicViewOfs[3], Float:fAimInVictim[3]
  751. pev(iVictim, pev_origin, fVicOrigin)
  752. pev(iVictim, pev_view_ofs, fVicViewOfs)
  753. xs_vec_add(fVicViewOfs, fVicOrigin, fAimInVictim)
  754. fAimInVictim[2] = fStart[2]
  755. fAimInVictim[2] += get_distance_f(fStart, fAimInVictim) * floattan( fAngles[0] * 2.0, degrees )
  756.  
  757. // check aim in size of iVictim
  758. new iAngleToVictim = get_angle_to_target(iAttacker, fVicOrigin)
  759. iAngleToVictim = abs(iAngleToVictim)
  760. new Float:fDis = 2.0 * get_distance_f(fStart, fAimInVictim) * floatsin( float(iAngleToVictim) * 0.5, degrees )
  761. new Float:fVicSize[3]
  762. pev(iVictim, pev_size , fVicSize)
  763. if ( fDis <= fVicSize[0] * 0.5 )
  764. {
  765. // TraceLine from fStart to aimOrigin in iVictim
  766. new ptr2 = create_tr2()
  767. engfunc(EngFunc_TraceLine, fStart, fAimInVictim, DONT_IGNORE_MONSTERS, iAttacker, ptr2)
  768. new pHit2 = get_tr2(ptr2, TR_pHit)
  769. new iHitgroup2 = get_tr2(ptr2, TR_iHitgroup)
  770.  
  771. // if ptr2 find target is iVictim
  772. if ( pHit2 == iVictim && (iHitgroup2 != HIT_HEAD || fDis <= fVicSize[0] * 0.25) )
  773. {
  774. pHit = iVictim
  775. iHitgroup = iHitgroup2
  776. get_tr2(ptr2, TR_vecEndPos, fEndPos)
  777. }
  778.  
  779. free_tr2(ptr2)
  780. }
  781.  
  782. // if pHit still not is iVictim then set default HitGroup
  783. if (pHit != iVictim)
  784. {
  785. // set default iHitgroup
  786. iHitgroup = HIT_GENERIC
  787.  
  788. new ptr3 = create_tr2()
  789. engfunc(EngFunc_TraceLine, fStart, fVicOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr3)
  790. get_tr2(ptr3, TR_vecEndPos, fEndPos)
  791.  
  792. // free ptr3
  793. free_tr2(ptr3)
  794. }
  795. }
  796.  
  797. // set new Hit & Hitgroup & EndPos
  798. set_tr2(ptr, TR_pHit, iVictim)
  799. set_tr2(ptr, TR_iHitgroup, iHitgroup)
  800. set_tr2(ptr, TR_vecEndPos, fEndPos)
  801.  
  802. // hitgroup multi fDamage
  803. new Float:fMultifDamage
  804. switch(iHitgroup)
  805. {
  806. case HIT_HEAD: fMultifDamage = 2.5
  807. case HIT_STOMACH: fMultifDamage = 1.25
  808. case HIT_LEFTLEG: fMultifDamage = 0.75
  809. case HIT_RIGHTLEG: fMultifDamage = 0.75
  810. default: fMultifDamage = 1.0
  811. }
  812.  
  813. fDamage *= fMultifDamage
  814.  
  815. // ExecuteHam
  816. fake_trake_attack(iAttacker, iVictim, fDamage, fDirection, ptr)
  817.  
  818. // free ptr
  819. free_tr2(ptr)
  820. }
  821.  
  822. stock fake_trake_attack(iAttacker, iVictim, Float:fDamage, Float:fDirection[3], iTraceHandle, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
  823. {
  824. ExecuteHamB(Ham_TraceAttack, iVictim, iAttacker, fDamage, fDirection, iTraceHandle, iDamageBit)
  825. }
  826.  
  827. stock fake_take_damage(iAttacker, iVictim, Float:fDamage, iInflictor = 0, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
  828. {
  829. iInflictor = (!iInflictor) ? iAttacker : iInflictor
  830. ExecuteHamB(Ham_TakeDamage, iVictim, iInflictor, iAttacker, fDamage, iDamageBit)
  831. }
  832.  
  833. stock set_weapon_anim(id, anim)
  834. {
  835. if(!is_user_alive(id))
  836. return
  837.  
  838. set_pev(id, pev_weaponanim, anim)
  839.  
  840. message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id)
  841. write_byte(anim)
  842. write_byte(0)
  843. message_end()
  844. }
  845.  
  846. stock set_weapons_timeidle(id, WeaponId ,Float:TimeIdle)
  847. {
  848. if(!is_user_alive(id))
  849. return
  850.  
  851. static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
  852. if(!pev_valid(entwpn))
  853. return
  854.  
  855. set_pdata_float(entwpn, 46, TimeIdle, OFFSET_LINUX_WEAPONS)
  856. set_pdata_float(entwpn, 47, TimeIdle, OFFSET_LINUX_WEAPONS)
  857. set_pdata_float(entwpn, 48, TimeIdle + 0.5, OFFSET_LINUX_WEAPONS)
  858. }
  859.  
  860. stock set_player_nextattack(id, Float:nexttime)
  861. {
  862. if(!is_user_alive(id))
  863. return
  864.  
  865. set_pdata_float(id, m_flNextAttack, nexttime, 5)
  866. }
  867.  
  868. stock Get_MissileWeaponHitGroup( iEnt )
  869. {
  870. new Float:flStart[ 3 ], Float:flEnd[ 3 ];
  871.  
  872. pev( iEnt, pev_origin, flStart );
  873. pev( iEnt, pev_velocity, flEnd );
  874. xs_vec_add( flStart, flEnd, flEnd );
  875.  
  876. new ptr = create_tr2();
  877. engfunc( EngFunc_TraceLine, flStart, flEnd, 0, iEnt, ptr );
  878.  
  879. new iHitGroup, Owner, nOhead, head
  880. Owner = pev(iEnt, pev_owner)
  881. nOhead = get_tr2( ptr, TR_iHitgroup )
  882. head = set_tr2( ptr, TR_iHitgroup, HIT_HEAD )
  883.  
  884. iHitGroup = is_user_alive(Owner) ? head : nOhead
  885. free_tr2( ptr );
  886.  
  887. return iHitGroup;
  888. }
  889.  
  890. stock get_angle_to_target(id, const Float:fTarget[3], Float:TargetSize = 0.0)
  891. {
  892. new Float:fOrigin[3], iAimOrigin[3], Float:fAimOrigin[3], Float:fV1[3]
  893. pev(id, pev_origin, fOrigin)
  894. get_user_origin(id, iAimOrigin, 3) // end position from eyes
  895. IVecFVec(iAimOrigin, fAimOrigin)
  896. xs_vec_sub(fAimOrigin, fOrigin, fV1)
  897.  
  898. new Float:fV2[3]
  899. xs_vec_sub(fTarget, fOrigin, fV2)
  900.  
  901. new iResult = get_angle_between_vectors(fV1, fV2)
  902.  
  903. if (TargetSize > 0.0)
  904. {
  905. new Float:fTan = TargetSize / get_distance_f(fOrigin, fTarget)
  906. new fAngleToTargetSize = floatround( floatatan(fTan, degrees) )
  907. iResult -= (iResult > 0) ? fAngleToTargetSize : -fAngleToTargetSize
  908. }
  909.  
  910. return iResult
  911. }
  912.  
  913. stock get_angle_between_vectors(const Float:fV1[3], const Float:fV2[3])
  914. {
  915. new Float:fA1[3], Float:fA2[3]
  916. engfunc(EngFunc_VecToAngles, fV1, fA1)
  917. engfunc(EngFunc_VecToAngles, fV2, fA2)
  918.  
  919. new iResult = floatround(fA1[1] - fA2[1])
  920. iResult = iResult % 360
  921. iResult = (iResult > 180) ? (iResult - 360) : iResult
  922.  
  923. return iResult
  924. }
  925.  
  926. stock is_wall_between_points(Float:start[3], Float:end[3], ignore_ent)
  927. {
  928. static ptr
  929. ptr = create_tr2()
  930.  
  931. engfunc(EngFunc_TraceLine, start, end, IGNORE_MONSTERS, ignore_ent, ptr)
  932.  
  933. static Float:EndPos[3]
  934. get_tr2(ptr, TR_vecEndPos, EndPos)
  935.  
  936. free_tr2(ptr)
  937. return floatround(get_distance_f(end, EndPos))
  938. }
  939.