Solved Bouncer

Unpaid Requests, Public Plugins
Post Reply
User avatar
Night Fury
Mod Developer
Mod Developer
Posts: 677
Joined: 7 years ago
Contact:

#11

Post by Night Fury » 5 years ago

czirimbolo wrote: 5 years ago can someone delete /get command from this plugin? It causes problems
  1. #include <zombie_escape>
  2. #include <cstrike>
  3. #include <engine>
  4. #include <fakemeta_util>
  5. #include <fun>
  6. #include <xs>
  7.  
  8. #define PLUGIN  "[Luna's Weapon] Bouncer"
  9. #define VERSION "Beta 1.0"
  10. #define AUTHOR  "Celena Luna"
  11.  
  12. #define P_MODEL "models/p_bouncer.mdl"
  13. #define V_MODEL "models/v_bouncer.mdl"
  14. #define W_MODEL "models/w_bouncer.mdl"
  15. #define BALL_MODEL "models/s_bouncer.mdl"
  16.  
  17. #define CSW_BOUNCER CSW_M3
  18. #define weapon_bouncer "weapon_m3"
  19.  
  20. #define OLD_SHELL "models/shell_bcs.mdl"   
  21. #define BOUNCER_SHELL "models/bouncershell.mdl"
  22.  
  23. #define WEAPON_SECRETCODE 4643
  24. #define OLD_W_MODEL "models/w_m3.mdl"
  25. #define OLD_EVENT "events/m3.sc"
  26.  
  27. #define RELOAD_TIME 0.4
  28. #define RELOAD_ANIMATION_TIME RELOAD_TIME+0.5
  29.  
  30. #define write_coord_f(%1)   engfunc(EngFunc_WriteCoord, %1)
  31.  
  32. enum
  33. {
  34.     ANIM_IDLE_A = 0,
  35.     ANIM_SHOOT1_A,
  36.     ANIM_SHOOT2_A,
  37.     ANIM_INSERT_A,
  38.     ANIM_AFTER_A,
  39.     ANIM_START_A,
  40.     ANIM_DRAW_A,
  41. }
  42.  
  43. enum
  44. {
  45.     CVAR_DAMAGE = 0,
  46.     CVAR_CLIP,
  47.     CVAR_BPAMMO,
  48.     CVAR_BOUNCE_TIME,
  49.     CVAR_SPEED
  50. }
  51.  
  52. new g_pCvar[6]
  53.  
  54. // ==========================================================
  55. enum _:ShotGuns {
  56.     m3,
  57.     xm1014
  58. }
  59.  
  60. const NOCLIP_WPN_BS = ((1<<CSW_HEGRENADE)|(1<<CSW_SMOKEGRENADE)|(1<<CSW_FLASHBANG)|(1<<CSW_KNIFE)|(1<<CSW_C4))
  61. const SHOTGUNS_BS   = ((1<<CSW_M3)|(1<<CSW_XM1014))
  62.  
  63. // weapons offsets
  64. #define XTRA_OFS_WEAPON         4
  65. #define m_pPlayer               41
  66. #define m_iId                   43
  67. #define m_fKnown                44
  68. #define m_flNextPrimaryAttack       46
  69. #define m_flNextSecondaryAttack 47
  70. #define m_flTimeWeaponIdle      48
  71. #define m_iPrimaryAmmoType      49
  72. #define m_iClip             51
  73. #define m_fInReload             54
  74. #define m_fInSpecialReload      55
  75. #define m_fSilent               74
  76. #define m_flNextReload          75
  77.  
  78. // players offsets
  79. #define XTRA_OFS_PLAYER     5
  80. #define m_flNextAttack      83
  81. #define m_rgAmmo_player_Slot0   376
  82.  
  83. stock const g_iDftMaxClip[CSW_P90+1] = {
  84.     -1,  13, -1, 10,  1,  7,    1, 30, 30,  1,  30,
  85.         20, 25, 30, 35, 25,   12, 20, 10, 30, 100,
  86.         8 , 30, 30, 20,  2, 7, 30, 30, -1,  50}
  87.  
  88. stock const Float:g_fDelay[CSW_P90+1] = {
  89.     0.00, 2.70, 0.00, 2.00, 0.00, 0.55,   0.00, 3.15, 3.30, 0.00, 4.50,
  90.          2.70, 3.50, 3.35, 2.45, 3.30,   2.70, 2.20, 2.50, 2.63, 4.70,
  91.          0.55, 3.05, 2.12, 3.50, 0.00,   2.20, 3.00, 2.45, 0.00, 3.40
  92. }
  93.  
  94. stock const g_iReloadAnims[CSW_P90+1] = {
  95.     -1,  5, -1, 3, -1,  6,   -1, 1, 1, -1, 14,
  96.         4,  2, 3,  1,  1,   13, 7, 4,  1,  3,
  97.         6, 11, 1,  3, -1,   4, 1, 1, -1,  1}
  98.  
  99. #define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
  100. #define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
  101. #define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))
  102.  
  103. new g_Had_Bouncer, g_Event_Bouncer
  104. new g_MsgWeaponList, g_MsgCurWeapon, g_HamBot
  105. new m_spriteTexture, g_Muzzle[33], m_shellIndex
  106. new g_OldWeapon[33]
  107. new g_iItemID
  108.  
  109. // Safety
  110. new g_IsConnected, g_IsAlive, g_PlayerWeapon[33]
  111.  
  112. new const WeaponSounds[3][] =
  113. {
  114.     "sound/weapons/bouncer_draw.wav",
  115.     "sound/weapons/bouncer_reload_after.wav",
  116.     "sound/weapons/bouncer_reload_insert.wav"
  117. }
  118.  
  119. new const WeaponResources[3][] =
  120. {
  121.     "sprites/weapon_bouncer.txt",
  122.     "sprites/640hud168.spr",
  123.     "sprites/640hud18.spr"
  124. }
  125.  
  126. #define WeaponShoots "weapons/bouncer-1.wav"
  127. #define WeaponMuzzle "sprites/muzzleflash_bouncer.spr"
  128.  
  129.  
  130. public plugin_precache()
  131. {
  132.     precache_model(V_MODEL)
  133.     precache_model(P_MODEL)
  134.     precache_model(W_MODEL)
  135.     precache_model(BALL_MODEL)
  136.     precache_sound(WeaponShoots)
  137.     m_shellIndex = precache_model(BOUNCER_SHELL)
  138.    
  139.     for(new i = 0; i < sizeof(WeaponSounds); i++)
  140.         precache_generic(WeaponSounds[i])
  141.     for(new i = 0; i < sizeof(WeaponResources); i++)
  142.     {
  143.         if(!i) precache_generic(WeaponResources[i])
  144.         else precache_model(WeaponResources[i])
  145.     }
  146.    
  147.     register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1) 
  148.    
  149.     m_spriteTexture = precache_model("sprites/laserbeam.spr")
  150.     precache_model("sprites/muzzleflash_bouncer.spr")
  151. }
  152.  
  153. public plugin_natives()
  154. {
  155.     register_native("luna_get_bouncer", "Get_Bouncer", 1)
  156.     register_native("luna_remove_bouncer", "Remove_Bouncer", 1)
  157. }
  158.  
  159. public plugin_init()
  160. {
  161.     register_plugin(PLUGIN, VERSION, AUTHOR)
  162.  
  163.     register_forward(FM_SetModel, "fw_SetModel")
  164.     register_forward(FM_CmdStart, "fw_CmdStart")
  165.     register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)   
  166.     register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
  167.  
  168.         // Safety
  169.     Register_SafetyFunc()
  170.  
  171.     register_touch("bouncer_ball", "*", "fw_touch")
  172.     register_think("bouncer_ball", "fw_think")
  173.  
  174.     register_event("HLTV", "event_newround", "a", "1=0", "2=0")
  175.  
  176.     register_think("bouncer_muzzleflash", "fw_Muzzle_Think")
  177.  
  178.     RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack")
  179.     RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack")       
  180.    
  181.     RegisterHam(Ham_Item_Deploy, weapon_bouncer, "fw_Item_Deploy_Post", 1) 
  182.     RegisterHam(Ham_Item_AddToPlayer, weapon_bouncer, "fw_Item_AddToPlayer_Post", 1)
  183.     RegisterHam(Ham_Weapon_WeaponIdle, weapon_bouncer, "fw_Weapon_WeaponIdle") 
  184.     RegisterHam(Ham_Weapon_WeaponIdle, weapon_bouncer, "fw_Weapon_WeaponIdle_Post", 1)
  185.     RegisterHam(Ham_Weapon_Reload, weapon_bouncer, "fw_Weapon_Reload", 1)
  186.     RegisterHam(Ham_Weapon_PrimaryAttack, weapon_bouncer, "fw_Weapon_PrimaryAttack_Post", 1)
  187.  
  188.     g_pCvar[CVAR_CLIP] = register_cvar("luna_bouncer_clip", "25")
  189.     g_pCvar[CVAR_BPAMMO] = register_cvar("luna_bouncer_bpammo", "150")
  190.     g_pCvar[CVAR_BOUNCE_TIME] = register_cvar("luna_bouncer_bounce_time", "3")
  191.     g_pCvar[CVAR_SPEED] = register_cvar("luna_bouncer_speed", "2500")
  192.     g_pCvar[CVAR_DAMAGE] = register_cvar("luna_bouncer_damage", "400")
  193.  
  194.     // Cache
  195.     g_MsgWeaponList = get_user_msgid("WeaponList")
  196.     g_MsgCurWeapon = get_user_msgid("CurWeapon")
  197.     register_clcmd("weapon_bouncer", "hook_weapon")
  198.  
  199.     g_iItemID = ze_register_item("Luna Bouncer", 50, 0)
  200. }
  201.  
  202. public fw_PrecacheEvent_Post(type, const name[])
  203. {
  204.     if(equal(OLD_EVENT, name))
  205.         g_Event_Bouncer = get_orig_retval()
  206. }
  207.  
  208. public client_putinserver(id)
  209. {
  210.     Safety_Connected(id)
  211.    
  212.     if(!g_HamBot && is_user_bot(id))
  213.     {
  214.         g_HamBot = 1
  215.         set_task(0.1, "Do_Register_HamBot", id)
  216.     }
  217. }
  218.  
  219. public Do_Register_HamBot(id)
  220. {
  221.     Register_SafetyFuncBot(id)
  222.     RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack")
  223. }
  224.  
  225. public client_disconnected(id)
  226. {
  227.     Safety_Disconnected(id)
  228. }
  229.  
  230. public Get_Bouncer(id)
  231. {
  232.     Remove_Bouncer(id)
  233.    
  234.     Set_BitVar(g_Had_Bouncer, id)
  235.    
  236.     give_item(id, weapon_bouncer)
  237.     static bpammo; bpammo = get_pcvar_num(g_pCvar[CVAR_BPAMMO])
  238.     cs_set_user_bpammo(id, CSW_BOUNCER, bpammo)
  239.    
  240.     static Ent; Ent = fm_get_user_weapon_entity(id, CSW_BOUNCER)
  241.     static Clip; Clip = get_pcvar_num(g_pCvar[CVAR_CLIP])
  242.     if(pev_valid(Ent)) cs_set_weapon_ammo(Ent, Clip)
  243.  
  244.     message_begin(MSG_ONE_UNRELIABLE, g_MsgCurWeapon, _, id)
  245.     write_byte(1)
  246.     write_byte(CSW_BOUNCER)
  247.     write_byte(Clip)
  248.     message_end()
  249. }
  250.  
  251. public ze_select_item_pre(id, itemid)
  252. {
  253.     if (itemid != g_iItemID)
  254.         return ZE_ITEM_AVAILABLE
  255.  
  256.     if (ze_is_user_zombie(id))
  257.         return ZE_ITEM_DONT_SHOW
  258.  
  259.     return ZE_ITEM_AVAILABLE
  260. }
  261.  
  262. public ze_select_item_post(id, itemid)
  263. {
  264.     if (itemid != g_iItemID)
  265.         return
  266.  
  267.     Get_Bouncer(id)
  268. }
  269.  
  270. public ze_user_humanized(id)
  271. {
  272.     Remove_Bouncer(id)
  273. }
  274.  
  275. public ze_user_infected(id)
  276. {
  277.     Remove_Bouncer(id)
  278. }
  279.  
  280. public hook_weapon(id)
  281. {
  282.     engclient_cmd(id, weapon_bouncer)
  283.     return PLUGIN_HANDLED
  284. }
  285.  
  286. public Remove_Bouncer(id)
  287. {
  288.     UnSet_BitVar(g_Had_Bouncer, id)
  289.  
  290.     if(pev_valid(g_Muzzle[id])) remove_entity(g_Muzzle[id])
  291.     g_Muzzle[id] = 0
  292. }
  293.  
  294. public Event_CurWeapon(id)
  295. {
  296.     if(!is_player(id, 1))
  297.         return
  298.    
  299.     static CSWID; CSWID = read_data(2)
  300.    
  301.     g_OldWeapon[id] = CSWID
  302. }
  303.  
  304. public fw_SetModel(entity, model[])
  305. {
  306.     if(!pev_valid(entity))
  307.         return FMRES_IGNORED
  308.    
  309.     static Classname[64]
  310.     pev(entity, pev_classname, Classname, sizeof(Classname))
  311.    
  312.     if(!equal(Classname, "weaponbox"))
  313.         return FMRES_IGNORED
  314.    
  315.     static id
  316.     id = pev(entity, pev_owner)
  317.    
  318.     if(equal(model, OLD_W_MODEL))
  319.     {
  320.         static weapon
  321.         weapon = fm_get_user_weapon_entity(entity, CSW_BOUNCER)
  322.        
  323.         if(!pev_valid(weapon))
  324.             return FMRES_IGNORED
  325.        
  326.         if(Get_BitVar(g_Had_Bouncer, id))
  327.         {
  328.             set_pev(weapon, pev_impulse, WEAPON_SECRETCODE)
  329.             engfunc(EngFunc_SetModel, entity, W_MODEL)
  330.            
  331.             Remove_Bouncer(id)
  332.            
  333.             return FMRES_SUPERCEDE
  334.         }
  335.     }
  336.  
  337.     return FMRES_IGNORED;
  338. }
  339.  
  340. public fw_CmdStart(id, uc_handle, seed)
  341. {
  342.     if(!is_player(id, 1))
  343.         return
  344.     if(get_player_weapon(id) != CSW_BOUNCER|| !Get_BitVar(g_Had_Bouncer, id))
  345.         return
  346.        
  347.     static NewButton; NewButton = get_uc(uc_handle, UC_Buttons)
  348.    
  349.     static Ent; Ent = fm_get_user_weapon_entity(id, CSW_BOUNCER)
  350.     static Clip; Clip = get_pcvar_num(g_pCvar[CVAR_CLIP])
  351.     if(!pev_valid(Ent)) return
  352.    
  353.     /*if(NewButton & IN_RELOAD)
  354.     {
  355.         NewButton &= ~IN_RELOAD
  356.         set_uc(uc_handle, UC_Buttons, NewButton)
  357.        
  358.         if(flNextAttack > 0.0) return
  359.        
  360.         static fInReload; fInReload = get_pdata_int(Ent, 54, 4)
  361.         if(fInReload || cs_get_weapon_ammo(Ent) >= CLIP)
  362.             return
  363.        
  364.         fw_Weapon_Reload(Ent)
  365.     }*/
  366.  
  367.     if(NewButton & IN_RELOAD)
  368.     {  
  369.         if(pev_valid(Ent)) set_pdata_int(Ent, 54, 0, 4)
  370.        
  371.         NewButton &= ~IN_RELOAD
  372.         set_uc(uc_handle, UC_Buttons, NewButton)
  373.         if(cs_get_weapon_ammo(Ent) < Clip)
  374.             ExecuteHamB(Ham_Weapon_Reload, Ent)
  375.  
  376.         return
  377.     }
  378. }
  379.  
  380. public event_newround()
  381. {
  382.     new nextitem  = find_ent_by_class(-1, "bouncer_ball")
  383.     while(nextitem)
  384.     {
  385.         remove_entity(nextitem)
  386.         nextitem = find_ent_by_class(-1, "bouncer_ball")
  387.     }
  388. }
  389.  
  390. public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
  391. {
  392.     if(!is_player(id, 1))
  393.         return FMRES_IGNORED   
  394.     if(get_player_weapon(id) == CSW_BOUNCER && Get_BitVar(g_Had_Bouncer, id))
  395.         set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001)
  396.    
  397.     return FMRES_HANDLED
  398. }
  399.  
  400. public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
  401. {
  402.     if (!is_player(invoker, 0))
  403.         return FMRES_IGNORED       
  404.     if(get_player_weapon(invoker) == CSW_BOUNCER && Get_BitVar(g_Had_Bouncer, invoker) && eventid == g_Event_Bouncer)
  405.     {
  406.         engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
  407.  
  408.         Set_WeaponAnim(invoker, ANIM_SHOOT1_A)
  409.         emit_sound(invoker, CHAN_WEAPON, WeaponShoots, 1.0, ATTN_NORM, 0, PITCH_LOW)   
  410.    
  411.         return FMRES_SUPERCEDE
  412.     }
  413.    
  414.     return FMRES_HANDLED
  415. }
  416.  
  417. public fw_TraceAttack(Ent, Attacker, Float:Damage, Float:Dir[3], ptr, DamageType)
  418. {
  419.     if(!is_player(Attacker, 0))
  420.         return HAM_IGNORED 
  421.     if(get_player_weapon(Attacker) != CSW_BOUNCER || !Get_BitVar(g_Had_Bouncer, Attacker))
  422.         return HAM_IGNORED
  423.        
  424.     static Float:flEnd[3], Float:vecPlane[3]
  425.    
  426.     get_tr2(ptr, TR_vecEndPos, flEnd)
  427.     get_tr2(ptr, TR_vecPlaneNormal, vecPlane)  
  428.  
  429.     if(!is_user_alive(Ent))
  430.     {
  431.         make_bullet(Attacker, flEnd)
  432.         //fake_smoke(Attacker, ptr)
  433.     }
  434.  
  435.     CreateBouncerBall(Attacker, flEnd)
  436.  
  437.      //Later~
  438.     Eject_Shell(Attacker, m_shellIndex, 0.1)
  439.    
  440.     //And Block it. Won't let it shot.
  441.     return HAM_SUPERCEDE
  442. }
  443.  
  444. public fw_Weapon_PrimaryAttack_Post( ent )
  445. {
  446.     static id ; id = get_pdata_cbase(ent, m_pPlayer, XTRA_OFS_WEAPON)  
  447.    
  448.     if(!is_user_alive(id) || !is_user_connected(id))
  449.         return HAM_IGNORED
  450.        
  451.     if(get_user_weapon(id) != CSW_BOUNCER|| !Get_BitVar(g_Had_Bouncer, id))
  452.         return HAM_IGNORED
  453.  
  454.  
  455.     static iClip; iClip = get_pdata_int(ent, 51, 4)
  456.     if(iClip > 0)
  457.         Stock_Muzzle(id)
  458.  
  459.     /*static total_shoot; total_shoot = random_num(5, 8)
  460.  
  461.     for(new i; i < total_shoot; i++)
  462.         CreateBouncerBall(id)*/
  463.  
  464.     return HAM_IGNORED
  465. }
  466.  
  467. public fw_Muzzle_Think(iEnt)
  468. {
  469.     new id = pev(iEnt, pev_owner)
  470.     new Float:endtime
  471.     pev(iEnt, pev_fuser1, endtime)
  472.  
  473.     if(!pev_valid(iEnt))    
  474.         return
  475.     if(!Get_BitVar(g_Had_Bouncer,id) || get_user_weapon(id) != CSW_BOUNCER)
  476.     {
  477.         set_pev(iEnt, pev_flags, FL_KILLME)
  478.         g_Muzzle[id] = 0
  479.         return
  480.     }
  481.  
  482.     if(endtime <= get_gametime())
  483.     {
  484.         set_pev(iEnt, pev_flags, FL_KILLME)
  485.         g_Muzzle[id] = 0
  486.         return
  487.     }
  488.  
  489.     new Float:fFrame, Float:fNextThink
  490.     pev(iEnt, pev_frame, fFrame)
  491.    
  492.     new Float:fOrigin[3]
  493.     pev(id, pev_origin, fOrigin)
  494.    
  495.     engfunc(EngFunc_MessageBegin, MSG_ALL, SVC_TEMPENTITY, fOrigin, 0)
  496.     write_byte(TE_DLIGHT)
  497.     engfunc(EngFunc_WriteCoord,fOrigin[0])
  498.     engfunc(EngFunc_WriteCoord,fOrigin[1])
  499.     engfunc(EngFunc_WriteCoord,fOrigin[2])
  500.     write_byte(3)
  501.     write_byte(255)
  502.     write_byte(187)
  503.     write_byte(0)
  504.     write_byte(2)
  505.     write_byte(0)
  506.     message_end()
  507.  
  508.     // effect exp
  509.     fNextThink = 0.01
  510.     fFrame += 1.0
  511.     if(fFrame > 15.0) fFrame = 0.0
  512.  
  513.     set_pev(iEnt, pev_frame, fFrame)
  514.     set_pev(iEnt, pev_scale, 0.06)
  515.     set_pev(iEnt, pev_nextthink, get_gametime() + fNextThink)
  516. }
  517.  
  518.  
  519. public fw_Item_Deploy_Post(Ent)
  520. {
  521.     if(pev_valid(Ent) != 2)
  522.         return
  523.     static Id; Id = get_pdata_cbase(Ent, 41, 4)
  524.     if(get_pdata_cbase(Id, 373) != Ent)
  525.         return
  526.     if(!Get_BitVar(g_Had_Bouncer, Id))
  527.         return
  528.  
  529.     set_pev(Id, pev_viewmodel2, V_MODEL)
  530.     set_pev(Id, pev_weaponmodel2, P_MODEL)
  531.    
  532.     Set_WeaponAnim(Id, ANIM_DRAW_A)
  533. }
  534.  
  535. public fw_Item_AddToPlayer_Post(ent, id)
  536. {
  537.     if(!pev_valid(ent))
  538.         return HAM_IGNORED
  539.  
  540.     if(pev(ent, pev_impulse) == WEAPON_SECRETCODE)
  541.     {
  542.         Set_BitVar(g_Had_Bouncer, id)
  543.         set_pev(ent, pev_impulse, 0)
  544.     }
  545.  
  546.     if(Get_BitVar(g_Had_Bouncer, id))
  547.     {
  548.         message_begin(MSG_ONE_UNRELIABLE, g_MsgWeaponList, _, id)
  549.         write_string("weapon_bouncer")
  550.         write_byte(3)
  551.         write_byte(200)
  552.         write_byte(-1)
  553.         write_byte(-1)
  554.         write_byte(0)
  555.         write_byte(4)
  556.         write_byte(CSW_BOUNCER)
  557.         write_byte(0)
  558.         message_end()  
  559.     }      
  560.  
  561.     return HAM_HANDLED 
  562. }
  563.  
  564. public fw_Weapon_WeaponIdle( iEnt )
  565. {
  566.     if(pev_valid(iEnt) != 2)
  567.         return
  568.     static id; id = get_pdata_cbase(iEnt, m_pPlayer, XTRA_OFS_WEAPON)
  569.     if(get_pdata_cbase(id, 373) != iEnt)
  570.         return
  571.     if(!Get_BitVar(g_Had_Bouncer, id))
  572.         return
  573.    
  574.     if( get_pdata_float(iEnt, m_flTimeWeaponIdle, XTRA_OFS_WEAPON) > 0.0 )
  575.     {
  576.         return
  577.     }
  578.    
  579.     static iId ; iId = get_pdata_int(iEnt, m_iId, XTRA_OFS_WEAPON)
  580.     static iMaxClip ; iMaxClip = g_pCvar[CVAR_CLIP]
  581.  
  582.     static iClip ; iClip = get_pdata_int(iEnt, m_iClip, XTRA_OFS_WEAPON)
  583.     static fInSpecialReload ; fInSpecialReload = get_pdata_int(iEnt, m_fInSpecialReload, XTRA_OFS_WEAPON)
  584.  
  585.     if( !iClip && !fInSpecialReload )
  586.     {
  587.         return
  588.     }
  589.  
  590.     if( fInSpecialReload )
  591.     {
  592.         static iBpAmmo ; iBpAmmo = get_pdata_int(id, 381, XTRA_OFS_PLAYER)
  593.         static iDftMaxClip ; iDftMaxClip = g_iDftMaxClip[iId]
  594.  
  595.         if( iClip < iMaxClip && iClip == iDftMaxClip && iBpAmmo )
  596.         {
  597.             Shotgun_Reload(iEnt, iMaxClip, iClip, iBpAmmo, id)
  598.             return
  599.         }
  600.         else if( iClip == iMaxClip && iClip != iDftMaxClip )
  601.         {
  602.             Set_WeaponAnim(id, ANIM_AFTER_A)
  603.            
  604.             set_pdata_int(iEnt, m_fInSpecialReload, 0, XTRA_OFS_WEAPON)
  605.             set_pdata_float(iEnt, m_flTimeWeaponIdle, 1.5, XTRA_OFS_WEAPON)
  606.         }
  607.     }
  608.    
  609.     return
  610. }
  611.  
  612. public fw_Weapon_WeaponIdle_Post( iEnt )
  613. {
  614.     if(pev_valid(iEnt) != 2)
  615.         return
  616.     static id; id = get_pdata_cbase(iEnt, m_pPlayer, XTRA_OFS_WEAPON)
  617.     if(get_pdata_cbase(id, 373) != iEnt)
  618.         return
  619.     if(!Get_BitVar(g_Had_Bouncer, id))
  620.         return
  621.        
  622.     static SpecialReload; SpecialReload = get_pdata_int(iEnt, 55, 4)
  623.     if(!SpecialReload && get_pdata_float(iEnt, 48, 4) <= 0.25)
  624.     {
  625.         Set_WeaponAnim(id, ANIM_IDLE_A)
  626.         set_pdata_float(iEnt, 48, 20.0, 4)
  627.     }  
  628. }
  629.  
  630. public fw_Weapon_Reload(iEnt)
  631. {
  632.     static id ; id = get_pdata_cbase(iEnt, m_pPlayer, XTRA_OFS_WEAPON)   
  633.  
  634.     static iBpAmmo ; iBpAmmo = get_pdata_int(id, 381, XTRA_OFS_PLAYER)
  635.     static iClip ; iClip = get_pdata_int(iEnt, m_iClip, XTRA_OFS_WEAPON)
  636.     static iMaxClip ; iMaxClip = g_pCvar[CVAR_CLIP]
  637.  
  638.     Shotgun_Reload(iEnt, iMaxClip, iClip, iBpAmmo, id)
  639.     return HAM_SUPERCEDE
  640. }
  641.  
  642. public CreateBouncerBall(id, Float:End[3])
  643. {
  644.     new Float:Origin[3], Float:Angles[3], Float:Velocity[3]
  645.     static Float:StartOrigin[3]
  646.     get_position(id, 2.0, 0.0, 0.0, StartOrigin)
  647.  
  648.     new Ent; Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
  649.     engfunc(EngFunc_GetAttachment, id, 0, Origin, Angles)
  650.  
  651.     pev(id, pev_v_angle, Angles)//; Angles[0] *= -1.0
  652.  
  653.     entity_set_string(Ent, EV_SZ_classname, "bouncer_ball")
  654.     set_pev(Ent, pev_origin, StartOrigin)
  655.     set_pev(Ent, pev_angles, Angles)
  656.     //set_pev(Ent, pev_solid, SOLID_BBOX)
  657.     set_pev(Ent, pev_solid, SOLID_TRIGGER)
  658.     set_pev(Ent, pev_gravity, 0.01)
  659.     set_pev(Ent, pev_movetype, MOVETYPE_BOUNCE)
  660.     set_pev(Ent, pev_classname, "bouncer_ball")
  661.     set_pev(Ent, pev_angles, Angles)
  662.     set_pev(Ent, pev_owner, id)
  663.     set_pev(Ent, pev_frame, 0.0)
  664.     //set_pev(Ent, pev_fuser4, get_gametime()+5.0)
  665.     engfunc(EngFunc_SetModel, Ent,  BALL_MODEL)
  666.     set_pev(Ent, pev_nextthink, get_gametime() + 0.1)
  667.    
  668.     set_pev(Ent, pev_mins, {-1.0, -1.0, -1.0})
  669.     set_pev(Ent, pev_maxs, {1.0, 1.0, 1.0})
  670.     //randomize_origin_increase(TargetOrigin, Angles, -15.0, 15.0, TargetOrigin)
  671.  
  672.     get_speed_vector(StartOrigin, End, float(get_pcvar_num(g_pCvar[CVAR_SPEED])), Velocity)
  673.     set_pev(Ent, pev_velocity, Velocity)
  674.    
  675.     message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  676.     write_byte(TE_BEAMFOLLOW) // Temporary entity ID
  677.     write_short(Ent) // Entity
  678.     write_short(m_spriteTexture) // Sprite index
  679.     write_byte(3) // Life
  680.     write_byte(1) // Line width
  681.     write_byte(10)
  682.     write_byte(229)
  683.     write_byte(255)
  684.     write_byte(100) // Alpha
  685.     message_end()
  686.     set_pev(Ent, pev_iuser4, 0)
  687. }
  688. /*
  689. public CreateBouncerBall(id)
  690. {
  691.     new Float:Origin[3], Float:Angles[3], Float:Velocity[3]
  692.     static Float:StartOrigin[3], Float:TargetOrigin[3]
  693.     get_position(id, 2.0, 0.0, 0.0, StartOrigin)
  694.  
  695.     new Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
  696.     engfunc(EngFunc_GetAttachment, id, 0, Origin, Angles)
  697.  
  698.     pev(id, pev_v_angle, Angles); Angles[0] *= -1.0
  699.  
  700.     set_pev(Ent, pev_origin, StartOrigin)
  701.     set_pev(Ent, pev_solid, SOLID_BBOX)
  702.     set_pev(Ent, pev_angles, Angles)
  703.     set_pev(Ent, pev_gravity, 0.01)
  704.     set_pev(Ent, pev_movetype, MOVETYPE_BOUNCE)
  705.     set_pev(Ent, pev_classname, "bouncer_ball")
  706.     set_pev(Ent, pev_owner, id)
  707.     set_pev(Ent, pev_frame, 0.0)
  708.     set_pev(Ent, pev_model, BALL_MODEL)
  709.  
  710.     set_pev(Ent, pev_mins, {-1.0, -1.0, -1.0})
  711.     set_pev(Ent, pev_maxs, {1.0, 1.0, 1.0})
  712.  
  713.     fm_get_aim_origin(id, TargetOrigin)
  714.     get_speed_vector(StartOrigin, TargetOrigin, 2000.0, Velocity)
  715.     set_pev(Ent, pev_velocity, Velocity)
  716.  
  717.     message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  718.     write_byte(TE_BEAMFOLLOW) // Temporary entity ID
  719.     write_short(Ent) // Entity
  720.     write_short(m_spriteTexture) // Sprite index
  721.     write_byte(7) // Life
  722.     write_byte(1) // Line width
  723.     write_byte(10)
  724.     write_byte(229)
  725.     write_byte(255)
  726.     write_byte(100) // Alpha
  727.     message_end()
  728.     set_pev(Ent, pev_iuser4, 0)
  729. }*/
  730.  
  731. public fw_think(ent)
  732. {
  733.     if(!pev_valid(ent))
  734.         return
  735.  
  736.     if(pev(ent, pev_solid) != SOLID_BBOX)
  737.         set_pev(ent, pev_solid, SOLID_BBOX)
  738.  
  739.     set_pev(ent, pev_nextthink, get_gametime() + 0.001)
  740. }
  741.  
  742. public fw_touch(Ent, Id)
  743. {
  744.     // If ent is valid
  745.     if(!pev_valid(Ent))
  746.         return
  747.  
  748.     static classnameptd[32]
  749.     pev(Id, pev_classname, classnameptd, 31)
  750.     if(equal(classnameptd, "bouncer_ball"))
  751.         return
  752.  
  753.     static Owner; Owner = pev(Ent, pev_owner)
  754.     if(Id == Owner)
  755.         return
  756.  
  757.     static Touched_Time; Touched_Time = pev(Ent, pev_iuser4)+1
  758.     if(Touched_Time > get_pcvar_num(g_pCvar[CVAR_BOUNCE_TIME]))
  759.     {
  760.         engfunc(EngFunc_SetModel, Ent, "")
  761.         remove_entity(Ent)
  762.         return
  763.     }
  764.  
  765.     if(is_user_alive(Id))
  766.     {
  767.         if(Id == Owner)
  768.             return
  769.         if(get_user_team(Id) == get_user_team(Owner))
  770.             return
  771.  
  772.         ExecuteHamB(Ham_TakeDamage, Id, 0, Owner, float(get_pcvar_num(g_pCvar[CVAR_DAMAGE])), DMG_BULLET)
  773.     }
  774.     set_pev(Ent, pev_iuser4, Touched_Time)
  775. }
  776.  
  777. Shotgun_Reload(iEnt, iMaxClip, iClip, iBpAmmo, id)
  778. {
  779.     if(iBpAmmo <= 0 || iClip == iMaxClip)
  780.         return
  781.  
  782.     if(get_pdata_int(iEnt, m_flNextPrimaryAttack, XTRA_OFS_WEAPON) > 0.0)
  783.         return
  784.  
  785.     switch( get_pdata_int(iEnt, m_fInSpecialReload, XTRA_OFS_WEAPON) )
  786.     {
  787.         case 0:
  788.         {
  789.             Set_WeaponAnim(id, ANIM_START_A)
  790.          
  791.             set_pdata_int(iEnt, m_fInSpecialReload, 1)
  792.             set_pdata_float(id, m_flNextAttack, RELOAD_TIME)
  793.             set_pdata_float(iEnt, m_flTimeWeaponIdle, RELOAD_TIME)
  794.             set_pdata_float(iEnt, m_flNextPrimaryAttack, RELOAD_TIME)
  795.             set_pdata_float(iEnt, m_flNextSecondaryAttack, RELOAD_TIME)
  796.             return
  797.         }
  798.         case 1:
  799.         {  
  800.             if( get_pdata_float(iEnt, m_flTimeWeaponIdle) > 0.0 )
  801.                 return  
  802.  
  803.             set_pdata_int(iEnt, m_fInSpecialReload, 2)
  804.              
  805.             //emit_sound(id, CHAN_ITEM, random_num(0,1) ? "weapons/reload1.wav" : "weapons/reload3.wav", 1.0, ATTN_NORM, 0, 85 + random_num(0,0x1f))
  806.             Set_WeaponAnim(id, ANIM_INSERT_A)
  807.  
  808.             //set_pdata_float(iEnt, m_flTimeWeaponIdle, iId == CSW_XM1014 ? 0.30 : 0.45, XTRA_OFS_WEAPON)
  809.             set_pdata_float(iEnt, m_flNextReload, RELOAD_TIME);
  810.             set_pdata_float(iEnt, m_flTimeWeaponIdle, RELOAD_ANIMATION_TIME)
  811.         }
  812.         default:
  813.         {
  814.             set_pdata_int(iEnt, m_iClip, iClip + 1)
  815.             set_pdata_int(id, 381, iBpAmmo-1)
  816.             set_pdata_int(iEnt, m_fInSpecialReload, 1)
  817.         }
  818.     }
  819. }  
  820.  
  821. stock Stock_Muzzle(id)
  822. {
  823.     //if(pev_valid(g_Muzzle[id])) remove_entity(g_Muzzle[id])
  824.     g_Muzzle[id] = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_sprite"));
  825.     new Ent = g_Muzzle[id]
  826.  
  827.     engfunc(EngFunc_SetModel, Ent, WeaponMuzzle);
  828.     entity_set_string(Ent, EV_SZ_classname, "bouncer_muzzleflash")
  829.     set_pev(Ent, pev_nextthink, get_gametime() + 0.04);
  830.     set_pev(Ent, pev_body, 1);
  831.     set_pev(Ent, pev_movetype, MOVETYPE_FOLLOW);
  832.     set_pev(Ent, pev_rendermode, kRenderTransAdd);
  833.     set_pev(Ent, pev_renderamt, 250.0);
  834.     set_pev(Ent, pev_aiment, id);
  835.     set_pev(Ent, pev_owner, id);
  836.  
  837.     set_pev(Ent, pev_scale, 0.06);
  838.     set_pev(Ent, pev_frame, 0.0);
  839.     set_pev(Ent, pev_fuser1, get_gametime()+0.4)
  840.  
  841.     set_pev(Ent, pev_solid, SOLID_NOT);
  842.     dllfunc(DLLFunc_Spawn, Ent);
  843. }
  844.  
  845. stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
  846. {
  847.     new_velocity[0] = origin2[0] - origin1[0]
  848.     new_velocity[1] = origin2[1] - origin1[1]
  849.     new_velocity[2] = origin2[2] - origin1[2]
  850.     static Float:num; num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
  851.     new_velocity[0] *= num
  852.     new_velocity[1] *= num
  853.     new_velocity[2] *= num
  854.    
  855.     return 1;
  856. }
  857.  
  858. stock Eject_Shell(id, Shell_ModelIndex, Float:Time) // By Dias
  859. {
  860.     static Ent; Ent = get_pdata_cbase(id, 373, 5)
  861.     if(!pev_valid(Ent))
  862.         return
  863.    
  864.     set_pdata_int(Ent, 57, Shell_ModelIndex, 4)
  865.     set_pdata_float(id, 111, get_gametime() + Time)
  866. }
  867.  
  868. stock Set_WeaponAnim(id, anim)
  869. {
  870.     set_pev(id, pev_weaponanim, anim)
  871.    
  872.     message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
  873.     write_byte(anim)
  874.     write_byte(pev(id, pev_body))
  875.     message_end()
  876. }
  877.  
  878. stock Set_Weapon_Idle(id, WeaponId ,Float:TimeIdle)
  879. {
  880.     static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
  881.     if(!pev_valid(entwpn))
  882.         return
  883.        
  884.     set_pdata_float(entwpn, 46, TimeIdle, 4)
  885.     set_pdata_float(entwpn, 47, TimeIdle, 4)
  886.     set_pdata_float(entwpn, 48, TimeIdle + 0.5, 4)
  887. }
  888.  
  889. stock Set_Player_NextAttack(id, Float:NextTime) set_pdata_float(id, 83, NextTime, 5)
  890. stock make_bullet(id, Float:Origin[3])
  891. {
  892.     // Find target
  893.     new decal = random_num(41, 45)
  894.     const loop_time = 2
  895.    
  896.     static Body, Target
  897.     get_user_aiming(id, Target, Body, 999999)
  898.    
  899.     if(is_user_connected(Target))
  900.         return
  901.    
  902.     for(new i = 0; i < loop_time; i++)
  903.     {
  904.         // Put decal on "world" (a wall)
  905.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  906.         write_byte(TE_WORLDDECAL)
  907.         engfunc(EngFunc_WriteCoord, Origin[0])
  908.         engfunc(EngFunc_WriteCoord, Origin[1])
  909.         engfunc(EngFunc_WriteCoord, Origin[2])
  910.         write_byte(decal)
  911.         message_end()
  912.        
  913.         // Show sparcles
  914.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  915.         write_byte(TE_GUNSHOTDECAL)
  916.         engfunc(EngFunc_WriteCoord, Origin[0])
  917.         engfunc(EngFunc_WriteCoord, Origin[1])
  918.         engfunc(EngFunc_WriteCoord, Origin[2])
  919.         write_short(id)
  920.         write_byte(decal)
  921.         message_end()
  922.     }
  923. }
  924.  
  925. stock fake_smoke(id, trace_result)
  926. {
  927.     static Float:vecSrc[3], Float:vecEnd[3], TE_FLAG
  928.    
  929.     get_weapon_attachment(id, vecSrc)
  930.     global_get(glb_v_forward, vecEnd)
  931.    
  932.     xs_vec_mul_scalar(vecEnd, 8192.0, vecEnd)
  933.     xs_vec_add(vecSrc, vecEnd, vecEnd)
  934.  
  935.     get_tr2(trace_result, TR_vecEndPos, vecSrc)
  936.     get_tr2(trace_result, TR_vecPlaneNormal, vecEnd)
  937.    
  938.     xs_vec_mul_scalar(vecEnd, 2.5, vecEnd)
  939.     xs_vec_add(vecSrc, vecEnd, vecEnd)
  940.    
  941.     TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
  942.     TE_FLAG |= TE_EXPLFLAG_NOSOUND
  943.     TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
  944.    
  945.     engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEnd, 0)
  946.     write_byte(TE_EXPLOSION)
  947.     engfunc(EngFunc_WriteCoord, vecEnd[0])
  948.     engfunc(EngFunc_WriteCoord, vecEnd[1])
  949.     engfunc(EngFunc_WriteCoord, vecEnd[2] - 10.0)
  950.     write_short(g_SmokePuff_Id)
  951.     write_byte(2)
  952.     write_byte(50)
  953.     write_byte(TE_FLAG)
  954.     message_end()
  955. }
  956.  
  957. stock get_weapon_attachment(id, Float:output[3], Float:fDis = 40.0)
  958. {
  959.     new Float:vfEnd[3], viEnd[3]
  960.     get_user_origin(id, viEnd, 3)  
  961.     IVecFVec(viEnd, vfEnd)
  962.    
  963.     new Float:fOrigin[3], Float:fAngle[3]
  964.    
  965.     pev(id, pev_origin, fOrigin)
  966.     pev(id, pev_view_ofs, fAngle)
  967.    
  968.     xs_vec_add(fOrigin, fAngle, fOrigin)
  969.    
  970.     new Float:fAttack[3]
  971.    
  972.     xs_vec_sub(vfEnd, fOrigin, fAttack)
  973.     xs_vec_sub(vfEnd, fOrigin, fAttack)
  974.    
  975.     new Float:fRate
  976.    
  977.     fRate = fDis / vector_length(fAttack)
  978.     xs_vec_mul_scalar(fAttack, fRate, fAttack)
  979.    
  980.     xs_vec_add(fOrigin, fAttack, output)
  981. }
  982.  
  983. stock get_position(ent, Float:forw, Float:right, Float:up, Float:vStart[])
  984. {
  985.     static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
  986.    
  987.     pev(ent, pev_origin, vOrigin)
  988.     pev(ent, pev_view_ofs,vUp) //for player
  989.     xs_vec_add(vOrigin,vUp,vOrigin)
  990.     pev(ent, pev_v_angle, vAngle) // if normal entity ,use pev_angles
  991.    
  992.     angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
  993.     angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
  994.     angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
  995.    
  996.     vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
  997.     vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
  998.     vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
  999. }
  1000.  
  1001. stock randomize_origin_increase(Float:Origin[3], Float:Angles[3], Float:MinDif, Float: MaxDif, Float:Out[])
  1002. {
  1003.     static Float:vForward[3], Float:vRight[3], Float:vUp[3], Float:right, Float:up
  1004.     angle_vector(Angles,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
  1005.     angle_vector(Angles,ANGLEVECTOR_RIGHT,vRight)
  1006.     angle_vector(Angles,ANGLEVECTOR_UP,vUp)
  1007.  
  1008.     right = random_float(MinDif, MaxDif)
  1009.     up = random_float(MinDif, MaxDif)
  1010.  
  1011.     Out[0] = Origin[0] + vForward[0] + vRight[0] * right + vUp[0] * up
  1012.     Out[1] = Origin[1] + vForward[1] + vRight[1] * right + vUp[1] * up
  1013.     Out[2] = Origin[2] + vForward[2] + vRight[2] * right + vUp[2] * up
  1014. }
  1015.  
  1016. stock get_angle_to_target(id, const Float:fTarget[3], Float:TargetSize = 0.0)
  1017. {
  1018.     static Float:fOrigin[3], iAimOrigin[3], Float:fAimOrigin[3], Float:fV1[3]
  1019.     pev(id, pev_origin, fOrigin)
  1020.     get_user_origin(id, iAimOrigin, 3) // end position from eyes
  1021.     IVecFVec(iAimOrigin, fAimOrigin)
  1022.     xs_vec_sub(fAimOrigin, fOrigin, fV1)
  1023.    
  1024.     static Float:fV2[3]
  1025.     xs_vec_sub(fTarget, fOrigin, fV2)
  1026.    
  1027.     static iResult; iResult = get_angle_between_vectors(fV1, fV2)
  1028.    
  1029.     if (TargetSize > 0.0)
  1030.     {
  1031.         static Float:fTan; fTan = TargetSize / get_distance_f(fOrigin, fTarget)
  1032.         static fAngleToTargetSize; fAngleToTargetSize = floatround( floatatan(fTan, degrees) )
  1033.         iResult -= (iResult > 0) ? fAngleToTargetSize : -fAngleToTargetSize
  1034.     }
  1035.    
  1036.     return iResult
  1037. }
  1038.  
  1039. stock get_angle_between_vectors(const Float:fV1[3], const Float:fV2[3])
  1040. {
  1041.     static Float:fA1[3], Float:fA2[3]
  1042.     engfunc(EngFunc_VecToAngles, fV1, fA1)
  1043.     engfunc(EngFunc_VecToAngles, fV2, fA2)
  1044.    
  1045.     static iResult; iResult = floatround(fA1[1] - fA2[1])
  1046.     iResult = iResult % 360
  1047.     iResult = (iResult > 180) ? (iResult - 360) : iResult
  1048.    
  1049.     return iResult
  1050. }
  1051. /* ===============================
  1052. ------------- SAFETY -------------
  1053. =================================*/
  1054. public Register_SafetyFunc()
  1055. {
  1056.     register_event("CurWeapon", "Safety_CurWeapon", "be", "1=1")
  1057.    
  1058.     RegisterHam(Ham_Spawn, "player", "fw_Safety_Spawn_Post", 1)
  1059.     RegisterHam(Ham_Killed, "player", "fw_Safety_Killed_Post", 1)
  1060. }
  1061.  
  1062. public Register_SafetyFuncBot(id)
  1063. {
  1064.     RegisterHamFromEntity(Ham_Spawn, id, "fw_Safety_Spawn_Post", 1)
  1065.     RegisterHamFromEntity(Ham_Killed, id, "fw_Safety_Killed_Post", 1)
  1066. }
  1067.  
  1068. public Safety_Connected(id)
  1069. {
  1070.     Set_BitVar(g_IsConnected, id)
  1071.     UnSet_BitVar(g_IsAlive, id)
  1072.    
  1073.     g_PlayerWeapon[id] = 0
  1074. }
  1075.  
  1076. public Safety_Disconnected(id)
  1077. {
  1078.     UnSet_BitVar(g_IsConnected, id)
  1079.     UnSet_BitVar(g_IsAlive, id)
  1080.    
  1081.     g_PlayerWeapon[id] = 0
  1082. }
  1083.  
  1084. public Safety_CurWeapon(id)
  1085. {
  1086.     if(!is_player(id, 1))
  1087.         return
  1088.        
  1089.     static CSW; CSW = read_data(2)
  1090.     if(g_PlayerWeapon[id] != CSW) g_PlayerWeapon[id] = CSW
  1091. }
  1092.  
  1093. public fw_Safety_Spawn_Post(id)
  1094. {
  1095.     if(!is_user_alive(id))
  1096.         return
  1097.        
  1098.     Set_BitVar(g_IsAlive, id)
  1099. }
  1100.  
  1101. public fw_Safety_Killed_Post(id)
  1102. {
  1103.     UnSet_BitVar(g_IsAlive, id)
  1104. }
  1105.  
  1106. public is_player(id, IsAliveCheck)
  1107. {
  1108.     if(!(1 <= id <= 32))
  1109.         return 0
  1110.     if(!Get_BitVar(g_IsConnected, id))
  1111.         return 0
  1112.     if(IsAliveCheck)
  1113.     {
  1114.         if(Get_BitVar(g_IsAlive, id)) return 1
  1115.         else return 0
  1116.     }
  1117.    
  1118.     return 1
  1119. }
  1120.  
  1121. public get_player_weapon(id)
  1122. {
  1123.     if(!is_player(id, 1))
  1124.         return 0
  1125.    
  1126.     return g_PlayerWeapon[id]
  1127. }
  1128.  
  1129. /* ===============================
  1130. --------- End of SAFETY ----------
  1131. =================================*/
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

#12

Post by czirimbolo » 5 years ago

Thanks, solved.
Image

czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

#13

Post by czirimbolo » 5 years ago

One more thing, when I have this gun and change to knife, I lose this Bouncer weapon and need to buy again. Can someone fix this?
Image

czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

#14

Post by czirimbolo » 5 years ago

could someone fix this nice gun?
Image

User avatar
Raheem
Mod Developer
Mod Developer
Posts: 2214
Joined: 7 years ago
Contact:

#15

Post by Raheem » 5 years ago

Who coded this plugin did not do the HUD weapon sprites right, i'm not going to fix it but i removed them so not to cause such problems:
  • Code: Select all

    #include <zombie_escape>
    #include <cstrike>
    #include <engine>
    #include <fakemeta_util>
    #include <fun>
    #include <xs>
     
    #define PLUGIN  "[Luna's Weapon] Bouncer"
    #define VERSION "Beta 1.0"
    #define AUTHOR  "Celena Luna"
     
    #define P_MODEL "models/p_bouncer.mdl"
    #define V_MODEL "models/v_bouncer.mdl"
    #define W_MODEL "models/w_bouncer.mdl"
    #define BALL_MODEL "models/s_bouncer.mdl"
     
    #define CSW_BOUNCER CSW_M3
    #define weapon_bouncer "weapon_m3"
     
    #define OLD_SHELL "models/shell_bcs.mdl"   
    #define BOUNCER_SHELL "models/bouncershell.mdl"
     
    #define WEAPON_SECRETCODE 4643
    #define OLD_W_MODEL "models/w_m3.mdl"
    #define OLD_EVENT "events/m3.sc"
     
    #define RELOAD_TIME 0.4
    #define RELOAD_ANIMATION_TIME RELOAD_TIME+0.5
     
    #define write_coord_f(%1)   engfunc(EngFunc_WriteCoord, %1)
     
    enum
    {
        ANIM_IDLE_A = 0,
        ANIM_SHOOT1_A,
        ANIM_SHOOT2_A,
        ANIM_INSERT_A,
        ANIM_AFTER_A,
        ANIM_START_A,
        ANIM_DRAW_A,
    }
     
    enum
    {
        CVAR_DAMAGE = 0,
        CVAR_CLIP,
        CVAR_BPAMMO,
        CVAR_BOUNCE_TIME,
        CVAR_SPEED
    }
     
    new g_pCvar[6]
     
    // ==========================================================
    enum _:ShotGuns {
        m3,
        xm1014
    }
     
    const NOCLIP_WPN_BS = ((1<<CSW_HEGRENADE)|(1<<CSW_SMOKEGRENADE)|(1<<CSW_FLASHBANG)|(1<<CSW_KNIFE)|(1<<CSW_C4))
    const SHOTGUNS_BS   = ((1<<CSW_M3)|(1<<CSW_XM1014))
     
    // weapons offsets
    #define XTRA_OFS_WEAPON         4
    #define m_pPlayer               41
    #define m_iId                   43
    #define m_fKnown                44
    #define m_flNextPrimaryAttack       46
    #define m_flNextSecondaryAttack 47
    #define m_flTimeWeaponIdle      48
    #define m_iPrimaryAmmoType      49
    #define m_iClip             51
    #define m_fInReload             54
    #define m_fInSpecialReload      55
    #define m_fSilent               74
    #define m_flNextReload          75
     
    // players offsets
    #define XTRA_OFS_PLAYER     5
    #define m_flNextAttack      83
    #define m_rgAmmo_player_Slot0   376
     
    stock const g_iDftMaxClip[CSW_P90+1] = {
        -1,  13, -1, 10,  1,  7,    1, 30, 30,  1,  30,
            20, 25, 30, 35, 25,   12, 20, 10, 30, 100,
            8 , 30, 30, 20,  2, 7, 30, 30, -1,  50}
     
    stock const Float:g_fDelay[CSW_P90+1] = {
        0.00, 2.70, 0.00, 2.00, 0.00, 0.55,   0.00, 3.15, 3.30, 0.00, 4.50,
             2.70, 3.50, 3.35, 2.45, 3.30,   2.70, 2.20, 2.50, 2.63, 4.70,
             0.55, 3.05, 2.12, 3.50, 0.00,   2.20, 3.00, 2.45, 0.00, 3.40
    }
     
    stock const g_iReloadAnims[CSW_P90+1] = {
        -1,  5, -1, 3, -1,  6,   -1, 1, 1, -1, 14,
            4,  2, 3,  1,  1,   13, 7, 4,  1,  3,
            6, 11, 1,  3, -1,   4, 1, 1, -1,  1}
     
    #define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
    #define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
    #define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))
     
    new g_Had_Bouncer, g_Event_Bouncer
    new g_MsgWeaponList, g_MsgCurWeapon, g_HamBot
    new m_spriteTexture, g_Muzzle[33], m_shellIndex
    new g_OldWeapon[33]
    new g_iItemID
     
    // Safety
    new g_IsConnected, g_IsAlive, g_PlayerWeapon[33]
     
    new const WeaponSounds[3][] =
    {
        "sound/weapons/bouncer_draw.wav",
        "sound/weapons/bouncer_reload_after.wav",
        "sound/weapons/bouncer_reload_insert.wav"
    }
     
    new const WeaponResources[3][] =
    {
        "sprites/weapon_bouncer.txt",
        "sprites/640hud168.spr",
        "sprites/640hud18.spr"
    }
     
    #define WeaponShoots "weapons/bouncer-1.wav"
    #define WeaponMuzzle "sprites/muzzleflash_bouncer.spr"
     
     
    public plugin_precache()
    {
        precache_model(V_MODEL)
        precache_model(P_MODEL)
        precache_model(W_MODEL)
        precache_model(BALL_MODEL)
        precache_sound(WeaponShoots)
        m_shellIndex = precache_model(BOUNCER_SHELL)
       
        for(new i = 0; i < sizeof(WeaponSounds); i++)
            precache_generic(WeaponSounds[i])
        for(new i = 0; i < sizeof(WeaponResources); i++)
        {
            if(!i) precache_generic(WeaponResources[i])
            else precache_model(WeaponResources[i])
        }
       
        register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1) 
       
        m_spriteTexture = precache_model("sprites/laserbeam.spr")
        precache_model("sprites/muzzleflash_bouncer.spr")
    }
     
    public plugin_natives()
    {
        register_native("luna_get_bouncer", "Get_Bouncer", 1)
        register_native("luna_remove_bouncer", "Remove_Bouncer", 1)
    }
     
    public plugin_init()
    {
        register_plugin(PLUGIN, VERSION, AUTHOR)
     
        register_forward(FM_SetModel, "fw_SetModel")
        register_forward(FM_CmdStart, "fw_CmdStart")
        register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)   
        register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
     
            // Safety
        Register_SafetyFunc()
     
        register_touch("bouncer_ball", "*", "fw_touch")
        register_think("bouncer_ball", "fw_think")
     
        register_event("HLTV", "event_newround", "a", "1=0", "2=0")
     
        register_think("bouncer_muzzleflash", "fw_Muzzle_Think")
     
        RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack")
        RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack")       
       
        RegisterHam(Ham_Item_Deploy, weapon_bouncer, "fw_Item_Deploy_Post", 1) 
        RegisterHam(Ham_Item_AddToPlayer, weapon_bouncer, "fw_Item_AddToPlayer_Post", 1)
        RegisterHam(Ham_Weapon_WeaponIdle, weapon_bouncer, "fw_Weapon_WeaponIdle") 
        RegisterHam(Ham_Weapon_WeaponIdle, weapon_bouncer, "fw_Weapon_WeaponIdle_Post", 1)
        RegisterHam(Ham_Weapon_Reload, weapon_bouncer, "fw_Weapon_Reload", 1)
        RegisterHam(Ham_Weapon_PrimaryAttack, weapon_bouncer, "fw_Weapon_PrimaryAttack_Post", 1)
     
        g_pCvar[CVAR_CLIP] = register_cvar("luna_bouncer_clip", "25")
        g_pCvar[CVAR_BPAMMO] = register_cvar("luna_bouncer_bpammo", "150")
        g_pCvar[CVAR_BOUNCE_TIME] = register_cvar("luna_bouncer_bounce_time", "3")
        g_pCvar[CVAR_SPEED] = register_cvar("luna_bouncer_speed", "2500")
        g_pCvar[CVAR_DAMAGE] = register_cvar("luna_bouncer_damage", "400")
     
        // Cache
        //g_MsgWeaponList = get_user_msgid("WeaponList")
        g_MsgCurWeapon = get_user_msgid("CurWeapon")
        //register_clcmd("weapon_bouncer", "hook_weapon")
     
        g_iItemID = ze_register_item("Luna Bouncer", 50, 0)
    }
     
    public fw_PrecacheEvent_Post(type, const name[])
    {
        if(equal(OLD_EVENT, name))
            g_Event_Bouncer = get_orig_retval()
    }
     
    public client_putinserver(id)
    {
        Safety_Connected(id)
       
        if(!g_HamBot && is_user_bot(id))
        {
            g_HamBot = 1
            set_task(0.1, "Do_Register_HamBot", id)
        }
    }
     
    public Do_Register_HamBot(id)
    {
        Register_SafetyFuncBot(id)
        RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack")
    }
     
    public client_disconnected(id)
    {
        Safety_Disconnected(id)
    }
     
    public Get_Bouncer(id)
    {
        Remove_Bouncer(id)
       
        Set_BitVar(g_Had_Bouncer, id)
       
        give_item(id, weapon_bouncer)
        static bpammo; bpammo = get_pcvar_num(g_pCvar[CVAR_BPAMMO])
        cs_set_user_bpammo(id, CSW_BOUNCER, bpammo)
       
        static Ent; Ent = fm_get_user_weapon_entity(id, CSW_BOUNCER)
        static Clip; Clip = get_pcvar_num(g_pCvar[CVAR_CLIP])
        if(pev_valid(Ent)) cs_set_weapon_ammo(Ent, Clip)
     
        message_begin(MSG_ONE_UNRELIABLE, g_MsgCurWeapon, _, id)
        write_byte(1)
        write_byte(CSW_BOUNCER)
        write_byte(Clip)
        message_end()
    }
     
    public ze_select_item_pre(id, itemid)
    {
        if (itemid != g_iItemID)
            return ZE_ITEM_AVAILABLE
     
        if (ze_is_user_zombie(id))
            return ZE_ITEM_DONT_SHOW
     
        return ZE_ITEM_AVAILABLE
    }
     
    public ze_select_item_post(id, itemid)
    {
        if (itemid != g_iItemID)
            return
     
        Get_Bouncer(id)
    }
     
    public ze_user_humanized(id)
    {
        Remove_Bouncer(id)
    }
     
    public ze_user_infected(id)
    {
        Remove_Bouncer(id)
    }
     
    /*public hook_weapon(id)
    {
        engclient_cmd(id, weapon_bouncer)
        return PLUGIN_HANDLED
    }*/
     
    public Remove_Bouncer(id)
    {
        UnSet_BitVar(g_Had_Bouncer, id)
     
        if(pev_valid(g_Muzzle[id])) remove_entity(g_Muzzle[id])
        g_Muzzle[id] = 0
    }
     
    public Event_CurWeapon(id)
    {
        if(!is_player(id, 1))
            return
       
        static CSWID; CSWID = read_data(2)
       
        g_OldWeapon[id] = CSWID
    }
     
    public fw_SetModel(entity, model[])
    {
        if(!pev_valid(entity))
            return FMRES_IGNORED
       
        static Classname[64]
        pev(entity, pev_classname, Classname, sizeof(Classname))
       
        if(!equal(Classname, "weaponbox"))
            return FMRES_IGNORED
       
        static id
        id = pev(entity, pev_owner)
       
        if(equal(model, OLD_W_MODEL))
        {
            static weapon
            weapon = fm_get_user_weapon_entity(entity, CSW_BOUNCER)
           
            if(!pev_valid(weapon))
                return FMRES_IGNORED
           
            if(Get_BitVar(g_Had_Bouncer, id))
            {
                set_pev(weapon, pev_impulse, WEAPON_SECRETCODE)
                engfunc(EngFunc_SetModel, entity, W_MODEL)
               
                Remove_Bouncer(id)
               
                return FMRES_SUPERCEDE
            }
        }
     
        return FMRES_IGNORED;
    }
     
    public fw_CmdStart(id, uc_handle, seed)
    {
        if(!is_player(id, 1))
            return
        if(get_player_weapon(id) != CSW_BOUNCER|| !Get_BitVar(g_Had_Bouncer, id))
            return
           
        static NewButton; NewButton = get_uc(uc_handle, UC_Buttons)
       
        static Ent; Ent = fm_get_user_weapon_entity(id, CSW_BOUNCER)
        static Clip; Clip = get_pcvar_num(g_pCvar[CVAR_CLIP])
        if(!pev_valid(Ent)) return
       
        /*if(NewButton & IN_RELOAD)
        {
            NewButton &= ~IN_RELOAD
            set_uc(uc_handle, UC_Buttons, NewButton)
           
            if(flNextAttack > 0.0) return
           
            static fInReload; fInReload = get_pdata_int(Ent, 54, 4)
            if(fInReload || cs_get_weapon_ammo(Ent) >= CLIP)
                return
           
            fw_Weapon_Reload(Ent)
        }*/
     
        if(NewButton & IN_RELOAD)
        {  
            if(pev_valid(Ent)) set_pdata_int(Ent, 54, 0, 4)
           
            NewButton &= ~IN_RELOAD
            set_uc(uc_handle, UC_Buttons, NewButton)
            if(cs_get_weapon_ammo(Ent) < Clip)
                ExecuteHamB(Ham_Weapon_Reload, Ent)
     
            return
        }
    }
     
    public event_newround()
    {
        new nextitem  = find_ent_by_class(-1, "bouncer_ball")
        while(nextitem)
        {
            remove_entity(nextitem)
            nextitem = find_ent_by_class(-1, "bouncer_ball")
        }
    }
     
    public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
    {
        if(!is_player(id, 1))
            return FMRES_IGNORED   
        if(get_player_weapon(id) == CSW_BOUNCER && Get_BitVar(g_Had_Bouncer, id))
            set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001)
       
        return FMRES_HANDLED
    }
     
    public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
    {
        if (!is_player(invoker, 0))
            return FMRES_IGNORED       
        if(get_player_weapon(invoker) == CSW_BOUNCER && Get_BitVar(g_Had_Bouncer, invoker) && eventid == g_Event_Bouncer)
        {
            engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
     
            Set_WeaponAnim(invoker, ANIM_SHOOT1_A)
            emit_sound(invoker, CHAN_WEAPON, WeaponShoots, 1.0, ATTN_NORM, 0, PITCH_LOW)   
       
            return FMRES_SUPERCEDE
        }
       
        return FMRES_HANDLED
    }
     
    public fw_TraceAttack(Ent, Attacker, Float:Damage, Float:Dir[3], ptr, DamageType)
    {
        if(!is_player(Attacker, 0))
            return HAM_IGNORED 
        if(get_player_weapon(Attacker) != CSW_BOUNCER || !Get_BitVar(g_Had_Bouncer, Attacker))
            return HAM_IGNORED
           
        static Float:flEnd[3], Float:vecPlane[3]
       
        get_tr2(ptr, TR_vecEndPos, flEnd)
        get_tr2(ptr, TR_vecPlaneNormal, vecPlane)  
     
        if(!is_user_alive(Ent))
        {
            make_bullet(Attacker, flEnd)
            //fake_smoke(Attacker, ptr)
        }
     
        CreateBouncerBall(Attacker, flEnd)
     
         //Later~
        Eject_Shell(Attacker, m_shellIndex, 0.1)
       
        //And Block it. Won't let it shot.
        return HAM_SUPERCEDE
    }
     
    public fw_Weapon_PrimaryAttack_Post( ent )
    {
        static id ; id = get_pdata_cbase(ent, m_pPlayer, XTRA_OFS_WEAPON)  
       
        if(!is_user_alive(id) || !is_user_connected(id))
            return HAM_IGNORED
           
        if(get_user_weapon(id) != CSW_BOUNCER|| !Get_BitVar(g_Had_Bouncer, id))
            return HAM_IGNORED
     
     
        static iClip; iClip = get_pdata_int(ent, 51, 4)
        if(iClip > 0)
            Stock_Muzzle(id)
     
        /*static total_shoot; total_shoot = random_num(5, 8)
     
        for(new i; i < total_shoot; i++)
            CreateBouncerBall(id)*/
     
        return HAM_IGNORED
    }
     
    public fw_Muzzle_Think(iEnt)
    {
        new id = pev(iEnt, pev_owner)
        new Float:endtime
        pev(iEnt, pev_fuser1, endtime)
     
        if(!pev_valid(iEnt))    
            return
        if(!Get_BitVar(g_Had_Bouncer,id) || get_user_weapon(id) != CSW_BOUNCER)
        {
            set_pev(iEnt, pev_flags, FL_KILLME)
            g_Muzzle[id] = 0
            return
        }
     
        if(endtime <= get_gametime())
        {
            set_pev(iEnt, pev_flags, FL_KILLME)
            g_Muzzle[id] = 0
            return
        }
     
        new Float:fFrame, Float:fNextThink
        pev(iEnt, pev_frame, fFrame)
       
        new Float:fOrigin[3]
        pev(id, pev_origin, fOrigin)
       
        engfunc(EngFunc_MessageBegin, MSG_ALL, SVC_TEMPENTITY, fOrigin, 0)
        write_byte(TE_DLIGHT)
        engfunc(EngFunc_WriteCoord,fOrigin[0])
        engfunc(EngFunc_WriteCoord,fOrigin[1])
        engfunc(EngFunc_WriteCoord,fOrigin[2])
        write_byte(3)
        write_byte(255)
        write_byte(187)
        write_byte(0)
        write_byte(2)
        write_byte(0)
        message_end()
     
        // effect exp
        fNextThink = 0.01
        fFrame += 1.0
        if(fFrame > 15.0) fFrame = 0.0
     
        set_pev(iEnt, pev_frame, fFrame)
        set_pev(iEnt, pev_scale, 0.06)
        set_pev(iEnt, pev_nextthink, get_gametime() + fNextThink)
    }
     
     
    public fw_Item_Deploy_Post(Ent)
    {
        if(pev_valid(Ent) != 2)
            return
        static Id; Id = get_pdata_cbase(Ent, 41, 4)
        if(get_pdata_cbase(Id, 373) != Ent)
            return
        if(!Get_BitVar(g_Had_Bouncer, Id))
            return
     
        set_pev(Id, pev_viewmodel2, V_MODEL)
        set_pev(Id, pev_weaponmodel2, P_MODEL)
       
        Set_WeaponAnim(Id, ANIM_DRAW_A)
    }
     
    public fw_Item_AddToPlayer_Post(ent, id)
    {
        if(!pev_valid(ent))
            return HAM_IGNORED
     
        if(pev(ent, pev_impulse) == WEAPON_SECRETCODE)
        {
            Set_BitVar(g_Had_Bouncer, id)
            set_pev(ent, pev_impulse, 0)
        }
     
        if(Get_BitVar(g_Had_Bouncer, id))
        {
            /*message_begin(MSG_ONE_UNRELIABLE, g_MsgWeaponList, _, id)
            write_string("weapon_bouncer")
            write_byte(3)
            write_byte(200)
            write_byte(-1)
            write_byte(-1)
            write_byte(0)
            write_byte(4)
            write_byte(CSW_BOUNCER)
            write_byte(0)
            message_end()*/
        }      
     
        return HAM_HANDLED 
    }
     
    public fw_Weapon_WeaponIdle( iEnt )
    {
        if(pev_valid(iEnt) != 2)
            return
        static id; id = get_pdata_cbase(iEnt, m_pPlayer, XTRA_OFS_WEAPON)
        if(get_pdata_cbase(id, 373) != iEnt)
            return
        if(!Get_BitVar(g_Had_Bouncer, id))
            return
       
        if( get_pdata_float(iEnt, m_flTimeWeaponIdle, XTRA_OFS_WEAPON) > 0.0 )
        {
            return
        }
       
        static iId ; iId = get_pdata_int(iEnt, m_iId, XTRA_OFS_WEAPON)
        static iMaxClip ; iMaxClip = g_pCvar[CVAR_CLIP]
     
        static iClip ; iClip = get_pdata_int(iEnt, m_iClip, XTRA_OFS_WEAPON)
        static fInSpecialReload ; fInSpecialReload = get_pdata_int(iEnt, m_fInSpecialReload, XTRA_OFS_WEAPON)
     
        if( !iClip && !fInSpecialReload )
        {
            return
        }
     
        if( fInSpecialReload )
        {
            static iBpAmmo ; iBpAmmo = get_pdata_int(id, 381, XTRA_OFS_PLAYER)
            static iDftMaxClip ; iDftMaxClip = g_iDftMaxClip[iId]
     
            if( iClip < iMaxClip && iClip == iDftMaxClip && iBpAmmo )
            {
                Shotgun_Reload(iEnt, iMaxClip, iClip, iBpAmmo, id)
                return
            }
            else if( iClip == iMaxClip && iClip != iDftMaxClip )
            {
                Set_WeaponAnim(id, ANIM_AFTER_A)
               
                set_pdata_int(iEnt, m_fInSpecialReload, 0, XTRA_OFS_WEAPON)
                set_pdata_float(iEnt, m_flTimeWeaponIdle, 1.5, XTRA_OFS_WEAPON)
            }
        }
       
        return
    }
     
    public fw_Weapon_WeaponIdle_Post( iEnt )
    {
        if(pev_valid(iEnt) != 2)
            return
        static id; id = get_pdata_cbase(iEnt, m_pPlayer, XTRA_OFS_WEAPON)
        if(get_pdata_cbase(id, 373) != iEnt)
            return
        if(!Get_BitVar(g_Had_Bouncer, id))
            return
           
        static SpecialReload; SpecialReload = get_pdata_int(iEnt, 55, 4)
        if(!SpecialReload && get_pdata_float(iEnt, 48, 4) <= 0.25)
        {
            Set_WeaponAnim(id, ANIM_IDLE_A)
            set_pdata_float(iEnt, 48, 20.0, 4)
        }  
    }
     
    public fw_Weapon_Reload(iEnt)
    {
        static id ; id = get_pdata_cbase(iEnt, m_pPlayer, XTRA_OFS_WEAPON)   
     
        static iBpAmmo ; iBpAmmo = get_pdata_int(id, 381, XTRA_OFS_PLAYER)
        static iClip ; iClip = get_pdata_int(iEnt, m_iClip, XTRA_OFS_WEAPON)
        static iMaxClip ; iMaxClip = g_pCvar[CVAR_CLIP]
     
        Shotgun_Reload(iEnt, iMaxClip, iClip, iBpAmmo, id)
        return HAM_SUPERCEDE
    }
     
    public CreateBouncerBall(id, Float:End[3])
    {
        new Float:Origin[3], Float:Angles[3], Float:Velocity[3]
        static Float:StartOrigin[3]
        get_position(id, 2.0, 0.0, 0.0, StartOrigin)
     
        new Ent; Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
        engfunc(EngFunc_GetAttachment, id, 0, Origin, Angles)
     
        pev(id, pev_v_angle, Angles)//; Angles[0] *= -1.0
     
        entity_set_string(Ent, EV_SZ_classname, "bouncer_ball")
        set_pev(Ent, pev_origin, StartOrigin)
        set_pev(Ent, pev_angles, Angles)
        //set_pev(Ent, pev_solid, SOLID_BBOX)
        set_pev(Ent, pev_solid, SOLID_TRIGGER)
        set_pev(Ent, pev_gravity, 0.01)
        set_pev(Ent, pev_movetype, MOVETYPE_BOUNCE)
        set_pev(Ent, pev_classname, "bouncer_ball")
        set_pev(Ent, pev_angles, Angles)
        set_pev(Ent, pev_owner, id)
        set_pev(Ent, pev_frame, 0.0)
        //set_pev(Ent, pev_fuser4, get_gametime()+5.0)
        engfunc(EngFunc_SetModel, Ent,  BALL_MODEL)
        set_pev(Ent, pev_nextthink, get_gametime() + 0.1)
       
        set_pev(Ent, pev_mins, {-1.0, -1.0, -1.0})
        set_pev(Ent, pev_maxs, {1.0, 1.0, 1.0})
        //randomize_origin_increase(TargetOrigin, Angles, -15.0, 15.0, TargetOrigin)
     
        get_speed_vector(StartOrigin, End, float(get_pcvar_num(g_pCvar[CVAR_SPEED])), Velocity)
        set_pev(Ent, pev_velocity, Velocity)
       
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_BEAMFOLLOW) // Temporary entity ID
        write_short(Ent) // Entity
        write_short(m_spriteTexture) // Sprite index
        write_byte(3) // Life
        write_byte(1) // Line width
        write_byte(10)
        write_byte(229)
        write_byte(255)
        write_byte(100) // Alpha
        message_end()
        set_pev(Ent, pev_iuser4, 0)
    }
    /*
    public CreateBouncerBall(id)
    {
        new Float:Origin[3], Float:Angles[3], Float:Velocity[3]
        static Float:StartOrigin[3], Float:TargetOrigin[3]
        get_position(id, 2.0, 0.0, 0.0, StartOrigin)
     
        new Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
        engfunc(EngFunc_GetAttachment, id, 0, Origin, Angles)
     
        pev(id, pev_v_angle, Angles); Angles[0] *= -1.0
     
        set_pev(Ent, pev_origin, StartOrigin)
        set_pev(Ent, pev_solid, SOLID_BBOX)
        set_pev(Ent, pev_angles, Angles)
        set_pev(Ent, pev_gravity, 0.01)
        set_pev(Ent, pev_movetype, MOVETYPE_BOUNCE)
        set_pev(Ent, pev_classname, "bouncer_ball")
        set_pev(Ent, pev_owner, id)
        set_pev(Ent, pev_frame, 0.0)
        set_pev(Ent, pev_model, BALL_MODEL)
     
        set_pev(Ent, pev_mins, {-1.0, -1.0, -1.0})
        set_pev(Ent, pev_maxs, {1.0, 1.0, 1.0})
     
        fm_get_aim_origin(id, TargetOrigin)
        get_speed_vector(StartOrigin, TargetOrigin, 2000.0, Velocity)
        set_pev(Ent, pev_velocity, Velocity)
     
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_BEAMFOLLOW) // Temporary entity ID
        write_short(Ent) // Entity
        write_short(m_spriteTexture) // Sprite index
        write_byte(7) // Life
        write_byte(1) // Line width
        write_byte(10)
        write_byte(229)
        write_byte(255)
        write_byte(100) // Alpha
        message_end()
        set_pev(Ent, pev_iuser4, 0)
    }*/
     
    public fw_think(ent)
    {
        if(!pev_valid(ent))
            return
     
        if(pev(ent, pev_solid) != SOLID_BBOX)
            set_pev(ent, pev_solid, SOLID_BBOX)
     
        set_pev(ent, pev_nextthink, get_gametime() + 0.001)
    }
     
    public fw_touch(Ent, Id)
    {
        // If ent is valid
        if(!pev_valid(Ent))
            return
     
        static classnameptd[32]
        pev(Id, pev_classname, classnameptd, 31)
        if(equal(classnameptd, "bouncer_ball"))
            return
     
        static Owner; Owner = pev(Ent, pev_owner)
        if(Id == Owner)
            return
     
        static Touched_Time; Touched_Time = pev(Ent, pev_iuser4)+1
        if(Touched_Time > get_pcvar_num(g_pCvar[CVAR_BOUNCE_TIME]))
        {
            engfunc(EngFunc_SetModel, Ent, "")
            remove_entity(Ent)
            return
        }
     
        if(is_user_alive(Id))
        {
            if(Id == Owner)
                return
            if(get_user_team(Id) == get_user_team(Owner))
                return
     
            ExecuteHamB(Ham_TakeDamage, Id, 0, Owner, float(get_pcvar_num(g_pCvar[CVAR_DAMAGE])), DMG_BULLET)
        }
        set_pev(Ent, pev_iuser4, Touched_Time)
    }
     
    Shotgun_Reload(iEnt, iMaxClip, iClip, iBpAmmo, id)
    {
        if(iBpAmmo <= 0 || iClip == iMaxClip)
            return
     
        if(get_pdata_int(iEnt, m_flNextPrimaryAttack, XTRA_OFS_WEAPON) > 0.0)
            return
     
        switch( get_pdata_int(iEnt, m_fInSpecialReload, XTRA_OFS_WEAPON) )
        {
            case 0:
            {
                Set_WeaponAnim(id, ANIM_START_A)
             
                set_pdata_int(iEnt, m_fInSpecialReload, 1)
                set_pdata_float(id, m_flNextAttack, RELOAD_TIME)
                set_pdata_float(iEnt, m_flTimeWeaponIdle, RELOAD_TIME)
                set_pdata_float(iEnt, m_flNextPrimaryAttack, RELOAD_TIME)
                set_pdata_float(iEnt, m_flNextSecondaryAttack, RELOAD_TIME)
                return
            }
            case 1:
            {  
                if( get_pdata_float(iEnt, m_flTimeWeaponIdle) > 0.0 )
                    return  
     
                set_pdata_int(iEnt, m_fInSpecialReload, 2)
                 
                //emit_sound(id, CHAN_ITEM, random_num(0,1) ? "weapons/reload1.wav" : "weapons/reload3.wav", 1.0, ATTN_NORM, 0, 85 + random_num(0,0x1f))
                Set_WeaponAnim(id, ANIM_INSERT_A)
     
                //set_pdata_float(iEnt, m_flTimeWeaponIdle, iId == CSW_XM1014 ? 0.30 : 0.45, XTRA_OFS_WEAPON)
                set_pdata_float(iEnt, m_flNextReload, RELOAD_TIME);
                set_pdata_float(iEnt, m_flTimeWeaponIdle, RELOAD_ANIMATION_TIME)
            }
            default:
            {
                set_pdata_int(iEnt, m_iClip, iClip + 1)
                set_pdata_int(id, 381, iBpAmmo-1)
                set_pdata_int(iEnt, m_fInSpecialReload, 1)
            }
        }
    }  
     
    stock Stock_Muzzle(id)
    {
        //if(pev_valid(g_Muzzle[id])) remove_entity(g_Muzzle[id])
        g_Muzzle[id] = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_sprite"));
        new Ent = g_Muzzle[id]
     
        engfunc(EngFunc_SetModel, Ent, WeaponMuzzle);
        entity_set_string(Ent, EV_SZ_classname, "bouncer_muzzleflash")
        set_pev(Ent, pev_nextthink, get_gametime() + 0.04);
        set_pev(Ent, pev_body, 1);
        set_pev(Ent, pev_movetype, MOVETYPE_FOLLOW);
        set_pev(Ent, pev_rendermode, kRenderTransAdd);
        set_pev(Ent, pev_renderamt, 250.0);
        set_pev(Ent, pev_aiment, id);
        set_pev(Ent, pev_owner, id);
     
        set_pev(Ent, pev_scale, 0.06);
        set_pev(Ent, pev_frame, 0.0);
        set_pev(Ent, pev_fuser1, get_gametime()+0.4)
     
        set_pev(Ent, pev_solid, SOLID_NOT);
        dllfunc(DLLFunc_Spawn, Ent);
    }
     
    stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
    {
        new_velocity[0] = origin2[0] - origin1[0]
        new_velocity[1] = origin2[1] - origin1[1]
        new_velocity[2] = origin2[2] - origin1[2]
        static Float:num; num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
        new_velocity[0] *= num
        new_velocity[1] *= num
        new_velocity[2] *= num
       
        return 1;
    }
     
    stock Eject_Shell(id, Shell_ModelIndex, Float:Time) // By Dias
    {
        static Ent; Ent = get_pdata_cbase(id, 373, 5)
        if(!pev_valid(Ent))
            return
       
        set_pdata_int(Ent, 57, Shell_ModelIndex, 4)
        set_pdata_float(id, 111, get_gametime() + Time)
    }
     
    stock Set_WeaponAnim(id, anim)
    {
        set_pev(id, pev_weaponanim, anim)
       
        message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
        write_byte(anim)
        write_byte(pev(id, pev_body))
        message_end()
    }
     
    stock Set_Weapon_Idle(id, WeaponId ,Float:TimeIdle)
    {
        static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
        if(!pev_valid(entwpn))
            return
           
        set_pdata_float(entwpn, 46, TimeIdle, 4)
        set_pdata_float(entwpn, 47, TimeIdle, 4)
        set_pdata_float(entwpn, 48, TimeIdle + 0.5, 4)
    }
     
    stock Set_Player_NextAttack(id, Float:NextTime) set_pdata_float(id, 83, NextTime, 5)
    stock make_bullet(id, Float:Origin[3])
    {
        // Find target
        new decal = random_num(41, 45)
        const loop_time = 2
       
        static Body, Target
        get_user_aiming(id, Target, Body, 999999)
       
        if(is_user_connected(Target))
            return
       
        for(new i = 0; i < loop_time; i++)
        {
            // Put decal on "world" (a wall)
            message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
            write_byte(TE_WORLDDECAL)
            engfunc(EngFunc_WriteCoord, Origin[0])
            engfunc(EngFunc_WriteCoord, Origin[1])
            engfunc(EngFunc_WriteCoord, Origin[2])
            write_byte(decal)
            message_end()
           
            // Show sparcles
            message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
            write_byte(TE_GUNSHOTDECAL)
            engfunc(EngFunc_WriteCoord, Origin[0])
            engfunc(EngFunc_WriteCoord, Origin[1])
            engfunc(EngFunc_WriteCoord, Origin[2])
            write_short(id)
            write_byte(decal)
            message_end()
        }
    }
     
    stock fake_smoke(id, trace_result)
    {
        static Float:vecSrc[3], Float:vecEnd[3], TE_FLAG
       
        get_weapon_attachment(id, vecSrc)
        global_get(glb_v_forward, vecEnd)
       
        xs_vec_mul_scalar(vecEnd, 8192.0, vecEnd)
        xs_vec_add(vecSrc, vecEnd, vecEnd)
     
        get_tr2(trace_result, TR_vecEndPos, vecSrc)
        get_tr2(trace_result, TR_vecPlaneNormal, vecEnd)
       
        xs_vec_mul_scalar(vecEnd, 2.5, vecEnd)
        xs_vec_add(vecSrc, vecEnd, vecEnd)
       
        TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
        TE_FLAG |= TE_EXPLFLAG_NOSOUND
        TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
       
        engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEnd, 0)
        write_byte(TE_EXPLOSION)
        engfunc(EngFunc_WriteCoord, vecEnd[0])
        engfunc(EngFunc_WriteCoord, vecEnd[1])
        engfunc(EngFunc_WriteCoord, vecEnd[2] - 10.0)
        write_short(g_SmokePuff_Id)
        write_byte(2)
        write_byte(50)
        write_byte(TE_FLAG)
        message_end()
    }
     
    stock get_weapon_attachment(id, Float:output[3], Float:fDis = 40.0)
    {
        new Float:vfEnd[3], viEnd[3]
        get_user_origin(id, viEnd, 3)  
        IVecFVec(viEnd, vfEnd)
       
        new Float:fOrigin[3], Float:fAngle[3]
       
        pev(id, pev_origin, fOrigin)
        pev(id, pev_view_ofs, fAngle)
       
        xs_vec_add(fOrigin, fAngle, fOrigin)
       
        new Float:fAttack[3]
       
        xs_vec_sub(vfEnd, fOrigin, fAttack)
        xs_vec_sub(vfEnd, fOrigin, fAttack)
       
        new Float:fRate
       
        fRate = fDis / vector_length(fAttack)
        xs_vec_mul_scalar(fAttack, fRate, fAttack)
       
        xs_vec_add(fOrigin, fAttack, output)
    }
     
    stock get_position(ent, Float:forw, Float:right, Float:up, Float:vStart[])
    {
        static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
       
        pev(ent, pev_origin, vOrigin)
        pev(ent, pev_view_ofs,vUp) //for player
        xs_vec_add(vOrigin,vUp,vOrigin)
        pev(ent, pev_v_angle, vAngle) // if normal entity ,use pev_angles
       
        angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
        angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
        angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
       
        vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
        vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
        vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
    }
     
    stock randomize_origin_increase(Float:Origin[3], Float:Angles[3], Float:MinDif, Float: MaxDif, Float:Out[])
    {
        static Float:vForward[3], Float:vRight[3], Float:vUp[3], Float:right, Float:up
        angle_vector(Angles,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
        angle_vector(Angles,ANGLEVECTOR_RIGHT,vRight)
        angle_vector(Angles,ANGLEVECTOR_UP,vUp)
     
        right = random_float(MinDif, MaxDif)
        up = random_float(MinDif, MaxDif)
     
        Out[0] = Origin[0] + vForward[0] + vRight[0] * right + vUp[0] * up
        Out[1] = Origin[1] + vForward[1] + vRight[1] * right + vUp[1] * up
        Out[2] = Origin[2] + vForward[2] + vRight[2] * right + vUp[2] * up
    }
     
    stock get_angle_to_target(id, const Float:fTarget[3], Float:TargetSize = 0.0)
    {
        static Float:fOrigin[3], iAimOrigin[3], Float:fAimOrigin[3], Float:fV1[3]
        pev(id, pev_origin, fOrigin)
        get_user_origin(id, iAimOrigin, 3) // end position from eyes
        IVecFVec(iAimOrigin, fAimOrigin)
        xs_vec_sub(fAimOrigin, fOrigin, fV1)
       
        static Float:fV2[3]
        xs_vec_sub(fTarget, fOrigin, fV2)
       
        static iResult; iResult = get_angle_between_vectors(fV1, fV2)
       
        if (TargetSize > 0.0)
        {
            static Float:fTan; fTan = TargetSize / get_distance_f(fOrigin, fTarget)
            static fAngleToTargetSize; fAngleToTargetSize = floatround( floatatan(fTan, degrees) )
            iResult -= (iResult > 0) ? fAngleToTargetSize : -fAngleToTargetSize
        }
       
        return iResult
    }
     
    stock get_angle_between_vectors(const Float:fV1[3], const Float:fV2[3])
    {
        static Float:fA1[3], Float:fA2[3]
        engfunc(EngFunc_VecToAngles, fV1, fA1)
        engfunc(EngFunc_VecToAngles, fV2, fA2)
       
        static iResult; iResult = floatround(fA1[1] - fA2[1])
        iResult = iResult % 360
        iResult = (iResult > 180) ? (iResult - 360) : iResult
       
        return iResult
    }
    /* ===============================
    ------------- SAFETY -------------
    =================================*/
    public Register_SafetyFunc()
    {
        register_event("CurWeapon", "Safety_CurWeapon", "be", "1=1")
       
        RegisterHam(Ham_Spawn, "player", "fw_Safety_Spawn_Post", 1)
        RegisterHam(Ham_Killed, "player", "fw_Safety_Killed_Post", 1)
    }
     
    public Register_SafetyFuncBot(id)
    {
        RegisterHamFromEntity(Ham_Spawn, id, "fw_Safety_Spawn_Post", 1)
        RegisterHamFromEntity(Ham_Killed, id, "fw_Safety_Killed_Post", 1)
    }
     
    public Safety_Connected(id)
    {
        Set_BitVar(g_IsConnected, id)
        UnSet_BitVar(g_IsAlive, id)
       
        g_PlayerWeapon[id] = 0
    }
     
    public Safety_Disconnected(id)
    {
        UnSet_BitVar(g_IsConnected, id)
        UnSet_BitVar(g_IsAlive, id)
       
        g_PlayerWeapon[id] = 0
    }
     
    public Safety_CurWeapon(id)
    {
        if(!is_player(id, 1))
            return
           
        static CSW; CSW = read_data(2)
        if(g_PlayerWeapon[id] != CSW) g_PlayerWeapon[id] = CSW
    }
     
    public fw_Safety_Spawn_Post(id)
    {
        if(!is_user_alive(id))
            return
           
        Set_BitVar(g_IsAlive, id)
    }
     
    public fw_Safety_Killed_Post(id)
    {
        UnSet_BitVar(g_IsAlive, id)
    }
     
    public is_player(id, IsAliveCheck)
    {
        if(!(1 <= id <= 32))
            return 0
        if(!Get_BitVar(g_IsConnected, id))
            return 0
        if(IsAliveCheck)
        {
            if(Get_BitVar(g_IsAlive, id)) return 1
            else return 0
        }
       
        return 1
    }
     
    public get_player_weapon(id)
    {
        if(!is_player(id, 1))
            return 0
       
        return g_PlayerWeapon[id]
    }
     
    /* ===============================
    --------- End of SAFETY ----------
    =================================*/
He who fails to plan is planning to fail

Post Reply

Create an account or sign in to join the discussion

You need to be a member in order to post a reply

Create an account

Not a member? register to join our community
Members can start their own topics & subscribe to topics
It’s free and only takes a minute

Register

Sign in

Who is online

Users browsing this forum: No registered users and 4 guests