Files
PlaneBuilding/scratch/dct2/TownModule
T

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}