Advertisement
MasamuneDate

ZP Skull - 3

May 27th, 2018
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 20.09 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <fakemeta>
  3. #include <fakemeta_util>
  4. #include <hamsandwich>
  5. #include <cstrike>
  6. #include <zombieplague>
  7.  
  8. #define PLUGIN "zp_skull3"
  9. #define VERSION "1.0"
  10. #define AUTHOR "kntot"
  11.  
  12. #define MODEL_V "models/zth/v_skull3_single.mdl"
  13. #define MODEL_V2 "models/zth/v_skull3_dual.mdl"
  14. #define MODEL_P "models/zth/p_skull3.mdl"
  15. #define MODEL_P2 "models/zth/p_skull3dual.mdl"
  16. #define MODEL_W "models/zth/w_skull3.mdl"
  17.  
  18. #define ANIM_EXT1 "carbine"
  19. #define ANIM_EXT2 "dualpistols_1"
  20.  
  21. #define CSW_BASEDON CSW_P90
  22. #define weapon_basedon "weapon_p90"
  23.  
  24. #define DAMAGE_S 54 // 54 for Zombie
  25. #define DAMAGE_D 62 // 62 for Zombie
  26. #define CLIP_S 35
  27. #define CLIP_D 70
  28. #define BPAMMO 240
  29. #define SPEED_S 1.25
  30. #define SPEED_D 0.80
  31. #define RECOIL 0.75
  32. #define RELOAD_TIME 2.0
  33.  
  34. #define BODY_NUM 0
  35. #define TASK_SWITCHING 20141
  36.  
  37.  
  38. #define WEAPON_SECRETCODE 156851
  39. #define WEAPON_EVENT "events/p90.sc"
  40. #define OLD_W_MODEL "models/w_p90.mdl"
  41.  
  42. #define TIME_CHANGE 3.0
  43.  
  44. #define PSPEED_S 240.0
  45. #define PSPEED_D 180.0
  46.  
  47. #define ANIM_EXT1 "carbine"
  48. #define ANIM_EXT2 "dualpistols_1"
  49. new const Skull3_Sounds[5][] =
  50. {
  51.     "weapons/skull3_shoot.wav",
  52.     "weapons/skull3_shoot_2.wav",
  53.     "weapons/skull3_idle.wav",
  54.     "weapons/skull3_clipin.wav",
  55.     "weapons/skull3_boltpull.wav"
  56. }
  57. enum
  58. {
  59.     SKULL3_SINGLE = 0,
  60.     SKULL3_DUAL
  61. }
  62.  
  63. enum
  64. {
  65.     ANIM_IDLE = 0,
  66.     ANIM_RELOAD,
  67.     ANIM_DRAW,
  68.     ANIM_SHOOT1,
  69.     ANIM_SHOOT2,
  70.     ANIM_SHOOT3,
  71.     ANIM_SWITCH
  72. }
  73. new g_Weapon, Skull_State
  74. new g_Had_Weapon, g_Old_Weapon[33], Float:g_Recoil[33][3], g_Clip[33]
  75. new g_weapon_event, g_ShellId, g_SmokePuff_SprId
  76. new g_HamBot, g_Msg_CurWeapon
  77.  
  78. // MACROS
  79. #define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
  80. #define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
  81. #define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))
  82.  
  83. public plugin_init()
  84. {
  85.     register_plugin(PLUGIN, VERSION, AUTHOR)
  86.    
  87.     register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
  88.     register_message(get_user_msgid("DeathMsg"), "message_DeathMsg");
  89.    
  90.     register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)   
  91.     register_forward(FM_PlaybackEvent, "fw_PlaybackEvent") 
  92.     register_forward(FM_SetModel, "fw_SetModel")
  93.     register_forward(FM_CmdStart, "fm_cmdstart")
  94.    
  95.     RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack_World")
  96.     RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Player")
  97.     RegisterHam(Ham_Weapon_PrimaryAttack, weapon_basedon, "fw_Weapon_PrimaryAttack")
  98.     RegisterHam(Ham_Weapon_PrimaryAttack, weapon_basedon, "fw_Weapon_PrimaryAttack_Post", 1)
  99.     RegisterHam(Ham_Item_AddToPlayer, weapon_basedon, "fw_Item_AddToPlayer_Post", 1)
  100.     RegisterHam(Ham_Weapon_Reload, weapon_basedon, "fw_Weapon_Reload")
  101.     RegisterHam(Ham_Weapon_Reload, weapon_basedon, "fw_Weapon_Reload_Post", 1)
  102.     RegisterHam(Ham_Item_PostFrame, weapon_basedon, "fw_Item_PostFrame")
  103.     RegisterHam(Ham_Spawn, "player", "Remove_Weapon", 1)
  104.    
  105.     g_Weapon = zp_register_extra_item("Skull-3", 10, ZP_TEAM_HUMAN)
  106.    
  107.     g_Msg_CurWeapon = get_user_msgid("CurWeapon")
  108. }
  109.  
  110. public plugin_precache()
  111. {
  112.     engfunc(EngFunc_PrecacheModel, MODEL_V)
  113.     engfunc(EngFunc_PrecacheModel, MODEL_V2)
  114.     engfunc(EngFunc_PrecacheModel, MODEL_P)
  115.     engfunc(EngFunc_PrecacheModel, MODEL_P2)
  116.     engfunc(EngFunc_PrecacheModel, MODEL_W)
  117.     for(new i = 0; i <sizeof(Skull3_Sounds); i++)
  118.         precache_sound(Skull3_Sounds[i])
  119.    
  120.     g_SmokePuff_SprId = engfunc(EngFunc_PrecacheModel, "sprites/wall_puff1.spr")
  121.     g_ShellId = engfunc(EngFunc_PrecacheModel, "models/rshell.mdl")
  122.    
  123.     register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1)
  124. }
  125.  
  126. public fw_PrecacheEvent_Post(type, const name[])
  127. {
  128.     if(equal(WEAPON_EVENT, name))
  129.         g_weapon_event = get_orig_retval()     
  130. }
  131.  
  132. public client_putinserver(id)
  133. {
  134.     if(!g_HamBot && is_user_bot(id))
  135.     {
  136.         g_HamBot = 1
  137.         set_task(0.1, "Do_RegisterHam", id)
  138.     }
  139. }
  140.  
  141. public Do_RegisterHam(id)
  142. {
  143.     RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack_Player")
  144. }
  145.  
  146. public zp_extra_item_selected(id, itemid)
  147. {
  148.     if(itemid == g_Weapon) Get_Weapon(id)
  149. }
  150.  
  151. public zp_user_infected_post(id)Remove_Weapon(id)
  152. public zp_user_humanized_post(id)Remove_Weapon(id)
  153.  
  154. public Get_Weapon(id)
  155. {
  156.     if(!is_user_alive(id))
  157.         return
  158.        
  159.     Set_BitVar(g_Had_Weapon, id)
  160.     fm_give_item(id, weapon_basedon)
  161.    
  162.     Skull_State = SKULL3_SINGLE
  163.    
  164.     // Set Ammo
  165.     if(Skull_State == SKULL3_DUAL)
  166.     {
  167.         static Ent; Ent = fm_get_user_weapon_entity(id, CSW_BASEDON)
  168.         if(pev_valid(Ent)) cs_set_weapon_ammo(Ent, CLIP_D)
  169.         engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, g_Msg_CurWeapon, {0, 0, 0}, id)
  170.         write_byte(1)
  171.         write_byte(CSW_BASEDON)
  172.         write_byte(CLIP_D)
  173.         message_end()
  174.     }
  175.     else
  176.     {
  177.         static Ent; Ent = fm_get_user_weapon_entity(id, CSW_BASEDON)
  178.         if(pev_valid(Ent)) cs_set_weapon_ammo(Ent, CLIP_S)
  179.         engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, g_Msg_CurWeapon, {0, 0, 0}, id)
  180.         write_byte(1)
  181.         write_byte(CSW_BASEDON)
  182.         write_byte(CLIP_S)
  183.         message_end()
  184.     }
  185.     cs_set_user_bpammo(id, CSW_BASEDON, BPAMMO)
  186. }
  187. public message_DeathMsg(msg_id, msg_dest, id)
  188. {
  189.     static szTruncatedWeapon[33], iAttacker, iVictim
  190.     get_msg_arg_string(4, szTruncatedWeapon, charsmax(szTruncatedWeapon))
  191.    
  192.     iAttacker = get_msg_arg_int(1)
  193.     iVictim = get_msg_arg_int(2)
  194.    
  195.     if(!is_user_connected(iAttacker) || iAttacker == iVictim)
  196.         return PLUGIN_CONTINUE
  197.    
  198.     if(equal(szTruncatedWeapon, "p90") && get_user_weapon(iAttacker) == CSW_BASEDON)
  199.     {
  200.         if(Set_BitVar(g_Had_Weapon, id))
  201.             set_msg_arg_string(4, "Skull-3")
  202.     }
  203.     return PLUGIN_CONTINUE
  204. }
  205. public Remove_Weapon(id)
  206. {
  207.     UnSet_BitVar(g_Had_Weapon, id)
  208. }
  209. public plugin_natives()
  210. {
  211.     register_native("refill", "RefillMySkull3", 1)
  212. }
  213. public RefillMySkull3(id)
  214. {
  215.     if(!is_user_alive(id) || zp_get_user_zombie(id))
  216.         return
  217.     if(get_user_weapon(id) != CSW_BASEDON || !Get_BitVar(g_Had_Weapon, id))
  218.         return
  219.    
  220.     cs_set_user_bpammo(id, CSW_BASEDON, BPAMMO)
  221. }
  222. public fm_cmdstart(id)
  223. {
  224.     static Weapon; Weapon = fm_find_ent_by_owner(-1, weapon_basedon, id);
  225.     if(!pev_valid(Weapon)) return
  226.     if(!is_user_alive(id))
  227.         return
  228.     if(get_user_weapon(id) != CSW_BASEDON || !Get_BitVar(g_Had_Weapon, id))
  229.         return
  230.     if(get_pdata_float(id, 83, 5) > 0.0 || get_pdata_float(Weapon, 46, 4) > 0.0 || get_pdata_float(Weapon, 47, 4) > 0.0)
  231.         return
  232.    
  233.     if(pev(id, pev_button) & IN_ATTACK2)
  234.     {
  235.         if(cs_get_user_bpammo(id, CSW_BASEDON) <= 0)
  236.             return
  237.         if(Skull_State == SKULL3_SINGLE)
  238.         {
  239.             set_weapon_anim(id, ANIM_SWITCH)
  240.             Set_Player_NextAttack(id, TIME_CHANGE)
  241.             Set_Weapon_TimeIdle(id, CSW_BASEDON ,TIME_CHANGE)
  242.             set_task(TIME_CHANGE, "Complete_Change_To_Dual", id+TASK_SWITCHING)
  243.         }
  244.         else if(Skull_State == SKULL3_DUAL)
  245.         {
  246.             set_weapon_anim(id, ANIM_SWITCH)
  247.             Set_Player_NextAttack(id, TIME_CHANGE)
  248.             Set_Weapon_TimeIdle(id, CSW_BASEDON ,TIME_CHANGE)
  249.             set_task(TIME_CHANGE, "Complete_Change_To_Single", id+TASK_SWITCHING)
  250.         }
  251.     }
  252. }
  253.  
  254. public Complete_Change_To_Single(id)
  255. {
  256.     id -= TASK_SWITCHING
  257.     if(!is_user_alive(id))
  258.         return
  259.     if(get_user_weapon(id) != CSW_BASEDON || !Get_BitVar(g_Had_Weapon, id))
  260.         return
  261.    
  262.     set_weapon_anim(id, ANIM_IDLE)
  263.     Skull_State = SKULL3_SINGLE
  264.     set_pev(id, pev_weaponmodel2, MODEL_P)
  265.     set_pev(id, pev_viewmodel2, MODEL_V)
  266.     set_pev(id, pev_maxspeed, PSPEED_S)
  267.     set_pdata_string(id, (492) * 4, ANIM_EXT1, -1 , 20)
  268.     static Ent; Ent = fm_get_user_weapon_entity(id, CSW_BASEDON)
  269.     if(pev_valid(Ent)) cs_set_weapon_ammo(Ent, CLIP_S)
  270.     engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, g_Msg_CurWeapon, {0, 0, 0}, id)
  271.     write_byte(1)
  272.     write_byte(CSW_BASEDON)
  273.     write_byte(CLIP_S)
  274.     message_end()
  275. }
  276. public Complete_Change_To_Dual(id)
  277. {
  278.     id -= TASK_SWITCHING
  279.     if(!is_user_alive(id))
  280.         return
  281.     if(get_user_weapon(id) != CSW_BASEDON || !Get_BitVar(g_Had_Weapon, id))
  282.         return
  283.    
  284.     set_weapon_anim(id, ANIM_IDLE)
  285.     Skull_State = SKULL3_DUAL
  286.     set_pdata_string(id, (492) * 4, ANIM_EXT2, -1 , 20)
  287.     set_pev(id, pev_weaponmodel2, MODEL_P2)
  288.     set_pev(id, pev_viewmodel2, MODEL_V2)
  289.     set_pev(id, pev_maxspeed, PSPEED_D)
  290.     static Ent; Ent = fm_get_user_weapon_entity(id, CSW_BASEDON)
  291.     if(pev_valid(Ent)) cs_set_weapon_ammo(Ent, CLIP_D)
  292.     engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, g_Msg_CurWeapon, {0, 0, 0}, id)
  293.     write_byte(1)
  294.     write_byte(CSW_BASEDON)
  295.     write_byte(CLIP_D)
  296.     message_end()
  297. }
  298.  
  299. public Event_CurWeapon(id)
  300. {
  301.     if(!is_user_alive(id))
  302.         return
  303.    
  304.     static CSWID; CSWID = read_data(2)
  305.    
  306.     if((CSWID == CSW_BASEDON && g_Old_Weapon[id] != CSW_BASEDON) && Get_BitVar(g_Had_Weapon, id))
  307.     {
  308.         if(Skull_State == SKULL3_DUAL)
  309.         {
  310.             set_weapon_anim(id, ANIM_DRAW)
  311.             set_pev(id, pev_maxspeed, PSPEED_D)
  312.             set_pev(id, pev_viewmodel2, MODEL_V2)
  313.             set_pev(id, pev_weaponmodel2, MODEL_P2)
  314.             set_pdata_string(id, (492) * 4, ANIM_EXT2, -1 , 20)
  315.         }
  316.         else if(Skull_State == SKULL3_SINGLE)
  317.         {
  318.             set_pev(id, pev_viewmodel2, MODEL_V);
  319.             set_pev(id, pev_weaponmodel2, MODEL_P)
  320.             set_pev(id, pev_maxspeed, PSPEED_S)
  321.             set_pdata_string(id, (492) * 4, ANIM_EXT1, -1 , 20)
  322.             set_weapon_anim(id, ANIM_DRAW)
  323.         }
  324.         Draw_NewWeapon(id, CSWID)
  325.     } else if((CSWID == CSW_BASEDON && g_Old_Weapon[id] == CSW_BASEDON) && Get_BitVar(g_Had_Weapon, id)) {
  326.         static Ent; Ent = fm_get_user_weapon_entity(id, CSW_BASEDON)
  327.         if(!pev_valid(Ent))
  328.         {
  329.             g_Old_Weapon[id] = get_user_weapon(id)
  330.             return
  331.         }
  332.         set_pdata_float(Ent, 46, get_pdata_float(Ent, 46, 4) * SPEED_D, 4)
  333.     } else if(CSWID != CSW_BASEDON && g_Old_Weapon[id] == CSW_BASEDON) Draw_NewWeapon(id, CSWID)
  334.    
  335.     g_Old_Weapon[id] = get_user_weapon(id)
  336. }
  337.  
  338. public Draw_NewWeapon(id, CSW_ID)
  339. {
  340.     if(CSW_ID == CSW_BASEDON)
  341.     {
  342.         static ent
  343.         ent = fm_get_user_weapon_entity(id, CSW_BASEDON)
  344.        
  345.         if(pev_valid(ent) && Get_BitVar(g_Had_Weapon, id))
  346.         {
  347.             set_pev(ent, pev_effects, pev(ent, pev_effects) &~ EF_NODRAW)
  348.             if(Skull_State == SKULL3_DUAL) engfunc(EngFunc_SetModel, ent, MODEL_P2)
  349.             else engfunc(EngFunc_SetModel, ent, MODEL_P)
  350.             set_pev(ent, pev_body, BODY_NUM)
  351.         }
  352.     } else {
  353.         static ent
  354.         ent = fm_get_user_weapon_entity(id, CSW_BASEDON)
  355.        
  356.         if(pev_valid(ent)) set_pev(ent, pev_effects, pev(ent, pev_effects) | EF_NODRAW)            
  357.     }
  358.    
  359. }
  360.  
  361. public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
  362. {
  363.     if(!is_user_alive(id))
  364.         return FMRES_IGNORED   
  365.     if(get_user_weapon(id) == CSW_BASEDON && Get_BitVar(g_Had_Weapon, id))
  366.         set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001)
  367.    
  368.     return FMRES_HANDLED
  369. }
  370.  
  371. public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
  372. {
  373.     if (!is_user_connected(invoker))
  374.         return FMRES_IGNORED   
  375.     if(get_user_weapon(invoker) != CSW_BASEDON || !Get_BitVar(g_Had_Weapon, invoker))
  376.         return FMRES_IGNORED
  377.     if(eventid != g_weapon_event)
  378.         return FMRES_IGNORED
  379.    
  380.     engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
  381.    
  382.     if(Skull_State == SKULL3_DUAL) set_weapon_anim(invoker, random_num(ANIM_SHOOT1, ANIM_SHOOT3))
  383.     else set_weapon_anim(invoker, ANIM_SHOOT1)
  384.     emit_sound(invoker, CHAN_WEAPON, Skull3_Sounds[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
  385.    
  386.     Eject_Shell(invoker, g_ShellId, 0.0)
  387.        
  388.     return FMRES_SUPERCEDE
  389. }
  390.  
  391. public fw_SetModel(entity, model[])
  392. {
  393.     if(!pev_valid(entity))
  394.         return FMRES_IGNORED
  395.    
  396.     static Classname[32]
  397.     pev(entity, pev_classname, Classname, sizeof(Classname))
  398.    
  399.     if(!equal(Classname, "weaponbox"))
  400.         return FMRES_IGNORED
  401.    
  402.     static iOwner
  403.     iOwner = pev(entity, pev_owner)
  404.    
  405.     if(equal(model, OLD_W_MODEL))
  406.     {
  407.         static weapon; weapon = fm_find_ent_by_owner(-1, weapon_basedon, entity)
  408.        
  409.         if(!pev_valid(weapon))
  410.             return FMRES_IGNORED;
  411.        
  412.         if(Get_BitVar(g_Had_Weapon, iOwner))
  413.         {
  414.             Remove_Weapon(iOwner)
  415.            
  416.             set_pev(weapon, pev_impulse, WEAPON_SECRETCODE)
  417.             engfunc(EngFunc_SetModel, entity, MODEL_W)
  418.             set_pev(entity, pev_body, BODY_NUM)
  419.            
  420.             return FMRES_SUPERCEDE
  421.         }
  422.     }
  423.  
  424.     return FMRES_IGNORED;
  425. }
  426.  
  427. public fw_TraceAttack_World(Victim, Attacker, Float:Damage, Float:Direction[3], Ptr, DamageBits)
  428. {
  429.     if(!is_user_connected(Attacker))
  430.         return HAM_IGNORED 
  431.     if(get_user_weapon(Attacker) != CSW_BASEDON || !Get_BitVar(g_Had_Weapon, Attacker))
  432.         return HAM_IGNORED
  433.        
  434.     static Float:flEnd[3], Float:vecPlane[3]
  435.    
  436.     get_tr2(Ptr, TR_vecEndPos, flEnd)
  437.     get_tr2(Ptr, TR_vecPlaneNormal, vecPlane)      
  438.        
  439.     Make_BulletHole(Attacker, flEnd, Damage)
  440.     Make_BulletSmoke(Attacker, Ptr)
  441.    
  442.     static Float:iHitgroup
  443.     new Float:MultifDamage
  444.     get_tr2(Ptr, TR_iHitgroup, iHitgroup)
  445.     switch(iHitgroup)
  446.     {
  447.         case HIT_HEAD: MultifDamage  = 1.75
  448.         case HIT_STOMACH: MultifDamage  = 1.25
  449.         case HIT_LEFTLEG: MultifDamage  = 1.75
  450.         case HIT_RIGHTLEG: MultifDamage  = 1.75
  451.         case HIT_GENERIC: MultifDamage =  1.75
  452.         default: MultifDamage  = 1.0
  453.     }
  454.     if(Skull_State == SKULL3_DUAL) SetHamParamFloat(3, float(DAMAGE_D) * MultifDamage)
  455.     else SetHamParamFloat(3, float(DAMAGE_S) * MultifDamage)
  456.    
  457.     return HAM_IGNORED
  458. }
  459.  
  460. public fw_TraceAttack_Player(Victim, Attacker, Float:Damage, Float:Direction[3], Ptr, DamageBits)
  461. {
  462.     if(!is_user_connected(Attacker))
  463.         return HAM_IGNORED 
  464.     if(get_user_weapon(Attacker) != CSW_BASEDON || !Get_BitVar(g_Had_Weapon, Attacker))
  465.         return HAM_IGNORED
  466.    
  467.     static Float:iHitgroup
  468.     new Float:MultifDamage
  469.     get_tr2(Ptr, TR_iHitgroup, iHitgroup)
  470.     switch(iHitgroup)
  471.     {
  472.         case HIT_HEAD: MultifDamage  = 1.75
  473.         case HIT_STOMACH: MultifDamage  = 1.25
  474.         case HIT_LEFTLEG: MultifDamage  = 1.75
  475.         case HIT_RIGHTLEG: MultifDamage  = 1.75
  476.         case HIT_GENERIC: MultifDamage =  1.75
  477.         default: MultifDamage  = 1.0
  478.     }
  479.     if(Skull_State == SKULL3_DUAL) SetHamParamFloat(3, float(DAMAGE_D) * MultifDamage)
  480.     else SetHamParamFloat(3, float(DAMAGE_S) * MultifDamage)
  481.  
  482.     return HAM_IGNORED
  483. }
  484.  
  485. public fw_Weapon_PrimaryAttack(Ent)
  486. {
  487.     static id; id = pev(Ent, pev_owner)
  488.     pev(id, pev_punchangle, g_Recoil[id])
  489.    
  490.     return HAM_IGNORED
  491. }
  492.  
  493. public fw_Weapon_PrimaryAttack_Post(Ent)
  494. {
  495.     static id; id = pev(Ent, pev_owner)
  496.    
  497.     if(Get_BitVar(g_Had_Weapon, id))
  498.     {
  499.         static Float:Push[3]
  500.         pev(id, pev_punchangle, Push)
  501.         xs_vec_sub(Push, g_Recoil[id], Push)
  502.        
  503.         xs_vec_mul_scalar(Push, RECOIL, Push)
  504.         xs_vec_add(Push, g_Recoil[id], Push)
  505.         set_pev(id, pev_punchangle, Push)
  506.     }
  507. }
  508.  
  509. public fw_Item_AddToPlayer_Post(ent, id)
  510. {
  511.     if(!pev_valid(ent))
  512.         return HAM_IGNORED
  513.        
  514.     if(pev(ent, pev_impulse) == WEAPON_SECRETCODE)
  515.     {
  516.         Set_BitVar(g_Had_Weapon, id)
  517.         set_pev(ent, pev_impulse, 0)
  518.     }      
  519.  
  520.     return HAM_HANDLED 
  521. }
  522.  
  523. public fw_Item_PostFrame(ent)
  524. {
  525.     if(!pev_valid(ent))
  526.         return HAM_IGNORED
  527.    
  528.     static id
  529.     id = pev(ent, pev_owner)
  530.    
  531.     if(is_user_alive(id) && Get_BitVar(g_Had_Weapon, id))
  532.     {  
  533.         static Float:flNextAttack; flNextAttack = get_pdata_float(id, 83, 5)
  534.         static bpammo; bpammo = cs_get_user_bpammo(id, CSW_BASEDON)
  535.         static iClip; iClip = get_pdata_int(ent, 51, 4)
  536.         static fInReload; fInReload = get_pdata_int(ent, 54, 4)
  537.        
  538.         if(fInReload && flNextAttack <= 0.0)
  539.         {
  540.             new isclip
  541.             if(Skull_State == SKULL3_DUAL)isclip = CLIP_D
  542.             else isclip = CLIP_S
  543.             static temp1;temp1 = min(isclip - iClip, bpammo)
  544.             set_pdata_int(ent, 51, iClip + temp1, 4)
  545.             cs_set_user_bpammo(id, CSW_BASEDON, bpammo - temp1)    
  546.            
  547.             set_pdata_int(ent, 54, 0, 4)
  548.            
  549.             fInReload = 0
  550.         }      
  551.     }
  552.    
  553.     return HAM_IGNORED 
  554. }
  555.  
  556. public fw_Weapon_Reload(ent)
  557. {
  558.     static id; id = pev(ent, pev_owner)
  559.     if(!is_user_alive(id))
  560.         return HAM_IGNORED
  561.     if(!Get_BitVar(g_Had_Weapon, id))
  562.         return HAM_IGNORED
  563.    
  564.     g_Clip[id] = -1
  565.    
  566.     static bpammo; bpammo = cs_get_user_bpammo(id, CSW_BASEDON)
  567.     static iClip; iClip = get_pdata_int(ent, 51, 4)
  568.    
  569.     if(bpammo <= 0) return HAM_SUPERCEDE
  570.     new isclip
  571.     if(Skull_State == SKULL3_DUAL)isclip = CLIP_D
  572.     else isclip = CLIP_S
  573.    
  574.     if(iClip >= isclip) return HAM_SUPERCEDE       
  575.        
  576.     g_Clip[id] = iClip
  577.  
  578.     return HAM_HANDLED
  579. }
  580.  
  581. public fw_Weapon_Reload_Post(ent)
  582. {
  583.     static id; id = pev(ent, pev_owner)
  584.     if(!is_user_alive(id))
  585.         return HAM_IGNORED
  586.     if(!Get_BitVar(g_Had_Weapon, id))
  587.         return HAM_IGNORED
  588.  
  589.     if (g_Clip[id] == -1)
  590.         return HAM_IGNORED
  591.    
  592.     set_pdata_int(ent, 51, g_Clip[id], 4)
  593.     set_pdata_int(ent, 54, 1, 4)
  594.    
  595.     set_weapon_anim(id, ANIM_RELOAD)
  596.     set_pdata_float(id, 83, RELOAD_TIME, 5)
  597.  
  598.     return HAM_HANDLED
  599. }
  600.  
  601. stock Make_BulletHole(id, Float:Origin[3], Float:Damage)
  602. {
  603.     // Find target
  604.     static Decal; Decal = random_num(41, 45)
  605.     static LoopTime;
  606.    
  607.     if(Damage > 100.0) LoopTime = 2
  608.     else LoopTime = 1
  609.    
  610.     for(new i = 0; i < LoopTime; i++)
  611.     {
  612.         // Put decal on "world" (a wall)
  613.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  614.         write_byte(TE_WORLDDECAL)
  615.         engfunc(EngFunc_WriteCoord, Origin[0])
  616.         engfunc(EngFunc_WriteCoord, Origin[1])
  617.         engfunc(EngFunc_WriteCoord, Origin[2])
  618.         write_byte(Decal)
  619.         message_end()
  620.        
  621.         // Show sparcles
  622.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  623.         write_byte(TE_GUNSHOTDECAL)
  624.         engfunc(EngFunc_WriteCoord, Origin[0])
  625.         engfunc(EngFunc_WriteCoord, Origin[1])
  626.         engfunc(EngFunc_WriteCoord, Origin[2])
  627.         write_short(id)
  628.         write_byte(Decal)
  629.         message_end()
  630.     }
  631. }
  632.  
  633. public Make_BulletSmoke(id, TrResult)
  634. {
  635.     static Float:vecSrc[3], Float:vecEnd[3], TE_FLAG
  636.    
  637.     get_weapon_attachment(id, vecSrc)
  638.     global_get(glb_v_forward, vecEnd)
  639.    
  640.     xs_vec_mul_scalar(vecEnd, 8192.0, vecEnd)
  641.     xs_vec_add(vecSrc, vecEnd, vecEnd)
  642.  
  643.     get_tr2(TrResult, TR_vecEndPos, vecSrc)
  644.     get_tr2(TrResult, TR_vecPlaneNormal, vecEnd)
  645.    
  646.     xs_vec_mul_scalar(vecEnd, 2.5, vecEnd)
  647.     xs_vec_add(vecSrc, vecEnd, vecEnd)
  648.    
  649.     TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
  650.     TE_FLAG |= TE_EXPLFLAG_NOSOUND
  651.     TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
  652.    
  653.     engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEnd, 0)
  654.     write_byte(TE_EXPLOSION)
  655.     engfunc(EngFunc_WriteCoord, vecEnd[0])
  656.     engfunc(EngFunc_WriteCoord, vecEnd[1])
  657.     engfunc(EngFunc_WriteCoord, vecEnd[2] - 10.0)
  658.     write_short(g_SmokePuff_SprId)
  659.     write_byte(2)
  660.     write_byte(50)
  661.     write_byte(TE_FLAG)
  662.     message_end()
  663. }
  664.  
  665.  
  666. stock hook_ent2(ent, Float:VicOrigin[3], Float:speed, Float:multi, type)
  667. {
  668.     static Float:fl_Velocity[3]
  669.     static Float:EntOrigin[3]
  670.     static Float:EntVelocity[3]
  671.    
  672.     pev(ent, pev_velocity, EntVelocity)
  673.     pev(ent, pev_origin, EntOrigin)
  674.     static Float:distance_f
  675.     distance_f = get_distance_f(EntOrigin, VicOrigin)
  676.    
  677.     static Float:fl_Time; fl_Time = distance_f / speed
  678.     static Float:fl_Time2; fl_Time2 = distance_f / (speed * multi)
  679.    
  680.     if(type == 1)
  681.     {
  682.         fl_Velocity[0] = ((VicOrigin[0] - EntOrigin[0]) / fl_Time2) * 1.5
  683.         fl_Velocity[1] = ((VicOrigin[1] - EntOrigin[1]) / fl_Time2) * 1.5
  684.         fl_Velocity[2] = (VicOrigin[2] - EntOrigin[2]) / fl_Time       
  685.     } else if(type == 2) {
  686.         fl_Velocity[0] = ((EntOrigin[0] - VicOrigin[0]) / fl_Time2) * 1.5
  687.         fl_Velocity[1] = ((EntOrigin[1] - VicOrigin[1]) / fl_Time2) * 1.5
  688.         fl_Velocity[2] = (EntOrigin[2] - VicOrigin[2]) / fl_Time
  689.     }
  690.  
  691.     xs_vec_add(EntVelocity, fl_Velocity, fl_Velocity)
  692.     set_pev(ent, pev_velocity, fl_Velocity)
  693. }
  694.  
  695. stock get_weapon_attachment(id, Float:output[3], Float:fDis = 40.0)
  696. {
  697.     static Float:vfEnd[3], viEnd[3]
  698.     get_user_origin(id, viEnd, 3)  
  699.     IVecFVec(viEnd, vfEnd)
  700.    
  701.     static Float:fOrigin[3], Float:fAngle[3]
  702.    
  703.     pev(id, pev_origin, fOrigin)
  704.     pev(id, pev_view_ofs, fAngle)
  705.    
  706.     xs_vec_add(fOrigin, fAngle, fOrigin)
  707.    
  708.     static Float:fAttack[3]
  709.    
  710.     xs_vec_sub(vfEnd, fOrigin, fAttack)
  711.     xs_vec_sub(vfEnd, fOrigin, fAttack)
  712.    
  713.     static Float:fRate
  714.    
  715.     fRate = fDis / vector_length(fAttack)
  716.     xs_vec_mul_scalar(fAttack, fRate, fAttack)
  717.    
  718.     xs_vec_add(fOrigin, fAttack, output)
  719. }
  720.  
  721. stock Eject_Shell(id, Shell_ModelIndex, Float:Time) // By Dias
  722. {
  723.     static Ent; Ent = get_pdata_cbase(id, 373, 5)
  724.     if(!pev_valid(Ent))
  725.         return
  726.  
  727.         set_pdata_int(Ent, 57, Shell_ModelIndex, 4)
  728.         set_pdata_float(id, 111, get_gametime() + Time)
  729. }
  730.  
  731. stock set_weapon_anim(id, anim)
  732. {
  733.     if(!is_user_alive(id))
  734.         return
  735.    
  736.     set_pev(id, pev_weaponanim, anim)
  737.    
  738.     message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
  739.     write_byte(anim)
  740.     write_byte(pev(id, pev_body))
  741.     message_end()
  742. }
  743. stock Set_Weapon_TimeIdle(id, WeaponId ,Float:TimeIdle)
  744. {
  745.     static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
  746.     if(!pev_valid(entwpn))
  747.         return
  748.        
  749.     set_pdata_float(entwpn, 46, TimeIdle, 4)
  750.     set_pdata_float(entwpn, 47, TimeIdle, 4)
  751.     set_pdata_float(entwpn, 48, TimeIdle + 0.5, 4)
  752. }
  753.  
  754. stock Set_Player_NextAttack(id, Float:Time)
  755. {
  756.     set_pdata_float(id, 83, Time, 5)
  757. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement