diff --git a/Ragon.Client/Sources/RagonRoom.cs b/Ragon.Client/Sources/RagonRoom.cs index 7e4aa8f..3d46051 100644 --- a/Ragon.Client/Sources/RagonRoom.cs +++ b/Ragon.Client/Sources/RagonRoom.cs @@ -20,6 +20,33 @@ namespace Ragon.Client { public class RagonRoom: IDisposable { + private class EventSubscription : IDisposable + { + private List> _callbacks; + private List> _localCallbacks; + private Action _callback; + + public EventSubscription( + List> callbacks, + List> localCallbacks, + Action callback) + { + _callbacks = callbacks; + _localCallbacks = localCallbacks; + _callback = callback; + } + + public void Dispose() + { + _callbacks?.Remove(_callback); + _localCallbacks?.Remove(_callback); + + _callbacks = null!; + _localCallbacks = null!; + _callback = null!; + } + } + private delegate void OnEventDelegate(RagonPlayer player, RagonBuffer serializer); private RagonClient _client; @@ -73,11 +100,10 @@ namespace Ragon.Client RagonLog.Warn($"Handler event on entity {Id} with eventCode {eventCode} not defined"); } - public Action OnEvent(Action callback) where TEvent : IRagonEvent, new() + public IDisposable OnEvent(Action callback) where TEvent : IRagonEvent, new() { var t = new TEvent(); var eventCode = _client.Event.GetEventCode(t); - var action = (RagonPlayer player, IRagonEvent eventData) => callback.Invoke(player, (TEvent)eventData); if (!_listeners.TryGetValue(eventCode, out var callbacks)) @@ -106,19 +132,7 @@ namespace Ragon.Client }); } - return action; - } - - public void OffEvent(Action callback) where TEvent : IRagonEvent, new() - { - var t = new TEvent(); - var eventCode = _client.Event.GetEventCode(t); - - if (_listeners.TryGetValue(eventCode, out var callbacks)) - callbacks.Remove(callback); - - if (_localListeners.TryGetValue(eventCode, out var localCallbacks)) - localCallbacks.Remove(callback); + return new EventSubscription(callbacks, localCallbacks, action); } public void LoadScene(string sceneName) => _scene.Load(sceneName);