diff --git a/controllers.lua b/controllers.lua index 6332ed3..ae63b6f 100644 --- a/controllers.lua +++ b/controllers.lua @@ -37,7 +37,9 @@ realdoors.cardreader_formspec = "size[13,3]" .. "list[context;cardslot;1,1;1,1]" .. "button[3,1;3,1;trigger;Use keycard]" .. "list[context;cardslot;7,1;1,1;1]" .. -"button[9,1;3,1;cardset;Change card]" .. +"button[10,0;3,1;cardadd;Add card]" .. +"button[10,1;3,1;cardrm;Remove card]" .. +"button[10,2;3,1;cardrst;Remove all cards]" .. "list[current_player;main;1,2;9,1]" realdoors.codepad_formspec = "size[5,6]" .. @@ -81,25 +83,72 @@ realdoors.cardreader_formspec_handler = function(pos, fields, sender) local cardstack = inv:get_stack("cardslot", 1) if cardstack:get_name() ~= "realdoors:card" then return end local key = cardstack:get_meta():get_string("id") - if fields.cardset then + + local reqkeys = minetest.deserialize(meta:get_string("keys")) or {} + + if fields.cardadd then local newstack = inv:get_stack("cardslot", 2) if newstack:get_name() ~= "realdoors:card" then return end if key == meta:get_string("key") then - meta:set_string("key", newstack:get_meta():get_string("id")) - minetest.chat_send_player(sender:get_player_name(), "This reader has been linked to card " .. key) + table.insert(reqkeys, newstack:get_meta():get_string("id")) + meta:set_string("keys", minetest.serialize(reqkeys)) + minetest.chat_send_player(sender:get_player_name(), "The following card has been added: " .. newstack:get_meta():get_string("id")) minetest.sound_play("lockbeep_ok", { pos = pos, max_hear_distance = 8, gain = 4.0, }) else - minetest.chat_send_player(sender:get_player_name(), "Your keycard is not valid") + minetest.chat_send_player(sender:get_player_name(), "Your keycard is not the correct master card") minetest.sound_play("lockbeep_error", { pos = pos, max_hear_distance = 8, gain = 4.0, }) end + return + end + if fields.cardrm then + local newstack = inv:get_stack("cardslot", 2) + if newstack:get_name() ~= "realdoors:card" then return end + if key == meta:get_string("key") then + reqkeys = table_remove(reqkeys, newstack:get_meta():get_string("id")) + meta:set_string("keys", minetest.serialize(reqkeys)) + minetest.chat_send_player(sender:get_player_name(), "The following card has been removed: " .. newstack:get_meta():get_string("id")) + minetest.sound_play("lockbeep_ok", { + pos = pos, + max_hear_distance = 8, + gain = 4.0, + }) + else + minetest.chat_send_player(sender:get_player_name(), "Your keycard is not the correct master card") + minetest.sound_play("lockbeep_error", { + pos = pos, + max_hear_distance = 8, + gain = 4.0, + }) + end + return + end + if fields.cardrst then + if key == meta:get_string("key") then + reqkeys = {} + meta:set_string("keys", minetest.serialize(reqkeys)) + minetest.chat_send_player(sender:get_player_name(), "All cards except for the master card have been removed") + minetest.sound_play("lockbeep_ok", { + pos = pos, + max_hear_distance = 8, + gain = 4.0, + }) + else + minetest.chat_send_player(sender:get_player_name(), "Your keycard is not the correct master card") + minetest.sound_play("lockbeep_error", { + pos = pos, + max_hear_distance = 8, + gain = 4.0, + }) + end + return end if not fields.trigger then return end if meta:get_string("key") == "" then @@ -112,7 +161,7 @@ realdoors.cardreader_formspec_handler = function(pos, fields, sender) }) return end - if key == meta:get_string("key") then + if table_contains(reqkeys, key) then mesecon.receptor_on(pos, realdoors.connection_rules) minetest.sound_play("lockbeep_ok", { pos = pos, diff --git a/electronic.lua b/electronic.lua index 40eccc8..8279ee5 100644 --- a/electronic.lua +++ b/electronic.lua @@ -11,7 +11,7 @@ realdoors.electronic_formspec = "size[16,4]" .. "button[1,3;3,1;close;Close door]" .. "list[current_player;main;1,2;9,1]" -local function table_contains(t, e) +function table_contains(t, e) for _, v in ipairs(t) do if v == e then return true @@ -20,7 +20,7 @@ local function table_contains(t, e) return false end -local function table_remove(t, e) +function table_remove(t, e) for k, v in ipairs(t) do if v == e then t[k] = nil