--[[ | This file was obtained through the combined efforts | of Madbluntz & Plymouth Antiquarian Society. | | Credits: lifestorm, Gregory Wayne Rossel JR., | Maloy, DrPepper10 @ RIP, Atle! | | Visit for more: https://plymouth.thetwilightzone.ru/ --]] local meta = FindMetaTable( "Player" ) local entity = FindMetaTable( "Entity" ) -- Return if there's nothing to add on to if ( !meta ) then return end -- -- Entity index accessor. This used to be done in engine, but it's done in Lua now because it's faster -- function meta:__index( key ) -- -- Search the metatable. We can do this without dipping into C, so we do it first. -- local val = meta[key] if ( val ~= nil ) then return val end -- -- Search the entity metatable -- local entval = entity[key] if ( entval ~= nil ) then return entval end -- -- Search the entity table -- local tab = entity.GetTable( self ) if ( tab ) then return tab[ key ] end return nil end if ( !sql.TableExists( "playerpdata" ) ) then sql.Query( "CREATE TABLE IF NOT EXISTS playerpdata ( infoid TEXT NOT NULL PRIMARY KEY, value TEXT );" ) end --[[--------------------------------------------------------- Name: DebugInfo Desc: Prints debug information for the player ( this is just an example ) -----------------------------------------------------------]] function meta:DebugInfo() Msg( "Name: " .. self:Name() .. "\n" ) Msg( "Pos: " .. tostring( self:GetPos() ) .. "\n" ) end -- Helpful aliases meta.GetName = meta.Nick meta.Name = meta.Nick --[[--------------------------------------------------------- Name: ConCommand Desc: Overrides the default ConCommand function -----------------------------------------------------------]] if ( CLIENT ) then local SendConCommand = meta.ConCommand local CommandList = nil function meta:ConCommand( command, bSkipQueue ) if ( bSkipQueue or IsConCommandBlocked( command ) ) then SendConCommand( self, command ) else CommandList = CommandList or {} table.insert( CommandList, command ) end end local function SendQueuedConsoleCommands() if ( !CommandList ) then return end local BytesSent = 0 for k, v in pairs( CommandList ) do SendConCommand( LocalPlayer(), v ) CommandList[ k ] = nil -- Only send x bytes per tick BytesSent = BytesSent + v:len() if ( BytesSent > 128 ) then break end end -- Turn the table into a nil so we can return easy if ( table.IsEmpty( CommandList ) ) then CommandList = nil end end hook.Add( "Tick", "SendQueuedConsoleCommands", SendQueuedConsoleCommands ) end --[[--------------------------------------------------------- GetPData Saves persist data for this player -----------------------------------------------------------]] function meta:GetPData( name, default ) -- First try looking up using the new key local key = Format( "%s[%s]", self:SteamID64(), name ) local val = sql.QueryValue( "SELECT value FROM playerpdata WHERE infoid = " .. SQLStr( key ) .. " LIMIT 1" ) if ( val == nil ) then -- Not found? Look using the old key local oldkey = Format( "%s[%s]", self:UniqueID(), name ) val = sql.QueryValue( "SELECT value FROM playerpdata WHERE infoid = " .. SQLStr( oldkey ) .. " LIMIT 1" ) if ( val == nil ) then return default end end return val end --[[--------------------------------------------------------- SetPData Set persistant data -----------------------------------------------------------]] function meta:SetPData( name, value ) -- Remove old value local oldkey = Format( "%s[%s]", self:UniqueID(), name ) sql.Query( "DELETE FROM playerpdata WHERE infoid = " .. SQLStr( oldkey ) ) local key = Format( "%s[%s]", self:SteamID64(), name ) return sql.Query( "REPLACE INTO playerpdata ( infoid, value ) VALUES ( " .. SQLStr( key ) .. ", " .. SQLStr( value ) .. " )" ) ~= false end --[[--------------------------------------------------------- RemovePData Remove persistant data -----------------------------------------------------------]] function meta:RemovePData( name ) -- First old key local oldkey = Format( "%s[%s]", self:UniqueID(), name ) local removed = sql.Query( "DELETE FROM playerpdata WHERE infoid = " .. SQLStr( oldkey ) ) ~= false -- Then new key local key = Format( "%s[%s]", self:SteamID64(), name ) local removed2 = sql.Query( "DELETE FROM playerpdata WHERE infoid = " .. SQLStr( key ) ) ~= false return removed or removed2 end -- -- If they have their preferred default weapon then switch to it -- function meta:SwitchToDefaultWeapon() local weapon = self:GetInfo( "cl_defaultweapon" ) if ( self:HasWeapon( weapon ) ) then self:SelectWeapon( weapon ) end end -- -- Can use flashlight? -- function meta:AllowFlashlight( bAble ) self.m_bFlashlight = bAble end function meta:CanUseFlashlight() return self.m_bFlashlight == true end -- A function to set up player hands, so coders don't have to copy all the code everytime. -- Call this in PlayerSpawn hook function meta:SetupHands( ply ) local oldhands = self:GetHands() if ( IsValid( oldhands ) ) then oldhands:Remove() end local hands = ents.Create( "gmod_hands" ) if ( IsValid( hands ) ) then hands:DoSetup( self, ply ) hands:Spawn() end end -- -- Those functions have been removed from the engine since AddFlag and RemoveFlag -- made them obsolete, but we'll keep a Lua version of them for backward compatibility -- if ( SERVER ) then --[[--------------------------------------------------------- Freeze Freezes or unfreezes the player -----------------------------------------------------------]] function meta:Freeze( b ) if ( b ) then self:AddFlags( FL_FROZEN ) else self:RemoveFlags( FL_FROZEN ) end end --[[--------------------------------------------------------- GodEnable Enables godmode on the player -----------------------------------------------------------]] function meta:GodEnable() self:AddFlags( FL_GODMODE ) end --[[--------------------------------------------------------- GodDisable Disables godmode on the player -----------------------------------------------------------]] function meta:GodDisable() self:RemoveFlags( FL_GODMODE ) end end --[[--------------------------------------------------------- IsFrozen Returns true if the player is frozen -----------------------------------------------------------]] function meta:IsFrozen() return self:IsFlagSet( FL_FROZEN ) end --[[--------------------------------------------------------- HasGodMode Returns true if the player is in godmode -----------------------------------------------------------]] function meta:HasGodMode() return self:IsFlagSet( FL_GODMODE ) end -- These are totally in the wrong place. function player.GetByAccountID( ID ) local players = player.GetAll() for i = 1, #players do if ( players[i]:AccountID() == ID ) then return players[i] end end return false end function player.GetByUniqueID( ID ) local players = player.GetAll() for i = 1, #players do if ( players[i]:UniqueID() == ID ) then return players[i] end end return false end function player.GetBySteamID( ID ) ID = string.upper( ID ) local players = player.GetAll() for i = 1, #players do if ( players[i]:SteamID() == ID ) then return players[i] end end return false end function player.GetBySteamID64( ID ) ID = tostring( ID ) local players = player.GetAll() for i = 1, #players do if ( players[i]:SteamID64() == ID ) then return players[i] end end return false end local inext = ipairs( {} ) local PlayerCache = nil function player.Iterator() if ( PlayerCache == nil ) then PlayerCache = player.GetAll() end return inext, PlayerCache, 0 end local function InvalidatePlayerCache( ent ) if ( ent:IsPlayer() ) then PlayerCache = nil end end hook.Add( "OnEntityCreated", "player.Iterator", InvalidatePlayerCache ) hook.Add( "EntityRemoved", "player.Iterator", InvalidatePlayerCache )