using System;
///
/// Network sync package for EntityAliveSDXV4.
/// Serialises inventory, current weapon, and entity name from the server to all clients.
/// On the server, replicated flags are forwarded to all connected clients except the sender.
///
public class NetPackageEntityAliveSDXV4DataSync : NetPackage
{
// -------------------------------------------------------------------------
// Setup (server → clients)
// -------------------------------------------------------------------------
public NetPackageEntityAliveSDXV4DataSync Setup(EntityAliveSDXV4 entity, int _senderId, ushort _syncFlags)
{
senderId = _senderId;
entityId = entity.entityId;
syncFlags = _syncFlags;
using (PooledBinaryWriter pooledBinaryWriter = MemoryPools.poolBinaryWriter.AllocSync(false))
{
pooledBinaryWriter.SetBaseStream(entityData);
entity.WriteSyncData(pooledBinaryWriter, _syncFlags);
}
return this;
}
// -------------------------------------------------------------------------
// Destructor — returns pooled stream
// -------------------------------------------------------------------------
~NetPackageEntityAliveSDXV4DataSync()
{
MemoryPools.poolMemoryStream.FreeSync(entityData);
}
// -------------------------------------------------------------------------
// Serialisation
// -------------------------------------------------------------------------
public override void read(PooledBinaryReader _br)
{
senderId = _br.ReadInt32();
entityId = _br.ReadInt32();
syncFlags = _br.ReadUInt16();
int length = (int)_br.ReadUInt16();
StreamUtils.StreamCopy(_br.BaseStream, entityData, length, null, true);
}
public override void write(PooledBinaryWriter _bw)
{
base.write(_bw);
_bw.Write(senderId);
_bw.Write(entityId);
_bw.Write(syncFlags);
_bw.Write((ushort)entityData.Length);
entityData.WriteTo(_bw.BaseStream);
}
// -------------------------------------------------------------------------
// Processing
// -------------------------------------------------------------------------
public override void ProcessPackage(World _world, GameManager _callbacks)
{
if (_world == null) return;
var entity = _world.GetEntity(entityId) as EntityAliveSDXV4;
if (entity == null) return;
if (entityData.Length > 0L)
{
PooledExpandableMemoryStream stream = entityData;
lock (stream)
{
entityData.Position = 0L;
try
{
using (PooledBinaryReader pooledBinaryReader = MemoryPools.poolBinaryReader.AllocSync(false))
{
pooledBinaryReader.SetBaseStream(entityData);
entity.ReadSyncData(pooledBinaryReader, syncFlags, senderId);
}
}
catch (Exception e)
{
Log.Exception(e);
}
}
}
// Server forwards to all other clients.
if (SingletonMonoBehaviour.Instance.IsServer)
{
ushort replicatedFlags = entity.GetSyncFlagsReplicated(syncFlags);
if (replicatedFlags != 0)
{
SingletonMonoBehaviour.Instance.SendPackage(
NetPackageManager.GetPackage()
.Setup(entity, senderId, replicatedFlags),
false, -1, senderId);
}
}
}
public override int GetLength()
{
return (int)(12L + entityData.Length);
}
// -------------------------------------------------------------------------
// Fields
// -------------------------------------------------------------------------
private int senderId;
private int entityId;
private ushort syncFlags;
private readonly PooledExpandableMemoryStream entityData = MemoryPools.poolMemoryStream.AllocSync(true);
}