From d81509c049f8c0a46e9002af7ce4666f4284111b Mon Sep 17 00:00:00 2001 From: orwell96 Date: Mon, 30 May 2016 19:58:09 +0200 Subject: fixed even more lua errors and made stable --- debugitems.lua | 21 ++++++------- helpers.lua | 6 ++-- pseudoload.lua | 41 ++++++++++++++++++++++--- trainlogic.lua | 94 +++++++++++++++++++++++++++++++++++++--------------------- wagons.lua | 13 ++++---- 5 files changed, 115 insertions(+), 60 deletions(-) diff --git a/debugitems.lua b/debugitems.lua index 89399d2..5cb6630 100644 --- a/debugitems.lua +++ b/debugitems.lua @@ -97,9 +97,9 @@ e.g. itemstack:take_item(); return itemstack ^ The default functions handle regular use cases. ]] }) -minetest.register_tool("advtrains:tttool", +minetest.register_tool("advtrains:tunnelborer", { - description = "traintester tool", + description = "tunnelborer", groups = {cracky=1}, -- key=name, value=rating; rating=1..3. inventory_image = "drwho_screwdriver.png", wield_image = "drwho_screwdriver.png", @@ -113,17 +113,14 @@ minetest.register_tool("advtrains:tttool", ^ Shall place item and return the leftover itemstack ^ default: minetest.item_place ]] on_use = function(itemstack, user, pointed_thing) - if pointed_thing.type=="object" then - local luaent=pointed_thing.ref:get_luaentity() - if luaent and luaent.is_wagon then - minetest.chat_send_all("wagon yaw is "..pointed_thing.ref:getyaw()) - minetest.chat_send_all("trains last yaw is set to "..luaent:train().last_front_yaw) - minetest.chat_send_all("end report") + if pointed_thing.type=="node" then + for x=-1,1 do + for y=-1,1 do + for z=-1,1 do + minetest.remove_node(vector.add(pointed_thing.under, {x=x, y=y, z=z})) + end + end end - else - minetest.chat_send_all(dump(minetest.get_node(pointed_thing.under))) - local c1, c2=advtrains.get_track_connections(minetest.get_node(pointed_thing.under).name, minetest.get_node(pointed_thing.under).param2) - minetest.chat_send_all(c1.." <-> "..c2) end end, --[[ diff --git a/helpers.lua b/helpers.lua index 515784b..2c87e1e 100644 --- a/helpers.lua +++ b/helpers.lua @@ -107,7 +107,7 @@ function advtrains.conway(midreal, prev, traintype)--in order prev,mid,return return nil end - local nextnode_ok, nextdir1, nextdir2, nextrely1, nextrely2, nextrailheight=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(mid), traintype) + local nextnode_ok, nextdir1, nextdir2, nextrely1, nextrely2, nextrailheight=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(next), traintype) --is it a rail? if(not nextnode_ok) then @@ -115,7 +115,7 @@ function advtrains.conway(midreal, prev, traintype)--in order prev,mid,return next.y=next.y-1 y_offset=y_offset-1 - nextnode_ok, nextdir1, nextdir2, nextrely1, nextrely2, nextrailheight=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(mid), traintype) + nextnode_ok, nextdir1, nextdir2, nextrely1, nextrely2, nextrailheight=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(next), traintype) if(not nextnode_ok) then print("[advtrains]in conway: one below "..minetest.pos_to_string(next).." is not a rail either, returning!") return nil @@ -128,7 +128,7 @@ function advtrains.conway(midreal, prev, traintype)--in order prev,mid,return next.y=next.y-1 y_offset=y_offset-1 - nextnode_ok, nextdir1, nextdir2, nextrely1, nextrely2, nextrailheight=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(mid), traintype) + nextnode_ok, nextdir1, nextdir2, nextrely1, nextrely2, nextrailheight=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(next), traintype) if(not nextnode_ok) then print("[advtrains]in conway: (at connecting if check again) one below "..minetest.pos_to_string(next).." is not a rail either, returning!") return nil diff --git a/pseudoload.lua b/pseudoload.lua index 47318ae..8511811 100644 --- a/pseudoload.lua +++ b/pseudoload.lua @@ -1,3 +1,4 @@ +local print=function(t) minetest.log("action", t) minetest.chat_send_all(t) end --pseudoload.lua --responsible for keeping up a database of all rail nodes existant in the world, regardless of whether the mapchunk is loaded. @@ -9,6 +10,9 @@ advtrains.trackdb={} --[] may be missing if 0,0,0 --load initially + +--[[ TODO temporary outcomment + --delayed since all traintypes need to be registered minetest.after(0, function() @@ -23,9 +27,10 @@ for tt, _ in pairs(advtrains.all_traintypes) do --custom format to save memory while true do local xbytes=file:read(2) - if not xbytes then + if not xbytes or #xbytes<2 then break --eof reached end + print(xbytes) local ybytes=file:read(2) local zbytes=file:read(2) local x=(string.byte(xbytes[1])-128)*256+(string.byte(xbytes[2])) @@ -74,9 +79,10 @@ function advtrains.save_trackdb() print("[advtrains]Failed saving advtrains trackdb save file "..er) else --custom format to save memory - for x,txl in pairs(advtrains.trackdb[tt]) do - for y,tyl in pairs(txl) do - for z,rail in pairs(tyl) do + for y,tyl in pairs(advtrains.trackdb[tt]) do + for x,txl in pairs(tyl) do + for z,rail in pairs(txl) do + print("write "..x.." "..y.." "..z.." "..minetest.serialize(rail)) file:write(string.char(math.floor(x/256)+128)..string.char((x%256))) file:write(string.char(math.floor(y/256)+128)..string.char((y%256))) file:write(string.char(math.floor(z/256)+128)..string.char((z%256))) @@ -93,6 +99,33 @@ function advtrains.save_trackdb() end end end +]]--end temp outcomment +advtrains.trackdb={} +advtrains.fpath_tdb=minetest.get_worldpath().."/advtrains_trackdb" +local file, err = io.open(advtrains.fpath_tdb, "r") +if not file then + local er=err or "Unknown Error" + print("[advtrains]Failed loading advtrains save file "..er) +else + local tbl = minetest.deserialize(file:read("*a")) + if type(tbl) == "table" then + advtrains.trackdb=tbl + end + file:close() +end +function advtrains.save_trackdb() + local datastr = minetest.serialize(advtrains.trackdb) + if not datastr then + minetest.log("error", "[advtrains] Failed to serialize trackdb data!") + return + end + local file, err = io.open(advtrains.fpath_tdb, "w") + if err then + return err + end + file:write(datastr) + file:close() +end --get_node with pseudoload. --returns: diff --git a/trainlogic.lua b/trainlogic.lua index 785f6f8..d12dfa2 100644 --- a/trainlogic.lua +++ b/trainlogic.lua @@ -68,7 +68,18 @@ advtrains.save = function() advtrains.wagon_save[wagon.unique_id]=advtrains.merge_tables(wagon)--so, will only copy non_metatable elements 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 + end + --print(dump(advtrains.wagon_save)) datastr = minetest.serialize(advtrains.wagon_save) if not datastr then minetest.log("error", "[advtrains] Failed to serialize train data!") @@ -80,6 +91,8 @@ advtrains.save = function() end file:write(datastr) file:close() + + advtrains.save_trackdb() end minetest.register_on_shutdown(advtrains.save) @@ -90,7 +103,7 @@ minetest.register_globalstep(function(dtime) --print("[advtrains] audit step") --clean up orphaned trains for k,v in pairs(advtrains.trains) do - advtrains.update_trainpart_properties(k) + --advtrains.update_trainpart_properties(k) if #v.trainparts==0 then advtrains.trains[k]=nil end @@ -112,7 +125,7 @@ function advtrains.train_step(id, train, dtime) --if not train.last_pos then advtrains.trains[id]=nil return end if not advtrains.pathpredict(id, train) then - --print("pathpredict failed(returned false)") + print("pathpredict failed(returned false)") train.velocity=0 train.tarvelocity=0 return @@ -122,7 +135,7 @@ function advtrains.train_step(id, train, dtime) if not path then train.velocity=0 train.tarvelocity=0 - --print("train has no path") + print("train has no path for whatever reason") return end --apply off-track handling: @@ -169,40 +182,48 @@ function advtrains.train_step(id, train, dtime) end end - --check for any trainpart entities if they have been unloaded. do this only if both front and end positions are loaded, to ensure train entities will be placed inside loaded area, and only every second. + --check for any trainpart entities if they have been unloaded. do this only if train is near a player, to not spawn entities into unloaded areas train.check_trainpartload=(train.check_trainpartload or 0)-dtime - if train.check_trainpartload<=0 and posfront and posback and minetest.get_node_or_nil(posfront) and minetest.get_node_or_nil(posback) then - --it is better to iterate luaentites only once - local found_uids={} - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized and wagon.train_id==id then - if found_uids[wagon.unique_id] then - --duplicate found, delete it - if wagon.object then wagon.object:remove() end - else - found_uids[wagon.unique_id]=true + local node_range=(math.max((minetest.setting_get("active_block_range") or 0),1)*16) + if train.check_trainpartload<=0 and posfront and posback then + print(minetest.pos_to_string(posfront)) + local should_check=false + for _,p in ipairs(minetest.get_connected_players()) do + should_check=should_check or ((vector.distance(posfront, p:getpos())