I'm trying to make a prop throwing Garry's Mod SWEP but I have a problem. Someone can just spam the gun and crash the game. So I did some research and found the timer.Simple library. So I tried and and it didn't work...
Here is my code:
[CODE]local ShootSound = "weapons/one piece/fist/pistal.mp3"
local DeploySound = "weapons/one piece/fist/Gomu Gomu no.mp3"
function SWEP:Deploy()
self:EmitSound( DeploySound )
end
function SWEP:PrimaryAttack()
-- This weapon is 'automatic'. This function call below defines
-- the rate of fire. Here we set it to shoot every 0.1 seconds.
self.Weapon:SetNextPrimaryFire( CurTime() + 0.1 )
-- Call 'ThrowChair' on self with this model
self:ThrowChair( "models/props/luffy/fist/fist.mdl" )
timer.Simple(4, function()
if self.ThrowChair:IsValid() then self.ThrowChair:Remove() end
end)
end
--
-- Called when the rightmouse button is pressed
--
function SWEP:SecondaryAttack()
-- Note we don't call SetNextSecondaryFire here because it's not
-- automatic and so we let them fire as fast as they can click.
-- Call 'ThrowChair' on self with this model
self:ThrowChair( "models/props/luffy/fist/fist.mdl" )
timer.Simple(4, function()
if self.ThrowChair:IsValid() then self.ThrowChair:Remove() end
end)
end
--
-- A custom function we added. When you call this the player will fire a chair!
--
function SWEP:ThrowChair( model_file )
--
-- Play the shoot sound we precached earlier!
--
self:EmitSound( ShootSound )
--
-- If we're the client then this is as much as we want to do.
-- We play the sound above on the client due to prediction.
-- ( if we didn't they would feel a ping delay during multiplayer )
--
if ( CLIENT ) then return end
--
-- Create a prop_physics entity
--
local ent = ents.Create( "prop_physics" )
--
-- Always make sure that created entities are actually created!
--
if ( !IsValid( ent ) ) then return end
--
-- Set the entity's model to the passed in model
--
ent:SetModel( model_file )
--
-- Set the position to the player's eye position plus 16 units forward.
-- Set the angles to the player'e eye angles. Then spawn it.
--
ent:SetPos( self.Owner:EyePos() + ( self.Owner:GetAimVector() * 16 ) )
ent:SetAngles( self.Owner:EyeAngles() )
ent:Spawn()
--
-- Now get the physics object. Whenever we get a physics object
-- we need to test to make sure its valid before using it.
-- If it isn't then we'll remove the entity.
--
local phys = ent:GetPhysicsObject()
if ( !IsValid( phys ) ) then ent:Remove() return end
--
-- Now we apply the force - so the chair actually throws instead
-- of just falling to the ground. You can play with this value here
-- to adjust how fast we throw it.
--
local velocity = self.Owner:GetAimVector()
velocity = velocity * 10000
velocity = velocity + ( VectorRand() * 100 ) -- a random element
phys:ApplyForceCenter( velocity )
--
-- Assuming we're playing in Sandbox mode we want to add this
-- entity to the cleanup and undo lists. This is done like so.
--
cleanup.Add( self.Owner, "props", ent )
undo.Create( "Thrown_punch" )
undo.AddEntity( ent )
undo.SetPlayer( self.Owner )
undo.Finish()
end[/CODE]
Here is were the timer.Simple code is:
[CODE]function SWEP:PrimaryAttack()
-- This weapon is 'automatic'. This function call below defines
-- the rate of fire. Here we set it to shoot every 0.1 seconds.
self.Weapon:SetNextPrimaryFire( CurTime() + 0.1 )
-- Call 'ThrowChair' on self with this model
self:ThrowChair( "models/props/luffy/fist/fist.mdl" )
timer.Simple(4, function()
if self.ThrowChair:IsValid() then self.ThrowChair:Remove() end
end)
end
--
-- Called when the rightmouse button is pressed
--
function SWEP:SecondaryAttack()
-- Note we don't call SetNextSecondaryFire here because it's not
-- automatic and so we let them fire as fast as they can click.
-- Call 'ThrowChair' on self with this model
self:ThrowChair( "models/props/luffy/fist/fist.mdl" )
timer.Simple(4, function()
if self.ThrowChair:IsValid() then self.ThrowChair:Remove() end
end)
end[/CODE]
self.ThrowChair is the function that throws the chair, not the chair entity itself. If I were doing this I'd create the timer in the `ThrowChair` function where the ent is available.
[QUOTE=bigdogmat;50265289]self.ThrowChair is the function that throws the chair, not the chair entity itself. If I were doing this I'd create the timer in the `ThrowChair` function where the ent is available.[/QUOTE]
I didn't work.
[CODE]function SWEP:ThrowChair( model_file )
--
-- Play the shoot sound we precached earlier!
--
self:EmitSound( ShootSound )
--
-- If we're the client then this is as much as we want to do.
-- We play the sound above on the client due to prediction.
-- ( if we didn't they would feel a ping delay during multiplayer )
--
if ( CLIENT ) then return end
--
-- Create a prop_physics entity
--
local ent = ents.Create( "prop_physics" )
--
-- Always make sure that created entities are actually created!
--
if ( !IsValid( ent ) ) then return end
--
-- Set the entity's model to the passed in model
--
ent:SetModel( model_file )
--
-- Set the position to the player's eye position plus 16 units forward.
-- Set the angles to the player'e eye angles. Then spawn it.
--
ent:SetPos( self.Owner:EyePos() + ( self.Owner:GetAimVector() * 16 ) )
ent:SetAngles( self.Owner:EyeAngles() )
ent:Spawn()
--
-- Now get the physics object. Whenever we get a physics object
-- we need to test to make sure its valid before using it.
-- If it isn't then we'll remove the entity.
--
local phys = ent:GetPhysicsObject()
if ( !IsValid( phys ) ) then ent:Remove() return end
--
-- Now we apply the force - so the chair actually throws instead
-- of just falling to the ground. You can play with this value here
-- to adjust how fast we throw it.
--
local velocity = self.Owner:GetAimVector()
velocity = velocity * 1000000000
velocity = velocity + ( VectorRand() * 1000 ) -- a random element
phys:ApplyForceCenter( velocity )
timer.Simple(2.5, function()
if self.ThrowChair:IsValid() then self.ThrowChair:Remove() end
end)
--
-- Assuming we're playing in Sandbox mode we want to add this
-- entity to the cleanup and undo lists. This is done like so.
--
cleanup.Add( self.Owner, "props", ent )
undo.Create( "Thrown_punch" )
undo.AddEntity( ent )
undo.SetPlayer( self.Owner )
undo.Finish()
end[/CODE]
[lua]
timer.Simple(2.5, function()
if ent:IsValid() then ent:Remove() end
end)
[/lua]
You still had it referencing the function, not the actual entity
[QUOTE=KingofBeast;50266167][lua]
timer.Simple(2.5, function()
if ent:IsValid() then ent:Remove() end
end)
[/lua]
You still had it referencing the function, not the actual entity[/QUOTE]
Thanks Beast! It worked!
Sorry, you need to Log In to post a reply to this thread.