165 lines
3.5 KiB
Lua
165 lines
3.5 KiB
Lua
local utils = ...
|
|
local S = utils.S
|
|
|
|
|
|
|
|
local function trash (pos)
|
|
local meta = minetest.get_meta (pos)
|
|
local inv = (meta and meta:get_inventory ()) or nil
|
|
|
|
if inv then
|
|
local stack = inv:get_stack ("trash", 1)
|
|
|
|
if stack and not stack:is_empty () then
|
|
utils.on_destroy (stack)
|
|
|
|
inv:set_stack ("trash", 1, nil)
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
|
|
local function trash_delayed (pos)
|
|
minetest.after (0.1, trash, pos)
|
|
end
|
|
|
|
|
|
|
|
local function after_place_node (pos, placer, itemstack, pointed_thing)
|
|
local meta = minetest.get_meta (pos)
|
|
|
|
if meta then
|
|
local inv = meta:get_inventory ()
|
|
|
|
if inv then
|
|
meta:set_string ("inventory", "{ trash = { [1] = '' } }")
|
|
meta:set_string ("formspec",
|
|
"formspec_version[3]"..
|
|
"size[11.75,8.5,false]"..
|
|
"label[5.15,1.0;Destroy]"..
|
|
"list[context;trash;5.3,1.25;1,1;]"..
|
|
"list[current_player;main;1.0,2.75;8,4;]"..
|
|
"listring[]")
|
|
|
|
inv:set_size ("trash", 1)
|
|
inv:set_width ("trash", 1)
|
|
end
|
|
end
|
|
|
|
utils.pipeworks_after_place (pos)
|
|
|
|
-- If return true no item is taken from itemstack
|
|
return false
|
|
end
|
|
|
|
|
|
|
|
local function on_metadata_inventory_put (pos, listname, index, stack, player)
|
|
if listname == "trash" then
|
|
trash_delayed (pos)
|
|
end
|
|
end
|
|
|
|
|
|
|
|
local function on_metadata_inventory_move (pos, from_list, from_index,
|
|
to_list, to_index, count, player)
|
|
if to_list == "trash" then
|
|
trash_delayed (pos)
|
|
end
|
|
end
|
|
|
|
|
|
|
|
local function pipeworks_support ()
|
|
if utils.pipeworks_supported then
|
|
return
|
|
{
|
|
priority = 100,
|
|
input_inventory = "trash",
|
|
connect_sides = { left = 1, right = 1, front = 1, back = 1, bottom = 1, top = 1 },
|
|
|
|
insert_object = function (pos, node, stack, direction)
|
|
local meta = minetest.get_meta (pos)
|
|
local inv = (meta and meta:get_inventory ()) or nil
|
|
|
|
if inv then
|
|
trash_delayed (pos)
|
|
|
|
return inv:add_item ("trash", stack)
|
|
end
|
|
|
|
return stack
|
|
end,
|
|
|
|
can_insert = function (pos, node, stack, direction)
|
|
local meta = minetest.get_meta (pos)
|
|
local inv = (meta and meta:get_inventory ()) or nil
|
|
|
|
if inv then
|
|
return inv:room_for_item ("trash", stack)
|
|
end
|
|
|
|
return false
|
|
end,
|
|
|
|
can_remove = function (pos, node, stack, dir)
|
|
-- returns the maximum number of items of that stack that can be removed
|
|
return 0
|
|
end,
|
|
|
|
remove_items = function (pos, node, stack, dir, count)
|
|
-- removes count items and returns them
|
|
return stack
|
|
end
|
|
}
|
|
end
|
|
|
|
return nil
|
|
end
|
|
|
|
|
|
|
|
local destroyer_groups = { cracky = 3 }
|
|
if utils.pipeworks_supported then
|
|
destroyer_groups.tubedevice = 1
|
|
destroyer_groups.tubedevice_receiver = 1
|
|
end
|
|
|
|
|
|
|
|
minetest.register_node("lwcomponents:destroyer", {
|
|
description = S("Destroyer"),
|
|
drawtype = "normal",
|
|
tiles = { "lwcomponents_destroyer_top.png", "lwcomponents_destroyer_top.png",
|
|
"lwcomponents_destroyer_side.png", "lwcomponents_destroyer_side.png",
|
|
"lwcomponents_destroyer_side.png", "lwcomponents_destroyer_side.png" },
|
|
is_ground_content = false,
|
|
groups = table.copy (destroyer_groups),
|
|
sounds = default.node_sound_stone_defaults (),
|
|
paramtype = "none",
|
|
param1 = 0,
|
|
paramtype2 = "none",
|
|
param2 = 0,
|
|
floodable = false,
|
|
|
|
tube = pipeworks_support (),
|
|
|
|
after_place_node = after_place_node,
|
|
after_dig_node = utils.pipeworks_after_dig,
|
|
on_metadata_inventory_put = on_metadata_inventory_put,
|
|
on_metadata_inventory_move = on_metadata_inventory_move,
|
|
})
|
|
|
|
|
|
|
|
utils.hopper_add_container({
|
|
{"bottom", "lwcomponents:destroyer", "trash"}, -- insert items below from hopper above
|
|
{"side", "lwcomponents:destroyer", "trash"}, -- insert items from hopper at side
|
|
})
|
|
|
|
|
|
|
|
--
|