Add keycard management for standalone readers
parent
15318645d1
commit
13e1060c97
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue