From 01f0d2c44559fd30c81d69707324bd0e9e4742c0 Mon Sep 17 00:00:00 2001 From: orwell96 Date: Tue, 31 Jan 2017 20:36:38 +0100 Subject: Join itrainmap mod into the modpack --- advtrains/advtrains_itrainmap/depends.txt | 1 + advtrains/advtrains_itrainmap/init.lua | 151 +++++++++++++++++++++ .../advtrains_itrainmap/textures/itm_example.png | Bin 0 -> 154460 bytes 3 files changed, 152 insertions(+) create mode 100644 advtrains/advtrains_itrainmap/depends.txt create mode 100644 advtrains/advtrains_itrainmap/init.lua create mode 100644 advtrains/advtrains_itrainmap/textures/itm_example.png (limited to 'advtrains/advtrains_itrainmap') diff --git a/advtrains/advtrains_itrainmap/depends.txt b/advtrains/advtrains_itrainmap/depends.txt new file mode 100644 index 0000000..6f00bf6 --- /dev/null +++ b/advtrains/advtrains_itrainmap/depends.txt @@ -0,0 +1 @@ +advtrains \ No newline at end of file diff --git a/advtrains/advtrains_itrainmap/init.lua b/advtrains/advtrains_itrainmap/init.lua new file mode 100644 index 0000000..60ee944 --- /dev/null +++ b/advtrains/advtrains_itrainmap/init.lua @@ -0,0 +1,151 @@ + + +local map_def={ + example = { + p1x=168, + p1z=530, + p2x=780, + p2z=1016, + background="itm_example.png", + }, +} + +local itm_cache={} +local itm_pdata={} +local itm_conf_mindia=0.1 + +minetest.register_privilege("itm", { description = "Allows to display train map", give_to_singleplayer = true, default = false }) + +local function create_map_form_with_bg(d) + local minx, minz, maxx, maxz = math.min(d.p1x, d.p2x), math.min(d.p1z, d.p2z), math.max(d.p1x, d.p2x), math.max(d.p1z, d.p2z) + local form_x, form_z=10,10 + local edge_x, edge_z = form_x/(maxx-minx), form_z/(maxz-minz) + local len_x, len_z=math.max(edge_x, itm_conf_mindia), math.max(edge_z, itm_conf_mindia) + local form="size["..(form_x+edge_x)..","..(form_z+edge_z).."] background[0,0;0,0;"..d.background..";true] " + local lbl={} + + for pts, tid in pairs(advtrains.detector.on_node) do + local pos=minetest.string_to_pos(pts) + form=form.."box["..(edge_x*(pos.x-minx))..","..(form_z-(edge_z*(pos.z-minz)))..";"..len_x..","..len_z..";red]" + lbl[sid(tid)]=pos + end + + for t_id, xz in pairs(lbl) do + form=form.."label["..(edge_x*(xz.x-minx))..","..(form_x-(edge_z*(xz.z-minz)))..";"..t_id.."]" + end + return form +end + +local function create_map_form(d) + if d.background then + return create_map_form_with_bg(d) + end + + local minx, minz, maxx, maxz = math.min(d.p1x, d.p2x), math.min(d.p1z, d.p2z), math.max(d.p1x, d.p2x), math.max(d.p1z, d.p2z) + local form_x, form_z=10,10 + local edge_x, edge_z = form_x/(maxx-minx), form_z/(maxz-minz) + local len_x, len_z=math.max(edge_x, itm_conf_mindia), math.max(edge_z, itm_conf_mindia) + local form="size["..(form_x+edge_x)..","..(form_z+edge_z).."]" + local lbl={} + + for x,itx in pairs(itm_cache) do + if x>=minx and x<=maxx then + for z,y in pairs(itx) do + if z>=minz and z<=maxz then + local adn=advtrains.detector.on_node[minetest.pos_to_string({x=x, y=y, z=z})] + local color="gray" + if adn then + color="red" + lbl[sid(adn)]={x=x, z=z} + end + form=form.."box["..(edge_x*(x-minx))..","..(form_z-(edge_z*(z-minz)))..";"..len_x..","..len_z..";"..color.."]" + end + end + end + end + for t_id, xz in pairs(lbl) do + form=form.."label["..(edge_x*(xz.x-minx))..","..(form_x-(edge_z*(xz.z-minz)))..";"..t_id.."]" + end + return form +end + +local function cache_ndb() + itm_cache={} + local ndb_nodes=advtrains.ndb.get_nodes() + for phs,_ in pairs(ndb_nodes) do + local pos=minetest.get_position_from_hash(phs) + if not itm_cache[pos.x] then + itm_cache[pos.x]={} + end + itm_cache[pos.x][pos.z]=pos.y + end +end + +minetest.register_chatcommand("itm", { + params="[x1 z1 x2 z2] or [mdef]", + description="Display advtrains train map of given area.\nFirst form:[x1 z1 x2 z2] - specify area directly.\nSecond form:[mdef] - Use a predefined map background(see init.lua)\nThird form: No parameters - use WorldEdit position markers.", + privs={itm=true}, + func = function(name, param) + local mdef=string.match(param, "^(%S+)$") + if mdef then + local d=map_def[mdef] + if not d then + return false, "Map definiton not found: "..mdef + end + itm_pdata[name]=map_def[mdef] + minetest.show_formspec(name, "itrainmap", create_map_form(d)) + return true, "Showing train map: "..mdef + end + local x1, z1, x2, z2=string.match(param, "^(%S+) (%S+) (%S+) (%S+)$") + if not (x1 and z1 and x2 and z2) then + if worldedit then + local wep1, wep2=worldedit.pos1[name], worldedit.pos2[name] + if wep1 and wep2 then + x1, z1, x2, z2=wep1.x, wep1.z, wep2.x, wep2.z + end + end + end + if not (x1 and z1 and x2 and z2) then + return false, "Invalid parameters and no WE positions set" + end + local d={p1x=x1, p1z=z1, p2x=x2, p2z=z2} + itm_pdata[name]=d + minetest.show_formspec(name, "itrainmap", create_map_form(d)) + return true, "Showing ("..x1..","..z1..")-("..x2..","..z2..")" + end, +}) +minetest.register_chatcommand("itm_cache_ndb", { + params="", + description="Cache advtrains node database again. Run when tracks changed.", + privs={itm=true}, + func = function(name, param) + cache_ndb() + return true, "Done caching node database." + end, +}) + +local timer=0 +minetest.register_globalstep(function(dtime) + timer=timer-math.min(dtime, 0.1) + if timer<=0 then + local t1=os.clock() + local any=false + for pname,d in pairs(itm_pdata) do + minetest.show_formspec(pname, "itrainmap", create_map_form(d)) + any=true + end + if any then + minetest.log("action", "itm "..math.floor((os.clock()-t1)*1000).."ms") + end + timer=2 + end +end) +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname=="itrainmap" and fields.quit then + minetest.log("action", "itm form quit") + itm_pdata[player:get_player_name()]=nil + end +end) + +--automatically run itm_cache_ndb +minetest.after(2, cache_ndb) diff --git a/advtrains/advtrains_itrainmap/textures/itm_example.png b/advtrains/advtrains_itrainmap/textures/itm_example.png new file mode 100644 index 0000000..caf084a Binary files /dev/null and b/advtrains/advtrains_itrainmap/textures/itm_example.png differ -- cgit v1.2.3 From f6d1157ba1b3bc8519b7c01f6b5974b0f9f5cae1 Mon Sep 17 00:00:00 2001 From: orwell96 Date: Thu, 2 Feb 2017 00:02:11 +0100 Subject: Lua automation - initial incomplete coding --- advtrains/advtrains/api_doc.txt | 2 +- advtrains/advtrains/atc.lua | 8 +++--- advtrains/advtrains/nodedb.lua | 4 +++ advtrains/advtrains/signals.lua | 22 +++++++++++----- advtrains/advtrains/trackplacer.lua | 4 +-- advtrains/advtrains/tracks.lua | 47 +++++++++++++++++++++++++--------- advtrains/advtrains/trainlogic.lua | 28 +++----------------- advtrains/advtrains_itrainmap/init.lua | 4 +-- 8 files changed, 67 insertions(+), 52 deletions(-) (limited to 'advtrains/advtrains_itrainmap') diff --git a/advtrains/advtrains/api_doc.txt b/advtrains/advtrains/api_doc.txt index af9c071..09b3cc1 100644 --- a/advtrains/advtrains/api_doc.txt +++ b/advtrains/advtrains/api_doc.txt @@ -134,7 +134,7 @@ minetest.register_node(nodename, { ^- the height value of this rail that is saved in the path. usually the median of rely1 and rely2. can_dig=function(pos) - return not advtrains.is_train_at_pos(pos) + return not advtrains.get_train_at_pos(pos) end, after_dig_node=function(pos) advtrains.invalidate_all_paths() diff --git a/advtrains/advtrains/atc.lua b/advtrains/advtrains/atc.lua index 7c2cec0..85c62d8 100644 --- a/advtrains/advtrains/atc.lua +++ b/advtrains/advtrains/atc.lua @@ -8,8 +8,8 @@ function atc.load_data(data) local temp = data and data.controllers or {} --transcode atc controller data to node hashes: table access times for numbers are far less than for strings for pts, data in pairs(temp) do - if type(pts)="string" then - pts=minetest.hash_node_position(minetest.pos_to_string(pts)) + if type(pts)=="string" then + pts=minetest.hash_node_position(minetest.string_to_pos(pts)) end atc.controllers[pts] = data end @@ -28,7 +28,7 @@ end --general function atc.send_command(pos) - local pts=minetest.hash_node_position(ppos) + local pts=minetest.hash_node_position(pos) if atc.controllers[pts] then --atprint("Called send_command at "..pts) local train_id = advtrains.detector.on_node[pts] @@ -88,7 +88,7 @@ advtrains.register_tracks("default", { after_dig_node=function(pos) advtrains.invalidate_all_paths() advtrains.ndb.clear(pos) - local pts=minetest.hash_node_position(ppos) + local pts=minetest.hash_node_position(pos) atc.controllers[pts]=nil end, on_receive_fields = function(pos, formname, fields, player) diff --git a/advtrains/advtrains/nodedb.lua b/advtrains/advtrains/nodedb.lua index 0a8c1e8..e3ed56d 100644 --- a/advtrains/advtrains/nodedb.lua +++ b/advtrains/advtrains/nodedb.lua @@ -208,6 +208,10 @@ minetest.register_abm({ 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 end end else diff --git a/advtrains/advtrains/signals.lua b/advtrains/advtrains/signals.lua index d521c8a..b475d3c 100644 --- a/advtrains/advtrains/signals.lua +++ b/advtrains/advtrains/signals.lua @@ -1,6 +1,6 @@ --advtrains by orwell96 --signals.lua -for r,f in pairs({on="off", off="on"}) do +for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", als="green"}}) do advtrains.trackplacer.register_tracktype("advtrains:retrosignal", "") advtrains.trackplacer.register_tracktype("advtrains:signal", "") @@ -32,12 +32,12 @@ for r,f in pairs({on="off", off="on"}) do save_in_nodedb=1, }, mesecons = {effector = { - ["action_"..f] = function (pos, node) - advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_"..f..rotation, param2 = node.param2}) + ["action_"..f.as] = function (pos, node) + advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_"..f.as..rotation, param2 = node.param2}) end }}, on_rightclick=function(pos, node, clicker) - advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_"..f..rotation, param2 = node.param2}) + advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_"..f.as..rotation, param2 = node.param2}) end, }) advtrains.trackplacer.add_worked("advtrains:retrosignal", r, rotation, nil) @@ -65,12 +65,20 @@ for r,f in pairs({on="off", off="on"}) do light_source = 1, sunlight_propagates=true, mesecons = {effector = { - ["action_"..f] = function (pos, node) - advtrains.ndb.swap_node(pos, {name = "advtrains:signal_"..f..rotation, param2 = node.param2}) + ["action_"..f.as] = function (pos, node) + advtrains.ndb.swap_node(pos, {name = "advtrains:signal_"..f.as..rotation, param2 = node.param2}) end }}, + luaautomation = { + getstate = f.ls, + setstate = function(pos, node, newstate) + if newstate == f.als then + advtrains.ndb.swap_node(pos, {name = "advtrains:signal_"..f.as..rotation, param2 = node.param2}) + end + end, + }, on_rightclick=function(pos, node, clicker) - advtrains.ndb.swap_node(pos, {name = "advtrains:signal_"..f..rotation, param2 = node.param2}) + advtrains.ndb.swap_node(pos, {name = "advtrains:signal_"..f.as..rotation, param2 = node.param2}) end, }) advtrains.trackplacer.add_worked("advtrains:signal", r, rotation, nil) diff --git a/advtrains/advtrains/trackplacer.lua b/advtrains/advtrains/trackplacer.lua index d1045aa..e5e3340 100644 --- a/advtrains/advtrains/trackplacer.lua +++ b/advtrains/advtrains/trackplacer.lua @@ -230,7 +230,7 @@ minetest.register_craftitem("advtrains:trackworker",{ local node=minetest.get_node(pos) --if not advtrains.is_track_and_drives_on(minetest.get_node(pos).name, advtrains.all_tracktypes) then return end - if advtrains.is_train_at_pos(pos) then return end + if advtrains.get_train_at_pos(pos) then return end local nnprefix, suffix, rotation=string.match(node.name, "^(.+)_([^_]+)(_[^_]+)$") --atprint(node.name.."\npattern recognizes:"..nodeprefix.." / "..railtype.." / "..rotation) @@ -272,7 +272,7 @@ minetest.register_craftitem("advtrains:trackworker",{ end --if not advtrains.is_track_and_drives_on(minetest.get_node(pos).name, advtrains.all_tracktypes) then return end - if advtrains.is_train_at_pos(pos) then return end + if advtrains.get_train_at_pos(pos) then return end local nnprefix, suffix, rotation=string.match(node.name, "^(.+)_([^_]+)(_[^_]+)$") --atprint(node.name.."\npattern recognizes:"..nodeprefix.." / "..railtype.." / "..rotation) if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twcycle[suffix] then diff --git a/advtrains/advtrains/tracks.lua b/advtrains/advtrains/tracks.lua index 2c5c121..cde2b35 100644 --- a/advtrains/advtrains/tracks.lua +++ b/advtrains/advtrains/tracks.lua @@ -77,6 +77,12 @@ ap.t_30deg={ swrst="on", swrcr="off", }, + switchst={ + swlst="st", + swlcr="cr", + swrst="st", + swrcr="cr", + }, regtp=true, trackplacer={ st=true, @@ -195,6 +201,12 @@ ap.t_45deg={ swrst="on", swrcr="off", }, + switchst={ + swlst="st", + swlcr="cr", + swrst="st", + swrcr="cr", + }, regtp=true, trackplacer={ st=true, @@ -233,16 +245,26 @@ advtrains.trackpresets = ap common={} change something on common rail appearance }]] function advtrains.register_tracks(tracktype, def, preset) - local function make_switchfunc(suffix_target, mesecon_state) - local switchfunc=function(pos, node) - advtrains.ndb.swap_node(pos, {name=def.nodename_prefix.."_"..suffix_target, param2=node.param2}) + local function make_switchfunc(suffix_target, mesecon_state, is_state) + local switchfunc=function(pos, node, newstate) + if newstate~=is_state then + advtrains.ndb.swap_node(pos, {name=def.nodename_prefix.."_"..suffix_target, param2=node.param2}) + end end - return switchfunc, {effector = { - ["action_"..mesecon_state] = switchfunc, - rules=advtrains.meseconrules - }} + local mesec + if mesecon_state then -- if mesecons is not wanted, do not. + mesec = {effector = { + ["action_"..mesecon_state] = switchfunc, + rules=advtrains.meseconrules + }} + end + return switchfunc, mesec, + { + getstate = is_state, + setstate = switchfunc, + } end - local function make_overdef(suffix, rotation, conns, switchfunc, mesecontbl, in_creative_inv, drop_slope) + local function make_overdef(suffix, rotation, conns, switchfunc, mesecontbl, luaautomation, in_creative_inv, drop_slope) local img_suffix=suffix..rotation return { mesh = def.shared_model or (def.models_prefix.."_"..img_suffix..def.models_suffix), @@ -266,6 +288,7 @@ function advtrains.register_tracks(tracktype, def, preset) not_blocking_trains=1, }, mesecons=mesecontbl, + luaautomation=luaautomation, drop = increativeinv and def.nodename_prefix.."_"..suffix..rotation or (drop_slope and def.nodename_prefix.."_slopeplacer" or def.nodename_prefix.."_placer"), } end @@ -294,7 +317,7 @@ function advtrains.register_tracks(tracktype, def, preset) railheight=0, drop=def.nodename_prefix.."_placer", can_dig=function(pos) - return not advtrains.is_train_at_pos(pos) + return not advtrains.get_train_at_pos(pos) end, after_dig_node=function(pos) advtrains.invalidate_all_paths() @@ -315,9 +338,9 @@ function advtrains.register_tracks(tracktype, def, preset) for suffix, conns in pairs(preset.variant) do for rotid, rotation in ipairs(preset.rotation) do if not def.formats[suffix] or def.formats[suffix][rotid] then - local switchfunc, mesecontbl + local switchfunc, mesecontbl, luaautomation if preset.switch[suffix] then - switchfunc, mesecontbl=make_switchfunc(preset.switch[suffix]..rotation, preset.switchmc[suffix]) + switchfunc, mesecontbl, luaautomation=make_switchfunc(preset.switch[suffix]..rotation, preset.switchmc[suffix], preset.switchst[suffix]) end local adef={} if def.get_additional_definiton then @@ -329,7 +352,7 @@ function advtrains.register_tracks(tracktype, def, preset) make_overdef( suffix, rotation, cycle_conns(conns, rotid), - switchfunc, mesecontbl, preset.increativeinv[suffix], preset.slopenodes[suffix] + switchfunc, mesecontbl, luaautomation, preset.increativeinv[suffix], preset.slopenodes[suffix] ), adef ) diff --git a/advtrains/advtrains/trainlogic.lua b/advtrains/advtrains/trainlogic.lua index 1bc732d..534b2b3 100644 --- a/advtrains/advtrains/trainlogic.lua +++ b/advtrains/advtrains/trainlogic.lua @@ -754,31 +754,11 @@ function advtrains.invert_train(train_id) advtrains.update_trainpart_properties(train_id, true) end -function advtrains.is_train_at_pos(pos) - --atprint("istrainat: pos "..minetest.pos_to_string(pos)) - local checked_trains={} - local objrefs=minetest.get_objects_inside_radius(pos, 2) - for _,v in pairs(objrefs) do - local le=v:get_luaentity() - if le and le.is_wagon and le.initialized and le.train_id and not checked_trains[le.train_id] then - --atprint("istrainat: checking "..le.train_id) - checked_trains[le.train_id]=true - local path=le:train().path - if path then - --atprint("has path") - for i=math.floor(advtrains.get_train_end_index(le:train())+0.5),math.floor(le:train().index+0.5) do - if path[i] then - --atprint("has pathitem "..i.." "..minetest.pos_to_string(path[i])) - if vector.equals(advtrains.round_vector_floor_y(path[i]), pos) then - return true - end - end - end - end - end - end - return false +function advtrains.get_train_at_pos(pos) + local ph=minetest.hash_node_position(advtrains.round_vector_floor_y(pos)) + return advtrains.detector.on_node[ph] end + function advtrains.invalidate_all_paths() --atprint("invalidating all paths") for k,v in pairs(advtrains.trains) do diff --git a/advtrains/advtrains_itrainmap/init.lua b/advtrains/advtrains_itrainmap/init.lua index 60ee944..db1c40b 100644 --- a/advtrains/advtrains_itrainmap/init.lua +++ b/advtrains/advtrains_itrainmap/init.lua @@ -25,7 +25,7 @@ local function create_map_form_with_bg(d) local lbl={} for pts, tid in pairs(advtrains.detector.on_node) do - local pos=minetest.string_to_pos(pts) + local pos=minetest.get_pos_from_hash(pts) form=form.."box["..(edge_x*(pos.x-minx))..","..(form_z-(edge_z*(pos.z-minz)))..";"..len_x..","..len_z..";red]" lbl[sid(tid)]=pos end @@ -52,7 +52,7 @@ local function create_map_form(d) if x>=minx and x<=maxx then for z,y in pairs(itx) do if z>=minz and z<=maxz then - local adn=advtrains.detector.on_node[minetest.pos_to_string({x=x, y=y, z=z})] + local adn=advtrains.detector.on_node[minetest.hash_node_position({x=x, y=y, z=z})] local color="gray" if adn then color="red" -- cgit v1.2.3 From 82efe2e773e5c8d18e948811ef3d9d1df1c95157 Mon Sep 17 00:00:00 2001 From: orwell96 Date: Fri, 3 Feb 2017 10:27:34 +0100 Subject: Fix itrainmap not working --- advtrains/advtrains_itrainmap/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'advtrains/advtrains_itrainmap') diff --git a/advtrains/advtrains_itrainmap/init.lua b/advtrains/advtrains_itrainmap/init.lua index db1c40b..b1168f1 100644 --- a/advtrains/advtrains_itrainmap/init.lua +++ b/advtrains/advtrains_itrainmap/init.lua @@ -25,7 +25,7 @@ local function create_map_form_with_bg(d) local lbl={} for pts, tid in pairs(advtrains.detector.on_node) do - local pos=minetest.get_pos_from_hash(pts) + local pos=minetest.get_position_from_hash(pts) form=form.."box["..(edge_x*(pos.x-minx))..","..(form_z-(edge_z*(pos.z-minz)))..";"..len_x..","..len_z..";red]" lbl[sid(tid)]=pos end -- cgit v1.2.3 From b3ce833df80e679e55175fe324a9c6137a6c5cc3 Mon Sep 17 00:00:00 2001 From: orwell96 Date: Fri, 3 Feb 2017 20:43:46 +0100 Subject: fix up stuff in itrainmap --- advtrains/advtrains_itrainmap/init.lua | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) (limited to 'advtrains/advtrains_itrainmap') diff --git a/advtrains/advtrains_itrainmap/init.lua b/advtrains/advtrains_itrainmap/init.lua index b1168f1..02dbc9e 100644 --- a/advtrains/advtrains_itrainmap/init.lua +++ b/advtrains/advtrains_itrainmap/init.lua @@ -25,7 +25,7 @@ local function create_map_form_with_bg(d) local lbl={} for pts, tid in pairs(advtrains.detector.on_node) do - local pos=minetest.get_position_from_hash(pts) + local pos=minetest.string_to_pos(pts) form=form.."box["..(edge_x*(pos.x-minx))..","..(form_z-(edge_z*(pos.z-minz)))..";"..len_x..","..len_z..";red]" lbl[sid(tid)]=pos end @@ -52,7 +52,7 @@ local function create_map_form(d) if x>=minx and x<=maxx then for z,y in pairs(itx) do if z>=minz and z<=maxz then - local adn=advtrains.detector.on_node[minetest.hash_node_position({x=x, y=y, z=z})] + local adn=advtrains.detector.on_node[minetest.pos_to_string({x=x, y=y, z=z})] local color="gray" if adn then color="red" @@ -128,21 +128,14 @@ local timer=0 minetest.register_globalstep(function(dtime) timer=timer-math.min(dtime, 0.1) if timer<=0 then - local t1=os.clock() - local any=false for pname,d in pairs(itm_pdata) do minetest.show_formspec(pname, "itrainmap", create_map_form(d)) - any=true - end - if any then - minetest.log("action", "itm "..math.floor((os.clock()-t1)*1000).."ms") end timer=2 end end) minetest.register_on_player_receive_fields(function(player, formname, fields) if formname=="itrainmap" and fields.quit then - minetest.log("action", "itm form quit") itm_pdata[player:get_player_name()]=nil end end) -- cgit v1.2.3