summaryrefslogtreecommitdiff
path: root/gamemode/server/entity_functions.lua
diff options
context:
space:
mode:
authorAlexander Pickering <alexandermpickering@gmail.com>2016-04-16 12:18:37 -0400
committerAlexander Pickering <alexandermpickering@gmail.com>2016-04-16 12:18:37 -0400
commitb24ba036889a644bb9505f61e3feeda370299c98 (patch)
tree69fd172a06e334cc7d3e9c8a117276c201bdda4d /gamemode/server/entity_functions.lua
parent7f35e4b7a2a7922dae8366f67ef8530f4a809c9f (diff)
downloadgmstranded-b24ba036889a644bb9505f61e3feeda370299c98.tar.gz
gmstranded-b24ba036889a644bb9505f61e3feeda370299c98.tar.bz2
gmstranded-b24ba036889a644bb9505f61e3feeda370299c98.zip
Moved entity function from init.lua to it's own file
Diffstat (limited to 'gamemode/server/entity_functions.lua')
-rw-r--r--gamemode/server/entity_functions.lua290
1 files changed, 290 insertions, 0 deletions
diff --git a/gamemode/server/entity_functions.lua b/gamemode/server/entity_functions.lua
new file mode 100644
index 0000000..89fced9
--- /dev/null
+++ b/gamemode/server/entity_functions.lua
@@ -0,0 +1,290 @@
+function EntityMeta:SetResourceDropInfo( strType, int )
+ timer.Simple( 0.5, function() self:SetResourceDropInfoInstant( strType, int ) end )
+end
+
+function EntityMeta:SetResourceDropInfoInstant( strType, int )
+ for k, v in pairs( player.GetAll() ) do
+ local strType = strType or "Error"
+ umsg.Start( "gms_SetResourceDropInfo", v )
+ umsg.String( self:EntIndex() )
+ umsg.String( string.gsub( strType, "_", " " ) )
+ umsg.Short( self.Amount )
+ umsg.End()
+ end
+end
+
+function EntityMeta:SetResPackInfo( strType, int )
+ for k, v in pairs( player.GetAll() ) do
+ local strType = strType or "Error"
+ umsg.Start( "gms_SetResPackInfo", v )
+ umsg.String( self:EntIndex() )
+ umsg.String( string.gsub( strType, "_", " " ) )
+ umsg.Short( int )
+ umsg.End()
+ end
+end
+
+
+function EntityMeta:SetFoodInfo( strType )
+ timer.Simple( 0.5, function() self:SetFoodInfoInstant( strType ) end )
+end
+
+function EntityMeta:SetFoodInfoInstant( strType )
+ for k, v in pairs( player.GetAll() ) do
+ local strType = strType or "Error"
+ umsg.Start( "gms_SetFoodDropInfo", v )
+ umsg.String( self:EntIndex() )
+ umsg.String( string.gsub( strType, "_", " " ) )
+ umsg.End()
+ end
+end
+
+function EntityMeta:DropToGround()
+ local trace = {}
+ trace.start = self:GetPos()
+ trace.endpos = trace.start + Vector( 0, 0, -100000 )
+ trace.mask = MASK_SOLID_BRUSHONLY
+ trace.filter = self
+
+ local tr = util.TraceLine( trace )
+
+ self:SetPos( tr.HitPos )
+end
+
+function GM.ReproduceTrees()
+ local GM = GAMEMODE
+ if ( GetConVarNumber( "gms_ReproduceTrees" ) == 1 ) then
+ local trees = {}
+ for k, v in pairs( ents.GetAll() ) do
+ if ( v:IsTreeModel() ) then
+ table.insert( trees, v )
+ end
+ end
+
+ if ( #trees < GetConVarNumber( "gms_MaxReproducedTrees" ) ) then
+ for k, ent in pairs( trees ) do
+ local num = math.random( 1, 3 )
+
+ if ( num == 1 ) then
+ local nearby = {}
+ for k, v in pairs( ents.FindInSphere( ent:GetPos(), 50 ) ) do
+ if ( v:GetClass() == "gms_seed" or v:IsProp() ) then
+ table.insert( nearby, v )
+ end
+ end
+
+ if ( #nearby < 3 ) then
+ local pos = ent:GetPos() + Vector( math.random( -500, 500 ), math.random( -500, 500 ), 0 )
+ local retries = 50
+
+ while ( ( pos:Distance( ent:GetPos() ) < 200 or GMS.ClassIsNearby( pos, "prop_physics", 100 ) ) and retries > 0 ) do
+ pos = ent:GetPos() + Vector( math.random( -300, 300 ),math.random( -300, 300 ), 0 )
+ retries = retries - 1
+ end
+
+ local pos = pos + Vector( 0, 0, 500 )
+
+ local seed = ents.Create( "gms_seed" )
+ seed:SetPos( pos )
+ seed:DropToGround()
+ seed:Setup( "tree", 180 )
+ seed:SetNetworkedString( "Owner", "World" )
+ seed:Spawn()
+ end
+ end
+ end
+ end
+ if ( #trees == 0 ) then
+ local info = {}
+ for i = 1, 20 do
+ info.pos = Vector( math.random( -10000, 10000 ), math.random( -10000, 10000 ), 1000 )
+ info.Retries = 50
+
+ --Find pos in world
+ while ( util.IsInWorld( info.pos ) == false and info.Retries > 0 ) do
+ info.pos = Vector( math.random( -10000, 10000 ),math.random( -10000, 10000 ), 1000 )
+ info.Retries = info.Retries - 1
+ end
+
+ --Find ground
+ local trace = {}
+ trace.start = info.pos
+ trace.endpos = trace.start + Vector( 0, 0, -100000 )
+ trace.mask = MASK_SOLID_BRUSHONLY
+
+ local groundtrace = util.TraceLine( trace )
+
+ --Assure space
+ local nearby = ents.FindInSphere( groundtrace.HitPos, 200 )
+ info.HasSpace = true
+
+ for k, v in pairs( nearby ) do
+ if ( v:IsProp() ) then
+ info.HasSpace = false
+ end
+ end
+
+ --Find sky
+ local trace = {}
+ trace.start = groundtrace.HitPos
+ trace.endpos = trace.start + Vector( 0, 0, 100000 )
+
+ local skytrace = util.TraceLine( trace )
+
+ --Find water?
+ local trace = {}
+ trace.start = groundtrace.HitPos
+ trace.endpos = trace.start + Vector( 0, 0, 1 )
+ trace.mask = MASK_WATER
+
+ local watertrace = util.TraceLine( trace )
+
+ --All a go, make entity
+ if ( info.HasSpace and skytrace.HitSky and !watertrace.Hit and ( groundtrace.MatType == MAT_DIRT or groundtrace.MatType == MAT_GRASS or groundtrace.MatType == MAT_SAND ) ) then
+ local seed = ents.Create( "gms_seed" )
+ seed:SetPos( groundtrace.HitPos )
+ seed:DropToGround()
+ seed:Setup( "tree", 180 + math.random( -20, 20 ) )
+ seed:SetNetworkedString( "Owner", "World" )
+ seed:Spawn()
+ end
+ end
+ end
+ end
+
+ timer.Simple( math.random( 1, 3 ) * 60, function() GM.ReproduceTrees() end )
+end
+timer.Simple( 60, function() GAMEMODE.ReproduceTrees() end )
+
+GMS.LootableNPCs = { "npc_antlion", "npc_antlionguard", "npc_crow", "npc_seagull", "npc_pigeon", "npc_zombie" }
+
+function EntityMeta:IsLootableNPC()
+ return table.HasValue( GMS.LootableNPCs, self:GetClass() )
+end
+
+function EntityMeta:MakeCampfire()
+ if ( GetConVarNumber( "gms_campfire" ) <= 0 ) then return end
+
+ local min, max = self:OBBMins(), self:OBBMaxs()
+ local vol = math.abs( max.x - min.x ) * math.abs( max.y - min.y ) * math.abs( max.z - min.z )
+ local mul = math.min( math.sqrt( vol ) / 200, 1 )
+
+ if ( !self.CampFire ) then self:SetHealth( 1337 ) end
+ self.CampFire = true
+
+ timer.Create( "gms_removecampfire_" .. self:EntIndex(), 480 * mul, 1, function() if ( IsValid( self ) ) then self:Fadeout() end end )
+
+ if ( GetConVarNumber( "gms_SpreadFire" ) >= 1 ) then
+ self:Ignite( 360, ( self:OBBMins() - self:OBBMaxs() ):Length() + 10 )
+ else
+ self:Ignite( 360, 0.001 )
+ end
+end
+
+/* ----------------------------------------------------------------------------------------------------
+ Entity Fading
+---------------------------------------------------------------------------------------------------- */
+
+GMS.FadingOutProps = {}
+GMS.FadingInProps = {}
+
+function EntityMeta:Fadeout( speed )
+ if ( !IsValid( self ) ) then return end
+ local speed = speed or 1
+
+ for k, v in pairs( player.GetAll() ) do
+ umsg.Start( "gms_CreateFadingProp", v )
+ umsg.String( self:GetModel() )
+ umsg.Vector( self:GetPos() )
+ local ang = self:GetAngles()
+ umsg.Vector( Vector( ang.p, ang.y, ang.r ) )
+ local col = self:GetColor()
+ umsg.Vector( Vector( col.r, col.g, col.b ) )
+ umsg.Short( math.Round( speed ) )
+ umsg.End()
+ end
+
+ self:Remove()
+end
+
+--Fadein is serverside
+function EntityMeta:Fadein( speed )
+ self.AlphaFade = 0
+ self:SetRenderMode( RENDERMODE_TRANSALPHA )
+ self:SetColor( Color( 255, 255, 255, 0 ) )
+ self.FadeInSpeed = speed or 4
+ table.insert( GMS.FadingInProps, self )
+end
+
+hook.Add( "Think", "gms_FadePropsThink", function()
+ for k, ent in pairs( GMS.FadingInProps ) do
+ if ( !ent or ent == NULL ) then
+ table.remove( GMS.FadingInProps, k )
+ elseif ( !IsValid( ent ) ) then
+ table.remove( GMS.FadingInProps, k )
+ elseif ( ent.AlphaFade >= 255 ) then
+ table.remove( GMS.FadingInProps, k )
+ else
+ ent.AlphaFade = ent.AlphaFade + ent.FadeInSpeed
+ ent:SetColor( Color( 255, 255, 255, ent.AlphaFade ) )
+ end
+ end
+end )
+
+/* ----------------------------------------------------------------------------------------------------
+ Entity rising / lowering ( Used by gms_seed )
+---------------------------------------------------------------------------------------------------- */
+
+GM.RisingProps = {}
+GM.SinkingProps = {}
+
+function EntityMeta:RiseFromGround( speed, altmax )
+ local speed = speed or 1
+ local max;
+
+ if ( !altmax ) then
+ min, max = self:WorldSpaceAABB()
+ max = max.z
+ else
+ max = altmax
+ end
+
+ local tbl = {}
+ tbl.Origin = self:GetPos().z
+ tbl.Speed = speed
+ tbl.Entity = self
+
+ self:SetPos( self:GetPos() + Vector( 0, 0, -max + 10 ) )
+ table.insert( GAMEMODE.RisingProps, tbl )
+end
+
+function EntityMeta:SinkIntoGround( speed )
+ local speed = speed or 1
+
+ local tbl = {}
+ tbl.Origin = self:GetPos().z
+ tbl.Speed = speed
+ tbl.Entity = self
+ tbl.Height = max
+
+ table.insert( GAMEMODE.SinkingProps, tbl )
+end
+
+hook.Add( "Think", "gms_RiseAndSinkPropsHook", function()
+ for k, tbl in pairs( GAMEMODE.RisingProps ) do
+ if ( !IsValid( tbl.Entity ) || tbl.Entity:GetPos().z >= tbl.Origin ) then
+ table.remove( GAMEMODE.RisingProps, k )
+ else
+ tbl.Entity:SetPos( tbl.Entity:GetPos() + Vector( 0, 0, 1 * tbl.Speed ) )
+ end
+ end
+
+ for k, tbl in pairs( GAMEMODE.SinkingProps ) do
+ if ( !IsValid( tbl.Entity ) || tbl.Entity:GetPos().z <= tbl.Origin - tbl.Height ) then
+ table.remove( GAMEMODE.SinkingProps, k )
+ tbl.Entity:Remove()
+ else
+ tbl.Entity:SetPos( tbl.Entity:GetPos() + Vector( 0, 0, -1 * tbl.Speed ) )
+ end
+ end
+end )