nodecore-cd2025/mods/nc_tree/cultivation.lua
Aaron Suen 5a115bdaa8 Particle effects for growing trees.
Intensity of particle effect indicates rate of growth.
This should help players get feedback that their trees are,
indeed, actually incubating.
2019-04-06 21:02:58 -04:00

130 lines
3.5 KiB
Lua

-- LUALOCALS < ---------------------------------------------------------
local math, minetest, nodecore
= math, minetest, nodecore
local math_random, math_sqrt
= math.random, math.sqrt
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
local ldname = "nc_terrain:dirt_loose"
local epname = modname .. ":eggcorn_planted"
minetest.register_node(modname .. ":eggcorn", {
description = "Eggcorn",
drawtype = "plantlike",
paramtype = "light",
visual_scale = 0.5,
wield_scale = {x = 0.75, y = 0.75, z = 1.5},
collision_box = nodecore.fixedbox(-3/16, -0.5, -3/16, 3/16, 0, 3/16),
selection_box = nodecore.fixedbox(-3/16, -0.5, -3/16, 3/16, 0, 3/16),
inventory_image = "[combine:24x24:4,4=" .. modname .. "_eggcorn.png",
tiles = { modname .. "_eggcorn.png" },
groups = {
snappy = 1,
flammable = 3,
attached_node = 1,
},
node_placement_prediction = "",
place_as_item = true,
sounds = nodecore.sounds("nc_tree_corny"),
stack_rightclick = function(pos, node, whom, stack)
if nodecore.stack_get(pos):get_count() ~= 1 then return end
if stack:get_name() ~= ldname then return end
minetest.set_node(pos, {name = epname})
nodecore.node_sound(pos, "place")
if nodecore.player_stat_add then
nodecore.player_stat_add(1, whom, "craft", "eggcorn planting")
end
minetest.log((whom and whom:get_player_name() or "unknown")
.. " planted an eggcorn at " .. minetest.pos_to_string(pos))
stack:set_count(stack:get_count() - 1)
return stack
end
})
nodecore.register_limited_abm({
interval = 1,
chance = 1,
nodenames = {modname .. ":eggcorn"},
action = function(pos)
minetest.remove_node(pos)
return nodecore.place_stack(pos, modname .. ":eggcorn")
end
})
nodecore.register_leaf_drops(function(pos, node, list)
list[#list + 1] = {
name = "air",
item = modname .. ":eggcorn",
prob = 0.05 * (node.param2 + 1)}
end)
minetest.register_node(epname, nodecore.underride({
drop = ldname,
description = "Loose Dirt...?"
},
minetest.registered_items[ldname] or {}))
nodecore.register_limited_abm({
label = "EggCorn Growing",
nodenames = {epname},
interval = 10,
chance = 1,
action = function(pos, node)
local meta = minetest.get_meta(pos)
local d = 0
local w = 1
nodecore.scan_flood(pos, 3, function(p)
local nn = minetest.get_node(p).name
local def = minetest.registered_items[nn] or {}
if not def.groups then
return false
end
if def.groups.soil then
d = d + def.groups.soil
w = w + 0.2
elseif def.groups.water then
w = w + def.groups.water
return false
else
return false
end
end)
local rate = math_sqrt(d * w)
local zero = {x = 0, y = 0, z = 0}
nodecore.digparticles(minetest.registered_items[modname .. ":leaves"],
{
amount = rate,
time = 10,
minpos = {
x = pos.x - 0.3,
y = pos.y + 33/64,
z = pos.z - 0.3
},
maxpos = {
x = pos.x + 0.3,
y = pos.y + 33/64,
z= pos.z + 0.3
},
minvel = zero,
maxvel = zero,
minexptime = 0.1,
maxexptime = 0.5,
minsize = 1,
maxsize = 3,
})
local g = (meta:get_float("growth") or 0) + rate * math_random()
if g >= 5000 then
meta:from_table({})
local place = {x = pos.x - 2, y = pos.y, z = pos.z - 2}
return minetest.place_schematic(place, nodecore.tree_schematic,
"random", {}, false)
end
meta:set_float("growth", g)
end
})