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:
@@ -15,7 +15,10 @@ namespace Barotrauma.Networking
|
||||
|
||||
private GameClient thisClient;
|
||||
|
||||
public ClientEntityEventManager(GameClient client) { }
|
||||
public ClientEntityEventManager(GameClient client)
|
||||
{
|
||||
events = new List<ClientEntityEvent>();
|
||||
}
|
||||
|
||||
public void CreateEvent(IClientSerializable entity)
|
||||
{
|
||||
@@ -31,10 +34,16 @@ namespace Barotrauma.Networking
|
||||
|
||||
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;
|
||||
|
||||
Write(msg, eventsToSync.Cast<NetEntityEvent>().ToList());
|
||||
Write(msg, eventsToSync);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
var clientEntity = entity as IClientSerializable;
|
||||
if (clientEntity == null) return;
|
||||
var serverEntity = entity as IServerSerializable;
|
||||
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 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)
|
||||
{
|
||||
this.ID = id;
|
||||
this.Entity = entity as Entity;
|
||||
}
|
||||
|
||||
public void SetData(object[] data)
|
||||
{
|
||||
this.Data = data;
|
||||
}
|
||||
}
|
||||
|
||||
class ServerEntityEvent : NetEntityEvent
|
||||
@@ -31,7 +40,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
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)
|
||||
{
|
||||
serializable.ClientWrite(msg);
|
||||
serializable.ClientWrite(msg, Data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,11 @@ namespace Barotrauma.Networking
|
||||
{
|
||||
const int MaxEventsPerWrite = 255;
|
||||
|
||||
public UInt32 LastReceivedEntityEventID
|
||||
{
|
||||
get { return lastReceivedEntityEventID; }
|
||||
}
|
||||
|
||||
private UInt32 lastReceivedEntityEventID;
|
||||
|
||||
/// <summary>
|
||||
@@ -62,17 +67,20 @@ namespace Barotrauma.Networking
|
||||
byte msgLength = msg.ReadByte();
|
||||
|
||||
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 || entity == null)
|
||||
if (thisEventID != lastReceivedEntityEventID+1 || entity == null)
|
||||
{
|
||||
DebugConsole.NewMessage("received msg "+thisEventID, Microsoft.Xna.Framework.Color.Red);
|
||||
msg.Position += msgLength * 8;
|
||||
}
|
||||
else
|
||||
{
|
||||
DebugConsole.NewMessage("received msg "+thisEventID, Microsoft.Xna.Framework.Color.Green);
|
||||
ReadEvent(msg, entity, sendingTime);
|
||||
lastReceivedEntityEventID = thisEventID;
|
||||
}
|
||||
msg.ReadPadBits();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,9 +13,12 @@ namespace Barotrauma.Networking
|
||||
|
||||
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))
|
||||
{
|
||||
@@ -24,7 +27,10 @@ namespace Barotrauma.Networking
|
||||
}
|
||||
|
||||
ID++;
|
||||
events.Add(new ServerEntityEvent(entity, ID));
|
||||
|
||||
var newEvent = new ServerEntityEvent(entity, ID);
|
||||
if (extraData != null) newEvent.SetData(extraData);
|
||||
events.Add(newEvent);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -32,10 +38,16 @@ namespace Barotrauma.Networking
|
||||
/// </summary>
|
||||
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;
|
||||
|
||||
Write(msg, eventsToSync.Cast<NetEntityEvent>().ToList(), client);
|
||||
Write(msg, eventsToSync, client);
|
||||
}
|
||||
|
||||
protected override void WriteEvent(NetBuffer buffer, NetEntityEvent entityEvent, Client recipient = null)
|
||||
@@ -53,5 +65,10 @@ namespace Barotrauma.Networking
|
||||
|
||||
clientEntity.ServerRead(buffer, sender);
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
events.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user