Add keycard management for standalone readers

master
HimbeerserverDE 2020-12-18 13:28:41 +01:00
parent 15318645d1
commit 13e1060c97
2 changed files with 57 additions and 8 deletions

View File

@ -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,

View File

@ -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