Server sends ServerEntityEvents to clients, NetEntityEvents can contain an object array which will be passed to the serializable entity (now only used for ItemComponent indices)

This commit is contained in:
Regalis
2016-11-13 13:56:48 +02:00
parent c314b37029
commit 498c72c64a
24 changed files with 133 additions and 43 deletions
+2 -1
View File
@@ -157,10 +157,11 @@
<Compile Include="Source\Networking\INetSerializable.cs" /> <Compile Include="Source\Networking\INetSerializable.cs" />
<Compile Include="Source\Networking\NetBufferExtensions.cs" /> <Compile Include="Source\Networking\NetBufferExtensions.cs" />
<Compile Include="Source\Networking\NetConfig.cs" /> <Compile Include="Source\Networking\NetConfig.cs" />
<Compile Include="Source\Networking\NetEntityEvent\ClientEntityEventManager.cs" />
<Compile Include="Source\Networking\NetEntityEvent\NetEntityEvent.cs" /> <Compile Include="Source\Networking\NetEntityEvent\NetEntityEvent.cs" />
<Compile Include="Source\Networking\NetEntityEvent\NetEntityEventManager.cs" /> <Compile Include="Source\Networking\NetEntityEvent\NetEntityEventManager.cs" />
<Compile Include="Source\Networking\NetEntityEvent\ServerEntityEventManager.cs" />
<Compile Include="Source\Networking\NetStats.cs" /> <Compile Include="Source\Networking\NetStats.cs" />
<Compile Include="Source\Networking\ServerEntityEvent.cs" />
<Compile Include="Source\Networking\RespawnManager.cs" /> <Compile Include="Source\Networking\RespawnManager.cs" />
<Compile Include="Source\Networking\ServerLog.cs" /> <Compile Include="Source\Networking\ServerLog.cs" />
<Compile Include="Source\Networking\WhiteList.cs" /> <Compile Include="Source\Networking\WhiteList.cs" />
+2 -2
View File
@@ -1911,7 +1911,7 @@ namespace Barotrauma
if (AnimController != null) AnimController.Remove(); if (AnimController != null) AnimController.Remove();
} }
public virtual void ClientWrite(NetBuffer msg) public virtual void ClientWrite(NetBuffer msg, object[] extraData = null)
{ {
if (GameMain.Server != null) return; if (GameMain.Server != null) return;
@@ -1972,7 +1972,7 @@ namespace Barotrauma
} }
} }
public virtual void ServerWrite(NetBuffer msg, Client c) public virtual void ServerWrite(NetBuffer msg, Client c, object[] extraData = null)
{ {
if (GameMain.Server == null) return; if (GameMain.Server == null) return;
@@ -648,7 +648,7 @@ namespace Barotrauma.Items.Components
} }
} }
public override void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c) public override void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c, object[] extraData = null)
{ {
msg.Write(docked); msg.Write(docked);
+2 -2
View File
@@ -489,11 +489,11 @@ namespace Barotrauma.Items.Components
if (sendNetworkMessage) if (sendNetworkMessage)
{ {
item.NewComponentEvent(this, false, true); item.CreateServerEvent(this);
} }
} }
public override void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c) public override void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c, object[] extraData = null)
{ {
msg.Write(isOpen); msg.Write(isOpen);
msg.WriteRangedSingle(stuck, 0.0f, 100.0f, 8); msg.WriteRangedSingle(stuck, 0.0f, 100.0f, 8);
@@ -662,10 +662,10 @@ namespace Barotrauma.Items.Components
} }
} }
public virtual void ClientWrite(NetBuffer msg) { } public virtual void ClientWrite(NetBuffer msg, object[] extraData = null) { }
public virtual void ServerRead(NetIncomingMessage msg, Client c) { } public virtual void ServerRead(NetIncomingMessage msg, Client c) { }
public virtual void ServerWrite(NetBuffer msg, Client c) { } public virtual void ServerWrite(NetBuffer msg, Client c, object[] extraData = null) { }
public virtual void ClientRead(NetIncomingMessage msg, float sendingTime) { } public virtual void ClientRead(NetIncomingMessage msg, float sendingTime) { }
public virtual XElement Save(XElement parentElement) public virtual XElement Save(XElement parentElement)
@@ -196,7 +196,7 @@ namespace Barotrauma.Items.Components
if (!IsActive) currPowerConsumption = 0.0f; if (!IsActive) currPowerConsumption = 0.0f;
} }
public override void ClientWrite(Lidgren.Network.NetBuffer msg) public override void ClientWrite(Lidgren.Network.NetBuffer msg, object[] extraData = null)
{ {
//flowpercentage can only be adjusted at 10% intervals -> no need for more accuracy than this //flowpercentage can only be adjusted at 10% intervals -> no need for more accuracy than this
msg.WriteRangedInteger(-10, 10, (int)(flowPercentage / 10.0f)); msg.WriteRangedInteger(-10, 10, (int)(flowPercentage / 10.0f));
@@ -209,7 +209,7 @@ namespace Barotrauma.Items.Components
IsActive = msg.ReadBoolean(); IsActive = msg.ReadBoolean();
} }
public override void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c) public override void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c, object[] extraData = null)
{ {
//flowpercentage can only be adjusted at 10% intervals -> no need for more accuracy than this //flowpercentage can only be adjusted at 10% intervals -> no need for more accuracy than this
msg.WriteRangedInteger(-10, 10, (int)(flowPercentage / 10.0f)); msg.WriteRangedInteger(-10, 10, (int)(flowPercentage / 10.0f));
@@ -411,7 +411,7 @@ namespace Barotrauma.Items.Components
if (screenOverlay != null) screenOverlay.Remove(); if (screenOverlay != null) screenOverlay.Remove();
} }
public override void ClientWrite(Lidgren.Network.NetBuffer msg) public override void ClientWrite(Lidgren.Network.NetBuffer msg, object[] extraData = null)
{ {
msg.Write(IsActive); msg.Write(IsActive);
} }
@@ -422,7 +422,7 @@ namespace Barotrauma.Items.Components
isActiveTickBox.Selected = IsActive; isActiveTickBox.Selected = IsActive;
} }
public override void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c) public override void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c, object[] extraData = null)
{ {
msg.Write(IsActive); msg.Write(IsActive);
} }
@@ -538,7 +538,7 @@ namespace Barotrauma.Items.Components
} }
} }
public override void ClientWrite(NetBuffer msg) public override void ClientWrite(NetBuffer msg, object[] extraData = null)
{ {
msg.Write(autoTemp); msg.Write(autoTemp);
msg.WriteRangedSingle(shutDownTemp, 0.0f, 10000.0f, 8); msg.WriteRangedSingle(shutDownTemp, 0.0f, 10000.0f, 8);
@@ -556,7 +556,7 @@ namespace Barotrauma.Items.Components
FissionRate = msg.ReadRangedSingle(0.0f, 100.0f, 8); FissionRate = msg.ReadRangedSingle(0.0f, 100.0f, 8);
} }
public override void ServerWrite(NetBuffer msg, Client c) public override void ServerWrite(NetBuffer msg, Client c, object[] extraData = null)
{ {
msg.WriteRangedSingle(temperature, 0.0f, 10000.0f, 16); msg.WriteRangedSingle(temperature, 0.0f, 10000.0f, 16);
@@ -443,7 +443,7 @@ namespace Barotrauma.Items.Components
} }
} }
public override void ClientWrite(Lidgren.Network.NetBuffer msg) public override void ClientWrite(Lidgren.Network.NetBuffer msg, object[] extraData = null)
{ {
msg.Write(autoPilot); msg.Write(autoPilot);
@@ -503,7 +503,7 @@ namespace Barotrauma.Items.Components
} }
} }
public override void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c) public override void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c, object[] extraData = null)
{ {
msg.Write(autoPilot); msg.Write(autoPilot);
@@ -249,7 +249,7 @@ namespace Barotrauma.Items.Components
GuiFrame.Update(1.0f / 60.0f); GuiFrame.Update(1.0f / 60.0f);
} }
public override void ClientWrite(Lidgren.Network.NetBuffer msg) public override void ClientWrite(Lidgren.Network.NetBuffer msg, object[] extraData = null)
{ {
float chargeSpeed = MathHelper.Clamp(rechargeSpeed / MaxRechargeSpeed, 0.0f, 1.0f); float chargeSpeed = MathHelper.Clamp(rechargeSpeed / MaxRechargeSpeed, 0.0f, 1.0f);
msg.WriteRangedSingle(chargeSpeed, 0.0f, 1.0f, 8); msg.WriteRangedSingle(chargeSpeed, 0.0f, 1.0f, 8);
@@ -260,7 +260,7 @@ namespace Barotrauma.Items.Components
RechargeSpeed = msg.ReadRangedSingle(0.0f, 1.0f, 8) * maxRechargeSpeed; RechargeSpeed = msg.ReadRangedSingle(0.0f, 1.0f, 8) * maxRechargeSpeed;
} }
public override void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c) public override void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c, object[] extraData = null)
{ {
float chargeSpeed = MathHelper.Clamp(rechargeSpeed / MaxRechargeSpeed, 0.0f, 1.0f); float chargeSpeed = MathHelper.Clamp(rechargeSpeed / MaxRechargeSpeed, 0.0f, 1.0f);
msg.WriteRangedSingle(chargeSpeed, 0.0f, 1.0f, 8); msg.WriteRangedSingle(chargeSpeed, 0.0f, 1.0f, 8);
@@ -286,7 +286,7 @@ namespace Barotrauma.Items.Components
if (!PlayerInput.LeftButtonHeld()) if (!PlayerInput.LeftButtonHeld())
{ {
panel.Item.NewComponentEvent(panel, true, true); //panel.Item.CreateServerEvent(panel, true, true);
//draggingConnected.Drop(Character); //draggingConnected.Drop(Character);
draggingConnected = null; draggingConnected = null;
} }
@@ -532,7 +532,7 @@ namespace Barotrauma.Items.Components
base.RemoveComponentSpecific(); base.RemoveComponentSpecific();
} }
public override void ClientWrite(Lidgren.Network.NetBuffer msg) public override void ClientWrite(Lidgren.Network.NetBuffer msg, object[] extraData = null)
{ {
msg.Write((byte)Math.Min(Nodes.Count, 255)); msg.Write((byte)Math.Min(Nodes.Count, 255));
for (int i = 0; i < Math.Min(Nodes.Count, 255); i++) for (int i = 0; i < Math.Min(Nodes.Count, 255); i++)
+20 -3
View File
@@ -1580,8 +1580,22 @@ namespace Barotrauma
return element; return element;
} }
public void ServerWrite(NetBuffer msg, Client c) { } public void ServerWrite(NetBuffer msg, Client c, object[] extraData = null)
public void ClientRead(NetIncomingMessage msg, float sendingTime) { } {
if (extraData == null) return;
int componentIndex = (int)extraData[0];
//component index
msg.Write((byte)componentIndex);
components[componentIndex].ServerWrite(msg, c);
}
public void ClientRead(NetIncomingMessage msg, float sendingTime)
{
int componentIndex = msg.ReadByte();
components[componentIndex].ClientRead(msg, sendingTime);
}
public void WriteSpawnData(NetBuffer msg) public void WriteSpawnData(NetBuffer msg)
{ {
@@ -1804,9 +1818,12 @@ namespace Barotrauma
} }
public void NewComponentEvent(ItemComponent ic, bool isClient, bool isImportant) public void CreateServerEvent(ItemComponent ic)
{ {
if (GameMain.Server == null) return;
int index = components.IndexOf(ic); int index = components.IndexOf(ic);
GameMain.Server.CreateEntityEvent(this, new object[] { index });
} }
public override void Remove() public override void Remove()
+1 -1
View File
@@ -845,7 +845,7 @@ namespace Barotrauma
return newBody; return newBody;
} }
public void ServerWrite(NetBuffer msg, Client c) public void ServerWrite(NetBuffer msg, Client c, object[] extraData = null)
{ {
for (int i = 0; i < sections.Length; i++) for (int i = 0; i < sections.Length; i++)
{ {
+1 -1
View File
@@ -1163,7 +1163,7 @@ namespace Barotrauma
DockedTo.Clear(); DockedTo.Clear();
} }
public void ServerWrite(NetBuffer msg, Client c) public void ServerWrite(NetBuffer msg, Client c, object[] extraData = null)
{ {
msg.Write(ID); msg.Write(ID);
//length in bytes //length in bytes
+2
View File
@@ -35,6 +35,8 @@ namespace Barotrauma.Networking
public bool hasLobbyData = false; public bool hasLobbyData = false;
public UInt32 lastSentChatMsgID = 0; //last msg this client said public UInt32 lastSentChatMsgID = 0; //last msg this client said
public UInt32 lastRecvChatMsgID = 0; //last msg this client knows about public UInt32 lastRecvChatMsgID = 0; //last msg this client knows about
public UInt32 lastSentEntityEventID = 0;
public UInt32 lastRecvEntityEventID = 0; public UInt32 lastRecvEntityEventID = 0;
public UInt32 lastRecvEntitySpawnID = 0; public UInt32 lastRecvEntitySpawnID = 0;
@@ -152,7 +152,7 @@ namespace Barotrauma
NetStateID = (UInt32)spawnHistory.Count; NetStateID = (UInt32)spawnHistory.Count;
} }
public void ServerWrite(Lidgren.Network.NetBuffer message, Client client) public void ServerWrite(Lidgren.Network.NetBuffer message, Client client, object[] extraData = null)
{ {
if (GameMain.Server == null) return; if (GameMain.Server == null) return;
@@ -41,6 +41,8 @@ namespace Barotrauma.Networking
public UInt32 LastSentEntityEventID; public UInt32 LastSentEntityEventID;
private ClientEntityEventManager entityEventManager;
public byte ID public byte ID
{ {
get { return myID; } get { return myID; }
@@ -87,6 +89,8 @@ namespace Barotrauma.Networking
name = newName; name = newName;
entityEventManager = new ClientEntityEventManager(this);
characterInfo = new CharacterInfo(Character.HumanConfigFile, name); characterInfo = new CharacterInfo(Character.HumanConfigFile, name);
characterInfo.Job = null; characterInfo.Job = null;
@@ -706,6 +710,7 @@ namespace Barotrauma.Networking
{ {
case ServerNetObject.SYNC_IDS: case ServerNetObject.SYNC_IDS:
lastSentChatMsgID = inc.ReadUInt32(); lastSentChatMsgID = inc.ReadUInt32();
LastSentEntityEventID = inc.ReadUInt32();
break; break;
case ServerNetObject.ENTITY_POSITION: case ServerNetObject.ENTITY_POSITION:
UInt16 id = inc.ReadUInt16(); UInt16 id = inc.ReadUInt16();
@@ -724,6 +729,9 @@ namespace Barotrauma.Networking
inc.ReadPadBits(); inc.ReadPadBits();
break; break;
case ServerNetObject.ENTITY_STATE:
entityEventManager.Read(inc, sendingTime);
break;
case ServerNetObject.CHAT_MESSAGE: case ServerNetObject.CHAT_MESSAGE:
ChatMessage.ClientRead(inc); ChatMessage.ClientRead(inc);
break; break;
@@ -769,6 +777,7 @@ namespace Barotrauma.Networking
outmsg.Write(GameMain.NetLobbyScreen.LastUpdateID); outmsg.Write(GameMain.NetLobbyScreen.LastUpdateID);
outmsg.Write(ChatMessage.LastID); outmsg.Write(ChatMessage.LastID);
outmsg.Write(Entity.Spawner.NetStateID); outmsg.Write(Entity.Spawner.NetStateID);
outmsg.Write(entityEventManager.LastReceivedEntityEventID);
ChatMessage removeMsg; ChatMessage removeMsg;
while ((removeMsg = chatMsgQueue.Find(cMsg => cMsg.NetStateID <= lastSentChatMsgID)) != null) while ((removeMsg = chatMsgQueue.Find(cMsg => cMsg.NetStateID <= lastSentChatMsgID)) != null)
@@ -43,6 +43,8 @@ namespace Barotrauma.Networking
public TraitorManager TraitorManager; public TraitorManager TraitorManager;
private ServerEntityEventManager entityEventManager;
public override List<Client> ConnectedClients public override List<Client> ConnectedClients
{ {
get get
@@ -116,6 +118,8 @@ namespace Barotrauma.Networking
settingsButton.OnClicked = ToggleSettingsFrame; settingsButton.OnClicked = ToggleSettingsFrame;
settingsButton.UserData = "settingsButton"; settingsButton.UserData = "settingsButton";
entityEventManager = new ServerEntityEventManager(this);
whitelist = new WhiteList(); whitelist = new WhiteList();
banList = new BanList(); banList = new BanList();
@@ -542,6 +546,11 @@ namespace Barotrauma.Networking
sparseUpdateTimer = DateTime.Now + sparseUpdateInterval; sparseUpdateTimer = DateTime.Now + sparseUpdateInterval;
} }
public void CreateEntityEvent(IServerSerializable entity, object[] extraData)
{
entityEventManager.CreateEvent(entity, extraData);
}
private byte GetNewClientID() private byte GetNewClientID()
{ {
byte userID = 1; byte userID = 1;
@@ -602,6 +611,7 @@ namespace Barotrauma.Networking
c.lastRecvGeneralUpdate = Math.Max(c.lastRecvGeneralUpdate, inc.ReadUInt32()); c.lastRecvGeneralUpdate = Math.Max(c.lastRecvGeneralUpdate, inc.ReadUInt32());
c.lastRecvChatMsgID = Math.Max(c.lastRecvChatMsgID, inc.ReadUInt32()); c.lastRecvChatMsgID = Math.Max(c.lastRecvChatMsgID, inc.ReadUInt32());
c.lastRecvEntitySpawnID = Math.Max(c.lastRecvEntitySpawnID, inc.ReadUInt32()); c.lastRecvEntitySpawnID = Math.Max(c.lastRecvEntitySpawnID, inc.ReadUInt32());
c.lastRecvEntityEventID = Math.Max(c.lastRecvEntityEventID, inc.ReadUInt32());
break; break;
case ClientNetObject.CHAT_MESSAGE: case ClientNetObject.CHAT_MESSAGE:
@@ -629,6 +639,7 @@ namespace Barotrauma.Networking
outmsg.Write((byte)ServerNetObject.SYNC_IDS); outmsg.Write((byte)ServerNetObject.SYNC_IDS);
outmsg.Write(c.lastSentChatMsgID); //send this to client so they know which chat messages weren't received by the server outmsg.Write(c.lastSentChatMsgID); //send this to client so they know which chat messages weren't received by the server
outmsg.Write(c.lastSentEntityEventID);
foreach (GUIComponent gc in GameMain.NetLobbyScreen.ChatBox.children) foreach (GUIComponent gc in GameMain.NetLobbyScreen.ChatBox.children)
{ {
@@ -672,6 +683,8 @@ namespace Barotrauma.Networking
outmsg.WritePadBits(); outmsg.WritePadBits();
} }
entityEventManager.Write(c, outmsg);
outmsg.Write((byte)ServerNetObject.END_OF_MESSAGE); outmsg.Write((byte)ServerNetObject.END_OF_MESSAGE);
server.SendMessage(outmsg, c.Connection, NetDeliveryMethod.Unreliable); server.SendMessage(outmsg, c.Connection, NetDeliveryMethod.Unreliable);
} }
@@ -12,7 +12,7 @@ namespace Barotrauma.Networking
{ {
UInt32 NetStateID { get; } UInt32 NetStateID { get; }
void ClientWrite(NetBuffer msg); void ClientWrite(NetBuffer msg, object[] extraData = null);
void ServerRead(NetIncomingMessage msg, Client c); void ServerRead(NetIncomingMessage msg, Client c);
} }
@@ -23,7 +23,7 @@ namespace Barotrauma.Networking
{ {
UInt32 NetStateID { get; } UInt32 NetStateID { get; }
void ServerWrite(NetBuffer msg, Client c); void ServerWrite(NetBuffer msg, Client c, object[] extraData = null);
void ClientRead(NetIncomingMessage msg, float sendingTime); void ClientRead(NetIncomingMessage msg, float sendingTime);
} }
} }
@@ -15,7 +15,10 @@ namespace Barotrauma.Networking
private GameClient thisClient; private GameClient thisClient;
public ClientEntityEventManager(GameClient client) { } public ClientEntityEventManager(GameClient client)
{
events = new List<ClientEntityEvent>();
}
public void CreateEvent(IClientSerializable entity) public void CreateEvent(IClientSerializable entity)
{ {
@@ -31,10 +34,16 @@ namespace Barotrauma.Networking
public void Write(NetOutgoingMessage msg) public void Write(NetOutgoingMessage msg)
{ {
var eventsToSync = events.SkipWhile(e => e.ID >= thisClient.LastSentEntityEventID).ToList(); if (events.Count == 0) return;
List<NetEntityEvent> eventsToSync = new List<NetEntityEvent>();
for (int i = events.Count - 1; i >= 0 && events[i].ID > thisClient.LastSentEntityEventID; i--)
{
eventsToSync.Add(events[i]);
}
if (eventsToSync.Count == 0) return; if (eventsToSync.Count == 0) return;
Write(msg, eventsToSync.Cast<NetEntityEvent>().ToList()); Write(msg, eventsToSync);
} }
protected override void WriteEvent(NetBuffer buffer, NetEntityEvent entityEvent, Client recipient = null) protected override void WriteEvent(NetBuffer buffer, NetEntityEvent entityEvent, Client recipient = null)
@@ -47,10 +56,15 @@ namespace Barotrauma.Networking
protected override void ReadEvent(NetIncomingMessage buffer, INetSerializable entity, float sendingTime, Client sender = null) protected override void ReadEvent(NetIncomingMessage buffer, INetSerializable entity, float sendingTime, Client sender = null)
{ {
var clientEntity = entity as IClientSerializable; var serverEntity = entity as IServerSerializable;
if (clientEntity == null) return; if (serverEntity == null) return;
clientEntity.ServerRead(buffer, sender); serverEntity.ClientRead(buffer, sendingTime);
}
public void Clear()
{
events.Clear();
} }
} }
} }
@@ -12,11 +12,20 @@ namespace Barotrauma.Networking
public readonly Entity Entity; public readonly Entity Entity;
public readonly UInt32 ID; public readonly UInt32 ID;
//arbitrary extra data that will be passed to the Write method of the serializable entity
//(the index of an itemcomponent for example)
protected object[] Data;
protected NetEntityEvent(INetSerializable entity, UInt32 id) protected NetEntityEvent(INetSerializable entity, UInt32 id)
{ {
this.ID = id; this.ID = id;
this.Entity = entity as Entity; this.Entity = entity as Entity;
} }
public void SetData(object[] data)
{
this.Data = data;
}
} }
class ServerEntityEvent : NetEntityEvent class ServerEntityEvent : NetEntityEvent
@@ -31,7 +40,7 @@ namespace Barotrauma.Networking
public void Write(NetBuffer msg, Client recipient) public void Write(NetBuffer msg, Client recipient)
{ {
serializable.ServerWrite(msg, recipient); serializable.ServerWrite(msg, recipient, Data);
} }
} }
@@ -47,7 +56,7 @@ namespace Barotrauma.Networking
public void Write(NetBuffer msg) public void Write(NetBuffer msg)
{ {
serializable.ClientWrite(msg); serializable.ClientWrite(msg, Data);
} }
} }
@@ -12,6 +12,11 @@ namespace Barotrauma.Networking
{ {
const int MaxEventsPerWrite = 255; const int MaxEventsPerWrite = 255;
public UInt32 LastReceivedEntityEventID
{
get { return lastReceivedEntityEventID; }
}
private UInt32 lastReceivedEntityEventID; private UInt32 lastReceivedEntityEventID;
/// <summary> /// <summary>
@@ -64,15 +69,18 @@ namespace Barotrauma.Networking
INetSerializable entity = Entity.FindEntityByID(entityID) as INetSerializable; INetSerializable entity = Entity.FindEntityByID(entityID) as INetSerializable;
//skip the event if we've already received it or if the entity isn't found //skip the event if we've already received it or if the entity isn't found
if (thisEventID <= lastReceivedEntityEventID || entity == null) if (thisEventID != lastReceivedEntityEventID+1 || entity == null)
{ {
DebugConsole.NewMessage("received msg "+thisEventID, Microsoft.Xna.Framework.Color.Red);
msg.Position += msgLength * 8; msg.Position += msgLength * 8;
} }
else else
{ {
DebugConsole.NewMessage("received msg "+thisEventID, Microsoft.Xna.Framework.Color.Green);
ReadEvent(msg, entity, sendingTime); ReadEvent(msg, entity, sendingTime);
lastReceivedEntityEventID = thisEventID; lastReceivedEntityEventID = thisEventID;
} }
msg.ReadPadBits();
} }
} }
@@ -13,9 +13,12 @@ namespace Barotrauma.Networking
private UInt32 ID; private UInt32 ID;
public ServerEntityEventManager(GameServer server) { } public ServerEntityEventManager(GameServer server)
{
events = new List<ServerEntityEvent>();
}
public void CreateEvent(IServerSerializable entity) public void CreateEvent(IServerSerializable entity, object[] extraData = null)
{ {
if (!(entity is Entity)) if (!(entity is Entity))
{ {
@@ -24,7 +27,10 @@ namespace Barotrauma.Networking
} }
ID++; ID++;
events.Add(new ServerEntityEvent(entity, ID));
var newEvent = new ServerEntityEvent(entity, ID);
if (extraData != null) newEvent.SetData(extraData);
events.Add(newEvent);
} }
/// <summary> /// <summary>
@@ -32,10 +38,16 @@ namespace Barotrauma.Networking
/// </summary> /// </summary>
public void Write(Client client, NetOutgoingMessage msg) public void Write(Client client, NetOutgoingMessage msg)
{ {
var eventsToSync = events.SkipWhile(e => e.ID >= client.lastRecvEntityEventID).ToList(); if (events.Count == 0) return;
List<NetEntityEvent> eventsToSync = new List<NetEntityEvent>();
for (int i = events.Count - 1; i >= 0 && events[i].ID > client.lastRecvEntityEventID; i--)
{
eventsToSync.Insert(0, events[i]);
}
if (eventsToSync.Count == 0) return; if (eventsToSync.Count == 0) return;
Write(msg, eventsToSync.Cast<NetEntityEvent>().ToList(), client); Write(msg, eventsToSync, client);
} }
protected override void WriteEvent(NetBuffer buffer, NetEntityEvent entityEvent, Client recipient = null) protected override void WriteEvent(NetBuffer buffer, NetEntityEvent entityEvent, Client recipient = null)
@@ -53,5 +65,10 @@ namespace Barotrauma.Networking
clientEntity.ServerRead(buffer, sender); clientEntity.ServerRead(buffer, sender);
} }
public void Clear()
{
events.Clear();
}
} }
} }