Minecraft-like Roblox block game
rblx.games/135624152691584
roblox
roblox-game
rojo
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