This commit is contained in:
2022-10-16 17:14:32 +04:00
parent aaa0e4a317
commit 1558b5eefb
3 changed files with 78 additions and 57 deletions
+6 -5
View File
@@ -66,6 +66,7 @@ public class Entity
EventData = payload.ToArray(), EventData = payload.ToArray(),
Target = targetMode, Target = targetMode,
EventId = eventId, EventId = eventId,
PeerId = peerId,
}; };
_bufferedEvents.Add(bufferedEvent); _bufferedEvents.Add(bufferedEvent);
} }
@@ -84,7 +85,7 @@ public class Entity
Send(targetMode, sendData); Send(targetMode, sendData);
} }
public void HandleState(uint peerId, RagonSerializer serializer) public void ReadState(uint peerId, RagonSerializer serializer)
{ {
if (OwnerId != peerId) if (OwnerId != peerId)
{ {
@@ -164,7 +165,7 @@ public class Entity
serializer.Clear(); serializer.Clear();
serializer.WriteOperation(RagonOperation.REPLICATE_ENTITY_EVENT); serializer.WriteOperation(RagonOperation.REPLICATE_ENTITY_EVENT);
serializer.WriteUShort(bufferedEvent.EventId); serializer.WriteUShort(bufferedEvent.EventId);
serializer.WriteUShort(peerId); serializer.WriteUShort(bufferedEvent.PeerId);
serializer.WriteByte((byte) RagonReplicationMode.Server); serializer.WriteByte((byte) RagonReplicationMode.Server);
serializer.WriteUShort(EntityId); serializer.WriteUShort(EntityId);
@@ -172,11 +173,11 @@ public class Entity
serializer.WriteData(ref data); serializer.WriteData(ref data);
var sendData = serializer.ToArray(); var sendData = serializer.ToArray();
Send(bufferedEvent.Target, sendData); _room.Send(peerId, sendData, DeliveryType.Reliable);
} }
} }
public void SendCreate() public void Create()
{ {
var serializer = _room.GetSharedSerializer(); var serializer = _room.GetSharedSerializer();
@@ -194,7 +195,7 @@ public class Entity
_room.BroadcastToReady(sendData, DeliveryType.Reliable); _room.BroadcastToReady(sendData, DeliveryType.Reliable);
} }
public void SendDestroy(ReadOnlySpan<byte> payload) public void Destroy(ReadOnlySpan<byte> payload)
{ {
var serializer = _room.GetSharedSerializer(); var serializer = _room.GetSharedSerializer();
serializer.Clear(); serializer.Clear();
+1
View File
@@ -4,6 +4,7 @@ namespace Ragon.Core;
public class EntityEvent public class EntityEvent
{ {
public ushort PeerId { get; set; }
public ushort EventId { get; set; } public ushort EventId { get; set; }
public byte[] EventData { get; set; } public byte[] EventData { get; set; }
public RagonTarget Target { set; get; } public RagonTarget Target { set; get; }
+71 -52
View File
@@ -69,27 +69,7 @@ namespace Ragon.Core
_players.Add(player.PeerId, player); _players.Add(player.PeerId, player);
_allPlayers = _players.Select(p => p.Key).ToArray(); _allPlayers = _players.Select(p => p.Key).ToArray();
{ SendInfo(player);
_writer.Clear();
_writer.WriteOperation(RagonOperation.JOIN_SUCCESS);
_writer.WriteString(Id);
_writer.WriteString(player.Id);
_writer.WriteString(GetOwner().Id);
_writer.WriteUShort((ushort) PlayersMin);
_writer.WriteUShort((ushort) PlayersMax);
var sendData = _writer.ToArray();
Send(player.PeerId, sendData, DeliveryType.Reliable);
}
{
_writer.Clear();
_writer.WriteOperation(RagonOperation.LOAD_SCENE);
_writer.WriteString(Map);
var sendData = _writer.ToArray();
Send(player.PeerId, sendData, DeliveryType.Reliable);
}
} }
public void RemovePlayer(ushort peerId) public void RemovePlayer(ushort peerId)
@@ -147,9 +127,8 @@ namespace Ragon.Core
var propertySize = reader.ReadUShort(); var propertySize = reader.ReadUShort();
entity.AddProperty(new EntityProperty(propertySize, propertyType)); entity.AddProperty(new EntityProperty(propertySize, propertyType));
} }
player.AttachEntity(entity); player.AttachEntity(entity);
AttachEntity(entity); AttachEntity(entity);
} }
@@ -162,6 +141,7 @@ namespace Ragon.Core
{ {
var joinedPlayer = _players[peer]; var joinedPlayer = _players[peer];
joinedPlayer.IsLoaded = true; joinedPlayer.IsLoaded = true;
_plugin.OnPlayerJoined(joinedPlayer); _plugin.OnPlayerJoined(joinedPlayer);
_logger.Trace($"[{_owner}][{peer}] Player {joinedPlayer.Id} restored"); _logger.Trace($"[{_owner}][{peer}] Player {joinedPlayer.Id} restored");
@@ -169,11 +149,9 @@ namespace Ragon.Core
} }
_readyPlayers = _players.Where(p => p.Value.IsLoaded).Select(p => p.Key).ToArray(); _readyPlayers = _players.Where(p => p.Value.IsLoaded).Select(p => p.Key).ToArray();
foreach (var peer in _awaitingPeers)
{ SendSnapshot(_awaitingPeers.ToArray());
SendSnapshot(peer);
}
_awaitingPeers.Clear(); _awaitingPeers.Clear();
} }
else if (GetOwner().IsLoaded) else if (GetOwner().IsLoaded)
@@ -186,7 +164,7 @@ namespace Ragon.Core
_readyPlayers = _players.Where(p => p.Value.IsLoaded).Select(p => p.Key).ToArray(); _readyPlayers = _players.Where(p => p.Value.IsLoaded).Select(p => p.Key).ToArray();
_plugin.OnPlayerJoined(player); _plugin.OnPlayerJoined(player);
SendSnapshot(peerId); SendSnapshot(new[] {peerId});
foreach (var (key, value) in _entities) foreach (var (key, value) in _entities)
value.RestoreBufferedEvents(peerId); value.RestoreBufferedEvents(peerId);
@@ -207,7 +185,7 @@ namespace Ragon.Core
var entityId = reader.ReadUShort(); var entityId = reader.ReadUShort();
if (_entities.TryGetValue(entityId, out var entity)) if (_entities.TryGetValue(entityId, out var entity))
{ {
entity.HandleState(peerId, reader); entity.ReadState(peerId, reader);
if (_entitiesDirtySet.Add(entity)) if (_entitiesDirtySet.Add(entity))
_entitiesDirty.Add(entity); _entitiesDirty.Add(entity);
@@ -271,7 +249,7 @@ namespace Ragon.Core
player.AttachEntity(entity); player.AttachEntity(entity);
AttachEntity(entity); AttachEntity(entity);
entity.SendCreate(); entity.Create();
break; break;
} }
case RagonOperation.DESTROY_ENTITY: case RagonOperation.DESTROY_ENTITY:
@@ -289,11 +267,9 @@ namespace Ragon.Core
DetachEntity(entity); DetachEntity(entity);
if (_plugin.OnEntityDestroyed(player, entity)) if (_plugin.OnEntityDestroyed(player, entity))
{
return; return;
}
entity.SendDestroy(destroyPayload); entity.Destroy(destroyPayload);
} }
break; break;
@@ -337,7 +313,7 @@ namespace Ragon.Core
void SendChangeOwner(Player prev, Player next) void SendChangeOwner(Player prev, Player next)
{ {
var entitiesToUpdate = prev.Entities.Where(e => e.StaticId > 0).ToArray(); var entitiesToUpdate = prev.Entities.Where(e => e.StaticId > 0).ToArray();
_writer.Clear(); _writer.Clear();
_writer.WriteOperation(RagonOperation.OWNERSHIP_CHANGED); _writer.WriteOperation(RagonOperation.OWNERSHIP_CHANGED);
_writer.WriteString(next.Id); _writer.WriteString(next.Id);
@@ -348,8 +324,7 @@ namespace Ragon.Core
entity.SetOwner((ushort) next.PeerId); entity.SetOwner((ushort) next.PeerId);
} }
var sendData = _writer.ToArray(); BroadcastToReady(_writer, DeliveryType.Reliable);
Broadcast(_readyPlayers, sendData);
} }
void SendJoined(Player player, uint excludePeerId) void SendJoined(Player player, uint excludePeerId)
@@ -360,9 +335,8 @@ namespace Ragon.Core
_writer.WriteString(player.Id); _writer.WriteString(player.Id);
_writer.WriteString(player.PlayerName); _writer.WriteString(player.PlayerName);
var sendData = _writer.ToArray();
var readyPlayersWithExcludedPeer = _readyPlayers.Where(p => p != excludePeerId).ToArray(); var readyPlayersWithExcludedPeer = _readyPlayers.Where(p => p != excludePeerId).ToArray();
Broadcast(readyPlayersWithExcludedPeer, sendData, DeliveryType.Reliable); BroadcastToReady(_writer, readyPlayersWithExcludedPeer, DeliveryType.Reliable);
} }
void SendLeaved(Player player) void SendLeaved(Player player)
@@ -379,11 +353,10 @@ namespace Ragon.Core
_entities.Remove(entity.EntityId); _entities.Remove(entity.EntityId);
} }
var sendData = _writer.ToArray(); BroadcastToReady(_writer, DeliveryType.Reliable);
Broadcast(_readyPlayers, sendData);
} }
void SendSnapshot(ushort peerId) void SendSnapshot(ushort[] peersIds)
{ {
_writer.Clear(); _writer.Clear();
_writer.WriteOperation(RagonOperation.SNAPSHOT); _writer.WriteOperation(RagonOperation.SNAPSHOT);
@@ -429,7 +402,7 @@ namespace Ragon.Core
} }
var sendData = _writer.ToArray(); var sendData = _writer.ToArray();
Send(peerId, sendData, DeliveryType.Reliable); Broadcast(peersIds, sendData, DeliveryType.Reliable);
} }
void SendChanges() void SendChanges()
@@ -447,11 +420,24 @@ namespace Ragon.Core
_entitiesDirty.Clear(); _entitiesDirty.Clear();
_entitiesDirtySet.Clear(); _entitiesDirtySet.Clear();
var sendData = _writer.ToArray(); BroadcastToReady(_writer, DeliveryType.Reliable);
Broadcast(_readyPlayers, sendData);
} }
} }
void SendInfo(Player player)
{
_writer.Clear();
_writer.WriteOperation(RagonOperation.JOIN_SUCCESS);
_writer.WriteString(Id);
_writer.WriteString(player.Id);
_writer.WriteString(GetOwner().Id);
_writer.WriteUShort((ushort) PlayersMin);
_writer.WriteUShort((ushort) PlayersMax);
_writer.WriteString(Map);
Send(player.PeerId, _writer, DeliveryType.Reliable);
}
void SendScene(string sceneName) void SendScene(string sceneName)
{ {
_readyPlayers = Array.Empty<ushort>(); _readyPlayers = Array.Empty<ushort>();
@@ -462,21 +448,46 @@ namespace Ragon.Core
_writer.WriteOperation(RagonOperation.LOAD_SCENE); _writer.WriteOperation(RagonOperation.LOAD_SCENE);
_writer.WriteString(sceneName); _writer.WriteString(sceneName);
var sendData = _writer.ToArray(); BroadcastToAll(_writer, DeliveryType.Reliable);
Broadcast(_allPlayers, sendData, DeliveryType.Reliable);
} }
public void Send(ushort peerId, byte[] rawData, DeliveryType deliveryType = DeliveryType.Unreliable) => public void Send(ushort peerId, byte[] rawData, DeliveryType deliveryType = DeliveryType.Unreliable)
{
_socketServer.Send(peerId, rawData, deliveryType); _socketServer.Send(peerId, rawData, deliveryType);
}
public void Broadcast(ushort[] peersIds, byte[] rawData, DeliveryType deliveryType = DeliveryType.Unreliable) => public void Send(ushort peerId, RagonSerializer writer, DeliveryType deliveryType = DeliveryType.Unreliable)
{
var sendData = writer.ToArray();
_socketServer.Send(peerId, sendData, deliveryType);
}
public void Broadcast(ushort[] peersIds, byte[] rawData, DeliveryType deliveryType = DeliveryType.Unreliable)
{
_socketServer.Broadcast(peersIds, rawData, deliveryType); _socketServer.Broadcast(peersIds, rawData, deliveryType);
}
public void BroadcastToAll(byte[] rawData, DeliveryType deliveryType = DeliveryType.Unreliable) => public void BroadcastToAll(byte[] rawData, DeliveryType deliveryType = DeliveryType.Unreliable)
{
_socketServer.Broadcast(_allPlayers, rawData, deliveryType); _socketServer.Broadcast(_allPlayers, rawData, deliveryType);
}
public void BroadcastToReady(byte[] rawData, DeliveryType deliveryType = DeliveryType.Unreliable) => public void BroadcastToAll(RagonSerializer writer, DeliveryType deliveryType = DeliveryType.Unreliable)
{
var sendData = writer.ToArray();
_socketServer.Broadcast(_allPlayers, sendData, deliveryType);
}
public void BroadcastToReady(byte[] rawData, DeliveryType deliveryType = DeliveryType.Unreliable)
{
_socketServer.Broadcast(_readyPlayers, rawData, deliveryType); _socketServer.Broadcast(_readyPlayers, rawData, deliveryType);
}
public void BroadcastToReady(RagonSerializer writer, DeliveryType deliveryType = DeliveryType.Unreliable)
{
var sendData = writer.ToArray();
_socketServer.Broadcast(_readyPlayers, sendData, deliveryType);
}
public void BroadcastToReady(byte[] rawData, ushort[] excludePeersIds, DeliveryType deliveryType = DeliveryType.Unreliable) public void BroadcastToReady(byte[] rawData, ushort[] excludePeersIds, DeliveryType deliveryType = DeliveryType.Unreliable)
{ {
@@ -491,7 +502,15 @@ namespace Ragon.Core
} }
} }
} }
Broadcast(_peersCache.ToArray(), rawData, deliveryType);
var peersIds = _peersCache.ToArray();
_socketServer.Broadcast(peersIds, rawData, deliveryType);
}
public void BroadcastToReady(RagonSerializer writer, ushort[] excludePeersIds, DeliveryType deliveryType = DeliveryType.Unreliable)
{
var sendData = writer.ToArray();
BroadcastToReady(sendData, excludePeersIds, deliveryType);
} }
} }
} }