forked from Mineclonia/Mineclonia
207 lines
4.5 KiB
Lua
207 lines
4.5 KiB
Lua
local clamp = function(value, min, max)
|
|
assert( min < max )
|
|
if value < min then
|
|
return min
|
|
end
|
|
if value > max then
|
|
return max
|
|
end
|
|
return value
|
|
end
|
|
|
|
assert( clamp(000, -100, 100) == 000 )
|
|
assert( clamp(999, -100, 100) == 100 )
|
|
assert( clamp(999, -999, 999) == 999 )
|
|
assert( clamp(998, 999, 1999) == 999 )
|
|
assert( clamp(999, 999, 1999) == 999 )
|
|
|
|
local clamp_s16 = function(value)
|
|
-- seems minetest hangs on -32768 and 32767
|
|
return clamp(value, -32767, 32766)
|
|
end
|
|
|
|
assert( clamp_s16(000000) == 000000 )
|
|
assert( clamp_s16(000001) == 000001 )
|
|
assert( clamp_s16(000010) == 000010 )
|
|
assert( clamp_s16(000100) == 000100 )
|
|
assert( clamp_s16(001000) == 001000 )
|
|
assert( clamp_s16(010000) == 010000 )
|
|
assert( clamp_s16(100000) == 032766 )
|
|
|
|
assert( clamp_s16(-00000) == -00000 )
|
|
assert( clamp_s16(-00009) == -00009 )
|
|
assert( clamp_s16(-00099) == -00099 )
|
|
assert( clamp_s16(-00999) == -00999 )
|
|
assert( clamp_s16(-09999) == -09999 )
|
|
assert( clamp_s16(-99999) == -32767 )
|
|
|
|
local minetest_find_nodes_in_area = minetest.find_nodes_in_area
|
|
minetest.find_nodes_in_area = function(minp, maxp, ...)
|
|
if
|
|
minp.x >= 32767 or minp.x <= -32768 or
|
|
minp.y >= 32767 or minp.y <= -32768 or
|
|
minp.z >= 32767 or minp.z <= -32768 or
|
|
maxp.x >= 32767 or maxp.x <= -32768 or
|
|
maxp.y >= 32767 or maxp.y <= -32768 or
|
|
maxp.z >= 32767 or maxp.z <= -32768
|
|
then
|
|
minetest.log(
|
|
"warning",
|
|
"find_nodes_in_area() called with coords outside interval (-32768, 32767), clamping arguments: " ..
|
|
"minp { x=" .. minp.x .. ", y=" .. minp.y .. " z=" .. minp.z .. " } " ..
|
|
"maxp { x=" .. maxp.x .. ", y=" .. maxp.y .. " z=" .. maxp.z .. " } "
|
|
)
|
|
return minetest_find_nodes_in_area(
|
|
{ x=clamp_s16(minp.x), y=clamp_s16(minp.y), z=clamp_s16(minp.z) },
|
|
{ x=clamp_s16(maxp.x), y=clamp_s16(maxp.y), z=clamp_s16(maxp.z) },
|
|
...
|
|
)
|
|
else
|
|
return minetest_find_nodes_in_area(
|
|
minp,
|
|
maxp,
|
|
...
|
|
)
|
|
end
|
|
end
|
|
|
|
deep_compare = function(a, b)
|
|
local type_a = type(a)
|
|
local type_b = type(b)
|
|
if type_a ~= type_b then
|
|
return false
|
|
end
|
|
if type_a ~= "table" and type_b ~= "table" then
|
|
return a == b
|
|
end
|
|
for key_a, value_a in pairs(a) do
|
|
local value_b = b[key_a]
|
|
if not deep_compare(value_a, value_b) then
|
|
return false
|
|
end
|
|
end
|
|
for key_b, value_b in pairs(b) do
|
|
local value_a = a[key_b]
|
|
if not deep_compare(value_b, value_a) then
|
|
return false
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
assert(
|
|
deep_compare(
|
|
1,
|
|
1.0
|
|
) == true
|
|
)
|
|
|
|
assert(
|
|
deep_compare(
|
|
true,
|
|
"true"
|
|
) == false
|
|
)
|
|
|
|
assert(
|
|
deep_compare(
|
|
{ a=1, b=-2, c=3.4 },
|
|
{ a=1, b=-2, c=3.4 }
|
|
) == true
|
|
)
|
|
|
|
assert(
|
|
deep_compare(
|
|
{ a={ 1, 2, 3 }, b="foo", c=false },
|
|
{ a={ 1, 2, 3 }, b="foo", c=false }
|
|
) == true
|
|
)
|
|
|
|
assert(
|
|
deep_compare(
|
|
{ a={ 1, 2, 3 }, b="foo", c=false },
|
|
{ a={ 4, 5, 6 }, b="foo", c=false }
|
|
) == false
|
|
)
|
|
|
|
assert(
|
|
deep_compare(
|
|
{ a={ 1, 2, 3 }, b={ c=false } },
|
|
{ a={ 1, 2, 3 }, b={ c=false } }
|
|
) == true
|
|
)
|
|
|
|
assert(
|
|
deep_compare(
|
|
{ a={ 1, 2, 3 }, b={ } },
|
|
{ a={ 1, 2, 3 }, b={ c=false } }
|
|
) == false
|
|
)
|
|
|
|
local test_minetest_find_nodes_in_area_implementation_equivalence = function()
|
|
-- If any assertion in this test function fails, the wrapper
|
|
-- for minetest.find_nodes_in_area() does not behave like the
|
|
-- original function. If you are reading the code because your
|
|
-- server crashed, please inform the Mineclonia developers.
|
|
local fun_1 = minetest_find_nodes_in_area
|
|
local fun_2 = minetest.find_nodes_in_area
|
|
for x = -31000, 31000, 15500 do
|
|
for y = -31000, 31000, 15500 do
|
|
for z = -31000, 31000, 15500 do
|
|
for d = 1, 9, 3 do
|
|
local minp = { x=x, y=y, z=z }
|
|
local maxp = { x=x+d, y=y+d, z=z+d }
|
|
minetest.emerge_area(
|
|
minp,
|
|
maxp,
|
|
function(blockpos, action, calls_remaining)
|
|
local npos_1, nnum_1 = fun_1(
|
|
minp,
|
|
maxp,
|
|
{ "air", "ignore" }
|
|
)
|
|
local npos_2, nnum_2 = fun_2(
|
|
minp,
|
|
maxp,
|
|
{ "air", "ignore" }
|
|
)
|
|
assert(
|
|
deep_compare(
|
|
npos_1,
|
|
npos_2
|
|
) == true
|
|
)
|
|
assert(
|
|
deep_compare(
|
|
nnum_1,
|
|
nnum_2
|
|
) == true
|
|
)
|
|
local ntab_1 = fun_1(
|
|
minp,
|
|
maxp,
|
|
{ "air", "ignore" },
|
|
true
|
|
)
|
|
local ntab_2 = fun_2(
|
|
minp,
|
|
maxp,
|
|
{ "air", "ignore" },
|
|
true
|
|
)
|
|
assert(
|
|
deep_compare(
|
|
ntab_1,
|
|
ntab_2
|
|
) == true
|
|
)
|
|
end
|
|
)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
minetest.after( 0, test_minetest_find_nodes_in_area_implementation_equivalence )
|