(5218c43a0) Server sends the IDs of both selected characters and selected items to the clients. Previously this wasn't needed, because it wasn't possible to have both a character and an item selected at the same time. Fixes characters floating mid-air client-side when dragging others up stairs, and probably some other undiscovered bugs as well.

This commit is contained in:
Joonas Rikkonen
2019-04-01 22:50:11 +03:00
parent ae6b797d73
commit d511ecd4e3
7 changed files with 97 additions and 70 deletions
@@ -44,25 +44,29 @@ namespace Barotrauma
return;
}
if (character.MemState[0].Interact == null || character.MemState[0].Interact.Removed)
if (character.MemState[0].SelectedCharacter == null || character.MemState[0].SelectedCharacter.Removed)
{
character.DeselectCharacter();
}
else if (character.MemState[0].SelectedCharacter != null)
{
character.SelectCharacter(character.MemState[0].SelectedCharacter);
}
if (character.MemState[0].SelectedItem == null || character.MemState[0].SelectedItem.Removed)
{
character.SelectedConstruction = null;
}
else if (character.MemState[0].Interact is Character)
else
{
character.SelectCharacter((Character)character.MemState[0].Interact);
}
else if (character.MemState[0].Interact is Item newSelectedConstruction)
{
if (newSelectedConstruction != null && character.SelectedConstruction != newSelectedConstruction)
if (character.SelectedConstruction != character.MemState[0].SelectedItem)
{
foreach (var ic in newSelectedConstruction.Components)
foreach (var ic in character.MemState[0].SelectedItem.Components)
{
if (ic.CanBeSelected) ic.Select(character);
}
}
character.SelectedConstruction = newSelectedConstruction;
character.SelectedConstruction = character.MemState[0].SelectedItem;
}
if (character.MemState[0].Animation == AnimController.Animation.CPR)
@@ -169,25 +173,30 @@ namespace Barotrauma
CharacterStateInfo localPos = character.MemLocalState[localPosIndex];
//the entity we're interacting with doesn't match the server's
if (localPos.Interact != serverPos.Interact)
if (localPos.SelectedCharacter != serverPos.SelectedCharacter)
{
if (serverPos.Interact == null || serverPos.Interact.Removed)
if (serverPos.SelectedCharacter == null || serverPos.SelectedCharacter.Removed)
{
character.DeselectCharacter();
}
else if (serverPos.SelectedCharacter != null)
{
character.SelectCharacter(serverPos.SelectedCharacter);
}
}
if (localPos.SelectedItem != serverPos.SelectedItem)
{
if (serverPos.SelectedItem == null || serverPos.SelectedItem.Removed)
{
character.SelectedConstruction = null;
}
else if (serverPos.Interact is Character)
else if (serverPos.SelectedItem != null)
{
character.SelectCharacter((Character)serverPos.Interact);
}
else
{
var newSelectedConstruction = (Item)serverPos.Interact;
if (newSelectedConstruction != null && character.SelectedConstruction != newSelectedConstruction)
if (character.SelectedConstruction != serverPos.SelectedItem)
{
newSelectedConstruction.TryInteract(character, true, true);
serverPos.SelectedItem.TryInteract(character, true, true);
}
character.SelectedConstruction = newSelectedConstruction;
character.SelectedConstruction = serverPos.SelectedItem;
}
}