Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.62 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <engine>
  3. #include <fakemeta>
  4. #include <fakemeta_util>
  5. #include <hamsandwich>
  6. #include <cstrike>
  7. #include <xs>
  8. #include <zombieplague>
  9.  
  10. #define PLUGIN "[ZP] Extra Item: Dragon Sword"
  11. #define VERSION "2.0"
  12. #define AUTHOR "Dias Leon"
  13.  
  14. #define V_MODEL "models/v_dragonsword2.mdl"
  15. #define P_MODEL "models/p_dragonsword.mdl"
  16.  
  17. #define CSW_DRAGONSWORD CSW_KNIFE
  18. #define weapon_dragonsword "weapon_knife"
  19. #define WEAPON_ANIMEXT "knife" //"skullaxe"
  20.  
  21. #define DRAW_TIME 1.0
  22.  
  23. #define SLASH_ROTATE_DAMAGE 250.0
  24. #define SLASH_ROTATE_RADIUS 120.0
  25. #define SLASH_ROTATE_POINT_DIS 60.0
  26. #define SLASH_ROTATE_DELAY_TIME 0.7
  27. #define SLASH_ROTATE_RESET_TIME 1.0
  28.  
  29. #define SLASH_AHEAD_DAMAGE 350.0
  30. #define SLASH_AHEAD_RADIUS 100.0
  31. #define SLASH_AHEAD_POINT_DIS 30.0
  32. #define SLASH_AHEAD_DELAY_TIME 0.3
  33. #define SLASH_AHEAD_RESET_TIME 0.9
  34.  
  35. #define STAB_DAMAGE 550.0
  36. #define STAB_RADIUS 110.0
  37. #define STAB_POINT_DIS 80.0
  38. #define STAB_TIME 0.657
  39. #define STAB_RESET_TIME 0.75
  40.  
  41. #define TASK_SLASHING 2033+20
  42. #define TASK_STABING 2033+10
  43.  
  44. // OFFSET
  45. const PDATA_SAFE = 2
  46. const OFFSET_LINUX_WEAPONS = 4
  47. const OFFSET_WEAPONOWNER = 41
  48. const m_flNextAttack = 83
  49. const m_szAnimExtention = 492
  50.  
  51. new const DragonSword_Sound[8][] =
  52. {
  53. "weapons/dragonsword_draw.wav",
  54. "weapons/dragonsword_hit1.wav",
  55. "weapons/dragonsword_hit2.wav",
  56. "weapons/dragonsword_idle.wav",
  57. "weapons/dragonsword_slash1.wav",
  58. "weapons/dragonsword_slash2.wav",
  59. "weapons/dragonsword_stab_hit.wav",
  60. "weapons/dragonsword_wall.wav"
  61. }
  62.  
  63. enum
  64. {
  65. ATTACK_SLASH_ROTATE = 1,
  66. ATTACK_SLASH_AHEAD,
  67. ATTACK_STAB
  68. }
  69.  
  70. enum
  71. {
  72. DS_ANIM_IDLE = 0,
  73. DS_ANIM_SLASH_ROTATE,
  74. DS_ANIM_SLASH_AHEAD,
  75. DS_ANIM_DRAW,
  76. DS_ANIM_STAB_BEGIN,
  77. DS_ANIM_STAB_END
  78. }
  79.  
  80. enum
  81. {
  82. HIT_NOTHING = 0,
  83. HIT_ENEMY,
  84. HIT_WALL
  85. }
  86.  
  87. new g_DragonSword
  88. new g_Had_DragonSword[33], g_Slashing_Mode[33], g_Attack_Mode[33], g_Checking_Mode[33], g_Hit_Ing[33]
  89. new g_Old_Weapon[33], g_Ham_Bot, g_MaxPlayers
  90.  
  91. public plugin_init()
  92. {
  93. register_plugin(PLUGIN, VERSION, AUTHOR)
  94.  
  95. register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0")
  96. register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
  97.  
  98. register_forward(FM_EmitSound, "fw_EmitSound")
  99. register_forward(FM_CmdStart, "fw_CmdStart")
  100. register_forward(FM_TraceLine, "fw_TraceLine")
  101. register_forward(FM_TraceHull, "fw_TraceHull")
  102.  
  103. RegisterHam(Ham_TraceAttack, "player", "fw_PlayerTraceAttack")
  104.  
  105. g_MaxPlayers = get_maxplayers()
  106. //register_clcmd("admin_get_dragonsword", "get_dragonsword", ADMIN_KICK)
  107. }
  108.  
  109. public plugin_precache()
  110. {
  111. engfunc(EngFunc_PrecacheModel, V_MODEL)
  112. engfunc(EngFunc_PrecacheModel, P_MODEL)
  113.  
  114. for(new i = 0; i < sizeof(DragonSword_Sound); i++)
  115. engfunc(EngFunc_PrecacheSound, DragonSword_Sound[i])
  116.  
  117. g_DragonSword = zp_register_extra_item("Dragon Sword", 10, ZP_TEAM_HUMAN)
  118. }
  119.  
  120. public zp_user_infected_post(id) remove_dragonsword(id)
  121. public zp_extra_item_selected(id, ItemID)
  122. {
  123. if(ItemID == g_DragonSword) get_dragonsword(id)
  124. }
  125.  
  126. public get_dragonsword(id)
  127. {
  128. if(!is_user_alive(id))
  129. return
  130.  
  131. remove_task(id+TASK_SLASHING)
  132. remove_task(id+TASK_STABING)
  133.  
  134. g_Had_DragonSword[id] = 1
  135. g_Slashing_Mode[id] = 0
  136. g_Attack_Mode[id] = 0
  137. g_Checking_Mode[id] = 0
  138. g_Hit_Ing[id] = 0
  139.  
  140. if(get_user_weapon(id) == CSW_KNIFE)
  141. {
  142. set_pev(id, pev_viewmodel2, V_MODEL)
  143. set_pev(id, pev_weaponmodel2, P_MODEL)
  144.  
  145. set_weapon_anim(id, DS_ANIM_DRAW)
  146. set_player_nextattack(id, DRAW_TIME)
  147. } else {
  148. engclient_cmd(id, weapon_dragonsword)
  149. }
  150. }
  151.  
  152. public remove_dragonsword(id)
  153. {
  154. remove_task(id+TASK_SLASHING)
  155. remove_task(id+TASK_STABING)
  156.  
  157. g_Had_DragonSword[id] = 0
  158. g_Slashing_Mode[id] = 0
  159. g_Attack_Mode[id] = 0
  160. g_Checking_Mode[id] = 0
  161. g_Hit_Ing[id] = 0
  162. }
  163.  
  164. public client_putinserver(id)
  165. {
  166. if(!g_Ham_Bot && is_user_bot(id))
  167. {
  168. g_Ham_Bot = 1
  169. set_task(0.1, "Do_RegisterHam_Bot", id)
  170. }
  171. }
  172.  
  173. public Do_RegisterHam_Bot(id)
  174. {
  175. RegisterHamFromEntity(Ham_TraceAttack, id, "fw_PlayerTraceAttack")
  176. }
  177.  
  178. public Event_NewRound()
  179. {
  180. for(new i = 0; i < g_MaxPlayers; i++)
  181. remove_dragonsword(i)
  182. }
  183.  
  184. public Event_CurWeapon(id)
  185. {
  186. if(!is_user_alive(id))
  187. return
  188.  
  189. // Problem Here ?. SHUT THE FUCK UP
  190. if((read_data(2) == CSW_DRAGONSWORD && g_Old_Weapon[id] != CSW_DRAGONSWORD) && g_Had_DragonSword[id])
  191. {
  192. set_pev(id, pev_viewmodel2, V_MODEL)
  193. set_pev(id, pev_weaponmodel2, P_MODEL)
  194.  
  195. set_weapon_anim(id, DS_ANIM_DRAW)
  196. set_player_nextattack(id, DRAW_TIME)
  197.  
  198. set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT, -1 , 20)
  199. }
  200.  
  201. g_Old_Weapon[id] = read_data(2)
  202. }
  203.  
  204. public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
  205. {
  206. if(!is_user_connected(id))
  207. return FMRES_IGNORED
  208. if(/*get_user_weapon(id) != CSW_DRAGONSWORD || */!g_Had_DragonSword[id])
  209. return FMRES_IGNORED
  210.  
  211. if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
  212. {
  213. if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
  214. return FMRES_SUPERCEDE
  215. if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't')
  216. {
  217. if (sample[17] == 'w') // wall
  218. {
  219. g_Hit_Ing[id] = HIT_WALL
  220. return FMRES_SUPERCEDE
  221. } else {
  222. g_Hit_Ing[id] = HIT_ENEMY
  223. return FMRES_SUPERCEDE
  224. }
  225. }
  226. if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
  227. return FMRES_SUPERCEDE;
  228. }
  229.  
  230. return FMRES_IGNORED
  231. }
  232.  
  233. public fw_CmdStart(id, uc_handle, seed)
  234. {
  235. if (!is_user_alive(id))
  236. return
  237. if(get_user_weapon(id) != CSW_DRAGONSWORD || !g_Had_DragonSword[id])
  238. return
  239.  
  240. static ent; ent = fm_get_user_weapon_entity(id, CSW_DRAGONSWORD)
  241.  
  242. if(!pev_valid(ent))
  243. return
  244. if(get_pdata_float(ent, 46, OFFSET_LINUX_WEAPONS) > 0.0 || get_pdata_float(ent, 47, OFFSET_LINUX_WEAPONS) > 0.0)
  245. return
  246.  
  247. static CurButton
  248. CurButton = get_uc(uc_handle, UC_Buttons)
  249.  
  250. if (CurButton & IN_ATTACK)
  251. {
  252. set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK)
  253.  
  254. if(!g_Slashing_Mode[id])
  255. {
  256. g_Attack_Mode[id] = ATTACK_SLASH_ROTATE
  257. g_Checking_Mode[id] = 1
  258. ExecuteHamB(Ham_Weapon_PrimaryAttack, ent)
  259. g_Checking_Mode[id] = 0
  260.  
  261. set_pev(id, pev_framerate, 1.5)
  262. set_weapons_timeidle(id, CSW_DRAGONSWORD, SLASH_ROTATE_RESET_TIME)
  263. set_player_nextattack(id, SLASH_ROTATE_RESET_TIME)
  264.  
  265. set_weapon_anim(id, DS_ANIM_SLASH_ROTATE)
  266. set_task(SLASH_ROTATE_DELAY_TIME, "Do_Slashing_Rotate", id+TASK_SLASHING)
  267. } else {
  268. g_Attack_Mode[id] = ATTACK_SLASH_AHEAD
  269. g_Checking_Mode[id] = 1
  270. ExecuteHamB(Ham_Weapon_PrimaryAttack, ent)
  271. g_Checking_Mode[id] = 0
  272.  
  273. set_pev(id, pev_framerate, 2.0)
  274. set_weapons_timeidle(id, CSW_DRAGONSWORD, SLASH_AHEAD_RESET_TIME)
  275. set_player_nextattack(id, SLASH_AHEAD_RESET_TIME)
  276.  
  277. set_weapon_anim(id, DS_ANIM_SLASH_AHEAD)
  278. set_task(SLASH_AHEAD_DELAY_TIME, "Do_Slashing_Ahead", id+TASK_SLASHING)
  279. }
  280.  
  281. g_Slashing_Mode[id] = !g_Slashing_Mode[id]
  282. } else if (CurButton & IN_ATTACK2) {
  283. set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK2)
  284.  
  285. g_Attack_Mode[id] = ATTACK_STAB
  286. g_Checking_Mode[id] = 1
  287. ExecuteHamB(Ham_Weapon_SecondaryAttack, ent)
  288. g_Checking_Mode[id] = 0
  289.  
  290. set_pev(id, pev_framerate, 1.5)
  291. set_weapons_timeidle(id, CSW_DRAGONSWORD, STAB_TIME + 0.1)
  292. set_player_nextattack(id, STAB_TIME + 0.1)
  293.  
  294. set_weapon_anim(id, DS_ANIM_STAB_BEGIN)
  295.  
  296. remove_task(id+TASK_STABING)
  297. set_task(STAB_TIME, "Do_StabNow", id+TASK_STABING)
  298. }
  299. }
  300.  
  301. public Do_Slashing_Rotate(id)
  302. {
  303. id -= TASK_SLASHING
  304.  
  305. if(!is_user_alive(id))
  306. return
  307. if(get_user_weapon(id) != CSW_DRAGONSWORD || !g_Had_DragonSword[id])
  308. return
  309.  
  310. if(Check_Attack(id, ATTACK_SLASH_ROTATE))
  311. {
  312. emit_sound(id, CHAN_WEAPON, DragonSword_Sound[1], 1.0, ATTN_NORM, 0, PITCH_NORM)
  313. } else {
  314. if(g_Hit_Ing[id] == HIT_WALL) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[7], 1.0, ATTN_NORM, 0, PITCH_NORM)
  315. else if(g_Hit_Ing[id] == HIT_NOTHING) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
  316. }
  317.  
  318. g_Attack_Mode[id] = 0
  319. g_Hit_Ing[id] = 0
  320. }
  321.  
  322. public Do_Slashing_Ahead(id)
  323. {
  324. id -= TASK_SLASHING
  325.  
  326. if(!is_user_alive(id))
  327. return
  328. if(get_user_weapon(id) != CSW_DRAGONSWORD || !g_Had_DragonSword[id])
  329. return
  330.  
  331. if(Check_Attack(id, ATTACK_SLASH_AHEAD))
  332. {
  333. emit_sound(id, CHAN_WEAPON, DragonSword_Sound[2], 1.0, ATTN_NORM, 0, PITCH_NORM)
  334. } else {
  335. if(g_Hit_Ing[id] == HIT_WALL) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[7], 1.0, ATTN_NORM, 0, PITCH_NORM)
  336. else if(g_Hit_Ing[id] == HIT_NOTHING) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[5], 1.0, ATTN_NORM, 0, PITCH_NORM)
  337. }
  338.  
  339. g_Attack_Mode[id] = 0
  340. g_Hit_Ing[id] = 0
  341. }
  342.  
  343. public Do_StabNow(id)
  344. {
  345. id -= TASK_STABING
  346.  
  347. if (!is_user_alive(id))
  348. return
  349. if(!g_Had_DragonSword[id])
  350. return
  351.  
  352. set_weapon_anim(id, DS_ANIM_STAB_END)
  353.  
  354. if(get_user_weapon(id) != CSW_DRAGONSWORD)
  355. {
  356. set_weapons_timeidle(id, CSW_DRAGONSWORD, 0.0)
  357. set_player_nextattack(id, 0.0)
  358. } else {
  359. set_weapons_timeidle(id, CSW_DRAGONSWORD, STAB_RESET_TIME)
  360. set_player_nextattack(id, STAB_RESET_TIME)
  361. }
  362.  
  363. if(Check_Attack(id, ATTACK_STAB))
  364. {
  365. emit_sound(id, CHAN_WEAPON, DragonSword_Sound[1], 1.0, ATTN_NORM, 0, PITCH_NORM)
  366. } else {
  367. if(g_Hit_Ing[id] == HIT_WALL) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[7], 1.0, ATTN_NORM, 0, PITCH_NORM)
  368. else if(g_Hit_Ing[id] == HIT_NOTHING) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[6], 1.0, ATTN_NORM, 0, PITCH_NORM)
  369. }
  370.  
  371. g_Attack_Mode[id] = 0
  372. g_Hit_Ing[id] = 0
  373. }
  374.  
  375.  
  376. public Check_Attack(id, Mode)
  377. {
  378. static Float:Max_Distance, Float:Point[4][3], Float:TB_Distance, Float:Point_Dis
  379.  
  380. if(Mode == ATTACK_SLASH_ROTATE)
  381. {
  382. Point_Dis = SLASH_ROTATE_POINT_DIS
  383. Max_Distance = SLASH_ROTATE_RADIUS
  384. TB_Distance = Max_Distance / 4.0
  385. } else if(Mode == ATTACK_SLASH_AHEAD) {
  386. Point_Dis = SLASH_AHEAD_POINT_DIS
  387. Max_Distance = SLASH_AHEAD_RADIUS
  388. TB_Distance = Max_Distance / 4.0
  389. } else if(Mode == ATTACK_STAB) {
  390. Point_Dis = STAB_POINT_DIS
  391. Max_Distance = STAB_RADIUS
  392. TB_Distance = Max_Distance / 4.0
  393. }
  394.  
  395. static Float:VicOrigin[3], Float:MyOrigin[3]
  396. pev(id, pev_origin, MyOrigin)
  397.  
  398. for(new i = 0; i < 4; i++)
  399. get_position(id, TB_Distance * (i + 1), 0.0, 0.0, Point[i])
  400.  
  401. static Have_Victim; Have_Victim = 0
  402. static ent
  403. ent = fm_get_user_weapon_entity(id, get_user_weapon(id))
  404.  
  405. if(!pev_valid(ent))
  406. return 0
  407.  
  408. for(new i = 0; i < get_maxplayers(); i++)
  409. {
  410. if(!is_user_alive(i))
  411. continue
  412. if(id == i)
  413. continue
  414. if(entity_range(id, i) > Max_Distance)
  415. continue
  416.  
  417. pev(i, pev_origin, VicOrigin)
  418. if(is_wall_between_points(MyOrigin, VicOrigin, id))
  419. continue
  420.  
  421. if(get_distance_f(VicOrigin, Point[0]) <= Point_Dis
  422. || get_distance_f(VicOrigin, Point[1]) <= Point_Dis
  423. || get_distance_f(VicOrigin, Point[2]) <= Point_Dis
  424. || get_distance_f(VicOrigin, Point[3]) <= Point_Dis)
  425. {
  426. if(!Have_Victim) Have_Victim = 1
  427. if(Mode == ATTACK_SLASH_ROTATE)
  428. do_attack(id, i, ent, SLASH_ROTATE_DAMAGE)
  429. else if(Mode == ATTACK_SLASH_AHEAD)
  430. do_attack(id, i, ent, SLASH_AHEAD_DAMAGE)
  431. else if(Mode == ATTACK_STAB)
  432. do_attack(id, i, ent, STAB_DAMAGE)
  433. }
  434. }
  435.  
  436. if(Have_Victim)
  437. return 1
  438. else
  439. return 0
  440.  
  441. return 0
  442. }
  443.  
  444. public fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monster, id, handle)
  445. {
  446. if (!is_user_alive(id))
  447. return FMRES_IGNORED
  448. if (get_user_weapon(id) != CSW_DRAGONSWORD || !g_Had_DragonSword[id])
  449. return FMRES_IGNORED
  450.  
  451. static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
  452.  
  453. pev(id, pev_origin, fOrigin)
  454. pev(id, pev_view_ofs, view_ofs)
  455. xs_vec_add(fOrigin, view_ofs, vecStart)
  456. pev(id, pev_v_angle, v_angle)
  457.  
  458. engfunc(EngFunc_MakeVectors, v_angle)
  459. get_global_vector(GL_v_forward, v_forward)
  460.  
  461. if(g_Attack_Mode[id] == ATTACK_SLASH_ROTATE) xs_vec_mul_scalar(v_forward, SLASH_ROTATE_RADIUS, v_forward)
  462. else if(g_Attack_Mode[id] == ATTACK_SLASH_AHEAD) xs_vec_mul_scalar(v_forward, SLASH_AHEAD_RADIUS, v_forward)
  463. else if(g_Attack_Mode[id] == ATTACK_STAB) xs_vec_mul_scalar(v_forward, STAB_RADIUS, v_forward)
  464. else xs_vec_mul_scalar(v_forward, 0.0, v_forward)
  465. xs_vec_add(vecStart, v_forward, vecEnd)
  466.  
  467. engfunc(EngFunc_TraceLine, vecStart, vecEnd, ignored_monster, id, handle)
  468.  
  469. return FMRES_SUPERCEDE
  470. }
  471.  
  472. public fw_TraceHull(Float:vector_start[3], Float:vector_end[3], ignored_monster, hull, id, handle)
  473. {
  474. if (!is_user_alive(id))
  475. return FMRES_IGNORED
  476. if (get_user_weapon(id) != CSW_DRAGONSWORD || !g_Had_DragonSword[id])
  477. return FMRES_IGNORED
  478.  
  479. static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
  480.  
  481. pev(id, pev_origin, fOrigin)
  482. pev(id, pev_view_ofs, view_ofs)
  483. xs_vec_add(fOrigin, view_ofs, vecStart)
  484. pev(id, pev_v_angle, v_angle)
  485.  
  486. engfunc(EngFunc_MakeVectors, v_angle)
  487. get_global_vector(GL_v_forward, v_forward)
  488.  
  489. if(g_Attack_Mode[id] == ATTACK_SLASH_ROTATE) xs_vec_mul_scalar(v_forward, SLASH_ROTATE_RADIUS, v_forward)
  490. else if(g_Attack_Mode[id] == ATTACK_SLASH_AHEAD) xs_vec_mul_scalar(v_forward, SLASH_AHEAD_RADIUS, v_forward)
  491. else if(g_Attack_Mode[id] == ATTACK_STAB) xs_vec_mul_scalar(v_forward, STAB_RADIUS, v_forward)
  492. else xs_vec_mul_scalar(v_forward, 0.0, v_forward)
  493. xs_vec_add(vecStart, v_forward, vecEnd)
  494.  
  495. engfunc(EngFunc_TraceHull, vecStart, vecEnd, ignored_monster, hull, id, handle)
  496.  
  497. return FMRES_SUPERCEDE
  498. }
  499.  
  500. public fw_PlayerTraceAttack(Victim, Attacker, Float:Damage, Float:Direction[3], TraceResult, DamageBits)
  501. {
  502. if(!is_user_alive(Attacker))
  503. return HAM_IGNORED
  504. if(!g_Had_DragonSword[Attacker] || !g_Checking_Mode[Attacker])
  505. return HAM_IGNORED
  506.  
  507. return HAM_SUPERCEDE
  508. }
  509.  
  510. do_attack(Attacker, Victim, Inflictor, Float:fDamage)
  511. {
  512. fake_player_trace_attack(Attacker, Victim, fDamage)
  513. fake_take_damage(Attacker, Victim, fDamage, Inflictor)
  514. }
  515.  
  516. fake_player_trace_attack(iAttacker, iVictim, &Float:fDamage)
  517. {
  518. // get fDirection
  519. new Float:fAngles[3], Float:fDirection[3]
  520. pev(iAttacker, pev_angles, fAngles)
  521. angle_vector(fAngles, ANGLEVECTOR_FORWARD, fDirection)
  522.  
  523. // get fStart
  524. new Float:fStart[3], Float:fViewOfs[3]
  525. pev(iAttacker, pev_origin, fStart)
  526. pev(iAttacker, pev_view_ofs, fViewOfs)
  527. xs_vec_add(fViewOfs, fStart, fStart)
  528.  
  529. // get aimOrigin
  530. new iAimOrigin[3], Float:fAimOrigin[3]
  531. get_user_origin(iAttacker, iAimOrigin, 3)
  532. IVecFVec(iAimOrigin, fAimOrigin)
  533.  
  534. // TraceLine from fStart to AimOrigin
  535. new ptr = create_tr2()
  536. engfunc(EngFunc_TraceLine, fStart, fAimOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr)
  537. new pHit = get_tr2(ptr, TR_pHit)
  538. new iHitgroup = get_tr2(ptr, TR_iHitgroup)
  539. new Float:fEndPos[3]
  540. get_tr2(ptr, TR_vecEndPos, fEndPos)
  541.  
  542. // get target & body at aiming
  543. new iTarget, iBody
  544. get_user_aiming(iAttacker, iTarget, iBody)
  545.  
  546. // if aiming find target is iVictim then update iHitgroup
  547. if (iTarget == iVictim)
  548. {
  549. iHitgroup = iBody
  550. }
  551.  
  552. // if ptr find target not is iVictim
  553. else if (pHit != iVictim)
  554. {
  555. // get AimOrigin in iVictim
  556. new Float:fVicOrigin[3], Float:fVicViewOfs[3], Float:fAimInVictim[3]
  557. pev(iVictim, pev_origin, fVicOrigin)
  558. pev(iVictim, pev_view_ofs, fVicViewOfs)
  559. xs_vec_add(fVicViewOfs, fVicOrigin, fAimInVictim)
  560. fAimInVictim[2] = fStart[2]
  561. fAimInVictim[2] += get_distance_f(fStart, fAimInVictim) * floattan( fAngles[0] * 2.0, degrees )
  562.  
  563. // check aim in size of iVictim
  564. new iAngleToVictim = get_angle_to_target(iAttacker, fVicOrigin)
  565. iAngleToVictim = abs(iAngleToVictim)
  566. new Float:fDis = 2.0 * get_distance_f(fStart, fAimInVictim) * floatsin( float(iAngleToVictim) * 0.5, degrees )
  567. new Float:fVicSize[3]
  568. pev(iVictim, pev_size , fVicSize)
  569. if ( fDis <= fVicSize[0] * 0.5 )
  570. {
  571. // TraceLine from fStart to aimOrigin in iVictim
  572. new ptr2 = create_tr2()
  573. engfunc(EngFunc_TraceLine, fStart, fAimInVictim, DONT_IGNORE_MONSTERS, iAttacker, ptr2)
  574. new pHit2 = get_tr2(ptr2, TR_pHit)
  575. new iHitgroup2 = get_tr2(ptr2, TR_iHitgroup)
  576.  
  577. // if ptr2 find target is iVictim
  578. if ( pHit2 == iVictim && (iHitgroup2 != HIT_HEAD || fDis <= fVicSize[0] * 0.25) )
  579. {
  580. pHit = iVictim
  581. iHitgroup = iHitgroup2
  582. get_tr2(ptr2, TR_vecEndPos, fEndPos)
  583. }
  584.  
  585. free_tr2(ptr2)
  586. }
  587.  
  588. // if pHit still not is iVictim then set default HitGroup
  589. if (pHit != iVictim)
  590. {
  591. // set default iHitgroup
  592. iHitgroup = HIT_GENERIC
  593.  
  594. new ptr3 = create_tr2()
  595. engfunc(EngFunc_TraceLine, fStart, fVicOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr3)
  596. get_tr2(ptr3, TR_vecEndPos, fEndPos)
  597.  
  598. // free ptr3
  599. free_tr2(ptr3)
  600. }
  601. }
  602.  
  603. // set new Hit & Hitgroup & EndPos
  604. set_tr2(ptr, TR_pHit, iVictim)
  605. set_tr2(ptr, TR_iHitgroup, iHitgroup)
  606. set_tr2(ptr, TR_vecEndPos, fEndPos)
  607.  
  608. // hitgroup multi fDamage
  609. new Float:fMultifDamage
  610. switch(iHitgroup)
  611. {
  612. case HIT_HEAD: fMultifDamage = 4.0
  613. case HIT_STOMACH: fMultifDamage = 1.25
  614. case HIT_LEFTLEG: fMultifDamage = 0.75
  615. case HIT_RIGHTLEG: fMultifDamage = 0.75
  616. default: fMultifDamage = 1.0
  617. }
  618.  
  619. fDamage *= fMultifDamage
  620.  
  621. // ExecuteHam
  622. fake_trake_attack(iAttacker, iVictim, fDamage, fDirection, ptr)
  623.  
  624. // free ptr
  625. free_tr2(ptr)
  626. }
  627.  
  628. stock fake_trake_attack(iAttacker, iVictim, Float:fDamage, Float:fDirection[3], iTraceHandle, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
  629. {
  630. ExecuteHamB(Ham_TraceAttack, iVictim, iAttacker, fDamage, fDirection, iTraceHandle, iDamageBit)
  631. }
  632.  
  633. stock fake_take_damage(iAttacker, iVictim, Float:fDamage, iInflictor = 0, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
  634. {
  635. iInflictor = (!iInflictor) ? iAttacker : iInflictor
  636. ExecuteHamB(Ham_TakeDamage, iVictim, iInflictor, iAttacker, fDamage, iDamageBit)
  637. }
  638.  
  639. stock get_angle_to_target(id, const Float:fTarget[3], Float:TargetSize = 0.0)
  640. {
  641. new Float:fOrigin[3], iAimOrigin[3], Float:fAimOrigin[3], Float:fV1[3]
  642. pev(id, pev_origin, fOrigin)
  643. get_user_origin(id, iAimOrigin, 3) // end position from eyes
  644. IVecFVec(iAimOrigin, fAimOrigin)
  645. xs_vec_sub(fAimOrigin, fOrigin, fV1)
  646.  
  647. new Float:fV2[3]
  648. xs_vec_sub(fTarget, fOrigin, fV2)
  649.  
  650. new iResult = get_angle_between_vectors(fV1, fV2)
  651.  
  652. if (TargetSize > 0.0)
  653. {
  654. new Float:fTan = TargetSize / get_distance_f(fOrigin, fTarget)
  655. new fAngleToTargetSize = floatround( floatatan(fTan, degrees) )
  656. iResult -= (iResult > 0) ? fAngleToTargetSize : -fAngleToTargetSize
  657. }
  658.  
  659. return iResult
  660. }
  661.  
  662. stock get_angle_between_vectors(const Float:fV1[3], const Float:fV2[3])
  663. {
  664. new Float:fA1[3], Float:fA2[3]
  665. engfunc(EngFunc_VecToAngles, fV1, fA1)
  666. engfunc(EngFunc_VecToAngles, fV2, fA2)
  667.  
  668. new iResult = floatround(fA1[1] - fA2[1])
  669. iResult = iResult % 360
  670. iResult = (iResult > 180) ? (iResult - 360) : iResult
  671.  
  672. return iResult
  673. }
  674.  
  675. stock fm_cs_get_weapon_ent_owner(ent)
  676. {
  677. if (pev_valid(ent) != PDATA_SAFE)
  678. return -1
  679.  
  680. return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS)
  681. }
  682.  
  683. stock set_weapon_anim(id, anim)
  684. {
  685. if(!is_user_alive(id))
  686. return
  687.  
  688. set_pev(id, pev_weaponanim, anim)
  689.  
  690. message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id)
  691. write_byte(anim)
  692. write_byte(0)
  693. message_end()
  694. }
  695.  
  696. stock set_weapons_timeidle(id, WeaponId ,Float:TimeIdle)
  697. {
  698. if(!is_user_alive(id))
  699. return
  700.  
  701. static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
  702. if(!pev_valid(entwpn))
  703. return
  704.  
  705. set_pdata_float(entwpn, 46, TimeIdle, OFFSET_LINUX_WEAPONS)
  706. set_pdata_float(entwpn, 47, TimeIdle, OFFSET_LINUX_WEAPONS)
  707. set_pdata_float(entwpn, 48, TimeIdle + 0.5, OFFSET_LINUX_WEAPONS)
  708. }
  709.  
  710. stock set_player_nextattack(id, Float:nexttime)
  711. {
  712. if(!is_user_alive(id))
  713. return
  714.  
  715. set_pdata_float(id, m_flNextAttack, nexttime, 5)
  716. }
  717.  
  718. stock is_valid_entity(ent)
  719. {
  720. if(pev_valid(ent) != PDATA_SAFE)
  721. return 0
  722.  
  723. return 1
  724. }
  725.  
  726. stock get_position(ent, Float:forw, Float:right, Float:up, Float:vStart[])
  727. {
  728. static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
  729.  
  730. pev(ent, pev_origin, vOrigin)
  731. pev(ent, pev_view_ofs,vUp) //for player
  732. xs_vec_add(vOrigin,vUp,vOrigin)
  733. pev(ent, pev_v_angle, vAngle) // if normal entity ,use pev_angles
  734.  
  735. angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
  736. angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
  737. angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
  738.  
  739. vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
  740. vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
  741. vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
  742. }
  743.  
  744.  
  745. stock is_wall_between_points(Float:start[3], Float:end[3], ignore_ent)
  746. {
  747. static ptr
  748. ptr = create_tr2()
  749.  
  750. engfunc(EngFunc_TraceLine, start, end, IGNORE_MONSTERS, ignore_ent, ptr)
  751.  
  752. static Float:EndPos[3]
  753. get_tr2(ptr, TR_vecEndPos, EndPos)
  754.  
  755. free_tr2(ptr)
  756. return floatround(get_distance_f(end, EndPos))
  757. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement