Exemplo n.º 1
0
        public AIObjectiveCombat(Character character, Character enemy, CombatMode mode, AIObjectiveManager objectiveManager, float priorityModifier = 1, float coolDown = 10.0f) 
            : base(character, objectiveManager, priorityModifier)
        {
            if (mode == CombatMode.None)
            {
#if DEBUG
                DebugConsole.ThrowError("Combat mode == None");
#endif
                return;
            }
            Enemy = enemy;
            coolDownTimer = coolDown;
            findSafety = objectiveManager.GetObjective<AIObjectiveFindSafety>();
            if (findSafety != null)
            {
                findSafety.Priority = 0;
                HumanAIController.UnreachableHulls.Clear();
            }
            Mode = mode;
            initialMode = Mode;
            if (Enemy == null)
            {
                Mode = CombatMode.Retreat;
            }
        }
Exemplo n.º 2
0
        public override void OnAttacked(Character attacker, float amount)
        {
            if (amount <= 0.0f)
            {
                return;
            }

            var enemy = attacker as Character;

            if (enemy == null || enemy == Character ||
                (enemy.SelectedCharacter == base.Character && enemy.AnimController.Anim == AnimController.Animation.CPR))
            {
                return;
            }



            objectiveManager.AddObjective(new AIObjectiveCombat(Character, enemy));

            //the objective in the manager is not necessarily the same as the one we just instantiated,
            //because the objective isn't added if there's already an identical objective in the manager
            var combatObjective = objectiveManager.GetObjective <AIObjectiveCombat>();

            combatObjective.MaxEnemyDamage = Math.Max(amount, combatObjective.MaxEnemyDamage);
        }
Exemplo n.º 3
0
 public AIObjectiveCombat(Character character, Character enemy, CombatMode mode, AIObjectiveManager objectiveManager, float priorityModifier = 1)
     : base(character, objectiveManager, priorityModifier)
 {
     Enemy         = enemy;
     coolDownTimer = coolDown;
     findSafety    = objectiveManager.GetObjective <AIObjectiveFindSafety>();
     if (findSafety != null)
     {
         findSafety.Priority = 0;
         HumanAIController.UnreachableHulls.Clear();
     }
     Mode        = mode;
     initialMode = Mode;
     if (Enemy == null)
     {
         Mode = CombatMode.Retreat;
     }
 }
Exemplo n.º 4
0
        public override void OnAttacked(Character attacker, AttackResult attackResult)
        {
            float damage = attackResult.Damage;

            if (damage <= 0)
            {
                return;
            }
            if (attacker == null || attacker.IsDead || attacker.Removed)
            {
                if (objectiveManager.CurrentOrder == null)
                {
                    objectiveManager.GetObjective <AIObjectiveFindSafety>().Priority = 100;
                }
                return;
            }
            if (IsFriendly(attacker))
            {
                if (attacker.AnimController.Anim == Barotrauma.AnimController.Animation.CPR && attacker.SelectedCharacter == Character)
                {
                    // Don't attack characters that damage you while doing cpr, because let's assume that they are helping you.
                    // Should not cancel any existing ai objectives (so that if the character attacked you and then helped, we still would want to retaliate).
                    return;
                }
                if (!attacker.IsRemotePlayer && Character.Controlled != attacker && attacker.AIController != null && attacker.AIController.Enabled)
                {
                    // Don't react to damage done by friendly ai, because we know that it's accidental
                    if (objectiveManager.CurrentOrder == null)
                    {
                        objectiveManager.GetObjective <AIObjectiveFindSafety>().Priority = 100;
                    }
                    return;
                }
                float currentVitality = Character.CharacterHealth.Vitality;
                float dmgPercentage   = damage / currentVitality * 100;
                if (dmgPercentage < currentVitality / 10)
                {
                    // Don't react to a minor amount of (accidental) dmg done by friendly characters
                    if (objectiveManager.CurrentOrder == null)
                    {
                        objectiveManager.GetObjective <AIObjectiveFindSafety>().Priority = 100;
                    }
                }
                if (ObjectiveManager.CurrentObjective is AIObjectiveCombat combatObjective)
                {
                    if (combatObjective.Enemy != attacker)
                    {
                        // Replace the old objective with the new.
                        ObjectiveManager.Objectives.Remove(combatObjective);
                        objectiveManager.AddObjective(new AIObjectiveCombat(Character, attacker));
                    }
                }
                else
                {
                    objectiveManager.AddObjective(new AIObjectiveCombat(Character, attacker), Rand.Range(0.5f, 1f, Rand.RandSync.Unsynced));
                }
            }
            else
            {
                if (ObjectiveManager.CurrentObjective is AIObjectiveCombat combatObjective)
                {
                    if (combatObjective.Enemy != attacker)
                    {
                        // Replace the old objective with the new.
                        ObjectiveManager.Objectives.Remove(combatObjective);
                        objectiveManager.AddObjective(new AIObjectiveCombat(Character, attacker));
                    }
                }
                else
                {
                    objectiveManager.AddObjective(new AIObjectiveCombat(Character, attacker));
                }
            }
        }