(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

View File

@@ -46,8 +46,7 @@ namespace Barotrauma
if (controlled == value) return;
controlled = value;
if (controlled != null) controlled.Enabled = true;
CharacterHealth.OpenHealthWindow = null;
CharacterHealth.OpenHealthWindow = null;
}
}

View File

@@ -238,7 +238,7 @@ namespace Barotrauma
}
float ambienceVolume = 0.8f;
if (Character.Controlled != null)
if (Character.Controlled != null && !Character.Controlled.Removed)
{
AnimController animController = Character.Controlled.AnimController;
if (animController.HeadInWater)

View File

@@ -2534,7 +2534,7 @@ namespace Barotrauma
GameMain.GameSession.ReviveCharacter(this);
}
}
public override void Remove()
{
if (Removed)
@@ -2546,10 +2546,14 @@ namespace Barotrauma
base.Remove();
if (selectedItems[0] != null) selectedItems[0].Drop(this);
if (selectedItems[1] != null) selectedItems[1].Drop(this);
if (selectedItems[0] != null) { selectedItems[0].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
GameMain.GameSession?.CrewManager?.RemoveCharacter(this);
@@ -2557,6 +2561,8 @@ namespace Barotrauma
CharacterList.Remove(this);
if (Controlled == this) { Controlled = null; }
if (Inventory != null)
{
foreach (Item item in Inventory.Items)
@@ -2576,8 +2582,8 @@ namespace Barotrauma
foreach (Character c in CharacterList)
{
if (c.focusedCharacter == this) c.focusedCharacter = null;
if (c.SelectedCharacter == this) c.SelectedCharacter = null;
if (c.focusedCharacter == this) { c.focusedCharacter = null; }
if (c.SelectedCharacter == this) { c.SelectedCharacter = null; }
}
}
partial void DisposeProjSpecific();