VoxeLibre/mods/ITEMS/mcl_bamboo/bamboo_base.lua
Michieal ef7fb0d2e3 Cleaned up the code. Fixed side placement of bamboo against bamboo.
Dinked with the random number generator some more.

Condensed some more of the code duplication (WIP).

Added in MCL_Log function.

Finally settled on a decent looking Bamboo top.
2023-01-03 01:38:12 -05:00

369 lines
12 KiB
Lua

---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by michieal.
--- DateTime: 12/29/22 12:33 PM -- Restructure Date
---
-- LOCALS
local modname = minetest.get_current_modname()
local S = minetest.get_translator(modname)
local bamboo = "mcl_bamboo:bamboo"
local bamboo_one = bamboo .. "_1"
local bamboo_two = bamboo .. "_2"
local bamboo_three = bamboo .. "_3"
local node_sound = mcl_sounds.node_sound_wood_defaults()
-- CONSTS
local DOUBLE_DROP_CHANCE = 8
local strlen = string.len
local substr = string.sub
local pr = PseudoRandom((os.time() + 15766) * 12) -- switched from math.random() to PseudoRandom because the random wasn't very random.
local on_rotate
if minetest.get_modpath("screwdriver") then
on_rotate = screwdriver.disallow
end
-- basic bamboo 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, axey = 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},
}
},
collision_box = {
type = "fixed",
fixed = {
{-0.175, -0.5, -0.195, 0.05, 0.5, 0.030},
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.175, -0.5, -0.195, 0.05, 0.5, 0.030},
}
},
on_rotate = on_rotate,
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
local nodename = node.name
-- check the nodename to see if it is one of the bamboo's
local bamboo_node = substr(nodename, 1, strlen(bamboo))
mcl_bamboo.mcl_log("Node placement data:")
mcl_bamboo.mcl_log(dump(pointed_thing))
mcl_bamboo.mcl_log(node.name)
mcl_bamboo.mcl_log("Checking for protected placement of bamboo.")
if mcl_bamboo.is_protected(pos, placer) then
return
end
mcl_bamboo.mcl_log("placement of bamboo is not protected.")
-- 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
mcl_bamboo.mcl_log("attempting placement of bamboo via targeted node's on_rightclick.")
return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack
end
end
if bamboo_node ~= bamboo and nodename ~= "mcl_bamboo:bamboo_endcap" then
-- not bamboo...
if nodename ~= "mcl_flowerpots:flower_pot" then
local found = false
for i = 1, #mcl_bamboo.bamboo_dirt_nodes do
if nodename == mcl_bamboo.bamboo_dirt_nodes[i] then
found = true
break
end
end
if not found then
return
end
end
end
mcl_bamboo.mcl_log("placing bamboo directly.")
local dir = vector.subtract(pointed_thing.under, pointed_thing.above)
local wdir = minetest.dir_to_wallmounted(dir)
local fdir = minetest.dir_to_facedir(dir)
if wdir ~= 1 then
return
end
local place_item = ItemStack(itemstack) -- make a copy so that we don't indirectly mess with the original.
itemstack:set_count(itemstack:get_count() - 1)
if nodename == bamboo then
-- return the missing item, so that we can lower the code
-- complexity and duplication.
itemstack:set_count(itemstack:get_count() + 1)
return minetest.item_place(itemstack, placer, pointed_thing, fdir)
elseif nodename == bamboo_one then
place_item:set_name(bamboo_one)
minetest.item_place(place_item, placer, pointed_thing, fdir)
return itemstack, pointed_thing.under
elseif nodename == bamboo_two then
place_item:set_name(bamboo_two)
minetest.item_place(place_item, placer, pointed_thing, fdir)
return itemstack, pointed_thing.under
elseif nodename == bamboo_three then
place_item:set_name(bamboo_three)
minetest.item_place(place_item, placer, pointed_thing, fdir)
return itemstack, pointed_thing.under
else
local placed_type = pr:next(0, 3) -- randomly choose which one to place.
mcl_bamboo.mcl_log("Place_Bamboo_Shoot--Type: " .. placed_type)
if placed_type == 0 then
place_item = ItemStack(bamboo)
elseif placed_type == 1 then
place_item = ItemStack(bamboo_one)
elseif placed_type == 2 then
place_item = ItemStack(bamboo_two)
elseif placed_type == 3 then
place_item = ItemStack(bamboo_three)
end
minetest.item_place(place_item, placer, pointed_thing, fdir)
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)
local bamboo_node = substr(node_above.name, 1, strlen(bamboo))
local istack = ItemStack(bamboo)
local sound_params = {
pos = new_pos,
gain = 1.0, -- default
max_hear_distance = 10, -- default, uses a Euclidean metric
}
if node_above and (bamboo_node == bamboo and node_above.name ~= "mcl_bamboo:bamboo_endcap") then
minetest.remove_node(new_pos)
minetest.sound_play(node_sound.dug, sound_params, true)
if pr:next(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)
minetest.add_item(new_pos, istack)
if pr:next(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_rooted" --"plantlike"
--bamboo_top.paramtype2 = "meshoptions"
--bamboo_top.param2 = 2
bamboo_top.special_tiles = {{name = "mcl_bamboo_endcap.png"}}
bamboo_top.nodebox = nil
bamboo_top.selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.05, 0.5, 0.5},
}
}
bamboo_top.collision_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.05, 0.5, 0.5},
}
}
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,
}
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,
})
-- Bamboo Part 2 Base nodes.
-- Bamboo Mosaic
local bamboo_mosaic = table.copy(minetest.registered_nodes[bamboo .. "_plank"])
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.description = S("Bamboo Mosaic Plank")
bamboo_mosaic._doc_items_longdesc = S("Bamboo Mosaic Plank")
minetest.register_node("mcl_bamboo:bamboo_mosaic", bamboo_mosaic)
--[[ Bamboo alternative node types. Note that the table.copy's are very important! if you use a common node def and
make changes, even after registering them, the changes overwrite the previous node definitions, and in this case,
you will end up with 4 nodes all being type 3. --]]
local bamboo_one_def = table.copy(bamboo_def)
bamboo_one_def.node_box = {
type = "fixed",
fixed = {
{-0.05, -0.5, 0.285, -0.275, 0.5, 0.06},
}
}
bamboo_one_def.collision_box = {
-- see [Node boxes] for possibilities
type = "fixed",
fixed = {
{-0.05, -0.5, 0.285, -0.275, 0.5, 0.06},
}
}
bamboo_one_def.selection_box = {
type = "fixed",
fixed = {
{-0.05, -0.5, 0.285, -0.275, 0.5, 0.06},
}
}
minetest.register_node(bamboo_one, bamboo_one_def)
local bamboo_two_def = table.copy(bamboo_def)
bamboo_two_def.node_box = {
type = "fixed",
fixed = {
{0.25, -0.5, 0.325, 0.025, 0.5, 0.100},
}
}
bamboo_two_def.collision_box = {
-- see [Node boxes] for possibilities
type = "fixed",
fixed = {
{0.25, -0.5, 0.325, 0.025, 0.5, 0.100},
}
}
bamboo_two_def.selection_box = {
type = "fixed",
fixed = {
{0.25, -0.5, 0.325, 0.025, 0.5, 0.100},
}
}
minetest.register_node(bamboo_two, bamboo_two_def)
local bamboo_three_def = table.copy(bamboo_def)
bamboo_three_def.node_box = {
type = "fixed",
fixed = {
{-0.125, -0.5, 0.125, -0.3125, 0.5, 0.3125},
}
}
bamboo_three_def.collision_box = {
-- see [Node boxes] for possibilities
type = "fixed",
fixed = {
{-0.125, -0.5, 0.125, -0.3125, 0.5, 0.3125},
}
}
bamboo_three_def.selection_box = {
type = "fixed",
fixed = {
{-0.125, -0.5, 0.125, -0.3125, 0.5, 0.3125},
}
}
minetest.register_node(bamboo_three, bamboo_three_def)