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);