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

Hola, i have got a pathfinding problem please help? (Read description)

Asked by 3 years ago
Edited by imKirda 3 years ago

the problem is that is that the killer is supposed to be fast and he is at far distance but as sonn as he gets close to a player hes just as slow as the player adn wont be able to catch up and kill u. please help im so confused

here is the code: i know its long tho. Sorry


local SearchDistance = 300 local ZombieDamage = 100 local DamageWait = 0 local WanderX, WanderZ = 30, 30 function getHumanoid(model) for _, v in pairs(model:GetChildren())do if v:IsA'Humanoid' then return v end end end local zombie = script.Parent local human = getHumanoid(zombie) local hroot = zombie.Torso local zspeed = hroot.Velocity.magnitude local head = zombie:FindFirstChild'Head' local vars = script.vars local pfs = game:GetService("PathfindingService") local players = game:GetService('Players') -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- local path local waypoint local chaseName = nil function GetTorso(part) local chars = game.Workspace:GetChildren() local chaseRoot = nil local chaseTorso = nil local chasePlr = nil local chaseHuman = nil local mag = SearchDistance for i = 1, #chars do chasePlr = chars[i] if chasePlr:IsA'Model' and chasePlr ~= zombie then chaseHuman = getHumanoid(chasePlr) chaseRoot = chasePlr:FindFirstChild'HumanoidRootPart' if chaseRoot ~= nil and chaseHuman ~= nil and chaseHuman.Health > 0 and chaseHuman.Name ~= "Zombie" then if (chaseRoot.Position - part).magnitude < mag then chaseName = chasePlr.Name chaseTorso = chaseRoot mag = (chaseRoot.Position - part).magnitude end end end end return chaseTorso end function GetPlayersBodyParts(t) local torso = t if torso then local figure = torso.Parent for _, v in pairs(figure:GetChildren())do if v:IsA'Part' then return v.Name end end else return "HumanoidRootPart" end end -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- local damagetime local damagedb = false for _, zambieparts in pairs(zombie:GetChildren())do if zambieparts:IsA'Part' and human.Health > 0 then zambieparts.Touched:connect(function(p) if p.Parent.Name == chaseName and p.Parent.Name ~= zombie.Name and not damagedb then damagedb = true damagetime = time() local enemy = p.Parent local enemyhuman = getHumanoid(enemy) vars.Attacking.Value = true enemyhuman:TakeDamage(ZombieDamage) vars.Attacking.Value = false while wait() do if damagetime ~= nil and time() >= (damagetime + DamageWait) then damagedb = false damagetime = nil end end end end) end end spawn(function() while vars.Wandering.Value == false and human.Health > 0 do vars.Chasing.Value = false vars.Wandering.Value = true local desgx, desgz = hroot.Position.x+math.random(-WanderX,WanderX), hroot.Position.z+math.random(-WanderZ,WanderZ) local function checkw(t) local ci = 3 if ci > #t then ci = 3 end if t[ci] == nil and ci < #t then repeat ci = ci + 1 wait() until t[ci] ~= nil return Vector3.new(1,0,0) + t[ci] else ci = 3 return t[ci] end end path = pfs:FindPathAsync(hroot.Position, Vector3.new(desgx, 0, desgz)) waypoint = path:GetWaypoints() local connection; local direct = Vector3.FromNormalId(Enum.NormalId.Front) local ncf = hroot.CFrame * CFrame.new(direct) direct = ncf.p.unit local rootr = Ray.new(hroot.Position, direct) local phit, ppos = game.Workspace:FindPartOnRay(rootr, hroot) if path and waypoint or checkw(waypoint) then if checkw(waypoint) ~= nil and checkw(waypoint).Action == Enum.PathWaypointAction.Walk then human:MoveTo( checkw(waypoint).Position ) human.Jump = false end if checkw(waypoint) ~= nil and checkw(waypoint).Action == Enum.PathWaypointAction.Jump then connection = human.Changed:connect(function() human.Jump = true end) human:MoveTo( waypoint[4].Position ) else human.Jump = false end if connection then connection:Disconnect() end else for i = 3, #waypoint do human:MoveTo( waypoint[i].Position ) end end wait(math.random(4,6)) vars.Wandering.Value = false end end) -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- while wait() do local nrstt = GetTorso(hroot.Position) if nrstt ~= nil and human.Health > 0 then vars.Wandering.Value = false vars.Chasing.Value = true local function checkw(t) local ci = 3 if ci > #t then ci = 3 end if t[ci] == nil and ci < #t then repeat ci = ci + 1 wait() until t[ci] ~= nil return Vector3.new(1,0,0) + t[ci] else ci = 3 return t[ci] end end path = pfs:FindPathAsync(hroot.Position, nrstt.Position) waypoint = path:GetWaypoints() local connection; local direct = Vector3.FromNormalId(Enum.NormalId.Front) local ncf = hroot.CFrame * CFrame.new(direct) direct = ncf.p.unit local rootr = Ray.new(hroot.Position, direct) local phit, ppos = game.Workspace:FindPartOnRay(rootr, hroot) if path and waypoint or checkw(waypoint) then if checkw(waypoint) ~= nil and checkw(waypoint).Action == Enum.PathWaypointAction.Walk then human:MoveTo( checkw(waypoint).Position ) human.Jump = false end if checkw(waypoint) ~= nil and checkw(waypoint).Action == Enum.PathWaypointAction.Jump then connection = human.Changed:connect(function() human.Jump = true end) human:MoveTo( waypoint[4].Position ) else human.Jump = false end hroot.Touched:connect(function(p) local bodypartnames = GetPlayersBodyParts(nrstt) if p:IsA'Part' and not p.Name == bodypartnames and phit and phit.Name ~= bodypartnames and phit:IsA'Part' and rootr:Distance(phit.Position) < 5 then connection = human.Changed:connect(function() human.Jump = true end) else human.Jump = false end end) if connection then connection:Disconnect() end else for i = 3, #waypoint do human:MoveTo( waypoint[i].Position ) end end path = nil waypoint = nil elseif nrstt == nil then vars.Wandering.Value = false vars.Chasing.Value = false CchaseName = nil path = nil waypoint = nil human.MoveToFinished:Wait() end end
0
I won't read the whole code but from your described issue I can have idea of what happens, this can be solved by shooting a raycast from monster every n time and if this raycast hits your target then there is a straight path from monster to the player, then you can just use :MoveTo(target.HumanoidRootPart.Position) without pathfinding imKirda 4491 — 3y

Answer this question