Skip to content
Merged
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,69 +7,61 @@ internal struct DestroyObjectMessage : INetworkMessage, INetworkSerializeByMemcp
{
private const int k_OptimizeDestroyObjectMessage = 1;
private const int k_AllowDestroyGameInPlaced = 2;

public int Version => k_AllowDestroyGameInPlaced;

private const string k_Name = "DestroyObjectMessage";

public ulong NetworkObjectId;

private byte m_DestroyFlags;

internal int DeferredDespawnTick;
// Temporary until we make this a list
internal ulong TargetClientId;

internal bool IsDistributedAuthority;

internal bool IsTargetedDestroy
{
get => ByteUtility.GetBit(m_DestroyFlags, 0);
private const byte k_IsTargetedDestroy = 0x01;
private const byte k_IsDeferredDespawn = 0x02;
private const byte k_DestroyGameObject = 0x04;

set => ByteUtility.SetBit(ref m_DestroyFlags, 0, value);
}

private bool IsDeferredDespawn
{
get => ByteUtility.GetBit(m_DestroyFlags, 1);

set => ByteUtility.SetBit(ref m_DestroyFlags, 1, value);
}
internal bool IsTargetedDestroy;
private bool m_IsDeferredDespawn;

/// <summary>
/// Used to communicate whether to destroy the associated game object.
/// Should be false if the object is InScenePlaced and true otherwise
/// </summary>
public bool DestroyGameObject
{
get => ByteUtility.GetBit(m_DestroyFlags, 2);

set => ByteUtility.SetBit(ref m_DestroyFlags, 2, value);
}
public bool DestroyGameObject;

public void Serialize(FastBufferWriter writer, int targetVersion)
{
// Set deferred despawn flag
IsDeferredDespawn = DeferredDespawnTick > 0;
m_IsDeferredDespawn = DeferredDespawnTick > 0;

uint bitset = 0;
if (IsTargetedDestroy) { bitset |= k_IsTargetedDestroy; }
if (m_IsDeferredDespawn) { bitset |= k_IsDeferredDespawn; }
if (DestroyGameObject) { bitset |= k_DestroyGameObject; }

BytePacker.WriteValueBitPacked(writer, NetworkObjectId);

if (IsDistributedAuthority)
{
writer.WriteByteSafe(m_DestroyFlags);
writer.WriteValueSafe(bitset);

if (IsTargetedDestroy)
{
BytePacker.WriteValueBitPacked(writer, TargetClientId);
}

if (targetVersion < k_OptimizeDestroyObjectMessage || IsDeferredDespawn)
if (targetVersion < k_OptimizeDestroyObjectMessage || m_IsDeferredDespawn)
{
BytePacker.WriteValueBitPacked(writer, DeferredDespawnTick);
}
}
else if (targetVersion >= k_AllowDestroyGameInPlaced)
{
writer.WriteByteSafe(m_DestroyFlags);
writer.WriteValueSafe(bitset);
}

if (targetVersion < k_OptimizeDestroyObjectMessage)
Expand All @@ -89,20 +81,27 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int
ByteUnpacker.ReadValueBitPacked(reader, out NetworkObjectId);
if (networkManager.DistributedAuthorityMode)
{
reader.ReadByteSafe(out m_DestroyFlags);
reader.ReadByteSafe(out byte bitset);
IsTargetedDestroy = (bitset & k_IsTargetedDestroy) != 0;
m_IsDeferredDespawn = (bitset & k_IsDeferredDespawn) != 0;
DestroyGameObject = (bitset & k_DestroyGameObject) != 0;

if (IsTargetedDestroy)
{
ByteUnpacker.ReadValueBitPacked(reader, out TargetClientId);
}

if (receivedMessageVersion < k_OptimizeDestroyObjectMessage || IsDeferredDespawn)
if (receivedMessageVersion < k_OptimizeDestroyObjectMessage || m_IsDeferredDespawn)
{
ByteUnpacker.ReadValueBitPacked(reader, out DeferredDespawnTick);
}
}
else if (receivedMessageVersion >= k_AllowDestroyGameInPlaced)
{
reader.ReadByteSafe(out m_DestroyFlags);
reader.ReadByteSafe(out byte bitset);
IsTargetedDestroy = (bitset & k_IsTargetedDestroy) != 0;
m_IsDeferredDespawn = (bitset & k_IsDeferredDespawn) != 0;
DestroyGameObject = (bitset & k_DestroyGameObject) != 0;
}

if (receivedMessageVersion < k_OptimizeDestroyObjectMessage)
Expand Down
Loading