Scripts/ICC/Teleporter: moved gossips to db

(cherry picked from commit ea38a7d95b)
This commit is contained in:
joschiwald
2016-01-20 00:27:32 +01:00
committed by Shauren
parent 6cb76b596e
commit 9a202dfd4a
3 changed files with 110 additions and 45 deletions

View File

@@ -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_

View File

@@ -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 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;
if (player->IsInCombat())
bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
Spell::SendCastResult(player, spell, 0, SPELL_FAILED_AFFECTING_COMBAT);
if (gossipListId >= TeleportSpells.size())
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;
}
player->CastSpell(player, spell, true);
return true;
}
};
if (sender == GOSSIP_SENDER_ICC_PORT)
player->CastSpell(player, spell, true);
return true;
GameObjectAI* GetAI(GameObject* go) const override
{
return GetIcecrownCitadelAI<icecrown_citadel_teleportAI>(go);
}
};