EntitySpawner only writes a limited number of entities per packet

This commit is contained in:
Regalis
2017-03-26 17:19:21 +03:00
parent 52dde81396
commit 3306a1ab96
2 changed files with 19 additions and 12 deletions
+18 -11
View File
@@ -8,6 +8,8 @@ namespace Barotrauma
{ {
class EntitySpawner : IServerSerializable class EntitySpawner : IServerSerializable
{ {
const int MaxEntitiesPerWrite = 10;
private enum SpawnableType { Item, Character }; private enum SpawnableType { Item, Character };
public UInt16 NetStateID public UInt16 NetStateID
@@ -182,9 +184,14 @@ namespace Barotrauma
//skip items that the client already knows about //skip items that the client already knows about
List<SpawnOrRemove> entities = spawnHistory.Skip((int)client.lastRecvEntitySpawnID).ToList(); List<SpawnOrRemove> entities = spawnHistory.Skip((int)client.lastRecvEntitySpawnID).ToList();
message.Write((UInt16)spawnHistory.Count); if (entities.Count > MaxEntitiesPerWrite)
{
entities = entities.GetRange(0, MaxEntitiesPerWrite);
}
message.Write((UInt16)(spawnHistory.IndexOf(entities[0])+1));
message.WriteRangedInteger(0, MaxEntitiesPerWrite, entities.Count);
message.Write((UInt16)entities.Count);
for (int i = 0; i < entities.Count; i++) for (int i = 0; i < entities.Count; i++)
{ {
message.Write(entities[i].Remove); message.Write(entities[i].Remove);
@@ -213,9 +220,8 @@ namespace Barotrauma
{ {
if (GameMain.Server != null) return; if (GameMain.Server != null) return;
UInt16 ID = message.ReadUInt16(); UInt16 ID = message.ReadUInt16();
var entityCount = message.ReadRangedInteger(0, MaxEntitiesPerWrite);
var entityCount = message.ReadUInt16();
for (int i = 0; i < entityCount; i++) for (int i = 0; i < entityCount; i++)
{ {
bool remove = message.ReadBoolean(); bool remove = message.ReadBoolean();
@@ -225,19 +231,20 @@ namespace Barotrauma
ushort entityId = message.ReadUInt16(); ushort entityId = message.ReadUInt16();
var entity = Entity.FindEntityByID(entityId); var entity = Entity.FindEntityByID(entityId);
if (entity == null || NetIdUtils.IdMoreRecent(NetStateID,(UInt16)(ID - entityCount + i))) continue; //already removed if (entity != null && NetIdUtils.IdMoreRecent((UInt16)(ID + i), NetStateID))
{
entity.Remove(); entity.Remove();
}
} }
else else
{ {
switch (message.ReadByte()) switch (message.ReadByte())
{ {
case (byte)SpawnableType.Item: case (byte)SpawnableType.Item:
Item.ReadSpawnData(message, NetIdUtils.IdMoreRecent((UInt16)(ID - entityCount + i), (UInt16)(NetStateID - 1))); Item.ReadSpawnData(message, NetIdUtils.IdMoreRecent((UInt16)(ID + i), NetStateID));
break; break;
case (byte)SpawnableType.Character: case (byte)SpawnableType.Character:
Character.ReadSpawnData(message, NetIdUtils.IdMoreRecent((UInt16)(ID - entityCount + i), (UInt16)(NetStateID - 1))); Character.ReadSpawnData(message, NetIdUtils.IdMoreRecent((UInt16)(ID + i), NetStateID));
break; break;
default: default:
DebugConsole.ThrowError("Received invalid entity spawn message (unknown spawnable type)"); DebugConsole.ThrowError("Received invalid entity spawn message (unknown spawnable type)");
@@ -246,7 +253,7 @@ namespace Barotrauma
} }
} }
NetStateID = Math.Max(ID, NetStateID); NetStateID = Math.Max((UInt16)(ID + entityCount - 1), NetStateID);
} }
@@ -54,7 +54,7 @@ namespace Barotrauma.Networking
public void Write(NetOutgoingMessage msg, NetConnection serverConnection) public void Write(NetOutgoingMessage msg, NetConnection serverConnection)
{ {
if (events.Count == 0) return; if (events.Count == 0 || serverConnection == null) return;
List<NetEntityEvent> eventsToSync = new List<NetEntityEvent>(); List<NetEntityEvent> eventsToSync = new List<NetEntityEvent>();