diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index d70c0399d..e023e19e9 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -1820,8 +1820,6 @@ namespace Barotrauma public virtual void ServerWrite(NetOutgoingMessage msg, Client c) { msg.Write(ID); - //todo: only write this once in each packet, not for each character - msg.Write((float)NetTime.Now); msg.Write(AnimController.Dir > 0.0f); @@ -1829,7 +1827,7 @@ namespace Barotrauma msg.Write(SimPosition.Y); } - public static void ClientReadStatic(NetIncomingMessage msg) + public static void ClientReadStatic(NetIncomingMessage msg, float sendingTime) { UInt16 id = msg.ReadUInt16(); var character = Entity.FindEntityByID(id) as Character; @@ -1838,25 +1836,24 @@ namespace Barotrauma { //skip through the rest of the message //todo: a better way to skip through the message? - msg.Position += 32 + 1 + 32 + 32; + msg.Position += 1 + 32 + 32; } else { - character.ClientRead(msg); + character.ClientRead(msg, sendingTime); } } - public virtual void ClientRead(NetIncomingMessage msg) + public virtual void ClientRead(NetIncomingMessage msg, float sendingTime) { - float sendingTime = msg.ReadSingle(); + //float sendingTime = msg.ReadSingle(); bool facingRight = msg.ReadBoolean(); Vector2 pos = new Vector2(msg.ReadFloat(), msg.ReadFloat()); - var posInfo = new PosInfo( pos, facingRight ? Direction.Right : Direction.Left, - sendingTime - msg.SenderConnection.RemoteTimeOffset); + sendingTime); int index = 0; while (index < memPos.Count && posInfo.Timestamp > memPos[index].Timestamp) diff --git a/Subsurface/Source/Items/Components/DockingPort.cs b/Subsurface/Source/Items/Components/DockingPort.cs index f4ff2625c..87b7fbcd5 100644 --- a/Subsurface/Source/Items/Components/DockingPort.cs +++ b/Subsurface/Source/Items/Components/DockingPort.cs @@ -662,7 +662,7 @@ namespace Barotrauma.Items.Components } } - public override void ClientRead(Lidgren.Network.NetIncomingMessage msg) + public override 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 3cfc48c47..f2f66c538 100644 --- a/Subsurface/Source/Items/Components/Door.cs +++ b/Subsurface/Source/Items/Components/Door.cs @@ -499,7 +499,7 @@ namespace Barotrauma.Items.Components msg.WriteRangedSingle(stuck, 0.0f, 100.0f, 8); } - public override void ClientRead(Lidgren.Network.NetIncomingMessage msg) + public override 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 3f2acf745..2717b54dd 100644 --- a/Subsurface/Source/Items/Components/ItemComponent.cs +++ b/Subsurface/Source/Items/Components/ItemComponent.cs @@ -666,7 +666,7 @@ namespace Barotrauma.Items.Components public virtual void ServerRead(NetIncomingMessage msg, Client c) { } public virtual void ServerWrite(NetOutgoingMessage msg, Client c) { } - public virtual void ClientRead(NetIncomingMessage msg) { } + public virtual void ClientRead(NetIncomingMessage msg, float sendingTime) { } public virtual XElement Save(XElement parentElement) { diff --git a/Subsurface/Source/Items/Components/Machines/Pump.cs b/Subsurface/Source/Items/Components/Machines/Pump.cs index 9e60dc448..a9707373f 100644 --- a/Subsurface/Source/Items/Components/Machines/Pump.cs +++ b/Subsurface/Source/Items/Components/Machines/Pump.cs @@ -216,7 +216,7 @@ namespace Barotrauma.Items.Components msg.Write(IsActive); } - public override void ClientRead(Lidgren.Network.NetIncomingMessage msg) + public override 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 6114b9d87..52661476c 100644 --- a/Subsurface/Source/Items/Components/Machines/Radar.cs +++ b/Subsurface/Source/Items/Components/Machines/Radar.cs @@ -427,7 +427,7 @@ namespace Barotrauma.Items.Components msg.Write(IsActive); } - public override void ClientRead(Lidgren.Network.NetIncomingMessage msg) + public override 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 563f07c2b..729a5f6a1 100644 --- a/Subsurface/Source/Items/Components/Machines/Reactor.cs +++ b/Subsurface/Source/Items/Components/Machines/Reactor.cs @@ -568,7 +568,7 @@ namespace Barotrauma.Items.Components msg.WriteRangedSingle(fissionRate, 0.0f, 100.0f, 8); } - public override void ClientRead(NetIncomingMessage msg) + public override void ClientRead(NetIncomingMessage msg, float sendingTime) { Temperature = msg.ReadRangedSingle(0.0f, 10000.0f, 16); diff --git a/Subsurface/Source/Items/Components/Machines/Steering.cs b/Subsurface/Source/Items/Components/Machines/Steering.cs index c15d606b9..48a5bf06f 100644 --- a/Subsurface/Source/Items/Components/Machines/Steering.cs +++ b/Subsurface/Source/Items/Components/Machines/Steering.cs @@ -445,7 +445,7 @@ namespace Barotrauma.Items.Components } } - public override void ClientRead(Lidgren.Network.NetIncomingMessage msg) + public override 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 affec245a..d6f9633f1 100644 --- a/Subsurface/Source/Items/Components/Power/PowerContainer.cs +++ b/Subsurface/Source/Items/Components/Power/PowerContainer.cs @@ -269,7 +269,7 @@ namespace Barotrauma.Items.Components msg.WriteRangedSingle(chargeRatio, 0.0f, 1.0f, 8); } - public override void ClientRead(Lidgren.Network.NetIncomingMessage msg) + public override void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime) { RechargeSpeed = msg.ReadRangedSingle(0.0f, 1.0f, 8) * maxRechargeSpeed; diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index 62e52ea6c..29caafe50 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -1553,7 +1553,7 @@ namespace Barotrauma } public void ServerWrite(NetOutgoingMessage msg, Client c) { } - public void ClientRead(NetIncomingMessage msg) { } + public void ClientRead(NetIncomingMessage msg, float sendingTime) { } public void WriteSpawnData(NetOutgoingMessage msg) { diff --git a/Subsurface/Source/Map/Structure.cs b/Subsurface/Source/Map/Structure.cs index 4245708ac..6bb331613 100644 --- a/Subsurface/Source/Map/Structure.cs +++ b/Subsurface/Source/Map/Structure.cs @@ -833,7 +833,7 @@ namespace Barotrauma } } - public void ClientRead(NetIncomingMessage msg) + public void ClientRead(NetIncomingMessage msg, float sendingTime) { for (int i = 0; i < sections.Count(); i++) { diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs index 22937b677..b5ea26be9 100644 --- a/Subsurface/Source/Map/Submarine.cs +++ b/Subsurface/Source/Map/Submarine.cs @@ -1079,7 +1079,7 @@ namespace Barotrauma msg.Write(Velocity.Y); } - public void ClientRead(NetIncomingMessage msg) + public void ClientRead(NetIncomingMessage msg, float sendingTime) { subBody.TargetPosition = new Vector2(msg.ReadSingle(), msg.ReadSingle()); subBody.Velocity = new Vector2(msg.ReadSingle(), msg.ReadSingle()); diff --git a/Subsurface/Source/Networking/EntityRemover.cs b/Subsurface/Source/Networking/EntityRemover.cs index 08a3f081f..2c26d761a 100644 --- a/Subsurface/Source/Networking/EntityRemover.cs +++ b/Subsurface/Source/Networking/EntityRemover.cs @@ -58,7 +58,7 @@ namespace Barotrauma } } - public void ClientRead(Lidgren.Network.NetIncomingMessage message) + public void ClientRead(Lidgren.Network.NetIncomingMessage message, float sendingTime) { if (GameMain.Server != null) return; diff --git a/Subsurface/Source/Networking/EntitySpawner.cs b/Subsurface/Source/Networking/EntitySpawner.cs index b4365a056..084906cb1 100644 --- a/Subsurface/Source/Networking/EntitySpawner.cs +++ b/Subsurface/Source/Networking/EntitySpawner.cs @@ -145,7 +145,7 @@ namespace Barotrauma } } - public void ClientRead(Lidgren.Network.NetIncomingMessage message) + public void ClientRead(Lidgren.Network.NetIncomingMessage message, float sendingTime) { if (GameMain.Server != null) return; diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index 78bf2f6ad..ab90810fa 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -696,6 +696,8 @@ namespace Barotrauma.Networking private void ReadIngameUpdate(NetIncomingMessage inc) { + float sendingTime = inc.ReadFloat() - inc.SenderConnection.RemoteTimeOffset; + ServerNetObject objHeader; while ((objHeader = (ServerNetObject)inc.ReadByte()) != ServerNetObject.END_OF_MESSAGE) { @@ -705,24 +707,18 @@ namespace Barotrauma.Networking lastSentChatMsgID = inc.ReadUInt32(); break; case ServerNetObject.CHARACTER_POSITION: - //bool dead = inc.ReadBoolean(); - Character.ClientReadStatic(inc); + Character.ClientReadStatic(inc, sendingTime); inc.ReadPadBits(); - //if (Character.Controlled != null) - //{ - // if (dead && !Character.Controlled.IsDead) - // Character.Controlled.Kill(CauseOfDeath.Damage); - //} break; case ServerNetObject.CHAT_MESSAGE: ChatMessage.ClientRead(inc); break; case ServerNetObject.ENTITY_SPAWN: - Item.Spawner.ClientRead(inc); + Item.Spawner.ClientRead(inc, sendingTime); inc.ReadPadBits(); break; case ServerNetObject.ENTITY_REMOVE: - Item.Remover.ClientRead(inc); + Item.Remover.ClientRead(inc, sendingTime); inc.ReadPadBits(); break; default: diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index b0eb2f905..33cdb898c 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -625,6 +625,8 @@ namespace Barotrauma.Networking { NetOutgoingMessage outmsg = server.CreateMessage(); outmsg.Write((byte)ServerPacketHeader.UPDATE_INGAME); + + outmsg.Write((float)NetTime.Now); 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 diff --git a/Subsurface/Source/Networking/INetSerializable.cs b/Subsurface/Source/Networking/INetSerializable.cs index ca21a6eb4..0d51ca02b 100644 --- a/Subsurface/Source/Networking/INetSerializable.cs +++ b/Subsurface/Source/Networking/INetSerializable.cs @@ -22,6 +22,6 @@ namespace Barotrauma.Networking UInt32 NetStateID { get; } void ServerWrite(NetOutgoingMessage msg, Client c); - void ClientRead(NetIncomingMessage msg); + void ClientRead(NetIncomingMessage msg, float sendingTime); } }