79 lines
3.8 KiB
Lua
79 lines
3.8 KiB
Lua
local mapgen_chunksize = tonumber(minetest.get_mapgen_setting("chunksize"))
|
|
|
|
-- For getting large regions that don't cross mapgen block boundaries
|
|
-- For some reason, map chunks generate with -32, -32, -32 as the "origin" minp. To make the large-scale grid align with map chunks it needs to be offset like this.
|
|
mapgen_helper.get_region_minp_xz = function(pos_xz, mapblocks)
|
|
local region_size = mapblocks * mapgen_chunksize * 16
|
|
return {x = math.floor((pos.x+32) / region_size) * region_size - 32, y = 0, z = math.floor((pos.z+32) / region_size) * region_size - 32}
|
|
end
|
|
|
|
-- Given a position and a region scale, returns the minp corners of the four regions that the player is closest to.
|
|
-- For example, if we have a region scale of 6 and the parameter position is at "*", the four points marked "R" would be returned.
|
|
|
|
-- |-----|-----|-----| |-----|-----|-----| |-----|-----|-----|
|
|
-- | | | | | | | | | | | |
|
|
-- | | | | | | | | | | | |
|
|
-- | | | | | | | | | | | |
|
|
-- | | | | | | | | | | | |
|
|
-- | | | | | | | | | | | |
|
|
-- |-----|-----|-----| |-----|-----|-----| |-----R-----R-----|
|
|
-- | | | | | | | | | | | |
|
|
-- | | | | | | | | | | *| |
|
|
-- | | | | | | | | | | | |
|
|
-- | | * | | | | *| | | | | |
|
|
-- | | | | | | | | | | | |
|
|
-- R-----R-----|-----| |-----R-----R-----| |-----R-----R-----|
|
|
-- | | | | | | | | | | | |
|
|
-- | | | | | | | | | | | |
|
|
-- | | | | | | | | | | | |
|
|
-- | | | | | | | | | | | |
|
|
-- | | | | | | | | | | | |
|
|
-- R-----R-----|-----| |-----R-----R-----| |-----|-----|-----|
|
|
|
|
-- In this way you can be sure you aren't near an area you haven't tested.
|
|
|
|
mapgen_helper.get_nearest_regions = function(pos_xz, gridscale)
|
|
local half_scale = gridscale / 2
|
|
local grid_cell = {x = math.floor(pos_xz.x / gridscale) * gridscale, z = math.floor(pos_xz.z / gridscale) * gridscale}
|
|
local pos_internal = {x = pos_xz.x % gridscale, z = pos_xz.z % gridscale}
|
|
local result = {grid_cell}
|
|
local shift_x = gridscale
|
|
local shift_z = gridscale
|
|
if (pos_internal.x < half_scale) then
|
|
shift_x = -gridscale
|
|
end
|
|
if (pos_internal.z < half_scale) then
|
|
shift_z = -gridscale
|
|
end
|
|
|
|
table.insert(result, {x = grid_cell.x + shift_x, z = grid_cell.z + shift_z})
|
|
table.insert(result, {x = grid_cell.x + shift_x, z = grid_cell.z})
|
|
table.insert(result, {x = grid_cell.x, z = grid_cell.z + shift_z})
|
|
|
|
return result
|
|
end
|
|
|
|
|
|
-- |---|---|---|
|
|
-- | | | |
|
|
-- | | | |
|
|
-- R---R---R---|
|
|
-- | | | |
|
|
-- | | *| |
|
|
-- R---R---R---|
|
|
-- | | | |
|
|
-- | | | |
|
|
-- R---R---R---|
|
|
|
|
mapgen_helper.get_adjacent_regions = function(pos_xz, gridscale)
|
|
local grid_cell = {x = math.floor(pos_xz.x / gridscale) * gridscale, z = math.floor(pos_xz.z / gridscale) * gridscale}
|
|
local result = {grid_cell}
|
|
table.insert(result, {x = grid_cell.x + gridscale, z = grid_cell.y + gridscale})
|
|
table.insert(result, {x = grid_cell.x + gridscale, z = grid_cell.y})
|
|
table.insert(result, {x = grid_cell.x, z = grid_cell.y + gridscale})
|
|
table.insert(result, {x = grid_cell.x - gridscale, z = grid_cell.y - gridscale})
|
|
table.insert(result, {x = grid_cell.x - gridscale, z = grid_cell.y})
|
|
table.insert(result, {x = grid_cell.x, z = grid_cell.y - gridscale})
|
|
return result
|
|
end
|