many worldgen mods and gonna try technic now
This commit is contained in:
1 parent
bac6ac94a3
commit
548749cb1a
4811 files changed
+163271
-1
No files matched your search
@@ -0,0 +1,79 @@
|
||||
winuserleafdecay = {}
|
||||
|
||||
local function winleafdecay_after_destruct(pos, oldnode, def)
|
||||
for _, v in pairs(minetest.find_nodes_in_area(vector.subtract(pos, def.radius),
|
||||
vector.add(pos, def.radius), def.leaves)) do
|
||||
local node = minetest.get_node(v)
|
||||
local timer = minetest.get_node_timer(v)
|
||||
if node.param2 ~= 3 and not timer:is_started() then
|
||||
timer:start(math.random(20, 120) / 10)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local movement_gravity = tonumber(
|
||||
minetest.settings:get("movement_gravity")) or 9.81
|
||||
|
||||
local function winleafdecay_on_timer(pos, def)
|
||||
if minetest.find_node_near(pos, def.radius, def.trunks) then
|
||||
return false
|
||||
end
|
||||
|
||||
local node = minetest.get_node(pos)
|
||||
local drops = minetest.get_node_drops(node.name)
|
||||
for _, item in ipairs(drops) do
|
||||
local is_leaf
|
||||
for _, v in pairs(def.leaves) do
|
||||
if v == item then
|
||||
is_leaf = true
|
||||
end
|
||||
end
|
||||
if minetest.get_item_group(item, "winleafdecay_drop") ~= 0 or
|
||||
not is_leaf then
|
||||
minetest.add_item({
|
||||
x = pos.x - 0.5 + math.random(),
|
||||
y = pos.y - 0.5 + math.random(),
|
||||
z = pos.z - 0.5 + math.random(),
|
||||
}, item)
|
||||
end
|
||||
end
|
||||
|
||||
minetest.remove_node(pos)
|
||||
minetest.check_for_falling(pos)
|
||||
|
||||
-- spawn a few particles for the removed node
|
||||
minetest.add_particlespawner({
|
||||
amount = 8,
|
||||
time = 0.001,
|
||||
minpos = vector.subtract(pos, {x=0.5, y=0.5, z=0.5}),
|
||||
maxpos = vector.add(pos, {x=0.5, y=0.5, z=0.5}),
|
||||
minvel = vector.new(-0.5, -1, -0.5),
|
||||
maxvel = vector.new(0.5, 0, 0.5),
|
||||
minacc = vector.new(0, -movement_gravity, 0),
|
||||
maxacc = vector.new(0, -movement_gravity, 0),
|
||||
minsize = 0,
|
||||
maxsize = 0,
|
||||
node = node,
|
||||
})
|
||||
end
|
||||
|
||||
function winuserleafdecay.register_winleafdecay(def)
|
||||
assert(def.leaves)
|
||||
assert(def.trunks)
|
||||
assert(def.radius)
|
||||
for _, v in pairs(def.trunks) do
|
||||
minetest.override_item(v, {
|
||||
after_destruct = function(pos, oldnode)
|
||||
winleafdecay_after_destruct(pos, oldnode, def)
|
||||
end,
|
||||
})
|
||||
end
|
||||
for _, v in pairs(def.leaves) do
|
||||
minetest.override_item(v, {
|
||||
on_timer = function(pos)
|
||||
winleafdecay_on_timer(pos, def)
|
||||
end,
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
Reference in new issue
Block a user