Install
$ agentstack add skill-nonlooped-roblox-suite-roblox-npcs ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
roblox-npcs
Official sources (always check these for the latest):
- https://create.roblox.com/docs/en-us/characters/pathfinding
- https://create.roblox.com/docs/en-us/workspace/streaming
- Engine classes:
PathfindingService,Path,PathWaypoint,PathfindingModifier,PathfindingLink,Humanoid
This skill covers navigation mesh pathfinding and the AI patterns that use it. It does not cover custom A* implementations unless absolutely necessary — PathfindingService is the official, optimized solution.
When to use this skill
Activate when:
- Building zombies, guards, pets, companions, or any AI that walks/follows/patrols.
- Tuning agent size, jump/climb ability, or preferred terrain.
- Handling dynamic obstacles and blocked paths.
- Using
PathfindingModifierregions/links for doors, traps, ladders, boats. - Scaling pathfinding for many agents.
Cross-reference:
- [roblox-core/SKILL.md](../roblox-core/SKILL.md) for services and Humanoid basics.
- [roblox-networking/SKILL.md](../roblox-networking/SKILL.md) for server-authoritative AI.
- [roblox-physics/SKILL.md](../roblox-physics/SKILL.md) for custom non-humanoid rigs and mover constraints.
- [roblox-testing/SKILL.md](../roblox-testing/SKILL.md) for profiling AI cost.
PathfindingService basics
Create a path:
local PathfindingService = game:GetService("PathfindingService")
local path = PathfindingService:CreatePath({
AgentRadius = 2,
AgentHeight = 5,
AgentCanJump = true,
AgentCanClimb = false,
WaypointSpacing = 4,
Costs = {
Water = 20,
DangerZone = math.huge,
}
})
path.CalculationSecondsTimeout = 1
Compute and follow:
local humanoid = character:WaitForChild("Humanoid")
local rootPart = character:WaitForChild("HumanoidRootPart")
local success, err = pcall(function()
path:ComputeAsync(rootPart.Position, endPos)
end)
if success and path.Status == Enum.PathStatus.Success then
local waypoints = path:GetWaypoints()
-- follow waypoints with Humanoid:Move()
end
Agent parameters
| Parameter | Default | Purpose | | --- | --- | --- | | AgentRadius | 2 studs | Minimum clearance from obstacles | | AgentHeight | 5 studs | Vertical clearance | | AgentCanJump | true | Allows jump waypoints | | AgentCanClimb | false | Allows climbing truss parts | | WaypointSpacing | 4 studs | Distance between intermediate waypoints | | Costs | nil | Material/region/link traversal cost |
Path.CalculationSecondsTimeout limits how long the solver may run per ComputeAsync call. Set it after CreatePath and before computing.
PathWaypoint actions
Each waypoint has a Position and an Action:
Enum.PathWaypointAction.Walk— normal movement.Enum.PathWaypointAction.Jump— trigger jump.- Custom labels like
"Climb"or"UseBoat"from PathfindingModifiers/Links.
Pathfinding modifiers
PathfindingModifier instances on anchored, non-colliding parts let you influence path cost:
Label— key used inCoststable.PassThrough— iftrue, the volume is ignored by the navmesh and treated as traversable empty space (e.g., zombies "hearing" through doors).
Example:
local path = PathfindingService:CreatePath({
Costs = {
Water = 20,
DangerZone = math.huge,
UseBoat = 2,
}
})
Pathfinding links
PathfindingLink connects two Attachments with a custom label and cost, allowing paths across normally untraversable gaps.
Use for:
- Boats across water
- Teleporters
- Ladders
- One-way jumps
Your movement code checks the waypoint label and runs the custom traversal logic.
Movement patterns
Follow
Continuously recompute a path to a moving target. Throttle recomputation (e.g., every 0.5–1 s) and only recompute if the target moved far enough.
Patrol
Cycle through a list of fixed points. Recompute when blocked.
Chase
Like follow, but validate line-of-sight and distance server-side. Don't trust client-reported positions for authoritative AI.
State machine
Common NPC states: Idle, Patrol, Chase, Attack, Return. Each state handles its own path computation and Humanoid control.
Streaming compatibility
- Server-side scripts have full world state and can compute paths to any part.
- Client-side scripts may fail if the destination has streamed out. Use
workspace.PersistentLoadedand persistent models for client path destinations. - Recompute paths when dynamic/streamed obstacles block the way.
Limitations
- Direct line-of-sight distance ≤ 3,000 studs.
- Computation node budget ≈ 20,000 nodes.
- Waypoint Y coordinate must be between -65,536 and +65,536 studs.
- Incompatible parameters (e.g.,
AgentCanJump = falseto a jump-only destination) will fail.
Performance at scale
- Recompute paths on a staggered schedule, not every frame.
- Share target positions across similar NPCs when possible.
- Use
WaypointSpacing = math.hugeto reduce intermediate waypoints for long straight runs. - Consider simplifying agent geometry or using fewer active agents.
- For very large worlds, split into regions or use local patrol paths.
Common mistakes this skill prevents
- Computing paths every frame.
- Ignoring blocked-path events and letting NPCs walk into walls.
- Trusting client position for authoritative AI.
- Forgetting
pcallaroundComputeAsync. - Using material names incorrectly in
Costs(must matchEnum.Materialnames as strings).
Scripts
scripts/NPCPathFollower.lua— Humanoid-based path follower with blocked-path recompute, custom-label support, and connection cleanup.scripts/PatrolBehavior.lua— state-driven patrol/chase behavior with spatial detection and throttled recomputation.scripts/PathfindingUtility.lua— helpers for throttled recomputation and waypoint formatting.
Best practices
- Set
Path.CalculationSecondsTimeoutafterCreatePathto cap solver time. - Always set an explicit
Humanoid:MoveTotimeout and cancel it when the waypoint is reached or the follower is stopped. - Detect targets with spatial queries such as
workspace:GetPartBoundsInRadiusinstead of scanning every player each frame. - Stop path followers and clean up
Heartbeatconnections when theHumanoiddies or the NPC is destroyed. - For respawning NPCs, create a new behavior instance for the new character model and
Destroythe old one. - Use
PathfindingLinklabels to trigger custom traversal logic (boats, teleporters, ladders). The follower invokes a registered handler; if none exists, the waypoint falls back to normal movement. - To enable climbing, set
AgentCanClimb = trueand provideTrussPartsurfaces. Climb waypoints have theLabel"Climb". PathfindingModifierparts must beAnchored = trueandCanCollide = false.
How to proceed
- Define the agent's size and movement abilities.
- Build the world with modifiers/links for special regions.
- Implement a path-follower that handles waypoints, jumps, and blocked events.
- Layer a state machine for complex behaviors.
- Run on the server for authoritative AI; use client only for visual prediction.
- Profile with MicroProfiler and stagger recomputation for many agents.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: nonlooped
- Source: nonlooped/roblox-suite
- License: MIT
- Homepage: https://nonlooped.github.io/roblox-suite/
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.