diff options
| author | ariel- <ariel-@users.noreply.github.com> | 2017-05-01 18:19:36 -0300 |
|---|---|---|
| committer | ariel- <ariel-@users.noreply.github.com> | 2017-05-01 18:19:36 -0300 |
| commit | f913f3bb8977c127d200d5d4a608ab434b21bbcd (patch) | |
| tree | bb2d18ad5c0c23667271ca98bd6754cc745256a8 /src/server/scripts/Kalimdor | |
| parent | e4481c016a86fe7db0b83a434ea08eb7ba50174f (diff) | |
Core/Scripts: unified scripted gossip/quest api
- Changed self-accessor on GameObjectAI to "me", like UnitAI
- Moved all related functions to AI, now Unit and GameObject have the same function names with identical behaviour
- Remove "OnUpdate" from CreatureScript/GameObjectScript, was never used and we already have AI Update method
- Quest methods no longer return a bool, the return value was used to call the AI version if the ScriptMgr one returned false
- Implemented GameObjectAI::Destroyed hook (was never called), implemented Damaged method
- Rename OnStateChanged to OnLootStateChanged to reflect when it's really called, and created a new hook OnStateChanged that only gets called on GOState change
- Since the functions are now only getting called from AI, made GetAI methods full virtual. (CanSpawn method is anyways going to be used on creatures with AI)
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); } }; |
