2024-10-02 20:28:41 -06:00

172 lines
3.9 KiB
Lua

PyuTest.util = {
tablecopy = function(t)
if t == nil then return nil end
local t2 = {}
for k,v in pairs(t) do
t2[k] = v
end
return t2
end,
tableconcat = function (t1, t2)
local nt = PyuTest.util.tablecopy(t1)
for k, v in pairs(t2) do
nt[k] = v
end
return nt
end,
tableconcat2 = function(t1, t2)
local nt = PyuTest.util.tablecopy(t1)
for i = 1, #t2 do
nt[#nt+i] = t2[i]
end
return nt
end,
}
PyuTest.dorange = function(origin, range, action)
for dx = -range, range do
for dz = -range, range do
for dy = -range, range do
action(vector.new(origin.x + dx, origin.y + dy, origin.z + dz))
end
end
end
end
PyuTest.get_neighbours = function(pos)
return {
vector.new(pos.x + 1, pos.y, pos.z),
vector.new(pos.x - 1, pos.y, pos.z),
vector.new(pos.x + 1, pos.y + 1, pos.z),
vector.new(pos.x + 1, pos.y - 1, pos.z),
vector.new(pos.x - 1, pos.y - 1, pos.z),
vector.new(pos.x - 1, pos.y + 1, pos.z),
vector.new(pos.x, pos.y, pos.z + 1),
vector.new(pos.x, pos.y, pos.z - 1),
vector.new(pos.x, pos.y + 1, pos.z + 1),
vector.new(pos.x, pos.y - 1, pos.z + 1),
vector.new(pos.x, pos.y + 1, pos.z - 1),
vector.new(pos.x, pos.y - 1, pos.z - 1),
vector.new(pos.x, pos.y + 1, pos.z),
vector.new(pos.x, pos.y - 1, pos.z),
}
end
PyuTest.create_explosion = function (pos, range, rm_pos, dmg)
if rm_pos then
minetest.remove_node(pos)
end
PyuTest.dorange(pos, range, function(p)
if minetest.get_node(p).name == "pyutest_blocks:tnt" then
minetest.after(0.8, function()
minetest.remove_node(p)
PyuTest.create_explosion(p, range, rm_pos, dmg)
end)
else
minetest.dig_node(p)
end
end)
for _, v in pairs(minetest.get_objects_inside_radius(pos, range)) do
v:punch(v, nil, {
damage_groups = {fleshy = dmg}
}, nil)
end
local r = range
local minpos = {x = pos.x - r, y = pos.y - r, z = pos.z - r}
local maxpos = {x = pos.x + r, y = pos.y + r, z = pos.z + r}
minetest.add_particlespawner({
amount = range * 8,
time = 0.4,
minexptime = 0.4,
maxexptime = 1.4,
minsize = 16,
maxsize = 32,
vertical = false,
glow = 8,
collisiondetection = false,
texture = "pyutest-blast.png",
minpos = minpos,
maxpos = maxpos,
minvel = vector.new(-1, -1, 1),
maxvel = vector.new(1, 1, 1),
})
minetest.add_particlespawner({
amount = range * 18,
time = 0.4,
minexptime = 0.4,
maxexptime = 1.4,
minsize = 1,
maxsize = 2,
vertical = false,
glow = 4,
collisiondetection = false,
texture = "pyutest-blast2.png",
minpos = minpos,
maxpos = maxpos,
minvel = vector.new(-6, -6, -6),
maxvel = vector.new( 6, 6, 6),
})
minetest.add_particlespawner({
amount = range * 18,
time = 0.4,
minexptime = 0.4,
maxexptime = 1.4,
minsize = 1,
maxsize = 2,
vertical = false,
glow = 4,
collisiondetection = false,
texture = "pyutest-blast3.png",
minpos = minpos,
maxpos = maxpos,
minvel = vector.new(-6, -6, -6),
maxvel = vector.new( 6, 6, 6),
})
minetest.sound_play("block_break", {
pos = pos,
gain = 2.5
})
end
PyuTest.tool_caps = function(options)
local default_uses = 100
local groupcaps = {}
for k, v in pairs(options.groupcaps or {}) do
groupcaps[k] = {
maxlevel = v.maxlevel or options.maxlevel,
times = v.times or {
[PyuTest.BLOCK_FAST] = options.time or 3,
[PyuTest.BLOCK_NORMAL] = options.time or 3,
[PyuTest.BLOCK_SLOW] = options.time or 3
},
uses = v.uses or options.uses or default_uses
}
end
return {
groupcaps = groupcaps,
punch_attack_uses = options.attack_uses,
damage_groups = options.damage_groups or {fleshy=3},
full_punch_interval = options.full_punch_interval
}
end