diff --git a/Game/Source/Modes/ExamplePlugin.cs b/Game/Source/Modes/ExamplePlugin.cs index 84e983c..d6d8981 100755 --- a/Game/Source/Modes/ExamplePlugin.cs +++ b/Game/Source/Modes/ExamplePlugin.cs @@ -12,6 +12,12 @@ namespace Game.Source _logger.Info("Plugin started"); Subscribe(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) { } diff --git a/Ragon/Sources/Plugin/PluginBase.cs b/Ragon/Sources/Plugin/PluginBase.cs index e736fcb..028d420 100755 --- a/Ragon/Sources/Plugin/PluginBase.cs +++ b/Ragon/Sources/Plugin/PluginBase.cs @@ -45,31 +45,105 @@ namespace Ragon.Core var data = new T(); _globalEvents.Add(evntCode, (Player player, ref ReadOnlySpan 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); action.Invoke(player, data); }); } - - public void Subscribe(Entity entity, ushort evntCode, Action action) where T : IRagonSerializable, new() + + public void Subscribe(ushort evntCode, Action 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 raw) => + _globalEvents.Add(evntCode, (Player player, ref ReadOnlySpan raw) => { - _buffer.Clear(); - _buffer.FromSpan(ref raw, raw.Length); - data.Deserialize(_buffer); - action.Invoke(player, ent.EntityId, data); - }; + action.Invoke(player); + }); } + public void Subscribe(Entity entity, ushort evntCode, Action 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 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()); + _entityEvents[entity.EntityId].Add(evntCode, (Player player, Entity ent, ref ReadOnlySpan 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 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 raw) => + { + action.Invoke(player, ent); + }); + return; + } + + { + _entityEvents.Add(entity.EntityId, new Dictionary()); + _entityEvents[entity.EntityId].Add(evntCode, (Player player, Entity ent, ref ReadOnlySpan raw) => + { + action.Invoke(player, ent); + }); + } + } + public void UnsubscribeAll() { _globalEvents.Clear(); @@ -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 data = sendData.AsSpan(); Span operationData = data.Slice(0, 2); - Span payloadData = data.Slice(2, data.Length - 2); + Span eventCodeData = data.Slice(2, 2); + Span 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); } diff --git a/Ragon/Sources/Rooms/Room.cs b/Ragon/Sources/Rooms/Room.cs index 1e0cbbb..d7255c7 100755 --- a/Ragon/Sources/Rooms/Room.cs +++ b/Ragon/Sources/Rooms/Room.cs @@ -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);