• Limiting ammo on a SWEP
    2 replies, posted
Hey guys; I am trying to implement this sandbox SWEP C4 into a gameserver, and right now it works absolutely fine except that players have infinite ammo. How would I go about 1. Setting an ammo cap 2. Making sure that players cannot throw out another c4 if they dont have the ammo for it. If anyone is wondering, the c4 works by right clicking to throw out c4 and left clicking to detonate all c4 entities (in a chain) [lua]AddCSLuaFile( "shared.lua" ) SWEP.Author = "Hoff" SWEP.Instructions = "" SWEP.Category = "CoD Multiplayer" SWEP.Spawnable = true SWEP.AdminSpawnable = true SWEP.ViewModel = "models/hoff/weapons/seal6_c4/v_c4.mdl" SWEP.WorldModel = "models/hoff/weapons/seal6_c4/w_c4_0-5.mdl" SWEP.ViewModelFOV = 70 SWEP.Primary.ClipSize = -1 SWEP.Primary.DefaultClip = -1 SWEP.Primary.Automatic = true SWEP.Primary.Ammo = "slam" SWEP.Primary.Delay = 1 SWEP.Secondary.ClipSize = 4 SWEP.Secondary.DefaultClip = 4 SWEP.Secondary.Automatic = true SWEP.Secondary.Ammo = "none" SWEP.Weight = 5 SWEP.AutoSwitchTo = false SWEP.AutoSwitchFrom = false SWEP.PrintName = "C4" SWEP.Slot = 4 SWEP.SlotPos = 1 SWEP.DrawAmmo = false SWEP.DrawCrosshair = false hook.Add("Initialize","createc4convar",function() if ConVarExists( "c4_infinite" ) == false then CreateConVar("c4_infinite", 1) end end) SWEP.Offset = { Pos = { Up = 0, Right = -2, Forward = 0, }, Ang = { Up = 0, Right = 0, Forward = -45, } } function SWEP:DrawWorldModel( ) local hand, offset, rotate if not IsValid( self.Owner ) then self:DrawModel( ) return end if not self.Hand then self.Hand = self.Owner:LookupAttachment( "anim_attachment_rh" ) end hand = self.Owner:GetAttachment( self.Hand ) if not hand then self:DrawModel( ) return end offset = hand.Ang:Right( ) * self.Offset.Pos.Right + hand.Ang:Forward( ) * self.Offset.Pos.Forward + hand.Ang:Up( ) * self.Offset.Pos.Up hand.Ang:RotateAroundAxis( hand.Ang:Right( ), self.Offset.Ang.Right ) hand.Ang:RotateAroundAxis( hand.Ang:Forward( ), self.Offset.Ang.Forward ) hand.Ang:RotateAroundAxis( hand.Ang:Up( ), self.Offset.Ang.Up ) self:SetRenderOrigin( hand.Pos + offset ) self:SetRenderAngles( hand.Ang ) self:DrawModel( ) end function SWEP:Deploy() self.Owner.C4s = self.Owner.C4s or {} --self:SetModelScale( 0.35, 0 ) end local reg = debug.getregistry() local GetVelocity = reg.Entity.GetVelocity local Length = reg.Vector.Length local GetAimVector = reg.Player.GetAimVector local inRun = false function SWEP:Think() vel = Length(GetVelocity(self.Owner)) if self.Owner:OnGround() then if !inRun and vel > 2.4 and self.Owner:KeyDown(IN_SPEED) then self.Weapon:SendWeaponAnim(ACT_VM_PULLPIN) inRun = true elseif( inRun and !self.Owner:KeyDown(IN_SPEED) ) then self:SendWeaponAnim(ACT_VM_IDLE) inRun = false end end end function SWEP:Equip(NewOwner) if GetConVar("c4_infinite") == 0 then self.Owner:GiveAmmo(5,"slam") end end function SWEP:PrimaryAttack() self:SendWeaponAnim(ACT_VM_PRIMARYATTACK) timer.Simple(0.1,function() if IsValid(self) then self:EmitSound("hoff/mpl/seal_c4/c4_click.wav") end end) if self.Owner:Alive() and self.Owner:IsValid() then -- thanks chief tiger local Owner = self.Owner if SERVER then for k, v in pairs( Owner.C4s ) do timer.Simple( .05 * k, function() if IsValid( v ) then v:Explode() end table.remove( Owner.C4s, k ) end ) end end end self:SetNextPrimaryFire(CurTime() + 1.1) self:SetNextSecondaryFire(CurTime() + 1.2) end function SWEP:SecondaryAttack() if GetConVar("c4_infinite") == 0 and GetConVar("c4_infinite") ~= nil then if ( self:Ammo1() <= 0 ) then return false end self:TakePrimaryAmmo(1) end self:SendWeaponAnim(ACT_VM_THROW) self:EmitSound("hoff/mpl/seal_c4/whoosh_00.wav") --self:TakePrimaryAmmo(1) local tr = self.Owner:GetEyeTrace() if SERVER then local ent = ents.Create("nz_cod-c4") ent:SetPos(self.Owner:GetShootPos()) ent:SetAngles(Angle(1,0,0)) ent:Spawn() ent.C4Owner = self.Owner local phys = ent:GetPhysicsObject() phys:SetMass(0.6) local shot_length = tr.HitPos:Length() local aimvector = self.Owner:GetAimVector() -- phys:ApplyForceCenter (self.Owner:GetAimVector():GetNormalized() * math.pow (shot_length, 3)); -- phys:ApplyForceCenter(aimvector*500000) phys:ApplyForceCenter( self.Owner:GetAimVector()*1500) local angvel = Vector(0,math.random(-5000,-2000),math.random(-100,-900)) //The positive z coordinate emulates the spin from a right-handed overhand throw angvel:Rotate(-1*ent:EyeAngles()) angvel:Rotate(Angle(0,self.Owner:EyeAngles().y,0)) phys:AddAngleVelocity(angvel) --ent:SetVelocity(ent:GetForward()*50000 + ent:GetRight()*50 + ent:GetUp()*50) ent:SetGravity(50) table.insert( self.Owner.C4s, ent ) end self:SetNextPrimaryFire(CurTime() + 1.1) self:SetNextSecondaryFire(CurTime() + 1.2) end function SWEP:ShouldDropOnDie() return false end function SWEP:Reload() self:SendWeaponAnim(ACT_VM_RELOAD) end function SWEP:DrawHUD() surface.SetDrawColor( 255, 255, 255, 255 ) surface.SetMaterial( Material("models/hoff/weapons/seal6_c4/c4_reticle.png") ) surface.DrawTexturedRect( ScrW() / 2 - 16, ScrH() / 2 - 16, 32, 32 ) end[/lua]
SWEP.Primary.ClipSize = -1 SWEP.Primary.DefaultClip = -1 SWEP.Primary.Automatic = true SWEP.Primary.Ammo = "slam" SWEP.Primary.Delay = 1 Make Clipsize and Default clip numbers other than a negative number.
1 already happens as long as the c4_infinite convar is set to 0. It's set to 1 when created on line 37, so change [code] CreateConVar("c4_infinite", 1) [/code] to [code] CreateConVar("c4_infinite", 0) [/code] To limit ammo you'd have to use the PlayerCanPickupWeapon hook afaik.
Sorry, you need to Log In to post a reply to this thread.