324 lines
6.9 KiB
Lua
324 lines
6.9 KiB
Lua
/*
|
|
____ _ _ ____ __ __ _ _
|
|
/ ___|___ __| | ___ __| | | __ ) _ _ | \/ | __ _| | |__ ___ _ __ ___
|
|
| | / _ \ / _` |/ _ \/ _` | | _ \| | | | | |\/| |/ _` | | '_ \ / _ \| '__/ _ \
|
|
| |__| (_) | (_| | __/ (_| | | |_) | |_| | | | | | (_| | | |_) | (_) | | | (_) |
|
|
\____\___/ \__,_|\___|\__,_| |____/ \__, | |_| |_|\__,_|_|_.__/ \___/|_| \___/
|
|
|___/
|
|
*/
|
|
|
|
if not PermaProps then PermaProps = {} end
|
|
|
|
function PermaProps.PPGetEntTable( ent )
|
|
|
|
if !ent or !ent:IsValid() then return false end
|
|
|
|
local content = {}
|
|
content.Class = ent:GetClass()
|
|
content.Pos = ent:GetPos()
|
|
content.Angle = ent:GetAngles()
|
|
content.Model = ent:GetModel()
|
|
content.Skin = ent:GetSkin()
|
|
//content.Mins, content.Maxs = ent:GetCollisionBounds()
|
|
content.ColGroup = ent:GetCollisionGroup()
|
|
content.Name = ent:GetName()
|
|
content.ModelScale = ent:GetModelScale()
|
|
content.Color = ent:GetColor()
|
|
content.Material = ent:GetMaterial()
|
|
content.Solid = ent:GetSolid()
|
|
content.RenderMode = ent:GetRenderMode()
|
|
|
|
if PermaProps.SpecialENTSSave[ent:GetClass()] != nil and isfunction(PermaProps.SpecialENTSSave[ent:GetClass()]) then
|
|
|
|
local othercontent = PermaProps.SpecialENTSSave[ent:GetClass()](ent)
|
|
if not othercontent then return false end
|
|
if othercontent != nil and istable(othercontent) then
|
|
table.Merge(content, othercontent)
|
|
end
|
|
|
|
end
|
|
|
|
do
|
|
local othercontent = hook.Run("PermaProps.OnEntitySaved", ent)
|
|
if othercontent and istable(othercontent) then
|
|
table.Merge(content, othercontent)
|
|
end
|
|
end
|
|
|
|
if ( ent.GetNetworkVars ) then
|
|
content.DT = ent:GetNetworkVars()
|
|
end
|
|
|
|
local sm = ent:GetMaterials()
|
|
if ( sm and istable(sm) ) then
|
|
|
|
for k, v in pairs( sm ) do
|
|
|
|
if ( ent:GetSubMaterial( k )) then
|
|
|
|
content.SubMat = content.SubMat or {}
|
|
content.SubMat[ k ] = ent:GetSubMaterial( k-1 )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
local bg = ent:GetBodyGroups()
|
|
if ( bg ) then
|
|
|
|
for k, v in pairs( bg ) do
|
|
|
|
if ( ent:GetBodygroup( v.id ) > 0 ) then
|
|
|
|
content.BodyG = content.BodyG or {}
|
|
content.BodyG[ v.id ] = ent:GetBodygroup( v.id )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if ent:GetPhysicsObject() and ent:GetPhysicsObject():IsValid() then
|
|
content.Frozen = !ent:GetPhysicsObject():IsMoveable()
|
|
end
|
|
|
|
if content.Class == "prop_dynamic" then
|
|
content.Class = "prop_physics"
|
|
end
|
|
|
|
--content.Table = PermaProps.UselessContent( ent:GetTable() )
|
|
|
|
return content
|
|
|
|
end
|
|
|
|
function PermaProps.PPEntityFromTable( data, id )
|
|
|
|
if not id or not isnumber(id) then return false end
|
|
if not data or not istable(data) then return false end
|
|
|
|
if data.Class == "prop_physics" and data.Frozen then
|
|
data.Class = "prop_dynamic" -- Can reduce lags
|
|
end
|
|
|
|
local ent = ents.Create(data.Class)
|
|
if !ent then return false end
|
|
if !ent:IsVehicle() then if !ent:IsValid() then return false end end
|
|
ent:SetPos( data.Pos or Vector(0, 0, 0) )
|
|
ent:SetAngles( data.Angle or Angle(0, 0, 0) )
|
|
ent:SetModel( data.Model or "models/error.mdl" )
|
|
ent:SetSkin( data.Skin or 0 )
|
|
//ent:SetCollisionBounds( ( data.Mins or 0 ), ( data.Maxs or 0 ) )
|
|
ent:SetCollisionGroup( data.ColGroup or 0 )
|
|
ent:SetName( data.Name or "" )
|
|
ent:SetModelScale( data.ModelScale or 1 )
|
|
ent:SetMaterial( data.Material or "" )
|
|
ent:SetSolid( data.Solid or 6 )
|
|
|
|
if PermaProps.SpecialENTSSpawn[data.Class] != nil and isfunction(PermaProps.SpecialENTSSpawn[data.Class]) then
|
|
|
|
PermaProps.SpecialENTSSpawn[data.Class](ent, data.Other)
|
|
|
|
else
|
|
|
|
ent:Spawn()
|
|
|
|
end
|
|
|
|
hook.Run("PermaProps.OnEntityCreated", ent, data)
|
|
|
|
ent:SetRenderMode( data.RenderMode or RENDERMODE_NORMAL )
|
|
ent:SetColor( data.Color or Color(255, 255, 255, 255) )
|
|
|
|
if data.EntityMods != nil and istable(data.EntityMods) then -- OLD DATA
|
|
|
|
if data.EntityMods.material then
|
|
ent:SetMaterial( data.EntityMods.material["MaterialOverride"] or "")
|
|
end
|
|
|
|
if data.EntityMods.colour then
|
|
ent:SetColor( data.EntityMods.colour.Color or Color(255, 255, 255, 255))
|
|
end
|
|
|
|
end
|
|
|
|
if data.DT then
|
|
|
|
for k, v in pairs( data.DT ) do
|
|
|
|
if ( data.DT[ k ] == nil ) then continue end
|
|
if !isfunction(ent[ "Set" .. k ]) then continue end
|
|
ent[ "Set" .. k ]( ent, data.DT[ k ] )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if data.BodyG then
|
|
|
|
for k, v in pairs( data.BodyG ) do
|
|
|
|
ent:SetBodygroup( k, v )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
if data.SubMat then
|
|
|
|
for k, v in pairs( data.SubMat ) do
|
|
|
|
if type(k) != "number" or type(v) != "string" then continue end
|
|
|
|
ent:SetSubMaterial( k-1, v )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if data.Frozen != nil then
|
|
|
|
local phys = ent:GetPhysicsObject()
|
|
if phys and phys:IsValid() then
|
|
phys:EnableMotion(!data.Frozen)
|
|
end
|
|
|
|
end
|
|
|
|
/*if data.Table then
|
|
|
|
table.Merge(ent:GetTable(), data.Table)
|
|
|
|
end*/
|
|
|
|
ent.PermaProps_ID = id
|
|
ent.PermaProps = true
|
|
|
|
// For all idiots who don't know how to config FPP, FUCK YOU
|
|
function ent:CanTool( ply, trace, tool )
|
|
|
|
if trace and IsValid(trace.Entity) and trace.Entity.PermaProps then
|
|
|
|
if tool == "permaprops" then
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
return PermaProps.HasPermission( ply, "Tool")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return ent
|
|
|
|
end
|
|
|
|
function PermaProps.ReloadPermaProps()
|
|
|
|
for k, v in pairs( ents.GetAll() ) do
|
|
|
|
if v.PermaProps == true then
|
|
|
|
v:Remove()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
local content = PermaProps.SQL.Query( "SELECT * FROM permaprops WHERE map = ".. sql.SQLStr(game.GetMap()) .. ";" )
|
|
|
|
if not content or content == nil then return end
|
|
|
|
for k, v in pairs( content ) do
|
|
|
|
local data = util.JSONToTable(v.content)
|
|
|
|
local e = PermaProps.PPEntityFromTable(data, tonumber(v.id))
|
|
if !e or !e:IsValid() then continue end
|
|
|
|
end
|
|
|
|
end
|
|
hook.Add("InitPostEntity", "InitializePermaProps", PermaProps.ReloadPermaProps)
|
|
hook.Add("PostCleanupMap", "WhenCleanUpPermaProps", PermaProps.ReloadPermaProps) -- #MOMO
|
|
timer.Simple(5, function() PermaProps.ReloadPermaProps() end) -- When the hook isn't call ...
|
|
|
|
function PermaProps.SparksEffect( ent )
|
|
|
|
local effectdata = EffectData()
|
|
effectdata:SetOrigin(ent:GetPos())
|
|
effectdata:SetMagnitude(2.5)
|
|
effectdata:SetScale(2)
|
|
effectdata:SetRadius(3)
|
|
util.Effect("Sparks", effectdata, true, true)
|
|
|
|
end
|
|
|
|
function PermaProps.IsUserGroup( ply, name )
|
|
|
|
if not ply:IsValid() then return false end
|
|
return ply:GetNetworkedString("UserGroup") == name
|
|
|
|
end
|
|
|
|
function PermaProps.IsAdmin( ply )
|
|
|
|
if ( PermaProps.IsUserGroup(ply, "superadmin") or false ) then return true end
|
|
if ( PermaProps.IsUserGroup(ply, "admin") or false ) then return true end
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
function PermaProps.IsSuperAdmin( ply )
|
|
|
|
return ( PermaProps.IsUserGroup(ply, "superadmin") or false )
|
|
|
|
end
|
|
|
|
function PermaProps.UselessContent( tbl )
|
|
|
|
local function SortFcn( tbl2 )
|
|
|
|
for k, v in pairs( tbl2 ) do
|
|
|
|
if isfunction( v ) or isentity( v ) then
|
|
|
|
tbl2[k] = nil
|
|
|
|
elseif istable( v ) then
|
|
|
|
SortFcn( v )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return tbl2
|
|
|
|
end
|
|
|
|
for k, v in pairs( tbl ) do
|
|
|
|
if isfunction( v ) or isentity( v ) then
|
|
|
|
tbl[k] = nil
|
|
|
|
elseif istable( v ) then
|
|
|
|
SortFcn( v )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return tbl
|
|
|
|
end
|