i want this ai to climb trusses to get to player but never done this before so I need help qwq
it trys to find a dif path to get to player
I tried make it like detect the truss and move to it but it just falls off after 1 secs
local SearchDistance = 150 -- How far a player can be before it detects you
local ZombieDamage = 5 -- How much damage the Zombie inficts towards the player
local canWander = true
local WanderX, WanderZ = 10, 10
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.HumanoidRootPart
local zspeed = hroot.Velocity.magnitude
local pfs = game:GetService("PathfindingService")
function GetPlayerNames()
local players = game:GetService('Players'):GetChildren()
local name = nil
for _, v in pairs(players) do
if v:IsA'Player' then
name = tostring(v.Name)
end
end
return name
end
spawn(function()
while wait() do
end
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
function GetTorso(part)
local chars = game.Workspace:GetChildren()
local torso = nil
for _, v in pairs(chars) do
if v:IsA("Model") and v ~= script.Parent then
local player = game.Players:GetPlayerFromCharacter(v)
if player and player.Team == game.Teams["Human"] then
local charRoot = v:FindFirstChild("HumanoidRootPart")
if (charRoot.Position - part).magnitude < SearchDistance then
torso = charRoot
end
end
end
end
return torso
end
local cooldownTime = 1 -- Time in seconds between damages
local lastDamageTime = {} -- Table to store the last damage time for each player
for _, zambieparts in pairs(zombie:GetChildren()) do
if zambieparts:IsA'Part' then
zambieparts.Touched:connect(function(p)
local player = game.Players:GetPlayerFromCharacter(p.Parent)
if player and p.Parent.Name == GetPlayerNames() and p.Parent.Name ~= zombie.Name then -- damage
-- Check if the player has a cooldown remaining
local currentTime = tick()
if player.Team and player.Team.Name ~= "Transfured" then
-- Check if the cooldown is over or if player has never been damaged before
if not lastDamageTime[player.UserId] or currentTime - lastDamageTime[player.UserId] >= cooldownTime then
-- Damage the player
local enemy = p.Parent
local enemyhuman = getHumanoid(enemy)
enemyhuman:TakeDamage(ZombieDamage)
-- Update the last damage time for this player
lastDamageTime[player.UserId] = currentTime
end
end
end
end)
end
end
-- no touchy
local path
local waypoint
local oldpoints
local isWandering = 0
if canWander then
spawn(function()
while isWandering == 0 do
isWandering = 1
local desgx, desgz = hroot.Position.x + math.random(-WanderX, WanderX), hroot.Position.z + math.random(-WanderZ, WanderZ)
human:MoveTo( Vector3.new(desgx, 0, desgz) )
wait(math.random(4, 6))
isWandering = 0
end
end)
end
while wait() do
local enemytorso = GetTorso(hroot.Position)
if enemytorso ~= nil then -- if player detected
isWandering = 1
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, enemytorso.Position)
waypoint = path:GetWaypoints()
oldpoints = waypoint
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
human.Jump = true
connection = human.Changed:connect(function()
human.Jump = true
end)
human:MoveTo( checkw(waypoint).Position )
else
human.Jump = false
end
if connection then
connection:Disconnect()
end
else
for i = 3, #oldpoints do
human:MoveTo( oldpoints[i].Position )
end
end
elseif enemytorso == nil and canWander then -- if player not detected
isWandering = 0
path = nil
waypoint = nil
human.MoveToFinished:Wait()
end
end