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