Instead mark spell as delatable mark it as executed and referenced from Unit current spells array and not deleted spell in like cases.

This is solve crashs if spell deleted at caster die in result triggered spells casting chain from currently executed spell.
This commit is contained in:
VladimirMangos 2008-11-03 01:09:18 +03:00
parent 322b201c4d
commit ed7390dede
7 changed files with 61 additions and 25 deletions

View file

@ -26,7 +26,7 @@ EventProcessor::EventProcessor()
EventProcessor::~EventProcessor()
{
KillAllEvents();
KillAllEvents(true);
}
void EventProcessor::Update(uint32 p_time)
@ -58,21 +58,31 @@ void EventProcessor::Update(uint32 p_time)
}
}
void EventProcessor::KillAllEvents()
void EventProcessor::KillAllEvents(bool force)
{
// prevent event insertions
m_aborting = true;
// first, abort all existing events
for (EventList::iterator i = m_events.begin(); i != m_events.end(); ++i)
for (EventList::iterator i = m_events.begin(); i != m_events.end();)
{
i->second->to_Abort = true;
i->second->Abort(m_time);
delete i->second;
EventList::iterator i_old = i;
++i;
i_old->second->to_Abort = true;
i_old->second->Abort(m_time);
if(force || i_old->second->IsDeletable())
{
delete i_old->second;
if(!force) // need per-element cleanup
m_events.erase (i_old);
}
}
// clear event list
m_events.clear();
// fast clear event list (in force case)
if(force)
m_events.clear();
}
void EventProcessor::AddEvent(BasicEvent* Event, uint64 e_time, bool set_addtime)

View file

@ -38,6 +38,8 @@ class BasicEvent
// e_time is execution time, p_time is update interval
virtual bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) { return true; }
virtual bool IsDeletable() const { return true; } // this event can be safely deleted
virtual void Abort(uint64 /*e_time*/) {} // this method executes when the event is aborted
bool to_Abort; // set by externals when the event is aborted, aborted events don't execute
@ -57,7 +59,7 @@ class EventProcessor
~EventProcessor();
void Update(uint32 p_time);
void KillAllEvents();
void KillAllEvents(bool force);
void AddEvent(BasicEvent* Event, uint64 e_time, bool set_addtime = true);
uint64 CalculateTime(uint64 t_offset);
protected: