feat: support static entity

This commit is contained in:
2022-08-13 23:22:46 +04:00
parent ae485f96d4
commit dff6dbcf97
2 changed files with 72 additions and 81 deletions
+1 -1
View File
@@ -11,7 +11,7 @@ public class Entity
public uint OwnerId { get; private set; } public uint OwnerId { get; private set; }
public RagonAuthority Authority { get; private set; } public RagonAuthority Authority { get; private set; }
public EntityProperty[] Properties { get; private set; } public EntityProperty[] Properties { get; private set; }
public byte[] Payload { get; private set; } public byte[] Payload { get; set; }
public Entity(uint ownerId, ushort entityType, ushort staticId, RagonAuthority stateAuthority, RagonAuthority eventAuthority, int props) public Entity(uint ownerId, ushort entityType, ushort staticId, RagonAuthority stateAuthority, RagonAuthority eventAuthority, int props)
{ {
+71 -80
View File
@@ -138,16 +138,14 @@ namespace Ragon.Core
if (_entities.TryGetValue(entityId, out var ent)) if (_entities.TryGetValue(entityId, out var ent))
{ {
var mask = _serializer.ReadLong(); var mask = _serializer.ReadLong();
for (var i = 0; i < 31; i++) for (var i = 0; i < ent.Properties.Length; i++)
{ {
if (mask == 1 << i) if (((mask >> i) & 1) == 1)
{ {
_logger.Trace($"Index: {i} is dirty");
var propertyPayload = _serializer.ReadData(ent.Properties[i].Size); var propertyPayload = _serializer.ReadData(ent.Properties[i].Size);
ent.Properties[i].Write(ref propertyPayload); ent.Properties[i].Write(ref propertyPayload);
} }
} }
if (_entitiesDirtySet.Add(ent)) if (_entitiesDirtySet.Add(ent))
{ {
_entitiesDirty.Add(ent); _entitiesDirty.Add(ent);
@@ -275,44 +273,47 @@ namespace Ragon.Core
} }
case RagonOperation.CREATE_STATIC_ENTITY: case RagonOperation.CREATE_STATIC_ENTITY:
{ {
// var entityType = _serializer.ReadUShort(); var entityType = _serializer.ReadUShort();
// var staticId = _serializer.ReadUShort(); var staticId = _serializer.ReadUShort();
// var stateAuthority = (RagonAuthority) _serializer.ReadByte(); var propertiesCount = _serializer.ReadUShort();
// var eventAuthority = (RagonAuthority) _serializer.ReadByte(); var entity = new Entity(peerId, entityType, staticId, RagonAuthority.ALL, RagonAuthority.OWNER_ONLY, propertiesCount);
// var entity = new Entity(peerId, entityType, staticId, stateAuthority, eventAuthority); for (var i = 0; i < propertiesCount; i++)
// {
// { var propertySize = _serializer.ReadUShort();
// var entityPayload = _serializer.ReadData(_serializer.Size); entity.Properties[i] = new EntityProperty(propertySize);
// entity.Payload.Write(ref entityPayload); _logger.Trace($"Static Property: {i} {propertySize}");
// } }
//
// var player = _players[peerId]; {
// player.Entities.Add(entity); var entityPayload = _serializer.ReadData(_serializer.Size);
// player.EntitiesIds.Add(entity.EntityId); entity.Payload = entityPayload.ToArray();
// }
// var ownerId = (ushort) peerId;
// var player = _players[peerId];
// _entities.Add(entity.EntityId, entity); player.Entities.Add(entity);
// _entitiesAll = _entities.Values.ToArray(); player.EntitiesIds.Add(entity.EntityId);
//
// _plugin.OnEntityCreated(player, entity); var ownerId = (ushort) peerId;
//
// _serializer.Clear(); _entities.Add(entity.EntityId, entity);
// _serializer.WriteOperation(RagonOperation.CREATE_STATIC_ENTITY); _entitiesAll = _entities.Values.ToArray();
// _serializer.WriteUShort(entityType);
// _serializer.WriteUShort(staticId); _plugin.OnEntityCreated(player, entity);
// _serializer.WriteByte((byte) stateAuthority);
// _serializer.WriteByte((byte) eventAuthority); _serializer.Clear();
// _serializer.WriteInt(entity.EntityId); _serializer.WriteOperation(RagonOperation.CREATE_STATIC_ENTITY);
// _serializer.WriteUShort(ownerId); _serializer.WriteUShort(entityType);
// _serializer.WriteUShort(entity.EntityId);
// { _serializer.WriteUShort(staticId);
// var entityPayload = entity.Payload.Read(); _serializer.WriteUShort(ownerId);
// _serializer.WriteData(ref entityPayload);
// } {
// ReadOnlySpan<byte> entityPayload = entity.Payload.AsSpan();
// var sendData = _serializer.ToArray(); _serializer.WriteData(ref entityPayload);
// Broadcast(_readyPlayers, sendData, DeliveryType.Reliable); }
var sendData = _serializer.ToArray();
Broadcast(_readyPlayers, sendData, DeliveryType.Reliable);
break; break;
} }
case RagonOperation.CREATE_ENTITY: case RagonOperation.CREATE_ENTITY:
@@ -329,10 +330,10 @@ namespace Ragon.Core
_logger.Trace($"Created object with type: {entityType} {propertiesCount}"); _logger.Trace($"Created object with type: {entityType} {propertiesCount}");
// { {
// var entityPayload = _serializer.ReadData(_serializer.Size); var entityPayload = _serializer.ReadData(_serializer.Size);
// entity.Payload.Write(ref entityPayload); entity.Payload = entityPayload.ToArray();
// } }
var player = _players[peerId]; var player = _players[peerId];
player.Entities.Add(entity); player.Entities.Add(entity);
@@ -350,12 +351,12 @@ namespace Ragon.Core
_serializer.WriteUShort(entityType); _serializer.WriteUShort(entityType);
_serializer.WriteUShort(entity.EntityId); _serializer.WriteUShort(entity.EntityId);
_serializer.WriteUShort(ownerId); _serializer.WriteUShort(ownerId);
//
// { {
// var entityPayload = entity.Payload.Read(); ReadOnlySpan<byte> entityPayload = entity.Payload.AsSpan();
// _serializer.WriteData(ref entityPayload); _serializer.WriteData(ref entityPayload);
// } }
//
var sendData = _serializer.ToArray(); var sendData = _serializer.ToArray();
Broadcast(_readyPlayers, sendData, DeliveryType.Reliable); Broadcast(_readyPlayers, sendData, DeliveryType.Reliable);
break; break;
@@ -407,42 +408,32 @@ namespace Ragon.Core
_serializer.WriteUShort((ushort)dynamicEntities.Length); _serializer.WriteUShort((ushort)dynamicEntities.Length);
foreach (var entity in dynamicEntities) foreach (var entity in dynamicEntities)
{ {
// var payload = entity.Payload.Read(); ReadOnlySpan<byte> payload = entity.Payload.AsSpan();
// var state = entity.State.Read();
_serializer.WriteUShort(entity.EntityType); _serializer.WriteUShort(entity.EntityType);
_serializer.WriteUShort(entity.EntityId); _serializer.WriteUShort(entity.EntityId);
_serializer.WriteUShort((ushort) entity.OwnerId); _serializer.WriteUShort((ushort) entity.OwnerId);
// _serializer.WriteByte((byte) entity.State.Authority); _serializer.WriteUShort((ushort) payload.Length);
// _serializer.WriteByte((byte) entity.Authority); _serializer.WriteData(ref payload);
// _serializer.WriteUShort((ushort) payload.Length); }
// _serializer.WriteData(ref payload);
// _serializer.WriteData(ref state); var staticCount = _entitiesAll.Where(e => e.StaticId != 0).ToArray();
_serializer.WriteUShort((ushort)staticCount.Length);
foreach (var entity in staticCount)
{
ReadOnlySpan<byte> payload = entity.Payload.AsSpan();
_serializer.WriteUShort(entity.EntityType);
_serializer.WriteInt(entity.EntityId);
_serializer.WriteUShort((ushort) entity.StaticId);
_serializer.WriteUShort((ushort) entity.OwnerId);
_serializer.WriteUShort((ushort) payload.Length);
_serializer.WriteData(ref payload);
} }
_serializer.WriteInt(0);
//
// var staticCount = _entitiesAll.Where(e => e.StaticId != -1).ToArray();
// _serializer.WriteInt(staticCount.Length);
// foreach (var entity in staticCount)
// {
// var payload = entity.Payload.Read();
// var state = entity.State.Read();
//
// _serializer.WriteInt(entity.EntityId);
// _serializer.WriteUShort((ushort) entity.StaticId);
// _serializer.WriteByte((byte) entity.State.Authority);
// _serializer.WriteByte((byte) entity.Authority);
// _serializer.WriteUShort(entity.EntityType);
// _serializer.WriteUShort((ushort) entity.OwnerId);
// _serializer.WriteUShort((ushort) payload.Length);
// _serializer.WriteData(ref payload);
// _serializer.WriteData(ref state);
// }
//
var sendData = _serializer.ToArray(); var sendData = _serializer.ToArray();
Send(peerId, sendData, DeliveryType.Reliable); Send(peerId, sendData, DeliveryType.Reliable);
//
_players[peerId].IsLoaded = true; _players[peerId].IsLoaded = true;
_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(_players[peerId]); _plugin.OnPlayerJoined(_players[peerId]);