VoxeLibre/mods/ITEMS/mcl_bamboo/init.lua
Michieal 26c1be3722 Fix bamboo node to be Swordy.
Added in secondary bamboo node types.
Changed the grow_bamboo function to make use of new alt nodes, and removed unneccessary "force" parameter.
2022-12-29 01:03:25 -05:00

933 lines
30 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- [bamboo] mod by SmallJoker, Made for MineClone 2 by Michieal (as mcl_bamboo).
-- Parts of mcl_scaffolding were used. Mcl_scaffolding originally created by Cora; Fixed and heavily reworked
-- for mcl_bamboo by Michieal.
-- Creation date: 12-01-2022 (Dec 1st, 2022)
-- License for everything: CC-BY-SA 4.0
-- Bamboo max height: 12-16
-- LOCALS
local modname = minetest.get_current_modname()
local S = minetest.get_translator(modname)
local bamboo = "mcl_bamboo:bamboo"
mcl_bamboo = {}
local node_sound = mcl_sounds.node_sound_wood_defaults()
-- CONSTS
local SIDE_SCAFFOLDING = false
local DEBUG = false
local DOUBLE_DROP_CHANCE = 8
local BAMBOO_SOIL_DIST = -16
local BAM_MAX_HEIGHT_STPCHK = 11
local BAM_MAX_HEIGHT_TOP = 15
-- Due to door fix #2736, doors are displayed backwards. When this is fixed, set this variable to false.
local BROKEN_DOORS = true
--Bamboo can be planted on moss blocks, grass blocks, dirt, coarse dirt, rooted dirt, gravel, mycelium, podzol, sand, red sand, or mud
local bamboo_dirt_nodes = {
"mcl_core:redsand",
"mcl_core:sand",
"mcl_core:dirt",
"mcl_core:coarse_dirt",
"mcl_core:dirt_with_grass",
"mcl_core:podzol",
"mcl_core:mycelium",
"mcl_lush_caves:rooted_dirt",
"mcl_lush_caves:moss",
"mcl_mud:mud",
}
local strlen = string.len()
local substr = string.sub()
local rand = math.random()
--- pos: node position; placer: ObjectRef that is placing the item
--- returns: true if protected, otherwise false.
function mcl_bamboo.is_protected(pos, placer)
local name = placer:get_player_name()
if minetest.is_protected(pos, name) then
minetest.record_protection_violation(pos, name)
return true
end
return false
end
function mcl_bamboo.grow_bamboo(pos, _)
if not force or force == "" then
force = false
end
local chk_pos
local soil_pos
if minetest.get_node_light(pos) < 8 then
return
end
local found = false -- used for the soil check
local mboo = ""
for py = -1, BAMBOO_SOIL_DIST, -1 do
chk_pos = vector.offset(pos, 0, py, 0)
local name = minetest.get_node(chk_pos).name
for i = 1, #bamboo_dirt_nodes do
if name == bamboo_dirt_nodes[i] then
found = true
soil_pos = chk_pos
break
end
end
if found then
break
else
mboo = substr(name, strlen(name) - 3, strlen(name))
if mboo ~= "mboo" and mboo ~= "oo_1" and mboo ~= "oo_2" and mboo ~= "oo_3" then
break
end
end
end
-- requires knowing where the soil node is.
if not found then
return
end
local grow_amount = rand(1, 32)
grow_amount = rand(1, 32)
grow_amount = rand(1, 32)
grow_amount = rand(1, 32) -- because yeah, not truly random, or even a good prng.
-- Bonemeal: Grows the bamboo by 1-2 stems. (per the minecraft wiki.)
for py = 1, BAM_MAX_HEIGHT_TOP do
chk_pos = vector.offset(pos, 0, py, 0)
local node_below = minetest.get_node(pos).name
local name = minetest.get_node(chk_pos).name
local dist = vector.distance(soil_pos, chk_pos)
if dist >= BAM_MAX_HEIGHT_STPCHK then
-- stop growing check.
if name == "air" then
local height = rand(BAM_MAX_HEIGHT_STPCHK, BAM_MAX_HEIGHT_TOP)
if height == dist then
minetest.set_node(chk_pos, {name = "mcl_bamboo:bamboo_endcap"})
end
end
break
end
mboo = substr(name, strlen(name) - 3, strlen(name))
if name == "air" then
minetest.set_node(chk_pos, {name = node_below})
-- handle growing a second node.
if grow_amount == 2 then
chk_pos = vector.offset(chk_pos, 0, 1, 0)
if minetest.get_node(chk_pos).name == "air" then
minetest.set_node(chk_pos, {name = node_below})
end
end
break
elseif mboo ~= "mboo" and mboo ~= "oo_1" and mboo ~= "oo_2" and mboo ~= "oo_3" then
break
end
end
end
-- Add Groups function, courtesy of Warr1024.
function mcl_bamboo.addgroups(name, ...)
local def = minetest.registered_items[name] or error(name .. " not found")
local groups = {}
for k, v in pairs(def.groups) do
groups[k] = v
end
local function addall(x, ...)
if not x then
return
end
groups[x] = 1
return addall(...)
end
addall(...)
return minetest.override_item(name, {groups = groups})
end
-- LOCAL FUNCTIONS
local function create_nodes()
local bamboo_def = {
description = "Bamboo",
tiles = {"mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo.png"},
drawtype = "nodebox",
paramtype = "light",
groups = {handy = 1, swordy = 1, choppy = 1, flammable = 3},
sounds = node_sound,
drop = {
max_items = 1,
-- Maximum number of item lists to drop.
-- The entries in 'items' are processed in order. For each:
-- Item filtering is applied, chance of drop is applied, if both are
-- successful the entire item list is dropped.
-- Entry processing continues until the number of dropped item lists
-- equals 'max_items'.
-- Therefore, entries should progress from low to high drop chance.
items = {
-- Examples:
{
-- 1 in 100 chance of dropping.
-- Default rarity is '1'.
rarity = DOUBLE_DROP_CHANCE,
items = {bamboo .. " 2"},
},
{
-- 1 in 2 chance of dropping.
-- Default rarity is '1'.
rarity = 1,
items = {bamboo},
},
},
},
inventory_image = "mcl_bamboo_bamboo_shoot.png",
wield_image = "mcl_bamboo_bamboo_shoot.png",
_mcl_blast_resistance = 1,
_mcl_hardness = 1.5,
node_box = {
type = "fixed",
fixed = {
{-0.175, -0.5, -0.195, 0.05, 0.5, 0.030},
}
},
on_place = function(itemstack, placer, pointed_thing)
if pointed_thing.type ~= "node" then
return itemstack
end
local node = minetest.get_node(pointed_thing.under)
local pos = pointed_thing.under
if DEBUG then
minetest.log("mcl_bamboo::Node placement data:")
minetest.log(dump(pointed_thing))
minetest.log(dump(node))
end
if DEBUG then
minetest.log("mcl_bamboo::Checking for protected placement of bamboo.")
end
if mcl_bamboo.is_protected(pos, placer) then
return
end
if DEBUG then
minetest.log("mcl_bamboo::placement of bamboo is not protected.")
end
-- Use pointed node's on_rightclick function first, if present
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
if DEBUG then
minetest.log("mcl_bamboo::attempting placement of bamboo via targeted node's on_rightclick.")
end
return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack
end
end
local mboo = substr(node.name, strlen(node.name) - 3, strlen(node.name))
if mboo ~= "mboo" and mboo ~= "oo_1" and mboo ~= "oo_2" and mboo ~= "oo_3" then
-- not bamboo...
if node.name ~= "mcl_flowerpots:flower_pot" then
local found = false
for i = 1, #bamboo_dirt_nodes do
if node.name == bamboo_dirt_nodes[i] then
found = true
break
end
end
if not found then
return itemstack
end
end
end
if DEBUG then
minetest.log("mcl_bamboo::placing bamboo directly.")
end
local place_item = table.copy(itemstack) -- make a copy so that we don't indirectly mess with the original.
if mboo == "mboo" then
return minetest.item_place(itemstack, placer, pointed_thing, minetest.dir_to_facedir(vector.direction(pointed_thing.above, pointed_thing.under)))
elseif mboo ~= "oo_1" then
place_item:set_name(bamboo .. "_1")
itemstack:set_count(itemstack:get_count() - 1)
minetest.item_place(place_item, placer, pointed_thing, minetest.dir_to_facedir(vector.direction(pointed_thing.above, pointed_thing.under)))
return itemstack, pointed_thing.under
elseif mboo ~= "oo_2" then
place_item:set_name(bamboo .. "_2")
itemstack:set_count(itemstack:get_count() - 1)
minetest.item_place(place_item, placer, pointed_thing, minetest.dir_to_facedir(vector.direction(pointed_thing.above, pointed_thing.under)))
return itemstack, pointed_thing.under
elseif mboo ~= "oo_3" then
place_item:set_name(bamboo .. "_3")
itemstack:set_count(itemstack:get_count() - 1)
minetest.item_place(place_item, placer, pointed_thing, minetest.dir_to_facedir(vector.direction(pointed_thing.above, pointed_thing.under)))
return itemstack, pointed_thing.under
else
local placed_type = rand(0, 3) -- randomly choose which one to place.
placed_type = rand(0, 3)
placed_type = rand(0, 3)
placed_type = rand(0, 3) -- Get the lua juices flowing. (Really, this is just to get it to give a real random number.)
if placed_type == 1 then
place_item:set_name(bamboo .. "_1")
end
if placed_type == 2 then
place_item:set_name(bamboo .. "_2")
end
if placed_type == 3 then
place_item:set_name(bamboo .. "_3")
end
itemstack:set_count(itemstack:get_count() - 1)
minetest.item_place(place_item, placer, pointed_thing, minetest.dir_to_facedir(vector.direction(pointed_thing.above, pointed_thing.under)))
return itemstack, pointed_thing.under
end
end,
on_destruct = function(pos)
-- Node destructor; called before removing node.
local new_pos = vector.offset(pos, 0, 1, 0)
local node_above = minetest.get_node(new_pos)
if node_above and node_above.name == bamboo then
local sound_params = {
pos = new_pos,
gain = 1.0, -- default
max_hear_distance = 10, -- default, uses a Euclidean metric
}
minetest.remove_node(new_pos)
minetest.sound_play(node_sound.dug, sound_params, true)
local istack = ItemStack(bamboo)
if math.random(1, DOUBLE_DROP_CHANCE) == 1 then
minetest.add_item(new_pos, istack)
end
minetest.add_item(new_pos, istack)
elseif node_above and node_above.name == "mcl_bamboo:bamboo_endcap" then
minetest.remove_node(new_pos)
minetest.sound_play(node_sound.dug, sound_params, true)
local istack = ItemStack(bamboo)
minetest.add_item(new_pos, istack)
if math.random(1, DOUBLE_DROP_CHANCE) == 1 then
minetest.add_item(new_pos, istack)
end
end
end,
}
minetest.register_node(bamboo, bamboo_def)
local bamboo_top = table.copy(bamboo_def)
bamboo_top.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, flammable = 3}
bamboo_top.tiles = {"mcl_bamboo_endcap.png"}
bamboo_top.drawtype = "plantlike"
bamboo_top.paramtype2 = "meshoptions"
bamboo_top.param2 = 34
bamboo_top.nodebox = nil
bamboo_top.on_place = function(itemstack, _, _)
-- Should never occur... but, if it does, then nix it.
itemstack:set_name(bamboo)
return itemstack
end
minetest.register_node("mcl_bamboo:bamboo_endcap", bamboo_top)
local bamboo_block_def = {
description = "Bamboo Block",
tiles = {"mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo_block.png"},
groups = {handy = 1, building_block = 1, axey = 1, flammable = 2, material_wood = 1, bamboo_block = 1, fire_encouragement = 5, fire_flammability = 5},
sounds = node_sound,
paramtype2 = "facedir",
drops = "mcl_bamboo:bamboo_block",
_mcl_blast_resistance = 3,
_mcl_hardness = 2,
_mcl_stripped_variant = "mcl_bamboo:bamboo_block_stripped", -- this allows us to use the built in Axe's strip block.
on_place = function(itemstack, placer, pointed_thing)
local pos = pointed_thing.under
if mcl_bamboo.is_protected(pos, placer) then
return
end
-- Use pointed node's on_rightclick function first, if present
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
return minetest.item_place(itemstack, placer, pointed_thing, minetest.dir_to_facedir(vector.direction(pointed_thing.above, pointed_thing.under)))
end,
}
-- basic bamboo nodes.
minetest.register_node("mcl_bamboo:bamboo_block", bamboo_block_def)
local bamboo_stripped_block = table.copy(bamboo_block_def)
bamboo_stripped_block.on_rightclick = nil
bamboo_stripped_block.description = S("Stripped Bamboo Block")
bamboo_stripped_block.tiles = {"mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo_block_stripped.png"}
minetest.register_node("mcl_bamboo:bamboo_block_stripped", bamboo_stripped_block)
minetest.register_node("mcl_bamboo:bamboo_plank", {
description = S("Bamboo Plank"),
_doc_items_longdesc = S("Bamboo Plank"),
_doc_items_hidden = false,
tiles = {"mcl_bamboo_bamboo_plank.png"},
stack_max = 64,
is_ground_content = false,
groups = {handy = 1, axey = 1, flammable = 3, wood = 1, building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20},
sounds = mcl_sounds.node_sound_wood_defaults(),
_mcl_blast_resistance = 3,
_mcl_hardness = 2,
})
-- specific bamboo nodes...
if minetest.get_modpath("mcl_flowerpots") then
if DEBUG then
minetest.log("mcl_bamboo::FlowerPot Section Entrance. Modpath exists.")
end
if mcl_flowerpots ~= nil then
-- Flower-potted Bamboo...
local flwr_name = "mcl_bamboo:bamboo"
local flwr_def = {name = "bamboo_plant",
desc = S("Bamboo"),
image = "mcl_bamboo_bamboo_fpm.png", -- use with "register_potted_cube"
-- "mcl_bamboo_flower_pot.png", -- use with "register_potted_flower"
}
mcl_flowerpots.register_potted_cube(flwr_name, flwr_def)
-- mcl_flowerpots.register_potted_flower(flwr_name, flwr_def)
minetest.register_alias("bamboo_flower_pot", "mcl_flowerpots:flower_pot_bamboo_plant")
end
end
if minetest.get_modpath("mcl_doors") then
if mcl_doors then
local top_door_tiles = {}
local bot_door_tiles = {}
if BROKEN_DOORS then
top_door_tiles = {"mcl_bamboo_door_top_alt.png", "mcl_bamboo_door_top.png"}
bot_door_tiles = {"mcl_bamboo_door_bottom_alt.png", "mcl_bamboo_door_bottom.png"}
else
top_door_tiles = {"mcl_bamboo_door_top.png", "mcl_bamboo_door_top.png"}
bot_door_tiles = {"mcl_bamboo_door_bottom.png", "mcl_bamboo_door_bottom.png"}
end
local name = "mcl_bamboo:bamboo_door"
local def = {
description = S("Bamboo Door."),
inventory_image = "mcl_bamboo_door_wield.png",
wield_image = "mcl_bamboo_door_wield.png",
groups = {handy = 1, axey = 1, material_wood = 1, flammable = -1},
_mcl_hardness = 3,
_mcl_blast_resistance = 3,
tiles_bottom = bot_door_tiles,
tiles_top = top_door_tiles,
sounds = mcl_sounds.node_sound_wood_defaults(),
}
mcl_doors:register_door(name, def)
name = "mcl_bamboo:bamboo_trapdoor"
local trap_def = {
description = S("Bamboo Trapdoor."),
inventory_image = "mcl_bamboo_door_complete.png",
groups = {},
tile_front = "mcl_bamboo_trapdoor_top.png",
tile_side = "mcl_bamboo_trapdoor_side.png",
_doc_items_longdesc = S("Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder."),
_doc_items_usagehelp = S("To open or close the trapdoor, rightclick it or send a redstone signal to it."),
wield_image = "mcl_bamboo_trapdoor_wield.png",
inventory_image = "mcl_bamboo_trapdoor_wield.png",
groups = {handy = 1, axey = 1, mesecon_effector_on = 1, material_wood = 1, flammable = -1},
_mcl_hardness = 3,
_mcl_blast_resistance = 3,
sounds = mcl_sounds.node_sound_wood_defaults(),
}
mcl_doors:register_trapdoor(name, trap_def)
minetest.register_alias("bamboo_door", "mcl_bamboo:bamboo_door")
minetest.register_alias("bamboo_trapdoor", "mcl_bamboo:bamboo_trapdoor")
end
end
if minetest.get_modpath("mcl_stairs") then
if mcl_stairs ~= nil then
mcl_stairs.register_stair_and_slab_simple(
"bamboo_block",
"mcl_bamboo:bamboo_block",
S("Bamboo Stair"),
S("Bamboo Slab"),
S("Double Bamboo Slab")
)
mcl_stairs.register_stair_and_slab_simple(
"bamboo_stripped",
"mcl_bamboo:bamboo_block_stripped",
S("Stripped Bamboo Stair"),
S("Stripped Bamboo Slab"),
S("Double Stripped Bamboo Slab")
)
mcl_stairs.register_stair_and_slab_simple(
"bamboo_plank",
"mcl_bamboo:bamboo_plank",
S("Bamboo Plank Stair"),
S("Bamboo Plank Slab"),
S("Double Bamboo Plank Slab")
)
-- let's add plank slabs to the wood_slab group.
local bamboo_plank_slab = "mcl_stairs:slab_bamboo_plank"
local node_groups = {
wood_slab = 1,
building_block = 1,
slab = 1,
axey = 1,
handy = 1,
stair = 1,
flammable = 1,
fire_encouragement = 5,
fire_flammability = 20
}
minetest.override_item(bamboo_plank_slab, {groups = node_groups})
end
end
if minetest.get_modpath("mesecons_pressureplates") then
if mesecon ~= nil and mesecon.register_pressure_plate ~= nil then
-- make sure that pressure plates are installed.
-- Bamboo Pressure Plate...
-- Register a Pressure Plate (api command doc.)
-- basename: base name of the pressure plate
-- description: description displayed in the player's inventory
-- textures_off:textures of the pressure plate when inactive
-- textures_on: textures of the pressure plate when active
-- image_w: wield image of the pressure plate
-- image_i: inventory image of the pressure plate
-- recipe: crafting recipe of the pressure plate
-- sounds: sound table (like in minetest.register_node)
-- plusgroups: group memberships (attached_node=1 and not_in_creative_inventory=1 are already used)
-- activated_by: optimal table with elements denoting by which entities this pressure plate is triggered
-- Possible table fields:
-- * player=true: Player
-- * mob=true: Mob
-- By default, is triggered by all entities
-- longdesc: Customized long description for the in-game help (if omitted, a dummy text is used)
mesecon.register_pressure_plate(
"mcl_bamboo:pressure_plate_bamboo_wood",
S("Bamboo Pressure Plate"),
{"mcl_bamboo_bamboo_plank.png"},
{"mcl_bamboo_bamboo_plank.png"},
"mcl_bamboo_bamboo_plank.png",
nil,
{{"mcl_bamboo:bamboo_plank", "mcl_bamboo:bamboo_plank"}},
mcl_sounds.node_sound_wood_defaults(),
{axey = 1, material_wood = 1},
nil,
S("A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it."))
minetest.register_craft({
type = "fuel",
recipe = "mcl_bamboo:pressure_plate_bamboo_wood_off",
burntime = 15
})
minetest.register_alias("bamboo_pressure_plate", "mcl_bamboo:pressure_plate_bamboo_wood")
end
end
if minetest.get_modpath("mcl_signs") then
if DEBUG then
minetest.log("mcl_bamboo::Signs Section Entrance. Modpath exists.")
end
if mcl_signs ~= nil then
-- Bamboo Signs...
mcl_signs.register_sign_custom("mcl_bamboo", "_bamboo", "mcl_signs_sign_greyscale.png",
"#f6dc91", "default_sign_greyscale.png", "default_sign_greyscale.png",
"Bamboo Sign")
mcl_signs.register_sign_craft("mcl_bamboo", "mcl_bamboo:bamboo_plank", "_bamboo")
minetest.register_alias("bamboo_sign", "mcl_signs:wall_sign_bamboo")
end
end
if minetest.get_modpath("mcl_fences") then
if DEBUG then
minetest.log("mcl_bamboo::Fences Section Entrance. Modpath exists.")
end
local id = "bamboo_fence"
local id_gate = "bamboo_fence_gate"
local wood_groups = {handy = 1, axey = 1, flammable = 2, fence_wood = 1, fire_encouragement = 5, fire_flammability = 20}
local wood_connect = {"group:fence_wood"}
local fence_id = mcl_fences.register_fence(id, S("Bamboo Fence"), "mcl_bamboo_fence_bamboo.png", wood_groups,
2, 15, wood_connect, node_sound)
local gate_id = mcl_fences.register_fence_gate(id, S("Bamboo Fence Gate"), "mcl_bamboo_fence_gate_bamboo.png",
wood_groups, 2, 15, node_sound) -- note: about missing params.. will use defaults.
if DEBUG then
minetest.log(dump(fence_id))
minetest.log(dump(gate_id))
end
local craft_wood = "mcl_bamboo:bamboo_plank"
minetest.register_craft({
output = "mcl_bamboo:" .. id .. " 3",
recipe = {
{craft_wood, "mcl_core:stick", craft_wood},
{craft_wood, "mcl_core:stick", craft_wood},
}
})
minetest.register_craft({
output = "mcl_bamboo:" .. id_gate,
recipe = {
{"mcl_core:stick", craft_wood, "mcl_core:stick"},
{"mcl_core:stick", craft_wood, "mcl_core:stick"},
}
})
-- mcl_fences.register_fence("nether_brick_fence", S("Nether Brick Fence"), "mcl_fences_fence_nether_brick.png", {pickaxey=1, deco_block=1, fence_nether_brick=1}, 2, 30, {"group:fence_nether_brick"}, mcl_sounds.node_sound_stone_defaults())
minetest.register_alias("bamboo_fence", "mcl_fences:" .. id)
minetest.register_alias("bamboo_fence_gate", "mcl_fences:" .. id_gate)
end
if minetest.get_modpath("mesecons_button") then
if mesecon ~= nil then
mesecon.register_button(
"bamboo",
S("Bamboo Button"),
"mcl_bamboo_bamboo_plank.png",
"mcl_bamboo:bamboo_plank",
node_sound,
{material_wood = 1, handy = 1, pickaxey = 1, flammable = 3, fire_flammability = 20, fire_encouragement = 5, },
1,
false,
S("A bamboo button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second."),
"mesecons_button_push")
end
end
minetest.register_node("mcl_bamboo:scaffolding", {
description = S("Scaffolding"),
doc_items_longdesc = S("Scaffolding block used to climb up or out across areas."),
doc_items_hidden = false,
tiles = {"mcl_bamboo_scaffolding_top.png", "mcl_bamboo_scaffolding_top.png", "mcl_bamboo_scaffolding_bottom.png"},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "4dir",
param2 = 0,
use_texture_alpha = "clip",
node_box = {
type = "fixed",
fixed = {
{-0.5, 0.375, -0.5, 0.5, 0.5, 0.5},
{-0.5, -0.5, -0.5, -0.375, 0.5, -0.375},
{0.375, -0.5, -0.5, 0.5, 0.5, -0.375},
{0.375, -0.5, 0.375, 0.5, 0.5, 0.5},
{-0.5, -0.5, 0.375, -0.375, 0.5, 0.5},
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
},
},
buildable_to = false,
is_ground_content = false,
walkable = false,
climbable = true,
physical = true,
node_placement_prediction = "",
groups = {handy = 1, axey = 1, flammable = 3, building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, falling_node = 1, stack_falling = 1},
sounds = mcl_sounds.node_sound_wood_defaults(),
_mcl_blast_resistance = 0,
_mcl_hardness = 0,
on_place = function(itemstack, placer, ptd)
local scaff_node_name = "mcl_bamboo:scaffolding"
if SIDE_SCAFFOLDING then
-- count param2 up when placing to the sides. Fall when > 6
local ctrl = placer:get_player_control()
if ctrl and ctrl.sneak then
local pp2 = minetest.get_node(ptd.under).param2
local np2 = pp2 + 1
if minetest.get_node(vector.offset(ptd.above, 0, -1, 0)).name == "air" then
minetest.set_node(ptd.above, {name = "mcl_bamboo:scaffolding_horizontal", param2 = np2})
itemstack:take_item(1)
end
if np2 > 6 then
minetest.check_single_for_falling(ptd.above)
end
return itemstack
end
end
if DEBUG then
minetest.log("mcl_bamboo::Checking for protected placement of scaffolding.")
end
local node = minetest.get_node(ptd.under)
local pos = ptd.under
if mcl_bamboo.is_protected(pos, placer) then
return
end
if DEBUG then
minetest.log("mcl_bamboo::placement of scaffolding is not protected.")
end
--place on solid nodes
if itemstack:get_name() ~= node.name then
minetest.set_node(ptd.above, {name = scaff_node_name, param2 = 0})
if not minetest.is_creative_enabled(placer:get_player_name()) then
itemstack:take_item(1)
end
return itemstack
end
--build up when placing on existing scaffold
local h = 0
repeat
pos.y = pos.y + 1
local cn = minetest.get_node(pos)
local cnb = minetest.get_node(ptd.under)
local bn = minetest.get_node(vector.offset(ptd.under, 0, -1, 0))
if cn.name == "air" then
-- first step to making scaffolding work like Minecraft scaffolding.
if cnb.name == scaff_node_name and bn == scaff_node_name and SIDE_SCAFFOLDING == false then
return itemstack
end
minetest.set_node(pos, node)
if not minetest.is_creative_enabled(placer:get_player_name()) then
itemstack:take_item(1)
end
placer:set_wielded_item(itemstack)
return itemstack
end
h = h + 1
until cn.name ~= node.name or itemstack:get_count() == 0 or h >= 128
end,
on_destruct = function(pos)
-- Node destructor; called before removing node.
local new_pos = vector.offset(pos, 0, 1, 0)
local node_above = minetest.get_node(new_pos)
if node_above and node_above.name == "mcl_bamboo:scaffolding" then
local sound_params = {
pos = new_pos,
gain = 1.0, -- default
max_hear_distance = 10, -- default, uses a Euclidean metric
}
minetest.remove_node(new_pos)
minetest.sound_play(node_sound.dug, sound_params, true)
local istack = ItemStack("mcl_bamboo:scaffolding")
minetest.add_item(new_pos, istack)
end
end,
})
end
local function register_craftings()
-- Craftings
minetest.register_craft({
output = bamboo .. "_block",
recipe = {
{bamboo, bamboo, bamboo},
{bamboo, bamboo, bamboo},
{bamboo, bamboo, bamboo},
}
})
minetest.register_craft({
output = bamboo .. "_plank 2",
recipe = {
{bamboo .. "_block"},
}
})
minetest.register_craft({
output = bamboo .. "_plank 2",
recipe = {
{bamboo .. "_block_stripped"},
}
})
minetest.register_craft({
output = "mcl_core:stick",
recipe = {
{bamboo},
{bamboo},
}
})
minetest.register_craft({
output = "mcl_bamboo:scaffolding 6",
recipe = {{bamboo, "mcl_mobitems:string", bamboo},
{bamboo, "", bamboo},
{bamboo, "", bamboo}}
})
minetest.register_craft({
output = "mcl_bamboo:bamboo_door 3",
recipe = {
{bamboo .. "_plank", bamboo .. "_plank"},
{bamboo .. "_plank", bamboo .. "_plank"},
{bamboo .. "_plank", bamboo .. "_plank"}
}
})
minetest.register_craft({
output = "mcl_bamboo:bamboo_trapdoor 2",
recipe = {
{bamboo .. "_plank", bamboo .. "_plank", bamboo .. "_plank"},
{bamboo .. "_plank", bamboo .. "_plank", bamboo .. "_plank"},
}
})
-- Fuels
minetest.register_craft({
type = "fuel",
recipe = "mcl_bamboo:bamboo_door",
burntime = 10,
})
minetest.register_craft({
type = "fuel",
recipe = "mcl_bamboo:bamboo_trapdoor",
burntime = 15,
})
minetest.register_craft({
type = "fuel",
recipe = bamboo,
burntime = 2.5, -- supposed to be 1/2 that of a stick, per minecraft wiki as of JE 1.19.3
})
minetest.register_craft({
type = "fuel",
recipe = bamboo .. "_block",
burntime = 15,
})
minetest.register_craft({
type = "fuel",
recipe = bamboo .. "_block_stripped",
burntime = 15,
})
minetest.register_craft({
type = "fuel",
recipe = bamboo .. "_plank",
burntime = 7.5,
})
minetest.register_craft({
type = "fuel",
recipe = "mcl_bamboo:scaffolding",
burntime = 20
})
if minetest.get_modpath("mcl_stairs") then
if mcl_stairs ~= nil then
minetest.register_craft({
type = "fuel",
recipe = "mcl_stairs:slab_bamboo_plank",
burntime = 7.5,
})
minetest.register_craft({
type = "fuel",
recipe = "mcl_stairs:slab_bamboo_block",
burntime = 7.5,
})
minetest.register_craft({
type = "fuel",
recipe = "mcl_stairs:slab_bamboo_stripped",
burntime = 7.5,
})
minetest.register_craft({
type = "fuel",
recipe = "mcl_stairs:stair_bamboo_plank",
burntime = 15,
})
minetest.register_craft({
type = "fuel",
recipe = "mcl_stairs:stair_bamboo_block",
burntime = 15,
})
minetest.register_craft({
type = "fuel",
recipe = "mcl_stairs:stair_bamboo_stripped",
burntime = 15,
})
end
end
minetest.register_craft({
type = "fuel",
recipe = "mesecons_button:button_bamboo_off",
burntime = 5,
})
end
create_nodes()
register_craftings()
-- BAMBOO_TOO (Bamboo two)
dofile(minetest.get_modpath(modname) .. "/bambootoo.lua")
--ABMs
minetest.register_abm({
nodenames = {bamboo, bamboo .. "_1", bamboo .. "_2", bamboo .. "_3"},
interval = 40,
chance = 40,
action = function(pos, node)
mcl_bamboo.grow_bamboo(pos, node)
end,
})
-- Base Aliases.
minetest.register_alias("bamboo_block", "mcl_bamboo:bamboo_block")
minetest.register_alias("bamboo_strippedblock", "mcl_bamboo:bamboo_block_stripped")
minetest.register_alias("bamboo", "mcl_bamboo:bamboo")
minetest.register_alias("bamboo_plank", "mcl_bamboo:bamboo_plank")
minetest.register_alias("bamboo_mosaic", "mcl_bamboo:bamboo_mosaic")
minetest.register_alias("mcl_stairs:stair_bamboo", "mcl_stairs:stair_bamboo_block")
minetest.register_alias("bamboo:bamboo", "mcl_bamboo:bamboo")
minetest.register_alias("mcl_scaffolding:scaffolding", "mcl_bamboo:scaffolding")
minetest.register_alias("mcl_scaffolding:scaffolding_horizontal", "mcl_bamboo:scaffolding")
--[[
todo -- make scaffolds do side scaffold blocks, so that they jut out.
todo -- Also, make those blocks collapse (break) when a nearby connected scaffold breaks.
todo -- add in alternative bamboo styles to simulate random placement. (see commented out node box definitions.
todo -- Add Flourish to the endcap node for bamboo.
todo -- mash all of that together so that it drops as one item, and chooses what version to be, in on_place.
todo -- Add in Extras.
todo -- fix scaffolding placing, instead of using on_rightclick first.
todo -- make graphic for top node of bamboo.
todo -- add bamboo to junk items in fishing.
waiting on specific things:
todo -- Raft -- need model
todo -- Raft with Chest. same.
todo -- handle bonemeal...
Notes:
When bone meal is used on it, it grows by 12 blocks. Bamboo can grow up to 1216 blocks tall.
The top of a bamboo plant requires a light level of 9 or above to grow.
Design Decision - to not make bamboo saplings, and not make them go through a ton of transformations.
--]]