Merge pull request 'mcl_composters initial commit' (#2005) from kabou/MineClone2:composters into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2005 Reviewed-by: cora <cora@noreply.git.minetest.land> Reviewed-by: NO11 <no11@noreply.git.minetest.land> Reviewed-by: AFCMS <afcms@noreply.git.minetest.land>newmobs-master
commit
c392fd0269
|
@ -0,0 +1,343 @@
|
|||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
--
|
||||
-- Composter mod, adds composters.
|
||||
--
|
||||
-- Copyleft 2022 by kabou
|
||||
-- GNU General Public Licence 3.0
|
||||
--
|
||||
|
||||
local composter_description = S(
|
||||
"Composter"
|
||||
)
|
||||
local composter_longdesc = S(
|
||||
"Composters can convert various organic items into bonemeal."
|
||||
)
|
||||
local composter_usagehelp = S(
|
||||
"Use organic items on the composter to fill it with layers of compost. " ..
|
||||
"Every time an item is put in the composter, there is a chance that the " ..
|
||||
"composter adds another layer of compost. Some items have a bigger chance " ..
|
||||
"of adding an extra layer than other items. After filling up with 7 layers " ..
|
||||
"of compost, the composter is full. After a delay of approximately one " ..
|
||||
"second the composter becomes ready and bone meal can be retrieved from it. " ..
|
||||
"Right-clicking the composter takes out the bone meal empties the composter."
|
||||
)
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_composters:composter",
|
||||
recipe = {
|
||||
{"group:wood_slab", "", "group:wood_slab"},
|
||||
{"group:wood_slab", "", "group:wood_slab"},
|
||||
{"group:wood_slab", "group:wood_slab", "group:wood_slab"},
|
||||
}
|
||||
})
|
||||
|
||||
local compostability = {
|
||||
["mcl_cake:cake"] = 100,
|
||||
["mcl_farming:pumpkin_pie"] = 100,
|
||||
|
||||
["mcl_farming:potato_item_baked"] = 85,
|
||||
["mcl_farming:bread"] = 85,
|
||||
["mcl_farming:cookie"] = 85,
|
||||
["mcl_farming:hay_block"] = 85,
|
||||
-- mushroom cap block have 64 variants, wtf!?
|
||||
["mcl_mushrooms:brown_mushroom_block_cap_111111"] = 85,
|
||||
["mcl_mushrooms:red_mushroom_block_cap_111111"] = 85,
|
||||
["mcl_nether:nether_wart_block"] = 85,
|
||||
["mcl_mushroom:warped_wart_block"] = 85,
|
||||
|
||||
["mcl_core:apple"] = 65,
|
||||
-- missing: azalea
|
||||
["mcl_farming:beetroot_item"] = 65,
|
||||
-- missing: big dripleaf
|
||||
["mcl_farming:carrot_item"] = 65,
|
||||
-- what's up with cocoa beans?
|
||||
["mcl_dye:brown"] = 65,
|
||||
["mcl_flowers:fern"] = 65,
|
||||
["mcl_flowers:double_fern"] = 65,
|
||||
["mcl_flowers:allium"] = 65,
|
||||
["mcl_flowers:azure_bluet"] = 65,
|
||||
["mcl_flowers:blue_orchid"] = 65,
|
||||
["mcl_flowers:dandelion"] = 65,
|
||||
["mcl_flowers:lilac"] = 65,
|
||||
["mcl_flowers:oxeye_daisy"] = 65,
|
||||
["mcl_flowers:poppy"] = 65,
|
||||
["mcl_flowers:tulip_orange"] = 65,
|
||||
["mcl_flowers:tulip_pink"] = 65,
|
||||
["mcl_flowers:tulip_red"] = 65,
|
||||
["mcl_flowers:tulip_white"] = 65,
|
||||
["mcl_flowers:peony"] = 65,
|
||||
["mcl_flowers:rose_bush"] = 65,
|
||||
["mcl_flowers:sunflower"] = 65,
|
||||
["mcl_flowers:waterlily"] = 65,
|
||||
["mcl_farming:melon"] = 65,
|
||||
-- missing: moss block?
|
||||
-- mushroom aliases below?
|
||||
["mcl_farming:mushroom_brown"] = 65,
|
||||
["mcl_mushrooms:mushroom_brown"] = 65,
|
||||
["mcl_farming:mushroom_red"] = 65,
|
||||
["mcl_mushrooms:mushroom_red"] = 65,
|
||||
["mcl_mushrooms:brown_mushroom_block_stem_full"] = 65,
|
||||
["mcl_mushrooms:red_mushroom_block_stem_full"] = 65,
|
||||
-- nether wart
|
||||
["mcl_farming:potato_item"] = 65,
|
||||
["mcl_farming:pumpkin"] = 65,
|
||||
["mcl_farming:pumpkin_face_light"] = 65,
|
||||
["mcl_ocean:sea_pickle_"] = 65,
|
||||
["mcl_mushroom:shroomlight"] = 65,
|
||||
-- missing: spore blossom
|
||||
["mcl_farming:wheat_item"] = 65,
|
||||
["mcl_mushroom:crimson_fungus"] = 65,
|
||||
["mcl_mushroom:warped_fungus"] = 65,
|
||||
["mcl_mushroom:crimson_roots"] = 65,
|
||||
["mcl_mushroom:warped_roots"] = 65,
|
||||
|
||||
["mcl_core:cactus"] = 50,
|
||||
["mcl_ocean:dried_kelp_block"] = 50,
|
||||
-- missing: flowering azalea leaves
|
||||
-- missing: glow lichen
|
||||
["mcl_farming:melon_item"] = 50,
|
||||
["mcl_mushroom:nether_sprouts"] = 50,
|
||||
["mcl_core:reeds"] = 50,
|
||||
["mcl_flowers:double_grass"] = 50,
|
||||
["mcl_core:vine"] = 50,
|
||||
-- missing: weeping vines
|
||||
["mcl_mushroom:twisting_vines"] = 50,
|
||||
|
||||
["mcl_flowers:tallgrass"] = 30,
|
||||
["mcl_farming:beetroot_seeds"] = 30,
|
||||
["mcl_core:dirt_with_grass"] = 30,
|
||||
["mcl_core:tallgrass"] = 30,
|
||||
["mcl_ocean:dried_kelp"] = 30,
|
||||
["mcl_ocean:kelp"] = 30,
|
||||
["mcl_core:leaves"] = 30,
|
||||
["mcl_core:acacialeaves"] = 30,
|
||||
["mcl_core:birchleaves"] = 30,
|
||||
["mcl_core:darkleaves"] = 30,
|
||||
["mcl_core:jungleleaves"] = 30,
|
||||
["mcl_core:spruceleaves"] = 30,
|
||||
--
|
||||
["mcl_farming:melon_seeds"] = 30,
|
||||
-- missing: moss carpet
|
||||
["mcl_farming:pumpkin_seeds"] = 30,
|
||||
["mcl_core:sapling"] = 30,
|
||||
["mcl_core:acaciasapling"] = 30,
|
||||
["mcl_core:birchsapling"] = 30,
|
||||
["mcl_core:darksapling"] = 30,
|
||||
["mcl_core:junglesapling"] = 30,
|
||||
["mcl_core:sprucesapling"] = 30,
|
||||
["mcl_ocean:seagrass"] = 30,
|
||||
-- missing: small dripleaf
|
||||
["mcl_sweet_berry:sweet_berry"] = 30,
|
||||
["mcl_farming:sweet_berry"] = 30,
|
||||
["mcl_farming:wheat_seeds"] = 30,
|
||||
|
||||
}
|
||||
|
||||
local function composter_add_item(pos, node, player, itemstack, pointed_thing)
|
||||
--
|
||||
-- handler for filling the composter when rightclicked
|
||||
--
|
||||
-- as an on_rightclick handler, it returns an itemstack
|
||||
--
|
||||
if not player or (player:get_player_control() and player:get_player_control().sneak) then
|
||||
return itemstack
|
||||
end
|
||||
if not itemstack and itemstack:is_empty() then
|
||||
return itemstack
|
||||
end
|
||||
local itemname = itemstack:get_name()
|
||||
local chance = compostability[itemname]
|
||||
if chance then
|
||||
if not minetest.is_creative_enabled(player:get_player_name()) then
|
||||
itemstack:take_item()
|
||||
end
|
||||
-- calculate leveling up chance
|
||||
local rand = math.random(0,100)
|
||||
if chance >= rand then
|
||||
-- get current compost level
|
||||
local node_defs = minetest.registered_nodes[node.name]
|
||||
local level = node_defs["_mcl_compost_level"]
|
||||
-- spawn green particles above new layer
|
||||
mcl_dye.add_bone_meal_particle(vector.add(pos, vector.new(0, level/8, 0)))
|
||||
-- TODO: play some sounds
|
||||
-- update composter block
|
||||
if level < 7 then
|
||||
level = level + 1
|
||||
else
|
||||
level = "ready"
|
||||
end
|
||||
minetest.swap_node(pos, {name = "mcl_composters:composter_" .. level})
|
||||
-- a full composter becomes ready for harvest after one second
|
||||
-- the block will get updated by the node timer callback set in node reg def
|
||||
if level == 7 then
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:start(1)
|
||||
end
|
||||
end
|
||||
end
|
||||
return itemstack
|
||||
end
|
||||
|
||||
local function composter_ready(pos)
|
||||
--
|
||||
-- update the composter block to ready for harvesting
|
||||
-- this function is a node callback on_timer.
|
||||
-- the timer is set in function 'composter_fill' when composter level is 7
|
||||
--
|
||||
-- returns false in order to cancel further activity of the timer
|
||||
--
|
||||
minetest.swap_node(pos, {name = "mcl_composters:composter_ready"})
|
||||
-- maybe spawn particles again?
|
||||
-- TODO: play some sounds
|
||||
return false
|
||||
end
|
||||
|
||||
local function composter_harvest(pos, node, player, itemstack, pointed_thing)
|
||||
--
|
||||
-- handler for harvesting bone meal from a ready composter when rightclicked
|
||||
--
|
||||
if not player or (player:get_player_control() and player:get_player_control().sneak) then
|
||||
return
|
||||
end
|
||||
-- reset ready type composter to empty type
|
||||
minetest.swap_node(pos, {name="mcl_composters:composter"})
|
||||
-- spawn bone meal item (wtf dye?! is this how they make white cocoa)
|
||||
minetest.add_item(pos, "mcl_dye:white")
|
||||
-- TODO play some sounds
|
||||
|
||||
end
|
||||
|
||||
local function composter_get_nodeboxes(level)
|
||||
--
|
||||
-- Convenience function to construct the nodeboxes for varying levels of compost
|
||||
--
|
||||
local top_y_tbl = {[0]=-7, -5, -3, -1, 1, 3, 5, 7}
|
||||
local top_y = top_y_tbl[level] / 16
|
||||
return {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall
|
||||
{ 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall
|
||||
{-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall
|
||||
{-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall
|
||||
{-0.5, -0.5, -0.5, 0.5, top_y, 0.5}, -- Bottom level
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
--
|
||||
-- Register empty composter node
|
||||
-- This is the base model that is craftable and can be placed in an inventory
|
||||
--
|
||||
minetest.register_node("mcl_composters:composter", {
|
||||
description = composter_description,
|
||||
_tt_help = S("Converts organic items into bonemeal"),
|
||||
_doc_items_longdesc = composter_longdesc,
|
||||
_doc_items_usagehelp = composter_usagehelp,
|
||||
paramtype = "light",
|
||||
drawtype = "nodebox",
|
||||
node_box = composter_get_nodeboxes(0),
|
||||
selection_box = {type = "regular"},
|
||||
tiles = {
|
||||
"mcl_composter_bottom.png^mcl_composter_top.png",
|
||||
"mcl_composter_bottom.png",
|
||||
"mcl_composter_side.png"
|
||||
},
|
||||
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false,
|
||||
is_ground_content = false,
|
||||
groups = {
|
||||
handy=1, material_wood=1, deco_block=1, dirtifier=1,
|
||||
flammable=2, fire_encouragement=3, fire_flammability=4,
|
||||
},
|
||||
sounds = mcl_sounds.node_sound_wood_defaults(),
|
||||
_mcl_hardness = 0.6,
|
||||
_mcl_blast_resistance = 0.6,
|
||||
_mcl_compost_level = 0,
|
||||
on_rightclick = composter_add_item
|
||||
})
|
||||
|
||||
--
|
||||
-- Template function for composters with compost
|
||||
-- For each fill level a custom node is registered
|
||||
--
|
||||
local function register_filled_composter(level)
|
||||
local id = "mcl_composters:composter_"..level
|
||||
minetest.register_node(id, {
|
||||
description = S("Composter") .. " (" .. level .. "/7 " .. S("filled") .. ")",
|
||||
_doc_items_create_entry = false,
|
||||
paramtype = "light",
|
||||
drawtype = "nodebox",
|
||||
node_box = composter_get_nodeboxes(level),
|
||||
selection_box = {type = "regular"},
|
||||
tiles = {
|
||||
"mcl_composter_compost.png^mcl_composter_top.png",
|
||||
"mcl_composter_bottom.png",
|
||||
"mcl_composter_side.png"
|
||||
},
|
||||
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false,
|
||||
is_ground_content = false,
|
||||
groups = {
|
||||
handy=1, material_wood=1, deco_block=1, dirtifier=1,
|
||||
not_in_creative_inventory=1, not_in_craft_guide=1,
|
||||
flammable=2, fire_encouragement=3, fire_flammability=4,
|
||||
comparator_signal=level
|
||||
},
|
||||
sounds = mcl_sounds.node_sound_wood_defaults(),
|
||||
drop = "mcl_composters:composter",
|
||||
_mcl_hardness = 0.6,
|
||||
_mcl_blast_resistance = 0.6,
|
||||
_mcl_compost_level = level,
|
||||
on_rightclick = composter_add_item,
|
||||
on_timer = composter_ready
|
||||
})
|
||||
|
||||
-- Add entry aliases for the Help
|
||||
if minetest.get_modpath("doc") then
|
||||
doc.add_entry_alias("nodes", "mcl_composters:composter", "nodes", id)
|
||||
end
|
||||
end
|
||||
|
||||
--
|
||||
-- Register filled composters (7 levels)
|
||||
--
|
||||
for level = 1, 7 do
|
||||
register_filled_composter(level)
|
||||
end
|
||||
|
||||
--
|
||||
-- Register composter ready to be harvested
|
||||
--
|
||||
minetest.register_node("mcl_composters:composter_ready", {
|
||||
description = S("Composter") .. "(" .. S("ready for harvest") .. ")",
|
||||
_doc_items_create_entry = false,
|
||||
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false,
|
||||
paramtype = "light",
|
||||
drawtype = "nodebox",
|
||||
node_box = composter_get_nodeboxes(7),
|
||||
selection_box = {type = "regular"},
|
||||
tiles = {
|
||||
"mcl_composter_ready.png^mcl_composter_top.png",
|
||||
"mcl_composter_bottom.png",
|
||||
"mcl_composter_side.png"
|
||||
},
|
||||
is_ground_content = false,
|
||||
groups = {
|
||||
handy=1, material_wood=1, deco_block=1, dirtifier=1,
|
||||
not_in_creative_inventory=1, not_in_craft_guide=1,
|
||||
flammable=2, fire_encouragement=3, fire_flammability=4,
|
||||
comparator_signal=8
|
||||
},
|
||||
sounds = mcl_sounds.node_sound_wood_defaults(),
|
||||
drop = "mcl_composters:composter",
|
||||
_mcl_hardness = 0.6,
|
||||
_mcl_blast_resistance = 0.6,
|
||||
_mcl_compost_level = 7,
|
||||
on_rightclick = composter_harvest
|
||||
})
|
||||
|
||||
-- Add entry aliases for the Help
|
||||
if minetest.get_modpath("doc") then
|
||||
doc.add_entry_alias("nodes", "mcl_composters:composter",
|
||||
"nodes", "mcl_composters:composter_ready" )
|
||||
end
|
|
@ -0,0 +1,7 @@
|
|||
# textdomain: mcl_composters
|
||||
Composter=
|
||||
Composters can convert various organic items into bonemeal.=
|
||||
Use organic items on the composter to fill it with layers of compost. Every time an item is put in the composter, there is a chance that the composter adds another layer of compost. Some items have a bigger chance of adding an extra layer than other items. After filling up with 7 layers of compost, the composter is full. After a delay of approximately one second the composter becomes ready and bone meal can be retrieved from it. Right-clicking the composter takes out the bone meal empties the composter."=
|
||||
filled=
|
||||
ready for harvest=
|
||||
Converts organic items into bonemeal=
|
|
@ -0,0 +1,5 @@
|
|||
name = mcl_composters
|
||||
author = kabou
|
||||
description = Composters can convert various organic items into bonemeal.
|
||||
depends = mcl_core, mcl_sounds, mcl_dye
|
||||
optional_depends = doc
|
Binary file not shown.
After Width: | Height: | Size: 213 B |
Binary file not shown.
After Width: | Height: | Size: 184 B |
Binary file not shown.
After Width: | Height: | Size: 276 B |
Binary file not shown.
After Width: | Height: | Size: 209 B |
Binary file not shown.
After Width: | Height: | Size: 223 B |
|
@ -343,7 +343,7 @@ minetest.register_abm({
|
|||
local abovenode = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z})
|
||||
if not minetest.registered_items[abovenode.name] then return end
|
||||
-- Don't bother checking item enties if node above is a container (should save some CPU)
|
||||
if minetest.registered_items[abovenode.name].groups.container then
|
||||
if minetest.get_item_group(abovenode.name, "container") then
|
||||
return
|
||||
end
|
||||
local meta = minetest.get_meta(pos)
|
||||
|
@ -397,7 +397,7 @@ minetest.register_abm({
|
|||
-- Suck an item from the container above into the hopper
|
||||
local upnode = minetest.get_node(uppos)
|
||||
if not minetest.registered_nodes[upnode.name] then return end
|
||||
local g = minetest.registered_nodes[upnode.name].groups.container
|
||||
local g = minetest.get_item_group(upnode.name, "container")
|
||||
local sucked = mcl_util.move_item_container(uppos, pos)
|
||||
|
||||
-- Also suck in non-fuel items from furnace fuel slot
|
||||
|
@ -442,7 +442,7 @@ minetest.register_abm({
|
|||
-- Suck an item from the container above into the hopper
|
||||
local abovenode = minetest.get_node(above)
|
||||
if not minetest.registered_nodes[abovenode.name] then return end
|
||||
local g = minetest.registered_nodes[abovenode.name].groups.container
|
||||
local g = minetest.get_item_group(abovenode.name, "container")
|
||||
local sucked = mcl_util.move_item_container(above, pos)
|
||||
|
||||
-- Also suck in non-fuel items from furnace fuel slot
|
||||
|
@ -454,7 +454,7 @@ minetest.register_abm({
|
|||
end
|
||||
|
||||
-- Move an item from the hopper into the container to which the hopper points to
|
||||
local g = minetest.registered_nodes[frontnode.name].groups.container
|
||||
local g = minetest.get_item_group(frontnode.name, "container")
|
||||
if g == 2 or g == 3 or g == 5 or g == 6 then
|
||||
mcl_util.move_item_container(pos, front)
|
||||
elseif g == 4 then
|
||||
|
|
Loading…
Reference in New Issue