static void BufferEvent(IEvent evt, ref BufferedEventHolder holder) { string eventName = evt.GetName(); Queue <BufferedEventHolder> currentBuffer; if (!bufferedEvents.ContainsKey(eventName)) { currentBuffer = new Queue <BufferedEventHolder>(); bufferedEvents.Add(eventName, currentBuffer); } else { currentBuffer = bufferedEvents[eventName]; } //if we have exceeded the maximum buffer size for this event then discard the oldest event if (currentBuffer.Count > MaximumBufferSizePerEvent) { Debug.LogWarning("Event Manager: Maximum buffered event size reach for Event \"" + eventName + "\"."); currentBuffer.Dequeue(); } holder = new BufferedEventHolder(evt); unhandledBuffers.Add(holder); currentBuffer.Enqueue(holder); }
static void UnbufferEvent(BufferedEventHolder holder) { if (holder == null) { return; } holder.HasEverBeenHandled = true; holder.LastHandledDate = ListenerAttachDate; if (unhandledBuffers.Contains(holder)) { unhandledBuffers.Remove(holder); } }
/// <summary> /// Triggers an event instantly. /// All listeners will execute their handleEvent inside this block, even if it is a widely subscribed event /// </summary> /// <param name="evt"></param> /// <returns></returns> public static bool TriggerEvent(IEvent evt, bool shouldBuffer = false) { string eventName = CheckEventName(evt); BufferedEventHolder currentBufferHolder = null; //checking to see if the event should get saved for buffered recievers if (shouldBuffer) { BufferEvent(evt, ref currentBufferHolder); } else if (HasNoListeners(eventName)) { return(false); } ArrayList listenerList = _listenerTable[eventName] as ArrayList; if (listenerList == null) { return(true); } // Changed this to a for loop because detaching a listener during the enumeration causes errors. for (var i = listenerList.Count - 1; i >= 0; --i) { i = Mathf.Clamp(i, 0, listenerList.Count - 1); // Ran into a case once where i became out of range. Band-aid fix. I tried moving anything that modifies _listenerTable to outside this loop with no good results. var listener = (IEventListener)listenerList[i]; if (!ValidateListener(1, listener, eventName)) { continue; } // THE ACTUAL EVENT HANDLER // if (listener.HandleEvent(evt) == ListenerResult.Ignored) { Debug.LogError("The listener, " + listener + " appears to be ignoring the event, " + evt.GetName() + " to which it is subscribed. This is not optimal."); } else if (shouldBuffer) { UnbufferEvent(currentBufferHolder); } } return(true); }