Common Code Snippets Entities
From GMod Wiki
This page contains code snippets for handling entities.
Contents |
Picking up a Weapon on use
This snippet makes it so that you can only pick up a weapon when holding the use key and looking directly at the weapon within a certain distance. It also has a pickup interval to make sure you don't pick up a whole pile of weapons all at once.
hook.Add( "PlayerSpawn", "PickupTimeout", function( ply ) ply.PickupTimeout = CurTime() + 0.5 end ) function GM:PlayerCanPickupWeapon( ply, entity ) if ( ply.PickupTimeout or 0 ) > CurTime() then return true end if ( ply.NextPickup or 0 ) > CurTime() then return false end if ply:KeyDown( IN_USE ) then local tr = ply:GetEyeTrace() if ValidEntity( tr.Entity ) and tr.Entity:GetPos():Distance( ply:GetShootPos() ) < 92 and tr.Entity == entity then ply.NextPickup = CurTime() + 0.5 return true end end return false end
Dropping a Weapon
Dropping a weapon, along with a table of weapons you may not drop.
function DropWeapon(ply, cmd, args) local undroppableWeapons = { "weapon_physcannon", "weapon_physgun", "gmod_camera", "gmod_tool" } local weapon = ply:GetActiveWeapon() if table.HasValue(undroppableWeapons, weapon:GetClass()) then return false end ply:DropWeapon(weapon) end concommand.Add("DropCurrentWeapon", DropWeapon)
Looping through Entities by Class using Wildcards
for k,v in pairs(ents.FindByClass("npc_*")) do //access every npc Msg(v:GetClass()) end for k,v in pairs(ents.FindByClass("prop_phys*")) do //access every type of physics prop (ie. prop_physics, prop_physics_override, etc.) Msg(v:GetClass()) end
Returning the Entity the Player is Looking At
On a clientside script:
local ent = LocalPlayer():GetEyeTrace().Entity if (ent:IsValid()) then //yup, its a valid entity! end
Returns the entity the specified player is looking at, if the entity is not valid it will return false
function TraceEntity(ply) local ent = ply:GetEyeTrace().Entity if ValidEntity(ent) then return ent end return false end
Finding an Entity
How to find an entity and store it for later use. NOTE: You have to call this function with an entity class you want. If there is more than one entity it will pick a random one. This snippet finds all npc's (using wildcard * )
FindTarget("npc_*") function FindTarget( target ) local targets = ents.FindByClass( target ) if (#targets > 1) then local randT = math.Rand( 1, #targets) return randT else return targets end end
Spawning an Entity
local ent = ents.Create( "npc_alyx" ) if ( !ent:IsValid() ) then return end ent:SetPos( tr.HitPos ) ent:Spawn() ent:Activate()
Spawning an Effect
util.Effect Takes the name of the effect and an effectdata type. The effectdata is accessible on the client when the effect is being rendered. So you only need to set the elements that the effect uses.
local effectdata = EffectData() effectdata:SetOrigin( Vector(0,0,0) ) effectdata:SetNormal( Vector(0,0,1) ) effectdata:SetScale( 50 ) util.Effect( "effect_name", effectdata )
Adding Entities to the Undo List
undo.Create("This is my Entity Name") undo.AddEntity( Ent1 ) undo.AddEntity( Ent2 ) undo.SetPlayer( Ply ) undo.Finish()
Deleting entities every 5 minutes
timer.Create( "removal", 300, 0, function() for k,v in ipairs(ents.FindByClass("class C_ClientRagdoll")) do v:Remove() end end) -- This will delete clientside ragdolls every 5 minutes when run on the client, but other classes and timings can be used.