109 lines
2.7 KiB
Lua
109 lines
2.7 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
|
|
--local perlin = math.noise(((x*8)+cx)/100,((z*8)+cz)/100)
|
|
chunk:CreateBlock(cx, 1, cz, { id = 1, state = {} })
|
|
--chunk:CreateBlock(x, 2, z, { id = 1, state = {} })
|
|
end
|
|
end
|
|
end
|
|
if y == 0 then
|
|
for cx = 1, 8 do
|
|
for cy = 1, 8 do
|
|
for cz = 1, 8 do
|
|
--local perlin = math.noise(((x*8)+cx)/100,((z*8)+cz)/100)
|
|
chunk:CreateBlock(cx, cy, cz, { id = 2, state = {} })
|
|
--chunk:CreateBlock(x, 2, z, { id = 1, 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
|
|
--local perlin = math.noise(((x*8)+cx)/100,((z*8)+cz)/100)
|
|
chunk:CreateBlock(cx, cy, cz, { id = -2, state = {} })
|
|
--chunk:CreateBlock(x, 2, z, { id = 1, state = {} })
|
|
end
|
|
end
|
|
end
|
|
|
|
return chunk
|
|
end
|
|
|
|
TerrainGen.CM = ChunkManager
|
|
|
|
return TerrainGen
|