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

Pathfinding breaks with high walkspeed?

Asked by 1 year ago

So I'm making a zombie game, and these zombies use pathfinding to not run into walls, I've never used pathfinding before so I helped myself with a youtube tutorial, and the pathfinding actually worked decently, problem is, when the zombie has high walkspeed, it glitches, like this:

(It's a gif) https://gyazo.com/cfd6fd7e9b350809dd352f2ed6cac2e9

This is the pathfinding script, correct me if something is wrong with it, as I still don't get the hang of pathfinding perfectly:

--- Services ---

local Plrs = game:GetService("Players")
local RunS = game:GetService("RunService")
local PathfindingS = game:GetService("PathfindingService")

--- Variables ---

local char = script.Parent.Parent
local Hum = char.Humanoid
local HRP = char.HumanoidRootPart

local CanJump = false

local FOV = 50
local CharSize = char:GetExtentsSize()

local PathInfo = {
    ModelRadius = (CharSize.X + CharSize.Z)/4,
    ModelHeight = CharSize.Y,
    ModelCanJump = CanJump
}

--- Initialization --- 

HRP:SetNetworkOwner(nil)

--- Functions ---

local function FindClosestPlr()
    local players = {}
    local ClosestDistance = math.huge
    local target

    for index, targetplr in pairs(Plrs:GetPlayers()) do
        local TargetChar = targetplr.Character

        if TargetChar == nil then
            continue
        end

        local distance = (TargetChar.HumanoidRootPart.Position - HRP.Position)
        if distance.Magnitude <= FOV then
            table.insert(players, {
                Magnitude = distance.Magnitude,
                Player = targetplr
            })
        end
    end

    for i, entry in pairs(players) do
        local magnitude = entry.Magnitude
        local player = entry.Player

        if magnitude < ClosestDistance then
            ClosestDistance = magnitude
            target = player
        end
    end

    return target
end


function Chase()
    local plr = FindClosestPlr()

    if plr == nil then
        return
    end

    local plr_character = plr.Character or plr.CharacterAdded:Wait()

    local plr_humanoid = plr_character.Humanoid

    if plr_humanoid.Health <= 0 then
        return
    end

    -- Chase

    local plr_HRP = plr_character.HumanoidRootPart

    local destination = plr_HRP.Position
    local beginning = HRP.Position

    local path = PathfindingS:CreatePath(PathInfo)
    path:ComputeAsync(beginning, destination)

    if path.Status == Enum.PathStatus.Success then
        local waypoints = path:GetWaypoints()

        for cry, waypoint in pairs(waypoints) do
            if waypoints.Action == Enum.PathWaypointAction.Jump then
                Hum.Jump = true
            end

            Hum:MoveTo(waypoint.Position)
            Hum.MoveToFinished:Wait()
        end

    else
        Hum:MoveTo(HRP.Position)
    end

end

--- Connections ---

RunS.Heartbeat:Connect(Chase)

Keep in mind both zombies are exaclty the same, just one has different part colors, and has 26 walkspeed, instead of 12.

Answer this question