After looking this up in countless places, I've got some base code down, but it simply crashes my Roblox Studio. So obviously it's not working.
After debugging to no avail, I decided to try and find an answer here. However, I did find out that the Noise Generators were fine, but the errors came in the script attempting to generate that noise into workspace.Terrain.
Here's my aim:
Generate Perlin Noise.
Apply octaves to that noise.
Use the resulting noise to generate terrain to workspace.Terrain.
However, that just won't happen.
Here is the numerous scripts attempting to do this:
NoiseGeneratorPerlin:
function noise(x, y, z)
local X = math.floor(x % 255)
local Y = math.floor(y % 255)
local Z = math.floor(z % 255)
x = x - math.floor(x)
y = y - math.floor(y)
z = z - math.floor(z)
local u = fade(x)
local v = fade(y)
local w = fade(z)
A = p[X ]+Y
AA = p[A]+Z
AB = p[A+1]+Z
B = p[X+1]+Y
BA = p[B]+Z
BB = p[B+1]+Z
return lerp(w, lerp(v, lerp(u, grad(p[AA ], x , y , z ),
grad(p[BA ], x-1, y , z )),
lerp(u, grad(p[AB ], x , y-1, z ),
grad(p[BB ], x-1, y-1, z ))),
lerp(v, lerp(u, grad(p[AA+1], x , y , z-1 ),
grad(p[BA+1], x-1, y , z-1 )),
lerp(u, grad(p[AB+1], x , y-1, z-1 ),
grad(p[BB+1], x-1, y-1, z-1 )))
)
end
function fade(t)
return t * t * t * (t * (t * 6 - 15) + 10)
end
function lerp(t,a,b)
return a + t * (b - a)
end
function grad(hash,x,y,z)
local h = hash % 16
local u
local v
if (h<8) then u = x else u = y end
if (h<4) then v = y elseif (h==12 or h==14) then v=x else v=z end
local r
if ((h%2) == 0) then r=u else r=-u end
if ((h%4) == 0) then r=r+v else r=r-v end
return r
end
p = {}
local permutation = {151,160,137,91,90,15,
131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180
}
for i=0,255 do
p[i] = permutation[i+1]
p[256+i] = permutation[i+1]
end
function script.GetNoise.OnInvoke(x,y,z,smoothness)
return noise(x/smoothness,y/smoothness,z/smoothness)
end
NoiseGeneratorPerlinOctaves:
function noise(x,y,z)
return workspace.NoiseGeneratorPerlin.GetNoise:Invoke(x,y,z,25)
end
function fBm(x, y,z,octaves,lacunarity,gain)
amplitude = 1.0
frequency = 1.0
sum = 0.0
for i = 0, octaves do
sum = sum + (amplitude * noise(x * frequency, y * frequency, z * frequency))
amplitude = amplitude * gain
frequency = frequency * lacunarity
end
return sum;
end
function script.GetNoise.OnInvoke(x,y,z,octaves)
return fBm(x,y,z,octaves,2,0.5)
end
and GenLayerTerrain:
function noise(x,y,z)
return workspace.NoiseGeneratorPerlin.GetNoise:Invoke(x,y,z,20)
end
function generateVoxels(mapScale,mapHeight)
local smoothness = math.random(20, 30)
local xo = math.random(1000)
local zo = math.random(1000)
local t = workspace.Terrain
for x = 1, mapScale do
wait()
for z = 1, mapScale do
local height = noise(x+xo, z+zo, 0) --Find out the height
for y = 1, (height*mapHeight)+10 do
local density = noise(x+xo, y, z+zo) --Find out the density
if density*10 > 0 then
t:SetCell(x-(mapScale/2), y-(mapScale/2), z-(mapScale/2), 1, 0, 0) --Sets cell at position x, y, z
end
end
end
end
end
function script.GenerateRandom.OnInvoke(mapScale,mapHeight)
math.randomseed(tick())
generateVoxels(mapScale,mapHeight)
end
function script.GenerateSeed.OnInvoke(mapScale,mapHeight,seed)
math.randomseed(seed)
generateVoxels(mapScale,mapHeight)
end
Other information:
All of the BindableFunctions exist
I was using the Command bar to Invoke the BindableFunctions
I could not find any forms of "while true do" infinite loops.
Thanks for helping!

1 comment
oh hell nah u probably wrote the entirety of math.noise