diff options
author | maximius <none@none> | 2009-10-06 13:16:10 -0700 |
---|---|---|
committer | maximius <none@none> | 2009-10-06 13:16:10 -0700 |
commit | dd84dfd56da21763840491c1ff2f363d73e9d6de (patch) | |
tree | 7bf91ea4888031cc71b0b18d0d7106404dca35f3 /src | |
parent | a3de0f7ba0dbe107fd5b66f3d3518764abb2c0f6 (diff) |
*Utgarde Pinnacle: Svala fixes - Fix some crashes, complete ritual code and change defines by enums, by Tartalo
*Fix Acherus Flightmaster for Alliance, by MrSmite
*Fix The Party's Over achievement (Prince Taldaram) & Implement Good Grief achievement (Maiden of Grief), by Tartalo
*Fix certaint things entering the threat list and never leaving, bugging mob's HP regeneration (ie: Priest's Lightwell).. again. Thanks Gyullo.
--HG--
branch : trunk
Diffstat (limited to 'src')
7 files changed, 152 insertions, 108 deletions
diff --git a/src/bindings/scripts/scripts/northrend/azjol_nerub/ahnkahet/boss_prince_taldaram.cpp b/src/bindings/scripts/scripts/northrend/azjol_nerub/ahnkahet/boss_prince_taldaram.cpp index 27b91a9a269..3b191dd7f8d 100644 --- a/src/bindings/scripts/scripts/northrend/azjol_nerub/ahnkahet/boss_prince_taldaram.cpp +++ b/src/bindings/scripts/scripts/northrend/azjol_nerub/ahnkahet/boss_prince_taldaram.cpp @@ -27,48 +27,49 @@ EndScriptData */ #include "precompiled.h" #include "def_ahnkahet.h" -#define SPELL_BLOODTHIRST 55968 //Trigger Spell + add aura -#define SPELL_CONJURE_FLAME_SPHERE 55931 - -#define SPELL_FLAME_SPHERE_SUMMON_1 55895// 1x 30106 -#define H_SPELL_FLAME_SPHERE_SUMMON_1 59511// 1x 31686 -#define H_SPELL_FLAME_SPHERE_SUMMON_2 59512// 1x 31687 -#define SPELL_FLAME_SPHERE_SPAWN_EFFECT 55891 -#define SPELL_FLAME_SPHERE_VISUAL 55928 -#define SPELL_FLAME_SPHERE_PERIODIC 55926 -#define H_SPELL_FLAME_SPHERE_PERIODIC 59508 -#define SPELL_FLAME_SPHERE_DEATH_EFFECT 55947 -#define SPELL_BEAM_VISUAL 60342 - -#define SPELL_EMBRACE_OF_THE_VAMPYR 55959 -#define H_SPELL_EMBRACE_OF_THE_VAMPYR 59513 - -#define SPELL_VANISH 55964 - -#define CREATURE_FLAME_SPHERE 30106 -#define H_CREATURE_FLAME_SPHERE_1 31686 -#define H_CREATURE_FLAME_SPHERE_2 31687 - -#define DATA_EMBRACE_DMG 20000 -#define H_DATA_EMBRACE_DMG 40000 - -#define DATA_GROUND_POSITION_Z 11.4 -#define DATA_SPHERE_DISTANCE 20 -#define DATA_SPHERE_ANGLE_OFFSET 1 - -#define ACHIEVEMENT_THE_PARTY_IS_OVER 1861 - -//not in db -//Yell -#define SAY_AGGRO -1619021 -#define SAY_SLAY_1 -1619022 -#define SAY_SLAY_2 -1619023 -#define SAY_DEATH -1619024 -#define SAY_FEED_1 -1619025 -#define SAY_FEED_2 -1619026 -#define SAY_VANISH_1 -1619027 -#define SAY_VANISH_2 -1619028 - +enum Spells +{ + SPELL_BLOODTHIRST = 55968, //Trigger Spell + add aura + SPELL_CONJURE_FLAME_SPHERE = 55931, + SPELL_FLAME_SPHERE_SUMMON_1 = 55895,// 1x 30106 + H_SPELL_FLAME_SPHERE_SUMMON_1 = 59511,// 1x 31686 + H_SPELL_FLAME_SPHERE_SUMMON_2 = 59512,// 1x 31687 + SPELL_FLAME_SPHERE_SPAWN_EFFECT = 55891, + SPELL_FLAME_SPHERE_VISUAL = 55928, + SPELL_FLAME_SPHERE_PERIODIC = 55926, + H_SPELL_FLAME_SPHERE_PERIODIC = 59508, + SPELL_FLAME_SPHERE_DEATH_EFFECT = 55947, + SPELL_BEAM_VISUAL = 60342, + SPELL_EMBRACE_OF_THE_VAMPYR = 55959, + H_SPELL_EMBRACE_OF_THE_VAMPYR = 59513, + SPELL_VANISH = 55964, + CREATURE_FLAME_SPHERE = 30106, + H_CREATURE_FLAME_SPHERE_1 = 31686, + H_CREATURE_FLAME_SPHERE_2 = 31687 +}; +enum Misc +{ + DATA_EMBRACE_DMG = 20000, + H_DATA_EMBRACE_DMG = 40000, + DATA_SPHERE_DISTANCE = 20, + DATA_SPHERE_ANGLE_OFFSET = 1 +}; +#define DATA_GROUND_POSITION_Z 11.4 +enum Achievements +{ + ACHIEVEMENT_THE_PARTY_IS_OVER = 1861 +}; +enum Yells +{ + SAY_AGGRO = -1619021, + SAY_SLAY_1 = -1619022, + SAY_SLAY_2 = -1619023, + SAY_DEATH = -1619024, + SAY_FEED_1 = -1619025, + SAY_FEED_2 = -1619026, + SAY_VANISH_1 = -1619027, + SAY_VANISH_2 = -1619028 +}; enum CombatPhase { NORMAL, @@ -264,26 +265,18 @@ struct TRINITY_DLL_DECL boss_taldaramAI : public ScriptedAI { pInstance->SetData(DATA_PRINCE_TALDARAM_EVENT, DONE); - //Count players - Unit *target = NULL; - std::list<HostilReference *> t_list = m_creature->getThreatManager().getThreatList(); - std::vector<Unit *> target_list; - for(std::list<HostilReference *>::iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) - { - target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()); - // exclude pets & totems - if (target && target->GetTypeId() == TYPEID_PLAYER) - target_list.push_back(target); - target = NULL; - } - if (HeroicMode && target_list.size() < 5) + //The Party's Over achievement: + AchievementEntry const *AchievThePartyIsOver = GetAchievementStore()->LookupEntry(ACHIEVEMENT_THE_PARTY_IS_OVER); + Map* pMap = m_creature->GetMap(); + if (pMap && pMap->IsDungeon() && HeroicMode && AchievThePartyIsOver) { - AchievementEntry const *AchievThePartyIsOver = GetAchievementStore()->LookupEntry(ACHIEVEMENT_THE_PARTY_IS_OVER); - if (AchievThePartyIsOver) - { - for(std::vector<Unit *>::iterator itr = target_list.begin(); itr!= target_list.end(); ++itr) - ((Player*)(*itr))->CompletedAchievement(AchievThePartyIsOver); - } + Map::PlayerList const &players = pMap->GetPlayers(); + uint8 count = 0; + for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + ++count; + if (count < 5) + for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + itr->getSource()->CompletedAchievement(AchievThePartyIsOver); } } } diff --git a/src/bindings/scripts/scripts/northrend/ulduar/halls_of_stone/boss_maiden_of_grief.cpp b/src/bindings/scripts/scripts/northrend/ulduar/halls_of_stone/boss_maiden_of_grief.cpp index 01664ee0090..42a79698476 100644 --- a/src/bindings/scripts/scripts/northrend/ulduar/halls_of_stone/boss_maiden_of_grief.cpp +++ b/src/bindings/scripts/scripts/northrend/ulduar/halls_of_stone/boss_maiden_of_grief.cpp @@ -34,6 +34,11 @@ enum Yells SAY_STUN = -1603006 }; +enum Achievements +{ + ACHIEVEMENT_GOOD_GRIEF = 1866 +}; + struct TRINITY_DLL_DECL boss_maiden_of_griefAI : public ScriptedAI { boss_maiden_of_griefAI(Creature *c) : ScriptedAI(c) @@ -49,6 +54,7 @@ struct TRINITY_DLL_DECL boss_maiden_of_griefAI : public ScriptedAI uint32 StormOfGriefTimer; uint32 ShockOfSorrowTimer; uint32 PillarOfWoeTimer; + uint32 AchievTimer; void Reset() { @@ -56,6 +62,7 @@ struct TRINITY_DLL_DECL boss_maiden_of_griefAI : public ScriptedAI StormOfGriefTimer = 10000; ShockOfSorrowTimer = 20000+rand()%5000; PillarOfWoeTimer = 5000 + rand()%10000; + AchievTimer = 0; if (pInstance) pInstance->SetData(DATA_MAIDEN_OF_GRIEF_EVENT, NOT_STARTED); @@ -74,6 +81,11 @@ struct TRINITY_DLL_DECL boss_maiden_of_griefAI : public ScriptedAI //Return since we have no target if (!UpdateVictim()) return; + + //Achievement counter + if (pInstance) + if (pInstance->GetData(DATA_MAIDEN_OF_GRIEF_EVENT) == IN_PROGRESS) + AchievTimer += diff; if(IsHeroic) { @@ -122,6 +134,16 @@ struct TRINITY_DLL_DECL boss_maiden_of_griefAI : public ScriptedAI if (pInstance) pInstance->SetData(DATA_MAIDEN_OF_GRIEF_EVENT, DONE); + + AchievementEntry const *AchievGoodGrief = GetAchievementStore()->LookupEntry(ACHIEVEMENT_GOOD_GRIEF); + Map* pMap = m_creature->GetMap(); + + if (HeroicMode && AchievTimer < 60000 && pMap && pMap->IsDungeon() && AchievGoodGrief) + { + Map::PlayerList const &players = pMap->GetPlayers(); + for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + itr->getSource()->CompletedAchievement(AchievGoodGrief); + } } void KilledUnit(Unit *victim) { diff --git a/src/bindings/scripts/scripts/northrend/ulduar/halls_of_stone/instance_halls_of_stone.cpp b/src/bindings/scripts/scripts/northrend/ulduar/halls_of_stone/instance_halls_of_stone.cpp index 44872cede03..4af80a93abd 100644 --- a/src/bindings/scripts/scripts/northrend/ulduar/halls_of_stone/instance_halls_of_stone.cpp +++ b/src/bindings/scripts/scripts/northrend/ulduar/halls_of_stone/instance_halls_of_stone.cpp @@ -154,8 +154,8 @@ struct TRINITY_DLL_DECL instance_halls_of_stone : public ScriptedInstance { switch(type) { - case DATA_MAIDEN_OF_GRIEF_EVENT: return m_auiEncounter[0]; - case DATA_KRYSTALLUS_EVENT: return m_auiEncounter[1]; + case DATA_KRYSTALLUS_EVENT: return m_auiEncounter[0]; + case DATA_MAIDEN_OF_GRIEF_EVENT: return m_auiEncounter[1]; case DATA_SJONNIR_EVENT: return m_auiEncounter[2]; case DATA_BRANN_EVENT: return m_auiEncounter[3]; } diff --git a/src/bindings/scripts/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_svala.cpp b/src/bindings/scripts/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_svala.cpp index 14a6793a71d..db246aa3f91 100644 --- a/src/bindings/scripts/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_svala.cpp +++ b/src/bindings/scripts/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_svala.cpp @@ -12,63 +12,63 @@ update creature_template set scriptname = 'boss_svala' where entry = ''; #include "precompiled.h" #include "def_pinnacle.h" -//Spells -#define SPELL_CALL_FLAMES 48258 -#define SPELL_RITUAL_OF_THE_SWORD 48276 //Effect #1 Teleport, Effect #2 Dummy -#define SPELL_SINSTER_STRIKE 15667 -#define H_SPELL_SINSTER_STRIKE 59409 - -#define SPELL_SVALA_TRANSFORMING1 54140 -#define SPELL_SVALA_TRANSFORMING2 54205 - +enum Spells +{ + SPELL_CALL_FLAMES = 48258, + SPELL_RITUAL_OF_THE_SWORD = 48276, //Effect #1 Teleport, Effect #2 Dummy + SPELL_SINSTER_STRIKE = 15667, + H_SPELL_SINSTER_STRIKE = 59409, + SPELL_SVALA_TRANSFORMING1 = 54140, + SPELL_SVALA_TRANSFORMING2 = 54205 +}; //not in db -//Yells -#define SAY_DIALOG_WITH_ARTHAS_1 -1575015 -#define SAY_DIALOG_WITH_ARTHAS_2 -1575016 -#define SAY_DIALOG_WITH_ARTHAS_3 -1575017 -#define SAY_AGGRO -1575018 -#define SAY_SLAY_1 -1575019 -#define SAY_SLAY_2 -1575020 -#define SAY_SLAY_3 -1575021 -#define SAY_DEATH -1575022 -#define SAY_SACRIFICE_PLAYER_1 -1575023 -#define SAY_SACRIFICE_PLAYER_2 -1575024 -#define SAY_SACRIFICE_PLAYER_3 -1575025 -#define SAY_SACRIFICE_PLAYER_4 -1575026 -#define SAY_SACRIFICE_PLAYER_5 -1575027 -#define SAY_DIALOG_OF_ARTHAS_1 -1575028 -#define SAY_DIALOG_OF_ARTHAS_2 -1575029 - -//creatures -#define CREATURE_ARTHAS 24266 // Image of Arthas -#define CREATURE_SVALA_SORROWGRAVE 26668 // Svala after transformation -#define CREATURE_SVALA 29281 // Svala before transformation -#define CREATURE_RITUAL_CHANNELER 27281 -//ritual channeler's spells -#define SPELL_PARALYZE 48278 -#define SPELL_SHADOWS_IN_THE_DARK 59407 - -//other data -#define DATA_SVALA_DISPLAY_ID 11686 - +enum Yells +{ + SAY_DIALOG_WITH_ARTHAS_1 = -1575015, + SAY_DIALOG_WITH_ARTHAS_2 = -1575016, + SAY_DIALOG_WITH_ARTHAS_3 = -1575017, + SAY_AGGRO = -1575018, + SAY_SLAY_1 = -1575019, + SAY_SLAY_2 = -1575020, + SAY_SLAY_3 = -1575021, + SAY_DEATH = -1575022, + SAY_SACRIFICE_PLAYER_1 = -1575023, + SAY_SACRIFICE_PLAYER_2 = -1575024, + SAY_SACRIFICE_PLAYER_3 = -1575025, + SAY_SACRIFICE_PLAYER_4 = -1575026, + SAY_SACRIFICE_PLAYER_5 = -1575027, + SAY_DIALOG_OF_ARTHAS_1 = -1575028, + SAY_DIALOG_OF_ARTHAS_2 = -1575029 +}; +enum Creatures +{ + CREATURE_ARTHAS = 24266, // Image of Arthas + CREATURE_SVALA_SORROWGRAVE = 26668, // Svala after transformation + CREATURE_SVALA = 29281, // Svala before transformation + CREATURE_RITUAL_CHANNELER = 27281, + //ritual channeler's spells + SPELL_PARALYZE = 48278, + SPELL_SHADOWS_IN_THE_DARK = 59407 +}; +enum Misc +{ + DATA_SVALA_DISPLAY_ID = 11686 +}; enum IntroPhase { IDLE, INTRO, FINISHED }; - enum CombatPhase { NORMAL, SACRIFICING }; - struct Locations { float x, y, z; }; - static Locations RitualChannelerLocations[]= { {296.42, -355.01, 90.94}, @@ -107,7 +107,7 @@ struct TRINITY_DLL_DECL boss_svalaAI : public ScriptedAI { if (!pWho) return; - if (pWho->isTargetableForAttack() && m_creature->IsHostileTo(pWho) && Phase == IDLE && m_creature->IsWithinDistInMap(pWho, 40)) + if (Phase == IDLE && pWho->isTargetableForAttack() && m_creature->IsHostileTo(pWho) && Phase == IDLE && m_creature->IsWithinDistInMap(pWho, 40)) { Phase = INTRO; m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -125,6 +125,8 @@ struct TRINITY_DLL_DECL boss_svalaAI : public ScriptedAI void UpdateAI(const uint32 diff) { + if (Phase != INTRO) + return; if (uiIntroTimer < diff) { if(!pArthas) @@ -279,7 +281,9 @@ struct TRINITY_DLL_DECL boss_svala_sorrowgraveAI : public ScriptedAI { DoScriptText(RAND(SAY_SACRIFICE_PLAYER_1,SAY_SACRIFICE_PLAYER_2,SAY_SACRIFICE_PLAYER_3,SAY_SACRIFICE_PLAYER_4,SAY_SACRIFICE_PLAYER_5),m_creature); DoCast(pSacrificeTarget,SPELL_RITUAL_OF_THE_SWORD); - m_creature->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); + //Spell doesn't teleport + DoTeleportPlayer(pSacrificeTarget, 296.632, -346.075, 90.63, 4.6); + m_creature->SetUnitMovementFlags(MOVEMENTFLAG_FLY_MODE); DoTeleportTo(296.632, -346.075, 120.85); Phase = SACRIFICING; @@ -309,6 +313,16 @@ struct TRINITY_DLL_DECL boss_svala_sorrowgraveAI : public ScriptedAI } if (bSacrificed && pSacrificeTarget && pSacrificeTarget->isAlive()) m_creature->DealDamage(pSacrificeTarget, pSacrificeTarget->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + + //go down + Phase = NORMAL; + pSacrificeTarget = NULL; + m_creature->SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE); + Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); + while (pTarget && pTarget->GetTypeId() != TYPEID_PLAYER) + pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); + if (pTarget) + m_creature->GetMotionMaster()->MoveChase(pTarget); uiSacrificeTimer = 8000; } diff --git a/src/game/CreatureAI.cpp b/src/game/CreatureAI.cpp index a3a903c23a6..afa34c1d3e0 100644 --- a/src/game/CreatureAI.cpp +++ b/src/game/CreatureAI.cpp @@ -93,12 +93,13 @@ void CreatureAI::DoZoneInCombat(Creature* creature) creature->AddThreat(pPlayer, 0.0f); } + /* Causes certain things to never leave the threat list (Priest Lightwell, etc): for(Unit::ControlList::const_iterator itr = pPlayer->m_Controlled.begin(); itr != pPlayer->m_Controlled.end(); ++itr) { creature->SetInCombatWith(*itr); (*itr)->SetInCombatWith(creature); creature->AddThreat(*itr, 0.0f); - } + }*/ } } } diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 73a85e55a41..588722213cb 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -5284,6 +5284,15 @@ uint32 ObjectMgr::GetTaxiMountDisplayId( uint32 id, uint32 team, bool allowed_al else mount_entry = node->MountCreatureID[0]; + // Fix for Alliance not being able to use Acherus taxi + // only one mount type for both sides + if (mount_entry == 0 && allowed_alt_team) + { + // Simply reverse the selection. At least one team in theory should + // have a valid mount ID to choose + mount_entry = (team == ALLIANCE) ? node->MountCreatureID[0] : node->MountCreatureID[1]; + } + CreatureInfo const *mount_info = GetCreatureTemplate(mount_entry); if (mount_info) { diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 7d7f9427f9e..603cf24319f 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -17965,7 +17965,12 @@ bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc } // get mount model (in case non taximaster (npc==NULL) allow more wide lookup) - uint32 mount_display_id = objmgr.GetTaxiMountDisplayId(sourcenode, GetTeam(), npc == NULL); + // + // Hack-Fix for Alliance not being able to use Acherus taxi. There is + // only one mount ID for both sides. Probably not good to use 315 in case DBC nodes + // change but I couldn't find a suitable alternative. OK to use class because only DK + // can use this taxi. + uint32 mount_display_id = objmgr.GetTaxiMountDisplayId(sourcenode, GetTeam(), npc == NULL || (sourcenode == 315 && getClass() == CLASS_DEATH_KNIGHT)); // in spell case allow 0 model if ((mount_display_id == 0 && spellid == 0) || sourcepath == 0) |