🐛 Remove listener inside callback

This commit is contained in:
2023-07-30 16:56:11 +03:00
parent c01b748031
commit 5199b5271b
8 changed files with 62 additions and 46 deletions
+2 -2
View File
@@ -12,11 +12,11 @@
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<DebugType>none</DebugType>
<OutputPath>/Users/edmand46/RagonProjects/ragon-oss-sdk/Assets/Ragon/Plugins/</OutputPath>
<OutputPath>/Users/edmand46/RagonProjects/ragon-oss-examples/Assets/Ragon/Plugins/</OutputPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<OutputPath>/Users/edmand46/RagonProjects/ragon-unity-sdk/Assets/Ragon/Runtime/Plugins</OutputPath>
<OutputPath>/Users/edmand46/RagonProjects/ragon-oss-examples/Assets/Ragon/Plugins/</OutputPath>
</PropertyGroup>
<ItemGroup>
@@ -57,6 +57,8 @@ namespace Ragon.Client
State = new RagonEntityState(this);
Type = type;
_spawnPayload = new RagonPayload(0);
_destroyPayload = new RagonPayload(0);
_sceneId = sceneId;
}
@@ -66,10 +66,7 @@ internal class SnapshotHandler : Handler
var entityId = buffer.ReadUShort();
var ownerPeerId = buffer.ReadUShort();
var payloadSize = buffer.ReadUShort();
var payload = new RagonPayload(payloadSize);
payload.Read(buffer);
RagonLog.Trace($"Entity {entityType} - {entityId} - {ownerPeerId} - {payloadSize}");
RagonLog.Trace("Read offset: " + buffer.ReadOffset);
var player = _playerCache.GetPlayerByPeer(ownerPeerId);
if (player == null)
@@ -81,11 +78,17 @@ internal class SnapshotHandler : Handler
var hasAuthority = _playerCache.Local.Id == player.Id;
var entity = _entityCache.TryGetEntity(0, entityType, 0, entityId, hasAuthority, out _);
entity.Read(buffer);
if (payloadSize > 0)
{
var payload = new RagonPayload(payloadSize);
payload.Read(buffer);
entity.AttachPayload(payload);
}
_entityListener.OnEntityCreated(entity);
entity.Read(buffer);
entity.Attach(_client, entityId, entityType, hasAuthority, player);
}
@@ -98,10 +101,6 @@ internal class SnapshotHandler : Handler
var staticId = buffer.ReadUShort();
var ownerPeerId = buffer.ReadUShort();
var payloadSize = buffer.ReadUShort();
var payload = new RagonPayload(payloadSize);
payload.Read(buffer);
RagonLog.Trace($"Entity {entityType} - {entityId} - {ownerPeerId} - {payloadSize}");
var player = _playerCache.GetPlayerByPeer(ownerPeerId);
if (player == null)
@@ -113,11 +112,9 @@ internal class SnapshotHandler : Handler
var hasAuthority = _playerCache.Local.Id == player.Id;
var entity = _entityCache.TryGetEntity(0, entityType, staticId, entityId, hasAuthority, out _);
entity.Read(buffer);
entity.AttachPayload(payload);
_entityListener.OnEntityCreated(entity);
entity.Read(buffer);
entity.Attach(_client, entityId, entityType, hasAuthority, player);
}
+1
View File
@@ -145,6 +145,7 @@ namespace Ragon.Client
_stats.Update(_connection.BytesSent, _connection.BytesReceived, _connection.Ping, dt);
}
_listenerList.Update();
_connection.Update();
}
+2 -2
View File
@@ -60,7 +60,7 @@ public sealed class RagonEntityCache
entity.State.WriteInfo(buffer);
spawnPayload.Write(buffer);
spawnPayload?.Write(buffer);
_pendingEntities.Add(attachId, entity);
@@ -95,7 +95,7 @@ public sealed class RagonEntityCache
buffer.WriteOperation(RagonOperation.REMOVE_ENTITY);
buffer.WriteUShort(entity.Id);
destroyPayload.Write(buffer);
destroyPayload?.Write(buffer);
var sendData = buffer.ToArray();
_client.Reliable.Send(sendData);
+23 -9
View File
@@ -30,6 +30,7 @@ namespace Ragon.Client
private readonly List<IRagonOwnershipChangedListener> _ownershipChangedListeners = new();
private readonly List<IRagonPlayerJoinListener> _playerJoinListeners = new();
private readonly List<IRagonPlayerLeftListener> _playerLeftListeners = new();
private readonly List<Action> _delayedActions = new();
public RagonListenerList(RagonClient client)
{
@@ -50,6 +51,8 @@ namespace Ragon.Client
}
public void Remove(IRagonListener listener)
{
_delayedActions.Add(() =>
{
_authorizationListeners.Remove(listener);
_connectionListeners.Remove(listener);
@@ -60,8 +63,18 @@ namespace Ragon.Client
_ownershipChangedListeners.Remove(listener);
_playerJoinListeners.Remove(listener);
_playerLeftListeners.Remove(listener);
});
}
public void Update()
{
foreach (var action in _delayedActions)
action.Invoke();
_delayedActions.Clear();
}
public void Add(IRagonAuthorizationListener listener)
{
_authorizationListeners.Add(listener);
@@ -109,47 +122,48 @@ namespace Ragon.Client
public void Remove(IRagonAuthorizationListener listener)
{
_authorizationListeners.Remove(listener);
_delayedActions.Add(() => _authorizationListeners.Remove(listener));
}
public void Remove(IRagonConnectionListener listener)
{
_connectionListeners.Remove(listener);
_delayedActions.Add(() => _connectionListeners.Remove(listener));
}
public void Remove(IRagonFailedListener listener)
{
_failedListeners.Remove(listener);
_delayedActions.Add(() => _failedListeners.Remove(listener));
}
public void Remove(IRagonJoinListener listener)
{
_joinListeners.Remove(listener);
_delayedActions.Add(() => _joinListeners.Remove(listener));
}
public void Remove(IRagonLeftListener listener)
{
_leftListeners.Remove(listener);
_delayedActions.Add(() => _leftListeners.Remove(listener));
}
public void Remove(IRagonLevelListener listener)
{
_levelListeners.Remove(listener);
_delayedActions.Add(() => _levelListeners.Remove(listener));
}
public void Remove(IRagonOwnershipChangedListener listener)
{
_ownershipChangedListeners.Remove(listener);
_delayedActions.Add(() => _ownershipChangedListeners.Remove(listener));
}
public void Remove(IRagonPlayerJoinListener listener)
{
_playerJoinListeners.Remove(listener);
_delayedActions.Add(() => _playerJoinListeners.Remove(listener));
}
public void Remove(IRagonPlayerLeftListener listener)
{
_playerLeftListeners.Remove(listener);
_delayedActions.Add(() => _playerLeftListeners.Remove(listener));
}
public void OnAuthorizationSuccess(string playerId, string playerName, string payload)
+3 -1
View File
@@ -117,11 +117,13 @@ public class RagonEntity : IRagonEntity
{
buffer.WriteUShort(Type);
buffer.WriteUShort(Id);
if (StaticId != 0)
buffer.WriteUShort(StaticId);
buffer.WriteUShort(Owner.Connection.Id);
buffer.WriteUShort(Owner.Connection.Id);
buffer.WriteUShort(Payload.Size);
Payload.Write(buffer);
_state.Snapshot(buffer);
@@ -72,7 +72,7 @@ public sealed class SceneLoadedOperation : IRagonOperation
var playerInfo = $"Player {context.Connection.Id}|{context.LobbyPlayer.Name}";
var entityInfo = $"{entity.Id}:{entity.Type}";
_logger.Trace($"{playerInfo} created entity {entityInfo}");
_logger.Trace($"{playerInfo} created static entity {entityInfo}");
entity.Attach(player);
room.AttachEntity(entity);