public static BTResult StayNearLeader(Animal agent, float maxDistance) { var leader = GetLeader(agent); if (leader == null) { return(BTResult.Failure("No leader")); } if (leader == agent) { return(BTResult.Failure("We are the leader")); } var leaderPosition = leader.Position; var dist = Vector3.WrappedDistance(agent.Position, leaderPosition); if (dist > maxDistance) { // try to stay near alpha return(MovementBehaviors.LandMovement(agent, Vector3.WrappedDirectionalVector(leaderPosition, agent.Position).XZ, leader.State != AnimalState.Flee, AnimalState.Wander, minDirectionOffsetDegrees: MovementBehaviors.FleeMinAngle, maxDirectionOffsetDegrees: MovementBehaviors.FleeMaxAngle).Append($"Leader {dist:0.#}m away")); } return(BTResult.Failure($"Leader close enough: {dist}m")); }
public static BTStatus FollowLeader(Animal agent, float maxDistance) { var leader = GetLeader(agent); if (leader == null || leader == agent) { return(BTStatus.Failure); } if (Vector3.WrappedDistance(agent.Position, leader.Position) > maxDistance) { // try to stay near alpha return(MovementBehaviors.LandMovement(agent, Vector3.WrappedDirectionalVector(leader.Target.TargetPosition, agent.Position).XZ, leader.AnimationState == AnimalAnimationState.Flee ? agent.Species.Speed : agent.Species.WanderingSpeed, AnimalAnimationState.Wander)); } return(BTStatus.Failure); }