diff options
Diffstat (limited to 'fs1switch.lua')
-rw-r--r-- | fs1switch.lua | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/fs1switch.lua b/fs1switch.lua new file mode 100644 index 0000000..d63d2f1 --- /dev/null +++ b/fs1switch.lua @@ -0,0 +1,168 @@ +celevator.fs1switch = {} + +local function maketex(switchpos,lit) + local tex = "celevator_fs1switch_"..switchpos..".png" + if lit then tex = tex.."^celevator_fs1switch_led.png" end + return tex +end + +local nodebox = { + {-0.219,-0.198,0.475,0.214,0.464,0.5}, + {-0.188,-0.349,0.49,0.182,-0.229,0.5}, +} + +local function resetspring(pos) + local node = minetest.get_node(pos) + local offstates = { + ["celevator:fs1switch_reset"] = "celevator:fs1switch_off", + ["celevator:fs1switch_reset_lit"] = "celevator:fs1switch_off_lit", + } + if offstates[node.name] then + node.name = offstates[node.name] + minetest.swap_node(pos,node) + end +end + +local function rightclick(pos,node,player) + if not (player and player:is_player()) then return end + local meta = minetest.get_meta(pos) + if meta:get_string("formspec") ~= "" then return end + 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 + if node.name == "celevator:fs1switch_off" then + node.name = "celevator:fs1switch_on" + minetest.swap_node(pos,node) + elseif node.name == "celevator:fs1switch_on" then + node.name = "celevator:fs1switch_reset" + minetest.swap_node(pos,node) + minetest.after(0.5,resetspring,pos) + elseif node.name == "celevator:fs1switch_off_lit" or node.name == "celevator:fs1switch_on_lit" then + node.name = "celevator:fs1switch_reset_lit" + minetest.swap_node(pos,node) + minetest.after(0.5,resetspring,pos) + end + 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))) + if not carinfo then return end + local controllerpos = carinfo.controllerpos + local controllermeta = minetest.get_meta(controllerpos) + if controllermeta:get_int("carid") ~= carid then return end + if node.name == "celevator:fs1switch_reset" or node.name == "celevator:fs1switch_reset_lit" then + celevator.controller.handlefs1switch(controllerpos,false) + elseif node.name == "celevator:fs1switch_on" or node.name == "celevator:fs1switch_on_lit" then + celevator.controller.handlefs1switch(controllerpos,true) + end +end + +function celevator.fs1switch.setled(pos,on) + local offstates = { + ["celevator:fs1switch_on_lit"] = "celevator:fs1switch_on", + ["celevator:fs1switch_off_lit"] = "celevator:fs1switch_off", + ["celevator:fs1switch_reset_lit"] = "celevator:fs1switch_reset", + } + local onstates = { + ["celevator:fs1switch_on"] = "celevator:fs1switch_on_lit", + ["celevator:fs1switch_off"] = "celevator:fs1switch_off_lit", + ["celevator:fs1switch_reset"] = "celevator:fs1switch_reset_lit", + } + local node = minetest.get_node(pos) + if on and onstates[node.name] then + node.name = onstates[node.name] + minetest.swap_node(pos,node) + elseif (not on) and offstates[node.name] then + node.name = offstates[node.name] + minetest.swap_node(pos,node) + end +end + +local function unpair(pos) + 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))) + if not (carinfo and carinfo.fs1switches) then return end + for i,fs1switch in pairs(carinfo.fs1switches) do + if vector.equals(pos,fs1switch.pos) then + table.remove(carinfo.fs1switches,i) + celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo)) + end + end +end + +local switchstates = {"off","on","reset"} + +for _,switchpos in ipairs(switchstates) do + minetest.register_node("celevator:fs1switch_"..switchpos,{ + description = "Fire Service Phase 1 Keyswitch"..(switchpos == "off" and "" or string.format(" (%s state - you hacker you!)",switchpos)), + groups = { + dig_immediate = 2, + not_in_creative_inventory = (switchpos == "off" and 0 or 1), + _celevator_fs1switch = 1, + }, + drop = "celevator:fs1switch_off", + tiles = { + "celevator_cabinet_sides.png", + "celevator_cabinet_sides.png", + "celevator_cabinet_sides.png", + "celevator_cabinet_sides.png", + "celevator_cabinet_sides.png", + maketex(switchpos,false), + }, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = nodebox, + }, + after_place_node = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec","formspec_version[7]size[8,5]field[0.5,0.5;7,1;carid;Car ID;]button[3,3.5;2,1;save;Save]") + end, + on_receive_fields = function(pos,_,fields) + local carid = tonumber(fields.carid or 0) + if not (carid and carid >= 1 and carid == math.floor(carid)) then return end + local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid))) + if not carinfo then return end + if not carinfo.fs1switches then carinfo.fs1switches = {} end + table.insert(carinfo.fs1switches,{pos=pos}) + celevator.storage:set_string(string.format("car%d",carid),minetest.serialize(carinfo)) + local meta = minetest.get_meta(pos) + meta:set_int("carid",carid) + meta:set_string("formspec","") + end, + on_rightclick = rightclick, + on_destruct = unpair, + }) + minetest.register_node("celevator:fs1switch_"..switchpos.."_lit",{ + description = "Fire Service Phase 1 Keyswitch"..string.format(" (%s state, lit - you hacker you!)",switchpos), + groups = { + dig_immediate = 2, + not_in_creative_inventory = 1, + _celevator_fs1switch = 1, + }, + drop = "celevator:fs1switch_off", + tiles = { + "celevator_cabinet_sides.png", + "celevator_cabinet_sides.png", + "celevator_cabinet_sides.png", + "celevator_cabinet_sides.png", + "celevator_cabinet_sides.png", + maketex(switchpos,true), + }, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = nodebox, + }, + on_rightclick = rightclick, + on_destruct = unpair, + }) +end |