Add subnet feature

master
Joachim Stolberg 2021-03-15 20:29:19 +01:00
parent 8b80d36618
commit 5b7d4eeca7
5 changed files with 105 additions and 51 deletions

View File

@ -11,8 +11,7 @@ It is the fast and modern way of travelling.
* It can be used even on small servers without lagging * It can be used even on small servers without lagging
* No configuration or programming of the tube network is necessary (only the station names have to be entered) * No configuration or programming of the tube network is necessary (only the station names have to be entered)
**[See Wiki Page for more info](https://github.com/joe7575/Minetest-Hyperloop/wiki)**
**![See Wiki Page for more info](https://github.com/joe7575/Minetest-Hyperloop/wiki)**
![screenshot](https://github.com/joe7575/Minetest-Hyperloop/blob/master/screenshot.png) ![screenshot](https://github.com/joe7575/Minetest-Hyperloop/blob/master/screenshot.png)
@ -33,9 +32,9 @@ The mod includes many different kind of blocks:
..and more. ..and more.
Browse on: ![GitHub](https://github.com/joe7575/Minetest-Hyperloop) Browse on: [GitHub](https://github.com/joe7575/Minetest-Hyperloop)
Download: ![GitHub](https://github.com/joe7575/Minetest-Hyperloop/archive/master.zip) Download: [GitHub](https://github.com/joe7575/Minetest-Hyperloop/archive/master.zip)
## Migration from v1 to v2 ## Migration from v1 to v2
@ -59,7 +58,7 @@ has some risks. Therefore:
## Introduction ## Introduction
**![See Wiki Page for more info](https://github.com/joe7575/Minetest-Hyperloop/wiki)** **[See Wiki Page for more info](https://github.com/joe7575/Minetest-Hyperloop/wiki)**
## Configuration ## Configuration
@ -68,23 +67,25 @@ The following can be changed in the minetest menu (Settings -> Advanced Settings
* "WiFi block crafting enabled" - To enable the crafting of WiFi blocks (default: false) * "WiFi block crafting enabled" - To enable the crafting of WiFi blocks (default: false)
* "free tube placement enabled" - If enabled Hyperloop Tubes and Elevator Shafts can be build in all directions (default: true) * "free tube placement enabled" - If enabled Hyperloop Tubes and Elevator Shafts can be build in all directions (default: true)
When this option is disabled, Hyperloop tubes can only be built in the horizontal direction and elevator shafts in the vertical direction. When this option is disabled, Hyperloop tubes can only be built in the horizontal direction and elevator shafts in the vertical direction.
* "enable building of subnets" - If enabled the ticket block has an additional field for specifying a subnet name. Stations with the same subnet name (optional) represent an isolated subnet within the Hyperloop network.
Example for 'minetest.conf': Example for 'minetest.conf':
```LUA ```LUA
hyperloop_wifi_enabled = true hyperloop_wifi_enabled = true -- WiFi block enabled
hyperloop_wifi_crafting_enabled = false hyperloop_wifi_crafting_enabled = false -- WiFi block crafting enabled
hyperloop_free_tube_placement_enabled = true hyperloop_free_tube_placement_enabled = true -- free tube placement enabled
hyperloop_subnet_enabled = true -- enable building of subnets
``` ```
## Dependencies ## Dependencies
tubelib2 (![GitHub](https://github.com/joe7575/tubelib2)) tubelib2 ([GitHub](https://github.com/joe7575/tubelib2))
default default
intllib intllib
optional: worldedit, techage optional: worldedit, techage
# License # License
Copyright (C) 2017,2020 Joachim Stolberg Copyright (C) 2017,2021 Joachim Stolberg
Code: Licensed under the GNU LGPL version 2.1 or later. See LICENSE.txt and http://www.gnu.org/licenses/lgpl-2.1.txt Code: Licensed under the GNU LGPL version 2.1 or later. See LICENSE.txt and http://www.gnu.org/licenses/lgpl-2.1.txt
Textures: CC0 Textures: CC0
Display: Derived from the work of kaeza, sofar and others (digilines) LGPLv2.1+ Display: Derived from the work of kaeza, sofar and others (digilines) LGPLv2.1+

View File

@ -75,35 +75,72 @@ local function remove_junctions(sortedList)
return tbl return tbl
end end
local function station_list_as_string(pos) local function filter_subnet(sortedList, subnet)
-- Generate a distance sorted list of all connected stations if hyperloop.subnet_enabled then
local sortedList = Stations:station_list(pos, pos, "dist") if subnet == "" then
-- Delete the own station from list subnet = nil
table.remove(sortedList, 1) end
local tbl = {}
for idx,item in ipairs(sortedList) do
if item.subnet == subnet then
tbl[#tbl+1] = item
end
end
return tbl
end
return sortedList
end
-- Used to update the station list for booking machine
-- and teleport list.
local function station_list_as_string(pos, subnet)
local meta = M(pos)
-- Generate a name sorted list of all connected stations
local sortedList = Stations:station_list(pos, pos, "name")
-- remove all junctions from the list -- remove all junctions from the list
sortedList = remove_junctions(sortedList) sortedList = remove_junctions(sortedList)
-- use subnet pattern to reduce the list
sortedList = filter_subnet(sortedList, subnet)
-- store the list for later use -- store the list for later use
store_station_list(pos, sortedList) store_station_list(pos, sortedList)
-- Generate the formspec string -- Generate the formspec string
return generate_string(sortedList) return generate_string(sortedList)
end end
local naming_formspec = nil
local function naming_formspec(pos) if hyperloop.subnet_enabled then
local meta = minetest.get_meta(pos) naming_formspec = function(pos)
local formspec = "size[6,4]".. local meta = M(pos)
default.gui_bg.. local formspec = "size[7,5.4]"..
default.gui_bg_img.. default.gui_bg..
default.gui_slots.. default.gui_bg_img..
"label[0,0;"..S("Please enter the station name to\nwhich this booking machine belongs.").."]" .. default.gui_slots..
"field[0.5,1.5;5,1;name;"..S("Station name")..";MyTown]" .. "label[0,0;"..S("Please enter the station name to\nwhich this booking machine belongs.").."]" ..
"field[0.5,2.7;5,1;info;"..S("Additional station information")..";]" .. "field[0.2,1.5;7.1,1;name;"..S("Station name")..";MyTown]" ..
"button_exit[2,3.6;2,1;exit;Save]" "field[0.2,2.7;7.1,1;info;"..S("Additional station information")..";]" ..
meta:set_string("formspec", formspec) "field[0.2,3.9;7.1,1;subnet;"..S("Subnet name (optional)")..";]" ..
meta:set_int("change_counter", 0) "button_exit[2.5,4.7;2,1;exit;Save]"
meta:set_string("formspec", formspec)
meta:set_int("change_counter", 0)
end
else
naming_formspec = function(pos)
local meta = M(pos)
local formspec = "size[7,4.4]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
"label[0,0;"..S("Please enter the station name to\nwhich this booking machine belongs.").."]" ..
"field[0.2,1.5;7.1,1;name;"..S("Station name")..";MyTown]" ..
"field[0.2,2.7;7.1,1;info;"..S("Additional station information")..";]" ..
"button_exit[2.5,3.7;2,1;exit;Save]"
meta:set_string("formspec", formspec)
meta:set_int("change_counter", 0)
end
end end
local function booking_machine_update(pos) local function booking_machine_update(pos)
local meta = M(pos) local meta = M(pos)
local sStationPos = meta:get_string("sStationPos") local sStationPos = meta:get_string("sStationPos")
@ -111,25 +148,19 @@ local function booking_machine_update(pos)
local station_pos = P(sStationPos) local station_pos = P(sStationPos)
local counter = meta:get_int("change_counter") or 0 local counter = meta:get_int("change_counter") or 0
local changed, newcounter = Stations:changed(counter) local changed, newcounter = Stations:changed(counter)
if changed then if changed or not tStationList[sStationPos] then
meta:set_string("formspec", station_list_as_string(station_pos)) local subnet = meta:get_string("subnet")
meta:set_string("formspec", station_list_as_string(station_pos, subnet))
meta:set_int("change_counter", newcounter) meta:set_int("change_counter", newcounter)
end end
if not tStationList[sStationPos] then
local sortedList = Stations:station_list(station_pos, station_pos, "dist")
-- Delete the own station from list
table.remove(sortedList, 1)
-- remove all junctions from the list
sortedList = remove_junctions(sortedList)
-- store the list for later use
store_station_list(station_pos, sortedList)
end
end end
end end
local function on_rightclick(pos)
booking_machine_update(pos)
end
local function on_receive_fields(pos, formname, fields, player) local function on_receive_fields(pos, formname, fields, player)
booking_machine_update(pos)
-- station name entered? -- station name entered?
if fields.name ~= nil then if fields.name ~= nil then
local station_name = string.trim(fields.name) local station_name = string.trim(fields.name)
@ -142,17 +173,25 @@ local function on_receive_fields(pos, formname, fields, player)
hyperloop.chat(player, S("Station has already a booking machine!")) hyperloop.chat(player, S("Station has already a booking machine!"))
return return
end end
-- add subnet name if available
local subnet = string.trim(fields.subnet or "")
if subnet == "" then
subnet = nil
end
-- store meta and generate station formspec -- store meta and generate station formspec
Stations:update(stationPos, { Stations:update(stationPos, {
name = station_name, name = station_name,
booking_pos = pos, booking_pos = pos,
booking_info = string.trim(fields.info), booking_info = string.trim(fields.info),
subnet = subnet,
}) })
local meta = M(pos) local meta = M(pos)
meta:set_string("sStationPos", SP(stationPos)) meta:set_string("sStationPos", SP(stationPos))
meta:set_string("infotext", "Station: "..station_name) meta:set_string("infotext", "Station: "..station_name)
meta:set_string("formspec", station_list_as_string(stationPos)) meta:set_string("subnet", string.trim(fields.subnet or ""))
meta:set_int("change_counter", 0) -- force update
booking_machine_update(pos)
else else
hyperloop.chat(player, S("Invalid station name!")) hyperloop.chat(player, S("Invalid station name!"))
end end
@ -233,6 +272,7 @@ minetest.register_node("hyperloop:booking", {
on_rotate = screwdriver.disallow, on_rotate = screwdriver.disallow,
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
on_destruct = on_destruct, on_destruct = on_destruct,
on_rightclick = on_rightclick,
paramtype = 'light', paramtype = 'light',
light_source = 2, light_source = 2,
@ -279,10 +319,4 @@ minetest.register_node("hyperloop:booking_ground", {
}) })
minetest.register_lbm({
label = "[Hyperloop] Booking machine update",
name = "hyperloop:update",
nodenames = {"hyperloop:booking", "hyperloop:booking_ground"},
run_at_every_load = true,
action = booking_machine_update
})

View File

@ -66,7 +66,8 @@ else
hyperloop.wifi_enabled = minetest.settings:get_bool("hyperloop_wifi_enabled") hyperloop.wifi_enabled = minetest.settings:get_bool("hyperloop_wifi_enabled")
hyperloop.wifi_crafting_enabled = minetest.settings:get_bool("hyperloop_wifi_crafting_enabled") hyperloop.wifi_crafting_enabled = minetest.settings:get_bool("hyperloop_wifi_crafting_enabled")
hyperloop.free_tube_placement_enabled = minetest.settings:get_bool("hyperloop_free_tube_placement_enabled", true) hyperloop.free_tube_placement_enabled = minetest.settings:get_bool("hyperloop_free_tube_placement_enabled", true)
hyperloop.subnet_enabled = minetest.settings:get_bool("hyperloop_subnet_enabled")
dofile(minetest.get_modpath("hyperloop") .. "/network.lua") dofile(minetest.get_modpath("hyperloop") .. "/network.lua")
dofile(minetest.get_modpath("hyperloop") .. "/data_base.lua") dofile(minetest.get_modpath("hyperloop") .. "/data_base.lua")
dofile(minetest.get_modpath("hyperloop") .. "/booking.lua") dofile(minetest.get_modpath("hyperloop") .. "/booking.lua")

View File

@ -96,6 +96,15 @@ local function sort_based_on_distance(tStations, pos)
return lStations return lStations
end end
-- Return a list with sorted stations
local function sort_based_on_name(tStations, pos)
local lStations = table_to_list(table.copy(tStations))
-- Add distance
lStations = add_distance_to_list(lStations, pos)
table.sort(lStations, function(a,b) return a.name < b.name end)
return lStations
end
-- --
-- Class Network -- Class Network
@ -233,8 +242,12 @@ function Network:station_list(pos, station_pos, sorted)
end end
if sorted == "dist" then if sorted == "dist" then
lStations = sort_based_on_distance(tStations, pos) lStations = sort_based_on_distance(tStations, pos)
else elseif sorted == "level" then
lStations = sort_based_on_level(tStations) lStations = sort_based_on_level(tStations)
else
-- delete own station from list
tStations[S(station_pos)] = nil
lStations = sort_based_on_name(tStations, pos)
end end
return lStations return lStations
end end
@ -263,4 +276,4 @@ end
function Network:serialize() function Network:serialize()
return minetest.serialize(self) return minetest.serialize(self)
end end

View File

@ -8,3 +8,8 @@ hyperloop_wifi_crafting_enabled (WiFi block crafting enabled) bool false
# If disabled, connected stations have to be on one level, # If disabled, connected stations have to be on one level,
# typically underground. # typically underground.
hyperloop_free_tube_placement_enabled (free tube placement enabled) bool false hyperloop_free_tube_placement_enabled (free tube placement enabled) bool false
# The ticket block has an additional field for specifying a subnet name.
# Stations with the same subnet name (optional) represent an isolated
# subnet within the Hyperloop network.
hyperloop_subnet_enabled (enable building of subnets) bool false