Minecraft-like Roblox block game rblx.games/135624152691584
roblox roblox-game rojo
at main 102 lines 2.5 kB view raw
1--!native 2--!optimize 2 3 4local TerrainGen = {} 5 6local ChunkManager = require(game:GetService("ReplicatedStorage"):WaitForChild("Shared").ChunkManager) 7local Chunk = require(game:GetService("ReplicatedStorage"):WaitForChild("Shared").ChunkManager.Chunk) 8 9TerrainGen.ServerChunkCache = {} :: {[typeof("")]: typeof(Chunk.new(0,0,0))} 10 11local function chunkKeyFromCoords(x: number, y: number, z: number): string 12 return `{x},{y},{z}` 13end 14 15function TerrainGen:UnloadAllChunks(): number 16 local count = 0 17 for key in pairs(TerrainGen.ServerChunkCache) do 18 TerrainGen.ServerChunkCache[key] = nil 19 count += 1 20 end 21 return count 22end 23 24local function worldToChunkCoord(v: number): number 25 return math.floor((v + 16) / 32) 26end 27 28function TerrainGen:PreloadNearPlayers(radius: number, yRadius: number?): number 29 local Players = game:GetService("Players") 30 local r = radius or 5 31 local ry = yRadius or 1 32 local loaded = 0 33 for _, player in ipairs(Players:GetPlayers()) do 34 local character = player.Character 35 local root = character and character:FindFirstChild("HumanoidRootPart") 36 if root then 37 local pos = root.Position 38 local cx = worldToChunkCoord(pos.X) 39 local cy = worldToChunkCoord(pos.Y) 40 local cz = worldToChunkCoord(pos.Z) 41 for y = -ry, ry do 42 for x = -r, r do 43 for z = -r, r do 44 TerrainGen:GetChunk(cx + x, cy + y, cz + z) 45 loaded += 1 46 end 47 end 48 end 49 end 50 end 51 return loaded 52end 53 54-- Load a chunk from the DataStore or generate it if not found 55function TerrainGen:GetChunk(x, y, z) 56 local key = chunkKeyFromCoords(x, y, z) 57 if TerrainGen.ServerChunkCache[key] then 58 return TerrainGen.ServerChunkCache[key] 59 end 60 61 -- Generate a new chunk if it doesn't exist 62 local chunk = Chunk.new(x, y, z) 63 if y == 1 then 64 for cx = 1, 8 do 65 for cz = 1, 8 do 66 chunk:CreateBlock(cx, 1, cz, { id = "mc:grass_block", state = {} }) 67 end 68 end 69 end 70 if y == 0 then 71 for cx = 1, 8 do 72 for cy = 1, 8 do 73 for cz = 1, 8 do 74 chunk:CreateBlock(cx, cy, cz, { id = "mc:dirt_block", state = {} }) 75 end 76 end 77 end 78 end 79 80 TerrainGen.ServerChunkCache[key] = chunk 81 return chunk 82end 83 84-- Fake Chunk 85function TerrainGen:GetFakeChunk(x, y, z) 86 87 -- Generate a new chunk if it doesn't exist 88 local chunk = Chunk.new(x, y, z) 89 for cy = 1,8 do 90 for cx = 1, 8 do 91 for cz = 1, 8 do 92 chunk:CreateBlock(cx, cy, cz, { id = "invalid", state = {} }) 93 end 94 end 95 end 96 97 return chunk 98end 99 100TerrainGen.CM = ChunkManager 101 102return TerrainGen