Region3 Portal doesn't work?

Issue

I want the portal to teleport any character within it’s field to a random tile. but it doesn’t work when I try do it. To make sure the portal is activated every round, I have a module script clone the disabled script to the portal model before enabling it. I have no idea what so ever what could be causing the issue but I’d appreciate help on this.

Thanks

Region3 Code:

function CreateRegion3(Part)
	return Region3.new(Part.Position-(Part.Size/2),Part.Position+(Part.Size/2))
end
function SelectTiles()
	local Tiles = workspace:WaitForChild("SpleefMap"):GetDescendants()
	local ActualTiles = {}
	for i, v in pairs(Tiles) do
		if v:IsA("Part") then
			table.insert(ActualTiles,#ActualTiles+1, v)
		end
	end
	return ActualTiles[math.random(1, #ActualTiles)]
end
local r3 = CreateRegion3(script.Parent)
while wait() do
	local partsInR3 = workspace:FindPartsInRegion3(r3, script.Parent, math.huge)
	local ValidCharacters = {}
	for _, part in pairs(partsInR3) do
		for _, part in pairs(partsInR3) do
			if part.Parent:FindFirstChild("Humanoid") ~= nil and part.Parent:IsA("Model") then
				table.insert(ValidCharacters, #ValidCharacters +1, part.Parent)
			end
		end
	end
	for _pos, plr in pairs(ValidCharacters) do
		local hrp = game.Players:GetPlayerFromCharacter(plr).Character:WaitForChild("HumanoidRootPart")
		local tile = SelectTiles()
		if hrp then
			hrp.Position = tile.Position + Vector3.new(0,3,0)
			wait(1)
			table.remove(ValidCharacters, _pos)
			if script.Parent then
				script.Parent:Destroy()
			end


		end
	end

end

I can tell it isn’t getting to the script.Parent:Destroy() part as it isn’t destroying the model once within it.

Relevant Module Section:

function Portal()
	local PositionY = 63.528
	local A = {}
	for i = 1, 14 do
		local Tile = table.insert(A, #A+1, SelectTiles())
	end

	for i, v in pairs(A) do
		local Clone = game.ServerStorage.Disasters.Portal:Clone()
		local scriptC = script.Script:Clone()
		scriptC.Parent = Clone
		scriptC.Disabled = false
		Clone.Parent = workspace
		Clone.Position = Vector3.new(v.Position.X, PositionY, v.Position.Z)
	end
end

Thanks in advance

Have you considered using module scripts instead?
Cloning scripts seem to be a very inconsistent and unreliable method when dealing with Region3’s.

Instead you should use a module script that handles things like.

Region3:Create(Part) --// Returns a region3
Region3:Destroy(Region3) --// Destroys a region3

1 Like

try debugging the script by adding print statements in every big thing it does such as every for statement and every if statement and then you can see where it goes wrong if one of the prints don’t print! like this:

Region3 Code:

function CreateRegion3(Part)
    print("Returned: " .. Part.Position-(Part.Size/2),Part.Position+(Part.Size/2))
	return Region3.new(Part.Position-(Part.Size/2),Part.Position+(Part.Size/2))
end

function SelectTiles()
	local Tiles = workspace:WaitForChild("SpleefMap"):GetDescendants()
	local ActualTiles = {}
	for i, v in pairs(Tiles) do
		if v:IsA("Part") then
			table.insert(ActualTiles,#ActualTiles+1, v)
            print("Inserted: ".. v .. "into position: " .. #ActualTiles+1 .. "in table: " .. ActualTiles)
		end
	end
	return ActualTiles[math.random(1, #ActualTiles)]
end

local r3 = CreateRegion3(script.Parent)

while wait() do

	local partsInR3 = workspace:FindPartsInRegion3(r3, script.Parent, math.huge)
	local ValidCharacters = {}

	for _, part in pairs(partsInR3) do
		for _, part in pairs(partsInR3) do
			if part.Parent:FindFirstChild("Humanoid") ~= nil and part.Parent:IsA("Model") then
				table.insert(ValidCharacters, #ValidCharacters +1, part.Parent)
                print("Inserted: " .. part.Parent .. "into position: " .. #ValidCharacters+1 .. "of table: " .. ValidCharacters)
			end
		end
	end

	for _pos, plr in pairs(ValidCharacters) do
		local hrp = game.Players:GetPlayerFromCharacter(plr).Character:WaitForChild("HumanoidRootPart")
        print("Set 'hrp' to " .. game.Players:GetPlayerFromCharacter(plr).Character:WaitForChild("HumanoidRootPart"))
        local tile = SelectTiles()
		if hrp then
			hrp.Position = tile.Position + Vector3.new(0,3,0)
            print("Set 'hrp.Position' to " .. tile.Position + Vector3.new(0,3,0))
			wait(1)
			table.remove(ValidCharacters, _pos)
            print("Removed: " .. _pos .. " from table: " .. ValidCharacters)
			if script.Parent then
				script.Parent:Destroy()
                print("Destroyed: " .. script.Parent)
			end
		end
	end

end

Module Script Code:

function Portal()
	local PositionY = 63.528
	local A = {}
	for i = 1, 14 do
        --// This local Tile variable seems irrelevant. maybe just try the table.insert
		local Tile = table.insert(A, #A+1, SelectTiles())
	end

	for i, v in pairs(A) do
		local Clone = game.ServerStorage.Disasters.Portal:Clone()
		local scriptC = script.Script:Clone()
		scriptC.Parent = Clone
		scriptC.Disabled = false
		Clone.Parent = workspace
		Clone.Position = Vector3.new(v.Position.X, PositionY, v.Position.Z)
	end
end
1 Like