Advertisement
Guest User

basefile

a guest
Feb 5th, 2014
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 40.34 KB | None | 0 0
  1. if SERVER then
  2.     AddCSLuaFile("shared.lua")
  3.     AddCSLuaFile("cl_drawfuncs.lua")
  4.     AddCSLuaFile("cl_model.lua")
  5.     AddCSLuaFile("cl_umsgs.lua")
  6.     AddCSLuaFile("cl_hud.lua")
  7.     AddCSLuaFile("sh_bullet.lua")
  8.     AddCSLuaFile("cl_calcview.lua")
  9.     AddCSLuaFile("cl_muzzleflash.lua")
  10.     AddCSLuaFile("cl_attachments.lua")
  11.    
  12.     include("sv_attachments.lua")
  13.    
  14.     umsg.PoolString("FAS2_SUPPRESSMODEL")
  15.     umsg.PoolString("FAS2_UNSUPPRESSMODEL")
  16. end
  17.  
  18. ---- TTT SPECIAL EQUIPMENT FIELDS
  19.  
  20.  
  21. SWEP.Kind = WEAPON_NONE
  22.  
  23. SWEP.CanBuy = nil
  24.  
  25. if CLIENT then
  26.    --
  27.    SWEP.EquipMenuData = nil
  28.  
  29.    
  30.    SWEP.Icon = "VGUI/ttt/icon_nades"
  31.  
  32. end
  33.  
  34.  
  35. SWEP.AutoSpawnable = false
  36.  
  37.  
  38. SWEP.AllowDrop = true
  39.  
  40.  
  41. SWEP.IsSilent = false
  42.  
  43. function SWEP:SetupDataTables()
  44.    -- Put it in the last slot, least likely to interfere with derived weapon's
  45.    -- own stuff.
  46.    self:DTVar("Bool", 3, "ironsights")
  47. end
  48.  
  49. local ttt_lowered = CreateConVar("ttt_ironsights_lowered", "1", FCVAR_ARCHIVE)
  50.  
  51. AccessorFuncDT(SWEP, "ironsights", "Ironsights")
  52. ---------------------------------------------
  53.  
  54.  
  55. include("sh_bullet.lua")
  56.  
  57. if CLIENT then
  58.     include("cl_model.lua")
  59.     include("cl_umsgs.lua")
  60.     include("cl_hud.lua")
  61.     include("cl_calcview.lua")
  62.     include("cl_muzzleflash.lua")
  63.     include("cl_drawfuncs.lua")
  64.     include("cl_attachments.lua")
  65.    
  66.     SWEP.BounceWeaponIcon = false
  67.     SWEP.PitchMod = 1
  68.     SWEP.YawMod = 1
  69.     SWEP.CrossAlpha = 255
  70.     SWEP.CheckTime = 0
  71.     SWEP.CrossAlpha = 255
  72.     SWEP.CrossAmount = 100
  73.     SWEP.CurFOVMod = 0
  74.     SWEP.AngleDelta = Angle(0, 0, 0)
  75.     SWEP.OldDelta = Angle(0, 0, 0)
  76.     SWEP.ProficientTextTime = 0
  77.     SWEP.ProficientAlpha = 0
  78.     SWEP.CockRemindTime = 0
  79.     SWEP.CockRemindAlpha = 0
  80.     SWEP.MouseSensMod = 1
  81.     SWEP.DeployAnimSpeed = 1
  82.     SWEP.CurAnim = "none"
  83.     SWEP.BoltReminderText = "RELOAD KEY - BOLT WEAPON"
  84.     SWEP.PrintName = ""
  85.     SWEP.Slot = 3
  86.     SWEP.SlotPos = 3
  87.     SWEP.DrawAmmo = false
  88.     SWEP.DrawCrosshair = false
  89.     SWEP.MoveType = 1
  90.     SWEP.ReloadCycleTime = 0.9
  91.     SWEP.ShowStats = false
  92.     SWEP.WMAng = Vector(0, 0, 0)
  93.     SWEP.WMPos = Vector(0, 0, 0)
  94.     SWEP.Text3DForward = -4
  95.     SWEP.Text3DRight = -2
  96.     SWEP.Text3DSize = 0.015
  97.     SWEP.WMScale = 1
  98.     SWEP.BlurAmount = 0
  99.     SWEP.HitMarkerAlpha = 0
  100.     SWEP.HitMarkerTime = 0
  101.     SWEP.MagText = "MAG "
  102.     SWEP.FireModeSwitchTime = 0
  103.  
  104.     surface.CreateFont("FAS2_HUD72", {font = "Default", size = 72, weight = 700, blursize = 0, antialias = true, shadow = false})
  105.     surface.CreateFont("FAS2_HUD48", {font = "Default", size = 48, weight = 700, blursize = 0, antialias = true, shadow = false})
  106.     surface.CreateFont("FAS2_HUD36", {font = "Default", size = 36, weight = 700, blursize = 0, antialias = true, shadow = false})
  107.     surface.CreateFont("FAS2_HUD28", {font = "Default", size = 28, weight = 700, blursize = 0, antialias = true, shadow = false})
  108.     surface.CreateFont("FAS2_HUD24", {font = "Default", size = 24, weight = 700, blursize = 0, antialias = true, shadow = false})
  109.    
  110.     SWEP.CurSoundTable = nil
  111.     SWEP.CurSoundEntry = nil
  112.     SWEP.HideWorldModel = true
  113.    
  114.     SWEP.CustomizePos = Vector(5.657, -1.688, -2.027)
  115.     SWEP.CustomizeAng = Vector(14.647, 30.319, 15.295)
  116.     SWEP.BipodPos = Vector(0, 0, 0)
  117.     SWEP.BipodAng = Vector(0, 0, 0)
  118.     SWEP.PistolSafePos = Vector(0, 0, 1.203)
  119.     SWEP.PistolSafeAng = Vector(-15.125, 0, 0)
  120.     SWEP.RifleSafePos = Vector(0.324, 0.092, -0.621)
  121.     SWEP.RifleSafeAng = Vector(-8.941, 7.231, -9.535)
  122.     SWEP.BipodMoveTime = 0
  123.     SWEP.SafePosType = "rifle"
  124. end
  125.  
  126. SWEP.AimSounds = {"weapons/weapon_sightlower.wav", "weapons/weapon_sightlower2.wav"}
  127. SWEP.BackToHipSounds = {"weapons/weapon_sightraise.wav", "weapons/weapon_sightraise2.wav"}
  128. SWEP.EmptySound = Sound("weapons/empty_submachineguns.wav")
  129. SWEP.RunHoldType = "passive"
  130. SWEP.ReloadState = 0
  131. SWEP.BipodDelay = 0
  132. SWEP.BurstFireDelayMod = 0.66
  133. SWEP.ShotToDelayUntil = 0
  134.  
  135. SWEP.SpreadWait = 0
  136. SWEP.AddSpread = 0
  137. SWEP.AddSpreadSpeed = 1
  138. SWEP.IsFAS2Weapon = true
  139. SWEP.Events = {}
  140.  
  141. SWEP.SprintDelay = 0
  142. SWEP.ReloadWait = 0
  143. SWEP.MagCheckAlpha = 0
  144. SWEP.ReloadProgress = 0
  145. SWEP.Suppressed = false
  146. SWEP.PenMod = 1
  147.  
  148. FAS_STAT_IDLE = 0
  149. FAS_STAT_ADS = 1
  150. FAS_STAT_SPRINT = 2
  151. FAS_STAT_HOLSTER = 3
  152. FAS_STAT_CUSTOMIZE = 4
  153. FAS_STAT_HOLSTER_START = 5
  154. FAS_STAT_HOLSTER_END = 6
  155. FAS_STAT_QUICKGRENADE = 7
  156.  
  157. SWEP.Author            = "Spy"
  158. SWEP.Instructions    = "CONTEXT MENU KEY - Open customization menu\nUSE + RELOAD KEY - Change firemode\nUSE KEY + PRIMARY ATTACK KEY - Quick grenade"
  159. SWEP.Contact        = ""
  160. SWEP.Purpose        = ""
  161. SWEP.HoldType = "ar2"
  162. SWEP.FirstDeploy = true
  163.  
  164. SWEP.ViewModelFOV    = 55
  165. SWEP.ViewModelFlip    = false
  166.  
  167. SWEP.Spawnable            = false
  168. SWEP.AdminSpawnable        = false
  169.  
  170. SWEP.ViewModel      = "models/Items/AR2_Grenade.mdl"
  171. SWEP.WorldModel   = ""
  172.  
  173. -- Primary Fire Attributes --
  174. SWEP.Primary.ClipSize        = -1
  175. SWEP.Primary.DefaultClip    = -1
  176. SWEP.Primary.Automatic       = false    
  177. SWEP.Primary.Ammo             = "none"
  178.  
  179. -- Secondary Fire Attributes --
  180. SWEP.Secondary.ClipSize        = -1
  181. SWEP.Secondary.DefaultClip    = -1
  182. SWEP.Secondary.Automatic       = false
  183. SWEP.Secondary.Ammo         = "none"
  184.  
  185. SWEP.FireModeNames = {["auto"] = {display = "FULL-AUTO", auto = true, burstamt = 0},
  186.     ["semi"] = {display = "SEMI-AUTO", auto = false, burstamt = 0},
  187.     ["double"] = {display = "DOUBLE-ACTION", auto = false, burstamt = 0},
  188.     ["bolt"] = {display = "BOLT-ACTION", auto = false, burstamt = 0},
  189.     ["pump"] = {display = "PUMP-ACTION", auto = false, burstamt = 0},
  190.     ["break"] = {display = "BREAK-ACTION", auto = false, burstamt = 0},
  191.     ["2burst"] = {display = "2-ROUND BURST", auto = true, burstamt = 2},
  192.     ["3burst"] = {display = "3-ROUND BURST", auto = true, burstamt = 3},
  193.     ["safe"] = {display = "SAFE", auto = false, burstamt = 0}} 
  194.  
  195. local vm, t, a
  196.  
  197. function SWEP:SetupDataTables()
  198.     self:DTVar("Int", 0, "Status")
  199.     self:DTVar("Int", 1, "Shots")
  200.    
  201.     self:DTVar("Bool", 0, "Suppressed")
  202.     self:DTVar("Bool", 1, "Bipod")
  203.     self:DTVar("Bool", 2, "Holstered")
  204. end
  205.  
  206. function SWEP:CalculateEffectiveRange()
  207.     self.EffectiveRange = self.CaseLength * 10 - self.BulletLength * 5 -- setup realistic base effective range
  208.     self.EffectiveRange = self.EffectiveRange * 39.37 -- convert meters to units
  209.     self.EffectiveRange = self.EffectiveRange / 2
  210.     self.DamageFallOff = (100 - (self.CaseLength - self.BulletLength)) / 200
  211.     self.PenStr = (self.BulletLength * 0.5 + self.CaseLength * 0.35) * (self.PenAdd and self.PenAdd or 1)
  212. end
  213.  
  214. local SP = game.SinglePlayer()
  215. local reg = debug.getregistry()
  216. local GetVelocity = reg.Entity.GetVelocity
  217. local Length = reg.Vector.Length
  218. local GetAimVector = reg.Player.GetAimVector
  219.  
  220. function SWEP:Initialize()
  221.     self:SetWeaponHoldType(self.HoldType)
  222.    
  223.     self.CurCone = self.HipCone
  224.     self.Class = self:GetClass()
  225.    
  226.     table.insert(self.FireModes, #self.FireModes + 1, "safe")
  227.     t = self.FireModes[1]
  228.     self.FireMode = t
  229.     t = self.FireModeNames[t]
  230.    
  231.     self.Primary.Auto = t.auto
  232.     self.BurstAmount = t.burstamt
  233.     self.dt.Suppressed = self.Suppressed
  234.     self:CalculateEffectiveRange()
  235.    
  236.     self.Damage_Orig = self.Damage
  237.     self.FireDelay_Orig = self.FireDelay
  238.     self.HipCone_Orig = math.Round(self.HipCone, 4)
  239.     self.AimCone_Orig = math.Round(self.AimCone, 4)
  240.     self.Recoil_Orig = math.Round(self.Recoil, 4)
  241.     self.SpreadPerShot_Orig = self.SpreadPerShot
  242.     self.MaxSpreadInc_Orig = self.MaxSpreadInc
  243.     self.VelocitySensitivity_Orig = self.VelocitySensitivity
  244.     self.AimPosName = "AimPos"
  245.     self.AimAngName = "AimAng"
  246.  
  247.     if CLIENT then
  248.         self.BlendPos = Vector(0, 0, 0)
  249.         self.BlendAng = Vector(0, 0, 0)
  250.        
  251.         self.NadeBlendPos = Vector(0, 0, 0)
  252.         self.NadeBlendAng = Vector(0, 0, 0)
  253.         self.FireModeDisplay = t.display
  254.        
  255.         self.AimPos_Orig = self.AimPos
  256.         self.AimAng_Orig = self.AimAng
  257.         self.AimFOV_Orig = self.AimFOV
  258.         self.ViewModelFOV_Orig = self.ViewModelFOV
  259.        
  260.         self.TargetViewModelFOV_Orig = self.TargetViewModelFOV
  261.         self.TargetViewModelFOV = self.TargetViewModelFOV or self.ViewModelFOV
  262.        
  263.         if not self.Wep then
  264.             self.Wep = ClientsideModel(self.VM, RENDERGROUP_BOTH)
  265.             self.Wep:SetNoDraw(true)
  266.         end
  267.        
  268.         if not self.W_Wep and self.WM then
  269.             self.W_Wep = ClientsideModel(self.WM, RENDERGROUP_BOTH)
  270.             self.W_Wep:SetNoDraw(true)
  271.         end
  272.        
  273.         if not self.Nade then
  274.             self.Nade = ClientsideModel("models/weapons/v_m67.mdl", RENDERGROUP_BOTH)
  275.             self.Nade:SetNoDraw(true)
  276.             self.Nade.LifeTime = 0
  277.         end
  278.        
  279.         RunConsoleCommand("fas2_handrig_applynow")
  280.        
  281.         //CT = CurTime()
  282.        
  283.         //a = self.Anims.Draw_First
  284.        
  285.         //if type(a) == "table" then
  286.         //  a = table.Random(a)
  287.         //end
  288.        
  289.         //FAS2_PlayAnim(self, self.Anims.Draw_First, 1)
  290.        
  291.         --self:Deploy()
  292.     end
  293. end
  294.  
  295. local mag, CT, ang, cone, vel, ammo
  296.  
  297. function SWEP:CockLogic()
  298.     if self.Owner.FAS_FamiliarWeapons[self.Class] then
  299.         if self.dt.Status == FAS_STAT_ADS then
  300.             if self.dt.Bipod then
  301.                 FAS2_PlayAnim(self, self.Anims.Cock_Bipod_Aim_Nomen)
  302.             else
  303.                 FAS2_PlayAnim(self, self.Anims.Cock_Aim_Nomen)
  304.             end
  305.                
  306.             self.Cocked = true
  307.         else
  308.             if self.dt.Bipod then
  309.                 FAS2_PlayAnim(self, self.Anims.Cock_Bipod_Nomen)
  310.             else
  311.                 FAS2_PlayAnim(self, self.Anims.Cock_Nomen)
  312.             end
  313.            
  314.             self.Cocked = true
  315.         end
  316.        
  317.         if self.dt.Bipod then
  318.             self:SetNextPrimaryFire(CT + self.CockTime_Bipod_Nomen)
  319.             self:SetNextSecondaryFire(CT + self.CockTime_Bipod_Nomen)
  320.             self.SprintWait = CT + self.CockTime_Bipod_Nomen
  321.             self.ReloadWait = CT + self.CockTime_Bipod_Nomen
  322.             self.BipodDelay = CT + self.CockTime_Bipod_Nomen
  323.         else
  324.             self:SetNextPrimaryFire(CT + self.CockTime_Nomen)
  325.             self:SetNextSecondaryFire(CT + self.CockTime_Nomen)
  326.             self.SprintWait = CT + self.CockTime_Nomen
  327.             self.ReloadWait = CT + self.CockTime_Nomen
  328.             self.BipodDelay = CT + self.CockTime_Nomen
  329.         end
  330.     else
  331.         if self.dt.Status == FAS_STAT_ADS then
  332.             if self.dt.Bipod then
  333.                 FAS2_PlayAnim(self, self.Anims.Cock_Bipod_Aim)
  334.             else
  335.                 FAS2_PlayAnim(self, self.Anims.Cock_Aim)
  336.             end
  337.            
  338.             self.Cocked = true
  339.         else
  340.             if self.dt.Bipod then
  341.                 FAS2_PlayAnim(self, self.Anims.Cock_Bipod)
  342.             else
  343.                 FAS2_PlayAnim(self, self.Anims.Cock)
  344.             end
  345.            
  346.             self.Cocked = true
  347.         end
  348.        
  349.         if self.dt.Bipod then
  350.             self:SetNextPrimaryFire(CT + self.CockTime_Bipod)
  351.             self:SetNextSecondaryFire(CT + self.CockTime_Bipod)
  352.             self.SprintWait = CT + self.CockTime_Bipod
  353.             self.ReloadWait = CT + self.CockTime_Bipod
  354.             self.BipodDelay = CT + self.CockTime_Bipod
  355.         else
  356.             self:SetNextPrimaryFire(CT + self.CockTime)
  357.             self:SetNextSecondaryFire(CT + self.CockTime)
  358.             self.SprintWait = CT + self.CockTime
  359.             self.ReloadWait = CT + self.CockTime
  360.             self.BipodDelay = CT + self.CockTime
  361.         end
  362.     end
  363. end
  364.  
  365. function SWEP:AddEvent(time, func)
  366.     table.insert(self.Events, {time = CurTime() + time, func = func})
  367. end
  368.  
  369. function SWEP:Reload()
  370.     CT = CurTime()
  371.    
  372.     if CT < self.ReloadWait then
  373.         return
  374.     end
  375.    
  376.     if self.ReloadDelay and CT < self.ReloadDelay then
  377.         return
  378.     end
  379.  
  380.     if self.Owner:KeyDown(IN_USE) then
  381.         self:CycleFiremodes()
  382.         return
  383.     end
  384.    
  385.     if self.FireMode == "safe" then
  386.         if SERVER and SP then
  387.             SendUserMessage("FAS2_CHECKWEAPON", self.Owner)
  388.         end
  389.        
  390.         if CLIENT then
  391.             self.CheckTime = CT + 0.5
  392.         end
  393.        
  394.         return
  395.     end
  396.    
  397.     if self.dt.Status == FAS_STAT_ADS then
  398.         return
  399.     end
  400.    
  401.     if self.CockAfterShot and not self.Cocked then
  402.         self:CockLogic()
  403.     end
  404.    
  405.     mag = self:Clip1()
  406.    
  407.     if (not self.CantChamber and mag >= self.Primary.ClipSize + 1 or self.CantChamber and mag >= self.Primary.ClipSize) or self.Owner:GetAmmoCount(self.Primary.Ammo) == 0 then
  408.         if SERVER and SP then
  409.             SendUserMessage("FAS2_CHECKWEAPON", self.Owner)
  410.         end
  411.        
  412.         if CLIENT then
  413.             self.CheckTime = CT + 0.5
  414.         end
  415.        
  416.         return
  417.     end
  418.    
  419.     if SERVER then
  420.         self.dt.Status = FAS_STAT_IDLE
  421.     end
  422.    
  423.     if mag == 0 then
  424.         if self.Owner.FAS_FamiliarWeapons[self.Class] then
  425.             if self.dt.Bipod then
  426.                 FAS2_PlayAnim(self, self.Anims.Reload_Bipod_Empty_Nomen)
  427.                 self.ReloadDelay = CT + self.ReloadTime_Bipod_Empty_Nomen + 0.3
  428.                 self:SetNextPrimaryFire(CT + self.ReloadTime_Bipod_Empty_Nomen + 0.3)
  429.                 self:SetNextSecondaryFire(CT + self.ReloadTime_Bipod_Empty_Nomen + 0.3)
  430.             else
  431.                 FAS2_PlayAnim(self, self.Anims.Reload_Empty_Nomen)
  432.                 self.ReloadDelay = CT + self.ReloadTime_Empty_Nomen + 0.3
  433.                 self:SetNextPrimaryFire(CT + self.ReloadTime_Empty_Nomen + 0.3)
  434.                 self:SetNextSecondaryFire(CT + self.ReloadTime_Empty_Nomen + 0.3)
  435.             end
  436.         else
  437.             if self.dt.Bipod then
  438.                 FAS2_PlayAnim(self, self.Anims.Reload_Bipod_Empty)
  439.                 self.ReloadDelay = CT + self.ReloadTime_Bipod_Empty + 0.3
  440.                 self:SetNextPrimaryFire(CT + self.ReloadTime_Bipod_Empty + 0.3)
  441.                 self:SetNextSecondaryFire(CT + self.ReloadTime_Bipod_Empty + 0.3)
  442.             else
  443.                 FAS2_PlayAnim(self, self.Anims.Reload_Empty)
  444.                 self.ReloadDelay = CT + self.ReloadTime_Empty + 0.3
  445.                 self:SetNextPrimaryFire(CT + self.ReloadTime_Empty + 0.3)
  446.                 self:SetNextSecondaryFire(CT + self.ReloadTime_Empty + 0.3)
  447.             end
  448.         end
  449.     else
  450.         if self.Owner.FAS_FamiliarWeapons[self.Class] then
  451.             if self.dt.Bipod then
  452.                 FAS2_PlayAnim(self, self.Anims.Reload_Bipod_Nomen)
  453.                 self.ReloadDelay = CT + self.ReloadTime_Bipod_Nomen + 0.3
  454.                 self:SetNextPrimaryFire(CT + self.ReloadTime_Bipod_Nomen + 0.3)
  455.                 self:SetNextSecondaryFire(CT + self.ReloadTime_Bipod_Nomen + 0.3)
  456.             else
  457.                 FAS2_PlayAnim(self, self.Anims.Reload_Nomen)
  458.                 self.ReloadDelay = CT + self.ReloadTime_Nomen + 0.3
  459.                 self:SetNextPrimaryFire(CT + self.ReloadTime_Nomen + 0.3)
  460.                 self:SetNextSecondaryFire(CT + self.ReloadTime_Nomen + 0.3)
  461.             end
  462.         else
  463.             if self.dt.Bipod then
  464.                 FAS2_PlayAnim(self, self.Anims.Reload_Bipod)
  465.                 self.ReloadDelay = CT + self.ReloadTime_Bipod + 0.3
  466.                 self:SetNextPrimaryFire(CT + self.ReloadTime_Bipod + 0.3)
  467.                 self:SetNextSecondaryFire(CT + self.ReloadTime_Bipod + 0.3)
  468.             else
  469.                 FAS2_PlayAnim(self, self.Anims.Reload)
  470.                 self.ReloadDelay = CT + self.ReloadTime + 0.3
  471.                 self:SetNextPrimaryFire(CT + self.ReloadTime + 0.3)
  472.                 self:SetNextSecondaryFire(CT + self.ReloadTime + 0.3)
  473.             end
  474.         end
  475.     end
  476.    
  477.     self.Owner:SetAnimation(PLAYER_RELOAD)
  478. end
  479.  
  480. function SWEP:PlayDeployAnim()
  481.     if self:Clip1() == 0 and self.Anims.Draw_Empty then
  482.         FAS2_PlayAnim(self, self.Anims.Draw_Empty, self.DeployAnimSpeed)
  483.     else
  484.         FAS2_PlayAnim(self, self.Anims.Draw, self.DeployAnimSpeed)
  485.     end
  486. end
  487.  
  488. function SWEP:Deploy()
  489.     if not IsValid(self.Owner) then
  490.         return false
  491.     end
  492.  
  493.     if not self.FirstDeploy then
  494.         if (CLIENT and not IsFirstTimePredicted()) then
  495.             CT = CurTime()
  496.                
  497.             self:SetNextPrimaryFire(CT + (self.DeployTime and self.DeployTime or 1))
  498.             self:SetNextSecondaryFire(CT + (self.DeployTime and self.DeployTime or 1))
  499.             self.ReloadWait = CT + (self.DeployTime and self.DeployTime or 1)
  500.             self.SprintDelay = CT + (self.DeployTime and self.DeployTime or 1)
  501.         else
  502.             self:SetNextPrimaryFire(CT + (self.DeployTime and self.DeployTime or 1))
  503.             self:SetNextSecondaryFire(CT + (self.DeployTime and self.DeployTime or 1))
  504.             self.ReloadWait = CT + (self.DeployTime and self.DeployTime or 1)
  505.             self.SprintDelay = CT + (self.DeployTime and self.DeployTime or 1)
  506.         end
  507.        
  508.         self:PlayDeployAnim()
  509.     else
  510.         if SP and SERVER then
  511.             a = self.Anims.Draw_First
  512.            
  513.             if type(a) == "table" then
  514.                 a = table.Random(a)
  515.             end
  516.            
  517.             FAS2_PlayAnim(self, a, 1, 0, self.Owner:Ping() / 1000)
  518.         end
  519.        
  520.         //self.CurSoundTable = self.Sounds[a]
  521.         //self.CurSoundEntry = 1
  522.         //self.SoundSpeed = 1
  523.         //self.SoundTime = CT + 0.175 + self:GetOwner():Ping() / 1000
  524.         //self.CurAnim = a
  525.        
  526.         CT = CurTime()
  527.        
  528.         self:SetNextPrimaryFire(CT + (self.FirstDeployTime and self.FirstDeployTime or 1))
  529.         self:SetNextSecondaryFire(CT + (self.FirstDeployTime and self.FirstDeployTime or 1))
  530.         self.ReloadWait = CT + (self.FirstDeployTime and self.FirstDeployTime or 1)
  531.         self.SprintDelay = CT + (self.FirstDeployTime and self.FirstDeployTime or 1)
  532.         self.FirstDeploy = false
  533.     end
  534.    
  535.     if CLIENT then
  536.         self.Peeking = false
  537.     end
  538.    
  539.     if not self.Owner.FAS_FamiliarWeapons then
  540.         self.Owner.FAS_FamiliarWeapons = {}
  541.     end
  542.        
  543.     if SERVER then
  544.         if not self.Owner.FAS_FamiliarWeaponsProgress then
  545.             self.Owner.FAS_FamiliarWeaponsProgress = {}
  546.         end
  547.     end
  548.  
  549.     self.dt.Status = FAS_STAT_IDLE
  550.     self:EmitSound("weapons/weapon_deploy" .. math.random(1, 3) .. ".wav", 50, 100)
  551.    
  552.     return true
  553. end
  554.  
  555. function SWEP:CycleFiremodes()
  556.     t = self.FireModes
  557.    
  558.     if not t.last then
  559.         t.last = 2
  560.     else
  561.         if not t[t.last + 1] then
  562.             t.last = 1
  563.         else
  564.             t.last = t.last + 1
  565.         end
  566.     end
  567.    
  568.     if self.dt.Status == FAS_STAT_ADS then
  569.         if self.FireModes[t.last] == "safe" then
  570.             t.last = 1
  571.         end
  572.     end
  573.    
  574.     if self.FireMode != self.FireModes[t.last] and self.FireModes[t.last] then
  575.         self:SelectFiremode(self.FireModes[t.last])
  576.         self:SetNextPrimaryFire(CT + 0.25)
  577.         self:SetNextSecondaryFire(CT + 0.25)
  578.         self.ReloadWait = CT + 0.25
  579.     end
  580. end
  581.  
  582. function SWEP:DelayMe(t)
  583.     t = t + 0.1
  584.     self:SetNextPrimaryFire(t)
  585.     self:SetNextSecondaryFire(t)
  586.     self.ReloadWait = t
  587. end
  588.  
  589. function SWEP:SelectFiremode(n)
  590.     CT = CurTime()
  591.    
  592.     if CLIENT then
  593.         return
  594.     end
  595.    
  596.     t = self.FireModeNames[n]
  597.     self.Primary.Automatic = t.auto
  598.     self.FireMode = n
  599.     self.BurstAmount = t.burstamt
  600.    
  601.     if self.FireMode == "safe" then
  602.         self.dt.Holstered = true -- more reliable than umsgs
  603.     else
  604.         self.dt.Holstered = false
  605.     end
  606.    
  607.     umsg.Start("FAS2_FIREMODE")
  608.         umsg.Entity(self.Owner)
  609.         umsg.String(n)
  610.     umsg.End()
  611. end
  612.  
  613. function SWEP:PlayHolsterAnim()
  614.     if self:Clip1() == 0 and self.Anims.Holster_Empty then
  615.         FAS2_PlayAnim(self, self.Anims.Holster_Empty)
  616.     else
  617.         FAS2_PlayAnim(self, self.Anims.Holster)
  618.     end
  619. end
  620.  
  621. function SWEP:Holster(wep)
  622.     if self == wep then
  623.         return
  624.     end
  625.    
  626.     if self.dt.Status == FAS_STAT_HOLSTER_END then
  627.         self.dt.Status = FAS_STAT_IDLE
  628.         self.ReloadDelay = nil
  629.         return true
  630.     end
  631.    
  632.     if self.ReloadDelay or CurTime() < self.ReloadWait then
  633.         return false
  634.     end
  635.    
  636.     if IsValid(wep) and self.dt.Status != FAS_STAT_HOLSTER_START then
  637.         CT = CurTime()
  638.  
  639.         self:SetNextPrimaryFire(CT + (self.HolsterTime and self.HolsterTime * 2 or 0.75))
  640.         self:SetNextSecondaryFire(CT + (self.HolsterTime and self.HolsterTime * 2 or 0.75))
  641.         self.ReloadWait = CT + (self.HolsterTime and self.HolsterTime * 2 or 0.75)
  642.         self.SprintDelay = CT + (self.HolsterTime and self.HolsterTime * 2 or 0.75)
  643.        
  644.         self.ChosenWeapon = wep:GetClass()
  645.        
  646.         if self.dt.Status != FAS_STAT_HOLSTER_END then
  647.             timer.Simple((self.HolsterTime and self.HolsterTime or 0.45), function()
  648.                 if IsValid(self) and IsValid(self.Owner) and self.Owner:Alive() then
  649.                     self.dt.Status = FAS_STAT_HOLSTER_END
  650.                     self.dt.Bipod = false
  651.                     self.Owner:ConCommand("use " .. self.ChosenWeapon)
  652.                     //RunConsoleCommand("use", self.ChosenWeapon)
  653.                     //if SERVER then
  654.                     //  self.Owner:SelectWeapon(self.ChosenWeapon)
  655.                     //end
  656.                 end
  657.             end)
  658.         end
  659.        
  660.         self.dt.Status = FAS_STAT_HOLSTER_START
  661.         self:PlayHolsterAnim()
  662.     end
  663.    
  664.     //self:EmitSound("Generic_Cloth", 70, 100)
  665.    
  666.     if CLIENT then
  667.         self.CurSoundTable = nil
  668.         self.CurSoundEntry = nil
  669.         self.SoundTime = nil
  670.         self.SoundSpeed = 1
  671.     end
  672.    
  673.     if SERVER and SP then
  674.         SendUserMessage("FAS2_ENDSOUNDS", self.Owner)
  675.     end
  676.    
  677.     self:EmitSound("weapons/weapon_holster" .. math.random(1, 3) .. ".wav", 50, 100)
  678.     return false
  679. end
  680.  
  681. local mod, cr, tr, aim
  682.  
  683. local td = {}
  684.  
  685. function SWEP:PlayFireAnim(mag)
  686.     if self.dt.Status == FAS_STAT_ADS then
  687.         if mag == 1 and (self.Anims.Fire_Aiming_Last or self.Anims.Fire_Bipod_Aiming_Last) then
  688.             if self.dt.Bipod then
  689.                 FAS2_PlayAnim(self, self.Anims.Fire_Bipod_Aiming_Last and self.Anims.Fire_Bipod_Aiming_Last or self.Anims.Fire_Bipod_Last)
  690.             else
  691.                 FAS2_PlayAnim(self, self.Anims.Fire_Aiming_Last and self.Anims.Fire_Aiming_Last or self.Anims.Fire_Last)
  692.             end
  693.         else
  694.             if self.dt.Bipod then
  695.                 FAS2_PlayAnim(self, self.Anims.Fire_Bipod_Aiming and self.Anims.Fire_Bipod_Aiming or self.Anims.Fire_Bipod)
  696.             else
  697.                 FAS2_PlayAnim(self, self.Anims.Fire_Aiming and self.Anims.Fire_Aiming or self.Anims.Fire)
  698.             end
  699.         end
  700.     else
  701.         if mag == 1 and (self.Anims.Fire_Last or self.Anims.Fire_Bipod_Last) then
  702.             if self.dt.Bipod then
  703.                 FAS2_PlayAnim(self, self.Anims.Fire_Bipod_Last)
  704.             else
  705.                 FAS2_PlayAnim(self, self.Anims.Fire_Last)
  706.             end
  707.         else
  708.             if self.dt.Bipod then
  709.                 FAS2_PlayAnim(self, self.Anims.Fire_Bipod)
  710.             else
  711.                 FAS2_PlayAnim(self, self.Anims.Fire)
  712.             end
  713.         end
  714.     end
  715. end
  716.  
  717. local ef
  718.  
  719. function SWEP:AimRecoil(mul)
  720.     mul = mul or 1
  721.     mod = self.Owner:Crouching() and 0.75 or 1
  722.  
  723.     self.Owner:ViewPunch(Angle(-self.ViewKick, self.ViewKick * math.Rand(-0.2475, 0.2475), 0) * (1 + self.AddSpread * (self.SpreadToRecoil and self.SpreadToRecoil or 1)) * mod * (self.dt.Bipod and 0.3 or 1) * mul)
  724.        
  725.     if (SERVER and SP) or CLIENT then
  726.         ang = self.Owner:EyeAngles()
  727.         ang.p = ang.p - self.Recoil * (1 + self.AddSpread * (self.SpreadToRecoil and self.SpreadToRecoil or 1)) * mod * (self.dt.Bipod and 0.3 or 1) * mul
  728.         ang.y = ang.y - self.Recoil * math.Rand(-0.375, 0.375) * (1 + self.AddSpread * (self.SpreadToRecoil and self.SpreadToRecoil or 1)) * mod * (self.dt.Bipod and 0.3 or 1) * mul
  729.         self.Owner:SetEyeAngles(ang)
  730.     end
  731. end
  732.  
  733. function SWEP:HipRecoil(mul)
  734.     mul = mul or 1
  735.     mod = self.Owner:Crouching() and 0.75 or 1
  736.    
  737.     self.Owner:ViewPunch(Angle(-self.ViewKick, self.ViewKick * math.Rand(-0.33, 0.33), 0) * (1 + self.AddSpread * (self.SpreadToRecoil and self.SpreadToRecoil or 1)) * mod * (self.dt.Bipod and 0.3 or 1) * mul)
  738.                
  739.     if (SERVER and SP) or CLIENT then
  740.         ang = self.Owner:EyeAngles()
  741.         ang.p = ang.p - self.Recoil * (1 + self.AddSpread * (self.SpreadToRecoil and self.SpreadToRecoil or 1)) * mod * (self.dt.Bipod and 0.3 or 1) * mul
  742.         ang.y = ang.y - self.Recoil * math.Rand(-0.5, 0.5) * (1 + self.AddSpread * (self.SpreadToRecoil and self.SpreadToRecoil or 1)) * mod * (self.dt.Bipod and 0.3 or 1) * mul
  743.         self.Owner:SetEyeAngles(ang)
  744.     end
  745. end
  746.  
  747. function SWEP:PrimaryAttack()
  748.     if self.FireMode == "safe" then
  749.         if IsFirstTimePredicted() then
  750.             self:CycleFiremodes()
  751.         end
  752.        
  753.         return
  754.     end
  755.    
  756.     if IsFirstTimePredicted() then
  757.         if self.BurstAmount > 0 and self.dt.Shots >= self.BurstAmount then
  758.             return
  759.         end
  760.        
  761.         if self.ReloadState != 0 then
  762.             self.ReloadState = 3
  763.             return
  764.         end
  765.        
  766.         if self.dt.Status == FAS_STAT_CUSTOMIZE then
  767.             return
  768.         end
  769.        
  770.         if self.Cooking or self.FuseTime then
  771.             return
  772.         end
  773.    
  774.         if self.Owner:KeyDown(IN_USE) then
  775.             if self:CanThrowGrenade() then
  776.                 self:InitialiseGrenadeThrow()
  777.                 return
  778.             end
  779.         end
  780.        
  781.         if self.dt.Status == FAS_STAT_SPRINT or self.dt.Status == FAS_STAT_QUICKGRENADE then
  782.             return
  783.         end
  784.        
  785.         td.start = self.Owner:GetShootPos()
  786.         td.endpos = td.start + self.Owner:GetAimVector() * 30
  787.         td.filter = self.Owner
  788.            
  789.         tr = util.TraceLine(td)
  790.        
  791.         if tr.Hit then
  792.             return
  793.         end
  794.        
  795.         mag = self:Clip1()
  796.         CT = CurTime()
  797.        
  798.         if mag <= 0 or self.Owner:WaterLevel() >= 3 then
  799.             self:EmitSound(self.EmptySound, 60, 100)
  800.             self:SetNextPrimaryFire(CT + 0.2)
  801.             //self:EmitSound("FAS2_DRYFIRE", 70, 100)
  802.             return
  803.         end
  804.    
  805.         if self.CockAfterShot and not self.Cocked then
  806.             if SERVER then
  807.                 if SP then
  808.                     SendUserMessage("FAS2_COCKREMIND", self.Owner) -- wow okay
  809.                 end
  810.             else
  811.                 self.CockRemindTime = CurTime() + 1
  812.             end
  813.            
  814.             return
  815.         end
  816.            
  817.         self:FireBullet()
  818.        
  819.         if CLIENT then
  820.             self:CreateMuzzle()
  821.            
  822.             if self.Shell and self.CreateShell then
  823.                 self:CreateShell()
  824.             end
  825.         end
  826.        
  827.         ef = EffectData()
  828.         ef:SetEntity(self)
  829.         util.Effect("fas2_ef_muzzleflash", ef)
  830.        
  831.         mod = self.Owner:Crouching() and 0.75 or 1
  832.        
  833.         self:PlayFireAnim(mag)
  834.            
  835.         if self.dt.Status == FAS_STAT_ADS then
  836.             if self.BurstAmount > 0 then
  837.                 if self.DelayedBurstRecoil then
  838.                     if self.dt.Shots == self.ShotToDelayUntil then
  839.                         self:AimRecoil(self.BurstRecoilMod)
  840.                     end
  841.                 else
  842.                     self:AimRecoil(self.BurstRecoilMod)
  843.                 end
  844.             else
  845.                 self:AimRecoil()
  846.             end
  847.         else
  848.             if self.BurstAmount > 0 then
  849.                 if self.DelayedBurstRecoil then
  850.                     if self.dt.Shots == self.ShotToDelayUntil then
  851.                         self:HipRecoil(self.BurstRecoilMod)
  852.                     end
  853.                 else
  854.                     self:HipRecoil(self.BurstRecoilMod)
  855.                 end
  856.             else
  857.                 self:HipRecoil()
  858.             end
  859.         end
  860.        
  861.         self.SpreadWait = CT + self.SpreadCooldown
  862.        
  863.         if self.BurstAmount > 0 then
  864.             self.AddSpread = math.Clamp(self.AddSpread + self.SpreadPerShot * mod * 0.5, 0, self.MaxSpreadInc)
  865.             self.AddSpreadSpeed = math.Clamp(self.AddSpreadSpeed - 0.2 * mod * 0.5, 0, 1)
  866.         else
  867.             self.AddSpread = math.Clamp(self.AddSpread + self.SpreadPerShot * mod, 0, self.MaxSpreadInc)
  868.             self.AddSpreadSpeed = math.Clamp(self.AddSpreadSpeed - 0.2 * mod, 0, 1)
  869.         end
  870.        
  871.         if self.CockAfterShot then
  872.             self.Cocked = false
  873.         end
  874.    
  875.         if SERVER and SP then
  876.             SendUserMessage("FAS2SPREAD", self.Owner)
  877.         end
  878.        
  879.         if CLIENT then
  880.             self.CheckTime = 0
  881.         end
  882.        
  883.         if self.dt.Suppressed then
  884.             self:EmitSound(self.FireSound_Suppressed, 75, 100)
  885.         else
  886.             self:EmitSound(self.FireSound, 105, 100)
  887.         end
  888.        
  889.         self.Owner:SetAnimation(PLAYER_ATTACK1)
  890.        
  891.         self.ReloadWait = CT + 0.3
  892.     end
  893.    
  894.     if self.BurstAmount > 0 then
  895.         self.dt.Shots = self.dt.Shots + 1
  896.         self:SetNextPrimaryFire(CT + self.FireDelay * self.BurstFireDelayMod)
  897.     else
  898.         self:SetNextPrimaryFire(CT + self.FireDelay)
  899.     end
  900.    
  901.     self:TakePrimaryAmmo(1)
  902.    
  903.     //self:SetNextSecondaryFire(CT + 0.1)
  904.    
  905.     return
  906. end
  907.  
  908. function SWEP:SecondaryAttack()
  909.     if self.FireMode == "safe" then
  910.         return
  911.     end
  912.    
  913.     if not self.Owner:OnGround() then
  914.         return
  915.     end
  916.  
  917.     if self.ReloadState != 0 then
  918.         return
  919.     end
  920.    
  921.     if self.Owner:KeyDown(IN_USE) then
  922.         return
  923.     end
  924.    
  925.     if self.dt.Status == FAS_STAT_SPRINT or self.dt.Status == FAS_STAT_CUSTOMIZE or self.dt.Status == FAS_STAT_QUICKGRENADE then
  926.         return
  927.     end
  928.    
  929.     if self.dt.Status != FAS_STAT_ADS then
  930.         self.dt.Status = FAS_STAT_ADS
  931.         self:EmitSound(table.Random(self.AimSounds), 50, 100)
  932.     else
  933.         self.dt.Status = FAS_STAT_IDLE
  934.         self:EmitSound(table.Random(self.BackToHipSounds), 50, 100)
  935.     end
  936.    
  937.     //self:SetNextPrimaryFire(CT + 0.1)
  938.     self:SetNextSecondaryFire(CT + 0.1)
  939.     self.ReloadWait = CT + 0.3
  940.    
  941.     return
  942. end
  943.  
  944. function SWEP:Equip()
  945.     if self.ExtraMags then
  946.         if gamemode.Get("sandbox") then
  947.             self.Owner:GiveAmmo(self.ExtraMags * self.Primary.ClipSize, self.Primary.Ammo)
  948.         end
  949.     end
  950.    
  951.     if self.AttOnPickUp then
  952.         for k, v in pairs(self.AttOnPickUp) do
  953.             self.Owner:FAS2_PickUpAttachment(v, true)
  954.         end
  955.     end
  956. end
  957.  
  958. function SWEP:UnloadWeapon()
  959.     mag = self:Clip1()
  960.     self:SetClip1(0)
  961.    
  962.     if CLIENT then
  963.         self.CheckTime = CT + 3
  964.     else
  965.         self.Owner:GiveAmmo(mag, self.Primary.Ammo)
  966.     end
  967. end
  968.  
  969. function SWEP:CalculateSpread()
  970.     aim = self.Owner:GetAimVector()
  971.        
  972.     if not self.Owner.LastView then
  973.         self.Owner.LastView = aim
  974.         self.Owner.ViewAff = 0
  975.     else
  976.         self.Owner.ViewAff = Lerp(0.25, self.Owner.ViewAff, (aim - self.Owner.LastView):Length() * 0.5)
  977.         self.Owner.LastView = aim
  978.     end
  979.    
  980.     cone = self.HipCone * (cr and 0.75 or 1) * (self.dt.Bipod and 0.3 or 1)
  981.        
  982.     if self.dt.Status == FAS_STAT_ADS then
  983.         td.start = self.Owner:GetShootPos()
  984.         td.endpos = td.start + aim * 30
  985.         td.filter = self.Owner
  986.        
  987.         tr = util.TraceLine(td)
  988.        
  989.         if tr.Hit then
  990.             self.dt.Status = FAS_STAT_IDLE
  991.             self:SetNextPrimaryFire(CT + 0.2)
  992.             self:SetNextSecondaryFire(CT + 0.2)
  993.             self.ReloadWait = CT + 0.2
  994.         else
  995.             cone = self.AimCone
  996.         end
  997.     end
  998.    
  999.     self.CurCone = math.Clamp(cone + self.AddSpread * (self.dt.Bipod and 0.5 or 1) + (vel / 10000 * self.VelocitySensitivity) * (self.dt.Status == FAS_STAT_ADS and 0.25 or 1) + self.Owner.ViewAff, 0, 0.09 + self.MaxSpreadInc)
  1000.    
  1001.     if CT > self.SpreadWait then
  1002.         self.AddSpread = math.Clamp(self.AddSpread - 0.005 * self.AddSpreadSpeed, 0, self.MaxSpreadInc)
  1003.         self.AddSpreadSpeed = math.Clamp(self.AddSpreadSpeed + 0.05, 0, 1)
  1004.     end
  1005. end
  1006.  
  1007. local can
  1008.  
  1009. function SWEP:CanDeployBipod()
  1010.     vel = Length(GetVelocity(self.Owner))
  1011.    
  1012.     if vel == 0 and self.Owner:EyeAngles().p <= 45 then
  1013.         sp = self.Owner:GetShootPos()
  1014.         aim = self.Owner:GetAimVector()
  1015.        
  1016.         td.start = sp
  1017.         td.endpos = td.start + aim * 50
  1018.         td.filter = self.Owner
  1019.                
  1020.         tr = util.TraceLine(td)
  1021.        
  1022.         if not tr.Hit then
  1023.             td.start = sp
  1024.             td.endpos = td.start + Vector(aim.x, aim.y, -1) * 25
  1025.             td.filter = self.Owner
  1026.             td.mins = Vector(-8, -8, -1)
  1027.             td.maxs = Vector(8, 8, 1)
  1028.            
  1029.             tr = util.TraceHull(td)
  1030.                        
  1031.             if tr.Hit and tr.HitPos.z + 10 < sp.z then -- make sure we have something to place the bipod on and we're not placing the bipod on something lower than our standing position
  1032.                 ent = tr.Entity
  1033.                            
  1034.                 if not ent:IsPlayer() and not ent:IsNPC() then
  1035.                     return true
  1036.                 end
  1037.             end
  1038.         end
  1039.     end
  1040.    
  1041.     return false
  1042. end
  1043.  
  1044. function SWEP:PlayBipodDeployAnim()
  1045.     if self:Clip1() == 0 and self.Anims.Bipod_Deploy_Empty then
  1046.         FAS2_PlayAnim(self, self.Anims.Bipod_Deploy_Empty, 1)
  1047.     else
  1048.         FAS2_PlayAnim(self, self.Anims.Bipod_Deploy, 1)
  1049.     end
  1050. end
  1051.  
  1052. function SWEP:PlayBipodUnDeployAnim()
  1053.     if self:Clip1() == 0 and self.Anims.Bipod_UnDeploy_Empty then
  1054.         FAS2_PlayAnim(self, self.Anims.Bipod_UnDeploy_Empty, 1)
  1055.     else
  1056.         FAS2_PlayAnim(self, self.Anims.Bipod_UnDeploy, 1)
  1057.     end
  1058. end
  1059.  
  1060. function SWEP:Think()
  1061.     if self.ShotgunThink then
  1062.         self:ShotgunThink()
  1063.     end
  1064.  
  1065.     cr = self.Owner:Crouching()
  1066.     CT, vel = CurTime(), Length(GetVelocity(self.Owner))
  1067.    
  1068.     if self.ReloadDelay and CT >= self.ReloadDelay then
  1069.         mag, ammo = self:Clip1(), self.Owner:GetAmmoCount(self.Primary.Ammo)
  1070.        
  1071.         if SERVER then
  1072.             if not self.NoProficiency then
  1073.                 if not self.Owner.FAS_FamiliarWeapons[self.Class] then
  1074.                     if not self.Owner.FAS_FamiliarWeaponsProgress[self.Class] then
  1075.                         self.Owner.FAS_FamiliarWeaponsProgress[self.Class] = 0
  1076.                     end
  1077.                    
  1078.                     self.Owner.FAS_FamiliarWeaponsProgress[self.Class] = self.Owner.FAS_FamiliarWeaponsProgress[self.Class] + GetConVarNumber("fas2_profgain") * (mag == 0 and 1.5 or 1)
  1079.                    
  1080.                     if self.Owner.FAS_FamiliarWeaponsProgress[self.Class] >= 1 then
  1081.                         self:FamiliariseWithWeapon()
  1082.                     end
  1083.                 end
  1084.             end
  1085.         end
  1086.        
  1087.         if self.ReloadAmount then
  1088.             if SERVER then
  1089.                 self:SetClip1(math.Clamp(mag + self.ReloadAmount, 0, self.Primary.ClipSize))
  1090.                 self.Owner:RemoveAmmo(self.ReloadAmount, self.Primary.Ammo)
  1091.             end
  1092.         else
  1093.             if mag > 0 then
  1094.                 if not self.CantChamber then
  1095.                     if ammo >= self.Primary.ClipSize - mag + 1 then
  1096.                         if SERVER then
  1097.                             self:SetClip1(math.Clamp(self.Primary.ClipSize + 1, 0, self.Primary.ClipSize + 1))
  1098.                             self.Owner:RemoveAmmo(self.Primary.ClipSize - mag + 1, self.Primary.Ammo)
  1099.                         end
  1100.                     else
  1101.                         if SERVER then
  1102.                             self:SetClip1(math.Clamp(mag + ammo, 0, self.Primary.ClipSize))
  1103.                             self.Owner:RemoveAmmo(ammo, self.Primary.Ammo)
  1104.                         end
  1105.                     end
  1106.                 else
  1107.                     if ammo >= self.Primary.ClipSize - mag then
  1108.                         if SERVER then
  1109.                             self:SetClip1(math.Clamp(self.Primary.ClipSize, 0, self.Primary.ClipSize))
  1110.                             self.Owner:RemoveAmmo(self.Primary.ClipSize - mag, self.Primary.Ammo)
  1111.                         end
  1112.                     else
  1113.                         if SERVER then
  1114.                             self:SetClip1(math.Clamp(mag + ammo, 0, self.Primary.ClipSize))
  1115.                             self.Owner:RemoveAmmo(ammo, self.Primary.Ammo)
  1116.                         end
  1117.                     end
  1118.                 end
  1119.             else
  1120.                 if ammo >= self.Primary.ClipSize then
  1121.                     if SERVER then
  1122.                         self:SetClip1(math.Clamp(self.Primary.ClipSize, 0, self.Primary.ClipSize))
  1123.                         self.Owner:RemoveAmmo(self.Primary.ClipSize, self.Primary.Ammo)
  1124.                     end
  1125.                 else
  1126.                     if SERVER then
  1127.                         self:SetClip1(math.Clamp(ammo, 0, self.Primary.ClipSize))
  1128.                         self.Owner:RemoveAmmo(ammo, self.Primary.Ammo)
  1129.                     end
  1130.                 end
  1131.             end
  1132.         end
  1133.        
  1134.         self.ReloadDelay = nil
  1135.     end
  1136.    
  1137.     if (SP and SERVER) or not SP then -- if it's SP, then we run it only on the server (otherwise shit gets fucked); if it's MP we predict it
  1138.         if self.dt.Bipod or self.DeployAngle then
  1139.             if not self:CanDeployBipod() then
  1140.                 self.dt.Bipod = false
  1141.                 self.DeployAngle = nil
  1142.                
  1143.                 if not self.ReloadDelay then
  1144.                     if CT > self.BipodDelay then
  1145.                         self:PlayBipodUnDeployAnim()
  1146.                         self.BipodDelay = CT + self.BipodUndeployTime
  1147.                         self:SetNextPrimaryFire(CT + self.BipodUndeployTime)
  1148.                         self:SetNextSecondaryFire(CT + self.BipodUndeployTime)
  1149.                         self.ReloadWait = CT + self.BipodUndeployTime
  1150.                     else
  1151.                         self.BipodUnDeployPost = true
  1152.                     end
  1153.                 else
  1154.                     self.BipodUnDeployPost = true
  1155.                 end
  1156.             end
  1157.         end
  1158.            
  1159.         if not self.ReloadDelay then
  1160.             if self.BipodUnDeployPost then
  1161.                 if CT > self.BipodDelay then
  1162.                     if not self:CanDeployBipod() then
  1163.                         self:PlayBipodUnDeployAnim()
  1164.                         self.BipodDelay = CT + self.BipodUndeployTime
  1165.                         self:SetNextPrimaryFire(CT + self.BipodUndeployTime)
  1166.                         self:SetNextSecondaryFire(CT + self.BipodUndeployTime)
  1167.                         self.ReloadWait = CT + self.BipodUndeployTime
  1168.                         self.BipodUnDeployPost = false
  1169.                     else
  1170.                         self.dt.Bipod = true
  1171.                        
  1172.                         if SP and SERVER then
  1173.                             umsg.Start("FAS2_DEPLOYANGLE", self.Owner)
  1174.                                 umsg.Angle(self.Owner:EyeAngles())
  1175.                             umsg.End()
  1176.                         else
  1177.                             self.DeployAngle = self.Owner:EyeAngles()
  1178.                         end
  1179.                        
  1180.                         self.BipodUnDeployPost = false
  1181.                     end
  1182.                 end
  1183.             end
  1184.            
  1185.             if self.Owner:KeyPressed(IN_USE) then
  1186.                 if CT > self.BipodDelay and CT > self.ReloadWait then
  1187.                     if self.InstalledBipod then
  1188.                         if self.dt.Bipod then
  1189.                             self.dt.Bipod = false
  1190.                             self.DeployAngle = nil
  1191.                            
  1192.                             self.BipodDelay = CT + self.BipodUndeployTime
  1193.                             self:SetNextPrimaryFire(CT + self.BipodUndeployTime)
  1194.                             self:SetNextSecondaryFire(CT + self.BipodUndeployTime)
  1195.                             self.ReloadWait = CT + self.BipodUndeployTime
  1196.                             self:PlayBipodUnDeployAnim()
  1197.                         else
  1198.                             self.dt.Bipod = self:CanDeployBipod()
  1199.                            
  1200.                             if self.dt.Bipod then
  1201.                                 self.BipodDelay = CT + self.BipodDeployTime
  1202.                                 self:SetNextPrimaryFire(CT + self.BipodDeployTime)
  1203.                                 self:SetNextSecondaryFire(CT + self.BipodDeployTime)
  1204.                                 self.ReloadWait = CT + self.BipodDeployTime
  1205.                            
  1206.                                 if SP and SERVER then
  1207.                                     umsg.Start("FAS2_DEPLOYANGLE", self.Owner)
  1208.                                         umsg.Angle(self.Owner:EyeAngles())
  1209.                                     umsg.End()
  1210.                                 else
  1211.                                     self.DeployAngle = self.Owner:EyeAngles()
  1212.                                 end
  1213.                                
  1214.                                 self:PlayBipodDeployAnim()
  1215.                             end
  1216.                         end
  1217.                     end
  1218.                 end
  1219.             end
  1220.  
  1221.             if self.dt.Status == FAS_STAT_ADS then
  1222.                 if not self.Owner:KeyDown(IN_ATTACK2) then
  1223.                     if tonumber(self.Owner:GetInfo("fas2_holdtoaim")) > 0 then
  1224.                         self.dt.Status = FAS_STAT_IDLE
  1225.                         self:SetNextSecondaryFire(CT + 0.1)
  1226.                         self.ReloadWait = CT + 0.3
  1227.                         self:EmitSound(table.Random(self.BackToHipSounds), 50, 100)
  1228.                     end
  1229.                 end
  1230.             end
  1231.         end
  1232.     end
  1233.    
  1234.     if self.Owner:KeyDown(IN_USE) and self.Owner:KeyDown(IN_ATTACK2) then
  1235.         if SERVER and SP then
  1236.             SendUserMessage("FAS2_CHECKWEAPON", self.Owner)
  1237.         end
  1238.        
  1239.         if CLIENT then
  1240.             self.CheckTime = CT + 0.5
  1241.         end
  1242.        
  1243.         return
  1244.     end
  1245.    
  1246.     //if not self.ReloadDelay then
  1247.     if self.dt.Status != FAS_STAT_HOLSTER_START and self.dt.Status != FAS_STAT_HOLSTER_END and self.dt.Status != FAS_STAT_QUICKGRENADE then
  1248.         if self.Owner:OnGround() then
  1249.             if self.Owner:KeyDown(IN_SPEED) and vel >= self.Owner:GetWalkSpeed() * 1.3 then
  1250.                 if self.dt.Status != FAS_STAT_SPRINT then
  1251.                     self.dt.Status = FAS_STAT_SPRINT
  1252.                 end
  1253.             else
  1254.                 if self.dt.Status == FAS_STAT_SPRINT then
  1255.                     self.dt.Status = FAS_STAT_IDLE
  1256.                    
  1257.                     if CT > self.SprintDelay and not self.ReloadDelay then
  1258.                         self:SetNextPrimaryFire(CT + 0.2)
  1259.                         self:SetNextSecondaryFire(CT + 0.2)
  1260.                     end
  1261.                 end
  1262.             end
  1263.         else
  1264.             if self.dt.Status != FAS_STAT_IDLE then
  1265.                 self.dt.Status = FAS_STAT_IDLE
  1266.                
  1267.                 if CT > self.SprintDelay and not self.ReloadDelay then
  1268.                     self:SetNextPrimaryFire(CT + 0.2)
  1269.                     self:SetNextSecondaryFire(CT + 0.2)
  1270.                 end
  1271.             end
  1272.         end
  1273.     end
  1274.    
  1275.     self:CalculateSpread()
  1276.    
  1277.     if self.dt.Shots > 0 then
  1278.         if not self.Owner:KeyDown(IN_ATTACK) then
  1279.             self:SetNextPrimaryFire(CT + self.FireDelay * 2)
  1280.             self:SetNextSecondaryFire(CT + 0.1)
  1281.             self.ReloadWait = CT + self.FireDelay * 3
  1282.             self.dt.Shots = 0
  1283.         end
  1284.     end
  1285.    
  1286.     if self.CurSoundTable then
  1287.         t = self.CurSoundTable[self.CurSoundEntry]
  1288.        
  1289.         if CT >= self.SoundTime + t.time / self.SoundSpeed then
  1290.             self:EmitSound(t.sound, 70, 100)
  1291.            
  1292.             if self.CurSoundTable[self.CurSoundEntry + 1] then
  1293.                 self.CurSoundEntry = self.CurSoundEntry + 1
  1294.             else
  1295.                 self.CurSoundTable = nil
  1296.                 self.CurSoundEntry = nil
  1297.                 self.SoundTime = nil
  1298.             end
  1299.         end
  1300.     end
  1301.    
  1302.     if self.TimeToAdvance and CT > self.TimeToAdvance then
  1303.         if self.AdvanceStage == "draw" then
  1304.             self:DrawGrenade()
  1305.         elseif self.AdvanceStage == "prepare" then
  1306.             self:AdvanceGrenadeThrow()
  1307.         end
  1308.     end
  1309.    
  1310.     if self.Cooking then
  1311.         if self.FuseTime then
  1312.             if not self.Owner:KeyDown(IN_ATTACK) then
  1313.                 if CT > self.TimeToThrow then
  1314.                     self:ThrowGrenade()
  1315.                 end
  1316.             else
  1317.                 if CT > self.TimeToThrow then
  1318.                     self.ThrowPower = math.Approach(self.ThrowPower, 1, FrameTime())
  1319.                 end
  1320.            
  1321.                 if SERVER then
  1322.                     if CT >= self.FuseTime then
  1323.                         self.Cooking = false
  1324.                         self.FuseTime = nil
  1325.                         util.BlastDamage(self.Owner, self.Owner, self:GetPos(), 384, 100)
  1326.                         self.Owner:Kill()
  1327.                        
  1328.                         ef = EffectData()
  1329.                         ef:SetOrigin(self.Owner:GetPos())
  1330.                         ef:SetMagnitude(1)
  1331.                        
  1332.                         util.Effect("Explosion", ef)
  1333.                     end
  1334.                 end
  1335.             end
  1336.         end
  1337.     end
  1338.    
  1339.     for k, v in pairs(self.Events) do
  1340.         if CT > v.time then
  1341.             v.func()
  1342.             table.remove(self.Events, k)
  1343.         end
  1344.     end
  1345. end
  1346.  
  1347. if SERVER then
  1348.     function SWEP:FamiliariseWithWeapon()
  1349.         self.Owner.FAS_FamiliarWeapons = self.Owner.FAS_FamiliarWeapons and self.Owner.FAS_FamiliarWeapons or {}
  1350.         self.Owner.FAS_FamiliarWeapons[self.Class] = true
  1351.        
  1352.         umsg.Start("FAS2_FAMILIARISE", self.Owner)
  1353.             umsg.String(self.Class)
  1354.         umsg.End()
  1355.     end
  1356.    
  1357.     function SWEP:Suppress()
  1358.         if self.CantSuppress then
  1359.             return
  1360.         end
  1361.        
  1362.         self.dt.Suppressed = true
  1363.        
  1364.         SendUserMessage("FAS2_SUPPRESSMODEL", self.Owner)
  1365.     end
  1366.    
  1367.     function SWEP:UnSuppress()
  1368.         if self.CantSuppress then
  1369.             return
  1370.         end
  1371.        
  1372.         self.dt.Suppressed = true
  1373.        
  1374.         SendUserMessage("FAS2_UNSUPPRESSMODEL", self.Owner)
  1375.     end
  1376. end
  1377.  
  1378. function SWEP:CanThrowGrenade()
  1379.     if self.FireMode != "safe" then
  1380.         if self.Owner:HasWeapon("fas2_m67") then
  1381.             if self.Owner:GetAmmoCount("M67 Grenades") > 0 then
  1382.                 return true
  1383.             end
  1384.         end
  1385.     end
  1386.    
  1387.     return false
  1388. end
  1389.  
  1390. function SWEP:InitialiseGrenadeThrow()
  1391.     CT = CurTime()
  1392.    
  1393.     self:EmitSound("weapons/weapon_holster" .. math.random(1, 3) .. ".wav", 50, 100)
  1394.     self:PlayHolsterAnim()
  1395.     self:DelayMe(CT + 5)
  1396.     self.TimeToAdvance = CT + (self.HolsterTime and self.HolsterTime or 0.45)
  1397.     self.AdvanceStage = "draw"
  1398.     self.dt.Status = FAS_STAT_QUICKGRENADE
  1399. end
  1400.  
  1401. function SWEP:DrawGrenade()
  1402.     if SP and SERVER then
  1403.         SendUserMessage("FAS2_DRAWGRENADE", self.Owner)
  1404.     end
  1405.    
  1406.     if CLIENT then
  1407.         FAS2_DrawGrenade()
  1408.     end
  1409.    
  1410.     self.AdvanceStage = "prepare"
  1411.     self.TimeToAdvance = CT + 0.1
  1412. end
  1413.  
  1414. function SWEP:AdvanceGrenadeThrow()
  1415.     CT = CurTime()
  1416.    
  1417.     self.Cooking = true
  1418.     self.FuseTime = CT + 3.5
  1419.     self.CookTime = CT + 3.5
  1420.     self.TimeToAdvance = nil
  1421.     self.ThrowPower = 0.5
  1422.     self.TimeToThrow = CT + 0.6
  1423.    
  1424.     if SP and SERVER then
  1425.         SendUserMessage("FAS2_PULLPIN", self.Owner)
  1426.     end
  1427.    
  1428.     if CLIENT then
  1429.         FAS2_PullGrenadePin()
  1430.     end
  1431. end
  1432.  
  1433. local phys, force, pos, EA
  1434.  
  1435. function SWEP:ThrowGrenade()
  1436.     self.Cooking = false
  1437.     CT = CurTime()
  1438.    
  1439.     if SP and SERVER then
  1440.         SendUserMessage("FAS2_THROWGRENADE", self.Owner)
  1441.     end
  1442.    
  1443.     if CLIENT then
  1444.         FAS2_ThrowGrenade()
  1445.     end
  1446.    
  1447.     if SERVER then
  1448.         timer.Simple(0.15, function()
  1449.             if IsValid(self) and IsValid(self.Owner) and self.Owner:Alive() then
  1450.                 local nade = ents.Create("fas2_thrown_m67")
  1451.                 EA =  self.Owner:EyeAngles()
  1452.                 pos = self.Owner:GetShootPos()
  1453.                 pos = pos + EA:Right() * 5 - EA:Up() * 4 + EA:Forward() * 8
  1454.                
  1455.                 nade:SetPos(pos)
  1456.                 nade:SetAngles(Angle(math.random(0, 360), math.random(0, 360), math.random(0, 360)))
  1457.                 nade:Spawn()
  1458.                 nade:SetOwner(self.Owner)
  1459.                 nade:Fuse(self.CookTime - CT)
  1460.                
  1461.                 phys = nade:GetPhysicsObject()
  1462.  
  1463.                 if IsValid(phys) then
  1464.                     force = 1000
  1465.  
  1466.                     if self.Owner:KeyDown(IN_FORWARD) and ong then
  1467.                         force = force + self.Owner:GetVelocity():Length()
  1468.                     end
  1469.  
  1470.                     phys:SetVelocity(EA:Forward() * force * self.ThrowPower + Vector(0, 0, 100))
  1471.                     phys:AddAngleVelocity(Vector(math.random(-500, 500), math.random(-500, 500), math.random(-500, 500)))
  1472.                 end
  1473.             end
  1474.         end)
  1475.     end
  1476.    
  1477.     self.Owner:RemoveAmmo(1, "M67 Grenades")
  1478.    
  1479.     timer.Simple(0.65, function()
  1480.         if IsValid(self) and IsValid(self.Owner) and self.Owner:Alive() then
  1481.             self:DrawWeapon()
  1482.         end
  1483.     end)
  1484.    
  1485.     self.FuseTime = nil
  1486. end
  1487.  
  1488. function SWEP:DrawWeapon()
  1489.     self:DelayMe(CT + self.DeployTime)
  1490.     self:PlayDeployAnim()
  1491.     self.dt.Status = FAS_STAT_IDLE
  1492. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement