diff --git a/Ragon.Client/Ragon.Client.csproj b/Ragon.Client/Ragon.Client.csproj index 41c4715..c94409a 100644 --- a/Ragon.Client/Ragon.Client.csproj +++ b/Ragon.Client/Ragon.Client.csproj @@ -12,11 +12,11 @@ true none - /Users/edmand46/RagonProjects/ragon-oss-sdk/Assets/Ragon/Plugins/ + /Users/edmand46/RagonProjects/ragon-oss-examples/Assets/Ragon/Plugins/ - /Users/edmand46/RagonProjects/ragon-unity-sdk/Assets/Ragon/Runtime/Plugins + /Users/edmand46/RagonProjects/ragon-oss-examples/Assets/Ragon/Plugins/ diff --git a/Ragon.Client/Sources/Entity/RagonEntity.cs b/Ragon.Client/Sources/Entity/RagonEntity.cs index 2a2149b..29b1250 100644 --- a/Ragon.Client/Sources/Entity/RagonEntity.cs +++ b/Ragon.Client/Sources/Entity/RagonEntity.cs @@ -56,7 +56,9 @@ namespace Ragon.Client { State = new RagonEntityState(this); Type = type; - + + _spawnPayload = new RagonPayload(0); + _destroyPayload = new RagonPayload(0); _sceneId = sceneId; } diff --git a/Ragon.Client/Sources/Handler/SnapshotHandler.cs b/Ragon.Client/Sources/Handler/SnapshotHandler.cs index 3798e12..09611a5 100644 --- a/Ragon.Client/Sources/Handler/SnapshotHandler.cs +++ b/Ragon.Client/Sources/Handler/SnapshotHandler.cs @@ -33,7 +33,7 @@ internal class SnapshotHandler : Handler RagonListenerList listenerList, RagonEntityCache entityCache, RagonPlayerCache playerCache, - IRagonEntityListener entityListener + IRagonEntityListener entityListener ) { _client = ragonClient; @@ -52,9 +52,9 @@ internal class SnapshotHandler : Handler var playerPeerId = buffer.ReadUShort(); var playerId = buffer.ReadString(); var playerName = buffer.ReadString(); - + _playerCache.AddPlayer(playerPeerId, playerId, playerName); - + RagonLog.Trace($"Player {playerPeerId} - {playerId} - {playerName}"); } @@ -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); - entity.AttachPayload(payload); + 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,26 +101,20 @@ 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) { RagonLog.Error($"Player not found with peerId: ${ownerPeerId}"); return; } - + 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); } diff --git a/Ragon.Client/Sources/RagonClient.cs b/Ragon.Client/Sources/RagonClient.cs index 49ed555..655c9b0 100644 --- a/Ragon.Client/Sources/RagonClient.cs +++ b/Ragon.Client/Sources/RagonClient.cs @@ -144,7 +144,8 @@ namespace Ragon.Client _stats.Update(_connection.BytesSent, _connection.BytesReceived, _connection.Ping, dt); } - + + _listenerList.Update(); _connection.Update(); } diff --git a/Ragon.Client/Sources/RagonEntityCache.cs b/Ragon.Client/Sources/RagonEntityCache.cs index 1bbb7c7..31f841d 100644 --- a/Ragon.Client/Sources/RagonEntityCache.cs +++ b/Ragon.Client/Sources/RagonEntityCache.cs @@ -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); diff --git a/Ragon.Client/Sources/RagonListenerList.cs b/Ragon.Client/Sources/RagonListenerList.cs index 4e33d07..f3ebe16 100644 --- a/Ragon.Client/Sources/RagonListenerList.cs +++ b/Ragon.Client/Sources/RagonListenerList.cs @@ -30,6 +30,7 @@ namespace Ragon.Client private readonly List _ownershipChangedListeners = new(); private readonly List _playerJoinListeners = new(); private readonly List _playerLeftListeners = new(); + private readonly List _delayedActions = new(); public RagonListenerList(RagonClient client) { @@ -51,16 +52,28 @@ namespace Ragon.Client public void Remove(IRagonListener listener) { - _authorizationListeners.Remove(listener); - _connectionListeners.Remove(listener); - _failedListeners.Remove(listener); - _joinListeners.Remove(listener); - _leftListeners.Remove(listener); - _levelListeners.Remove(listener); - _ownershipChangedListeners.Remove(listener); - _playerJoinListeners.Remove(listener); - _playerLeftListeners.Remove(listener); + _delayedActions.Add(() => + { + _authorizationListeners.Remove(listener); + _connectionListeners.Remove(listener); + _failedListeners.Remove(listener); + _joinListeners.Remove(listener); + _leftListeners.Remove(listener); + _levelListeners.Remove(listener); + _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) { @@ -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) diff --git a/Ragon.Server/Sources/Entity/RagonEntity.cs b/Ragon.Server/Sources/Entity/RagonEntity.cs index 842d441..a487bd1 100644 --- a/Ragon.Server/Sources/Entity/RagonEntity.cs +++ b/Ragon.Server/Sources/Entity/RagonEntity.cs @@ -117,13 +117,15 @@ public class RagonEntity : IRagonEntity { buffer.WriteUShort(Type); buffer.WriteUShort(Id); + if (StaticId != 0) buffer.WriteUShort(StaticId); + buffer.WriteUShort(Owner.Connection.Id); - buffer.WriteUShort(Payload.Size); + Payload.Write(buffer); - + _state.Snapshot(buffer); } diff --git a/Ragon.Server/Sources/Handler/SceneLoadedOperation.cs b/Ragon.Server/Sources/Handler/SceneLoadedOperation.cs index 7701fa6..a037e72 100644 --- a/Ragon.Server/Sources/Handler/SceneLoadedOperation.cs +++ b/Ragon.Server/Sources/Handler/SceneLoadedOperation.cs @@ -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);