Files
wnsrc/lua/includes/gmsave.lua
lifestorm 9c918c46e5 Upload
2024-08-04 23:12:27 +03:00

126 lines
3.2 KiB
Lua
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--[[
| 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/
--]]
gmsave = {}
if ( CLIENT ) then return end
include( "gmsave/entity_filters.lua" )
include( "gmsave/player.lua" )
local g_WavSound = 1
function gmsave.LoadMap( strMapContents, ply, callback )
-- TODO: Do this in engine before sending it to this function.
-- Strip off any crap before the start char..
local startchar = string.find( strMapContents, '' )
if ( startchar != nil ) then
strMapContents = string.sub( strMapContents, startchar )
end
-- Strip off any crap after the end char..
strMapContents = strMapContents:reverse()
local startchar = string.find( strMapContents, '' )
if ( startchar != nil ) then
strMapContents = string.sub( strMapContents, startchar )
end
strMapContents = strMapContents:reverse()
-- END TODO
local tab = util.JSONToTable( strMapContents )
if ( !istable( tab ) ) then
-- Error loading save!
MsgN( "gm_load: Couldn't decode from json!" )
return false
end
-- Existing addons are forcing us to do this
-- The issue is that some addons overwrite game.CleanUpMap
-- Making the 3rd argument not exist
hook.Add( "PostCleanupMap", "GMod_Load_Save", function()
hook.Remove( "PostCleanupMap", "GMod_Load_Save" )
if ( IsValid( ply ) ) then
ply:SendLua( "hook.Run( \"OnSpawnMenuClose\" )" )
g_WavSound = g_WavSound + 1
if ( g_WavSound > 4 ) then g_WavSound = 1 end
ply:SendLua( string.format( "surface.PlaySound( \"garrysmod/save_load%d.wav\" )", g_WavSound ) )
gmsave.PlayerLoad( ply, tab.Player )
end
timer.Simple( 0.1, function()
DisablePropCreateEffect = true
duplicator.RemoveMapCreatedEntities()
duplicator.Paste( ply, tab.Entities, tab.Constraints )
DisablePropCreateEffect = nil
if ( IsValid( ply ) ) then
gmsave.PlayerLoad( ply, tab.Player )
end
-- Since this save system is inferior to Source's, we gotta make sure this entity is disabled on load of a save
-- On maps like Portal's testchmb_a_00.bsp this entity takes away player control and will not restore it
-- if the player is not in a very specific place.
timer.Simple( 1, function()
for id, ent in ipairs( ents.FindByClass( "point_viewcontrol" ) ) do
ent:Fire( "Disable" )
end
end )
if ( callback ) then callback() end
end )
end )
game.CleanUpMap( false, nil, function() end )
end
function gmsave.SaveMap( ply )
local Ents = ents.GetAll()
for k, v in ipairs( Ents ) do
if ( !gmsave.ShouldSaveEntity( v, v:GetSaveTable() ) || v:IsConstraint() ) then
Ents[ k ] = nil
end
end
-- This is to copy the constraints that are applied to the world only (ropes, etc)
-- It will not actually save and then try to restore the world entity, as that would cause issues
table.insert( Ents, game.GetWorld() )
local tab = duplicator.CopyEnts( Ents )
if ( !tab ) then return end
tab.Player = gmsave.PlayerSave( ply )
--
-- Try to figure out if any of the models/materials/etc came from some addon
--
duplicator.FigureOutRequiredAddons( tab )
return util.TableToJSON( tab )
end