diff options
Diffstat (limited to 'advtrains/advtrains_luaautomation/init.lua')
-rw-r--r-- | advtrains/advtrains_luaautomation/init.lua | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/advtrains/advtrains_luaautomation/init.lua b/advtrains/advtrains_luaautomation/init.lua new file mode 100644 index 0000000..12e1b1d --- /dev/null +++ b/advtrains/advtrains_luaautomation/init.lua @@ -0,0 +1,98 @@ +-- advtrains_luaautomation/init.lua +-- Lua automation features for advtrains +-- Uses global table 'atlatc' (AdvTrains_LuaATC) + +-- Boilerplate to support localized strings if intllib mod is installed. +if minetest.get_modpath("intllib") then + atltrans = intllib.Getter() +else + atltrans = function(s,a,...)a={a,...}return s:gsub("@(%d+)",function(n)return a[tonumber(n)]end)end +end + +--Privilege +--Only trusted players should be enabled to build stuff which can break the server. + +atlatc = { envs = {}} + +minetest.register_privilege("atlatc", { description = "Player can place and modify LUA ATC components. Grant with care! Allows to execute bad LUA code.", give_to_singleplayer = false, default= false }) + +local mp=minetest.get_modpath("advtrains_luaautomation") +if not mp then + error("Mod name error: Mod folder is not named 'advtrains_luaautomation'!") +end +dofile(mp.."/environment.lua") +dofile(mp.."/interrupt.lua") +dofile(mp.."/active_common.lua") +dofile(mp.."/atc_rail.lua") +dofile(mp.."/operation_panel.lua") +dofile(mp.."/p_mesecon_iface.lua") + +local filename=minetest.get_worldpath().."/advtrains_luaautomation" +local file, err = io.open(filename, "r") +if not file then + minetest.log("error", " Failed to read advtrains_luaautomation save data from file "..filename..": "..(err or "Unknown Error")) +else + local tbl = minetest.deserialize(file:read("*a")) + if type(tbl) == "table" then + if tbl.version==1 then + for envname, data in pairs(tbl.envs) do + atlatc.envs[envname]=atlatc.env_load(envname, data) + end + atlatc.active.load(tbl.active) + atlatc.interrupt.load(tbl.interrupt) + end + else + minetest.log("error", " Failed to read advtrains_luaautomation save data from file "..filename..": Not a table!") + end + file:close() +end + +-- run init code of all environments +atlatc.run_initcode() + +atlatc.save = function() + --versions: + -- 1 - Initial save format. + + local envdata={} + for envname, env in pairs(atlatc.envs) do + envdata[envname]=env:save() + end + local save_tbl={ + version = 1, + envs=envdata, + active = atlatc.active.save(), + interrupt = atlatc.interrupt.save(), + } + + local datastr = minetest.serialize(save_tbl) + if not datastr then + minetest.log("error", " Failed to save advtrains_luaautomation save data to file "..filename..": Can't serialize!") + return + end + local file, err = io.open(filename, "w") + if err then + minetest.log("error", " Failed to save advtrains_luaautomation save data to file "..filename..": "..(err or "Unknown Error")) + return + end + file:write(datastr) + file:close() +end + +-- globalstep for step code +local timer, step_int=0, 2 +local stimer, sstep_int=0, 10 + +minetest.register_globalstep(function(dtime) + timer=timer+dtime + if timer>step_int then + timer=0 + atlatc.run_stepcode() + end + stimer=stimer+dtime + if stimer>sstep_int then + stimer=0 + atlatc.save() + end +end) +minetest.register_on_shutdown(atlatc.save) |