mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
Upload
This commit is contained in:
100
gamemodes/sandbox/gamemode/persistence.lua
Normal file
100
gamemodes/sandbox/gamemode/persistence.lua
Normal file
@@ -0,0 +1,100 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
if ( CLIENT ) then return end
|
||||
|
||||
local CurrentlyActivePersistencePage = ""
|
||||
|
||||
hook.Add( "InitPostEntity", "PersistenceInit", function()
|
||||
|
||||
local PersistPage = GetConVarString( "sbox_persist" ):Trim()
|
||||
if ( PersistPage == "" ) then return end
|
||||
|
||||
hook.Run( "PersistenceLoad", PersistPage )
|
||||
|
||||
end )
|
||||
|
||||
hook.Add( "ShutDown", "SavePersistenceOnShutdown", function() hook.Run( "PersistenceSave" ) end )
|
||||
|
||||
hook.Add( "PersistenceSave", "PersistenceSave", function( name )
|
||||
|
||||
local PersistPage = ( name or GetConVarString( "sbox_persist" ) ):Trim()
|
||||
if ( PersistPage == "" ) then return end
|
||||
|
||||
local Ents = ents.GetAll()
|
||||
|
||||
for k, v in ipairs( Ents ) do
|
||||
|
||||
if ( !v:GetPersistent() ) then
|
||||
Ents[ k ] = nil
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
local tab = duplicator.CopyEnts( Ents )
|
||||
if ( !tab ) then return end
|
||||
|
||||
local out = util.TableToJSON( tab )
|
||||
|
||||
file.CreateDir( "persist" )
|
||||
file.Write( "persist/" .. game.GetMap() .. "_" .. PersistPage .. ".txt", out )
|
||||
|
||||
end )
|
||||
|
||||
hook.Add( "PersistenceLoad", "PersistenceLoad", function( name )
|
||||
|
||||
CurrentlyActivePersistencePage = name
|
||||
|
||||
local data = file.Read( "persist/" .. game.GetMap() .. "_" .. name .. ".txt" )
|
||||
if ( !data ) then return end
|
||||
|
||||
local tab = util.JSONToTable( data )
|
||||
if ( !tab ) then return end
|
||||
if ( !tab.Entities ) then return end
|
||||
if ( !tab.Constraints ) then return end
|
||||
|
||||
local entities = duplicator.Paste( nil, tab.Entities, tab.Constraints )
|
||||
|
||||
for k, v in pairs( entities ) do
|
||||
v:SetPersistent( true )
|
||||
end
|
||||
|
||||
end )
|
||||
|
||||
cvars.AddChangeCallback( "sbox_persist", function( name, old, new )
|
||||
|
||||
-- A timer in case someone tries to rapidly change the convar, such as addons with "live typing" or whatever
|
||||
timer.Create( "sbox_persist_change_timer", 2, 1, function()
|
||||
|
||||
local newPage = new:Trim()
|
||||
|
||||
if ( CurrentlyActivePersistencePage == newPage ) then return end
|
||||
|
||||
-- old:Trim() would be incorrect for more than 1 convar change within the 2 second timer window
|
||||
hook.Run( "PersistenceSave", CurrentlyActivePersistencePage )
|
||||
|
||||
CurrentlyActivePersistencePage = ""
|
||||
|
||||
if ( newPage == "" ) then return end
|
||||
|
||||
-- Addons are forcing us to use this hook
|
||||
hook.Add( "PostCleanupMap", "GMod_Sandbox_PersistanceLoad", function()
|
||||
hook.Remove( "PostCleanupMap", "GMod_Sandbox_PersistanceLoad" )
|
||||
|
||||
hook.Run( "PersistenceLoad", newPage )
|
||||
end )
|
||||
|
||||
-- Maybe this game.CleanUpMap call should be moved to PersistenceLoad?
|
||||
game.CleanUpMap( false, nil, function() end )
|
||||
|
||||
end )
|
||||
|
||||
end, "sbox_persist_load" )
|
||||
Reference in New Issue
Block a user