local on_place = function(itemstack, placer, pointed_thing) if pointed_thing.type ~= "node" then -- no interaction possible with entities return itemstack end -- Call on_rightclick if the pointed node defines it local node = minetest.get_node(pointed_thing.under) if placer and not placer:get_player_control().sneak then if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack end end local a = pointed_thing.above local u = pointed_thing.under local node_above = minetest.get_node(a) local node_under = minetest.get_node(u) local def_above = minetest.registered_nodes[node_above.name] local def_under = minetest.registered_nodes[node_under.name] local place_pos, soil_node, place_node, soil_def, place_def if def_under.buildable_to then place_pos = u place_node = node_under place_def = def_under elseif def_above.buildable_to then place_pos = a place_node = node_above place_def = def_above else return itemstack end soil_node = minetest.get_node({x=place_pos.x, y=place_pos.y-1, z=place_pos.z}) soil_def = minetest.registered_nodes[soil_node.name] -- Placement rules: -- * Always allowed on podzol or mycelimu -- * Otherwise, must be solid, opaque and have daylight light level <= 12 local light = minetest.get_node_light(place_pos, 0.5) local light_ok = false if light and light <= 12 then light_ok = true end if (soil_node.name == "mcl_core:podzol" or soil_node.name == "mcl_core:mycelium") or (light_ok and (soil_def.groups and soil_def.groups.solid and soil_def.groups.opaque)) then local idef = itemstack:get_definition() local success = minetest.item_place_node(itemstack, placer, pointed_thing) if success then if idef.sounds and idef.sounds.place then minetest.sound_play(idef.sounds.place, {pos=above, gain=1}) end end end return itemstack end minetest.register_node("mcl_mushrooms:mushroom_brown", { description = "Brown Mushroom", drawtype = "plantlike", tiles = { "farming_mushroom_brown.png" }, inventory_image = "farming_mushroom_brown.png", wield_image = "farming_mushroom_brown.png", sunlight_propagates = true, paramtype = "light", walkable = false, groups = {dig_immediate=3,mushroom=1,attached_node=1,dig_by_water=1,dig_by_piston=1,deco_block=1}, sounds = mcl_sounds.node_sound_leaves_defaults(), light_source = 1, selection_box = { type = "fixed", fixed = { -3/16, -0.5, -3/16, 3/16, -2/16, 3/16 }, }, node_placement_prediction = "", on_place = on_place, _mcl_blast_resistance = 0, }) minetest.register_node("mcl_mushrooms:mushroom_red", { description = "Red Mushroom", drawtype = "plantlike", tiles = { "farming_mushroom_red.png" }, inventory_image = "farming_mushroom_red.png", wield_image = "farming_mushroom_red.png", sunlight_propagates = true, paramtype = "light", walkable = false, groups = {dig_immediate=3,mushroom=1,attached_node=1,dig_by_water=1,dig_by_piston=1,deco_block=1}, sounds = mcl_sounds.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = { -3/16, -0.5, -3/16, 3/16, -2/16, 3/16 }, }, node_placement_prediction = "", on_place = on_place, _mcl_blast_resistance = 0, }) minetest.register_craftitem("mcl_mushrooms:mushroom_stew", { description = "Mushroom Stew", _doc_items_longdesc = "Mushroom stew is a healthy soup which can be consumed for 6 hunger points.", inventory_image = "farming_mushroom_stew.png", on_place = minetest.item_eat(6, "mcl_core:bowl"), on_secondary_use = minetest.item_eat(6, "mcl_core:bowl"), groups = { food = 3, eatable = 6 }, stack_max = 1, }) minetest.register_craft({ type = "shapeless", output = "mcl_mushrooms:mushroom_stew", recipe = {'mcl_core:bowl', 'mcl_mushrooms:mushroom_brown', 'mcl_mushrooms:mushroom_red'} }) --[[ Mushroom spread and death Code based on information gathered from Minecraft Wiki ]] minetest.register_abm({ label = "Mushroom spread", nodenames = {"mcl_mushrooms:mushroom_brown", "mcl_mushrooms:mushroom_red"}, interval = 11, chance = 50, action = function(pos, node) if minetest.get_node_light(pos, nil) > 12 then minetest.dig_node(pos) return end local pos0 = vector.add(pos, {x=-4, y=-1, z=-4}) local pos1 = vector.add(pos, {x=4, y=1, z=4}) -- Stop mushroom spread if a 9×3×9 box is too crowded if #minetest.find_nodes_in_area(pos0, pos1, node.name) >= 5 then return end local selected_pos = table.copy(pos) -- Do two random selections which may place the new mushroom in a 5×5×5 cube local random = { x = selected_pos.x + math.random(-1, 1), y = selected_pos.y + math.random(0, 1) - math.random(0, 1), z = selected_pos.z + math.random(-1, 1) } local random_node = minetest.get_node_or_nil(random) if not random_node or random_node.name ~= "air" then return end local node_under = minetest.get_node_or_nil({x = random.x, y = random.y - 1, z = random.z}) if not node_under then return end if minetest.get_node_light(random, 0.5) > 12 or (minetest.get_item_group(node_under.name, "opaque") == 0) then return end local random2 = { x = random.x + math.random(-1, 1), y = random.y, z = random.z + math.random(-1, 1) } random_node = minetest.get_node_or_nil(random2) if not random_node or random_node.name ~= "air" then return end node_under = minetest.get_node_or_nil({x = random2.x, y = random2.y - 1, z = random2.z}) if not node_under then return end if minetest.get_node_light(random2, 0.5) > 12 or (minetest.get_item_group(node_under.name, "opaque") == 0) then return end minetest.set_node(random2, {name = node.name}) end })