Epic/mods/compost/init.lua

450 lines
11 KiB
Lua

-- modified by dcc to work with hoppers
--
-- NOTE: input hopper goes on SIDE not top... to allow punching of barrel - placing hopper to point correctly
-- may require screwdriver
--
-- output hopper goes below barrel
--
-- If testing - please note the abm's only fire every 30 seconds so it can take some time
--
compost = {}
compost.items = {}
compost.groups = {}
function compost.register_item(name)
compost.items[name] = true
end
function compost.register_group(name)
compost.groups[name] = true
end
function compost.can_compost(name)
if compost.items[name] then
return true
else
for k, i in pairs(minetest.registered_items[name].groups) do
if i > 0 then
if compost.groups[tostring(k)] then
return true
end
end
end
return false
end
end
-- grass
compost.register_item("default:grass_1")
compost.register_item("default:junglegrass")
-- leaves
compost.register_group("leaves")
-- dirt
compost.register_item("default:dirt")
compost.register_item("default:dirt_with_grass")
-- stick
compost.register_item("default:stick")
-- flowers
compost.register_item("flowers:geranium")
compost.register_item("flowers:tulip")
compost.register_item("flowers:rose")
compost.register_item("flowers:dandelion_yellow")
compost.register_item("flowers:dandelion_white")
-- food
compost.register_item("farming:bread")
compost.register_item("farming:wheat")
-- groups
compost.register_group("plant")
compost.register_group("flower")
-- dcc
local wood_barrel_src_on_construct = function(pos)
local inv = minetest.get_meta(pos):get_inventory()
inv:set_size("src", 1)
end
local wood_barrel_dst_on_construct = function(pos)
local inv = minetest.get_meta(pos):get_inventory()
inv:set_size("dst", 1)
-- this is for wood barrel #3 which has 1 compost ready for taking
--
inv:set_stack('dst', 1, 'compost:compost')
local meta = minetest.get_meta(pos)
meta:set_string("formspec",
"size[8,5.3]" ..
default.gui_bg ..
default.gui_bg_img ..
default.gui_slots ..
"list[current_name;dst;3.5,0;1,1;]" ..
"list[current_player;main;0,1.15;8,1;]" ..
"list[current_player;main;0,2.38;8,3;8]" ..
"listring[current_name;main]" ..
"listring[current_player;main]" ..
default.get_hotbar_bg(0,1.15)
)
end
-- Only allow compostable items to be placed in input
-- allow_metadata_inventory_put is a pre-check prior to actual
-- putting...
--
local wood_barrel_allow_metadata_inventory_put = function(pos, listname, index, stack, player)
--print ("[compost] wood_barrel_allow_metadata_inventory_put ", listname)
if listname == "src" then
local stackname = stack:get_name()
--print ("[compost] wood_barrel_allow_metadata_inventory_put ", stackname )
if compost.can_compost(stackname) then
--print ("[compost] succeed wood_barrel_allow_metadata_inventory_put ", stackname)
return 1 -- take only 1 item
end
end
return 0
end
-- actual put
--
local wood_barrel_on_metadata_inventory_put = function(pos, listname, index, stack, player)
--print ("[compost] wood_barrel_on_metadata_inventory_put ")
if listname == "src" then
-- check again just in case
--
local stackname = stack:get_name()
if compost.can_compost(stackname) then
-- we received a compostable item - change to new node type
--
minetest.set_node(pos, {name = "compost:wood_barrel_1"})
return
end
end
end
-- Versions of callbacks for the inaccessible versions of the barrel
--
-- nope
local wood_barrelNope_allow_metadata_inventory_put = function(pos, listname, index, stack, player)
--print ("[compost] wood_barrelNope_allow_metadata_inventory_put ")
return 0
end
-- nope
local wood_barrelNope_on_metadata_inventory_put = function(pos, listname, index, stack, player)
--print ("[compost] wood_barrelNope_on_metadata_inventory_put ")
return
end
-- nope
local wood_barrelNope_allow_metadata_inventory_take = function(pos, listname, index, stack, player)
-- nope you can't take out here
return 0
end
-- nope
local wood_barrelNope_on_metadata_inventory_take = function(pos, listname, index, stack, player)
return
end
-- Versions of callbacks for when compost is ready....
-- nope
local wood_barrel_allow_metadata_inventory_take = function(pos, listname, index, stack, player)
-- YES you can take out here - we know it is 1 because we put it there with the constructor
return 1
end
-- nope
local wood_barrel_on_metadata_inventory_take = function(pos, listname, index, stack, player)
-- when emptied we revert to a plain wood barrel
local node = minetest.get_node (pos)
if node.name == "compost:wood_barrel_3" then
minetest.set_node(pos, {name = "compost:wood_barrel"})
return ItemStack("compost:compost")
end
return
end
minetest.register_node("compost:wood_barrel", {
description = "Wood Barrel",
tiles = {"default_wood.png"},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {{-1/2, -1/2, -1/2, 1/2, -3/8, 1/2},
{-1/2, -1/2, -1/2, -3/8, 1/2, 1/2},
{3/8, -1/2, -1/2, 1/2, 1/2, 1/2},
{-1/2, -1/2, -1/2, 1/2, 1/2, -3/8},
{-1/2, -1/2, 3/8, 1/2, 1/2, 1/2}},
},
paramtype = "light",
is_ground_content = false,
groups = {choppy = 3},
sounds = default.node_sound_wood_defaults(),
on_construct = wood_barrel_src_on_construct, -- dcc
allow_metadata_inventory_put = wood_barrel_allow_metadata_inventory_put, -- dcc
on_metadata_inventory_put = wood_barrel_on_metadata_inventory_put, -- dcc
allow_metadata_inventory_take = wood_barrelNope_allow_metadata_inventory_take, -- dcc
on_metadata_inventory_take = wood_barrelNope_on_metadata_inventory_take, -- dcc
on_punch = function(pos, node, puncher, pointed_thing)
local wielded_item = puncher:get_wielded_item():get_name()
if compost.can_compost(wielded_item) then
minetest.set_node(pos, {name = "compost:wood_barrel_1"})
local w = puncher:get_wielded_item()
if not(minetest.setting_getbool("creative_mode")) then
w:take_item(1)
puncher:set_wielded_item(w)
end
end
end
})
minetest.register_node("compost:wood_barrel_1", {
description = "Wood Barrel with compost",
tiles = {"default_wood.png^compost_compost_1.png", "default_wood.png"},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {{-1/2, -1/2, -1/2, 1/2, -3/8, 1/2},
{-1/2, -1/2, -1/2, -3/8, 1/2, 1/2},
{3/8, -1/2, -1/2, 1/2, 1/2, 1/2},
{-1/2, -1/2, -1/2, 1/2, 1/2, -3/8},
{-1/2, -1/2, 3/8, 1/2, 1/2, 1/2},
{-3/8, -1/2, -3/8, 3/8, 3/8, 3/8}},
},
paramtype = "light",
is_ground_content = false,
allow_metadata_inventory_put = wood_barrelNope_allow_metadata_inventory_put, -- dcc
on_metadata_inventory_put = wood_barrelNope_on_metadata_inventory_put, -- dcc
allow_metadata_inventory_take = wood_barrelNope_allow_metadata_inventory_take, -- dcc
on_metadata_inventory_take = wood_barrelNope_on_metadata_inventory_take, -- dcc
groups = {choppy = 3},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("compost:wood_barrel_2", {
description = "Wood Barrel with compost",
tiles = {"default_wood.png^compost_compost_2.png", "default_wood.png"},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {{-1/2, -1/2, -1/2, 1/2, -3/8, 1/2},
{-1/2, -1/2, -1/2, -3/8, 1/2, 1/2},
{3/8, -1/2, -1/2, 1/2, 1/2, 1/2},
{-1/2, -1/2, -1/2, 1/2, 1/2, -3/8},
{-1/2, -1/2, 3/8, 1/2, 1/2, 1/2},
{-3/8, -1/2, -3/8, 3/8, 3/8, 3/8}},
},
paramtype = "light",
is_ground_content = false,
allow_metadata_inventory_put = wood_barrelNope_allow_metadata_inventory_put, -- dcc
on_metadata_inventory_put = wood_barrelNope_on_metadata_inventory_put, -- dcc
allow_metadata_inventory_take = wood_barrelNope_allow_metadata_inventory_take, -- dcc
on_metadata_inventory_take = wood_barrelNope_on_metadata_inventory_take, -- dcc
groups = {choppy = 3},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("compost:wood_barrel_3", {
description = "Wood Barrel",
tiles = {"default_wood.png^compost_compost_3.png", "default_wood.png"},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {{-1/2, -1/2, -1/2, 1/2, -3/8, 1/2},
{-1/2, -1/2, -1/2, -3/8, 1/2, 1/2},
{3/8, -1/2, -1/2, 1/2, 1/2, 1/2},
{-1/2, -1/2, -1/2, 1/2, 1/2, -3/8},
{-1/2, -1/2, 3/8, 1/2, 1/2, 1/2},
{-3/8, -1/2, -3/8, 3/8, 3/8, 3/8}},
},
paramtype = "light",
is_ground_content = false,
groups = {choppy = 3},
on_construct = wood_barrel_dst_on_construct, -- dcc
allow_metadata_inventory_put = wood_barrelNope_allow_metadata_inventory_put, -- dcc
on_metadata_inventory_put = wood_barrelNope_on_metadata_inventory_put, -- dcc
allow_metadata_inventory_take = wood_barrel_allow_metadata_inventory_take, -- dcc
on_metadata_inventory_take = wood_barrel_on_metadata_inventory_take, -- dcc
sounds = default.node_sound_wood_defaults(),
on_punch = function(pos, node, player, pointed_thing)
local p = {x = pos.x + math.random(0, 5)/5 - 0.5, y = pos.y+1, z = pos.z + math.random(0, 5)/5 - 0.5}
minetest.add_item(p, {name = "compost:compost"})
minetest.set_node(pos, {name = "compost:wood_barrel"})
end
})
minetest.register_abm({
nodenames = {"compost:wood_barrel_1"},
interval = 30,
chance = 5,
action = function(pos, node, active_object_count, active_object_count_wider)
minetest.set_node(pos, {name = "compost:wood_barrel_2"})
end,
})
minetest.register_abm({
nodenames = {"compost:wood_barrel_2"},
interval = 30,
chance = 3,
action = function(pos, node, active_object_count, active_object_count_wider)
minetest.set_node(pos, {name = "compost:wood_barrel_3"})
end,
})
minetest.register_craft({
output = "compost:wood_barrel",
recipe = {
{"default:wood", "", "default:wood"},
{"default:wood", "", "default:wood"},
{"default:wood", "stairs:slab_wood", "default:wood"}
}
})
minetest.register_node("compost:compost", {
description = "Compost",
tiles = {"compost_compost.png"},
groups = {crumbly = 3},
sounds = default.node_sound_dirt_defaults(),
})
minetest.register_node("compost:garden_soil", {
description = "Garden Soil",
tiles = {"compost_garden_soil.png"},
groups = {crumbly = 3, soil=3, grassland = 1, wet = 1},
sounds = default.node_sound_dirt_defaults(),
})
minetest.register_craft({
output = "compost:garden_soil",
recipe = {
{"compost:compost", "compost:compost"},
}
})
if minetest.get_modpath ("tubelib") and tubelib then
--print ("[compost] found tubelib")
-- Thanks to @joe7575
tubelib.register_node ("compost:wood_barrel", {
"compost:wood_barrel_1",
"compost:wood_barrel_2",
"compost:wood_barrel_3"
}, {
on_push_item = function (pos, side, item, player_name)
local node = minetest.get_node (pos)
if node.name == "compost:wood_barrel" and compost.can_compost(item:get_name()) then
minetest.set_node(pos, {name = "compost:wood_barrel_1"})
return true
else
return false
end
end,
on_unpull_item = function (pos, side, item, player_name)
minetest.set_node(pos, {name = "compost:wood_barrel_3"})
return true
end,
on_pull_item = function (pos, side, player_name)
local node = minetest.get_node (pos)
if node.name == "compost:wood_barrel_3" then
minetest.set_node(pos, {name = "compost:wood_barrel"})
return ItemStack("compost:compost")
end
return nil
end,
})
end
-- dcc
if minetest.get_modpath ("hopper") and hopper then
--print ("[compost] found hopper")
hopper:add_container({
{"top", "compost:wood_barrel_3", "dst"}, -- take compost from above into hopper below
{"side", "compost:wood_barrel", "src"}, -- insert compostable items below to be composted from hopper at side
})
end