Example #1
0
        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"));
        }
Example #2
0
        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);
        }