Files
PlaneBuilding/scripts/modules/IslandTerrain.lua
T

176 lines
5.6 KiB
Lua

params = {}
params.cs = 512
params.cliff = 4
params.offset = Vector3.new(0,-300,0)
params.thresh = 0.18
params.voxels = false
local p = params
exclude = {}
chunks = {}
function part(x,y,z,mat,s)
local stone = Instance.new("Part")
stone.Parent = game.Workspace.Generation
stone.Transparency = 0
stone.Material = Enum.Material.Slate
stone.Position = Vector3.new(x,y,z)*params.s + p.offset
stone.Size = Vector3.new(p.s,p.s,p.s)
if s then stone.Size = s end
stone.Anchored = true
local grass = stone:Clone()
grass.CanCollide = true
grass.Transparency = 0
grass.Material = Enum.Material.Grass
grass.Color = Color3.fromRGB(255, 255, 255)
grass.Parent = stone
grass.Size = Vector3.new(stone.Size.X+1,20,stone.Size.Z+1)
grass.Position = stone.Position + Vector3.new(0,stone.Size.Y/2 - grass.Size.Y/2 + 1,0)
return stone
end
local mod = 1
local n = function(x,y,z,scale)
return math.noise(x*scale,y*scale,z*scale)
end
local function mulv(a,b) return Vector3.new(a.x*b.x,a.y*b.y,a.z*b.z) end
local structures = _G.Storage.Structures:GetChildren()
local foliage = _G.Storage.Foliage:GetChildren()
function islandChunk(ox,oz) -- i had to think there lol
local chunk = chunks[tostring(ox)..","..tostring(oz)]
local cn = n(ox,.5,oz,0.05)
if cn < 0.3 then return end
local offset = math.abs(n(ox,124.5432,oz,0.015)*2)
ox = ox + 20
for oy = 0,3 do
mod = math.clamp(math.pow(Vector2.new(ox,oz).Magnitude/6,2),0,1)
local height = {}
p.thresh = 0.5
p.s = 10
local lx = 1/8
local ly = 1/8
local lz = 1/8
local values = {}
local xi = 0
for x=ox,ox+1,lx do
xi = xi + 1
table.insert(values,{})
local yi = 0
for y=oy,oy+1,ly do
yi = yi + 1
local hshift = math.abs((y/2)-1)/4
table.insert(values[xi],{})
local zi = 0
for z=oz,oz+1,lz do
zi = zi + 1
local v = (n(x,y,z,0.05))*((n(x,y,z,0.1)+n(x,y,z,1)+n(x,y,z,0.5)))-0.2-hshift-math.abs(n(x,0.123,y,0.1))
table.insert(values[xi][yi],v)
if xi > 1 and yi > 1 and zi > 1 then
local temp = values[xi]
local a = temp[yi][zi-1] > 0
local b = temp[yi-1][zi] > 0
local c = values[xi-1][yi][zi] > 0
local d = v > 0
if ((not(a and b and c) and d) or ((a or b or c) and not d)) and math.random(1,4) == 1 then
local part = _G.Storage.Stone:Clone()
part.Position = Vector3.new(x,y+offset,z)*params.cs
part.Size = Vector3.new(lx,ly,lz)*params.cs
part.Parent = chunk.folder
local m = Vector3.new(math.random(1,16)/4,math.random(1,16)/4,math.random(1,16)/4)+Vector3.new(1.2,1.2,1.2)
part.Size = mulv(part.Size,m)
local grass = _G.Storage.Grass:Clone()
grass.Size = Vector3.new(part.Size.X+1,params.cs/math.random(5,30),part.Size.Z+1)
grass.CFrame = part.CFrame + Vector3.new(0,part.Size.Y/2,0)
grass.Parent = chunk.folder
end
end
end
end
end
end
end
function chunk(ox,oz)
math.randomseed(ox+oz)
local chunk = {}
chunk.folder = Instance.new("Folder")
chunk.folder.Name = tostring(ox)..", "..tostring(oz)
chunk.folder.Parent = game.Workspace.Generation
chunk.position = Vector3.new(ox,0,oz) -- ? my hands are cold again
chunk.needed = true
if ox%2==0 and oz%2==0 then
for i=18,2,-4 do
local water = _G.Storage.Water:Clone()
water.Size = Vector3.new(params.cs,2,params.cs)*2
water.Position = Vector3.new(ox,0,oz)*params.cs + Vector3.new(0,i+-41.5,0)
water.Parent = chunk.folder
end
end
chunks[tostring(ox)..","..tostring(oz)] = chunk -- again abusing Lua's hashtables
--[[islandChunk(ox,oz) -- oh lord have mercy on my clockspeed
local cn = n(ox,.5,oz,0.05)
if cn < 0.4 then return end
mod = math.clamp(math.pow(Vector2.new(ox,oz).Magnitude/6,2),0,1)
local height = {}
local lx = 1/8
local ly = 1/8
local lz = 1/8
local values = {}
local xi = 0
for x=ox-lx,ox+1,lx do
xi = xi + 1
table.insert(values,{})
local yi = 1
local y=-0.05
local hshift = y/2
table.insert(values[xi],{})
local zi = 0
for z=oz-lz,oz+1,lz do
zi = zi + 1
local v = (n(x,y,z,1)+n(x,y,z,1))*n(x,y,z,0.05)-0.5-hshift
table.insert(values[xi][yi],v)
if xi > 1 and zi > 1 then
if v > 0 then
local r = CFrame.new()--CFrame.Angles(0,math.random(-10,10)/300,0)
local part = _G.Storage.Sand:Clone()
part.CFrame = CFrame.new(Vector3.new(x,y,z)*params.cs)*r
part.Size = Vector3.new(lx,ly*0.2,lz)*params.cs
part.Parent = chunk.folder
local grass = _G.Storage.Grass:Clone()
grass.CFrame = CFrame.new(Vector3.new(x,y,z)*params.cs)*r
grass.Size = Vector3.new(lx,ly*0.2,lz)*params.cs
grass.Parent = chunk.folder
local m = Vector3.new(math.random(1,10),math.random(1,10)/10,math.random(1,10))/5+Vector3.new(1,1,1)
part.Size = mulv(part.Size,m)
grass.Size = mulv(grass.Size,(m+Vector3.new(0,0.3,0))*0.9)
m = Vector3.new(math.random(1,4)/4+1,1,math.random(1,4)/4+1)
part.Size = mulv(part.Size,m)
local random = Random.new(60391)
for sx=x,x+lx,0.125 do
for sz=z,z+lz,0.125 do
local fv = n(x+1/sx,0,z+1/sz,4.123)
if fv > 0.3 then
local sub = foliage[random:NextInteger(1,#foliage)]:Clone()
sub:SetPrimaryPartCFrame(CFrame.new(Vector3.new(sx,y,sz)*params.cs)*CFrame.Angles(0,math.random(0,3)*math.pi*0.5,0))
sub.Parent = chunk.folder
sub:ScaleTo(math.random(1,10)/10 + 1)
end
if fv < -0.4 then
local sub = structures[random:NextInteger(1,#structures)]:Clone()
sub:SetPrimaryPartCFrame(CFrame.new(Vector3.new(sx-0.125,y+0.015+0.00390625,sz)*params.cs)*CFrame.Angles(0,math.random(0,3)*math.pi*0.5,0))
sub.Parent = chunk.folder
end
end
end
end
end
end
end]]
end
-- ok now more!
return getfenv()