Advertisement
mihay111

gugnir-vip

Jul 26th, 2019
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 33.47 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <engine>
  3. #include <fakemeta_util>
  4. #include <hamsandwich>
  5. #include <cstrike>
  6. #include <zombieplague>
  7. #include <zmvip>
  8.  
  9. #pragma tabsize 0
  10.  
  11. #define PLUGIN "AMXX Gungnir"
  12. #define VERSION "1.0"
  13. #define AUTHOR "Asdian"
  14.  
  15. // Data Config
  16. #define P_GUNGNIR "models/p_gungnira.mdl"
  17. #define P_GUNGNIR2 "models/p_gungnirb.mdl"
  18. #define V_GUNGNIR "models/v_gungnir.mdl"
  19. #define W_GUNGNIR "models/w_gungnir.mdl"
  20.  
  21. #define MF_W "sprites/muzzleflash81.spr"
  22. #define MODEL_W_OLD "models/w_mac10.mdl"
  23. #define WEAPON_CODE 02062019
  24.  
  25. #define CSW_GUNGNIR CSW_MAC10
  26. #define weapon_gungnir "weapon_mac10"
  27.  
  28. enum _:NewAnim
  29. {
  30. ANIM_IDLE = 0,
  31. ANIM_RELOAD,
  32. ANIM_DRAW,
  33. ANIM_SHOOT_START,
  34. ANIM_SHOOT_LOOP,
  35. ANIM_SHOOT_END,
  36. ANIM_SHOOT2,
  37. ANIM_SHOOT2_CHARGE,
  38. ANIM_SHOOT2_SHOTCHARGE,
  39. ANIM_CHARGE_LOOP
  40. }
  41.  
  42. new const SOUND_FIRE[][] =
  43. {
  44. "weapons/gungnir_shoot_loop.wav",
  45. "weapons/gungnir_shoot_end.wav",
  46. "weapons/gungnir_shoot_b.wav",
  47. "weapons/gungnir_charge_shoot1.wav",
  48.  
  49. // exps
  50. "weapons/gungnir_shoot_b_exp.wav",
  51. "weapons/gungnir_charge_shoot_exp.wav",
  52. "weapons/gungnir_charge_shoot_exp2.wav"
  53. }
  54.  
  55. new const EXP_MODELS[][] =
  56. {
  57. "sprites/ef_gungnir_aexplo.spr",
  58. "sprites/ef_gungnir_bexplo.spr",
  59. "sprites/ef_gungnir_chargeexplo.spr",
  60. "sprites/ef_gungnir_lightline1.spr",
  61. "sprites/ef_gungnir_lightline2.spr",
  62. "sprites/ef_gungnir_missile.spr",
  63. "sprites/ef_gungnir_xbeam.spr",
  64.  
  65. "models/gungnir_missile.mdl"
  66. }
  67.  
  68. // Weapon Config
  69. #define ACCURACY 23 // 0 - 100 ; -1 Default
  70. #define CLIP 50
  71. #define BPAMMO 999
  72. #define SPEED 0.113
  73. #define RECOIL 0.5
  74. #define RELOAD_TIME 2.03
  75.  
  76. #define ELECTRO_DAMAGE 50.0
  77. #define ELECTRO_RANGE 256.0
  78. #define ELECTRO_KNOCKBACK 150.0 // the velocity of victim when got damage
  79.  
  80. // base damage
  81. #define WDAMG_PLASMA 500.0
  82. #define WDAMG_CHARGE 700.0
  83. #define WDAMG_BEAM 175.0
  84.  
  85. // range
  86. #define WRANGE_PLASMA 210.0
  87. #define WRANGE_CHARGE 250.0
  88. #define WRANGE_BEAM 75.0
  89.  
  90. // knockback
  91. #define WKNOCK_CHARGE 25.0 // only charge
  92.  
  93. // MACROS
  94. #define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
  95. #define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
  96. #define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))
  97.  
  98. new g_cachde_mf, Float:g_cache_frame_mf, g_cache_light, g_cache_hit, g_cache_exp[2], g_cache_beam[2], g_SpraySpr, g_DropSpr
  99. new g_Had_Base, g_Clip[33], g_OldWeapon[33], g_Dprd, g_iVic[3]
  100.  
  101. // Safety
  102. new g_HamBot
  103. new g_IsConnected, g_IsAlive, g_PlayerWeapon[33]
  104.  
  105. public plugin_init()
  106. {
  107. register_plugin(PLUGIN, VERSION, AUTHOR)
  108.  
  109. // Safety
  110. Register_SafetyFunc()
  111.  
  112. // Event
  113. register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
  114. register_message(get_user_msgid("DeathMsg"), "message_DeathMsg")
  115.  
  116. // Forward
  117. register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
  118. register_forward(FM_SetModel, "fw_SetModel")
  119.  
  120. // Ham
  121. RegisterHam(Ham_Item_Deploy, weapon_gungnir, "fw_Item_Deploy_Post", 1)
  122. RegisterHam(Ham_Item_AddToPlayer, weapon_gungnir, "fw_Item_AddToPlayer_Post", 1)
  123. //RegisterHam(Ham_Weapon_WeaponIdle, weapon_gungnir, "fw_Weapon_WeaponIdle_Post", 1)
  124. RegisterHam(Ham_Item_PostFrame, weapon_gungnir, "fw_Item_PostFrame")
  125. RegisterHam(Ham_Weapon_Reload, weapon_gungnir, "fw_Weapon_Reload")
  126. RegisterHam(Ham_Weapon_Reload, weapon_gungnir, "fw_Weapon_Reload_Post", 1)
  127. RegisterHam(Ham_Think, "env_sprite", "fw_MF_Think")
  128. RegisterHam(Ham_Think, "info_target", "HamF_InfoTarget_Think")
  129. RegisterHam(Ham_Touch, "info_target", "HamF_InfoTarget_Touch")
  130.  
  131. // Cache
  132. register_clcmd("weapon_gungnir", "hook_weapon")
  133. g_Dprd = zv_register_extra_item("Gungnir","Gungnir VIP", 50, ZV_TEAM_HUMAN | ZP_TEAM_SURVIVOR)
  134. }
  135.  
  136. public hook_weapon(id) engclient_cmd(id, weapon_gungnir)
  137.  
  138. public plugin_precache()
  139. {
  140. precache_model(P_GUNGNIR)
  141. precache_model(P_GUNGNIR2)
  142. precache_model(V_GUNGNIR)
  143. precache_model(W_GUNGNIR)
  144.  
  145. new i
  146. for(i = 0; i < sizeof SOUND_FIRE; i++) precache_sound(SOUND_FIRE[i])
  147. for(i = 0; i < sizeof EXP_MODELS; i++)
  148. {
  149. if(!i) g_cache_hit = precache_model(EXP_MODELS[i])
  150. else if(i == 1) g_cache_exp[0] = precache_model(EXP_MODELS[i])
  151. else if(i == 2) g_cache_exp[1] = precache_model(EXP_MODELS[i])
  152. else if(i == 3) g_cache_beam[0] = precache_model(EXP_MODELS[i])
  153. else if(i == 4) g_cache_beam[1] = precache_model(EXP_MODELS[i])
  154. else if(i == 6) g_cache_light = precache_model(EXP_MODELS[i])
  155. else precache_model(EXP_MODELS[i])
  156. }
  157. precache_generic("sprites/weapon_gungnir.txt")
  158.  
  159. g_SpraySpr = precache_model("sprites/bloodspray.spr")
  160. g_DropSpr = precache_model("sprites/blood.spr")
  161. g_cachde_mf = precache_model(MF_W)
  162. g_cache_frame_mf = float(engfunc(EngFunc_ModelFrames, g_cachde_mf))
  163. }
  164.  
  165. public message_DeathMsg(msg_id, msg_dest, msg_ent)
  166. {
  167. new szWeapon[64]
  168. get_msg_arg_string(4, szWeapon, charsmax(szWeapon))
  169.  
  170. if (strcmp(szWeapon, "mac10"))
  171. return PLUGIN_CONTINUE
  172.  
  173. new id = get_msg_arg_int(1)
  174. new iEntity = get_pdata_cbase(id, 373)
  175.  
  176. if (!pev_valid(iEntity) || get_pdata_int(iEntity, 43, 4) != CSW_GUNGNIR || !Get_BitVar(g_Had_Base, id))
  177. return PLUGIN_CONTINUE
  178.  
  179. set_msg_arg_string(4, "gungnir")
  180. return PLUGIN_CONTINUE
  181. }
  182.  
  183. public client_putinserver(id)
  184. {
  185. Safety_Connected(id)
  186.  
  187. if(!g_HamBot && is_user_bot(id))
  188. {
  189. g_HamBot = 1
  190. set_task(0.1, "Register_HamBot", id)
  191. }
  192. }
  193.  
  194. public Register_HamBot(id)
  195. {
  196. Register_SafetyFuncBot(id)
  197. }
  198. public client_disconnect(id)
  199. {
  200. Safety_Disconnected(id)
  201. }
  202.  
  203. public zv_extra_item_selected(i, d) if(d == g_Dprd) Get_Base(i)
  204. public zp_user_infected_post(i) if(zp_get_user_zombie(i)) Remove_Base(i)
  205. public zp_user_humanized_post(i) if(zp_get_user_survivor(i)) Remove_Base(i)
  206.  
  207. public Get_Base(id)
  208. {
  209. Set_BitVar(g_Had_Base, id)
  210.  
  211. Stock_Drop_Slot(id, 1)
  212. fm_give_item(id, weapon_gungnir)
  213.  
  214. // Clip & Ammo
  215. static Ent; Ent = fm_get_user_weapon_entity(id, CSW_GUNGNIR)
  216. if(pev_valid(Ent)) cs_set_weapon_ammo(Ent, CLIP)
  217. cs_set_user_bpammo(id, CSW_GUNGNIR, BPAMMO)
  218.  
  219. engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, get_user_msgid("CurWeapon"), {0, 0, 0}, id)
  220. write_byte(1)
  221. write_byte(CSW_GUNGNIR)
  222. write_byte(CLIP)
  223. message_end()
  224.  
  225. ExecuteHamB(Ham_Item_Deploy, Ent)
  226. }
  227.  
  228. public Remove_Base(id)
  229. {
  230. UnSet_BitVar(g_Had_Base, id)
  231. }
  232.  
  233. public Event_CurWeapon(id)
  234. {
  235. static CSWID; CSWID = read_data(2)
  236.  
  237. if((CSWID == CSW_GUNGNIR && g_OldWeapon[id] != CSW_GUNGNIR) && Get_BitVar(g_Had_Base, id))
  238. {
  239. Draw_NewWeapon(id, CSWID)
  240. } else if((CSWID == CSW_GUNGNIR && g_OldWeapon[id] == CSW_GUNGNIR) && Get_BitVar(g_Had_Base, id)) {
  241. static Ent; Ent = fm_get_user_weapon_entity(id, CSW_GUNGNIR)
  242. if(!pev_valid(Ent))
  243. {
  244. g_OldWeapon[id] = get_user_weapon(id)
  245. return
  246. }
  247. } else if(CSWID != CSW_GUNGNIR && g_OldWeapon[id] == CSW_GUNGNIR) {
  248. Draw_NewWeapon(id, CSWID)
  249. }
  250.  
  251. g_OldWeapon[id] = get_user_weapon(id)
  252. }
  253.  
  254. public Draw_NewWeapon(id, CSW_ID)
  255. {
  256. if(CSW_ID == CSW_GUNGNIR)
  257. {
  258. static ent
  259. ent = fm_get_user_weapon_entity(id, CSW_GUNGNIR)
  260.  
  261. if(pev_valid(ent) && Get_BitVar(g_Had_Base, id))
  262. set_pev(ent, pev_effects, pev(ent, pev_effects) &~ EF_NODRAW)
  263. } else {
  264. static ent
  265. ent = fm_get_user_weapon_entity(id, CSW_GUNGNIR)
  266.  
  267. if(pev_valid(ent)) set_pev(ent, pev_effects, pev(ent, pev_effects) | EF_NODRAW)
  268. }
  269.  
  270. }
  271. public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
  272. {
  273. if(!is_alive(id))
  274. return FMRES_IGNORED
  275. if(get_user_weapon(id) == CSW_GUNGNIR && Get_BitVar(g_Had_Base, id))
  276. set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001)
  277.  
  278. return FMRES_HANDLED
  279. }
  280.  
  281. public fw_SetModel(entity, model[])
  282. {
  283. if(!pev_valid(entity))
  284. return FMRES_IGNORED
  285.  
  286. static Classname[32]
  287. pev(entity, pev_classname, Classname, sizeof(Classname))
  288.  
  289. if(!equal(Classname, "weaponbox"))
  290. return FMRES_IGNORED
  291.  
  292. static iOwner
  293. iOwner = pev(entity, pev_owner)
  294.  
  295. if(equal(model, MODEL_W_OLD))
  296. {
  297. static weapon; weapon = find_ent_by_owner(-1, weapon_gungnir, entity)
  298.  
  299. if(!pev_valid(weapon))
  300. return FMRES_IGNORED;
  301.  
  302. if(Get_BitVar(g_Had_Base, iOwner))
  303. {
  304. set_pev(weapon, pev_impulse, WEAPON_CODE)
  305. engfunc(EngFunc_SetModel, entity, W_GUNGNIR)
  306.  
  307. Remove_Base(iOwner)
  308. return FMRES_SUPERCEDE
  309. }
  310. }
  311.  
  312. return FMRES_IGNORED;
  313. }
  314.  
  315. public fw_Item_Deploy_Post(Ent)
  316. {
  317. if(pev_valid(Ent) != 2)
  318. return
  319. static Id; Id = get_pdata_cbase(Ent, 41, 4)
  320.  
  321. if(get_pdata_cbase(Id, 373) != Ent)
  322. return
  323. if(!Get_BitVar(g_Had_Base, Id))
  324. return
  325.  
  326. set_pev(Id, pev_viewmodel2, V_GUNGNIR)
  327. set_pev(Id, pev_weaponmodel2, P_GUNGNIR)
  328.  
  329. Set_WeaponAnim(Id, ANIM_DRAW)
  330. set_pdata_string(Id, (492 * 4), "m249", -1, 20)
  331. Set_WpnList(Id)
  332.  
  333. set_pdata_float(Ent, 46, 1.03, 4)
  334. set_pdata_float(Ent, 47, 1.03, 4)
  335. set_pdata_float(Ent, 48, 1.03, 4)
  336.  
  337. set_pev(Ent, pev_iuser1, 0);
  338. set_pev(Ent, pev_iuser2, 0);
  339.  
  340. static iClip
  341. iClip = get_pdata_int(Ent, 51, 4)
  342.  
  343. engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, get_user_msgid("CurWeapon"), {0, 0, 0}, Id)
  344. write_byte(1)
  345. write_byte(CSW_GUNGNIR)
  346. write_byte(iClip)
  347. message_end()
  348. }
  349.  
  350. public fw_Item_AddToPlayer_Post(Ent, id)
  351. {
  352. if(!pev_valid(Ent))
  353. return HAM_IGNORED
  354.  
  355. if(pev(Ent, pev_impulse) == WEAPON_CODE)
  356. {
  357. Set_BitVar(g_Had_Base, id)
  358. set_pev(Ent, pev_impulse, 0)
  359. }
  360.  
  361. return HAM_IGNORED
  362. }
  363.  
  364. public fw_Item_PostFrame(ent)
  365. {
  366. static id; id = pev(ent, pev_owner)
  367. if(!is_user_alive(id))
  368. return HAM_IGNORED
  369. if(!Get_BitVar(g_Had_Base, id))
  370. return HAM_IGNORED
  371.  
  372. static Float:flNextAttack; flNextAttack = get_pdata_float(id, 83, 5)
  373. static bpammo; bpammo = cs_get_user_bpammo(id, CSW_GUNGNIR)
  374.  
  375. static iClip; iClip = get_pdata_int(ent, 51, 4)
  376. static fInReload; fInReload = get_pdata_int(ent, 54, 4)
  377.  
  378. if(fInReload && flNextAttack <= 0.0)
  379. {
  380. static temp1
  381. temp1 = min(CLIP - iClip, bpammo)
  382.  
  383. set_pdata_int(ent, 51, iClip + temp1, 4)
  384. cs_set_user_bpammo(id, CSW_GUNGNIR, bpammo - temp1)
  385.  
  386. fInReload = 0
  387. set_pdata_int(ent, 54, fInReload, 4)
  388. set_pdata_float(ent, 46, 0.01, 4)
  389. }
  390.  
  391. WE_GUNGNIR(id, ent, iClip,bpammo,pev(id, pev_button))
  392. return HAM_IGNORED
  393. }
  394.  
  395. public WE_GUNGNIR(id,iEnt,iClip, bpammo,iButton)
  396. {
  397. new Float:flNextPrimaryAttack, Float:fCurTime, iState, Float:fSound, iCharge
  398. global_get(glb_time, fCurTime)
  399. pev(iEnt, pev_fuser1, fSound)
  400. pev(iEnt, pev_fuser2, flNextPrimaryAttack)
  401. iCharge = pev(iEnt, pev_iuser1)
  402. iState = pev(iEnt, pev_iuser2)
  403. new pEntity = -1
  404.  
  405. if(get_pdata_float(iEnt, 46, 4) > 0.0)
  406. return
  407.  
  408. if((!(iButton & IN_ATTACK) || !iClip) && iState == 1)
  409. {
  410. Set_WeaponAnim(id, ANIM_SHOOT_END)
  411.  
  412. set_pdata_float(iEnt, 46, 0.33, 4)
  413. set_pdata_float(iEnt, 48, 0.33, 4)
  414. set_pev(iEnt, pev_iuser2, 0)
  415.  
  416. emit_sound(id, CHAN_WEAPON, SOUND_FIRE[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  417. }
  418.  
  419. if(!(iButton & IN_ATTACK2) && 0 < iCharge < 3)
  420. {
  421. new bool:iMax = (iCharge == 2) ? true : false
  422.  
  423. new Float:vOrigin[3], Float:vAngles[3], Float:vVec[3],Float:vAngle[3],Float:vecEnd2[3]
  424. engfunc(EngFunc_GetAttachment, id, 1, vOrigin, vAngle)
  425.  
  426. Stock_Get_Aiming(id, vecEnd2)
  427. Stock_GetSpeedVector(vOrigin, vecEnd2, 4000.0, vVec)
  428.  
  429. static iBall
  430. iBall = Stock_CreateEntityBase(id, "info_target", MOVETYPE_FLY, EXP_MODELS[iMax?7:5], "gungnir_plasma", SOLID_BBOX, 0.01)
  431. engfunc(EngFunc_SetSize, iBall, Float:{-0.5, -0.5, 0.5}, Float:{0.5, 0.5, 0.5})
  432.  
  433. set_pev(iBall, pev_origin, vOrigin)
  434. if(!iMax) set_pev(iBall, pev_rendermode, kRenderTransAdd)
  435. set_pev(iBall, pev_renderamt, 255.0)
  436. set_pev(iBall, pev_gravity, 0.01)
  437. set_pev(iBall, pev_frame, 0.0)
  438. set_pev(iBall, pev_framerate, 1.0)
  439. if(!iMax) set_pev(iBall, pev_scale, 0.1)
  440. set_pev(iBall, pev_velocity, vVec)
  441. set_pev(iBall, pev_iuser1, iMax?1:0)
  442.  
  443. if(iMax)
  444. {
  445. set_pev(iBall, pev_vuser1, vOrigin)
  446. set_pev(iBall, pev_vuser2, vecEnd2)
  447. }
  448.  
  449. static Float:vVelocity[3]
  450. pev(iBall, pev_velocity, vVelocity)
  451. vector_to_angle(vVelocity, vAngles)
  452. if(vAngles[0] > 90.0) vAngles[0] = -(360.0 - vAngles[0])
  453. set_pev(iBall, pev_angles, vAngles)
  454.  
  455. Set_WeaponAnim(id, iMax?ANIM_SHOOT2_SHOTCHARGE:ANIM_SHOOT2)
  456. emit_sound(id, CHAN_WEAPON, SOUND_FIRE[iMax?3:2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  457.  
  458. if(iClip >= 5) iClip -= 5
  459. else iClip = 0
  460. set_pdata_int(iEnt, 51, iClip, 4)
  461.  
  462. set_pdata_float(iEnt, 46, iMax?3.13:0.5, 4)
  463. set_pdata_float(iEnt, 48, iMax?3.5:0.75, 4)
  464.  
  465. Stock_SetPlayerAnim(id, iMax?"shoot_grenade":"shoot_m249")
  466. set_pev(id, pev_weaponmodel2, "")
  467. set_pev(iEnt, pev_iuser1, iMax?3:0)
  468.  
  469. if(iMax) set_pev(iEnt, pev_fuser3, fCurTime + 0.33)
  470. }
  471.  
  472. if(iCharge == 3 && fSound < fCurTime)
  473. {
  474. Stock_SetPlayerAnim(id, "aim_m249")
  475. set_pev(id, pev_weaponmodel2, P_GUNGNIR)
  476. set_pev(iEnt, pev_iuser1, 0)
  477. }
  478.  
  479. if(iButton & IN_ATTACK && iClip)
  480. {
  481. if(fSound < fCurTime)
  482. {
  483. emit_sound(id, CHAN_WEAPON, SOUND_FIRE[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  484. set_pev(iEnt, pev_fuser1, fCurTime + 1.0)
  485. }
  486.  
  487. if(!iState)
  488. {
  489. Set_WeaponAnim(id, ANIM_SHOOT_START)
  490.  
  491. set_pdata_float(iEnt, 46, 0.23, 4)
  492. set_pdata_float(iEnt, 48, 0.23, 4)
  493. set_pev(iEnt, pev_iuser2, 1)
  494. }
  495.  
  496. if(iState == 1)
  497. {
  498. iClip--
  499. set_pdata_int(iEnt, 51, iClip, 4)
  500.  
  501. set_pdata_float(iEnt, 46, SPEED, 4)
  502. set_pdata_float(iEnt, 48, SPEED + 0.5, 4)
  503.  
  504. MakeMuzzleFlash(id, iEnt)
  505. Set_WeaponAnim(id, ANIM_SHOOT_LOOP)
  506. Stock_SetPlayerAnim(id, "shoot_m249")
  507.  
  508. if(flNextPrimaryAttack > fCurTime)
  509. return
  510.  
  511. set_pev(iEnt, pev_fuser2, fCurTime + 0.01)
  512.  
  513. new Float:fOrigin[3], Float:fEnd[3], Float:LOL[3][3]
  514. pev(id, pev_origin, fOrigin)
  515. Stock_Get_Postion(id, 64.0, 0.0, 0.0, fEnd)
  516.  
  517. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  518. write_byte(TE_BEAMENTPOINT)
  519. write_short(id | 0x1000)
  520. engfunc(EngFunc_WriteCoord, fEnd[0])
  521. engfunc(EngFunc_WriteCoord, fEnd[1])
  522. engfunc(EngFunc_WriteCoord, fEnd[2])
  523. write_short(g_cache_light)
  524. write_byte(0) // framerate
  525. write_byte(0) // framerate
  526. write_byte(1) // life
  527. write_byte(40) // width
  528. write_byte(10)// noise
  529. write_byte(26)// r, g, b
  530. write_byte(164)// r, g, b
  531. write_byte(255)// r, g, b
  532. write_byte(255) // brightness
  533. write_byte(255) // speed
  534. message_end()
  535.  
  536. new k
  537. for(k = 0; k < 3; k++)
  538. {
  539. while((pEntity = engfunc(EngFunc_FindEntityInSphere, pEntity, fOrigin, ELECTRO_RANGE)) != 0)
  540. {
  541. if(pev(pEntity, pev_takedamage) == DAMAGE_NO) continue
  542. if(is_user_connected(pEntity) && pEntity != id)
  543. if(!can_damage(pEntity, id)) continue
  544. if(pEntity == id) continue
  545. if(k == 1 && pEntity == g_iVic[0]) continue
  546. if(k == 2 && (pEntity == g_iVic[0] || pEntity == g_iVic[1])) continue
  547.  
  548. if(pev_valid(pEntity))
  549. {
  550. new Float:tempOrigin[3]
  551. pev(pEntity, pev_origin, tempOrigin)
  552.  
  553. if(get_distance_f(fOrigin, tempOrigin) < ELECTRO_RANGE)
  554. g_iVic[k] = pEntity
  555. }
  556. }
  557.  
  558. pev(g_iVic[k], pev_origin, LOL[k])
  559.  
  560. if(is_user_alive(g_iVic[k]) && can_damage(id, g_iVic[k]) && entity_range(id, g_iVic[k]) < ELECTRO_RANGE && !Stock_Blah(fOrigin, LOL[k], id))
  561. {
  562. engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, fOrigin, 0)
  563. write_byte(TE_EXPLOSION)
  564. engfunc(EngFunc_WriteCoord, LOL[k][0])
  565. engfunc(EngFunc_WriteCoord, LOL[k][1])
  566. engfunc(EngFunc_WriteCoord, LOL[k][2] - 15.0)
  567. write_short(g_cache_hit)
  568. write_byte(2)
  569. write_byte(30)
  570. write_byte(TE_EXPLFLAG_NODLIGHTS|TE_EXPLFLAG_NOSOUND|TE_EXPLFLAG_NOPARTICLES)
  571. message_end()
  572.  
  573. engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, fOrigin, 0)
  574. write_byte(TE_BEAMPOINTS)
  575. engfunc(EngFunc_WriteCoord, LOL[k][0])
  576. engfunc(EngFunc_WriteCoord, LOL[k][1])
  577. engfunc(EngFunc_WriteCoord, LOL[k][2])
  578. engfunc(EngFunc_WriteCoord, fEnd[0])
  579. engfunc(EngFunc_WriteCoord, fEnd[1])
  580. engfunc(EngFunc_WriteCoord, fEnd[2])
  581. write_short(g_cache_light)
  582. write_byte(0) // byte (starting frame)
  583. write_byte(10) // byte (frame rate in 0.1's)
  584. write_byte(1) // byte (life in 0.1's)
  585. write_byte(55) // byte (line width in 0.1's)
  586. write_byte(17) // byte (noise amplitude in 0.01's)
  587. write_byte(26) // byte,byte,byte (color) (R)
  588. write_byte(164) // (G)
  589. write_byte(255) // (B)
  590. write_byte(255) // byte (brightness)
  591. write_byte(10) // byte (scroll speed in 0.1's)
  592. message_end()
  593.  
  594. ExecuteHamB(Ham_TakeDamage, g_iVic[k], id, id, ELECTRO_DAMAGE, DMG_SHOCK)
  595.  
  596. if(1 <= g_iVic[k] <= 32)
  597. {
  598. new Float:vAttacker[3], Float:vVictim[3]
  599. pev(id, pev_origin, vAttacker)
  600. pev(g_iVic[k], pev_origin, vVictim)
  601. xs_vec_sub(vVictim, vAttacker, vVictim)
  602.  
  603. new Float:fDistance
  604. fDistance = xs_vec_len(vVictim)
  605. xs_vec_mul_scalar(vVictim, 1 / fDistance, vVictim)
  606. xs_vec_mul_scalar(vVictim, ELECTRO_KNOCKBACK, vVictim)
  607. set_pev(g_iVic[k], pev_velocity, vVictim)
  608.  
  609. SpawnBlood(LOL[k], get_pdata_int(g_iVic[k],89), floatround(ELECTRO_DAMAGE))
  610. }
  611. }
  612. }
  613. }
  614. }
  615.  
  616. if(iButton & IN_ATTACK2 && iClip)
  617. {
  618. if(flNextPrimaryAttack > fCurTime)
  619. return
  620.  
  621. switch(iCharge)
  622. {
  623. case 0:
  624. {
  625. set_pdata_float(iEnt, 46, 0.5, 4)
  626.  
  627. set_pev(iEnt, pev_fuser2, fCurTime + 0.5)
  628. set_pev(iEnt, pev_iuser1, 1)
  629. }
  630. case 1:
  631. {
  632. Set_WeaponAnim(id, ANIM_SHOOT2_CHARGE)
  633. set_pdata_float(iEnt, 46, 2.03, 4)
  634.  
  635. set_pev(iEnt, pev_fuser2, fCurTime + 2.03)
  636. set_pev(iEnt, pev_iuser1, 2)
  637. }
  638. case 2:
  639. {
  640. Set_WeaponAnim(id, ANIM_CHARGE_LOOP)
  641. set_pdata_float(iEnt, 48, 2.03, 4)
  642. set_pev(iEnt, pev_iuser1, 2)
  643.  
  644. set_pev(id, pev_weaponmodel2, P_GUNGNIR2)
  645. Stock_SetPlayerAnim(id, "aim_grenade")
  646. }
  647. }
  648. }
  649. }
  650.  
  651. public fw_Weapon_Reload(ent)
  652. {
  653. static id; id = pev(ent, pev_owner)
  654. if(!is_user_alive(id))
  655. return HAM_IGNORED
  656. if(!Get_BitVar(g_Had_Base, id))
  657. return HAM_IGNORED
  658.  
  659. g_Clip[id] = -1
  660.  
  661. static BPAmmo; BPAmmo = cs_get_user_bpammo(id, CSW_GUNGNIR)
  662. static iClip; iClip = get_pdata_int(ent, 51, 4)
  663.  
  664. if(BPAmmo <= 0 || iClip >= CLIP)
  665. return HAM_SUPERCEDE
  666.  
  667. g_Clip[id] = iClip
  668. return HAM_IGNORED
  669. }
  670.  
  671. public fw_Weapon_Reload_Post(ent)
  672. {
  673. static id; id = pev(ent, pev_owner)
  674. if(!is_user_alive(id))
  675. return HAM_IGNORED
  676. if(!Get_BitVar(g_Had_Base, id))
  677. return HAM_IGNORED
  678. if(g_Clip[id] == -1)
  679. return HAM_IGNORED
  680.  
  681. set_pdata_int(ent, 51, g_Clip[id], 4)
  682. set_pdata_int(ent, 54, 1, 4)
  683.  
  684. Set_WeaponAnim(id, ANIM_RELOAD)
  685. Set_PlayerNextAttack(id, RELOAD_TIME)
  686. Set_WeaponIdleTime(id, CSW_GUNGNIR,RELOAD_TIME)
  687. Stock_SetPlayerAnim(id, "reload_m249")
  688. return HAM_IGNORED
  689. }
  690.  
  691. public fw_Weapon_WeaponIdle_Post( iEnt )
  692. {
  693. if(pev_valid(iEnt) != 2)
  694. return
  695. static Id; Id = get_pdata_cbase(iEnt, 41, 4)
  696. if(get_pdata_cbase(Id, 373) != iEnt)
  697. return
  698. if(!Get_BitVar(g_Had_Base, Id))
  699. return
  700.  
  701. if(get_pdata_float(iEnt, 48, 4) > 0.0)
  702. return
  703.  
  704. new iCharge = pev(iEnt, pev_iuser1)
  705. Stock_SetPlayerAnim(Id, (iCharge == 2) ? "aim_m249":"aim_grenade")
  706. set_pdata_float(iEnt, 48, (iCharge == 2) ? 2.03 : 3.03, 4)
  707. }
  708.  
  709. /* ===============================
  710. ------------- ENTITIES --------
  711. =================================*/
  712. public fw_MF_Think(ent)
  713. {
  714. if(!pev_valid(ent))
  715. return
  716.  
  717. static Classname[32]
  718. pev(ent, pev_classname, Classname, sizeof(Classname))
  719.  
  720. if(equal(Classname, "despe_mf"))
  721. {
  722. static Float:fFrame, Float:fFrameMax
  723. pev(ent, pev_frame, fFrame)
  724.  
  725. fFrameMax = g_cache_frame_mf
  726.  
  727. fFrame += 1.0
  728. set_pev(ent, pev_frame, fFrame)
  729.  
  730. if(fFrame >= fFrameMax)
  731. {
  732. set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_KILLME)
  733. return
  734. }
  735. set_pev(ent, pev_nextthink, get_gametime() + 0.01)
  736. return
  737. }
  738. }
  739.  
  740. public HamF_InfoTarget_Think(iEnt)
  741. {
  742. if(!pev_valid(iEnt))
  743. return
  744.  
  745. static Classname[32]
  746. pev(iEnt, pev_classname, Classname, sizeof(Classname))
  747.  
  748. if(!equal(Classname, "gungnir_plasma"))
  749. return
  750.  
  751. new iOwner, iState
  752. iOwner = pev(iEnt, pev_owner)
  753. iState = pev(iEnt, pev_iuser1)
  754.  
  755. if(!iState)
  756. {
  757. static Float:fFrame
  758. pev(iEnt, pev_frame, fFrame)
  759.  
  760. fFrame += 1.0
  761. if(fFrame >= 10.0) fFrame = 0.0
  762.  
  763. set_pev(iEnt, pev_frame, fFrame)
  764. set_pev(iEnt, pev_nextthink, get_gametime() + 0.01)
  765. }
  766.  
  767. if(iState)
  768. {
  769. new Float:vecOri[3], Float:vEnd[3]
  770. pev(iEnt, pev_vuser1, vecOri)
  771. pev(iEnt, (iState==2)?pev_vuser2:pev_origin, vEnd)
  772.  
  773. engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vecOri, 0)
  774. write_byte(TE_BEAMPOINTS)
  775. engfunc(EngFunc_WriteCoord, vEnd[0]) // end
  776. engfunc(EngFunc_WriteCoord, vEnd[1])
  777. engfunc(EngFunc_WriteCoord, vEnd[2])
  778. engfunc(EngFunc_WriteCoord, vecOri[0]) // start
  779. engfunc(EngFunc_WriteCoord, vecOri[1])
  780. engfunc(EngFunc_WriteCoord, vecOri[2])
  781. write_short(g_cache_beam[iState-1])
  782. write_byte(0) // byte (starting frame)
  783. write_byte(500) // byte (frame rate in 0.1's)
  784. write_byte(1) // byte (life in 0.1's)
  785. write_byte((iState==2)?150:50) // byte (line width in 0.1's)
  786. write_byte(0) // byte (noise amplitude in 0.01's)
  787. write_byte(200) // byte,byte,byte (color) (R)
  788. write_byte(200) // (G)
  789. write_byte(200) // (B)
  790. write_byte(75) // byte (brightness)
  791. write_byte((iState==2)?30:10) // byte (scroll speed in 0.1's)
  792. message_end()
  793.  
  794. static Float:fTimeRemove, Float:fDelay;
  795. pev(iEnt, pev_ltime, fTimeRemove)
  796. pev(iEnt, pev_fuser4, fDelay)
  797.  
  798. if(get_gametime() >= fDelay && pev(iEnt, pev_iuser4))
  799. {
  800. new Float:vAngles[3], Float:vVec[3], Float:vecEnd2[3]
  801. pev(iEnt, pev_vuser2, vecEnd2)
  802. Stock_GetSpeedVector(vecOri, vecEnd2, 4000.0, vVec)
  803.  
  804. static iBall
  805. iBall = Stock_CreateEntityBase(iOwner, "info_target", MOVETYPE_FLY, "models/w_usp.mdl", "gungnir_plasma", SOLID_TRIGGER, 0.01)
  806. engfunc(EngFunc_SetSize, iBall, Float:{-50.0, -50.0, 0.0}, Float:{50.0, 50.0, 50.0})
  807. fm_set_rendering(iBall, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 0)
  808.  
  809. set_pev(iBall, pev_origin, vecOri)
  810. set_pev(iBall, pev_gravity, 0.01)
  811. set_pev(iBall, pev_velocity, vVec)
  812. set_pev(iBall, pev_iuser1, 2)
  813. set_pev(iBall, pev_vuser1, vecOri)
  814. set_pev(iBall, pev_vuser2, vecEnd2)
  815.  
  816. static Float:vVelocity[3]
  817. pev(iBall, pev_velocity, vVelocity)
  818. vector_to_angle(vVelocity, vAngles)
  819. if(vAngles[0] > 90.0) vAngles[0] = -(360.0 - vAngles[0])
  820. set_pev(iBall, pev_angles, vAngles)
  821.  
  822. emit_sound(iOwner, CHAN_VOICE, SOUND_FIRE[6], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  823. set_pev(iEnt, pev_iuser4, 0)
  824. }
  825.  
  826. set_pev(iEnt, pev_nextthink, get_gametime() + 0.01)
  827.  
  828. if(get_gametime() >= fTimeRemove && pev(iEnt, pev_iuser3))
  829. {
  830. set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_KILLME);
  831. return
  832. }
  833. }
  834. }
  835.  
  836. public HamF_InfoTarget_Touch(iEnt, iPtd)
  837. {
  838. if(!pev_valid(iEnt))
  839. return HAM_IGNORED
  840.  
  841. static Classname[32]
  842. pev(iEnt, pev_classname, Classname, sizeof(Classname))
  843.  
  844. if(!equal(Classname, "gungnir_plasma"))
  845. return HAM_IGNORED
  846.  
  847. new iOwner, Float:vecOri[3], iState
  848. iOwner = pev(iEnt, pev_owner)
  849. iState = pev(iEnt, pev_iuser1)
  850. pev(iEnt, pev_origin, vecOri)
  851.  
  852. if(iPtd == iOwner)
  853. return HAM_IGNORED
  854.  
  855. static Float:fDmg, Float:fRng, Float:fKnc
  856. if(!iState)
  857. {
  858. fDmg = WDAMG_PLASMA
  859. fRng = WRANGE_PLASMA
  860. fKnc = 1.0
  861. } else if(iState == 1) {
  862. fDmg = WDAMG_CHARGE
  863. fRng = WRANGE_CHARGE
  864. fKnc = WKNOCK_CHARGE
  865. } else if(iState == 2) {
  866. fDmg = WDAMG_BEAM
  867. fRng = WRANGE_BEAM
  868. fKnc = 1.0
  869. }
  870.  
  871. new pEntity = -1
  872. while((pEntity = engfunc(EngFunc_FindEntityInSphere, pEntity, vecOri, fRng)) != 0)
  873. {
  874. if(pev(pEntity, pev_takedamage) == DAMAGE_NO) continue
  875. if(is_user_connected(pEntity) && pEntity != iOwner)
  876. if(!can_damage(pEntity, iOwner)) continue
  877. if(pEntity == iOwner) continue
  878.  
  879. if(pev_valid(pEntity))
  880. {
  881. ExecuteHam(Ham_TakeDamage, pEntity, iOwner, iOwner, fDmg, DMG_BULLET)
  882.  
  883. Stock_Fake_KnockBack(iOwner, pEntity, fKnc)
  884. if(is_user_alive(pEntity)) SpawnBlood(vecOri, get_pdata_int(pEntity,89), floatround(fDmg/5.0))
  885. }
  886. }
  887.  
  888. if(iState < 2)
  889. {
  890. engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vecOri, 0)
  891. write_byte(TE_EXPLOSION)
  892. engfunc(EngFunc_WriteCoord, vecOri[0])
  893. engfunc(EngFunc_WriteCoord, vecOri[1])
  894. engfunc(EngFunc_WriteCoord, vecOri[2])
  895. write_short(g_cache_exp[iState])
  896. write_byte(10)
  897. write_byte(30)
  898. write_byte(TE_EXPLFLAG_NODLIGHTS|TE_EXPLFLAG_NOSOUND|TE_EXPLFLAG_NOPARTICLES)
  899. message_end()
  900.  
  901. emit_sound(iOwner, CHAN_VOICE, SOUND_FIRE[4+iState], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  902. }
  903.  
  904. if(!iState) engfunc(EngFunc_RemoveEntity, iEnt)
  905. if(iState)
  906. {
  907. set_pev(iEnt, pev_ltime, get_gametime() + 2.5)
  908. set_pev(iEnt, pev_iuser3, 1)
  909. set_pev(iEnt, pev_movetype, MOVETYPE_NONE);
  910. set_pev(iEnt, pev_solid, SOLID_NOT);
  911.  
  912. if(iState == 1)
  913. {
  914. fm_set_rendering(iEnt, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 0)
  915. set_pev(iEnt, pev_fuser4, get_gametime() + 1.5)
  916. set_pev(iEnt, pev_iuser4, 1)
  917. }
  918. }
  919.  
  920. return HAM_IGNORED
  921. }
  922.  
  923. public MakeMuzzleFlash(id, iEnt)
  924. {
  925. static iMuz
  926. iMuz = Stock_CreateEntityBase(id, "env_sprite", MOVETYPE_FOLLOW, MF_W, "despe_mf", SOLID_NOT,0.01)
  927. set_pev(iMuz, pev_body, 1)
  928. set_pev(iMuz, pev_rendermode, kRenderTransAdd)
  929. set_pev(iMuz, pev_renderamt, 255.0)
  930. set_pev(iMuz, pev_aiment, id)
  931. set_pev(iMuz, pev_scale, 0.04)
  932. set_pev(iMuz, pev_frame, 0.0)
  933. set_pev(iMuz, pev_animtime, get_gametime())
  934. dllfunc(DLLFunc_Spawn, iMuz)
  935. }
  936.  
  937. stock Stock_CreateEntityBase(id, classtype[], mvtyp, mdl[], class[], solid, Float:fNext)
  938. {
  939. new pEntity = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, classtype))
  940. set_pev(pEntity, pev_movetype, mvtyp);
  941. set_pev(pEntity, pev_owner, id);
  942. engfunc(EngFunc_SetModel, pEntity, mdl);
  943. set_pev(pEntity, pev_classname, class);
  944. set_pev(pEntity, pev_solid, solid);
  945. set_pev(pEntity, pev_nextthink, get_gametime() + fNext)
  946. return pEntity
  947. }
  948.  
  949. stock Stock_GetSpeedVector(const Float:origin1[3], const Float:origin2[3], Float:speed, Float:new_velocity[3])
  950. {
  951. xs_vec_sub(origin2, origin1, new_velocity)
  952. new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
  953. xs_vec_mul_scalar(new_velocity, num, new_velocity)
  954. }
  955.  
  956. stock Stock_Get_Aiming(id, Float:end[3])
  957. {
  958. new Float:start[3], Float:view_ofs[3]
  959. pev(id, pev_origin, start)
  960. pev(id, pev_view_ofs, view_ofs)
  961. xs_vec_add(start, view_ofs, start)
  962.  
  963. pev(id, pev_v_angle, end)
  964. engfunc(EngFunc_MakeVectors, end)
  965. global_get(glb_v_forward, end)
  966. xs_vec_mul_scalar(end, 8192.0, end)
  967. xs_vec_add(start, end, end)
  968. new pentru = create_tr2();
  969. engfunc(EngFunc_TraceLine, start, end, DONT_IGNORE_MONSTERS, id, pentru)
  970. get_tr2(pentru, TR_vecEndPos, end)
  971. free_tr2(pentru)
  972. }
  973.  
  974. public Stock_Fake_KnockBack(id, iVic, Float:iKb)
  975. {
  976. if(iVic > 32) return
  977.  
  978. new Float:vAttacker[3], Float:vVictim[3], Float:vVelocity[3], flags
  979. pev(id, pev_origin, vAttacker)
  980. pev(iVic, pev_origin, vVictim)
  981. vAttacker[2] = vVictim[2] = 0.0
  982. flags = pev(id, pev_flags)
  983.  
  984. xs_vec_sub(vVictim, vAttacker, vVictim)
  985. new Float:fDistance
  986. fDistance = xs_vec_len(vVictim)
  987. xs_vec_mul_scalar(vVictim, 1 / fDistance, vVictim)
  988.  
  989. pev(iVic, pev_velocity, vVelocity)
  990. xs_vec_mul_scalar(vVictim, iKb, vVictim)
  991. xs_vec_mul_scalar(vVictim, 50.0, vVictim)
  992. vVictim[2] = xs_vec_len(vVictim) * 0.15
  993.  
  994. if(flags &~ FL_ONGROUND)
  995. {
  996. xs_vec_mul_scalar(vVictim, 1.2, vVictim)
  997. vVictim[2] *= 0.4
  998. }
  999. if(xs_vec_len(vVictim) > xs_vec_len(vVelocity)) set_pev(iVic, pev_velocity, vVictim)
  1000. }
  1001.  
  1002. stock Float:Stock_Blah(Float:start[3], Float:end[3], ignore_ent)
  1003. {
  1004. static pentru
  1005. pentru = create_tr2()
  1006. engfunc(EngFunc_TraceLine, start, end, IGNORE_MONSTERS, ignore_ent, pentru)
  1007.  
  1008. static Float:EndPos[3]
  1009. get_tr2(pentru, TR_vecEndPos, EndPos)
  1010.  
  1011. free_tr2(pentru)
  1012. return get_distance_f(end, EndPos)
  1013. }
  1014. stock can_damage(id1, id2)
  1015. {
  1016. if(id1 <= 0 || id1 >= 33 || id2 <= 0 || id2 >= 33)
  1017. return 1
  1018.  
  1019. // Check team
  1020. return(get_pdata_int(id1, 114) != get_pdata_int(id2, 114))
  1021. }
  1022.  
  1023. ////////////////////////////
  1024. public Set_WpnList(id)
  1025. {
  1026. message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("WeaponList"), _, id)
  1027. write_string(Get_BitVar(g_Had_Base, id) ? "weapon_gungnir" : weapon_gungnir)
  1028. write_byte(6)
  1029. write_byte(100)
  1030. write_byte(-1)
  1031. write_byte(-1)
  1032. write_byte(0)
  1033. write_byte(13)
  1034. write_byte(CSW_GUNGNIR)
  1035. write_byte(0)
  1036. message_end()
  1037. }
  1038. /* ===============================
  1039. ------------- SAFETY -------------
  1040. =================================*/
  1041. public Register_SafetyFunc()
  1042. {
  1043. register_event("CurWeapon", "Safety_CurWeapon", "be", "1=1")
  1044.  
  1045. RegisterHam(Ham_Spawn, "player", "fw_Safety_Spawn_Post", 1)
  1046. RegisterHam(Ham_Killed, "player", "fw_Safety_Killed_Post", 1)
  1047. }
  1048.  
  1049. public Register_SafetyFuncBot(id)
  1050. {
  1051. RegisterHamFromEntity(Ham_Spawn, id, "fw_Safety_Spawn_Post", 1)
  1052. RegisterHamFromEntity(Ham_Killed, id, "fw_Safety_Killed_Post", 1)
  1053. }
  1054.  
  1055. public Safety_Connected(id)
  1056. {
  1057. Set_BitVar(g_IsConnected, id)
  1058. UnSet_BitVar(g_IsAlive, id)
  1059.  
  1060. g_PlayerWeapon[id] = 0
  1061. }
  1062.  
  1063. public Safety_Disconnected(id)
  1064. {
  1065. UnSet_BitVar(g_IsConnected, id)
  1066. UnSet_BitVar(g_IsAlive, id)
  1067.  
  1068. g_PlayerWeapon[id] = 0
  1069. }
  1070.  
  1071. public Safety_CurWeapon(id)
  1072. {
  1073. if(!is_alive(id))
  1074. return
  1075.  
  1076. static CSW; CSW = read_data(2)
  1077. if(g_PlayerWeapon[id] != CSW) g_PlayerWeapon[id] = CSW
  1078. }
  1079.  
  1080. public fw_Safety_Spawn_Post(id)
  1081. {
  1082. if(!is_user_alive(id))
  1083. return
  1084.  
  1085. Set_BitVar(g_IsAlive, id)
  1086. }
  1087.  
  1088. public fw_Safety_Killed_Post(id)
  1089. {
  1090. UnSet_BitVar(g_IsAlive, id)
  1091. }
  1092.  
  1093. public is_connected(id)
  1094. {
  1095. if(!(1 <= id <= 32))
  1096. return 0
  1097. if(!Get_BitVar(g_IsConnected, id))
  1098. return 0
  1099.  
  1100. return 1
  1101. }
  1102.  
  1103. public is_alive(id)
  1104. {
  1105. if(!is_connected(id))
  1106. return 0
  1107. if(!Get_BitVar(g_IsAlive, id))
  1108. return 0
  1109.  
  1110. return 1
  1111. }
  1112.  
  1113. public get_player_weapon(id)
  1114. {
  1115. if(!is_alive(id))
  1116. return 0
  1117.  
  1118. return g_PlayerWeapon[id]
  1119. }
  1120.  
  1121. /* ===============================
  1122. --------- END OF SAFETY ---------
  1123. =================================*/
  1124. stock Stock_SetPlayerAnim(id, const AnimName[], Float:rate=1.0)
  1125. {
  1126. static AnimNum, Float:FrameRate, Float:GroundSpeed, bool:Loops, Anim2[64]
  1127. if(!(pev(id, pev_flags) & FL_DUCKING)) format(Anim2, 63, "ref_%s", AnimName)
  1128. else format(Anim2, 63, "crouch_%s", AnimName)
  1129.  
  1130. if ((AnimNum=lookup_sequence(id,Anim2,FrameRate,Loops,GroundSpeed))==-1) AnimNum=0
  1131.  
  1132. if (!Loops || (Loops && pev(id,pev_sequence)!=AnimNum))
  1133. {
  1134. set_pev(id, pev_gaitsequence, AnimNum)
  1135. set_pev(id, pev_sequence, AnimNum)
  1136. set_pev(id, pev_frame, 0.0)
  1137. set_pev(id, pev_animtime, get_gametime())
  1138. }
  1139. set_pev(id, pev_framerate, rate)
  1140.  
  1141. set_pdata_int(id, 40, Loops, 4)
  1142. set_pdata_int(id, 39, 0, 4)
  1143.  
  1144. set_pdata_float(id, 36, FrameRate, 4)
  1145. set_pdata_float(id, 37, GroundSpeed, 4)
  1146. set_pdata_float(id, 38, get_gametime(), 4)
  1147.  
  1148. set_pdata_int(id, 73, 28, 5)
  1149. set_pdata_int(id, 74, 28, 5)
  1150. set_pdata_float(id, 220, get_gametime(), 5)
  1151. }
  1152. stock SpawnBlood(const Float:vecOrigin[3], iColor, iAmount)
  1153. {
  1154. if(!iAmount)
  1155. return
  1156.  
  1157. iAmount *= 2
  1158. if(iAmount > 255) iAmount = 255
  1159.  
  1160. engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vecOrigin)
  1161. write_byte(TE_BLOODSPRITE)
  1162. engfunc(EngFunc_WriteCoord, vecOrigin[0])
  1163. engfunc(EngFunc_WriteCoord, vecOrigin[1])
  1164. engfunc(EngFunc_WriteCoord, vecOrigin[2])
  1165. write_short(g_SpraySpr)
  1166. write_short(g_DropSpr)
  1167. write_byte(iColor)
  1168. write_byte(min(max(3, iAmount / 10), 16))
  1169. message_end()
  1170. }
  1171. stock Set_WeaponAnim(id, anim, iCheck=0)
  1172. {
  1173. if(iCheck && pev(id, pev_weaponanim) == anim)
  1174. return;
  1175.  
  1176. set_pev(id, pev_weaponanim, anim)
  1177.  
  1178. message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
  1179. write_byte(anim)
  1180. write_byte(pev(id, pev_body))
  1181. message_end()
  1182. }
  1183.  
  1184. stock Set_WeaponIdleTime(id, WeaponId ,Float:TimeIdle)
  1185. {
  1186. static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
  1187. if(!pev_valid(entwpn))
  1188. return
  1189.  
  1190. set_pdata_float(entwpn, 46, TimeIdle, 4)
  1191. set_pdata_float(entwpn, 47, TimeIdle, 4)
  1192. set_pdata_float(entwpn, 48, TimeIdle, 4)
  1193. }
  1194.  
  1195. stock Set_PlayerNextAttack(id, Float:nexttime)
  1196. {
  1197. set_pdata_float(id, 83, nexttime, 5)
  1198. }
  1199.  
  1200. stock Stock_Get_Postion(id,Float:forw, Float:right, Float:up, Float:vStart[])
  1201. {
  1202. static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
  1203.  
  1204. pev(id, pev_origin, vOrigin)
  1205. pev(id, pev_view_ofs,vUp) //for player
  1206. xs_vec_add(vOrigin,vUp,vOrigin)
  1207. pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
  1208.  
  1209. angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
  1210. angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
  1211. angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
  1212.  
  1213. vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
  1214. vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
  1215. vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
  1216. }
  1217.  
  1218. stock Stock_Drop_Slot(id, iSlot)
  1219. {
  1220. new weapons[32], num = 0
  1221. get_user_weapons(id, weapons, num)
  1222.  
  1223. for(new i = 0; i < num; i++)
  1224. {
  1225. new slot = Stock_Get_Wpn_Slot(weapons[i])
  1226.  
  1227. if(iSlot == slot)
  1228. {
  1229. static wname[32]
  1230. get_weaponname(weapons[i], wname, charsmax(wname))
  1231. engclient_cmd(id, "drop", wname)
  1232. }
  1233. }
  1234. }
  1235.  
  1236. stock Stock_Get_Wpn_Slot(iWpn)
  1237. {
  1238. const PRIMARY_WEAPONS_BIT_SUM = (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90)
  1239. const SECONDARY_WEAPONS_BIT_SUM = (1<<CSW_P228)|(1<<CSW_ELITE)|(1<<CSW_FIVESEVEN)|(1<<CSW_USP)|(1<<CSW_GLOCK18)|(1<<CSW_DEAGLE)
  1240.  
  1241. if(PRIMARY_WEAPONS_BIT_SUM & (1<<iWpn)) return 1
  1242. else if(SECONDARY_WEAPONS_BIT_SUM & (1<<iWpn)) return 2
  1243. else if(iWpn == CSW_KNIFE) return 3
  1244. else if(iWpn == CSW_HEGRENADE) return 4
  1245. else if(iWpn == CSW_C4) return 5
  1246. return 6 //FLASHBANG SMOKEBANG
  1247. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement