diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h | 12 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp | 71 | 
2 files changed, 39 insertions, 44 deletions
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h index 2af8e7f3643..5a5b7aefc02 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h @@ -115,7 +115,7 @@ enum DataTypes      DATA_ARTHAS_PLATFORM               = 38,      DATA_TERENAS_MENETHIL              = 39,      DATA_ENEMY_GUNSHIP                 = 40, -    DATA_UPPERSPIRE_TELE_ACT           = 41, +    DATA_UPPERSPIRE_TELE_ACT           = 41, /// also used by conditions      DATA_BLOOD_QUEEN_LANA_THEL_COUNCIL = 42  }; @@ -569,14 +569,10 @@ class spell_trigger_spell_from_caster : public SpellScriptLoader          TriggerCastFlags _triggerFlags;  }; -template<class AI> -CreatureAI* GetIcecrownCitadelAI(Creature* creature) +template<class AI, class T> +inline AI* GetIcecrownCitadelAI(T* obj)  { -    if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) -        if (instance->GetInstanceScript()) -            if (instance->GetScriptId() == sObjectMgr->GetScriptId(ICCScriptName)) -                return new AI(creature); -    return NULL; +    return GetInstanceAI<AI>(obj, ICCScriptName);  }  #endif // ICECROWN_CITADEL_H_ diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp index 7723a37094c..8b5e03203e1 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp @@ -15,6 +15,7 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ +#include "GameObjectAI.h"  #include "InstanceScript.h"  #include "Player.h"  #include "ScriptedGossip.h" @@ -22,57 +23,55 @@  #include "Spell.h"  #include "icecrown_citadel.h" -#define GOSSIP_SENDER_ICC_PORT 631 +static std::vector<uint32> const TeleportSpells = +{ +    LIGHT_S_HAMMER_TELEPORT,        // 0 +    ORATORY_OF_THE_DAMNED_TELEPORT, // 1 +    0,                              // 2 +    RAMPART_OF_SKULLS_TELEPORT,     // 3 +    DEATHBRINGER_S_RISE_TELEPORT,   // 4 +    UPPER_SPIRE_TELEPORT,           // 5 +    SINDRAGOSA_S_LAIR_TELEPORT      // 6 +};  class icecrown_citadel_teleport : public GameObjectScript  { +    static_assert(DATA_UPPERSPIRE_TELE_ACT == 41, "icecrown_citadel.h DATA_UPPERSPIRE_TELE_ACT set to value != 41, gossip condition of the teleporters won't work as intended."); +      public:          icecrown_citadel_teleport() : GameObjectScript("icecrown_citadel_teleport") { } -        bool OnGossipHello(Player* player, GameObject* go) override +        struct icecrown_citadel_teleportAI : public GameObjectAI          { -            if (InstanceScript* instance = go->GetInstanceScript()) +            icecrown_citadel_teleportAI(GameObject* go) : GameObjectAI(go)              { -                if (instance->GetBossState(DATA_LORD_MARROWGAR) == DONE) -                { -                    if (go->GetEntry() != GO_SCOURGE_TRANSPORTER_LIGHTSHAMMER) -                        player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to Light's Hammer.", GOSSIP_SENDER_ICC_PORT, LIGHT_S_HAMMER_TELEPORT); -                    if (go->GetEntry() != GO_SCOURGE_TRANSPORTER_ORATORY) -                        player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Oratory of the Damned.", GOSSIP_SENDER_ICC_PORT, ORATORY_OF_THE_DAMNED_TELEPORT); -                } -                if (instance->GetBossState(DATA_LADY_DEATHWHISPER) == DONE && go->GetEntry() != GO_SCOURGE_TRANSPORTER_RAMPART) -                    player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Rampart of Skulls.", GOSSIP_SENDER_ICC_PORT, RAMPART_OF_SKULLS_TELEPORT); -                if (instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == DONE && go->GetEntry() != GO_SCOURGE_TRANSPORTER_DEATHBRINGER) -                    player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Deathbringer's Rise.", GOSSIP_SENDER_ICC_PORT, DEATHBRINGER_S_RISE_TELEPORT); -                if (instance->GetData(DATA_UPPERSPIRE_TELE_ACT) == DONE && go->GetEntry() != GO_SCOURGE_TRANSPORTER_UPPERSPIRE) -                    player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Upper Spire.", GOSSIP_SENDER_ICC_PORT, UPPER_SPIRE_TELEPORT); -                /// @todo Gauntlet event before Sindragosa -                if (instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE && go->GetEntry() != GO_SCOURGE_TRANSPORTER_SINDRAGOSA) -                    player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to Sindragosa's Lair", GOSSIP_SENDER_ICC_PORT, SINDRAGOSA_S_LAIR_TELEPORT);              } -            player->SEND_GOSSIP_MENU(player->GetGossipTextId(go), go->GetGUID()); -            return true; -        } +            bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override +            { +                if (gossipListId >= TeleportSpells.size()) +                    return false; -        bool OnGossipSelect(Player* player, GameObject* /*go*/, uint32 sender, uint32 action) override -        { -            player->PlayerTalkClass->ClearMenus(); -            player->CLOSE_GOSSIP_MENU(); -            SpellInfo const* spell = sSpellMgr->GetSpellInfo(action); -            if (!spell) -                return false; +                player->PlayerTalkClass->ClearMenus(); +                player->CLOSE_GOSSIP_MENU(); +                SpellInfo const* spell = sSpellMgr->GetSpellInfo(TeleportSpells[gossipListId]); +                if (!spell) +                    return false; -            if (player->IsInCombat()) -            { -                Spell::SendCastResult(player, spell, 0, SPELL_FAILED_AFFECTING_COMBAT); -                return true; -            } +                if (player->IsInCombat()) +                { +                    Spell::SendCastResult(player, spell, 0, SPELL_FAILED_AFFECTING_COMBAT); +                    return true; +                } -            if (sender == GOSSIP_SENDER_ICC_PORT)                  player->CastSpell(player, spell, true); +                return true; +            } +        }; -            return true; +        GameObjectAI* GetAI(GameObject* go) const override +        { +            return GetIcecrownCitadelAI<icecrown_citadel_teleportAI>(go);          }  };  | 
