1
0
Fork 0

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.
This commit is contained in:
Michieal 2022-12-29 01:03:25 -05:00
parent acc2be7253
commit 26c1be3722
2 changed files with 103 additions and 25 deletions

View File

@ -16,6 +16,33 @@ local adj_nodes = {
} }
local function bambootoo_create_nodes() local function bambootoo_create_nodes()
-- Bamboo alternative node types.
local def = minetest.registered_nodes [bamboo]
def.node_box = {
type = "fixed",
fixed = {
{-0.05, -0.5, 0.285, -0.275, 0.5, 0.06},
}
}
minetest.register_node(bamboo.."_1", def)
def.node_box = {
type = "fixed",
fixed = {
{0.25, -0.5, 0.325, 0.025, 0.5, 0.100},
}
}
minetest.register_node(bamboo.."_2", def)
def.node_box = {
type = "fixed",
fixed = {
{-0.125, -0.5, 0.125, -0.3125, 0.5, 0.3125},
}
}
minetest.register_node(bamboo.."_3", def)
local bamboo_mosaic = minetest.registered_nodes[bamboo .. "_plank"] local bamboo_mosaic = minetest.registered_nodes[bamboo .. "_plank"]
bamboo_mosaic.tiles = {"mcl_bamboo_bamboo_plank.png"} bamboo_mosaic.tiles = {"mcl_bamboo_bamboo_plank.png"}
bamboo_mosaic.groups = {handy = 1, axey = 1, flammable = 3, fire_encouragement = 5, fire_flammability = 20} bamboo_mosaic.groups = {handy = 1, axey = 1, flammable = 3, fire_encouragement = 5, fire_flammability = 20}
@ -35,6 +62,7 @@ local function bambootoo_create_nodes()
end end
end end
minetest.register_node("mcl_bamboo:scaffolding_horizontal", { minetest.register_node("mcl_bamboo:scaffolding_horizontal", {
description = S("Scaffolding (horizontal)"), description = S("Scaffolding (horizontal)"),
doc_items_longdesc = S("Scaffolding block used to climb up or out across areas."), doc_items_longdesc = S("Scaffolding block used to climb up or out across areas."),
@ -84,7 +112,7 @@ local function bambootoo_create_nodes()
if mcl_bamboo.is_protected(pos, placer) then if mcl_bamboo.is_protected(pos, placer) then
return return
end end
-- todo: finish this section.
end end

View File

@ -40,6 +40,10 @@ local bamboo_dirt_nodes = {
"mcl_mud:mud", "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 --- pos: node position; placer: ObjectRef that is placing the item
--- returns: true if protected, otherwise false. --- returns: true if protected, otherwise false.
function mcl_bamboo.is_protected(pos, placer) function mcl_bamboo.is_protected(pos, placer)
@ -51,7 +55,7 @@ function mcl_bamboo.is_protected(pos, placer)
return false return false
end end
function mcl_bamboo.grow_bamboo(pos, _, force) function mcl_bamboo.grow_bamboo(pos, _)
if not force or force == "" then if not force or force == "" then
force = false force = false
end end
@ -60,50 +64,64 @@ function mcl_bamboo.grow_bamboo(pos, _, force)
if minetest.get_node_light(pos) < 8 then if minetest.get_node_light(pos) < 8 then
return return
end end
local found_soil = false local found = false -- used for the soil check
local mboo = ""
for py = -1, BAMBOO_SOIL_DIST, -1 do for py = -1, BAMBOO_SOIL_DIST, -1 do
chk_pos = vector.offset(pos, 0, py, 0) chk_pos = vector.offset(pos, 0, py, 0)
local name = minetest.get_node(chk_pos).name local name = minetest.get_node(chk_pos).name
if minetest.get_item_group(name, "soil") ~= 0 then for i = 1, #bamboo_dirt_nodes do
found_soil = true if name == bamboo_dirt_nodes[i] then
found = true
soil_pos = chk_pos soil_pos = chk_pos
break break
elseif name ~= bamboo then end
end
if found then
break 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
end end
-- requires knowing where the soil node is. -- requires knowing where the soil node is.
if not found_soil then if not found then
return return
end end
local grow_amount = math.random(1, 2) 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.) -- Bonemeal: Grows the bamboo by 1-2 stems. (per the minecraft wiki.)
for py = 1, BAM_MAX_HEIGHT_TOP do for py = 1, BAM_MAX_HEIGHT_TOP do
chk_pos = vector.offset(pos, 0, py, 0) 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 name = minetest.get_node(chk_pos).name
local dist = vector.distance(soil_pos, chk_pos) local dist = vector.distance(soil_pos, chk_pos)
if dist >= BAM_MAX_HEIGHT_STPCHK then if dist >= BAM_MAX_HEIGHT_STPCHK then
-- stop growing check. -- stop growing check.
if name == "air" then if name == "air" then
local height = math.random(BAM_MAX_HEIGHT_STPCHK, BAM_MAX_HEIGHT_TOP) local height = rand(BAM_MAX_HEIGHT_STPCHK, BAM_MAX_HEIGHT_TOP)
if height == dist then if height == dist then
minetest.set_node(chk_pos, {name = "mcl_bamboo:bamboo_endcap"}) minetest.set_node(chk_pos, {name = "mcl_bamboo:bamboo_endcap"})
end end
end end
break break
end end
mboo = substr(name, strlen(name) - 3, strlen(name))
if name == "air" then if name == "air" then
minetest.set_node(chk_pos, {name = bamboo}) minetest.set_node(chk_pos, {name = node_below})
-- handle growing a second node. -- handle growing a second node.
if grow_amount == 2 then if grow_amount == 2 then
chk_pos = vector.offset(chk_pos, 0, 1, 0) chk_pos = vector.offset(chk_pos, 0, 1, 0)
if minetest.get_node(chk_pos).name == "air" then if minetest.get_node(chk_pos).name == "air" then
minetest.set_node(chk_pos, {name = bamboo}) minetest.set_node(chk_pos, {name = node_below})
end end
end end
break break
elseif name ~= bamboo and force == false then elseif mboo ~= "mboo" and mboo ~= "oo_1" and mboo ~= "oo_2" and mboo ~= "oo_3" then
break break
end end
end end
@ -137,7 +155,7 @@ local function create_nodes()
tiles = {"mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo.png"}, tiles = {"mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo_bottom.png", "mcl_bamboo_bamboo.png"},
drawtype = "nodebox", drawtype = "nodebox",
paramtype = "light", paramtype = "light",
groups = {handy = 1, axey = 1, choppy = 1, flammable = 3}, groups = {handy = 1, swordy = 1, choppy = 1, flammable = 3},
sounds = node_sound, sounds = node_sound,
drop = { drop = {
@ -177,13 +195,6 @@ local function create_nodes()
} }
}, },
--[[
Node Box definitions for alternative styles.
{-0.05, -0.5, 0.285, -0.275, 0.5, 0.06},
{0.25, -0.5, 0.325, 0.025, 0.5, 0.100},
{-0.125, -0.5, 0.125, -0.3125, 0.5, 0.3125},
--]]
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
if pointed_thing.type ~= "node" then if pointed_thing.type ~= "node" then
return itemstack return itemstack
@ -216,7 +227,10 @@ local function create_nodes()
end end
end end
if node.name ~= "mcl_bamboo:bamboo" then 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 if node.name ~= "mcl_flowerpots:flower_pot" then
local found = false local found = false
for i = 1, #bamboo_dirt_nodes do for i = 1, #bamboo_dirt_nodes do
@ -234,8 +248,44 @@ local function create_nodes()
if DEBUG then if DEBUG then
minetest.log("mcl_bamboo::placing bamboo directly.") minetest.log("mcl_bamboo::placing bamboo directly.")
end end
return minetest.item_place(itemstack, placer, pointed_thing, minetest.dir_to_facedir(vector.direction(pointed_thing.above, pointed_thing.under)))
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, end,
on_destruct = function(pos) on_destruct = function(pos)
@ -836,7 +886,7 @@ dofile(minetest.get_modpath(modname) .. "/bambootoo.lua")
--ABMs --ABMs
minetest.register_abm({ minetest.register_abm({
nodenames = {bamboo}, nodenames = {bamboo, bamboo .. "_1", bamboo .. "_2", bamboo .. "_3"},
interval = 40, interval = 40,
chance = 40, chance = 40,
action = function(pos, node) action = function(pos, node)