Advertisement
julicr77

needler

Mar 24th, 2016
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.14 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.  
  9. #define PLUGIN "CSO Needler"
  10. #define VERSION "1.0"
  11. #define AUTHOR "Dias"
  12.  
  13. #define V_MODEL "models/v_coilgun.mdl"
  14. #define P_MODEL "models/p_coilgun.mdl"
  15. #define W_MODEL "models/w_coilgun.mdl"
  16.  
  17. #define S_NAIL "models/s_coil.mdl"
  18.  
  19. #define CSW_COILGUN CSW_MP5NAVY
  20. #define weapon_coilgun "weapon_mp5navy"
  21.  
  22. #define WEAPON_EVENT "events/mp5n.sc"
  23. #define OLD_W_MODEL "models/w_mp5.mdl"
  24. #define WEAPON_SECRETCODE 4965
  25. #define NAIL_CLASSNAME "nail"
  26.  
  27. #define DAMAGE 29
  28. #define CLIP 100
  29. #define BPAMMO 200
  30. #define SPEED 4.0
  31. #define NAIL_SPEED 1000.0
  32. #define DRAW_TIME 1.0
  33. #define RELOAD_TIME 3.5
  34.  
  35. #define SMART_NAIL 1 // This is a new feature, added by Dias. If this SMART_NAIL is enabled, the nail will chase the nearest player
  36.  
  37. new const Weapon_Sounds[4][] =
  38. {
  39. "weapons/coilgun-1.wav",
  40. "weapons/coilgun_clipin1.wav",
  41. "weapons/coilgun_clipin2.wav",
  42. "weapons/coilgun_clipout.wav"
  43. }
  44.  
  45. new const Weapon_Resources[3][] =
  46. {
  47. "sprites/weapon_coilgun.txt",
  48. "sprites/640hud3_3.spr",
  49. "sprites/640hud88_2.spr"
  50. }
  51.  
  52. enum
  53. {
  54. ANIM_IDLE = 0,
  55. ANIM_SHOOT1,
  56. ANIM_SHOOT2,
  57. ANIM_RELOAD,
  58. ANIM_DRAW
  59. }
  60.  
  61. new g_had_coilgun[33], g_coilgun_clip[33], g_old_weapon[33]
  62. new g_coilgun_event, g_trail_sprid, g_ham_bot, g_MaxPlayers
  63.  
  64. public plugin_init()
  65. {
  66. register_plugin(PLUGIN, VERSION, AUTHOR)
  67.  
  68. register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
  69.  
  70. register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
  71. register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
  72. register_forward(FM_SetModel, "fw_SetModel")
  73. register_forward(FM_Touch, "fw_Touch")
  74.  
  75. RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack")
  76. RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack")
  77. RegisterHam(Ham_Item_PostFrame, weapon_coilgun, "fw_Item_PostFrame")
  78. RegisterHam(Ham_Weapon_Reload, weapon_coilgun, "fw_Weapon_Reload")
  79. RegisterHam(Ham_Weapon_Reload, weapon_coilgun, "fw_Weapon_Reload_Post", 1)
  80. RegisterHam(Ham_Item_AddToPlayer, weapon_coilgun, "fw_Item_AddToPlayer_Post", 1)
  81.  
  82. g_MaxPlayers = get_maxplayers()
  83.  
  84. register_clcmd("admin_get_needler", "Get_CoilGun", ADMIN_KICK)
  85. register_clcmd("weapon_coilgun", "Hook_Weapon")
  86. }
  87.  
  88. public plugin_precache()
  89. {
  90. engfunc(EngFunc_PrecacheModel, V_MODEL)
  91. engfunc(EngFunc_PrecacheModel, P_MODEL)
  92. engfunc(EngFunc_PrecacheModel, W_MODEL)
  93.  
  94. engfunc(EngFunc_PrecacheModel, S_NAIL)
  95.  
  96. new i
  97. for(i = 0; i < sizeof(Weapon_Sounds); i++)
  98. engfunc(EngFunc_PrecacheSound, Weapon_Sounds[i])
  99. for(i = 0; i < sizeof(Weapon_Resources); i++)
  100. {
  101. if(i == 0) engfunc(EngFunc_PrecacheGeneric, Weapon_Resources[i])
  102. else engfunc(EngFunc_PrecacheModel, Weapon_Resources[i])
  103. }
  104.  
  105. g_trail_sprid = engfunc(EngFunc_PrecacheModel, "sprites/laserbeam.spr")
  106. register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1)
  107. }
  108.  
  109. public fw_PrecacheEvent_Post(type, const name[])
  110. {
  111. if(equal(WEAPON_EVENT, name))
  112. g_coilgun_event = get_orig_retval()
  113. }
  114.  
  115. public Get_CoilGun(id)
  116. {
  117. if(!is_user_alive(id))
  118. return
  119.  
  120. g_had_coilgun[id] = 1
  121. fm_give_item(id, weapon_coilgun)
  122.  
  123. static Ent; Ent = fm_get_user_weapon_entity(id, CSW_COILGUN)
  124. if(pev_valid(Ent)) cs_set_weapon_ammo(Ent, CLIP)
  125.  
  126. cs_set_user_bpammo(id, CSW_COILGUN, BPAMMO)
  127. update_ammo(id, CSW_COILGUN, CLIP, BPAMMO)
  128. }
  129.  
  130. public Remove_CoilGun(id)
  131. {
  132. if(!is_user_connected(id))
  133. return
  134.  
  135. g_had_coilgun[id] = 0
  136. }
  137.  
  138. public Hook_Weapon(id)
  139. {
  140. engclient_cmd(id, weapon_coilgun)
  141. return PLUGIN_HANDLED
  142. }
  143.  
  144. public client_putinserver(id)
  145. {
  146. if(!g_ham_bot && is_user_bot(id))
  147. {
  148. g_ham_bot = 1
  149. set_task(0.1, "Do_Register_HamBot", id)
  150. }
  151. }
  152.  
  153. public Do_Register_HamBot(id)
  154. {
  155. RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack")
  156. }
  157.  
  158. public Event_CurWeapon(id)
  159. {
  160. if(!is_user_alive(id))
  161. return
  162.  
  163. if((get_user_weapon(id) == CSW_COILGUN && g_old_weapon[id] != CSW_COILGUN) && g_had_coilgun[id])
  164. {
  165. set_pev(id, pev_viewmodel2, V_MODEL)
  166. set_pev(id, pev_weaponmodel2, P_MODEL)
  167.  
  168. set_weapon_anim(id, ANIM_DRAW)
  169.  
  170. set_weapon_timeidle(id, CSW_COILGUN, DRAW_TIME)
  171. set_player_nextattack(id, DRAW_TIME)
  172. } else if((get_user_weapon(id) == CSW_COILGUN && g_old_weapon[id] == CSW_COILGUN) && g_had_coilgun[id]) {
  173. static Ent; Ent = fm_get_user_weapon_entity(id, CSW_COILGUN)
  174. if(pev_valid(Ent)) set_pdata_float(Ent, 46, get_pdata_float(Ent, 46, 4) * SPEED, 4)
  175. }
  176.  
  177. g_old_weapon[id] = get_user_weapon(id)
  178. }
  179.  
  180. public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
  181. {
  182. if(!is_user_alive(id) || !is_user_connected(id))
  183. return FMRES_IGNORED
  184. if(get_user_weapon(id) == CSW_COILGUN && g_had_coilgun[id])
  185. set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001)
  186.  
  187. return FMRES_HANDLED
  188. }
  189.  
  190. public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
  191. {
  192. if (!is_user_connected(invoker))
  193. return FMRES_IGNORED
  194. if(get_user_weapon(invoker) != CSW_COILGUN || !g_had_coilgun[invoker])
  195. return FMRES_IGNORED
  196.  
  197. if(eventid == g_coilgun_event)
  198. {
  199. engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
  200.  
  201. set_weapon_anim(invoker, random_num(ANIM_SHOOT1, ANIM_SHOOT1))
  202. emit_sound(invoker, CHAN_WEAPON, Weapon_Sounds[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
  203.  
  204. return FMRES_SUPERCEDE
  205. }
  206.  
  207. return FMRES_HANDLED
  208. }
  209.  
  210. public fw_SetModel(entity, model[])
  211. {
  212. if(!pev_valid(entity))
  213. return FMRES_IGNORED
  214.  
  215. static Classname[32]
  216. pev(entity, pev_classname, Classname, sizeof(Classname))
  217.  
  218. if(!equal(Classname, "weaponbox"))
  219. return FMRES_IGNORED
  220.  
  221. static iOwner
  222. iOwner = pev(entity, pev_owner)
  223.  
  224. if(equal(model, OLD_W_MODEL))
  225. {
  226. static weapon; weapon = fm_find_ent_by_owner(-1, weapon_coilgun, entity)
  227.  
  228. if(!pev_valid(weapon))
  229. return FMRES_IGNORED;
  230.  
  231. if(g_had_coilgun[iOwner])
  232. {
  233. g_had_coilgun[iOwner] = 0
  234.  
  235. set_pev(weapon, pev_impulse, WEAPON_SECRETCODE)
  236. engfunc(EngFunc_SetModel, entity, W_MODEL)
  237.  
  238. return FMRES_SUPERCEDE
  239. }
  240. }
  241.  
  242. return FMRES_IGNORED;
  243. }
  244.  
  245. public fw_Touch(Ent, Id)
  246. {
  247. if(!pev_valid(Ent))
  248. return
  249.  
  250. static Classname[32]; pev(Ent, pev_classname, Classname, sizeof(Classname))
  251. if(!equal(Classname, NAIL_CLASSNAME))
  252. return
  253.  
  254. static ptr; ptr = pev(Ent, pev_iuser4)
  255. static Owner; Owner = pev(Ent, pev_owner)
  256.  
  257. if(!is_user_connected(Owner))
  258. {
  259. engfunc(EngFunc_RemoveEntity, Ent)
  260. free_tr2(ptr)
  261.  
  262. return
  263. }
  264.  
  265. if(pev_valid(Id))
  266. {
  267. static EntGun; EntGun = fm_get_user_weapon_entity(Owner, CSW_COILGUN)
  268.  
  269. do_attack(Owner, Id, EntGun, float(DAMAGE))
  270. engfunc(EngFunc_RemoveEntity, Ent)
  271. } else {
  272. if(pev(Ent, pev_iuser3))
  273. {
  274. static Float:Origin[3], Float:Angles[3], Float:Origin2[3], Float:NewVelocity[3]
  275. static Smart_Nail; Smart_Nail = SMART_NAIL
  276.  
  277. if(random_num(0, 1)) Smart_Nail = 0
  278.  
  279. pev(Ent, pev_origin, Origin)
  280.  
  281. if(!Smart_Nail) pev(Owner, pev_origin, Origin2)
  282. else {
  283. static Enemy; Enemy = FindClosetEnemy(Ent, 1)
  284. if(is_user_alive(Enemy)) pev(Enemy, pev_origin, Origin2)
  285. else {
  286. pev(Owner, pev_origin, Origin2)
  287. Smart_Nail = 0
  288. }
  289. }
  290.  
  291. pev(Ent, pev_angles, Angles)
  292.  
  293. get_speed_vector(Origin, Origin2, NAIL_SPEED, NewVelocity)
  294.  
  295. if(!Smart_Nail)
  296. {
  297. NewVelocity[0] += random_float(-500.0, 500.0)
  298. NewVelocity[1] += random_float(-500.0, 500.0)
  299. NewVelocity[2] += random_float(-500.0, 500.0)
  300. }
  301.  
  302. Create_Nail(Owner, 0, Origin, Angles, Origin2, NewVelocity)
  303.  
  304. set_pev(Ent, pev_iuser3, 0)
  305. engfunc(EngFunc_RemoveEntity, Ent)
  306. } else {
  307. engfunc(EngFunc_RemoveEntity, Ent)
  308. }
  309. }
  310.  
  311. free_tr2(ptr)
  312. }
  313.  
  314. public fw_TraceAttack(ent, attacker, Float:Damage, Float:fDir[3], ptr, iDamageType)
  315. {
  316. if(!is_user_alive(attacker))
  317. return HAM_IGNORED
  318. if(get_user_weapon(attacker) != CSW_COILGUN || !g_had_coilgun[attacker])
  319. return HAM_IGNORED
  320.  
  321. Handle_Nail(attacker)
  322.  
  323. return HAM_SUPERCEDE
  324. }
  325.  
  326. public fw_Item_PostFrame(ent)
  327. {
  328. static id; id = pev(ent, pev_owner)
  329. if(!is_user_alive(id))
  330. return HAM_IGNORED
  331. if(!g_had_coilgun[id])
  332. return HAM_IGNORED
  333.  
  334. static Float:flNextAttack; flNextAttack = get_pdata_float(id, 83, 5)
  335. static bpammo; bpammo = cs_get_user_bpammo(id, CSW_COILGUN)
  336.  
  337. static iClip; iClip = get_pdata_int(ent, 51, 4)
  338. static fInReload; fInReload = get_pdata_int(ent, 54, 4)
  339.  
  340. if(fInReload && flNextAttack <= 0.0)
  341. {
  342. static temp1
  343. temp1 = min(CLIP - iClip, bpammo)
  344.  
  345. set_pdata_int(ent, 51, iClip + temp1, 4)
  346. cs_set_user_bpammo(id, CSW_COILGUN, bpammo - temp1)
  347.  
  348. set_pdata_int(ent, 54, 0, 4)
  349.  
  350. fInReload = 0
  351. }
  352.  
  353. return HAM_IGNORED
  354. }
  355.  
  356. public fw_Weapon_Reload(ent)
  357. {
  358. static id; id = pev(ent, pev_owner)
  359. if(!is_user_alive(id))
  360. return HAM_IGNORED
  361. if(!g_had_coilgun[id])
  362. return HAM_IGNORED
  363.  
  364. g_coilgun_clip[id] = -1
  365.  
  366. static BPAmmo; BPAmmo = cs_get_user_bpammo(id, CSW_COILGUN)
  367. static iClip; iClip = get_pdata_int(ent, 51, 4)
  368.  
  369. if(BPAmmo <= 0)
  370. return HAM_SUPERCEDE
  371. if(iClip >= CLIP)
  372. return HAM_SUPERCEDE
  373.  
  374. g_coilgun_clip[id] = iClip
  375.  
  376. return HAM_HANDLED
  377. }
  378.  
  379. public fw_Weapon_Reload_Post(ent)
  380. {
  381. static id; id = pev(ent, pev_owner)
  382. if(!is_user_alive(id))
  383. return HAM_IGNORED
  384. if(!g_had_coilgun[id])
  385. return HAM_IGNORED
  386.  
  387. if((get_pdata_int(ent, 54, 4) == 1))
  388. { // Reload
  389. if(g_coilgun_clip[id] == -1)
  390. return HAM_IGNORED
  391.  
  392. set_pdata_int(ent, 51, g_coilgun_clip[id], 4)
  393.  
  394. set_weapon_anim(id, ANIM_RELOAD)
  395.  
  396. set_weapon_timeidle(id, CSW_COILGUN, RELOAD_TIME)
  397. set_player_nextattack(id, RELOAD_TIME)
  398. }
  399.  
  400. return HAM_HANDLED
  401. }
  402.  
  403. public fw_Item_AddToPlayer_Post(ent, id)
  404. {
  405. if(!pev_valid(ent))
  406. return HAM_IGNORED
  407.  
  408. if(pev(ent, pev_impulse) == WEAPON_SECRETCODE)
  409. {
  410. g_had_coilgun[id] = 1
  411. set_pev(ent, pev_impulse, 0)
  412. }
  413.  
  414. message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("WeaponList"), .player = id)
  415. write_string(g_had_coilgun[id] == 1 ? "weapon_coilgun" : "weapon_mp5navy")
  416. write_byte(10) // PrimaryAmmoID
  417. write_byte(200) // PrimaryAmmoMaxAmount
  418. write_byte(-1) // SecondaryAmmoID
  419. write_byte(-1) // SecondaryAmmoMaxAmount
  420. write_byte(0) // SlotID (0...N)
  421. write_byte(7) // NumberInSlot (1...N)
  422. write_byte(g_had_coilgun[id] == 1 ? CSW_COILGUN : CSW_MP5NAVY) // WeaponID
  423. write_byte(0) // Flags
  424. message_end()
  425.  
  426. return HAM_HANDLED
  427. }
  428.  
  429. public Handle_Nail(id)
  430. {
  431. static Float:StartOrigin[3], Float:Angles[3], Float:EndOrigin[3], Float:Velocity[3]
  432.  
  433. get_position(id, 30.0, 12.5, -10.0, StartOrigin)
  434. pev(id, pev_angles, Angles)
  435.  
  436. fm_get_aim_origin(id, EndOrigin)
  437. get_speed_vector(StartOrigin, EndOrigin, NAIL_SPEED, Velocity)
  438.  
  439. Create_Nail(id, 1, StartOrigin, Angles, EndOrigin, Velocity)
  440. }
  441.  
  442. public Create_Nail(id, Reflect, Float:StartOrigin[3], Float:Angles[3], Float:EndOrigin[3], Float:Velocity[3])
  443. {
  444. static Nail; Nail = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
  445. if(!pev_valid(Nail)) return
  446.  
  447. set_pev(Nail, pev_movetype, MOVETYPE_FLY)
  448. set_pev(Nail, pev_solid, SOLID_BBOX)
  449.  
  450. set_pev(Nail, pev_classname, NAIL_CLASSNAME)
  451. engfunc(EngFunc_SetModel, Nail, S_NAIL)
  452. set_pev(Nail, pev_origin, StartOrigin)
  453. set_pev(Nail, pev_angles, Angles)
  454. set_pev(Nail, pev_v_angle, Angles)
  455.  
  456. set_pev(Nail, pev_owner, id)
  457. set_pev(Nail, pev_velocity, Velocity)
  458.  
  459. // Make a Beam
  460. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  461. write_byte(TE_BEAMFOLLOW)
  462. write_short(Nail) // entity
  463. write_short(g_trail_sprid) // sprite
  464. write_byte(2) // life
  465. write_byte(1) // width
  466. write_byte(210) // r
  467. write_byte(210); // g
  468. write_byte(210); // b
  469. write_byte(150); // brightness
  470. message_end();
  471.  
  472. // Handle Trace Config
  473. static ptr; ptr = create_tr2()
  474. engfunc(EngFunc_TraceLine, StartOrigin, EndOrigin, id, id, ptr)
  475.  
  476. set_pev(Nail, pev_iuser4, ptr)
  477. set_pev(Nail, pev_iuser3, Reflect)
  478. }
  479.  
  480. public update_ammo(id, CSWID, ammo, bpammo)
  481. {
  482. if(!is_user_alive(id))
  483. return
  484.  
  485. engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, get_user_msgid("CurWeapon"), {0, 0, 0}, id)
  486. write_byte(1)
  487. write_byte(CSWID)
  488. write_byte(ammo)
  489. message_end()
  490.  
  491. message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("AmmoX"), _, id)
  492. write_byte(1)
  493. write_byte(bpammo)
  494. message_end()
  495. }
  496.  
  497. stock set_weapon_timeidle(id, CSWID, Float:TimeIdle)
  498. {
  499. if(!is_user_alive(id))
  500. return
  501.  
  502. static entwpn; entwpn = fm_get_user_weapon_entity(id, CSWID)
  503. if(!pev_valid(entwpn))
  504. return
  505.  
  506. set_pdata_float(entwpn, 46, TimeIdle, 4)
  507. set_pdata_float(entwpn, 47, TimeIdle, 4)
  508. set_pdata_float(entwpn, 48, TimeIdle + 1.0, 4)
  509. }
  510.  
  511. stock set_player_nextattack(id, Float:nexttime)
  512. {
  513. if(!is_user_alive(id))
  514. return
  515.  
  516. set_pdata_float(id, 83, nexttime, 5)
  517. }
  518.  
  519. stock set_weapon_anim(id, anim)
  520. {
  521. if(!is_user_alive(id))
  522. return
  523.  
  524. set_pev(id, pev_weaponanim, anim)
  525.  
  526. message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
  527. write_byte(anim)
  528. write_byte(pev(id, pev_body))
  529. message_end()
  530. }
  531.  
  532. stock get_position(ent, Float:forw, Float:right, Float:up, Float:vStart[])
  533. {
  534. static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
  535.  
  536. pev(ent, pev_origin, vOrigin)
  537. pev(ent, pev_view_ofs,vUp) //for player
  538. xs_vec_add(vOrigin,vUp,vOrigin)
  539. pev(ent, pev_v_angle, vAngle) // if normal entity ,use pev_angles
  540.  
  541. angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
  542. angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
  543. angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
  544.  
  545. vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
  546. vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
  547. vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
  548. }
  549.  
  550. stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
  551. {
  552. new_velocity[0] = origin2[0] - origin1[0]
  553. new_velocity[1] = origin2[1] - origin1[1]
  554. new_velocity[2] = origin2[2] - origin1[2]
  555. static Float:num; num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
  556. new_velocity[0] *= num
  557. new_velocity[1] *= num
  558. new_velocity[2] *= num
  559.  
  560. return 1;
  561. }
  562.  
  563. do_attack(Attacker, Victim, Inflictor, Float:fDamage)
  564. {
  565. fake_player_trace_attack(Attacker, Victim, fDamage)
  566. fake_take_damage(Attacker, Victim, fDamage, Inflictor)
  567. }
  568.  
  569. fake_player_trace_attack(iAttacker, iVictim, &Float:fDamage)
  570. {
  571. // get fDirection
  572. static Float:fAngles[3], Float:fDirection[3]
  573. pev(iAttacker, pev_angles, fAngles)
  574. angle_vector(fAngles, ANGLEVECTOR_FORWARD, fDirection)
  575.  
  576. // get fStart
  577. static Float:fStart[3], Float:fViewOfs[3]
  578. pev(iAttacker, pev_origin, fStart)
  579. pev(iAttacker, pev_view_ofs, fViewOfs)
  580. xs_vec_add(fViewOfs, fStart, fStart)
  581.  
  582. // get aimOrigin
  583. static iAimOrigin[3], Float:fAimOrigin[3]
  584. get_user_origin(iAttacker, iAimOrigin, 3)
  585. IVecFVec(iAimOrigin, fAimOrigin)
  586.  
  587. // TraceLine from fStart to AimOrigin
  588. static ptr; ptr = create_tr2()
  589. engfunc(EngFunc_TraceLine, fStart, fAimOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr)
  590. static pHit; pHit = get_tr2(ptr, TR_pHit)
  591. static iHitgroup; iHitgroup = get_tr2(ptr, TR_iHitgroup)
  592. static Float:fEndPos[3]; get_tr2(ptr, TR_vecEndPos, fEndPos)
  593.  
  594. // get target & body at aiming
  595. static iTarget, iBody
  596. get_user_aiming(iAttacker, iTarget, iBody)
  597.  
  598. // if aiming find target is iVictim then update iHitgroup
  599. if (iTarget == iVictim)
  600. {
  601. iHitgroup = iBody
  602. }
  603.  
  604. // if ptr find target not is iVictim
  605. else if (pHit != iVictim)
  606. {
  607. // get AimOrigin in iVictim
  608. static Float:fVicOrigin[3], Float:fVicViewOfs[3], Float:fAimInVictim[3]
  609. pev(iVictim, pev_origin, fVicOrigin)
  610. pev(iVictim, pev_view_ofs, fVicViewOfs)
  611. xs_vec_add(fVicViewOfs, fVicOrigin, fAimInVictim)
  612. fAimInVictim[2] = fStart[2]
  613. fAimInVictim[2] += get_distance_f(fStart, fAimInVictim) * floattan( fAngles[0] * 2.0, degrees )
  614.  
  615. // check aim in size of iVictim
  616. static iAngleToVictim; iAngleToVictim = get_angle_to_target(iAttacker, fVicOrigin)
  617. iAngleToVictim = abs(iAngleToVictim)
  618. static Float:fDis; fDis = 2.0 * get_distance_f(fStart, fAimInVictim) * floatsin( float(iAngleToVictim) * 0.5, degrees )
  619. static Float:fVicSize[3]
  620. pev(iVictim, pev_size , fVicSize)
  621. if ( fDis <= fVicSize[0] * 0.5 )
  622. {
  623. // TraceLine from fStart to aimOrigin in iVictim
  624. static ptr2; ptr2 = create_tr2()
  625. engfunc(EngFunc_TraceLine, fStart, fAimInVictim, DONT_IGNORE_MONSTERS, iAttacker, ptr2)
  626. static pHit2; pHit2 = get_tr2(ptr2, TR_pHit)
  627. static iHitgroup2; iHitgroup2 = get_tr2(ptr2, TR_iHitgroup)
  628.  
  629. // if ptr2 find target is iVictim
  630. if ( pHit2 == iVictim && (iHitgroup2 != HIT_HEAD || fDis <= fVicSize[0] * 0.25) )
  631. {
  632. pHit = iVictim
  633. iHitgroup = iHitgroup2
  634. get_tr2(ptr2, TR_vecEndPos, fEndPos)
  635. }
  636.  
  637. free_tr2(ptr2)
  638. }
  639.  
  640. // if pHit still not is iVictim then set default HitGroup
  641. if (pHit != iVictim)
  642. {
  643. // set default iHitgroup
  644. iHitgroup = HIT_GENERIC
  645.  
  646. new ptr3 = create_tr2()
  647. engfunc(EngFunc_TraceLine, fStart, fVicOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr3)
  648. get_tr2(ptr3, TR_vecEndPos, fEndPos)
  649.  
  650. // free ptr3
  651. free_tr2(ptr3)
  652. }
  653. }
  654.  
  655. // set new Hit & Hitgroup & EndPos
  656. set_tr2(ptr, TR_pHit, iVictim)
  657. set_tr2(ptr, TR_iHitgroup, iHitgroup)
  658. set_tr2(ptr, TR_vecEndPos, fEndPos)
  659.  
  660. // hitgroup multi fDamage
  661. static Float:fMultifDamage
  662. switch(iHitgroup)
  663. {
  664. case HIT_HEAD: fMultifDamage = 4.0
  665. case HIT_STOMACH: fMultifDamage = 1.25
  666. case HIT_LEFTLEG: fMultifDamage = 0.75
  667. case HIT_RIGHTLEG: fMultifDamage = 0.75
  668. default: fMultifDamage = 1.0
  669. }
  670.  
  671. fDamage *= fMultifDamage
  672.  
  673. // ExecuteHam
  674. fake_trake_attack(iAttacker, iVictim, fDamage, fDirection, ptr)
  675.  
  676. // free ptr
  677. free_tr2(ptr)
  678. }
  679.  
  680. stock fake_trake_attack(iAttacker, iVictim, Float:fDamage, Float:fDirection[3], iTraceHandle, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
  681. {
  682. ExecuteHam(Ham_TraceAttack, iVictim, iAttacker, fDamage, fDirection, iTraceHandle, iDamageBit)
  683. }
  684.  
  685. stock fake_take_damage(iAttacker, iVictim, Float:fDamage, iInflictor = 0, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
  686. {
  687. ExecuteHam(Ham_TakeDamage, iVictim, iInflictor, iAttacker, fDamage, iDamageBit)
  688. }
  689.  
  690. stock get_angle_to_target(id, const Float:fTarget[3], Float:TargetSize = 0.0)
  691. {
  692. new Float:fOrigin[3], iAimOrigin[3], Float:fAimOrigin[3], Float:fV1[3]
  693. pev(id, pev_origin, fOrigin)
  694. get_user_origin(id, iAimOrigin, 3) // end position from eyes
  695. IVecFVec(iAimOrigin, fAimOrigin)
  696. xs_vec_sub(fAimOrigin, fOrigin, fV1)
  697.  
  698. new Float:fV2[3]
  699. xs_vec_sub(fTarget, fOrigin, fV2)
  700.  
  701. new iResult = get_angle_between_vectors(fV1, fV2)
  702.  
  703. if (TargetSize > 0.0)
  704. {
  705. new Float:fTan = TargetSize / get_distance_f(fOrigin, fTarget)
  706. new fAngleToTargetSize = floatround( floatatan(fTan, degrees) )
  707. iResult -= (iResult > 0) ? fAngleToTargetSize : -fAngleToTargetSize
  708. }
  709.  
  710. return iResult
  711. }
  712.  
  713. stock get_angle_between_vectors(const Float:fV1[3], const Float:fV2[3])
  714. {
  715. new Float:fA1[3], Float:fA2[3]
  716. engfunc(EngFunc_VecToAngles, fV1, fA1)
  717. engfunc(EngFunc_VecToAngles, fV2, fA2)
  718.  
  719. new iResult = floatround(fA1[1] - fA2[1])
  720. iResult = iResult % 360
  721. iResult = (iResult > 180) ? (iResult - 360) : iResult
  722.  
  723. return iResult
  724. }
  725.  
  726. stock Vector_To_Velocity(id, Trace_Result, Float:Speed, Float:RetVel[3])
  727. {
  728. static Float:vecSrc[3], Float:vecEnd[3], Float:vecEnd2[3]
  729.  
  730. get_weapon_attachment(id, vecSrc)
  731. global_get(glb_v_forward, vecEnd)
  732. global_get(glb_v_forward, vecEnd2)
  733.  
  734. xs_vec_mul_scalar(vecEnd, 8192.0, vecEnd)
  735. xs_vec_mul_scalar(vecEnd2, 8192.0, vecEnd2)
  736. xs_vec_add(vecSrc, vecEnd, vecEnd)
  737. xs_vec_add(vecSrc, vecEnd2, vecEnd2)
  738.  
  739. get_tr2(Trace_Result, TR_vecEndPos, vecSrc)
  740. get_tr2(Trace_Result, TR_vecPlaneNormal, vecEnd)
  741. get_tr2(Trace_Result, TR_vecPlaneNormal, vecEnd2)
  742.  
  743. xs_vec_mul_scalar(vecEnd, 2.5, vecEnd)
  744. xs_vec_mul_scalar(vecEnd2, 5.0, vecEnd2)
  745. xs_vec_add(vecSrc, vecEnd, vecEnd)
  746. xs_vec_add(vecSrc, vecEnd2, vecEnd2)
  747.  
  748. get_speed_vector(vecEnd, vecEnd2, Speed, RetVel)
  749. }
  750.  
  751. stock get_weapon_attachment(id, Float:output[3], Float:fDis = 40.0)
  752. {
  753. static Float:vfEnd[3], viEnd[3]
  754. get_user_origin(id, viEnd, 3)
  755. IVecFVec(viEnd, vfEnd)
  756.  
  757. static Float:fOrigin[3], Float:fAngle[3]
  758.  
  759. pev(id, pev_origin, fOrigin)
  760. pev(id, pev_view_ofs, fAngle)
  761.  
  762. xs_vec_add(fOrigin, fAngle, fOrigin)
  763.  
  764. static Float:fAttack[3]
  765.  
  766. xs_vec_sub(vfEnd, fOrigin, fAttack)
  767. xs_vec_sub(vfEnd, fOrigin, fAttack)
  768.  
  769. static Float:fRate
  770.  
  771. fRate = fDis / vector_length(fAttack)
  772. xs_vec_mul_scalar(fAttack, fRate, fAttack)
  773.  
  774. xs_vec_add(fOrigin, fAttack, output)
  775. }
  776.  
  777. public FindClosetEnemy(ent, can_see)
  778. {
  779. new Float:maxdistance = 4980.0
  780. new indexid = 0
  781. new Float:current_dis = maxdistance
  782.  
  783. for(new i = 1 ;i <= g_MaxPlayers; i++)
  784. {
  785. if(can_see)
  786. {
  787. if(is_user_alive(i) && can_see_fm(ent, i) && entity_range(ent, i) < current_dis)
  788. {
  789. current_dis = entity_range(ent, i)
  790. indexid = i
  791. }
  792. } else {
  793. if(is_user_alive(i) && entity_range(ent, i) < current_dis)
  794. {
  795. current_dis = entity_range(ent, i)
  796. indexid = i
  797. }
  798. }
  799. }
  800.  
  801. return indexid
  802. }
  803.  
  804.  
  805. public bool:can_see_fm(entindex1, entindex2)
  806. {
  807. if (!entindex1 || !entindex2)
  808. return false
  809.  
  810. if (pev_valid(entindex1) && pev_valid(entindex1))
  811. {
  812. new flags = pev(entindex1, pev_flags)
  813. if (flags & EF_NODRAW || flags & FL_NOTARGET)
  814. {
  815. return false
  816. }
  817.  
  818. new Float:lookerOrig[3]
  819. new Float:targetBaseOrig[3]
  820. new Float:targetOrig[3]
  821. new Float:temp[3]
  822.  
  823. pev(entindex1, pev_origin, lookerOrig)
  824. pev(entindex1, pev_view_ofs, temp)
  825. lookerOrig[0] += temp[0]
  826. lookerOrig[1] += temp[1]
  827. lookerOrig[2] += temp[2]
  828.  
  829. pev(entindex2, pev_origin, targetBaseOrig)
  830. pev(entindex2, pev_view_ofs, temp)
  831. targetOrig[0] = targetBaseOrig [0] + temp[0]
  832. targetOrig[1] = targetBaseOrig [1] + temp[1]
  833. targetOrig[2] = targetBaseOrig [2] + temp[2]
  834.  
  835. engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) // checks the had of seen player
  836. if (get_tr2(0, TraceResult:TR_InOpen) && get_tr2(0, TraceResult:TR_InWater))
  837. {
  838. return false
  839. }
  840. else
  841. {
  842. new Float:flFraction
  843. get_tr2(0, TraceResult:TR_flFraction, flFraction)
  844. if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
  845. {
  846. return true
  847. }
  848. else
  849. {
  850. targetOrig[0] = targetBaseOrig [0]
  851. targetOrig[1] = targetBaseOrig [1]
  852. targetOrig[2] = targetBaseOrig [2]
  853. engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) // checks the body of seen player
  854. get_tr2(0, TraceResult:TR_flFraction, flFraction)
  855. if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
  856. {
  857. return true
  858. }
  859. else
  860. {
  861. targetOrig[0] = targetBaseOrig [0]
  862. targetOrig[1] = targetBaseOrig [1]
  863. targetOrig[2] = targetBaseOrig [2] - 17.0
  864. engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) // checks the legs of seen player
  865. get_tr2(0, TraceResult:TR_flFraction, flFraction)
  866. if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
  867. {
  868. return true
  869. }
  870. }
  871. }
  872. }
  873. }
  874. return false
  875. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement