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

[SOLVED] How does using Vector3 as index of an array works?

Asked by 2 years ago
Edited 2 years ago

So I was looking at an article about scripting terrain:

https://developer.roblox.com/en-us/articles/Scripting-With-Terrain

Inside the article, there's a flood fill script:

local mouse = game.Players.LocalPlayer:GetMouse()
local terrain = game.Workspace.Terrain

local function checkDirection(origin, direction)
    local ray = Ray.new(origin, direction)
    local part, point, normal = game.Workspace:FindPartOnRay(ray, nil, true)
    return part
end

local function processDirection(queue, processed, current, direction)
    local nextNode = current + direction
    if not processed[tostring(nextNode)] then
        table.insert(queue, nextNode)
    end
end

local function floodFill(voxelPos)
    local region = Region3.new(voxelPos - Vector3.new(2,2,2), voxelPos + Vector3.new(2,2,2))
    local material, occupancy = terrain:ReadVoxels(region, 4)
    if material[1][1][1] ~= Enum.Material.Air then
        print("Could not fill from that voxel: Voxel not empty")
        return
    end

    local queue = {}
    local processed = {}
    local success = true
    table.insert(queue, voxelPos)

    while #queue > 0 do
        local current = table.remove(queue)
        region = Region3.new(current - Vector3.new(2,2,2), current + Vector3.new(2,2,2))
        material, occupancy = terrain:ReadVoxels(region, 4)
        if material[1][1][1] == Enum.Material.Air then
            if  checkDirection(current, Vector3.new(1000, 0, 0)) and
                checkDirection(current, Vector3.new(-1000, 0, 0)) and
                checkDirection(current, Vector3.new(0, 0, 1000)) and
                checkDirection(current, Vector3.new(0, 0, -1000)) and
                checkDirection(current, Vector3.new(0, -1000, 0)) then          

                processed[tostring(current)] = current

                processDirection(queue, processed, current, Vector3.new(4,0,0))
                processDirection(queue, processed, current, Vector3.new(-4,0,0))
                processDirection(queue, processed, current, Vector3.new(0,0,4))
                processDirection(queue, processed, current, Vector3.new(0,0,-4))
                processDirection(queue, processed, current, Vector3.new(0,-4,0))

            else
                processed = {}
                success = false
                break
            end
        end
    end

    if success then
        for _, position in pairs(processed) do
            region = Region3.new(position - Vector3.new(2,2,2), position + Vector3.new(2,2,2))
            material[1][1][1] = Enum.Material.Water
            occupancy[1][1][1] = 1
            terrain:WriteVoxels(region, 4, material, occupancy)
        end
    else
        print("Could not fill from that voxel: Would create infinite fill")
    end
end

local function round(num)
    return math.floor(num + .5)
end

mouse.Button1Up:Connect(function()
    local hit = mouse.Hit

    local x = round(mouse.Hit.p.X)
    x = x - x%4 + 2
    local y = round(mouse.Hit.p.Y)
    y = y - y%4 + 2
    local z = round(mouse.Hit.p.Z)
    z = z - z%4 + 2

    floodFill(Vector3.new(x, y, z))
end)

As you can see in line 12 and line 41, Vector3s are used as indexes of the array after the values are converted to string. I have never seen anything like that. I also tried to do that in roblox studio but got an error. However, the codes work when I copied and pasted into studio, then I tried to print out "current" and got Vector3 value as expected.

Does anyone know how that works? Any help will be appreciated :)

1 answer

Log in to vote
0
Answered by 2 years ago

Sorry guys, I'm retarded. That's a dictionary, not an array :/

Ad

Answer this question