2017-03-31 20:30:18 +03:00
|
|
|
|
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
|
2017-03-31 21:02:50 +03:00
|
|
|
|
local u = pointed_thing.under
|
2017-03-31 20:30:18 +03:00
|
|
|
|
local node_above = minetest.get_node(a)
|
2017-03-31 21:02:50 +03:00
|
|
|
|
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]
|
2017-03-31 20:30:18 +03:00
|
|
|
|
|
|
|
|
|
-- Placement rules:
|
|
|
|
|
-- * Always allowed on podzol or mycelimu
|
|
|
|
|
-- * Otherwise, must be solid, opaque and have daylight light level <= 12
|
2017-03-31 21:02:50 +03:00
|
|
|
|
local light = minetest.get_node_light(place_pos, 0.5)
|
2017-03-31 20:30:18 +03:00
|
|
|
|
local light_ok = false
|
|
|
|
|
if light and light <= 12 then
|
|
|
|
|
light_ok = true
|
|
|
|
|
end
|
2017-03-31 21:02:50 +03:00
|
|
|
|
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
|
2017-03-31 20:30:18 +03:00
|
|
|
|
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
|
|
|
|
|
|
2017-03-01 02:16:52 +02:00
|
|
|
|
minetest.register_node("mcl_mushrooms:mushroom_brown", {
|
2015-06-29 20:55:56 +03:00
|
|
|
|
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,
|
2017-03-29 23:58:31 +03:00
|
|
|
|
groups = {dig_immediate=3,mushroom=1,attached_node=1,dig_by_water=1,dig_by_piston=1,deco_block=1},
|
2017-02-11 19:46:23 +02:00
|
|
|
|
sounds = mcl_sounds.node_sound_leaves_defaults(),
|
2017-01-04 11:11:35 +02:00
|
|
|
|
light_source = 1,
|
2015-06-29 20:55:56 +03:00
|
|
|
|
selection_box = {
|
|
|
|
|
type = "fixed",
|
2017-03-31 20:44:10 +03:00
|
|
|
|
fixed = { -3/16, -0.5, -3/16, 3/16, -2/16, 3/16 },
|
2015-06-29 20:55:56 +03:00
|
|
|
|
},
|
2017-03-31 20:30:18 +03:00
|
|
|
|
node_placement_prediction = "",
|
|
|
|
|
on_place = on_place,
|
2017-02-22 17:03:59 +02:00
|
|
|
|
_mcl_blast_resistance = 0,
|
2015-06-29 20:55:56 +03:00
|
|
|
|
})
|
|
|
|
|
|
2017-03-01 02:16:52 +02:00
|
|
|
|
minetest.register_node("mcl_mushrooms:mushroom_red", {
|
2015-06-29 20:55:56 +03:00
|
|
|
|
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,
|
2017-03-29 23:58:31 +03:00
|
|
|
|
groups = {dig_immediate=3,mushroom=1,attached_node=1,dig_by_water=1,dig_by_piston=1,deco_block=1},
|
2017-02-11 19:46:23 +02:00
|
|
|
|
sounds = mcl_sounds.node_sound_leaves_defaults(),
|
2015-06-29 20:55:56 +03:00
|
|
|
|
selection_box = {
|
|
|
|
|
type = "fixed",
|
2017-03-31 20:44:10 +03:00
|
|
|
|
fixed = { -3/16, -0.5, -3/16, 3/16, -2/16, 3/16 },
|
2015-06-29 20:55:56 +03:00
|
|
|
|
},
|
2017-03-31 20:30:18 +03:00
|
|
|
|
node_placement_prediction = "",
|
|
|
|
|
on_place = on_place,
|
2017-02-22 17:03:59 +02:00
|
|
|
|
_mcl_blast_resistance = 0,
|
2015-06-29 20:55:56 +03:00
|
|
|
|
})
|
|
|
|
|
|
2017-03-01 02:16:52 +02:00
|
|
|
|
minetest.register_craftitem("mcl_mushrooms:mushroom_stew", {
|
2015-06-29 20:55:56 +03:00
|
|
|
|
description = "Mushroom Stew",
|
2017-03-18 18:18:12 +02:00
|
|
|
|
_doc_items_longdesc = "Mushroom stew is a healthy soup which can be consumed for 6 hunger points.",
|
2017-01-20 19:38:12 +02:00
|
|
|
|
inventory_image = "farming_mushroom_stew.png",
|
2017-02-16 18:45:33 +02:00
|
|
|
|
on_place = minetest.item_eat(6, "mcl_core:bowl"),
|
|
|
|
|
on_secondary_use = minetest.item_eat(6, "mcl_core:bowl"),
|
2017-02-16 16:08:26 +02:00
|
|
|
|
groups = { food = 3, eatable = 6 },
|
2017-01-17 00:34:40 +02:00
|
|
|
|
stack_max = 1,
|
2015-06-29 20:55:56 +03:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
minetest.register_craft({
|
|
|
|
|
type = "shapeless",
|
2017-03-01 02:16:52 +02:00
|
|
|
|
output = "mcl_mushrooms:mushroom_stew",
|
|
|
|
|
recipe = {'mcl_core:bowl', 'mcl_mushrooms:mushroom_brown', 'mcl_mushrooms:mushroom_red'}
|
2017-01-04 11:11:35 +02:00
|
|
|
|
})
|
2017-03-01 02:16:52 +02:00
|
|
|
|
|
2017-04-01 01:55:48 +03:00
|
|
|
|
--[[ Mushroom spread and death
|
|
|
|
|
Code based on information gathered from Minecraft Wiki
|
|
|
|
|
<http://minecraft.gamepedia.com/Tutorials/Mushroom_farming#Videos>
|
|
|
|
|
]]
|
|
|
|
|
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
|
2017-04-01 02:04:53 +03:00
|
|
|
|
minetest.dig_node(pos)
|
2017-04-01 01:55:48 +03:00
|
|
|
|
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
|
2017-03-01 02:16:52 +02:00
|
|
|
|
|
2017-04-01 01:55:48 +03:00
|
|
|
|
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
|
|
|
|
|
})
|