120 lines
3.4 KiB
Plaintext
120 lines
3.4 KiB
Plaintext
local function new(name,tab)
|
|
local instance = Instance.new(name)
|
|
for index,item in pairs(tab) do
|
|
instance[index] = item
|
|
end
|
|
return instance
|
|
end
|
|
|
|
local function main(x,y,z,n,parent)
|
|
local function block(cframe,size)
|
|
return new("Part",{
|
|
Material = Enum.Material.Cobblestone,
|
|
Color = Color3.fromRGB(139, 132, 123),
|
|
Anchored = true,
|
|
CFrame = cframe,
|
|
Size = size,
|
|
Transparency = 0,
|
|
Parent = parent
|
|
})
|
|
end
|
|
|
|
local root = Vector3.new(x,y,z)
|
|
local make
|
|
|
|
local function noise(origin)
|
|
return n(origin.X,origin.Y,origin.Z)
|
|
end
|
|
|
|
local function arb(origin)
|
|
return math.noise(origin.X*0.77 + 0.123,origin.Y*0.77 + 0.123,origin.Z*0.77 + 0.123)
|
|
end
|
|
|
|
local function split(origin,size,stop,solid)
|
|
stop = (stop or 1) - 1 -- A counter (which when reaching 0) will force the terrain to stop
|
|
local t = math.round(((arb(origin)+1)/2)*3) -- An arbitrary value from 1-3 seeded by 'origin'
|
|
if arb(origin*7) > 0.5 and size.Magnitude < 128 then return end
|
|
if t == 1 or t == 2 then -- Split, with an option for a gap inbetween
|
|
local dir
|
|
local mag
|
|
local s = 0
|
|
local o = arb(origin) * 0.5 -- the shift for the splits for each sub block
|
|
if arb(origin * 9) < 0 and not solid then -- an arbitrary boolean seeded from origin, should a gap between the blocks be made?
|
|
if size.Magnitude < 256 then -- Make larger gaps smaller
|
|
s = 0.1
|
|
else
|
|
s = 0.06
|
|
end
|
|
end
|
|
if size.X > size.Y then
|
|
if size.X > size.Z then
|
|
-- X
|
|
dir = Vector3.xAxis * size.X
|
|
else
|
|
-- Z
|
|
dir = Vector3.zAxis * size.Z
|
|
end
|
|
else
|
|
if size.Y > size.Z then
|
|
-- Y
|
|
dir = Vector3.yAxis * size.Y
|
|
s = 0
|
|
else
|
|
-- Z
|
|
dir = Vector3.zAxis * size.Z
|
|
end
|
|
end
|
|
make(origin + dir * (0.25 + o * 0.5 + s * 0.5), size - dir * (0.5 + o + s),stop)
|
|
make(origin - dir * (0.25 - o * 0.5 + s * 0.5), size - dir * (0.5 - o + s),stop)
|
|
elseif t == 3 then -- shrink this part
|
|
local size2 = Vector3.new(size.X * 0.8,size.Y,size.Z * 0.8)
|
|
make(origin,size2,stop)
|
|
end
|
|
end
|
|
|
|
function make(origin,size,stop)
|
|
origin = (origin / 32):Floor() * 32
|
|
size = (size / 32):Floor() * 32
|
|
local mag = size.Magnitude
|
|
local offset = (root - origin).Magnitude
|
|
local val = noise(origin)
|
|
local f = size.Magnitude * (1/1024) * 4
|
|
--block(CFrame.new(origin),size)
|
|
val = val/f + 3
|
|
if offset > 2000 * f then return end
|
|
if math.abs(val) < 8 then
|
|
if (size.Magnitude < 64 + offset * val * 0.25) or stop == 0 then
|
|
if val > 3 then
|
|
block(CFrame.new(origin),size)
|
|
elseif val > -2 then
|
|
local block = block(CFrame.new(origin),size)
|
|
block.Color = Color3.new(math.random(1,12)/20 + 0.2,0.2,0.2)
|
|
block.Material = Enum.Material.Brick
|
|
end
|
|
else
|
|
split(origin,size,stop,true)
|
|
end
|
|
end
|
|
--[[if val < 8 and val > -8 then -- value is far enough into solid ground
|
|
if val > 0 then -- positive is support
|
|
if (size.Magnitude < 256 - offset and size.Magnitude > 128 - offset) or stop == 0 then
|
|
block(CFrame.new(origin),size)
|
|
else
|
|
split(origin,size,stop,true)
|
|
end
|
|
else -- negative is building
|
|
if size.Magnitude < 128 - offset + val * 10 or stop == 0 then
|
|
local block = block(CFrame.new(origin),size)
|
|
block.Color = Color3.new(math.random(1,12)/20 + 0.2,0.2,0.2)
|
|
block.Material = Enum.Material.Brick
|
|
else
|
|
split(origin,size,stop)
|
|
end
|
|
end
|
|
end]]
|
|
end
|
|
|
|
make(root,Vector3.new(2048,2048,2048),16)
|
|
end
|
|
|
|
return {main = main} |