PyuTestCore.util = { toint = function (float) return tonumber(string.format("%d", float)) end, tableconcat = function (t1, t2) local nt = t1 for k, v in pairs(t2) do nt[k] = v end return nt end } PyuTestCore.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 PyuTestCore.create_explosion = function (pos, range, rm_pos, dmg, creator) if rm_pos then minetest.remove_node(pos) end PyuTestCore.dorange(pos, range, function(p) if minetest.get_node(p).name == "pyutest_core:tnt" then minetest.get_node_timer(p):start(0.2) else minetest.dig_node(p) end end) for _, v in pairs(minetest.get_objects_inside_radius(pos, range)) do if v ~= nil and v ~= creator then if creator ~= nil then v:punch(creator, nil, { damage_groups = {fleshy = dmg} }, nil) else v:set_hp(v:get_hp() - dmg) end end 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 * 3, time = 0.1, minexptime = 0.4, maxexptime = 1.4, minsize = 32, maxsize = 64, collisiondetection = false, texture = "blast.png", minpos = minpos, maxpos = maxpos, }) minetest.sound_play("block_break", { pos = pos, gain = 1.5 }) end