Advertisement
Guest User

fas2_base\shared.lua

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