Greetings Developers, I’m trying to create my own Monster AI, but there are a few problems I can’t solve. The script itself Is pretty basic but I’m struggling to figure out how to implement these.
AI SCRIPT
local pathfindingservice = game:GetService("PathfindingService")
local runservice = game:GetService("RunService")
local players = game:GetService("Players")
local npc = script.Parent
local humanoid = npc.Humanoid
local head = npc.Head
local hrp = npc.HumanoidRootPart
local settings = require(npc.Settings)
hrp:SetNetworkOwner(nil)
function Patrol()
humanoid.WalkSpeed = settings.PatrolSpeed
local patrolfolder = workspace.PatrolArea:GetChildren()
local randompatrol = patrolfolder[math.random(1,#patrolfolder)]
local path = pathfindingservice:CreatePath(settings.agentparams)
path:ComputeAsync(hrp.Position, randompatrol.Position)
local waypoints = path:GetWaypoints()
if path.Status == Enum.PathStatus.Success then
for index, waypoint in pairs(waypoints) do
if waypoint.Action == Enum.PathWaypointAction.Jump then
humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
end
humanoid:MoveTo(waypoint.Position)
humanoid.MoveToFinished:Wait()
end
else
warn("Path not computed!", path.Status)
end
end
function findTarget()
local nearestTarget = nil
local nearestDistance = math.huge
for i,v in game.Players:GetPlayers() do
local character = v.Character
local humanoid = character and character:FindFirstChildOfClass("Humanoid")
if humanoid and humanoid.Health > 0 then
local Distance = (character.HumanoidRootPart.Position - hrp.Position).Magnitude
if Distance < nearestDistance then
if settings.checkTarget(character) then
nearestTarget = v
nearestDistance = Distance
return nearestTarget
end
end
end
end
end
function AttackTarget(target)
if target then
-- found target
local char = target.Character
else
warn("no target given.")
end
end
function targetAngle(character)
local npctocharacter = (character.Head.Position-head.Position).Unit
local npclook = head.CFrame.LookVector
local dot = npctocharacter:Dot(npclook)
local maxdist = 10
local dist = (character.Head.Position-head.Position).Magnitude
if dot > .5 then
if dist <= maxdist then
-- char is in fov
return true
else
return false
end
else
-- char is not in fov
return false
end
end
function followTarget()
local target = findTarget()
if target then
local char = target.Character
local charhead = char.Head
local path = pathfindingservice:CreatePath(settings.agentparams)
path:ComputeAsync(hrp.Position, char.HumanoidRootPart.Position)
local waypoints = path:GetWaypoints()
if path.Status == Enum.PathStatus.Success then
for _, waypoint in pairs(waypoints) do
if waypoint.Action == Enum.PathWaypointAction.Jump then
humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
end
humanoid:MoveTo(waypoint.Position)
humanoid.MoveToFinished:Wait()
end
else
warn("Path not found!")
end
end
end
runservice.Heartbeat:Connect(function(dt)
print("running")
local target = findTarget()
if target then
local angle = targetAngle(target.Character)
if angle then
followTarget()
else
Patrol() -- ALSO DOES NOT YIELD FOR FUNCTIONS
end
else
Patrol() -- DOES NOT YIELD FOR FUNCTIONS
end
end)
The first thing I need help with is yielding for functions. The loop does not yield for the Patrol() function, so it keeps running making the NPC stutter. I’ve tried to use coroutines, but I’m still learning those.
The next is the AI so it goes to the 2nd Floor. The map I’m currently using is a small map with a second floor:
(Image illuminated to illustrate)
I put a transparent wedge on the stairs and cut off the top part using union:
Now, I don’t have any issues with adding a small wedge to the stairs, but for some reason, it does not seem to work anymore.
This is the model I’m working with however, the agentparams size is pretty small, so I don’t see why that would be an issue.
The pathfinding I’m using does not detect the Y-axis, which I’ve learned from another post, so is there any solid way to implement that? For both the Patrol and Player-chase system.
Finally, if there’s any way to improve the code, I’m trying to make it so it has an angle of detection, a patrol, a chase and some other features soon.
Thank you for taking your time to read this.