forked from Mineclonia/Mineclonia
99 lines
2.8 KiB
Lua
99 lines
2.8 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
|
||
|
|
||
|
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.
|
||
|
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 }
|
||
|
local npos_1, nnum_1 = minetest_find_nodes_in_area(
|
||
|
minp,
|
||
|
maxp,
|
||
|
{ "air", "ignore" }
|
||
|
)
|
||
|
local npos_2, nnum_2 = minetest.find_nodes_in_area(
|
||
|
minp,
|
||
|
maxp,
|
||
|
{ "air", "ignore" }
|
||
|
)
|
||
|
assert(#npos_1 == #npos_2)
|
||
|
assert(nnum_1["air"] == nnum_2["air"])
|
||
|
assert(nnum_1["ignore"] == nnum_2["ignore"])
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
minetest.after( 0, test_minetest_find_nodes_in_area_implementation_equivalence )
|