From a9e6a3e853077f58f80ec4f4ea44dfcf82495d0d Mon Sep 17 00:00:00 2001 From: edmand46 Date: Thu, 9 May 2024 21:26:32 +0300 Subject: [PATCH] feat: Room Properties and Player Properties --- .../Sources/Handler/PlayerUserDataHandler.cs | 4 +- .../Sources/Handler/RoomUserDataHandler.cs | 4 +- Ragon.Client/Sources/IUserData.cs | 2 +- .../Listener/IRagonPlayerUserDataListener.cs | 2 +- .../Listener/IRagonRoomUserDataListener.cs | 2 +- Ragon.Client/Sources/RagonListenerList.cs | 8 +-- Ragon.Client/Sources/RagonUserData.cs | 70 ++++++++++++++----- Ragon.Client/Sources/RagonUserDataReadOnly.cs | 34 ++++----- 8 files changed, 82 insertions(+), 44 deletions(-) diff --git a/Ragon.Client/Sources/Handler/PlayerUserDataHandler.cs b/Ragon.Client/Sources/Handler/PlayerUserDataHandler.cs index 2fdb8c4..dbe44bc 100644 --- a/Ragon.Client/Sources/Handler/PlayerUserDataHandler.cs +++ b/Ragon.Client/Sources/Handler/PlayerUserDataHandler.cs @@ -39,9 +39,9 @@ namespace Ragon.Client if (player != null) { - player.UserData.Read(reader); + var changes = player.UserData.Read(reader); - _listenerList.OnPlayerUserData(player); + _listenerList.OnPlayerUserData(player, changes); return; } diff --git a/Ragon.Client/Sources/Handler/RoomUserDataHandler.cs b/Ragon.Client/Sources/Handler/RoomUserDataHandler.cs index 8a8b7dc..18f9501 100644 --- a/Ragon.Client/Sources/Handler/RoomUserDataHandler.cs +++ b/Ragon.Client/Sources/Handler/RoomUserDataHandler.cs @@ -31,8 +31,8 @@ namespace Ragon.Client public void Handle(RagonBuffer reader) { - _client.Room?.HandleUserData(reader); - _listenerList.OnRoomUserData(); + var changes = _client.Room?.UserData.Read(reader); + _listenerList.OnRoomUserData(changes); } } } \ No newline at end of file diff --git a/Ragon.Client/Sources/IUserData.cs b/Ragon.Client/Sources/IUserData.cs index 184532e..07a6070 100644 --- a/Ragon.Client/Sources/IUserData.cs +++ b/Ragon.Client/Sources/IUserData.cs @@ -22,6 +22,6 @@ public interface IUserData { public byte[] this[string key] { get; set; } bool Dirty { get; } - void Read(RagonBuffer buffer); + IReadOnlyList Read(RagonBuffer buffer); void Write(RagonBuffer buffer); } \ No newline at end of file diff --git a/Ragon.Client/Sources/Listener/IRagonPlayerUserDataListener.cs b/Ragon.Client/Sources/Listener/IRagonPlayerUserDataListener.cs index a0d4f77..a8d1dfd 100644 --- a/Ragon.Client/Sources/Listener/IRagonPlayerUserDataListener.cs +++ b/Ragon.Client/Sources/Listener/IRagonPlayerUserDataListener.cs @@ -18,5 +18,5 @@ namespace Ragon.Client; public interface IRagonPlayerUserDataListener { - void OnPlayerUserDataUpdated(RagonClient client, RagonPlayer player); + void OnPlayerUserDataUpdated(RagonClient client, RagonPlayer player, IReadOnlyList changes); } \ No newline at end of file diff --git a/Ragon.Client/Sources/Listener/IRagonRoomUserDataListener.cs b/Ragon.Client/Sources/Listener/IRagonRoomUserDataListener.cs index 04b62bd..8f8297f 100644 --- a/Ragon.Client/Sources/Listener/IRagonRoomUserDataListener.cs +++ b/Ragon.Client/Sources/Listener/IRagonRoomUserDataListener.cs @@ -2,5 +2,5 @@ namespace Ragon.Client; public interface IRagonRoomUserDataListener { - public void OnUserDataUpdated(RagonClient client); + public void OnUserDataUpdated(RagonClient client, IReadOnlyList changes); } \ No newline at end of file diff --git a/Ragon.Client/Sources/RagonListenerList.cs b/Ragon.Client/Sources/RagonListenerList.cs index 83e87b1..9221c8d 100644 --- a/Ragon.Client/Sources/RagonListenerList.cs +++ b/Ragon.Client/Sources/RagonListenerList.cs @@ -307,16 +307,16 @@ namespace Ragon.Client listListener.OnRoomListUpdate(roomInfos); } - public void OnRoomUserData() + public void OnRoomUserData(IReadOnlyList changes) { foreach (var userDataListener in _roomUserDataListeners) - userDataListener.OnUserDataUpdated(_client); + userDataListener.OnUserDataUpdated(_client, changes); } - public void OnPlayerUserData(RagonPlayer player) + public void OnPlayerUserData(RagonPlayer player, IReadOnlyList changes) { foreach(var playerUserDataListener in _playerUserDataListeners) - playerUserDataListener.OnPlayerUserDataUpdated(_client, player); + playerUserDataListener.OnPlayerUserDataUpdated(_client, player, changes); } } } \ No newline at end of file diff --git a/Ragon.Client/Sources/RagonUserData.cs b/Ragon.Client/Sources/RagonUserData.cs index d51ae49..14eb7cc 100644 --- a/Ragon.Client/Sources/RagonUserData.cs +++ b/Ragon.Client/Sources/RagonUserData.cs @@ -26,45 +26,81 @@ namespace Ragon.Client set { _properties[key] = value; - - _dirty = true; + + if (!_changesCache.ContainsKey(key)) + { + _localChanges.Add(key); + _changesCache.Add(key, true); + } } } - public bool Dirty => _dirty; + + public void Remove(string key) + { + if (_properties.Remove(key)) + { + if (!_changesCache.ContainsKey(key)) + { + _localChanges.Add(key); + _changesCache.Add(key, true); + } + } + } + + public bool Dirty => _localChanges.Count > 0; - private bool _dirty = false; + private readonly List _localChanges = new (); + private readonly Dictionary _changesCache = new(); private readonly Dictionary _properties = new(); public RagonUserData() { + } - public void Read(RagonBuffer buffer) + public IReadOnlyList Read(RagonBuffer buffer) { - _properties.Clear(); - var len = buffer.ReadUShort(); + var changes = new List(len); for (int i = 0; i < len; i++) { var key = buffer.ReadString(); - var valueSize = buffer.ReadUShort(); - var value = buffer.ReadBytes(valueSize); + var valueSize = buffer.ReadUShort(); + if (valueSize > 0) + { + var value = buffer.ReadBytes(valueSize); + _properties[key] = value; + + } + else + { + _properties.Remove(key); + } + + changes.Add(key); + } - _properties[key] = value; - } + return changes; } public void Write(RagonBuffer buffer) { - buffer.WriteUShort((ushort)_properties.Count); - foreach (var property in _properties) + buffer.WriteUShort((ushort)_localChanges.Count); + foreach (var propertyChanged in _localChanges) { - buffer.WriteString(property.Key); - buffer.WriteUShort((ushort) property.Value.Length); - buffer.WriteBytes(property.Value); + buffer.WriteString(propertyChanged); + if (_properties.TryGetValue(propertyChanged, out var property)) + { + buffer.WriteUShort((ushort) property.Length); + buffer.WriteBytes(property); + } + else + { + buffer.WriteUShort(0); + } } - _dirty = false; + _localChanges.Clear(); } } } \ No newline at end of file diff --git a/Ragon.Client/Sources/RagonUserDataReadOnly.cs b/Ragon.Client/Sources/RagonUserDataReadOnly.cs index 110aa64..c09f617 100644 --- a/Ragon.Client/Sources/RagonUserDataReadOnly.cs +++ b/Ragon.Client/Sources/RagonUserDataReadOnly.cs @@ -37,29 +37,31 @@ public class RagonUserDataReadOnly : IUserData public void Write(RagonBuffer buffer) { - buffer.WriteUShort((ushort)_properties.Count); - foreach (var property in _properties) - { - buffer.WriteString(property.Key); - buffer.WriteUShort((ushort)property.Value.Length); - buffer.WriteBytes(property.Value); - } - - _dirty = false; + } - public void Read(RagonBuffer buffer) + public IReadOnlyList Read(RagonBuffer buffer) { - _properties.Clear(); - var len = buffer.ReadUShort(); + var changes = new List(len); for (int i = 0; i < len; i++) { var key = buffer.ReadString(); - var valueSize = buffer.ReadUShort(); - var value = buffer.ReadBytes(valueSize); - - _properties[key] = value; + var valueSize = buffer.ReadUShort(); + if (valueSize > 0) + { + var value = buffer.ReadBytes(valueSize); + _properties[key] = value; + + } + else + { + _properties.Remove(key); + } + + changes.Add(key); } + + return changes; } } \ No newline at end of file