bank_accounts/bank_safe.lua
2025-08-22 02:10:35 +02:00

152 lines
9.9 KiB
Lua

-- bank_safe.lua (Korrigierter Zugriff für besitzende Teller)
local safe_setup_fee = 50
local function get_safe_formspec(pos, owner_name, clicker)
local pos_str = pos.x .. "," .. pos.y .. "," .. pos.z
local formspec = "size[8,9]".. "label[0,0;"..S("Safe owned by: @1", owner_name).."]".. "list[nodemeta:".. pos_str .. ";main;1,1;6,2;]".. "list[current_player;main;0,4;8,4;]".. "listring[nodemeta:".. pos_str .. ";main]".. "listring[current_player;main]"
-- Fügt den Verwaltungs-Button nur hinzu, wenn der Besitzer auch die nötigen Rechte hat
if clicker and minetest.check_player_privs(clicker:get_player_name(), {bank_teller=true, server=true}, true) and clicker:get_player_name() == owner_name then
formspec = formspec .. "button_exit[5,0;3,1;manage_safe;"..S("Manage Safe").."]"
end
return formspec
end
local function has_safe_privilege(meta, player)
local name = ""; if player then if minetest.check_player_privs(player, {protection_bypass=true}) then return true end; name = player:get_player_name() end
if name ~= meta:get_string("owner") then return false end; return true
end
minetest.register_node("bank_accounts:safe_vacant", {
description = S("Bank Safe"),
inventory_image = "safe_front_vacant.png",
paramtype = "light",
paramtype2 = "facedir",
tiles = { "safe_side.png", "safe_side.png", "safe_side.png", "safe_side.png", "safe_side.png", "safe_front_vacant.png" },
is_ground_content = false,
groups = {cracky=1, level=2},
on_construct = function(pos)
local meta = minetest.get_meta(pos); meta:set_string("infotext", S("Bank Safe (Unassigned)")); meta:set_string("owner", "")
local inv = meta:get_inventory(); inv:set_size("main", 6*2)
end,
can_dig = function(pos, player) return minetest.get_meta(pos):get_inventory():is_empty("main") end,
on_rightclick = function(pos, node, clicker, itemstack)
pos_info = pos
local clicker_name = clicker:get_player_name()
if minetest.check_player_privs(clicker_name, {bank_teller=true, server=true}, true) then
minetest.show_formspec(clicker_name, "bank_accounts:safe_setup",
"size[8,6]"..
"label[1,0.5;"..S("Assign or Claim Safe (0 MG)").."]"..
"field[1.2,1.5;5.8,1;owner_name;"..S("Player Name:")..";]"..
"button_exit[1,2.5;6,1;set_owner;"..S("Assign to Player").."]"..
"button_exit[1,4;6,1;claim_for_self;"..S("Claim for myself").."]")
else
if itemstack:get_name() ~= "bank_accounts:atm_card" then
minetest.chat_send_player(clicker_name, S("[Safe] Please use your bank card to claim a safe."))
return
end
minetest.show_formspec(clicker_name, "bank_accounts:safe_claim",
"size[8,4]"..
"label[1,1;"..S("Claim this safe for a one-time fee of @1 MG?", safe_setup_fee).."]"..
"button_exit[1,3;2.5,1;claim;"..S("Claim").."]"..
"button_exit[4.5,3;2.5,1;cancel;"..S("Cancel").."]")
end
end,
})
minetest.register_node("bank_accounts:safe_occupied", {
description = S("Bank Safe"),
inventory_image = "safe_front_occupied.png",
paramtype = "light",
paramtype2 = "facedir",
tiles = { "safe_side.png", "safe_side.png", "safe_side.png", "safe_side.png", "safe_side.png", "safe_front_occupied.png" },
is_ground_content = false,
groups = {cracky=1, level=2},
can_dig = function(pos, player) return false end,
on_rightclick = function(pos, node, clicker, itemstack)
pos_info = pos; local meta = minetest.get_meta(pos); local owner = meta:get_string("owner"); local clicker_name = clicker:get_player_name()
-- KORRIGIERTE LOGIK-REIHENFOLGE
-- Fall 1: Der Klicker IST der Besitzer (egal ob Teller oder nicht).
if has_safe_privilege(meta, clicker) then
if itemstack:get_name() ~= "bank_accounts:atm_card" then minetest.chat_send_player(clicker_name, S("[Safe] Please use your bank card to access.")); return end
minetest.show_formspec(clicker_name, "bank_accounts:safe_pin_entry", "size[8,5]".."label[1,0.5;"..S("Please enter your PIN to access the safe.").."]".."pwdfield[2,2;4,1;pin;"..S("PIN:").."]".."button_exit[2.5,4;3,1;enter;"..S("Enter").."]")
-- Fall 2: Der Klicker ist NICHT der Besitzer, hat aber Teller- oder Server-Rechte.
elseif minetest.check_player_privs(clicker_name, {bank_teller=true, server=true}, true) then
minetest.show_formspec(clicker_name, "bank_accounts:safe_manage", "size[8,6]".."label[1,0.5;"..S("Manage Safe for @1", owner).."]".."field[1,2;6,1;owner_name;"..S("Change Owner to:")..";"..owner.."]".."button_exit[1,3;3,1;set_owner;"..S("Set Owner").."]".."button_exit[4,3;3,1;unrent;"..S("Unrent (Clear Owner)").."]")
-- Fall 3: Alle anderen.
else
minetest.chat_send_player(clicker_name, S("This safe is locked."))
end
end,
})
local common_callbacks = {
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) if not has_safe_privilege(minetest.get_meta(pos), player) then return 0 end; return count end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player) if not has_safe_privilege(minetest.get_meta(pos), player) then return 0 end; return stack:get_count() end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player) if not has_safe_privilege(minetest.get_meta(pos), player) then return 0 end; return stack:get_count() end,
}
for name, func in pairs(common_callbacks) do
minetest.registered_nodes["bank_accounts:safe_vacant"][name] = func
minetest.registered_nodes["bank_accounts:safe_occupied"][name] = func
end
minetest.register_on_player_receive_fields(function(player, formname, fields)
if not formname:find("bank_accounts:safe_") then return end
local player_name = player:get_player_name(); local pos = pos_info; if not pos then return end
local meta = minetest.get_meta(pos); local node = minetest.get_node(pos)
if formname == "bank_accounts:safe_setup" then
local target_owner = ""
if fields.set_owner then target_owner = fields.owner_name
elseif fields.claim_for_self then target_owner = player_name end
if target_owner ~= "" then
if not bank_accounts.player_has_account(target_owner) then minetest.chat_send_player(player_name, S("This player does not have a bank account and cannot be assigned a safe.")); return end
meta:set_string("owner", target_owner); meta:set_string("infotext", S("Bank Safe (owned by @1)", target_owner))
minetest.swap_node(pos, {name="bank_accounts:safe_occupied", param2=node.param2})
if target_owner == player_name then minetest.chat_send_player(player_name, S("You have claimed this safe for yourself."))
else minetest.chat_send_player(player_name, S("Safe at @1 successfully assigned to @2.", minetest.pos_to_string(pos), target_owner)) end
elseif fields.set_owner then minetest.chat_send_player(player_name, S("You must enter a name.")) end
elseif formname == "bank_accounts:safe_manage" then
if fields.set_owner then
local target_owner = fields.owner_name
if not target_owner or target_owner == "" then minetest.chat_send_player(player_name, S("You must enter a name.")); return end
if not bank_accounts.player_has_account(target_owner) then minetest.chat_send_player(player_name, S("This player does not have a bank account and cannot be assigned a safe.")); return end
meta:set_string("owner", target_owner); meta:set_string("infotext", S("Bank Safe (owned by @1)", target_owner))
minetest.chat_send_player(player_name, S("Safe at @1 successfully assigned to @2.", minetest.pos_to_string(pos), target_owner))
elseif fields.unrent then
meta:set_string("owner", ""); meta:set_string("infotext", S("Bank Safe (Unassigned)"))
minetest.swap_node(pos, {name="bank_accounts:safe_vacant", param2=node.param2})
minetest.chat_send_player(player_name, S("Ownership of safe at @1 has been cleared.", minetest.pos_to_string(pos)))
end
elseif formname == "bank_accounts:safe_inventory" then
if fields.manage_safe then
local owner = meta:get_string("owner")
minetest.show_formspec(player_name, "bank_accounts:safe_manage", "size[8,6]".."label[1,0.5;"..S("Manage Safe for @1", owner).."]".."field[1,2;6,1;owner_name;"..S("Change Owner to:")..";"..owner.."]".."button_exit[1,3;3,1;set_owner;"..S("Set Owner").."]".."button_exit[4,3;3,1;unrent;"..S("Unrent (Clear Owner)").."]")
end
elseif formname == "bank_accounts:safe_pin_entry" then
if fields.enter then
if fields.pin == bank_accounts.get_pin(player_name) then
minetest.show_formspec(player_name, "bank_accounts:safe_inventory", get_safe_formspec(pos, meta:get_string("owner"), player))
else
minetest.chat_send_player(player_name, S("[Safe] Invalid PIN."))
end
end
elseif formname == "bank_accounts:safe_claim" then
if fields.claim then
if bank_accounts.get_balance(player_name) >= safe_setup_fee then
local success = bank_accounts.add_balance(player_name, -safe_setup_fee, "Setup Fee", "Bank Safe Setup", "Bank")
if success then
meta:set_string("owner", player_name); meta:set_string("infotext", S("Bank Safe (owned by @1)", player_name))
minetest.swap_node(pos, {name="bank_accounts:safe_occupied", param2=node.param2})
minetest.chat_send_player(player_name, S("[Safe] You have successfully claimed this safe."))
else
minetest.chat_send_player(player_name, S("[Bank] System is busy, please try again in a moment."))
end
else
minetest.chat_send_player(player_name, S("[Safe] You do not have enough money to claim this safe."))
end
end
end
end)