summaryrefslogtreecommitdiff
path: root/genericswitch.lua
diff options
context:
space:
mode:
Diffstat (limited to 'genericswitch.lua')
-rw-r--r--genericswitch.lua533
1 files changed, 533 insertions, 0 deletions
diff --git a/genericswitch.lua b/genericswitch.lua
new file mode 100644
index 0000000..d52e9c9
--- /dev/null
+++ b/genericswitch.lua
@@ -0,0 +1,533 @@
+local inputoptions = {
+ {
+ id = "none",
+ desc = "(none)",
+ func_on = function() end,
+ needsfloor = false,
+ },
+ {
+ id = "carcall",
+ desc = "Car Call at Landing:",
+ func_on = function(controllerpos,floor)
+ celevator.controller.run(controllerpos,{
+ type = "remotemsg",
+ channel = "carcall",
+ msg = floor,
+ })
+ end,
+ needsfloor = true,
+ },
+ {
+ id = "upcall",
+ desc = "Up Call (simplex car) at Landing:",
+ func_on = function(controllerpos,floor)
+ celevator.controller.run(controllerpos,{
+ type = "remotemsg",
+ channel = "upcall",
+ msg = floor,
+ })
+ end,
+ needsfloor = true,
+ },
+ {
+ id = "downcall",
+ desc = "Down Call (simplex car) at Landing:",
+ func_on = function(controllerpos,floor)
+ celevator.controller.run(controllerpos,{
+ type = "remotemsg",
+ channel = "dncall",
+ msg = floor,
+ })
+ end,
+ needsfloor = true,
+ },
+ {
+ id = "swingupcall",
+ desc = "Up Call (swing) at Landing:",
+ func_on = function(controllerpos,floor)
+ celevator.controller.run(controllerpos,{
+ type = "remotemsg",
+ channel = "swingupcall",
+ msg = floor,
+ })
+ end,
+ needsfloor = true,
+ },
+ {
+ id = "swingdowncall",
+ desc = "Down Call (swing) at Landing:",
+ func_on = function(controllerpos,floor)
+ celevator.controller.run(controllerpos,{
+ type = "remotemsg",
+ channel = "swingdncall",
+ msg = floor,
+ })
+ end,
+ needsfloor = true,
+ },
+ {
+ id = "fs1off",
+ desc = "Deactivate Fire Service Phase 1",
+ func_on = function(controllerpos)
+ celevator.controller.run(controllerpos,{
+ type = "fs1switch",
+ state = false,
+ })
+ end,
+ needsfloor = false,
+ },
+ {
+ id = "fs1on",
+ desc = "Activate Fire Service (main landing) Phase 1",
+ func_on = function(controllerpos)
+ celevator.controller.run(controllerpos,{
+ type = "fs1switch",
+ state = true,
+ })
+ end,
+ needsfloor = false,
+ },
+ {
+ id = "fs1onalt",
+ desc = "Activate Fire Service (alternate landing) Phase 1",
+ func_on = function(controllerpos)
+ celevator.controller.run(controllerpos,{
+ type = "fs1switch",
+ state = true,
+ mode = "alternate",
+ })
+ end,
+ needsfloor = false,
+ },
+ {
+ id = "mrsmoke",
+ desc = "Machine Room or Hoistway Smoke Detector",
+ func_on = function(controllerpos)
+ celevator.controller.run(controllerpos,{
+ type = "mrsmoke",
+ })
+ end,
+ needsfloor = false,
+ },
+ {
+ id = "secdeny",
+ desc = "Lock Car Calls at Landing:",
+ func_on = function(controllerpos,floor)
+ celevator.controller.run(controllerpos,{
+ type = "remotemsg",
+ channel = "security",
+ msg = {
+ floor = floor,
+ mode = "deny",
+ },
+ })
+ end,
+ needsfloor = true,
+ },
+ {
+ id = "secauth",
+ desc = "Require Auth for Car Calls at Landing:",
+ func_on = function(controllerpos,floor)
+ celevator.controller.run(controllerpos,{
+ type = "remotemsg",
+ channel = "security",
+ msg = {
+ floor = floor,
+ mode = "auth",
+ },
+ })
+ end,
+ needsfloor = true,
+ },
+ {
+ id = "secallow",
+ desc = "Unlock Car Calls at Landing:",
+ func_on = function(controllerpos,floor)
+ celevator.controller.run(controllerpos,{
+ type = "remotemsg",
+ channel = "security",
+ msg = {
+ floor = floor,
+ mode = nil,
+ },
+ })
+ end,
+ needsfloor = true,
+ },
+}
+
+local dinputoptions = {
+ {
+ id = "none",
+ desc = "(none)",
+ func_on = function() end,
+ needsfloor = false,
+ },
+ {
+ id = "upcall",
+ desc = "Up Call at Landing:",
+ func_on = function(dispatcherpos,floor)
+ celevator.dispatcher.run(dispatcherpos,{
+ type = "remotemsg",
+ channel = "upcall",
+ msg = floor,
+ })
+ end,
+ needsfloor = true,
+ },
+ {
+ id = "downcall",
+ desc = "Down Call at Landing:",
+ func_on = function(dispatcherpos,floor)
+ celevator.dispatcher.run(dispatcherpos,{
+ type = "remotemsg",
+ channel = "dncall",
+ msg = floor,
+ })
+ end,
+ needsfloor = true,
+ },
+ {
+ id = "fs1off",
+ desc = "Deactivate Fire Service Phase 1",
+ func_on = function(dispatcherpos)
+ celevator.dispatcher.run(dispatcherpos,{
+ type = "fs1switch",
+ state = false,
+ })
+ end,
+ needsfloor = false,
+ },
+ {
+ id = "fs1on",
+ desc = "Activate Fire Service Phase 1",
+ func_on = function(dispatcherpos)
+ celevator.dispatcher.run(dispatcherpos,{
+ type = "fs1switch",
+ state = true,
+ })
+ end,
+ needsfloor = false,
+ },
+}
+
+local function updateinputform(pos)
+ local meta = minetest.get_meta(pos)
+ local dmode = meta:get_int("dispatcher") == 1
+ local fs = "formspec_version[7]size[8,8.5]"
+ fs = fs.."tabheader[0,0;1;tab;Controller,Dispatcher;"..(dmode and "2" or "1")..";true;true]"
+ fs = fs.."vertlabel[0.33,1;ON]"
+ fs = fs.."dropdown[1,0.5;6,1;signal_on;"
+ local selected_on = 1
+ local currentid_on = meta:get_string("signal_on")
+ for k,v in ipairs(dmode and dinputoptions or inputoptions) do
+ fs = fs..minetest.formspec_escape(v.desc)..","
+ if v.id == currentid_on then selected_on = k end
+ end
+ fs = string.sub(fs,1,-2)
+ fs = fs..";"..selected_on..";false]"
+ fs = fs.."field[0.5,2;3,1;carid;"..(dmode and "Dispatcher ID" or "Car ID")..";${carid}]"
+ fs = fs.."field[4.5,2;3,1;floor_on;Landing Number;${floor_on}]"
+ fs = fs.."box[0,3.25;8,0.1;#CCCCCC]"
+ fs = fs.."vertlabel[0.33,4;OFF]"
+ fs = fs.."dropdown[1,3.5;6,1;signal_off;"
+ local selected_off = 1
+ local currentid_off = meta:get_string("signal_off")
+ for k,v in ipairs(dmode and dinputoptions or inputoptions) do
+ fs = fs..minetest.formspec_escape(v.desc)..","
+ if v.id == currentid_off then selected_off = k end
+ end
+ fs = string.sub(fs,1,-2)
+ fs = fs..";"..selected_off..";false]"
+ fs = fs.."field[4.5,5;3,1;floor_off;Landing Number;${floor_off}]"
+ fs = fs.."label[1.5,6.5;Not all signal options require a landing number.]"
+ fs = fs.."button_exit[2.5,7;3,1;save;Save]"
+ meta:set_string("formspec",fs)
+end
+
+local function handleinputfields(pos,_,fields,player)
+ if fields.quit and not fields.save then return end
+ local meta = minetest.get_meta(pos)
+ local name = player:get_player_name()
+ if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ if player:is_player() then
+ minetest.record_protection_violation(pos,name)
+ end
+ return
+ end
+ if fields.save then
+ local dmode = meta:get_int("dispatcher") == 1
+ if not tonumber(fields.carid) then return end
+ meta:set_int("carid",fields.carid)
+ local carid = tonumber(fields.carid)
+ local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
+ if dmode then
+ if not carinfo.dispatcherpos then return end
+ if not celevator.dispatcher.isdispatcher(carinfo.dispatcherpos) then return end
+ if minetest.is_protected(carinfo.dispatcherpos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ if player:is_player() then
+ minetest.chat_send_player(name,"Can't connect to a dispatcher you don't have access to.")
+ minetest.record_protection_violation(carinfo.dispatcherpos,name)
+ end
+ return
+ end
+ else
+ if not carinfo.controllerpos then return end
+ if not celevator.controller.iscontroller(carinfo.controllerpos) then return end
+ if minetest.is_protected(carinfo.controllerpos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ if player:is_player() then
+ minetest.chat_send_player(name,"Can't connect to a controller you don't have access to.")
+ minetest.record_protection_violation(carinfo.controllerpos,name)
+ end
+ return
+ end
+ end
+ local floor_on = tonumber(fields.floor_on)
+ if floor_on then meta:set_int("floor_on",floor_on) end
+ local def_on
+ for _,v in ipairs(dmode and dinputoptions or inputoptions) do
+ if v.desc == fields.signal_on then
+ def_on = v
+ end
+ end
+ if not def_on then return end
+ if def_on.needsfloor and not floor_on then return end
+ local floor_off = tonumber(fields.floor_off)
+ if floor_off then meta:set_int("floor_off",floor_off) end
+ local def_off
+ for _,v in ipairs(dmode and dinputoptions or inputoptions) do
+ if v.desc == fields.signal_off then
+ def_off = v
+ end
+ end
+ if not def_off then return end
+ if def_off.needsfloor and not floor_off then return end
+ meta:set_string("signal_on",def_on.id)
+ meta:set_string("signal_off",def_off.id)
+ updateinputform(pos)
+ local infotext = carid.." - "..def_on.desc..(def_on.needsfloor and " "..floor_on or "")
+ if def_on.id == "none" or def_off.id ~= "none" then
+ infotext = infotext.." / "..def_off.desc..(def_off.needsfloor and " "..floor_off or "")
+ end
+ if dmode then
+ infotext = "Dispatcher: "..infotext
+ else
+ infotext = "Car: "..infotext
+ end
+ meta:set_string("infotext",infotext)
+ if def_on.id ~= "none" or def_off.id ~= "none" then
+ meta:set_string("formspec","")
+ local momentary = def_off.id == "none"
+ local node = minetest.get_node(pos)
+ node.name = (momentary and "celevator:genericswitch_momentary_off" or "celevator:genericswitch_maintained_off")
+ minetest.swap_node(pos,node)
+ end
+ elseif fields.tab then
+ meta:set_int("dispatcher",tonumber(fields.tab)-1)
+ updateinputform(pos)
+ end
+end
+
+local function handleinput(pos,on)
+ local meta = minetest.get_meta(pos)
+ local carid = meta:get_int("carid")
+ if carid == 0 then return end
+ local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid))) or {}
+ local dmode = meta:get_int("dispatcher") == 1
+ if dmode then
+ if not carinfo.dispatcherpos then return end
+ if not celevator.dispatcher.isdispatcher(carinfo.dispatcherpos) then return end
+ else
+ if not carinfo.controllerpos then return end
+ if not celevator.controller.iscontroller(carinfo.controllerpos) then return end
+ end
+ local floor = meta:get_int(on and "floor_on" or "floor_off")
+ local signal = meta:get_string(on and "signal_on" or "signal_off")
+ local def
+ for _,v in ipairs(dmode and dinputoptions or inputoptions) do
+ if v.id == signal then
+ def = v
+ break
+ end
+ end
+ if not def then return end
+ if dmode then
+ if def.func_on then def.func_on(carinfo.dispatcherpos,floor) end
+ else
+ if def.func_on then def.func_on(carinfo.controllerpos,floor) end
+ end
+end
+
+minetest.register_node("celevator:genericswitch",{
+ description = "Elevator Keyswitch",
+ tiles = {
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_genericswitch_off.png",
+ },
+ groups = {
+ dig_immediate = 2,
+ },
+ paramtype = "light",
+ paramtype2 = "4dir",
+ drawtype = "nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.219,-0.198,0.475,0.214,0.464,0.5},
+ },
+ },
+ after_place_node = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_int("floor",1)
+ updateinputform(pos)
+ end,
+ on_receive_fields = handleinputfields,
+})
+
+minetest.register_node("celevator:genericswitch_maintained_off",{
+ description = "Elevator Keyswitch (maintained, off state - you hacker you!)",
+ tiles = {
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_genericswitch_off.png",
+ },
+ drop = "celevator:genericswitch",
+ groups = {
+ dig_immediate = 2,
+ not_in_creative_inventory = 1,
+ },
+ paramtype = "light",
+ paramtype2 = "4dir",
+ drawtype = "nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.219,-0.198,0.475,0.214,0.464,0.5},
+ },
+ },
+ on_rightclick = function(pos,node,player)
+ local name = player:get_player_name()
+ if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ minetest.chat_send_player(name,"You don't have a key for this switch.")
+ minetest.record_protection_violation(pos,name)
+ return
+ end
+ node.name = "celevator:genericswitch_maintained_on"
+ minetest.swap_node(pos,node)
+ handleinput(pos,true)
+ end,
+})
+
+minetest.register_node("celevator:genericswitch_maintained_on",{
+ description = "Elevator Keyswitch (maintained, on state - you hacker you!)",
+ tiles = {
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_genericswitch_on.png",
+ },
+ drop = "celevator:genericswitch",
+ groups = {
+ dig_immediate = 2,
+ not_in_creative_inventory = 1,
+ },
+ paramtype = "light",
+ paramtype2 = "4dir",
+ drawtype = "nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.219,-0.198,0.475,0.214,0.464,0.5},
+ },
+ },
+ on_rightclick = function(pos,node,player)
+ local name = player:get_player_name()
+ if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ minetest.chat_send_player(name,"You don't have a key for this switch.")
+ minetest.record_protection_violation(pos,name)
+ return
+ end
+ node.name = "celevator:genericswitch_maintained_off"
+ minetest.swap_node(pos,node)
+ handleinput(pos,false)
+ end,
+})
+
+minetest.register_node("celevator:genericswitch_momentary_off",{
+ description = "Elevator Keyswitch (momentary, off state - you hacker you!)",
+ tiles = {
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_genericswitch_momentary_off.png",
+ },
+ drop = "celevator:genericswitch",
+ groups = {
+ dig_immediate = 2,
+ not_in_creative_inventory = 1,
+ },
+ paramtype = "light",
+ paramtype2 = "4dir",
+ drawtype = "nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.219,-0.198,0.475,0.214,0.464,0.5},
+ },
+ },
+ on_rightclick = function(pos,node,player)
+ local name = player:get_player_name()
+ if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ minetest.chat_send_player(name,"You don't have a key for this switch.")
+ minetest.record_protection_violation(pos,name)
+ return
+ end
+ node.name = "celevator:genericswitch_momentary_on"
+ minetest.swap_node(pos,node)
+ handleinput(pos,true)
+ minetest.after(1,function()
+ local newnode = minetest.get_node(pos)
+ if newnode.name == "celevator:genericswitch_momentary_on" then
+ newnode.name = "celevator:genericswitch_momentary_off"
+ minetest.swap_node(pos,newnode)
+ end
+ end)
+ end,
+})
+
+minetest.register_node("celevator:genericswitch_momentary_on",{
+ description = "Elevator Keyswitch (momentary, on state - you hacker you!)",
+ tiles = {
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_cabinet_sides.png",
+ "celevator_genericswitch_momentary_on.png",
+ },
+ drop = "celevator:genericswitch",
+ groups = {
+ dig_immediate = 2,
+ not_in_creative_inventory = 1,
+ },
+ paramtype = "light",
+ paramtype2 = "4dir",
+ drawtype = "nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.219,-0.198,0.475,0.214,0.464,0.5},
+ },
+ },
+})