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

What does the Map being added to Workspace that affects Path finding?

Asked by 8 years ago

So i have a game were it selects a Map located in a folder in ServerStorage, clones it and Parent it to the Workspace. When that happens, a script inside a Map spawns AIs and these AIs haves Path finding. I'm having a problem were, when the map gets added to the workspace, it breaks the Path finding (Or my script itself). What i mean by that is that sometimes, the path just doesn't have a end point, so the character stays were he is jumping (Without any error in the output) and sometimes a bit of the path gets cut off.

Though i have made some tests and it seamed that when the Map is already in the Workspace, the AI worked perfectly. I tried to make the Map originally be located in Workspace, then it gets parented to the ServerStorage and then it gets added back to the Workspace and it also didn't worked. I also tried to instead of cloning it, just parent the Map and it also didn't worked.

So does path finding get affected if the Map's Parent gets changed or what?

Here's my AI script (Note: The place were the character moves to its end point is in the MoveToSpawnPoint() function at line 112):

-------------
--Variables--
-------------

local TC = nil
TC = script.Parent.Configuration.TeamColor.Value
--local pointModel = Instance.new("Model",game.Workspace)
local hum = script.Parent.Humanoid
local Pathfinding = game:GetService("PathfindingService")
-------------
--Functions--
-------------

--Finds the closest Enemy
function findClosestEnemy()
    --Variables
    local p = game.Players:GetChildren()
    local closestEnemy = nil
    local maxDistance = 50
    --Add NPCS to the players table
    for _, v in pairs (script.Parent.Parent:GetChildren()) do
        if v.Name == "Noob" or v.Name == "Guest" then
            table.insert(p,v)
        end
    end
    for _,player in pairs (p) do
        --If "player" classname is a player then
        if player.ClassName == "Player" then

            if player.TeamColor ~= TC then
                local char = player.Character
                if char ~= nil then
                    local humanoid = char:findFirstChild("Humanoid")
                    if humanoid and humanoid.Health>0 then
                        if closestEnemy == nil  and (char.Torso.Position - script.Parent.Torso.Position).magnitude<maxDistance then
                            closestEnemy = char
                        elseif (char.Torso.Position - script.Parent.Torso.Position).magnitude<maxDistance then
                            local NCEMag = (char.Torso.Position - script.Parent.Torso.Position).magnitude
                            local CEMag = (closestEnemy.Torso.Position - script.Parent.Torso.Position).magnitude
                            if NCEMag<CEMag then
                                closestEnemy = char
                            end
                        end
                    end
                end
            end
        --If "player" classname is not a player then
        else
            if player ~= nil and player ~= script.Parent then
                if player.Configuration.TeamColor.Value ~= TC then
                    local humanoid = player:findFirstChild("Humanoid")
                    if humanoid and humanoid.Health>0 then
                        if closestEnemy == nil  and (player.Torso.Position - script.Parent.Torso.Position).magnitude<maxDistance then
                            closestEnemy = player
                        elseif (player.Torso.Position - script.Parent.Torso.Position).magnitude<maxDistance then
                            local NCEMag = (player.Torso.Position - script.Parent.Torso.Position).magnitude
                            local CEMag = (closestEnemy.Torso.Position - script.Parent.Torso.Position).magnitude
                            if NCEMag<CEMag then
                                closestEnemy = player
                            end
                        end
                    end
                end
            end
        end
    end
    return closestEnemy
end

--Finds the closest Enemy SpawnPoint
function findClosestEnemySpawnpoint()
    local SpawnsContainer = script.Parent.Parent:GetChildren()
    local closestSpawnPoint = nil
    for _, spawn in pairs (SpawnsContainer) do
        if spawn.ClassName == "SpawnLocation" then
            if spawn.TeamColor ~= TC then
                if closestSpawnPoint == nil then
                    closestSpawnPoint = spawn
                else
                    local NSPMag = (spawn.Position - script.Parent.Torso.Position).magnitude
                    local CSPMag = (closestSpawnPoint.Position - script.Parent.Torso.Position).magnitude
                    if NSPMag < CSPMag then
                        closestSpawnPoint = spawn
                    end
                end
            end
        end
    end
    return closestSpawnPoint
end

--Visualizes the path (only for testing)
function visualizePath(path)
    -- clear old path visualization
    for _, point in pairs(pointModel:GetChildren()) do
        point:Destroy()
    end

    -- calculate new visualization  
    for _, point in pairs(path) do
        local part = Instance.new("Part")
        part.Parent = pointModel
        part.FormFactor = Enum.FormFactor.Custom
        part.Size = Vector3.new(1,1,1)
        part.Position = point
        part.Anchored = true
        part.CanCollide = false
    end
end

--Move to SpawnPoint
function MoveToSpawnPoint(s)
    local PF = Pathfinding:ComputeSmoothPathAsync(script.Parent.Torso.Position,s.Position,512)
    local points = PF:GetPointCoordinates()

    --visualizePath(points) 

    local distance;
    local br = false
    for i = 1,#points do
        wait(0)
        if br then break end
        local count = 0
        local E = findClosestEnemy()
        if E == nil then
            repeat
                count=count+1
                if count>20 then
                    br = true
                    break
                end
                hum:MoveTo(points[math.min(#points,i+1)])
                if points[i].Y>script.Parent.Torso.Position.Y+3 then
                    hum.Jump = true
                end
                distance=(points[i]*Vector3.new(1,0,1)-script.Parent.Torso.Position*Vector3.new(1,0,1)).magnitude
                wait()
            until distance<5
        else
            break
        end
    end
end

--Move to Enemy
function MoveToEnemy(e)
    local PF = Pathfinding:ComputeRawPathAsync(script.Parent.Torso.Position,e.Torso.Position,50)
    local points = PF:GetPointCoordinates()

    --visualizePath(points) 

    local distance;
    local br = false
    for i = 1,#points do
        wait(0)
        if br then break end
        local count = 0
        repeat
            count=count+1
            if count>20 then
                br = true
                break
            end
            hum:MoveTo(points[math.min(#points,i+1)])
            distance=(points[i]*Vector3.new(1,0,1)-script.Parent.Torso.Position*Vector3.new(1,0,1)).magnitude
            wait()
        until distance<10 or e.Humanoid.Health<=0 or hum.Health<=0 or (script.Parent.Torso.Position-e.Torso.Position).magnitude <10
        if (script.Parent.Torso.Position-e.Torso.Position).magnitude <10 and e.Humanoid.Health>0 and hum.Health>0 then
            hum:MoveTo(e.Torso.Position,e.Torso)
        end
        if e.Humanoid.Health<=0 or hum.Health<=0 then
            script.Parent.Target.Value = nil
            return
        end
    end
end

-------------
--Task Area--
-------------

while wait(0) do
    --Finds if there is any enemy close
    local Enemy = findClosestEnemy()
    if Enemy~= nil then
        script.Parent.Target.Value = Enemy
        MoveToEnemy(Enemy)
    --If theres not any enemy close, then go to the spawn points
    else
        script.Parent.Target.Value = nil
        local Spawn = findClosestEnemySpawnpoint()

        if Spawn ~= nil then
            MoveToSpawnPoint(Spawn)
        end
    end
end

1 answer

Log in to vote
0
Answered by 8 years ago

Found out. The floors was just to thin.

Ad

Answer this question