diff options
-rw-r--r-- | advtrains/init.lua | 74 |
1 files changed, 39 insertions, 35 deletions
diff --git a/advtrains/init.lua b/advtrains/init.lua index d3866ce..c3298a2 100644 --- a/advtrains/init.lua +++ b/advtrains/init.lua @@ -41,7 +41,7 @@ end function advtrains.pcall(fun) if no_action then return end - + local succ, return1, return2, return3, return4=xpcall(fun, function(err) atwarn("Lua Error occured: ", err) atwarn(debug.traceback()) @@ -140,11 +140,11 @@ if minetest.settings:get_bool("advtrains_enable_debugging") then if not context then return end local text=advtrains.print_concat_table({t, ...}) advtrains.drb_record(context, text) - + --atlog("@@",advtrains.atprint_context_tid,t,...) end dofile(advtrains.modpath.."/debugringbuffer.lua") - + end function assertt(var, typ) @@ -156,7 +156,7 @@ end dofile(advtrains.modpath.."/helpers.lua"); --dofile(advtrains.modpath.."/debugitems.lua"); -advtrains.meseconrules = +advtrains.meseconrules = {{x=0, y=0, z=-1}, {x=1, y=0, z=0}, {x=-1, y=0, z=0}, @@ -222,7 +222,7 @@ end function advtrains.avt_load() -- check for new, split advtrains save file - + local version = advtrains.read_component("version") local tbl if version and version == 3 then @@ -242,7 +242,7 @@ function advtrains.avt_load() wagon_save = true, ptmap = true, atc = true, - ndb = true, + ndb = true, lines = true, version = 2, } @@ -253,7 +253,7 @@ function advtrains.avt_load() tbl[i] = advtrains.read_component(i) end tbl["interlocking"] = il_save - else + else local file, err = io.open(advtrains.fpath, "r") if not file then minetest.log("warning", " Failed to read advtrains save data from file "..advtrains.fpath..": "..(err or "Unknown Error")) @@ -352,19 +352,19 @@ advtrains.save_component = function (tbl, name) file:write(datastr) file:close() os.rename(temppath, advtrains.fpath.."_"..name) - + end advtrains.avt_save = function(remove_players_from_wagons) --atprint("saving") - + if remove_players_from_wagons then for w_id, data in pairs(advtrains.wagons) do data.seatp={} end advtrains.player_to_train_mapping={} end - + local tmp_trains={} for id, train in pairs(advtrains.trains) do --first, deep_copy the train @@ -383,7 +383,7 @@ advtrains.avt_save = function(remove_players_from_wagons) advtrains.remove_train(id) end end - + for id, wdata in pairs(advtrains.wagons) do local _,proto = advtrains.get_wagon_prototype(wdata) if proto.has_inventory then @@ -397,7 +397,7 @@ advtrains.avt_save = function(remove_players_from_wagons) -- TODO temp wdata.dcpl_lock = nil end - + --versions: -- 1 - Initial new save format. -- 2 - version as of tss branch 11-2018+ @@ -426,11 +426,11 @@ advtrains.avt_save = function(remove_players_from_wagons) for i,k in pairs(save_tbl) do advtrains.save_component(k,i) end - + for i,k in pairs(il_save) do advtrains.save_component(k,"interlocking_"..i) end - + if DUMP_DEBUG_SAVE then local file, err = io.open(advtrains.fpath.."_DUMP", "w") if err then @@ -458,7 +458,7 @@ minetest.register_globalstep(function(dtime_mt) if not init_load then advtrains.load() end - + --[[ local dtime if GENERATE_ATRICIFIAL_LAG then @@ -466,7 +466,7 @@ minetest.register_globalstep(function(dtime_mt) if os.clock()<t then return end - + t = os.clock()+0.2 else --limit dtime: if trains move too far in one step, automation may cause stuck and wrongly braking trains @@ -476,23 +476,28 @@ minetest.register_globalstep(function(dtime_mt) dtime=0.2 end end - - ]] - local dtime = dtime_mt - advtrains.mainloop_trainlogic(dtime) - if advtrains_itm_mainloop then - advtrains_itm_mainloop(dtime) - end - if atlatc then - atlatc.mainloop_stepcode(dtime) - atlatc.interrupt.mainloop(dtime) - end - if advtrains.lines then - advtrains.lines.step(dtime) + ]] + + -- hotfix to prevent bugs related to ATC tracks. + while (dtime_mt>0) do + local dtime = dtime_mt + if dtime > 0.2 then dtime = 0.2 end + advtrains.mainloop_trainlogic(dtime) + if advtrains_itm_mainloop then + advtrains_itm_mainloop(dtime) + end + if atlatc then + atlatc.mainloop_stepcode(dtime) + atlatc.interrupt.mainloop(dtime) + end + if advtrains.lines then + advtrains.lines.step(dtime) + end + dtime_mt = dtime_mt - dtime end - + --trigger a save when necessary - save_timer=save_timer-dtime + save_timer=save_timer-dtime_mt if save_timer<=0 then local t=os.clock() --save @@ -534,7 +539,7 @@ function advtrains.save(remove_players_from_wagons) atlatc.save() end atprint("[save_all]Saved advtrains save files") - + --TODO very simple yet hacky workaround for the "green signals" bug advtrains.invalidate_all_paths() end @@ -559,8 +564,8 @@ minetest.register_chatcommand("at_empty_seats", -- This chat command solves another problem: Trains getting randomly stuck. minetest.register_chatcommand("at_reroute", { - params = "", - description = "Delete all train routes, force them to recalculate", + params = "", + description = "Delete all train routes, force them to recalculate", privs = {train_operator=true}, -- Only train operator is required, since this is relatively safe. func = function(name, param) return advtrains.pcall(function() @@ -573,4 +578,3 @@ minetest.register_chatcommand("at_reroute", local tot=(os.clock()-lot)*1000 minetest.log("action", "[advtrains] Loaded in "..tot.."ms") - |