diff --git a/BoneSync/BoneSync.csproj b/BoneSync/BoneSync.csproj index 17f46e4..db495eb 100644 --- a/BoneSync/BoneSync.csproj +++ b/BoneSync/BoneSync.csproj @@ -84,9 +84,10 @@ + - + diff --git a/BoneSync/Networking/ByteEncoder.cs b/BoneSync/Networking/ByteEncoder.cs index 114944e..68628b7 100644 --- a/BoneSync/Networking/ByteEncoder.cs +++ b/BoneSync/Networking/ByteEncoder.cs @@ -129,7 +129,7 @@ namespace BoneSync.Networking WriteBytes(BitConverter.GetBytes(value)); } - public ulong ReadUlong() + public ulong ReadULong() { return BitConverter.ToUInt64(ReadBytes(sizeof(ulong)), 0); } diff --git a/BoneSync/Networking/Messages/DiscardSyncableMessage.cs b/BoneSync/Networking/Messages/DiscardSyncableMessage.cs new file mode 100644 index 0000000..8dbf470 --- /dev/null +++ b/BoneSync/Networking/Messages/DiscardSyncableMessage.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using BoneSync.Sync; +using BoneSync.Sync.Components; + +namespace BoneSync.Networking.Messages +{ + public struct DiscardSyncableMessageData + { + public ushort syncableId; + } + [PacketType(PacketType.DiscardSyncable), PacketReliability(PacketReliability.ReliableFast)] + internal class DiscardSyncableMessage : NetworkMessage + { + private DiscardSyncableMessageData _data; + + public DiscardSyncableMessage(DiscardSyncableMessageData discardSyncableMessageData) + { + _data = discardSyncableMessageData; + byteEncoder.WriteUShort(_data.syncableId); + } + + public DiscardSyncableMessage(Packet packet) + { + byteEncoder.WriteBytes(packet.Data); + _data.syncableId = byteEncoder.ReadUShort(); + } + + public override void Execute() + { + Syncable syncable = ObjectSyncCache.GetSyncable(_data.syncableId); + if (syncable != null) + { + syncable.DiscardSyncable(true); + } + } + + + } +} diff --git a/BoneSync/Networking/Messages/OnwershipTransferMessage.cs b/BoneSync/Networking/Messages/OwnershipTransferMessage.cs similarity index 73% rename from BoneSync/Networking/Messages/OnwershipTransferMessage.cs rename to BoneSync/Networking/Messages/OwnershipTransferMessage.cs index 43d6986..66ff587 100644 --- a/BoneSync/Networking/Messages/OnwershipTransferMessage.cs +++ b/BoneSync/Networking/Messages/OwnershipTransferMessage.cs @@ -7,7 +7,7 @@ using BoneSync.Sync; namespace BoneSync.Networking.Messages { - public struct OnwershipTransferMessageData + public struct OwnershipTransferMessageData { public ushort SyncId; public bool force; @@ -15,10 +15,10 @@ namespace BoneSync.Networking.Messages } [PacketType(PacketType.ObjectOwnership), PacketReliability(PacketReliability.ReliableFast)] - internal class OnwershipTransferMessage : NetworkMessage + internal class OwnershipTransferMessage : NetworkMessage { - private OnwershipTransferMessageData Data; - public OnwershipTransferMessage(OnwershipTransferMessageData data) + private OwnershipTransferMessageData Data; + public OwnershipTransferMessage(OwnershipTransferMessageData data) { Data = data; byteEncoder.WriteUShort(Data.SyncId); @@ -26,11 +26,11 @@ namespace BoneSync.Networking.Messages byteEncoder.WriteBool(Data.force); } - public OnwershipTransferMessage(Packet packet) + public OwnershipTransferMessage(Packet packet) { byteEncoder.WriteBytes(packet.Data); Data.SyncId = byteEncoder.ReadUShort(); - Data.NewOwnerId = byteEncoder.ReadUlong(); + Data.NewOwnerId = byteEncoder.ReadULong(); Data.force = byteEncoder.ReadBool(); } diff --git a/BoneSync/Networking/Messages/RegisterSyncableMessage.cs b/BoneSync/Networking/Messages/RegisterSyncableMessage.cs index 48faaba..4b217d8 100644 --- a/BoneSync/Networking/Messages/RegisterSyncableMessage.cs +++ b/BoneSync/Networking/Messages/RegisterSyncableMessage.cs @@ -58,7 +58,7 @@ namespace BoneSync.Networking.Messages { byteEncoder.WriteBytes(packet.Data); _info.type = (RegisterSyncType)byteEncoder.ReadByte(); - _info.ownerId = byteEncoder.ReadUlong(); + _info.ownerId = byteEncoder.ReadULong(); _info.id = byteEncoder.ReadUShort(); _info.callbackId = byteEncoder.ReadUShort(); switch (_info.type) diff --git a/BoneSync/Networking/Packet.cs b/BoneSync/Networking/Packet.cs index a63ac39..aa7620b 100644 --- a/BoneSync/Networking/Packet.cs +++ b/BoneSync/Networking/Packet.cs @@ -92,9 +92,9 @@ namespace BoneSync.Networking byte packetType = byteEncoder.ReadByte(); byte reliability = byteEncoder.ReadByte(); - ulong id = byteEncoder.ReadUlong(); - ulong senderId = byteEncoder.ReadUlong(); - ulong receiverId = byteEncoder.ReadUlong(); + ulong id = byteEncoder.ReadULong(); + ulong senderId = byteEncoder.ReadULong(); + ulong receiverId = byteEncoder.ReadULong(); PacketInfo packetInfo = new PacketInfo(senderId, receiverId, (PacketType)packetType, (PacketReliability)reliability, id); return new Packet(packetInfo, byteEncoder.ToArray()); diff --git a/BoneSync/Networking/PacketTypes.cs b/BoneSync/Networking/PacketTypes.cs index ef89bd3..18c1843 100644 --- a/BoneSync/Networking/PacketTypes.cs +++ b/BoneSync/Networking/PacketTypes.cs @@ -15,5 +15,6 @@ namespace BoneSync.Networking ObjectSync = 4, ObjectEvent = 5, ObjectOwnership = 6, + DiscardSyncable = 7, } } diff --git a/BoneSync/Sync/Components/SyncableBase.cs b/BoneSync/Sync/Components/SyncableBase.cs index 0c71a9f..68e60b2 100644 --- a/BoneSync/Sync/Components/SyncableBase.cs +++ b/BoneSync/Sync/Components/SyncableBase.cs @@ -167,7 +167,15 @@ namespace BoneSync.Sync.Components if (Registered) { MelonLogger.Warning("Discarding registered syncable: " + transform.GetPath() + " force: " + force); - if (!force) return; + + bool isowner = isOwner; + + if (isowner) + { + _SendDiscard(); // owner sends discard message + } + + if (!isowner && !force) return; // only owner can discard } syncablesCache.Remove(gameObject); ObjectSyncCache.RemoveSyncable(this); diff --git a/BoneSync/Sync/Components/SyncableNetworking.cs b/BoneSync/Sync/Components/SyncableNetworking.cs index 3c432d3..3bb82a7 100644 --- a/BoneSync/Sync/Components/SyncableNetworking.cs +++ b/BoneSync/Sync/Components/SyncableNetworking.cs @@ -56,19 +56,28 @@ namespace BoneSync.Sync.Components SetSyncId(ObjectSync.SendRegisterSyncableMessage(this)); } + private void _SendDiscard() + { + DiscardSyncableMessageData discardSyncableMessageData = new DiscardSyncableMessageData() + { + syncableId = _syncId + }; + DiscardSyncableMessage discardSyncableMessage = new DiscardSyncableMessage(discardSyncableMessageData); + discardSyncableMessage.Broadcast(); + } public void OnOwnershipTransferRequest(ulong newOwnerId) { //MelonLogger.Msg("Ownership transfer request for " + _syncId + " to " + newOwnerId); if (isOwner && !IsHolding()) { MelonLogger.Msg("Sending ownership transfer for " + _syncId + " to " + newOwnerId); - OnwershipTransferMessageData data = new OnwershipTransferMessageData() + OwnershipTransferMessageData data = new OwnershipTransferMessageData() { SyncId = _syncId, NewOwnerId = newOwnerId, force = true }; - OnwershipTransferMessage message = new OnwershipTransferMessage(data); + OwnershipTransferMessage message = new OwnershipTransferMessage(data); message.Broadcast(); SetOwner(newOwnerId); } @@ -79,13 +88,13 @@ namespace BoneSync.Sync.Components if (!isOwner) { MelonLogger.Msg("Attempting to become owner of " + _syncId); - OnwershipTransferMessageData data = new OnwershipTransferMessageData() + OwnershipTransferMessageData data = new OwnershipTransferMessageData() { SyncId = _syncId, NewOwnerId = BoneSync.lobby.GetLocalId(), force = false }; - OnwershipTransferMessage message = new OnwershipTransferMessage(data); + OwnershipTransferMessage message = new OwnershipTransferMessage(data); message.Broadcast(); } }