(99e6eb7c7) Fixed "attempted to access a potentially removed ragdoll" in SoundPlayer.Update, set Character.Controlled to null if the character is removed to prevent this from happening elsewhere

This commit is contained in:
Joonas Rikkonen
2019-04-29 21:05:37 +03:00
parent 33747a63b0
commit 45e0d2f663
3 changed files with 14 additions and 9 deletions
@@ -46,8 +46,7 @@ namespace Barotrauma
if (controlled == value) return; if (controlled == value) return;
controlled = value; controlled = value;
if (controlled != null) controlled.Enabled = true; if (controlled != null) controlled.Enabled = true;
CharacterHealth.OpenHealthWindow = null; CharacterHealth.OpenHealthWindow = null;
} }
} }
@@ -238,7 +238,7 @@ namespace Barotrauma
} }
float ambienceVolume = 0.8f; float ambienceVolume = 0.8f;
if (Character.Controlled != null) if (Character.Controlled != null && !Character.Controlled.Removed)
{ {
AnimController animController = Character.Controlled.AnimController; AnimController animController = Character.Controlled.AnimController;
if (animController.HeadInWater) if (animController.HeadInWater)
@@ -2534,7 +2534,7 @@ namespace Barotrauma
GameMain.GameSession.ReviveCharacter(this); GameMain.GameSession.ReviveCharacter(this);
} }
} }
public override void Remove() public override void Remove()
{ {
if (Removed) if (Removed)
@@ -2546,10 +2546,14 @@ namespace Barotrauma
base.Remove(); base.Remove();
if (selectedItems[0] != null) selectedItems[0].Drop(this); if (selectedItems[0] != null) { selectedItems[0].Drop(this); }
if (selectedItems[1] != null) selectedItems[1].Drop(this); if (selectedItems[1] != null) { selectedItems[1].Drop(this); }
if (info != null) info.Remove(); if (info != null) { info.Remove(); }
#if CLIENT
GameMain.GameSession?.CrewManager?.RemoveCharacter(this);
#endif
#if CLIENT #if CLIENT
GameMain.GameSession?.CrewManager?.RemoveCharacter(this); GameMain.GameSession?.CrewManager?.RemoveCharacter(this);
@@ -2557,6 +2561,8 @@ namespace Barotrauma
CharacterList.Remove(this); CharacterList.Remove(this);
if (Controlled == this) { Controlled = null; }
if (Inventory != null) if (Inventory != null)
{ {
foreach (Item item in Inventory.Items) foreach (Item item in Inventory.Items)
@@ -2576,8 +2582,8 @@ namespace Barotrauma
foreach (Character c in CharacterList) foreach (Character c in CharacterList)
{ {
if (c.focusedCharacter == this) c.focusedCharacter = null; if (c.focusedCharacter == this) { c.focusedCharacter = null; }
if (c.SelectedCharacter == this) c.SelectedCharacter = null; if (c.SelectedCharacter == this) { c.SelectedCharacter = null; }
} }
} }
partial void DisposeProjSpecific(); partial void DisposeProjSpecific();