Alright, so this is going to be a little confusing for most people out there. To say the least, I am using the math.noise feature and the PolyDraw module to generate infinite terrain. I recently added a section that should dynamically generate it with less detail the farther it is away, but when I tested the implementation, it failed to work. I know of some bugs unrelated to this that need resolved, but I want it to actually generate before I fix my oversights. Can anyone tell me why it will not run even though nothing is showing up in the output?
local PolyDraw = require(script.PolyDraw)
local SeedOffset = 65536
local ChunkSize = Vector2.new(17, 17)
local TileSize = 32
local First = true
local Chunks = {}
local function GenerateTriangles(Chunk, XOffset, YOffset, NX, NY)
for X = 0, ChunkSize.X-1 do
if X ~= ChunkSize.X-1 then
for Y = 0, ChunkSize.Y-1 do
if Y ~= ChunkSize.Y-1 then
local A, B, C, D = Chunks[Chunk.Name][X .. ":" .. Y], Chunks[Chunk.Name][X + 1 .. ":" .. Y], Chunks[Chunk.Name][X .. ":" .. Y + 1], Chunks[Chunk.Name][X + 1 .. ":" .. Y + 1]
local Tri1 = PolyDraw.Tri.new(Chunk, A, B, C)
local Tri1 = PolyDraw.Tri.new(Chunk, B, C, D)
if NX ~= 0 and NY ~= 0 and First == false then wait() end
end
end
end
end
end
local function GenerateNodes(XOffset, YOffset, NX, NY)
local Chunk = Instance.new("Model", game.Workspace)
Chunk.Name = XOffset .. ":" .. YOffset
local Chunksize = ChunkSize
if NX == -2 or 2 then
Chunksize.X = ((ChunkSize.X - 1)/4)+1
elseif NX == -1 or 1 then
Chunksize.X = ((ChunkSize.X - 1)/2)+1
end
if NX == -2 or 2 then
Chunksize.Y = ((ChunkSize.Y - 1)/4)+1
elseif NX == -1 or 1 then
Chunksize.Y = ((ChunkSize.Y - 1)/2)+1
end
for X = 0, Chunksize.X-1 do
for Y = 0, Chunksize.Y-1 do
local Noise = math.noise((X + (XOffset * (Chunksize.X-1))) / 32 + SeedOffset, (Y + (YOffset * (Chunksize.Y-1))) / 32 + SeedOffset)
local Node = Vector3.new((X + (XOffset * (Chunksize.X-1))) * TileSize, Noise * 350, (Y + (YOffset * (Chunksize.Y-1))) * TileSize)
Chunks[XOffset .. ":" .. YOffset][X .. ":" .. Y] = Node
end
end
GenerateTriangles(Chunk, XOffset, YOffset, NX, NY)
end
game.Players.PlayerAdded:connect(function(Player)
repeat wait() until Player.Character
local function OnDeath()
local Character = Player.Character
coroutine.resume(coroutine.create(function()
while true do
local LoadedChunks = {}
local Chunk = Vector2.new(math.ceil((Character.Torso.Position.X / TileSize + (ChunkSize.X-1))/(ChunkSize.X-1))-2, math.ceil((Character.Torso.Position.Z / TileSize + (ChunkSize.Y-1))/(ChunkSize.Y-1))-2)
print(Player.Name .. ":" .. Chunk.X .. ", " .. Chunk.Y)
for NX = -2, 2 do
for NY = -2, 2 do
Chunks[Chunk.X + NX .. ":" .. Chunk.Y + NY] = {}
GenerateNodes(Chunk.X + NX, Chunk.Y + NY, NX, NY)
LoadedChunks[Chunk.X + NX .. ":" .. Chunk.Y + NY] = true
if First == false then wait() end
end
wait()
end
for i, v in pairs(game.Workspace:GetChildren()) do
if v:IsA("Model") and v:FindFirstChild("Humanoid") == nil then
if LoadedChunks[v.Name] == nil then
v:Destroy()
end
end
wait()
end
First = false
repeat wait() until Chunk ~= Vector2.new(math.ceil((Player.Character.Torso.Position.X / TileSize + (ChunkSize.X-1))/(ChunkSize.X-1))-2, math.ceil((Player.Character.Torso.Position.Z / TileSize + (ChunkSize.Y-1))/(ChunkSize.Y-1))-2)
end
end))
end
OnDeath()
Player.Character.Humanoid.Died:connect(function()
repeat wait() until Player.Character
OnDeath()
end)
end)
The only thing not shown here is the code for the Tri.new function, but I know for a fact that it works the way it should. All I need help with is the code from lines 31 to 41. That should determine how much terrain to load, but no terrain loads ever since I implemented this.
