# Math.noise/Perlin noise/Procedural generation tweaking

My goal is…
1 - sharp mountains
2 - rare mountains

FULL SCRIPT –

``````local grid = 16
local spacing = 1.5
local seed = math.random(1, 999999)
local blocks = {}
local SPAAGRI = spacing*grid
local size = Vector3.new(spacing, spacing,spacing)
local persistence = 0.8 -- Increase persistence for more variation
local octawaves = 1     -- Keep octaves low for simplicity
local lacunarity = 0.2
local downheight = -16
local upperheight = 256
local chunks = Instance.new("Folder")
local res =128 * spacing
local val = 0

chunks.Name = "Chunks"
chunks.Parent = workspace
function SpawnChunk(plr,x, y)
local chunk = Instance.new("Folder")
chunk.Name = x..", "..y
chunk.Parent = chunks
for x1 = 1, grid do
for y1 = 1, grid do
local fixedx = (x*SPAAGRI) + (x1*spacing)
local fixedy = (y*SPAAGRI) + (y1*spacing)
local x2 = fixedx
local y2 = fixedy
local Ampilifier = 32
for i = 1, octawaves do
val  = math.abs(math.noise(fixedx / res, fixedy / res, seed))* (Ampilifier)
y2 *= lacunarity
x2 *= lacunarity

Ampilifier *= (persistence*spacing)
end
math.clamp(val, -1, 1)
val = val ^ 2
local color = nil
local name = nil
if val > 70 then
color = Color3.fromRGB(255, 255, 255) -- White
name = "snow"
elseif val > 20 then
color = Color3.fromRGB(95, 97, 95) -- Gray
name = "stone"
else
color = Color3.fromRGB(42, 86, 62) -- Green
name = "grass"
end
local c = 1 -- c is some constant you use to customise how the noise feels
local treethreshold = 0.71 -- the TreeChance needs to be greater than this to spawn a tree
local freq = 1
local res = 2
local TreeChance = math.noise(fixedx * freq * c / res, fixedy * freq * c / res, seed)
-- water chance is jsut like treechange execpt the block coclor is water
local c = 1 -- c is some constant you use to customise how the noise feels
local waterthreshold = 0.1 -- the TreeChance needs to be greater than this to spawn a tree
local freq = 1
local res = 256
local WaterChance = math.noise(fixedx * freq * c / res, fixedy * freq * c / res, seed)

local height = math.round(val / spacing) * spacing
height = math.clamp(height, downheight * spacing, upperheight * spacing)
local block = Instance.new("Part")
block.Parent =  workspace.Terrain
block.Anchored = true
block.Position = Vector3.new(fixedx,height, fixedy)
block.Size = size

block.Name = name

if WaterChance > waterthreshold and (name == "grass") and (height == 0) then
color = Color3.fromRGB(10, 10, 108)
name = "water"
block.Position = block.Position + Vector3.new(0,-spacing,0)
end
if TreeChance > treethreshold and name == "grass" then
local block = workspace.Tree:Clone()

block.Parent =  workspace.Terrain
block:PivotTo( CFrame.new(fixedx,height, fixedy))

end
block.Color = color

end
end
end
local timesran = 0

timesran +=1
coroutine.wrap(function()
SpawnChunk(nil,a,b)
end)()

end
end
game.ReplicatedStorage.RemoteEvent.OnServerEvent:Connect(SpawnChunk)
``````

Down below are the variables that control the generating and needs tweaking

``````local Ampilifier = 32
local persistence = 0.8
local octawaves = 1
local lacunarity = 0.2
local res = 128
``````
1 Like