Unite all save data (except the track database) into a single save file
parent
04d14dc1bf
commit
dc8b47a066
|
@ -2,37 +2,10 @@
|
||||||
--registers and controls the ATC system
|
--registers and controls the ATC system
|
||||||
|
|
||||||
local atc={}
|
local atc={}
|
||||||
-- ATC persistence table
|
-- ATC persistence table. advtrains.atc is created by init.lua when it loads the save file.
|
||||||
atc.controllers = {}
|
atc.controllers = advtrains.atc.controllers
|
||||||
--contents: {command="...", arrowconn=0-15 where arrow points}
|
--contents: {command="...", arrowconn=0-15 where arrow points}
|
||||||
|
|
||||||
advtrains.fpath_atc=minetest.get_worldpath().."/advtrains_atc"
|
|
||||||
local file, err = io.open(advtrains.fpath_atc, "r")
|
|
||||||
if not file then
|
|
||||||
local er=err or "Unknown Error"
|
|
||||||
atprint("Failed loading advtrains atc save file "..er)
|
|
||||||
else
|
|
||||||
local tbl = minetest.deserialize(file:read("*a"))
|
|
||||||
if type(tbl) == "table" then
|
|
||||||
atc.controllers=tbl.controllers
|
|
||||||
end
|
|
||||||
file:close()
|
|
||||||
end
|
|
||||||
function atc.save()
|
|
||||||
--leave space for more save data.
|
|
||||||
local datastr = minetest.serialize({controllers = atc.controllers})
|
|
||||||
if not datastr then
|
|
||||||
minetest.log("error", " Failed to serialize trackdb data!")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local file, err = io.open(advtrains.fpath_atc, "w")
|
|
||||||
if err then
|
|
||||||
return err
|
|
||||||
end
|
|
||||||
file:write(datastr)
|
|
||||||
file:close()
|
|
||||||
end
|
|
||||||
|
|
||||||
--call from advtrains.detector subprogram
|
--call from advtrains.detector subprogram
|
||||||
|
|
||||||
function atc.trigger_controller_train_enter(pos, train_id)
|
function atc.trigger_controller_train_enter(pos, train_id)
|
||||||
|
@ -290,5 +263,7 @@ function atc.execute_atc_command(id, train)
|
||||||
atc.train_reset_command(id)
|
atc.train_reset_command(id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--move table to desired place
|
--move table to desired place
|
||||||
advtrains.atc=atc
|
advtrains.atc=atc
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
--advtrains
|
--advtrains
|
||||||
|
|
||||||
advtrains={}
|
--create the base table structure.
|
||||||
|
advtrains={atc={controllers={}}, detector={}, trackplacer={}, trains={}, trackdb={}, wagon_save={}}
|
||||||
|
|
||||||
advtrains.modpath = minetest.get_modpath("advtrains")
|
advtrains.modpath = minetest.get_modpath("advtrains")
|
||||||
|
|
||||||
|
@ -34,8 +35,8 @@ local function print_concat_table(a)
|
||||||
end
|
end
|
||||||
return str
|
return str
|
||||||
end
|
end
|
||||||
atprint=function() end
|
--atprint=function() end
|
||||||
--atprint=function(t, ...) minetest.log("action", "[advtrains]"..print_concat_table({t, ...})) minetest.chat_send_all("[advtrains]"..print_concat_table({t, ...})) end
|
atprint=function(t, ...) minetest.log("action", "[advtrains]"..print_concat_table({t, ...})) minetest.chat_send_all("[advtrains]"..print_concat_table({t, ...})) end
|
||||||
sid=function(id) return string.sub(id, -4) end
|
sid=function(id) return string.sub(id, -4) end
|
||||||
|
|
||||||
dofile(advtrains.modpath.."/helpers.lua");
|
dofile(advtrains.modpath.."/helpers.lua");
|
||||||
|
@ -55,6 +56,110 @@ advtrains.meseconrules =
|
||||||
{x=0, y=1, z=-1},
|
{x=0, y=1, z=-1},
|
||||||
{x=0, y=-1, z=-1},
|
{x=0, y=-1, z=-1},
|
||||||
{x=0, y=-2, z=0}}
|
{x=0, y=-2, z=0}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--load/save
|
||||||
|
|
||||||
|
advtrains.fpath=minetest.get_worldpath().."/advtrains"
|
||||||
|
local file, err = io.open(advtrains.fpath, "r")
|
||||||
|
if not file then
|
||||||
|
minetest.log("error", " Failed to read advtrains save data from file "..advtrains.fpath..": "..(err or "Unknown Error"))
|
||||||
|
else
|
||||||
|
local tbl = minetest.deserialize(file:read("*a"))
|
||||||
|
if type(tbl) == "table" then
|
||||||
|
if tbl.version then
|
||||||
|
--congrats, we have the new save format.
|
||||||
|
advtrains.atc.controllers = tbl.atc_controllers
|
||||||
|
advtrains.trains = tbl.trains
|
||||||
|
advtrains.wagon_save = tbl.wagon_save
|
||||||
|
else
|
||||||
|
--oh no, its the old one...
|
||||||
|
advtrains.trains=tbl
|
||||||
|
--load ATC
|
||||||
|
advtrains.fpath_atc=minetest.get_worldpath().."/advtrains_atc"
|
||||||
|
local file, err = io.open(advtrains.fpath_atc, "r")
|
||||||
|
if not file then
|
||||||
|
local er=err or "Unknown Error"
|
||||||
|
atprint("Failed loading advtrains atc save file "..er)
|
||||||
|
else
|
||||||
|
local tbl = minetest.deserialize(file:read("*a"))
|
||||||
|
if type(tbl) == "table" then
|
||||||
|
advtrains.atc.controllers=tbl.controllers
|
||||||
|
end
|
||||||
|
file:close()
|
||||||
|
end
|
||||||
|
--load wagon saves
|
||||||
|
advtrains.fpath_ws=minetest.get_worldpath().."/advtrains_wagon_save"
|
||||||
|
local file, err = io.open(advtrains.fpath_ws, "r")
|
||||||
|
if not file then
|
||||||
|
local er=err or "Unknown Error"
|
||||||
|
atprint("Failed loading advtrains save file "..er)
|
||||||
|
else
|
||||||
|
local tbl = minetest.deserialize(file:read("*a"))
|
||||||
|
if type(tbl) == "table" then
|
||||||
|
advtrains.wagon_save=tbl
|
||||||
|
end
|
||||||
|
file:close()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
minetest.log("error", " Failed to deserialize advtrains save data: Not a table!")
|
||||||
|
end
|
||||||
|
file:close()
|
||||||
|
end
|
||||||
|
|
||||||
|
advtrains.save = function()
|
||||||
|
atprint("saving")
|
||||||
|
advtrains.invalidate_all_paths()
|
||||||
|
|
||||||
|
-- update wagon saves
|
||||||
|
for _,wagon in pairs(minetest.luaentities) do
|
||||||
|
if wagon.is_wagon and wagon.initialized then
|
||||||
|
wagon:get_staticdata()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
--cross out userdata
|
||||||
|
for w_id, data in pairs(advtrains.wagon_save) do
|
||||||
|
data.name=nil
|
||||||
|
data.object=nil
|
||||||
|
if data.driver then
|
||||||
|
data.driver_name=data.driver:get_player_name()
|
||||||
|
data.driver=nil
|
||||||
|
else
|
||||||
|
data.driver_name=nil
|
||||||
|
end
|
||||||
|
if data.discouple then
|
||||||
|
data.discouple.object:remove()
|
||||||
|
data.discouple=nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
--atprint(dump(advtrains.wagon_save))
|
||||||
|
|
||||||
|
--versions:
|
||||||
|
-- 1 - Initial new save format.
|
||||||
|
local save_tbl={
|
||||||
|
trains = advtrains.trains,
|
||||||
|
wagon_save = advtrains.wagon_save,
|
||||||
|
atc_controllers = advtrains.atc.controllers,
|
||||||
|
version = 1,
|
||||||
|
}
|
||||||
|
local datastr = minetest.serialize(save_tbl)
|
||||||
|
if not datastr then
|
||||||
|
minetest.log("error", " Failed to serialize advtrains save data!")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local file, err = io.open(advtrains.fpath, "w")
|
||||||
|
if err then
|
||||||
|
minetest.log("error", " Failed to write advtrains save data to file "..advtrains.fpath..": "..(err or "Unknown Error"))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
file:write(datastr)
|
||||||
|
file:close()
|
||||||
|
end
|
||||||
|
minetest.register_on_shutdown(advtrains.save)
|
||||||
|
|
||||||
|
|
||||||
dofile(advtrains.modpath.."/trainlogic.lua")
|
dofile(advtrains.modpath.."/trainlogic.lua")
|
||||||
dofile(advtrains.modpath.."/trainhud.lua")
|
dofile(advtrains.modpath.."/trainhud.lua")
|
||||||
dofile(advtrains.modpath.."/trackplacer.lua")
|
dofile(advtrains.modpath.."/trackplacer.lua")
|
||||||
|
@ -69,3 +174,4 @@ dofile(advtrains.modpath.."/damage.lua")
|
||||||
dofile(advtrains.modpath.."/signals.lua")
|
dofile(advtrains.modpath.."/signals.lua")
|
||||||
dofile(advtrains.modpath.."/misc_nodes.lua")
|
dofile(advtrains.modpath.."/misc_nodes.lua")
|
||||||
dofile(advtrains.modpath.."/crafting.lua")
|
dofile(advtrains.modpath.."/crafting.lua")
|
||||||
|
|
||||||
|
|
|
@ -98,7 +98,8 @@ function advtrains.save_trackdb()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
]]--end temp outcomment
|
]]--end temp outcomment
|
||||||
advtrains.trackdb={}
|
|
||||||
|
--trackdb keeps its own save file.
|
||||||
advtrains.fpath_tdb=minetest.get_worldpath().."/advtrains_trackdb2"
|
advtrains.fpath_tdb=minetest.get_worldpath().."/advtrains_trackdb2"
|
||||||
local file, err = io.open(advtrains.fpath_tdb, "r")
|
local file, err = io.open(advtrains.fpath_tdb, "r")
|
||||||
if not file then
|
if not file then
|
||||||
|
|
|
@ -39,96 +39,11 @@ advtrains.train_emerg_force=10--for emergency brakes(when going off track)
|
||||||
advtrains.audit_interval=10
|
advtrains.audit_interval=10
|
||||||
|
|
||||||
|
|
||||||
advtrains.trains={}
|
|
||||||
advtrains.wagon_save={}
|
|
||||||
|
|
||||||
--load initially
|
|
||||||
advtrains.fpath=minetest.get_worldpath().."/advtrains"
|
|
||||||
local file, err = io.open(advtrains.fpath, "r")
|
|
||||||
if not file then
|
|
||||||
local er=err or "Unknown Error"
|
|
||||||
atprint("Failed loading advtrains save file "..er)
|
|
||||||
else
|
|
||||||
local tbl = minetest.deserialize(file:read("*a"))
|
|
||||||
if type(tbl) == "table" then
|
|
||||||
advtrains.trains=tbl
|
|
||||||
end
|
|
||||||
file:close()
|
|
||||||
end
|
|
||||||
advtrains.fpath_ws=minetest.get_worldpath().."/advtrains_wagon_save"
|
|
||||||
local file, err = io.open(advtrains.fpath_ws, "r")
|
|
||||||
if not file then
|
|
||||||
local er=err or "Unknown Error"
|
|
||||||
atprint("Failed loading advtrains save file "..er)
|
|
||||||
else
|
|
||||||
local tbl = minetest.deserialize(file:read("*a"))
|
|
||||||
if type(tbl) == "table" then
|
|
||||||
advtrains.wagon_save=tbl
|
|
||||||
end
|
|
||||||
file:close()
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
advtrains.save = function()
|
|
||||||
atprint("saving")
|
|
||||||
advtrains.invalidate_all_paths()
|
|
||||||
local datastr = minetest.serialize(advtrains.trains)
|
|
||||||
if not datastr then
|
|
||||||
minetest.log("error", " Failed to serialize train data!")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local file, err = io.open(advtrains.fpath, "w")
|
|
||||||
if err then
|
|
||||||
return err
|
|
||||||
end
|
|
||||||
file:write(datastr)
|
|
||||||
file:close()
|
|
||||||
|
|
||||||
-- update wagon saves
|
|
||||||
for _,wagon in pairs(minetest.luaentities) do
|
|
||||||
if wagon.is_wagon and wagon.initialized then
|
|
||||||
wagon:get_staticdata()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
--cross out userdata
|
|
||||||
for w_id, data in pairs(advtrains.wagon_save) do
|
|
||||||
data.name=nil
|
|
||||||
data.object=nil
|
|
||||||
if data.driver then
|
|
||||||
data.driver_name=data.driver:get_player_name()
|
|
||||||
data.driver=nil
|
|
||||||
else
|
|
||||||
data.driver_name=nil
|
|
||||||
end
|
|
||||||
if data.discouple then
|
|
||||||
data.discouple.object:remove()
|
|
||||||
data.discouple=nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
--atprint(dump(advtrains.wagon_save))
|
|
||||||
datastr = minetest.serialize(advtrains.wagon_save)
|
|
||||||
if not datastr then
|
|
||||||
minetest.log("error", " Failed to serialize train data!")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
file, err = io.open(advtrains.fpath_ws, "w")
|
|
||||||
if err then
|
|
||||||
return err
|
|
||||||
end
|
|
||||||
file:write(datastr)
|
|
||||||
file:close()
|
|
||||||
|
|
||||||
advtrains.save_trackdb()
|
|
||||||
advtrains.atc.save()
|
|
||||||
end
|
|
||||||
minetest.register_on_shutdown(advtrains.save)
|
|
||||||
|
|
||||||
advtrains.save_and_audit_timer=advtrains.audit_interval
|
advtrains.save_and_audit_timer=advtrains.audit_interval
|
||||||
minetest.register_globalstep(function(dtime)
|
minetest.register_globalstep(function(dtime)
|
||||||
advtrains.save_and_audit_timer=advtrains.save_and_audit_timer-dtime
|
advtrains.save_and_audit_timer=advtrains.save_and_audit_timer-dtime
|
||||||
if advtrains.save_and_audit_timer<=0 then
|
if advtrains.save_and_audit_timer<=0 then
|
||||||
local t=os.clock()
|
local t=os.clock()
|
||||||
|
|
||||||
--save
|
--save
|
||||||
advtrains.save()
|
advtrains.save()
|
||||||
advtrains.save_and_audit_timer=advtrains.audit_interval
|
advtrains.save_and_audit_timer=advtrains.audit_interval
|
||||||
|
|
Loading…
Reference in New Issue