Add subnet feature
parent
8b80d36618
commit
5b7d4eeca7
21
README.md
21
README.md
|
@ -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+
|
||||||
|
|
|
@ -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)
|
||||||
|
local formspec = "size[7,5.4]"..
|
||||||
default.gui_bg..
|
default.gui_bg..
|
||||||
default.gui_bg_img..
|
default.gui_bg_img..
|
||||||
default.gui_slots..
|
default.gui_slots..
|
||||||
"label[0,0;"..S("Please enter the station name to\nwhich this booking machine belongs.").."]" ..
|
"label[0,0;"..S("Please enter the station name to\nwhich this booking machine belongs.").."]" ..
|
||||||
"field[0.5,1.5;5,1;name;"..S("Station name")..";MyTown]" ..
|
"field[0.2,1.5;7.1,1;name;"..S("Station name")..";MyTown]" ..
|
||||||
"field[0.5,2.7;5,1;info;"..S("Additional station information")..";]" ..
|
"field[0.2,2.7;7.1,1;info;"..S("Additional station information")..";]" ..
|
||||||
"button_exit[2,3.6;2,1;exit;Save]"
|
"field[0.2,3.9;7.1,1;subnet;"..S("Subnet name (optional)")..";]" ..
|
||||||
|
"button_exit[2.5,4.7;2,1;exit;Save]"
|
||||||
meta:set_string("formspec", formspec)
|
meta:set_string("formspec", formspec)
|
||||||
meta:set_int("change_counter", 0)
|
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
|
|
||||||
})
|
|
||||||
|
|
1
init.lua
1
init.lua
|
@ -66,6 +66,7 @@ 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")
|
||||||
|
|
15
network.lua
15
network.lua
|
@ -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
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue