From 1af99a133556f8c20cc44ef700de9ded04328930 Mon Sep 17 00:00:00 2001 From: 1F616EMO Date: Sun, 6 Oct 2024 14:05:59 +0800 Subject: [PATCH] Allow setting owner --- init.lua | 129 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 92 insertions(+), 37 deletions(-) diff --git a/init.lua b/init.lua index 161db5f..e57679b 100644 --- a/init.lua +++ b/init.lua @@ -55,15 +55,30 @@ local function can_manage(pos, player) return true end -function mailbox.rent_mailbox(pos, player) - local node = minetest.get_node(pos) - node.name = "mailbox:mailbox" - minetest.set_node(pos, node) - - local meta = minetest.get_meta(pos) +local function can_set_owner(player) local pname = player:get_player_name() + return minetest.check_player_privs(pname, { protection_bypass = true }) +end +function mailbox.set_owner(pos, pname) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) meta:set_string("owner", pname) + if pname == "" then + meta:set_string("infotext", S("Free Mailbox, right-click to claim")) + node.name = "mailbox:mailbox_free" + minetest.swap_node(pos, node) + else + meta:set_string("infotext", S("@1's Mailbox", pname)) + if node.name == "mailbox:mailbox_free" then + node.name = "mailbox:mailbox" + minetest.swap_node(pos, node) + end + end +end + +function mailbox.rent_mailbox(pos, player) + return mailbox.set_owner(pos, player:get_player_name()) end function mailbox.unrent(pos, player, force, drop_pos) @@ -84,9 +99,10 @@ function mailbox.unrent(pos, player, force, drop_pos) minetest.add_item(drop_pos, stack) end - local node = minetest.get_node(pos) - node.name = "mailbox:mailbox_free" - minetest.set_node(pos, node) + inv:set_list("mailbox", {}) + mailbox.set_owner(pos, "") + + return true end local on_construct = function(pos) @@ -97,21 +113,11 @@ local on_construct = function(pos) end local after_place_node = function(pos, player) - if not player:is_player() then - local node = minetest.get_node(pos) - node.name = "mailbox:mailbox_free" - minetest.set_node(pos, node) - return - end - - local meta = minetest.get_meta(pos) local pname = player:get_player_name() - - meta:set_string("owner", pname) - meta:set_string("infotext", S("@1's Mailbox", pname)) + mailbox.set_owner(pos, pname) end -local show_formspec = function(pos, owner, pname, can_manage) +local show_formspec = function(pos, owner, pname, pl_can_manage) local spos = pos.x .. "," .. pos.y .. "," .. pos.z local formspec = "size[8,5.5]" .. formspec_bg .. default.get_hotbar_bg(0, 1.5) .. "label[0,0;" .. FS("Send your goods\nto @1", owner) .. " :]" .. @@ -120,7 +126,7 @@ local show_formspec = function(pos, owner, pname, can_manage) "list[current_player;main;0,2.75;8,3;8]" .. "listring[nodemeta:" .. spos .. ";drop]" .. "listring[current_player;main]" - if can_manage then + if pl_can_manage then formspec = formspec .. "button_exit[6,0;2,1;manage;" .. FS("Manage") .. "]" end minetest.show_formspec(pname, "mailbox:mailbox_" .. spos, formspec) @@ -140,6 +146,12 @@ local show_manage_formspec = function(pos, pname, selected) minetest.show_formspec(pname, "mailbox:mailbox_" .. spos, formspec) end +local show_change_owner_formspec = function(pos, pname) + local spos = pos.x .. "," .. pos.y .. "," .. pos.z + local formspec = "field[new_owner;" .. FS("New owner:") .. ";]" + minetest.show_formspec(pname, "mailbox:mailbox_" .. spos, formspec) +end + local on_rightclick = function(pos, node, player, itemstack, pointed_thing) if not player:is_player() then return end @@ -163,6 +175,25 @@ local on_rightclick = function(pos, node, player, itemstack, pointed_thing) end end +local on_punch = function(pos, node, player, pointed_thing) + if not player:is_player() then + return minetest.node_punch(pos, node, player, pointed_thing) + end + + local wielded = player:get_wielded_item() + if wielded:get_name() ~= "mailbox:unrenter" then + return minetest.node_punch(pos, node, player, pointed_thing) + end + + local pname = player:get_player_name() + if not can_set_owner(player) then + minetest.chat_send_player(pname, S("You cannot set owner of mailboxes for others.")) + return + end + + show_change_owner_formspec(pos, pname) +end + local free_on_rightclick = function(pos, _, player, itemstack) if not player:is_player() then return end if itemstack:get_name() == "mailbox:unrenter" then return end @@ -251,36 +282,40 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) return end local pos = minetest.string_to_pos(formname:sub(17)) - if fields.unrent then + local node = minetest.get_node(pos) + local pname = player:get_player_name() + local nodegroup = minetest.get_item_group(node.name, "mailbox") + if fields.new_owner and nodegroup ~= 0 then + if not can_set_owner(player) then + minetest.chat_send_player(pname, S("You cannot set owner of mailboxes for others.")) + return true + end + + mailbox.set_owner(pos, fields.new_owner) + elseif nodegroup ~= 1 then + minetest.chat_send_player(pname, S("The node you were working on is no longer a mailbox.")) + elseif fields.unrent then local status, reason = mailbox.unrent(pos, player) if not status then - local pname = player:get_player_name() minetest.chat_send_player(pname, mailbox.UNRENT_FAIL_REASONS[reason]) end return true elseif fields.books_only then if not can_manage(pos, player) then - local pname = player:get_player_name() minetest.chat_send_player(pname, S("You can't manage this mailbox.")) return true end - local node = minetest.get_node(pos) - if node.name == "mailbox:mailbox" then - node.name = "mailbox:letterbox" - else - node.name = "mailbox:mailbox" - end + node.name = node.name == "mailbox:mailbox" and "mailbox:letterbox" or "mailbox:mailbox" minetest.swap_node(pos, node) elseif fields.manage then - local pname = player:get_player_name() if not can_manage(pos, player) then minetest.chat_send_player(pname, S("You can't manage this mailbox.")) return true end - local node = minetest.get_node(pos) local selected = node.name == "mailbox:letterbox" and "true" or "false" show_manage_formspec(pos, pname, selected) end + return true end) minetest.register_node("mailbox:mailbox", { @@ -290,7 +325,13 @@ minetest.register_node("mailbox:mailbox", { "mailbox_mailbox_side.png", "mailbox_mailbox_side.png", "mailbox_mailbox.png", "mailbox_mailbox.png", }, - groups = { cracky = 3, oddly_breakable_by_hand = 1, tubedevice = 1, tubedevice_receiver = 1 }, + groups = { + mailbox = 1, + cracky = 3, + oddly_breakable_by_hand = 1, + tubedevice = 1, + tubedevice_receiver = 1 + }, on_rotate = minetest.global_exists("screwdriver") and screwdriver.rotate_simple or nil, sounds = xcompat.sounds.node_sound_stone_defaults(), paramtype2 = "facedir", @@ -298,6 +339,7 @@ minetest.register_node("mailbox:mailbox", { after_place_node = after_place_node, after_dig_node = after_dig_node, on_rightclick = on_rightclick, + on_punch = on_punch, can_dig = can_dig, on_metadata_inventory_put = on_metadata_inventory_put, allow_metadata_inventory_put = allow_metadata_inventory_put, @@ -314,12 +356,18 @@ minetest.register_node("mailbox:mailbox_free", { "mailbox_mailbox_free_side.png", "mailbox_mailbox_free_side.png", "mailbox_mailbox_free.png", "mailbox_mailbox_free.png", }, - groups = { cracky = 3, oddly_breakable_by_hand = 1, tubedevice = 1, tubedevice_receiver = 1 }, + groups = { + mailbox = 2, + cracky = 3, + oddly_breakable_by_hand = 1, + tubedevice = 1, + tubedevice_receiver = 1 + }, on_rotate = minetest.global_exists("screwdriver") and screwdriver.rotate_simple or nil, sounds = xcompat.sounds.node_sound_stone_defaults(), paramtype2 = "facedir", drop = "mailbox:mailbox", - + on_construct = on_construct, on_rightclick = free_on_rightclick, }) @@ -330,6 +378,7 @@ minetest.register_node("mailbox:letterbox", { "mailbox_letterbox.png", "mailbox_letterbox.png", }, groups = { + mailbox = 1, cracky = 3, oddly_breakable_by_hand = 1, not_in_creative_inventory = 1, @@ -344,6 +393,7 @@ minetest.register_node("mailbox:letterbox", { after_place_node = after_place_node, after_dig_node = after_dig_node, on_rightclick = on_rightclick, + on_punch = on_punch, can_dig = can_dig, on_metadata_inventory_put = on_metadata_inventory_put, allow_metadata_inventory_put = allow_metadata_inventory_put, @@ -353,7 +403,12 @@ minetest.register_node("mailbox:letterbox", { }) minetest.register_tool("mailbox:unrenter", { - description = S("Mailbox unrenter"), + short_description = S("Mailbox owner modifier"), + description = table.concat({ + S("Mailbox owner modifier"), + S("Punch: Change owner"), + S("Right-click: Move owner out") + }, "\n"), inventory_image = "mailbox_unrent.png", })