Added a level equality check to client error handling to make it easier to diagnose bugs like #848 in the future.
This commit is contained in:
@@ -1647,11 +1647,12 @@ namespace Barotrauma.Networking
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ReportError(ClientNetError error,UInt16 expectedID=0,UInt16 eventID=0,UInt16 entityID=0)
|
public void ReportError(ClientNetError error, UInt16 expectedID = 0, UInt16 eventID = 0, UInt16 entityID = 0)
|
||||||
{
|
{
|
||||||
NetOutgoingMessage outMsg = client.CreateMessage();
|
NetOutgoingMessage outMsg = client.CreateMessage();
|
||||||
outMsg.Write((byte)ClientPacketHeader.ERROR);
|
outMsg.Write((byte)ClientPacketHeader.ERROR);
|
||||||
outMsg.Write((byte)error);
|
outMsg.Write((byte)error);
|
||||||
|
outMsg.Write(Level.Loaded == null ? 0 : Level.Loaded.EqualityCheckVal);
|
||||||
switch (error)
|
switch (error)
|
||||||
{
|
{
|
||||||
case ClientNetError.MISSING_EVENT:
|
case ClientNetError.MISSING_EVENT:
|
||||||
|
|||||||
@@ -128,6 +128,16 @@ namespace Barotrauma
|
|||||||
get { return seed; }
|
get { return seed; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A random integer assigned at the end of level generation. If these values differ between clients/server,
|
||||||
|
/// it means the levels aren't identical for some reason and there will most likely be major ID mismatches.
|
||||||
|
/// </summary>
|
||||||
|
public int EqualityCheckVal
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
private set;
|
||||||
|
}
|
||||||
|
|
||||||
public float Difficulty
|
public float Difficulty
|
||||||
{
|
{
|
||||||
get;
|
get;
|
||||||
@@ -538,6 +548,9 @@ namespace Barotrauma
|
|||||||
GenerateSeaFloor(mirror);
|
GenerateSeaFloor(mirror);
|
||||||
|
|
||||||
backgroundSpriteManager.PlaceSprites(this, generationParams.BackgroundSpriteAmount);
|
backgroundSpriteManager.PlaceSprites(this, generationParams.BackgroundSpriteAmount);
|
||||||
|
|
||||||
|
EqualityCheckVal = Rand.Int(int.MaxValue, Rand.RandSync.Server);
|
||||||
|
|
||||||
#if CLIENT
|
#if CLIENT
|
||||||
backgroundCreatureManager.SpawnSprites(80);
|
backgroundCreatureManager.SpawnSprites(80);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -618,6 +618,7 @@ namespace Barotrauma.Networking
|
|||||||
string errorStr = "Unhandled error report";
|
string errorStr = "Unhandled error report";
|
||||||
|
|
||||||
ClientNetError error = (ClientNetError)inc.ReadByte();
|
ClientNetError error = (ClientNetError)inc.ReadByte();
|
||||||
|
int levelEqualityCheckVal = inc.ReadInt32();
|
||||||
switch (error)
|
switch (error)
|
||||||
{
|
{
|
||||||
case ClientNetError.MISSING_EVENT:
|
case ClientNetError.MISSING_EVENT:
|
||||||
@@ -631,30 +632,35 @@ namespace Barotrauma.Networking
|
|||||||
Entity entity = Entity.FindEntityByID(entityID);
|
Entity entity = Entity.FindEntityByID(entityID);
|
||||||
if (entity == null)
|
if (entity == null)
|
||||||
{
|
{
|
||||||
errorStr = "Received an update for an entity that doesn't exist (event id " + eventID.ToString() + ", entity id " + entityID.ToString() + ")";
|
errorStr = "Received an update for an entity that doesn't exist (event id " + eventID.ToString() + ", entity id " + entityID.ToString() + ").";
|
||||||
}
|
}
|
||||||
else if (entity is Character character)
|
else if (entity is Character character)
|
||||||
{
|
{
|
||||||
errorStr = "Missing character " + character.Name + " (event id " + eventID.ToString() + ", entity id " + entityID.ToString() + ")";
|
errorStr = "Missing character " + character.Name + " (event id " + eventID.ToString() + ", entity id " + entityID.ToString() + ").";
|
||||||
}
|
}
|
||||||
else if (entity is Item item)
|
else if (entity is Item item)
|
||||||
{
|
{
|
||||||
errorStr = "Missing item " + item.Name + " (event id " + eventID.ToString() + ", entity id " + entityID.ToString() + ")";
|
errorStr = "Missing item " + item.Name + " (event id " + eventID.ToString() + ", entity id " + entityID.ToString() + ").";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
errorStr = "Missing entity " + entity.ToString() + " (event id " + eventID.ToString() + ", entity id " + entityID.ToString() + ")";
|
errorStr = "Missing entity " + entity.ToString() + " (event id " + eventID.ToString() + ", entity id " + entityID.ToString() + ").";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Level.Loaded != null && levelEqualityCheckVal != Level.Loaded.EqualityCheckVal)
|
||||||
|
{
|
||||||
|
errorStr += " Level equality check failed, something went wrong during level generation (seed " + Level.Loaded.Seed + ").";
|
||||||
|
}
|
||||||
|
|
||||||
if (c == null)
|
if (c == null)
|
||||||
{
|
{
|
||||||
KickClient(inc.SenderConnection, errorStr);
|
KickClient(inc.SenderConnection, errorStr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GameServer.Log(c.Name + " has reported an error: " + errorStr, ServerLog.MessageType.Error);
|
Log(c.Name + " has reported an error: " + errorStr, ServerLog.MessageType.Error);
|
||||||
KickClient(c, errorStr);
|
KickClient(c, errorStr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user