Advertisement
mihay111

gungnir

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