X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=mailbox.lua;h=984ce3e3e1e38d7ab392034b1802230942f60fbe;hb=df7bfb9f2eef44c9c14e3d314cd8855cb5acf776;hp=28c459558c73950af3cc8fa75ac9f9c438418c4c;hpb=201f402fcb78148db0314c735d430b88ca5de333;p=xdecor.git diff --git a/mailbox.lua b/mailbox.lua index 28c4595..984ce3e 100644 --- a/mailbox.lua +++ b/mailbox.lua @@ -1,89 +1,16 @@ local mailbox = {} screwdriver = screwdriver or {} -xdecor.register("mailbox", { - description = "Mailbox", - tiles = { - "xdecor_mailbox_top.png", "xdecor_mailbox_bottom.png", - "xdecor_mailbox_side.png", "xdecor_mailbox_side.png", - "xdecor_mailbox.png", "xdecor_mailbox.png", - }, - groups = {cracky=3, oddly_breakable_by_hand=1}, - on_rotate = screwdriver.rotate_simple, - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - local player_name = placer:get_player_name() - - meta:set_string("owner", player_name) - meta:set_string("infotext", player_name.."'s Mailbox") - - local inv = meta:get_inventory() - inv:set_size("mailbox", 6*4) - inv:set_size("drop", 1) - end, - on_rightclick = function(pos, _, clicker) - local meta = minetest.get_meta(pos) - local player = clicker:get_player_name() - local owner = meta:get_string("owner") - - if player == owner then - minetest.show_formspec(player, "", mailbox.formspec(pos, owner, 1)) - else - minetest.show_formspec(player, "", mailbox.formspec(pos, owner, 0)) - end - end, - can_dig = function(pos, player) - local meta = minetest.get_meta(pos) - local owner = meta:get_string("owner") - local player_name = player:get_player_name() - local inv = meta:get_inventory() - - return inv:is_empty("mailbox") and player and player_name == owner - end, - on_metadata_inventory_put = function(pos, listname, _, stack, player) - local inv = minetest.get_meta(pos):get_inventory() - local player_name = player:get_player_name() - local meta = minetest.get_meta(pos) - local stack_name = stack:get_name().." "..stack:get_count() - - if listname == "drop" and inv:room_for_item("mailbox", stack) then - inv:remove_item("drop", stack) - inv:add_item("mailbox", stack) - - for i = 7, 2, -1 do - meta:set_string("giver"..i, meta:get_string("giver"..(i-1))) - meta:set_string("stack"..i, meta:get_string("stack"..(i-1))) - end - meta:set_string("giver1", player_name) - meta:set_string("stack1", stack_name) - end - end, - allow_metadata_inventory_put = function(pos, listname, _, stack, player) - local player_name = player:get_player_name() - if listname == "drop" then - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if inv:room_for_item("mailbox", stack) then - return -1 - else - minetest.chat_send_player(player_name, "The mailbox is full") - end - end - - return 0 - end -}) - local function img_col(stack) if not stack then return "" end if stack.inventory_image ~= "" then - return stack.inventory_image:match("([%w_]+)%.png")..".png" + return stack.inventory_image:match("(.*)%.png")..".png" else - return stack.tiles[1]:match("([%w_]+)%.png")..".png" + return stack.tiles[1]:match("(.*)%.png")..".png" end end -function mailbox.formspec(pos, owner, num) +function mailbox:formspec(pos, owner, num) local spos = pos.x..","..pos.y..","..pos.z local meta = minetest.get_meta(pos) local giver, img = "", "" @@ -95,7 +22,7 @@ function mailbox.formspec(pos, owner, num) ","..i..",#FFFFFF,x "..meta:get_string("stack"..i):match("%s(%d+)").."," img = img..i.."="..img_col(minetest.registered_items[ - meta:get_string("stack"..i):match("([%w_:]+)")]).."," + meta:get_string("stack"..i):match("(.*)%s")]).."," end end @@ -122,3 +49,80 @@ function mailbox.formspec(pos, owner, num) end end +function mailbox.dig(pos, player) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local player_name = player:get_player_name() + local inv = meta:get_inventory() + + return inv:is_empty("mailbox") and player and player_name == owner +end + +function mailbox.after_place_node(pos, placer) + local meta = minetest.get_meta(pos) + local player_name = placer:get_player_name() + + meta:set_string("owner", player_name) + meta:set_string("infotext", player_name.."'s Mailbox") + + local inv = meta:get_inventory() + inv:set_size("mailbox", 6*4) + inv:set_size("drop", 1) +end + +function mailbox.rightclick(pos, _, clicker) + local meta = minetest.get_meta(pos) + local player = clicker:get_player_name() + local owner = meta:get_string("owner") + + if player == owner then + minetest.show_formspec(player, "xdecor:mailbox", mailbox:formspec(pos, owner, 1)) + else + minetest.show_formspec(player, "xdecor:mailbox", mailbox:formspec(pos, owner, 0)) + end +end + +function mailbox.put(pos, listname, _, stack, player) + if listname == "drop" then + local inv = minetest.get_meta(pos):get_inventory() + if inv:room_for_item("mailbox", stack) then + return -1 + else + minetest.chat_send_player(player:get_player_name(), "[!] The mailbox is full") + end + end + return 0 +end + +function mailbox.on_put(pos, listname, _, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + if listname == "drop" and inv:room_for_item("mailbox", stack) then + inv:set_list("drop", {}) + inv:add_item("mailbox", stack) + + for i = 7, 2, -1 do + meta:set_string("giver"..i, meta:get_string("giver"..(i-1))) + meta:set_string("stack"..i, meta:get_string("stack"..(i-1))) + end + + meta:set_string("giver1", player:get_player_name()) + meta:set_string("stack1", stack:to_string()) + end +end + +xdecor.register("mailbox", { + description = "Mailbox", + tiles = {"xdecor_mailbox_top.png", "xdecor_mailbox_bottom.png", + "xdecor_mailbox_side.png", "xdecor_mailbox_side.png", + "xdecor_mailbox.png", "xdecor_mailbox.png"}, + groups = {cracky=3, oddly_breakable_by_hand=1}, + on_rotate = screwdriver.rotate_simple, + can_dig = mailbox.dig, + on_rightclick = mailbox.rightclick, + on_metadata_inventory_put = mailbox.on_put, + allow_metadata_inventory_put = mailbox.put, + after_place_node = mailbox.after_place_node +}) +