This commit is contained in:
2022-05-08 09:59:20 +04:00
parent 6d60df5c01
commit c916358728
3 changed files with 103 additions and 17 deletions
+12 -2
View File
@@ -12,6 +12,12 @@ namespace Game.Source
_logger.Info("Plugin started");
Subscribe<TestEvent>(123, OnTestEvent);
Subscribe(500, OnTestEvent2);;
}
private void OnTestEvent2(Player obj)
{
_logger.Info("Event without data");
}
public override void OnStop()
@@ -27,7 +33,11 @@ namespace Game.Source
public override void OnPlayerJoined(Player player)
{
_logger.Info("Player joined " + player.PlayerName);
SendEvent(player, 123, new TestEvent() { TestData = "asdf"});
SendEvent(player, 123, new TestEvent()
{
TestData = "asdf"
});
SendEvent(123, new TestEvent()
{
@@ -51,7 +61,7 @@ namespace Game.Source
}
private void OnEntityTestEvent(Player arg1, int arg2, TestEvent arg3)
private void OnEntityTestEvent(Player player, Entity entity, TestEvent data)
{
}
+83 -7
View File
@@ -45,6 +45,12 @@ namespace Ragon.Core
var data = new T();
_globalEvents.Add(evntCode, (Player player, ref ReadOnlySpan<byte> raw) =>
{
if (raw.Length == 0)
{
_logger.Warn($"Payload is empty for event {evntCode}");
return;
}
_buffer.Clear();
_buffer.FromSpan(ref raw, raw.Length);
data.Deserialize(_buffer);
@@ -52,22 +58,90 @@ namespace Ragon.Core
});
}
public void Subscribe<T>(Entity entity, ushort evntCode, Action<Player, int, T> action) where T : IRagonSerializable, new()
public void Subscribe(ushort evntCode, Action<Player> action)
{
if (_entityEvents.ContainsKey(evntCode))
if (_globalEvents.ContainsKey(evntCode))
{
_logger.Warn($"Event subscriber already added {evntCode}");
return;
}
var data = new T();
_entityEvents[entity.EntityId][evntCode] = (Player player, Entity ent, ref ReadOnlySpan<byte> raw) =>
_globalEvents.Add(evntCode, (Player player, ref ReadOnlySpan<byte> raw) =>
{
action.Invoke(player);
});
}
public void Subscribe<T>(Entity entity, ushort evntCode, Action<Player, Entity, T> action) where T : IRagonSerializable, new()
{
if (_entityEvents.ContainsKey(entity.EntityId))
{
if (_entityEvents[entity.EntityId].ContainsKey(evntCode))
{
_logger.Warn($"Event subscriber already added {evntCode} for {entity.EntityId}");
return;
}
var data = new T();
_entityEvents[entity.EntityId].Add(evntCode, (Player player, Entity ent, ref ReadOnlySpan<byte> raw) =>
{
if (raw.Length == 0)
{
_logger.Warn($"Payload is empty for entity {ent.EntityId} event {evntCode}");
return;
}
_buffer.Clear();
_buffer.FromSpan(ref raw, raw.Length);
data.Deserialize(_buffer);
action.Invoke(player, ent, data);
});
return;
}
{
var data = new T();
_entityEvents.Add(entity.EntityId, new Dictionary<ushort, SubscribeEntityDelegate>());
_entityEvents[entity.EntityId].Add(evntCode, (Player player, Entity ent, ref ReadOnlySpan<byte> raw) =>
{
if (raw.Length == 0)
{
_logger.Warn($"Payload is empty for entity {ent.EntityId} event {evntCode}");
return;
}
_buffer.Clear();
_buffer.FromSpan(ref raw, raw.Length);
data.Deserialize(_buffer);
action.Invoke(player, ent.EntityId, data);
};
});
}
}
public void Subscribe(Entity entity, ushort evntCode, Action<Player, Entity> action) where T : IRagonSerializable, new()
{
if (_entityEvents.ContainsKey(entity.EntityId))
{
if (_entityEvents[entity.EntityId].ContainsKey(evntCode))
{
_logger.Warn($"Event subscriber already added {evntCode} for {entity.EntityId}");
return;
}
_entityEvents[entity.EntityId].Add(evntCode, (Player player, Entity ent, ref ReadOnlySpan<byte> raw) =>
{
action.Invoke(player, ent);
});
return;
}
{
_entityEvents.Add(entity.EntityId, new Dictionary<ushort, SubscribeEntityDelegate>());
_entityEvents[entity.EntityId].Add(evntCode, (Player player, Entity ent, ref ReadOnlySpan<byte> raw) =>
{
action.Invoke(player, ent);
});
}
}
public void UnsubscribeAll()
@@ -108,14 +182,16 @@ namespace Ragon.Core
_buffer.Clear();
payload.Serialize(_buffer);
var sendData = new byte[_buffer.Length + 2];
var sendData = new byte[_buffer.Length + 4];
Span<byte> data = sendData.AsSpan();
Span<byte> operationData = data.Slice(0, 2);
Span<byte> payloadData = data.Slice(2, data.Length - 2);
Span<byte> eventCodeData = data.Slice(2, 2);
Span<byte> payloadData = data.Slice(4, data.Length - 4);
_buffer.ToSpan(ref payloadData);
RagonHeader.WriteUShort((ushort) RagonOperation.REPLICATE_EVENT, ref operationData);
RagonHeader.WriteUShort((ushort) eventCode, ref eventCodeData);
Room.Send(player.PeerId, sendData);
}
+3 -3
View File
@@ -232,8 +232,8 @@ namespace Ragon.Core
var data = new byte[entityPayloadData.Length + 12];
var sendData = data.AsSpan();
var operationData = sendData.Slice(0, 2);
var entityTypeData = sendData.Slice(2, 4);
var entityData = sendData.Slice(4, 4);
var entityTypeData = sendData.Slice(2, 2);
var entityIdData = sendData.Slice(4, 4);
var peerData = sendData.Slice(8, 4);
var payload = sendData.Slice(12, entityPayloadData.Length);
@@ -241,7 +241,7 @@ namespace Ragon.Core
RagonHeader.WriteUShort((ushort) RagonOperation.CREATE_ENTITY, ref operationData);
RagonHeader.WriteUShort(entityType, ref entityTypeData);
RagonHeader.WriteInt(entity.EntityId, ref entityData);
RagonHeader.WriteInt(entity.EntityId, ref entityIdData);
RagonHeader.WriteInt((int) peerId, ref peerData);
Broadcast(_allPlayers, data, DeliveryType.Reliable);