mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
Upload
This commit is contained in:
339
lua/includes/extensions/player.lua
Normal file
339
lua/includes/extensions/player.lua
Normal file
@@ -0,0 +1,339 @@
|
||||
--[[
|
||||
| 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 )
|
||||
Reference in New Issue
Block a user