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 <fun>
  8.  
  9. #define PLUGIN "Thunderbolt"
  10. #define VERSION "2014"
  11. #define AUTHOR "Dias"
  12.  
  13. #define DAMAGE 550
  14. #define DEFAULT_AMMO 20
  15. #define RELOAD_TIME 2.67
  16.  
  17. #define CSW_THUNDERBOLT CSW_AWP
  18. #define weapon_thunderbolt "weapon_awp"
  19. #define old_event "events/awp.sc"
  20. #define old_w_model "models/w_awp.mdl"
  21. #define WEAPON_SECRETCODE 4234234
  22.  
  23. #define V_MODEL "models/v_sfsniperF.mdl"
  24. #define P_MODEL "models/p_sfsniper.mdl"
  25. #define W_MODEL "models/w_sfsniper.mdl"
  26.  
  27. #define SNIP_MODEL_R "models/v_sfsightR.mdl"
  28. #define SNIP_MODEL_B "models/v_sfsightB.mdl"
  29.  
  30. new const WeaponSounds[5][] =
  31. {
  32. "weapons/sfsniper-1.wav",
  33. "weapons/sfsniper_insight1.wav",
  34. "weapons/sfsniper_zoom.wav",
  35. "weapons/sfsniper_idle.wav",
  36. "weapons/sfsniper_draw.wav"
  37. }
  38.  
  39. new const WeaponResources[4][] =
  40. {
  41. "sprites/weapon_sfsniperF.txt",
  42. "sprites/640hud2_2.spr",
  43. "sprites/640hud10_2.spr",
  44. "sprites/640hud81_2.spr"
  45. }
  46.  
  47. enum
  48. {
  49. TB_ANIM_IDLE = 0,
  50. TB_ANIM_SHOOT,
  51. TB_ANIM_DRAW
  52. }
  53.  
  54. enum
  55. {
  56. ZOOM_NONE = 0,
  57. ZOOM_ACT
  58. }
  59.  
  60. // MACROS
  61. #define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
  62. #define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
  63. #define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))
  64.  
  65. new g_Had_Thunderbolt, g_Zoom[33]
  66. new g_IsAlive
  67. new Float:CheckDelay[33], Float:CheckDelay2[33], Float:CheckDelay3[33], g_TempAttack
  68. new g_Msg_CurWeapon, g_Msg_AmmoX, g_Msg_WeaponList
  69. new g_Beam_SprId, g_HamBot_Register, g_Event_Thunderbolt
  70.  
  71. public plugin_init()
  72. {
  73. register_plugin(PLUGIN, VERSION, AUTHOR)
  74.  
  75. register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
  76. register_event("DeathMsg", "Event_Death", "a")
  77.  
  78. register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
  79. register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
  80. register_forward(FM_SetModel, "fw_SetModel")
  81. register_forward(FM_CmdStart, "fw_CmdStart")
  82. register_forward(FM_EmitSound, "fw_EmitSound")
  83. register_forward(FM_TraceLine, "fw_TraceLine")
  84. register_forward(FM_TraceHull, "fw_TraceHull")
  85.  
  86. RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1)
  87. RegisterHam(Ham_Item_AddToPlayer, weapon_thunderbolt, "fw_AddToPlayer_Post", 1)
  88. RegisterHam(Ham_Item_Deploy, weapon_thunderbolt, "fw_Item_Deploy_Post", 1)
  89. RegisterHam(Ham_Weapon_WeaponIdle, weapon_thunderbolt, "fw_Weapon_WeaponIdle_Post", 1)
  90. RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_awp", "fw_Weapon_SecondaryAttack")
  91.  
  92. g_Msg_CurWeapon = get_user_msgid("CurWeapon")
  93. g_Msg_AmmoX = get_user_msgid("AmmoX")
  94. g_Msg_WeaponList = get_user_msgid("WeaponList")
  95.  
  96. register_clcmd("weapon_sfsniperF", "CLCMD_HookWeapon")
  97. register_clcmd("say tb", "Get_Thunderbolt")
  98. }
  99.  
  100. public plugin_precache()
  101. {
  102. precache_model(V_MODEL)
  103. precache_model(P_MODEL)
  104. precache_model(W_MODEL)
  105.  
  106. precache_model(SNIP_MODEL_R)
  107. precache_model(SNIP_MODEL_B)
  108.  
  109. for(new i = 0; i < sizeof(WeaponSounds); i++)
  110. engfunc(EngFunc_PrecacheSound, WeaponSounds[i])
  111. for(new i = 0; i < sizeof(WeaponResources); i++)
  112. {
  113. if(i == 0) engfunc(EngFunc_PrecacheGeneric, WeaponResources[0])
  114. else engfunc(EngFunc_PrecacheModel, WeaponResources[i])
  115. }
  116.  
  117. g_Beam_SprId = engfunc(EngFunc_PrecacheModel, "sprites/laserbeam.spr")
  118. }
  119.  
  120. public client_putinserver(id)
  121. {
  122. if(is_user_bot(id) && !g_HamBot_Register)
  123. {
  124. g_HamBot_Register = 1
  125. set_task(0.1, "Do_RegisterHamBot", id)
  126. }
  127.  
  128. UnSet_BitVar(g_TempAttack, id)
  129. UnSet_BitVar(g_IsAlive, id)
  130. }
  131.  
  132. public Do_RegisterHamBot(id)
  133. {
  134. RegisterHamFromEntity(Ham_Spawn, id, "fw_PlayerSpawn_Post", 1)
  135. }
  136.  
  137. public fw_PrecacheEvent_Post(type, const name[])
  138. {
  139. if(equal(old_event, name)) g_Event_Thunderbolt = get_orig_retval()
  140. }
  141.  
  142. public Get_Thunderbolt(id)
  143. {
  144. g_Zoom[id] = ZOOM_NONE
  145. Set_BitVar(g_Had_Thunderbolt, id)
  146.  
  147. give_item(id, weapon_thunderbolt)
  148.  
  149. static weapon_ent; weapon_ent = fm_find_ent_by_owner(-1, weapon_thunderbolt, id)
  150. if(pev_valid(weapon_ent)) cs_set_weapon_ammo(weapon_ent, 10)
  151.  
  152. cs_set_user_bpammo(id, CSW_THUNDERBOLT, DEFAULT_AMMO)
  153. }
  154.  
  155. public Remove_Thunderbolt(id)
  156. {
  157. g_Zoom[id] = ZOOM_NONE
  158. UnSet_BitVar(g_Had_Thunderbolt, id)
  159. }
  160.  
  161. public Event_CurWeapon(id)
  162. {
  163. static CSWID; CSWID = read_data(2)
  164. if(CSWID != CSW_THUNDERBOLT || !Get_BitVar(g_Had_Thunderbolt, id))
  165. return
  166.  
  167. /*
  168. if(cs_get_user_zoom(id) > 1) // Zoom
  169. {
  170. emit_sound(id, CHAN_WEAPON, WeaponSounds[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  171. if(!Get_BitVar(g_Zoomed, id))
  172. {
  173. //set_pev(id, pev_viewmodel2, SNIP_MODEL
  174. Set_BitVar(g_Zoomed, id)
  175. }
  176. } else { // Not Zoom
  177. emit_sound(id, CHAN_WEAPON, WeaponSounds[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  178. set_pev(id, pev_viewmodel2, V_MODEL)
  179. UnSet_BitVar(g_Zoomed, id)
  180. }*/
  181.  
  182. UpdateAmmo(id, -1, cs_get_user_bpammo(id, CSW_THUNDERBOLT))
  183. }
  184.  
  185. public Event_Death()
  186. {
  187. static Victim; Victim = read_data(2)
  188. UnSet_BitVar(g_IsAlive, Victim)
  189. }
  190.  
  191. public CLCMD_HookWeapon(id)
  192. {
  193. engclient_cmd(id, weapon_thunderbolt)
  194. return
  195. }
  196.  
  197. public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
  198. {
  199. if(!Get_BitVar(g_IsAlive, id))
  200. return FMRES_IGNORED
  201. if(get_user_weapon(id) == CSW_THUNDERBOLT && Get_BitVar(g_Had_Thunderbolt, id))
  202. set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001)
  203.  
  204. return FMRES_HANDLED
  205. }
  206.  
  207. public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
  208. {
  209. if(eventid != g_Event_Thunderbolt)
  210. return FMRES_IGNORED
  211. if(!Get_BitVar(g_IsAlive, invoker))
  212. return FMRES_IGNORED
  213. if(get_user_weapon(invoker) != CSW_THUNDERBOLT || !Get_BitVar(g_Had_Thunderbolt, invoker))
  214. return FMRES_IGNORED
  215.  
  216. engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
  217.  
  218. return FMRES_SUPERCEDE
  219. }
  220.  
  221. public fw_SetModel(entity, model[])
  222. {
  223. if(!pev_valid(entity))
  224. return FMRES_IGNORED
  225.  
  226. static Classname[64]
  227. pev(entity, pev_classname, Classname, sizeof(Classname))
  228.  
  229. if(!equal(Classname, "weaponbox"))
  230. return FMRES_IGNORED
  231.  
  232. static id
  233. id = pev(entity, pev_owner)
  234.  
  235. if(equal(model, old_w_model))
  236. {
  237. static weapon
  238. weapon = fm_get_user_weapon_entity(entity, CSW_THUNDERBOLT)
  239.  
  240. if(!pev_valid(weapon))
  241. return FMRES_IGNORED
  242.  
  243. if(Get_BitVar(g_Had_Thunderbolt, id))
  244. {
  245. UnSet_BitVar(g_Had_Thunderbolt, id)
  246.  
  247. set_pev(weapon, pev_impulse, WEAPON_SECRETCODE)
  248. set_pev(weapon, pev_iuser4, cs_get_user_bpammo(id, CSW_THUNDERBOLT))
  249.  
  250. engfunc(EngFunc_SetModel, entity, W_MODEL)
  251.  
  252. return FMRES_SUPERCEDE
  253. }
  254. }
  255.  
  256. return FMRES_IGNORED;
  257. }
  258.  
  259. public fw_CmdStart(id, UcHandle, Seed)
  260. {
  261. if(!Get_BitVar(g_IsAlive, id))
  262. return
  263. if(get_user_weapon(id) != CSW_THUNDERBOLT || !Get_BitVar(g_Had_Thunderbolt, id))
  264. return
  265. if(get_pdata_float(id, 83, 5) > 0.0)
  266. return
  267.  
  268. static CurButton; CurButton = get_uc(UcHandle, UC_Buttons)
  269. if(CurButton & IN_ATTACK)
  270. {
  271. CurButton &= ~IN_ATTACK
  272. set_uc(UcHandle, UC_Buttons, CurButton)
  273.  
  274. if(get_gametime() - RELOAD_TIME > CheckDelay[id])
  275. {
  276. Thunderbolt_Shooting(id)
  277.  
  278. CheckDelay[id] = get_gametime()
  279. }
  280. }
  281.  
  282. if(CurButton & IN_ATTACK2)
  283. {
  284. //CurButton &= ~IN_ATTACK2
  285. //set_uc(UcHandle, UC_Buttons, CurButton)
  286. //cs_set_user_
  287. //cs_set_user_zoom(id, CS_SET_NO_ZOOM, 1)
  288.  
  289. if(get_gametime() - 0.5 > CheckDelay3[id])
  290. {
  291. switch(g_Zoom[id])
  292. {
  293. case ZOOM_NONE: Activate_Zoom(id, ZOOM_ACT)
  294. case ZOOM_ACT: Activate_Zoom(id, ZOOM_NONE)
  295. default: Activate_Zoom(id, ZOOM_NONE)
  296. }
  297.  
  298. CheckDelay3[id] = get_gametime()
  299. }
  300. }
  301.  
  302. if(get_gametime() - 0.25 > CheckDelay2[id])
  303. {
  304. static Body, Target; get_user_aiming(id, Target, Body, 99999)
  305.  
  306. if(g_Zoom[id] == ZOOM_ACT)
  307. {
  308. if(Get_BitVar(g_IsAlive, Target))
  309. {
  310. emit_sound(id, CHAN_WEAPON, WeaponSounds[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  311. set_pev(id, pev_viewmodel2, SNIP_MODEL_R)
  312. } else {
  313. set_pev(id, pev_viewmodel2, SNIP_MODEL_B)
  314. }
  315. }
  316.  
  317. CheckDelay2[id] = get_gametime()
  318. }
  319. }
  320.  
  321. public Activate_Zoom(id, Level)
  322. {
  323. switch(Level)
  324. {
  325. case ZOOM_NONE:
  326. {
  327. g_Zoom[id] = Level
  328. set_pev(id, pev_viewmodel2, V_MODEL)
  329. }
  330. case ZOOM_ACT:
  331. {
  332. g_Zoom[id] = Level
  333.  
  334. set_pev(id, pev_viewmodel2, SNIP_MODEL_B)
  335. emit_sound(id, CHAN_WEAPON, WeaponSounds[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  336. }
  337. default:
  338. {
  339. g_Zoom[id] = ZOOM_NONE
  340. Set_UserFov(id, 90)
  341.  
  342. set_pev(id, pev_viewmodel2, V_MODEL)
  343. }
  344. }
  345. }
  346.  
  347. public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
  348. {
  349. if(!Get_BitVar(g_IsAlive, id))
  350. return FMRES_IGNORED
  351. if(!Get_BitVar(g_TempAttack, id))
  352. return FMRES_IGNORED
  353.  
  354. if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
  355. {
  356. if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
  357. return FMRES_SUPERCEDE
  358. if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't')
  359. {
  360. if (sample[17] == 'w') return FMRES_SUPERCEDE
  361. else return FMRES_SUPERCEDE
  362. }
  363. if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
  364. return FMRES_SUPERCEDE;
  365. }
  366.  
  367. return FMRES_IGNORED
  368. }
  369.  
  370. public fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monster, id, handle)
  371. {
  372. if(!Get_BitVar(g_IsAlive, id))
  373. return FMRES_IGNORED
  374. if(!Get_BitVar(g_TempAttack, id))
  375. return FMRES_IGNORED
  376.  
  377. static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
  378.  
  379. pev(id, pev_origin, fOrigin)
  380. pev(id, pev_view_ofs, view_ofs)
  381. xs_vec_add(fOrigin, view_ofs, vecStart)
  382. pev(id, pev_v_angle, v_angle)
  383.  
  384. engfunc(EngFunc_MakeVectors, v_angle)
  385. get_global_vector(GL_v_forward, v_forward)
  386.  
  387. xs_vec_mul_scalar(v_forward, 0.0, v_forward)
  388. xs_vec_add(vecStart, v_forward, vecEnd)
  389.  
  390. engfunc(EngFunc_TraceLine, vecStart, vecEnd, ignored_monster, id, handle)
  391.  
  392. return FMRES_SUPERCEDE
  393. }
  394.  
  395. public fw_TraceHull(Float:vector_start[3], Float:vector_end[3], ignored_monster, hull, id, handle)
  396. {
  397. if(!Get_BitVar(g_IsAlive, id))
  398. return FMRES_IGNORED
  399. if(!Get_BitVar(g_TempAttack, id))
  400. return FMRES_IGNORED
  401.  
  402. static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
  403.  
  404. pev(id, pev_origin, fOrigin)
  405. pev(id, pev_view_ofs, view_ofs)
  406. xs_vec_add(fOrigin, view_ofs, vecStart)
  407. pev(id, pev_v_angle, v_angle)
  408.  
  409. engfunc(EngFunc_MakeVectors, v_angle)
  410. get_global_vector(GL_v_forward, v_forward)
  411.  
  412. xs_vec_mul_scalar(v_forward, 0.0, v_forward)
  413. xs_vec_add(vecStart, v_forward, vecEnd)
  414.  
  415. engfunc(EngFunc_TraceHull, vecStart, vecEnd, ignored_monster, hull, id, handle)
  416.  
  417. return FMRES_SUPERCEDE
  418. }
  419.  
  420. public fw_PlayerSpawn_Post(id) Set_BitVar(g_IsAlive, id)
  421. public fw_AddToPlayer_Post(ent, id)
  422. {
  423. if(pev(ent, pev_impulse) == WEAPON_SECRETCODE)
  424. {
  425. Set_BitVar(g_Had_Thunderbolt, id)
  426. cs_set_user_bpammo(id, CSW_THUNDERBOLT, pev(ent, pev_iuser4))
  427.  
  428. set_pev(ent, pev_impulse, 0)
  429. }
  430.  
  431. message_begin(MSG_ONE_UNRELIABLE, g_Msg_WeaponList, _, id)
  432. write_string((Get_BitVar(g_Had_Thunderbolt, id) ? "weapon_sfsniperF" : "weapon_awp"))
  433. write_byte(1)
  434. write_byte(30)
  435. write_byte(-1)
  436. write_byte(-1)
  437. write_byte(0)
  438. write_byte(2)
  439. write_byte(CSW_THUNDERBOLT)
  440. write_byte(0)
  441. message_end()
  442. }
  443.  
  444. public fw_Item_Deploy_Post(Ent)
  445. {
  446. if(pev_valid(Ent) != 2)
  447. return
  448. static Id; Id = get_pdata_cbase(Ent, 41, 4)
  449. if(get_pdata_cbase(Id, 373) != Ent)
  450. return
  451. if(!Get_BitVar(g_Had_Thunderbolt, Id))
  452. return
  453.  
  454. set_pev(Id, pev_viewmodel2, V_MODEL)
  455. set_pev(Id, pev_weaponmodel2, P_MODEL)
  456.  
  457. Set_WeaponAnim(Id, TB_ANIM_DRAW)
  458. remove_task(Id+111)
  459. }
  460.  
  461. public fw_Weapon_WeaponIdle_Post(Ent)
  462. {
  463. if(pev_valid(Ent) != 2)
  464. return HAM_IGNORED
  465. static Id; Id = get_pdata_cbase(Ent, 41, 4)
  466. if(get_pdata_cbase(Id, 373) != Ent)
  467. return HAM_IGNORED
  468. if(!Get_BitVar(g_Had_Thunderbolt, Id))
  469. return HAM_IGNORED
  470.  
  471. if(get_pdata_float(Ent, 48, 4) <= 0.1)
  472. {
  473. Set_WeaponAnim(Id, TB_ANIM_IDLE)
  474. set_pdata_float(Ent, 48, 20.0, 4)
  475. }
  476.  
  477. return HAM_IGNORED
  478. }
  479.  
  480. public fw_Weapon_SecondaryAttack(Ent)
  481. {
  482. static Id; Id = get_pdata_cbase(Ent, 41, 4)
  483. //if(get_pdata_cbase(Id, 373) != Ent)
  484. //return HAM_IGNORED
  485. if(!Get_BitVar(g_Had_Thunderbolt, Id))
  486. return HAM_IGNORED
  487.  
  488. return HAM_SUPERCEDE
  489. }
  490.  
  491. public Thunderbolt_Shooting(id)
  492. {
  493. if(cs_get_user_bpammo(id, CSW_THUNDERBOLT) <= 0)
  494. return
  495.  
  496. Set_BitVar(g_TempAttack, id)
  497. static Ent; Ent = fm_get_user_weapon_entity(id, CSW_KNIFE)
  498. if(pev_valid(Ent)) ExecuteHamB(Ham_Weapon_PrimaryAttack, Ent)
  499. UnSet_BitVar(g_TempAttack, id)
  500.  
  501. cs_set_user_bpammo(id, CSW_THUNDERBOLT, cs_get_user_bpammo(id, CSW_THUNDERBOLT) - 1)
  502. set_pev(id, pev_viewmodel2, V_MODEL)
  503.  
  504. set_task(RELOAD_TIME - 0.15, "Set_SniperModel", id+111)
  505.  
  506. Set_WeaponAnim(id, TB_ANIM_SHOOT)
  507. emit_sound(id, CHAN_WEAPON, WeaponSounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  508.  
  509. Make_FakePunch(id)
  510.  
  511. // Set Idle
  512. Ent = fm_get_user_weapon_entity(id, CSW_THUNDERBOLT)
  513. if(pev_valid(Ent))
  514. {
  515. set_pdata_float(id, 83, RELOAD_TIME, 5)
  516.  
  517. set_pdata_float(Ent, 46, RELOAD_TIME, 4)
  518. set_pdata_float(Ent, 47, RELOAD_TIME, 4)
  519. set_pdata_float(Ent, 48, RELOAD_TIME + 0.25, 4)
  520. }
  521.  
  522. Check_Damage(id)
  523.  
  524. // Set Bullet reject
  525. set_pdata_float(id, 111, 0.0)
  526. }
  527.  
  528. public Set_SniperModel(id)
  529. {
  530. id -= 111
  531. if(!is_user_alive(id))
  532. return
  533. if(!Get_BitVar(g_Had_Thunderbolt, id))
  534. return
  535. if(g_Zoom[id] != ZOOM_ACT)
  536. return
  537.  
  538. g_Zoom[id] = ZOOM_ACT
  539. set_pev(id, pev_viewmodel2, SNIP_MODEL_B)
  540. }
  541.  
  542. public Make_FakePunch(id)
  543. {
  544. static Float:PunchAngles[3]
  545. PunchAngles[0] = random_float(-3.5, -7.0)
  546.  
  547. set_pev(id, pev_punchangle, PunchAngles)
  548. }
  549.  
  550. public Check_Damage(id)
  551. {
  552. static Float:StartOrigin[3], Float:EndOrigin[3], Float:EndOrigin2[3]
  553.  
  554. Stock_Get_Postion(id, 40.0, 7.5, -5.0, StartOrigin)
  555. Stock_Get_Postion(id, 4096.0, 0.0, 0.0, EndOrigin)
  556.  
  557. static TrResult; TrResult = create_tr2()
  558. engfunc(EngFunc_TraceLine, StartOrigin, EndOrigin, IGNORE_MONSTERS, id, TrResult)
  559. get_tr2(TrResult, TR_vecEndPos, EndOrigin2)
  560. free_tr2(TrResult)
  561.  
  562. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  563. write_byte(TE_BEAMPOINTS)
  564. engfunc(EngFunc_WriteCoord, StartOrigin[0])
  565. engfunc(EngFunc_WriteCoord, StartOrigin[1])
  566. engfunc(EngFunc_WriteCoord, StartOrigin[2])
  567. engfunc(EngFunc_WriteCoord, EndOrigin2[0])
  568. engfunc(EngFunc_WriteCoord, EndOrigin2[1])
  569. engfunc(EngFunc_WriteCoord, EndOrigin2[2])
  570. write_short(g_Beam_SprId)
  571. write_byte(0)
  572. write_byte(0)
  573. write_byte(10)
  574. write_byte(25)
  575. write_byte(0)
  576. write_byte(0)
  577. write_byte(0)
  578. write_byte(200)
  579. write_byte(200)
  580. write_byte(0)
  581. message_end()
  582.  
  583. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  584. write_byte(TE_SPARKS) //TE_SPARKS
  585. engfunc(EngFunc_WriteCoord, EndOrigin2[0])
  586. engfunc(EngFunc_WriteCoord, EndOrigin2[1])
  587. engfunc(EngFunc_WriteCoord, EndOrigin2[2])
  588. message_end()
  589.  
  590. DealDamage(id, StartOrigin, EndOrigin2)
  591. }
  592.  
  593. public DealDamage(id, Float:Start[3], Float:End[3])
  594. {
  595. static TrResult; TrResult = create_tr2()
  596.  
  597. // Trace First Time
  598. engfunc(EngFunc_TraceLine, Start, End, DONT_IGNORE_MONSTERS, id, TrResult)
  599. new pHit1; pHit1 = get_tr2(TrResult, TR_pHit)
  600. static Float:End1[3]; get_tr2(TrResult, TR_vecEndPos, End1)
  601.  
  602. if(is_user_alive(pHit1))
  603. {
  604. do_attack(id, pHit1, 0, float(DAMAGE) * 1.5)
  605. engfunc(EngFunc_TraceLine, End1, End, DONT_IGNORE_MONSTERS, pHit1, TrResult)
  606. } else engfunc(EngFunc_TraceLine, End1, End, DONT_IGNORE_MONSTERS, -1, TrResult)
  607.  
  608. // Trace Second Time
  609. new pHit2; pHit2 = get_tr2(TrResult, TR_pHit)
  610. static Float:End2[3]; get_tr2(TrResult, TR_vecEndPos, End2)
  611.  
  612. if(is_user_alive(pHit2))
  613. {
  614. do_attack(id, pHit2, 0, float(DAMAGE) * 1.5)
  615. engfunc(EngFunc_TraceLine, End2, End, DONT_IGNORE_MONSTERS, pHit2, TrResult)
  616. } else engfunc(EngFunc_TraceLine, End2, End, DONT_IGNORE_MONSTERS, -1, TrResult)
  617.  
  618. // Trace Third Time
  619. new pHit3; pHit3 = get_tr2(TrResult, TR_pHit)
  620. static Float:End3[3]; get_tr2(TrResult, TR_vecEndPos, End3)
  621.  
  622. if(is_user_alive(pHit3))
  623. {
  624. do_attack(id, pHit3, 0, float(DAMAGE) * 1.5)
  625. engfunc(EngFunc_TraceLine, End3, End, DONT_IGNORE_MONSTERS, pHit3, TrResult)
  626. } else engfunc(EngFunc_TraceLine, End3, End, DONT_IGNORE_MONSTERS, -1, TrResult)
  627.  
  628. // Trace Fourth Time
  629. new pHit4; pHit4 = get_tr2(TrResult, TR_pHit)
  630. if(is_user_alive(pHit4)) do_attack(id, pHit4, 0, float(DAMAGE) * 1.5)
  631.  
  632. free_tr2(TrResult)
  633. }
  634.  
  635. public UpdateAmmo(Id, Ammo, BpAmmo)
  636. {
  637. static weapon_ent; weapon_ent = fm_get_user_weapon_entity(Id, CSW_THUNDERBOLT)
  638. if(pev_valid(weapon_ent))
  639. {
  640. if(BpAmmo > 0) cs_set_weapon_ammo(weapon_ent, 1)
  641. else cs_set_weapon_ammo(weapon_ent, 0)
  642. }
  643.  
  644. engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, g_Msg_CurWeapon, {0, 0, 0}, Id)
  645. write_byte(1)
  646. write_byte(CSW_THUNDERBOLT)
  647. write_byte(-1)
  648. message_end()
  649.  
  650. message_begin(MSG_ONE_UNRELIABLE, g_Msg_AmmoX, _, Id)
  651. write_byte(1)
  652. write_byte(BpAmmo)
  653. message_end()
  654.  
  655. cs_set_user_bpammo(Id, CSW_THUNDERBOLT, BpAmmo)
  656. }
  657.  
  658. stock Set_WeaponAnim(id, anim)
  659. {
  660. set_pev(id, pev_weaponanim, anim)
  661.  
  662. message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
  663. write_byte(anim)
  664. write_byte(pev(id, pev_body))
  665. message_end()
  666. }
  667.  
  668. stock Stock_Get_Postion(id,Float:forw,Float:right, Float:up,Float:vStart[])
  669. {
  670. static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
  671.  
  672. pev(id, pev_origin, vOrigin)
  673. pev(id, pev_view_ofs,vUp) //for player
  674. xs_vec_add(vOrigin,vUp,vOrigin)
  675. pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
  676.  
  677. angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
  678. angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
  679. angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
  680.  
  681. vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
  682. vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
  683. vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
  684. }
  685.  
  686.  
  687. do_attack(Attacker, Victim, Inflictor, Float:fDamage)
  688. {
  689. fake_player_trace_attack(Attacker, Victim, fDamage)
  690. fake_take_damage(Attacker, Victim, fDamage, Inflictor)
  691. }
  692.  
  693. fake_player_trace_attack(iAttacker, iVictim, &Float:fDamage)
  694. {
  695. // get fDirection
  696. new Float:fAngles[3], Float:fDirection[3]
  697. pev(iAttacker, pev_angles, fAngles)
  698. angle_vector(fAngles, ANGLEVECTOR_FORWARD, fDirection)
  699.  
  700. // get fStart
  701. new Float:fStart[3], Float:fViewOfs[3]
  702. pev(iAttacker, pev_origin, fStart)
  703. pev(iAttacker, pev_view_ofs, fViewOfs)
  704. xs_vec_add(fViewOfs, fStart, fStart)
  705.  
  706. // get aimOrigin
  707. new iAimOrigin[3], Float:fAimOrigin[3]
  708. get_user_origin(iAttacker, iAimOrigin, 3)
  709. IVecFVec(iAimOrigin, fAimOrigin)
  710.  
  711. // TraceLine from fStart to AimOrigin
  712. new ptr; ptr = create_tr2()
  713. engfunc(EngFunc_TraceLine, fStart, fAimOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr)
  714. new pHit; pHit = get_tr2(ptr, TR_pHit)
  715. new iHitgroup; iHitgroup = get_tr2(ptr, TR_iHitgroup)
  716. new Float:fEndPos[3]
  717. get_tr2(ptr, TR_vecEndPos, fEndPos)
  718.  
  719. // get target & body at aiming
  720. new iTarget, iBody
  721. get_user_aiming(iAttacker, iTarget, iBody)
  722.  
  723. // if aiming find target is iVictim then update iHitgroup
  724. if (iTarget == iVictim)
  725. {
  726. iHitgroup = iBody
  727. }
  728.  
  729. // if ptr find target not is iVictim
  730. else if (pHit != iVictim)
  731. {
  732. // get AimOrigin in iVictim
  733. new Float:fVicOrigin[3], Float:fVicViewOfs[3], Float:fAimInVictim[3]
  734. pev(iVictim, pev_origin, fVicOrigin)
  735. pev(iVictim, pev_view_ofs, fVicViewOfs)
  736. xs_vec_add(fVicViewOfs, fVicOrigin, fAimInVictim)
  737. fAimInVictim[2] = fStart[2]
  738. fAimInVictim[2] += get_distance_f(fStart, fAimInVictim) * floattan( fAngles[0] * 2.0, degrees )
  739.  
  740. // check aim in size of iVictim
  741. new iAngleToVictim; iAngleToVictim = get_angle_to_target(iAttacker, fVicOrigin)
  742. iAngleToVictim = abs(iAngleToVictim)
  743. new Float:fDis; fDis = 2.0 * get_distance_f(fStart, fAimInVictim) * floatsin( float(iAngleToVictim) * 0.5, degrees )
  744. new Float:fVicSize[3]
  745. pev(iVictim, pev_size , fVicSize)
  746. if ( fDis <= fVicSize[0] * 0.5 )
  747. {
  748. // TraceLine from fStart to aimOrigin in iVictim
  749. new ptr2; ptr2 = create_tr2()
  750. engfunc(EngFunc_TraceLine, fStart, fAimInVictim, DONT_IGNORE_MONSTERS, iAttacker, ptr2)
  751. new pHit2; pHit2 = get_tr2(ptr2, TR_pHit)
  752. new iHitgroup2; iHitgroup2 = get_tr2(ptr2, TR_iHitgroup)
  753.  
  754. // if ptr2 find target is iVictim
  755. if ( pHit2 == iVictim && (iHitgroup2 != HIT_HEAD || fDis <= fVicSize[0] * 0.25) )
  756. {
  757. pHit = iVictim
  758. iHitgroup = iHitgroup2
  759. get_tr2(ptr2, TR_vecEndPos, fEndPos)
  760. }
  761.  
  762. free_tr2(ptr2)
  763. }
  764.  
  765. // if pHit still not is iVictim then set default HitGroup
  766. if (pHit != iVictim)
  767. {
  768. // set default iHitgroup
  769. iHitgroup = HIT_GENERIC
  770.  
  771. new ptr3; ptr3 = create_tr2()
  772. engfunc(EngFunc_TraceLine, fStart, fVicOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr3)
  773. get_tr2(ptr3, TR_vecEndPos, fEndPos)
  774.  
  775. // free ptr3
  776. free_tr2(ptr3)
  777. }
  778. }
  779.  
  780. // set new Hit & Hitgroup & EndPos
  781. set_tr2(ptr, TR_pHit, iVictim)
  782. set_tr2(ptr, TR_iHitgroup, iHitgroup)
  783. set_tr2(ptr, TR_vecEndPos, fEndPos)
  784.  
  785. // ExecuteHam
  786. fake_trake_attack(iAttacker, iVictim, fDamage, fDirection, ptr)
  787.  
  788. // free ptr
  789. free_tr2(ptr)
  790. }
  791.  
  792. stock fake_trake_attack(iAttacker, iVictim, Float:fDamage, Float:fDirection[3], iTraceHandle, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
  793. {
  794. ExecuteHamB(Ham_TraceAttack, iVictim, iAttacker, fDamage, fDirection, iTraceHandle, iDamageBit)
  795. }
  796.  
  797. stock fake_take_damage(iAttacker, iVictim, Float:fDamage, iInflictor, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
  798. {
  799. ExecuteHamB(Ham_TakeDamage, iVictim, iInflictor, iAttacker, fDamage, iDamageBit)
  800. }
  801.  
  802. stock get_angle_to_target(id, const Float:fTarget[3], Float:TargetSize = 0.0)
  803. {
  804. new Float:fOrigin[3], iAimOrigin[3], Float:fAimOrigin[3], Float:fV1[3]
  805. pev(id, pev_origin, fOrigin)
  806. get_user_origin(id, iAimOrigin, 3) // end position from eyes
  807. IVecFVec(iAimOrigin, fAimOrigin)
  808. xs_vec_sub(fAimOrigin, fOrigin, fV1)
  809.  
  810. new Float:fV2[3]
  811. xs_vec_sub(fTarget, fOrigin, fV2)
  812.  
  813. new iResult; iResult = get_angle_between_vectors(fV1, fV2)
  814.  
  815. if (TargetSize > 0.0)
  816. {
  817. new Float:fTan; fTan = TargetSize / get_distance_f(fOrigin, fTarget)
  818. new fAngleToTargetSize; fAngleToTargetSize = floatround( floatatan(fTan, degrees) )
  819. iResult -= (iResult > 0) ? fAngleToTargetSize : -fAngleToTargetSize
  820. }
  821.  
  822. return iResult
  823. }
  824.  
  825. stock get_angle_between_vectors(const Float:fV1[3], const Float:fV2[3])
  826. {
  827. new Float:fA1[3], Float:fA2[3]
  828. engfunc(EngFunc_VecToAngles, fV1, fA1)
  829. engfunc(EngFunc_VecToAngles, fV2, fA2)
  830.  
  831. new iResult; iResult = floatround(fA1[1] - fA2[1])
  832. iResult = iResult % 360
  833. iResult = (iResult > 180) ? (iResult - 360) : iResult
  834.  
  835. return iResult
  836. }
  837.  
  838. stock Set_UserFov(id, FOV)
  839. {
  840. if(!is_user_connected(id))
  841. return
  842.  
  843. set_pdata_int(id, 363, FOV, 5)
  844. set_pev(id, pev_fov, FOV)
  845. }
  846.