Sending NetEntityEvents from client to server, ItemComponent class doesn't implement the INetSerializable interfaces (only the derived classes do), reactor syncing
This commit is contained in:
@@ -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);
|
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();
|
bool isDocked = msg.ReadBoolean();
|
||||||
|
|
||||||
|
|||||||
@@ -7,10 +7,11 @@ using FarseerPhysics.Factories;
|
|||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
using Microsoft.Xna.Framework.Graphics;
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
using Barotrauma.Lights;
|
using Barotrauma.Lights;
|
||||||
|
using Barotrauma.Networking;
|
||||||
|
|
||||||
namespace Barotrauma.Items.Components
|
namespace Barotrauma.Items.Components
|
||||||
{
|
{
|
||||||
class Door : ItemComponent, IDrawableComponent
|
class Door : ItemComponent, IDrawableComponent, IServerSerializable
|
||||||
{
|
{
|
||||||
private Gap linkedGap;
|
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.Write(isOpen);
|
||||||
msg.WriteRangedSingle(stuck, 0.0f, 100.0f, 8);
|
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);
|
SetState(msg.ReadBoolean(), true);
|
||||||
Stuck = msg.ReadRangedSingle(0.0f, 100.0f, 8);
|
Stuck = msg.ReadRangedSingle(0.0f, 100.0f, 8);
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ namespace Barotrauma.Items.Components
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The base class for components holding the different functionalities of the item
|
/// The base class for components holding the different functionalities of the item
|
||||||
/// </summary>
|
/// </summary>
|
||||||
class ItemComponent : IPropertyObject, IClientSerializable, IServerSerializable
|
class ItemComponent : IPropertyObject
|
||||||
{
|
{
|
||||||
protected Item item;
|
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)
|
public virtual XElement Save(XElement parentElement)
|
||||||
{
|
{
|
||||||
XElement componentElement = new XElement(name);
|
XElement componentElement = new XElement(name);
|
||||||
|
|||||||
@@ -196,27 +196,27 @@ namespace Barotrauma.Items.Components
|
|||||||
if (!IsActive) currPowerConsumption = 0.0f;
|
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
|
//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));
|
||||||
msg.Write(IsActive);
|
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;
|
FlowPercentage = msg.ReadRangedInteger(-10, 10) * 10.0f;
|
||||||
IsActive = msg.ReadBoolean();
|
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
|
//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));
|
||||||
msg.Write(IsActive);
|
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;
|
FlowPercentage = msg.ReadRangedInteger(-10, 10) * 10.0f;
|
||||||
IsActive = msg.ReadBoolean();
|
IsActive = msg.ReadBoolean();
|
||||||
|
|||||||
@@ -411,23 +411,23 @@ namespace Barotrauma.Items.Components
|
|||||||
if (screenOverlay != null) screenOverlay.Remove();
|
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);
|
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();
|
IsActive = msg.ReadBoolean();
|
||||||
isActiveTickBox.Selected = IsActive;
|
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);
|
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();
|
IsActive = msg.ReadBoolean();
|
||||||
isActiveTickBox.Selected = IsActive;
|
isActiveTickBox.Selected = IsActive;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ using Barotrauma.Networking;
|
|||||||
|
|
||||||
namespace Barotrauma.Items.Components
|
namespace Barotrauma.Items.Components
|
||||||
{
|
{
|
||||||
class Reactor : Powered, IDrawableComponent
|
class Reactor : Powered, IDrawableComponent, IServerSerializable, IClientSerializable
|
||||||
{
|
{
|
||||||
const float NetworkUpdateInterval = 3.0f;
|
const float NetworkUpdateInterval = 3.0f;
|
||||||
|
|
||||||
@@ -324,6 +324,15 @@ namespace Barotrauma.Items.Components
|
|||||||
|
|
||||||
if (unsentChanges && sendUpdateTimer<= 0.0f)
|
if (unsentChanges && sendUpdateTimer<= 0.0f)
|
||||||
{
|
{
|
||||||
|
if (GameMain.Server != null)
|
||||||
|
{
|
||||||
|
item.CreateServerEvent(this);
|
||||||
|
}
|
||||||
|
else if (GameMain.Client != null)
|
||||||
|
{
|
||||||
|
item.CreateClientEvent(this);
|
||||||
|
}
|
||||||
|
|
||||||
sendUpdateTimer = NetworkUpdateInterval;
|
sendUpdateTimer = NetworkUpdateInterval;
|
||||||
unsentChanges = false;
|
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.Write(autoTemp);
|
||||||
msg.WriteRangedSingle(shutDownTemp, 0.0f, 10000.0f, 8);
|
msg.WriteRangedSingle(shutDownTemp, 0.0f, 10000.0f, 8);
|
||||||
@@ -547,16 +556,19 @@ namespace Barotrauma.Items.Components
|
|||||||
msg.WriteRangedSingle(fissionRate, 0.0f, 100.0f, 8);
|
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);
|
ShutDownTemp = msg.ReadRangedSingle(0.0f, 10000.0f, 8);
|
||||||
|
|
||||||
CoolingRate = msg.ReadRangedSingle(0.0f, 100.0f, 8);
|
CoolingRate = msg.ReadRangedSingle(0.0f, 100.0f, 8);
|
||||||
FissionRate = 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);
|
msg.WriteRangedSingle(temperature, 0.0f, 10000.0f, 16);
|
||||||
|
|
||||||
@@ -567,11 +579,11 @@ namespace Barotrauma.Items.Components
|
|||||||
msg.WriteRangedSingle(fissionRate, 0.0f, 100.0f, 8);
|
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);
|
Temperature = msg.ReadRangedSingle(0.0f, 10000.0f, 16);
|
||||||
|
|
||||||
autoTemp = msg.ReadBoolean();
|
AutoTemp = msg.ReadBoolean();
|
||||||
ShutDownTemp = msg.ReadRangedSingle(0.0f, 10000.0f, 8);
|
ShutDownTemp = msg.ReadRangedSingle(0.0f, 10000.0f, 8);
|
||||||
|
|
||||||
CoolingRate = msg.ReadRangedSingle(0.0f, 100.0f, 8);
|
CoolingRate = msg.ReadRangedSingle(0.0f, 100.0f, 8);
|
||||||
|
|||||||
@@ -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);
|
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();
|
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);
|
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();
|
AutoPilot = msg.ReadBoolean();
|
||||||
|
|
||||||
|
|||||||
@@ -249,18 +249,18 @@ namespace Barotrauma.Items.Components
|
|||||||
GuiFrame.Update(1.0f / 60.0f);
|
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);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
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);
|
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);
|
||||||
@@ -269,7 +269,7 @@ namespace Barotrauma.Items.Components
|
|||||||
msg.WriteRangedSingle(chargeRatio, 0.0f, 1.0f, 8);
|
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;
|
RechargeSpeed = msg.ReadRangedSingle(0.0f, 1.0f, 8) * maxRechargeSpeed;
|
||||||
|
|
||||||
|
|||||||
@@ -532,7 +532,7 @@ namespace Barotrauma.Items.Components
|
|||||||
base.RemoveComponentSpecific();
|
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));
|
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++)
|
||||||
@@ -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();
|
Nodes.Clear();
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ namespace Barotrauma
|
|||||||
OnImpact
|
OnImpact
|
||||||
}
|
}
|
||||||
|
|
||||||
class Item : MapEntity, IDamageable, IPropertyObject, IServerSerializable
|
class Item : MapEntity, IDamageable, IPropertyObject, IServerSerializable, IClientSerializable
|
||||||
{
|
{
|
||||||
public static List<Item> ItemList = new List<Item>();
|
public static List<Item> ItemList = new List<Item>();
|
||||||
private ItemPrefab prefab;
|
private ItemPrefab prefab;
|
||||||
@@ -1585,16 +1585,33 @@ namespace Barotrauma
|
|||||||
if (extraData == null) return;
|
if (extraData == null) return;
|
||||||
|
|
||||||
int componentIndex = (int)extraData[0];
|
int componentIndex = (int)extraData[0];
|
||||||
//component index
|
|
||||||
msg.Write((byte)componentIndex);
|
msg.Write((byte)componentIndex);
|
||||||
|
|
||||||
components[componentIndex].ServerWrite(msg, c);
|
(components[componentIndex] as IServerSerializable).ServerWrite(msg, c, extraData);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ClientRead(NetIncomingMessage msg, float sendingTime)
|
public void ClientRead(NetIncomingMessage msg, float sendingTime)
|
||||||
{
|
{
|
||||||
int componentIndex = msg.ReadByte();
|
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)
|
public void WriteSpawnData(NetBuffer msg)
|
||||||
@@ -1818,13 +1835,22 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void CreateServerEvent(ItemComponent ic)
|
public void CreateServerEvent<T>(T ic) where T : ItemComponent, IServerSerializable
|
||||||
{
|
{
|
||||||
if (GameMain.Server == null) return;
|
if (GameMain.Server == null) return;
|
||||||
|
|
||||||
int index = components.IndexOf(ic);
|
int index = components.IndexOf(ic);
|
||||||
GameMain.Server.CreateEntityEvent(this, new object[] { index });
|
GameMain.Server.CreateEntityEvent(this, new object[] { index });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void CreateClientEvent<T>(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()
|
public override void Remove()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -777,7 +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);
|
outmsg.Write(entityEventManager.LastReceivedID);
|
||||||
|
|
||||||
ChatMessage removeMsg;
|
ChatMessage removeMsg;
|
||||||
while ((removeMsg = chatMsgQueue.Find(cMsg => cMsg.NetStateID <= lastSentChatMsgID)) != null)
|
while ((removeMsg = chatMsgQueue.Find(cMsg => cMsg.NetStateID <= lastSentChatMsgID)) != null)
|
||||||
@@ -795,6 +795,8 @@ namespace Barotrauma.Networking
|
|||||||
Character.Controlled.ClientWrite(outmsg);
|
Character.Controlled.ClientWrite(outmsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
entityEventManager.Write(outmsg, client.ServerConnection);
|
||||||
|
|
||||||
outmsg.Write((byte)ClientNetObject.END_OF_MESSAGE);
|
outmsg.Write((byte)ClientNetObject.END_OF_MESSAGE);
|
||||||
client.SendMessage(outmsg, NetDeliveryMethod.Unreliable);
|
client.SendMessage(outmsg, NetDeliveryMethod.Unreliable);
|
||||||
}
|
}
|
||||||
@@ -814,6 +816,11 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
chatMsgQueue.Add(chatMessage);
|
chatMsgQueue.Add(chatMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void CreateEntityEvent(IClientSerializable entity, object[] extraData)
|
||||||
|
{
|
||||||
|
entityEventManager.CreateEvent(entity, extraData);
|
||||||
|
}
|
||||||
|
|
||||||
public bool HasPermission(ClientPermissions permission)
|
public bool HasPermission(ClientPermissions permission)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -623,6 +623,9 @@ namespace Barotrauma.Networking
|
|||||||
c.Character.ServerRead(inc, c);
|
c.Character.ServerRead(inc, c);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case ClientNetObject.ENTITY_STATE:
|
||||||
|
entityEventManager.Read(inc, c);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
//break;
|
//break;
|
||||||
@@ -1027,6 +1030,10 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
Item.Spawner.Clear();
|
Item.Spawner.Clear();
|
||||||
entityEventManager.Clear();
|
entityEventManager.Clear();
|
||||||
|
foreach (Client c in connectedClients)
|
||||||
|
{
|
||||||
|
c.entityEventLastSent.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
messageCount.Clear();
|
messageCount.Clear();
|
||||||
@@ -1418,7 +1425,6 @@ namespace Barotrauma.Networking
|
|||||||
}
|
}
|
||||||
|
|
||||||
UpdateNetLobby(null);
|
UpdateNetLobby(null);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Client FindClientWithJobPreference(List<Client> clients, JobPrefab job, bool forceAssign = false)
|
private Client FindClientWithJobPreference(List<Client> clients, JobPrefab job, bool forceAssign = false)
|
||||||
|
|||||||
@@ -15,12 +15,26 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
private GameClient thisClient;
|
private GameClient thisClient;
|
||||||
|
|
||||||
|
//when was a specific entity event last sent to the client
|
||||||
|
// key = event id, value = NetTime.Now when sending
|
||||||
|
public Dictionary<UInt32, float> eventLastSent;
|
||||||
|
|
||||||
|
public UInt32 LastReceivedID
|
||||||
|
{
|
||||||
|
get { return lastReceivedID; }
|
||||||
|
}
|
||||||
|
|
||||||
|
private UInt32 lastReceivedID;
|
||||||
|
|
||||||
public ClientEntityEventManager(GameClient client)
|
public ClientEntityEventManager(GameClient client)
|
||||||
{
|
{
|
||||||
events = new List<ClientEntityEvent>();
|
events = new List<ClientEntityEvent>();
|
||||||
|
eventLastSent = new Dictionary<uint, float>();
|
||||||
|
|
||||||
|
thisClient = client;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CreateEvent(IClientSerializable entity)
|
public void CreateEvent(IClientSerializable entity, object[] extraData = null)
|
||||||
{
|
{
|
||||||
if (!(entity is Entity))
|
if (!(entity is Entity))
|
||||||
{
|
{
|
||||||
@@ -29,23 +43,45 @@ namespace Barotrauma.Networking
|
|||||||
}
|
}
|
||||||
|
|
||||||
ID++;
|
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;
|
if (events.Count == 0) return;
|
||||||
|
|
||||||
List<NetEntityEvent> eventsToSync = new List<NetEntityEvent>();
|
List<NetEntityEvent> eventsToSync = new List<NetEntityEvent>();
|
||||||
for (int i = events.Count - 1; i >= 0 && events[i].ID > thisClient.LastSentEntityEventID; i--)
|
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]);
|
eventsToSync.Add(events[i]);
|
||||||
}
|
}
|
||||||
if (eventsToSync.Count == 0) return;
|
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);
|
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)
|
protected override void WriteEvent(NetBuffer buffer, NetEntityEvent entityEvent, Client recipient = null)
|
||||||
{
|
{
|
||||||
var clientEvent = entityEvent as ClientEntityEvent;
|
var clientEvent = entityEvent as ClientEntityEvent;
|
||||||
@@ -65,6 +101,7 @@ namespace Barotrauma.Networking
|
|||||||
public void Clear()
|
public void Clear()
|
||||||
{
|
{
|
||||||
events.Clear();
|
events.Clear();
|
||||||
|
eventLastSent.Clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,15 +10,14 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
abstract class NetEntityEventManager
|
abstract class NetEntityEventManager
|
||||||
{
|
{
|
||||||
|
const int MaxEventBufferLength = 1024;
|
||||||
const int MaxEventsPerWrite = 64;
|
const int MaxEventsPerWrite = 64;
|
||||||
|
|
||||||
public UInt32 LastReceivedEntityEventID
|
//public UInt32 LastReceivedEntityEventID
|
||||||
{
|
//{
|
||||||
get { return lastReceivedEntityEventID; }
|
// get { return lastReceivedEntityEventID; }
|
||||||
}
|
//}
|
||||||
|
|
||||||
private UInt32 lastReceivedEntityEventID;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Write the events to the outgoing message. The recipient parameter is only needed for ServerEntityEventManager
|
/// Write the events to the outgoing message. The recipient parameter is only needed for ServerEntityEventManager
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -30,8 +29,6 @@ namespace Barotrauma.Networking
|
|||||||
eventsToSync.RemoveRange(MaxEventsPerWrite, eventsToSync.Count - MaxEventsPerWrite);
|
eventsToSync.RemoveRange(MaxEventsPerWrite, eventsToSync.Count - MaxEventsPerWrite);
|
||||||
}
|
}
|
||||||
|
|
||||||
msg.Write((byte)ServerNetObject.ENTITY_STATE);
|
|
||||||
|
|
||||||
msg.Write(eventsToSync[0].ID);
|
msg.Write(eventsToSync[0].ID);
|
||||||
msg.Write((byte)eventsToSync.Count);
|
msg.Write((byte)eventsToSync.Count);
|
||||||
|
|
||||||
@@ -55,7 +52,7 @@ namespace Barotrauma.Networking
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Read the events from the message, ignoring ones we've already received
|
/// Read the events from the message, ignoring ones we've already received
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void Read(NetIncomingMessage msg, float sendingTime)
|
protected void Read(NetIncomingMessage msg, float sendingTime, ref UInt32 lastReceivedID)
|
||||||
{
|
{
|
||||||
UInt32 firstEventID = msg.ReadUInt32();
|
UInt32 firstEventID = msg.ReadUInt32();
|
||||||
int eventCount = msg.ReadByte();
|
int eventCount = msg.ReadByte();
|
||||||
@@ -69,7 +66,7 @@ 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+1 || entity == null)
|
if (thisEventID != lastReceivedID + 1 || entity == null)
|
||||||
{
|
{
|
||||||
DebugConsole.NewMessage("received msg "+thisEventID, Microsoft.Xna.Framework.Color.Red);
|
DebugConsole.NewMessage("received msg "+thisEventID, Microsoft.Xna.Framework.Color.Red);
|
||||||
msg.Position += msgLength * 8;
|
msg.Position += msgLength * 8;
|
||||||
@@ -77,8 +74,8 @@ namespace Barotrauma.Networking
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
DebugConsole.NewMessage("received msg "+thisEventID, Microsoft.Xna.Framework.Color.Green);
|
DebugConsole.NewMessage("received msg "+thisEventID, Microsoft.Xna.Framework.Color.Green);
|
||||||
|
lastReceivedID++;
|
||||||
ReadEvent(msg, entity, sendingTime);
|
ReadEvent(msg, entity, sendingTime);
|
||||||
lastReceivedEntityEventID = thisEventID;
|
|
||||||
}
|
}
|
||||||
msg.ReadPadBits();
|
msg.ReadPadBits();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ namespace Barotrauma.Networking
|
|||||||
client.entityEventLastSent[entityEvent.ID] = (float)NetTime.Now;
|
client.entityEventLastSent[entityEvent.ID] = (float)NetTime.Now;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
msg.Write((byte)ServerNetObject.ENTITY_STATE);
|
||||||
Write(msg, eventsToSync, client);
|
Write(msg, eventsToSync, client);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,6 +81,11 @@ namespace Barotrauma.Networking
|
|||||||
clientEntity.ServerRead(buffer, sender);
|
clientEntity.ServerRead(buffer, sender);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Read(NetIncomingMessage msg, Client client)
|
||||||
|
{
|
||||||
|
base.Read(msg, 0.0f, ref client.lastSentEntityEventID);
|
||||||
|
}
|
||||||
|
|
||||||
public void Clear()
|
public void Clear()
|
||||||
{
|
{
|
||||||
events.Clear();
|
events.Clear();
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ namespace Barotrauma.Networking
|
|||||||
CHAT_MESSAGE, //also self-explanatory
|
CHAT_MESSAGE, //also self-explanatory
|
||||||
VOTE, //you get the idea
|
VOTE, //you get the idea
|
||||||
CHARACTER_INPUT,
|
CHARACTER_INPUT,
|
||||||
ITEM_INTERACTION
|
ITEM_INTERACTION,
|
||||||
|
ENTITY_STATE
|
||||||
}
|
}
|
||||||
|
|
||||||
enum ServerPacketHeader
|
enum ServerPacketHeader
|
||||||
|
|||||||
Reference in New Issue
Block a user