✨ multiple subscribers, and unsubscribe
This commit is contained in:
@@ -50,7 +50,8 @@ namespace Ragon.Client
|
|||||||
private RagonPayload _destroyPayload;
|
private RagonPayload _destroyPayload;
|
||||||
|
|
||||||
private readonly Dictionary<int, OnEventDelegate> _events = new Dictionary<int, OnEventDelegate>();
|
private readonly Dictionary<int, OnEventDelegate> _events = new Dictionary<int, OnEventDelegate>();
|
||||||
private readonly Dictionary<int, Action<RagonPlayer, IRagonEvent>> _localEvents = new Dictionary<int, Action<RagonPlayer, IRagonEvent>>();
|
private readonly Dictionary<int, List<Action<RagonPlayer, IRagonEvent>>> _localListeners = new Dictionary<int, List<Action<RagonPlayer, IRagonEvent>>>();
|
||||||
|
private readonly Dictionary<int, List<Action<RagonPlayer, IRagonEvent>>> _listeners = new Dictionary<int, List<Action<RagonPlayer, IRagonEvent>>>();
|
||||||
|
|
||||||
public RagonEntity(ushort type = 0, ushort sceneId = 0)
|
public RagonEntity(ushort type = 0, ushort sceneId = 0)
|
||||||
{
|
{
|
||||||
@@ -155,12 +156,16 @@ namespace Ragon.Client
|
|||||||
{
|
{
|
||||||
if (replicationMode == RagonReplicationMode.Local)
|
if (replicationMode == RagonReplicationMode.Local)
|
||||||
{
|
{
|
||||||
_localEvents[eventCode].Invoke(_client.Room.Local, evnt);
|
var localListeners = _localListeners[eventCode];
|
||||||
|
foreach (var listener in localListeners)
|
||||||
|
listener.Invoke(_client.Room.Local, evnt);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (replicationMode == RagonReplicationMode.LocalAndServer)
|
if (replicationMode == RagonReplicationMode.LocalAndServer)
|
||||||
{
|
{
|
||||||
_localEvents[eventCode].Invoke(_client.Room.Local, evnt);
|
var localListeners = _localListeners[eventCode];
|
||||||
|
foreach (var listener in localListeners)
|
||||||
|
listener.Invoke(_client.Room.Local, evnt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,25 +184,49 @@ namespace Ragon.Client
|
|||||||
_client.Reliable.Send(sendData);
|
_client.Reliable.Send(sendData);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnEvent<TEvent>(Action<RagonPlayer, TEvent> callback) where TEvent : IRagonEvent, new()
|
public Action<RagonPlayer, IRagonEvent> OnEvent<TEvent>(Action<RagonPlayer, TEvent> callback) where TEvent : IRagonEvent, new()
|
||||||
{
|
{
|
||||||
var t = new TEvent();
|
var t = new TEvent();
|
||||||
var eventCode = _client.Event.GetEventCode(t);
|
var eventCode = _client.Event.GetEventCode(t);
|
||||||
|
var callbacks = _listeners[eventCode];
|
||||||
|
var action = (RagonPlayer player, IRagonEvent eventData) => callback.Invoke(player, (TEvent)eventData);
|
||||||
|
|
||||||
if (_events.ContainsKey(eventCode))
|
if (callbacks == null)
|
||||||
{
|
{
|
||||||
_events.Remove(eventCode);
|
callbacks = new List<Action<RagonPlayer, IRagonEvent>>();
|
||||||
_localEvents.Remove(eventCode);
|
_listeners.Add(eventCode, callbacks);
|
||||||
|
|
||||||
RagonLog.Warn($"Event already {eventCode} subscribed, removed old one!");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_localEvents.Add(eventCode, (player, eventData) => { callback.Invoke(player, (TEvent)eventData); });
|
var localCallbacks = _localListeners[eventCode];
|
||||||
|
if (localCallbacks == null)
|
||||||
|
{
|
||||||
|
localCallbacks = new List<Action<RagonPlayer, IRagonEvent>>();
|
||||||
|
_localListeners.Add(eventCode, callbacks);
|
||||||
|
}
|
||||||
|
|
||||||
|
callbacks.Add(action);
|
||||||
|
localCallbacks.Add(action);
|
||||||
|
|
||||||
_events.Add(eventCode, (player, serializer) =>
|
_events.Add(eventCode, (player, serializer) =>
|
||||||
{
|
{
|
||||||
t.Deserialize(serializer);
|
t.Deserialize(serializer);
|
||||||
callback.Invoke(player, t);
|
|
||||||
|
foreach (var callbackListener in callbacks)
|
||||||
|
callbackListener.Invoke(player, t);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return action;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OffEvent<TEvent>(Action<RagonPlayer, IRagonEvent> callback) where TEvent : IRagonEvent, new()
|
||||||
|
{
|
||||||
|
var t = new TEvent();
|
||||||
|
var eventCode = _client.Event.GetEventCode(t);
|
||||||
|
var callbacks = _listeners[eventCode];
|
||||||
|
var localCallbacks = _localListeners[eventCode];
|
||||||
|
|
||||||
|
callbacks?.Remove(callback);
|
||||||
|
localCallbacks?.Remove(callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void Write(RagonBuffer buffer)
|
internal void Write(RagonBuffer buffer)
|
||||||
|
|||||||
@@ -38,7 +38,8 @@ namespace Ragon.Client
|
|||||||
public RagonPlayer Owner => _playerCache.Owner;
|
public RagonPlayer Owner => _playerCache.Owner;
|
||||||
|
|
||||||
private readonly Dictionary<int, OnEventDelegate> _events = new Dictionary<int, OnEventDelegate>();
|
private readonly Dictionary<int, OnEventDelegate> _events = new Dictionary<int, OnEventDelegate>();
|
||||||
private readonly Dictionary<int, Action<RagonPlayer, IRagonEvent>> _localEvents = new Dictionary<int, Action<RagonPlayer, IRagonEvent>>();
|
private readonly Dictionary<int, List<Action<RagonPlayer, IRagonEvent>>> _localListeners = new Dictionary<int, List<Action<RagonPlayer, IRagonEvent>>>();
|
||||||
|
private readonly Dictionary<int, List<Action<RagonPlayer, IRagonEvent>>> _listeners = new Dictionary<int, List<Action<RagonPlayer, IRagonEvent>>>();
|
||||||
|
|
||||||
public RagonRoom(RagonClient client,
|
public RagonRoom(RagonClient client,
|
||||||
RagonEntityCache entityCache,
|
RagonEntityCache entityCache,
|
||||||
@@ -72,25 +73,49 @@ namespace Ragon.Client
|
|||||||
RagonLog.Warn($"Handler event on entity {Id} with eventCode {eventCode} not defined");
|
RagonLog.Warn($"Handler event on entity {Id} with eventCode {eventCode} not defined");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnEvent<TEvent>(Action<RagonPlayer, TEvent> callback) where TEvent : IRagonEvent, new()
|
public Action<RagonPlayer, IRagonEvent> OnEvent<TEvent>(Action<RagonPlayer, TEvent> callback) where TEvent : IRagonEvent, new()
|
||||||
{
|
{
|
||||||
var t = new TEvent();
|
var t = new TEvent();
|
||||||
var eventCode = _client.Event.GetEventCode(t);
|
var eventCode = _client.Event.GetEventCode(t);
|
||||||
|
var callbacks = _listeners[eventCode];
|
||||||
|
var action = (RagonPlayer player, IRagonEvent eventData) => callback.Invoke(player, (TEvent)eventData);
|
||||||
|
|
||||||
if (_events.ContainsKey(eventCode))
|
if (callbacks == null)
|
||||||
{
|
{
|
||||||
_events.Remove(eventCode);
|
callbacks = new List<Action<RagonPlayer, IRagonEvent>>();
|
||||||
_localEvents.Remove(eventCode);
|
_listeners.Add(eventCode, callbacks);
|
||||||
|
|
||||||
RagonLog.Warn($"Event already {eventCode} subscribed, removed old one!");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_localEvents.Add(eventCode, (player, eventData) => { callback.Invoke(player, (TEvent)eventData); });
|
var localCallbacks = _localListeners[eventCode];
|
||||||
|
if (localCallbacks == null)
|
||||||
|
{
|
||||||
|
localCallbacks = new List<Action<RagonPlayer, IRagonEvent>>();
|
||||||
|
_localListeners.Add(eventCode, callbacks);
|
||||||
|
}
|
||||||
|
|
||||||
|
callbacks.Add(action);
|
||||||
|
localCallbacks.Add(action);
|
||||||
|
|
||||||
_events.Add(eventCode, (player, serializer) =>
|
_events.Add(eventCode, (player, serializer) =>
|
||||||
{
|
{
|
||||||
t.Deserialize(serializer);
|
t.Deserialize(serializer);
|
||||||
callback.Invoke(player, t);
|
|
||||||
|
foreach (var callbackListener in callbacks)
|
||||||
|
callbackListener.Invoke(player, t);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return action;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OffEvent<TEvent>(Action<RagonPlayer, IRagonEvent> callback) where TEvent : IRagonEvent, new()
|
||||||
|
{
|
||||||
|
var t = new TEvent();
|
||||||
|
var eventCode = _client.Event.GetEventCode(t);
|
||||||
|
var callbacks = _listeners[eventCode];
|
||||||
|
var localCallbacks = _localListeners[eventCode];
|
||||||
|
|
||||||
|
callbacks?.Remove(callback);
|
||||||
|
localCallbacks?.Remove(callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LoadScene(string sceneName) => _scene.Load(sceneName);
|
public void LoadScene(string sceneName) => _scene.Load(sceneName);
|
||||||
|
|||||||
Reference in New Issue
Block a user