wip
This commit is contained in:
@@ -12,6 +12,12 @@ namespace Game.Source
|
|||||||
_logger.Info("Plugin started");
|
_logger.Info("Plugin started");
|
||||||
|
|
||||||
Subscribe<TestEvent>(123, OnTestEvent);
|
Subscribe<TestEvent>(123, OnTestEvent);
|
||||||
|
Subscribe(500, OnTestEvent2);;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnTestEvent2(Player obj)
|
||||||
|
{
|
||||||
|
_logger.Info("Event without data");
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnStop()
|
public override void OnStop()
|
||||||
@@ -27,7 +33,11 @@ namespace Game.Source
|
|||||||
public override void OnPlayerJoined(Player player)
|
public override void OnPlayerJoined(Player player)
|
||||||
{
|
{
|
||||||
_logger.Info("Player joined " + player.PlayerName);
|
_logger.Info("Player joined " + player.PlayerName);
|
||||||
SendEvent(player, 123, new TestEvent() { TestData = "asdf"});
|
|
||||||
|
SendEvent(player, 123, new TestEvent()
|
||||||
|
{
|
||||||
|
TestData = "asdf"
|
||||||
|
});
|
||||||
|
|
||||||
SendEvent(123, new TestEvent()
|
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)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,12 @@ namespace Ragon.Core
|
|||||||
var data = new T();
|
var data = new T();
|
||||||
_globalEvents.Add(evntCode, (Player player, ref ReadOnlySpan<byte> raw) =>
|
_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.Clear();
|
||||||
_buffer.FromSpan(ref raw, raw.Length);
|
_buffer.FromSpan(ref raw, raw.Length);
|
||||||
data.Deserialize(_buffer);
|
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}");
|
_logger.Warn($"Event subscriber already added {evntCode}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var data = new T();
|
_globalEvents.Add(evntCode, (Player player, ref ReadOnlySpan<byte> raw) =>
|
||||||
_entityEvents[entity.EntityId][evntCode] = (Player player, Entity ent, ref ReadOnlySpan<byte> raw) =>
|
|
||||||
{
|
{
|
||||||
_buffer.Clear();
|
action.Invoke(player);
|
||||||
_buffer.FromSpan(ref raw, raw.Length);
|
});
|
||||||
data.Deserialize(_buffer);
|
}
|
||||||
action.Invoke(player, ent.EntityId, data);
|
|
||||||
};
|
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()
|
public void UnsubscribeAll()
|
||||||
@@ -108,14 +182,16 @@ namespace Ragon.Core
|
|||||||
_buffer.Clear();
|
_buffer.Clear();
|
||||||
payload.Serialize(_buffer);
|
payload.Serialize(_buffer);
|
||||||
|
|
||||||
var sendData = new byte[_buffer.Length + 2];
|
var sendData = new byte[_buffer.Length + 4];
|
||||||
Span<byte> data = sendData.AsSpan();
|
Span<byte> data = sendData.AsSpan();
|
||||||
Span<byte> operationData = data.Slice(0, 2);
|
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);
|
_buffer.ToSpan(ref payloadData);
|
||||||
|
|
||||||
RagonHeader.WriteUShort((ushort) RagonOperation.REPLICATE_EVENT, ref operationData);
|
RagonHeader.WriteUShort((ushort) RagonOperation.REPLICATE_EVENT, ref operationData);
|
||||||
|
RagonHeader.WriteUShort((ushort) eventCode, ref eventCodeData);
|
||||||
|
|
||||||
Room.Send(player.PeerId, sendData);
|
Room.Send(player.PeerId, sendData);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -232,8 +232,8 @@ namespace Ragon.Core
|
|||||||
var data = new byte[entityPayloadData.Length + 12];
|
var data = new byte[entityPayloadData.Length + 12];
|
||||||
var sendData = data.AsSpan();
|
var sendData = data.AsSpan();
|
||||||
var operationData = sendData.Slice(0, 2);
|
var operationData = sendData.Slice(0, 2);
|
||||||
var entityTypeData = sendData.Slice(2, 4);
|
var entityTypeData = sendData.Slice(2, 2);
|
||||||
var entityData = sendData.Slice(4, 4);
|
var entityIdData = sendData.Slice(4, 4);
|
||||||
var peerData = sendData.Slice(8, 4);
|
var peerData = sendData.Slice(8, 4);
|
||||||
var payload = sendData.Slice(12, entityPayloadData.Length);
|
var payload = sendData.Slice(12, entityPayloadData.Length);
|
||||||
|
|
||||||
@@ -241,7 +241,7 @@ namespace Ragon.Core
|
|||||||
|
|
||||||
RagonHeader.WriteUShort((ushort) RagonOperation.CREATE_ENTITY, ref operationData);
|
RagonHeader.WriteUShort((ushort) RagonOperation.CREATE_ENTITY, ref operationData);
|
||||||
RagonHeader.WriteUShort(entityType, ref entityTypeData);
|
RagonHeader.WriteUShort(entityType, ref entityTypeData);
|
||||||
RagonHeader.WriteInt(entity.EntityId, ref entityData);
|
RagonHeader.WriteInt(entity.EntityId, ref entityIdData);
|
||||||
RagonHeader.WriteInt((int) peerId, ref peerData);
|
RagonHeader.WriteInt((int) peerId, ref peerData);
|
||||||
|
|
||||||
Broadcast(_allPlayers, data, DeliveryType.Reliable);
|
Broadcast(_allPlayers, data, DeliveryType.Reliable);
|
||||||
|
|||||||
Reference in New Issue
Block a user