Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a9e6a3e853 | |||
| c74ce0f00f | |||
| b39bd8bd0a | |||
| 12b80c546c |
@@ -49,7 +49,7 @@ jobs:
|
|||||||
- name: Setup dotnet
|
- name: Setup dotnet
|
||||||
uses: actions/setup-dotnet@v1
|
uses: actions/setup-dotnet@v1
|
||||||
with:
|
with:
|
||||||
dotnet-version: 7.0.x
|
dotnet-version: 8.0.x
|
||||||
- name: Build
|
- name: Build
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -39,9 +39,9 @@ namespace Ragon.Client
|
|||||||
|
|
||||||
if (player != null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
player.UserData.Read(reader);
|
var changes = player.UserData.Read(reader);
|
||||||
|
|
||||||
_listenerList.OnPlayerUserData(player);
|
_listenerList.OnPlayerUserData(player, changes);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,8 +31,8 @@ namespace Ragon.Client
|
|||||||
|
|
||||||
public void Handle(RagonBuffer reader)
|
public void Handle(RagonBuffer reader)
|
||||||
{
|
{
|
||||||
_client.Room?.HandleUserData(reader);
|
var changes = _client.Room?.UserData.Read(reader);
|
||||||
_listenerList.OnRoomUserData();
|
_listenerList.OnRoomUserData(changes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -22,6 +22,6 @@ public interface IUserData
|
|||||||
{
|
{
|
||||||
public byte[] this[string key] { get; set; }
|
public byte[] this[string key] { get; set; }
|
||||||
bool Dirty { get; }
|
bool Dirty { get; }
|
||||||
void Read(RagonBuffer buffer);
|
IReadOnlyList<string> Read(RagonBuffer buffer);
|
||||||
void Write(RagonBuffer buffer);
|
void Write(RagonBuffer buffer);
|
||||||
}
|
}
|
||||||
@@ -18,5 +18,5 @@ namespace Ragon.Client;
|
|||||||
|
|
||||||
public interface IRagonPlayerUserDataListener
|
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 interface IRagonRoomUserDataListener
|
||||||
{
|
{
|
||||||
public void OnUserDataUpdated(RagonClient client);
|
public void OnUserDataUpdated(RagonClient client, IReadOnlyList<string> changes);
|
||||||
}
|
}
|
||||||
@@ -307,16 +307,16 @@ namespace Ragon.Client
|
|||||||
listListener.OnRoomListUpdate(roomInfos);
|
listListener.OnRoomListUpdate(roomInfos);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnRoomUserData()
|
public void OnRoomUserData(IReadOnlyList<string> changes)
|
||||||
{
|
{
|
||||||
foreach (var userDataListener in _roomUserDataListeners)
|
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)
|
foreach(var playerUserDataListener in _playerUserDataListeners)
|
||||||
playerUserDataListener.OnPlayerUserDataUpdated(_client, player);
|
playerUserDataListener.OnPlayerUserDataUpdated(_client, player, changes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -27,44 +27,80 @@ namespace Ragon.Client
|
|||||||
{
|
{
|
||||||
_properties[key] = value;
|
_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();
|
private readonly Dictionary<string, byte[]> _properties = new();
|
||||||
|
|
||||||
public RagonUserData()
|
public RagonUserData()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Read(RagonBuffer buffer)
|
public IReadOnlyList<string> Read(RagonBuffer buffer)
|
||||||
{
|
{
|
||||||
_properties.Clear();
|
|
||||||
|
|
||||||
var len = buffer.ReadUShort();
|
var len = buffer.ReadUShort();
|
||||||
|
var changes = new List<string>(len);
|
||||||
for (int i = 0; i < len; i++)
|
for (int i = 0; i < len; i++)
|
||||||
{
|
{
|
||||||
var key = buffer.ReadString();
|
var key = buffer.ReadString();
|
||||||
var valueSize = buffer.ReadUShort();
|
var valueSize = buffer.ReadUShort();
|
||||||
|
if (valueSize > 0)
|
||||||
|
{
|
||||||
var value = buffer.ReadBytes(valueSize);
|
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)
|
public void Write(RagonBuffer buffer)
|
||||||
{
|
{
|
||||||
buffer.WriteUShort((ushort)_properties.Count);
|
buffer.WriteUShort((ushort)_localChanges.Count);
|
||||||
foreach (var property in _properties)
|
foreach (var propertyChanged in _localChanges)
|
||||||
{
|
{
|
||||||
buffer.WriteString(property.Key);
|
buffer.WriteString(propertyChanged);
|
||||||
buffer.WriteUShort((ushort) property.Value.Length);
|
if (_properties.TryGetValue(propertyChanged, out var property))
|
||||||
buffer.WriteBytes(property.Value);
|
{
|
||||||
|
buffer.WriteUShort((ushort) property.Length);
|
||||||
|
buffer.WriteBytes(property);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buffer.WriteUShort(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_dirty = false;
|
_localChanges.Clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -37,29 +37,31 @@ public class RagonUserDataReadOnly : IUserData
|
|||||||
|
|
||||||
public void Write(RagonBuffer buffer)
|
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 IReadOnlyList<string> Read(RagonBuffer buffer)
|
||||||
}
|
|
||||||
|
|
||||||
public void Read(RagonBuffer buffer)
|
|
||||||
{
|
{
|
||||||
_properties.Clear();
|
|
||||||
|
|
||||||
var len = buffer.ReadUShort();
|
var len = buffer.ReadUShort();
|
||||||
|
var changes = new List<string>(len);
|
||||||
for (int i = 0; i < len; i++)
|
for (int i = 0; i < len; i++)
|
||||||
{
|
{
|
||||||
var key = buffer.ReadString();
|
var key = buffer.ReadString();
|
||||||
var valueSize = buffer.ReadUShort();
|
var valueSize = buffer.ReadUShort();
|
||||||
|
if (valueSize > 0)
|
||||||
|
{
|
||||||
var value = buffer.ReadBytes(valueSize);
|
var value = buffer.ReadBytes(valueSize);
|
||||||
|
|
||||||
_properties[key] = value;
|
_properties[key] = value;
|
||||||
}
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_properties.Remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
changes.Add(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return changes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<RootNamespace>Ragon.Relay</RootNamespace>
|
<RootNamespace>Ragon.Relay</RootNamespace>
|
||||||
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||||
|
|||||||
Reference in New Issue
Block a user