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; } }
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); }
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; } }
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)); } } }