+
+ this->CantDeleteHere = false;
+}
+
+void TimerManager::DelTimer(Timer* T)
+{
+ if (this->CantDeleteHere)
+ {
+ /* If a developer tries to delete a timer from within its own Tick method,
+ * then chances are this is just going to totally fuck over the timergroup
+ * and timerlist iterators and cause a crash. Thanks to peavey and Bricker
+ * for noticing this bug.
+ * If we're within the tick loop when the DelTimer is called (signified
+ * by the var 'CantDeleteHere') then we simply return for non-repeating
+ * timers, and cancel the repeat on repeating timers. We can do this because
+ * we know that the timer tick loop will safely delete the timer for us
+ * anyway and therefore we avoid stack corruption.
+ */
+ if (T->GetRepeat())
+ T->CancelRepeat();
+ else
+ return;
+ }
+
+ timerlist::iterator found = Timers.find(T->GetTimer());
+
+ if (found != Timers.end())
+ {
+ timergroup* x = found->second;
+ for (timergroup::iterator y = x->begin(); y != x->end(); y++)
+ {
+ Timer* n = *y;
+ if (n == T)
+ {
+ DELETE(n);
+ x->erase(y);
+ if (!x->size())
+ {
+ Timers.erase(found);
+ DELETE(x);
+ }
+ return;
+ }
+ }
+ }