nodecore-cd2025/mods/nc_api/fx_digparticles.lua

91 lines
2.4 KiB
Lua

-- LUALOCALS < ---------------------------------------------------------
local math, minetest, nodecore, pairs, vector
= math, minetest, nodecore, pairs, vector
local math_ceil, math_random
= math.ceil, math.random
-- LUALOCALS > ---------------------------------------------------------
local getcoord
do
local coords = {}
for x = 0, 12, 4 do
for y = 0, 12, 4 do
coords[#coords + 1] = x .. "," .. y
end
end
local size = #coords
local pos = size + 1
getcoord = function()
if pos > size then
for i = size, 2, -1 do
local j = math_random(1, i)
local x = coords[i]
coords[i] = coords[j]
coords[j] = x
end
pos = 1
end
pos = pos + 1
return coords[pos - 1]
end
end
function nodecore.digparticles(nodedef, partdef)
if partdef.forcetexture then
partdef.texture = partdef.forcetexture
local id = minetest.add_particlespawner(partdef)
return function() minetest.delete_particlespawner(id) end
end
local img = {}
if nodedef.tiles then
for i = 1, 6 do
img[#img + 1] = nodedef.tiles[i > #nodedef.tiles and #nodedef.tiles or i]
end
elseif nodedef.inventory_image then
img[1] = nodedef.inventory_image
end
if #img < 1 then return nodecore.log("warning", "no pummel tile images found!") end
img = nodecore.pickrand(img)
if img.name then img = img.name end
partdef.amount = partdef.amount and math_ceil(partdef.amount / 4) or 4
local t = {}
for _ = 1, 4 do
partdef.texture = img .. "^[resize:16x16^[mask:[combine\\:16x16\\:"
.. getcoord() .. "=nc_api_pummel.png"
t[#t + 1] = minetest.add_particlespawner(partdef)
end
return function()
for _, v in pairs(t) do
minetest.delete_particlespawner(v)
end
end
end
function nodecore.toolbreakparticles(player, wielddef, amount)
local pos = player:get_pos()
if not pos then return end
wielddef = wielddef or minetest.registered_items[player:get_wielded_item():get_name()]
if not wielddef then return end
pos.y = pos.y + player:get_properties().eye_height - 0.1
local look = player:get_look_dir()
pos = vector.add(pos, vector.multiply(look, 0.5))
local look2 = vector.multiply(look, 2)
return nodecore.digparticles(wielddef, {
time = 0.05,
amount = amount,
minpos = pos,
maxpos = pos,
minvel = vector.add(look2, {x = -2, y = -2, z = -2}),
maxvel = vector.add(look2, {x = 2, y = 2, z = 2}),
minacc = {x = 0, y = -8, z = 0},
maxacc = {x = 0, y = -8, z = 0},
minexptime = 0.25,
maxexptime = 1,
minsize = 2,
maxsize = 4
})
end