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 <zombieplague>
  8.  
  9. #define PLUGIN "[ZP] Extra Item: AT4CS"
  10. #define VERSION "1.0"
  11. #define AUTHOR "Dias"
  12.  
  13. #define weapon_at4cs "weapon_m249"
  14. #define CSW_AT4CS CSW_M249
  15.  
  16. #define TASK_CHECKRELOAD 111112
  17. #define TASK_RELOAD 111113
  18.  
  19. new g_at4cs
  20. new g_had_at4cs[33], Float:g_lastfire[33], Float:g_lastaim[33], g_aiming[33],
  21. g_smoke_id, g_spr_trail, g_spr_exp, is_reloading[33],
  22. cvar_radius, cvar_maxdamage
  23.  
  24. new const v_model[] = "models/zombie_plague/v_at4ex.mdl"
  25. new const p_model[] = "models/zombie_plague/p_at4ex.mdl"
  26. new const w_model[] = "models/zombie_plague/w_at4ex.mdl"
  27. new const s_model[] = "models/zombie_plague/s_rocket.mdl"
  28.  
  29. new const at4cs_sound[5][] = {
  30. "weapons/at4-1.wav", // Fire Sound
  31. "weapons/at4_clipin1.wav", // Clip in 1
  32. "weapons/at4_clipin2.wav", // Clip in 2
  33. "weapons/at4_clipin3.wav", // Clip in 3
  34. "weapons/at4_draw.wav" // Draw
  35. }
  36.  
  37. public plugin_init()
  38. {
  39. register_plugin(PLUGIN, VERSION, AUTHOR)
  40.  
  41. register_event("CurWeapon", "event_curweapon", "be", "1=1")
  42. register_event("HLTV", "event_newround", "a", "1=0", "2=0")
  43.  
  44. register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
  45. register_forward(FM_CmdStart, "fw_CmdStart")
  46. register_forward(FM_SetModel, "fw_SetModel")
  47.  
  48. register_think("at4ex_rocket", "fw_rocket_think")
  49. register_touch("at4ex_rocket", "*", "fw_rocket_touch")
  50.  
  51. RegisterHam(Ham_Weapon_Reload, weapon_at4cs, "fw_WeaponReload")
  52. RegisterHam(Ham_Item_AddToPlayer, weapon_at4cs, "fw_AddToPlayer", 1)
  53.  
  54. cvar_radius = register_cvar("zp_at4cs_radius", "400.0")
  55. cvar_maxdamage = register_cvar("zp_at4cs_maxdamage", "1250.0")
  56.  
  57. g_at4cs = zp_register_extra_item("AT4CS", 38, ZP_TEAM_HUMAN)
  58.  
  59. register_clcmd("weapon_at4cs", "hook_weapon")
  60. }
  61.  
  62. public hook_weapon(id)
  63. {
  64. engclient_cmd(id, weapon_at4cs)
  65. return PLUGIN_HANDLED
  66. }
  67.  
  68. public plugin_precache()
  69. {
  70. engfunc(EngFunc_PrecacheModel, v_model)
  71. engfunc(EngFunc_PrecacheModel, p_model)
  72. engfunc(EngFunc_PrecacheModel, w_model)
  73. engfunc(EngFunc_PrecacheModel, s_model)
  74.  
  75. engfunc(EngFunc_PrecacheGeneric, "sprites/weapon_at4cs.txt")
  76. engfunc(EngFunc_PrecacheGeneric, "sprites/at4cs.spr")
  77.  
  78. g_smoke_id = engfunc(EngFunc_PrecacheModel, "sprites/effects/rainsplash.spr")
  79. g_spr_trail = engfunc(EngFunc_PrecacheModel,"sprites/xbeam3.spr")
  80. g_spr_exp = engfunc(EngFunc_PrecacheModel,"sprites/zerogxplode.spr")
  81.  
  82. for(new i = 0; i < sizeof(at4cs_sound); i++)
  83. engfunc(EngFunc_PrecacheSound, at4cs_sound[i])
  84. }
  85.  
  86. public zp_extra_item_selected(id, itemid)
  87. {
  88. if(itemid != g_at4cs)
  89. return PLUGIN_HANDLED
  90.  
  91. g_had_at4cs[id] = 1
  92. is_reloading[id] = 0
  93. g_aiming[id] = 0
  94.  
  95. fm_give_item(id, weapon_at4cs)
  96.  
  97. static at4cs
  98. at4cs = fm_get_user_weapon_entity(id, CSW_AT4CS)
  99.  
  100. cs_set_weapon_ammo(at4cs, 1)
  101. cs_set_user_bpammo(id, CSW_AT4CS, 10)
  102.  
  103. return PLUGIN_CONTINUE
  104. }
  105.  
  106. public zp_user_infected_post(id)
  107. {
  108. g_had_at4cs[id] = 0
  109. is_reloading[id] = 0
  110. g_aiming[id] = 0
  111.  
  112. remove_task(id+TASK_CHECKRELOAD)
  113. remove_task(id+TASK_RELOAD)
  114. }
  115.  
  116. public zp_user_humanized_post(id)
  117. {
  118. g_had_at4cs[id] = 0
  119. is_reloading[id] = 0
  120. g_aiming[id] = 0
  121.  
  122. remove_task(id+TASK_CHECKRELOAD)
  123. remove_task(id+TASK_RELOAD)
  124. }
  125.  
  126. public event_newround()
  127. {
  128. remove_entity_name("at4ex_rocket")
  129.  
  130. for(new i = 0; i < get_maxplayers(); i++)
  131. {
  132. if(is_user_alive(i) && is_user_connected(i))
  133. {
  134. remove_task(i+TASK_CHECKRELOAD)
  135. remove_task(i+TASK_RELOAD)
  136. }
  137. }
  138. }
  139.  
  140. public event_curweapon(id)
  141. {
  142. if(!is_user_alive(id) || !is_user_connected(id))
  143. return PLUGIN_HANDLED
  144.  
  145. if(get_user_weapon(id) != CSW_AT4CS || !g_had_at4cs[id])
  146. return PLUGIN_HANDLED
  147.  
  148. if(zp_get_user_zombie(id) || zp_get_user_survivor(id))
  149. return PLUGIN_HANDLED
  150.  
  151. set_pev(id, pev_viewmodel2, v_model)
  152. set_pev(id, pev_weaponmodel2, p_model)
  153.  
  154. return PLUGIN_CONTINUE
  155. }
  156.  
  157. public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
  158. {
  159. if(!is_user_alive(id) || !is_user_connected(id))
  160. return FMRES_IGNORED
  161.  
  162. if(get_user_weapon(id) != CSW_AT4CS || !g_had_at4cs[id])
  163. return FMRES_IGNORED
  164.  
  165. if(zp_get_user_zombie(id) || zp_get_user_survivor(id))
  166. return FMRES_IGNORED
  167.  
  168. set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001)
  169.  
  170. return FMRES_HANDLED
  171. }
  172.  
  173. public fw_AddToPlayer(ent, id)
  174. {
  175. if(!is_valid_ent(ent) || !is_user_alive(id))
  176. return HAM_IGNORED
  177.  
  178. if(zp_get_user_zombie(id) || zp_get_user_survivor(id))
  179. return HAM_IGNORED
  180.  
  181. if(entity_get_int(ent, EV_INT_impulse) == 61296)
  182. {
  183. g_had_at4cs[id] = 1
  184. entity_set_int(id, EV_INT_impulse, 0)
  185.  
  186. return HAM_HANDLED
  187. }
  188.  
  189. if(g_had_at4cs[id])
  190. {
  191. message_begin(MSG_ONE, get_user_msgid("WeaponList"), _, id)
  192. write_string("weapon_at4cs"); // WeaponName
  193. write_byte(3) // PrimaryAmmoID
  194. write_byte(1) // PrimaryAmmoMaxAmount
  195. write_byte(-1) // SecondaryAmmoID
  196. write_byte(-1) // SecondaryAmmoMaxAmount
  197. write_byte(0) // SlotID (0...N)
  198. write_byte(4) // NumberInSlot (1...N)
  199. write_byte(CSW_AT4CS) // WeaponID
  200. write_byte(0) // Flags
  201. message_end()
  202. }
  203.  
  204. return HAM_HANDLED
  205. }
  206.  
  207. public fw_CmdStart(id, uc_handle, seed)
  208. {
  209. if(!is_user_alive(id) || !is_user_connected(id))
  210. return FMRES_IGNORED
  211.  
  212. if(get_user_weapon(id) != CSW_AT4CS || !g_had_at4cs[id])
  213. return FMRES_IGNORED
  214.  
  215. if(zp_get_user_zombie(id) || zp_get_user_survivor(id))
  216. return FMRES_IGNORED
  217.  
  218. static CurButton
  219. CurButton = get_uc(uc_handle, UC_Buttons)
  220.  
  221. if(CurButton & IN_ATTACK)
  222. {
  223. static Float:CurTime
  224. CurTime = get_gametime()
  225.  
  226. static at4cs
  227. at4cs = fm_find_ent_by_owner(-1, weapon_at4cs, id)
  228.  
  229. if(cs_get_weapon_ammo(at4cs) > 0 && !is_reloading[id])
  230. {
  231. if(CurTime - 4.5 > g_lastfire[id])
  232. {
  233. set_weapon_anim(id, 1)
  234. emit_sound(id, CHAN_WEAPON, at4cs_sound[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
  235.  
  236. create_rocket(id)
  237.  
  238. static Float:Punch_Angles[3]
  239.  
  240. Punch_Angles[0] = -20.0
  241. Punch_Angles[1] = 0.0
  242. Punch_Angles[2] = 0.0
  243.  
  244. set_pev(id, pev_punchangle, Punch_Angles)
  245. cs_set_weapon_ammo(at4cs, cs_get_weapon_ammo(at4cs) - 1)
  246.  
  247. if(cs_get_weapon_ammo(at4cs) <= 0 && !is_reloading[id])
  248. {
  249. if(cs_get_user_bpammo(id, CSW_AT4CS) > 0)
  250. {
  251. set_task(1.0, "at4cs_reload", id)
  252. }
  253. }
  254.  
  255. if(cs_get_user_zoom(id))
  256. cs_set_user_zoom(id, CS_RESET_ZOOM, 1)
  257.  
  258. g_lastfire[id] = CurTime
  259. }
  260. } else {
  261. if(!is_reloading[id])
  262. {
  263. if(cs_get_user_bpammo(id, CSW_AT4CS) > 0)
  264. {
  265. if(CurTime - 1.0 > g_lastfire[id])
  266. {
  267. at4cs_reload(id)
  268. g_lastfire[id] = CurTime
  269. }
  270. }
  271. }
  272. }
  273. }
  274.  
  275. if(CurButton & IN_ATTACK2)
  276. {
  277. static Float:CurTime
  278. CurTime = get_gametime()
  279.  
  280. if((CurTime - 0.5 > g_lastaim[id]) && !is_reloading[id])
  281. {
  282. if(!g_aiming[id])
  283. {
  284. cs_set_user_zoom(id, CS_SET_FIRST_ZOOM, 1)
  285. g_aiming[id] = 1
  286. } else {
  287. cs_set_user_zoom(id, CS_RESET_ZOOM, 1)
  288. g_aiming[id] = 0
  289. }
  290.  
  291. g_lastaim[id] = CurTime
  292. }
  293. }
  294.  
  295. CurButton &= ~IN_ATTACK
  296. set_uc(uc_handle, UC_Buttons, CurButton)
  297.  
  298. CurButton &= ~IN_RELOAD
  299. set_uc(uc_handle, UC_Buttons, CurButton)
  300.  
  301. return FMRES_HANDLED
  302. }
  303.  
  304. public fw_SetModel(ent, const model[])
  305. {
  306. if(!is_valid_ent(ent))
  307. return FMRES_IGNORED
  308.  
  309. static szClassName[33]
  310. entity_get_string(ent, EV_SZ_classname, szClassName, charsmax(szClassName))
  311.  
  312. if(!equal(szClassName, "weaponbox"))
  313. return FMRES_IGNORED
  314.  
  315. static iOwner
  316. iOwner = entity_get_edict(ent, EV_ENT_owner)
  317.  
  318. if(equal(model, "models/w_m249.mdl"))
  319. {
  320. static at4cs
  321. at4cs = find_ent_by_owner(-1, "weapon_m249", ent)
  322.  
  323. if(!is_valid_ent(at4cs))
  324. return FMRES_IGNORED;
  325.  
  326. if(g_had_at4cs[iOwner])
  327. {
  328. entity_set_int(at4cs, EV_INT_impulse, 61296)
  329. g_had_at4cs[iOwner] = 0
  330. entity_set_model(ent, w_model)
  331.  
  332. return FMRES_SUPERCEDE
  333. }
  334. }
  335.  
  336. return FMRES_IGNORED
  337. }
  338.  
  339. public at4cs_reload(id)
  340. {
  341. if(is_reloading[id])
  342. return
  343.  
  344. is_reloading[id] = 1
  345. set_weapon_anim(id, 3)
  346.  
  347. set_task(0.1, "checking_reload", id+TASK_CHECKRELOAD, _, _, "b")
  348. set_task(4.0, "reload_complete", id+TASK_RELOAD)
  349. }
  350.  
  351. public checking_reload(id)
  352. {
  353. id -= TASK_CHECKRELOAD
  354.  
  355. if(cs_get_user_zoom(id))
  356. cs_set_user_zoom(id, CS_RESET_ZOOM, 1)
  357.  
  358. if(get_user_weapon(id) != CSW_AT4CS || !g_had_at4cs[id])
  359. {
  360. remove_task(id+TASK_CHECKRELOAD)
  361. remove_task(id+TASK_RELOAD)
  362.  
  363. is_reloading[id] = 0
  364. }
  365. }
  366.  
  367. public reload_complete(id)
  368. {
  369. id -= TASK_RELOAD
  370.  
  371. if(!is_reloading[id])
  372. return
  373.  
  374. remove_task(id+TASK_CHECKRELOAD)
  375.  
  376. static at4cs
  377. at4cs = fm_find_ent_by_owner(-1, weapon_at4cs, id)
  378.  
  379. cs_set_weapon_ammo(at4cs, 1)
  380. cs_set_user_bpammo(id, CSW_AT4CS, cs_get_user_bpammo(id, CSW_AT4CS) - 1)
  381. is_reloading[id] = 0
  382. }
  383.  
  384. public fw_WeaponReload(ent)
  385. {
  386. static id
  387. id = pev(ent, pev_owner)
  388.  
  389. if(!is_user_alive(id) || !is_user_connected(id))
  390. return HAM_IGNORED
  391.  
  392. if(get_user_weapon(id) != CSW_AT4CS || !g_had_at4cs[id])
  393. return HAM_IGNORED
  394.  
  395. if(zp_get_user_zombie(id) || zp_get_user_survivor(id))
  396. return HAM_IGNORED
  397.  
  398. static Float:CurTime
  399. CurTime = get_gametime()
  400.  
  401. if(!is_reloading[id])
  402. {
  403. if(cs_get_user_bpammo(id, CSW_AT4CS) > 0)
  404. {
  405. if(CurTime - 1.0 > g_lastfire[id])
  406. {
  407. at4cs_reload(id)
  408. g_lastfire[id] = CurTime
  409. }
  410. }
  411. }
  412.  
  413. return HAM_SUPERCEDE
  414. }
  415.  
  416. public create_rocket(id)
  417. {
  418. new ent, Float:Origin[3], Float:Angles[3], Float:Velocity[3]
  419.  
  420. ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
  421. engfunc(EngFunc_GetAttachment, id, 0, Origin, Angles)
  422. pev(id, pev_angles, Angles)
  423.  
  424. set_pev(ent, pev_origin, Origin)
  425. set_pev(ent, pev_angles, Angles)
  426. set_pev(ent, pev_solid, 2)
  427. set_pev(ent, pev_movetype, 5)
  428. set_pev(ent, pev_classname, "at4ex_rocket")
  429. set_pev(ent, pev_owner, id)
  430. engfunc(EngFunc_SetModel, ent, s_model)
  431.  
  432. set_pev(ent, pev_mins, {-1.0, -1.0, -1.0})
  433. set_pev(ent, pev_maxs, {1.0, 1.0, 1.0})
  434.  
  435. velocity_by_aim(id, 1750, Velocity)
  436. set_pev(ent, pev_velocity, Velocity)
  437.  
  438. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  439. write_byte(TE_BEAMFOLLOW) // TE id
  440. write_short(ent) // entity:attachment to follow
  441. write_short(g_spr_trail) // sprite index
  442. write_byte(25) // life in 0.1's
  443. write_byte(2) // line width in 0.1's
  444. write_byte(255) // r
  445. write_byte(255) // g
  446. write_byte(255) // b
  447. write_byte(200) // brightness
  448. message_end()
  449.  
  450. set_pev(ent, pev_iuser4, 0)
  451. set_pev(ent, pev_nextthink, halflife_time() + 0.1)
  452. }
  453.  
  454. public fw_rocket_think(ent)
  455. {
  456. if(!pev_valid(ent))
  457. return
  458.  
  459. static Float:Origin[3]
  460. pev(ent, pev_origin, Origin)
  461.  
  462. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  463. write_byte(TE_SPRITE)
  464. engfunc(EngFunc_WriteCoord, Origin[0])
  465. engfunc(EngFunc_WriteCoord, Origin[1])
  466. engfunc(EngFunc_WriteCoord, Origin[2])
  467. write_short(g_smoke_id)
  468. write_byte(2)
  469. write_byte(200)
  470. message_end()
  471.  
  472. if(pev(ent, pev_iuser4) == 0)
  473. {
  474. static Victim
  475. Victim = FindClosesEnemy(ent)
  476.  
  477. if(is_user_alive(Victim))
  478. {
  479. set_pev(ent, pev_iuser4, Victim)
  480. }
  481. } else {
  482. static Victim
  483. Victim = pev(ent, pev_iuser4)
  484.  
  485. if(is_user_alive(Victim))
  486. {
  487. static Float:VicOrigin[3]
  488. pev(Victim, pev_origin, VicOrigin)
  489.  
  490. turn_to_target(ent, Origin, Victim, VicOrigin)
  491. hook_ent(ent, Victim, 500.0)
  492. } else {
  493. set_pev(ent, pev_iuser4, 0)
  494. }
  495. }
  496.  
  497. set_pev(ent, pev_nextthink, halflife_time() + 0.075)
  498. }
  499.  
  500. public fw_rocket_touch(rocket, touch)
  501. {
  502. if(!pev_valid(rocket))
  503. return
  504.  
  505. if(is_user_alive(touch) && pev(rocket, pev_owner) == touch)
  506. return
  507.  
  508. static Float:Origin[3]
  509. pev(rocket, pev_origin, Origin)
  510.  
  511. message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
  512. write_byte(TE_EXPLOSION)
  513. engfunc(EngFunc_WriteCoord, Origin[0])
  514. engfunc(EngFunc_WriteCoord, Origin[1])
  515. engfunc(EngFunc_WriteCoord, Origin[2])
  516. write_short(g_spr_exp) // sprite index
  517. write_byte(20) // scale in 0.1's
  518. write_byte(30) // framerate
  519. write_byte(0) // flags
  520. message_end()
  521.  
  522. static owner, iVictim
  523.  
  524. iVictim = -1
  525. owner = pev(rocket, pev_owner)
  526.  
  527. while((iVictim = find_ent_in_sphere(iVictim, Origin, get_pcvar_float(cvar_radius))) != 0)
  528. {
  529. if((0 < iVictim < 32) && is_user_alive(iVictim)
  530. && iVictim != owner && zp_get_user_zombie(iVictim))
  531. {
  532. new Float:MaxDamage, Float:Damage
  533.  
  534. MaxDamage = get_pcvar_float(cvar_maxdamage)
  535. Damage = random_float(MaxDamage - random_float(0.0, 100.0), MaxDamage + random_float(0.0, 100.0))
  536.  
  537. ExecuteHam(Ham_TakeDamage, iVictim, 0, owner, 0, DMG_BULLET)
  538.  
  539. static health
  540. health = get_user_health(iVictim)
  541.  
  542. if(health - Damage >= 1)
  543. {
  544. fm_set_user_health(iVictim, health - floatround(Damage))
  545. }
  546. else
  547. {
  548. death_message(owner, iVictim, 1)
  549. }
  550. }
  551. }
  552.  
  553. engfunc(EngFunc_RemoveEntity, rocket)
  554. }
  555.  
  556. stock set_weapon_anim(id, anim)
  557. {
  558. set_pev(id, pev_weaponanim, anim)
  559.  
  560. message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id)
  561. write_byte(anim)
  562. write_byte(pev(id,pev_body))
  563. message_end()
  564. }
  565.  
  566. stock death_message(Killer, Victim, ScoreBoard)
  567. {
  568. // Block death msg
  569. set_msg_block(get_user_msgid("DeathMsg"), BLOCK_SET)
  570. ExecuteHamB(Ham_Killed, Victim, Killer, 2)
  571. set_msg_block(get_user_msgid("DeathMsg"), BLOCK_NOT)
  572.  
  573. // Death
  574. make_deathmsg(Killer, Victim, 0, "")
  575.  
  576. // Update score board
  577. if (ScoreBoard)
  578. {
  579. message_begin(MSG_BROADCAST, get_user_msgid("ScoreInfo"))
  580. write_byte(Killer) // id
  581. write_short(pev(Killer, pev_frags)) // frags
  582. write_short(cs_get_user_deaths(Killer)) // deaths
  583. write_short(0) // class?
  584. write_short(get_user_team(Killer)) // team
  585. message_end()
  586.  
  587. message_begin(MSG_BROADCAST, get_user_msgid("ScoreInfo"))
  588. write_byte(Victim) // id
  589. write_short(pev(Victim, pev_frags)) // frags
  590. write_short(cs_get_user_deaths(Victim)) // deaths
  591. write_short(0) // class?
  592. write_short(get_user_team(Victim)) // team
  593. message_end()
  594. }
  595. }
  596.  
  597. stock FindClosesEnemy(entid)
  598. {
  599. new Float:Dist
  600. new Float:maxdistance=300.0
  601. new indexid=0
  602. for(new i=1;i<=get_maxplayers();i++){
  603. if(is_user_alive(i) && is_valid_ent(i) && can_see_fm(entid, i)
  604. && pev(entid, pev_owner) != i && cs_get_user_team(pev(entid, pev_owner)) != cs_get_user_team(i))
  605. {
  606. Dist = entity_range(entid, i)
  607. if(Dist <= maxdistance)
  608. {
  609. maxdistance=Dist
  610. indexid=i
  611.  
  612. return indexid
  613. }
  614. }
  615. }
  616. return 0
  617. }
  618.  
  619. stock bool:can_see_fm(entindex1, entindex2)
  620. {
  621. if (!entindex1 || !entindex2)
  622. return false
  623.  
  624. if (pev_valid(entindex1) && pev_valid(entindex1))
  625. {
  626. new flags = pev(entindex1, pev_flags)
  627. if (flags & EF_NODRAW || flags & FL_NOTARGET)
  628. {
  629. return false
  630. }
  631.  
  632. new Float:lookerOrig[3]
  633. new Float:targetBaseOrig[3]
  634. new Float:targetOrig[3]
  635. new Float:temp[3]
  636.  
  637. pev(entindex1, pev_origin, lookerOrig)
  638. pev(entindex1, pev_view_ofs, temp)
  639. lookerOrig[0] += temp[0]
  640. lookerOrig[1] += temp[1]
  641. lookerOrig[2] += temp[2]
  642.  
  643. pev(entindex2, pev_origin, targetBaseOrig)
  644. pev(entindex2, pev_view_ofs, temp)
  645. targetOrig[0] = targetBaseOrig [0] + temp[0]
  646. targetOrig[1] = targetBaseOrig [1] + temp[1]
  647. targetOrig[2] = targetBaseOrig [2] + temp[2]
  648.  
  649. engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) // checks the had of seen player
  650. if (get_tr2(0, TraceResult:TR_InOpen) && get_tr2(0, TraceResult:TR_InWater))
  651. {
  652. return false
  653. }
  654. else
  655. {
  656. new Float:flFraction
  657. get_tr2(0, TraceResult:TR_flFraction, flFraction)
  658. if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
  659. {
  660. return true
  661. }
  662. else
  663. {
  664. targetOrig[0] = targetBaseOrig [0]
  665. targetOrig[1] = targetBaseOrig [1]
  666. targetOrig[2] = targetBaseOrig [2]
  667. engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) // checks the body of seen player
  668. get_tr2(0, TraceResult:TR_flFraction, flFraction)
  669. if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
  670. {
  671. return true
  672. }
  673. else
  674. {
  675. targetOrig[0] = targetBaseOrig [0]
  676. targetOrig[1] = targetBaseOrig [1]
  677. targetOrig[2] = targetBaseOrig [2] - 17.0
  678. engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) // checks the legs of seen player
  679. get_tr2(0, TraceResult:TR_flFraction, flFraction)
  680. if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
  681. {
  682. return true
  683. }
  684. }
  685. }
  686. }
  687. }
  688. return false
  689. }
  690.  
  691. stock turn_to_target(ent, Float:Ent_Origin[3], target, Float:Vic_Origin[3])
  692. {
  693. if(target)
  694. {
  695. new Float:newAngle[3]
  696. entity_get_vector(ent, EV_VEC_angles, newAngle)
  697. new Float:x = Vic_Origin[0] - Ent_Origin[0]
  698. new Float:z = Vic_Origin[1] - Ent_Origin[1]
  699.  
  700. new Float:radians = floatatan(z/x, radian)
  701. newAngle[1] = radians * (180 / 3.14)
  702. if (Vic_Origin[0] < Ent_Origin[0])
  703. newAngle[1] -= 180.0
  704.  
  705. entity_set_vector(ent, EV_VEC_angles, newAngle)
  706. }
  707. }
  708.  
  709. stock hook_ent(ent, victim, Float:speed)
  710. {
  711. static Float:fl_Velocity[3]
  712. static Float:VicOrigin[3], Float:EntOrigin[3]
  713.  
  714. pev(ent, pev_origin, EntOrigin)
  715. pev(victim, pev_origin, VicOrigin)
  716.  
  717. static Float:distance_f
  718. distance_f = get_distance_f(EntOrigin, VicOrigin)
  719.  
  720. if (distance_f > 10.0)
  721. {
  722. new Float:fl_Time = distance_f / speed
  723.  
  724. fl_Velocity[0] = (VicOrigin[0] - EntOrigin[0]) / fl_Time
  725. fl_Velocity[1] = (VicOrigin[1] - EntOrigin[1]) / fl_Time
  726. fl_Velocity[2] = (VicOrigin[2] - EntOrigin[2]) / fl_Time
  727. } else
  728. {
  729. fl_Velocity[0] = 0.0
  730. fl_Velocity[1] = 0.0
  731. fl_Velocity[2] = 0.0
  732. }
  733.  
  734. entity_set_vector(ent, EV_VEC_velocity, fl_Velocity)
  735. }
  736. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  737. *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1066\\ f0\\ fs16 \n\\ par }
  738. */
  739.