From a82610fef1019f6c45e49b2fd10f7656daa40abf Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Dec 2017 16:28:28 +0100 Subject: [PATCH] Allow pores on each side of huge mushroom caps Also automatically create porse when placing cap blocks next to each other. Node names are changed. --- mods/ITEMS/mcl_mushrooms/huge.lua | 173 +++++++++++++++++++++--------- 1 file changed, 122 insertions(+), 51 deletions(-) diff --git a/mods/ITEMS/mcl_mushrooms/huge.lua b/mods/ITEMS/mcl_mushrooms/huge.lua index 8ecbd2bee3..4f8ad38b77 100644 --- a/mods/ITEMS/mcl_mushrooms/huge.lua +++ b/mods/ITEMS/mcl_mushrooms/huge.lua @@ -1,5 +1,5 @@ local template = { - groups = {handy=1,axey=1, huge_mushroom = 1, building_block = 1, not_in_creative_inventory = 1, not_in_craft_guide=1, material_wood = 1 }, + groups = {handy=1,axey=1, building_block = 1, material_wood = 1 }, sounds = mcl_sounds.node_sound_wood_defaults(), is_ground_content = true, _mcl_blast_resistance = 1, @@ -22,82 +22,153 @@ brown.drop = { } } -local register_mushroom = function(color, template, d_cap_top, d_cap_side, d_cap_corner, d_stem, d_pores, d_cap_all, d_stem_all, doc_items_entry_name, doc_items_longdesc) +-- Convert a number to a string with 6 binary digits +local function to_binary(num) + local binary = "" + while (num > 0) do + local remainder_binary = (num % 2) > 0 and 1 or 0 + binary = binary .. remainder_binary + num = math.floor(num/2) + end + binary = string.reverse(binary) + while (string.len(binary) < 6) do + binary = "0" .. binary + end + return binary +end - -- DV (Minecraft dava value) 14: Cap texture on all sides - local full = table.copy(template) - full.description = d_cap_all - full._doc_items_entry_name = doc_items_entry_name - full._doc_items_longdesc = doc_items_longdesc - full.tiles = { "mcl_mushrooms_mushroom_block_skin_"..color..".png" } - minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_cap_full", full) +local register_mushroom = function(color, species_id, template, d_cap, d_stem, d_stem_all, longdesc_cap, longdesc_stem) - -- DV 0: Pores on all sides - local pores_full = table.copy(template) - pores_full.description = d_pores - pores_full._doc_items_create_entry = false - pores_full.tiles = { "mcl_mushrooms_mushroom_block_inside.png" } - minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_pores_full", pores_full) - - -- DV 15: Stem texture on all sides + -- Stem texture on all sides local stem_full = table.copy(template) stem_full.description = d_stem_all - stem_full._doc_items_create_entry = false + stem_full._doc_items_longdesc = "This decorative block is like a huge mushroom stem, but with the stem texture on all sides." stem_full.tiles = { "mcl_mushrooms_mushroom_block_skin_stem.png" } + stem_full.groups.huge_mushroom = species_id + stem_full.groups.huge_mushroom_stem = 2 minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_stem_full", stem_full) - -- DV 10: Stem + -- Stem local stem = table.copy(template) stem.description = d_stem - stem._doc_items_create_entry = false + stem._doc_items_longdesc = longdesc_stem stem.tiles = { "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_skin_stem.png" } + stem.groups.huge_mushroom = species_id + stem.groups.huge_mushroom_stem = 1 minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_stem", stem) - -- DV 1, DV 3, DV 7, DV 9: Cap corner. Cap texture on top and two sides in a corner formation - local cap_corner = table.copy(template) - cap_corner.description = d_cap_corner - cap_corner._doc_items_create_entry = false - cap_corner.paramtype2 = "facedir" - cap_corner.tiles = { "mcl_mushrooms_mushroom_block_skin_"..color..".png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_skin_"..color..".png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_skin_"..color..".png" } - minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_cap_corner", cap_corner) + -- Mushroom block (cap) + -- Each side can either be the cap or the pores texture. + -- Cubes have 6 sides, so there's a total of 2^6 = 64 combinations + for s=0,63 do + local block = table.copy(template) + local bin = to_binary(s) + if s == 63 then + -- All-faces cap. This block is exposed to the player + block.description = d_cap + block._doc_items_longdesc = longdesc_cap + block._doc_items_uagehelp = "By placing huge mushroom blocks of the same species next to each other, the sides that touch each other will turn into pores permanently." + block.tiles = { "mcl_mushrooms_mushroom_block_skin_"..color..".png" } - -- DV 5: Cap texture on top - local cap_top = table.copy(template) - cap_top.description = d_cap_top - cap_top._doc_items_create_entry = false - cap_top.tiles = { "mcl_mushrooms_mushroom_block_skin_"..color..".png", "mcl_mushrooms_mushroom_block_inside.png" } - minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_cap_top", cap_top) + block.on_construct = function(pos) + local sides = { + { { x= 0, y= 1, z= 0 }, 2 }, + { { x= 0, y=-1, z= 0 }, 1 }, + { { x= 1, y= 0, z= 0 }, 4 }, + { { x=-1, y= 0, z= 0 }, 3 }, + { { x= 0, y= 0, z= 1 }, 6 }, + { { x= 0, y= 0, z=-1 }, 5 }, + } - -- DV 2, DV 4, DV 6, DV 8: Cap texture on top and one side - local cap_side = table.copy(template) - cap_side.description = d_cap_side - cap_side._doc_items_create_entry = false - cap_side.paramtype2 = "facedir" - cap_side.tiles = { "mcl_mushrooms_mushroom_block_skin_"..color..".png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_skin_"..color..".png" } - minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_cap_side", cap_side) + -- Replace the side of a mushroom node. Returns the new node. + -- Or nil, if unchanged. + local replace_side = function(pos, node, side) + local bin = string.sub(node.name, -6) + if string.sub(bin, side, side) == "1" then + local new_bin + if side == 1 then + new_bin = "0" .. string.sub(bin, side+1, 6) + elseif side == 6 then + new_bin = string.sub(bin, 1, side-1) .. "0" + else + new_bin = string.sub(bin, 1, side-1) .. "0" .. string.sub(bin, side+1, 6) + end + + return { name = string.sub(node.name, 1, -7) .. new_bin } + end + end + + local node = minetest.get_node(pos) + local species_self = minetest.get_item_group(node.name, "huge_mushroom") + local node_update = table.copy(node) + for i=1, #sides do + local neighbor = vector.add(pos, sides[i][1]) + local neighbor_node = minetest.get_node(neighbor) + local node_set = false + if minetest.get_item_group(neighbor_node.name, "huge_mushroom_cap") ~= 0 and minetest.get_item_group(neighbor_node.name, "huge_mushroom") == species_self then + + local i2 = sides[i][2] + local node_return = replace_side(pos, node_update, i) + if node_return then + node_update = node_return + node_set = true + end + local new_neighbor = replace_side(neighbor, neighbor_node, i2) + if new_neighbor then + minetest.set_node(neighbor, new_neighbor) + end + end + if node_set then + minetest.set_node(pos, node_update) + end + end + end + else + -- Cap block with pores on at least 1 side. + -- These blocks are used internally. + block._doc_items_create_entry = false + block.groups.not_in_creative_inventory = 1 + block.groups.not_in_craft_guide = 1 + block.tiles = {} + for t=1, string.len(bin) do + if string.sub(bin, t, t) == "1" then + block.tiles[t] = "mcl_mushrooms_mushroom_block_skin_"..color..".png" + else + block.tiles[t] = "mcl_mushrooms_mushroom_block_inside.png" + end + end + + if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_111111", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_"..bin) + end + end + + block.groups.huge_mushroom = species_id + block.groups.huge_mushroom_cap = s + + -- bin is a binary string with 6 digits. Each digit stands for the + -- texture of one of the sides, in the same order as the tiles parameter. + -- 0 = pores; 1 = cap. + minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_cap_"..bin, block) + end -- Add entry aliases for the Help if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_full", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_pores_full") doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_full", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_stem_full") doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_full", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_stem") - doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_full", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_corner") - doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_full", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_top") - doc.add_entry_alias("nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_full", "nodes", "mcl_mushrooms:"..color.."_mushroom_block_cap_side") end end -local longdesc_red = "Huge red mushroom blocks are the plant parts of huge red mushrooms. This includes caps, pores and stems of huge red mushrooms; and these blocks come in some variants." -local entry_name_red = "Huge Red Mushroom Block" -register_mushroom("red", red, "Huge Red Mushroom Cap Top", "Huge Red Mushroom Cap Side", "Huge Red Mushroom Cap Corner", "Huge Red Mushroom Stem", "Huge Red Mushroom Pores", "Huge Red Mushroom All-Faces Cap", "Huge Red Mushroom All-Faces Stem", entry_name_red, longdesc_red) +local longdesc_red = "Huge red mushroom blocks are the cap parts of huge red mushrooms. It consists of a red skin and can have pores on each of its sides." +local longdesc_red_stem = "The stem part of a huge red mushroom." +register_mushroom("red", 1, red, "Huge Red Mushroom Block", "Huge Red Mushroom Stem", "Huge Red Mushroom All-Faces Stem", longdesc_red) -local longdesc_brown = "Huge brown mushroom blocks are the plant parts of huge brown mushrooms. This includes caps, pores and stems of huge brown mushrooms; and these blocks come in some variants." -local entry_name_brown = "Huge Brown Mushroom Block" - -register_mushroom("brown", brown, "Huge Brown Mushroom Cap Top", "Huge Brown Mushroom Cap Side", "Huge Brown Mushroom Cap Corner", "Huge Brown Mushroom Stem", "Huge Brown Mushroom Pores", "Huge Brown Mushroom All-Faces Cap", "Huge Brown Mushroom All-Faces Stem", entry_name_brown, longdesc_brown) +local longdesc_brown = "Huge brown mushroom blocks are the cap parts of huge brown mushrooms. It consists of a brown skin and can have pores on each of its sides." +local longdesc_brown_stem = "The stem part of a huge brown mushroom." +register_mushroom("brown", 2, brown, "Huge Brown Mushroom Block", "Huge Brown Mushroom Stem", "Huge Brown Mushroom All-Faces Stem", longdesc_brown) minetest.register_craft({ type = "fuel",