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