AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
SpellEvent Class Reference
Inheritance diagram for SpellEvent:
BasicEvent

Public Member Functions

 SpellEvent (Spell *spell)
 
 ~SpellEvent ()
 
bool Execute (uint64 e_time, uint32 p_time)
 
void Abort (uint64 e_time)
 
bool IsDeletable () const
 
- Public Member Functions inherited from BasicEvent
 BasicEvent ()=default
 
virtual ~BasicEvent ()=default
 
virtual bool Execute (uint64, uint32)
 
virtual bool IsDeletable () const
 
virtual void Abort (uint64)
 
void ScheduleAbort ()
 

Protected Attributes

Spellm_Spell
 

Detailed Description

Constructor & Destructor Documentation

◆ SpellEvent()

SpellEvent::SpellEvent ( Spell spell)
8079 : BasicEvent()
8080{
8081 m_Spell = spell;
8082}
BasicEvent()=default
Spell * m_Spell
Definition: Spell.cpp:523

References m_Spell.

◆ ~SpellEvent()

SpellEvent::~SpellEvent ( )
8085{
8087 m_Spell->cancel();
8088
8089 if (m_Spell->IsDeletable())
8090 {
8091 delete m_Spell;
8092 }
8093 else
8094 {
8095 LOG_ERROR("spells", "~SpellEvent: {} {} tried to delete non-deletable spell {}. Was not deleted, causes memory leak.",
8096 (m_Spell->GetCaster()->GetTypeId() == TYPEID_PLAYER ? "Player" : "Creature"), m_Spell->GetCaster()->GetGUID().ToString(), m_Spell->m_spellInfo->Id);
8097 ABORT();
8098 }
8099}
#define ABORT
Definition: Errors.h:76
#define LOG_ERROR(filterType__,...)
Definition: Log.h:159
@ TYPEID_PLAYER
Definition: ObjectGuid.h:38
@ SPELL_STATE_FINISHED
Definition: Spell.h:226
TypeID GetTypeId() const
Definition: Object.h:121
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:106
std::string ToString() const
Definition: ObjectGuid.cpp:47
Unit * GetCaster() const
Definition: Spell.h:572
bool IsDeletable() const
Definition: Spell.h:557
uint32 getState() const
Definition: Spell.h:482
void cancel(bool bySelf=false)
Definition: Spell.cpp:3693
SpellInfo const *const m_spellInfo
Definition: Spell.h:520
uint32 Id
Definition: SpellInfo.h:318

References ABORT, Spell::cancel(), Spell::GetCaster(), Object::GetGUID(), Spell::getState(), Object::GetTypeId(), SpellInfo::Id, Spell::IsDeletable(), LOG_ERROR, m_Spell, Spell::m_spellInfo, SPELL_STATE_FINISHED, ObjectGuid::ToString(), and TYPEID_PLAYER.

Member Function Documentation

◆ Abort()

void SpellEvent::Abort ( uint64  e_time)
virtual

Reimplemented from BasicEvent.

8165{
8166 // oops, the spell we try to do is aborted
8168 m_Spell->cancel();
8169}

References Spell::cancel(), Spell::getState(), m_Spell, and SPELL_STATE_FINISHED.

◆ Execute()

bool SpellEvent::Execute ( uint64  e_time,
uint32  p_time 
)
virtual

Reimplemented from BasicEvent.

8102{
8103 // update spell if it is not finished
8105 m_Spell->update(p_time);
8106
8107 // check spell state to process
8108 switch (m_Spell->getState())
8109 {
8111 {
8112 // spell was finished, check deletable state
8113 if (m_Spell->IsDeletable())
8114 {
8115 // check, if we do have unfinished triggered spells
8116 return true; // spell is deletable, finish event
8117 }
8118 // event will be re-added automatically at the end of routine)
8119 }
8120 break;
8121
8123 {
8124 // first, check, if we have just started
8125 if (m_Spell->GetDelayStart() != 0)
8126 {
8127 {
8128 // run the spell handler and think about what we can do next
8129 uint64 t_offset = e_time - m_Spell->GetDelayStart();
8130 uint64 n_offset = m_Spell->handle_delayed(t_offset);
8131 if (n_offset)
8132 {
8133 // re-add us to the queue
8134 m_Spell->GetCaster()->m_Events.AddEvent(this, m_Spell->GetDelayStart() + n_offset, false);
8135 return false; // event not complete
8136 }
8137 // event complete
8138 // finish update event will be re-added automatically at the end of routine)
8139 }
8140 }
8141 else
8142 {
8143 // delaying had just started, record the moment
8144 m_Spell->SetDelayStart(e_time);
8145 // re-plan the event for the delay moment
8146 m_Spell->GetCaster()->m_Events.AddEvent(this, e_time + m_Spell->GetDelayMoment(), false);
8147 return false; // event not complete
8148 }
8149 }
8150 break;
8151
8152 default:
8153 {
8154 // all other states
8155 // event will be re-added automatically at the end of routine)
8156 } break;
8157 }
8158
8159 // spell processing not complete, plan event on the next update interval
8160 m_Spell->GetCaster()->m_Events.AddEvent(this, e_time + 1, false);
8161 return false; // event not complete
8162}
std::uint64_t uint64
Definition: Define.h:107
@ SPELL_STATE_DELAYED
Definition: Spell.h:228
void AddEvent(BasicEvent *Event, uint64 e_time, bool set_addtime=true)
Definition: EventProcessor.h:105
EventProcessor m_Events
Definition: Unit.h:2106
void SetDelayStart(uint64 m_time)
Definition: Spell.h:562
uint64 handle_delayed(uint64 t_offset)
Definition: Spell.cpp:4146
void update(uint32 difftime)
Definition: Spell.cpp:4368
uint64 GetDelayStart() const
Definition: Spell.h:561
uint64 GetDelayMoment() const
Definition: Spell.h:563

References EventProcessor::AddEvent(), Spell::GetCaster(), Spell::GetDelayMoment(), Spell::GetDelayStart(), Spell::getState(), Spell::handle_delayed(), Spell::IsDeletable(), Unit::m_Events, m_Spell, Spell::SetDelayStart(), SPELL_STATE_DELAYED, SPELL_STATE_FINISHED, and Spell::update().

◆ IsDeletable()

bool SpellEvent::IsDeletable ( ) const
virtual

Reimplemented from BasicEvent.

8172{
8173 return m_Spell->IsDeletable();
8174}

References Spell::IsDeletable(), and m_Spell.

Member Data Documentation

◆ m_Spell

Spell* SpellEvent::m_Spell
protected