Compare commits

...

4 Commits

Author SHA1 Message Date
edmand46 a9e6a3e853 feat: Room Properties and Player Properties 2024-05-09 21:26:32 +03:00
edmand46 c74ce0f00f Merge pull request #16 from edmand46/feat/room_property
Feat Room/Player Properties
2024-05-09 10:55:54 +03:00
edmand46 b39bd8bd0a fix: updated workflows 2024-04-14 19:23:08 +03:00
edmand46 12b80c546c fix: updated workflows 2024-04-14 19:14:57 +03:00
10 changed files with 84 additions and 46 deletions
+1 -1
View File
@@ -49,7 +49,7 @@ jobs:
- name: Setup dotnet
uses: actions/setup-dotnet@v1
with:
dotnet-version: 7.0.x
dotnet-version: 8.0.x
- name: Build
shell: bash
run: |
@@ -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;
}
}
+1 -1
View File
@@ -3,7 +3,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<RootNamespace>Ragon.Relay</RootNamespace>
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">