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:
@@ -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" />
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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++)
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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++)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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; }
|
||||||
@@ -86,6 +88,8 @@ namespace Barotrauma.Networking
|
|||||||
Hull.EditWater = false;
|
Hull.EditWater = false;
|
||||||
|
|
||||||
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>
|
||||||
@@ -62,17 +67,20 @@ namespace Barotrauma.Networking
|
|||||||
byte msgLength = msg.ReadByte();
|
byte msgLength = msg.ReadByte();
|
||||||
|
|
||||||
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user