diff options
author | megamage <none@none> | 2009-01-21 14:17:29 -0600 |
---|---|---|
committer | megamage <none@none> | 2009-01-21 14:17:29 -0600 |
commit | d81d81b211977093c8481a591a96bcc69d66bfe8 (patch) | |
tree | 28fd22cfefe9d39bf305a68646745aa4f9d5dddc /src | |
parent | 148192eca1c60b95d2b9e75520e0d0ee8d4cd6fd (diff) |
*Move SelectHostilTarget() to class Creature and return getVictim() directly.
*Fix the crash caused by mandokir script.
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/bindings/scripts/scripts/zone/karazhan/boss_moroes.cpp | 6 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp | 7 | ||||
-rw-r--r-- | src/game/Creature.h | 1 | ||||
-rw-r--r-- | src/game/Unit.cpp | 46 | ||||
-rw-r--r-- | src/game/Unit.h | 5 |
5 files changed, 38 insertions, 27 deletions
diff --git a/src/bindings/scripts/scripts/zone/karazhan/boss_moroes.cpp b/src/bindings/scripts/scripts/zone/karazhan/boss_moroes.cpp index 3f0d6dd7a27..99283ca7097 100644 --- a/src/bindings/scripts/scripts/zone/karazhan/boss_moroes.cpp +++ b/src/bindings/scripts/scripts/zone/karazhan/boss_moroes.cpp @@ -276,13 +276,13 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI { for (uint8 i = 0; i < 4; ++i) { - Unit* Temp = NULL; + Creature* Temp = NULL; if (AddGUID[i]) { - Temp = Unit::GetUnit((*m_creature),AddGUID[i]); + Temp = (Creature*)Unit::GetUnit((*m_creature),AddGUID[i]); if (Temp && Temp->isAlive()) if (!Temp->SelectHostilTarget() || !Temp->getVictim() ) - ((Creature*)Temp)->AI()->AttackStart(m_creature->getVictim()); + Temp->AI()->AttackStart(m_creature->getVictim()); } } CheckAdds_Timer = 5000; diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp index 14f3702354d..a440ba4a575 100644 --- a/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp +++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp @@ -131,7 +131,8 @@ struct TRINITY_DLL_DECL boss_mandokirAI : public ScriptedAI void UpdateAI(const uint32 diff) { - if (!m_creature->SelectHostilTarget() || !m_creature->getVictim()) + Unit *victim = m_creature->SelectHostilTarget(); + if(!victim) return; if( m_creature->getVictim() && m_creature->isAlive()) @@ -234,11 +235,11 @@ struct TRINITY_DLL_DECL boss_mandokirAI : public ScriptedAI }else Fear_Timer -=diff; //Mortal Strike if target below 50% hp - if (m_creature->getVictim()->GetHealth() < m_creature->getVictim()->GetMaxHealth()*0.5) + if (victim && victim->GetHealth() < victim->GetMaxHealth()*0.5) { if (MortalStrike_Timer < diff) { - DoCast(m_creature->getVictim(),SPELL_MORTAL_STRIKE); + DoCast(victim,SPELL_MORTAL_STRIKE); MortalStrike_Timer = 15000; }else MortalStrike_Timer -= diff; } diff --git a/src/game/Creature.h b/src/game/Creature.h index 1ae41b86776..563a9ddb80c 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -630,6 +630,7 @@ class TRINITY_DLL_SPEC Creature : public Unit bool IsFormationLeader() {return (GetDBTableGUIDLow() && GetDBTableGUIDLow() == m_formationID);} uint32 GetFormationID(){return m_formationID;} + Unit *SelectHostilTarget(); protected: bool CreateFromProto(uint32 guidlow,uint32 Entry,uint32 team, const CreatureData *data = NULL); bool InitEntry(uint32 entry, uint32 team=ALLIANCE, const CreatureData* data=NULL); diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index d46d77f8703..35b45c2750e 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -261,8 +261,17 @@ Unit::~Unit() if(m_uint32Values) { sLog.outDetail("Deconstruct Unit Entry = %u", GetEntry()); - if(m_scAuras.size()) + /*for(int i = 0; i < TOTAL_AURAS; ++i) + { + if(m_modAuras[i].begin() != m_modAuras[i].end()) + sLog.outError("Unit %u has mod auras during deconstruction", GetEntry()); + } + if(m_scAuras.begin() != m_scAuras.end()) sLog.outError("Unit %u has sc auras during deconstruction", GetEntry()); + if(m_interruptableAuras.begin() != m_interruptableAuras.end()) + sLog.outError("Unit %u has interruptable auras during deconstruction", GetEntry()); + if(m_ccAuras.begin() != m_ccAuras.end()) + sLog.outError("Unit %u has cc auras during deconstruction", GetEntry());*/ } } @@ -10390,18 +10399,17 @@ void Unit::TauntFadeOut(Unit *taunter) //====================================================================== -bool Unit::SelectHostilTarget() +Unit* Creature::SelectHostilTarget() { //function provides main threat functionality //next-victim-selection algorithm and evade mode are called //threat list sorting etc. - assert(GetTypeId()== TYPEID_UNIT); Unit* target = NULL; //This function only useful once AI has been initialized - if (!((Creature*)this)->AI()) - return false; + if (!AI()) + return NULL; if(!m_ThreatManager.isThreatListEmpty()) { @@ -10417,36 +10425,36 @@ bool Unit::SelectHostilTarget() { if(!hasUnitState(UNIT_STAT_STUNNED)) SetInFront(target); - ((Creature*)this)->AI()->AttackStart(target); - return true; + AI()->AttackStart(target); + return getVictim(); } // no target but something prevent go to evade mode if( !isInCombat() /*|| HasAuraType(SPELL_AURA_MOD_TAUNT)*/ ) - return false; + return NULL; // last case when creature don't must go to evade mode: // it in combat but attacker not make any damage and not enter to aggro radius to have record in threat list // for example at owner command to pet attack some far away creature // Note: creature not have targeted movement generator but have attacker in this case - if( GetMotionMaster()->GetCurrentMovementGeneratorType() != TARGETED_MOTION_TYPE ) + /*if( GetMotionMaster()->GetCurrentMovementGeneratorType() != TARGETED_MOTION_TYPE ) { for(AttackerSet::const_iterator itr = m_attackers.begin(); itr != m_attackers.end(); ++itr) { if( (*itr)->IsInMap(this) && canAttack(*itr) && (*itr)->isInAccessiblePlaceFor((Creature*)this) ) return false; } - } + }*/ // search nearby enemy before enter evade mode - if(((Creature*)this)->HasReactState(REACT_AGGRESSIVE)) + if(HasReactState(REACT_AGGRESSIVE)) { - if(Unit *target = ((Creature*)this)->SelectNearestTarget()) + if(target = SelectNearestTarget()) { - if(!((Creature*)this)->IsOutOfThreatArea(target)) + if(!IsOutOfThreatArea(target)) { - ((Creature*)this)->AI()->AttackStart(target); - return true; + AI()->AttackStart(target); + return getVictim(); } } } @@ -10457,16 +10465,16 @@ bool Unit::SelectHostilTarget() for(Unit::AuraList::const_iterator itr = iAuras.begin(); itr != iAuras.end(); ++itr) if((*itr)->IsPermanent()) { - ((Creature*)this)->AI()->EnterEvadeMode(); + AI()->EnterEvadeMode(); break; } - return false; + return NULL; } // enter in evade mode in other case - ((Creature*)this)->AI()->EnterEvadeMode(); + AI()->EnterEvadeMode(); - return false; + return NULL; } //====================================================================== diff --git a/src/game/Unit.h b/src/game/Unit.h index 077e82a2143..83cb1900506 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -1238,7 +1238,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject void AddThreat(Unit* pVictim, float threat, SpellSchoolMask schoolMask = SPELL_SCHOOL_MASK_NORMAL, SpellEntry const *threatSpell = NULL); float ApplyTotalThreatModifier(float threat, SpellSchoolMask schoolMask = SPELL_SCHOOL_MASK_NORMAL); void DeleteThreatList(); - bool SelectHostilTarget(); + //bool SelectHostilTarget(); void TauntApply(Unit* pVictim); void TauntFadeOut(Unit *taunter); ThreatManager& getThreatManager() { return m_ThreatManager; } @@ -1450,6 +1450,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject uint32 m_reactiveTimer[MAX_REACTIVE]; + ThreatManager m_ThreatManager; private: void SendAttackStop(Unit* victim); // only from AttackStop(Unit*) //void SendAttackStart(Unit* pVictim); // only from Unit::AttackStart(Unit*) @@ -1469,7 +1470,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject Diminishing m_Diminishing; // Manage all Units threatening us - ThreatManager m_ThreatManager; +// ThreatManager m_ThreatManager; // Manage all Units that are threatened by us HostilRefManager m_HostilRefManager; |