-- =================================================================== local function is_empty (s) if (s == nil) or (s == '') then return true end return false end -- =================================================================== update_formspec_internal = function (pos) local this_node = minetest.get_node (pos) if this_node == nil then return end local is_elevator = false if this_node.name == "travelnet:elevator" then is_elevator = true end local meta = minetest.get_meta (pos) if not meta then return end local owner_name = meta:get_string ("owner" ) local station_name = meta:get_string ("station_name" ) local station_network = meta:get_string ("station_network" ) if is_empty (owner_name ) or is_empty (station_name ) or is_empty (station_network ) then return end -- add name of station + network + owner + update-button local zusatzstr = "" local trheight = "10" if this_node and this_node.name == "locked_travelnet:travelnet" then zusatzstr = "field[0.3,11;6,0.7;locks_sent_lock_command;Locked travelnet. Type /help for help:;]" trheight = "11.5" end local update_msg = "" if not travelnet.enable_abm then update_msg = "label[6.3,0.0;Exit and left-punch to update]" end local formspec = "size[12," .. trheight .. "]" .. -- 1st row "label[3.3,0.0;Travelnet-Box:]" .. update_msg .. -- 2nd row "label[0.3,0.4;Name of this station:]" .. "label[3.3,0.4;" .. (station_name or "?") .. "]" .. "label[6.3,0.4;Click on target to travel there]" .. -- 3rd row "label[0.3,0.8;Assigned to Network:]" .. "label[3.3,0.8;" .. (station_network or "?") .. "]" .. -- 4th row "label[0.3,1.2;Owned by:]" .. "label[3.3,1.2;" .. (owner_name or "?") .. "]" .. "button_exit[6.3,1.2;3,0.8;station_dig;Remove station]" .. zusatzstr local x = 0; local y = 0; local i = 0; -- collect all station names in a table local stations = {}; for k,v in pairs (travelnet.targets [owner_name][station_network]) do table.insert (stations, k) end if is_elevator then local ground_level = 1 table.sort (stations, function (a,b) return travelnet.targets [owner_name][station_network][a].pos.y > travelnet.targets [owner_name][station_network][b].pos.y end) -- find ground level local vgl_timestamp = 999999999999 for index,k in ipairs (stations) do if not travelnet.targets [owner_name][station_network][k].timestamp then travelnet.targets [owner_name][station_network][k].timestamp = os.time() end if( travelnet.targets [owner_name][station_network][k].timestamp < vgl_timestamp ) then vgl_timestamp = travelnet.targets [owner_name][station_network][k].timestamp; ground_level = index end end for index,k in ipairs (stations) do if index == ground_level then travelnet.targets [owner_name][station_network][k].nr = 'G' else travelnet.targets [owner_name][station_network][k].nr = tostring (ground_level - index) end end else if travelnet.enable_legacy_sort then table.sort (stations, function (a,b) return travelnet.targets [owner_name][station_network][a].timestamp < travelnet.targets [owner_name][station_network][b].timestamp end) else table.sort (stations, function (a,b) return a < b end) end end -- If there are only 8 stations (plus this one) -- center them in the formspec -- if #stations < 10 then x = 4 end for index,k in ipairs (stations) do -- check if there is an elevator door in front that -- needs to be opened -- local open_door_cmd = false if k == station_name then open_door_cmd = true end if k ~= station_name or open_door_cmd then i = i+1 -- new column if y == 8 then x = x+4 y = 0 end if( open_door_cmd ) then formspec = formspec .."button_exit["..(x)..","..(y+2.5)..";1,0.5;open_door;<>]".. "label["..(x+0.9)..","..(y+2.35)..";"..tostring( k ).."]"; elseif( is_elevator ) then formspec = formspec .."button_exit["..(x)..","..(y+2.5)..";1,0.5;target;"..tostring( travelnet.targets [owner_name][station_network][k].nr ).."]".. "label["..(x+0.9)..","..(y+2.35)..";"..tostring( k ).."]"; else formspec = formspec .."button_exit["..(x)..","..(y+2.5)..";4,0.5;target;"..k.."]"; end y = y+1 end end meta:set_string ("formspec", formspec) meta:set_string ("infotext", "Station '" .. tostring (station_name ) .. "' on travelnet '" .. tostring (station_network) .. "' (owned by " .. tostring (owner_name ) .. ") ready for usage. Right-click to travel, punch to update.") end -- =================================================================== minetest.register_abm ({ nodenames = { "group:travelnet" } , catch_up = false , chance = 1 , interval = 1 , action = function (pos, node) local meta = minetest.get_meta (pos) if not meta then return end local owner_name = meta:get_string ("owner" ) local station_name = meta:get_string ("station_name" ) local station_network = meta:get_string ("station_network" ) if is_empty (owner_name ) or is_empty (station_name ) or is_empty (station_network ) then return end if not travelnet.targets or not travelnet.targets [owner_name] or not travelnet.targets [owner_name][station_network] or not travelnet.targets [owner_name][station_network][station_name] then travelnet.add_target (station_name, station_network, pos, owner_name, meta, owner_name) end update_formspec_internal (pos) end }) -- =================================================================== -- "mapgen tour" code -- =================================================================== -- This code implements a mapgen-related tool that is essential for -- world hosts who'd like to use "travelnet" in captured copies of -- worlds. For more information, see this mod's copy of "oldcoder. -- txt". -- =================================================================== local tp = {} local pp = minetest.string_to_pos local tp_index = 1 local emerge_busy = false -- =================================================================== local function tn_emerge_callback (blockpos, action, numleft, param) if collectgarbage ("count") > 307200 then collectgarbage() end minetest.log ("action", "tn_emerge: " .. numleft) if numleft ~= 0 then return end emerge_busy = false end -- =================================================================== -- Optional: Add statements similar to the following here: -- -- table.insert (tp, pp("-889.8,23.5,829")) -- table.insert (tp, pp("-520,45.5,200.4")) -- table.insert (tp, pp("-11093.2,15.5,11107.02")) -- table.insert (tp, pp("-22200,4.5,22200")) -- -- This will populate a table used by "/mapgentour". For more informa- -- tion, see this mod's copy of "oldcoder.txt". -- =================================================================== travelnet.nexttn = function (player) if collectgarbage ("count") > 307200 then collectgarbage() end local name = player:get_player_name() if tp_index > #tp then minetest.chat_send_player (name, "End of list") return else minetest.chat_send_player (name, "#" .. tp_index .. " of " .. #tp) end if (emerge_busy) then minetest.chat_send_player (name, "Emerge is busy") else local delta = travelnet.mapgen_radius local pos = tp [tp_index] tp_index = tp_index + 1 player:setpos (pos) local apos = { x=pos.x - delta , y=pos.y - travelnet.mapgen_below , z=pos.z - delta } local bpos = { x=pos.x + delta , y=pos.y + travelnet.mapgen_above , z=pos.z + delta } emerge_busy = true minetest.emerge_area (apos, bpos, tn_emerge_callback, nil) end minetest.after (5, travelnet.nexttn, player) end -- =================================================================== minetest.register_chatcommand ("fixtn", { description = "Internal admin command" , params = "" , privs = { give = true } , func = function (name, params) local player = minetest.env:get_player_by_name (name) if tp_index > #tp then minetest.chat_send_player (name, "End of list") return else minetest.chat_send_player (name, "#" .. tp_index .. " of " .. #tp) end local pos = tp [tp_index] tp_index = tp_index + 1 player:setpos (pos) end }) -- =================================================================== minetest.register_chatcommand ("mapgentour" , { description = "Internal admin command" , params = "" , privs = { give=true } , func = function (name, params) tp_index = 1 local player = minetest.env:get_player_by_name (name) travelnet.nexttn (player) end })