From 7e5db609550cca0d8b8a76c4bf78ba4658962167 Mon Sep 17 00:00:00 2001 From: Alexander Pickering Date: Sat, 16 Apr 2016 02:02:00 -0400 Subject: Initial commit --- entities/weapons/bobs_shotty_base/shared.lua | 192 +++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 entities/weapons/bobs_shotty_base/shared.lua (limited to 'entities/weapons/bobs_shotty_base/shared.lua') diff --git a/entities/weapons/bobs_shotty_base/shared.lua b/entities/weapons/bobs_shotty_base/shared.lua new file mode 100644 index 0000000..dcfb499 --- /dev/null +++ b/entities/weapons/bobs_shotty_base/shared.lua @@ -0,0 +1,192 @@ +// Variables that are used on both client and server +-- Major thanks to rm-rf / for thinking up a solution to the reload glitch. Good man! + +SWEP.Category = "" +SWEP.Author = "Generic Default, Worshipper, Clavus, and Bob" +SWEP.Contact = "" +SWEP.Purpose = "" +SWEP.Instructions = "" +SWEP.Base = "bobs_gun_base" +SWEP.MuzzleAttachment = "1" // Should be "1" for CSS models or "muzzle" for hl2 models +SWEP.ShellEjectAttachment = "2" // Should be "2" for CSS models or "1" for hl2 models +SWEP.DrawCrosshair = true // Hell no, crosshairs r 4 nubz! +SWEP.ViewModelFOV = 65 // How big the gun will look +SWEP.ViewModelFlip = true // True for CSS models, False for HL2 models + +SWEP.Spawnable = false +SWEP.AdminSpawnable = false + +SWEP.Primary.Sound = Sound("") // Sound of the gun +SWEP.Primary.RPM = 0 // This is in Rounds Per Minute +SWEP.Primary.ClipSize = 0 // Size of a clip +SWEP.Primary.DefaultClip = 0 // Default number of bullets in a clip +SWEP.Primary.KickUp = 0 // Maximum up recoil (rise) +SWEP.Primary.KickDown = 0 // Maximum down recoil (skeet) +SWEP.Primary.KickHorizontal = 0 // Maximum side recoil (koolaid) +SWEP.Primary.Automatic = true // Automatic/Semi Auto +SWEP.Primary.Ammo = "none" // What kind of ammo +SWEP.Primary.Reloading = false // Reloading func + +-- SWEP.Secondary.ClipSize = 0 // Size of a clip +-- SWEP.Secondary.DefaultClip = 0 // Default number of bullets in a clip +-- SWEP.Secondary.Automatic = false // Automatic/Semi Auto +SWEP.Secondary.Ammo = "" +SWEP.Secondary.IronFOV = 0 // How much you 'zoom' in. Less is more! + +SWEP.data = {} -- The starting firemode +SWEP.data.ironsights = 1 + +SWEP.IronSightsPos = Vector (2.4537, 1.0923, 0.2696) +SWEP.IronSightsAng = Vector (0.0186, -0.0547, 0) + +SWEP.ShotgunReloading = false +SWEP.ShotgunFinish = 0.5 +SWEP.ShellTime = 0.35 +SWEP.InsertingShell = false + +SWEP.NextReload = 0 + +/*--------------------------------------------------------- + Name: SWEP:Think() + Desc: Called every frame. +---------------------------------------------------------*/ +function SWEP:Think() + if not IsValid(self) then return end + if not IsValid(self.Owner) then return end + if not self.Owner:IsPlayer() then return end + if self.Owner.NextReload == nil then self.Owner.NextReload = CurTime() + 1 end + local timerName = "ShotgunReload_" .. self.Owner:UniqueID() + --if the owner presses shoot while the timer is in effect, then... + if (self.Owner:KeyPressed(IN_ATTACK)) and (self.Weapon:GetNextPrimaryFire() <= CurTime()) and (timer.Exists(timerName)) and not (self.Owner:KeyDown(IN_SPEED)) then + if self:CanPrimaryAttack() then --well first, if we actually can attack, then... + + timer.Destroy(timerName) -- kill the timer, and + self:PrimaryAttack()-- ATTAAAAACK! + + end + end + + if self.InsertingShell == true and self.Owner:Alive() then + vm = self.Owner:GetViewModel()-- its a messy way to do it, but holy shit, it works! + vm:ResetSequence(vm:LookupSequence("after_reload")) -- Fuck you, garry, why the hell can't I reset a sequence in multiplayer? + vm:SetPlaybackRate(.01) -- or if I can, why does facepunch have to be such a shitty community, and your wiki have to be an unreadable goddamn mess? + self.InsertingShell = false -- You get paid for this, what's your excuse? + end + + self:IronSight() + +end + +/*--------------------------------------------------------- + Name: SWEP:Deploy() + Desc: Whip it out. +---------------------------------------------------------*/ +function SWEP:Deploy() + if not IsValid(self) then return end + if not IsValid(self.Owner) then return end + if not self.Owner:IsPlayer() then return end + + self:SetHoldType(self.HoldType) + + local timerName = "ShotgunReload_" .. self.Owner:UniqueID() + if (timer.Exists(timerName)) then + timer.Destroy(timerName) + end + + self.Weapon:SendWeaponAnim(ACT_VM_DRAW) + + self.Weapon:SetNextPrimaryFire(CurTime() + .25) + self.Weapon:SetNextSecondaryFire(CurTime() + .25) + self.ActionDelay = (CurTime() + .25) + + if (SERVER) then + self:SetIronsights(false) + end + + self.Owner.NextReload = CurTime() + 1 + + return true +end + +/*--------------------------------------------------------- + Name: SWEP:Reload() + Desc: Reload is being pressed. +---------------------------------------------------------*/ +function SWEP:Reload() + + if not IsValid(self) then return end + if not IsValid(self.Owner) then return end + if not self.Owner:IsPlayer() then return end + + local maxcap = self.Primary.ClipSize + local spaceavail = self.Weapon:Clip1() + local shellz = (maxcap) - (spaceavail) + 1 + + if (timer.Exists("ShotgunReload_" .. self.Owner:UniqueID())) or self.Owner.NextReload > CurTime() or maxcap == spaceavail then return end + + if self.Owner:IsPlayer() then + + if self.Weapon:GetNextPrimaryFire() <= (CurTime()+2) then + self.Weapon:SetNextPrimaryFire(CurTime() + 2) -- wait TWO seconds before you can shoot again + end + self.Weapon:SendWeaponAnim(ACT_SHOTGUN_RELOAD_START) -- sending start reload anim + self.Owner:SetAnimation( PLAYER_RELOAD ) + + self.Owner.NextReload = CurTime() + 1 + + if (SERVER) then + self.Owner:SetFOV( 0, 0.15 ) + self:SetIronsights(false) + end + + if SERVER and self.Owner:Alive() then + local timerName = "ShotgunReload_" .. self.Owner:UniqueID() + timer.Create(timerName, + (self.ShellTime + .05), + shellz, + function() if not IsValid(self) then return end + if IsValid(self.Owner) and IsValid(self.Weapon) then + if self.Owner:Alive() then + self:InsertShell() + end + end end) + end + + elseif self.Owner:IsNPC() then + self.Weapon:DefaultReload(ACT_VM_RELOAD) + end + +end + +function SWEP:InsertShell() + + if not IsValid(self) then return end + if not IsValid(self.Owner) then return end + if not self.Owner:IsPlayer() then return end + + local timerName = "ShotgunReload_" .. self.Owner:UniqueID() + if self.Owner:Alive() then + local curwep = self.Owner:GetActiveWeapon() + if curwep:GetClass() != self.Gun then + timer.Destroy(timerName) + return end + + if (self.Weapon:Clip1() >= self.Primary.ClipSize or self.Owner:GetAmmoCount(self.Primary.Ammo) <= 0) then + -- if clip is full or ammo is out, then... + self.Weapon:SendWeaponAnim(ACT_SHOTGUN_RELOAD_FINISH) -- send the pump anim + timer.Destroy(timerName) -- kill the timer + elseif (self.Weapon:Clip1() <= self.Primary.ClipSize and self.Owner:GetAmmoCount(self.Primary.Ammo) >= 0) then + self.InsertingShell = true --well, I tried! + timer.Simple( .05, function() self:ShellAnimCaller() end) + self.Owner:RemoveAmmo(1, self.Primary.Ammo, false) -- out of the frying pan + self.Weapon:SetClip1(self.Weapon:Clip1() + 1) -- into the fire + end + else + timer.Destroy(timerName) -- kill the timer + end + +end + +function SWEP:ShellAnimCaller() + self.Weapon:SendWeaponAnim(ACT_VM_RELOAD) +end -- cgit v1.2.3-70-g09d2