diff options
-rw-r--r-- | src/bindings/scripts/scripts/eastern_kingdoms/sunwell_plateau/boss_kalecgos.cpp | 169 | ||||
-rw-r--r-- | src/game/Unit.cpp | 2 | ||||
-rw-r--r-- | src/game/UnitAI.cpp | 11 |
3 files changed, 91 insertions, 91 deletions
diff --git a/src/bindings/scripts/scripts/eastern_kingdoms/sunwell_plateau/boss_kalecgos.cpp b/src/bindings/scripts/scripts/eastern_kingdoms/sunwell_plateau/boss_kalecgos.cpp index 3786f22af08..0cf83a6a2e7 100644 --- a/src/bindings/scripts/scripts/eastern_kingdoms/sunwell_plateau/boss_kalecgos.cpp +++ b/src/bindings/scripts/scripts/eastern_kingdoms/sunwell_plateau/boss_kalecgos.cpp @@ -136,14 +136,14 @@ struct TRINITY_DLL_DECL boss_kalecgosAI : public ScriptedAI Door->SetLootState(GO_JUST_DEACTIVATED); } - Unit *Sath = Unit::GetUnit(*m_creature,SathGUID); - if (Sath) CAST_CRE(Sath)->AI()->EnterEvadeMode(); + if(Creature *Sath = Unit::GetCreature(*me, SathGUID)) + Sath->AI()->EnterEvadeMode(); - m_creature->setFaction(14); - m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE); - m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - m_creature->SetVisibility(VISIBILITY_ON); - m_creature->SetStandState(UNIT_STAND_STATE_SLEEP); + me->setFaction(14); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE); + me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->SetVisibility(VISIBILITY_ON); + me->SetStandState(UNIT_STAND_STATE_SLEEP); ArcaneBuffetTimer = 8000; FrostBreathTimer = 15000; @@ -161,14 +161,14 @@ struct TRINITY_DLL_DECL boss_kalecgosAI : public ScriptedAI void DamageTaken(Unit *done_by, uint32 &damage) { - if (damage >= m_creature->GetHealth() && done_by != m_creature) + if (damage >= me->GetHealth() && done_by != me) damage = 0; } void EnterCombat(Unit* who) { - m_creature->SetStandState(UNIT_STAND_STATE_STAND); - DoScriptText(SAY_EVIL_AGGRO, m_creature); + me->SetStandState(UNIT_STAND_STATE_STAND); + DoScriptText(SAY_EVIL_AGGRO, me); if (GameObject *Door = pInstance ? pInstance->instance->GetGameObject(pInstance->GetData64(DoorGUID)) : NULL) Door->SetLootState(GO_ACTIVATED); DoZoneInCombat(); @@ -181,19 +181,19 @@ struct TRINITY_DLL_DECL boss_kalecgosAI : public ScriptedAI { switch(rand()%2) { - case 0: DoScriptText(SAY_EVIL_SLAY1, m_creature); break; - case 1: DoScriptText(SAY_EVIL_SLAY2, m_creature); break; + case 0: DoScriptText(SAY_EVIL_SLAY1, me); break; + case 1: DoScriptText(SAY_EVIL_SLAY2, me); break; } } void MovementInform(uint32 type,uint32 id) { - m_creature->SetVisibility(VISIBILITY_OFF); + me->SetVisibility(VISIBILITY_OFF); if (isFriendly) - m_creature->setDeathState(JUST_DIED); + me->setDeathState(JUST_DIED); else { - m_creature->GetMotionMaster()->MoveTargetedHome(); + me->GetMotionMaster()->MoveTargetedHome(); TalkTimer = 30000; } } @@ -203,17 +203,16 @@ struct TRINITY_DLL_DECL boss_kalecgosAI : public ScriptedAI switch(TalkSequence) { case 1: - m_creature->setFaction(35); + me->setFaction(35); TalkTimer = 1000; break; case 2: - DoScriptText(SAY_GOOD_PLRWIN, m_creature); + DoScriptText(SAY_GOOD_PLRWIN, me); TalkTimer = 10000; break; case 3: - m_creature->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - m_creature->GetMotionMaster()->Clear(); - m_creature->GetMotionMaster()->MovePoint(0,FLY_X,FLY_Y,FLY_Z); + me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->GetMotionMaster()->MovePoint(0,FLY_X,FLY_Y,FLY_Z); TalkTimer = 600000; break; default: @@ -226,13 +225,12 @@ struct TRINITY_DLL_DECL boss_kalecgosAI : public ScriptedAI switch(TalkSequence) { case 1: - DoScriptText(SAY_EVIL_ENRAGE, m_creature); + DoScriptText(SAY_EVIL_ENRAGE, me); TalkTimer = 3000; break; case 2: - m_creature->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - m_creature->GetMotionMaster()->Clear(); - m_creature->GetMotionMaster()->MovePoint(0,FLY_X,FLY_Y,FLY_Z); + me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->GetMotionMaster()->MovePoint(0,FLY_X,FLY_Y,FLY_Z); TalkTimer = 600000; break; case 3: @@ -276,7 +274,7 @@ struct TRINITY_DLL_DECL boss_sathrovarrAI : public ScriptedAI if (KalecGUID) { - if (Unit* Kalec = Unit::GetUnit(*m_creature, KalecGUID)) + if (Creature* Kalec = Unit::GetCreature(*me, KalecGUID)) Kalec->setDeathState(JUST_DIED); KalecGUID = 0; } @@ -298,19 +296,18 @@ struct TRINITY_DLL_DECL boss_sathrovarrAI : public ScriptedAI void EnterCombat(Unit* who) { - Creature *Kalec = m_creature->SummonCreature(MOB_KALEC, m_creature->GetPositionX() + 10, m_creature->GetPositionY() + 5, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0); - if (Kalec) + if(Creature *Kalec = me->SummonCreature(MOB_KALEC, me->GetPositionX() + 10, me->GetPositionY() + 5, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0)) { KalecGUID = Kalec->GetGUID(); - m_creature->CombatStart(Kalec); - m_creature->AddThreat(Kalec, 100.0f); + me->CombatStart(Kalec); + me->AddThreat(Kalec, 100.0f); } - DoScriptText(SAY_SATH_AGGRO, m_creature); + DoScriptText(SAY_SATH_AGGRO, me); } void DamageTaken(Unit *done_by, uint32 &damage) { - if (damage >= m_creature->GetHealth() && done_by != m_creature) + if (damage >= me->GetHealth() && done_by != me) damage = 0; } @@ -319,30 +316,30 @@ struct TRINITY_DLL_DECL boss_sathrovarrAI : public ScriptedAI if (target->GetGUID() == KalecGUID) { TeleportAllPlayersBack(); - if (Unit *Kalecgos = Unit::GetUnit(*m_creature, KalecgosGUID)) + if (Creature *Kalecgos = Unit::GetCreature(*me, KalecgosGUID)) { - CAST_AI(boss_kalecgosAI, CAST_CRE(Kalecgos)->AI())->TalkTimer = 1; - CAST_AI(boss_kalecgosAI, CAST_CRE(Kalecgos)->AI())->isFriendly = false; + CAST_AI(boss_kalecgosAI, Kalecgos->AI())->TalkTimer = 1; + CAST_AI(boss_kalecgosAI, Kalecgos->AI())->isFriendly = false; } EnterEvadeMode(); return; } switch(rand()%2) { - case 0: DoScriptText(SAY_SATH_SLAY1, m_creature); break; - case 1: DoScriptText(SAY_SATH_SLAY2, m_creature); break; + case 0: DoScriptText(SAY_SATH_SLAY1, me); break; + case 1: DoScriptText(SAY_SATH_SLAY2, me); break; } } void JustDied(Unit *killer) { - DoScriptText(SAY_SATH_DEATH, m_creature); - m_creature->GetMap()->CreatureRelocation(m_creature, m_creature->GetPositionX(), m_creature->GetPositionY(), DRAGON_REALM_Z, m_creature->GetOrientation()); + DoScriptText(SAY_SATH_DEATH, me); + me->GetMap()->CreatureRelocation(me, me->GetPositionX(), me->GetPositionY(), DRAGON_REALM_Z, me->GetOrientation()); TeleportAllPlayersBack(); - if (Unit *Kalecgos = Unit::GetUnit(*m_creature, KalecgosGUID)) + if (Creature *Kalecgos = Unit::GetCreature(*me, KalecgosGUID)) { - CAST_AI(boss_kalecgosAI, CAST_CRE(Kalecgos)->AI())->TalkTimer = 1; - CAST_AI(boss_kalecgosAI, CAST_CRE(Kalecgos)->AI())->isFriendly = true; + CAST_AI(boss_kalecgosAI, Kalecgos->AI())->TalkTimer = 1; + CAST_AI(boss_kalecgosAI, Kalecgos->AI())->isFriendly = true; } if (pInstance) @@ -351,14 +348,11 @@ struct TRINITY_DLL_DECL boss_sathrovarrAI : public ScriptedAI void TeleportAllPlayersBack() { - Map* pMap = m_creature->GetMap(); + Map* pMap = me->GetMap(); if (!pMap->IsDungeon()) return; Map::PlayerList const &PlayerList = pMap->GetPlayers(); - Map::PlayerList::const_iterator i; - for(i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (Player* i_pl = i->getSource()) - if (i_pl->HasAura(AURA_SPECTRAL_REALM)) - i_pl->RemoveAurasDueToSpell(AURA_SPECTRAL_REALM); + for(Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + i->getSource()->RemoveAura(AURA_SPECTRAL_REALM); } void UpdateAI(const uint32 diff) @@ -368,36 +362,35 @@ struct TRINITY_DLL_DECL boss_sathrovarrAI : public ScriptedAI if (CheckTimer < diff) { - if (((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 10) && !isEnraged) + if (HealthBelowPct(10) && !isEnraged) { - Unit* Kalecgos = Unit::GetUnit(*m_creature, KalecgosGUID); - if (Kalecgos) + if(Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID)) { Kalecgos->CastSpell(Kalecgos, SPELL_ENRAGE, true); - CAST_AI(boss_kalecgosAI, CAST_CRE(Kalecgos)->AI())->isEnraged = true; + CAST_AI(boss_kalecgosAI, Kalecgos->AI())->isEnraged = true; } - DoCast(m_creature, SPELL_ENRAGE, true); + DoCast(me, SPELL_ENRAGE, true); isEnraged = true; } - if (!isBanished && (m_creature->GetHealth()*100)/m_creature->GetMaxHealth() < 1) + if (!isBanished && HealthBelowPct(1)) { - if (Unit *Kalecgos = Unit::GetUnit(*m_creature, KalecgosGUID)) + if (Creature *Kalecgos = Unit::GetCreature(*me, KalecgosGUID)) { - if (CAST_AI(boss_kalecgosAI, CAST_CRE(Kalecgos)->AI())->isBanished) + if (CAST_AI(boss_kalecgosAI, Kalecgos->AI())->isBanished) { - m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + me->DealDamage(me, me->GetHealth()); return; } else { - DoCast(m_creature, SPELL_BANISH); + DoCast(me, SPELL_BANISH); isBanished = true; } } else { - m_creature->MonsterTextEmote("is unable to find Kalecgos", NULL); + me->MonsterTextEmote("is unable to find Kalecgos", NULL); EnterEvadeMode(); return; } @@ -407,11 +400,11 @@ struct TRINITY_DLL_DECL boss_sathrovarrAI : public ScriptedAI if (ResetThreat < diff) { - if ((m_creature->getVictim()->HasAura(AURA_SPECTRAL_EXHAUSTION)) && (m_creature->getVictim()->GetTypeId() == TYPEID_PLAYER)) + if ((me->getVictim()->HasAura(AURA_SPECTRAL_EXHAUSTION)) && (me->getVictim()->GetTypeId() == TYPEID_PLAYER)) { - for(std::list<HostilReference*>::iterator itr = m_creature->getThreatManager().getThreatList().begin(); itr != m_creature->getThreatManager().getThreatList().end(); ++itr) + for(std::list<HostilReference*>::iterator itr = me->getThreatManager().getThreatList().begin(); itr != me->getThreatManager().getThreatList().end(); ++itr) { - if (((*itr)->getUnitGuid()) == (m_creature->getVictim()->GetGUID())) + if (((*itr)->getUnitGuid()) == (me->getVictim()->GetGUID())) { (*itr)->removeReference(); break; @@ -423,23 +416,23 @@ struct TRINITY_DLL_DECL boss_sathrovarrAI : public ScriptedAI if (ShadowBoltTimer < diff) { - DoScriptText(SAY_SATH_SPELL1, m_creature); - DoCast(m_creature, SPELL_SHADOW_BOLT); + DoScriptText(SAY_SATH_SPELL1, me); + DoCast(me, SPELL_SHADOW_BOLT); ShadowBoltTimer = 7000+(rand()%3000); }else ShadowBoltTimer -= diff; if (AgonyCurseTimer < diff) { Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0); - if (!target) target = m_creature->getVictim(); + if (!target) target = me->getVictim(); DoCast(target, SPELL_AGONY_CURSE); AgonyCurseTimer = 20000; }else AgonyCurseTimer -= diff; if (CorruptionStrikeTimer < diff) { - DoScriptText(SAY_SATH_SPELL2, m_creature); - DoCast(m_creature->getVictim(), SPELL_CORRUPTION_STRIKE); + DoScriptText(SAY_SATH_SPELL2, me); + DoCast(me->getVictim(), SPELL_CORRUPTION_STRIKE); CorruptionStrikeTimer = 13000; }else CorruptionStrikeTimer -= diff; @@ -498,20 +491,20 @@ struct TRINITY_DLL_DECL boss_kalecAI : public ScriptedAI switch(YellSequence) { case 0: - DoScriptText(SAY_GOOD_AGGRO, m_creature); + DoScriptText(SAY_GOOD_AGGRO, me); YellSequence++; break; case 1: - if ((m_creature->GetHealth()*100)/m_creature->GetMaxHealth() < 50) + if (HealthBelowPct(50)) { - DoScriptText(SAY_GOOD_NEAR_DEATH, m_creature); + DoScriptText(SAY_GOOD_NEAR_DEATH, me); YellSequence++; } break; case 2: - if ((m_creature->GetHealth()*100)/m_creature->GetMaxHealth() < 10) + if (HealthBelowPct(10)) { - DoScriptText(SAY_GOOD_NEAR_DEATH2, m_creature); + DoScriptText(SAY_GOOD_NEAR_DEATH2, me); YellSequence++; } break; @@ -523,13 +516,13 @@ struct TRINITY_DLL_DECL boss_kalecAI : public ScriptedAI if (RevitalizeTimer < diff) { - DoCast(m_creature, SPELL_REVITALIZE); + DoCast(me, SPELL_REVITALIZE); RevitalizeTimer = 5000; }else RevitalizeTimer -= diff; if (HeroicStrikeTimer < diff) { - DoCast(m_creature->getVictim(), SPELL_HEROIC_STRIKE); + DoCast(me->getVictim(), SPELL_HEROIC_STRIKE); HeroicStrikeTimer = 2000; }else HeroicStrikeTimer -= diff; @@ -543,11 +536,11 @@ void boss_kalecgosAI::UpdateAI(const uint32 diff) { if (!TalkSequence) { - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE); - m_creature->InterruptNonMeleeSpells(true); - m_creature->RemoveAllAuras(); - m_creature->DeleteThreatList(); - m_creature->CombatStop(); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE); + me->InterruptNonMeleeSpells(true); + me->RemoveAllAuras(); + me->DeleteThreatList(); + me->CombatStop(); if (GameObject *Door = pInstance ? pInstance->instance->GetGameObject(pInstance->GetData64(DoorGUID)) : NULL) Door->SetLootState(GO_JUST_DEACTIVATED); TalkSequence++; @@ -568,30 +561,29 @@ void boss_kalecgosAI::UpdateAI(const uint32 diff) if (CheckTimer < diff) { - if (((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 10) && !isEnraged) + if (HealthBelowPct(10) && !isEnraged) { - Unit* Sath = Unit::GetUnit(*m_creature, SathGUID); - if (Sath) + if(Creature* Sath = Unit::GetCreature(*me, SathGUID)) { Sath->CastSpell(Sath, SPELL_ENRAGE, true); - CAST_AI(boss_sathrovarrAI, CAST_CRE(Sath)->AI())->isEnraged = true; + CAST_AI(boss_sathrovarrAI, Sath->AI())->isEnraged = true; } - DoCast(m_creature, SPELL_ENRAGE, true); + DoCast(me, SPELL_ENRAGE, true); isEnraged = true; } - if (!isBanished && (m_creature->GetHealth()*100)/m_creature->GetMaxHealth() < 1) + if (!isBanished && HealthBelowPct(1)) { - if (Unit *Sath = Unit::GetUnit(*m_creature, SathGUID)) + if(Creature* Sath = Unit::GetCreature(*me, SathGUID)) { - if (CAST_AI(boss_sathrovarrAI, CAST_CRE(Sath)->AI())->isBanished) + if (CAST_AI(boss_sathrovarrAI, Sath->AI())->isBanished) { Sath->DealDamage(Sath, Sath->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); return; } else { - DoCast(m_creature, SPELL_BANISH); + DoCast(me, SPELL_BANISH); isBanished = true; } } @@ -632,8 +624,7 @@ void boss_kalecgosAI::UpdateAI(const uint32 diff) if (SpectralBlastTimer < diff) { //this is a hack. we need to find a victim without aura in core - Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0); - if (target && target != m_creature->getVictim() && target->isAlive() && !target->HasAura(AURA_SPECTRAL_EXHAUSTION)) + if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0, true, -AURA_SPECTRAL_EXHAUSTION)) { DoCast(target, SPELL_SPECTRAL_BLAST); SpectralBlastTimer = 20000+(rand()%5000); diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index b0c8262df0c..f40eefe550b 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -2835,7 +2835,7 @@ SpellMissInfo Unit::MagicSpellHitResult(Unit *pVictim, SpellEntry const *spell) SpellMissInfo Unit::SpellHitResult(Unit *pVictim, SpellEntry const *spell, bool CanReflect) { // Return evade for units in evade mode - if (pVictim->GetTypeId()==TYPEID_UNIT && ((Creature*)pVictim)->IsInEvadeMode()) + if (pVictim->GetTypeId()==TYPEID_UNIT && ((Creature*)pVictim)->IsInEvadeMode() && this != pVictim) return SPELL_MISS_EVADE; // Check for immune diff --git a/src/game/UnitAI.cpp b/src/game/UnitAI.cpp index 0f00cd356f2..4ba2f94e4db 100644 --- a/src/game/UnitAI.cpp +++ b/src/game/UnitAI.cpp @@ -165,7 +165,16 @@ Unit* UnitAI::SelectTarget(SelectAggroTarget targetType, uint32 position, float if(targetType == SELECT_TARGET_TOPAGGRO) advance(i, position); else // random - advance(i, position + rand()%(m_threatlist.size() - position)); + { + //advance(i, position + rand()%(m_threatlist.size() - position)); + //if we use "random, 1", usually we want random except current victim + advance(i, rand()%m_threatlist.size()); + if(position && (*i)->getTarget() == me->getVictim()) + { + m_threatlist.erase(i); + continue; + } + } } if(SelectTargetHelper(me, (*i)->getTarget(), playerOnly, dist, aura)) |