From bc8c04d146cea83e6b7c6e63c1778abff6cd0b68 Mon Sep 17 00:00:00 2001 From: orwell96 Date: Wed, 12 Apr 2023 21:31:14 +0200 Subject: Trackmap: get started --- advtrains_trackmap/viewer.lua | 44 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 advtrains_trackmap/viewer.lua (limited to 'advtrains_trackmap/viewer.lua') diff --git a/advtrains_trackmap/viewer.lua b/advtrains_trackmap/viewer.lua new file mode 100644 index 0000000..d1921d8 --- /dev/null +++ b/advtrains_trackmap/viewer.lua @@ -0,0 +1,44 @@ +-- viewer.lua +-- standalone chatcommand/tool trackmap viewer window + +local tm = advtrains.trackmap + +local function node_left_click(pos, pname) + local node_ok, conns, rail_y=advtrains.get_rail_info_at(pos) + if not node_ok then + minetest.chat_send_player(pname, "Node is not a track!") + return + end + + local function node_callback() + return nil + end + + local gridtbl = tm.generate_grid_map(pos, node_callback) + local fslabel = tm.render_grid(gridtbl.grid, gridtbl.min_pos, 100, 100) + + minetest.show_formspec(pname, "advtrains_trackmap:test", "size[20,20]"..fslabel) +end + + +minetest.register_craftitem("advtrains_trackmap:tool",{ + description = "Trackmap Tool\nPunch: Show map", + groups = {cracky=1}, -- key=name, value=rating; rating=1..3. + inventory_image = "at_il_tool.png", + wield_image = "at_il_tool.png", + stack_max = 1, + on_use = function(itemstack, player, pointed_thing) + local pname = player:get_player_name() + if not pname then + return + end + if not minetest.check_player_privs(pname, {interlocking=true}) then + minetest.chat_send_player(pname, "Insufficient privileges to use this!") + return + end + if pointed_thing.type=="node" then + local pos=pointed_thing.under + node_left_click(pos, pname) + end + end +}) \ No newline at end of file -- cgit v1.2.3 From 8371d8496a0423d992c29f38c59265a5d6f8517a Mon Sep 17 00:00:00 2001 From: orwell96 Date: Sun, 14 May 2023 15:22:59 +0200 Subject: Fix map, fix train placing --- advtrains_interlocking/database.lua | 3 ++- advtrains_interlocking/train_sections.lua | 4 ++-- advtrains_trackmap/grid.lua | 11 +++++++---- advtrains_trackmap/viewer.lua | 6 +----- 4 files changed, 12 insertions(+), 12 deletions(-) (limited to 'advtrains_trackmap/viewer.lua') diff --git a/advtrains_interlocking/database.lua b/advtrains_interlocking/database.lua index 35afc8d..551d21a 100644 --- a/advtrains_interlocking/database.lua +++ b/advtrains_interlocking/database.lua @@ -267,7 +267,8 @@ function ildb.check_and_repair_ts_at_pos(pos, tcb_connid) if ildb.get_tcb(pos) then if not tcb_connid then error("check_and_repair_ts_at_pos: Startpoint is TCB, must provide tcb_connid!") end else - if tcb_connid then error("check_and_repair_ts_at_pos: Startpoint is not TCB, must not provide tcb_connid!") end + --if tcb_connid then error("check_and_repair_ts_at_pos: Startpoint is not TCB, must not provide tcb_connid!") end + -- do not give error here, for some applications do not require it end -- STEP 1: Ensure that only one section is at this place -- get all TCBs adjacent to this diff --git a/advtrains_interlocking/train_sections.lua b/advtrains_interlocking/train_sections.lua index 757f36a..47072dc 100644 --- a/advtrains_interlocking/train_sections.lua +++ b/advtrains_interlocking/train_sections.lua @@ -167,13 +167,13 @@ advtrains.te_register_on_create(function(id, train) -- let's see what track sections we find here local index = atround(train.index) local pos = advtrains.path_get(train, index) - local ts_id, origin = ildb.get_ts_at_pos(pos) + local ts_id = ildb.check_and_repair_ts_at_pos(pos, 1) -- passing connid 1 - that always exists if ts_id then local ts = ildb.get_ts(ts_id) if ts then setsection(id, train, ts_id, ts, origin) else - atwarn("ILDB corruption: TCB",origin," has invalid TS reference") + atwarn("While placing train, TS didnt exist ",ts_id) end -- Make train a shunt move train.is_shunt = true diff --git a/advtrains_trackmap/grid.lua b/advtrains_trackmap/grid.lua index 9f367cb..d679bd6 100644 --- a/advtrains_trackmap/grid.lua +++ b/advtrains_trackmap/grid.lua @@ -10,9 +10,9 @@ local TS_MAX_SCAN = 1000 -- The characters will be chosen from the unicode frame set if appropriate -- valid character classes -, =, | local char_equiv = { - ["-"] = {"│", "/", "─", "\\"}, -- single-line - ["="] = {"║", "/", "═", "\\"}, -- double-line - ["|"] = {"─", "\\", "│", "/"}, -- break (i.e. TCB, perpendicular to orientation) + ["-"] = {"│", "/", "─", "\\\\"}, -- single-line + ["="] = {"║", "/", "═", "\\\\"}, -- double-line + ["|"] = {"─", "\\\\", "│", "/"}, -- break (i.e. TCB, perpendicular to orientation) } local dir_to_charmap = { [15] = 1, @@ -33,6 +33,7 @@ local dir_to_charmap = { [14] = 4, } function tm.rotate_char_class_by_conn(chr, conndir) + atdebug("rotatechar", chr, conndir, "dircharmap", dir_to_charmap[conndir], "charequiv", char_equiv[chr]) return char_equiv[chr][dir_to_charmap[conndir]] end @@ -62,14 +63,16 @@ function tm.generate_grid_map(start_pos, node_callback) local ok, conns = advtrains.get_rail_info_at(pos) local c = node_callback(pos, conns, connid) local chr = c and c.char + atdebug("init",pos.x,pos.z,chr,"") if not chr then - chr = tm.rotate_char_class_by_conn("=", conns[connid]) + chr = tm.rotate_char_class_by_conn("=", conns[connid].c) end -- add the char to the grid if not grid[pos.x] then grid[pos.x] = {} end + atdebug("final",pos.x,pos.z,chr,"") grid[pos.x][pos.z] = chr gminx = math.min(gminx, pos.x) diff --git a/advtrains_trackmap/viewer.lua b/advtrains_trackmap/viewer.lua index d1921d8..7752991 100644 --- a/advtrains_trackmap/viewer.lua +++ b/advtrains_trackmap/viewer.lua @@ -15,7 +15,7 @@ local function node_left_click(pos, pname) end local gridtbl = tm.generate_grid_map(pos, node_callback) - local fslabel = tm.render_grid(gridtbl.grid, gridtbl.min_pos, 100, 100) + local fslabel = tm.render_grid(gridtbl.grid, {x=pos.x-30, z=pos.z-25}, 60, 50) minetest.show_formspec(pname, "advtrains_trackmap:test", "size[20,20]"..fslabel) end @@ -32,10 +32,6 @@ minetest.register_craftitem("advtrains_trackmap:tool",{ if not pname then return end - if not minetest.check_player_privs(pname, {interlocking=true}) then - minetest.chat_send_player(pname, "Insufficient privileges to use this!") - return - end if pointed_thing.type=="node" then local pos=pointed_thing.under node_left_click(pos, pname) -- cgit v1.2.3 From 7ca8ac8d00ed8b6e707f932cc012c1eb4ace1932 Mon Sep 17 00:00:00 2001 From: orwell96 Date: Wed, 24 May 2023 20:35:18 +0200 Subject: Improve map formspec rendering --- advtrains_trackmap/fsrender.lua | 24 +++++++++++++++++++++--- advtrains_trackmap/grid.lua | 22 ++++++++++++++++++---- advtrains_trackmap/viewer.lua | 9 ++++++--- 3 files changed, 45 insertions(+), 10 deletions(-) (limited to 'advtrains_trackmap/viewer.lua') diff --git a/advtrains_trackmap/fsrender.lua b/advtrains_trackmap/fsrender.lua index 607f3cd..340b08c 100644 --- a/advtrains_trackmap/fsrender.lua +++ b/advtrains_trackmap/fsrender.lua @@ -3,15 +3,32 @@ local tm = advtrains.trackmap -function tm.render_grid(grid, origin_pos, width, height) - local s = {"label[0,0;"} +function tm.render_grid_formspec(formsize_x, formsize_y, gridtbl, origin_pos, width, height) + local grid = gridtbl.grid + local gcolor = gridtbl.gcolor + local s = { + "formspec_version[3]", + "size["..formsize_x..","..formsize_y.."]", + "no_prepend[]", + "bgcolor[white;false;white]", + "style_type[label;font=mono]", + "label[0,0;", + minetest.get_color_escape_sequence("black") + } + local last_color = nil for z=height-1, 0, -1 do -- render a row for x=0,width-1 do local apos_x = origin_pos.x + x local apos_z = origin_pos.z + z - local chr = "░" + local chr = " " if grid[apos_x] and grid[apos_x][apos_z] then + local color = gcolor[apos_x][apos_z] + if color ~= last_color then + -- change the color of the text + table.insert(s, minetest.get_color_escape_sequence(color or "black")) + last_color = color + end chr = grid[apos_x][apos_z] end table.insert(s, chr) @@ -19,5 +36,6 @@ function tm.render_grid(grid, origin_pos, width, height) table.insert(s,"\n") end table.insert(s, "]") + table.insert(s, "style_type[label;font=]") -- reset font style return table.concat(s) end \ No newline at end of file diff --git a/advtrains_trackmap/grid.lua b/advtrains_trackmap/grid.lua index d679bd6..4c98b2f 100644 --- a/advtrains_trackmap/grid.lua +++ b/advtrains_trackmap/grid.lua @@ -33,7 +33,7 @@ local dir_to_charmap = { [14] = 4, } function tm.rotate_char_class_by_conn(chr, conndir) - atdebug("rotatechar", chr, conndir, "dircharmap", dir_to_charmap[conndir], "charequiv", char_equiv[chr]) + --atdebug("rotatechar", chr, conndir, "dircharmap", dir_to_charmap[conndir], "charequiv", char_equiv[chr]) return char_equiv[chr][dir_to_charmap[conndir]] end @@ -43,6 +43,7 @@ end -- should return a table as follows: -- { -- char = "X" -- the character to use in this place, defaults to guessing a fitting frame character +-- color = "colorstring" or nil -- the color to render the character with -- stop = false -- if true, the iterator will stop following this branch -- } -- Returning nil will assume defaults. @@ -55,6 +56,8 @@ end function tm.generate_grid_map(start_pos, node_callback) local ti = advtrains.get_track_iterator(start_pos, nil, TS_MAX_SCAN, true) local grid = {} -- grid[x][y] + local gcolor = {} -- grid[x][y] + local gylev = {} -- grid[x][y] local gminx, gmaxx, gminz, gmaxz = start_pos.x, start_pos.x, start_pos.z, start_pos.z while ti:has_next_branch() do @@ -63,7 +66,7 @@ function tm.generate_grid_map(start_pos, node_callback) local ok, conns = advtrains.get_rail_info_at(pos) local c = node_callback(pos, conns, connid) local chr = c and c.char - atdebug("init",pos.x,pos.z,chr,"") + --atdebug("init",pos.x,pos.z,chr,"") if not chr then chr = tm.rotate_char_class_by_conn("=", conns[connid].c) end @@ -71,9 +74,19 @@ function tm.generate_grid_map(start_pos, node_callback) -- add the char to the grid if not grid[pos.x] then grid[pos.x] = {} + gcolor[pos.x] = {} + gylev[pos.x] = {} + end + + -- ensure that higher rails are rendered on top + local prev_ylev = gylev[pos.x][pos.z] + if not prev_ylev or prev_ylev < pos.y then + grid[pos.x][pos.z] = chr + gylev[pos.x][pos.z] = pos.y + if c and c.color then + gcolor[pos.x][pos.z] = c.color + end end - atdebug("final",pos.x,pos.z,chr,"") - grid[pos.x][pos.z] = chr gminx = math.min(gminx, pos.x) gmaxx = math.max(gmaxx, pos.x) @@ -86,6 +99,7 @@ function tm.generate_grid_map(start_pos, node_callback) end return { grid = grid, + gcolor = gcolor, min_pos = {x=gminx, z=gminz}, max_pos = {x=gmaxx, z=gmaxz}, } diff --git a/advtrains_trackmap/viewer.lua b/advtrains_trackmap/viewer.lua index 7752991..b7205c8 100644 --- a/advtrains_trackmap/viewer.lua +++ b/advtrains_trackmap/viewer.lua @@ -10,14 +10,17 @@ local function node_left_click(pos, pname) return end - local function node_callback() + local function node_callback(npos, conns, connid) + if vector.equals(pos, npos) then + return {color = "red"} + end return nil end local gridtbl = tm.generate_grid_map(pos, node_callback) - local fslabel = tm.render_grid(gridtbl.grid, {x=pos.x-30, z=pos.z-25}, 60, 50) + local fslabel = tm.render_grid_formspec(20, 20, gridtbl, {x=pos.x-35, z=pos.z-22}, 70, 44) - minetest.show_formspec(pname, "advtrains_trackmap:test", "size[20,20]"..fslabel) + minetest.show_formspec(pname, "advtrains_trackmap:test", fslabel) end -- cgit v1.2.3 From 510734f953f1bf9a4094f67a86a923dc66437f79 Mon Sep 17 00:00:00 2001 From: Maverick2797 Date: Fri, 28 Mar 2025 15:12:12 +0800 Subject: Add craft recipes for Interlocking Tool, Trackmap Tool and PCNaming Tool --- advtrains_interlocking/tool.lua | 6 ++++++ advtrains_luaautomation/pcnaming.lua | 5 +++++ advtrains_trackmap/viewer.lua | 5 +++++ 3 files changed, 16 insertions(+) (limited to 'advtrains_trackmap/viewer.lua') diff --git a/advtrains_interlocking/tool.lua b/advtrains_interlocking/tool.lua index 560e129..5ceae04 100644 --- a/advtrains_interlocking/tool.lua +++ b/advtrains_interlocking/tool.lua @@ -124,3 +124,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end end) + +minetest.register_craft({ + output = "advtrains_interlocking:tool", + type = "shapeless", + recipe = {"dye:green","advtrains:trackworker", "advtrains_interlocking:tcb_node"} +}) \ No newline at end of file diff --git a/advtrains_luaautomation/pcnaming.lua b/advtrains_luaautomation/pcnaming.lua index 0089ae7..ba8048d 100644 --- a/advtrains_luaautomation/pcnaming.lua +++ b/advtrains_luaautomation/pcnaming.lua @@ -86,3 +86,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end end) +minetest.register_craft({ + output = "advtrains_luaautomation:pcnaming", + type = "shapeless", + recipe = {"dye:red","advtrains:trackworker"} +}) \ No newline at end of file diff --git a/advtrains_trackmap/viewer.lua b/advtrains_trackmap/viewer.lua index b7205c8..2ea54ce 100644 --- a/advtrains_trackmap/viewer.lua +++ b/advtrains_trackmap/viewer.lua @@ -40,4 +40,9 @@ minetest.register_craftitem("advtrains_trackmap:tool",{ node_left_click(pos, pname) end end +}) +minetest.register_craft({ + output = "advtrains_trackmap:tool", + type = "shapeless", + recipe = {"dye:green","advtrains:trackworker", "default:paper"} }) \ No newline at end of file -- cgit v1.2.3