From 0dfd371e1ca3d5b73fb1ea0b41adfccd8db01aef Mon Sep 17 00:00:00 2001 From: cheapie Date: Fri, 10 Jul 2026 12:16:08 -0500 Subject: Add settings --- car.lua | 7 +++++++ controller.lua | 16 ++++++++++++---- controllerfw.lua | 9 ++++++--- dispatcher.lua | 16 ++++++++++++---- dispatcherfw.lua | 6 ++++-- drive_entity.lua | 4 +++- settingtypes.txt | 32 ++++++++++++++++++++++++++++++++ 7 files changed, 76 insertions(+), 14 deletions(-) create mode 100644 settingtypes.txt 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 -- cgit v1.2.3