mapgen_helper/region_functions.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