152 lines
9.9 KiB
Lua
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)
|