Advertisement
Guest User

Thunder Bolt

a guest
Aug 6th, 2014
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.33 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 <fun>
  8. #include <zombieplague>
  9.  
  10. #define PLUGIN "[CSO] Thunderbolt"
  11. #define VERSION "3.0"
  12. #define AUTHOR "Dias"
  13.  
  14. #define DAMAGE 600
  15. #define DEFAULT_AMMO 20
  16. #define RELOAD_TIME 2.67
  17.  
  18. #define DELAY_SOUND 0.25
  19.  
  20. #define CSW_THUNDERBOLT CSW_AWP
  21. #define weapon_thunderbolt "weapon_awp"
  22. #define old_event "events/awp.sc"
  23. #define old_w_model "models/w_awp.mdl"
  24. #define WEAPON_SECRETCODE 4234234
  25.  
  26. #define V_MODEL "models/v_sfsniper2.mdl"
  27. #define P_MODEL "models/p_sfsniper.mdl"
  28. #define W_MODEL "models/w_sfsniper.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_sfsniper.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. // MACROS
  55. #define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
  56. #define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
  57. #define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))
  58.  
  59. new g_Thunderbolt
  60. new g_Had_Thunderbolt, g_Zoomed, g_Aim_HudId
  61. new Float:g_TargetOrigin[3], Float:CheckDelay[33]
  62. new g_Msg_CurWeapon, g_Msg_AmmoX
  63. new g_Beam_SprId, g_Smoke_SprId, g_HamBot_Register, g_Event_Thunderbolt
  64.  
  65. public plugin_init()
  66. {
  67. register_plugin(PLUGIN, VERSION, AUTHOR)
  68.  
  69. register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
  70.  
  71. register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
  72. register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
  73. register_forward(FM_SetModel, "fw_SetModel")
  74. register_forward(FM_CmdStart, "fw_CmdStart")
  75.  
  76. RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Player")
  77. RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack_World")
  78.  
  79. RegisterHam(Ham_Item_AddToPlayer, weapon_thunderbolt, "fw_AddToPlayer_Post", 1)
  80. RegisterHam(Ham_Item_Deploy, weapon_thunderbolt, "fw_Item_Deploy_Post", 1)
  81.  
  82. g_Msg_CurWeapon = get_user_msgid("CurWeapon")
  83. g_Msg_AmmoX = get_user_msgid("AmmoX")
  84.  
  85. g_Aim_HudId = CreateHudSyncObj(8)
  86.  
  87. register_clcmd("admin_get_thunderbolt", "get_thunderbolt", ADMIN_BAN)
  88. register_clcmd("weapon_sfsniper", "CLCMD_HookWeapon")
  89. }
  90.  
  91. public plugin_precache()
  92. {
  93. precache_model(V_MODEL)
  94. precache_model(P_MODEL)
  95. precache_model(W_MODEL)
  96.  
  97. for(new i = 0; i < sizeof(WeaponSounds); i++)
  98. engfunc(EngFunc_PrecacheSound, WeaponSounds[i])
  99. for(new i = 0; i < sizeof(WeaponResources); i++)
  100. {
  101. if(i == 0) engfunc(EngFunc_PrecacheGeneric, WeaponResources[0])
  102. else engfunc(EngFunc_PrecacheModel, WeaponResources[i])
  103. }
  104.  
  105. g_Beam_SprId = engfunc(EngFunc_PrecacheModel, "sprites/laserbeam.spr")
  106. g_Smoke_SprId = engfunc(EngFunc_PrecacheModel, "sprites/wall_puff1.spr")
  107.  
  108. register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1)
  109. g_Thunderbolt = zp_register_extra_item("Thunderbolt", 30, ZP_TEAM_HUMAN)
  110. }
  111.  
  112. public client_putinserver(id)
  113. {
  114. if(is_user_bot(id) && !g_HamBot_Register)
  115. {
  116. g_HamBot_Register = 1
  117. set_task(0.1, "Do_RegisterHamBot", id)
  118. }
  119. }
  120.  
  121. public Do_RegisterHamBot(id)
  122. {
  123. RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack_Player")
  124. }
  125.  
  126. public fw_PrecacheEvent_Post(type, const name[])
  127. {
  128. if(equal(old_event, name)) g_Event_Thunderbolt = get_orig_retval()
  129. }
  130.  
  131. public zp_extra_item_selected(id, ItemID)
  132. {
  133. if(ItemID == g_Thunderbolt) get_thunderbolt(id)
  134. }
  135.  
  136. public zp_user_infected_post(id) Remove_Thunderbolt(id)
  137.  
  138. public get_thunderbolt(id)
  139. {
  140. Set_BitVar(g_Had_Thunderbolt, id)
  141. UnSet_BitVar(g_Zoomed, id)
  142.  
  143. fm_give_item(id, weapon_thunderbolt)
  144.  
  145. static weapon_ent; weapon_ent = fm_find_ent_by_owner(-1, weapon_thunderbolt, id)
  146. if(pev_valid(weapon_ent)) cs_set_weapon_ammo(weapon_ent, 1)
  147.  
  148. cs_set_user_bpammo(id, CSW_THUNDERBOLT, DEFAULT_AMMO)
  149. }
  150.  
  151. public Remove_Thunderbolt(id)
  152. {
  153. UnSet_BitVar(g_Had_Thunderbolt, id)
  154. UnSet_BitVar(g_Zoomed, id)
  155. }
  156.  
  157. public Event_CurWeapon(id)
  158. {
  159. static CSWID; CSWID = read_data(2)
  160. if(CSWID != CSW_THUNDERBOLT || !Get_BitVar(g_Had_Thunderbolt, id))
  161. return
  162.  
  163. if(cs_get_user_zoom(id) > 1 && !Get_BitVar(g_Zoomed, id)) // Zoom
  164. {
  165. set_pev(id, pev_viewmodel2, "")
  166. Set_BitVar(g_Zoomed, id)
  167. } else { // Not Zoom
  168. set_pev(id, pev_viewmodel2, V_MODEL)
  169. UnSet_BitVar(g_Zoomed, id)
  170. }
  171.  
  172. UpdateAmmo(id, -1, cs_get_user_bpammo(id, CSW_THUNDERBOLT))
  173. }
  174.  
  175. public CLCMD_HookWeapon(id)
  176. {
  177. engclient_cmd(id, weapon_thunderbolt)
  178. return
  179. }
  180.  
  181. public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
  182. {
  183. if(!is_user_alive(id))
  184. return FMRES_IGNORED
  185. if(get_user_weapon(id) == CSW_THUNDERBOLT && Get_BitVar(g_Had_Thunderbolt, id))
  186. set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001)
  187.  
  188. return FMRES_HANDLED
  189. }
  190.  
  191. public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
  192. {
  193. if(eventid != g_Event_Thunderbolt)
  194. return FMRES_IGNORED
  195. if (!is_user_alive(invoker))
  196. return FMRES_IGNORED
  197. if(get_user_weapon(invoker) != CSW_THUNDERBOLT || !Get_BitVar(g_Had_Thunderbolt, invoker))
  198. return FMRES_IGNORED
  199.  
  200. engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
  201. Thunderbolt_Shooting(invoker)
  202.  
  203. return FMRES_SUPERCEDE
  204. }
  205.  
  206. public fw_SetModel(entity, model[])
  207. {
  208. if(!pev_valid(entity))
  209. return FMRES_IGNORED
  210.  
  211. static Classname[64]
  212. pev(entity, pev_classname, Classname, sizeof(Classname))
  213.  
  214. if(!equal(Classname, "weaponbox"))
  215. return FMRES_IGNORED
  216.  
  217. static id
  218. id = pev(entity, pev_owner)
  219.  
  220. if(equal(model, old_w_model))
  221. {
  222. static weapon
  223. weapon = fm_get_user_weapon_entity(entity, CSW_THUNDERBOLT)
  224.  
  225. if(!pev_valid(weapon))
  226. return FMRES_IGNORED
  227.  
  228. if(Get_BitVar(g_Had_Thunderbolt, id))
  229. {
  230. UnSet_BitVar(g_Had_Thunderbolt, id)
  231.  
  232. set_pev(weapon, pev_impulse, WEAPON_SECRETCODE)
  233. set_pev(weapon, pev_iuser4, cs_get_user_bpammo(id, CSW_THUNDERBOLT))
  234.  
  235. engfunc(EngFunc_SetModel, entity, W_MODEL)
  236.  
  237. return FMRES_SUPERCEDE
  238. }
  239. }
  240.  
  241. return FMRES_IGNORED;
  242. }
  243.  
  244. public fw_CmdStart(id, UcHandle, Seed)
  245. {
  246. if(!is_user_alive(id))
  247. return
  248. if(get_user_weapon(id) != CSW_THUNDERBOLT || !Get_BitVar(g_Had_Thunderbolt, id))
  249. return
  250. if(cs_get_user_zoom(id) <= 1)
  251. return
  252.  
  253. if(get_gametime() - DELAY_SOUND > CheckDelay[id])
  254. {
  255. static Body, Target
  256. get_user_aiming(id, Target, Body, 99999)
  257.  
  258. if(is_user_alive(Target))
  259. {
  260. emit_sound(id, CHAN_WEAPON, WeaponSounds[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  261.  
  262. set_hudmessage(250, 0, 0, -1.0, -1.0, 0, 0.1, 0.1)
  263. ShowSyncHudMsg(id, g_Aim_HudId, "+")
  264. }
  265.  
  266. CheckDelay[id] = get_gametime()
  267. }
  268. }
  269.  
  270. public Thunderbolt_Shooting(id)
  271. {
  272. set_weapon_anim(id, TB_ANIM_SHOOT)
  273. emit_sound(id, CHAN_WEAPON, WeaponSounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  274.  
  275. static Ammo; Ammo = cs_get_user_bpammo(id, CSW_THUNDERBOLT)
  276.  
  277. Ammo--
  278. UpdateAmmo(id, -1, Ammo)
  279.  
  280. if(Ammo <= 0)
  281. {
  282. static Ent; Ent = fm_get_user_weapon_entity(id, CSW_THUNDERBOLT)
  283. if(pev_valid(Ent)) cs_set_weapon_ammo(Ent, 0)
  284.  
  285. cs_set_user_bpammo(id, CSW_THUNDERBOLT, 0)
  286. }
  287.  
  288. Create_Laser(id, g_TargetOrigin)
  289.  
  290. // Fixed Shell Eject
  291. set_pdata_float(id, 111, 99999999.0, 5)
  292.  
  293. // Next Attack
  294. Set_Player_NextAttack(id, CSW_THUNDERBOLT, RELOAD_TIME)
  295. }
  296.  
  297. public Create_Laser(id, Float:End[3])
  298. {
  299. static Float:Start[3]
  300. Stock_Get_Postion(id, 50.0, 5.0, -5.0, Start)
  301.  
  302. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  303. write_byte(TE_BEAMPOINTS)
  304. engfunc(EngFunc_WriteCoord, Start[0])
  305. engfunc(EngFunc_WriteCoord, Start[1])
  306. engfunc(EngFunc_WriteCoord, Start[2])
  307. engfunc(EngFunc_WriteCoord, End[0])
  308. engfunc(EngFunc_WriteCoord, End[1])
  309. engfunc(EngFunc_WriteCoord, End[2])
  310. write_short(g_Beam_SprId)
  311. write_byte(0)
  312. write_byte(0)
  313. write_byte(10)
  314. write_byte(25)
  315. write_byte(0)
  316. write_byte(0)
  317. write_byte(0)
  318. write_byte(200)
  319. write_byte(200)
  320. write_byte(0)
  321. message_end()
  322. }
  323.  
  324. public fw_AddToPlayer_Post(ent, id)
  325. {
  326. if(pev(ent, pev_impulse) == WEAPON_SECRETCODE)
  327. {
  328. Set_BitVar(g_Had_Thunderbolt, id)
  329. cs_set_user_bpammo(id, CSW_THUNDERBOLT, pev(ent, pev_iuser4))
  330.  
  331. set_pev(ent, pev_impulse, 0)
  332. }
  333.  
  334. message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("WeaponList"), _, id)
  335. write_string((Get_BitVar(g_Had_Thunderbolt, id) ? "weapon_sfsniper" : "weapon_awp"))
  336. write_byte(1)
  337. write_byte(30)
  338. write_byte(-1)
  339. write_byte(-1)
  340. write_byte(0)
  341. write_byte(2)
  342. write_byte(CSW_THUNDERBOLT)
  343. write_byte(0)
  344. message_end()
  345. }
  346.  
  347. public fw_TraceAttack_Player(ent, attacker, Float:Damage, Float:fDir[3], ptr, iDamageType)
  348. {
  349. if(!is_user_alive(attacker))
  350. return HAM_IGNORED
  351. if(get_user_weapon(attacker) != CSW_THUNDERBOLT || !Get_BitVar(g_Had_Thunderbolt, attacker))
  352. return HAM_IGNORED
  353.  
  354. get_tr2(ptr, TR_vecEndPos, g_TargetOrigin)
  355. SetHamParamFloat(3, float(DAMAGE))
  356.  
  357. return HAM_HANDLED
  358. }
  359.  
  360. public fw_TraceAttack_World(ent, attacker, Float:Damage, Float:fDir[3], ptr, iDamageType)
  361. {
  362. if(!is_user_alive(attacker))
  363. return HAM_IGNORED
  364. if(get_user_weapon(attacker) != CSW_THUNDERBOLT || !Get_BitVar(g_Had_Thunderbolt, attacker))
  365. return HAM_IGNORED
  366.  
  367. get_tr2(ptr, TR_vecEndPos, g_TargetOrigin)
  368. Make_WorldHitEffect(attacker, ptr)
  369.  
  370. SetHamParamFloat(3, float(DAMAGE))
  371.  
  372. return HAM_HANDLED
  373. }
  374.  
  375. public fw_Item_Deploy_Post(Ent)
  376. {
  377. if(!pev_valid(Ent))
  378. return
  379.  
  380. static Id; Id = get_pdata_cbase(Ent, 41, 4)
  381. if(!Get_BitVar(g_Had_Thunderbolt, Id))
  382. return
  383.  
  384. UnSet_BitVar(g_Zoomed, Id)
  385.  
  386. set_pev(Id, pev_viewmodel2, V_MODEL)
  387. set_pev(Id, pev_weaponmodel2, P_MODEL)
  388.  
  389. set_weapon_anim(Id, TB_ANIM_DRAW)
  390. }
  391.  
  392. public UpdateAmmo(Id, Ammo, BpAmmo)
  393. {
  394. static weapon_ent; weapon_ent = fm_get_user_weapon_entity(Id, CSW_THUNDERBOLT)
  395. if(pev_valid(weapon_ent))
  396. {
  397. if(BpAmmo > 0) cs_set_weapon_ammo(weapon_ent, 1)
  398. else cs_set_weapon_ammo(weapon_ent, 0)
  399. }
  400.  
  401. engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, g_Msg_CurWeapon, {0, 0, 0}, Id)
  402. write_byte(1)
  403. write_byte(CSW_THUNDERBOLT)
  404. write_byte(-1)
  405. message_end()
  406.  
  407. message_begin(MSG_ONE_UNRELIABLE, g_Msg_AmmoX, _, Id)
  408. write_byte(1)
  409. write_byte(BpAmmo)
  410. message_end()
  411.  
  412. cs_set_user_bpammo(Id, CSW_THUNDERBOLT, BpAmmo)
  413. }
  414.  
  415. public Make_WorldHitEffect(id, TrResult)
  416. {
  417. // Handle First
  418. static Float:vecSrc[3], Float:vecEnd[3], TE_FLAG
  419.  
  420. get_weapon_attachment(id, vecSrc)
  421. global_get(glb_v_forward, vecEnd)
  422.  
  423. xs_vec_mul_scalar(vecEnd, 8192.0, vecEnd)
  424. xs_vec_add(vecSrc, vecEnd, vecEnd)
  425.  
  426. get_tr2(TrResult, TR_vecEndPos, vecSrc)
  427. get_tr2(TrResult, TR_vecPlaneNormal, vecEnd)
  428.  
  429. xs_vec_mul_scalar(vecEnd, 2.5, vecEnd)
  430. xs_vec_add(vecSrc, vecEnd, vecEnd)
  431.  
  432. TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
  433. TE_FLAG |= TE_EXPLFLAG_NOSOUND
  434. TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
  435.  
  436. // Make Spark
  437. for(new i = 0; i < 3; i++)
  438. {
  439. engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEnd, 0)
  440. write_byte(TE_SPARKS)
  441. engfunc(EngFunc_WriteCoord, vecEnd[0])
  442. engfunc(EngFunc_WriteCoord, vecEnd[1])
  443. engfunc(EngFunc_WriteCoord, vecEnd[2] - 10.0)
  444. message_end()
  445. }
  446.  
  447. // Make Smoke
  448. engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEnd, 0)
  449. write_byte(TE_EXPLOSION)
  450. engfunc(EngFunc_WriteCoord, vecEnd[0])
  451. engfunc(EngFunc_WriteCoord, vecEnd[1])
  452. engfunc(EngFunc_WriteCoord, vecEnd[2] - 10.0)
  453. write_short(g_Smoke_SprId)
  454. write_byte(2)
  455. write_byte(50)
  456. write_byte(TE_FLAG)
  457. message_end()
  458. }
  459.  
  460. stock set_weapon_anim(id, anim)
  461. {
  462. set_pev(id, pev_weaponanim, anim)
  463.  
  464. message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
  465. write_byte(anim)
  466. write_byte(pev(id, pev_body))
  467. message_end()
  468. }
  469.  
  470. stock Stock_Get_Postion(id,Float:forw,Float:right, Float:up,Float:vStart[])
  471. {
  472. static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
  473.  
  474. pev(id, pev_origin, vOrigin)
  475. pev(id, pev_view_ofs,vUp) //for player
  476. xs_vec_add(vOrigin,vUp,vOrigin)
  477. pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
  478.  
  479. angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
  480. angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
  481. angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
  482.  
  483. vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
  484. vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
  485. vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
  486. }
  487.  
  488. stock get_weapon_attachment(id, Float:output[3], Float:fDis = 40.0)
  489. {
  490. static Float:vfEnd[3], viEnd[3]
  491. get_user_origin(id, viEnd, 3)
  492. IVecFVec(viEnd, vfEnd)
  493.  
  494. static Float:fOrigin[3], Float:fAngle[3]
  495.  
  496. pev(id, pev_origin, fOrigin)
  497. pev(id, pev_view_ofs, fAngle)
  498.  
  499. xs_vec_add(fOrigin, fAngle, fOrigin)
  500.  
  501. static Float:fAttack[3]
  502.  
  503. xs_vec_sub(vfEnd, fOrigin, fAttack)
  504. xs_vec_sub(vfEnd, fOrigin, fAttack)
  505.  
  506. static Float:fRate
  507.  
  508. fRate = fDis / vector_length(fAttack)
  509. xs_vec_mul_scalar(fAttack, fRate, fAttack)
  510.  
  511. xs_vec_add(fOrigin, fAttack, output)
  512. }
  513.  
  514. stock Set_Player_NextAttack(id, CSWID, Float:NextTime)
  515. {
  516. static Ent; Ent = fm_get_user_weapon_entity(id, CSWID)
  517. if(!pev_valid(Ent)) return
  518.  
  519. set_pdata_float(id, 83, NextTime, 5)
  520.  
  521. set_pdata_float(Ent, 46 , NextTime, 4)
  522. set_pdata_float(Ent, 47, NextTime, 4)
  523. set_pdata_float(Ent, 48, NextTime, 4)
  524. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement