Files
block-game/ServerScriptService/Actor/ServerChunkManager/TerrainGen/init.lua
2026-01-09 17:02:35 +02:00

103 lines
2.4 KiB
Lua

--!native
--!optimize 2
local TerrainGen = {}
local ChunkManager = require(game:GetService("ReplicatedStorage"):WaitForChild("Shared").ChunkManager)
local Chunk = require(game:GetService("ReplicatedStorage"):WaitForChild("Shared").ChunkManager.Chunk)
TerrainGen.ServerChunkCache = {} :: {[typeof("")]: typeof(Chunk.new(0,0,0))}
local function chunkKeyFromCoords(x: number, y: number, z: number): string
return `{x},{y},{z}`
end
function TerrainGen:UnloadAllChunks(): number
local count = 0
for key in pairs(TerrainGen.ServerChunkCache) do
TerrainGen.ServerChunkCache[key] = nil
count += 1
end
return count
end
local function worldToChunkCoord(v: number): number
return math.floor((v + 16) / 32)
end
function TerrainGen:PreloadNearPlayers(radius: number, yRadius: number?): number
local Players = game:GetService("Players")
local r = radius or 5
local ry = yRadius or 1
local loaded = 0
for _, player in ipairs(Players:GetPlayers()) do
local character = player.Character
local root = character and character:FindFirstChild("HumanoidRootPart")
if root then
local pos = root.Position
local cx = worldToChunkCoord(pos.X)
local cy = worldToChunkCoord(pos.Y)
local cz = worldToChunkCoord(pos.Z)
for y = -ry, ry do
for x = -r, r do
for z = -r, r do
TerrainGen:GetChunk(cx + x, cy + y, cz + z)
loaded += 1
end
end
end
end
end
return loaded
end
-- Load a chunk from the DataStore or generate it if not found
function TerrainGen:GetChunk(x, y, z)
local key = chunkKeyFromCoords(x, y, z)
if TerrainGen.ServerChunkCache[key] then
return TerrainGen.ServerChunkCache[key]
end
-- Generate a new chunk if it doesn't exist
local chunk = Chunk.new(x, y, z)
if y == 1 then
for cx = 1, 8 do
for cz = 1, 8 do
chunk:CreateBlock(cx, 1, cz, { id = "mc:grass_block", state = {} })
end
end
end
if y == 0 then
for cx = 1, 8 do
for cy = 1, 8 do
for cz = 1, 8 do
chunk:CreateBlock(cx, cy, cz, { id = "mc:dirt_block", state = {} })
end
end
end
end
TerrainGen.ServerChunkCache[key] = chunk
return chunk
end
-- Fake Chunk
function TerrainGen:GetFakeChunk(x, y, z)
-- Generate a new chunk if it doesn't exist
local chunk = Chunk.new(x, y, z)
for cy = 1,8 do
for cx = 1, 8 do
for cz = 1, 8 do
chunk:CreateBlock(cx, cy, cz, { id = "invalid", state = {} })
end
end
end
return chunk
end
TerrainGen.CM = ChunkManager
return TerrainGen