From 7df4bff249697a0b4d6e746e4e64687c656253f3 Mon Sep 17 00:00:00 2001 From: Regalis Date: Mon, 17 Apr 2017 17:59:22 +0300 Subject: [PATCH] Fixed exceptions if a character is removed when an AI character is attacking it --- Subsurface/Source/Characters/AI/EnemyAIController.cs | 12 ++++++------ Subsurface/Source/Characters/AICharacter.cs | 8 +------- Subsurface/Source/Characters/Character.cs | 2 ++ Subsurface/Source/Map/Entity.cs | 11 ++++++++--- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Subsurface/Source/Characters/AI/EnemyAIController.cs b/Subsurface/Source/Characters/AI/EnemyAIController.cs index d38ed38ca..ac2fd83c7 100644 --- a/Subsurface/Source/Characters/AI/EnemyAIController.cs +++ b/Subsurface/Source/Characters/AI/EnemyAIController.cs @@ -196,23 +196,23 @@ namespace Barotrauma private void UpdateAttack(float deltaTime) { - if (selectedAiTarget == null) + if (selectedAiTarget == null || selectedAiTarget.Entity == null || selectedAiTarget.Entity.Removed) { state = AiState.None; return; } - + selectedTargetMemory.Priority -= deltaTime; - - Vector2 attackSimPosition = Character.Submarine==null ? ConvertUnits.ToSimUnits(selectedAiTarget.WorldPosition) : selectedAiTarget.SimPosition; + + Vector2 attackSimPosition = Character.Submarine == null ? ConvertUnits.ToSimUnits(selectedAiTarget.WorldPosition) : selectedAiTarget.SimPosition; if (wallAttackPos != Vector2.Zero && targetEntity != null) { attackSimPosition = wallAttackPos; - if (selectedAiTarget.Entity != null && Character.Submarine==null && selectedAiTarget.Entity.Submarine != null) attackSimPosition += ConvertUnits.ToSimUnits(selectedAiTarget.Entity.Submarine.Position); + if (selectedAiTarget.Entity != null && Character.Submarine == null && selectedAiTarget.Entity.Submarine != null) attackSimPosition += ConvertUnits.ToSimUnits(selectedAiTarget.Entity.Submarine.Position); } - if (coolDownTimer>0.0f) + if (coolDownTimer > 0.0f) { UpdateCoolDown(attackSimPosition, deltaTime); return; diff --git a/Subsurface/Source/Characters/AICharacter.cs b/Subsurface/Source/Characters/AICharacter.cs index e95d72a76..03541a015 100644 --- a/Subsurface/Source/Characters/AICharacter.cs +++ b/Subsurface/Source/Characters/AICharacter.cs @@ -1,11 +1,5 @@ -using Lidgren.Network; -using Microsoft.Xna.Framework; -using Barotrauma.Networking; +using Microsoft.Xna.Framework; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using FarseerPhysics; namespace Barotrauma { diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 9d3acbeeb..58fa6faeb 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -1728,6 +1728,8 @@ namespace Barotrauma public AttackResult AddDamage(Vector2 worldPosition, DamageType damageType, float amount, float bleedingAmount, float stun, bool playSound, float attackForce = 0.0f) { + if (Removed) return new AttackResult(); + SetStun(stun); Limb closestLimb = null; diff --git a/Subsurface/Source/Map/Entity.cs b/Subsurface/Source/Map/Entity.cs index d811c6ab0..67696b105 100644 --- a/Subsurface/Source/Map/Entity.cs +++ b/Subsurface/Source/Map/Entity.cs @@ -16,9 +16,13 @@ namespace Barotrauma private ushort id; protected AITarget aiTarget; - //protected float soundRange; - //protected float sightRange; - + + public bool Removed + { + get; + private set; + } + public ushort ID { get @@ -125,6 +129,7 @@ namespace Barotrauma public virtual void Remove() { dictionary.Remove(ID); + Removed = true; } public static void DumpIds(int count)