From df8576e77cf8e00b59d2ac1839565471340c75e2 Mon Sep 17 00:00:00 2001 From: kabou Date: Wed, 16 Feb 2022 23:11:39 +0100 Subject: [PATCH] mcl_composters initial commit Implements a composter block with crafting recipe, and some more uncraftable blocks representing various stages of filling. Adds a list of items that can be used with the composter and the chances of these items adding a layer to the composter. Implements methods to add compostable items to the composter, to update the composter to various levels of compost and to harvest an item of bone meal when the composter is ready. Textures were taken from XSSheep/Nova_Wostra Pixel Perfection texture pack. --- mods/ITEMS/mcl_composters/init.lua | 339 ++++++++++++++++++ mods/ITEMS/mcl_composters/locale/template.txt | 7 + mods/ITEMS/mcl_composters/mod.conf | 5 + .../textures/mcl_composter_bottom.png | Bin 0 -> 395 bytes .../textures/mcl_composter_compost.png | Bin 0 -> 409 bytes .../textures/mcl_composter_ready.png | Bin 0 -> 582 bytes .../textures/mcl_composter_side.png | Bin 0 -> 267 bytes .../textures/mcl_composter_top.png | Bin 0 -> 397 bytes 8 files changed, 351 insertions(+) create mode 100644 mods/ITEMS/mcl_composters/init.lua create mode 100644 mods/ITEMS/mcl_composters/locale/template.txt create mode 100644 mods/ITEMS/mcl_composters/mod.conf create mode 100644 mods/ITEMS/mcl_composters/textures/mcl_composter_bottom.png create mode 100644 mods/ITEMS/mcl_composters/textures/mcl_composter_compost.png create mode 100644 mods/ITEMS/mcl_composters/textures/mcl_composter_ready.png create mode 100644 mods/ITEMS/mcl_composters/textures/mcl_composter_side.png create mode 100644 mods/ITEMS/mcl_composters/textures/mcl_composter_top.png diff --git a/mods/ITEMS/mcl_composters/init.lua b/mods/ITEMS/mcl_composters/init.lua new file mode 100644 index 000000000..d77fd4e31 --- /dev/null +++ b/mods/ITEMS/mcl_composters/init.lua @@ -0,0 +1,339 @@ +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 and bone meal can be retrieved from it. " .. + "Taking 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, + -- missing: melon block? + -- 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:spruceapling"] = 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) + -- + -- handle filling the composter when rightclicked + -- as an on_rightclick handles, it returns an itemstack + -- + if not player or 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["_compost_level"] + -- spawn green particles above new layer + mcl_dye.add_bone_meal_particle(vector.add(pos, {x=0, y=level/8, z=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 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) + -- + -- handle harvesting bone meal from a ready composter when rightclicked + -- + if not player or player:get_player_control().sneak then + return + end + -- reset composter to empty + minetest.swap_node(pos, {name="mcl_composters:composter"}) + -- spawn bone meal item (wtf dye?! is this how the make white cocoa) + minetest.add_item(pos, "mcl_dye:white") + -- TODO play some sounds + +end + +local function composter_get_nodeboxes(level) + -- + -- Convenience function because the composter nodeboxes are very similar + -- + 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 + +local composter_wieldimg = minetest.inventorycube("mcl_composter_top.png", "mcl_composter_side.png", "mcl_composter_side.png") +-- +-- Register empty composter +-- 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, + -- FIXME: mcl_composter_side.png is fugly. maybe somehow use minetest.inventorycube(img1, img2, img3) + -- eeeww, that is also ugly and weird + inventory_image = composter_wieldimg, + --inventory_image = "mcl_composter_side.png", + 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 = 2, + _mcl_blast_resistance = 2, + _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 = 2, + _mcl_blast_resistance = 2, + _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 = 2, + _mcl_blast_resistance = 2, + _compost_level = 7, + on_rightclick = composter_harvest +}) diff --git a/mods/ITEMS/mcl_composters/locale/template.txt b/mods/ITEMS/mcl_composters/locale/template.txt new file mode 100644 index 000000000..b882113c4 --- /dev/null +++ b/mods/ITEMS/mcl_composters/locale/template.txt @@ -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 and bone meal can be retrieved from it. Taking out the bone meal empties the composter.= +filled= +ready for harvest= +Converts organic items into bonemeal= diff --git a/mods/ITEMS/mcl_composters/mod.conf b/mods/ITEMS/mcl_composters/mod.conf new file mode 100644 index 000000000..6ae5ff3e6 --- /dev/null +++ b/mods/ITEMS/mcl_composters/mod.conf @@ -0,0 +1,5 @@ +name = mcl_composters +author = kabou +description = composters +depends = mcl_core, mcl_sounds +optional_depends = doc diff --git a/mods/ITEMS/mcl_composters/textures/mcl_composter_bottom.png b/mods/ITEMS/mcl_composters/textures/mcl_composter_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..dc075789938b54b1f26881e9a101b71a6abc7fb0 GIT binary patch literal 395 zcmV;60d)R}P)Sgu9VT3mQ!|Iv^1C7hACacL1C0iqX#f=~#q<4EbDjM+GDnTzf9 zdUiakE!L~$fM3{!0RS}L9VAZ00YC#l^V5T?tu$mT-P=mXv#m4~FO09TdwGNZe8=_8 zeLNdqGg{XHZ~Q;di%W;zz( z8vsx=NP@{JNH#BL(Nsl~TsNR`M|1X}kJYGTANsg&U5G|1w&v<`tb|qmQ>D^?>xQ#L zR5>A#Cdz8LZjf};1?h0En)Ic0;dB@11uN6I>~~}r31}-+5&TUR?6wdj_z*z{nlW&kTOT=zEFP4JS92ZL=aMmxt+E_o_=A_br2;IJptq zi){ki3qllxI5YT!(Yf%TI?f?tv_y4@5CxFd4MG$Qegb$dR{30Y`BJIbn!y8J!pI#) z!Z}0$+$CYO#P-jR$>mf-6jOt4UhwrjR%t50nPr)hSVTcn>~2ye7B)75h~O?5q6jHuF`@y9g~X%` zff!e?u&_}?qPC)y;wp&lPa#2Uf8QhbjTB~mbcpI9B zPhX<7=5h5k%9Zq6830;Am~5$9tEW7qlnNnu(P-k>20;kljp)xwYaCl9=ly@xFRV?e Ue>i!}+5i9m07*qoM6N<$g7W$OLjV8( literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_composters/textures/mcl_composter_side.png b/mods/ITEMS/mcl_composters/textures/mcl_composter_side.png new file mode 100644 index 0000000000000000000000000000000000000000..e70c05858a23413c1572b95eb0eb79d0d78660f3 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdmu-d_r91rNymvHQX(Y^F!P! zqC8rYeP))&Os-5>+n=|fIb%U{Mtn|vECT}rW0JSK3quF1tOo-F180FpWHAE+w=f7Z zGR&GI!N9=4UgGKN%Kn(0nVFAMvST(Q0|P^Wr;B3<$93N`fr5t&L|iT&Wo%|P*%QF> z$|;;-$GCmdUNzF}s%_ss{b@0L8SJNl-m`PHV? zZ3i^&G_|N2YiC={o*>5gK6ldb`w>a=u21d^zq?euN&Dnlh1ve8FWKXrRAq&pHg02J PU|{fc^>bP0l+XkKXaQV^ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_composters/textures/mcl_composter_top.png b/mods/ITEMS/mcl_composters/textures/mcl_composter_top.png new file mode 100644 index 0000000000000000000000000000000000000000..6fb9df7ee2f70e60bf6362ba509a8d3fd78342a3 GIT binary patch literal 397 zcmV;80doF{P)wOosYT3qKEF!)@g^6S zcfzx4D|xtok*n)Racw2HH&5c)O8Cx9q!t!U=m7xlpL4kcbNtfn3;6QyAyGJ)6gpYh zNWwP&U}%sAlT)zRX|af=8k!Wk5p~#`v+IY*MkTv`i2Ek=(MZGAoS#jVkmWyBCJlsc zJX(k