Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Stone not generating on Y Axis?

Asked by
gunter5 17
4 years ago

I'm attempting to create a grid that generates itself. Could someone point out to me why my stone is not only spawning in the wrong area, but not creating new layers on my Y axis?

The goal is to have bedrock spawn first, layout a 'sheet' for the base of the world and then have the rest of the terrain generate on top. The stone IS spawning, but its spawning inside of the bedrock layer and does not attempt to scale up on the Y axis.

Server Script

local Blocks = require(game:GetService("ServerScriptService"):WaitForChild("Modules"):WaitForChild("BlockStatistics"))
local worldwidth = 50 -- map size from border to border in blocks
local worldheight = 8 --[[map height from bedrock]] -127 +127 --This is the depth below sea level. Leave untouched for the vanilla experience.

function PrepareGrid()
    local COrigin = Vector3.new(-(worldwidth/2),-worldheight, -(worldwidth/2))

    for GridLayer = 0,worldheight,1 do

        -- [Bedrock Generation]
        if GridLayer <= 0 then
            for GenXBedrock = 1,worldwidth,1 do
                wait()
                local Bedrock = Blocks.Bedrock():Clone()
                Bedrock.Position = COrigin --laying bottom layer for Bedrock
                Bedrock.Position = Bedrock.Position + Vector3.new((GenXBedrock*Bedrock.Size.X),0,0)
                Bedrock.Parent = workspace
                for GenZBedrock = 1,worldwidth,1 do
                    local BedrockZ = Bedrock:Clone()
                    BedrockZ.Position = Bedrock.Position + Vector3.new(0,0,(GenZBedrock*BedrockZ.Size.Z))
                    BedrockZ.Parent = workspace
                end
            end
        end


        -- [Stone Generation]
        if GridLayer <= (worldheight-3) then
            for GenYStone = 1,worldwidth,1 do
                wait()
                local Stone = Blocks.Stone():Clone()
                Stone.Position = COrigin  -- + Vector3.new(0,(GenYStone*Stone.Size.Y),0) -- Getting some weirdness here.
                Stone.Parent = workspace
                for GenZStone = 1,worldwidth,1 do
                    wait()
                    local StoneZ = Stone:Clone()
                    StoneZ.Position = Stone.Position + Vector3.new(0,0,(GenZStone*StoneZ.Size.Z))
                    StoneZ.Parent = workspace
                    for GenXStone = 1,worldwidth,1 do
                        local StoneX = Stone:Clone()
                        StoneX.Position = Stone.Position + Vector3.new((GenXStone*StoneX.Size.X),0,0)
                        StoneX.Parent = workspace
                    end
                end
            end
        end
    end
end
PrepareGrid()

Modular Script

local Blocks = {}

local BlockSize = Vector3.new(3,3,3) --Size of blocks in-game.
local BlockShape = "Block"

Blocks.Stone = function()
    local ItemID = 1
    local BlockType = game:GetService("ServerStorage"):WaitForChild("Blocks"):WaitForChild("Terrain"):WaitForChild("Stone")
    return BlockType
end

Blocks.Bedrock = function()
    local ItemID = 7
    local BlockType = game:GetService("ServerStorage"):WaitForChild("Blocks"):WaitForChild("Terrain"):WaitForChild("Bedrock")
    return BlockType
end

return Blocks

1 answer

Log in to vote
0
Answered by
gunter5 17
4 years ago

Nevermind! I managed to fix it after a few painful hours of confusing maths. Heres the working script.

local Blocks = require(game:GetService("ServerScriptService"):WaitForChild("Modules"):WaitForChild("BlockStatistics"))
local worldwidth = 16 -- map size from border to border in blocks
local worldheight = 8 --[[map height from bedrock]] -127 +127 --This is the depth below sea level. Leave untouched for the vanilla experience.
local TopLayer = 2 -- Layer to stop generating Stone and begin generating Dirt.

function PrepareGrid()
    local COrigin = Vector3.new(-(worldwidth/2),-worldheight, -(worldwidth/2))
    for GridLayer = 0,worldheight,1 do
        -- [Bedrock Generation]
        if GridLayer <= 0 then
            for GenXBedrock = 0,worldwidth,1 do
                wait()
                local Bedrock = Blocks.Bedrock():Clone()
                Bedrock.Position = COrigin --laying bottom layer for Bedrock
                Bedrock.Position = Bedrock.Position + Vector3.new((GenXBedrock*Bedrock.Size.X),0,0)
                Bedrock.Parent = workspace
                for GenZBedrock = 0,worldwidth,1 do
                    local BedrockZ = Bedrock:Clone()
                    BedrockZ.Position = Bedrock.Position + Vector3.new(0,0,(GenZBedrock*BedrockZ.Size.Z))
                    BedrockZ.Parent = workspace
                end
            end
            -- [Stone Generation]
        elseif GridLayer <= TopLayer and GridLayer > 0 then
            for GenYStone = GridLayer,TopLayer,1 do
                wait()
                local Stone = Blocks.Stone():Clone()
                Stone.Position = COrigin + Vector3.new(0,(GenYStone*Stone.Size.Y),0)
                Stone.Parent = workspace
                for GenZStone = 0,worldwidth,1 do
                    wait()
                    local StoneZ = Stone:Clone()
                    StoneZ.Position = StoneZ.Position + Vector3.new(0,0,(GenZStone*StoneZ.Size.Z))
                    StoneZ.Parent = workspace
                    for GenXStone = 0,worldwidth,1 do
                        local StoneX = StoneZ:Clone()
                        StoneX.Position = StoneX.Position + Vector3.new((GenXStone*StoneX.Size.X),0,0)
                        StoneX.Parent = workspace
                    end
                end
            end
            --[Dirt Generation]
        elseif GridLayer < worldheight then
            for GenYDirt = GridLayer,worldheight,1 do
                wait()
                local Dirt = Blocks.Dirt():Clone()
                Dirt.Position = COrigin + Vector3.new(0,(GenYDirt*Dirt.Size.Y),0)
                Dirt.Parent = workspace
                for GenZDirt = 0,worldwidth,1 do
                    wait()
                    local DirtZ = Dirt:Clone()
                    DirtZ.Position = DirtZ.Position + Vector3.new(0,0,(GenZDirt*DirtZ.Size.Z))
                    DirtZ.Parent = workspace
                    for GenXDirt = 0,worldwidth,1 do
                        local DirtX = DirtZ:Clone()
                        DirtX.Position = DirtX.Position + Vector3.new((GenXDirt*DirtX.Size.X),0,0)
                        DirtX.Parent = workspace
                    end
                end
            end
        end
    end
end
PrepareGrid()
Ad

Answer this question