diff --git a/Subsurface/Source/Items/Components/DockingPort.cs b/Subsurface/Source/Items/Components/DockingPort.cs
index c48ad1fd1..2e66fd529 100644
--- a/Subsurface/Source/Items/Components/DockingPort.cs
+++ b/Subsurface/Source/Items/Components/DockingPort.cs
@@ -648,7 +648,7 @@ namespace Barotrauma.Items.Components
}
}
- public override void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c, object[] extraData = null)
+ public void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c, object[] extraData = null)
{
msg.Write(docked);
@@ -662,7 +662,7 @@ namespace Barotrauma.Items.Components
}
}
- public override void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime)
+ public void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime)
{
bool isDocked = msg.ReadBoolean();
diff --git a/Subsurface/Source/Items/Components/Door.cs b/Subsurface/Source/Items/Components/Door.cs
index f265e108a..99ea03b1c 100644
--- a/Subsurface/Source/Items/Components/Door.cs
+++ b/Subsurface/Source/Items/Components/Door.cs
@@ -7,10 +7,11 @@ using FarseerPhysics.Factories;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Barotrauma.Lights;
+using Barotrauma.Networking;
namespace Barotrauma.Items.Components
{
- class Door : ItemComponent, IDrawableComponent
+ class Door : ItemComponent, IDrawableComponent, IServerSerializable
{
private Gap linkedGap;
@@ -493,13 +494,13 @@ namespace Barotrauma.Items.Components
}
}
- public override void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c, object[] extraData = null)
+ public void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c, object[] extraData = null)
{
msg.Write(isOpen);
msg.WriteRangedSingle(stuck, 0.0f, 100.0f, 8);
}
- public override void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime)
+ public void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime)
{
SetState(msg.ReadBoolean(), true);
Stuck = msg.ReadRangedSingle(0.0f, 100.0f, 8);
diff --git a/Subsurface/Source/Items/Components/ItemComponent.cs b/Subsurface/Source/Items/Components/ItemComponent.cs
index 4be776e8a..470915355 100644
--- a/Subsurface/Source/Items/Components/ItemComponent.cs
+++ b/Subsurface/Source/Items/Components/ItemComponent.cs
@@ -43,7 +43,7 @@ namespace Barotrauma.Items.Components
///
/// The base class for components holding the different functionalities of the item
///
- class ItemComponent : IPropertyObject, IClientSerializable, IServerSerializable
+ class ItemComponent : IPropertyObject
{
protected Item item;
@@ -662,12 +662,6 @@ namespace Barotrauma.Items.Components
}
}
- public virtual void ClientWrite(NetBuffer msg, object[] extraData = null) { }
- public virtual void ServerRead(NetIncomingMessage msg, Client c) { }
-
- public virtual void ServerWrite(NetBuffer msg, Client c, object[] extraData = null) { }
- public virtual void ClientRead(NetIncomingMessage msg, float sendingTime) { }
-
public virtual XElement Save(XElement parentElement)
{
XElement componentElement = new XElement(name);
diff --git a/Subsurface/Source/Items/Components/Machines/Pump.cs b/Subsurface/Source/Items/Components/Machines/Pump.cs
index 2cfe5819d..4d3200d1f 100644
--- a/Subsurface/Source/Items/Components/Machines/Pump.cs
+++ b/Subsurface/Source/Items/Components/Machines/Pump.cs
@@ -196,27 +196,27 @@ namespace Barotrauma.Items.Components
if (!IsActive) currPowerConsumption = 0.0f;
}
- public override void ClientWrite(Lidgren.Network.NetBuffer msg, object[] extraData = null)
+ public void ClientWrite(Lidgren.Network.NetBuffer msg, object[] extraData = null)
{
//flowpercentage can only be adjusted at 10% intervals -> no need for more accuracy than this
msg.WriteRangedInteger(-10, 10, (int)(flowPercentage / 10.0f));
msg.Write(IsActive);
}
- public override void ServerRead(Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c)
+ public void ServerRead(Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c)
{
FlowPercentage = msg.ReadRangedInteger(-10, 10) * 10.0f;
IsActive = msg.ReadBoolean();
}
- public override void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c, object[] extraData = null)
+ public 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
msg.WriteRangedInteger(-10, 10, (int)(flowPercentage / 10.0f));
msg.Write(IsActive);
}
- public override void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime)
+ public void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime)
{
FlowPercentage = msg.ReadRangedInteger(-10, 10) * 10.0f;
IsActive = msg.ReadBoolean();
diff --git a/Subsurface/Source/Items/Components/Machines/Radar.cs b/Subsurface/Source/Items/Components/Machines/Radar.cs
index a24373c50..5390508e0 100644
--- a/Subsurface/Source/Items/Components/Machines/Radar.cs
+++ b/Subsurface/Source/Items/Components/Machines/Radar.cs
@@ -411,23 +411,23 @@ namespace Barotrauma.Items.Components
if (screenOverlay != null) screenOverlay.Remove();
}
- public override void ClientWrite(Lidgren.Network.NetBuffer msg, object[] extraData = null)
+ public void ClientWrite(Lidgren.Network.NetBuffer msg, object[] extraData = null)
{
msg.Write(IsActive);
}
- public override void ServerRead(Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c)
+ public void ServerRead(Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c)
{
IsActive = msg.ReadBoolean();
isActiveTickBox.Selected = IsActive;
}
- public override void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c, object[] extraData = null)
+ public void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c, object[] extraData = null)
{
msg.Write(IsActive);
}
- public override void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime)
+ public void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime)
{
IsActive = msg.ReadBoolean();
isActiveTickBox.Selected = IsActive;
diff --git a/Subsurface/Source/Items/Components/Machines/Reactor.cs b/Subsurface/Source/Items/Components/Machines/Reactor.cs
index e17284ff6..6af7a0514 100644
--- a/Subsurface/Source/Items/Components/Machines/Reactor.cs
+++ b/Subsurface/Source/Items/Components/Machines/Reactor.cs
@@ -8,7 +8,7 @@ using Barotrauma.Networking;
namespace Barotrauma.Items.Components
{
- class Reactor : Powered, IDrawableComponent
+ class Reactor : Powered, IDrawableComponent, IServerSerializable, IClientSerializable
{
const float NetworkUpdateInterval = 3.0f;
@@ -324,6 +324,15 @@ namespace Barotrauma.Items.Components
if (unsentChanges && sendUpdateTimer<= 0.0f)
{
+ if (GameMain.Server != null)
+ {
+ item.CreateServerEvent(this);
+ }
+ else if (GameMain.Client != null)
+ {
+ item.CreateClientEvent(this);
+ }
+
sendUpdateTimer = NetworkUpdateInterval;
unsentChanges = false;
}
@@ -538,7 +547,7 @@ namespace Barotrauma.Items.Components
}
}
- public override void ClientWrite(NetBuffer msg, object[] extraData = null)
+ public void ClientWrite(NetBuffer msg, object[] extraData = null)
{
msg.Write(autoTemp);
msg.WriteRangedSingle(shutDownTemp, 0.0f, 10000.0f, 8);
@@ -547,16 +556,19 @@ namespace Barotrauma.Items.Components
msg.WriteRangedSingle(fissionRate, 0.0f, 100.0f, 8);
}
- public override void ServerRead(NetIncomingMessage msg, Client c)
+ public void ServerRead(NetIncomingMessage msg, Client c)
{
- autoTemp = msg.ReadBoolean();
+ AutoTemp = msg.ReadBoolean();
ShutDownTemp = msg.ReadRangedSingle(0.0f, 10000.0f, 8);
CoolingRate = msg.ReadRangedSingle(0.0f, 100.0f, 8);
FissionRate = msg.ReadRangedSingle(0.0f, 100.0f, 8);
+
+ //need to create a server event to notify all clients of the changed state
+ unsentChanges = true;
}
- public override void ServerWrite(NetBuffer msg, Client c, object[] extraData = null)
+ public void ServerWrite(NetBuffer msg, Client c, object[] extraData = null)
{
msg.WriteRangedSingle(temperature, 0.0f, 10000.0f, 16);
@@ -567,11 +579,11 @@ namespace Barotrauma.Items.Components
msg.WriteRangedSingle(fissionRate, 0.0f, 100.0f, 8);
}
- public override void ClientRead(NetIncomingMessage msg, float sendingTime)
+ public void ClientRead(NetIncomingMessage msg, float sendingTime)
{
Temperature = msg.ReadRangedSingle(0.0f, 10000.0f, 16);
- autoTemp = msg.ReadBoolean();
+ AutoTemp = msg.ReadBoolean();
ShutDownTemp = msg.ReadRangedSingle(0.0f, 10000.0f, 8);
CoolingRate = msg.ReadRangedSingle(0.0f, 100.0f, 8);
diff --git a/Subsurface/Source/Items/Components/Machines/Steering.cs b/Subsurface/Source/Items/Components/Machines/Steering.cs
index e6757707e..7c858ae0b 100644
--- a/Subsurface/Source/Items/Components/Machines/Steering.cs
+++ b/Subsurface/Source/Items/Components/Machines/Steering.cs
@@ -443,7 +443,7 @@ namespace Barotrauma.Items.Components
}
}
- public override void ClientWrite(Lidgren.Network.NetBuffer msg, object[] extraData = null)
+ public void ClientWrite(Lidgren.Network.NetBuffer msg, object[] extraData = null)
{
msg.Write(autoPilot);
@@ -468,7 +468,7 @@ namespace Barotrauma.Items.Components
}
}
- public override void ServerRead(Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c)
+ public void ServerRead(Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c)
{
AutoPilot = msg.ReadBoolean();
@@ -503,7 +503,7 @@ namespace Barotrauma.Items.Components
}
}
- public override void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c, object[] extraData = null)
+ public void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c, object[] extraData = null)
{
msg.Write(autoPilot);
@@ -524,7 +524,7 @@ namespace Barotrauma.Items.Components
}
}
- public override void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime)
+ public void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime)
{
AutoPilot = msg.ReadBoolean();
diff --git a/Subsurface/Source/Items/Components/Power/PowerContainer.cs b/Subsurface/Source/Items/Components/Power/PowerContainer.cs
index 379761ab8..cf0f62bba 100644
--- a/Subsurface/Source/Items/Components/Power/PowerContainer.cs
+++ b/Subsurface/Source/Items/Components/Power/PowerContainer.cs
@@ -249,18 +249,18 @@ namespace Barotrauma.Items.Components
GuiFrame.Update(1.0f / 60.0f);
}
- public override void ClientWrite(Lidgren.Network.NetBuffer msg, object[] extraData = null)
+ public void ClientWrite(Lidgren.Network.NetBuffer msg, object[] extraData = null)
{
float chargeSpeed = MathHelper.Clamp(rechargeSpeed / MaxRechargeSpeed, 0.0f, 1.0f);
msg.WriteRangedSingle(chargeSpeed, 0.0f, 1.0f, 8);
}
- public override void ServerRead(Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c)
+ public void ServerRead(Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c)
{
RechargeSpeed = msg.ReadRangedSingle(0.0f, 1.0f, 8) * maxRechargeSpeed;
}
- public override void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c, object[] extraData = null)
+ public void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c, object[] extraData = null)
{
float chargeSpeed = MathHelper.Clamp(rechargeSpeed / MaxRechargeSpeed, 0.0f, 1.0f);
msg.WriteRangedSingle(chargeSpeed, 0.0f, 1.0f, 8);
@@ -269,7 +269,7 @@ namespace Barotrauma.Items.Components
msg.WriteRangedSingle(chargeRatio, 0.0f, 1.0f, 8);
}
- public override void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime)
+ public void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime)
{
RechargeSpeed = msg.ReadRangedSingle(0.0f, 1.0f, 8) * maxRechargeSpeed;
diff --git a/Subsurface/Source/Items/Components/Signal/Wire.cs b/Subsurface/Source/Items/Components/Signal/Wire.cs
index 7fe79d295..8681e2b01 100644
--- a/Subsurface/Source/Items/Components/Signal/Wire.cs
+++ b/Subsurface/Source/Items/Components/Signal/Wire.cs
@@ -532,7 +532,7 @@ namespace Barotrauma.Items.Components
base.RemoveComponentSpecific();
}
- public override void ClientWrite(Lidgren.Network.NetBuffer msg, object[] extraData = null)
+ public void ClientWrite(Lidgren.Network.NetBuffer msg, object[] extraData = null)
{
msg.Write((byte)Math.Min(Nodes.Count, 255));
for (int i = 0; i < Math.Min(Nodes.Count, 255); i++)
@@ -542,7 +542,7 @@ namespace Barotrauma.Items.Components
}
}
- public override void ServerRead(Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c)
+ public void ServerRead(Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c)
{
Nodes.Clear();
diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs
index 6072992e6..6ea723803 100644
--- a/Subsurface/Source/Items/Item.cs
+++ b/Subsurface/Source/Items/Item.cs
@@ -26,7 +26,7 @@ namespace Barotrauma
OnImpact
}
- class Item : MapEntity, IDamageable, IPropertyObject, IServerSerializable
+ class Item : MapEntity, IDamageable, IPropertyObject, IServerSerializable, IClientSerializable
{
public static List- ItemList = new List
- ();
private ItemPrefab prefab;
@@ -1585,16 +1585,33 @@ namespace Barotrauma
if (extraData == null) return;
int componentIndex = (int)extraData[0];
- //component index
msg.Write((byte)componentIndex);
- components[componentIndex].ServerWrite(msg, c);
+ (components[componentIndex] as IServerSerializable).ServerWrite(msg, c, extraData);
}
+
public void ClientRead(NetIncomingMessage msg, float sendingTime)
{
int componentIndex = msg.ReadByte();
- components[componentIndex].ClientRead(msg, sendingTime);
+ (components[componentIndex] as IServerSerializable).ClientRead(msg, sendingTime);
+ }
+
+ public void ClientWrite(NetBuffer msg, object[] extraData = null)
+ {
+ if (extraData == null) return;
+
+ int componentIndex = (int)extraData[0];
+ msg.Write((byte)componentIndex);
+
+ (components[componentIndex] as IClientSerializable).ClientWrite(msg, extraData);
+ }
+
+ public void ServerRead(NetIncomingMessage msg, Client c)
+ {
+ int componentIndex = msg.ReadByte();
+
+ (components[componentIndex] as IClientSerializable).ServerRead(msg, c);
}
public void WriteSpawnData(NetBuffer msg)
@@ -1818,13 +1835,22 @@ namespace Barotrauma
}
- public void CreateServerEvent(ItemComponent ic)
+ public void CreateServerEvent(T ic) where T : ItemComponent, IServerSerializable
{
if (GameMain.Server == null) return;
int index = components.IndexOf(ic);
GameMain.Server.CreateEntityEvent(this, new object[] { index });
}
+
+ public void CreateClientEvent(T ic) where T : ItemComponent, IClientSerializable
+ {
+ if (GameMain.Client == null) return;
+
+ int index = components.IndexOf(ic);
+ GameMain.Client.CreateEntityEvent(this, new object[] { index });
+ }
+
public override void Remove()
{
diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs
index 0966d4cd6..5ccd254b3 100644
--- a/Subsurface/Source/Networking/GameClient.cs
+++ b/Subsurface/Source/Networking/GameClient.cs
@@ -777,7 +777,7 @@ namespace Barotrauma.Networking
outmsg.Write(GameMain.NetLobbyScreen.LastUpdateID);
outmsg.Write(ChatMessage.LastID);
outmsg.Write(Entity.Spawner.NetStateID);
- outmsg.Write(entityEventManager.LastReceivedEntityEventID);
+ outmsg.Write(entityEventManager.LastReceivedID);
ChatMessage removeMsg;
while ((removeMsg = chatMsgQueue.Find(cMsg => cMsg.NetStateID <= lastSentChatMsgID)) != null)
@@ -795,6 +795,8 @@ namespace Barotrauma.Networking
Character.Controlled.ClientWrite(outmsg);
}
+ entityEventManager.Write(outmsg, client.ServerConnection);
+
outmsg.Write((byte)ClientNetObject.END_OF_MESSAGE);
client.SendMessage(outmsg, NetDeliveryMethod.Unreliable);
}
@@ -814,6 +816,11 @@ namespace Barotrauma.Networking
chatMsgQueue.Add(chatMessage);
}
+
+ public void CreateEntityEvent(IClientSerializable entity, object[] extraData)
+ {
+ entityEventManager.CreateEvent(entity, extraData);
+ }
public bool HasPermission(ClientPermissions permission)
{
diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs
index 002c1877f..e4f23a2e2 100644
--- a/Subsurface/Source/Networking/GameServer.cs
+++ b/Subsurface/Source/Networking/GameServer.cs
@@ -623,6 +623,9 @@ namespace Barotrauma.Networking
c.Character.ServerRead(inc, c);
}
break;
+ case ClientNetObject.ENTITY_STATE:
+ entityEventManager.Read(inc, c);
+ break;
default:
return;
//break;
@@ -1027,6 +1030,10 @@ namespace Barotrauma.Networking
Item.Spawner.Clear();
entityEventManager.Clear();
+ foreach (Client c in connectedClients)
+ {
+ c.entityEventLastSent.Clear();
+ }
#if DEBUG
messageCount.Clear();
@@ -1418,7 +1425,6 @@ namespace Barotrauma.Networking
}
UpdateNetLobby(null);
-
}
private Client FindClientWithJobPreference(List clients, JobPrefab job, bool forceAssign = false)
diff --git a/Subsurface/Source/Networking/NetEntityEvent/ClientEntityEventManager.cs b/Subsurface/Source/Networking/NetEntityEvent/ClientEntityEventManager.cs
index cfc9876ad..803938651 100644
--- a/Subsurface/Source/Networking/NetEntityEvent/ClientEntityEventManager.cs
+++ b/Subsurface/Source/Networking/NetEntityEvent/ClientEntityEventManager.cs
@@ -15,12 +15,26 @@ namespace Barotrauma.Networking
private GameClient thisClient;
+ //when was a specific entity event last sent to the client
+ // key = event id, value = NetTime.Now when sending
+ public Dictionary eventLastSent;
+
+ public UInt32 LastReceivedID
+ {
+ get { return lastReceivedID; }
+ }
+
+ private UInt32 lastReceivedID;
+
public ClientEntityEventManager(GameClient client)
{
events = new List();
+ eventLastSent = new Dictionary();
+
+ thisClient = client;
}
- public void CreateEvent(IClientSerializable entity)
+ public void CreateEvent(IClientSerializable entity, object[] extraData = null)
{
if (!(entity is Entity))
{
@@ -29,23 +43,45 @@ namespace Barotrauma.Networking
}
ID++;
- events.Add(new ClientEntityEvent(entity, ID));
+ var newEvent = new ClientEntityEvent(entity, ID);
+ if (extraData != null) newEvent.SetData(extraData);
+
+ events.Add(newEvent);
}
- public void Write(NetOutgoingMessage msg)
+ public void Write(NetOutgoingMessage msg, NetConnection serverConnection)
{
if (events.Count == 0) return;
List eventsToSync = new List();
for (int i = events.Count - 1; i >= 0 && events[i].ID > thisClient.LastSentEntityEventID; i--)
{
+ float lastSent = 0;
+ eventLastSent.TryGetValue(events[i].ID, out lastSent);
+
+ if (lastSent > NetTime.Now - serverConnection.AverageRoundtripTime)
+ {
+ break;
+ }
+
eventsToSync.Add(events[i]);
}
if (eventsToSync.Count == 0) return;
+ foreach (NetEntityEvent entityEvent in eventsToSync)
+ {
+ eventLastSent[entityEvent.ID] = (float)NetTime.Now;
+ }
+
+ msg.Write((byte)ClientNetObject.ENTITY_STATE);
Write(msg, eventsToSync);
}
+ public void Read(NetIncomingMessage msg, float sendingTime)
+ {
+ base.Read(msg, sendingTime, ref lastReceivedID);
+ }
+
protected override void WriteEvent(NetBuffer buffer, NetEntityEvent entityEvent, Client recipient = null)
{
var clientEvent = entityEvent as ClientEntityEvent;
@@ -65,6 +101,7 @@ namespace Barotrauma.Networking
public void Clear()
{
events.Clear();
+ eventLastSent.Clear();
}
}
}
diff --git a/Subsurface/Source/Networking/NetEntityEvent/NetEntityEventManager.cs b/Subsurface/Source/Networking/NetEntityEvent/NetEntityEventManager.cs
index 09b2ab0e9..9df9f32b8 100644
--- a/Subsurface/Source/Networking/NetEntityEvent/NetEntityEventManager.cs
+++ b/Subsurface/Source/Networking/NetEntityEvent/NetEntityEventManager.cs
@@ -10,15 +10,14 @@ namespace Barotrauma.Networking
{
abstract class NetEntityEventManager
{
+ const int MaxEventBufferLength = 1024;
const int MaxEventsPerWrite = 64;
- public UInt32 LastReceivedEntityEventID
- {
- get { return lastReceivedEntityEventID; }
- }
+ //public UInt32 LastReceivedEntityEventID
+ //{
+ // get { return lastReceivedEntityEventID; }
+ //}
- private UInt32 lastReceivedEntityEventID;
-
///
/// Write the events to the outgoing message. The recipient parameter is only needed for ServerEntityEventManager
///
@@ -30,8 +29,6 @@ namespace Barotrauma.Networking
eventsToSync.RemoveRange(MaxEventsPerWrite, eventsToSync.Count - MaxEventsPerWrite);
}
- msg.Write((byte)ServerNetObject.ENTITY_STATE);
-
msg.Write(eventsToSync[0].ID);
msg.Write((byte)eventsToSync.Count);
@@ -55,7 +52,7 @@ namespace Barotrauma.Networking
///
/// Read the events from the message, ignoring ones we've already received
///
- public void Read(NetIncomingMessage msg, float sendingTime)
+ protected void Read(NetIncomingMessage msg, float sendingTime, ref UInt32 lastReceivedID)
{
UInt32 firstEventID = msg.ReadUInt32();
int eventCount = msg.ReadByte();
@@ -69,7 +66,7 @@ namespace Barotrauma.Networking
INetSerializable entity = Entity.FindEntityByID(entityID) as INetSerializable;
//skip the event if we've already received it or if the entity isn't found
- if (thisEventID != lastReceivedEntityEventID+1 || entity == null)
+ if (thisEventID != lastReceivedID + 1 || entity == null)
{
DebugConsole.NewMessage("received msg "+thisEventID, Microsoft.Xna.Framework.Color.Red);
msg.Position += msgLength * 8;
@@ -77,8 +74,8 @@ namespace Barotrauma.Networking
else
{
DebugConsole.NewMessage("received msg "+thisEventID, Microsoft.Xna.Framework.Color.Green);
+ lastReceivedID++;
ReadEvent(msg, entity, sendingTime);
- lastReceivedEntityEventID = thisEventID;
}
msg.ReadPadBits();
}
diff --git a/Subsurface/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs b/Subsurface/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs
index 198dcebe5..b2f9d5597 100644
--- a/Subsurface/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs
+++ b/Subsurface/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs
@@ -61,6 +61,7 @@ namespace Barotrauma.Networking
client.entityEventLastSent[entityEvent.ID] = (float)NetTime.Now;
}
+ msg.Write((byte)ServerNetObject.ENTITY_STATE);
Write(msg, eventsToSync, client);
}
@@ -80,6 +81,11 @@ namespace Barotrauma.Networking
clientEntity.ServerRead(buffer, sender);
}
+ public void Read(NetIncomingMessage msg, Client client)
+ {
+ base.Read(msg, 0.0f, ref client.lastSentEntityEventID);
+ }
+
public void Clear()
{
events.Clear();
diff --git a/Subsurface/Source/Networking/NetworkMember.cs b/Subsurface/Source/Networking/NetworkMember.cs
index 92a7c5e1a..f9bdf3edc 100644
--- a/Subsurface/Source/Networking/NetworkMember.cs
+++ b/Subsurface/Source/Networking/NetworkMember.cs
@@ -25,7 +25,8 @@ namespace Barotrauma.Networking
CHAT_MESSAGE, //also self-explanatory
VOTE, //you get the idea
CHARACTER_INPUT,
- ITEM_INTERACTION
+ ITEM_INTERACTION,
+ ENTITY_STATE
}
enum ServerPacketHeader