local NPC = script.Parent
local RootPart = NPC:FindFirstChild("HumanoidRootPart")
local Humanoid = NPC:FindFirstChild("Humanoid")
local AlignOrientation = RootPart:FindFirstChild("AlignOrientation")
RootPart:SetNetworkOwner(nil)
local Velocity = Vector3.zero
local SteeringForce = Vector3.zero
local Directions = {{1, -1}, {1, 1}, {-1, 1}, {-1, -1}}
local MaxSpeed = 16
local MaxForce = 5
local AvoidForce = 50
local ObstacleRange = 2.5
local Swinging = false
local t = tick()
local AttachmentHolder = workspace:WaitForChild("AttachmentHolder")
local Attachment = Instance.new("Attachment")
Attachment.Parent = AttachmentHolder
AlignOrientation.Attachment1 = Attachment
function GetRaycast(Origin, Direction)
local raycastParams = RaycastParams.new()
raycastParams.FilterDescendantsInstances = {NPC, workspace.Characters}
local Raycast = workspace:Raycast(Origin, Direction, raycastParams)
if Raycast then
return Raycast
end
return false
end
function GetTargetDirection(OriginPosition, TargetPosition)
local Direction = (TargetPosition - OriginPosition)
return Direction
end
function GetTargetLook(TargetPosition, Magnitude, Offset)
return CFrame.lookAt(RootPart.Position, TargetPosition) * CFrame.new(0, 0, (-Magnitude + Offset)).Position
end
function LimitMagnitude(Vector, Max)
local Limit = Vector.Unit * math.min(Vector.Magnitude, Max)
return Limit
end
function SeekForce(TargetVector)
local NewVector = GetTargetDirection(RootPart.Position, TargetVector)
NewVector = NewVector.Unit * MaxSpeed
NewVector -= Velocity
NewVector = LimitMagnitude(NewVector, MaxForce)
return NewVector
end
function FleeForce(TargetVector)
local NewVector = GetTargetDirection(RootPart.Position, TargetVector)
NewVector = NewVector.Unit * MaxSpeed
NewVector = -NewVector
NewVector -= Velocity
NewVector = LimitMagnitude(NewVector, MaxForce)
return NewVector
end
function PursueForce(Target)
local TargetVelocity = Target.AssemblyLinearVelocity
TargetVelocity *= 10
TargetVelocity += Target.Position
return SeekForce(TargetVelocity)
end
function EvadeForce(Target)
local TargetVelocity = Target.AssemblyLinearVelocity
TargetVelocity *= 10
TargetVelocity += Target.Position
return FleeForce(TargetVelocity)
end
function ArriveForce(TargetVector, SlowingRadius)
local NewVector = GetTargetDirection(RootPart.Position, TargetVector)
local Distance = NewVector.Magnitude
if(Distance > SlowingRadius) then
NewVector = NewVector * MaxSpeed
else
NewVector = NewVector.Unit * (MaxSpeed * (Distance/SlowingRadius))
end
NewVector -= Velocity
NewVector = LimitMagnitude(NewVector, MaxForce)
return NewVector
end
function SurroundForce()
end
function AvoidObstacleForce()
for i,Direction in pairs(Directions) do
local Direction = ((RootPart.Position + Vector3.new(Direction[1], 0, Direction[2])) - RootPart.Position).Unit * ObstacleRange
local rayCast = GetRaycast(RootPart.Position, Direction)
if rayCast then
return (FleeForce(rayCast.Position))
end
end
return Vector3.new(0,0,0)
end
This is the code in each NPC
The NPC’s are stored in workspace, the HumanoidRootPart is unanchored, and all items worn by the NPC’s are set to CanCollide off.
(I have just checked, every part inside the NPC is being destroyed, except non-physical instances)