feat: Room Properties and Player Properties

This commit is contained in:
2024-05-09 21:26:32 +03:00
parent c74ce0f00f
commit a9e6a3e853
8 changed files with 82 additions and 44 deletions
@@ -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;
}
@@ -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);
}
}
}
+1 -1
View File
@@ -22,6 +22,6 @@ public interface IUserData
{
public byte[] this[string key] { get; set; }
bool Dirty { get; }
void Read(RagonBuffer buffer);
IReadOnlyList<string> Read(RagonBuffer buffer);
void Write(RagonBuffer buffer);
}
@@ -18,5 +18,5 @@ namespace Ragon.Client;
public interface IRagonPlayerUserDataListener
{
void OnPlayerUserDataUpdated(RagonClient client, RagonPlayer player);
void OnPlayerUserDataUpdated(RagonClient client, RagonPlayer player, IReadOnlyList<string> changes);
}
@@ -2,5 +2,5 @@ namespace Ragon.Client;
public interface IRagonRoomUserDataListener
{
public void OnUserDataUpdated(RagonClient client);
public void OnUserDataUpdated(RagonClient client, IReadOnlyList<string> changes);
}
+4 -4
View File
@@ -307,16 +307,16 @@ namespace Ragon.Client
listListener.OnRoomListUpdate(roomInfos);
}
public void OnRoomUserData()
public void OnRoomUserData(IReadOnlyList<string> changes)
{
foreach (var userDataListener in _roomUserDataListeners)
userDataListener.OnUserDataUpdated(_client);
userDataListener.OnUserDataUpdated(_client, changes);
}
public void OnPlayerUserData(RagonPlayer player)
public void OnPlayerUserData(RagonPlayer player, IReadOnlyList<string> changes)
{
foreach(var playerUserDataListener in _playerUserDataListeners)
playerUserDataListener.OnPlayerUserDataUpdated(_client, player);
playerUserDataListener.OnPlayerUserDataUpdated(_client, player, changes);
}
}
}
+50 -14
View File
@@ -27,44 +27,80 @@ namespace Ragon.Client
{
_properties[key] = value;
_dirty = true;
if (!_changesCache.ContainsKey(key))
{
_localChanges.Add(key);
_changesCache.Add(key, true);
}
}
}
public bool Dirty => _dirty;
private bool _dirty = false;
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 readonly List<string> _localChanges = new ();
private readonly Dictionary<string, bool> _changesCache = new();
private readonly Dictionary<string, byte[]> _properties = new();
public RagonUserData()
{
}
public void Read(RagonBuffer buffer)
public IReadOnlyList<string> Read(RagonBuffer buffer)
{
_properties.Clear();
var len = buffer.ReadUShort();
var changes = new List<string>(len);
for (int i = 0; i < len; i++)
{
var key = buffer.ReadString();
var valueSize = buffer.ReadUShort();
var value = buffer.ReadBytes(valueSize);
if (valueSize > 0)
{
var value = buffer.ReadBytes(valueSize);
_properties[key] = value;
_properties[key] = value;
}
else
{
_properties.Remove(key);
}
changes.Add(key);
}
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();
}
}
}
+15 -13
View File
@@ -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<string> Read(RagonBuffer buffer)
{
_properties.Clear();
var len = buffer.ReadUShort();
var changes = new List<string>(len);
for (int i = 0; i < len; i++)
{
var key = buffer.ReadString();
var valueSize = buffer.ReadUShort();
var value = buffer.ReadBytes(valueSize);
if (valueSize > 0)
{
var value = buffer.ReadBytes(valueSize);
_properties[key] = value;
_properties[key] = value;
}
else
{
_properties.Remove(key);
}
changes.Add(key);
}
return changes;
}
}