diff options
Diffstat (limited to 'src/server/scripts/Kalimdor')
28 files changed, 1455 insertions, 1373 deletions
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp index 333780d2b7d..0313a58f8d5 100644 --- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp +++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp @@ -20,6 +20,7 @@ #include "ScriptedGossip.h" #include "blackfathom_deeps.h" #include "ScriptedEscortAI.h" +#include "GameObjectAI.h" #include "Player.h" enum Spells @@ -35,35 +36,51 @@ const Position HomePosition = {-815.817f, -145.299f, -25.870f, 0}; class go_blackfathom_altar : public GameObjectScript { -public: - go_blackfathom_altar() : GameObjectScript("go_blackfathom_altar") { } + public: + go_blackfathom_altar() : GameObjectScript("go_blackfathom_altar") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (!player->HasAura(SPELL_BLESSING_OF_BLACKFATHOM)) - player->AddAura(SPELL_BLESSING_OF_BLACKFATHOM, player); - return true; - } + struct go_blackfathom_altarAI : public GameObjectAI + { + go_blackfathom_altarAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (!player->HasAura(SPELL_BLESSING_OF_BLACKFATHOM)) + player->AddAura(SPELL_BLESSING_OF_BLACKFATHOM, player); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetInstanceAI<go_blackfathom_altarAI>(go); + } }; class go_blackfathom_fire : public GameObjectScript { -public: - go_blackfathom_fire() : GameObjectScript("go_blackfathom_fire") { } + public: + go_blackfathom_fire() : GameObjectScript("go_blackfathom_fire") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - InstanceScript* instance = go->GetInstanceScript(); + struct go_blackfathom_fireAI : public GameObjectAI + { + go_blackfathom_fireAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; - if (instance) + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + me->SetGoState(GO_STATE_ACTIVE); + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + instance->SetData(DATA_FIRE, instance->GetData(DATA_FIRE) + 1); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override { - go->SetGoState(GO_STATE_ACTIVE); - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - instance->SetData(DATA_FIRE, instance->GetData(DATA_FIRE) + 1); - return true; + return GetInstanceAI<go_blackfathom_fireAI>(go); } - return false; - } }; class npc_blackfathom_deeps_event : public CreatureScript @@ -226,9 +243,10 @@ public: } } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { DoCast(player, SPELL_TELEPORT_DARNASSUS); + return false; } }; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp index 231d2ccb818..83cb6d7d91c 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp @@ -50,208 +50,208 @@ EndContentData */ class npc_jaina_proudmoore : public CreatureScript { -public: - npc_jaina_proudmoore() : CreatureScript("npc_jaina_proudmoore") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); - switch (action) + public: + npc_jaina_proudmoore() : CreatureScript("npc_jaina_proudmoore") { } + + struct npc_jaina_proudmooreAI : public hyjalAI + { + npc_jaina_proudmooreAI(Creature* creature) : hyjalAI(creature) + { + Reset(); + EnterEvadeMode(); + + Spells[0].SpellId = SPELL_BLIZZARD; + Spells[0].Cooldown = urand(15000, 35000); + Spells[0].TargetType = TARGETTYPE_RANDOM; + + Spells[1].SpellId = SPELL_PYROBLAST; + Spells[1].Cooldown = urand(5500, 9500); + Spells[1].TargetType = TARGETTYPE_RANDOM; + + Spells[2].SpellId = SPELL_SUMMON_ELEMENTALS; + Spells[2].Cooldown = urand(15000, 45000); + Spells[2].TargetType = TARGETTYPE_SELF; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + StartEvent(player); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + FirstBossDead = true; + WaveCount = 9; + StartEvent(player); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + Retreat(); + break; + case GOSSIP_ACTION_INFO_DEF: + Debug = !Debug; + TC_LOG_DEBUG("scripts", "HyjalAI - Debug mode has been toggled"); + break; + } + return true; + } + + bool GossipHello(Player* player) override + { + if (EventBegun) + return false; + + uint32 RageEncounter = GetInstanceData(DATA_RAGEWINTERCHILLEVENT); + uint32 AnetheronEncounter = GetInstanceData(DATA_ANETHERONEVENT); + if (RageEncounter == NOT_STARTED) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEGIN_ALLY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + else if (RageEncounter == DONE && AnetheronEncounter == NOT_STARTED) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ANETHERON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + else if (RageEncounter == DONE && AnetheronEncounter == DONE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_RETREAT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + + if (player->IsGameMaster()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_ITEM_GM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + + SendGossipMenuFor(player, 907, me->GetGUID()); + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - case GOSSIP_ACTION_INFO_DEF + 1: - ai->StartEvent(player); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - ai->FirstBossDead = true; - ai->WaveCount = 9; - ai->StartEvent(player); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - ai->Retreat(); - break; - case GOSSIP_ACTION_INFO_DEF: - ai->Debug = !ai->Debug; - TC_LOG_DEBUG("scripts", "HyjalAI - Debug mode has been toggled"); - break; + return GetInstanceAI<npc_jaina_proudmooreAI>(creature); } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); - if (ai->EventBegun) - return false; - - uint32 RageEncounter = ai->GetInstanceData(DATA_RAGEWINTERCHILLEVENT); - uint32 AnetheronEncounter = ai->GetInstanceData(DATA_ANETHERONEVENT); - if (RageEncounter == NOT_STARTED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEGIN_ALLY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - else if (RageEncounter == DONE && AnetheronEncounter == NOT_STARTED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ANETHERON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - else if (RageEncounter == DONE && AnetheronEncounter == DONE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_RETREAT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - - if (player->IsGameMaster()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_ITEM_GM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - SendGossipMenuFor(player, 907, creature->GetGUID()); - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - if (!creature->GetInstanceScript()) - return NULL; - - hyjalAI* ai = new hyjalAI(creature); - - ai->Reset(); - ai->EnterEvadeMode(); - - ai->Spells[0].SpellId = SPELL_BLIZZARD; - ai->Spells[0].Cooldown = urand(15000, 35000); - ai->Spells[0].TargetType = TARGETTYPE_RANDOM; - - ai->Spells[1].SpellId = SPELL_PYROBLAST; - ai->Spells[1].Cooldown = urand(5500, 9500); - ai->Spells[1].TargetType = TARGETTYPE_RANDOM; - - ai->Spells[2].SpellId = SPELL_SUMMON_ELEMENTALS; - ai->Spells[2].Cooldown = urand(15000, 45000); - ai->Spells[2].TargetType = TARGETTYPE_SELF; - - return ai; - } - }; class npc_thrall : public CreatureScript { -public: - npc_thrall() : CreatureScript("npc_thrall") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); - ai->DeSpawnVeins();//despawn the alliance veins - switch (action) + public: + npc_thrall() : CreatureScript("npc_thrall") { } + + struct npc_thrallAI : public hyjalAI { - case GOSSIP_ACTION_INFO_DEF + 1: - ai->StartEvent(player); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - ai->FirstBossDead = true; - ai->WaveCount = 9; - ai->StartEvent(player); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - ai->Retreat(); - break; - case GOSSIP_ACTION_INFO_DEF: - ai->Debug = !ai->Debug; - TC_LOG_DEBUG("scripts", "HyjalAI - Debug mode has been toggled"); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); - if (ai->EventBegun) - return false; - - uint32 AnetheronEvent = ai->GetInstanceData(DATA_ANETHERONEVENT); - // Only let them start the Horde phases if Anetheron is dead. - if (AnetheronEvent == DONE && ai->GetInstanceData(DATA_ALLIANCE_RETREAT)) + npc_thrallAI(Creature* creature) : hyjalAI(creature) + { + Reset(); + EnterEvadeMode(); + + Spells[0].SpellId = SPELL_CHAIN_LIGHTNING; + Spells[0].Cooldown = urand(3000, 8000); + Spells[0].TargetType = TARGETTYPE_VICTIM; + + Spells[1].SpellId = SPELL_SUMMON_DIRE_WOLF; + Spells[1].Cooldown = urand(6000, 41000); + Spells[1].TargetType = TARGETTYPE_RANDOM; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + DeSpawnVeins();//despawn the alliance veins + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + StartEvent(player); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + FirstBossDead = true; + WaveCount = 9; + StartEvent(player); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + Retreat(); + break; + case GOSSIP_ACTION_INFO_DEF: + Debug = !Debug; + TC_LOG_DEBUG("scripts", "HyjalAI - Debug mode has been toggled"); + break; + } + return true; + } + + bool GossipHello(Player* player) override + { + if (EventBegun) + return false; + + uint32 AnetheronEvent = GetInstanceData(DATA_ANETHERONEVENT); + // Only let them start the Horde phases if Anetheron is dead. + if (AnetheronEvent == DONE && GetInstanceData(DATA_ALLIANCE_RETREAT)) + { + uint32 KazrogalEvent = GetInstanceData(DATA_KAZROGALEVENT); + uint32 AzgalorEvent = GetInstanceData(DATA_AZGALOREVENT); + if (KazrogalEvent == NOT_STARTED) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEGIN_HORDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + else if (KazrogalEvent == DONE && AzgalorEvent == NOT_STARTED) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AZGALOR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + else if (AzgalorEvent == DONE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_RETREAT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + } + + if (player->IsGameMaster()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_ITEM_GM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + + SendGossipMenuFor(player, 907, me->GetGUID()); + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - uint32 KazrogalEvent = ai->GetInstanceData(DATA_KAZROGALEVENT); - uint32 AzgalorEvent = ai->GetInstanceData(DATA_AZGALOREVENT); - if (KazrogalEvent == NOT_STARTED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEGIN_HORDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - else if (KazrogalEvent == DONE && AzgalorEvent == NOT_STARTED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AZGALOR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - else if (AzgalorEvent == DONE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_RETREAT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + return GetInstanceAI<npc_thrallAI>(creature); } - - if (player->IsGameMaster()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_ITEM_GM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - SendGossipMenuFor(player, 907, creature->GetGUID()); - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - if (!creature->GetInstanceScript()) - return NULL; - - hyjalAI* ai = new hyjalAI(creature); - - ai->Reset(); - ai->EnterEvadeMode(); - - ai->Spells[0].SpellId = SPELL_CHAIN_LIGHTNING; - ai->Spells[0].Cooldown = urand(3000, 8000); - ai->Spells[0].TargetType = TARGETTYPE_VICTIM; - - ai->Spells[1].SpellId = SPELL_SUMMON_DIRE_WOLF; - ai->Spells[1].Cooldown = urand(6000, 41000); - ai->Spells[1].TargetType = TARGETTYPE_RANDOM; - - return ai; - } - }; class npc_tyrande_whisperwind : public CreatureScript { -public: - npc_tyrande_whisperwind() : CreatureScript("npc_tyrande_whisperwind") { } - - CreatureAI* GetAI(Creature* creature) const override - { - if (!creature->GetInstanceScript()) - return NULL; - - hyjalAI* ai = new hyjalAI(creature); - ai->Reset(); - ai->EnterEvadeMode(); - return ai; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF) - { - ItemPosCountVec dest; - uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_TEAR_OF_GODDESS, 1); - if (msg == EQUIP_ERR_OK) - if (Item* item = player->StoreNewItem(dest, ITEM_TEAR_OF_GODDESS, true)) - player->SendNewItem(item, 1, true, false, true); + public: + npc_tyrande_whisperwind() : CreatureScript("npc_tyrande_whisperwind") { } - SendGossipMenuFor(player, 907, creature->GetGUID()); + struct npc_tyrande_whisperwindAI : public hyjalAI + { + npc_tyrande_whisperwindAI(Creature* creature) : hyjalAI(creature) + { + Reset(); + EnterEvadeMode(); + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF) + { + ItemPosCountVec dest; + uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_TEAR_OF_GODDESS, 1); + if (msg == EQUIP_ERR_OK) + if (Item* item = player->StoreNewItem(dest, ITEM_TEAR_OF_GODDESS, true)) + player->SendNewItem(item, 1, true, false, true); + + SendGossipMenuFor(player, 907, me->GetGUID()); + } + return true; + } + + bool GossipHello(Player* player) override + { + uint32 AzgalorEvent = GetInstanceData(DATA_AZGALOREVENT); + + // Only let them get item if Azgalor is dead. + if (AzgalorEvent == DONE && !player->HasItemCount(ITEM_TEAR_OF_GODDESS)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TYRANDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, 907, me->GetGUID()); + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_tyrande_whisperwindAI>(creature); } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); - uint32 AzgalorEvent = ai->GetInstanceData(DATA_AZGALOREVENT); - - // Only let them get item if Azgalor is dead. - if (AzgalorEvent == DONE && !player->HasItemCount(ITEM_TEAR_OF_GODDESS)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TYRANDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, 907, creature->GetGUID()); - return true; - } - }; void AddSC_hyjal() diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp index 41bb7971635..da1080c5d27 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp @@ -254,98 +254,6 @@ class npc_arthas : public CreatureScript public: npc_arthas() : CreatureScript("npc_arthas") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - npc_arthasAI* ai = CAST_AI(npc_arthas::npc_arthasAI, creature->AI()); - - if (!ai) - return false; - - switch (action) - { - case GOSSIP_ACTION_INFO_DEF: - ai->Start(true, true, player->GetGUID(), 0, false, false); - ai->SetDespawnAtEnd(false); - ai->bStepping = false; - ai->step = 1; - break; - case GOSSIP_ACTION_INFO_DEF+1: - ai->bStepping = true; - ai->step = 24; - break; - case GOSSIP_ACTION_INFO_DEF+2: - ai->SetHoldState(false); - ai->bStepping = false; - ai->step = 61; - break; - case GOSSIP_ACTION_INFO_DEF+3: - ai->SetHoldState(false); - break; - case GOSSIP_ACTION_INFO_DEF+4: - ai->bStepping = true; - ai->step = 84; - break; - case GOSSIP_ACTION_INFO_DEF+5: - ai->bStepping = true; - ai->step = 85; - break; - } - CloseGossipMenuFor(player); - ai->SetDespawnAtFar(false); - creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - npc_arthasAI* ai = CAST_AI(npc_arthas::npc_arthasAI, creature->AI()); - - if (ai && ai->bStepping == false) - { - switch (ai->gossipStep) - { - case 0: //This one is a workaround since the very beggining of the script is wrong. - { - QuestStatus status = player->GetQuestStatus(13149); - if (status != QUEST_STATUS_COMPLETE && status != QUEST_STATUS_REWARDED) - return false; - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, 907, creature->GetGUID()); - break; - } - case 1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_1, creature->GetGUID()); - break; - case 2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_2, creature->GetGUID()); - break; - case 3: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_3, creature->GetGUID()); - break; - case 4: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); - SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_4, creature->GetGUID()); - break; - case 5: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); - SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_5, creature->GetGUID()); - break; - default: - return false; - } - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_arthasAI>(creature); - } - struct npc_arthasAI : public npc_escortAI { npc_arthasAI(Creature* creature) : npc_escortAI(creature) @@ -1231,8 +1139,93 @@ public: DoMeleeAttackIfReady(); } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF: + Start(true, true, player->GetGUID(), 0, false, false); + SetDespawnAtEnd(false); + bStepping = false; + step = 1; + break; + case GOSSIP_ACTION_INFO_DEF + 1: + bStepping = true; + step = 24; + break; + case GOSSIP_ACTION_INFO_DEF + 2: + SetHoldState(false); + bStepping = false; + step = 61; + break; + case GOSSIP_ACTION_INFO_DEF + 3: + SetHoldState(false); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + bStepping = true; + step = 84; + break; + case GOSSIP_ACTION_INFO_DEF + 5: + bStepping = true; + step = 85; + break; + } + CloseGossipMenuFor(player); + SetDespawnAtFar(false); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + return true; + } + + bool GossipHello(Player* player) override + { + if (!bStepping) + { + switch (gossipStep) + { + case 0: //This one is a workaround since the very beggining of the script is wrong. + { + QuestStatus status = player->GetQuestStatus(13149); + if (status != QUEST_STATUS_COMPLETE && status != QUEST_STATUS_REWARDED) + return false; + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, 907, me->GetGUID()); + break; + } + case 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_1, me->GetGUID()); + break; + case 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_2, me->GetGUID()); + break; + case 3: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_3, me->GetGUID()); + break; + case 4: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_4, me->GetGUID()); + break; + case 5: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_5, me->GetGUID()); + break; + default: + return false; + } + } + return true; + } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_arthasAI>(creature); + } }; class npc_crate_helper : public CreatureScript diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp index f3b302497da..380971d6aa5 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp @@ -27,6 +27,7 @@ EndScriptData */ #include "ScriptedCreature.h" #include "old_hillsbrad.h" #include "ScriptedEscortAI.h" +#include "GameObjectAI.h" /*###### ## go_barrel_old_hillsbrad @@ -37,19 +38,26 @@ class go_barrel_old_hillsbrad : public GameObjectScript public: go_barrel_old_hillsbrad() : GameObjectScript("go_barrel_old_hillsbrad") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_barrel_old_hillsbradAI : public GameObjectAI { - if (InstanceScript* instance = go->GetInstanceScript()) + go_barrel_old_hillsbradAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override { if (instance->GetData(TYPE_BARREL_DIVERSION) == DONE) return false; instance->SetData(TYPE_BARREL_DIVERSION, IN_PROGRESS); + return false; } + }; - return false; + GameObjectAI* GetAI(GameObject* go) const override + { + return GetInstanceAI<go_barrel_old_hillsbradAI>(go); } - }; /*###### diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp index 0095a727c87..2a4d13d1634 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp @@ -56,41 +56,51 @@ class npc_erozion : public CreatureScript public: npc_erozion() : CreatureScript("npc_erozion") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override + struct npc_erozionAI : public ScriptedAI { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) + npc_erozionAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - ItemPosCountVec dest; - uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_ENTRY_BOMBS, 1); - if (msg == EQUIP_ERR_OK) + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) { - player->StoreNewItem(dest, ITEM_ENTRY_BOMBS, true); + ItemPosCountVec dest; + uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_ENTRY_BOMBS, 1); + if (msg == EQUIP_ERR_OK) + { + player->StoreNewItem(dest, ITEM_ENTRY_BOMBS, true); + } + SendGossipMenuFor(player, 9515, me->GetGUID()); } - SendGossipMenuFor(player, 9515, creature->GetGUID()); + if (action == GOSSIP_ACTION_INFO_DEF + 2) + CloseGossipMenuFor(player); + return true; } - if (action == GOSSIP_ACTION_INFO_DEF+2) + + bool GossipHello(Player* player) override { - CloseGossipMenuFor(player); - } - return true; - } + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + if (instance->GetData(TYPE_BARREL_DIVERSION) != DONE && !player->HasItemCount(ITEM_ENTRY_BOMBS)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_EROZION1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - InstanceScript* instance = creature->GetInstanceScript(); - if (instance->GetData(TYPE_BARREL_DIVERSION) != DONE && !player->HasItemCount(ITEM_ENTRY_BOMBS)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_EROZION1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + if (player->GetQuestStatus(QUEST_ENTRY_RETURN) == QUEST_STATUS_COMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_EROZION2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - if (player->GetQuestStatus(QUEST_ENTRY_RETURN) == QUEST_STATUS_COMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_EROZION2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + SendGossipMenuFor(player, 9778, me->GetGUID()); - SendGossipMenuFor(player, 9778, creature->GetGUID()); + return true; + } + }; - return true; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_erozionAI>(creature); } }; @@ -185,93 +195,6 @@ class npc_thrall_old_hillsbrad : public CreatureScript public: npc_thrall_old_hillsbrad() : CreatureScript("npc_thrall_old_hillsbrad") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_thrall_old_hillsbradAI>(creature); - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - InstanceScript* instance = creature->GetInstanceScript(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - CloseGossipMenuFor(player); - if (instance) - { - instance->SetData(TYPE_THRALL_EVENT, IN_PROGRESS); - instance->SetData(TYPE_THRALL_PART1, IN_PROGRESS); - } - - creature->AI()->Talk(SAY_TH_START_EVENT_PART1); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, creature->AI())) - pEscortAI->Start(true, true, player->GetGUID()); - - ENSURE_AI(npc_escortAI, (creature->AI()))->SetMaxPlayerDistance(100.0f);//not really needed, because it will not despawn if player is too far - ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtEnd(false); - ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtFar(false); - break; - - case GOSSIP_ACTION_INFO_DEF+2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_SKARLOC2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+20); - SendGossipMenuFor(player, GOSSIP_ID_SKARLOC2, creature->GetGUID()); - break; - - case GOSSIP_ACTION_INFO_DEF+20: - SendGossipMenuFor(player, GOSSIP_ID_SKARLOC3, creature->GetGUID()); - creature->SummonCreature(SKARLOC_MOUNT, 2038.81f, 270.26f, 63.20f, 5.41f, TEMPSUMMON_TIMED_DESPAWN, 12000); - if (instance) - instance->SetData(TYPE_THRALL_PART2, IN_PROGRESS); - - creature->AI()->Talk(SAY_TH_START_EVENT_PART2); - - ENSURE_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, creature->AI())->StartWP(); - break; - - case GOSSIP_ACTION_INFO_DEF+3: - CloseGossipMenuFor(player); - if (instance) - instance->SetData(TYPE_THRALL_PART3, IN_PROGRESS); - ENSURE_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, creature->AI())->StartWP(); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - { - player->PrepareQuestMenu(creature->GetGUID()); - player->SendPreparedQuest(creature->GetGUID()); - } - - InstanceScript* instance = creature->GetInstanceScript(); - if (instance) - { - if (instance->GetData(TYPE_BARREL_DIVERSION) == DONE && !instance->GetData(TYPE_THRALL_EVENT)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_WALKING, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, GOSSIP_ID_START, creature->GetGUID()); - } - - if (instance->GetData(TYPE_THRALL_PART1) == DONE && !instance->GetData(TYPE_THRALL_PART2)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_SKARLOC1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_ID_SKARLOC1, creature->GetGUID()); - } - - if (instance->GetData(TYPE_THRALL_PART2) == DONE && !instance->GetData(TYPE_THRALL_PART3)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TARREN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - SendGossipMenuFor(player, GOSSIP_ID_TARREN, creature->GetGUID()); - } - } - return true; - } - struct npc_thrall_old_hillsbradAI : public npc_escortAI { npc_thrall_old_hillsbradAI(Creature* creature) : npc_escortAI(creature) @@ -542,8 +465,84 @@ public: LowHp = true; } } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + CloseGossipMenuFor(player); + instance->SetData(TYPE_THRALL_EVENT, IN_PROGRESS); + instance->SetData(TYPE_THRALL_PART1, IN_PROGRESS); + + Talk(SAY_TH_START_EVENT_PART1); + + Start(true, true, player->GetGUID()); + + SetMaxPlayerDistance(100.0f);//not really needed, because it will not despawn if player is too far + SetDespawnAtEnd(false); + SetDespawnAtFar(false); + break; + + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_SKARLOC2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 20); + SendGossipMenuFor(player, GOSSIP_ID_SKARLOC2, me->GetGUID()); + break; + + case GOSSIP_ACTION_INFO_DEF + 20: + SendGossipMenuFor(player, GOSSIP_ID_SKARLOC3, me->GetGUID()); + me->SummonCreature(SKARLOC_MOUNT, 2038.81f, 270.26f, 63.20f, 5.41f, TEMPSUMMON_TIMED_DESPAWN, 12000); + instance->SetData(TYPE_THRALL_PART2, IN_PROGRESS); + + Talk(SAY_TH_START_EVENT_PART2); + + StartWP(); + break; + + case GOSSIP_ACTION_INFO_DEF + 3: + CloseGossipMenuFor(player); + instance->SetData(TYPE_THRALL_PART3, IN_PROGRESS); + StartWP(); + break; + } + return true; + } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + { + player->PrepareQuestMenu(me->GetGUID()); + player->SendPreparedQuest(me->GetGUID()); + } + + if (instance->GetData(TYPE_BARREL_DIVERSION) == DONE && !instance->GetData(TYPE_THRALL_EVENT)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_WALKING, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_ID_START, me->GetGUID()); + } + + if (instance->GetData(TYPE_THRALL_PART1) == DONE && !instance->GetData(TYPE_THRALL_PART2)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_SKARLOC1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_ID_SKARLOC1, me->GetGUID()); + } + + if (instance->GetData(TYPE_THRALL_PART2) == DONE && !instance->GetData(TYPE_THRALL_PART3)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TARREN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + SendGossipMenuFor(player, GOSSIP_ID_TARREN, me->GetGUID()); + } + return true; + } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_thrall_old_hillsbradAI>(creature); + } }; /*###### @@ -563,48 +562,6 @@ class npc_taretha : public CreatureScript public: npc_taretha() : CreatureScript("npc_taretha") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_tarethaAI>(creature); - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - InstanceScript* instance = creature->GetInstanceScript(); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_EPOCH2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_ID_EPOCH2, creature->GetGUID()); - } - if (action == GOSSIP_ACTION_INFO_DEF+2) - { - CloseGossipMenuFor(player); - - if (instance->GetData(TYPE_THRALL_EVENT) == IN_PROGRESS) - { - instance->SetData(TYPE_THRALL_PART4, IN_PROGRESS); - if (instance->GetGuidData(DATA_EPOCH).IsEmpty()) - creature->SummonCreature(ENTRY_EPOCH, 2639.13f, 698.55f, 65.43f, 4.59f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); - - if (Creature* thrall = (ObjectAccessor::GetCreature(*creature, instance->GetGuidData(DATA_THRALL)))) - ENSURE_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, thrall->AI())->StartWP(); - } - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - if (instance->GetData(TYPE_THRALL_PART3) == DONE && instance->GetData(TYPE_THRALL_PART4) == NOT_STARTED) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_EPOCH1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, GOSSIP_ID_EPOCH1, creature->GetGUID()); - } - return true; - } - struct npc_tarethaAI : public npc_escortAI { npc_tarethaAI(Creature* creature) : npc_escortAI(creature) @@ -634,8 +591,49 @@ public: { npc_escortAI::UpdateAI(diff); } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_EPOCH2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_ID_EPOCH2, me->GetGUID()); + } + if (action == GOSSIP_ACTION_INFO_DEF + 2) + { + CloseGossipMenuFor(player); + + if (instance->GetData(TYPE_THRALL_EVENT) == IN_PROGRESS) + { + instance->SetData(TYPE_THRALL_PART4, IN_PROGRESS); + if (instance->GetGuidData(DATA_EPOCH).IsEmpty()) + me->SummonCreature(ENTRY_EPOCH, 2639.13f, 698.55f, 65.43f, 4.59f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); + + if (Creature* thrall = (ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_THRALL)))) + ENSURE_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, thrall->AI())->StartWP(); + } + } + return true; + } + + bool GossipHello(Player* player) override + { + if (instance->GetData(TYPE_THRALL_PART3) == DONE && instance->GetData(TYPE_THRALL_PART4) == NOT_STARTED) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_EPOCH1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_ID_EPOCH1, me->GetGUID()); + } + return true; + } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_tarethaAI>(creature); + } }; /*###### diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp index bf1b0a45984..19a289485fc 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp +++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp @@ -29,6 +29,7 @@ EndContentData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "ScriptedGossip.h" #include "razorfen_downs.h" #include "Player.h" @@ -129,7 +130,7 @@ public: me->DespawnOrUnsummon(5000); } - void sQuestAccept(Player* /*player*/, Quest const* quest) override + void QuestAccept(Player* /*player*/, Quest const* quest) override { if (quest->GetQuestId() == QUEST_EXTINGUISHING_THE_IDOL) { @@ -376,19 +377,24 @@ class go_gong : public GameObjectScript public: go_gong() : GameObjectScript("go_gong") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_gongAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); + go_gongAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - if (instance) + InstanceScript* instance; + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override { - go->SendCustomAnim(0); + me->SendCustomAnim(0); instance->SetData(DATA_WAVE, IN_PROGRESS); return true; } - return false; - } + }; + GameObjectAI* GetAI(GameObject* go) const override + { + return GetRazorfenDownsAI<go_gongAI>(go); + } }; void AddSC_razorfen_downs() diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h index 2501b399d11..fa78d8518c1 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h +++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h @@ -61,10 +61,10 @@ enum RFDGameObjectIds GO_BELNISTRASZS_BRAZIER = 152097 }; -template<class AI> -AI* GetRazorfenDownsAI(Creature* creature) +template<class AI, class T> +AI* GetRazorfenDownsAI(T* obj) { - return GetInstanceAI<AI>(creature, RFDScriptName); + return GetInstanceAI<AI>(obj, RFDScriptName); } #endif diff --git a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp index 07f9afcd5cd..88a3b2b51fb 100644 --- a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp +++ b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp @@ -51,7 +51,7 @@ public: { npc_willixAI(Creature* creature) : npc_escortAI(creature) { } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_WILLIX_THE_IMPORTER) { diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp index 14ccca00ca1..66a6c3b42e6 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp @@ -17,6 +17,7 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "ruins_of_ahnqiraj.h" #include "Player.h" #include "SpellInfo.h" @@ -278,18 +279,26 @@ class go_ossirian_crystal : public GameObjectScript public: go_ossirian_crystal() : GameObjectScript("go_ossirian_crystal") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_ossirian_crystalAI : public GameObjectAI { - InstanceScript* Instance = player->GetInstanceScript(); - if (!Instance) - return false; + go_ossirian_crystalAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - Creature* Ossirian = player->FindNearestCreature(NPC_OSSIRIAN, 30.0f); - if (!Ossirian || Instance->GetBossState(DATA_OSSIRIAN) != IN_PROGRESS) - return false; + InstanceScript* instance; - Ossirian->AI()->DoAction(ACTION_TRIGGER_WEAKNESS); - return true; + bool GossipHello(Player* player, bool /*reportUse*/) override + { + Creature* ossirian = player->FindNearestCreature(NPC_OSSIRIAN, 30.0f); + if (!ossirian || instance->GetBossState(DATA_OSSIRIAN) != IN_PROGRESS) + return false; + + ossirian->AI()->DoAction(ACTION_TRIGGER_WEAKNESS); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetInstanceAI<go_ossirian_crystalAI>(go); } }; diff --git a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp index bd77e4c9546..fcbdfd547a6 100644 --- a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp +++ b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp @@ -79,60 +79,6 @@ class npc_disciple_of_naralex : public CreatureScript public: npc_disciple_of_naralex() : CreatureScript("npc_disciple_of_naralex") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_disciple_of_naralexAI>(creature); - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - InstanceScript* instance = creature->GetInstanceScript(); - if (action == GOSSIP_ACTION_INFO_DEF + 1) - { - CloseGossipMenuFor(player); - if (instance) - instance->SetData(TYPE_NARALEX_EVENT, IN_PROGRESS); - - creature->AI()->Talk(SAY_MAKE_PREPARATIONS); - - creature->SetFaction(250); - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - - ENSURE_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID()); - ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtFar(false); - ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtEnd(false); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - - if (instance) - { - creature->CastSpell(player, SPELL_MARK_OF_THE_WILD_RANK_2, true); - if ((instance->GetData(TYPE_LORD_COBRAHN) == DONE) && (instance->GetData(TYPE_LORD_PYTHAS) == DONE) && - (instance->GetData(TYPE_LADY_ANACONDRA) == DONE) && (instance->GetData(TYPE_LORD_SERPENTIS) == DONE)) - { - AddGossipItemFor(player, GOSSIP_OPTION_LET_EVENT_BEGIN, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, NPC_TEXT_FANGLORDS_ARE_DEAD, creature->GetGUID()); - - if (!instance->GetData(TYPE_NARALEX_YELLED)) - { - creature->AI()->Talk(SAY_AT_LAST); - instance->SetData(TYPE_NARALEX_YELLED, 1); - } - } - else - { - SendGossipMenuFor(player, NPC_TEXT_NARALEX_SLEEPS_AGAIN, creature->GetGUID()); - } - } - return true; - } - struct npc_disciple_of_naralexAI : public npc_escortAI { npc_disciple_of_naralexAI(Creature* creature) : npc_escortAI(creature) @@ -369,8 +315,56 @@ public: } } else eventTimer -= diff; } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + if (instance) + instance->SetData(TYPE_NARALEX_EVENT, IN_PROGRESS); + + Talk(SAY_MAKE_PREPARATIONS); + + me->SetFaction(250); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + + Start(false, false, player->GetGUID()); + SetDespawnAtFar(false); + SetDespawnAtEnd(false); + } + return true; + } + + bool GossipHello(Player* player) override + { + DoCast(player, SPELL_MARK_OF_THE_WILD_RANK_2, true); + if ((instance->GetData(TYPE_LORD_COBRAHN) == DONE) && (instance->GetData(TYPE_LORD_PYTHAS) == DONE) && + (instance->GetData(TYPE_LADY_ANACONDRA) == DONE) && (instance->GetData(TYPE_LORD_SERPENTIS) == DONE)) + { + AddGossipItemFor(player, GOSSIP_OPTION_LET_EVENT_BEGIN, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, NPC_TEXT_FANGLORDS_ARE_DEAD, me->GetGUID()); + + if (!instance->GetData(TYPE_NARALEX_YELLED)) + { + Talk(SAY_AT_LAST); + instance->SetData(TYPE_NARALEX_YELLED, 1); + } + } + else + { + SendGossipMenuFor(player, NPC_TEXT_NARALEX_SLEEPS_AGAIN, me->GetGUID()); + } + return true; + } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_disciple_of_naralexAI>(creature); + } }; void AddSC_wailing_caverns() diff --git a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp index 51bc5b7a945..9e014f7f6d9 100644 --- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp +++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp @@ -31,6 +31,7 @@ EndContentData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" +#include "GameObjectAI.h" #include "zulfarrak.h" #include "Player.h" @@ -64,42 +65,6 @@ class npc_sergeant_bly : public CreatureScript public: npc_sergeant_bly() : CreatureScript("npc_sergeant_bly") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); - ENSURE_AI(npc_sergeant_bly::npc_sergeant_blyAI, creature->AI())->PlayerGUID = player->GetGUID(); - creature->AI()->DoAction(0); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (InstanceScript* instance = creature->GetInstanceScript()) - { - if (instance->GetData(EVENT_PYRAMID) == PYRAMID_KILLED_ALL_TROLLS) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BLY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, 1517, creature->GetGUID()); - } - else - if (instance->GetData(EVENT_PYRAMID) == PYRAMID_NOT_STARTED) - SendGossipMenuFor(player, 1515, creature->GetGUID()); - else - SendGossipMenuFor(player, 1516, creature->GetGUID()); - return true; - } - return false; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_sergeant_blyAI>(creature); - } - struct npc_sergeant_blyAI : public ScriptedAI { npc_sergeant_blyAI(Creature* creature) : ScriptedAI(creature) @@ -198,8 +163,40 @@ public: if (crew->IsAlive()) crew->SetFaction(FACTION_HOSTILE); } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + PlayerGUID = player->GetGUID(); + DoAction(0); + } + return true; + } + + bool GossipHello(Player* player) override + { + if (instance->GetData(EVENT_PYRAMID) == PYRAMID_KILLED_ALL_TROLLS) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BLY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, 1517, me->GetGUID()); + } + else + if (instance->GetData(EVENT_PYRAMID) == PYRAMID_NOT_STARTED) + SendGossipMenuFor(player, 1515, me->GetGUID()); + else + SendGossipMenuFor(player, 1516, me->GetGUID()); + return true; + } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_sergeant_blyAI>(creature); + } }; /*###### @@ -211,32 +208,41 @@ class go_troll_cage : public GameObjectScript public: go_troll_cage() : GameObjectScript("go_troll_cage") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_troll_cageAI : public GameObjectAI { - if (InstanceScript* instance = go->GetInstanceScript()) + go_troll_cageAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override { instance->SetData(EVENT_PYRAMID, PYRAMID_CAGES_OPEN); //set bly & co to aggressive & start moving to top of stairs - initBlyCrewMember(instance, ENTRY_BLY, 1884.99f, 1263, 41.52f); - initBlyCrewMember(instance, ENTRY_RAVEN, 1882.5f, 1263, 41.52f); - initBlyCrewMember(instance, ENTRY_ORO, 1886.47f, 1270.68f, 41.68f); - initBlyCrewMember(instance, ENTRY_WEEGLI, 1890, 1263, 41.52f); - initBlyCrewMember(instance, ENTRY_MURTA, 1891.19f, 1272.03f, 41.60f); + initBlyCrewMember(ENTRY_BLY, 1884.99f, 1263, 41.52f); + initBlyCrewMember(ENTRY_RAVEN, 1882.5f, 1263, 41.52f); + initBlyCrewMember(ENTRY_ORO, 1886.47f, 1270.68f, 41.68f); + initBlyCrewMember(ENTRY_WEEGLI, 1890, 1263, 41.52f); + initBlyCrewMember(ENTRY_MURTA, 1891.19f, 1272.03f, 41.60f); + return false; } - return false; - } -private: - void initBlyCrewMember(InstanceScript* instance, uint32 entry, float x, float y, float z) - { - if (Creature* crew = instance->instance->GetCreature(instance->GetGuidData(entry))) + private: + void initBlyCrewMember(uint32 entry, float x, float y, float z) { - crew->SetReactState(REACT_AGGRESSIVE); - crew->SetWalk(true); - crew->SetHomePosition(x, y, z, 0); - crew->GetMotionMaster()->MovePoint(1, x, y, z); - crew->SetFaction(FACTION_FREED); + if (Creature* crew = instance->instance->GetCreature(instance->GetGuidData(entry))) + { + crew->SetReactState(REACT_AGGRESSIVE); + crew->SetWalk(true); + crew->SetHomePosition(x, y, z, 0); + crew->GetMotionMaster()->MovePoint(1, x, y, z); + crew->SetFaction(FACTION_FREED); + } } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetInstanceAI<go_troll_cageAI>(go); } }; @@ -265,44 +271,6 @@ class npc_weegli_blastfuse : public CreatureScript public: npc_weegli_blastfuse() : CreatureScript("npc_weegli_blastfuse") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); - //here we make him run to door, set the charge and run away off to nowhere - creature->AI()->DoAction(0); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (InstanceScript* instance = creature->GetInstanceScript()) - { - switch (instance->GetData(EVENT_PYRAMID)) - { - case PYRAMID_KILLED_ALL_TROLLS: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEEGLI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, 1514, creature->GetGUID()); //if event can proceed to end - break; - case PYRAMID_NOT_STARTED: - SendGossipMenuFor(player, 1511, creature->GetGUID()); //if event not started - break; - default: - SendGossipMenuFor(player, 1513, creature->GetGUID()); //if event are in progress - } - return true; - } - return false; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_weegli_blastfuseAI>(creature); - } - struct npc_weegli_blastfuseAI : public ScriptedAI { npc_weegli_blastfuseAI(Creature* creature) : ScriptedAI(creature) @@ -375,11 +343,6 @@ public: }; } - void DoAction(int32 /*param*/) override - { - DestroyDoor(); - } - void DestroyDoor() { if (me->IsAlive()) @@ -391,8 +354,42 @@ public: destroyingDoor=true; } } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + //here we make him run to door, set the charge and run away off to nowhere + DestroyDoor(); + } + return true; + } + + bool GossipHello(Player* player) override + { + switch (instance->GetData(EVENT_PYRAMID)) + { + case PYRAMID_KILLED_ALL_TROLLS: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEEGLI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, 1514, me->GetGUID()); //if event can proceed to end + break; + case PYRAMID_NOT_STARTED: + SendGossipMenuFor(player, 1511, me->GetGUID()); //if event not started + break; + default: + SendGossipMenuFor(player, 1513, me->GetGUID()); //if event are in progress + } + return true; + } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_weegli_blastfuseAI>(creature); + } }; /*###### @@ -412,20 +409,30 @@ class go_shallow_grave : public GameObjectScript public: go_shallow_grave() : GameObjectScript("go_shallow_grave") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_shallow_graveAI : public GameObjectAI { - // randomly summon a zombie or dead hero the first time a grave is used - if (go->GetUseCount() == 0) + go_shallow_graveAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override { - uint32 randomchance = urand(0, 100); - if (randomchance < CHANCE_ZOMBIE) - go->SummonCreature(NPC_ZOMBIE, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - else - if ((randomchance - CHANCE_ZOMBIE) < CHANCE_DEAD_HERO) - go->SummonCreature(NPC_DEAD_HERO, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + // randomly summon a zombie or dead hero the first time a grave is used + if (me->GetUseCount() == 0) + { + uint32 randomchance = urand(0, 100); + if (randomchance < CHANCE_ZOMBIE) + me->SummonCreature(NPC_ZOMBIE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + else + if ((randomchance - CHANCE_ZOMBIE) < CHANCE_DEAD_HERO) + me->SummonCreature(NPC_DEAD_HERO, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + } + me->AddUse(); + return false; } - go->AddUse(); - return false; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_shallow_graveAI(go); } }; diff --git a/src/server/scripts/Kalimdor/zone_ashenvale.cpp b/src/server/scripts/Kalimdor/zone_ashenvale.cpp index ecd1f2e4d60..2b8f0550dd0 100644 --- a/src/server/scripts/Kalimdor/zone_ashenvale.cpp +++ b/src/server/scripts/Kalimdor/zone_ashenvale.cpp @@ -30,6 +30,7 @@ EndContentData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedEscortAI.h" +#include "GameObjectAI.h" #include "Player.h" #include "SpellScript.h" @@ -79,7 +80,7 @@ public: summoned->AI()->AttackStart(me); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_FREEDOM_TO_RUUL) { @@ -221,7 +222,7 @@ public: summoned->AI()->AttackStart(me); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_VORSHA) { @@ -328,20 +329,30 @@ class go_naga_brazier : public GameObjectScript public: go_naga_brazier() : GameObjectScript("go_naga_brazier") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_naga_brazierAI : public GameObjectAI { - if (Creature* creature = GetClosestCreatureWithEntry(go, NPC_MUGLASH, INTERACTION_DISTANCE*2)) + go_naga_brazierAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override { - if (npc_muglash::npc_muglashAI* pEscortAI = CAST_AI(npc_muglash::npc_muglashAI, creature->AI())) + if (Creature* creature = GetClosestCreatureWithEntry(me, NPC_MUGLASH, INTERACTION_DISTANCE * 2)) { - creature->AI()->Talk(SAY_MUG_BRAZIER_WAIT); + if (npc_muglash::npc_muglashAI* pEscortAI = CAST_AI(npc_muglash::npc_muglashAI, creature->AI())) + { + creature->AI()->Talk(SAY_MUG_BRAZIER_WAIT); - pEscortAI->_isBrazierExtinguished = true; - return false; + pEscortAI->_isBrazierExtinguished = true; + return false; + } } + + return true; } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_naga_brazierAI(go); } }; diff --git a/src/server/scripts/Kalimdor/zone_azshara.cpp b/src/server/scripts/Kalimdor/zone_azshara.cpp index 32f2d04efac..86ae2468a35 100644 --- a/src/server/scripts/Kalimdor/zone_azshara.cpp +++ b/src/server/scripts/Kalimdor/zone_azshara.cpp @@ -259,12 +259,13 @@ public: } } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { CloseGossipMenuFor(player); me->CastSpell(player, SPELL_GIVE_SOUTHFURY_MOONSTONE, true); MustDieTimer = 3000; MustDie = true; + return false; } void MovementInform(uint32 type, uint32 id) override @@ -366,6 +367,15 @@ public: } else CheckTimer -= diff; } + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) != QUEST_STATUS_INCOMPLETE) + return true; + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_GET_MOONSTONE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, 10811, me->GetGUID()); + return true; + } + private: ObjectGuid PlayerGUID; uint32 SpellEscapeTimer; @@ -380,15 +390,6 @@ public: bool Reached; }; - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) != QUEST_STATUS_INCOMPLETE) - return true; - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_GET_MOONSTONE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, 10811, creature->GetGUID()); - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return new npc_rizzle_sprysprocketAI(creature); diff --git a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp index 811db4a8ac1..0a3f57ace8e 100644 --- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp @@ -37,6 +37,7 @@ EndContentData */ #include "ScriptedCreature.h" #include "ScriptedEscortAI.h" #include "ScriptedGossip.h" +#include "GameObjectAI.h" #include "Cell.h" #include "CellImpl.h" #include "GridNotifiersImpl.h" @@ -230,11 +231,12 @@ public: Talk(ATTACK_YELL, who); } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { CloseGossipMenuFor(player); me->SetFaction(FACTION_HOSTILE); me->Attack(player, true); + return false; } void UpdateAI(uint32 diff) override @@ -361,7 +363,7 @@ public: Talk(SAY_AGGRO, who); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_A_CRY_FOR_HELP) { @@ -633,19 +635,29 @@ class go_ravager_cage : public GameObjectScript public: go_ravager_cage() : GameObjectScript("go_ravager_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_ravager_cageAI : public GameObjectAI { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_STRENGTH_ONE) == QUEST_STATUS_INCOMPLETE) + go_ravager_cageAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - if (Creature* ravager = go->FindNearestCreature(NPC_DEATH_RAVAGER, 5.0f, true)) + me->UseDoorOrButton(); + if (player->GetQuestStatus(QUEST_STRENGTH_ONE) == QUEST_STATUS_INCOMPLETE) { - ravager->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - ravager->SetReactState(REACT_AGGRESSIVE); - ravager->AI()->AttackStart(player); + if (Creature* ravager = me->FindNearestCreature(NPC_DEATH_RAVAGER, 5.0f, true)) + { + ravager->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + ravager->SetReactState(REACT_AGGRESSIVE); + ravager->AI()->AttackStart(player); + } } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_ravager_cageAI(go); } }; @@ -803,19 +815,29 @@ class go_bristlelimb_cage : public GameObjectScript public: go_bristlelimb_cage() : GameObjectScript("go_bristlelimb_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_bristlelimb_cageAI : public GameObjectAI { - go->SetGoState(GO_STATE_READY); - if (player->GetQuestStatus(QUEST_THE_PROPHECY_OF_AKIDA) == QUEST_STATUS_INCOMPLETE) + go_bristlelimb_cageAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - if (Creature* capitive = go->FindNearestCreature(NPC_STILLPINE_CAPITIVE, 5.0f, true)) + me->SetGoState(GO_STATE_READY); + if (player->GetQuestStatus(QUEST_THE_PROPHECY_OF_AKIDA) == QUEST_STATUS_INCOMPLETE) { - go->ResetDoorOrButton(); - ENSURE_AI(npc_stillpine_capitive::npc_stillpine_capitiveAI, capitive->AI())->StartMoving(player); - return false; + if (Creature* capitive = me->FindNearestCreature(NPC_STILLPINE_CAPITIVE, 5.0f, true)) + { + me->ResetDoorOrButton(); + ENSURE_AI(npc_stillpine_capitive::npc_stillpine_capitiveAI, capitive->AI())->StartMoving(player); + return false; + } } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_bristlelimb_cageAI(go); } }; diff --git a/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp index 9ebf92874d6..ed9a3d11a59 100644 --- a/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp @@ -361,7 +361,7 @@ public: Initialize(); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_ENDING_THEIR_WORLD) { diff --git a/src/server/scripts/Kalimdor/zone_darkshore.cpp b/src/server/scripts/Kalimdor/zone_darkshore.cpp index c5506593799..95790c11a15 100644 --- a/src/server/scripts/Kalimdor/zone_darkshore.cpp +++ b/src/server/scripts/Kalimdor/zone_darkshore.cpp @@ -155,22 +155,17 @@ public: DoMeleeAttackIfReady(); } - }; - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_SLEEPER_AWAKENED) + void QuestAccept(Player* player, Quest const* quest) override { - if (npc_kerlonianAI* pKerlonianAI = CAST_AI(npc_kerlonian::npc_kerlonianAI, creature->AI())) + if (quest->GetQuestId() == QUEST_SLEEPER_AWAKENED) { - creature->SetStandState(UNIT_STAND_STATE_STAND); - creature->AI()->Talk(SAY_KER_START, player); - pKerlonianAI->StartFollow(player, FACTION_KER_ESCORTEE, quest); + me->SetStandState(UNIT_STAND_STATE_STAND); + Talk(SAY_KER_START, player); + StartFollow(player, FACTION_KER_ESCORTEE, quest); } } - - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { @@ -288,20 +283,16 @@ public: } } } - }; - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_ABSENT_MINDED_PT2) + void QuestAccept(Player* player, Quest const* quest) override { - if (npc_escortAI* pEscortAI = CAST_AI(npc_prospector_remtravel::npc_prospector_remtravelAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID()); - - creature->SetFaction(FACTION_ESCORTEE); + if (quest->GetQuestId() == QUEST_ABSENT_MINDED_PT2) + { + Start(false, false, player->GetGUID()); + me->SetFaction(FACTION_ESCORTEE); + } } - - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { @@ -359,33 +350,31 @@ public: SetFollowComplete(true); } - }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - CloseGossipMenuFor(player); - - if (npc_threshwackonatorAI* pThreshAI = CAST_AI(npc_threshwackonator::npc_threshwackonatorAI, creature->AI())) + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) { - creature->AI()->Talk(EMOTE_START); - pThreshAI->StartFollow(player); + CloseGossipMenuFor(player); + + Talk(EMOTE_START); + StartFollow(player); } - } - return true; - } + return true; + } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_GYROMAST_REV) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_INSERT_KEY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(QUEST_GYROMAST_REV) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_INSERT_KEY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } + }; CreatureAI* GetAI(Creature* creature) const override { diff --git a/src/server/scripts/Kalimdor/zone_desolace.cpp b/src/server/scripts/Kalimdor/zone_desolace.cpp index c61239f5145..3f31487885a 100644 --- a/src/server/scripts/Kalimdor/zone_desolace.cpp +++ b/src/server/scripts/Kalimdor/zone_desolace.cpp @@ -34,6 +34,7 @@ EndContentData */ #include "ScriptedCreature.h" #include "ScriptedGossip.h" #include "ScriptedEscortAI.h" +#include "GameObjectAI.h" #include "Player.h" #include "SpellInfo.h" @@ -104,19 +105,19 @@ public: me->DespawnOrUnsummon(60000); } } - }; - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) && creature->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF)) + bool GossipHello(Player* player) override { - player->TalkedToCreature(creature->GetEntry(), ObjectGuid::Empty); - player->RemoveAurasDueToSpell(SPELL_KODO_KOMBO_PLAYER_BUFF); - } + if (player->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) && me->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF)) + { + player->TalkedToCreature(me->GetEntry(), ObjectGuid::Empty); + player->RemoveAurasDueToSpell(SPELL_KODO_KOMBO_PLAYER_BUFF); + } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } + }; CreatureAI* GetAI(Creature* creature) const override { @@ -141,12 +142,22 @@ class go_iruxos : public GameObjectScript public: go_iruxos() : GameObjectScript("go_iruxos") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_iruxosAI : public GameObjectAI { - if (player->GetQuestStatus(QUEST_HAND_IRUXOS) == QUEST_STATUS_INCOMPLETE && !go->FindNearestCreature(NPC_DEMON_SPIRIT, 25.0f, true)) - player->SummonCreature(NPC_DEMON_SPIRIT, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); + go_iruxosAI(GameObject* go) : GameObjectAI(go) { } - return true; + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->GetQuestStatus(QUEST_HAND_IRUXOS) == QUEST_STATUS_INCOMPLETE && !me->FindNearestCreature(NPC_DEMON_SPIRIT, 25.0f, true)) + player->SummonCreature(NPC_DEMON_SPIRIT, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_iruxosAI(go); } }; @@ -204,20 +215,16 @@ public: DoMeleeAttackIfReady(); } - }; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_RETURN_TO_VAHLARRIEL) - { - if (npc_escortAI* escortAI = CAST_AI(npc_dalinda::npc_dalindaAI, creature->AI())) + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_RETURN_TO_VAHLARRIEL) { - escortAI->Start(true, false, player->GetGUID()); - creature->SetFaction(113); + Start(true, false, player->GetGUID()); + me->SetFaction(113); } } - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { diff --git a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp index 92d8ce43156..f6718dfe919 100644 --- a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp +++ b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp @@ -51,31 +51,41 @@ class npc_nat_pagle : public CreatureScript public: npc_nat_pagle() : CreatureScript("npc_nat_pagle") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override + struct npc_nat_pagleAI : public ScriptedAI { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); + npc_nat_pagleAI(Creature* creature) : ScriptedAI(creature) { } - return true; - } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_TRADE) + player->GetSession()->SendListInventory(me->GetGUID()); - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + return true; + } - if (creature->IsVendor() && player->GetQuestRewardStatus(QUEST_NATS_MEASURING_TAPE)) + bool GossipHello(Player* player) override { - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - SendGossipMenuFor(player, 7640, creature->GetGUID()); + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (me->IsVendor() && player->GetQuestRewardStatus(QUEST_NATS_MEASURING_TAPE)) + { + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + SendGossipMenuFor(player, 7640, me->GetGUID()); + } + else + SendGossipMenuFor(player, 7638, me->GetGUID()); + + return true; } - else - SendGossipMenuFor(player, 7638, creature->GetGUID()); + }; - return true; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_nat_pagleAI(creature); } - }; /*###### @@ -104,19 +114,6 @@ class npc_private_hendel : public CreatureScript public: npc_private_hendel() : CreatureScript("npc_private_hendel") { } - bool OnQuestAccept(Player* /*player*/, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_MISSING_DIPLO_PT16) - creature->SetFaction(FACTION_HOSTILE); - - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_private_hendelAI(creature); - } - struct npc_private_hendelAI : public ScriptedAI { npc_private_hendelAI(Creature* creature) : ScriptedAI(creature) { } @@ -150,8 +147,18 @@ public: EnterEvadeMode(); } } + + void QuestAccept(Player* /*player*/, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_MISSING_DIPLO_PT16) + me->SetFaction(FACTION_HOSTILE); + } }; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_private_hendelAI(creature); + } }; /*###### diff --git a/src/server/scripts/Kalimdor/zone_feralas.cpp b/src/server/scripts/Kalimdor/zone_feralas.cpp index 676d285e37f..f8617314334 100644 --- a/src/server/scripts/Kalimdor/zone_feralas.cpp +++ b/src/server/scripts/Kalimdor/zone_feralas.cpp @@ -64,32 +64,6 @@ class npc_oox22fe : public CreatureScript public: npc_oox22fe() : CreatureScript("npc_oox22fe") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_RESCUE_OOX22FE) - { - creature->AI()->Talk(SAY_OOX_START); - //change that the npc is not lying dead on the ground - creature->SetStandState(UNIT_STAND_STATE_STAND); - - if (player->GetTeam() == ALLIANCE) - creature->SetFaction(FACTION_ESCORTEE_A); - - if (player->GetTeam() == HORDE) - creature->SetFaction(FACTION_ESCORTEE_H); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_oox22fe::npc_oox22feAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); - - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_oox22feAI(creature); - } - struct npc_oox22feAI : public npc_escortAI { npc_oox22feAI(Creature* creature) : npc_escortAI(creature) { } @@ -146,8 +120,30 @@ public: { summoned->AI()->AttackStart(me); } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_RESCUE_OOX22FE) + { + Talk(SAY_OOX_START); + //change that the npc is not lying dead on the ground + me->SetStandState(UNIT_STAND_STATE_STAND); + + if (player->GetTeam() == ALLIANCE) + me->SetFaction(FACTION_ESCORTEE_A); + + if (player->GetTeam() == HORDE) + me->SetFaction(FACTION_ESCORTEE_H); + + Start(true, false, player->GetGUID()); + } + } }; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_oox22feAI(creature); + } }; /*###### diff --git a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp index 0ecbb19c1af..b36d1d8df12 100644 --- a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp +++ b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp @@ -51,21 +51,6 @@ class npc_shenthul : public CreatureScript public: npc_shenthul() : CreatureScript("npc_shenthul") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_SHATTERED_SALUTE) - { - ENSURE_AI(npc_shenthul::npc_shenthulAI, creature->AI())->CanTalk = true; - ENSURE_AI(npc_shenthul::npc_shenthulAI, creature->AI())->PlayerGUID = player->GetGUID(); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_shenthulAI(creature); - } - struct npc_shenthulAI : public ScriptedAI { npc_shenthulAI(Creature* creature) : ScriptedAI(creature) @@ -137,8 +122,21 @@ public: } } } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_SHATTERED_SALUTE) + { + CanTalk = true; + PlayerGUID = player->GetGUID(); + } + } }; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_shenthulAI(creature); + } }; /*###### @@ -177,60 +175,6 @@ class npc_thrall_warchief : public CreatureScript public: npc_thrall_warchief() : CreatureScript("npc_thrall_warchief") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, OPTION_WHAT_DISCOVERIES, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_THE_SHATTERED_HAND, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - AddGossipItemFor(player, OPTION_USURPER, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - SendGossipMenuFor(player, GOSSIP_IT_WOULD_APPEAR_AS, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - AddGossipItemFor(player, OPTION_WITH_ALL_DUE_RESPECT, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); - SendGossipMenuFor(player, GOSSIP_THE_BROOD_MOTHER, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - AddGossipItemFor(player, OPTION_I_I_DID_NOT_THINK_OF, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); - SendGossipMenuFor(player, GOSSIP_SO_MUCH_TO_LEARN, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+5: - AddGossipItemFor(player, OPTION_I_LIVE_ONLY_TO_SERVE, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6); - SendGossipMenuFor(player, GOSSIP_I_DO_NOT_FAULT_YOU, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+6: - AddGossipItemFor(player, OPTION_OF_COURSE_WARCHIEF, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+7); - SendGossipMenuFor(player, GOSSIP_NOW_PAY_ATTENTION, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+7: - CloseGossipMenuFor(player); - player->AreaExploredOrEventHappens(QUEST_WHAT_THE_WIND_CARRIES); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(QUEST_WHAT_THE_WIND_CARRIES) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, OPTION_PLEASE_SHARE_YOUR, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - SendGossipMenuFor(player, GOSSIP_MEMBERS_OF_THE_HORDE, creature->GetGUID()); - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_thrall_warchiefAI(creature); - } - struct npc_thrall_warchiefAI : public ScriptedAI { npc_thrall_warchiefAI(Creature* creature) : ScriptedAI(creature) @@ -273,8 +217,62 @@ public: DoMeleeAttackIfReady(); } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, OPTION_WHAT_DISCOVERIES, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_THE_SHATTERED_HAND, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, OPTION_USURPER, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + SendGossipMenuFor(player, GOSSIP_IT_WOULD_APPEAR_AS, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + AddGossipItemFor(player, OPTION_WITH_ALL_DUE_RESPECT, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + SendGossipMenuFor(player, GOSSIP_THE_BROOD_MOTHER, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + AddGossipItemFor(player, OPTION_I_I_DID_NOT_THINK_OF, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + SendGossipMenuFor(player, GOSSIP_SO_MUCH_TO_LEARN, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 5: + AddGossipItemFor(player, OPTION_I_LIVE_ONLY_TO_SERVE, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); + SendGossipMenuFor(player, GOSSIP_I_DO_NOT_FAULT_YOU, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 6: + AddGossipItemFor(player, OPTION_OF_COURSE_WARCHIEF, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); + SendGossipMenuFor(player, GOSSIP_NOW_PAY_ATTENTION, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 7: + CloseGossipMenuFor(player); + player->AreaExploredOrEventHappens(QUEST_WHAT_THE_WIND_CARRIES); + break; + } + return true; + } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (player->GetQuestStatus(QUEST_WHAT_THE_WIND_CARRIES) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, OPTION_PLEASE_SHARE_YOUR, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + SendGossipMenuFor(player, GOSSIP_MEMBERS_OF_THE_HORDE, me->GetGUID()); + return true; + } }; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_thrall_warchiefAI(creature); + } }; /* --------- Herald of War ------------- */ diff --git a/src/server/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp index d9b5cc82b1b..d0233e7d85e 100644 --- a/src/server/scripts/Kalimdor/zone_silithus.cpp +++ b/src/server/scripts/Kalimdor/zone_silithus.cpp @@ -38,6 +38,7 @@ EndContentData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" +#include "GameObjectAI.h" #include "Group.h" #include "Player.h" @@ -960,60 +961,68 @@ class go_crystalline_tear : public GameObjectScript public: go_crystalline_tear() : GameObjectScript("go_crystalline_tear") { } - bool OnQuestAccept(Player* player, GameObject* go, Quest const* quest) override + struct go_crystalline_tearAI : GameObjectAI { - if (quest->GetQuestId() == QUEST_A_PAWN_ON_THE_ETERNAL_BOARD) + go_crystalline_tearAI(GameObject* go) : GameObjectAI(go) { } + + void QuestAccept(Player* player, Quest const* quest) override { - if (Creature* trigger = go->FindNearestCreature(ANACHRONOS_QUEST_TRIGGER_INVISIBLE, 100)) + if (quest->GetQuestId() == QUEST_A_PAWN_ON_THE_ETERNAL_BOARD) { - Unit* Merithra = trigger->SummonCreature(NPC_MERITHRA_OF_THE_DREAM, -8034.535f, 1535.14f, 2.61f, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - Unit* Caelestrasz = trigger->SummonCreature(NPC_CAELESTRASZ, -8032.767f, 1533.148f, 2.61f, 1.5f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - Unit* Arygos = trigger->SummonCreature(NPC_ARYGOS, -8034.52f, 1537.843f, 2.61f, 5.7f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - /* Unit* Fandral = */ trigger->SummonCreature(NPC_FANDRAL_STAGHELM, -8028.462f, 1535.843f, 2.61f, 3.141592f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - Creature* Anachronos = trigger->SummonCreature(NPC_ANACHRONOS, -8028.75f, 1538.795f, 2.61f, 4, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - - if (Merithra) + if (Creature* trigger = me->FindNearestCreature(ANACHRONOS_QUEST_TRIGGER_INVISIBLE, 100)) { - Merithra->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); - Merithra->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - Merithra->SetUInt32Value(UNIT_FIELD_DISPLAYID, MERITHRA_NIGHT_ELF_FORM); - Merithra->SetFaction(35); - } + Unit* Merithra = trigger->SummonCreature(NPC_MERITHRA_OF_THE_DREAM, -8034.535f, 1535.14f, 2.61f, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); + Unit* Caelestrasz = trigger->SummonCreature(NPC_CAELESTRASZ, -8032.767f, 1533.148f, 2.61f, 1.5f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); + Unit* Arygos = trigger->SummonCreature(NPC_ARYGOS, -8034.52f, 1537.843f, 2.61f, 5.7f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); + /* Unit* Fandral = */ trigger->SummonCreature(NPC_FANDRAL_STAGHELM, -8028.462f, 1535.843f, 2.61f, 3.141592f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); + Creature* Anachronos = trigger->SummonCreature(NPC_ANACHRONOS, -8028.75f, 1538.795f, 2.61f, 4, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - if (Caelestrasz) - { - Caelestrasz->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); - Caelestrasz->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - Caelestrasz->SetUInt32Value(UNIT_FIELD_DISPLAYID, CAELESTRASZ_NIGHT_ELF_FORM); - Caelestrasz->SetFaction(35); - } + if (Merithra) + { + Merithra->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + Merithra->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + Merithra->SetUInt32Value(UNIT_FIELD_DISPLAYID, MERITHRA_NIGHT_ELF_FORM); + Merithra->SetFaction(35); + } - if (Arygos) - { - Arygos->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); - Arygos->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - Arygos->SetUInt32Value(UNIT_FIELD_DISPLAYID, ARYGOS_GNOME_FORM); - Arygos->SetFaction(35); - } + if (Caelestrasz) + { + Caelestrasz->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + Caelestrasz->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + Caelestrasz->SetUInt32Value(UNIT_FIELD_DISPLAYID, CAELESTRASZ_NIGHT_ELF_FORM); + Caelestrasz->SetFaction(35); + } - if (Anachronos) - { - if (npc_anachronos_the_ancient::npc_anachronos_the_ancientAI* anachronosAI = CAST_AI(npc_anachronos_the_ancient::npc_anachronos_the_ancientAI, Anachronos->AI())) - anachronosAI->PlayerGUID = player->GetGUID(); + if (Arygos) + { + Arygos->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + Arygos->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + Arygos->SetUInt32Value(UNIT_FIELD_DISPLAYID, ARYGOS_GNOME_FORM); + Arygos->SetFaction(35); + } - if (npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI* triggerAI = CAST_AI(npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI, trigger->AI())) + if (Anachronos) { - triggerAI->Failed = false; - triggerAI->PlayerGUID = player->GetGUID(); - triggerAI->EventStarted = true; - triggerAI->Announced = true; + if (npc_anachronos_the_ancient::npc_anachronos_the_ancientAI* anachronosAI = CAST_AI(npc_anachronos_the_ancient::npc_anachronos_the_ancientAI, Anachronos->AI())) + anachronosAI->PlayerGUID = player->GetGUID(); + + if (npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI* triggerAI = CAST_AI(npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI, trigger->AI())) + { + triggerAI->Failed = false; + triggerAI->PlayerGUID = player->GetGUID(); + triggerAI->EventStarted = true; + triggerAI->Announced = true; + } } } } } - return true; - } + }; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_crystalline_tearAI(go); + } }; /*### @@ -1128,241 +1137,252 @@ class go_wind_stone : public GameObjectScript public: go_wind_stone() : GameObjectScript("go_wind_stone") { } - private: - uint8 GetPlayerRank(Player* player) // For random summoning + struct go_wind_stoneAI : public GameObjectAI { - bool setAura = player->HasAura(AURA_TWILIGHT_SET); - bool medallionAura = player->HasAura(AURA_MEDALLION); - bool ringAura = player->HasAura(AURA_RING); - - if (setAura && medallionAura && ringAura) - return 3; - else if (setAura && medallionAura) - return 2; - else if (setAura) - return 1; - else - return 0; - } - - uint8 GetItems(Player* player, WS type) - { - uint8 result = 0x0; + go_wind_stoneAI(GameObject* go) : GameObjectAI(go) { } - switch (type) - { - case TEMPLAR: - { - if (player->HasItemCount(ITEM_TEMPLAR_FIRE)) - result |= FIRE; - if (player->HasItemCount(ITEM_TEMPLAR_WATER)) - result |= WATER; - if (player->HasItemCount(ITEM_TEMPLAR_EARTH)) - result |= EARTH; - if (player->HasItemCount(ITEM_TEMPLAR_AIR)) - result |= AIR; - break; - } - case DUKE: + private: + uint8 GetPlayerRank(Player* player) // For random summoning { - if (player->HasItemCount(ITEM_DUKE_FIRE)) - result |= FIRE; - if (player->HasItemCount(ITEM_DUKE_WATER)) - result |= WATER; - if (player->HasItemCount(ITEM_DUKE_EARTH)) - result |= EARTH; - if (player->HasItemCount(ITEM_DUKE_AIR)) - result |= AIR; - break; - } - case ROYAL: - { - if (player->HasItemCount(ITEM_ROYAL_FIRE)) - result |= FIRE; - if (player->HasItemCount(ITEM_ROYAL_WATER)) - result |= WATER; - if (player->HasItemCount(ITEM_ROYAL_EARTH)) - result |= EARTH; - if (player->HasItemCount(ITEM_ROYAL_AIR)) - result |= AIR; - break; + bool setAura = player->HasAura(AURA_TWILIGHT_SET); + bool medallionAura = player->HasAura(AURA_MEDALLION); + bool ringAura = player->HasAura(AURA_RING); + + if (setAura && medallionAura && ringAura) + return 3; + else if (setAura && medallionAura) + return 2; + else if (setAura) + return 1; + else + return 0; } - default: - break; - } - return result; - } - void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spell) - { - go->CastSpell(player, spell); - TempSummon* summons = go->SummonCreature(npc, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), player->GetOrientation() - float(M_PI), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10 * 60 * 1000); - summons->CastSpell(summons, SPELL_SPAWN_IN, false); - switch (summons->GetEntry()) - { - case NPC_TEMPLAR_FIRE: - case NPC_TEMPLAR_WATER: - case NPC_TEMPLAR_AIR: - case NPC_TEMPLAR_EARTH: - summons->AI()->Talk(SAY_TEMPLAR_AGGRO, player); - break; - - case NPC_DUKE_FIRE: - case NPC_DUKE_WATER: - case NPC_DUKE_EARTH: - case NPC_DUKE_AIR: - summons->AI()->Talk(SAY_DUKE_AGGRO); - break; - case NPC_ROYAL_FIRE: - case NPC_ROYAL_AIR: - case NPC_ROYAL_EARTH: - case NPC_ROYAL_WATER: - summons->AI()->Talk(YELL_ROYAL_AGGRO); - break; - } - summons->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - summons->SendMeleeAttackStart(player); - summons->CombatStart(player); - } + uint8 GetItems(Player* player, WS type) + { + uint8 result = 0x0; - public: - bool OnGossipHello(Player* player, GameObject* go) override - { - uint8 rank = GetPlayerRank(player); + switch (type) + { + case TEMPLAR: + { + if (player->HasItemCount(ITEM_TEMPLAR_FIRE)) + result |= FIRE; + if (player->HasItemCount(ITEM_TEMPLAR_WATER)) + result |= WATER; + if (player->HasItemCount(ITEM_TEMPLAR_EARTH)) + result |= EARTH; + if (player->HasItemCount(ITEM_TEMPLAR_AIR)) + result |= AIR; + break; + } + case DUKE: + { + if (player->HasItemCount(ITEM_DUKE_FIRE)) + result |= FIRE; + if (player->HasItemCount(ITEM_DUKE_WATER)) + result |= WATER; + if (player->HasItemCount(ITEM_DUKE_EARTH)) + result |= EARTH; + if (player->HasItemCount(ITEM_DUKE_AIR)) + result |= AIR; + break; + } + case ROYAL: + { + if (player->HasItemCount(ITEM_ROYAL_FIRE)) + result |= FIRE; + if (player->HasItemCount(ITEM_ROYAL_WATER)) + result |= WATER; + if (player->HasItemCount(ITEM_ROYAL_EARTH)) + result |= EARTH; + if (player->HasItemCount(ITEM_ROYAL_AIR)) + result |= AIR; + break; + } + default: + break; + } + return result; + } - uint32 gossipId = go->GetGOInfo()->GetGossipMenuId(); - switch (gossipId) - { - case GOSSIP_ID_LESSER_WS: + void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spell) { - if (rank >= 1) // 1 or 2 or 3 - AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - else + go->CastSpell(player, spell); + TempSummon* summons = go->SummonCreature(npc, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), player->GetOrientation() - float(M_PI), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10 * 60 * 1000); + summons->CastSpell(summons, SPELL_SPAWN_IN, false); + switch (summons->GetEntry()) { - go->CastSpell(player, SPELL_PUNISHMENT); - break; + case NPC_TEMPLAR_FIRE: + case NPC_TEMPLAR_WATER: + case NPC_TEMPLAR_AIR: + case NPC_TEMPLAR_EARTH: + summons->AI()->Talk(SAY_TEMPLAR_AGGRO, player); + break; + + case NPC_DUKE_FIRE: + case NPC_DUKE_WATER: + case NPC_DUKE_EARTH: + case NPC_DUKE_AIR: + summons->AI()->Talk(SAY_DUKE_AGGRO); + break; + case NPC_ROYAL_FIRE: + case NPC_ROYAL_AIR: + case NPC_ROYAL_EARTH: + case NPC_ROYAL_WATER: + summons->AI()->Talk(YELL_ROYAL_AGGRO); + break; } - - uint8 item = GetItems(player, TEMPLAR); - if (item & FIRE) - AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_1_CRIMSON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - if (item & WATER) - AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_2_AZURE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - if (item & EARTH) - AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_3_EARTHEN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - if (item & AIR) - AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_4_HOARY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - break; + summons->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + summons->SendMeleeAttackStart(player); + summons->CombatStart(player); } - case GOSSIP_ID_WIND_STONE: + + public: + bool GossipHello(Player* player, bool /*reportUse*/) override { - if (rank >= 2) // 2 or 3 - AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); - else + uint8 rank = GetPlayerRank(player); + + uint32 gossipId = me->GetGOInfo()->GetGossipMenuId(); + switch (gossipId) { - go->CastSpell(player, SPELL_PUNISHMENT); - break; + case GOSSIP_ID_LESSER_WS: + { + if (rank >= 1) // 1 or 2 or 3 + AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + else + { + me->CastSpell(player, SPELL_PUNISHMENT); + break; + } + + uint8 item = GetItems(player, TEMPLAR); + if (item & FIRE) + AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_1_CRIMSON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + if (item & WATER) + AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_2_AZURE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + if (item & EARTH) + AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_3_EARTHEN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + if (item & AIR) + AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_4_HOARY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + break; + } + case GOSSIP_ID_WIND_STONE: + { + if (rank >= 2) // 2 or 3 + AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); + else + { + me->CastSpell(player, SPELL_PUNISHMENT); + break; + } + + uint8 item = GetItems(player, DUKE); + if (item & FIRE) + AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_1_CYNDERS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); + if (item & WATER) + AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_2_FATHOMS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8); + if (item & EARTH) + AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_3_SHARDS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); + if (item & AIR) + AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_4_ZEPHYRS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10); + break; + } + case GOSSIP_ID_GREATER_WS: + { + if (rank == 3) // 3 + AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); + else + { + me->CastSpell(player, SPELL_PUNISHMENT); + break; + } + + uint8 item = GetItems(player, ROYAL); + if (item & FIRE) + AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_1_SKALDRENOX, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12); + if (item & WATER) + AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_2_SKWOL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13); + if (item & EARTH) + AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_3_KAZUM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14); + if (item & AIR) + AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_4_WHIRLAXIS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 15); + break; + } + default: + break; } - uint8 item = GetItems(player, DUKE); - if (item & FIRE) - AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_1_CYNDERS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); - if (item & WATER) - AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_2_FATHOMS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8); - if (item & EARTH) - AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_3_SHARDS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); - if (item & AIR) - AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_4_ZEPHYRS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10); - break; + SendGossipMenuFor(player, player->GetGossipTextId(gossipId, me), me->GetGUID()); + return true; } - case GOSSIP_ID_GREATER_WS: + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - if (rank == 3) // 3 - AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); - else + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + player->PlayerTalkClass->SendCloseGossip(); + + switch (action) { - go->CastSpell(player, SPELL_PUNISHMENT); - break; + case GOSSIP_ACTION_INFO_DEF + 1: + SummonNPC(me, player, RAND(NPC_TEMPLAR_WATER, NPC_TEMPLAR_FIRE, NPC_TEMPLAR_EARTH, NPC_TEMPLAR_AIR), SPELL_TEMPLAR_RANDOM); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + SummonNPC(me, player, NPC_TEMPLAR_FIRE, SPELL_TEMPLAR_FIRE); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + SummonNPC(me, player, NPC_TEMPLAR_WATER, SPELL_TEMPLAR_WATER); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + SummonNPC(me, player, NPC_TEMPLAR_EARTH, SPELL_TEMPLAR_EARTH); + break; + case GOSSIP_ACTION_INFO_DEF + 5: + SummonNPC(me, player, NPC_TEMPLAR_AIR, SPELL_TEMPLAR_AIR); + break; + + case GOSSIP_ACTION_INFO_DEF + 6: + SummonNPC(me, player, RAND(NPC_DUKE_FIRE, NPC_DUKE_WATER, NPC_DUKE_EARTH, NPC_DUKE_AIR), SPELL_DUKE_RANDOM); + break; + case GOSSIP_ACTION_INFO_DEF + 7: + SummonNPC(me, player, NPC_DUKE_FIRE, SPELL_DUKE_FIRE); + break; + case GOSSIP_ACTION_INFO_DEF + 8: + SummonNPC(me, player, NPC_DUKE_WATER, SPELL_DUKE_WATER); + break; + case GOSSIP_ACTION_INFO_DEF + 9: + SummonNPC(me, player, NPC_DUKE_EARTH, SPELL_DUKE_EARTH); + break; + case GOSSIP_ACTION_INFO_DEF + 10: + SummonNPC(me, player, NPC_DUKE_AIR, SPELL_DUKE_AIR); + break; + + case GOSSIP_ACTION_INFO_DEF + 11: + SummonNPC(me, player, RAND(NPC_ROYAL_FIRE, NPC_ROYAL_AIR, NPC_ROYAL_EARTH, NPC_ROYAL_WATER), SPELL_ROYAL_RANDOM); + break; + case GOSSIP_ACTION_INFO_DEF + 12: + SummonNPC(me, player, NPC_ROYAL_FIRE, SPELL_ROYAL_FIRE); + break; + case GOSSIP_ACTION_INFO_DEF + 13: + SummonNPC(me, player, NPC_ROYAL_WATER, SPELL_ROYAL_WATER); + break; + case GOSSIP_ACTION_INFO_DEF + 14: + SummonNPC(me, player, NPC_ROYAL_EARTH, SPELL_ROYAL_EARTH); + break; + case GOSSIP_ACTION_INFO_DEF + 15: + SummonNPC(me, player, NPC_ROYAL_AIR, SPELL_ROYAL_AIR); + break; + + default: + break; } - - uint8 item = GetItems(player, ROYAL); - if (item & FIRE) - AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_1_SKALDRENOX, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12); - if (item & WATER) - AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_2_SKWOL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13); - if (item & EARTH) - AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_3_KAZUM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14); - if (item & AIR) - AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_4_WHIRLAXIS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 15); - break; + return true; } - default: - break; - } - - SendGossipMenuFor(player, player->GetGossipTextId(gossipId, go), go->GetGUID()); - return true; - } + }; - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override + GameObjectAI* GetAI(GameObject* go) const override { - ClearGossipMenuFor(player); - player->PlayerTalkClass->SendCloseGossip(); - - switch (action) - { - case GOSSIP_ACTION_INFO_DEF + 1: - SummonNPC(go, player, RAND(NPC_TEMPLAR_WATER, NPC_TEMPLAR_FIRE, NPC_TEMPLAR_EARTH, NPC_TEMPLAR_AIR), SPELL_TEMPLAR_RANDOM); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - SummonNPC(go, player, NPC_TEMPLAR_FIRE, SPELL_TEMPLAR_FIRE); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - SummonNPC(go, player, NPC_TEMPLAR_WATER, SPELL_TEMPLAR_WATER); - break; - case GOSSIP_ACTION_INFO_DEF + 4: - SummonNPC(go, player, NPC_TEMPLAR_EARTH, SPELL_TEMPLAR_EARTH); - break; - case GOSSIP_ACTION_INFO_DEF + 5: - SummonNPC(go, player, NPC_TEMPLAR_AIR, SPELL_TEMPLAR_AIR); - break; - - case GOSSIP_ACTION_INFO_DEF + 6: - SummonNPC(go, player, RAND(NPC_DUKE_FIRE, NPC_DUKE_WATER, NPC_DUKE_EARTH, NPC_DUKE_AIR), SPELL_DUKE_RANDOM); - break; - case GOSSIP_ACTION_INFO_DEF + 7: - SummonNPC(go, player, NPC_DUKE_FIRE, SPELL_DUKE_FIRE); - break; - case GOSSIP_ACTION_INFO_DEF + 8: - SummonNPC(go, player, NPC_DUKE_WATER, SPELL_DUKE_WATER); - break; - case GOSSIP_ACTION_INFO_DEF + 9: - SummonNPC(go, player, NPC_DUKE_EARTH, SPELL_DUKE_EARTH); - break; - case GOSSIP_ACTION_INFO_DEF + 10: - SummonNPC(go, player, NPC_DUKE_AIR, SPELL_DUKE_AIR); - break; - - case GOSSIP_ACTION_INFO_DEF + 11: - SummonNPC(go, player, RAND(NPC_ROYAL_FIRE, NPC_ROYAL_AIR, NPC_ROYAL_EARTH, NPC_ROYAL_WATER), SPELL_ROYAL_RANDOM); - break; - case GOSSIP_ACTION_INFO_DEF + 12: - SummonNPC(go, player, NPC_ROYAL_FIRE, SPELL_ROYAL_FIRE); - break; - case GOSSIP_ACTION_INFO_DEF + 13: - SummonNPC(go, player, NPC_ROYAL_WATER, SPELL_ROYAL_WATER); - break; - case GOSSIP_ACTION_INFO_DEF + 14: - SummonNPC(go, player, NPC_ROYAL_EARTH, SPELL_ROYAL_EARTH); - break; - case GOSSIP_ACTION_INFO_DEF + 15: - SummonNPC(go, player, NPC_ROYAL_AIR, SPELL_ROYAL_AIR); - break; - - default: - break; - } - return true; + return new go_wind_stoneAI(go); } }; diff --git a/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp b/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp index 4363917b9a3..1fcefb7403f 100644 --- a/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp +++ b/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp @@ -78,21 +78,19 @@ public: } void Reset() override { } - }; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_PROTECT_KAYA) + void QuestAccept(Player* player, Quest const* quest) override { - if (npc_escortAI* pEscortAI = CAST_AI(npc_kaya_flathoof::npc_kaya_flathoofAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); + if (quest->GetQuestId() == QUEST_PROTECT_KAYA) + { + Start(true, false, player->GetGUID()); - creature->AI()->Talk(SAY_START); - creature->SetFaction(113); - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + Talk(SAY_START); + me->SetFaction(113); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + } } - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { diff --git a/src/server/scripts/Kalimdor/zone_tanaris.cpp b/src/server/scripts/Kalimdor/zone_tanaris.cpp index 92558f73269..b8922038170 100644 --- a/src/server/scripts/Kalimdor/zone_tanaris.cpp +++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp @@ -318,27 +318,6 @@ class npc_OOX17 : public CreatureScript public: npc_OOX17() : CreatureScript("npc_OOX17") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == Q_OOX17) - { - creature->SetFaction(113); - creature->SetFullHealth(); - creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - creature->AI()->Talk(SAY_OOX_START); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_OOX17::npc_OOX17AI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_OOX17AI(creature); - } - struct npc_OOX17AI : public npc_escortAI { npc_OOX17AI(Creature* creature) : npc_escortAI(creature) { } @@ -382,7 +361,26 @@ public: { summoned->AI()->AttackStart(me); } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == Q_OOX17) + { + me->SetFaction(113); + me->SetFullHealth(); + me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + Talk(SAY_OOX_START); + + Start(true, false, player->GetGUID()); + } + } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_OOX17AI(creature); + } }; /*#### @@ -413,22 +411,6 @@ class npc_tooga : public CreatureScript public: npc_tooga() : CreatureScript("npc_tooga") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_TOOGA) - { - if (npc_toogaAI* pToogaAI = CAST_AI(npc_tooga::npc_toogaAI, creature->AI())) - pToogaAI->StartFollow(player, FACTION_TOOG_ESCORTEE, quest); - } - - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_toogaAI(creature); - } - struct npc_toogaAI : public FollowerAI { npc_toogaAI(Creature* creature) : FollowerAI(creature) @@ -552,8 +534,18 @@ public: DoMeleeAttackIfReady(); } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_TOOGA) + StartFollow(player, FACTION_TOOG_ESCORTEE, quest); + } }; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_toogaAI(creature); + } }; void AddSC_tanaris() diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp index 93927f0d074..cf425fc804e 100644 --- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp +++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp @@ -56,17 +56,16 @@ class npc_beaten_corpse : public CreatureScript struct npc_beaten_corpseAI : public ScriptedAI { - npc_beaten_corpseAI(Creature* creature) : ScriptedAI(creature) - { - } + npc_beaten_corpseAI(Creature* creature) : ScriptedAI(creature) { } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_MENU_OPTION_INSPECT_BODY && gossipListId == GOSSIP_OPTION_ID_BEATEN_CORPSE) { CloseGossipMenuFor(player); player->TalkedToCreature(me->GetEntry(), me->GetGUID()); } + return false; } }; @@ -101,26 +100,6 @@ class npc_gilthares : public CreatureScript public: npc_gilthares() : CreatureScript("npc_gilthares") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_FREE_FROM_HOLD) - { - creature->SetFaction(FACTION_ESCORTEE); - creature->SetStandState(UNIT_STAND_STATE_STAND); - - creature->AI()->Talk(SAY_GIL_START, player); - - if (npc_giltharesAI* pEscortAI = CAST_AI(npc_gilthares::npc_giltharesAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_giltharesAI(creature); - } - struct npc_giltharesAI : public npc_escortAI { npc_giltharesAI(Creature* creature) : npc_escortAI(creature) { } @@ -170,8 +149,24 @@ public: Talk(SAY_GIL_AGGRO, who); } } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_FREE_FROM_HOLD) + { + me->SetFaction(FACTION_ESCORTEE); + me->SetStandState(UNIT_STAND_STATE_STAND); + + Talk(SAY_GIL_START, player); + Start(false, false, player->GetGUID(), quest); + } + } }; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_giltharesAI(creature); + } }; /*###### @@ -651,19 +646,17 @@ public: DoMeleeAttackIfReady(); } - }; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCAPE) + void QuestAccept(Player* player, Quest const* quest) override { - creature->SetFaction(FACTION_RATCHET); - creature->AI()->Talk(SAY_START); - if (npc_escortAI* pEscortAI = CAST_AI(npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); + if (quest->GetQuestId() == QUEST_ESCAPE) + { + me->SetFaction(FACTION_RATCHET); + Talk(SAY_START); + Start(true, false, player->GetGUID()); + } } - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { diff --git a/src/server/scripts/Kalimdor/zone_thousand_needles.cpp b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp index 6170ddb2e53..f13a0fc31ce 100644 --- a/src/server/scripts/Kalimdor/zone_thousand_needles.cpp +++ b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp @@ -35,6 +35,7 @@ EndContentData */ #include "ScriptedCreature.h" #include "ScriptedGossip.h" #include "ScriptedEscortAI.h" +#include "GameObjectAI.h" #include "Player.h" /*##### @@ -55,20 +56,6 @@ class npc_kanati : public CreatureScript public: npc_kanati() : CreatureScript("npc_kanati") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_PROTECT_KANATI) - if (npc_kanatiAI* pEscortAI = CAST_AI(npc_kanati::npc_kanatiAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest, true); - - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_kanatiAI(creature); - } - struct npc_kanatiAI : public npc_escortAI { npc_kanatiAI(Creature* creature) : npc_escortAI(creature) { } @@ -100,8 +87,18 @@ public: { summoned->AI()->AttackStart(me); } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_PROTECT_KANATI) + Start(false, false, player->GetGUID(), quest, true); + } }; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_kanatiAI(creature); + } }; /*###### @@ -140,24 +137,6 @@ class npc_lakota_windsong : public CreatureScript public: npc_lakota_windsong() : CreatureScript("npc_lakota_windsong") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_FREE_AT_LAST) - { - creature->AI()->Talk(SAY_LAKO_START, player); - creature->SetFaction(FACTION_ESCORTEE_LAKO); - - if (npc_lakota_windsongAI* pEscortAI = CAST_AI(npc_lakota_windsong::npc_lakota_windsongAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_lakota_windsongAI(creature); - } - struct npc_lakota_windsongAI : public npc_escortAI { npc_lakota_windsongAI(Creature* creature) : npc_escortAI(creature) { } @@ -193,7 +172,23 @@ public: for (int i = 0; i < 2; ++i) me->SummonCreature(NPC_GRIM_BANDIT, BanditLoc[i+AmbushId], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_FREE_AT_LAST) + { + Talk(SAY_LAKO_START, player); + me->SetFaction(FACTION_ESCORTEE_LAKO); + + Start(false, false, player->GetGUID(), quest); + } + } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_lakota_windsongAI(creature); + } }; /*###### @@ -223,24 +218,6 @@ class npc_paoka_swiftmountain : public CreatureScript public: npc_paoka_swiftmountain() : CreatureScript("npc_paoka_swiftmountain") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_HOMEWARD) - { - creature->AI()->Talk(SAY_START, player); - creature->SetFaction(FACTION_ESCORTEE); - - if (npc_paoka_swiftmountainAI* pEscortAI = CAST_AI(npc_paoka_swiftmountain::npc_paoka_swiftmountainAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_paoka_swiftmountainAI(creature); - } - struct npc_paoka_swiftmountainAI : public npc_escortAI { npc_paoka_swiftmountainAI(Creature* creature) : npc_escortAI(creature) { } @@ -270,7 +247,23 @@ public: for (int i = 0; i < 3; ++i) me->SummonCreature(NPC_WYVERN, WyvernLoc[i], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_HOMEWARD) + { + Talk(SAY_START, player); + me->SetFaction(FACTION_ESCORTEE); + + Start(false, false, player->GetGUID(), quest); + } + } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_paoka_swiftmountainAI(creature); + } }; enum PantherCage @@ -284,20 +277,30 @@ class go_panther_cage : public GameObjectScript public: go_panther_cage() : GameObjectScript("go_panther_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_panther_cageAI : public GameObjectAI { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_HYPERCAPACITOR_GIZMO) == QUEST_STATUS_INCOMPLETE) + go_panther_cageAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - if (Creature* panther = go->FindNearestCreature(ENRAGED_PANTHER, 5, true)) + me->UseDoorOrButton(); + if (player->GetQuestStatus(QUEST_HYPERCAPACITOR_GIZMO) == QUEST_STATUS_INCOMPLETE) { - panther->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - panther->SetReactState(REACT_AGGRESSIVE); - panther->AI()->AttackStart(player); + if (Creature* panther = me->FindNearestCreature(ENRAGED_PANTHER, 5, true)) + { + panther->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + panther->SetReactState(REACT_AGGRESSIVE); + panther->AI()->AttackStart(player); + } } + + return true; } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_panther_cageAI(go); } }; diff --git a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp index 027a182f386..0f894631345 100644 --- a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp +++ b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp @@ -48,35 +48,6 @@ class npc_cairne_bloodhoof : public CreatureScript public: npc_cairne_bloodhoof() : CreatureScript("npc_cairne_bloodhoof") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_SENDER_INFO) - { - player->CastSpell(player, 23123, false); - SendGossipMenuFor(player, 7014, creature->GetGUID()); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(925) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HCB, GOSSIP_SENDER_MAIN, GOSSIP_SENDER_INFO); - - SendGossipMenuFor(player, 7013, creature->GetGUID()); - - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_cairne_bloodhoofAI(creature); - } - struct npc_cairne_bloodhoofAI : public ScriptedAI { npc_cairne_bloodhoofAI(Creature* creature) : ScriptedAI(creature) @@ -144,8 +115,37 @@ public: DoMeleeAttackIfReady(); } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_SENDER_INFO) + { + player->CastSpell(player, 23123, false); + SendGossipMenuFor(player, 7014, me->GetGUID()); + } + return true; + } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (player->GetQuestStatus(925) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HCB, GOSSIP_SENDER_MAIN, GOSSIP_SENDER_INFO); + + SendGossipMenuFor(player, 7013, me->GetGUID()); + + return true; + } }; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_cairne_bloodhoofAI(creature); + } }; void AddSC_thunder_bluff() diff --git a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp index fa6ef602da4..07babc1f079 100644 --- a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp +++ b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp @@ -57,24 +57,6 @@ class npc_ame : public CreatureScript public: npc_ame() : CreatureScript("npc_ame") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_CHASING_AME) - { - ENSURE_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID()); - creature->AI()->Talk(SAY_READY, player); - creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - // Change faction so mobs attack - creature->SetFaction(113); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_ameAI(creature); - } - struct npc_ameAI : public npc_escortAI { npc_ameAI(Creature* creature) : npc_escortAI(creature) @@ -146,7 +128,24 @@ public: DemoralizingShoutTimer = 70000; } else DemoralizingShoutTimer -= diff; } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_CHASING_AME) + { + Start(false, false, player->GetGUID()); + Talk(SAY_READY, player); + me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + // Change faction so mobs attack + me->SetFaction(113); + } + } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_ameAI(creature); + } }; /*#### @@ -181,25 +180,6 @@ class npc_ringo : public CreatureScript public: npc_ringo() : CreatureScript("npc_ringo") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_A_LITTLE_HELP) - { - if (npc_ringoAI* ringoAI = CAST_AI(npc_ringo::npc_ringoAI, creature->AI())) - { - creature->SetStandState(UNIT_STAND_STATE_STAND); - ringoAI->StartFollow(player, FACTION_ESCORTEE, quest); - } - } - - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_ringoAI(creature); - } - struct npc_ringoAI : public FollowerAI { npc_ringoAI(Creature* creature) : FollowerAI(creature) @@ -355,7 +335,21 @@ public: DoMeleeAttackIfReady(); } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_A_LITTLE_HELP) + { + me->SetStandState(UNIT_STAND_STATE_STAND); + StartFollow(player, FACTION_ESCORTEE, quest); + } + } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_ringoAI(creature); + } }; void AddSC_ungoro_crater() diff --git a/src/server/scripts/Kalimdor/zone_winterspring.cpp b/src/server/scripts/Kalimdor/zone_winterspring.cpp index e16fb9bd0a7..a2c3e9a8715 100644 --- a/src/server/scripts/Kalimdor/zone_winterspring.cpp +++ b/src/server/scripts/Kalimdor/zone_winterspring.cpp @@ -33,6 +33,7 @@ EndContentData */ #include "ScriptedCreature.h" #include "ScriptedGossip.h" #include "ScriptedEscortAI.h" +#include "GameObjectAI.h" #include "Player.h" #include "WorldSession.h" @@ -45,26 +46,36 @@ class npc_rivern_frostwind : public CreatureScript public: npc_rivern_frostwind() : CreatureScript("npc_rivern_frostwind") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override + struct npc_rivern_frostwindAI : public ScriptedAI { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); + npc_rivern_frostwindAI(Creature* creature) : ScriptedAI(creature) { } - return true; - } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_TRADE) + player->GetSession()->SendListInventory(me->GetGUID()); - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + return true; + } - if (creature->IsVendor() && player->GetReputationRank(589) == REP_EXALTED) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + if (me->IsVendor() && player->GetReputationRank(589) == REP_EXALTED) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - return true; + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_rivern_frostwindAI(creature); } }; @@ -292,30 +303,10 @@ class npc_ranshalla : public CreatureScript { public: npc_ranshalla() : CreatureScript("npc_ranshalla") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_GUARDIANS_ALTAR) - { - creature->AI()->Talk(SAY_QUEST_START); - creature->SetFaction(FACTION_ESCORT_A_NEUTRAL_PASSIVE); - - if (npc_ranshallaAI* escortAI = dynamic_cast<npc_ranshallaAI*>(creature->AI())) - escortAI->Start(false, false, player->GetGUID(), quest); - - return true; - } - - return false; - } - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_ranshallaAI(creature); - } struct npc_ranshallaAI : public npc_escortAI, private DialogueHelper { - npc_ranshallaAI(Creature* creature) : npc_escortAI(creature), - DialogueHelper(introDialogue) + npc_ranshallaAI(Creature* creature) : npc_escortAI(creature), DialogueHelper(introDialogue) { Initialize(); } @@ -588,9 +579,26 @@ public: npc_escortAI::UpdateEscortAI(diff); } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_GUARDIANS_ALTAR) + { + Talk(SAY_QUEST_START); + me->SetFaction(FACTION_ESCORT_A_NEUTRAL_PASSIVE); + + Start(false, false, player->GetGUID(), quest); + } + } + private: EventMap events; }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_ranshallaAI(creature); + } }; /*##### @@ -601,22 +609,32 @@ class go_elune_fire : public GameObjectScript { public: go_elune_fire() : GameObjectScript("go_elune_fire") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - // Check if we are using the torches or the altar - bool isAltar = false; - if (go->GetEntry() == GO_ELUNE_ALTAR) - isAltar = true; + struct go_elune_fireAI : public GameObjectAI + { + go_elune_fireAI(GameObject* go) : GameObjectAI(go) { } - if (Creature* ranshalla = GetClosestCreatureWithEntry(go, NPC_RANSHALLA, 10.0f)) + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override { - if (npc_ranshalla::npc_ranshallaAI* escortAI = dynamic_cast<npc_ranshalla::npc_ranshallaAI*>(ranshalla->AI())) - escortAI->DoContinueEscort(isAltar); + // Check if we are using the torches or the altar + bool isAltar = false; + + if (me->GetEntry() == GO_ELUNE_ALTAR) + isAltar = true; + + if (Creature* ranshalla = GetClosestCreatureWithEntry(me, NPC_RANSHALLA, 10.0f)) + { + if (npc_ranshalla::npc_ranshallaAI* escortAI = dynamic_cast<npc_ranshalla::npc_ranshallaAI*>(ranshalla->AI())) + escortAI->DoContinueEscort(isAltar); + } + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + return false; } - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + }; - return false; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_elune_fireAI(go); } }; |
