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