summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--car.lua7
-rw-r--r--controller.lua16
-rw-r--r--controllerfw.lua9
-rw-r--r--dispatcher.lua16
-rw-r--r--dispatcherfw.lua6
-rw-r--r--drive_entity.lua4
-rw-r--r--settingtypes.txt32
7 files changed, 76 insertions, 14 deletions
diff --git a/car.lua b/car.lua
index 2c10fd9..e6bbd8c 100644
--- a/car.lua
+++ b/car.lua
@@ -4,6 +4,13 @@ local S = core.get_translator("celevator")
local function disambiguatecartopbutton(pos,facedir,player)
if player and not player.is_fake_player then
+ local playername = player:get_player_name()
+ if core.settings:get_bool("celevator.cartop_protected",false) then
+ if core.is_protected(pos,playername) and not core.check_player_privs(playername,{protection_bypass=true}) then
+ core.record_protection_violation(pos,playername)
+ return
+ end
+ end
local eyepos = vector.add(player:get_pos(),vector.add(player:get_eye_offset(),vector.new(0,1.5,0)))
local lookdir = player:get_look_dir()
local distance = vector.distance(eyepos,pos)
diff --git a/controller.lua b/controller.lua
index a77a2e7..a3bee98 100644
--- a/controller.lua
+++ b/controller.lua
@@ -86,6 +86,12 @@ end
local function handlefields(pos,_,fields,sender)
local playername = sender and sender:get_player_name() or ""
+ if core.settings:get_bool("celevator.controller_screen_protected",false) then
+ if core.is_protected(pos,playername) and not core.check_player_privs(playername,{protection_bypass=true}) then
+ core.record_protection_violation(pos,playername)
+ return
+ end
+ end
local event = {}
event.type = "ui"
event.fields = fields
@@ -178,10 +184,12 @@ core.register_node("celevator:controller",{
return
end
local name = puncher:get_player_name()
- if core.is_protected(pos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
- core.chat_send_player(name,S("Can't open cabinet - cabinet is locked."))
- core.record_protection_violation(pos,name)
- return
+ if core.settings:get_bool("celevator.controller_cabinet_protected",true) then
+ if core.is_protected(pos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
+ core.chat_send_player(name,S("Can't open cabinet - cabinet is locked."))
+ core.record_protection_violation(pos,name)
+ return
+ end
end
node.name = "celevator:controller_open"
core.swap_node(pos,node)
diff --git a/controllerfw.lua b/controllerfw.lua
index f89c003..73c6206 100644
--- a/controllerfw.lua
+++ b/controllerfw.lua
@@ -336,6 +336,7 @@ elseif event.type == "ui" then
end
elseif mem.screenstate == "oobe_floortable" or mem.screenstate == "floortable" then
local exp = event.fields.floor and core.explode_textlist_event(event.fields.floor) or {}
+ local maxfloors = tonumber(core.settings:get("celevator.max_landings")) or 100
if event.fields.back then
mem.screenstate = "oobe_groupmode"
elseif event.fields.next then
@@ -367,7 +368,7 @@ elseif event.type == "ui" then
mem.screenstate = (mem.screenstate == "oobe_floortable" and "oobe_floortable_edit" or "floortable_edit")
elseif event.fields.edit then
mem.screenstate = (mem.screenstate == "oobe_floortable" and "oobe_floortable_edit" or "floortable_edit")
- elseif event.fields.add then
+ elseif event.fields.add and #mem.params.floornames < maxfloors then
table.insert(mem.params.floorheights,5)
table.insert(mem.params.floornames,tostring(#mem.params.floornames+1))
elseif event.fields.remove and #mem.params.floornames > 2 then
@@ -409,7 +410,8 @@ elseif event.type == "ui" then
mem.params.doortimer = doortimer
end
local contractspeed = tonumber(event.fields.contractspeed)
- if contractspeed and contractspeed >= 0.1 and contractspeed <= 20 then
+ local maxspeed = tonumber(core.settings:get("celevator.max_speed")) or 20
+ if contractspeed and contractspeed >= 0.1 and contractspeed <= maxspeed then
mem.params.contractspeed = contractspeed
end
local nudgetimer = tonumber(event.fields.nudgetimer)
@@ -1392,7 +1394,8 @@ elseif mem.screenstate == "oobe_floortable" or mem.screenstate == "floortable" t
fs(core.formspec_escape(floortext)..(i==1 and "" or ","))
end
fs(";"..tostring(#mem.params.floornames-mem.editingfloor+1)..";false]")
- if #mem.params.floornames < 100 then fs("button[8,2;2,1;add;"..S("New Floor").."]") end
+ local maxfloors = tonumber(core.settings:get("celevator.max_landings")) or 100
+ if #mem.params.floornames < maxfloors then fs("button[8,2;2,1;add;"..S("New Floor").."]") end
fs("button[8,3.5;2,1;edit;"..S("Edit Floor").."]")
if #mem.params.floornames > 2 then fs("button[8,5;2,1;remove;"..S("Remove Floor").."]") end
if mem.editingfloor < #mem.params.floornames then fs("button[8,6.5;2,1;moveup;"..S("Move Up").."]") end
diff --git a/dispatcher.lua b/dispatcher.lua
index 5a2cef5..80bd6ef 100644
--- a/dispatcher.lua
+++ b/dispatcher.lua
@@ -84,6 +84,12 @@ end
local function handlefields(pos,_,fields,sender)
local playername = sender and sender:get_player_name() or ""
+ if core.settings:get_bool("celevator.controller_screen_protected",false) then
+ if core.is_protected(pos,playername) and not core.check_player_privs(playername,{protection_bypass=true}) then
+ core.record_protection_violation(pos,playername)
+ return
+ end
+ end
local event = {}
event.type = "ui"
event.fields = fields
@@ -151,10 +157,12 @@ core.register_node("celevator:dispatcher",{
return
end
local name = puncher:get_player_name()
- if core.is_protected(pos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
- core.chat_send_player(name,S("Can't open cabinet - cabinet is locked."))
- core.record_protection_violation(pos,name)
- return
+ if core.settings:get_bool("celevator.controller_cabinet_protected",true) then
+ if core.is_protected(pos,name) and not core.check_player_privs(name,{protection_bypass=true}) then
+ core.chat_send_player(name,S("Can't open cabinet - cabinet is locked."))
+ core.record_protection_violation(pos,name)
+ return
+ end
end
node.name = "celevator:dispatcher_open"
core.swap_node(pos,node)
diff --git a/dispatcherfw.lua b/dispatcherfw.lua
index 531cc11..02b540e 100644
--- a/dispatcherfw.lua
+++ b/dispatcherfw.lua
@@ -426,6 +426,7 @@ elseif event.type == "ui" then
end
elseif mem.screenstate == "oobe_connections" or mem.screenstate == "connections" then
local exp = event.fields.connection and core.explode_textlist_event(event.fields.connection) or {}
+ local maxcars = tonumber(core.settings:get("celevator.max_group")) or 16
if event.fields.back then
mem.screenstate = "oobe_floortable"
elseif event.fields.next and #mem.params.carids > 0 then
@@ -440,7 +441,7 @@ elseif event.type == "ui" then
elseif event.fields.edit then
mem.screenstate = (mem.screenstate == "oobe_connections" and "oobe_connection" or "connection")
mem.newconnfloors = mem.params.floorsserved[mem.params.carids[mem.editingconnection]]
- elseif event.fields.add then
+ elseif event.fields.add and #mem.params.carids < maxcars then
mem.newconnfloors = {}
for i in ipairs(mem.params.floornames) do
mem.newconnfloors[i] = true
@@ -999,7 +1000,8 @@ elseif mem.screenstate == "oobe_connections" or mem.screenstate == "connections"
else
fs("label[1,2;"..S("No Connections").."]")
end
- if #mem.params.carids < 16 then fs("button[8,2;3,1;add;"..S("New Connection").."]") end
+ local maxcars = tonumber(core.settings:get("celevator.max_group")) or 16
+ if #mem.params.carids < maxcars then fs("button[8,2;3,1;add;"..S("New Connection").."]") end
if #mem.params.carids > 0 then fs("button[8,3.5;3,1;edit;"..S("Edit Connection").."]") end
if #mem.params.carids > 0 then fs("button[8,5;3,1;remove;"..S("Remove Connection").."]") end
elseif mem.screenstate == "oobe_newconnection" or mem.screenstate == "newconnection" then
diff --git a/drive_entity.lua b/drive_entity.lua
index c2f88e6..1b33d43 100644
--- a/drive_entity.lua
+++ b/drive_entity.lua
@@ -837,7 +837,9 @@ function celevator.drives.entity.pibeep(drivepos)
end
local function carsearch(pos)
- for i=1,500,1 do
+ local maxdistance = tonumber(core.settings:get("celevator.max_height")) or 500
+ maxdistance = math.max(1,maxdistance)
+ for i=1,maxdistance,1 do
local searchpos = vector.subtract(pos,vector.new(0,i,0))
local node = celevator.get_node(searchpos)
if core.get_item_group(node.name,"_celevator_car") == 1 then
diff --git a/settingtypes.txt b/settingtypes.txt
new file mode 100644
index 0000000..ef4023f
--- /dev/null
+++ b/settingtypes.txt
@@ -0,0 +1,32 @@
+[Limits]
+
+# The maximum distance that will be checked for a car when configuring a hoist machine.
+# This determines the height of the tallest possible elevator.
+# Reducing this value does not affect existing elevators.
+# NOTE: In the worst case, a vertical column of mapblocks this tall may have to be emerged.
+celevator.max_height (Maximum height) int 500 3 65535
+
+# The highest number of landings that any one elevator or group can serve.
+# Values much higher than 100 are likely to not fit on most screens.
+# Reducing this value does not remove landings from existing elevators or groups.
+celevator.max_landings (Maximum landings) int 100 2 1000
+
+# The maximum number of cars in a group.
+# Reducing this value does not remove cars from existing groups.
+celevator.max_group (Maximum group size) int 16 2 16
+
+# The maximum speed of an elevator, in meters/nodes per second.
+# Depending on the server's active block range and mapblock load speed,
+# setting an elevator to a speed too high may cause players to fall out.
+celevator.max_speed (Maximum speed) float 20.0 1.0 100.0
+
+[Protection]
+
+# Car top inspection controls require area access to operate
+celevator.cartop_protected (Car top controls protected) bool false
+
+# Controller and dispatcher cabinets require area access to open
+celevator.controller_cabinet_protected (Controller cabinet protected) bool true
+
+# Open controllers/dispatchers require area access to interact with
+celevator.controller_screen_protected (Controller screen protected) bool false