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

Best practices for storing and retrieving 3D Co-ordinates?

Asked by 6 years ago

Please understand I am very new to coding/scripting. I will use very inefficient methods

I am creating a mining game.

When a player causes a block in the game to be generated, I want to store its positional value so that way further block generation does not place a block in a place where a block already is.

So far I am limiting the mining size to an area so that way I can store the positional data as an Integer (600600600 for instance would equate to a block existing in X: 3600 Y: 3600 Z: 3600 (the blocks are 6x6x6))

But storing as an int value here is inefficient, because intValues also have names, so I'm storing both an int and a string at least, if not more.

I was thinking of using a table, but I have no concept of how large a table can be before checking values in a table becomes slow and inefficient. Bonus points if you can answer this!

I was reading something about a solution where you store the co-ords in the following manner:

Store X co-ordinate in main table. Have each Y value that has been checked in its own sub table and then the Z value is a sub table off the Y table

This means the tables are only ever as large as the X co-ordinate for lookup purposes, but it requires both additional checks during block generation, and it means you're looking up three tables each time.

Someone has suggested me to use bitbuffer But I read the documentation on that, and it's a little daunting for someone so new as myself.

0
Omg, I have the same question. greatneil80 2647 — 6y

1 answer

Log in to vote
0
Answered by 6 years ago

Store it in a table while using Vector3's, or a string of the Vector3(if Lua tables look at the actual instance instead of the Vector's value) as a key.

--ServerScript-->Script
local coords = {}
local addCoord = Instance.new("RemoteFunction",game.ReplicatedStorage)
local removeCoord = Instance.new("RemoteFunction",game.ReplicatedStorage)
local cellSize = Vector3.new(6,6,6)

function findVector(vector)
    return coords[vector/cellSize]
end

function addCoord.OnServerInvoke(ply,vector)
    if not findVector(vector) then
        coords[vector] = true
        return true
    end
    return false
end
function removeCoord.OnServerInvoke(ply,vector)
    if findVector(vector) then
        coords[vector] = false
        return true
    end
    return false
end
Ad

Answer this question