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]" ..
|
"list[context;cardslot;1,1;1,1]" ..
|
||||||
"button[3,1;3,1;trigger;Use keycard]" ..
|
"button[3,1;3,1;trigger;Use keycard]" ..
|
||||||
"list[context;cardslot;7,1;1,1;1]" ..
|
"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]"
|
"list[current_player;main;1,2;9,1]"
|
||||||
|
|
||||||
realdoors.codepad_formspec = "size[5,6]" ..
|
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)
|
local cardstack = inv:get_stack("cardslot", 1)
|
||||||
if cardstack:get_name() ~= "realdoors:card" then return end
|
if cardstack:get_name() ~= "realdoors:card" then return end
|
||||||
local key = cardstack:get_meta():get_string("id")
|
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)
|
local newstack = inv:get_stack("cardslot", 2)
|
||||||
if newstack:get_name() ~= "realdoors:card" then return end
|
if newstack:get_name() ~= "realdoors:card" then return end
|
||||||
if key == meta:get_string("key") then
|
if key == meta:get_string("key") then
|
||||||
meta:set_string("key", newstack:get_meta():get_string("id"))
|
table.insert(reqkeys, newstack:get_meta():get_string("id"))
|
||||||
minetest.chat_send_player(sender:get_player_name(), "This reader has been linked to card " .. key)
|
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", {
|
minetest.sound_play("lockbeep_ok", {
|
||||||
pos = pos,
|
pos = pos,
|
||||||
max_hear_distance = 8,
|
max_hear_distance = 8,
|
||||||
gain = 4.0,
|
gain = 4.0,
|
||||||
})
|
})
|
||||||
else
|
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", {
|
minetest.sound_play("lockbeep_error", {
|
||||||
pos = pos,
|
pos = pos,
|
||||||
max_hear_distance = 8,
|
max_hear_distance = 8,
|
||||||
gain = 4.0,
|
gain = 4.0,
|
||||||
})
|
})
|
||||||
end
|
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
|
end
|
||||||
if not fields.trigger then return end
|
if not fields.trigger then return end
|
||||||
if meta:get_string("key") == "" then
|
if meta:get_string("key") == "" then
|
||||||
|
@ -112,7 +161,7 @@ realdoors.cardreader_formspec_handler = function(pos, fields, sender)
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
if key == meta:get_string("key") then
|
if table_contains(reqkeys, key) then
|
||||||
mesecon.receptor_on(pos, realdoors.connection_rules)
|
mesecon.receptor_on(pos, realdoors.connection_rules)
|
||||||
minetest.sound_play("lockbeep_ok", {
|
minetest.sound_play("lockbeep_ok", {
|
||||||
pos = pos,
|
pos = pos,
|
||||||
|
|
|
@ -11,7 +11,7 @@ realdoors.electronic_formspec = "size[16,4]" ..
|
||||||
"button[1,3;3,1;close;Close door]" ..
|
"button[1,3;3,1;close;Close door]" ..
|
||||||
"list[current_player;main;1,2;9,1]"
|
"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
|
for _, v in ipairs(t) do
|
||||||
if v == e then
|
if v == e then
|
||||||
return true
|
return true
|
||||||
|
@ -20,7 +20,7 @@ local function table_contains(t, e)
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
local function table_remove(t, e)
|
function table_remove(t, e)
|
||||||
for k, v in ipairs(t) do
|
for k, v in ipairs(t) do
|
||||||
if v == e then
|
if v == e then
|
||||||
t[k] = nil
|
t[k] = nil
|
||||||
|
|
Loading…
Reference in New Issue