--[[ | This file was obtained through the combined efforts | of Madbluntz & Plymouth Antiquarian Society. | | Credits: lifestorm, Gregory Wayne Rossel JR., | Maloy, DrPepper10 @ RIP, Atle! | | Visit for more: https://plymouth.thetwilightzone.ru/ --]] -- Copyright (c) 2018-2020 TFA Base Devs -- Permission is hereby granted, free of charge, to any person obtaining a copy -- of this software and associated documentation files (the "Software"), to deal -- in the Software without restriction, including without limitation the rights -- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -- copies of the Software, and to permit persons to whom the Software is -- furnished to do so, subject to the following conditions: -- The above copyright notice and this permission notice shall be included in all -- copies or substantial portions of the Software. -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -- SOFTWARE. local vector_origin = Vector() if SERVER then AddCSLuaFile() end -- This base is kept for backward compatiblity purposes -- This should not, by any means, be utilized in newer SWEPS -- Look at melee base/knife base --[[ PLEASE DON TUSE THIS ANYMIRE PLEASe PLEASSSSSSSS ]] DEFINE_BASECLASS("tfa_gun_base") SWEP.Primary.Ammo = "" -- Required for GMod legacy purposes. Don't remove unless you want to see your sword's ammo. Wat? SWEP.data = {} --Ignore this. --[[SWEP Info]] -- SWEP.Gun = "" -- must be the name of your swep but NO CAPITALS! SWEP.Category = "" SWEP.Base = "tfa_gun_base" SWEP.Author = "" SWEP.Contact = "" SWEP.Purpose = "" SWEP.Instructions = "Left click to slash" .. "\n" .. "Hold right mouse to put up guard." SWEP.PrintName = "Snowflake Katana" -- Weapon name (Shown on HUD) SWEP.Slot = 0 -- Slot in the weapon selection menu SWEP.SlotPos = 21 -- Position in the slot SWEP.DrawAmmo = false -- Should draw the default HL2 ammo counter SWEP.DrawWeaponInfoBox = true -- Should draw the weapon info box SWEP.BounceWeaponIcon = false -- Should the weapon icon bounce? SWEP.DrawCrosshair = false -- set false if you want no crosshair SWEP.Weight = 50 -- rank relative ot other weapons. bigger is better SWEP.AutoSwitchTo = true -- Auto switch to if we pick it up SWEP.AutoSwitchFrom = true -- Auto switch from if you pick up a better weapon SWEP.Secondary.OwnerFOV = 90 -- How much you "zoom" in. Less is more! Don't have this be <= 0 SWEP.WeaponLength = 8 --16 = 1 foot SWEP.MoveSpeed = 0.9 --Multiply the player's movespeed by this. SWEP.IronSightsMoveSpeed = 0.8 --Multiply the player's movespeed by this when sighting. SWEP.IsMelee = true SWEP.AllowSprintAttack = true --[[TTT CRAP]] -- -- SWEP.Kind = WEAPON_EQUIP SWEP.Secondary.ClipSize = -1 SWEP.Secondary.DefaultClip = -1 SWEP.Primary.ClipSize = -1 SWEP.Primary.DefaultClip = -1 -- SWEP.CanBuy = {ROLE_TRAITOR, ROLE_DETECTIVE, ROLE_INNOCENT} -- only traitors can buy -- SWEP.LimitedStock = true -- only buyable once -- SWEP.NoSights = false -- SWEP.IsSilent = true --[[Worldmodel Variables]] -- SWEP.HoldType = "melee2" -- how others view you carrying the weapon SWEP.BlockHoldType = "slam" -- how others view you carrying the weapon, while blocking --[[ Options: normal - Pistol Idle / Weaponless, hands at sides melee - One Handed Melee melee2 - Two Handed Melee fist - Fists Raised knife - Knife/Dagger style melee. Kind of hunched. smg - SMG or Rifle with grip ar2 - Rifle pistol - One handed pistol rpg - Used for RPGs or sometimes snipers. AFAIK has no reload anim. physgun - Used for physgun. Kind of like SLAM, but holding a grip. grenade - Used for nades, kind of similar to melee but more of a throwing animation. shotgun - Used for shotugns, and really that's it. crossbow -Similar to shotgun, but aimed. Used for crossbows. slam - Holding an explosive or other rectangular object with two hands passive -- SMG idle, like you can see with some HL2 citizens magic - One hand to temple, the other reaching out. Can be used to mimic blocking a melee, if you're OK with the temple-hand-thing. duel- dual pistols revolver - 2 handed pistol --]] SWEP.WorldModel = "" -- Weapon world model SWEP.ShowWorldModel = true --Draw the world model? SWEP.Spawnable = false --Can it be spawned by a user? SWEP.AdminSpawnable = false --Can it be spawned by an admin? --[[Viewmodel Variables]] -- SWEP.UseHands = true --Uses c_hands? If you port a model directly from HL2, CS:S, etc. then set to false SWEP.ViewModelFOV = 60 --This controls the viewmodel FOV. The larger, the smaller it appears. Decrease if you can see something you shouldn't. SWEP.ViewModelFlip = false --Flip the viewmodel? Usually gonna be yes for CS:S ports. SWEP.ViewModel = "" -- Weapon view model --[[Shooting/Attacking Vars]] -- SWEP.Primary.Damage = 200 -- Base damage per bullet SWEP.DamageType = DMG_SLASH SWEP.Primary.RPM = 180 -- This is in Rounds Per Minute SWEP.Primary.KickUp = 0.4 -- Maximum up recoil (rise) SWEP.Primary.KickDown = 0.3 -- Maximum down recoil (skeet) SWEP.Primary.KickHorizontal = 0.3 -- Maximum up recoil (stock) SWEP.Primary.Automatic = false -- Automatic = true; Semi Auto = false. In the case of our sword, if you can hold and keep swinging. SWEP.Primary.FiresUnderwater = true --Can you swing your sword underwater? --[[ Block Procedural Animation Variables]] -- SWEP.BlockPos = Vector(-18, -10, 3) --Blocking Position. SWEP.BlockAng = Vector(10, -25, -15) --Blocking Angle. --[[Begin Slashing Variables]] -- SWEP.Slash = 1 SWEP.Sequences = {} --Swinging Sequences --[[ SWEP.Sequences[1]={ name="swipe_u2d",--Sequence name, can be found in HLMV holdtype="melee2",--Holdtype (thirdperson type of weapon, usually gonna be melee for a one handed or melee2 for a two handed) startt=10/60,--swing start in seconds, from the sequence start endt=20/60,--swing end in seconds, from the sequence start pitch=5, --This is a component of the slash's arc. Pitch is added last, and changes based on the time of the trace. yaw=35, --This is a component of the slash's arc. Yaw is added second, and changes based on the time of the trace. roll=-90,--This is a component of the slash's arc. Roll is added first, and remains static. dir=1--Left to right = -1, right to left =1. Base this off if the roll were 0. } SWEP.Sequences[2]={ name="swipe_l2r", holdtype="melee2", startt=10/60, endt=20/60, pitch=5, yaw=45, roll=10, dir=-1 } SWEP.Sequences[3]={ name="swipe_r2l", holdtype="melee2", startt=10/60, endt=20/60, pitch=5, yaw=45, roll=-5, dir=1 } ]] -- SWEP.SlashRandom = Angle(5, 0, 10) --This is a random angle for the overall slash, added onto the sequence angle SWEP.SlashJitter = Angle(1, 1, 1) --This is jitter for each point of the slash SWEP.randfac = 0 --Don't change this, it's autocalculated SWEP.HitRange = 86 -- Blade Length. Set slightly longer to compensate for animation. SWEP.AmmoType = "TFMSwordHitGenericSlash" --Ammotype. You can set a damage type in a custom ammo, which you can create in autorun. Then set it to that custom ammotype here. SWEP.SlashPrecision = 15 --The number of traces per slash SWEP.SlashDecals = 8 --The number of decals per slash. May slightly vary SWEP.SlashSounds = 6 --The number of sounds per slash. May slightly vary. SWEP.LastTraceTime = 0 --Don't change this, it's autocalculated SWEP.NextPrimaryFire = 0 --In case SetNextPrimaryFire doesn't work. Don't change this here. Please. --[[Blocking Variables]] -- SWEP.BlockSequences = {} --Sequences for blocking --[[ SWEP.BlockSequences[1]={ name="swipe_u2d", --Sequence name, can be found in HLMV recoverytime=0.3, --Recovery Time (Added onto sequence time, if enabled) recoverysequence=false --Automatically add recovery time based on sequence length } SWEP.BlockSequences[2]={ name="swipe_l2r", recoverytime=0.3, recoverysequence=false } SWEP.BlockSequences[3]={ name="swipe_r2l", recoverytime=0.3, recoverysequence=false } ]] -- SWEP.DisableIdleAnimations = false --Disables idle animations. Set to false to enable them. SWEP.IronBobMult = 1 -- More is more bobbing, proportionally. This is multiplication, not addition. You want to make this < 1 for sighting, 0 to outright disable. SWEP.NinjaMode = false --Can block bullets/everything SWEP.DrawTime = 0.2 --Time you can't swing after drawing SWEP.BlockAngle = 135 --Think of the player's view direction as being the middle of a sector, with the sector's angle being this SWEP.BlockMaximum = 0.1 --Multiply damage by this for a maximumly effective block SWEP.BlockMinimum = 0.7 --Multiply damage by this for a minimumly effective block SWEP.BlockWindow = 0.5 --Time to absorb maximum damage SWEP.BlockFadeTime = 1 --Time for blocking to do minimum damage. Does not include block window SWEP.PrevBlocking = false --Don't change this, just related to the block procedural animation SWEP.BlockProceduralAnimTime = 0.15 --Change how slow or quickly the player moves their sword to block --[[Sounds]] -- --These are just kinda constants you can use. Don't change these, or do if you want to be lazy. SWEP.SlashSound = Sound("weapons/blades/woosh.mp3") --Weapon woosh/slash sound SWEP.KnifeShink = Sound("weapons/blades/hitwall.mp3") --When a knife hits a wall. Grating noise. SWEP.KnifeSlash = Sound("weapons/blades/slash.mp3") --Meaty slash SWEP.KnifeStab = Sound("weapons/blades/nastystab.mp3") --Meaty stab and pull-out SWEP.SwordChop = Sound("weapons/blades/swordchop.mp3") --Meaty impact, without the pull-out SWEP.SwordClash = Sound("weapons/blades/clash.mp3") --Sound played when you block something --[[ Edit These ]] -- SWEP.Primary.Sound = SWEP.SlashSound --Change this to your swing sound SWEP.Primary.Sound_Impact_Flesh = SWEP.SwordChop --Change this to your flesh hit sound SWEP.Primary.Sound_Impact_Generic = SWEP.KnifeShink --Change this to your generic hit sound SWEP.Primary.Sound_Impact_Metal = SWEP.SwordClash --Change this to your metal hit SWEP.Primary.Sound_Pitch_Low = 97 --Percentage of pitch out of 100, lowe end. Up to 255. SWEP.Primary.Sound_Pitch_High = 100 --Percentage of pitch out of 100 Up to 255. SWEP.Primary.Sound_World_Glass_Enabled = true --Override for glass? SWEP.Primary.Sound_Glass_Enabled = true --Override for glass? SWEP.Primary.Sound_Glass = Sound("impacts/glass_impact.wav") SWEP.GlassSoundPlayed = false -- DO NOT CHANGE THIS. It's automatically set. This way, it doesn't spam the glass sound. SWEP.ViewModelElements = {} --View elements SWEP.WorldModelElements = {} --World elements SWEP.sounds = 0 SWEP.Action = true --Use action IDs? --[[Stop editing here for normal users of my base. Code starts here.]]-- --[[ function SWEP:Precache() util.PrecacheSound(self.Primary_TFA.Sound) util.PrecacheModel(self.ViewModel) util.PrecacheModel(self.WorldModel) end ]]-- function SWEP:Deploy() self:SetNW2Float("SharedRandomVal", CurTime()) self:SetBlockStart(-1) self.PrevBlockRat = 0 BaseClass.Deploy(self) end function SWEP:SetupDataTables() BaseClass.SetupDataTables(self) self:NetworkVarTFA("Float", "BlockStart") end function SWEP:DoImpactEffect(tr, dmg) local impactpos, impactnormal impactpos = tr.HitPos impactnormal = tr.HitNormal self.sounds = self.sounds and self.sounds or 0 if (tr.HitSky == false) then if (util.SharedRandom(CurTime(), 1, self.SlashPrecision, "TFMSwordDecal") < self.SlashDecals) then util.Decal("ManhackCut", impactpos + impactnormal, impactpos - impactnormal) end if (tr.MatType == MAT_GLASS) and (self.Primary_TFA.Sound_Glass and self.Primary_TFA.Sound_Glass_Enabled == true) and (self.GlassSoundPlayed == false) then self:EmitSound(self.Primary_TFA.Sound_Glass, 100, math.random(self.Primary_TFA.Sound_Pitch_Low, self.Primary_TFA.Sound_Pitch_High), 0.75, CHAN_WEAPON) self.GlassSoundPlayed = true end end return true end function SWEP:HitThing(ent, posv, normalv, damage, tr) local ply ply = self:GetOwner() if IsValid(ply) then --[[ ply:LagCompensation(true) local tr,tres; tr={} tr.start=posv tr.endpos=posv+normalv*self.HitRange tr.filter=ply tr.mask=2147483647--MASK_SOLID && MASK_SHOT && MASK_VISIBLE_AND_NPCS--MASK_SHOT tres=util.TraceLine(tr) ply:LagCompensation(false) if tres.Hit and tres.Fraction<1 and !tres.HitSky then ]] -- local bullet = {} bullet.Num = 1 bullet.Src = posv -- Source bullet.Dir = normalv -- Dir of bullet bullet.Spread = vector_origin -- Aim Cone bullet.Tracer = 0 -- Show a tracer on every x bullets bullet.Force = damage / 16 -- Amount of force to give to phys objects bullet.Damage = damage bullet.Distance = self.HitRange bullet.HullSize = self.WeaponLength / self.SlashPrecision bullet.AmmoType = self.AmmoType bullet.Callback = function(a, b, c) local wep = a:GetActiveWeapon() if not IsValid(self) then return end if not self.sounds then return end c:SetDamageType(self.DamageType) if (self.sounds < self.SlashSounds) then local hitmat = b.MatType if (hitmat == MAT_METAL or hitmat == MAT_GRATE or hitmat == MAT_VENT or hitmat == MAT_COMPUTER) then --Emit metal sound wep.Weapon:EmitSound(self.Primary_TFA.Sound_Impact_Metal, 100, math.random(self.Primary_TFA.Sound_Pitch_Low, self.Primary_TFA.Sound_Pitch_High), 0.75, CHAN_AUTO) wep.sounds = self.sounds + 1 --Emit flesh sound --Emit generic sound. elseif (hitmat == MAT_FLESH or hitmat == MAT_BLOODYFLESH or hitmat == MAT_ALIENFLESH) then wep.Weapon:EmitSound(self.Primary_TFA.Sound_Impact_Flesh, 100, math.random(self.Primary_TFA.Sound_Pitch_Low, self.Primary_TFA.Sound_Pitch_High), 0.75, CHAN_AUTO) wep.sounds = self.sounds + 1 else wep.Weapon:EmitSound(self.Primary_TFA.Sound_Impact_Generic, 100, math.random(self.Primary_TFA.Sound_Pitch_Low, self.Primary_TFA.Sound_Pitch_High), 0.75, CHAN_AUTO) wep.sounds = self.sounds + 1 end end end if CLIENT and SERVER then if self:GetOwner() ~= LocalPlayer() then self:GetOwner():FireBullets(bullet) end else self:GetOwner():FireBullets(bullet) end --end end end function SWEP:PrimaryAttack() local sharedrandomval = self:GetNW2Float("SharedRandomVal", 0) math.randomseed(sharedrandomval) if CLIENT and not IsFirstTimePredicted() then return end if not self:OwnerIsValid() then return end if CurTime() < self:GetNextPrimaryFire() then return end if not TFA.Enum.ReadyStatus[self:GetStatus()] then return end if self:IsSafety() then return end self:SetStatus(TFA.Enum.STATUS_SHOOTING) self.sounds = 0 self:ChooseShootAnim() -- View model animation if SERVER then timer.Simple(0, function() if IsValid(self) then self:SetNW2Float("SharedRandomVal", math.Rand(-1024, 1024)) end end) end local vm = self:GetOwner():GetViewModel() self:GetOwner():SetAnimation(PLAYER_ATTACK1) self:GetOwner():SetNW2Float("TFM_SwingStart", CurTime()) self:SetStatusEnd(CurTime() + vm:SequenceDuration(vm:LookupSequence(self.Sequences[self:GetNW2Int("Slash", 1)].name))) self.LastTraceTime = CurTime() + self.Sequences[self:GetNW2Int("Slash", 1)].startt self:SetNextPrimaryFire(CurTime() + 1 / (self.Primary_TFA.RPM / 60)) if SERVER then timer.Simple(self.Sequences[self:GetNW2Int("Slash", 1)].startt, function() if IsValid(self) and self.Primary_TFA.Sound then self:EmitSound(self.Primary_TFA.Sound) end end) end end local seq, swe local ft, len, strikepercent, swingprogress, sws local aimoff, jitfac local blockseqn, ply local vm function SWEP:IronSights() BaseClass.IronSights(self) ply = self:GetOwner() seq = self.Sequences[self:GetNW2Int("Slash", 1)] swe = ply:GetNW2Float("TFM_SwingStart", CurTime()) + seq.endt if CurTime() < swe then self:SetIronSightsRaw(false) end end function SWEP:Think2(...) BaseClass.Think2(self, ...) local isr = self:GetIronSightsProgress() ply = self:GetOwner() if self.PrevBlockRat and isr and self.PrevBlockRat <= 0.3 and isr > 0.3 then self:SetBlockStart(CurTime()) --print(CurTime()) end if isr and self.PrevBlockRat and isr < 0.1 and self.PrevBlockRat > 0.1 then self:SetBlockStart(-1) --print(-1) end self.PrevBlockRat = isr local stat = self:GetStatus() if stat == TFA.Enum.STATUS_SHOOTING then seq = self.Sequences[self:GetNW2Int("Slash", 1)] ft = CurTime() - self.LastTraceTime len = seq.endt - seq.startt strikepercent = ft / len sws = ply:GetNW2Float("TFM_SwingStart", CurTime()) + seq.startt swe = ply:GetNW2Float("TFM_SwingStart", CurTime()) + seq.endt swingprogress = (CurTime() - sws) / len if CurTime() < swe then self:SetIronSightsRaw(false) end if (CurTime() > sws) and CurTime() < swe and ft > len / self.SlashPrecision and (strikepercent > 0) then aimoff = ply:EyeAngles() --aimoff = Angle(0,0,0) local cutangle = Angle(seq.pitch * (swingprogress - 0.5) * seq.dir, seq.yaw * (swingprogress - 0.5) * seq.dir, seq.roll) jitfac = 0.5 - util.SharedRandom("TFMSwordJitter", 0, 1, CurTime()) aimoff:RotateAroundAxis(aimoff:Forward(), cutangle.r + self.SlashRandom.r * self.randfac + self.SlashJitter.r * jitfac) --Roll is static aimoff:RotateAroundAxis(aimoff:Up(), cutangle.y + self.SlashRandom.y * self.randfac + self.SlashJitter.y * jitfac) aimoff:RotateAroundAxis(aimoff:Right(), cutangle.p + self.SlashRandom.p * self.randfac + self.SlashJitter.p * jitfac) self:HitThing(ply, ply:GetShootPos(), aimoff:Forward(), self.Primary_TFA.Damage * strikepercent) self.LastTraceTime = CurTime() end end end function SWEP:ChooseShootAnim(mynewvar) local sharedrandomval = self:GetNW2Float("SharedRandomVal", 0) if not self:OwnerIsValid() then return end if not IsValid(self) or not self:OwnerIsValid() then return end ply = self:GetOwner() vm = ply:GetViewModel() local selection = {} local relativedir = WorldToLocal(ply:GetVelocity(), Angle(0, 0, 0), vector_origin, ply:EyeAngles()) local fwd = relativedir.x local hor = relativedir.y if hor < -ply:GetWalkSpeed() / 2 then for k, v in pairs(self.Sequences) do if v.right then table.insert(selection, #selection + 1, k) end end elseif hor > ply:GetWalkSpeed() / 2 then for k, v in pairs(self.Sequences) do if v.left then table.insert(selection, #selection + 1, k) end end elseif fwd > ply:GetWalkSpeed() / 2 then for k, v in pairs(self.Sequences) do if (v.up) then table.insert(selection, #selection + 1, k) end end elseif fwd < ply:GetWalkSpeed() / 2 then for k, v in pairs(self.Sequences) do if (v.down) then table.insert(selection, #selection + 1, k) end end end if #selection <= 0 and math.abs(fwd) < ply:GetWalkSpeed() / 2 and math.abs(hor) < ply:GetWalkSpeed() / 2 then for k, v in pairs(self.Sequences) do if v.up or v.down then table.insert(selection, #selection + 1, k) end end end if #selection <= 0 and math.abs(hor) < ply:GetWalkSpeed() / 2 and math.abs(fwd) < ply:GetWalkSpeed() / 2 then for k, v in pairs(self.Sequences) do if v.standing then table.insert(selection, #selection + 1, k) end end end if #selection <= 0 then --print("random test:") math.randomseed(sharedrandomval) if math.random(0, 1) == 0 then math.randomseed(sharedrandomval) self:SetNW2Int("Slash", math.random(1, #self.Sequences)) else self:SetNW2Int("Slash", self:GetNW2Int("Slash", 1) + 1) if self:GetNW2Int("Slash", 1) > #self.Sequences then self:SetNW2Int("Slash", 1) end end --print("selection sequence") --print(math.Round( util.SharedRandom( "TFAMelee", 1, #selection, sharedrandomval ) )) else math.randomseed(sharedrandomval) self:SetNW2Int("Slash", selection[math.random(1, #selection)]) end --print("Shared Random Value:") --print(sharedrandomval) --print("Slash Number") --print(self:GetNW2Int("Slash",0)) local n = tonumber(mynewvar and mynewvar or "") local seqn = n and n or self:GetNW2Int("Slash", 1) --self.Weapon:SendWeaponAnim( ACT_VM_IDLE ) seq = self.Sequences[seqn] --vm:ResetSequence(vm:LookupSequence(seq.name)) --print(seq.name) local seqid = vm:LookupSequence(seq.name) seqid = seqid and seqid or 0 local actid = vm:GetSequenceActivity(seqid) if actid and actid >= 0 and self.Action then self:SendViewModelAnim(actid) --vm:SendViewModelMatchingSequence(seqid) else self:SendViewModelSeq(seqid) end if SERVER and game.SinglePlayer() then self:CallOnClient("ChooseShootAnim", tostring(seqn)) end return true, ACT_VM_PRIMARYATTACK end function SWEP:BlockAnim() local sharedrandomval = self:GetNW2Float("SharedRandomVal", 0) if self.BlockSequences and #self.BlockSequences > 0 then math.randomseed(sharedrandomval) blockseqn = math.random(1, #self.BlockSequences) seq = self.BlockSequences[blockseqn] ply = self:GetOwner() if IsValid(ply) then vm = ply:GetViewModel() if IsValid(vm) then self:SetNextIdleAnim(-1) self:SendWeaponAnim(ACT_VM_IDLE) vm:SendViewModelMatchingSequence(vm:LookupSequence(seq.name)) if seq.recoverysequence and seq.recoverysequence == true then if seq.recoverytime then self.NextPrimaryFire = CurTime() + vm:SequenceDuration() + seq.recoverytime self:SetNextPrimaryFire(CurTime() + vm:SequenceDuration() + seq.recoverytime) self:SetStatus(TFA.Enum.STATUS_FIDGET) self:SetStatusEnd(self.NextPrimaryFire) else self.NextPrimaryFire = CurTime() + vm:SequenceDuration() self:SetNextPrimaryFire(CurTime() + vm:SequenceDuration()) self:SetStatus(TFA.Enum.STATUS_FIDGET) self:SetStatusEnd(self.NextPrimaryFire) end else self.NextPrimaryFire = CurTime() + seq.recoverytime if seq.recoverytime then self.NextPrimaryFire = CurTime() + seq.recoverytime self:SetNextPrimaryFire(CurTime() + seq.recoverytime) else self.NextPrimaryFire = CurTime() self:SetNextPrimaryFire(CurTime()) end end end end end end