I have been trying to make a system so that a player can see if an area is accessible through other areas. These inbetween areas and the area at the end must be owned by the player.
But I’m not entirely sure how I would do this. I thought that using for loops would work but I have no idea how I would get for loops to go long enough to get to the area as it could have quite a few areas inbetween them. Each area has a StringValue in it that contains a table of the names of the areas has next to it.
The for loop solution I tried seemed like it would work at first but when I reached this point:
local selectableAreas = {}
local area = mouse.Target
for i,v in pairs(HTTP:JSONDecode(area.Connections.Value)) do
for i2, v2 in pairs(game.Workspace.Map:FindFirstChild(v)) do
if game.ReplicatedStorage.CurrentPlayer.Value == 1 then
if v2.Owner.Value == "Red" then
table.insert(selectableAreas, area)
end
end
end
end
I realised that it wouldn’t work as I would need a number of for loops that I have no idea of determining.
Any help on how I would create a system that would be able to loop through the connection values of the areas would be appreciated.
This function might help. I didn’t properly understand from the code you posted how you get the connected areas or the owner of an area, so I put parameters for functions that do those things. I haven’t tested this so I’m not sure if it works.
-- startArea is an area already owned by the player, target area is the area which you want to check if it's accessible
-- getConnectedAreas and getOwner should be functions
-- getConnectedArea should take an area and return a table of areas connected to it
-- (so if the areas are models, it should take a model and return a table of models)
-- getOwner should return any value that tells who owns the area
local function isAreaAccessible(startArea, targetArea, getConnectedAreas, getOwner)
-- connectedAreas stores areas that are connected to startArea and owned by the player
local connectedAreas = {}
local alreadyChecked = {[startArea] = true}
local owner = getOwner(startArea)
for _, connectedArea in ipairs(getConnectedAreas(startArea)) do
if connectedArea == targetArea then
return true
end
if getOwner(connectedArea) == owner then
table.insert(connectedAreas, connectedArea)
alreadyChecked[connectedArea] = true
end
end
while #connectedAreas > 0 do
local newConnectedAreas = {}
for _, connectedArea in ipairs(connectedAreas) do
for _, newConnectedArea in ipairs(getConnectedAreas(onnectedArea)) do
if newConnectedArea == targetArea then
return true
end
if not alreadyChecked[newConnectedArea] and getOwner(connectedArea) == owner then
table.insert(newConnectedAreas, newConnectedArea)
alreadyChecked[newConnectedArea] = true
end
end
end
connectedAreas = newConectedAreas
end
return false
end