Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Why is this script generating "dead spots" in terrain?

Asked by 2 years ago

Alright, so I was using a Perlin noise terrain script which I got off of the devforum, but for some reason it generates blank areas with no terrain, along the inner corner of an "L" shaped generation. It doesn't clear up whenever you get near, and I haven't been able to figure out what's wrong. Is it something wrong with my settings or the script itself?


local Players = game:GetService("Players") ------------------------------------------------------------------------------------------------------------------------------------------------ local BASE_HEIGHT = 10 -- The main height factor for the terrain. local CHUNK_SCALE = 3 -- The grid scale for terrain generation. Should be kept relatively low if used in real-time. local RENDER_DISTANCE = 500 / 4 -- The length/width of chunks in voxels that should be around the player at all times local X_SCALE = 150 / 4 -- How much we should strech the X scale of the generation noise local Z_SCALE = 150 / 4 -- How much we should strech the Z scale of the generation noise local GENERATION_SEED = math.random() -- Seed for determining the main height map of the terrain. ------------------------------------------------------------------------------------------------------------------------------------------------ local chunks = {} local function mountLayer(x, heightY, z, material) local genstruc = math.random(1,100000) local beginY = -BASE_HEIGHT local endY = heightY local cframe = CFrame.new(x * 4 + 2, (beginY + endY) * 4 / 2, z * 4 + 2) local size = Vector3.new(4, (endY - beginY) * 4, 4) workspace.Terrain:FillBlock(cframe,size,material) end local function chunkExists(chunkX, chunkZ) if not chunks[chunkX] then chunks[chunkX] = {} end return chunks[chunkX][chunkZ] end function makeChunk(chunkX, chunkZ) local rootPosition = Vector3.new(chunkX * CHUNK_SCALE, 0, chunkZ * CHUNK_SCALE) chunks[chunkX][chunkZ] = true -- Acknowledge the chunk's existance. for x = 0, CHUNK_SCALE - 1 do for z = 0, CHUNK_SCALE - 1 do local cx = (chunkX * CHUNK_SCALE) + x local cz = (chunkZ * CHUNK_SCALE) + z local noise = math.noise(GENERATION_SEED, cx / X_SCALE, cz / Z_SCALE) local cy = noise * BASE_HEIGHT mountLayer(cx, cy, cz, Enum.Material.Ice) end end end function checkSurroundings(location) local chunkX, chunkZ = math.floor(location.X / 3 / CHUNK_SCALE), math.floor(location.Z / 3 / CHUNK_SCALE) local range = math.max(1, RENDER_DISTANCE / CHUNK_SCALE) for x = -range, range do for z = -range, range do local cx, cz = chunkX + x local cz = chunkZ + z if not chunkExists(cx, cz) then makeChunk(cx, cz) end end end end while true do for _, player in pairs(Players:GetPlayers()) do if player.Character then local humanoidRootPart = player.Character:FindFirstChild("HumanoidRootPart") if humanoidRootPart then checkSurroundings(humanoidRootPart.Position) end end end wait(1) end

I've tried changing render distance and chunk scale, but I don't really understand most of the math in the generation or how it's scripted. Somewhat of a noob to scripting, but trying to figure things out. Is this generator flawed? and if so, where can I find and or script a better one? Thanks.

Answer this question