wip
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -149,7 +129,6 @@ namespace Ragon.Core
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,10 +149,8 @@ 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();
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user