aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authororwell96 <mono96.mml@gmail.com>2017-05-15 13:37:06 +0200
committerorwell96 <mono96.mml@gmail.com>2017-05-22 14:56:41 +0200
commitb6cbc36192bcfb79d70e17fae937631611d3d3ac (patch)
tree94caa807932d891c19a7ecc825c3dc566bab4bcf
parent2f2a859e08dfb26831b3f187e4793bdcef692c2c (diff)
downloadadvtrains-b6cbc36192bcfb79d70e17fae937631611d3d3ac.tar.gz
advtrains-b6cbc36192bcfb79d70e17fae937631611d3d3ac.tar.bz2
advtrains-b6cbc36192bcfb79d70e17fae937631611d3d3ac.zip
Fix a series of bugs
- Prevent min_iot from becoming a comma value, which caused a major problem on the linuxworks server - Fix previous commit - also restore the nodedb file after a crash Other changes: - add chatcommand to update the nodedb after using WorldEdit
-rw-r--r--advtrains/advtrains/helpers.lua6
-rw-r--r--advtrains/advtrains/init.lua24
-rw-r--r--advtrains/advtrains/nodedb.lua151
-rw-r--r--advtrains/advtrains/trainlogic.lua13
4 files changed, 102 insertions, 92 deletions
diff --git a/advtrains/advtrains/helpers.lua b/advtrains/advtrains/helpers.lua
index a2b9b16..039b4f0 100644
--- a/advtrains/advtrains/helpers.lua
+++ b/advtrains/advtrains/helpers.lua
@@ -170,12 +170,6 @@ function advtrains.minAngleDiffRad(r1, r2)
return try3
end
end
-function advtrains.dumppath(path)
- if not path then atprint("dumppath: no path(nil)") return end
- local min=advtrains.minN(path)
- local max=advtrains.maxN(path)
- for i=min, max do atprint("["..i.."] "..(path[i] and minetest.pos_to_string(path[i]) or "nil")) end
-end
function advtrains.merge_tables(a, ...)
local new={}
diff --git a/advtrains/advtrains/init.lua b/advtrains/advtrains/init.lua
index 2bdf39c..bbb8713 100644
--- a/advtrains/advtrains/init.lua
+++ b/advtrains/advtrains/init.lua
@@ -43,7 +43,7 @@ advtrains.modpath = minetest.get_modpath("advtrains")
function advtrains.print_concat_table(a)
local str=""
local stra=""
- for i=1,10 do
+ for i=1,20 do
t=a[i]
if t==nil then
stra=stra.."nil "
@@ -70,23 +70,20 @@ function advtrains.print_concat_table(a)
end
return str
end
+
atprint=function() end
-if minetest.setting_getbool("advtrains_debug") then
- atprint=function(t, ...)
- local context=advtrains.atprint_context_tid
- if not context then context="" end
- --if context~="4527" then return end
- local text=advtrains.print_concat_table({t, ...})
- minetest.log("action", "[advtrains]"..context..">"..text)
- minetest.chat_send_all("[advtrains]"..context..">"..text)
- end
+atlog=function(t, ...)
+ local context=advtrains.atprint_context_tid
+ if not context then return end
+ local text=advtrains.print_concat_table({t, ...})
+ minetest.log("action", text)
end
atwarn=function(t, ...)
local text=advtrains.print_concat_table({t, ...})
minetest.log("warning", "[advtrains]"..text)
minetest.chat_send_all("[advtrains] -!- "..text)
end
-sid=function(id) return string.sub(id, -4) end
+sid=function(id) return string.sub(id, -6) end
dofile(advtrains.modpath.."/helpers.lua");
--dofile(advtrains.modpath.."/debugitems.lua");
@@ -106,6 +103,7 @@ advtrains.meseconrules =
{x=0, y=-1, z=-1},
{x=0, y=-2, z=0}}
+
dofile(advtrains.modpath.."/trainlogic.lua")
dofile(advtrains.modpath.."/trainhud.lua")
dofile(advtrains.modpath.."/trackplacer.lua")
@@ -309,7 +307,7 @@ function advtrains.load()
end
init_load=true
no_action=false
- atprint("[load_all]Loaded advtrains save files")
+ atlog("[load_all]Loaded advtrains save files")
end
--## MAIN SAVE ROUTINE ##
@@ -324,6 +322,6 @@ function advtrains.save()
if atlatc then
atlatc.save()
end
- atprint("[save_all]Saved advtrains save files")
+ atlog("[save_all]Saved advtrains save files")
end
minetest.register_on_shutdown(advtrains.save)
diff --git a/advtrains/advtrains/nodedb.lua b/advtrains/advtrains/nodedb.lua
index 5a193bd..4ab551d 100644
--- a/advtrains/advtrains/nodedb.lua
+++ b/advtrains/advtrains/nodedb.lua
@@ -52,40 +52,38 @@ local function ndbset(x,y,z,v)
end
+local path=minetest.get_worldpath().."/advtrains_ndb2"
--load
--nodeids get loaded by advtrains init.lua and passed here
function ndb.load_data(data)
ndb_nodeids = data and data.nodeids or {}
-end
-
-local path=minetest.get_worldpath().."/advtrains_ndb2"
-
-local file, err = io.open(path, "r")
-if not file then
- atprint("load ndb failed: ", err or "Unknown Error")
-else
- local cnt=0
- local hst_z=file:read(2)
- local hst_y=file:read(2)
- local hst_x=file:read(2)
- local cid=file:read(2)
- while hst_z and hst_y and hst_x and cid and #hst_z==2 and #hst_y==2 and #hst_x==2 and #cid==2 do
- ndbset(bytes_to_int(hst_x), bytes_to_int(hst_y), bytes_to_int(hst_z), bytes_to_int(cid))
- cnt=cnt+1
- hst_z=file:read(2)
- hst_y=file:read(2)
- hst_x=file:read(2)
- cid=file:read(2)
+ local file, err = io.open(path, "r")
+ if not file then
+ atwarn("Couldn't load the node database: ", err or "Unknown Error")
+ else
+ local cnt=0
+ local hst_z=file:read(2)
+ local hst_y=file:read(2)
+ local hst_x=file:read(2)
+ local cid=file:read(2)
+ while hst_z and hst_y and hst_x and cid and #hst_z==2 and #hst_y==2 and #hst_x==2 and #cid==2 do
+ ndbset(bytes_to_int(hst_x), bytes_to_int(hst_y), bytes_to_int(hst_z), bytes_to_int(cid))
+ cnt=cnt+1
+ hst_z=file:read(2)
+ hst_y=file:read(2)
+ hst_x=file:read(2)
+ cid=file:read(2)
+ end
+ atlog("nodedb: read", cnt, "nodes.")
+ file:close()
end
- atprint("nodedb: read", cnt, "nodes.")
- file:close()
end
--save
function ndb.save_data()
local file, err = io.open(path, "w")
if not file then
- atprint("save ndb failed: ", err or "Unknown Error")
+ atwarn("Couldn't save the node database: ", err or "Unknown Error")
else
for y, ny in pairs(ndb_nodes) do
for x, nx in pairs(ny) do
@@ -197,57 +195,45 @@ function advtrains.get_rail_info_at(pos, drives_on)
return true, conn1, conn2, rely1, rely2, railheight
end
-ndb.run_lbm = function(pos, nodep)
- return advtrains.pcall(function()
- local node=nodep
- if not node then
- node=minetest.get_node_or_nil(pos)
- if not node then
- --this is defintely not loaded
- return nil
- end
- end
- local cid=ndbget(pos.x, pos.y, pos.z)
- if cid then
- --if in database, detect changes and apply.
- local nodeid = ndb_nodeids[u14b(cid)]
- local param2 = l2b(cid)
- if not nodeid then
- --something went wrong
- atprint("nodedb: lbm nid not found", pos, "with nid", u14b(cid), "param2", param2, "cid is", cid)
- ndb.update(pos, node)
- else
- if (nodeid~=node.name or param2~=node.param2) then
- local ori_ndef=minetest.registered_nodes[node.name]
- if ori_ndef and ori_ndef.groups.save_in_nodedb then --check if this node has been worldedited, and don't replace then
- atprint("nodedb: lbm replaced", pos, "with nodeid", nodeid, "param2", param2, "cid is", cid)
- minetest.swap_node(pos, {name=nodeid, param2 = param2})
- local ndef=minetest.registered_nodes[nodeid]
- if ndef and ndef.on_updated_from_nodedb then
- ndef.on_updated_from_nodedb(pos, node)
- end
- return true
- else
- ndb.clear(pos)
- end
- end
+ndb.run_lbm = function(pos, node)
+ return advtrains.pcall(function()
+ local cid=ndbget(pos.x, pos.y, pos.z)
+ if cid then
+ --if in database, detect changes and apply.
+ local nodeid = ndb_nodeids[u14b(cid)]
+ local param2 = l2b(cid)
+ if not nodeid then
+ --something went wrong
+ atwarn("Node Database corruption, couldn't determine node to set at", pos)
+ ndb.update(pos, node)
+ else
+ if (nodeid~=node.name or param2~=node.param2) then
+ atprint("nodedb: lbm replaced", pos, "with nodeid", nodeid, "param2", param2, "cid is", cid)
+ minetest.swap_node(pos, {name=nodeid, param2 = param2})
+ local ndef=minetest.registered_nodes[nodeid]
+ if ndef and ndef.on_updated_from_nodedb then
+ ndef.on_updated_from_nodedb(pos, node)
end
- else
- --if not in database, take it.
- atprint("nodedb: ", pos, "not in database")
- ndb.update(pos, node)
+ return true
end
- return false
- end)
- end
+ end
+ else
+ --if not in database, take it.
+ atlog("Node Database:", pos, "was not found in the database, have you used worldedit?")
+ ndb.update(pos, node)
+ end
+ return false
+ end)
+end
-minetest.register_abm({
+minetest.register_lbm({
name = "advtrains:nodedb_on_load_update",
nodenames = {"group:save_in_nodedb"},
run_at_every_load = true,
+ run_on_every_load = true,
action = ndb.run_lbm,
- interval=10,
+ interval=30,
chance=1,
})
@@ -258,8 +244,20 @@ ndb.restore_all = function()
for y, ny in pairs(ndb_nodes) do
for x, nx in pairs(ny) do
for z, _ in pairs(nx) do
- if ndb.run_lbm({x=x, y=y, z=z}) then
- cnt=cnt+1
+ local pos={x=x, y=y, z=z}
+ local node=minetest.get_node_or_nil(pos)
+ if node then
+ local ori_ndef=minetest.registered_nodes[node.name]
+ local ndbnode=ndb.get_node(pos)
+ if ori_ndef and ori_ndef.groups.save_in_nodedb then --check if this node has been worldedited, and don't replace then
+ if (ndbnode.name~=node.name or ndbnode.param2~=node.param2) then
+ minetest.swap_node(pos, ndbnode)
+ atwarn("Replaced",node.name,"@",pos,"with",ndbnode.name)
+ end
+ else
+ ndb.clear(pos)
+ atwarn("Found ghost node (former",ndbnode.name,") @",pos,"deleting")
+ end
end
end
end
@@ -283,3 +281,20 @@ end
advtrains.ndb=ndb
+local ptime
+
+minetest.register_chatcommand("at_restore_ndb",
+ {
+ params = "", -- Short parameter description
+ description = "Write node db back to map", -- Full description
+ privs = {train_operator=true, worldedit=true}, -- Require the "privs" privilege to run
+ func = function(name, param)
+ if !minetest.check_player_privs(name, {server=true}) and os.time() < ptime+30 then
+ return false, "Please wait at least 30s from the previous execution of /at_restore_ndb!"
+ end
+ ndb.restore_all()
+ ptime=os.time()
+ return true
+ end,
+ })
+
diff --git a/advtrains/advtrains/trainlogic.lua b/advtrains/advtrains/trainlogic.lua
index 8614c79..f307026 100644
--- a/advtrains/advtrains/trainlogic.lua
+++ b/advtrains/advtrains/trainlogic.lua
@@ -193,6 +193,9 @@ function advtrains.train_step_a(id, train, dtime)
train.path_dist[-1]=vector.distance(train.last_pos, train.last_pos_prev)
train.path_extent_min=-1
train.path_extent_max=0
+ train.min_index_on_track=-1
+ train.max_index_on_track=0
+
--[[
Bugfix for trains randomly ignoring ATC rails:
- Paths have been invalidated. 1 gets executed and ensures an initial path
@@ -355,7 +358,7 @@ function advtrains.train_step_a(id, train, dtime)
local path_pregen_keep=20
local offtrack_keep=4
local gen_front_keep= path_pregen_keep
- local gen_back_keep= - train.trainlen - path_pregen_keep
+ local gen_back_keep= math.floor(- train.trainlen - path_pregen_keep)
local delete_min=math.min(train.max_index_on_track - offtrack_keep, math.floor(train.index)+gen_back_keep)
local delete_max=math.max(train.min_index_on_track + offtrack_keep, math.floor(train.index)+gen_front_keep)
@@ -483,13 +486,13 @@ function advtrains.pathpredict(id, train, regular)
local maxn=train.path_extent_max or 0
while maxn < gen_front do--pregenerate
local conway
- if train.max_index_on_track == train.path_extent_max then
+ if train.max_index_on_track == maxn then
atprint("maxn conway for ",maxn,train.path[maxn],maxn-1,train.path[maxn-1])
conway=advtrains.conway(train.path[maxn], train.path[maxn-1], train.drives_on)
end
if conway then
train.path[maxn+1]=conway
- train.max_index_on_track=maxn
+ train.max_index_on_track=maxn+1
else
--do as if nothing has happened and preceed with path
--but do not update max_index_on_track
@@ -504,13 +507,13 @@ function advtrains.pathpredict(id, train, regular)
local minn=train.path_extent_min or -1
while minn > gen_back do
local conway
- if train.min_index_on_track == train.path_extent_min then
+ if train.min_index_on_track == minn then
atprint("minn conway for ",minn,train.path[minn],minn+1,train.path[minn+1])
conway=advtrains.conway(train.path[minn], train.path[minn+1], train.drives_on)
end
if conway then
train.path[minn-1]=conway
- train.min_index_on_track=minn
+ train.min_index_on_track=minn-1
else
--do as if nothing has happened and preceed with path
--but do not update min_index_on_track