diff options
150 files changed, 5618 insertions, 4788 deletions
diff --git a/src/server/game/AI/CoreAI/GameObjectAI.h b/src/server/game/AI/CoreAI/GameObjectAI.h index 766d30e6f84..3c163f1535e 100644 --- a/src/server/game/AI/CoreAI/GameObjectAI.h +++ b/src/server/game/AI/CoreAI/GameObjectAI.h @@ -29,9 +29,9 @@ class Unit; class TC_GAME_API GameObjectAI { protected: - GameObject* const go; + GameObject* const me; public: - explicit GameObjectAI(GameObject* g) : go(g) { } + explicit GameObjectAI(GameObject* g) : me(g) { } virtual ~GameObjectAI() { } virtual void UpdateAI(uint32 /*diff*/) { } @@ -47,19 +47,35 @@ class TC_GAME_API GameObjectAI static int Permissible(GameObject const* go); + // Called when a player opens a gossip dialog with the gameobject. virtual bool GossipHello(Player* /*player*/, bool /*reportUse*/) { return false; } - virtual bool GossipSelect(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/) { return false; } - virtual bool GossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, char const* /*code*/) { return false; } - virtual bool QuestAccept(Player* /*player*/, Quest const* /*quest*/) { return false; } - virtual bool QuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) { return false; } + + // Called when a player selects a gossip item in the gameobject's gossip menu. + virtual bool GossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) { return false; } + + // Called when a player selects a gossip with a code in the gameobject's gossip menu. + virtual bool GossipSelectCode(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/, char const* /*code*/) { return false; } + + // Called when a player accepts a quest from the gameobject. + virtual void QuestAccept(Player* /*player*/, Quest const* /*quest*/) { } + + // Called when a player completes a quest and is rewarded, opt is the selected item's index or 0 + virtual void QuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) { } + + // Called when the dialog status between a player and the gameobject is requested. virtual uint32 GetDialogStatus(Player* /*player*/) { return DIALOG_STATUS_SCRIPTED_NO_STATUS; } + virtual void Destroyed(Player* /*player*/, uint32 /*eventId*/) { } + virtual void Damaged(Player* /*player*/, uint32 /*eventId*/) { } + virtual uint32 GetData(uint32 /*id*/) const { return 0; } virtual void SetData64(uint32 /*id*/, uint64 /*value*/) { } virtual uint64 GetData64(uint32 /*id*/) const { return 0; } virtual void SetData(uint32 /*id*/, uint32 /*value*/) { } + virtual void OnGameEvent(bool /*start*/, uint16 /*eventId*/) { } - virtual void OnStateChanged(uint32 /*state*/, Unit* /*unit*/) { } + virtual void OnLootStateChanged(uint32 /*state*/, Unit* /*unit*/) { } + virtual void OnStateChanged(uint32 /*state*/) { } virtual void EventInform(uint32 /*eventId*/) { } virtual void SpellHit(Unit* /*unit*/, const SpellInfo* /*spellInfo*/) { } }; diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h index 73dc7afc2ec..d180b8d13d6 100644 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -273,13 +273,27 @@ class TC_GAME_API UnitAI static AISpellInfoType* AISpellInfo; static void FillAISpellInfo(); - virtual void sGossipHello(Player* /*player*/) { } - virtual void sGossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) { } - virtual void sGossipSelectCode(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/, char const* /*code*/) { } - virtual void sQuestAccept(Player* /*player*/, Quest const* /*quest*/) { } - virtual void sQuestSelect(Player* /*player*/, Quest const* /*quest*/) { } - virtual void sQuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) { } - virtual void sOnGameEvent(bool /*start*/, uint16 /*eventId*/) { } + // Called when a player opens a gossip dialog with the creature. + virtual bool GossipHello(Player* /*player*/) { return false; } + + // Called when a player selects a gossip item in the creature's gossip menu. + virtual bool GossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) { return false; } + + // Called when a player selects a gossip with a code in the creature's gossip menu. + virtual bool GossipSelectCode(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/, const char* /*code*/) { return false; } + + // Called when a player accepts a quest from the creature. + virtual void QuestAccept(Player* /*player*/, Quest const* /*quest*/) { } + + // Called when a player completes a quest and is rewarded, opt is the selected item's index or 0 + virtual void QuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) { } + + // Called when a game event starts or ends + virtual void OnGameEvent(bool /*start*/, uint16 /*eventId*/) { } + + // Called when the dialog status between a player and the creature is requested. + virtual uint32 GetDialogStatus(Player* /*player*/) { return DIALOG_STATUS_SCRIPTED_NO_STATUS; } + private: UnitAI(UnitAI const& right) = delete; diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 1d4c2150585..2dd122de1ee 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -808,24 +808,29 @@ void SmartAI::SetEvadeDisabled(bool disable) mEvadeDisabled = disable; } -void SmartAI::sGossipHello(Player* player) +bool SmartAI::GossipHello(Player* player) { GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_HELLO, player); + return false; } -void SmartAI::sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) +bool SmartAI::GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) { GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_SELECT, player, menuId, gossipListId); + return false; } -void SmartAI::sGossipSelectCode(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/, const char* /*code*/) { } +bool SmartAI::GossipSelectCode(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/, const char* /*code*/) +{ + return false; +} -void SmartAI::sQuestAccept(Player* player, Quest const* quest) +void SmartAI::QuestAccept(Player* player, Quest const* quest) { GetScript()->ProcessEventsFor(SMART_EVENT_ACCEPTED_QUEST, player, quest->GetQuestId()); } -void SmartAI::sQuestReward(Player* player, Quest const* quest, uint32 opt) +void SmartAI::QuestReward(Player* player, Quest const* quest, uint32 opt) { GetScript()->ProcessEventsFor(SMART_EVENT_REWARD_QUEST, player, quest->GetQuestId(), opt); } @@ -915,7 +920,7 @@ void SmartAI::SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker) GetScript()->SetScript9(e, entry); } -void SmartAI::sOnGameEvent(bool start, uint16 eventId) +void SmartAI::OnGameEvent(bool start, uint16 eventId) { GetScript()->ProcessEventsFor(start ? SMART_EVENT_GAME_EVENT_START : SMART_EVENT_GAME_EVENT_END, nullptr, eventId); } @@ -971,9 +976,10 @@ void SmartGameObjectAI::UpdateAI(uint32 diff) void SmartGameObjectAI::InitializeAI() { - GetScript()->OnInitialize(go); + GetScript()->OnInitialize(me); + // do not call respawn event if go is not spawned - if (go->isSpawned()) + if (me->isSpawned()) GetScript()->ProcessEventsFor(SMART_EVENT_RESPAWN); //Reset(); } @@ -990,41 +996,39 @@ void SmartGameObjectAI::Reset() bool SmartGameObjectAI::GossipHello(Player* player, bool reportUse) { TC_LOG_DEBUG("scripts.ai", "SmartGameObjectAI::GossipHello"); - GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_HELLO, player, uint32(reportUse), 0, false, nullptr, go); + GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_HELLO, player, uint32(reportUse), 0, false, nullptr, me); return false; } // Called when a player selects a gossip item in the gameobject's gossip menu. bool SmartGameObjectAI::GossipSelect(Player* player, uint32 sender, uint32 action) { - GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_SELECT, player, sender, action, false, nullptr, go); + GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_SELECT, player, sender, action, false, nullptr, me); return false; } // Called when a player selects a gossip with a code in the gameobject's gossip menu. -bool SmartGameObjectAI::GossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) +bool SmartGameObjectAI::GossipSelectCode(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/, const char* /*code*/) { return false; } // Called when a player accepts a quest from the gameobject. -bool SmartGameObjectAI::QuestAccept(Player* player, Quest const* quest) +void SmartGameObjectAI::QuestAccept(Player* player, Quest const* quest) { - GetScript()->ProcessEventsFor(SMART_EVENT_ACCEPTED_QUEST, player, quest->GetQuestId(), 0, false, nullptr, go); - return false; + GetScript()->ProcessEventsFor(SMART_EVENT_ACCEPTED_QUEST, player, quest->GetQuestId(), 0, false, nullptr, me); } // Called when a player selects a quest reward. -bool SmartGameObjectAI::QuestReward(Player* player, Quest const* quest, uint32 opt) +void SmartGameObjectAI::QuestReward(Player* player, Quest const* quest, uint32 opt) { - GetScript()->ProcessEventsFor(SMART_EVENT_REWARD_QUEST, player, quest->GetQuestId(), opt, false, nullptr, go); - return false; + GetScript()->ProcessEventsFor(SMART_EVENT_REWARD_QUEST, player, quest->GetQuestId(), opt, false, nullptr, me); } // Called when the gameobject is destroyed (destructible buildings only). void SmartGameObjectAI::Destroyed(Player* player, uint32 eventId) { - GetScript()->ProcessEventsFor(SMART_EVENT_DEATH, player, eventId, 0, false, nullptr, go); + GetScript()->ProcessEventsFor(SMART_EVENT_DEATH, player, eventId, 0, false, nullptr, me); } void SmartGameObjectAI::SetData(uint32 id, uint32 value) @@ -1044,9 +1048,9 @@ void SmartGameObjectAI::OnGameEvent(bool start, uint16 eventId) GetScript()->ProcessEventsFor(start ? SMART_EVENT_GAME_EVENT_START : SMART_EVENT_GAME_EVENT_END, nullptr, eventId); } -void SmartGameObjectAI::OnStateChanged(uint32 state, Unit* unit) +void SmartGameObjectAI::OnLootStateChanged(uint32 state, Unit* unit) { - GetScript()->ProcessEventsFor(SMART_EVENT_GO_STATE_CHANGED, unit, state); + GetScript()->ProcessEventsFor(SMART_EVENT_GO_LOOT_STATE_CHANGED, unit, state); } void SmartGameObjectAI::EventInform(uint32 eventId) diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h index cce8ffd57ad..1c65c9633b9 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.h +++ b/src/server/game/AI/SmartScripts/SmartAI.h @@ -176,13 +176,12 @@ class TC_GAME_API SmartAI : public CreatureAI void SetInvincibilityHpLevel(uint32 level) { mInvincibilityHpLevel = level; } - void sGossipHello(Player* player) override; - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override; - void sGossipSelectCode(Player* player, uint32 menuId, uint32 gossipListId, const char* code) override; - void sQuestAccept(Player* player, Quest const* quest) override; - //void sQuestSelect(Player* player, Quest const* quest) override; - void sQuestReward(Player* player, Quest const* quest, uint32 opt) override; - void sOnGameEvent(bool start, uint16 eventId) override; + bool GossipHello(Player* player) override; + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override; + bool GossipSelectCode(Player* player, uint32 menuId, uint32 gossipListId, const char* code) override; + void QuestAccept(Player* player, Quest const* quest) override; + void QuestReward(Player* player, Quest const* quest, uint32 opt) override; + void OnGameEvent(bool start, uint16 eventId) override; uint32 mEscortQuestID; @@ -257,15 +256,15 @@ class TC_GAME_API SmartGameObjectAI : public GameObjectAI static int Permissible(const GameObject* g); bool GossipHello(Player* player, bool reportUse) override; - bool GossipSelect(Player* player, uint32 sender, uint32 action) override; - bool GossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) override; - bool QuestAccept(Player* player, Quest const* quest) override; - bool QuestReward(Player* player, Quest const* quest, uint32 opt) override; + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override; + bool GossipSelectCode(Player* player, uint32 menuId, uint32 gossipListId, const char* code) override; + void QuestAccept(Player* player, Quest const* quest) override; + void QuestReward(Player* player, Quest const* quest, uint32 opt) override; void Destroyed(Player* player, uint32 eventId) override; void SetData(uint32 id, uint32 value) override; void SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker); void OnGameEvent(bool start, uint16 eventId) override; - void OnStateChanged(uint32 state, Unit* unit) override; + void OnLootStateChanged(uint32 state, Unit* unit) override; void EventInform(uint32 eventId) override; void SpellHit(Unit* unit, const SpellInfo* spellInfo) override; diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index abf80f95794..24c5dd6c646 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -2990,16 +2990,16 @@ void SmartScript::InstallTemplate(SmartScriptHolder const& e) if (!go) return; //store hostage as id1 - AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 1, 0, 0, 0, 0, 0, SMART_TARGET_CLOSEST_CREATURE, e.action.installTtemplate.param1, 10, 0, 0); + AddEvent(SMART_EVENT_GO_LOOT_STATE_CHANGED, 0, GO_ACTIVATED, 0, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 1, 0, 0, 0, 0, 0, SMART_TARGET_CLOSEST_CREATURE, e.action.installTtemplate.param1, 10, 0, 0); //store invoker as id2 - AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 2, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0); + AddEvent(SMART_EVENT_GO_LOOT_STATE_CHANGED, 0, GO_ACTIVATED, 0, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 2, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0); //signal hostage - AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, 0, SMART_ACTION_SET_DATA, 0, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 1, 0, 0, 0); + AddEvent(SMART_EVENT_GO_LOOT_STATE_CHANGED, 0, GO_ACTIVATED, 0, 0, 0, 0, SMART_ACTION_SET_DATA, 0, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 1, 0, 0, 0); //when hostage raeched end point, give credit to invoker if (e.action.installTtemplate.param2) AddEvent(SMART_EVENT_DATA_SET, 0, 0, 0, 0, 0, 0, SMART_ACTION_CALL_KILLEDMONSTER, e.action.installTtemplate.param1, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 2, 0, 0, 0); else - AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, 0, SMART_ACTION_CALL_KILLEDMONSTER, e.action.installTtemplate.param1, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 2, 0, 0, 0); + AddEvent(SMART_EVENT_GO_LOOT_STATE_CHANGED, 0, GO_ACTIVATED, 0, 0, 0, 0, SMART_ACTION_CALL_KILLEDMONSTER, e.action.installTtemplate.param1, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 2, 0, 0, 0); break; } case SMARTAI_TEMPLATE_BASIC: @@ -3839,9 +3839,9 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui ProcessAction(e, nullptr, var0); break; } - case SMART_EVENT_GO_STATE_CHANGED: + case SMART_EVENT_GO_LOOT_STATE_CHANGED: { - if (e.event.goStateChanged.state != var0) + if (e.event.goLootStateChanged.lootState != var0) return; ProcessAction(e, unit, var0, var1); break; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 42f0a4b4f2c..37e40a133bf 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -972,7 +972,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) } break; case SMART_EVENT_LINK: - case SMART_EVENT_GO_STATE_CHANGED: + case SMART_EVENT_GO_LOOT_STATE_CHANGED: case SMART_EVENT_GO_EVENT_INFORM: case SMART_EVENT_TIMED_EVENT_TRIGGERED: case SMART_EVENT_INSTANCE_PLAYER_ENTER: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 392cdc7cc22..efd361cfb15 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -181,7 +181,7 @@ enum SMART_EVENT SMART_EVENT_IS_BEHIND_TARGET = 67, // cooldownMin, CooldownMax SMART_EVENT_GAME_EVENT_START = 68, // game_event.Entry SMART_EVENT_GAME_EVENT_END = 69, // game_event.Entry - SMART_EVENT_GO_STATE_CHANGED = 70, // go state + SMART_EVENT_GO_LOOT_STATE_CHANGED = 70, // go LootState SMART_EVENT_GO_EVENT_INFORM = 71, // eventId SMART_EVENT_ACTION_DONE = 72, // eventId (SharedDefines.EventId) SMART_EVENT_ON_SPELLCLICK = 73, // clicker (unit) @@ -403,8 +403,8 @@ struct SmartEvent struct { - uint32 state; - } goStateChanged; + uint32 lootState; + } goLootStateChanged; struct { @@ -1496,7 +1496,7 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] = {SMART_EVENT_IS_BEHIND_TARGET, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_GAME_EVENT_START, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, {SMART_EVENT_GAME_EVENT_END, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, - {SMART_EVENT_GO_STATE_CHANGED, SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, + {SMART_EVENT_GO_LOOT_STATE_CHANGED, SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, {SMART_EVENT_GO_EVENT_INFORM, SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, {SMART_EVENT_ACTION_DONE, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_ON_SPELLCLICK, SMART_SCRIPT_TYPE_MASK_CREATURE }, diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index c266b351ab7..1f124d16ed1 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -833,8 +833,6 @@ void Creature::Update(uint32 diff) default: break; } - - sScriptMgr->OnCreatureUpdate(this, diff); } void Creature::Regenerate(Powers power) diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 1bc8383a51c..1a3fbe69bee 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -43,6 +43,7 @@ #include "ScriptMgr.h" #include "SpellMgr.h" #include "Transport.h" +#include "GossipDef.h" #include "World.h" #include <G3D/Quat.h> #include <sstream> @@ -888,7 +889,6 @@ void GameObject::Update(uint32 diff) break; } } - sScriptMgr->OnGameObjectUpdate(this, diff); } void GameObject::Refresh() @@ -1419,9 +1419,7 @@ void GameObject::Use(Unit* user) if (Player* playerUser = user->ToPlayer()) { - if (sScriptMgr->OnGossipHello(playerUser, this)) - return; - + playerUser->PlayerTalkClass->ClearMenus(); if (AI()->GossipHello(playerUser, false)) return; } @@ -2306,7 +2304,7 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* case GO_DESTRUCTIBLE_DAMAGED: { EventInform(m_goInfo->destructibleBuilding.DamagedEvent, eventInvoker); - sScriptMgr->OnGameObjectDamaged(this, eventInvoker); + AI()->Damaged(eventInvoker, m_goInfo->destructibleBuilding.DamagedEvent); RemoveFlag(GO_FLAG_DESTROYED); AddFlag(GO_FLAG_DAMAGED); @@ -2330,8 +2328,8 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* } case GO_DESTRUCTIBLE_DESTROYED: { - sScriptMgr->OnGameObjectDestroyed(this, eventInvoker); EventInform(m_goInfo->destructibleBuilding.DestroyedEvent, eventInvoker); + AI()->Destroyed(eventInvoker, m_goInfo->destructibleBuilding.DestroyedEvent); if (eventInvoker) if (Battleground* bg = eventInvoker->GetBattleground()) bg->DestroyGate(eventInvoker, this); @@ -2384,8 +2382,7 @@ void GameObject::SetLootState(LootState state, Unit* unit) else m_lootStateUnitGUID.Clear(); - AI()->OnStateChanged(state, unit); - sScriptMgr->OnGameObjectLootStateChanged(this, state, unit); + AI()->OnLootStateChanged(state, unit); if (GetGoType() == GAMEOBJECT_TYPE_DOOR) // only set collision for doors on SetGoState return; @@ -2404,7 +2401,8 @@ void GameObject::SetLootState(LootState state, Unit* unit) void GameObject::SetGoState(GOState state) { SetUpdateFieldValue(m_values.ModifyValue(&GameObject::m_gameObjectData).ModifyValue(&UF::GameObjectData::State), state); - sScriptMgr->OnGameObjectStateChanged(this, state); + if (AI()) + AI()->OnStateChanged(state); if (m_model && !IsTransport()) { if (!IsInWorld()) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c1ccb5efa2f..33a05b49c01 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15391,8 +15391,8 @@ void Player::AddQuestAndCheckCompletion(Quest const* quest, Object* questGiver) switch (questGiver->GetTypeId()) { case TYPEID_UNIT: - sScriptMgr->OnQuestAccept(this, questGiver->ToCreature(), quest); - questGiver->ToCreature()->AI()->sQuestAccept(this, quest); + PlayerTalkClass->ClearMenus(); + questGiver->ToCreature()->AI()->QuestAccept(this, quest); break; case TYPEID_ITEM: case TYPEID_CONTAINER: @@ -15419,7 +15419,7 @@ void Player::AddQuestAndCheckCompletion(Quest const* quest, Object* questGiver) break; } case TYPEID_GAMEOBJECT: - sScriptMgr->OnQuestAccept(this, questGiver->ToGameObject(), quest); + PlayerTalkClass->ClearMenus(); questGiver->ToGameObject()->AI()->QuestAccept(this, quest); break; default: @@ -16626,11 +16626,12 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver) QuestRelationBounds qr; QuestRelationBounds qir; + PlayerTalkClass->ClearMenus(); switch (questgiver->GetTypeId()) { case TYPEID_GAMEOBJECT: { - QuestGiverStatus questStatus = QuestGiverStatus(sScriptMgr->GetDialogStatus(this, questgiver->ToGameObject())); + QuestGiverStatus questStatus = QuestGiverStatus(questgiver->ToGameObject()->AI()->GetDialogStatus(this)); if (questStatus != DIALOG_STATUS_SCRIPTED_NO_STATUS) return questStatus; qr = sObjectMgr->GetGOQuestRelationBounds(questgiver->GetEntry()); @@ -16639,7 +16640,7 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver) } case TYPEID_UNIT: { - QuestGiverStatus questStatus = QuestGiverStatus(sScriptMgr->GetDialogStatus(this, questgiver->ToCreature())); + QuestGiverStatus questStatus = QuestGiverStatus(questgiver->ToCreature()->AI()->GetDialogStatus(this)); if (questStatus != DIALOG_STATUS_SCRIPTED_NO_STATUS) return questStatus; qr = sObjectMgr->GetCreatureQuestRelationBounds(questgiver->GetEntry()); diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp index 38d3c5115fc..2084cb43e2e 100644 --- a/src/server/game/Events/GameEventMgr.cpp +++ b/src/server/game/Events/GameEventMgr.cpp @@ -1652,7 +1652,7 @@ public: { for (auto const& p : creatureMap) if (p.second->IsInWorld() && p.second->IsAIEnabled) - p.second->AI()->sOnGameEvent(_activate, _eventId); + p.second->AI()->OnGameEvent(_activate, _eventId); } void Visit(std::unordered_map<ObjectGuid, GameObject*>& gameObjectMap) diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index 1cda9ba2f1c..7739f383e03 100644 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -183,13 +183,13 @@ void WorldSession::HandleGossipHelloOpcode(WorldPackets::NPC::Hello& packet) } } - if (!sScriptMgr->OnGossipHello(_player, unit)) + _player->PlayerTalkClass->ClearMenus(); + if (!unit->AI()->GossipHello(_player)) { // _player->TalkedToCreature(unit->GetEntry(), unit->GetGUID()); _player->PrepareGossipMenu(unit, unit->GetCreatureTemplate()->GossipMenuId, true); _player->SendPreparedGossip(unit); } - unit->AI()->sGossipHello(_player); } void WorldSession::HandleGossipSelectOptionOpcode(WorldPackets::NPC::GossipSelectOption& packet) @@ -248,14 +248,12 @@ void WorldSession::HandleGossipSelectOptionOpcode(WorldPackets::NPC::GossipSelec { if (unit) { - unit->AI()->sGossipSelectCode(_player, packet.GossipID, packet.GossipIndex, packet.PromotionCode.c_str()); - if (!sScriptMgr->OnGossipSelectCode(_player, unit, _player->PlayerTalkClass->GetGossipOptionSender(packet.GossipIndex), _player->PlayerTalkClass->GetGossipOptionAction(packet.GossipIndex), packet.PromotionCode.c_str())) + if (!unit->AI()->GossipSelectCode(_player, packet.GossipID, packet.GossipIndex, packet.PromotionCode.c_str())) _player->OnGossipSelect(unit, packet.GossipIndex, packet.GossipID); } else { - go->AI()->GossipSelectCode(_player, packet.GossipID, packet.GossipIndex, packet.PromotionCode.c_str()); - if (!sScriptMgr->OnGossipSelectCode(_player, go, _player->PlayerTalkClass->GetGossipOptionSender(packet.GossipIndex), _player->PlayerTalkClass->GetGossipOptionAction(packet.GossipIndex), packet.PromotionCode.c_str())) + if (!go->AI()->GossipSelectCode(_player, packet.GossipID, packet.GossipIndex, packet.PromotionCode.c_str())) _player->OnGossipSelect(go, packet.GossipIndex, packet.GossipID); } } @@ -263,14 +261,12 @@ void WorldSession::HandleGossipSelectOptionOpcode(WorldPackets::NPC::GossipSelec { if (unit) { - unit->AI()->sGossipSelect(_player, packet.GossipID, packet.GossipIndex); - if (!sScriptMgr->OnGossipSelect(_player, unit, _player->PlayerTalkClass->GetGossipOptionSender(packet.GossipIndex), _player->PlayerTalkClass->GetGossipOptionAction(packet.GossipIndex))) + if (!unit->AI()->GossipSelect(_player, packet.GossipID, packet.GossipIndex)) _player->OnGossipSelect(unit, packet.GossipIndex, packet.GossipID); } else { - go->AI()->GossipSelect(_player, packet.GossipID, packet.GossipIndex); - if (!sScriptMgr->OnGossipSelect(_player, go, _player->PlayerTalkClass->GetGossipOptionSender(packet.GossipIndex), _player->PlayerTalkClass->GetGossipOptionAction(packet.GossipIndex))) + if (!go->AI()->GossipSelect(_player, packet.GossipID, packet.GossipIndex)) _player->OnGossipSelect(go, packet.GossipIndex, packet.GossipID); } } diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index aeafff6d1cc..1819e5bea1d 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -90,13 +90,12 @@ void WorldSession::HandleQuestgiverHelloOpcode(WorldPackets::Quest::QuestGiverHe // Stop the npc if moving creature->StopMoving(); - if (sScriptMgr->OnGossipHello(_player, creature)) + _player->PlayerTalkClass->ClearMenus(); + if (creature->GetAI()->GossipHello(_player)) return; _player->PrepareGossipMenu(creature, creature->GetCreatureTemplate()->GossipMenuId, true); _player->SendPreparedGossip(creature); - - creature->GetAI()->sGossipHello(_player); } void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestGiverAcceptQuest& packet) @@ -363,8 +362,8 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest } } - if (creatureQGiver && !sScriptMgr->OnQuestReward(_player, creatureQGiver, quest, packet.ItemChoiceID)) - creatureQGiver->GetAI()->sQuestReward(_player, quest, packet.ItemChoiceID); + _player->PlayerTalkClass->ClearMenus(); + creatureQGiver->GetAI()->QuestReward(_player, quest, packet.ItemChoiceID); break; } case TYPEID_GAMEOBJECT: @@ -383,8 +382,8 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest } } - if (!sScriptMgr->OnQuestReward(_player, questGiver, quest, packet.ItemChoiceID)) - questGiver->AI()->QuestReward(_player, quest, packet.ItemChoiceID); + _player->PlayerTalkClass->ClearMenus(); + questGiver->AI()->QuestReward(_player, quest, packet.ItemChoiceID); break; } default: diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index fea767fa9a5..b70f38a8970 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -1686,78 +1686,6 @@ bool ScriptMgr::OnCastItemCombatSpell(Player* player, Unit* victim, SpellInfo co return tmpscript->OnCastItemCombatSpell(player, victim, spellInfo, item); } -bool ScriptMgr::OnGossipHello(Player* player, Creature* creature) -{ - ASSERT(player); - ASSERT(creature); - - GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false); - player->PlayerTalkClass->ClearMenus(); - return tmpscript->OnGossipHello(player, creature); -} - -bool ScriptMgr::OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) -{ - ASSERT(player); - ASSERT(creature); - - GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false); - return tmpscript->OnGossipSelect(player, creature, sender, action); -} - -bool ScriptMgr::OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, const char* code) -{ - ASSERT(player); - ASSERT(creature); - ASSERT(code); - - GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false); - return tmpscript->OnGossipSelectCode(player, creature, sender, action, code); -} - -bool ScriptMgr::OnQuestAccept(Player* player, Creature* creature, Quest const* quest) -{ - ASSERT(player); - ASSERT(creature); - ASSERT(quest); - - GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false); - player->PlayerTalkClass->ClearMenus(); - return tmpscript->OnQuestAccept(player, creature, quest); -} - -bool ScriptMgr::OnQuestSelect(Player* player, Creature* creature, Quest const* quest) -{ - ASSERT(player); - ASSERT(creature); - ASSERT(quest); - - GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false); - player->PlayerTalkClass->ClearMenus(); - return tmpscript->OnQuestSelect(player, creature, quest); -} - -bool ScriptMgr::OnQuestReward(Player* player, Creature* creature, Quest const* quest, uint32 opt) -{ - ASSERT(player); - ASSERT(creature); - ASSERT(quest); - - GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false); - player->PlayerTalkClass->ClearMenus(); - return tmpscript->OnQuestReward(player, creature, quest, opt); -} - -uint32 ScriptMgr::GetDialogStatus(Player* player, Creature* creature) -{ - ASSERT(player); - ASSERT(creature); - - GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, DIALOG_STATUS_SCRIPTED_NO_STATUS); - player->PlayerTalkClass->ClearMenus(); - return tmpscript->GetDialogStatus(player, creature); -} - bool ScriptMgr::CanSpawn(ObjectGuid::LowType spawnId, uint32 entry, CreatureTemplate const* actTemplate, CreatureData const* cData, Map const* map) { ASSERT(actTemplate); @@ -1793,115 +1721,6 @@ AreaTriggerAI* ScriptMgr::GetAreaTriggerAI(AreaTrigger* areatrigger) return tmpscript->GetAI(areatrigger); } -void ScriptMgr::OnCreatureUpdate(Creature* creature, uint32 diff) -{ - ASSERT(creature); - - GET_SCRIPT(CreatureScript, creature->GetScriptId(), tmpscript); - tmpscript->OnUpdate(creature, diff); -} - -bool ScriptMgr::OnGossipHello(Player* player, GameObject* go) -{ - ASSERT(player); - ASSERT(go); - - GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false); - player->PlayerTalkClass->ClearMenus(); - return tmpscript->OnGossipHello(player, go); -} - -bool ScriptMgr::OnGossipSelect(Player* player, GameObject* go, uint32 sender, uint32 action) -{ - ASSERT(player); - ASSERT(go); - - GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false); - return tmpscript->OnGossipSelect(player, go, sender, action); -} - -bool ScriptMgr::OnGossipSelectCode(Player* player, GameObject* go, uint32 sender, uint32 action, const char* code) -{ - ASSERT(player); - ASSERT(go); - ASSERT(code); - - GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false); - return tmpscript->OnGossipSelectCode(player, go, sender, action, code); -} - -bool ScriptMgr::OnQuestAccept(Player* player, GameObject* go, Quest const* quest) -{ - ASSERT(player); - ASSERT(go); - ASSERT(quest); - - GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false); - player->PlayerTalkClass->ClearMenus(); - return tmpscript->OnQuestAccept(player, go, quest); -} - -bool ScriptMgr::OnQuestReward(Player* player, GameObject* go, Quest const* quest, uint32 opt) -{ - ASSERT(player); - ASSERT(go); - ASSERT(quest); - - GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false); - player->PlayerTalkClass->ClearMenus(); - return tmpscript->OnQuestReward(player, go, quest, opt); -} - -uint32 ScriptMgr::GetDialogStatus(Player* player, GameObject* go) -{ - ASSERT(player); - ASSERT(go); - - GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, DIALOG_STATUS_SCRIPTED_NO_STATUS); - player->PlayerTalkClass->ClearMenus(); - return tmpscript->GetDialogStatus(player, go); -} - -void ScriptMgr::OnGameObjectDestroyed(GameObject* go, Player* player) -{ - ASSERT(go); - - GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript); - tmpscript->OnDestroyed(go, player); -} - -void ScriptMgr::OnGameObjectDamaged(GameObject* go, Player* player) -{ - ASSERT(go); - - GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript); - tmpscript->OnDamaged(go, player); -} - -void ScriptMgr::OnGameObjectLootStateChanged(GameObject* go, uint32 state, Unit* unit) -{ - ASSERT(go); - - GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript); - tmpscript->OnLootStateChanged(go, state, unit); -} - -void ScriptMgr::OnGameObjectStateChanged(GameObject* go, uint32 state) -{ - ASSERT(go); - - GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript); - tmpscript->OnGameObjectStateChanged(go, state); -} - -void ScriptMgr::OnGameObjectUpdate(GameObject* go, uint32 diff) -{ - ASSERT(go); - - GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript); - tmpscript->OnUpdate(go, diff); -} - bool ScriptMgr::OnAreaTrigger(Player* player, AreaTriggerEntry const* trigger, bool entered) { ASSERT(player); @@ -2585,22 +2404,12 @@ CreatureScript::CreatureScript(const char* name) ScriptRegistry<CreatureScript>::Instance()->AddScript(this); } -uint32 CreatureScript::GetDialogStatus(Player* /*player*/, Creature* /*creature*/) -{ - return DIALOG_STATUS_SCRIPTED_NO_STATUS; -} - GameObjectScript::GameObjectScript(const char* name) : ScriptObject(name) { ScriptRegistry<GameObjectScript>::Instance()->AddScript(this); } -uint32 GameObjectScript::GetDialogStatus(Player* /*player*/, GameObject* /*go*/) -{ - return DIALOG_STATUS_SCRIPTED_NO_STATUS; -} - AreaTriggerScript::AreaTriggerScript(const char* name) : ScriptObject(name) { diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 518cc5f4a70..60cd06d5007 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -413,7 +413,7 @@ class TC_GAME_API UnitScript : public ScriptObject virtual void ModifySpellDamageTaken(Unit* /*target*/, Unit* /*attacker*/, int32& /*damage*/) { } }; -class TC_GAME_API CreatureScript : public UnitScript, public UpdatableScript<Creature> +class TC_GAME_API CreatureScript : public UnitScript { protected: @@ -421,35 +421,14 @@ class TC_GAME_API CreatureScript : public UnitScript, public UpdatableScript<Cre public: - // Called when a player opens a gossip dialog with the creature. - virtual bool OnGossipHello(Player* /*player*/, Creature* /*creature*/) { return false; } - - // Called when a player selects a gossip item in the creature's gossip menu. - virtual bool OnGossipSelect(Player* /*player*/, Creature* /*creature*/, uint32 /*sender*/, uint32 /*action*/) { return false; } - - // Called when a player selects a gossip with a code in the creature's gossip menu. - virtual bool OnGossipSelectCode(Player* /*player*/, Creature* /*creature*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) { return false; } - - // Called when a player accepts a quest from the creature. - virtual bool OnQuestAccept(Player* /*player*/, Creature* /*creature*/, Quest const* /*quest*/) { return false; } - - // Called when a player selects a quest in the creature's quest menu. - virtual bool OnQuestSelect(Player* /*player*/, Creature* /*creature*/, Quest const* /*quest*/) { return false; } - - // Called when a player completes a quest and is rewarded, opt is the selected item's index or 0 - virtual bool OnQuestReward(Player* /*player*/, Creature* /*creature*/, Quest const* /*quest*/, uint32 /*opt*/) { return false; } - - // Called when the dialog status between a player and the creature is requested. - virtual uint32 GetDialogStatus(Player* /*player*/, Creature* /*creature*/); - // Called when the creature tries to spawn. Return false to block spawn and re-evaluate on next tick. virtual bool CanSpawn(ObjectGuid::LowType /*spawnId*/, uint32 /*entry*/, CreatureTemplate const* /*baseTemplate*/, CreatureTemplate const* /*actTemplate*/, CreatureData const* /*cData*/, Map const* /*map*/) const { return true; } // Called when a CreatureAI object is needed for the creature. - virtual CreatureAI* GetAI(Creature* /*creature*/) const { return NULL; } + virtual CreatureAI* GetAI(Creature* /*creature*/) const = 0; }; -class TC_GAME_API GameObjectScript : public ScriptObject, public UpdatableScript<GameObject> +class TC_GAME_API GameObjectScript : public ScriptObject { protected: @@ -457,38 +436,8 @@ class TC_GAME_API GameObjectScript : public ScriptObject, public UpdatableScript public: - // Called when a player opens a gossip dialog with the gameobject. - virtual bool OnGossipHello(Player* /*player*/, GameObject* /*go*/) { return false; } - - // Called when a player selects a gossip item in the gameobject's gossip menu. - virtual bool OnGossipSelect(Player* /*player*/, GameObject* /*go*/, uint32 /*sender*/, uint32 /*action*/) { return false; } - - // Called when a player selects a gossip with a code in the gameobject's gossip menu. - virtual bool OnGossipSelectCode(Player* /*player*/, GameObject* /*go*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) { return false; } - - // Called when a player accepts a quest from the gameobject. - virtual bool OnQuestAccept(Player* /*player*/, GameObject* /*go*/, Quest const* /*quest*/) { return false; } - - // Called when a player completes a quest and is rewarded, opt is the selected item's index or 0 - virtual bool OnQuestReward(Player* /*player*/, GameObject* /*go*/, Quest const* /*quest*/, uint32 /*opt*/) { return false; } - - // Called when the dialog status between a player and the gameobject is requested. - virtual uint32 GetDialogStatus(Player* /*player*/, GameObject* /*go*/); - - // Called when the game object is destroyed (destructible buildings only). - virtual void OnDestroyed(GameObject* /*go*/, Player* /*player*/) { } - - // Called when the game object is damaged (destructible buildings only). - virtual void OnDamaged(GameObject* /*go*/, Player* /*player*/) { } - - // Called when the game object loot state is changed. - virtual void OnLootStateChanged(GameObject* /*go*/, uint32 /*state*/, Unit* /*unit*/) { } - - // Called when the game object state is changed. - virtual void OnGameObjectStateChanged(GameObject* /*go*/, uint32 /*state*/) { } - // Called when a GameObjectAI object is needed for the gameobject. - virtual GameObjectAI* GetAI(GameObject* /*go*/) const { return NULL; } + virtual GameObjectAI* GetAI(GameObject* /*go*/) const = 0; }; class TC_GAME_API AreaTriggerScript : public ScriptObject @@ -1025,30 +974,11 @@ class TC_GAME_API ScriptMgr public: /* CreatureScript */ - bool OnGossipHello(Player* player, Creature* creature); - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action); - bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, const char* code); - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest); - bool OnQuestSelect(Player* player, Creature* creature, Quest const* quest); - bool OnQuestReward(Player* player, Creature* creature, Quest const* quest, uint32 opt); - uint32 GetDialogStatus(Player* player, Creature* creature); bool CanSpawn(ObjectGuid::LowType spawnId, uint32 entry, CreatureTemplate const* actTemplate, CreatureData const* cData, Map const* map); CreatureAI* GetCreatureAI(Creature* creature); - void OnCreatureUpdate(Creature* creature, uint32 diff); public: /* GameObjectScript */ - bool OnGossipHello(Player* player, GameObject* go); - bool OnGossipSelect(Player* player, GameObject* go, uint32 sender, uint32 action); - bool OnGossipSelectCode(Player* player, GameObject* go, uint32 sender, uint32 action, const char* code); - bool OnQuestAccept(Player* player, GameObject* go, Quest const* quest); - bool OnQuestReward(Player* player, GameObject* go, Quest const* quest, uint32 opt); - uint32 GetDialogStatus(Player* player, GameObject* go); - void OnGameObjectDestroyed(GameObject* go, Player* player); - void OnGameObjectDamaged(GameObject* go, Player* player); - void OnGameObjectLootStateChanged(GameObject* go, uint32 state, Unit* unit); - void OnGameObjectStateChanged(GameObject* go, uint32 state); - void OnGameObjectUpdate(GameObject* go, uint32 diff); GameObjectAI* GetGameObjectAI(GameObject* go); public: /* AreaTriggerScript */ diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 53e9c98b0db..f4f7befa2db 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1604,9 +1604,7 @@ void Spell::SendLoot(ObjectGuid guid, LootType loottype) return; } - if (sScriptMgr->OnGossipHello(player, gameObjTarget)) - return; - + player->PlayerTalkClass->ClearMenus(); if (gameObjTarget->AI()->GossipHello(player, false)) return; diff --git a/src/server/scripts/BrokenIsles/zone_orderhall_warrior.cpp b/src/server/scripts/BrokenIsles/zone_orderhall_warrior.cpp index 34fa7ae56a6..25bc457644e 100644 --- a/src/server/scripts/BrokenIsles/zone_orderhall_warrior.cpp +++ b/src/server/scripts/BrokenIsles/zone_orderhall_warrior.cpp @@ -164,7 +164,7 @@ struct npc_danica_the_reclaimer : public ScriptedAI } // Should be some other way to do this... - void sQuestAccept(Player* player, Quest const* /*quest*/) override + void QuestAccept(Player* player, Quest const* /*quest*/) override { TempSummon* summon = player->SummonCreature(NPC_DANICA_THE_RECLAIMER, 1059.613f, 7224.605f, 100.4608f, 0.03462749f, TEMPSUMMON_MANUAL_DESPAWN, 0, true); if (!summon) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp index b0c7e149bd3..3851a74d263 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp @@ -16,6 +16,7 @@ */ #include "ScriptMgr.h" +#include "GameObjectAI.h" #include "blackrock_depths.h" #include "CreatureAIImpl.h" #include "GameObject.h" @@ -31,25 +32,35 @@ //go_shadowforge_brazier class go_shadowforge_brazier : public GameObjectScript { -public: - go_shadowforge_brazier() : GameObjectScript("go_shadowforge_brazier") { } + public: + go_shadowforge_brazier() : GameObjectScript("go_shadowforge_brazier") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - if (InstanceScript* instance = go->GetInstanceScript()) + struct go_shadowforge_brazierAI : public GameObjectAI { - if (instance->GetData(TYPE_LYCEUM) == IN_PROGRESS) - instance->SetData(TYPE_LYCEUM, DONE); - else - instance->SetData(TYPE_LYCEUM, IN_PROGRESS); - // If used brazier open linked doors (North or South) - if (go->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_N)) - instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_N), true); - else if (go->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_S)) - instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_S), true); + go_shadowforge_brazierAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + if (instance->GetData(TYPE_LYCEUM) == IN_PROGRESS) + instance->SetData(TYPE_LYCEUM, DONE); + else + instance->SetData(TYPE_LYCEUM, IN_PROGRESS); + // If used brazier open linked doors (North or South) + if (me->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_N)) + instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_N), true); + else if (me->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_S)) + instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_S), true); + + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetBlackrockDepthsAI<go_shadowforge_brazierAI>(go); } - return false; - } }; // npc_grimstone @@ -434,45 +445,57 @@ enum Lokhtos class npc_lokhtos_darkbargainer : public CreatureScript { -public: - npc_lokhtos_darkbargainer() : CreatureScript("npc_lokhtos_darkbargainer") { } + public: + npc_lokhtos_darkbargainer() : CreatureScript("npc_lokhtos_darkbargainer") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF + 1) + struct npc_lokhtos_darkbargainerAI : public ScriptedAI { - CloseGossipMenuFor(player); - player->CastSpell(player, SPELL_CREATE_THORIUM_BROTHERHOOD_CONTRACT_DND, false); - } - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); + npc_lokhtos_darkbargainerAI(Creature* creature) : ScriptedAI(creature) { } - return true; - } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + player->CastSpell(player, SPELL_CREATE_THORIUM_BROTHERHOOD_CONTRACT_DND, false); + } + if (action == GOSSIP_ACTION_TRADE) + player->GetSession()->SendListInventory(me->GetGUID()); - if (creature->IsVendor() && player->GetReputationRank(59) >= REP_FRIENDLY) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_ITEM_SHOW_ACCESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + return true; + } - if (player->GetQuestRewardStatus(QUEST_A_BINDING_CONTRACT) != 1 && - !player->HasItemCount(ITEM_THRORIUM_BROTHERHOOD_CONTRACT, 1, true) && - player->HasItemCount(ITEM_SULFURON_INGOT)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_GET_CONTRACT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - } + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - if (player->GetReputationRank(59) < REP_FRIENDLY) - SendGossipMenuFor(player, 3673, creature->GetGUID()); - else - SendGossipMenuFor(player, 3677, creature->GetGUID()); + if (me->IsVendor() && player->GetReputationRank(59) >= REP_FRIENDLY) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_ITEM_SHOW_ACCESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - return true; - } + if (!player->GetQuestRewardStatus(QUEST_A_BINDING_CONTRACT) && + !player->HasItemCount(ITEM_THRORIUM_BROTHERHOOD_CONTRACT, 1, true) && + player->HasItemCount(ITEM_SULFURON_INGOT)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_GET_CONTRACT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + } + + if (player->GetReputationRank(59) < REP_FRIENDLY) + SendGossipMenuFor(player, 3673, me->GetGUID()); + else + SendGossipMenuFor(player, 3677, me->GetGUID()); + + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_lokhtos_darkbargainerAI(creature); + } }; // npc_rocknot @@ -488,41 +511,6 @@ class npc_rocknot : public CreatureScript public: npc_rocknot() : CreatureScript("npc_rocknot") { } - bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*item*/) override - { - InstanceScript* instance = creature->GetInstanceScript(); - if (!instance) - return true; - - if (instance->GetData(TYPE_BAR) == DONE || instance->GetData(TYPE_BAR) == SPECIAL) - return true; - - if (quest->GetQuestId() == QUEST_ALE) - { - if (instance->GetData(TYPE_BAR) != IN_PROGRESS) - instance->SetData(TYPE_BAR, IN_PROGRESS); - - instance->SetData(TYPE_BAR, SPECIAL); - - //keep track of amount in instance script, returns SPECIAL if amount ok and event in progress - if (instance->GetData(TYPE_BAR) == SPECIAL) - { - creature->AI()->Talk(SAY_GOT_BEER); - creature->CastSpell(creature, SPELL_DRUNKEN_RAGE, false); - - if (npc_escortAI* escortAI = CAST_AI(npc_rocknot::npc_rocknotAI, creature->AI())) - escortAI->Start(false, false); - } - } - - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetBlackrockDepthsAI<npc_rocknotAI>(creature); - } - struct npc_rocknotAI : public npc_escortAI { npc_rocknotAI(Creature* creature) : npc_escortAI(creature) @@ -612,7 +600,35 @@ public: npc_escortAI::UpdateAI(diff); } + + void QuestReward(Player* /*player*/, Quest const* quest, uint32 /*item*/) override + { + if (instance->GetData(TYPE_BAR) == DONE || instance->GetData(TYPE_BAR) == SPECIAL) + return; + + if (quest->GetQuestId() == QUEST_ALE) + { + if (instance->GetData(TYPE_BAR) != IN_PROGRESS) + instance->SetData(TYPE_BAR, IN_PROGRESS); + + instance->SetData(TYPE_BAR, SPECIAL); + + //keep track of amount in instance script, returns SPECIAL if amount ok and event in progress + if (instance->GetData(TYPE_BAR) == SPECIAL) + { + Talk(SAY_GOT_BEER); + DoCastSelf(SPELL_DRUNKEN_RAGE, false); + + Start(false, false); + } + } + } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetBlackrockDepthsAI<npc_rocknotAI>(creature); + } }; void AddSC_blackrock_depths() diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp index af91790fb12..923b771b04b 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp @@ -125,10 +125,10 @@ public: { boss_coren_direbrewAI(Creature* creature) : BossAI(creature, DATA_COREN) { } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId != GOSSIP_ID) - return; + return false; if (gossipListId == GOSSIP_OPTION_FIGHT) { @@ -137,6 +137,8 @@ public: } else if (gossipListId == GOSSIP_OPTION_APOLOGIZE) CloseGossipMenuFor(player); + + return false; } void Reset() override @@ -431,16 +433,16 @@ public: void Reset() override { - go->SetLootState(GO_READY); + me->SetLootState(GO_READY); _scheduler .Schedule(Seconds(1), [this](TaskContext /*context*/) { - go->UseDoorOrButton(8); - go->CastSpell((Unit*)nullptr, SPELL_MOLE_MACHINE_EMERGE, true); + me->UseDoorOrButton(8); + me->CastSpell((Unit*)nullptr, SPELL_MOLE_MACHINE_EMERGE, true); }) .Schedule(Seconds(4), [this](TaskContext /*context*/) { - if (GameObject* trap = go->FindNearestGameObject(GO_MOLE_MACHINE_TRAP, 3.0f)) + if (GameObject* trap = me->FindNearestGameObject(GO_MOLE_MACHINE_TRAP, 3.0f)) { trap->SetLootState(GO_ACTIVATED); trap->UseDoorOrButton(); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp index afb97ec93d1..d5af35b77b0 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp @@ -51,49 +51,59 @@ enum Phases class boss_gloomrel : public CreatureScript { -public: - boss_gloomrel() : CreatureScript("boss_gloomrel") { } + public: + boss_gloomrel() : CreatureScript("boss_gloomrel") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + struct boss_gloomrelAI : public ScriptedAI { - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); - SendGossipMenuFor(player, 2606, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+11: - CloseGossipMenuFor(player); - player->CastSpell(player, SPELL_LEARN_SMELT, false); - break; - case GOSSIP_ACTION_INFO_DEF+2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 22); - SendGossipMenuFor(player, 2604, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+22: - CloseGossipMenuFor(player); - if (InstanceScript* instance = creature->GetInstanceScript()) + boss_gloomrelAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) { - //are 5 minutes expected? go template may have data to despawn when used at quest - instance->DoRespawnGameObject(instance->GetGuidData(DATA_GO_CHALICE), MINUTE*5); + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); + SendGossipMenuFor(player, 2606, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 11: + CloseGossipMenuFor(player); + player->CastSpell(player, SPELL_LEARN_SMELT, false); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 22); + SendGossipMenuFor(player, 2604, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 22: + CloseGossipMenuFor(player); + //are 5 minutes expected? go template may have data to despawn when used at quest + instance->DoRespawnGameObject(instance->GetGuidData(DATA_GO_CHALICE), MINUTE * 5); + break; } - break; - } - return true; - } + return true; + } + + bool GossipHello(Player* player) override + { + if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 1 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN && !player->HasSpell(SPELL_SMELT_DARK_IRON)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 1 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN && !player->HasSpell(SPELL_SMELT_DARK_IRON)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 0 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TRIBUTE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 0 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TRIBUTE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } + }; - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } + CreatureAI* GetAI(Creature* creature) const override + { + return GetBlackrockDepthsAI<boss_gloomrelAI>(creature); + } }; enum DoomrelSpells @@ -122,37 +132,6 @@ class boss_doomrel : public CreatureScript public: boss_doomrel() : CreatureScript("boss_doomrel") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SELECT_DOOMREL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - SendGossipMenuFor(player, 2605, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - CloseGossipMenuFor(player); - //start event here - creature->SetFaction(FACTION_HOSTILE); - creature->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC); - creature->AI()->AttackStart(player); - InstanceScript* instance = creature->GetInstanceScript(); - if (instance) - instance->SetGuidData(DATA_EVENSTARTER, player->GetGUID()); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_CHALLENGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, 2601, creature->GetGUID()); - - return true; - } - struct boss_doomrelAI : public ScriptedAI { boss_doomrelAI(Creature* creature) : ScriptedAI(creature) @@ -246,6 +225,38 @@ class boss_doomrel : public CreatureScript 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, GOSSIP_ICON_CHAT, GOSSIP_SELECT_DOOMREL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, 2605, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + CloseGossipMenuFor(player); + //start event here + me->SetFaction(FACTION_HOSTILE); + me->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC); + me->AI()->AttackStart(player); + + _instance->SetGuidData(DATA_EVENSTARTER, player->GetGUID()); + break; + } + return true; + } + + bool GossipHello(Player* player) override + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_CHALLENGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, 2601, me->GetGUID()); + + return true; + } + private: InstanceScript* _instance; EventMap _events; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h index 678530b149f..8145578f43a 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h @@ -82,10 +82,10 @@ enum BWLMisc DATA_EGG_EVENT }; -template<typename AI> -inline AI* GetBlackwingLairAI(Creature* creature) +template <class AI, class T> +inline AI* GetBlackwingLairAI(T* obj) { - return GetInstanceAI<AI>(creature, BWLScriptName); + return GetInstanceAI<AI>(obj, BWLScriptName); } #endif diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index 5af9bf91aaa..e5c2d97a9d4 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -373,7 +373,7 @@ public: } } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_ID && gossipListId == GOSSIP_OPTION_ID) { @@ -381,6 +381,7 @@ public: Talk(SAY_GAMESBEGIN_1); BeginEvent(player); } + return false; } private: diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp index d05cf64ab74..8b175f0ac69 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -18,6 +18,7 @@ #include "ScriptMgr.h" #include "blackwing_lair.h" #include "GameObject.h" +#include "GameObjectAI.h" #include "InstanceScript.h" #include "Player.h" #include "ScriptedCreature.h" @@ -175,20 +176,33 @@ public: class go_orb_of_domination : public GameObjectScript { -public: - go_orb_of_domination() : GameObjectScript("go_orb_of_domination") { } + public: + go_orb_of_domination() : GameObjectScript("go_orb_of_domination") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (InstanceScript* instance = go->GetInstanceScript()) - if (instance->GetData(DATA_EGG_EVENT) != DONE) - if (Creature* razorgore = instance->GetCreature(DATA_RAZORGORE_THE_UNTAMED)) + struct go_orb_of_dominationAI : public GameObjectAI + { + go_orb_of_dominationAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (instance->GetData(DATA_EGG_EVENT) != DONE) { - razorgore->Attack(player, true); - player->CastSpell(razorgore, SPELL_MINDCONTROL); + if (Creature* razorgore = instance->GetCreature(DATA_RAZORGORE_THE_UNTAMED)) + { + razorgore->Attack(player, true); + player->CastSpell(razorgore, SPELL_MINDCONTROL); + } } - return true; - } + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetBlackwingLairAI<go_orb_of_dominationAI>(go); + } }; class spell_egg_event : public SpellScriptLoader diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp index 43c0d05805b..184b64a9cde 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp @@ -222,13 +222,14 @@ public: DoMeleeAttackIfReady(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_ID && gossipListId == 0) { CloseGossipMenuFor(player); BeginSpeech(player); } + return false; } private: diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp index 6d03826d7b6..cd1aeef7b97 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp @@ -196,13 +196,14 @@ class boss_majordomo : public CreatureScript } } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == MENU_OPTION_YOU_CHALLENGED_US && gossipListId == OPTION_ID_YOU_CHALLENGED_US) { CloseGossipMenuFor(player); DoAction(ACTION_START_RAGNAROS); } + return false; } }; diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp index a7998726e1e..db48554625c 100644 --- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp +++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp @@ -124,7 +124,7 @@ public: } } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { if (gossipListId == 0) { @@ -135,6 +135,7 @@ public: player->PlayerTalkClass->SendCloseGossip(); } + return false; } void NextStep(uint32 uiTimerStep, bool bNextStep = true, uint8 uiPhaseStep = 0) diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp index c5366285de7..4303a856e68 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp @@ -22,6 +22,7 @@ #include "MotionMaster.h" #include "ObjectAccessor.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "SpellScript.h" #include "SpellAuraEffects.h" @@ -417,25 +418,36 @@ class spell_rain_of_bones : public SpellScriptLoader class go_blackened_urn : public GameObjectScript { -public: - go_blackened_urn() : GameObjectScript("go_blackened_urn") { } + public: + go_blackened_urn() : GameObjectScript("go_blackened_urn") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - if (go->HasFlag(GO_FLAG_IN_USE)) - return false; + struct go_blackened_urnAI : GameObjectAI + { + go_blackened_urnAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + if (me->HasFlag(GO_FLAG_IN_USE)) + return false; - InstanceScript* instance = go->GetInstanceScript(); - if (!instance || instance->GetBossState(DATA_NIGHTBANE) == DONE || instance->GetBossState(DATA_NIGHTBANE) == IN_PROGRESS) - return false; + if (instance->GetBossState(DATA_NIGHTBANE) == DONE || instance->GetBossState(DATA_NIGHTBANE) == IN_PROGRESS) + return false; - if (Creature* nightbane = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_NIGHTBANE))) + if (Creature* nightbane = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_NIGHTBANE))) + { + me->AddFlag(GO_FLAG_IN_USE); + nightbane->AI()->DoAction(ACTION_SUMMON); + } + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override { - go->AddFlag(GO_FLAG_IN_USE); - nightbane->AI()->DoAction(ACTION_SUMMON); + return GetKarazhanAI<go_blackened_urnAI>(go); } - return false; - } }; void AddSC_boss_nightbane() diff --git a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp index bfc74a71127..28bdb8e9056 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp @@ -820,8 +820,7 @@ class npc_grandmother : public CreatureScript { npc_grandmotherAI(Creature* creature) : ScriptedAI(creature) { } - - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == OPTION_WHAT_PHAT_LEWTS_YOU_HAVE && gossipListId == 0) { @@ -832,6 +831,7 @@ class npc_grandmother : public CreatureScript me->DespawnOrUnsummon(); } + return false; } }; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp index 33d53ca61f9..002010f70f1 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp @@ -335,46 +335,43 @@ public: } } } - }; - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - npc_barnesAI* pBarnesAI = ENSURE_AI(npc_barnes::npc_barnesAI, creature->AI()); - switch (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, OZ_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, 8971, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - CloseGossipMenuFor(player); - pBarnesAI->StartEvent(); - break; - case GOSSIP_ACTION_INFO_DEF+3: - CloseGossipMenuFor(player); - pBarnesAI->m_uiEventId = EVENT_OZ; - TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_OZ", player->GetGUID().ToString().c_str()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - CloseGossipMenuFor(player); - pBarnesAI->m_uiEventId = EVENT_HOOD; - TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_HOOD", player->GetGUID().ToString().c_str()); - break; - case GOSSIP_ACTION_INFO_DEF+5: - CloseGossipMenuFor(player); - pBarnesAI->m_uiEventId = EVENT_RAJ; - TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_RAJ", player->GetGUID().ToString().c_str()); - break; - } + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); - return true; - } + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, OZ_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, 8971, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + CloseGossipMenuFor(player); + StartEvent(); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + CloseGossipMenuFor(player); + m_uiEventId = EVENT_OZ; + TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_OZ", player->GetGUID().ToString().c_str()); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + CloseGossipMenuFor(player); + m_uiEventId = EVENT_HOOD; + TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_HOOD", player->GetGUID().ToString().c_str()); + break; + case GOSSIP_ACTION_INFO_DEF + 5: + CloseGossipMenuFor(player); + m_uiEventId = EVENT_RAJ; + TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_RAJ", player->GetGUID().ToString().c_str()); + break; + } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (InstanceScript* instance = creature->GetInstanceScript()) + return true; + } + + bool GossipHello(Player* player) override { // Check for death of Moroes and if opera event is not done already if (instance->GetBossState(DATA_MOROES) == DONE && instance->GetBossState(DATA_OPERA_PERFORMANCE) != DONE) @@ -388,21 +385,18 @@ public: AddGossipItemFor(player, GOSSIP_ICON_DOT, OZ_GM_GOSSIP3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); } - if (npc_barnesAI* pBarnesAI = CAST_AI(npc_barnes::npc_barnesAI, creature->AI())) - { - if (!pBarnesAI->RaidWiped) - SendGossipMenuFor(player, 8970, creature->GetGUID()); - else - SendGossipMenuFor(player, 8975, creature->GetGUID()); + if (!RaidWiped) + SendGossipMenuFor(player, 8970, me->GetGUID()); + else + SendGossipMenuFor(player, 8975, me->GetGUID()); - return true; - } + return true; } - } - SendGossipMenuFor(player, 8978, creature->GetGUID()); - return true; - } + SendGossipMenuFor(player, 8978, me->GetGUID()); + return true; + } + }; CreatureAI* GetAI(Creature* creature) const override { diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h index 4ee7756b65e..a25d09e5ba4 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h @@ -112,10 +112,10 @@ enum KZMisc OPTIONAL_BOSS_REQUIRED_DEATH_COUNT = 50 }; -template<typename AI> -inline AI* GetKarazhanAI(Creature* creature) +template <class AI, class T> +inline AI* GetKarazhanAI(T* obj) { - return GetInstanceAI<AI>(creature, KZScriptName); + return GetInstanceAI<AI>(obj, KZScriptName); } #endif diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp index faff214f9fa..98494d2703c 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp @@ -67,51 +67,6 @@ class npc_kalecgos : public CreatureScript public: npc_kalecgos() : CreatureScript("npc_kalecgos") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, 12500, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - SendGossipMenuFor(player, 12502, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - SendGossipMenuFor(player, 12606, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - SendGossipMenuFor(player, 12607, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - SendGossipMenuFor(player, 12608, creature->GetGUID()); - break; - } - - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, 12498, creature->GetGUID()); - - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_kalecgosAI(creature); - } - struct npc_kalecgosAI : public ScriptedAI { npc_kalecgosAI(Creature* creature) : ScriptedAI(creature) { } @@ -152,9 +107,55 @@ public: } } + 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: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, 12500, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, 12502, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + SendGossipMenuFor(player, 12606, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + SendGossipMenuFor(player, 12607, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + SendGossipMenuFor(player, 12608, me->GetGUID()); + break; + } + + return true; + } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, 12498, me->GetGUID()); + + return true; + } + private: EventMap events; }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_kalecgosAI(creature); + } }; void AddSC_magisters_terrace() diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 89d8c159194..d7e50807867 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -24,6 +24,7 @@ #include "MoveSplineInit.h" #include "ObjectAccessor.h" #include "PassiveAI.h" +#include "GameObjectAI.h" #include "Player.h" #include "ScriptedEscortAI.h" #include "ScriptedGossip.h" @@ -322,22 +323,31 @@ public: class go_acherus_soul_prison : public GameObjectScript { -public: - go_acherus_soul_prison() : GameObjectScript("go_acherus_soul_prison") { } + public: + go_acherus_soul_prison() : GameObjectScript("go_acherus_soul_prison") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (Creature* anchor = go->FindNearestCreature(29521, 15)) + struct go_acherus_soul_prisonAI : public GameObjectAI { - ObjectGuid prisonerGUID = anchor->AI()->GetGUID(); - if (!prisonerGUID.IsEmpty()) - if (Creature* prisoner = ObjectAccessor::GetCreature(*player, prisonerGUID)) - ENSURE_AI(npc_unworthy_initiate::npc_unworthy_initiateAI, prisoner->AI())->EventStart(anchor, player); - } + go_acherus_soul_prisonAI(GameObject* go) : GameObjectAI(go) { } - return false; - } + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (Creature* anchor = me->FindNearestCreature(29521, 15)) + { + ObjectGuid prisonerGUID = anchor->AI()->GetGUID(); + if (!prisonerGUID.IsEmpty()) + if (Creature* prisoner = ObjectAccessor::GetCreature(*player, prisonerGUID)) + ENSURE_AI(npc_unworthy_initiate::npc_unworthy_initiateAI, prisoner->AI())->EventStart(anchor, player); + } + + return false; + } + }; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_acherus_soul_prisonAI(go); + } }; /*###### @@ -483,47 +493,6 @@ class npc_death_knight_initiate : public CreatureScript public: npc_death_knight_initiate() : CreatureScript("npc_death_knight_initiate") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF) - { - CloseGossipMenuFor(player); - - if (player->IsInCombat() || creature->IsInCombat()) - return true; - - if (npc_death_knight_initiateAI* pInitiateAI = CAST_AI(npc_death_knight_initiate::npc_death_knight_initiateAI, creature->AI())) - { - if (pInitiateAI->m_bIsDuelInProgress) - return true; - } - - creature->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC); - creature->RemoveUnitFlag(UNIT_FLAG_UNK_15); - - player->CastSpell(creature, SPELL_DUEL, false); - player->CastSpell(player, SPELL_DUEL_FLAG, true); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_DEATH_CHALLENGE) == QUEST_STATUS_INCOMPLETE && creature->IsFullHealth()) - { - if (player->HealthBelowPct(10)) - return true; - - if (player->IsInCombat() || creature->IsInCombat()) - return true; - - AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(creature), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - } - return true; - } - struct npc_death_knight_initiateAI : public CombatAI { npc_death_knight_initiateAI(Creature* creature) : CombatAI(creature) @@ -626,6 +595,45 @@ public: CombatAI::UpdateAI(uiDiff); } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF) + { + CloseGossipMenuFor(player); + + if (player->IsInCombat() || me->IsInCombat()) + return true; + + if (m_bIsDuelInProgress) + return true; + + me->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC); + me->RemoveUnitFlag(UNIT_FLAG_UNK_15); + + player->CastSpell(me, SPELL_DUEL, false); + player->CastSpell(player, SPELL_DUEL_FLAG, true); + } + return true; + } + + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(QUEST_DEATH_CHALLENGE) == QUEST_STATUS_INCOMPLETE && me->IsFullHealth()) + { + if (player->HealthBelowPct(10)) + return true; + + if (player->IsInCombat() || me->IsInCombat()) + return true; + + AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(me), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + } + return true; + } }; CreatureAI* GetAI(Creature* creature) const override @@ -759,13 +767,14 @@ public: { npc_salanar_the_horsemanAI(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_SALANAR_MENU && gossipListId == GOSSIP_SALANAR_OPTION) { player->CastSpell(player, SPELL_REALM_OF_SHADOWS, true); player->PlayerTalkClass->SendCloseGossip(); } + return false; } void SpellHit(Unit* caster, const SpellInfo* spell) override diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp index 2733669aa9d..ba35f642194 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp @@ -201,18 +201,6 @@ class npc_koltira_deathweaver : public CreatureScript public: npc_koltira_deathweaver() : CreatureScript("npc_koltira_deathweaver") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_BREAKOUT) - { - creature->SetStandState(UNIT_STAND_STATE_STAND); - - if (npc_escortAI* escortAI = CAST_AI(npc_koltira_deathweaver::npc_koltira_deathweaverAI, creature->AI())) - escortAI->Start(false, false, player->GetGUID()); - } - return true; - } - struct npc_koltira_deathweaverAI : public npc_escortAI { npc_koltira_deathweaverAI(Creature* creature) : npc_escortAI(creature) @@ -356,6 +344,15 @@ public: } } + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_BREAKOUT) + { + me->SetStandState(UNIT_STAND_STATE_STAND); + Start(false, false, player->GetGUID()); + } + } + private: uint8 wave; uint32 waveTimer; diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp index 97c0296df30..255e709ae90 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp @@ -274,38 +274,6 @@ class npc_highlord_darion_mograine : public CreatureScript public: npc_highlord_darion_mograine() : CreatureScript("npc_highlord_darion_mograine") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - CloseGossipMenuFor(player); - ENSURE_AI(npc_highlord_darion_mograine::npc_highlord_darion_mograineAI, creature->AI())->uiStep = 1; - ENSURE_AI(npc_highlord_darion_mograine::npc_highlord_darion_mograineAI, creature->AI())->Start(true, false, player->GetGUID()); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(12801) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, 0, "I am ready.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_highlord_darion_mograineAI(creature); - } - struct npc_highlord_darion_mograineAI : public npc_escortAI { npc_highlord_darion_mograineAI(Creature* creature) : npc_escortAI(creature) @@ -1640,8 +1608,40 @@ public: temp->KillSelf(); } } + + 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); + uiStep = 1; + Start(true, false, player->GetGUID()); + break; + } + return true; + } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (player->GetQuestStatus(12801) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, 0, "I am ready.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + + return true; + } }; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_highlord_darion_mograineAI(creature); + } }; /*###### diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp index 338b93d96e1..d27c334a0de 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -23,6 +23,7 @@ SDCategory: Scarlet Monastery EndScriptData */ #include "ScriptMgr.h" +#include "GameObjectAI.h" #include "GameObject.h" #include "Group.h" #include "InstanceScript.h" @@ -880,32 +881,41 @@ enum LooselyTurnedSoil class go_loosely_turned_soil : public GameObjectScript { -public: - go_loosely_turned_soil() : GameObjectScript("go_loosely_turned_soil") { } + public: + go_loosely_turned_soil() : GameObjectScript("go_loosely_turned_soil") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (InstanceScript* instance = player->GetInstanceScript()) - if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS || player->GetQuestStatus(QUEST_CALL_THE_HEADLESS_HORSEMAN) != QUEST_STATUS_COMPLETE) - return true; + struct go_loosely_turned_soilAI : public GameObjectAI + { + go_loosely_turned_soilAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - return false; - } + InstanceScript* instance; + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS || player->GetQuestStatus(QUEST_CALL_THE_HEADLESS_HORSEMAN) != QUEST_STATUS_COMPLETE) + return true; - bool OnQuestReward(Player* player, GameObject* go, Quest const* /*quest*/, uint32 /*opt*/) override - { - if (InstanceScript* instance = go->GetInstanceScript()) - if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS) return false; + } - player->AreaExploredOrEventHappens(11405); - if (Creature* horseman = go->SummonCreature(HH_MOUNTED, FlightPoint[20], TEMPSUMMON_MANUAL_DESPAWN, 0)) + void QuestReward(Player* player, Quest const* /*quest*/, uint32 /*opt*/) override + { + if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS) + return; + + player->AreaExploredOrEventHappens(11405); + if (Creature* horseman = me->SummonCreature(HH_MOUNTED, FlightPoint[20], TEMPSUMMON_MANUAL_DESPAWN, 0)) + { + ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->PlayerGUID = player->GetGUID(); + ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->FlyMode(); + } + } + }; + + GameObjectAI* GetAI(GameObject* go) const override { - ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->PlayerGUID = player->GetGUID(); - ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->FlyMode(); + return GetScarletMonasteryAI<go_loosely_turned_soilAI>(go); } - return true; - } }; void npc_head::npc_headAI::Disappear() diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h b/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h index 39fac73d489..c1ba06d446b 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h @@ -62,10 +62,10 @@ enum SMGameObjectIds GO_PUMPKIN_SHRINE = 186267 }; -template<typename AI> -inline AI* GetScarletMonasteryAI(Creature* creature) +template<class AI, class T> +inline AI* GetScarletMonasteryAI(T* obj) { - return GetInstanceAI<AI>(creature, SMScriptName); + return GetInstanceAI<AI>(obj, SMScriptName); } #endif // SCARLET_M_ diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp index ba0a5b7b4e2..db0b4fee60c 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp @@ -16,6 +16,7 @@ */ #include "ScriptMgr.h" +#include "GameObjectAI.h" #include "GameObject.h" #include "InstanceScript.h" #include "MotionMaster.h" @@ -283,12 +284,22 @@ class go_brazier_of_the_herald : public GameObjectScript public: go_brazier_of_the_herald() : GameObjectScript("go_brazier_of_the_herald") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_brazier_of_the_heraldAI : public GameObjectAI { - go->UseDoorOrButton(); - go->PlayDirectSound(SOUND_SCREECH, 0); - player->SummonCreature(NPC_KIRTONOS, PosSummon[0], TEMPSUMMON_DEAD_DESPAWN, 900000); - return true; + go_brazier_of_the_heraldAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + me->UseDoorOrButton(); + me->PlayDirectSound(SOUND_SCREECH, 0); + player->SummonCreature(NPC_KIRTONOS, PosSummon[0], TEMPSUMMON_DEAD_DESPAWN, 900000); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetScholomanceAI<go_brazier_of_the_heraldAI>(go); } }; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h index 975e1ccb741..651f1c26625 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h +++ b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h @@ -56,10 +56,10 @@ enum SCGameobjectIds GO_BRAZIER_OF_THE_HERALD = 175564 }; -template<typename AI> -inline AI* GetScholomanceAI(Creature* creature) +template <class AI, class T> +inline AI* GetScholomanceAI(T* obj) { - return GetInstanceAI<AI>(creature, ScholomanceScriptName); + return GetInstanceAI<AI>(obj, ScholomanceScriptName); } #endif diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp index 6edda7824be..a1714085160 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp @@ -102,7 +102,7 @@ class boss_apothecary_hummel : public CreatureScript { boss_apothecary_hummelAI(Creature* creature) : BossAI(creature, DATA_APOTHECARY_HUMMEL), _deadCount(0), _isDead(false) { } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_MENU_HUMMEL && gossipListId == GOSSIP_OPTION_START) { @@ -110,6 +110,7 @@ class boss_apothecary_hummel : public CreatureScript CloseGossipMenuFor(player); DoAction(ACTION_START_EVENT); } + return false; } void Reset() override @@ -267,17 +268,20 @@ class boss_apothecary_hummel : public CreatureScript DoMeleeAttackIfReady(); } + void QuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override + { + if (quest->GetQuestId() == QUEST_YOUVE_BEEN_SERVED) + DoAction(ACTION_START_EVENT); + } + private: uint8 _deadCount; bool _isDead; }; - bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*opt*/) override + CreatureAI* GetAI(Creature* creature) const override { - if (quest->GetQuestId() == QUEST_YOUVE_BEEN_SERVED) - creature->AI()->DoAction(ACTION_START_EVENT); - - return true; + return GetShadowfangKeepAI<boss_apothecary_hummelAI>(creature); } }; @@ -325,6 +329,11 @@ class npc_apothecary_frye : public CreatureScript Talk(SAY_FRYE_DEATH); } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetShadowfangKeepAI<npc_apothecary_fryeAI>(creature); + } }; class npc_apothecary_baxter : public CreatureScript @@ -383,6 +392,11 @@ class npc_apothecary_baxter : public CreatureScript private: EventMap _events; }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetShadowfangKeepAI<npc_apothecary_baxterAI>(creature); + } }; // 68965 -[DND] Lingering Fumes Targetting (starter) diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp index c323d87f091..b1b641806a8 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp @@ -66,36 +66,6 @@ class npc_shadowfang_prisoner : public CreatureScript public: npc_shadowfang_prisoner() : CreatureScript("npc_shadowfang_prisoner") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetShadowfangKeepAI<npc_shadowfang_prisonerAI>(creature); - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_shadowfang_prisoner::npc_shadowfang_prisonerAI, creature->AI())) - pEscortAI->Start(false, false); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - - if (instance && instance->GetData(TYPE_FREE_NPC) != DONE && instance->GetData(TYPE_RETHILGORE) == DONE) - AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(creature), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - struct npc_shadowfang_prisonerAI : public npc_escortAI { npc_shadowfang_prisonerAI(Creature* creature) : npc_escortAI(creature) @@ -142,8 +112,33 @@ public: void Reset() override { } void EnterCombat(Unit* /*who*/) override { } + + 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); + Start(false, false); + } + return true; + } + + bool GossipHello(Player* player) override + { + if (instance->GetData(TYPE_FREE_NPC) != DONE && instance->GetData(TYPE_RETHILGORE) == DONE) + AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(me), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetShadowfangKeepAI<npc_shadowfang_prisonerAI>(creature); + } }; class npc_arugal_voidwalker : public CreatureScript diff --git a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp index ec82afb6cab..5c0881958ce 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp @@ -30,6 +30,7 @@ npc_spectral_ghostly_citizen EndContentData */ #include "ScriptMgr.h" +#include "GameObjectAI.h" #include "GameObject.h" #include "Group.h" #include "InstanceScript.h" @@ -46,41 +47,48 @@ EndContentData */ class go_gauntlet_gate : public GameObjectScript { -public: - go_gauntlet_gate() : GameObjectScript("go_gauntlet_gate") { } - - bool OnGossipHello(Player* player, GameObject* go) override - { - InstanceScript* instance = go->GetInstanceScript(); + public: + go_gauntlet_gate() : GameObjectScript("go_gauntlet_gate") { } - if (!instance) - return false; + struct go_gauntlet_gateAI : public GameObjectAI + { + go_gauntlet_gateAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - if (instance->GetData(TYPE_BARON_RUN) != NOT_STARTED) - return false; + InstanceScript* instance; - if (Group* group = player->GetGroup()) - { - for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) + bool GossipHello(Player* player, bool /*reportUse*/) override { - Player* pGroupie = itr->GetSource(); - if (!pGroupie || !pGroupie->IsInMap(player)) - continue; - - if (pGroupie->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE && - !pGroupie->HasAura(SPELL_BARON_ULTIMATUM) && - pGroupie->GetMap() == go->GetMap()) - pGroupie->CastSpell(pGroupie, SPELL_BARON_ULTIMATUM, true); - } - } else if (player->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE && + if (instance->GetData(TYPE_BARON_RUN) != NOT_STARTED) + return false; + + if (Group* group = player->GetGroup()) + { + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + { + Player* pGroupie = itr->GetSource(); + if (!pGroupie || !pGroupie->IsInMap(player)) + continue; + + if (pGroupie->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE && + !pGroupie->HasAura(SPELL_BARON_ULTIMATUM) && + pGroupie->GetMap() == me->GetMap()) + pGroupie->CastSpell(pGroupie, SPELL_BARON_ULTIMATUM, true); + } + } + else if (player->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE && !player->HasAura(SPELL_BARON_ULTIMATUM) && - player->GetMap() == go->GetMap()) + player->GetMap() == me->GetMap()) player->CastSpell(player, SPELL_BARON_ULTIMATUM, true); - instance->SetData(TYPE_BARON_RUN, IN_PROGRESS); - return false; - } + instance->SetData(TYPE_BARON_RUN, IN_PROGRESS); + return false; + } + }; + GameObjectAI* GetAI(GameObject* go) const override + { + return GetStratholmeAI<go_gauntlet_gateAI>(go); + } }; /*###### diff --git a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h index 8c3d50e0eef..f3f5121bb5a 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h +++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h @@ -83,10 +83,10 @@ enum STRSpellIds SPELL_BARON_ULTIMATUM = 27861 }; -template<typename AI> -inline AI* GetStratholmeAI(Creature* creature) +template <class AI, class T> +inline AI* GetStratholmeAI(T* obj) { - return GetInstanceAI<AI>(creature, StratholmeScriptName); + return GetInstanceAI<AI>(obj, StratholmeScriptName); } #endif diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp index b680823c1a5..1b2bbbfa4fc 100644 --- a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp +++ b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp @@ -31,6 +31,7 @@ EndContentData */ #include "InstanceScript.h" #include "Player.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "sunken_temple.h" /*##### @@ -56,16 +57,26 @@ public: class go_atalai_statue : public GameObjectScript { -public: - go_atalai_statue() : GameObjectScript("go_atalai_statue") { } + public: + go_atalai_statue() : GameObjectScript("go_atalai_statue") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (InstanceScript* instance = player->GetInstanceScript()) - instance->SetData(EVENT_STATE, go->GetEntry()); - return false; - } + struct go_atalai_statueAI : public GameObjectAI + { + go_atalai_statueAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + instance->SetData(EVENT_STATE, me->GetEntry()); + return false; + } + }; + GameObjectAI* GetAI(GameObject* go) const override + { + return GetSunkenTempleAI<go_atalai_statueAI>(go); + } }; void AddSC_sunken_temple() diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h index c905702d3bc..4815e6ac7ac 100644 --- a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h +++ b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h @@ -18,6 +18,7 @@ #ifndef DEF_SUNKEN_TEMPLE_H #define DEF_SUNKEN_TEMPLE_H +#define STScriptName "instance_sunken_temple" #define DataHeader "ST" enum STEvents @@ -25,4 +26,10 @@ enum STEvents EVENT_STATE = 1 }; +template <class AI, class T> +inline AI* GetSunkenTempleAI(T* obj) +{ + return GetInstanceAI<AI>(obj, STScriptName); +} + #endif diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index d68a463a5ee..e7ee54390ed 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -30,6 +30,8 @@ EndScriptData */ #include "ObjectAccessor.h" #include "Player.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" +#include "GameObject.h" #include "sunwell_plateau.h" #include "TemporarySummon.h" @@ -543,27 +545,35 @@ class kalecgos_teleporter : public GameObjectScript public: kalecgos_teleporter() : GameObjectScript("kalecgos_teleporter") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct kalecgos_teleporterAI : public GameObjectAI { -#if MAX_PLAYERS_IN_SPECTRAL_REALM > 0 - uint8 SpectralPlayers = 0; - Map::PlayerList const &PlayerList = go->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - { - if (i->GetSource() && i->GetSource()->GetPositionZ() < DEMON_REALM_Z + 5) - ++SpectralPlayers; - } + kalecgos_teleporterAI(GameObject* go) : GameObjectAI(go) { } - if (player->HasAura(AURA_SPECTRAL_EXHAUSTION) || SpectralPlayers >= MAX_PLAYERS_IN_SPECTRAL_REALM) + bool GossipHello(Player* player, bool /*reportUse*/) override { +#if MAX_PLAYERS_IN_SPECTRAL_REALM > 0 + uint8 SpectralPlayers = 0; + Map::PlayerList const &PlayerList = go->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + { + if (i->GetSource() && i->GetSource()->GetPositionZ() < DEMON_REALM_Z + 5) + ++SpectralPlayers; + } + + if (player->HasAura(AURA_SPECTRAL_EXHAUSTION) || SpectralPlayers >= MAX_PLAYERS_IN_SPECTRAL_REALM) + { + return true; + } +#endif + + player->CastSpell(player, SPELL_TELEPORT_SPECTRAL, true); return true; } -#else - (void)go; -#endif + }; - player->CastSpell(player, SPELL_TELEPORT_SPECTRAL, true); - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return GetSunwellPlateauAI<kalecgos_teleporterAI>(go); } }; diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index 1a4999d450f..0eff7cda638 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -32,6 +32,7 @@ EndScriptData */ #include "ObjectAccessor.h" #include "Player.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "sunwell_plateau.h" #include "TemporarySummon.h" #include <cmath> @@ -365,25 +366,36 @@ public: class go_orb_of_the_blue_flight : public GameObjectScript { -public: - go_orb_of_the_blue_flight() : GameObjectScript("go_orb_of_the_blue_flight") { } + public: + go_orb_of_the_blue_flight() : GameObjectScript("go_orb_of_the_blue_flight") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (go->GetFaction() == 35) + struct go_orb_of_the_blue_flightAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); - player->SummonCreature(NPC_POWER_OF_THE_BLUE_DRAGONFLIGHT, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 121000); - player->CastSpell(player, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, false); - go->SetFaction(0); + go_orb_of_the_blue_flightAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (me->GetFaction() == 35) + { + player->SummonCreature(NPC_POWER_OF_THE_BLUE_DRAGONFLIGHT, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 121000); + player->CastSpell(player, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, false); + me->SetFaction(0); - if (Creature* pKalec = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_KALECGOS_KJ))) - ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->SetRingOfBlueFlames(); + if (Creature* pKalec = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_KALECGOS_KJ))) + ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->SetRingOfBlueFlames(); - go->Refresh(); + me->Refresh(); + } + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetSunwellPlateauAI<go_orb_of_the_blue_flightAI>(go); } - return true; - } }; //AI for Kil'jaeden Event Controller diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h index c3adfb74dd3..2e70fbe6922 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h @@ -114,10 +114,10 @@ enum SWPGameObjectIds GO_MURUS_GATE_2 = 188118 }; -template<typename AI> -inline AI* GetSunwellPlateauAI(Creature* creature) +template <class AI, class T> +inline AI* GetSunwellPlateauAI(T* obj) { - return GetInstanceAI<AI>(creature, SunwellPlateauScriptName); + return GetInstanceAI<AI>(obj, SunwellPlateauScriptName); } #endif // SUNWELL_PLATEAU_H diff --git a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp index 38ab7cd851f..1b301d553dc 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp @@ -30,8 +30,10 @@ EndScriptData */ #include "ObjectAccessor.h" #include "Player.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "SpellInfo.h" #include "uldaman.h" +#include "GameObject.h" enum Says { @@ -396,22 +398,26 @@ EndScriptData */ class go_altar_of_archaedas : public GameObjectScript { public: + go_altar_of_archaedas() : GameObjectScript("go_altar_of_archaedas") { } - go_altar_of_archaedas() - : GameObjectScript("go_altar_of_archaedas") + struct go_altar_of_archaedasAI : public GameObjectAI { - } + go_altar_of_archaedasAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - InstanceScript* instance = player->GetInstanceScript(); - if (!instance) - return false; + InstanceScript* instance; + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + player->CastSpell(player, SPELL_BOSS_OBJECT_VISUAL, false); - player->CastSpell (player, SPELL_BOSS_OBJECT_VISUAL, false); + instance->SetGuidData(0, player->GetGUID()); // activate archaedas + return false; + } + }; - instance->SetGuidData(0, player->GetGUID()); // activate archaedas - return false; + GameObjectAI* GetAI(GameObject* go) const override + { + return GetUldamanAI<go_altar_of_archaedasAI>(go); } }; diff --git a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp index aa8eba40674..e7d78c1ac48 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp @@ -33,6 +33,7 @@ EndContentData */ #include "InstanceScript.h" #include "Player.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "uldaman.h" /*###### @@ -117,16 +118,26 @@ class npc_jadespine_basilisk : public CreatureScript class go_keystone_chamber : public GameObjectScript { -public: - go_keystone_chamber() : GameObjectScript("go_keystone_chamber") { } + public: + go_keystone_chamber() : GameObjectScript("go_keystone_chamber") { } + + struct go_keystone_chamberAI : public GameObjectAI + { + go_keystone_chamberAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - if (InstanceScript* instance = go->GetInstanceScript()) - instance->SetData(DATA_IRONAYA_SEAL, IN_PROGRESS); //door animation and save state. + InstanceScript* instance; - return false; - } + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + instance->SetData(DATA_IRONAYA_SEAL, IN_PROGRESS); //door animation and save state. + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetUldamanAI<go_keystone_chamberAI>(go); + } }; /*###### diff --git a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h index 675118ac9c8..595354f1c92 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h +++ b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h @@ -44,10 +44,10 @@ enum UDGameObjectIds GO_KEYSTONE = 124371, }; -template<typename AI> -inline AI* GetUldamanAI(Creature* creature) +template <class AI, class T> +inline AI* GetUldamanAI(T* obj) { - return GetInstanceAI<AI>(creature, UldamanScriptName); + return GetInstanceAI<AI>(obj, UldamanScriptName); } #endif diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp index ce854dd882e..61688d363a2 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp @@ -101,10 +101,10 @@ class npc_voljin_zulaman : public CreatureScript _gongCount = 0; } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (_instance->GetData(DATA_ZULAMAN_STATE) != NOT_STARTED) - return; + return true; if (me->GetCreatureTemplate()->GossipMenuId == menuId && !gossipListId) { @@ -116,6 +116,7 @@ class npc_voljin_zulaman : public CreatureScript Talk(SAY_INTRO_1, player); me->SetWalk(true); } + return false; } void DoAction(int32 action) override diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h index 9277c2e6eb4..d4d2908dec5 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h +++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h @@ -89,10 +89,10 @@ enum ZGGameObjectIds GO_THE_CACHE_OF_MADNESS_DOOR = 208843 }; -template<typename AI> -inline AI* GetZulGurubAI(Creature* creature) +template<class AI, class T> +AI* GetZulGurubAI(T* obj) { - return GetInstanceAI<AI>(creature, ZGScriptName); + return GetInstanceAI<AI>(obj, ZGScriptName); } #endif diff --git a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp index f07c55b2752..f9f0985b416 100644 --- a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp @@ -107,7 +107,7 @@ class npc_professor_phizzlethorpe : public CreatureScript Talk(SAY_AGGRO); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_SUNKEN_TREASURE) { diff --git a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp index 1e4d75852a2..fd4617bb183 100644 --- a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp @@ -127,19 +127,16 @@ public: if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20)) Cage->SetGoState(GO_STATE_READY); } - }; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCAPE_FROM_THE_CATACOMBS) + void QuestAccept(Player* player, Quest const* quest) override { - creature->SetFaction(FACTION_QUEST_ESCAPE); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_ranger_lilatha::npc_ranger_lilathaAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); + if (quest->GetQuestId() == QUEST_ESCAPE_FROM_THE_CATACOMBS) + { + me->SetFaction(FACTION_QUEST_ESCAPE); + Start(true, false, player->GetGUID()); + } } - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { diff --git a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp index 821f99ffc9a..3fd9345ef0e 100644 --- a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp @@ -74,7 +74,7 @@ public: summoned->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_RESQUE_OOX_09) { diff --git a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp index a808a175178..137b779878e 100644 --- a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp +++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp @@ -111,20 +111,16 @@ public: { Talk(SAY_AGGRO, who); } - }; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCORTING) + void QuestAccept(Player* player, Quest const* quest) override { - creature->AI()->Talk(SAY_QUESTACCEPT, player); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_deathstalker_erland::npc_deathstalker_erlandAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); + if (quest->GetQuestId() == QUEST_ESCORTING) + { + Talk(SAY_QUESTACCEPT, player); + Start(true, false, player->GetGUID()); + } } - - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { diff --git a/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp b/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp index 54335415ac2..a30fb95d026 100644 --- a/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp +++ b/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp @@ -55,7 +55,7 @@ class npc_tb_spirit_guide : public CreatureScript DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL); } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { player->PlayerTalkClass->SendCloseGossip(); @@ -81,11 +81,13 @@ class npc_tb_spirit_guide : public CreatureScript areaId = TB_GY_SOUTH_SPIRE; break; default: - return; + return true; } if (WorldSafeLocsEntry const* safeLoc = sObjectMgr->GetWorldSafeLoc(areaId)) player->TeleportTo(safeLoc->Loc); + + return false; } }; diff --git a/src/server/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp index ff2aa97601c..56cc8d49c25 100644 --- a/src/server/scripts/EasternKingdoms/zone_undercity.cpp +++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp @@ -96,14 +96,6 @@ class npc_lady_sylvanas_windrunner : public CreatureScript public: npc_lady_sylvanas_windrunner() : CreatureScript("npc_lady_sylvanas_windrunner") { } - bool OnQuestReward(Player* player, Creature* creature, const Quest *_Quest, uint32 /*slot*/) override - { - if (_Quest->GetQuestId() == QUEST_JOURNEY_TO_UNDERCITY) - creature->AI()->SetGUID(player->GetGUID(), GUID_EVENT_INVOKER); - - return true; - } - struct npc_lady_sylvanas_windrunnerAI : public ScriptedAI { npc_lady_sylvanas_windrunnerAI(Creature* creature) : ScriptedAI(creature) @@ -238,6 +230,12 @@ public: DoMeleeAttackIfReady(); } + void QuestReward(Player* player, Quest const* quest, uint32 /*opt*/) override + { + if (quest->GetQuestId() == QUEST_JOURNEY_TO_UNDERCITY) + SetGUID(player->GetGUID(), GUID_EVENT_INVOKER); + } + private: EventMap _events; bool LamentEvent; diff --git a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp index 621e8f13603..c706e47f739 100644 --- a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp @@ -58,62 +58,73 @@ enum DithersAndArbington class npcs_dithers_and_arbington : public CreatureScript { -public: - npcs_dithers_and_arbington() : CreatureScript("npcs_dithers_and_arbington") { } + public: + npcs_dithers_and_arbington() : CreatureScript("npcs_dithers_and_arbington") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + struct npcs_dithers_and_arbingtonAI : public ScriptedAI { - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); - SendGossipMenuFor(player, NPC_TEXT_OSSEOUS_AGITATORS, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); - SendGossipMenuFor(player, NPC_TEXT_SOMATIC_INTENSIFIERS_1, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); - SendGossipMenuFor(player, NPC_TEXT_SOMATIC_INTENSIFIERS_2, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); - SendGossipMenuFor(player, NPC_TEXT_ECTOPLASMIC_RESONATORS, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+5: - CloseGossipMenuFor(player); - creature->CastSpell(player, CREATE_ITEM_VITREOUS_FOCUSER, false); - break; - } - return true; - } + npcs_dithers_and_arbingtonAI(Creature* creature) : ScriptedAI(creature) { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + SendGossipMenuFor(player, NPC_TEXT_OSSEOUS_AGITATORS, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + SendGossipMenuFor(player, NPC_TEXT_SOMATIC_INTENSIFIERS_1, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + SendGossipMenuFor(player, NPC_TEXT_SOMATIC_INTENSIFIERS_2, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + SendGossipMenuFor(player, NPC_TEXT_ECTOPLASMIC_RESONATORS, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 5: + CloseGossipMenuFor(player); + DoCast(player, CREATE_ITEM_VITREOUS_FOCUSER, false); + break; + } + return true; + } - if (creature->IsVendor()) - 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()); + + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + + if (player->GetQuestRewardStatus(QUEST_MISSION_ACCOMPLISHED_H) || player->GetQuestRewardStatus(QUEST_MISSION_ACCOMPLISHED_A)) + { + AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_FELSTONE_FIELD, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_DALSON_S_TEARS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_WRITHING_HAUNT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_GAHRRON_S_WITH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + SendGossipMenuFor(player, NPC_TEXT_LET_S_GET_TO_WORK, me->GetGUID()); + } + else + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + + return true; + } + }; - if (player->GetQuestRewardStatus(QUEST_MISSION_ACCOMPLISHED_H) || player->GetQuestRewardStatus(QUEST_MISSION_ACCOMPLISHED_A)) + CreatureAI* GetAI(Creature* creature) const override { - AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_FELSTONE_FIELD, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_DALSON_S_TEARS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_WRITHING_HAUNT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_GAHRRON_S_WITH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); - SendGossipMenuFor(player, NPC_TEXT_LET_S_GET_TO_WORK, creature->GetGUID()); + return new npcs_dithers_and_arbingtonAI(creature); } - else - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } }; /*###### diff --git a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp index f561db22727..856080be6fa 100644 --- a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp @@ -148,22 +148,30 @@ class npc_mikhail : public CreatureScript public: npc_mikhail() : CreatureScript("npc_mikhail") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override + struct npc_mikhailAI : public ScriptedAI { - if (quest->GetQuestId() == QUEST_MISSING_DIPLO_PT11) - { - Creature* pSlim = creature->FindNearestCreature(NPC_TAPOKE_SLIM_JAHN, 25.0f); + npc_mikhailAI(Creature* creature) : ScriptedAI(creature) { } - if (!pSlim) - return false; + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_MISSING_DIPLO_PT11) + { + Creature* slim = me->FindNearestCreature(NPC_TAPOKE_SLIM_JAHN, 25.0f); + if (!slim) + return; - if (!pSlim->HasStealthAura()) - pSlim->CastSpell(pSlim, SPELL_STEALTH, true); + if (!slim->HasStealthAura()) + slim->CastSpell(slim, SPELL_STEALTH, true); - if (npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI* pEscortAI = CAST_AI(npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI, pSlim->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); + if (npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI* slimAI = CAST_AI(npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI, slim->AI())) + slimAI->Start(false, false, player->GetGUID(), quest); + } } - return false; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_mikhailAI(creature); } }; diff --git a/src/server/scripts/Events/childrens_week.cpp b/src/server/scripts/Events/childrens_week.cpp index a312b3d1724..84c30ad7c1c 100644 --- a/src/server/scripts/Events/childrens_week.cpp +++ b/src/server/scripts/Events/childrens_week.cpp @@ -676,7 +676,7 @@ class npc_the_etymidian : public CreatureScript Initialize(); } - void sQuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override + void QuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override { if (quest->GetQuestId() != QUEST_THE_ACTIVATION_RUNE) return; diff --git a/src/server/scripts/Events/fireworks_show.cpp b/src/server/scripts/Events/fireworks_show.cpp index 811c242ac25..664bb5b5dff 100644 --- a/src/server/scripts/Events/fireworks_show.cpp +++ b/src/server/scripts/Events/fireworks_show.cpp @@ -847,12 +847,12 @@ public: { case EVENT_CHEER: { - go->PlayDistanceSound(CheerPicker()); + me->PlayDistanceSound(CheerPicker()); break; } case EVENT_FIRE: { - auto it = pos.find(go->GetZoneId()); + auto it = pos.find(me->GetZoneId()); if (it != pos.end()) { Position const& rndpos = Trinity::Containers::SelectRandomContainerElement(it->second); @@ -861,7 +861,7 @@ public: if (_big) { - if (GameObject* firework = go->SummonGameObject(FireworksBIGOnlyPicker(), rndpos, QuaternionData(0.f, 0.f, rndrot, rndrot2), 300)) + if (GameObject* firework = me->SummonGameObject(FireworksBIGOnlyPicker(), rndpos, QuaternionData(0.f, 0.f, rndrot, rndrot2), 300)) { firework->SetRespawnTime(0); firework->Delete(); @@ -869,7 +869,7 @@ public: } else { - if (GameObject* firework = go->SummonGameObject(FireworksPicker(), rndpos, QuaternionData(0.f, 0.f, rndrot, rndrot2), 300)) + if (GameObject* firework = me->SummonGameObject(FireworksPicker(), rndpos, QuaternionData(0.f, 0.f, rndrot, rndrot2), 300)) { firework->SetRespawnTime(0); firework->Delete(); diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp index 334e3ebb26c..9f6e4c19c17 100644 --- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp +++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp @@ -17,6 +17,7 @@ #include "ScriptMgr.h" #include "blackfathom_deeps.h" +#include "GameObjectAI.h" #include "GameObject.h" #include "InstanceScript.h" #include "Player.h" @@ -37,35 +38,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 GetBlackfathomDeepsAI<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->AddFlag(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->AddFlag(GO_FLAG_NOT_SELECTABLE); - instance->SetData(DATA_FIRE, instance->GetData(DATA_FIRE) + 1); - return true; + return GetBlackfathomDeepsAI<go_blackfathom_fireAI>(go); } - return false; - } }; class npc_blackfathom_deeps_event : public CreatureScript @@ -206,9 +223,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/BlackfathomDeeps/blackfathom_deeps.h b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h index 2b0a208c780..06f2481e88d 100644 --- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h +++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h @@ -70,10 +70,10 @@ enum BFDGameObjectIds GO_ALTAR_OF_THE_DEEPS = 103016 }; -template<typename AI> -inline AI* GetBlackfathomDeepsAI(Creature* creature) +template<class AI, class T> +AI* GetBlackfathomDeepsAI(T* obj) { - return GetInstanceAI<AI>(creature, BFDScriptName); + return GetInstanceAI<AI>(obj, BFDScriptName); } #endif // BFD_H_ diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp index 5e4c6421bba..21b57e80004 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp @@ -50,209 +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 { - 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 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 (hyjalAI* ai = GetHyjalAI<hyjalAI>(creature)) + 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 { - 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; + return GetHyjalAI<npc_jaina_proudmooreAI>(creature); } - - return nullptr; - } - }; 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) - { - 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)) - { - 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); - } - - 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; - } + public: + npc_thrall() : CreatureScript("npc_thrall") { } - CreatureAI* GetAI(Creature* creature) const override - { - if (hyjalAI* ai = GetHyjalAI<hyjalAI>(creature)) + struct npc_thrallAI : public hyjalAI { - 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; + 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 + { + return GetHyjalAI<npc_thrallAI>(creature); } - - return nullptr; - } - }; class npc_tyrande_whisperwind : public CreatureScript { -public: - npc_tyrande_whisperwind() : CreatureScript("npc_tyrande_whisperwind") { } + public: + npc_tyrande_whisperwind() : CreatureScript("npc_tyrande_whisperwind") { } - CreatureAI* GetAI(Creature* creature) const override - { - if (hyjalAI* ai = GetHyjalAI<hyjalAI>(creature)) + struct npc_tyrande_whisperwindAI : public hyjalAI { - ai->Reset(); - ai->EnterEvadeMode(); - return ai; - } - - return nullptr; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF) + 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 { - 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, creature->GetGUID()); + return GetHyjalAI<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 59d4ac249be..97848ddcde9 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp @@ -258,98 +258,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->RemoveNpcFlag(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 GetCullingOfStratholmeAI<npc_arthasAI>(creature); - } - struct npc_arthasAI : public npc_escortAI { npc_arthasAI(Creature* creature) : npc_escortAI(creature) @@ -1234,8 +1142,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->RemoveNpcFlag(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 GetCullingOfStratholmeAI<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 c9f497ae971..5f0730df796 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp @@ -28,6 +28,7 @@ EndScriptData */ #include "MotionMaster.h" #include "old_hillsbrad.h" #include "ScriptedEscortAI.h" +#include "GameObjectAI.h" /*###### ## go_barrel_old_hillsbrad @@ -38,19 +39,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 GetOldHillsbradAI<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 1fbd0a3474d..c921ec42e6b 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp @@ -57,41 +57,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 GetOldHillsbradAI<npc_erozionAI>(creature); } }; @@ -186,93 +196,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 GetOldHillsbradAI<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); - } - - 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) @@ -543,8 +466,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); + } + + 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 GetOldHillsbradAI<npc_thrall_old_hillsbradAI>(creature); + } }; /*###### @@ -564,48 +563,6 @@ class npc_taretha : public CreatureScript public: npc_taretha() : CreatureScript("npc_taretha") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetOldHillsbradAI<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) @@ -635,8 +592,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 GetOldHillsbradAI<npc_tarethaAI>(creature); + } }; /*###### diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h index 82fdc18e7c6..950ea70df57 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h @@ -43,11 +43,10 @@ enum OHWorldStateIds WORLD_STATE_OH = 2436 }; - -template<typename AI> -inline AI* GetOldHillsbradAI(Creature* creature) +template <class AI, class T> +inline AI* GetOldHillsbradAI(T* obj) { - return GetInstanceAI<AI>(creature, OHScriptName); + return GetInstanceAI<AI>(obj, OHScriptName); } diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp index 71784911f34..c4846fbc611 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp @@ -331,10 +331,10 @@ class npc_brann_bronzebeard_anraphet : public CreatureScript { npc_brann_bronzebeard_anraphetAI(Creature* creature) : CreatureAI(creature), _currentPoint(0), _instance(creature->GetInstanceScript()) { } - void sGossipSelect(Player* /*player*/, uint32 sender, uint32 action) override + bool GossipSelect(Player* /*player*/, uint32 sender, uint32 action) override { if (_instance->GetBossState(DATA_VAULT_OF_LIGHTS) == DONE) - return; + return true; if (me->GetCreatureTemplate()->GossipMenuId == sender && !action) { @@ -346,6 +346,7 @@ class npc_brann_bronzebeard_anraphet : public CreatureScript Talk(BRANN_SAY_DOOR_INTRO); events.ScheduleEvent(EVENT_BRANN_UNLOCK_DOOR, 7500); } + return false; } void DoAction(int32 action) override diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp index adfca4e9a7e..2c1059a9bd9 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp +++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp @@ -34,6 +34,7 @@ EndContentData */ #include "Player.h" #include "razorfen_downs.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "ScriptedGossip.h" #include "TemporarySummon.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 ea328c6da8c..8d4d3e042bb 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h +++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h @@ -63,10 +63,10 @@ enum RFDGameObjectIds GO_BELNISTRASZS_BRAZIER = 152097 }; -template<typename AI> -inline 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 7fa68b2771a..3f1ed9792ff 100644 --- a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp +++ b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp @@ -52,7 +52,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 77a7144f0bc..bb6e986a71e 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp @@ -16,6 +16,7 @@ */ #include "ScriptMgr.h" +#include "GameObjectAI.h" #include "GameObject.h" #include "InstanceScript.h" #include "Map.h" @@ -283,18 +284,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 GetAQ20AI<go_ossirian_crystalAI>(go); } }; diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h index 03f50ff978a..e646a003b2b 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h @@ -60,10 +60,10 @@ enum AQRGameObjectIds GO_OSSIRIAN_CRYSTAL = 180619 }; -template<typename AI> -inline AI* GetAQ20AI(Creature* creature) +template<class AI, class T> +AI* GetAQ20AI(T* obj) { - return GetInstanceAI<AI>(creature, AQ20ScriptName); + return GetInstanceAI<AI>(obj, AQ20ScriptName); } #endif diff --git a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp index d8fee227711..e3019c885bd 100644 --- a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp +++ b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp @@ -80,60 +80,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 GetWailingCavernsAI<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->RemoveUnitFlag(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) @@ -370,8 +316,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->RemoveUnitFlag(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 GetWailingCavernsAI<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 af4e5f4ec69..70689d7badf 100644 --- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp +++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp @@ -35,6 +35,7 @@ EndContentData */ #include "Player.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" +#include "GameObjectAI.h" #include "zulfarrak.h" /*###### @@ -67,42 +68,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 GetZulFarrakAI<npc_sergeant_blyAI>(creature); - } - struct npc_sergeant_blyAI : public ScriptedAI { npc_sergeant_blyAI(Creature* creature) : ScriptedAI(creature) @@ -201,8 +166,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 GetZulFarrakAI<npc_sergeant_blyAI>(creature); + } }; /*###### @@ -214,32 +211,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, go, ENTRY_BLY, 1884.99f, 1263, 41.52f); - initBlyCrewMember(instance, go, ENTRY_RAVEN, 1882.5f, 1263, 41.52f); - initBlyCrewMember(instance, go, ENTRY_ORO, 1886.47f, 1270.68f, 41.68f); - initBlyCrewMember(instance, go, ENTRY_WEEGLI, 1890, 1263, 41.52f); - initBlyCrewMember(instance, go, 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, GameObject* go, uint32 entry, float x, float y, float z) - { - if (Creature* crew = ObjectAccessor::GetCreature(*go, 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 GetZulFarrakAI<go_troll_cageAI>(go); } }; @@ -268,44 +274,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 GetZulFarrakAI<npc_weegli_blastfuseAI>(creature); - } - struct npc_weegli_blastfuseAI : public ScriptedAI { npc_weegli_blastfuseAI(Creature* creature) : ScriptedAI(creature) @@ -378,11 +346,6 @@ public: }; } - void DoAction(int32 /*param*/) override - { - DestroyDoor(); - } - void DestroyDoor() { if (me->IsAlive()) @@ -394,8 +357,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 GetZulFarrakAI<npc_weegli_blastfuseAI>(creature); + } }; /*###### @@ -415,20 +412,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/ZulFarrak/zulfarrak.h b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h index 46ae0d0ef9b..00563114c00 100644 --- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h +++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h @@ -56,10 +56,10 @@ enum ZFPyramidPhases PYRAMID_KILLED_ALL_TROLLS, }; -template<typename AI> -inline AI* GetZulFarrakAI(Creature* creature) +template<class AI, class T> +inline AI* GetZulFarrakAI(T* obj) { - return GetInstanceAI<AI>(creature, ZFScriptName); + return GetInstanceAI<AI>(obj, ZFScriptName); } #endif diff --git a/src/server/scripts/Kalimdor/zone_ashenvale.cpp b/src/server/scripts/Kalimdor/zone_ashenvale.cpp index af7ca599b3f..854e5322667 100644 --- a/src/server/scripts/Kalimdor/zone_ashenvale.cpp +++ b/src/server/scripts/Kalimdor/zone_ashenvale.cpp @@ -27,6 +27,7 @@ npc_ruul_snowhoof EndContentData */ #include "ScriptMgr.h" +#include "GameObjectAI.h" #include "GameObject.h" #include "Player.h" #include "ScriptedEscortAI.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_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp index 2e15e2d2118..b834317359b 100644 --- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp @@ -32,6 +32,7 @@ npc_death_ravager EndContentData */ #include "ScriptMgr.h" +#include "GameObjectAI.h" #include "CellImpl.h" #include "GridNotifiersImpl.h" #include "Log.h" @@ -229,11 +230,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 @@ -360,7 +362,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) { @@ -632,19 +634,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->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - ravager->SetReactState(REACT_AGGRESSIVE); - ravager->AI()->AttackStart(player); + if (Creature* ravager = me->FindNearestCreature(NPC_DEATH_RAVAGER, 5.0f, true)) + { + ravager->RemoveUnitFlag(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); } }; @@ -802,19 +814,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 4b29440786b..adfc20062a6 100644 --- a/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp @@ -363,7 +363,7 @@ public: _moveTimer = 0; } - 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_desolace.cpp b/src/server/scripts/Kalimdor/zone_desolace.cpp index 3ba3873837d..4f79ed6a510 100644 --- a/src/server/scripts/Kalimdor/zone_desolace.cpp +++ b/src/server/scripts/Kalimdor/zone_desolace.cpp @@ -28,6 +28,7 @@ go_demon_portal EndContentData */ #include "ScriptMgr.h" +#include "GameObjectAI.h" #include "MotionMaster.h" #include "Player.h" #include "ScriptedEscortAI.h" @@ -101,19 +102,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 { diff --git a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp index 5c2f4299068..99cc3ce925c 100644 --- a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp +++ b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp @@ -49,31 +49,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); } - }; /*###### @@ -102,19 +112,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) { } @@ -148,8 +145,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_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp index 2df4806adac..bf1dc96d5e4 100644 --- a/src/server/scripts/Kalimdor/zone_silithus.cpp +++ b/src/server/scripts/Kalimdor/zone_silithus.cpp @@ -35,6 +35,7 @@ go_wind_stone EndContentData */ #include "ScriptMgr.h" +#include "GameObjectAI.h" #include "CreatureAIImpl.h" #include "GameObject.h" #include "Group.h" @@ -963,60 +964,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->SetNpcFlags(UNIT_NPC_FLAG_NONE); - Merithra->SetStandState(UNIT_STAND_STATE_STAND); - Merithra->SetDisplayId(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->SetNpcFlags(UNIT_NPC_FLAG_NONE); - Caelestrasz->SetStandState(UNIT_STAND_STATE_STAND); - Caelestrasz->SetDisplayId(CAELESTRASZ_NIGHT_ELF_FORM); - Caelestrasz->SetFaction(35); - } + if (Merithra) + { + Merithra->SetNpcFlags(UNIT_NPC_FLAG_NONE); + Merithra->SetStandState(UNIT_STAND_STATE_STAND); + Merithra->SetDisplayId(MERITHRA_NIGHT_ELF_FORM); + Merithra->SetFaction(35); + } - if (Arygos) - { - Arygos->SetNpcFlags(UNIT_NPC_FLAG_NONE); - Arygos->SetStandState(UNIT_STAND_STATE_STAND); - Arygos->SetDisplayId(ARYGOS_GNOME_FORM); - Arygos->SetFaction(35); - } + if (Caelestrasz) + { + Caelestrasz->SetNpcFlags(UNIT_NPC_FLAG_NONE); + Caelestrasz->SetStandState(UNIT_STAND_STATE_STAND); + Caelestrasz->SetDisplayId(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->SetNpcFlags(UNIT_NPC_FLAG_NONE); + Arygos->SetStandState(UNIT_STAND_STATE_STAND); + Arygos->SetDisplayId(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); + } }; /*### @@ -1131,241 +1140,252 @@ class go_wind_stone : public GameObjectScript public: go_wind_stone() : GameObjectScript("go_wind_stone") { } - private: - uint8 GetPlayerRank(Player* player) // For random summoning - { - 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) + struct go_wind_stoneAI : public GameObjectAI { - 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: - { - 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: + private: + uint8 GetPlayerRank(Player* player) // For random summoning { - 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->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - summons->SendMeleeAttackStart(player); - summons->CombatStart(player); - } - - public: - bool OnGossipHello(Player* player, GameObject* go) override - { - uint8 rank = GetPlayerRank(player); - - uint32 gossipId = go->GetGOInfo()->GetGossipMenuId(); - switch (gossipId) - { - case GOSSIP_ID_LESSER_WS: + uint8 GetItems(Player* player, WS type) { - 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 + uint8 result = 0x0; + + switch (type) { - go->CastSpell(player, SPELL_PUNISHMENT); - break; + 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; } - - 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; + return result; } - case GOSSIP_ID_WIND_STONE: + + void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spell) { - 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 + 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); + 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, 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; + summons->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + summons->SendMeleeAttackStart(player); + summons->CombatStart(player); } - case GOSSIP_ID_GREATER_WS: + + public: + bool GossipHello(Player* player, bool /*reportUse*/) override { - if (rank == 3) // 3 - AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); - 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, 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, 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; + } - SendGossipMenuFor(player, player->GetGossipTextId(gossipId, go), go->GetGUID()); - return true; - } + 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; + } - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - player->PlayerTalkClass->SendCloseGossip(); + 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; + } - 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; + SendGossipMenuFor(player, player->GetGossipTextId(gossipId, me), me->GetGUID()); + return true; + } - 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; + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + player->PlayerTalkClass->SendCloseGossip(); - 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; + switch (action) + { + 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; + } + return true; + } + }; - default: - break; - } - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_wind_stoneAI(go); } }; diff --git a/src/server/scripts/Kalimdor/zone_tanaris.cpp b/src/server/scripts/Kalimdor/zone_tanaris.cpp index 2d5ad0bc50b..78d64e4d21a 100644 --- a/src/server/scripts/Kalimdor/zone_tanaris.cpp +++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp @@ -314,27 +314,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->SetStandState(UNIT_STAND_STATE_STAND); - creature->RemoveUnitFlag(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) { } @@ -378,7 +357,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->SetStandState(UNIT_STAND_STATE_STAND); + me->RemoveUnitFlag(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); + } }; /*#### @@ -409,22 +407,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) @@ -547,8 +529,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 2ac0c1dc8dd..fd602f78a6d 100644 --- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp +++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp @@ -52,17 +52,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; } }; @@ -97,26 +96,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) { } @@ -166,8 +145,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); + } }; /*###### @@ -647,19 +642,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_thunder_bluff.cpp b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp index 3e868068267..f40675abda1 100644 --- a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp +++ b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp @@ -47,11 +47,6 @@ class npc_cairne_bloodhoof : public CreatureScript public: npc_cairne_bloodhoof() : CreatureScript("npc_cairne_bloodhoof") { } - 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) @@ -119,8 +114,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_winterspring.cpp b/src/server/scripts/Kalimdor/zone_winterspring.cpp index c0d5b422cb9..d29175c8985 100644 --- a/src/server/scripts/Kalimdor/zone_winterspring.cpp +++ b/src/server/scripts/Kalimdor/zone_winterspring.cpp @@ -29,6 +29,7 @@ go_elune_fire EndContentData */ #include "ScriptMgr.h" +#include "GameObjectAI.h" #include "GameObject.h" #include "MotionMaster.h" #include "ObjectAccessor.h" @@ -47,26 +48,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); } }; @@ -294,30 +305,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(); } @@ -590,9 +581,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); + } }; /*##### @@ -603,22 +611,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->AddFlag(GO_FLAG_NOT_SELECTABLE); + return false; } - go->AddFlag(GO_FLAG_NOT_SELECTABLE); + }; - return false; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_elune_fireAI(go); } }; diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h index 79672742b6c..e2e464bc196 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h @@ -82,10 +82,10 @@ enum AKGameObjectIds GO_SPHERE_2 = 193094 }; -template<typename AI> -inline AI* GetAhnKahetAI(Creature* creature) +template<class AI, class T> +inline AI* GetAhnKahetAI(T* obj) { - return GetInstanceAI<AI>(creature, AhnKahetScriptName); + return GetInstanceAI<AI>(obj, AhnKahetScriptName); } #endif // AHNKAHET_H_ diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp index 299e955d2f5..9f432b27710 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp @@ -24,6 +24,7 @@ #include "ObjectAccessor.h" #include "Player.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "Spell.h" #include "SpellScript.h" @@ -386,33 +387,41 @@ class go_prince_taldaram_sphere : public GameObjectScript public: go_prince_taldaram_sphere() : GameObjectScript("go_prince_taldaram_sphere") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_prince_taldaram_sphereAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); - if (!instance) - return false; + go_prince_taldaram_sphereAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - Creature* PrinceTaldaram = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_PRINCE_TALDARAM)); - if (PrinceTaldaram && PrinceTaldaram->IsAlive()) - { - go->AddFlag(GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + InstanceScript* instance; - switch (go->GetEntry()) + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + Creature* princeTaldaram = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_PRINCE_TALDARAM)); + if (princeTaldaram && princeTaldaram->IsAlive()) { - case GO_SPHERE_1: - instance->SetData(DATA_SPHERE_1, IN_PROGRESS); - PrinceTaldaram->AI()->Talk(SAY_1); - break; - case GO_SPHERE_2: - instance->SetData(DATA_SPHERE_2, IN_PROGRESS); - PrinceTaldaram->AI()->Talk(SAY_1); - break; - } + me->AddFlag(GO_FLAG_NOT_SELECTABLE); + me->SetGoState(GO_STATE_ACTIVE); - ENSURE_AI(boss_prince_taldaram::boss_prince_taldaramAI, PrinceTaldaram->AI())->CheckSpheres(); + switch (me->GetEntry()) + { + case GO_SPHERE_1: + instance->SetData(DATA_SPHERE_1, IN_PROGRESS); + princeTaldaram->AI()->Talk(SAY_1); + break; + case GO_SPHERE_2: + instance->SetData(DATA_SPHERE_2, IN_PROGRESS); + princeTaldaram->AI()->Talk(SAY_1); + break; + } + + ENSURE_AI(boss_prince_taldaram::boss_prince_taldaramAI, princeTaldaram->AI())->CheckSpheres(); + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetAhnKahetAI<go_prince_taldaram_sphereAI>(go); } }; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index e9ac9b94c82..edd9982f0ef 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -1388,7 +1388,7 @@ class go_twilight_portal : public GameObjectScript if (!_deleted) { _deleted = true; - go->Delete(); + me->Delete(); } } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp index 2186fcf6f4c..00240b68cb7 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp @@ -452,48 +452,43 @@ public: break; } } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetTrialOfTheChampionAI<npc_announcer_toc5AI>(creature); - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - - if (instance && - ((instance->GetData(BOSS_GRAND_CHAMPIONS) == DONE && - instance->GetData(BOSS_BLACK_KNIGHT) == DONE && - instance->GetData(BOSS_ARGENT_CHALLENGE_E) == DONE) || - instance->GetData(BOSS_ARGENT_CHALLENGE_P) == DONE)) - return false; - - if (instance && - instance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED && - instance->GetData(BOSS_ARGENT_CHALLENGE_E) == NOT_STARTED && - instance->GetData(BOSS_ARGENT_CHALLENGE_P) == NOT_STARTED && - instance->GetData(BOSS_BLACK_KNIGHT) == NOT_STARTED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - else if (instance) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } + bool GossipHello(Player* player) override + { + if (((instance->GetData(BOSS_GRAND_CHAMPIONS) == DONE && + instance->GetData(BOSS_BLACK_KNIGHT) == DONE && + instance->GetData(BOSS_ARGENT_CHALLENGE_E) == DONE) || + instance->GetData(BOSS_ARGENT_CHALLENGE_P) == DONE)) + return false; + + if (instance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED && + instance->GetData(BOSS_ARGENT_CHALLENGE_E) == NOT_STARTED && + instance->GetData(BOSS_ARGENT_CHALLENGE_P) == NOT_STARTED && + instance->GetData(BOSS_BLACK_KNIGHT) == NOT_STARTED) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + else if (instance) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return 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); - ENSURE_AI(npc_announcer_toc5::npc_announcer_toc5AI, creature->AI())->StartEncounter(); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + StartEncounter(); + } + return true; } + }; - return true; + CreatureAI* GetAI(Creature* creature) const override + { + return GetTrialOfTheChampionAI<npc_announcer_toc5AI>(creature); } }; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index f933b64a7fe..a70f313468d 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -507,20 +507,20 @@ class npc_essence_of_twin : public CreatureScript return spellReturned; } + + bool GossipHello(Player* player) override + { + player->RemoveAurasDueToSpell(GetData(ESSENCE_REMOVE)); + player->CastSpell(player, GetData(ESSENCE_APPLY), true); + CloseGossipMenuFor(player); + return true; + } }; CreatureAI* GetAI(Creature* creature) const override { return GetTrialOfTheCrusaderAI<npc_essence_of_twinAI>(creature); }; - - bool OnGossipHello(Player* player, Creature* creature) override - { - player->RemoveAurasDueToSpell(creature->GetAI()->GetData(ESSENCE_REMOVE)); - player->CastSpell(player, creature->GetAI()->GetData(ESSENCE_APPLY), true); - CloseGossipMenuFor(player); - return true; - } }; struct npc_unleashed_ballAI : public ScriptedAI diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp index 0d2780511cd..e13492eb4f3 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp @@ -183,7 +183,9 @@ class npc_announcer_toc10 : public CreatureScript struct npc_announcer_toc10AI : public ScriptedAI { - npc_announcer_toc10AI(Creature* creature) : ScriptedAI(creature) { } + npc_announcer_toc10AI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { } + + InstanceScript* instance; void Reset() override { @@ -195,91 +197,84 @@ class npc_announcer_toc10 : public CreatureScript } void AttackStart(Unit* /*who*/) override { } - }; - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - if (!instance) - return true; + bool GossipHello(Player* player) override + { + char const* _message = "We are ready!"; - char const* _message = "We are ready!"; + if (player->IsInCombat() || instance->IsEncounterInProgress()) + return true; - if (player->IsInCombat() || instance->IsEncounterInProgress()) - return true; - - uint8 i = 0; - for (; i < NUM_MESSAGES; ++i) - { - if ((!_GossipMessage[i].state && instance->GetBossState(_GossipMessage[i].encounter) != DONE) - || (_GossipMessage[i].state && instance->GetBossState(_GossipMessage[i].encounter) == DONE)) + uint8 i = 0; + for (; i < NUM_MESSAGES; ++i) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, _message, GOSSIP_SENDER_MAIN, _GossipMessage[i].id); - break; + if ((!_GossipMessage[i].state && instance->GetBossState(_GossipMessage[i].encounter) != DONE) + || (_GossipMessage[i].state && instance->GetBossState(_GossipMessage[i].encounter) == DONE)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, _message, GOSSIP_SENDER_MAIN, _GossipMessage[i].id); + break; + } } - } - - if (i >= NUM_MESSAGES) - return false; - SendGossipMenuFor(player, _GossipMessage[i].msgnum, creature->GetGUID()); - return true; - } + if (i >= NUM_MESSAGES) + return false; - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override - { - ClearGossipMenuFor(player); - CloseGossipMenuFor(player); - InstanceScript* instance = creature->GetInstanceScript(); - if (!instance) + SendGossipMenuFor(player, _GossipMessage[i].msgnum, me->GetGUID()); return true; - - if (instance->GetBossState(BOSS_BEASTS) != DONE) - { - instance->SetData(TYPE_EVENT, 110); - instance->SetData(TYPE_NORTHREND_BEASTS, NOT_STARTED); - instance->SetBossState(BOSS_BEASTS, NOT_STARTED); } - else if (instance->GetBossState(BOSS_JARAXXUS) != DONE) + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { - // if Jaraxxus is spawned, but the raid wiped - if (Creature* jaraxxus = ObjectAccessor::GetCreature(*player, instance->GetGuidData(NPC_JARAXXUS))) + ClearGossipMenuFor(player); + CloseGossipMenuFor(player); + + if (instance->GetBossState(BOSS_BEASTS) != DONE) { - jaraxxus->RemoveAurasDueToSpell(SPELL_JARAXXUS_CHAINS); - jaraxxus->RemoveUnitFlag(UnitFlags(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC)); - jaraxxus->SetReactState(REACT_DEFENSIVE); - jaraxxus->SetInCombatWithZone(); + instance->SetData(TYPE_EVENT, 110); + instance->SetData(TYPE_NORTHREND_BEASTS, NOT_STARTED); + instance->SetBossState(BOSS_BEASTS, NOT_STARTED); } - else + else if (instance->GetBossState(BOSS_JARAXXUS) != DONE) { - instance->SetData(TYPE_EVENT, 1010); - instance->SetBossState(BOSS_JARAXXUS, NOT_STARTED); + // if Jaraxxus is spawned, but the raid wiped + if (Creature* jaraxxus = ObjectAccessor::GetCreature(*player, instance->GetGuidData(NPC_JARAXXUS))) + { + jaraxxus->RemoveAurasDueToSpell(SPELL_JARAXXUS_CHAINS); + jaraxxus->RemoveUnitFlag(UnitFlags(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC)); + jaraxxus->SetReactState(REACT_DEFENSIVE); + jaraxxus->SetInCombatWithZone(); + } + else + { + instance->SetData(TYPE_EVENT, 1010); + instance->SetBossState(BOSS_JARAXXUS, NOT_STARTED); + } } + else if (instance->GetBossState(BOSS_CRUSADERS) != DONE) + { + if (player->GetTeam() == ALLIANCE) + instance->SetData(TYPE_EVENT, 3000); + else + instance->SetData(TYPE_EVENT, 3001); + instance->SetBossState(BOSS_CRUSADERS, NOT_STARTED); + } + else if (instance->GetBossState(BOSS_VALKIRIES) != DONE) + { + instance->SetData(TYPE_EVENT, 4000); + instance->SetBossState(BOSS_VALKIRIES, NOT_STARTED); + } + else if (instance->GetBossState(BOSS_LICH_KING) != DONE) + { + if (me->GetMap()->GetPlayers().getFirst()->GetSource()->GetTeam() == ALLIANCE) + instance->SetData(TYPE_EVENT, 4020); + else + instance->SetData(TYPE_EVENT, 4030); + instance->SetBossState(BOSS_LICH_KING, NOT_STARTED); + } + me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); + return true; } - else if (instance->GetBossState(BOSS_CRUSADERS) != DONE) - { - if (player->GetTeam() == ALLIANCE) - instance->SetData(TYPE_EVENT, 3000); - else - instance->SetData(TYPE_EVENT, 3001); - instance->SetBossState(BOSS_CRUSADERS, NOT_STARTED); - } - else if (instance->GetBossState(BOSS_VALKIRIES) != DONE) - { - instance->SetData(TYPE_EVENT, 4000); - instance->SetBossState(BOSS_VALKIRIES, NOT_STARTED); - } - else if (instance->GetBossState(BOSS_LICH_KING) != DONE) - { - if (creature->GetMap()->GetPlayers().getFirst()->GetSource()->GetTeam() == ALLIANCE) - instance->SetData(TYPE_EVENT, 4020); - else - instance->SetData(TYPE_EVENT, 4030); - instance->SetBossState(BOSS_LICH_KING, NOT_STARTED); - } - creature->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp index ab70b10ea18..33feba58a2f 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp @@ -95,7 +95,7 @@ public: Initialize(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == MENU_ID_SYLVANAS && gossipListId == GOSSIP_OPTION_ID) { @@ -105,6 +105,7 @@ public: events.Reset(); events.ScheduleEvent(EVENT_INTRO_1, 1000); } + return false; } void UpdateAI(uint32 diff) override @@ -189,7 +190,7 @@ public: Initialize(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == MENU_ID_JAINA && gossipListId == GOSSIP_OPTION_ID) { @@ -199,6 +200,7 @@ public: events.Reset(); events.ScheduleEvent(EVENT_INTRO_1, 1000); } + return false; } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index 6983e745e5e..21f7e7ca9c1 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -355,28 +355,27 @@ class npc_jaina_or_sylvanas_intro_hor : public CreatureScript public: npc_jaina_or_sylvanas_intro_hor() : CreatureScript("npc_jaina_or_sylvanas_intro_hor") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_jaina_or_sylvanas_intro_horAI : public ScriptedAI { - // override default gossip - if (InstanceScript* instance = creature->GetInstanceScript()) - if (instance->GetData(DATA_QUEL_DELAR_EVENT) == IN_PROGRESS || instance->GetData(DATA_QUEL_DELAR_EVENT) == SPECIAL) + npc_jaina_or_sylvanas_intro_horAI(Creature* creature) : ScriptedAI(creature) + { + _instance = me->GetInstanceScript(); + } + + bool GossipHello(Player* player) override + { + // override default gossip + if (_instance->GetData(DATA_QUEL_DELAR_EVENT) == IN_PROGRESS || _instance->GetData(DATA_QUEL_DELAR_EVENT) == SPECIAL) { ClearGossipMenuFor(player); return true; } - // load default gossip - return false; - } - - struct npc_jaina_or_sylvanas_intro_horAI : public ScriptedAI - { - npc_jaina_or_sylvanas_intro_horAI(Creature* creature) : ScriptedAI(creature) - { - _instance = me->GetInstanceScript(); + // load default gossip + return false; } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { ClearGossipMenuFor(player); @@ -395,6 +394,7 @@ class npc_jaina_or_sylvanas_intro_hor : public CreatureScript default: break; } + return false; } void Reset() override @@ -802,21 +802,6 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript public: npc_jaina_or_sylvanas_escape_hor() : CreatureScript("npc_jaina_or_sylvanas_escape_hor") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - // override default gossip - if (InstanceScript* instance = creature->GetInstanceScript()) - if (instance->GetBossState(DATA_THE_LICH_KING_ESCAPE) == DONE) - { - player->PrepareGossipMenu(creature, creature->GetEntry() == NPC_JAINA_ESCAPE ? GOSSIP_MENU_JAINA_FINAL : GOSSIP_MENU_SYLVANAS_FINAL, true); - player->SendPreparedGossip(creature); - return true; - } - - // load default gossip - return false; - } - struct npc_jaina_or_sylvanas_escape_horAI : public ScriptedAI { npc_jaina_or_sylvanas_escape_horAI(Creature* creature) : ScriptedAI(creature), @@ -870,7 +855,21 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript } } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipHello(Player* player) override + { + // override default gossip + if (_instance->GetBossState(DATA_THE_LICH_KING_ESCAPE) == DONE) + { + player->PrepareGossipMenu(me, me->GetEntry() == NPC_JAINA_ESCAPE ? GOSSIP_MENU_JAINA_FINAL : GOSSIP_MENU_SYLVANAS_FINAL, true); + player->SendPreparedGossip(me); + return true; + } + + // load default gossip + return false; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { ClearGossipMenuFor(player); @@ -884,6 +883,7 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript default: break; } + return false; } void DestroyIceWall() diff --git a/src/server/scripts/Northrend/Gundrak/gundrak.h b/src/server/scripts/Northrend/Gundrak/gundrak.h index d8a17646827..db08165451a 100644 --- a/src/server/scripts/Northrend/Gundrak/gundrak.h +++ b/src/server/scripts/Northrend/Gundrak/gundrak.h @@ -93,10 +93,10 @@ enum GDInstanceMisc TIMER_STATUE_ACTIVATION = 3500 }; -template<typename AI> -inline AI* GetGundrakAI(Creature* creature) +template<class AI, class T> +inline AI* GetGundrakAI(T* obj) { - return GetInstanceAI<AI>(creature, GundrakScriptName); + return GetInstanceAI<AI>(obj, GundrakScriptName); } #endif // GUNDRAK_H_ diff --git a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp index d6a06597478..224a6eb71d0 100644 --- a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp +++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp @@ -16,6 +16,7 @@ */ #include "ScriptMgr.h" +#include "GameObjectAI.h" #include "Creature.h" #include "EventMap.h" #include "GameObject.h" @@ -352,18 +353,25 @@ class go_gundrak_altar : public GameObjectScript public: go_gundrak_altar() : GameObjectScript("go_gundrak_altar") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_gundrak_altarAI : public GameObjectAI { - go->AddFlag(GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + go_gundrak_altarAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - if (InstanceScript* instance = go->GetInstanceScript()) + InstanceScript* instance; + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override { - instance->SetData(DATA_STATUE_ACTIVATE, go->GetEntry()); + me->AddFlag(GO_FLAG_NOT_SELECTABLE); + me->SetGoState(GO_STATE_ACTIVE); + + instance->SetData(DATA_STATUE_ACTIVATE, me->GetEntry()); return true; } + }; - return false; + GameObjectAI* GetAI(GameObject* go) const override + { + return GetGundrakAI<go_gundrak_altarAI>(go); } }; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index fbe2655cf84..d4976c75255 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -638,13 +638,14 @@ class npc_high_overlord_saurfang_icc : public CreatureScript _events.Reset(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override { if (menuId == GOSSIP_MENU_HIGH_OVERLORD_SAURFANG) { CloseGossipMenuFor(player); DoAction(ACTION_START_EVENT); } + return false; } void DoAction(int32 action) override @@ -834,13 +835,14 @@ class npc_muradin_bronzebeard_icc : public CreatureScript _events.Reset(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override { if (menuId == GOSSIP_MENU_MURADIN_BRONZEBEARD) { CloseGossipMenuFor(player); DoAction(ACTION_START_EVENT); } + return false; } void DoAction(int32 action) override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp index a9ffaeb5871..d40e5b8beb8 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp @@ -963,7 +963,7 @@ class npc_high_overlord_saurfang_igb : public CreatureScript } } - void sGossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) override { me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); me->GetTransport()->EnableMovement(true); @@ -973,6 +973,7 @@ class npc_high_overlord_saurfang_igb : public CreatureScript _events.ScheduleEvent(EVENT_INTRO_SUMMON_SKYBREAKER, 24600, 0, PHASE_INTRO); _events.ScheduleEvent(EVENT_INTRO_H_3, 29600, 0, PHASE_INTRO); _events.ScheduleEvent(EVENT_INTRO_H_4, 39200, 0, PHASE_INTRO); + return false; } void DamageTaken(Unit* , uint32& damage) override @@ -1231,7 +1232,7 @@ class npc_muradin_bronzebeard_igb : public CreatureScript } } - void sGossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) override { me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); me->GetTransport()->EnableMovement(true); @@ -1242,6 +1243,7 @@ class npc_muradin_bronzebeard_igb : public CreatureScript _events.ScheduleEvent(EVENT_INTRO_A_3, 33000, 0, PHASE_INTRO); _events.ScheduleEvent(EVENT_INTRO_A_4, 39000, 0, PHASE_INTRO); _events.ScheduleEvent(EVENT_INTRO_A_5, 45000, 0, PHASE_INTRO); + return false; } void DamageTaken(Unit* , uint32& damage) override @@ -1396,10 +1398,11 @@ class npc_zafod_boombox : public CreatureScript me->SetReactState(REACT_PASSIVE); } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { player->AddItem(ITEM_GOBLIN_ROCKET_PACK, 1); CloseGossipMenuFor(player); + return false; } void UpdateAI(uint32 /*diff*/) override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index 7f6b970e42e..f8a771a8e06 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -1206,7 +1206,7 @@ class npc_tirion_fordring_tft : public CreatureScript me->LoadEquipment(1); // remove glow on ashbringer } - void sGossipSelect(Player* /*player*/, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* /*player*/, uint32 menuId, uint32 gossipListId) override { if (me->GetCreatureTemplate()->GossipMenuId == menuId && !gossipListId) { @@ -1215,6 +1215,7 @@ class npc_tirion_fordring_tft : public CreatureScript me->SetWalk(true); me->GetMotionMaster()->MovePoint(POINT_TIRION_INTRO, TirionIntro); } + return false; } void JustReachedHome() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 51d80c54123..1e857d6164c 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -722,12 +722,22 @@ class npc_alchemist_adrianna : public CreatureScript public: npc_alchemist_adrianna() : CreatureScript("npc_alchemist_adrianna") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_alchemist_adriannaAI : public ScriptedAI { - if (!creature->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN) && !creature->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN25)) - if (player->HasAura(SPELL_ORANGE_BLIGHT_RESIDUE) && player->HasAura(SPELL_GREEN_BLIGHT_RESIDUE)) - creature->CastSpell(creature, SPELL_HARVEST_BLIGHT_SPECIMEN, false); - return false; + npc_alchemist_adriannaAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override + { + if (!me->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN) && !me->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN25)) + if (player->HasAura(SPELL_ORANGE_BLIGHT_RESIDUE) && player->HasAura(SPELL_GREEN_BLIGHT_RESIDUE)) + DoCastSelf(SPELL_HARVEST_BLIGHT_SPECIMEN, false); + return false; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_alchemist_adriannaAI(creature); } }; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp index 8bdc34748b8..c9a5b19e090 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp @@ -392,21 +392,21 @@ class go_sapphiron_birth : public GameObjectScript { go_sapphiron_birthAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - void OnStateChanged(uint32 state, Unit* who) override + void OnLootStateChanged(uint32 state, Unit* who) override { if (state == GO_ACTIVATED) { if (who) { - if (Creature* sapphiron = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_SAPPHIRON))) + if (Creature* sapphiron = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SAPPHIRON))) sapphiron->AI()->DoAction(ACTION_BIRTH); instance->SetData(DATA_HAD_SAPPHIRON_BIRTH, 1u); } } else if (state == GO_JUST_DEACTIVATED) { // prevent ourselves from going back to _READY and resetting the client anim - go->SetRespawnTime(0); - go->Delete(); + me->SetRespawnTime(0); + me->Delete(); } } diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp index 1a2847df0ac..c9c25237ab2 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp @@ -22,6 +22,7 @@ #include "ObjectAccessor.h" #include "Player.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "SpellScript.h" enum Spells @@ -220,22 +221,31 @@ class containment_sphere : public GameObjectScript public: containment_sphere() : GameObjectScript("containment_sphere") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct containment_sphereAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); + containment_sphereAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - Creature* pKeristrasza = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_KERISTRASZA)); - if (pKeristrasza && pKeristrasza->IsAlive()) + InstanceScript* instance; + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override { - // maybe these are hacks :( - go->AddFlag(GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + Creature* keristrasza = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KERISTRASZA)); + if (keristrasza && keristrasza->IsAlive()) + { + // maybe these are hacks :( + me->AddFlag(GO_FLAG_NOT_SELECTABLE); + me->SetGoState(GO_STATE_ACTIVE); - ENSURE_AI(boss_keristrasza::boss_keristraszaAI, pKeristrasza->AI())->CheckContainmentSpheres(true); + ENSURE_AI(boss_keristrasza::boss_keristraszaAI, keristrasza->AI())->CheckContainmentSpheres(true); + } + return true; } - return true; - } + }; + GameObjectAI* GetAI(GameObject* go) const override + { + return GetNexusAI<containment_sphereAI>(go); + } }; class spell_intense_cold : public SpellScriptLoader diff --git a/src/server/scripts/Northrend/Nexus/Nexus/nexus.h b/src/server/scripts/Northrend/Nexus/Nexus/nexus.h index f44f514ac5e..e6f8dcb06b0 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/nexus.h +++ b/src/server/scripts/Northrend/Nexus/Nexus/nexus.h @@ -65,8 +65,8 @@ enum NEXGameObjectIds GO_TELESTRAS_CONTAINMET_SPHERE = 188526 }; -template<typename AI> -inline AI* GetNexusAI(Creature* obj) +template <class AI, class T> +inline AI* GetNexusAI(T* obj) { return GetInstanceAI<AI>(obj, NexusScriptName); } diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp index 91043c1c2b8..29962252e21 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp @@ -145,7 +145,7 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript player->DestroyItemCount(itemId, 1, true, false); } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { switch (menuId) { @@ -160,7 +160,7 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript StoreEssence(player, ITEM_EMERALD_ESSENCE); break; } - return; + return false; case GOSSIP_MENU_ETERNOS: if (gossipListId >= 1 && gossipListId <= 3) { @@ -172,7 +172,7 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript StoreEssence(player, ITEM_AMBER_ESSENCE); break; } - return; + return false; case GOSSIP_MENU_BELGARISTRASZ: if (gossipListId <= 2) { @@ -184,11 +184,12 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript StoreEssence(player, ITEM_RUBY_ESSENCE); break; } - return; + return false; default: - return; + return false; } CloseGossipMenuFor(player); + return false; } void MovementInform(uint32 /*type*/, uint32 id) override diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp index 13f252d5add..0b3ac3fba57 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp @@ -271,29 +271,6 @@ class npc_brann_hos : public CreatureScript public: npc_brann_hos() : CreatureScript("npc_brann_hos") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1 || action == GOSSIP_ACTION_INFO_DEF+2) - { - CloseGossipMenuFor(player); - ENSURE_AI(npc_brann_hos::npc_brann_hosAI, creature->AI())->StartWP(); - } - - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_START, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, TEXT_ID_START, creature->GetGUID()); - - return true; - } - struct npc_brann_hosAI : public npc_escortAI { npc_brann_hosAI(Creature* creature) : npc_escortAI(creature) @@ -707,6 +684,30 @@ public: DoMeleeAttackIfReady(); } + + 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 || action == GOSSIP_ACTION_INFO_DEF + 2) + { + CloseGossipMenuFor(player); + StartWP(); + } + + return true; + } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_START, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, TEXT_ID_START, me->GetGUID()); + + return true; + } }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp index 6ebe372fe25..3f622a72c83 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp @@ -983,17 +983,17 @@ class go_celestial_planetarium_access : public GameObjectScript struct go_celestial_planetarium_accessAI : public GameObjectAI { - go_celestial_planetarium_accessAI(GameObject* go) : GameObjectAI(go) - { - } + go_celestial_planetarium_accessAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; bool GossipHello(Player* player, bool /*reportUse*/) override { - if (go->HasFlag(GO_FLAG_IN_USE)) + if (me->HasFlag(GO_FLAG_IN_USE)) return true; bool hasKey = true; - if (LockEntry const* lock = sLockStore.LookupEntry(go->GetGOInfo()->GetLockId())) + if (LockEntry const* lock = sLockStore.LookupEntry(me->GetGOInfo()->GetLockId())) { hasKey = false; for (uint32 i = 0; i < MAX_LOCK_CASE; ++i) @@ -1013,20 +1013,17 @@ class go_celestial_planetarium_access : public GameObjectScript return false; // Start Algalon event - go->AddFlag(GO_FLAG_IN_USE); + me->AddFlag(GO_FLAG_IN_USE); _events.ScheduleEvent(EVENT_DESPAWN_CONSOLE, 5000); - if (Creature* brann = go->SummonCreature(NPC_BRANN_BRONZBEARD_ALG, BrannIntroSpawnPos)) + if (Creature* brann = me->SummonCreature(NPC_BRANN_BRONZBEARD_ALG, BrannIntroSpawnPos)) brann->AI()->DoAction(ACTION_START_INTRO); - if (InstanceScript* instance = go->GetInstanceScript()) - { - instance->SetData(DATA_ALGALON_SUMMON_STATE, 1); - if (GameObject* sigil = ObjectAccessor::GetGameObject(*go, instance->GetGuidData(DATA_SIGILDOOR_01))) - sigil->SetGoState(GO_STATE_ACTIVE); + instance->SetData(DATA_ALGALON_SUMMON_STATE, 1); + if (GameObject* sigil = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_SIGILDOOR_01))) + sigil->SetGoState(GO_STATE_ACTIVE); - if (GameObject* sigil = ObjectAccessor::GetGameObject(*go, instance->GetGuidData(DATA_SIGILDOOR_02))) - sigil->SetGoState(GO_STATE_ACTIVE); - } + if (GameObject* sigil = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_SIGILDOOR_02))) + sigil->SetGoState(GO_STATE_ACTIVE); return false; } @@ -1043,7 +1040,7 @@ class go_celestial_planetarium_access : public GameObjectScript switch (eventId) { case EVENT_DESPAWN_CONSOLE: - go->Delete(); + me->Delete(); break; } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp index c301d287a97..09240de5649 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -23,6 +23,7 @@ */ #include "ScriptMgr.h" +#include "GameObjectAI.h" #include "CellImpl.h" #include "CombatAI.h" #include "GameObject.h" @@ -1185,7 +1186,7 @@ class npc_brann_bronzebeard_ulduar_intro : public CreatureScript _instance = creature->GetInstanceScript(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_MENU_BRANN_BRONZEBEARD && gossipListId == GOSSIP_OPTION_BRANN_BRONZEBEARD) { @@ -1194,6 +1195,7 @@ class npc_brann_bronzebeard_ulduar_intro : public CreatureScript if (Creature* loreKeeper = _instance->GetCreature(DATA_LORE_KEEPER_OF_NORGANNON)) loreKeeper->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); } + return false; } private: @@ -1238,7 +1240,7 @@ class npc_lorekeeper : public CreatureScript } } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_MENU_LORE_KEEPER && gossipListId == GOSSIP_OPTION_LORE_KEEPER) { @@ -1262,6 +1264,7 @@ class npc_lorekeeper : public CreatureScript } } } + return false; } private: @@ -1279,30 +1282,38 @@ class go_ulduar_tower : public GameObjectScript public: go_ulduar_tower() : GameObjectScript("go_ulduar_tower") { } - void OnDestroyed(GameObject* go, Player* /*player*/) override + struct go_ulduar_towerAI : public GameObjectAI + { + go_ulduar_towerAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + void Destroyed(Player* /*player*/, uint32 /*eventId*/) override + { + switch (me->GetEntry()) + { + case GO_TOWER_OF_STORMS: + instance->ProcessEvent(me, EVENT_TOWER_OF_STORM_DESTROYED); + break; + case GO_TOWER_OF_FLAMES: + instance->ProcessEvent(me, EVENT_TOWER_OF_FLAMES_DESTROYED); + break; + case GO_TOWER_OF_FROST: + instance->ProcessEvent(me, EVENT_TOWER_OF_FROST_DESTROYED); + break; + case GO_TOWER_OF_LIFE: + instance->ProcessEvent(me, EVENT_TOWER_OF_LIFE_DESTROYED); + break; + } + + if (Creature* trigger = me->FindNearestCreature(NPC_ULDUAR_GAUNTLET_GENERATOR, 15.0f, true)) + trigger->DisappearAndDie(); + } + }; + + GameObjectAI* GetAI(GameObject* go) const override { - InstanceScript* instance = go->GetInstanceScript(); - if (!instance) - return; - - switch (go->GetEntry()) - { - case GO_TOWER_OF_STORMS: - instance->ProcessEvent(go, EVENT_TOWER_OF_STORM_DESTROYED); - break; - case GO_TOWER_OF_FLAMES: - instance->ProcessEvent(go, EVENT_TOWER_OF_FLAMES_DESTROYED); - break; - case GO_TOWER_OF_FROST: - instance->ProcessEvent(go, EVENT_TOWER_OF_FROST_DESTROYED); - break; - case GO_TOWER_OF_LIFE: - instance->ProcessEvent(go, EVENT_TOWER_OF_LIFE_DESTROYED); - break; - } - - if (Creature* trigger = go->FindNearestCreature(NPC_ULDUAR_GAUNTLET_GENERATOR, 15.0f, true)) - trigger->DisappearAndDie(); + return GetUlduarAI<go_ulduar_towerAI>(go); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp index 940c5b4f52f..20fee82c3b5 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp @@ -25,6 +25,7 @@ #include "SpellAuraEffects.h" #include "SpellScript.h" #include "TemporarySummon.h" +#include "GameObjectAI.h" #include "ulduar.h" #include "Vehicle.h" @@ -1648,20 +1649,29 @@ class go_mimiron_hardmode_button : public GameObjectScript public: go_mimiron_hardmode_button() : GameObjectScript("go_mimiron_hardmode_button") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_mimiron_hardmode_buttonAI : public GameObjectAI { - if (go->HasFlag(GO_FLAG_NOT_SELECTABLE)) - return true; + go_mimiron_hardmode_buttonAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + if (me->HasFlag(GO_FLAG_NOT_SELECTABLE)) + return true; - InstanceScript* instance = go->GetInstanceScript(); - if (!instance) - return false; + if (Creature* computer = instance->GetCreature(DATA_COMPUTER)) + computer->AI()->DoAction(DO_ACTIVATE_COMPUTER); - if (Creature* computer = instance->GetCreature(DATA_COMPUTER)) - computer->AI()->DoAction(DO_ACTIVATE_COMPUTER); - go->SetGoState(GO_STATE_ACTIVE); - go->AddFlag(GO_FLAG_NOT_SELECTABLE); - return true; + me->SetGoState(GO_STATE_ACTIVE); + me->AddFlag(GO_FLAG_NOT_SELECTABLE); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetUlduarAI<go_mimiron_hardmode_buttonAI>(go); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index 3f56f4523cc..f6fa82bed61 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -25,6 +25,7 @@ #include "ScriptedCreature.h" #include "ScriptedGossip.h" #include "SpellInfo.h" +#include "GameObjectAI.h" #include "SpellScript.h" #include "TemporarySummon.h" #include "ulduar.h" @@ -320,12 +321,23 @@ class go_razorscale_harpoon : public GameObjectScript public: go_razorscale_harpoon() : GameObjectScript("go_razorscale_harpoon") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_razorscale_harpoonAI : public GameObjectAI { - if (InstanceScript* instance = go->GetInstanceScript()) + go_razorscale_harpoonAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { if (instance->GetCreature(BOSS_RAZORSCALE)) - go->AddFlag(GO_FLAG_NOT_SELECTABLE); - return false; + me->AddFlag(GO_FLAG_NOT_SELECTABLE); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetUlduarAI<go_razorscale_harpoonAI>(go); } }; @@ -738,34 +750,37 @@ class npc_expedition_commander : public CreatureScript else AttackStartTimer -= Diff; } - }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF: - CloseGossipMenuFor(player); - ENSURE_AI(npc_expedition_commanderAI, creature->AI())->Phase = 1; - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF: + CloseGossipMenuFor(player); + Phase = 1; + break; + } + return true; } - return true; - } - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - if (instance && instance->GetBossState(BOSS_RAZORSCALE) == NOT_STARTED) + bool GossipHello(Player* player) override { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, 13853, creature->GetGUID()); + if (instance->GetBossState(BOSS_RAZORSCALE) == NOT_STARTED) + { + player->PrepareGossipMenu(me); + + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, 13853, me->GetGUID()); + } + else + SendGossipMenuFor(player, 13910, me->GetGUID()); + + return true; } - else - SendGossipMenuFor(player, 13910, creature->GetGUID()); - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp index e36e32fd882..2eb507db98c 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -1532,10 +1532,10 @@ class npc_observation_ring_keeper : public CreatureScript DoCast(SPELL_KEEPER_ACTIVE); } - void sGossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override { if (menuId != 10333) - return; + return false; me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); me->DespawnOrUnsummon(2000); @@ -1558,6 +1558,7 @@ class npc_observation_ring_keeper : public CreatureScript me->SummonCreature(NPC_MIMIRON_YS, YSKeepersPos[3]); break; } + return false; } void UpdateAI(uint32 /*diff*/) override { } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp index 2fcea70cf3c..2eefd7e4b22 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp @@ -22,6 +22,7 @@ #include "ObjectAccessor.h" #include "ScriptedCreature.h" #include "TemporarySummon.h" +#include "GameObjectAI.h" #include "utgarde_pinnacle.h" #include "SpellScript.h" #include "SpellAuraEffects.h" @@ -560,19 +561,30 @@ class go_palehoof_sphere : public GameObjectScript public: go_palehoof_sphere() : GameObjectScript("go_palehoof_sphere") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_palehoof_sphereAI : public GameObjectAI { - if (InstanceScript* instance = go->GetInstanceScript()) + go_palehoof_sphereAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override { if (Creature* palehoof = instance->GetCreature(DATA_GORTOK_PALEHOOF)) + { if (palehoof->IsAlive() && instance->GetBossState(DATA_GORTOK_PALEHOOF) != DONE) { - go->SetFlags(GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + me->SetFlags(GO_FLAG_NOT_SELECTABLE); + me->SetGoState(GO_STATE_ACTIVE); palehoof->AI()->DoAction(ACTION_START_ENCOUNTER); } + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetUtgardePinnacleAI<go_palehoof_sphereAI>(go); } }; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h index 3013ac1b70c..8fbe9038e66 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h @@ -97,10 +97,10 @@ enum UPGameObjectIds GO_KING_YMIRON_DOOR = 192174 }; -template<typename AI> -inline AI* GetUtgardePinnacleAI(Creature* creature) +template<class AI, class T> +inline AI* GetUtgardePinnacleAI(T* obj) { - return GetInstanceAI<AI>(creature, UPScriptName); + return GetInstanceAI<AI>(obj, UPScriptName); } #endif // UTGARDE_PINNACLE_H_ diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index 05ea5bc0024..bd5e68d1fbb 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -22,6 +22,7 @@ #include "Map.h" #include "MotionMaster.h" #include "Player.h" +#include "GameObjectAI.h" #include "ScriptedGossip.h" #include "ScriptedEscortAI.h" #include "SpellAuraEffects.h" @@ -316,30 +317,6 @@ class npc_sinclari_vh : public CreatureScript public: npc_sinclari_vh() : CreatureScript("npc_sinclari_vh") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - // override default gossip - if (InstanceScript* instance = creature->GetInstanceScript()) - { - switch (instance->GetData(DATA_MAIN_EVENT_STATE)) - { - case IN_PROGRESS: - player->PrepareGossipMenu(creature, GOSSIP_MENU_SEND_ME_IN, true); - player->SendPreparedGossip(creature); - return true; - case DONE: - return true; // NYI - case NOT_STARTED: - case FAIL: - default: - break; - } - } - - // load default gossip - return false; - } - struct npc_sinclariAI : public ScriptedAI { npc_sinclariAI(Creature* creature) : ScriptedAI(creature), _summons(creature) @@ -368,7 +345,28 @@ class npc_sinclari_vh : public CreatureScript } } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipHello(Player* player) override + { + // override default gossip + switch (_instance->GetData(DATA_MAIN_EVENT_STATE)) + { + case IN_PROGRESS: + player->PrepareGossipMenu(me, GOSSIP_MENU_SEND_ME_IN, true); + player->SendPreparedGossip(me); + return true; + case DONE: + return true; // NYI + case NOT_STARTED: + case FAIL: + default: + break; + } + + // load default gossip + return false; + } + + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_MENU_START_ENCOUNTER && gossipListId == 0) { @@ -382,6 +380,7 @@ class npc_sinclari_vh : public CreatureScript me->CastSpell(player, SPELL_TELEPORT_PLAYER, true); player->PlayerTalkClass->SendCloseGossip(); } + return false; } void DoAction(int32 actionId) override @@ -1301,10 +1300,20 @@ class go_activation_crystal : public GameObjectScript public: go_activation_crystal() : GameObjectScript("go_activation_crystal") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_activation_crystalAI : public GameObjectAI + { + go_activation_crystalAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + player->CastSpell(player, SPELL_CRYSTAL_ACTIVATION, true); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override { - player->CastSpell(player, SPELL_CRYSTAL_ACTIVATION, true); - return false; + return GetVioletHoldAI<go_activation_crystalAI>(go); } }; diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.h b/src/server/scripts/Northrend/VioletHold/violet_hold.h index 35dea9e8029..5f0b55490c8 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.h +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.h @@ -155,10 +155,10 @@ enum VHInstanceMisc POINT_INTRO = 1 }; -template<typename AI> -inline AI* GetVioletHoldAI(Creature* creature) +template<class AI, class T> +inline AI* GetVioletHoldAI(T* obj) { - return GetInstanceAI<AI>(creature, VioletHoldScriptName); + return GetInstanceAI<AI>(obj, VioletHoldScriptName); } #endif // VIOLET_HOLD_H_ diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index 1dcc2de11c2..b14038431ad 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -245,31 +245,40 @@ class npc_corastrasza : public CreatureScript public: npc_corastrasza() : CreatureScript("npc_corastrasza") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_corastraszaAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_corastraszaAI(Creature* creature) : ScriptedAI(creature) { } - if (player->GetQuestStatus(QUEST_ACES_HIGH) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_ACES_HIGH_DAILY) == QUEST_STATUS_INCOMPLETE) //It's the same dragon for both quests. - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_C_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } + if (player->GetQuestStatus(QUEST_ACES_HIGH) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_ACES_HIGH_DAILY) == QUEST_STATUS_INCOMPLETE) //It's the same dragon for both quests. + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_C_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } - player->CastSpell(player, SPELL_SUMMON_WYRMREST_SKYTALON, true); - player->CastSpell(player, SPELL_WYRMREST_SKYTALON_RIDE_PERIODIC, 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); + player->CastSpell(player, SPELL_SUMMON_WYRMREST_SKYTALON, true); + player->CastSpell(player, SPELL_WYRMREST_SKYTALON_RIDE_PERIODIC, true); + } + return true; } + }; - return true; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_corastraszaAI(creature); } }; @@ -291,27 +300,38 @@ class npc_iruk : public CreatureScript public: npc_iruk() : CreatureScript("npc_iruk") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_irukAI : public ScriptedAI { - if (player->GetQuestStatus(QUEST_SPIRITS_WATCH_OVER_US) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_I, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + npc_irukAI(Creature* creature) : ScriptedAI(creature) { } - player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXT_I, creature->GetGUID()); - return true; - } + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(QUEST_SPIRITS_WATCH_OVER_US) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_I, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXT_I, me->GetGUID()); + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF+1: - player->CastSpell(player, SPELL_CREATURE_TOTEM_OF_ISSLIRUK, true); - CloseGossipMenuFor(player); - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + player->CastSpell(player, SPELL_CREATURE_TOTEM_OF_ISSLIRUK, true); + CloseGossipMenuFor(player); + break; + } + return true; } - return true; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_irukAI(creature); } }; @@ -644,41 +664,37 @@ public: if (!UpdateVictim()) return; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_lurgglbrAI(creature); - } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCAPE_WINTERFIN_CAVERNS) + void QuestAccept(Player* player, Quest const* quest) override { - if (GameObject* go = creature->FindNearestGameObject(GO_CAGE, 5.0f)) + if (quest->GetQuestId() == QUEST_ESCAPE_WINTERFIN_CAVERNS) { - go->SetRespawnTime(0); - go->SetGoType(GAMEOBJECT_TYPE_BUTTON); - go->UseDoorOrButton(20); - } + if (GameObject* go = me->FindNearestGameObject(GO_CAGE, 5.0f)) + { + go->SetRespawnTime(0); + go->SetGoType(GAMEOBJECT_TYPE_BUTTON); + go->UseDoorOrButton(20); + } - if (npc_escortAI* pEscortAI = CAST_AI(npc_lurgglbr::npc_lurgglbrAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); + Start(true, false, player->GetGUID()); - switch (player->GetTeam()) - { - case ALLIANCE: - creature->SetFaction(FACTION_ESCORTEE_A); - break; - default: - case HORDE: - creature->SetFaction(FACTION_ESCORTEE_H); - break; + switch (player->GetTeam()) + { + case ALLIANCE: + me->SetFaction(FACTION_ESCORTEE_A); + break; + default: + case HORDE: + me->SetFaction(FACTION_ESCORTEE_H); + break; + } } - - return true; } - return false; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_lurgglbrAI(creature); } }; @@ -1047,33 +1063,33 @@ public: if (Creature* arthas = ObjectAccessor::GetCreature(*me, arthasGUID)) arthas->RemoveFromWorld(); } - }; - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - if (player->GetQuestStatus(QUEST_LAST_RITES) == QUEST_STATUS_INCOMPLETE && creature->GetAreaId() == 4128) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_T, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + if (player->GetQuestStatus(QUEST_LAST_RITES) == QUEST_STATUS_INCOMPLETE && me->GetAreaId() == 4128) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_T, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - return true; - } + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF+1: - ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); - ENSURE_AI(npc_escortAI, (creature->AI()))->SetMaxPlayerDistance(200.0f); - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + Start(true, false, player->GetGUID()); + SetMaxPlayerDistance(200.0f); + break; + } + return true; } - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { @@ -1622,26 +1638,6 @@ class npc_mootoo_the_younger : public CreatureScript public: npc_mootoo_the_younger() : CreatureScript("npc_mootoo_the_younger") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCAPING_THE_MIST) - { - switch (player->GetTeam()) - { - case ALLIANCE: - creature->SetFaction(FACTION_ESCORTEE_A); - break; - case HORDE: - creature->SetFaction(FACTION_ESCORTEE_H); - break; - } - creature->SetStandState(UNIT_STAND_STATE_STAND); - creature->AI()->Talk(SAY_1, player); - ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); - } - return true; - } - struct npc_mootoo_the_youngerAI : public npc_escortAI { npc_mootoo_the_youngerAI(Creature* creature) : npc_escortAI(creature) { } @@ -1686,6 +1682,25 @@ public: break; } } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_ESCAPING_THE_MIST) + { + switch (player->GetTeam()) + { + case ALLIANCE: + me->SetFaction(FACTION_ESCORTEE_A); + break; + case HORDE: + me->SetFaction(FACTION_ESCORTEE_H); + break; + } + me->SetStandState(UNIT_STAND_STATE_STAND); + Talk(SAY_1, player); + Start(true, false, player->GetGUID()); + } + } }; CreatureAI* GetAI(Creature* creature) const override @@ -1712,17 +1727,6 @@ class npc_bonker_togglevolt : public CreatureScript public: npc_bonker_togglevolt() : CreatureScript("npc_bonker_togglevolt") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_GET_ME_OUTA_HERE) - { - creature->SetStandState(UNIT_STAND_STATE_STAND); - creature->AI()->Talk(SAY_BONKER_2, player); - ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, true, player->GetGUID()); - } - return true; - } - struct npc_bonker_togglevoltAI : public npc_escortAI { npc_bonker_togglevoltAI(Creature* creature) : npc_escortAI(creature) @@ -1776,6 +1780,16 @@ public: break; } } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_GET_ME_OUTA_HERE) + { + me->SetStandState(UNIT_STAND_STATE_STAND); + Talk(SAY_BONKER_2, player); + Start(true, true, player->GetGUID()); + } + } }; CreatureAI* GetAI(Creature* creature) const override @@ -2210,11 +2224,6 @@ public: uiEventPhase = 1; } - void SetGUID(ObjectGuid uiGuid, int32 /*iId*/) override - { - uiPlayerGUID = uiGuid; - } - void AttackPlayer() { me->SetFaction(14); @@ -2281,65 +2290,65 @@ public: DoMeleeAttackIfReady(); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_hidden_cultistAI(creature); - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - uint32 uiGossipText = 0; - const char* charGossipItem; - switch (creature->GetEntry()) + bool GossipHello(Player* player) override { - case NPC_TOM_HEGGER: - uiGossipText = GOSSIP_TEXT_TOM_HEGGER; - charGossipItem = GOSSIP_ITEM_TOM_HEGGER; - break; - case NPC_SALTY_JOHN_THORPE: - uiGossipText = GOSSIP_TEXT_SALTY_JOHN_THORPE; - charGossipItem = GOSSIP_ITEM_SALTY_JOHN_THORPE; - break; - case NPC_GUARD_MITCHELLS: - uiGossipText = GOSSIP_TEXT_GUARD_MITCHELSS; - charGossipItem = GOSSIP_ITEM_GUARD_MITCHELLS; - break; - default: - charGossipItem = ""; - return false; - } + uint32 uiGossipText = 0; + const char* charGossipItem; - if (player->HasAura(SPELL_RIGHTEOUS_VISION) && player->GetQuestStatus(QUEST_THE_HUNT_IS_ON) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, charGossipItem, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + switch (me->GetEntry()) + { + case NPC_TOM_HEGGER: + uiGossipText = GOSSIP_TEXT_TOM_HEGGER; + charGossipItem = GOSSIP_ITEM_TOM_HEGGER; + break; + case NPC_SALTY_JOHN_THORPE: + uiGossipText = GOSSIP_TEXT_SALTY_JOHN_THORPE; + charGossipItem = GOSSIP_ITEM_SALTY_JOHN_THORPE; + break; + case NPC_GUARD_MITCHELLS: + uiGossipText = GOSSIP_TEXT_GUARD_MITCHELSS; + charGossipItem = GOSSIP_ITEM_GUARD_MITCHELLS; + break; + default: + charGossipItem = ""; + return false; + } - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + if (player->HasAura(SPELL_RIGHTEOUS_VISION) && player->GetQuestStatus(QUEST_THE_HUNT_IS_ON) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, charGossipItem, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, uiGossipText, creature->GetGUID()); + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - return true; - } + SendGossipMenuFor(player, uiGossipText, me->GetGUID()); - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); + return true; + } - if (action == GOSSIP_ACTION_INFO_DEF+1) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - CloseGossipMenuFor(player); - creature->AI()->SetGUID(player->GetGUID()); - creature->AI()->DoAction(1); - } + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + uiPlayerGUID = player->GetGUID(); + DoAction(1); + } - return true; - } + if (action == GOSSIP_ACTION_TRADE) + player->GetSession()->SendListInventory(me->GetGUID()); + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_hidden_cultistAI(creature); + } }; enum WindsoulTotemAura diff --git a/src/server/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp index 05cb11fc414..5c7df86b6a4 100644 --- a/src/server/scripts/Northrend/zone_dragonblight.cpp +++ b/src/server/scripts/Northrend/zone_dragonblight.cpp @@ -494,33 +494,6 @@ class npc_wyrmrest_defender : public CreatureScript public: npc_wyrmrest_defender() : CreatureScript("npc_wyrmrest_defender") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_DEFENDING_WYRMREST_TEMPLE) == QUEST_STATUS_INCOMPLETE) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, GOSSIP_TEXTID_DEF1, creature->GetGUID()); - } - else - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - SendGossipMenuFor(player, GOSSIP_TEXTID_DEF2, creature->GetGUID()); - // Makes player cast trigger spell for 49207 on self - player->CastSpell(player, SPELL_CHARACTER_SCRIPT, true); - // The gossip should not auto close - } - - return true; - } - struct npc_wyrmrest_defenderAI : public VehicleAI { npc_wyrmrest_defenderAI(Creature* creature) : VehicleAI(creature) @@ -592,6 +565,34 @@ class npc_wyrmrest_defender : public CreatureScript break; } } + + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(QUEST_DEFENDING_WYRMREST_TEMPLE) == QUEST_STATUS_INCOMPLETE) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_TEXTID_DEF1, me->GetGUID()); + } + else + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + + return 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) + { + SendGossipMenuFor(player, GOSSIP_TEXTID_DEF2, me->GetGUID()); + // Makes player cast trigger spell for 49207 on self + player->CastSpell(player, SPELL_CHARACTER_SCRIPT, true); + // The gossip should not auto close + } + + return true; + } }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp index a9495310e89..d5c06855cff 100644 --- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp +++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp @@ -183,25 +183,23 @@ public: _RavenousworgGUID.Clear(); } + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_PERILOUS_ADVENTURE) + { + Talk(SAY_QUEST_ACCEPT); + if (Creature* Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 180.0f)) + Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + + Start(true, false, player->GetGUID()); + } + } + private: ObjectGuid _RavenousworgGUID; ObjectGuid _mrfloppyGUID; }; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_PERILOUS_ADVENTURE) - { - creature->AI()->Talk(SAY_QUEST_ACCEPT); - if (Creature* Mrfloppy = GetClosestCreatureWithEntry(creature, NPC_MRFLOPPY, 180.0f)) - Mrfloppy->GetMotionMaster()->MoveFollow(creature, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_emily::npc_emilyAI, (creature->AI()))) - pEscortAI->Start(true, false, player->GetGUID()); - } - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return new npc_emilyAI(creature); @@ -761,9 +759,10 @@ public: } } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { DoCast(player, SPELL_SUMMON_ASHWOOD_BRAND); + return false; } private: diff --git a/src/server/scripts/Northrend/zone_howling_fjord.cpp b/src/server/scripts/Northrend/zone_howling_fjord.cpp index 9f49df63596..cab2d03b29c 100644 --- a/src/server/scripts/Northrend/zone_howling_fjord.cpp +++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp @@ -81,15 +81,6 @@ class npc_apothecary_hanes : public CreatureScript public: npc_apothecary_hanes() : CreatureScript("npc_apothecary_hanes") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_TRAIL_OF_FIRE) - { - ENSURE_AI(npc_Apothecary_HanesAI, (creature->AI()))->StartEscort(player); - } - return true; - } - struct npc_Apothecary_HanesAI : public npc_escortAI { npc_Apothecary_HanesAI(Creature* creature) : npc_escortAI(creature) @@ -253,6 +244,12 @@ public: break; } } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_TRAIL_OF_FIRE) + StartEscort(player); + } }; CreatureAI* GetAI(Creature* creature) const override @@ -333,50 +330,63 @@ class npc_razael_and_lyana : public CreatureScript public: npc_razael_and_lyana() : CreatureScript("npc_razael_and_lyana") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_razael_and_lyanaAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_razael_and_lyanaAI(Creature* creature) : ScriptedAI(creature) { } - if (player->GetQuestStatus(QUEST_REPORTS_FROM_THE_FIELD) == QUEST_STATUS_INCOMPLETE) - switch (creature->GetEntry()) + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (player->GetQuestStatus(QUEST_REPORTS_FROM_THE_FIELD) == QUEST_STATUS_INCOMPLETE) { - case NPC_RAZAEL: - if (!player->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_RAZAEL)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_RAZAEL_REPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, GOSSIP_TEXTID_RAZAEL1, creature->GetGUID()); - return true; - } - break; - case NPC_LYANA: - if (!player->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_LYANA)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LYANA_REPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - SendGossipMenuFor(player, GOSSIP_TEXTID_LYANA1, creature->GetGUID()); - return true; - } - break; + switch (me->GetEntry()) + { + case NPC_RAZAEL: + if (!player->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_RAZAEL)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_RAZAEL_REPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_TEXTID_RAZAEL1, me->GetGUID()); + return true; + } + break; + case NPC_LYANA: + if (!player->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_LYANA)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LYANA_REPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_TEXTID_LYANA1, me->GetGUID()); + return true; + } + break; + } } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF + 1: - SendGossipMenuFor(player, GOSSIP_TEXTID_RAZAEL2, creature->GetGUID()); - player->TalkedToCreature(NPC_RAZAEL, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - SendGossipMenuFor(player, GOSSIP_TEXTID_LYANA2, creature->GetGUID()); - player->TalkedToCreature(NPC_LYANA, creature->GetGUID()); - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + SendGossipMenuFor(player, GOSSIP_TEXTID_RAZAEL2, me->GetGUID()); + player->TalkedToCreature(NPC_RAZAEL, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + SendGossipMenuFor(player, GOSSIP_TEXTID_LYANA2, me->GetGUID()); + player->TalkedToCreature(NPC_LYANA, me->GetGUID()); + break; + } + return true; } - return true; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_razael_and_lyanaAI(creature); } }; @@ -406,17 +416,6 @@ class npc_daegarn : public CreatureScript public: npc_daegarn() : CreatureScript("npc_daegarn") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_DEFEAT_AT_RING) - { - if (npc_daegarnAI* pDaegarnAI = CAST_AI(npc_daegarn::npc_daegarnAI, creature->AI())) - pDaegarnAI->StartEvent(player->GetGUID()); - } - - return true; - } - /// @todo make prisoners help (unclear if summoned or using npc's from surrounding cages (summon inside small cages?)) struct npc_daegarnAI : public ScriptedAI { @@ -485,6 +484,12 @@ public: SummonGladiator(uiEntry); } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_DEFEAT_AT_RING) + StartEvent(player->GetGUID()); + } }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp index 1c226c23528..acbbb2bc802 100644 --- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp +++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp @@ -66,40 +66,51 @@ class npc_vekjik : public CreatureScript public: npc_vekjik() : CreatureScript("npc_vekjik") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_vekjikAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_vekjikAI(Creature* creature) : ScriptedAI(creature) { } - if (player->GetQuestStatus(QUEST_MAKING_PEACE) == QUEST_STATUS_INCOMPLETE) + bool GossipHello(Player* player) override { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, GOSSIP_TEXTID_VEKJIK1, creature->GetGUID()); + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (player->GetQuestStatus(QUEST_MAKING_PEACE) == QUEST_STATUS_INCOMPLETE) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_TEXTID_VEKJIK1, me->GetGUID()); + return true; + } + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); return true; } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_TEXTID_VEKJIK2, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - CloseGossipMenuFor(player); - creature->AI()->Talk(SAY_TEXTID_VEKJIK1, player); - player->AreaExploredOrEventHappens(QUEST_MAKING_PEACE); - creature->CastSpell(player, SPELL_FREANZYHEARTS_FURY, false); - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_TEXTID_VEKJIK2, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + CloseGossipMenuFor(player); + Talk(SAY_TEXTID_VEKJIK1, player); + player->AreaExploredOrEventHappens(QUEST_MAKING_PEACE); + DoCast(player, SPELL_FREANZYHEARTS_FURY, false); + break; + } + + return true; } + }; - return true; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_vekjikAI(creature); } }; @@ -127,37 +138,48 @@ class npc_avatar_of_freya : public CreatureScript public: npc_avatar_of_freya() : CreatureScript("npc_avatar_of_freya") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_avatar_of_freyaAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_avatar_of_freyaAI(Creature* creature) : ScriptedAI(creature) { } - if (player->GetQuestStatus(QUEST_FREYA_PACT) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR1, creature->GetGUID()); - return true; - } + if (player->GetQuestStatus(QUEST_FREYA_PACT) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR1, me->GetGUID()); + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR2, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR3, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->CastSpell(player, SPELL_FREYA_CONVERSATION, true); - CloseGossipMenuFor(player); - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR2, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR3, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + player->CastSpell(player, SPELL_FREYA_CONVERSATION, true); + CloseGossipMenuFor(player); + break; + } + return true; } - return true; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_avatar_of_freyaAI(creature); } }; @@ -312,27 +334,23 @@ public: m_uiChatTimer -= uiDiff; } } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_engineer_heliceAI(creature); - } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_DISASTER) + void QuestAccept(Player* player, Quest const* quest) override { - if (npc_engineer_heliceAI* pEscortAI = CAST_AI(npc_engineer_helice::npc_engineer_heliceAI, creature->AI())) + if (quest->GetQuestId() == QUEST_DISASTER) { - creature->GetMotionMaster()->MoveJumpTo(0, 0.4f, 0.4f); - creature->SetFaction(113); + me->GetMotionMaster()->MoveJumpTo(0, 0.4f, 0.4f); + me->SetFaction(113); - pEscortAI->Start(false, false, player->GetGUID()); - creature->AI()->Talk(SAY_WP_1); + Start(false, false, player->GetGUID()); + Talk(SAY_WP_1); } } - return true; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_engineer_heliceAI(creature); } }; @@ -567,55 +585,56 @@ public: { Talk(SAY_DWARF_OUCH); } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_adventurous_dwarfAI(creature); - } + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(QUEST_12634) != QUEST_STATUS_INCOMPLETE) + return false; - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_12634) != QUEST_STATUS_INCOMPLETE) - return false; + if (player->GetItemCount(ITEM_ORANGE) < 1) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_ORANGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - if (player->GetItemCount(ITEM_ORANGE) < 1) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_ORANGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + if (player->GetItemCount(ITEM_BANANAS) < 2) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_BANANAS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - if (player->GetItemCount(ITEM_BANANAS) < 2) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_BANANAS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + if (player->GetItemCount(ITEM_PAPAYA) < 1) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_PAPAYA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - if (player->GetItemCount(ITEM_PAPAYA) < 1) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_PAPAYA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + player->PlayerTalkClass->SendGossipMenu(GOSSIP_MENU_DWARF, me->GetGUID()); + return true; + } - player->PlayerTalkClass->SendGossipMenu(GOSSIP_MENU_DWARF, creature->GetGUID()); - return true; - } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + uint32 spellId = 0; - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - uint32 spellId = 0; + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + spellId = SPELL_ADD_ORANGE; + break; + case GOSSIP_ACTION_INFO_DEF + 2: + spellId = SPELL_ADD_BANANAS; + break; + case GOSSIP_ACTION_INFO_DEF + 3: + spellId = SPELL_ADD_PAPAYA; + break; + } - switch (action) - { - case GOSSIP_ACTION_INFO_DEF + 1: - spellId = SPELL_ADD_ORANGE; - break; - case GOSSIP_ACTION_INFO_DEF + 2: - spellId = SPELL_ADD_BANANAS; - break; - case GOSSIP_ACTION_INFO_DEF + 3: - spellId = SPELL_ADD_PAPAYA; - break; - } + if (spellId) + player->CastSpell(player, spellId, true); - if (spellId) - player->CastSpell(player, spellId, true); + Talk(SAY_DWARF_HELP); + me->DespawnOrUnsummon(); + return true; + } + }; - creature->AI()->Talk(SAY_DWARF_HELP); - creature->DespawnOrUnsummon(); - return true; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_adventurous_dwarfAI(creature); } }; diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp index 6b3cc445c9d..117c21d197a 100644 --- a/src/server/scripts/Northrend/zone_storm_peaks.cpp +++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp @@ -80,7 +80,7 @@ public: player->FailQuest(QUEST_BITTER_DEPARTURE); } - void UpdateAI(uint32 uiDiff) override + void UpdateAI(uint32 uiDiff) override { npc_escortAI::UpdateAI(uiDiff); if (!UpdateVictim()) @@ -88,7 +88,7 @@ public: DoMeleeAttackIfReady(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_ID && gossipListId == GOSSIP_OPTION_ID) { @@ -96,6 +96,13 @@ public: me->SetFaction(113); Start(true, true, player->GetGUID()); } + return false; + } + + void QuestAccept(Player* /*player*/, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_BITTER_DEPARTURE) + Talk(SAY_QUEST_ACCEPT); } }; @@ -103,14 +110,6 @@ public: { return new npc_injured_goblinAI(creature); } - - bool OnQuestAccept(Player* /*player*/, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_BITTER_DEPARTURE) - creature->AI()->Talk(SAY_QUEST_ACCEPT); - - return false; - } }; /*###### @@ -129,38 +128,49 @@ class npc_roxi_ramrocket : public CreatureScript public: npc_roxi_ramrocket() : CreatureScript("npc_roxi_ramrocket") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_roxi_ramrocketAI : public ScriptedAI { - //Quest Menu - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_roxi_ramrocketAI(Creature* creature) : ScriptedAI(creature) { } - //Trainer Menu - if (creature->IsTrainer()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + bool GossipHello(Player* player) override + { + //Quest Menu + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - //Vendor Menu - if (creature->IsVendor()) - if (player->HasSpell(SPELL_MECHANO_HOG) || player->HasSpell(SPELL_MEKGINEERS_CHOPPER)) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + //Trainer Menu + if (me->IsTrainer()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } + //Vendor Menu + if (me->IsVendor()) + if (player->HasSpell(SPELL_MECHANO_HOG) || player->HasSpell(SPELL_MEKGINEERS_CHOPPER)) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_TRAIN: - player->GetSession()->SendTrainerList(creature, TRAINER_ID_ROXI_RAMROCKET); - break; - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_TRAIN: + player->GetSession()->SendTrainerList(me, TRAINER_ID_ROXI_RAMROCKET); + break; + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(me->GetGUID()); + break; + } + return true; } - return true; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_roxi_ramrocketAI(creature); } }; @@ -481,11 +491,12 @@ public: objectCounter = 0; } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { CloseGossipMenuFor(player); playerGUID = player->GetGUID(); events.ScheduleEvent(EVENT_SCRIPT_1, 100); + return false; } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp index 7233bf3db61..7ac0b1f87f6 100644 --- a/src/server/scripts/Northrend/zone_wintergrasp.cpp +++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp @@ -119,69 +119,80 @@ class npc_wg_demolisher_engineer : public CreatureScript public: npc_wg_demolisher_engineer() : CreatureScript("npc_wg_demolisher_engineer") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_wg_demolisher_engineerAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_wg_demolisher_engineerAI(Creature* creature) : ScriptedAI(creature) { } - if (CanBuild(creature)) + bool GossipHello(Player* player) override { - if (player->HasAura(SPELL_CORPORAL)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - else if (player->HasAura(SPELL_LIEUTENANT)) + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (CanBuild()) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + if (player->HasAura(SPELL_CORPORAL)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + else if (player->HasAura(SPELL_LIEUTENANT)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + } } - } - else - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } + else + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - CloseGossipMenuFor(player); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } - if (CanBuild(creature)) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - switch (action - GOSSIP_ACTION_INFO_DEF) + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + CloseGossipMenuFor(player); + + if (CanBuild()) { - case 0: - creature->CastSpell(player, SPELL_BUILD_CATAPULT_FORCE, true); - break; - case 1: - creature->CastSpell(player, SPELL_BUILD_DEMOLISHER_FORCE, true); - break; - case 2: - creature->CastSpell(player, player->GetTeamId() == TEAM_ALLIANCE ? SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE : SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, true); - break; + switch (action - GOSSIP_ACTION_INFO_DEF) + { + case 0: + DoCast(player, SPELL_BUILD_CATAPULT_FORCE, true); + break; + case 1: + DoCast(player, SPELL_BUILD_DEMOLISHER_FORCE, true); + break; + case 2: + DoCast(player, player->GetTeamId() == TEAM_ALLIANCE ? SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE : SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, true); + break; + } + if (Creature* controlArms = me->FindNearestCreature(NPC_WINTERGRASP_CONTROL_ARMS, 30.0f, true)) + DoCast(controlArms, SPELL_ACTIVATE_CONTROL_ARMS, true); } - if (Creature* controlArms = creature->FindNearestCreature(NPC_WINTERGRASP_CONTROL_ARMS, 30.0f, true)) - creature->CastSpell(controlArms, SPELL_ACTIVATE_CONTROL_ARMS, true); + return true; } - return true; - } - private: - bool CanBuild(Creature* creature) - { - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return false; - - switch (creature->GetEntry()) + private: + bool CanBuild() const { - case NPC_GOBLIN_MECHANIC: - return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H)); - case NPC_GNOMISH_ENGINEER: - return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A)); - default: + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) return false; + + switch (me->GetEntry()) + { + case NPC_GOBLIN_MECHANIC: + return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H)); + case NPC_GNOMISH_ENGINEER: + return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A)); + default: + return false; + } } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_wg_demolisher_engineerAI(creature); } }; @@ -190,48 +201,49 @@ class npc_wg_spirit_guide : public CreatureScript public: npc_wg_spirit_guide() : CreatureScript("npc_wg_spirit_guide") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_wg_spirit_guideAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_wg_spirit_guideAI(Creature* creature) : ScriptedAI(creature) { } - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; + void UpdateAI(uint32 /*diff*/) override + { + if (!me->HasUnitState(UNIT_STATE_CASTING)) + DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL); + } - GraveyardVect graveyard = wintergrasp->GetGraveyardVector(); - for (uint8 i = 0; i < graveyard.size(); i++) - if (graveyard[i]->GetControlTeamId() == player->GetTeamId()) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(((BfGraveyardWG*)graveyard[i])->GetTextId()), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + i); + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) + return true; - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override - { - CloseGossipMenuFor(player); + GraveyardVect graveyard = wintergrasp->GetGraveyardVector(); + for (uint8 i = 0; i < graveyard.size(); i++) + if (graveyard[i]->GetControlTeamId() == player->GetTeamId()) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(((BfGraveyardWG*)graveyard[i])->GetTextId()), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + i); - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (wintergrasp) - { - GraveyardVect gy = wintergrasp->GetGraveyardVector(); - for (uint8 i = 0; i < gy.size(); i++) - if (action - GOSSIP_ACTION_INFO_DEF == i && gy[i]->GetControlTeamId() == player->GetTeamId()) - if (WorldSafeLocsEntry const* safeLoc = sObjectMgr->GetWorldSafeLoc(gy[i]->GetGraveyardId())) - player->TeleportTo(safeLoc->Loc); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; } - return true; - } - struct npc_wg_spirit_guideAI : public ScriptedAI - { - npc_wg_spirit_guideAI(Creature* creature) : ScriptedAI(creature) { } - - void UpdateAI(uint32 /*diff*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - if (!me->HasUnitState(UNIT_STATE_CASTING)) - DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + CloseGossipMenuFor(player); + + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (wintergrasp) + { + GraveyardVect gy = wintergrasp->GetGraveyardVector(); + for (uint8 i = 0; i < gy.size(); i++) + if (action - GOSSIP_ACTION_INFO_DEF == i && gy[i]->GetControlTeamId() == player->GetTeamId()) + if (WorldSafeLocsEntry const* safeLoc = sObjectMgr->GetWorldSafeLoc(gy[i]->GetGraveyardId())) + player->TeleportTo(safeLoc->Loc); + } + return true; } }; @@ -278,17 +290,11 @@ class npc_wg_queue : public CreatureScript DoMeleeAttackIfReady(); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_wg_queueAI(creature); - } - bool OnGossipHello(Player* player, Creature* creature) override + bool GossipHello(Player* player) override { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); if (!wintergrasp) @@ -297,7 +303,7 @@ class npc_wg_queue : public CreatureScript if (wintergrasp->IsWarTime()) { AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, creature->GetGUID()); + SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, me->GetGUID()); } else { @@ -306,15 +312,15 @@ class npc_wg_queue : public CreatureScript if (timer < 15 * MINUTE) { AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_QUEUE : WG_NPCQUEUE_TEXT_A_QUEUE, creature->GetGUID()); + SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_QUEUE : WG_NPCQUEUE_TEXT_A_QUEUE, me->GetGUID()); } else - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, creature->GetGUID()); + SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, me->GetGUID()); } return true; } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 /*action*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { CloseGossipMenuFor(player); @@ -332,6 +338,12 @@ class npc_wg_queue : public CreatureScript } return true; } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_wg_queueAI(creature); + } }; class go_wg_vehicle_teleporter : public GameObjectScript @@ -345,8 +357,8 @@ class go_wg_vehicle_teleporter : public GameObjectScript bool IsFriendly(Unit* passenger) { - return ((go->GetFaction() == WintergraspFaction[TEAM_HORDE] && passenger->GetFaction() == HORDE) || - (go->GetFaction() == WintergraspFaction[TEAM_ALLIANCE] && passenger->GetFaction() == ALLIANCE)); + return ((me->GetFaction() == WintergraspFaction[TEAM_HORDE] && passenger->GetFaction() == HORDE) || + (me->GetFaction() == WintergraspFaction[TEAM_ALLIANCE] && passenger->GetFaction() == ALLIANCE)); } Creature* GetValidVehicle(Creature* cVeh) @@ -355,7 +367,7 @@ class go_wg_vehicle_teleporter : public GameObjectScript if (Vehicle* vehicle = cVeh->GetVehicleKit()) if (Unit* passenger = vehicle->GetPassenger(0)) if (IsFriendly(passenger)) - if (Creature* teleportTrigger = passenger->SummonTrigger(go->GetPositionX()-60.0f, go->GetPositionY(), go->GetPositionZ()+1.0f, cVeh->GetOrientation(), 1000)) + if (Creature* teleportTrigger = passenger->SummonTrigger(me->GetPositionX()-60.0f, me->GetPositionY(), me->GetPositionZ()+1.0f, cVeh->GetOrientation(), 1000)) return teleportTrigger; return nullptr; @@ -367,7 +379,7 @@ class go_wg_vehicle_teleporter : public GameObjectScript if (_checkTimer >= 1000) { for (uint8 i = 0; i < MAX_WINTERGRASP_VEHICLES; i++) - if (Creature* vehicleCreature = go->FindNearestCreature(vehiclesList[i], 3.0f, true)) + if (Creature* vehicleCreature = me->FindNearestCreature(vehiclesList[i], 3.0f, true)) if (Creature* teleportTrigger = GetValidVehicle(vehicleCreature)) teleportTrigger->CastSpell(vehicleCreature, SPELL_VEHICLE_TELEPORT, true); diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp index e9e94189bf7..48dc7a1d7e4 100644 --- a/src/server/scripts/Northrend/zone_zuldrak.cpp +++ b/src/server/scripts/Northrend/zone_zuldrak.cpp @@ -19,6 +19,7 @@ #include "GameObject.h" #include "MotionMaster.h" #include "ObjectAccessor.h" +#include "GameObjectAI.h" #include "Player.h" #include "ScriptedEscortAI.h" #include "ScriptedGossip.h" @@ -270,12 +271,13 @@ public: return; } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { _events.ScheduleEvent(EVENT_RECRUIT_1, 100); CloseGossipMenuFor(player); me->CastSpell(player, SPELL_QUEST_CREDIT, true); me->SetFacingToObject(player); + return false; } private: @@ -306,20 +308,29 @@ class go_scourge_enclosure : public GameObjectScript public: go_scourge_enclosure() : GameObjectScript("go_scourge_enclosure") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_scourge_enclosureAI : public GameObjectAI { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_OUR_ONLY_HOPE) == QUEST_STATUS_INCOMPLETE) + go_scourge_enclosureAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - Creature* gymerDummy = go->FindNearestCreature(NPC_GYMER_DUMMY, 20.0f); - if (gymerDummy) + me->UseDoorOrButton(); + if (player->GetQuestStatus(QUEST_OUR_ONLY_HOPE) == QUEST_STATUS_INCOMPLETE) { - player->KilledMonsterCredit(gymerDummy->GetEntry(), gymerDummy->GetGUID()); - gymerDummy->CastSpell(gymerDummy, SPELL_GYMER_LOCK_EXPLOSION, true); - gymerDummy->DespawnOrUnsummon(4 * IN_MILLISECONDS); + if (Creature* gymerDummy = me->FindNearestCreature(NPC_GYMER_DUMMY, 20.0f)) + { + player->KilledMonsterCredit(gymerDummy->GetEntry(), gymerDummy->GetGUID()); + gymerDummy->CastSpell(gymerDummy, SPELL_GYMER_LOCK_EXPLOSION, true); + gymerDummy->DespawnOrUnsummon(4 * IN_MILLISECONDS); + } } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_scourge_enclosureAI(go); } }; @@ -555,13 +566,14 @@ public: } } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { CloseGossipMenuFor(player); DoCast(player, SPELL_ALCHEMIST_APPRENTICE_INVISBUFF); _playerGUID = player->GetGUID(); _getingredienttry = 1; _events.ScheduleEvent(EVENT_EASY_123, 100); + return false; } private: @@ -581,10 +593,20 @@ class go_finklesteins_cauldron : public GameObjectScript public: go_finklesteins_cauldron() : GameObjectScript("go_finklesteins_cauldron") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_finklesteins_cauldronAI : public GameObjectAI + { + go_finklesteins_cauldronAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + player->CastSpell(player, SPELL_POT_CHECK); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override { - player->CastSpell(player, SPELL_POT_CHECK); - return true; + return new go_finklesteins_cauldronAI(go); } }; diff --git a/src/server/scripts/Outland/BlackTemple/black_temple.h b/src/server/scripts/Outland/BlackTemple/black_temple.h index e5790d6ee16..2213c65373d 100644 --- a/src/server/scripts/Outland/BlackTemple/black_temple.h +++ b/src/server/scripts/Outland/BlackTemple/black_temple.h @@ -141,10 +141,10 @@ enum BlackTempleMisc ACTION_OPEN_DOOR = 4 }; -template<typename AI> -inline AI* GetBlackTempleAI(Creature* creature) +template<class AI, class T> +inline AI* GetBlackTempleAI(T* obj) { - return GetInstanceAI<AI>(creature, BTScriptName); + return GetInstanceAI<AI>(obj, BTScriptName); } #endif // BLACK_TEMPLE_H_ diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index c92e304152c..44f9f9069ee 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -1060,7 +1060,7 @@ public: _isTeleportToMinions = false; } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { if (gossipListId == GOSSIP_START_INTRO) { @@ -1079,6 +1079,7 @@ public: me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); CloseGossipMenuFor(player); } + return false; } bool CanAIAttack(Unit const* who) const override diff --git a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp index dc5d479bf58..279749dfd9f 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp @@ -550,13 +550,14 @@ public: shade->AI()->EnterEvadeMode(EVADE_REASON_OTHER); } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { if (gossipListId == 0) { CloseGossipMenuFor(player); _events.ScheduleEvent(EVENT_SHADE_START, Milliseconds(500)); } + return false; } private: diff --git a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp index a56f6892442..35ff1fd862c 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp @@ -16,6 +16,7 @@ */ #include "ScriptMgr.h" +#include "GameObjectAI.h" #include "black_temple.h" #include "GameObject.h" #include "InstanceScript.h" @@ -175,16 +176,29 @@ class go_najentus_spine : public GameObjectScript public: go_najentus_spine() : GameObjectScript("go_najentus_spine") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_najentus_spineAI : public GameObjectAI { - if (InstanceScript* instance = go->GetInstanceScript()) + go_najentus_spineAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* player, bool /*reportUse*/) override + { if (Creature* najentus = instance->GetCreature(DATA_HIGH_WARLORD_NAJENTUS)) + { if (ENSURE_AI(boss_najentus::boss_najentusAI, najentus->AI())->RemoveImpalingSpine()) { - go->CastSpell(player, SPELL_CREATE_NAJENTUS_SPINE, true); - go->Delete(); + me->CastSpell(player, SPELL_CREATE_NAJENTUS_SPINE, true); + me->Delete(); } - return true; + } + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetBlackTempleAI<go_najentus_spineAI>(go); } }; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp index a1d2969c6f7..f4d74f49f83 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp @@ -29,6 +29,7 @@ EndScriptData */ #include "MotionMaster.h" #include "Player.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "serpent_shrine.h" #include "TemporarySummon.h" @@ -437,21 +438,32 @@ class go_strange_pool : public GameObjectScript public: go_strange_pool() : GameObjectScript("go_strange_pool") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_strange_poolAI : public GameObjectAI { - // 25% - if (InstanceScript* instanceScript = go->GetInstanceScript()) + go_strange_poolAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + // 25% if (!urand(0, 3)) { - if (instanceScript->GetData(DATA_STRANGE_POOL) == NOT_STARTED) + if (instance->GetData(DATA_STRANGE_POOL) == NOT_STARTED) { - go->CastSpell(player, 54587); - instanceScript->SetData(DATA_STRANGE_POOL, IN_PROGRESS); + me->CastSpell(player, 54587); + instance->SetData(DATA_STRANGE_POOL, IN_PROGRESS); } return true; } - return false; + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetSerpentshrineCavernAI<go_strange_poolAI>(go); } }; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp index 0cb7eafa2d3..7a60b41ecec 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp @@ -30,6 +30,7 @@ EndScriptData */ #include "Player.h" #include "serpent_shrine.h" #include "TemporarySummon.h" +#include "GameObjectAI.h" #define MAX_ENCOUNTER 6 @@ -66,17 +67,23 @@ class go_bridge_console : public GameObjectScript public: go_bridge_console() : GameObjectScript("go_bridge_console") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_bridge_consoleAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); + go_bridge_consoleAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - if (!instance) - return false; + InstanceScript* instance; - if (instance) - instance->SetData(DATA_CONTROL_CONSOLE, DONE); + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + if (instance) + instance->SetData(DATA_CONTROL_CONSOLE, DONE); + return true; + } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return GetSerpentshrineCavernAI<go_bridge_consoleAI>(go); } }; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h index f457957f799..b7ad1f73512 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h @@ -59,10 +59,10 @@ enum SSDataTypes DATA_TRASH = 25, }; -template<typename AI> -inline AI* GetSerpentshrineCavernAI(Creature* creature) +template <class AI, class T> +inline AI* GetSerpentshrineCavernAI(T* obj) { - return GetInstanceAI<AI>(creature, SSCScriptName); + return GetInstanceAI<AI>(obj, SSCScriptName); } #endif diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp index b8b8c3f3f9c..3569426d8d1 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp @@ -18,6 +18,7 @@ #include "ScriptMgr.h" #include "Creature.h" #include "GameObject.h" +#include "GameObjectAI.h" #include "InstanceScript.h" #include "Log.h" #include "steam_vault.h" @@ -27,22 +28,29 @@ class go_main_chambers_access_panel : public GameObjectScript public: go_main_chambers_access_panel() : GameObjectScript("go_main_chambers_access_panel") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_main_chambers_access_panelAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); - if (!instance) - return false; + go_main_chambers_access_panelAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - if (go->GetEntry() == GO_ACCESS_PANEL_HYDRO && (instance->GetBossState(DATA_HYDROMANCER_THESPIA) == DONE || instance->GetBossState(DATA_HYDROMANCER_THESPIA) == SPECIAL)) - instance->SetBossState(DATA_HYDROMANCER_THESPIA, SPECIAL); + InstanceScript* instance; - if (go->GetEntry() == GO_ACCESS_PANEL_MEK && (instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == DONE || instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == SPECIAL)) - instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, SPECIAL); + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + if (me->GetEntry() == GO_ACCESS_PANEL_HYDRO && (instance->GetBossState(DATA_HYDROMANCER_THESPIA) == DONE || instance->GetBossState(DATA_HYDROMANCER_THESPIA) == SPECIAL)) + instance->SetBossState(DATA_HYDROMANCER_THESPIA, SPECIAL); + + if (me->GetEntry() == GO_ACCESS_PANEL_MEK && (instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == DONE || instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == SPECIAL)) + instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, SPECIAL); - go->AddFlag(GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + me->AddFlag(GO_FLAG_NOT_SELECTABLE); + me->SetGoState(GO_STATE_ACTIVE); + return true; + } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return GetSteamVaultAI<go_main_chambers_access_panelAI>(go); } }; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h index 7e1802ef59a..22846f6ac82 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h @@ -51,10 +51,10 @@ enum SVGameObjectIds GO_ACCESS_PANEL_MEK = 184126 }; -template<typename AI> -inline AI* GetSteamVaultAI(Creature* creature) +template<class AI, class T> +inline AI* GetSteamVaultAI(T* obj) { - return GetInstanceAI<AI>(creature, SteamVaultScriptName); + return GetInstanceAI<AI>(obj, SteamVaultScriptName); } #endif diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp index 38dd69499ad..2379950f294 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp @@ -27,6 +27,7 @@ #include "Player.h" #include "ScriptedGossip.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "SpellAuraEffects.h" #include "SpellInfo.h" #include "SpellScript.h" @@ -655,25 +656,32 @@ class go_ahune_ice_stone : public GameObjectScript public: go_ahune_ice_stone() : GameObjectScript("go_ahune_ice_stone") { } - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 /*action*/) + struct go_ahune_ice_stoneAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); - if (!instance) - return false; + go_ahune_ice_stoneAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - ClearGossipMenuFor(player); + InstanceScript* instance; - if (Creature* ahuneBunny = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_AHUNE_BUNNY))) + bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) { - ahuneBunny->AI()->DoAction(ACTION_START_EVENT); - ahuneBunny->SetInCombatWithZone(); + ClearGossipMenuFor(player); + + if (Creature* ahuneBunny = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_AHUNE_BUNNY))) + { + ahuneBunny->AI()->DoAction(ACTION_START_EVENT); + ahuneBunny->SetInCombatWithZone(); + } + if (Creature* luma = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_LUMA_SKYMOTHER))) + luma->CastSpell(player, SPELL_SUMMONING_RHYME_AURA, true); + CloseGossipMenuFor(player); + me->Delete(); + return true; } - if (Creature* luma = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_LUMA_SKYMOTHER))) - luma->CastSpell(player, SPELL_SUMMONING_RHYME_AURA, true); - CloseGossipMenuFor(player); - go->Delete(); + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return GetSlavePensAI<go_ahune_ice_stoneAI>(go); } }; diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h index 4b388803e0a..398225c4d01 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h +++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h @@ -68,10 +68,10 @@ enum SPGameObjectIds GO_ICE_STONE = 187882 }; -template<typename AI> -inline AI* GetSlavePensAI(Creature* creature) +template<class AI, class T> +inline AI* GetSlavePensAI(T* obj) { - return GetInstanceAI<AI>(creature, SPScriptName); + return GetInstanceAI<AI>(obj, SPScriptName); } #endif // SLAVE_PENS_H diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h index e59b5b6ca83..e3fd9704a0b 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h @@ -82,10 +82,10 @@ enum BFActionIds ACTION_PREPARE_BROGGOK = 3 }; -template<typename AI> -inline AI* GetBloodFurnaceAI(Creature* creature) +template<class AI, class T> +inline AI* GetBloodFurnaceAI(T* obj) { - return GetInstanceAI<AI>(creature, BFScriptName); + return GetInstanceAI<AI>(obj, BFScriptName); } #endif // BLOOD_FURNACE_H_ diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp index bdaa36fc778..789472f2a29 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp @@ -21,6 +21,7 @@ #include "InstanceScript.h" #include "ObjectAccessor.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "SpellAuraEffects.h" #include "SpellInfo.h" #include "SpellScript.h" @@ -131,18 +132,29 @@ class go_broggok_lever : public GameObjectScript public: go_broggok_lever() : GameObjectScript("go_broggok_lever") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_broggok_leverAI : public GameObjectAI { - if (InstanceScript* instance = go->GetInstanceScript()) + go_broggok_leverAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { if (instance->GetBossState(DATA_BROGGOK) != DONE && instance->GetBossState(DATA_BROGGOK) != IN_PROGRESS) { instance->SetBossState(DATA_BROGGOK, IN_PROGRESS); - if (Creature* broggok = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_BROGGOK))) + if (Creature* broggok = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_BROGGOK))) broggok->AI()->DoAction(ACTION_PREPARE_BROGGOK); } - go->UseDoorOrButton(); - return false; + me->UseDoorOrButton(); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetBloodFurnaceAI<go_broggok_leverAI>(go); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp index 64d5407f312..e61d5186fbf 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp @@ -27,6 +27,7 @@ #include "SpellScript.h" #include "SpellAuraEffects.h" #include "PassiveAI.h" +#include "GameObjectAI.h" enum Yells { @@ -467,16 +468,26 @@ class go_manticron_cube : public GameObjectScript public: go_manticron_cube() : GameObjectScript("go_manticron_cube") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_manticron_cubeAI : public GameObjectAI { - if (player->HasAura(SPELL_MIND_EXHAUSTION) || player->HasAura(SPELL_SHADOW_GRASP)) - return true; + go_manticron_cubeAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->HasAura(SPELL_MIND_EXHAUSTION) || player->HasAura(SPELL_SHADOW_GRASP)) + return true; + + if (Creature* trigger = player->FindNearestCreature(NPC_HELFIRE_RAID_TRIGGER, 10.0f)) + trigger->CastSpell((Unit*)nullptr, SPELL_SHADOW_GRASP_VISUAL); - if (Creature* trigger = player->FindNearestCreature(NPC_HELFIRE_RAID_TRIGGER, 10.0f)) - trigger->CastSpell((Unit*)nullptr, SPELL_SHADOW_GRASP_VISUAL); + player->CastSpell((Unit*)nullptr, SPELL_SHADOW_GRASP, true); + return true; + } + }; - player->CastSpell((Unit*)nullptr, SPELL_SHADOW_GRASP, true); - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_manticron_cubeAI(go); } }; diff --git a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp index a365e5cfda3..97e7e8e9460 100644 --- a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp +++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp @@ -37,6 +37,7 @@ EndContentData */ #include "ObjectAccessor.h" #include "Player.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "ScriptedGossip.h" #include "SpellInfo.h" #include "SpellScript.h" @@ -298,42 +299,52 @@ class go_legion_obelisk : public GameObjectScript public: go_legion_obelisk() : GameObjectScript("go_legion_obelisk") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_legion_obeliskAI : public GameObjectAI { - if (player->GetQuestStatus(QUEST_YOURE_FIRED) == QUEST_STATUS_INCOMPLETE) + go_legion_obeliskAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - switch (go->GetEntry()) + if (player->GetQuestStatus(QUEST_YOURE_FIRED) == QUEST_STATUS_INCOMPLETE) { - case GO_LEGION_OBELISK_ONE: - obelisk_one = true; - break; - case GO_LEGION_OBELISK_TWO: - obelisk_two = true; - break; - case GO_LEGION_OBELISK_THREE: - obelisk_three = true; - break; - case GO_LEGION_OBELISK_FOUR: - obelisk_four = true; - break; - case GO_LEGION_OBELISK_FIVE: - obelisk_five = true; - break; - } + switch (me->GetEntry()) + { + case GO_LEGION_OBELISK_ONE: + obelisk_one = true; + break; + case GO_LEGION_OBELISK_TWO: + obelisk_two = true; + break; + case GO_LEGION_OBELISK_THREE: + obelisk_three = true; + break; + case GO_LEGION_OBELISK_FOUR: + obelisk_four = true; + break; + case GO_LEGION_OBELISK_FIVE: + obelisk_five = true; + break; + } - if (obelisk_one == true && obelisk_two == true && obelisk_three == true && obelisk_four == true && obelisk_five == true) - { - go->SummonCreature(NPC_DOOMCRYER, 2943.40f, 4778.20f, 284.49f, 0.94f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000); - //reset global var - obelisk_one = false; - obelisk_two = false; - obelisk_three = false; - obelisk_four = false; - obelisk_five = false; + if (obelisk_one == true && obelisk_two == true && obelisk_three == true && obelisk_four == true && obelisk_five == true) + { + me->SummonCreature(NPC_DOOMCRYER, 2943.40f, 4778.20f, 284.49f, 0.94f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000); + //reset global var + obelisk_one = false; + obelisk_two = false; + obelisk_three = false; + obelisk_four = false; + obelisk_five = false; + } } + + return true; } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_legion_obeliskAI(go); } }; @@ -875,14 +886,24 @@ class go_simon_cluster : public GameObjectScript public: go_simon_cluster() : GameObjectScript("go_simon_cluster") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_simon_clusterAI : public GameObjectAI { - if (Creature* bunny = go->FindNearestCreature(NPC_SIMON_BUNNY, 12.0f, true)) - bunny->AI()->SetData(go->GetEntry(), 0); + go_simon_clusterAI(GameObject* go) : GameObjectAI(go) { } - player->CastSpell(player, go->GetGOInfo()->goober.spell, true); - go->AddUse(); - return true; + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (Creature* bunny = me->FindNearestCreature(NPC_SIMON_BUNNY, 12.0f, true)) + bunny->AI()->SetData(me->GetEntry(), 0); + + player->CastSpell(player, me->GetGOInfo()->goober.spell, true); + me->AddUse(); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_simon_clusterAI(go); } }; @@ -901,27 +922,37 @@ class go_apexis_relic : public GameObjectScript public: go_apexis_relic() : GameObjectScript("go_apexis_relic") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_apexis_relicAI : public GameObjectAI { - player->PrepareGossipMenu(go, go->GetGOInfo()->questgiver.gossipID); - player->SendPreparedGossip(go); - return true; - } + go_apexis_relicAI(GameObject* go) : GameObjectAI(go) { } - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 /*action*/) override - { - CloseGossipMenuFor(player); + bool GossipHello(Player* player, bool /*reportUse*/) override + { + player->PrepareGossipMenu(me, me->GetGOInfo()->questgiver.gossipID); + player->SendPreparedGossip(me); + return true; + } - bool large = (go->GetEntry() == GO_APEXIS_MONUMENT); - if (player->HasItemCount(ITEM_APEXIS_SHARD, large ? 35 : 1)) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { - player->CastSpell(player, large ? SPELL_TAKE_REAGENTS_GROUP : SPELL_TAKE_REAGENTS_SOLO, false); + CloseGossipMenuFor(player); + + bool large = (me->GetEntry() == GO_APEXIS_MONUMENT); + if (player->HasItemCount(ITEM_APEXIS_SHARD, large ? 35 : 1)) + { + player->CastSpell(player, large ? SPELL_TAKE_REAGENTS_GROUP : SPELL_TAKE_REAGENTS_SOLO, false); + + if (Creature* bunny = player->SummonCreature(NPC_SIMON_BUNNY, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())) + bunny->AI()->SetGUID(player->GetGUID(), large); + } - if (Creature* bunny = player->SummonCreature(NPC_SIMON_BUNNY, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ())) - bunny->AI()->SetGUID(player->GetGUID(), large); + return true; } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_apexis_relicAI(go); } }; diff --git a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp index 7e3afcbc225..72001b3a07e 100644 --- a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp +++ b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp @@ -277,7 +277,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_ROAD_TO_FALCON_WATCH) { @@ -517,15 +517,6 @@ class npc_colonel_jules : public CreatureScript public: npc_colonel_jules() : CreatureScript("npc_colonel_jules") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (ENSURE_AI(npc_colonel_jules::npc_colonel_julesAI, creature->AI())->success) - player->KilledMonsterCredit(NPC_COLONEL_JULES, ObjectGuid::Empty); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - struct npc_colonel_julesAI : public ScriptedAI { npc_colonel_julesAI(Creature* creature) : ScriptedAI(creature), summons(me) @@ -641,6 +632,15 @@ public: } } + bool GossipHello(Player* player) override + { + if (success) + player->KilledMonsterCredit(NPC_COLONEL_JULES, ObjectGuid::Empty); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } + private: EventMap events; SummonList summons; @@ -686,7 +686,7 @@ public: me->RemoveUnitFlag(UNIT_FLAG_PACIFIED); } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { ClearGossipMenuFor(player); switch (gossipListId) @@ -699,6 +699,7 @@ public: default: break; } + return false; } void DoAction(int32 action) override @@ -942,14 +943,6 @@ class npc_magister_aledis : public CreatureScript public: npc_magister_aledis() : CreatureScript("npc_magister_aledis") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override - { - CloseGossipMenuFor(player); - creature->StopMoving(); - ENSURE_AI(npc_magister_aledis::npc_magister_aledisAI, creature->AI())->StartFight(player); - return true; - } - struct npc_magister_aledisAI : public ScriptedAI { npc_magister_aledisAI(Creature* creature) : ScriptedAI(creature) { } @@ -1030,6 +1023,14 @@ public: DoMeleeAttackIfReady(); } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + { + CloseGossipMenuFor(player); + me->StopMoving(); + StartFight(player); + return true; + } + private: EventMap _events; ObjectGuid _playerGUID; diff --git a/src/server/scripts/Outland/zone_nagrand.cpp b/src/server/scripts/Outland/zone_nagrand.cpp index 2f662558c93..c51dfa286ad 100644 --- a/src/server/scripts/Outland/zone_nagrand.cpp +++ b/src/server/scripts/Outland/zone_nagrand.cpp @@ -30,6 +30,7 @@ EndContentData */ #include "ScriptMgr.h" #include "GameObject.h" #include "MotionMaster.h" +#include "GameObjectAI.h" #include "Player.h" #include "QuestDef.h" #include "ScriptedEscortAI.h" @@ -72,30 +73,6 @@ class npc_maghar_captive : public CreatureScript public: npc_maghar_captive() : CreatureScript("npc_maghar_captive") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_TOTEM_KARDASH_H) - { - if (npc_maghar_captiveAI* EscortAI = dynamic_cast<npc_maghar_captiveAI*>(creature->AI())) - { - creature->SetStandState(UNIT_STAND_STATE_STAND); - creature->SetFaction(232); - EscortAI->Start(true, false, player->GetGUID(), quest); - creature->AI()->Talk(SAY_MAG_START); - - creature->SummonCreature(NPC_MURK_RAIDER, m_afAmbushA[0]+2.5f, m_afAmbushA[1]-2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - creature->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushA[0]-2.5f, m_afAmbushA[1]+2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - creature->SummonCreature(NPC_MURK_BRUTE, m_afAmbushA[0], m_afAmbushA[1], m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - } - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_maghar_captiveAI(creature); - } - struct npc_maghar_captiveAI : public npc_escortAI { npc_maghar_captiveAI(Creature* creature) : npc_escortAI(creature) { Reset(); } @@ -217,7 +194,28 @@ public: DoMeleeAttackIfReady(); } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_TOTEM_KARDASH_H) + { + me->SetStandState(UNIT_STAND_STATE_STAND); + me->SetFaction(232); + Start(true, false, player->GetGUID(), quest); + Talk(SAY_MAG_START); + + me->SummonCreature(NPC_MURK_RAIDER, m_afAmbushA[0] + 2.5f, m_afAmbushA[1] - 2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushA[0] - 2.5f, m_afAmbushA[1] + 2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(NPC_MURK_BRUTE, m_afAmbushA[0], m_afAmbushA[1], m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + } + } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_maghar_captiveAI(creature); + } + }; /*###### @@ -291,42 +289,52 @@ enum CorkiData class go_corkis_prison : public GameObjectScript { public: - go_corkis_prison() : GameObjectScript("go_corkis_prison") { } + go_corkis_prison() : GameObjectScript("go_corkis_prison") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - go->SetGoState(GO_STATE_READY); - if (go->GetEntry() == GO_CORKIS_PRISON) - { - if (Creature* corki = go->FindNearestCreature(NPC_CORKI, 25, true)) - { - corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()+5, go->GetPositionY(), go->GetPositionZ()); - if (player) - player->KilledMonsterCredit(NPC_CORKI_CREDIT_1); - } - } + struct go_corkis_prisonAI : public GameObjectAI + { + go_corkis_prisonAI(GameObject* go) : GameObjectAI(go) { } - if (go->GetEntry() == GO_CORKIS_PRISON_2) - { - if (Creature* corki = go->FindNearestCreature(NPC_CORKI_2, 25, true)) - { - corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()-5, go->GetPositionY(), go->GetPositionZ()); - if (player) - player->KilledMonsterCredit(NPC_CORKI_2); - } - } + bool GossipHello(Player* player, bool /*reportUse*/) override + { + me->SetGoState(GO_STATE_READY); + if (me->GetEntry() == GO_CORKIS_PRISON) + { + if (Creature* corki = me->FindNearestCreature(NPC_CORKI, 25, true)) + { + corki->GetMotionMaster()->MovePoint(1, me->GetPositionX() + 5, me->GetPositionY(), me->GetPositionZ()); + if (player) + player->KilledMonsterCredit(NPC_CORKI_CREDIT_1); + } + } - if (go->GetEntry() == GO_CORKIS_PRISON_3) - { - if (Creature* corki = go->FindNearestCreature(NPC_CORKI_3, 25, true)) - { - corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()+4, go->GetPositionY(), go->GetPositionZ()); - if (player) - player->KilledMonsterCredit(NPC_CORKI_CREDIT_3); - } - } - return true; - } + if (me->GetEntry() == GO_CORKIS_PRISON_2) + { + if (Creature* corki = me->FindNearestCreature(NPC_CORKI_2, 25, true)) + { + corki->GetMotionMaster()->MovePoint(1, me->GetPositionX() - 5, me->GetPositionY(), me->GetPositionZ()); + if (player) + player->KilledMonsterCredit(NPC_CORKI_2); + } + } + + if (me->GetEntry() == GO_CORKIS_PRISON_3) + { + if (Creature* corki = me->FindNearestCreature(NPC_CORKI_3, 25, true)) + { + corki->GetMotionMaster()->MovePoint(1, me->GetPositionX() + 4, me->GetPositionY(), me->GetPositionZ()); + if (player) + player->KilledMonsterCredit(NPC_CORKI_CREDIT_3); + } + } + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_corkis_prisonAI(go); + } }; class npc_corki : public CreatureScript @@ -426,30 +434,6 @@ class npc_kurenai_captive : public CreatureScript public: npc_kurenai_captive() : CreatureScript("npc_kurenai_captive") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_TOTEM_KARDASH_A) - { - if (npc_kurenai_captiveAI* EscortAI = dynamic_cast<npc_kurenai_captiveAI*>(creature->AI())) - { - creature->SetStandState(UNIT_STAND_STATE_STAND); - creature->SetFaction(231); - EscortAI->Start(true, false, player->GetGUID(), quest); - creature->AI()->Talk(SAY_KUR_START); - - creature->SummonCreature(NPC_KUR_MURK_RAIDER, kurenaiAmbushA[0]+2.5f, kurenaiAmbushA[1]-2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - creature->SummonCreature(NPC_KUR_MURK_BRUTE, kurenaiAmbushA[0]-2.5f, kurenaiAmbushA[1]+2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - creature->SummonCreature(NPC_KUR_MURK_SCAVENGER, kurenaiAmbushA[0], kurenaiAmbushA[1], kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - } - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_kurenai_captiveAI(creature); - } - struct npc_kurenai_captiveAI : public npc_escortAI { npc_kurenai_captiveAI(Creature* creature) : npc_escortAI(creature) @@ -585,7 +569,27 @@ public: DoMeleeAttackIfReady(); } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_TOTEM_KARDASH_A) + { + me->SetStandState(UNIT_STAND_STATE_STAND); + me->SetFaction(231); + Start(true, false, player->GetGUID(), quest); + Talk(SAY_KUR_START); + + me->SummonCreature(NPC_KUR_MURK_RAIDER, kurenaiAmbushA[0] + 2.5f, kurenaiAmbushA[1] - 2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(NPC_KUR_MURK_BRUTE, kurenaiAmbushA[0] - 2.5f, kurenaiAmbushA[1] + 2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(NPC_KUR_MURK_SCAVENGER, kurenaiAmbushA[0], kurenaiAmbushA[1], kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + } + } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_kurenai_captiveAI(creature); + } }; /*###### @@ -605,20 +609,30 @@ class go_warmaul_prison : public GameObjectScript public: go_warmaul_prison() : GameObjectScript("go_warmaul_prison") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_warmaul_prisonAI : public GameObjectAI { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_FINDING_THE_SURVIVORS) != QUEST_STATUS_INCOMPLETE) - return false; + go_warmaul_prisonAI(GameObject* go) : GameObjectAI(go) { } - if (Creature* prisoner = go->FindNearestCreature(NPC_MAGHAR_PRISONER, 5.0f)) + bool GossipHello(Player* player, bool /*reportUse*/) override { - player->KilledMonsterCredit(NPC_MAGHAR_PRISONER); + me->UseDoorOrButton(); + if (player->GetQuestStatus(QUEST_FINDING_THE_SURVIVORS) != QUEST_STATUS_INCOMPLETE) + return false; + + if (Creature* prisoner = me->FindNearestCreature(NPC_MAGHAR_PRISONER, 5.0f)) + { + player->KilledMonsterCredit(NPC_MAGHAR_PRISONER); - prisoner->AI()->Talk(SAY_FREE, player); - prisoner->DespawnOrUnsummon(6000); + prisoner->AI()->Talk(SAY_FREE, player); + prisoner->DespawnOrUnsummon(6000); + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_warmaul_prisonAI(go); } }; diff --git a/src/server/scripts/Outland/zone_netherstorm.cpp b/src/server/scripts/Outland/zone_netherstorm.cpp index cc10c1d619c..c4560a9d633 100644 --- a/src/server/scripts/Outland/zone_netherstorm.cpp +++ b/src/server/scripts/Outland/zone_netherstorm.cpp @@ -33,6 +33,7 @@ EndContentData */ #include "GameObject.h" #include "Log.h" #include "ObjectAccessor.h" +#include "GameObjectAI.h" #include "Player.h" #include "QuestDef.h" #include "ScriptedEscortAI.h" @@ -494,22 +495,6 @@ class npc_bessy : public CreatureScript public: npc_bessy() : CreatureScript("npc_bessy") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == Q_ALMABTRIEB) - { - creature->SetFaction(113); - creature->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_bessyAI(creature); - } - struct npc_bessyAI : public npc_escortAI { npc_bessyAI(Creature* creature) : npc_escortAI(creature) { } @@ -558,7 +543,22 @@ public: { me->RestoreFaction(); } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == Q_ALMABTRIEB) + { + me->SetFaction(113); + me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + Start(true, false, player->GetGUID()); + } + } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_bessyAI(creature); + } }; /*###### @@ -576,11 +576,6 @@ class npc_maxx_a_million_escort : public CreatureScript public: npc_maxx_a_million_escort() : CreatureScript("npc_maxx_a_million_escort") { } - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_maxx_a_million_escortAI(creature); - } - struct npc_maxx_a_million_escortAI : public npc_escortAI { npc_maxx_a_million_escortAI(Creature* creature) : npc_escortAI(creature) @@ -656,19 +651,20 @@ public: } DoMeleeAttackIfReady(); } - }; - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_MARK_V_IS_ALIVE) + void QuestAccept(Player* player, Quest const* quest) override { - if (npc_maxx_a_million_escortAI* pEscortAI = CAST_AI(npc_maxx_a_million_escort::npc_maxx_a_million_escortAI, creature->AI())) + if (quest->GetQuestId() == QUEST_MARK_V_IS_ALIVE) { - creature->SetFaction(113); - pEscortAI->Start(false, false, player->GetGUID()); + me->SetFaction(113); + Start(false, false, player->GetGUID()); } } - return true; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_maxx_a_million_escortAI(creature); } }; @@ -687,16 +683,26 @@ class go_captain_tyralius_prison : public GameObjectScript public: go_captain_tyralius_prison() : GameObjectScript("go_captain_tyralius_prison") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_captain_tyralius_prisonAI : public GameObjectAI { - go->UseDoorOrButton(); - if (Creature* tyralius = go->FindNearestCreature(NPC_CAPTAIN_TYRALIUS, 1.0f)) + go_captain_tyralius_prisonAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - player->KilledMonsterCredit(NPC_CAPTAIN_TYRALIUS); - tyralius->AI()->Talk(SAY_FREE); - tyralius->DespawnOrUnsummon(8000); + me->UseDoorOrButton(); + if (Creature* tyralius = me->FindNearestCreature(NPC_CAPTAIN_TYRALIUS, 1.0f)) + { + player->KilledMonsterCredit(NPC_CAPTAIN_TYRALIUS); + tyralius->AI()->Talk(SAY_FREE); + tyralius->DespawnOrUnsummon(8000); + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_captain_tyralius_prisonAI(go); } }; diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp index af98238d5b5..19b79b6ee4c 100644 --- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp +++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp @@ -37,6 +37,7 @@ EndContentData */ #include "ScriptMgr.h" #include "GameObject.h" +#include "GameObjectAI.h" #include "Group.h" #include "MotionMaster.h" #include "ObjectAccessor.h" @@ -597,24 +598,6 @@ class npc_earthmender_wilda : public CreatureScript public: npc_earthmender_wilda() : CreatureScript("npc_earthmender_wilda") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_ESCAPE_COILSCAR) - { - creature->AI()->Talk(SAY_WIL_START, player); - creature->SetFaction(FACTION_EARTHEN); - - if (npc_earthmender_wildaAI* pEscortAI = CAST_AI(npc_earthmender_wilda::npc_earthmender_wildaAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_earthmender_wildaAI(creature); - } - struct npc_earthmender_wildaAI : public npc_escortAI { npc_earthmender_wildaAI(Creature* creature) : npc_escortAI(creature) @@ -744,7 +727,24 @@ public: m_uiHealingTimer -= uiDiff; } } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_ESCAPE_COILSCAR) + { + Talk(SAY_WIL_START, player); + me->SetFaction(FACTION_EARTHEN); + + Start(false, false, player->GetGUID(), quest); + } + } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_earthmender_wildaAI(creature); + } + }; /*##### @@ -1350,20 +1350,28 @@ class go_crystal_prison : public GameObjectScript public: go_crystal_prison() : GameObjectScript("go_crystal_prison") { } - bool OnQuestAccept(Player* player, GameObject* /*go*/, Quest const* quest) override + struct go_crystal_prisonAI : GameObjectAI { - if (quest->GetQuestId() == QUEST_BATTLE_OF_THE_CRIMSON_WATCH) - { - Creature* Illidan = player->FindNearestCreature(22083, 50); + go_crystal_prisonAI(GameObject* go) : GameObjectAI(go) { } - if (Illidan && !ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->EventStarted) + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_BATTLE_OF_THE_CRIMSON_WATCH) { - ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->PlayerGUID = player->GetGUID(); - ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->LiveCount = 0; - ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->EventStarted = true; + Creature* illidan = player->FindNearestCreature(22083, 50); + if (illidan && !ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, illidan->AI())->EventStarted) + { + ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, illidan->AI())->PlayerGUID = player->GetGUID(); + ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, illidan->AI())->LiveCount = 0; + ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, illidan->AI())->EventStarted = true; + } } } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_crystal_prisonAI(go); } }; diff --git a/src/server/scripts/Outland/zone_shattrath_city.cpp b/src/server/scripts/Outland/zone_shattrath_city.cpp index c76e803c168..5334f567a89 100644 --- a/src/server/scripts/Outland/zone_shattrath_city.cpp +++ b/src/server/scripts/Outland/zone_shattrath_city.cpp @@ -56,39 +56,6 @@ class npc_raliq_the_drunk : public CreatureScript public: npc_raliq_the_drunk() : CreatureScript("npc_raliq_the_drunk") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); - creature->SetFaction(FACTION_OGRE_HOSTILE); - creature->AI()->Talk(SAY_RALIQ_ATTACK, player); - creature->AI()->AttackStart(player); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(CRACKIN_SOME_SKULLS) == QUEST_STATUS_INCOMPLETE) - { - AddGossipItemFor(player, MENU_ID_COLLECT_A_DEBT, OPTION_ID_COLLECT_A_DEBT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, NPC_TEXT_WUT_YOU_WANT, creature->GetGUID()); - } - else - { - ClearGossipMenuFor(player); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_raliq_the_drunkAI(creature); - } - struct npc_raliq_the_drunkAI : public ScriptedAI { npc_raliq_the_drunkAI(Creature* creature) : ScriptedAI(creature) @@ -122,7 +89,41 @@ public: DoMeleeAttackIfReady(); } + + 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); + me->SetFaction(FACTION_OGRE_HOSTILE); + Talk(SAY_RALIQ_ATTACK, player); + AttackStart(player); + } + return true; + } + + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(CRACKIN_SOME_SKULLS) == QUEST_STATUS_INCOMPLETE) + { + AddGossipItemFor(player, MENU_ID_COLLECT_A_DEBT, OPTION_ID_COLLECT_A_DEBT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, NPC_TEXT_WUT_YOU_WANT, me->GetGUID()); + } + else + { + ClearGossipMenuFor(player); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + } + return true; + } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_raliq_the_drunkAI(creature); + } }; /*###### @@ -146,40 +147,6 @@ class npc_salsalabim : public CreatureScript public: npc_salsalabim() : CreatureScript("npc_salsalabim") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); - creature->SetFaction(FACTION_DEMON_HOSTILE); - creature->AI()->Talk(SAY_DEMONIC_AGGRO, player); - creature->AI()->AttackStart(player); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(PATIENCE_AND_UNDERSTANDING) == QUEST_STATUS_INCOMPLETE) - { - AddGossipItemFor(player, MENU_ID_ALTRUIS_SENT_ME, OPTION_ID_ALTRUIS_SENT_ME, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, NPC_TEXT_SAL_GROWLS_AT_YOU, creature->GetGUID()); - } - else - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_salsalabimAI(creature); - } - struct npc_salsalabimAI : public ScriptedAI { npc_salsalabimAI(Creature* creature) : ScriptedAI(creature) @@ -223,7 +190,42 @@ public: DoMeleeAttackIfReady(); } + + 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); + me->SetFaction(FACTION_DEMON_HOSTILE); + Talk(SAY_DEMONIC_AGGRO, player); + AttackStart(player); + } + return true; + } + + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(PATIENCE_AND_UNDERSTANDING) == QUEST_STATUS_INCOMPLETE) + { + AddGossipItemFor(player, MENU_ID_ALTRUIS_SENT_ME, OPTION_ID_ALTRUIS_SENT_ME, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, NPC_TEXT_SAL_GROWLS_AT_YOU, me->GetGUID()); + } + else + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + } + return true; + } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_salsalabimAI(creature); + } }; /* @@ -255,46 +257,57 @@ class npc_shattrathflaskvendors : public CreatureScript public: npc_shattrathflaskvendors() : CreatureScript("npc_shattrathflaskvendors") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override + struct npc_shattrathflaskvendorsAI : public ScriptedAI { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); + npc_shattrathflaskvendorsAI(Creature* creature) : ScriptedAI(creature) { } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->GetEntry() == HALDOR_THE_COMPULSIVE) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - // Aldor vendor - if (creature->IsVendor() && (player->GetReputationRank(ALDOR_REPUTATION) == REP_EXALTED) && (player->GetReputationRank(THE_SHA_TAR_REPUTATION) == REP_EXALTED) && (player->GetReputationRank(CENARION_EXPEDITION_REP) == REP_EXALTED)) - { - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - SendGossipMenuFor(player, NPC_TEXT_WELCOME_NAME, creature->GetGUID()); - } - else - { - SendGossipMenuFor(player, NPC_TEXT_EXALTED_ALDOR, creature->GetGUID()); - } + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_TRADE) + player->GetSession()->SendListInventory(me->GetGUID()); + + return true; } - if (creature->GetEntry() == ARCANIST_XORITH) + bool GossipHello(Player* player) override { - // Scryers vendor - if (creature->IsVendor() && (player->GetReputationRank(SCRYERS_REPUTATION) == REP_EXALTED) && (player->GetReputationRank(THE_SHA_TAR_REPUTATION) == REP_EXALTED) && (player->GetReputationRank(CENARION_EXPEDITION_REP) == REP_EXALTED)) + if (me->GetEntry() == HALDOR_THE_COMPULSIVE) { - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - SendGossipMenuFor(player, NPC_TEXT_WELCOME_NAME, creature->GetGUID()); + // Aldor vendor + if (me->IsVendor() && (player->GetReputationRank(ALDOR_REPUTATION) == REP_EXALTED) && (player->GetReputationRank(THE_SHA_TAR_REPUTATION) == REP_EXALTED) && (player->GetReputationRank(CENARION_EXPEDITION_REP) == REP_EXALTED)) + { + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + SendGossipMenuFor(player, NPC_TEXT_WELCOME_NAME, me->GetGUID()); + } + else + { + SendGossipMenuFor(player, NPC_TEXT_EXALTED_ALDOR, me->GetGUID()); + } } - else + + if (me->GetEntry() == ARCANIST_XORITH) { - SendGossipMenuFor(player, NPC_TEXT_EXALTED_SCRYERS, creature->GetGUID()); + // Scryers vendor + if (me->IsVendor() && (player->GetReputationRank(SCRYERS_REPUTATION) == REP_EXALTED) && (player->GetReputationRank(THE_SHA_TAR_REPUTATION) == REP_EXALTED) && (player->GetReputationRank(CENARION_EXPEDITION_REP) == REP_EXALTED)) + { + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + SendGossipMenuFor(player, NPC_TEXT_WELCOME_NAME, me->GetGUID()); + } + else + { + SendGossipMenuFor(player, NPC_TEXT_EXALTED_SCRYERS, me->GetGUID()); + } } + + return true; } + }; - return true; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_shattrathflaskvendorsAI(creature); } }; @@ -315,23 +328,34 @@ class npc_zephyr : public CreatureScript public: npc_zephyr() : CreatureScript("npc_zephyr") { } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override + struct npc_zephyrAI : public ScriptedAI { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - player->CastSpell(player, TELEPORT_CAVERNS_OF_TIME, false); + npc_zephyrAI(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_INFO_DEF + 1) + player->CastSpell(player, TELEPORT_CAVERNS_OF_TIME, false); - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetReputationRank(KEEPERS_OF_TIME_REPUTATION) >= REP_REVERED) - AddGossipItemFor(player, MENU_ID_TAKE_ME_TO_C_O_T, OPTION_ID_TAKE_ME_TO_C_O_T, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + return true; + } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + bool GossipHello(Player* player) override + { + if (player->GetReputationRank(KEEPERS_OF_TIME_REPUTATION) >= REP_REVERED) + AddGossipItemFor(player, MENU_ID_TAKE_ME_TO_C_O_T, OPTION_ID_TAKE_ME_TO_C_O_T, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - return true; + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_zephyrAI(creature); } }; diff --git a/src/server/scripts/Outland/zone_terokkar_forest.cpp b/src/server/scripts/Outland/zone_terokkar_forest.cpp index d5521265fe4..50ee9cf0039 100644 --- a/src/server/scripts/Outland/zone_terokkar_forest.cpp +++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp @@ -33,6 +33,7 @@ EndContentData */ #include "ScriptMgr.h" #include "GameObject.h" +#include "GameObjectAI.h" #include "Group.h" #include "Player.h" #include "ScriptedEscortAI.h" @@ -327,38 +328,6 @@ class npc_floon : public CreatureScript public: npc_floon() : CreatureScript("npc_floon") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF) - { - AddGossipItemFor(player, MENU_ID_PAY_UP_OR_DIE, OPTION_ID_PAY_UP_OR_DIE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, GOSSIP_HE_ALREADY_KILLED_ME, creature->GetGUID()); - } - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); - creature->SetFaction(FACTION_HOSTILE_FLOON); - creature->AI()->Talk(SAY_FLOON_ATTACK, player); - creature->AI()->AttackStart(player); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_CRACKIN_SOME_SKULLS) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, MENU_ID_COLLECT_A_DEBT, OPTION_ID_COLLECT_A_DEBT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - SendGossipMenuFor(player, GOSSIP_FLOON_STRANGE_SOUNDS, creature->GetGUID()); - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_floonAI(creature); - } - struct npc_floonAI : public ScriptedAI { npc_floonAI(Creature* creature) : ScriptedAI(creature) @@ -413,7 +382,40 @@ public: DoMeleeAttackIfReady(); } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF) + { + AddGossipItemFor(player, MENU_ID_PAY_UP_OR_DIE, OPTION_ID_PAY_UP_OR_DIE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_HE_ALREADY_KILLED_ME, me->GetGUID()); + } + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + me->SetFaction(FACTION_HOSTILE_FLOON); + Talk(SAY_FLOON_ATTACK, player); + AttackStart(player); + } + return true; + } + + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(QUEST_CRACKIN_SOME_SKULLS) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, MENU_ID_COLLECT_A_DEBT, OPTION_ID_COLLECT_A_DEBT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + + SendGossipMenuFor(player, GOSSIP_FLOON_STRANGE_SOUNDS, me->GetGUID()); + return true; + } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_floonAI(creature); + } }; /*###### @@ -496,17 +498,16 @@ public: player->FailQuest(ESCAPE_FROM_FIREWING_POINT_H); } } - }; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == ESCAPE_FROM_FIREWING_POINT_H || quest->GetQuestId() == ESCAPE_FROM_FIREWING_POINT_A) + void QuestAccept(Player* player, Quest const* quest) override { - ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); - creature->SetFaction(FACTION_ESCORTEE); + if (quest->GetQuestId() == ESCAPE_FROM_FIREWING_POINT_H || quest->GetQuestId() == ESCAPE_FROM_FIREWING_POINT_A) + { + Start(true, false, player->GetGUID()); + me->SetFaction(FACTION_ESCORTEE); + } } - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { @@ -537,47 +538,59 @@ class go_skull_pile : public GameObjectScript public: go_skull_pile() : GameObjectScript("go_skull_pile") { } - bool OnGossipSelect(Player* player, GameObject* go, uint32 sender, uint32 action) override + struct go_skull_pileAI : public GameObjectAI { - ClearGossipMenuFor(player); - switch (sender) + go_skull_pileAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_SENDER_MAIN: SendActionMenu(player, go, action); break; + uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (sender) + { + case GOSSIP_SENDER_MAIN: SendActionMenu(player, action); break; + } + return true; } - return true; - } - bool OnGossipHello(Player* player, GameObject* go) override - { - if ((player->GetQuestStatus(ADVERSARIAL_BLOOD) == QUEST_STATUS_INCOMPLETE) || player->GetQuestRewardStatus(ADVERSARIAL_BLOOD)) + bool GossipHello(Player* player, bool /*reportUse*/) override { - AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_GEZZARAK_THE_HUNTRESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_DARKSCREECHER_AKKARAI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_KARROG, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_VAKKIZ_THE_WINDRAGER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - } + if ((player->GetQuestStatus(ADVERSARIAL_BLOOD) == QUEST_STATUS_INCOMPLETE) || player->GetQuestRewardStatus(ADVERSARIAL_BLOOD)) + { + AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_GEZZARAK_THE_HUNTRESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_DARKSCREECHER_AKKARAI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_KARROG, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_VAKKIZ_THE_WINDRAGER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + } - SendGossipMenuFor(player, go->GetGOInfo()->questgiver.gossipID, go->GetGUID()); - return true; - } + SendGossipMenuFor(player, me->GetGOInfo()->questgiver.gossipID, me->GetGUID()); + return true; + } - void SendActionMenu(Player* player, GameObject* /*go*/, uint32 action) - { - switch (action) + void SendActionMenu(Player* player, uint32 action) { - case GOSSIP_ACTION_INFO_DEF + 1: - player->CastSpell(player, SUMMON_GEZZARAK_THE_HUNTRESS, false); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - player->CastSpell(player, SUMMON_DARKSCREECHER_AKKARAI, false); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - player->CastSpell(player, SUMMON_KARROG, false); - break; - case GOSSIP_ACTION_INFO_DEF + 4: - player->CastSpell(player, SUMMON_VAKKIZ_THE_WINDRAGER, false); - break; + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + player->CastSpell(player, SUMMON_GEZZARAK_THE_HUNTRESS, false); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + player->CastSpell(player, SUMMON_DARKSCREECHER_AKKARAI, false); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + player->CastSpell(player, SUMMON_KARROG, false); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + player->CastSpell(player, SUMMON_VAKKIZ_THE_WINDRAGER, false); + break; + } } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_skull_pileAI(go); } }; @@ -597,26 +610,37 @@ class npc_slim : public CreatureScript public: npc_slim() : CreatureScript("npc_slim") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override + struct npc_slimAI : public ScriptedAI { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); + npc_slimAI(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->IsVendor() && player->GetReputationRank(FACTION_CONSORTIUM) >= REP_FRIENDLY) + return true; + } + + bool GossipHello(Player* player) override { - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - SendGossipMenuFor(player, NPC_TEXT_I_SEE_YOU_ARE_A_FRIEND, creature->GetGUID()); + if (me->IsVendor() && player->GetReputationRank(FACTION_CONSORTIUM) >= REP_FRIENDLY) + { + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + SendGossipMenuFor(player, NPC_TEXT_I_SEE_YOU_ARE_A_FRIEND, me->GetGUID()); + } + else + SendGossipMenuFor(player, NPC_TEXT_NEITHER_SLIM_NOR_SHADY, me->GetGUID()); + + return true; } - else - SendGossipMenuFor(player, NPC_TEXT_NEITHER_SLIM_NOR_SHADY, creature->GetGUID()); + }; - return true; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_slimAI(creature); } }; @@ -635,26 +659,6 @@ class npc_akuno : public CreatureScript public: npc_akuno() : CreatureScript("npc_akuno") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCAPING_THE_TOMB) - { - if (npc_akunoAI* pEscortAI = CAST_AI(npc_akuno::npc_akunoAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID()); - - if (player->GetTeamId() == TEAM_ALLIANCE) - creature->SetFaction(FACTION_ESCORT_A_NEUTRAL_PASSIVE); - else - creature->SetFaction(FACTION_ESCORT_H_NEUTRAL_PASSIVE); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_akunoAI(creature); - } - struct npc_akunoAI : public npc_escortAI { npc_akunoAI(Creature* creature) : npc_escortAI(creature) { } @@ -682,7 +686,25 @@ public: { summon->AI()->AttackStart(me); } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_ESCAPING_THE_TOMB) + { + Start(false, false, player->GetGUID()); + + if (player->GetTeamId() == TEAM_ALLIANCE) + me->SetFaction(FACTION_ESCORT_A_NEUTRAL_PASSIVE); + else + me->SetFaction(FACTION_ESCORT_H_NEUTRAL_PASSIVE); + } + } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_akunoAI(creature); + } }; void AddSC_terokkar_forest() diff --git a/src/server/scripts/Outland/zone_zangarmarsh.cpp b/src/server/scripts/Outland/zone_zangarmarsh.cpp index d73acd789f9..ced7d46107f 100644 --- a/src/server/scripts/Outland/zone_zangarmarsh.cpp +++ b/src/server/scripts/Outland/zone_zangarmarsh.cpp @@ -62,87 +62,94 @@ class npcs_ashyen_and_keleth : public CreatureScript public: npcs_ashyen_and_keleth() : CreatureScript("npcs_ashyen_and_keleth") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npcs_ashyen_and_kelethAI : public ScriptedAI { - if (player->GetReputationRank(942) > REP_NEUTRAL) + npcs_ashyen_and_kelethAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override { - if (creature->GetEntry() == NPC_ASHYEN) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_ASH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + if (player->GetReputationRank(942) > REP_NEUTRAL) + { + if (me->GetEntry() == NPC_ASHYEN) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_ASH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - if (creature->GetEntry() == NPC_KELETH) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_KEL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + if (me->GetEntry() == NPC_KELETH) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_KEL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + } + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); - return true; - } + return 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 { - creature->SetPowerType(POWER_MANA); - creature->SetMaxPower(POWER_MANA, 200); //set a "fake" mana value, we can't depend on database doing it in this case - creature->SetPower(POWER_MANA, 200); - - if (creature->GetEntry() == NPC_ASHYEN) //check which Creature we are dealing with + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) { - uint32 spell = 0; - switch (player->GetReputationRank(942)) - { //mark of lore - case REP_FRIENDLY: - spell = SPELL_BLESS_ASH_FRI; - break; - case REP_HONORED: - spell = SPELL_BLESS_ASH_HON; - break; - case REP_REVERED: - spell = SPELL_BLESS_ASH_REV; - break; - case REP_EXALTED: - spell = SPELL_BLESS_ASH_EXA; - break; - default: - break; - } + me->SetPowerType(POWER_MANA); + me->SetMaxPower(POWER_MANA, 200); //set a "fake" mana value, we can't depend on database doing it in this case + me->SetPower(POWER_MANA, 200); - if (spell) + if (me->GetEntry() == NPC_ASHYEN) //check which Creature we are dealing with { - creature->CastSpell(player, spell, true); - } - } + uint32 spell = 0; + switch (player->GetReputationRank(942)) + { //mark of lore + case REP_FRIENDLY: + spell = SPELL_BLESS_ASH_FRI; + break; + case REP_HONORED: + spell = SPELL_BLESS_ASH_HON; + break; + case REP_REVERED: + spell = SPELL_BLESS_ASH_REV; + break; + case REP_EXALTED: + spell = SPELL_BLESS_ASH_EXA; + break; + default: + break; + } - if (creature->GetEntry() == NPC_KELETH) - { - uint32 spell = 0; - switch (player->GetReputationRank(942)) //mark of war - { - case REP_FRIENDLY: - spell = SPELL_BLESS_KEL_FRI; - break; - case REP_HONORED: - spell = SPELL_BLESS_KEL_HON; - break; - case REP_REVERED: - spell = SPELL_BLESS_KEL_REV; - break; - case REP_EXALTED: - spell = SPELL_BLESS_KEL_EXA; - break; - default: - break; + if (spell) + DoCast(player, spell, true); } - if (spell) + if (me->GetEntry() == NPC_KELETH) { - creature->CastSpell(player, spell, true); + uint32 spell = 0; + switch (player->GetReputationRank(942)) //mark of war + { + case REP_FRIENDLY: + spell = SPELL_BLESS_KEL_FRI; + break; + case REP_HONORED: + spell = SPELL_BLESS_KEL_HON; + break; + case REP_REVERED: + spell = SPELL_BLESS_KEL_REV; + break; + case REP_EXALTED: + spell = SPELL_BLESS_KEL_EXA; + break; + default: + break; + } + + if (spell) + DoCast(player, spell, true); } + CloseGossipMenuFor(player); + player->TalkedToCreature(me->GetEntry(), me->GetGUID()); } - CloseGossipMenuFor(player); - player->TalkedToCreature(creature->GetEntry(), creature->GetGUID()); + return true; } - return true; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npcs_ashyen_and_kelethAI(creature); } }; @@ -202,32 +209,33 @@ public: DoMeleeAttackIfReady(); } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_cooshcooshAI(creature); - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_CRACK_SKULLS) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_COOSH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(QUEST_CRACK_SKULLS) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_COOSH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, 9441, creature->GetGUID()); - return true; - } + SendGossipMenuFor(player, 9441, me->GetGUID()); + return true; + } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - CloseGossipMenuFor(player); - creature->SetFaction(FACTION_HOSTILE_CO); - creature->AI()->AttackStart(player); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF) + { + CloseGossipMenuFor(player); + me->SetFaction(FACTION_HOSTILE_CO); + AttackStart(player); + } + return true; } - return true; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_cooshcooshAI(creature); } }; @@ -244,48 +252,58 @@ class npc_elder_kuruti : public CreatureScript public: npc_elder_kuruti() : CreatureScript("npc_elder_kuruti") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_elder_kurutiAI : public ScriptedAI { - if (player->GetQuestStatus(9803) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KUR1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + npc_elder_kurutiAI(Creature* creature) : ScriptedAI(creature) { } - SendGossipMenuFor(player, 9226, creature->GetGUID()); + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(9803) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KUR1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - return true; - } + SendGossipMenuFor(player, 9226, me->GetGUID()); + return true; + } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KUR2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, 9227, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KUR3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - SendGossipMenuFor(player, 9229, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 2: + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) { - if (!player->HasItemCount(24573)) + case GOSSIP_ACTION_INFO_DEF: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KUR2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, 9227, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KUR3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, 9229, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: { - ItemPosCountVec dest; - uint32 itemId = 24573; - InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, 1, NULL); - if (msg == EQUIP_ERR_OK) + if (!player->HasItemCount(24573)) { - player->StoreNewItem(dest, itemId, true); + ItemPosCountVec dest; + uint32 itemId = 24573; + InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, 1, NULL); + if (msg == EQUIP_ERR_OK) + { + player->StoreNewItem(dest, itemId, true); + } + else + player->SendEquipError(msg, NULL, NULL, itemId); } - else - player->SendEquipError(msg, NULL, NULL, itemId); + SendGossipMenuFor(player, 9231, me->GetGUID()); + break; } - SendGossipMenuFor(player, 9231, creature->GetGUID()); - break; } + return true; } - return true; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_elder_kurutiAI(creature); } }; @@ -347,19 +365,16 @@ public: break; } } - }; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCAPE_FROM) + void QuestAccept(Player* player, Quest const* quest) override { - creature->AI()->Talk(SAY_START, player); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_kayra_longmane::npc_kayra_longmaneAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID()); + if (quest->GetQuestId() == QUEST_ESCAPE_FROM) + { + Talk(SAY_START, player); + Start(false, false, player->GetGUID()); + } } - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp index 8e63c84fe2a..8cba4c1a6b4 100644 --- a/src/server/scripts/World/go_scripts.cpp +++ b/src/server/scripts/World/go_scripts.cpp @@ -74,10 +74,20 @@ class go_cat_figurine : public GameObjectScript public: go_cat_figurine() : GameObjectScript("go_cat_figurine") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_cat_figurineAI : public GameObjectAI { - player->CastSpell(player, SPELL_SUMMON_GHOST_SABER, true); - return false; + go_cat_figurineAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + player->CastSpell(player, SPELL_SUMMON_GHOST_SABER, true); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_cat_figurineAI(go); } }; @@ -90,12 +100,22 @@ class go_barov_journal : public GameObjectScript public: go_barov_journal() : GameObjectScript("go_barov_journal") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_barov_journalAI : public GameObjectAI { - if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 280 && !player->HasSpell(26086)) - player->CastSpell(player, 26095, false); + go_barov_journalAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 280 && !player->HasSpell(26086)) + player->CastSpell(player, 26095, false); + + return true; + } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_barov_journalAI(go); } }; @@ -114,17 +134,27 @@ class go_gilded_brazier : public GameObjectScript public: go_gilded_brazier() : GameObjectScript("go_gilded_brazier") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_gilded_brazierAI : public GameObjectAI { - if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + go_gilded_brazierAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - if (player->GetQuestStatus(QUEST_THE_FIRST_TRIAL) == QUEST_STATUS_INCOMPLETE) + if (me->GetGoType() == GAMEOBJECT_TYPE_GOOBER) { - if (Creature* Stillblade = player->SummonCreature(NPC_STILLBLADE, 8106.11f, -7542.06f, 151.775f, 3.02598f, TEMPSUMMON_DEAD_DESPAWN, 60000)) - Stillblade->AI()->AttackStart(player); + if (player->GetQuestStatus(QUEST_THE_FIRST_TRIAL) == QUEST_STATUS_INCOMPLETE) + { + if (Creature* Stillblade = player->SummonCreature(NPC_STILLBLADE, 8106.11f, -7542.06f, 151.775f, 3.02598f, TEMPSUMMON_DEAD_DESPAWN, 60000)) + Stillblade->AI()->AttackStart(player); + } } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_gilded_brazierAI(go); } }; @@ -137,12 +167,22 @@ class go_orb_of_command : public GameObjectScript public: go_orb_of_command() : GameObjectScript("go_orb_of_command") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_orb_of_commandAI : public GameObjectAI { - if (player->GetQuestRewardStatus(7761)) - player->CastSpell(player, 23460, true); + go_orb_of_commandAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->GetQuestRewardStatus(7761)) + player->CastSpell(player, 23460, true); - return true; + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_orb_of_commandAI(go); } }; @@ -155,12 +195,22 @@ class go_tablet_of_madness : public GameObjectScript public: go_tablet_of_madness() : GameObjectScript("go_tablet_of_madness") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_tablet_of_madnessAI : public GameObjectAI { - if (player->HasSkill(SKILL_ALCHEMY) && player->GetSkillValue(SKILL_ALCHEMY) >= 300 && !player->HasSpell(24266)) - player->CastSpell(player, 24267, false); + go_tablet_of_madnessAI(GameObject* go) : GameObjectAI(go) { } - return true; + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->HasSkill(SKILL_ALCHEMY) && player->GetSkillValue(SKILL_ALCHEMY) >= 300 && !player->HasSpell(24266)) + player->CastSpell(player, 24267, false); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_tablet_of_madnessAI(go); } }; @@ -173,16 +223,26 @@ class go_tablet_of_the_seven : public GameObjectScript public: go_tablet_of_the_seven() : GameObjectScript("go_tablet_of_the_seven") { } - /// @todo use gossip option ("Transcript the Tablet") instead, if Trinity adds support. - bool OnGossipHello(Player* player, GameObject* go) override + struct go_tablet_of_the_sevenAI : public GameObjectAI { - if (go->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) - return true; + go_tablet_of_the_sevenAI(GameObject* go) : GameObjectAI(go) { } + + /// @todo use gossip option ("Transcript the Tablet") instead, if Trinity adds support. + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (me->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) + return true; - if (player->GetQuestStatus(4296) == QUEST_STATUS_INCOMPLETE) - player->CastSpell(player, 15065, false); + if (player->GetQuestStatus(4296) == QUEST_STATUS_INCOMPLETE) + player->CastSpell(player, 15065, false); - return true; + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_tablet_of_the_sevenAI(go); } }; @@ -195,12 +255,22 @@ class go_jump_a_tron : public GameObjectScript public: go_jump_a_tron() : GameObjectScript("go_jump_a_tron") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_jump_a_tronAI : public GameObjectAI { - if (player->GetQuestStatus(10111) == QUEST_STATUS_INCOMPLETE) - player->CastSpell(player, 33382, true); + go_jump_a_tronAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->GetQuestStatus(10111) == QUEST_STATUS_INCOMPLETE) + player->CastSpell(player, 33382, true); + + return true; + } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_jump_a_tronAI(go); } }; @@ -229,39 +299,49 @@ class go_ethereum_prison : public GameObjectScript public: go_ethereum_prison() : GameObjectScript("go_ethereum_prison") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_ethereum_prisonAI : public GameObjectAI { - go->UseDoorOrButton(); - int Random = rand32() % (sizeof(NpcPrisonEntry) / sizeof(uint32)); + go_ethereum_prisonAI(GameObject* go) : GameObjectAI(go) { } - if (Creature* creature = player->SummonCreature(NpcPrisonEntry[Random], go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), - TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) + bool GossipHello(Player* player, bool /*reportUse*/) override { - if (!creature->IsHostileTo(player)) + me->UseDoorOrButton(); + int Random = rand32() % (sizeof(NpcPrisonEntry) / sizeof(uint32)); + + if (Creature* creature = player->SummonCreature(NpcPrisonEntry[Random], me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetAngle(player), + TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) { - if (FactionTemplateEntry const* pFaction = creature->GetFactionTemplateEntry()) + if (!creature->IsHostileTo(player)) { - uint32 Spell = 0; - - switch (pFaction->Faction) + if (FactionTemplateEntry const* pFaction = creature->GetFactionTemplateEntry()) { - case 1011: Spell = SPELL_REP_LC; break; - case 935: Spell = SPELL_REP_SHAT; break; - case 942: Spell = SPELL_REP_CE; break; - case 933: Spell = SPELL_REP_CON; break; - case 989: Spell = SPELL_REP_KT; break; - case 970: Spell = SPELL_REP_SPOR; break; - } + uint32 Spell = 0; - if (Spell) - creature->CastSpell(player, Spell, false); - else - TC_LOG_ERROR("scripts", "go_ethereum_prison summoned Creature (entry %u) but faction (%u) are not expected by script.", creature->GetEntry(), creature->GetFaction()); + switch (pFaction->Faction) + { + case 1011: Spell = SPELL_REP_LC; break; + case 935: Spell = SPELL_REP_SHAT; break; + case 942: Spell = SPELL_REP_CE; break; + case 933: Spell = SPELL_REP_CON; break; + case 989: Spell = SPELL_REP_KT; break; + case 970: Spell = SPELL_REP_SPOR; break; + } + + if (Spell) + creature->CastSpell(player, Spell, false); + else + TC_LOG_ERROR("scripts", "go_ethereum_prison summoned Creature (entry %u) but faction (%u) are not expected by script.", creature->GetEntry(), creature->GetFaction()); + } } } + + return false; } + }; - return false; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_ethereum_prisonAI(go); } }; @@ -279,15 +359,25 @@ class go_ethereum_stasis : public GameObjectScript public: go_ethereum_stasis() : GameObjectScript("go_ethereum_stasis") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_ethereum_stasisAI : public GameObjectAI { - go->UseDoorOrButton(); - int Random = rand32() % (sizeof(NpcStasisEntry) / sizeof(uint32)); + go_ethereum_stasisAI(GameObject* go) : GameObjectAI(go) { } - player->SummonCreature(NpcStasisEntry[Random], go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), - TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + bool GossipHello(Player* player, bool /*reportUse*/) override + { + me->UseDoorOrButton(); + int Random = rand32() % (sizeof(NpcStasisEntry) / sizeof(uint32)); + + player->SummonCreature(NpcStasisEntry[Random], me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetAngle(player), + TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - return false; + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_ethereum_stasisAI(go); } }; @@ -305,12 +395,22 @@ class go_resonite_cask : public GameObjectScript public: go_resonite_cask() : GameObjectScript("go_resonite_cask") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_resonite_caskAI : public GameObjectAI { - if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER) - go->SummonCreature(NPC_GOGGEROC, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 300000); + go_resonite_caskAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + if (me->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + me->SummonCreature(NPC_GOGGEROC, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 300000); - return false; + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_resonite_caskAI(go); } }; @@ -328,12 +428,22 @@ class go_sacred_fire_of_life : public GameObjectScript public: go_sacred_fire_of_life() : GameObjectScript("go_sacred_fire_of_life") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_sacred_fire_of_lifeAI : public GameObjectAI { - if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER) - player->SummonCreature(NPC_ARIKARA, -5008.338f, -2118.894f, 83.657f, 0.874f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + go_sacred_fire_of_lifeAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (me->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + player->SummonCreature(NPC_ARIKARA, -5008.338f, -2118.894f, 83.657f, 0.874f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - return true; + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_sacred_fire_of_lifeAI(go); } }; @@ -356,30 +466,40 @@ class go_shrine_of_the_birds : public GameObjectScript public: go_shrine_of_the_birds() : GameObjectScript("go_shrine_of_the_birds") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_shrine_of_the_birdsAI : public GameObjectAI { - uint32 BirdEntry = 0; + go_shrine_of_the_birdsAI(GameObject* go) : GameObjectAI(go) { } - float fX, fY, fZ; - go->GetClosePoint(fX, fY, fZ, go->GetCombatReach(), INTERACTION_DISTANCE); - - switch (go->GetEntry()) + bool GossipHello(Player* player, bool /*reportUse*/) override { - case GO_SHRINE_HAWK: - BirdEntry = NPC_HAWK_GUARD; - break; - case GO_SHRINE_EAGLE: - BirdEntry = NPC_EAGLE_GUARD; - break; - case GO_SHRINE_FALCON: - BirdEntry = NPC_FALCON_GUARD; - break; - } + uint32 BirdEntry = 0; - if (BirdEntry) - player->SummonCreature(BirdEntry, fX, fY, fZ, go->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + float fX, fY, fZ; + me->GetClosePoint(fX, fY, fZ, me->GetCombatReach(), INTERACTION_DISTANCE); + + switch (me->GetEntry()) + { + case GO_SHRINE_HAWK: + BirdEntry = NPC_HAWK_GUARD; + break; + case GO_SHRINE_EAGLE: + BirdEntry = NPC_EAGLE_GUARD; + break; + case GO_SHRINE_FALCON: + BirdEntry = NPC_FALCON_GUARD; + break; + } + + if (BirdEntry) + player->SummonCreature(BirdEntry, fX, fY, fZ, me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + + return false; + } + }; - return false; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_shrine_of_the_birdsAI(go); } }; @@ -399,15 +519,25 @@ class go_southfury_moonstone : public GameObjectScript public: go_southfury_moonstone() : GameObjectScript("go_southfury_moonstone") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_southfury_moonstoneAI : public GameObjectAI { - //implicitTarget=48 not implemented as of writing this code, and manual summon may be just ok for our purpose - //player->CastSpell(player, SPELL_SUMMON_RIZZLE, false); + go_southfury_moonstoneAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + //implicitTarget=48 not implemented as of writing this code, and manual summon may be just ok for our purpose + //player->CastSpell(player, SPELL_SUMMON_RIZZLE, false); - if (Creature* creature = player->SummonCreature(NPC_RIZZLE, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0)) - creature->CastSpell(player, SPELL_BLACKJACK, false); + if (Creature* creature = player->SummonCreature(NPC_RIZZLE, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0)) + creature->CastSpell(player, SPELL_BLACKJACK, false); - return false; + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_southfury_moonstoneAI(go); } }; @@ -428,14 +558,23 @@ class go_tele_to_dalaran_crystal : public GameObjectScript public: go_tele_to_dalaran_crystal() : GameObjectScript("go_tele_to_dalaran_crystal") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_tele_to_dalaran_crystalAI : public GameObjectAI { - if (player->GetQuestRewardStatus(QUEST_TELE_CRYSTAL_FLAG)) - return false; + go_tele_to_dalaran_crystalAI(GameObject* go) : GameObjectAI(go) { } - player->GetSession()->SendNotification(GO_TELE_TO_DALARAN_CRYSTAL_FAILED); + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->GetQuestRewardStatus(QUEST_TELE_CRYSTAL_FLAG)) + return false; + + player->GetSession()->SendNotification(GO_TELE_TO_DALARAN_CRYSTAL_FAILED); + return true; + } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_tele_to_dalaran_crystalAI(go); } }; @@ -448,12 +587,22 @@ class go_tele_to_violet_stand : public GameObjectScript public: go_tele_to_violet_stand() : GameObjectScript("go_tele_to_violet_stand") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_tele_to_violet_standAI : public GameObjectAI { - if (player->GetQuestRewardStatus(QUEST_LEARN_LEAVE_RETURN) || player->GetQuestStatus(QUEST_LEARN_LEAVE_RETURN) == QUEST_STATUS_INCOMPLETE) - return false; + go_tele_to_violet_standAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->GetQuestRewardStatus(QUEST_LEARN_LEAVE_RETURN) || player->GetQuestStatus(QUEST_LEARN_LEAVE_RETURN) == QUEST_STATUS_INCOMPLETE) + return false; + + return true; + } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_tele_to_violet_standAI(go); } }; @@ -478,41 +627,52 @@ class go_fel_crystalforge : public GameObjectScript public: go_fel_crystalforge() : GameObjectScript("go_fel_crystalforge") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_fel_crystalforgeAI : public GameObjectAI { - if (go->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ - player->PrepareQuestMenu(go->GetGUID()); /* return true*/ + go_fel_crystalforgeAI(GameObject* go) : GameObjectAI(go) { } - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (me->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ + player->PrepareQuestMenu(me->GetGUID()); /* return true*/ - SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_TEXT, go->GetGUID()); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - return true; - } + SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_TEXT, me->GetGUID()); - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF: - player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_BEAST, false); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 1: - player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_BEAST, false); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_TEXT, go->GetGUID()); - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF: + player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_BEAST, false); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 1: + player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_BEAST, false); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_TEXT, me->GetGUID()); + break; + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_fel_crystalforgeAI(go); } }; @@ -537,41 +697,52 @@ class go_bashir_crystalforge : public GameObjectScript public: go_bashir_crystalforge() : GameObjectScript("go_bashir_crystalforge") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_bashir_crystalforgeAI : public GameObjectAI { - if (go->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ - player->PrepareQuestMenu(go->GetGUID()); /* return true*/ + go_bashir_crystalforgeAI(GameObject* go) : GameObjectAI(go) { } - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (me->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ + player->PrepareQuestMenu(me->GetGUID()); /* return true*/ - SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_TEXT, go->GetGUID()); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - return true; - } + SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_TEXT, me->GetGUID()); - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF: - player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_SORCERER, false); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 1: - player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_SORCERER, false); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_TEXT, go->GetGUID()); - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF: + player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_SORCERER, false); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 1: + player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_SORCERER, false); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_TEXT, me->GetGUID()); + break; + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_bashir_crystalforgeAI(go); } }; @@ -601,42 +772,52 @@ class go_matrix_punchograph : public GameObjectScript public: go_matrix_punchograph() : GameObjectScript("go_matrix_punchograph") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_matrix_punchographAI : public GameObjectAI { - switch (go->GetEntry()) + go_matrix_punchographAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - case MATRIX_PUNCHOGRAPH_3005_A: - if (player->HasItemCount(ITEM_WHITE_PUNCH_CARD)) - { - player->DestroyItemCount(ITEM_WHITE_PUNCH_CARD, 1, true); - player->CastSpell(player, SPELL_YELLOW_PUNCH_CARD, true); - } - break; - case MATRIX_PUNCHOGRAPH_3005_B: - if (player->HasItemCount(ITEM_YELLOW_PUNCH_CARD)) - { - player->DestroyItemCount(ITEM_YELLOW_PUNCH_CARD, 1, true); - player->CastSpell(player, SPELL_BLUE_PUNCH_CARD, true); - } - break; - case MATRIX_PUNCHOGRAPH_3005_C: - if (player->HasItemCount(ITEM_BLUE_PUNCH_CARD)) - { - player->DestroyItemCount(ITEM_BLUE_PUNCH_CARD, 1, true); - player->CastSpell(player, SPELL_RED_PUNCH_CARD, true); - } - break; - case MATRIX_PUNCHOGRAPH_3005_D: - if (player->HasItemCount(ITEM_RED_PUNCH_CARD)) - { - player->DestroyItemCount(ITEM_RED_PUNCH_CARD, 1, true); - player->CastSpell(player, SPELL_PRISMATIC_PUNCH_CARD, true); - } - break; - default: - break; + switch (me->GetEntry()) + { + case MATRIX_PUNCHOGRAPH_3005_A: + if (player->HasItemCount(ITEM_WHITE_PUNCH_CARD)) + { + player->DestroyItemCount(ITEM_WHITE_PUNCH_CARD, 1, true); + player->CastSpell(player, SPELL_YELLOW_PUNCH_CARD, true); + } + break; + case MATRIX_PUNCHOGRAPH_3005_B: + if (player->HasItemCount(ITEM_YELLOW_PUNCH_CARD)) + { + player->DestroyItemCount(ITEM_YELLOW_PUNCH_CARD, 1, true); + player->CastSpell(player, SPELL_BLUE_PUNCH_CARD, true); + } + break; + case MATRIX_PUNCHOGRAPH_3005_C: + if (player->HasItemCount(ITEM_BLUE_PUNCH_CARD)) + { + player->DestroyItemCount(ITEM_BLUE_PUNCH_CARD, 1, true); + player->CastSpell(player, SPELL_RED_PUNCH_CARD, true); + } + break; + case MATRIX_PUNCHOGRAPH_3005_D: + if (player->HasItemCount(ITEM_RED_PUNCH_CARD)) + { + player->DestroyItemCount(ITEM_RED_PUNCH_CARD, 1, true); + player->CastSpell(player, SPELL_PRISMATIC_PUNCH_CARD, true); + } + break; + default: + break; + } + return false; } - return false; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_matrix_punchographAI(go); } }; @@ -654,16 +835,26 @@ class go_scourge_cage : public GameObjectScript public: go_scourge_cage() : GameObjectScript("go_scourge_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_scourge_cageAI : public GameObjectAI { - go->UseDoorOrButton(); - if (Creature* pNearestPrisoner = go->FindNearestCreature(NPC_SCOURGE_PRISONER, 5.0f, true)) + go_scourge_cageAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - player->KilledMonsterCredit(NPC_SCOURGE_PRISONER, pNearestPrisoner->GetGUID()); - pNearestPrisoner->DisappearAndDie(); + me->UseDoorOrButton(); + if (Creature* pNearestPrisoner = me->FindNearestCreature(NPC_SCOURGE_PRISONER, 5.0f, true)) + { + player->KilledMonsterCredit(NPC_SCOURGE_PRISONER, pNearestPrisoner->GetGUID()); + pNearestPrisoner->DisappearAndDie(); + } + + return true; } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_scourge_cageAI(go); } }; @@ -682,15 +873,25 @@ class go_arcane_prison : public GameObjectScript public: go_arcane_prison() : GameObjectScript("go_arcane_prison") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_arcane_prisonAI : public GameObjectAI { - if (player->GetQuestStatus(QUEST_PRISON_BREAK) == QUEST_STATUS_INCOMPLETE) + go_arcane_prisonAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - go->SummonCreature(25318, 3485.089844f, 6115.7422188f, 70.966812f, 0, TEMPSUMMON_TIMED_DESPAWN, 60000); - player->CastSpell(player, SPELL_ARCANE_PRISONER_KILL_CREDIT, true); - return true; + if (player->GetQuestStatus(QUEST_PRISON_BREAK) == QUEST_STATUS_INCOMPLETE) + { + me->SummonCreature(25318, 3485.089844f, 6115.7422188f, 70.966812f, 0, TEMPSUMMON_TIMED_DESPAWN, 60000); + player->CastSpell(player, SPELL_ARCANE_PRISONER_KILL_CREDIT, true); + return true; + } + return false; } - return false; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_arcane_prisonAI(go); } }; @@ -709,12 +910,22 @@ class go_blood_filled_orb : public GameObjectScript public: go_blood_filled_orb() : GameObjectScript("go_blood_filled_orb") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_blood_filled_orbAI : public GameObjectAI { - if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER) - player->SummonCreature(NPC_ZELEMAR, -369.746f, 166.759f, -21.50f, 5.235f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + go_blood_filled_orbAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (me->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + player->SummonCreature(NPC_ZELEMAR, -369.746f, 166.759f, -21.50f, 5.235f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - return true; + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_blood_filled_orbAI(go); } }; @@ -740,41 +951,51 @@ class go_jotunheim_cage : public GameObjectScript public: go_jotunheim_cage() : GameObjectScript("go_jotunheim_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_jotunheim_cageAI : public GameObjectAI { - go->UseDoorOrButton(); - Creature* pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_HUMAN, 5.0f, true); - if (!pPrisoner) + go_jotunheim_cageAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_TROLL, 5.0f, true); + me->UseDoorOrButton(); + Creature* pPrisoner = me->FindNearestCreature(NPC_EBON_BLADE_PRISONER_HUMAN, 5.0f, true); if (!pPrisoner) { - pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_ORC, 5.0f, true); + pPrisoner = me->FindNearestCreature(NPC_EBON_BLADE_PRISONER_TROLL, 5.0f, true); if (!pPrisoner) - pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_NE, 5.0f, true); + { + pPrisoner = me->FindNearestCreature(NPC_EBON_BLADE_PRISONER_ORC, 5.0f, true); + if (!pPrisoner) + pPrisoner = me->FindNearestCreature(NPC_EBON_BLADE_PRISONER_NE, 5.0f, true); + } } - } - if (!pPrisoner || !pPrisoner->IsAlive()) - return false; + if (!pPrisoner || !pPrisoner->IsAlive()) + return false; - pPrisoner->DisappearAndDie(); - player->KilledMonsterCredit(NPC_EBON_BLADE_PRISONER_HUMAN); - switch (pPrisoner->GetEntry()) - { - case NPC_EBON_BLADE_PRISONER_HUMAN: - player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_H, true); - break; - case NPC_EBON_BLADE_PRISONER_NE: - player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_NE, true); - break; - case NPC_EBON_BLADE_PRISONER_TROLL: - player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_TROLL, true); - break; - case NPC_EBON_BLADE_PRISONER_ORC: - player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_ORC, true); - break; + pPrisoner->DisappearAndDie(); + player->KilledMonsterCredit(NPC_EBON_BLADE_PRISONER_HUMAN); + switch (pPrisoner->GetEntry()) + { + case NPC_EBON_BLADE_PRISONER_HUMAN: + player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_H, true); + break; + case NPC_EBON_BLADE_PRISONER_NE: + player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_NE, true); + break; + case NPC_EBON_BLADE_PRISONER_TROLL: + player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_TROLL, true); + break; + case NPC_EBON_BLADE_PRISONER_ORC: + player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_ORC, true); + break; + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_jotunheim_cageAI(go); } }; @@ -790,14 +1011,23 @@ class go_table_theka : public GameObjectScript public: go_table_theka() : GameObjectScript("go_table_theka") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_table_thekaAI : public GameObjectAI { - if (player->GetQuestStatus(QUEST_SPIDER_GOLD) == QUEST_STATUS_INCOMPLETE) - player->AreaExploredOrEventHappens(QUEST_SPIDER_GOLD); + go_table_thekaAI(GameObject* go) : GameObjectAI(go) { } - SendGossipMenuFor(player, GOSSIP_TABLE_THEKA, go->GetGUID()); + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->GetQuestStatus(QUEST_SPIDER_GOLD) == QUEST_STATUS_INCOMPLETE) + player->AreaExploredOrEventHappens(QUEST_SPIDER_GOLD); - return true; + SendGossipMenuFor(player, GOSSIP_TABLE_THEKA, me->GetGUID()); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_table_thekaAI(go); } }; @@ -816,14 +1046,23 @@ class go_inconspicuous_landmark : public GameObjectScript public: go_inconspicuous_landmark() : GameObjectScript("go_inconspicuous_landmark") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_inconspicuous_landmarkAI : public GameObjectAI { - if (player->HasItemCount(ITEM_CUERGOS_KEY)) - return false; + go_inconspicuous_landmarkAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->HasItemCount(ITEM_CUERGOS_KEY)) + return false; - player->CastSpell(player, SPELL_SUMMON_PIRATES_TREASURE_AND_TRIGGER_MOB, true); + player->CastSpell(player, SPELL_SUMMON_PIRATES_TREASURE_AND_TRIGGER_MOB, true); + return true; + } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_inconspicuous_landmarkAI(go); } }; @@ -844,7 +1083,7 @@ class go_soulwell : public GameObjectScript bool GossipHello(Player* player, bool /*reportUse*/) override { - Unit* owner = go->GetOwner(); + Unit* owner = me->GetOwner(); if (!owner || owner->GetTypeId() != TYPEID_PLAYER || !player->IsInSameRaidWith(owner->ToPlayer())) return true; return false; @@ -877,31 +1116,41 @@ class go_dragonflayer_cage : public GameObjectScript public: go_dragonflayer_cage() : GameObjectScript("go_dragonflayer_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_dragonflayer_cageAI : public GameObjectAI { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_PRISONERS_OF_WYRMSKULL) != QUEST_STATUS_INCOMPLETE) - return true; + go_dragonflayer_cageAI(GameObject* go) : GameObjectAI(go) { } - Creature* pPrisoner = go->FindNearestCreature(NPC_PRISONER_PRIEST, 2.0f); - if (!pPrisoner) + bool GossipHello(Player* player, bool /*reportUse*/) override { - pPrisoner = go->FindNearestCreature(NPC_PRISONER_MAGE, 2.0f); + me->UseDoorOrButton(); + if (player->GetQuestStatus(QUEST_PRISONERS_OF_WYRMSKULL) != QUEST_STATUS_INCOMPLETE) + return true; + + Creature* pPrisoner = me->FindNearestCreature(NPC_PRISONER_PRIEST, 2.0f); if (!pPrisoner) { - pPrisoner = go->FindNearestCreature(NPC_PRISONER_WARRIOR, 2.0f); + pPrisoner = me->FindNearestCreature(NPC_PRISONER_MAGE, 2.0f); if (!pPrisoner) - pPrisoner = go->FindNearestCreature(NPC_PRISONER_PALADIN, 2.0f); + { + pPrisoner = me->FindNearestCreature(NPC_PRISONER_WARRIOR, 2.0f); + if (!pPrisoner) + pPrisoner = me->FindNearestCreature(NPC_PRISONER_PALADIN, 2.0f); + } } - } - if (!pPrisoner || !pPrisoner->IsAlive()) + if (!pPrisoner || !pPrisoner->IsAlive()) + return true; + + /// @todo prisoner should help player for a short period of time + player->KilledMonsterCredit(NPC_CAPTURED_VALGARDE_PRISONER_PROXY); + pPrisoner->DespawnOrUnsummon(); return true; + } + }; - /// @todo prisoner should help player for a short period of time - player->KilledMonsterCredit(NPC_CAPTURED_VALGARDE_PRISONER_PROXY); - pPrisoner->DespawnOrUnsummon(); - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_dragonflayer_cageAI(go); } }; @@ -921,20 +1170,30 @@ class go_tadpole_cage : public GameObjectScript public: go_tadpole_cage() : GameObjectScript("go_tadpole_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_tadpole_cageAI : public GameObjectAI { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_OH_NOES_THE_TADPOLES) == QUEST_STATUS_INCOMPLETE) + go_tadpole_cageAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - Creature* pTadpole = go->FindNearestCreature(NPC_WINTERFIN_TADPOLE, 1.0f); - if (pTadpole) + me->UseDoorOrButton(); + if (player->GetQuestStatus(QUEST_OH_NOES_THE_TADPOLES) == QUEST_STATUS_INCOMPLETE) { - pTadpole->DisappearAndDie(); - player->KilledMonsterCredit(NPC_WINTERFIN_TADPOLE); - //FIX: Summon minion tadpole + Creature* pTadpole = me->FindNearestCreature(NPC_WINTERFIN_TADPOLE, 1.0f); + if (pTadpole) + { + pTadpole->DisappearAndDie(); + player->KilledMonsterCredit(NPC_WINTERFIN_TADPOLE); + //FIX: Summon minion tadpole + } } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_tadpole_cageAI(go); } }; @@ -962,43 +1221,54 @@ class go_amberpine_outhouse : public GameObjectScript public: go_amberpine_outhouse() : GameObjectScript("go_amberpine_outhouse") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_amberpine_outhouseAI : public GameObjectAI { - QuestStatus status = player->GetQuestStatus(QUEST_DOING_YOUR_DUTY); - if (status == QUEST_STATUS_INCOMPLETE || status == QUEST_STATUS_COMPLETE || status == QUEST_STATUS_REWARDED) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_USE_OUTHOUSE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, GOSSIP_OUTHOUSE_VACANT, go->GetGUID()); - } - else - SendGossipMenuFor(player, GOSSIP_OUTHOUSE_INUSE, go->GetGUID()); - - return true; - } + go_amberpine_outhouseAI(GameObject* go) : GameObjectAI(go) { } - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF +1) + bool GossipHello(Player* player, bool /*reportUse*/) override { - CloseGossipMenuFor(player); - Creature* target = GetClosestCreatureWithEntry(player, NPC_OUTHOUSE_BUNNY, 3.0f); - if (target) + QuestStatus status = player->GetQuestStatus(QUEST_DOING_YOUR_DUTY); + if (status == QUEST_STATUS_INCOMPLETE || status == QUEST_STATUS_COMPLETE || status == QUEST_STATUS_REWARDED) { - target->AI()->SetData(1, player->getGender()); - go->CastSpell(target, SPELL_INDISPOSED_III); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_USE_OUTHOUSE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_OUTHOUSE_VACANT, me->GetGUID()); } - go->CastSpell(player, SPELL_INDISPOSED); - if (player->HasItemCount(ITEM_ANDERHOLS_SLIDER_CIDER)) - go->CastSpell(player, SPELL_CREATE_AMBERSEEDS); + else + SendGossipMenuFor(player, GOSSIP_OUTHOUSE_INUSE, me->GetGUID()); + return true; } - else + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - CloseGossipMenuFor(player); - player->GetSession()->SendNotification(GO_ANDERHOLS_SLIDER_CIDER_NOT_FOUND); - return false; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + Creature* target = GetClosestCreatureWithEntry(player, NPC_OUTHOUSE_BUNNY, 3.0f); + if (target) + { + target->AI()->SetData(1, player->getGender()); + me->CastSpell(target, SPELL_INDISPOSED_III); + } + me->CastSpell(player, SPELL_INDISPOSED); + if (player->HasItemCount(ITEM_ANDERHOLS_SLIDER_CIDER)) + me->CastSpell(player, SPELL_CREATE_AMBERSEEDS); + return true; + } + else + { + CloseGossipMenuFor(player); + player->GetSession()->SendNotification(GO_ANDERHOLS_SLIDER_CIDER_NOT_FOUND); + return false; + } } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_amberpine_outhouseAI(go); } }; @@ -1018,12 +1288,22 @@ class go_hive_pod : public GameObjectScript public: go_hive_pod() : GameObjectScript("go_hive_pod") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_hive_podAI : public GameObjectAI { - player->SendLoot(go->GetGUID(), LOOT_CORPSE); - go->SummonCreature(NPC_HIVE_AMBUSHER, go->GetPositionX()+1, go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); - go->SummonCreature(NPC_HIVE_AMBUSHER, go->GetPositionX(), go->GetPositionY()+1, go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); - return true; + go_hive_podAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + player->SendLoot(me->GetGUID(), LOOT_CORPSE); + me->SummonCreature(NPC_HIVE_AMBUSHER, me->GetPositionX() + 1, me->GetPositionY(), me->GetPositionZ(), me->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); + me->SummonCreature(NPC_HIVE_AMBUSHER, me->GetPositionX(), me->GetPositionY() + 1, me->GetPositionZ(), me->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_hive_podAI(go); } }; @@ -1032,10 +1312,20 @@ class go_massive_seaforium_charge : public GameObjectScript public: go_massive_seaforium_charge() : GameObjectScript("go_massive_seaforium_charge") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_massive_seaforium_chargeAI : public GameObjectAI { - go->SetLootState(GO_JUST_DEACTIVATED); - return true; + go_massive_seaforium_chargeAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + me->SetLootState(GO_JUST_DEACTIVATED); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_massive_seaforium_chargeAI(go); } }; @@ -1055,23 +1345,33 @@ class go_veil_skith_cage : public GameObjectScript public: go_veil_skith_cage() : GameObjectScript("go_veil_skith_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_veil_skith_cageAI : public GameObjectAI { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_MISSING_FRIENDS) == QUEST_STATUS_INCOMPLETE) + go_veil_skith_cageAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - std::list<Creature*> childrenList; - GetCreatureListWithEntryInGrid(childrenList, go, NPC_CAPTIVE_CHILD, INTERACTION_DISTANCE); - for (std::list<Creature*>::const_iterator itr = childrenList.begin(); itr != childrenList.end(); ++itr) + me->UseDoorOrButton(); + if (player->GetQuestStatus(QUEST_MISSING_FRIENDS) == QUEST_STATUS_INCOMPLETE) { - player->KilledMonsterCredit(NPC_CAPTIVE_CHILD, (*itr)->GetGUID()); - (*itr)->DespawnOrUnsummon(5000); - (*itr)->GetMotionMaster()->MovePoint(1, go->GetPositionX()+5, go->GetPositionY(), go->GetPositionZ()); - (*itr)->AI()->Talk(SAY_FREE_0); - (*itr)->GetMotionMaster()->Clear(); + std::vector<Creature*> childrenList; + GetCreatureListWithEntryInGrid(childrenList, me, NPC_CAPTIVE_CHILD, INTERACTION_DISTANCE); + for (Creature* creature : childrenList) + { + player->KilledMonsterCredit(NPC_CAPTIVE_CHILD, creature->GetGUID()); + creature->DespawnOrUnsummon(5000); + creature->GetMotionMaster()->MovePoint(1, me->GetPositionX() + 5, me->GetPositionY(), me->GetPositionZ()); + creature->AI()->Talk(SAY_FREE_0); + creature->GetMotionMaster()->Clear(); + } } + return false; } - return false; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_veil_skith_cageAI(go); } }; @@ -1092,16 +1392,28 @@ class go_frostblade_shrine : public GameObjectScript public: go_frostblade_shrine() : GameObjectScript("go_frostblade_shrine") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_frostblade_shrineAI : public GameObjectAI { - go->UseDoorOrButton(10); - if (!player->HasAura(SPELL_RECENT_MEDITATION)) - if (player->GetQuestStatus(QUEST_THE_CLEANSING_HORDE) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_THE_CLEANSING_ALLIANCE) == QUEST_STATUS_INCOMPLETE) + go_frostblade_shrineAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + me->UseDoorOrButton(10); + if (!player->HasAura(SPELL_RECENT_MEDITATION)) { - player->CastSpell(player, SPELL_CLEANSING_SOUL); - player->SetStandState(UNIT_STAND_STATE_SIT); + if (player->GetQuestStatus(QUEST_THE_CLEANSING_HORDE) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_THE_CLEANSING_ALLIANCE) == QUEST_STATUS_INCOMPLETE) + { + player->CastSpell(player, SPELL_CLEANSING_SOUL); + player->SetStandState(UNIT_STAND_STATE_SIT); + } } - return true; + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_frostblade_shrineAI(go); } }; @@ -1119,11 +1431,21 @@ class go_midsummer_bonfire : public GameObjectScript public: go_midsummer_bonfire() : GameObjectScript("go_midsummer_bonfire") { } - bool OnGossipSelect(Player* player, GameObject* /*go*/, uint32 /*sender*/, uint32 /*action*/) override + struct go_midsummer_bonfireAI : public GameObjectAI { - player->CastSpell(player, STAMP_OUT_BONFIRE_QUEST_COMPLETE, true); - CloseGossipMenuFor(player); - return false; + go_midsummer_bonfireAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + { + player->CastSpell(player, STAMP_OUT_BONFIRE_QUEST_COMPLETE, true); + CloseGossipMenuFor(player); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_midsummer_bonfireAI(go); } }; @@ -1140,14 +1462,24 @@ class go_midsummer_ribbon_pole : public GameObjectScript public: go_midsummer_ribbon_pole() : GameObjectScript("go_midsummer_ribbon_pole") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_midsummer_ribbon_poleAI : public GameObjectAI { - if (Creature* creature = go->FindNearestCreature(NPC_POLE_RIBBON_BUNNY, 10.0f)) + go_midsummer_ribbon_poleAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - creature->GetAI()->DoAction(ACTION_COSMETIC_FIRES); - player->CastSpell(creature, SPELL_POLE_DANCE, true); + if (Creature* creature = me->FindNearestCreature(NPC_POLE_RIBBON_BUNNY, 10.0f)) + { + creature->GetAI()->DoAction(ACTION_COSMETIC_FIRES); + player->CastSpell(creature, SPELL_POLE_DANCE, true); + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_midsummer_ribbon_poleAI(go); } }; @@ -1171,7 +1503,7 @@ class go_toy_train_set : public GameObjectScript _pulseTimer -= diff; else { - go->CastSpell(nullptr, SPELL_TOY_TRAIN_PULSE, true); + me->CastSpell(nullptr, SPELL_TOY_TRAIN_PULSE, true); _pulseTimer = 6 * IN_MILLISECONDS; } } @@ -1179,7 +1511,7 @@ class go_toy_train_set : public GameObjectScript // triggered on wrecker'd void DoAction(int32 /*action*/) override { - go->Delete(); + me->Delete(); } private: @@ -1271,39 +1603,39 @@ public: if (!IsHolidayActive(HOLIDAY_BREWFEST)) // Check if Brewfest is active break; // Check if gob is correct area, play music, set time of music - if (go->GetAreaId() == SILVERMOON || go->GetAreaId() == UNDERCITY || go->GetAreaId() == ORGRIMMAR_1 || go->GetAreaId() == ORGRIMMAR_2 || go->GetAreaId() == THUNDERBLUFF || go->GetAreaId() == SHATTRATH) + if (me->GetAreaId() == SILVERMOON || me->GetAreaId() == UNDERCITY || me->GetAreaId() == ORGRIMMAR_1 || me->GetAreaId() == ORGRIMMAR_2 || me->GetAreaId() == THUNDERBLUFF || me->GetAreaId() == SHATTRATH) { if (rnd == 0) { - go->PlayDirectMusic(EVENT_BREWFESTGOBLIN01); + me->PlayDirectMusic(EVENT_BREWFESTGOBLIN01); musicTime = EVENT_BREWFESTGOBLIN01_TIME; } else if (rnd == 1) { - go->PlayDirectMusic(EVENT_BREWFESTGOBLIN02); + me->PlayDirectMusic(EVENT_BREWFESTGOBLIN02); musicTime = EVENT_BREWFESTGOBLIN02_TIME; } else { - go->PlayDirectMusic(EVENT_BREWFESTGOBLIN03); + me->PlayDirectMusic(EVENT_BREWFESTGOBLIN03); musicTime = EVENT_BREWFESTGOBLIN03_TIME; } } - if (go->GetAreaId() == IRONFORGE_1 || go->GetAreaId() == IRONFORGE_2 || go->GetAreaId() == STORMWIND || go->GetAreaId() == EXODAR || go->GetAreaId() == DARNASSUS || go->GetAreaId() == SHATTRATH) + if (me->GetAreaId() == IRONFORGE_1 || me->GetAreaId() == IRONFORGE_2 || me->GetAreaId() == STORMWIND || me->GetAreaId() == EXODAR || me->GetAreaId() == DARNASSUS || me->GetAreaId() == SHATTRATH) { if (rnd == 0) { - go->PlayDirectMusic(EVENT_BREWFESTDWARF01); + me->PlayDirectMusic(EVENT_BREWFESTDWARF01); musicTime = EVENT_BREWFESTDWARF01_TIME; } else if (rnd == 1) { - go->PlayDirectMusic(EVENT_BREWFESTDWARF02); + me->PlayDirectMusic(EVENT_BREWFESTDWARF02); musicTime = EVENT_BREWFESTDWARF02_TIME; } else { - go->PlayDirectMusic(EVENT_BREWFESTDWARF03); + me->PlayDirectMusic(EVENT_BREWFESTDWARF03); musicTime = EVENT_BREWFESTDWARF03_TIME; } } @@ -1364,13 +1696,13 @@ public: break; std::vector<Player*> playersNearby; - go->GetPlayerListInGrid(playersNearby, go->GetMap()->GetVisibilityRange()); + me->GetPlayerListInGrid(playersNearby, me->GetMap()->GetVisibilityRange()); for (Player* player : playersNearby) { if (player->GetTeamId() == TEAM_HORDE) - go->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_H, player); + me->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_H, player); else - go->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_A, player); + me->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_A, player); } _events.ScheduleEvent(EVENT_MM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) break; @@ -1426,7 +1758,7 @@ public: case EVENT_DFM_START_MUSIC: if (!IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_ELWYNN) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_THUNDER) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_SHATTRATH)) break; - go->PlayDirectMusic(MUSIC_DARKMOON_FAIRE_MUSIC); + me->PlayDirectMusic(MUSIC_DARKMOON_FAIRE_MUSIC); _events.ScheduleEvent(EVENT_DFM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) break; default: @@ -1480,7 +1812,7 @@ public: case EVENT_PDM_START_MUSIC: if (!IsHolidayActive(HOLIDAY_PIRATES_DAY)) break; - go->PlayDirectMusic(MUSIC_PIRATE_DAY_MUSIC); + me->PlayDirectMusic(MUSIC_PIRATE_DAY_MUSIC); _events.ScheduleEvent(EVENT_PDM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) break; default: @@ -1546,16 +1878,16 @@ public: void InitializeAI() override { - switch (go->GetEntry()) + switch (me->GetEntry()) { case GO_HORDE_BELL: - _soundId = go->GetAreaId() == UNDERCITY_AREA ? BELLTOLLHORDE : BELLTOLLTRIBAL; + _soundId = me->GetAreaId() == UNDERCITY_AREA ? BELLTOLLHORDE : BELLTOLLTRIBAL; break; case GO_ALLIANCE_BELL: { - if (go->GetAreaId() == IRONFORGE_1_AREA || go->GetAreaId() == IRONFORGE_2_AREA) + if (me->GetAreaId() == IRONFORGE_1_AREA || me->GetAreaId() == IRONFORGE_2_AREA) _soundId = BELLTOLLDWARFGNOME; - else if (go->GetAreaId() == DARNASSUS_AREA || go->GetZoneId() == TELDRASSIL_ZONE) + else if (me->GetAreaId() == DARNASSUS_AREA || me->GetZoneId() == TELDRASSIL_ZONE) _soundId = BELLTOLLNIGHTELF; else _soundId = BELLTOLLALLIANCE; @@ -1591,7 +1923,7 @@ public: switch (eventId) { case EVENT_RING_BELL: - go->PlayDirectSound(_soundId); + me->PlayDirectSound(_soundId); break; default: break; diff --git a/src/server/scripts/World/npc_innkeeper.cpp b/src/server/scripts/World/npc_innkeeper.cpp index 3fc1cf6525c..f4e0f3b9361 100644 --- a/src/server/scripts/World/npc_innkeeper.cpp +++ b/src/server/scripts/World/npc_innkeeper.cpp @@ -49,86 +49,97 @@ class npc_innkeeper : public CreatureScript public: npc_innkeeper() : CreatureScript("npc_innkeeper") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_innkeeperAI : public ScriptedAI { - if (IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED)) + npc_innkeeperAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override { - const char* localizedEntry; - switch (player->GetSession()->GetSessionDbcLocale()) + if (IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED)) { - case LOCALE_frFR: localizedEntry = LOCALE_TRICK_OR_TREAT_2; break; - case LOCALE_deDE: localizedEntry = LOCALE_TRICK_OR_TREAT_3; break; - case LOCALE_esES: localizedEntry = LOCALE_TRICK_OR_TREAT_6; break; - case LOCALE_enUS: default: localizedEntry = LOCALE_TRICK_OR_TREAT_0; + const char* localizedEntry; + switch (player->GetSession()->GetSessionDbcLocale()) + { + case LOCALE_frFR: localizedEntry = LOCALE_TRICK_OR_TREAT_2; break; + case LOCALE_deDE: localizedEntry = LOCALE_TRICK_OR_TREAT_3; break; + case LOCALE_esES: localizedEntry = LOCALE_TRICK_OR_TREAT_6; break; + case LOCALE_enUS: default: localizedEntry = LOCALE_TRICK_OR_TREAT_0; + } + AddGossipItemFor(player, GOSSIP_ICON_CHAT, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); } - AddGossipItemFor(player, GOSSIP_ICON_CHAT, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - } - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - if (creature->IsInnkeeper()) - { - const char* localizedEntry; - switch (player->GetSession()->GetSessionDbcLocale()) + if (me->IsInnkeeper()) { - case LOCALE_deDE: localizedEntry = LOCALE_INNKEEPER_3; break; - case LOCALE_enUS: default: localizedEntry = LOCALE_INNKEEPER_0; + const char* localizedEntry; + switch (player->GetSession()->GetSessionDbcLocale()) + { + case LOCALE_deDE: localizedEntry = LOCALE_INNKEEPER_3; break; + case LOCALE_enUS: default: localizedEntry = LOCALE_INNKEEPER_0; + } + AddGossipItemFor(player, GOSSIP_ICON_INTERACT_1, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INN); } - AddGossipItemFor(player, GOSSIP_ICON_INTERACT_1, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INN); - } - player->TalkedToCreature(creature->GetEntry(), creature->GetGUID()); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } + player->TalkedToCreature(me->GetEntry(), me->GetGUID()); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF + 1 && IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED)) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - player->CastSpell(player, SPELL_TRICK_OR_TREATED, true); - - if (urand(0, 1)) - player->CastSpell(player, SPELL_TREAT, true); - else + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1 && IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED)) { - uint32 trickspell = 0; - switch (urand(0, 13)) + player->CastSpell(player, SPELL_TRICK_OR_TREATED, true); + + if (urand(0, 1)) + player->CastSpell(player, SPELL_TREAT, true); + else { - case 0: trickspell = 24753; break; // cannot cast, random 30sec - case 1: trickspell = 24713; break; // lepper gnome costume - case 2: trickspell = 24735; break; // male ghost costume - case 3: trickspell = 24736; break; // female ghostcostume - case 4: trickspell = 24710; break; // male ninja costume - case 5: trickspell = 24711; break; // female ninja costume - case 6: trickspell = 24708; break; // male pirate costume - case 7: trickspell = 24709; break; // female pirate costume - case 8: trickspell = 24723; break; // skeleton costume - case 9: trickspell = 24753; break; // Trick - case 10: trickspell = 24924; break; // Hallow's End Candy - case 11: trickspell = 24925; break; // Hallow's End Candy - case 12: trickspell = 24926; break; // Hallow's End Candy - case 13: trickspell = 24927; break; // Hallow's End Candy + uint32 trickspell = 0; + switch (urand(0, 13)) + { + case 0: trickspell = 24753; break; // cannot cast, random 30sec + case 1: trickspell = 24713; break; // lepper gnome costume + case 2: trickspell = 24735; break; // male ghost costume + case 3: trickspell = 24736; break; // female ghostcostume + case 4: trickspell = 24710; break; // male ninja costume + case 5: trickspell = 24711; break; // female ninja costume + case 6: trickspell = 24708; break; // male pirate costume + case 7: trickspell = 24709; break; // female pirate costume + case 8: trickspell = 24723; break; // skeleton costume + case 9: trickspell = 24753; break; // Trick + case 10: trickspell = 24924; break; // Hallow's End Candy + case 11: trickspell = 24925; break; // Hallow's End Candy + case 12: trickspell = 24926; break; // Hallow's End Candy + case 13: trickspell = 24927; break; // Hallow's End Candy + } + player->CastSpell(player, trickspell, true); } - player->CastSpell(player, trickspell, true); + CloseGossipMenuFor(player); + return true; } + CloseGossipMenuFor(player); + + switch (action) + { + case GOSSIP_ACTION_TRADE: player->GetSession()->SendListInventory(me->GetGUID()); break; + case GOSSIP_ACTION_INN: player->SetBindPoint(me->GetGUID()); break; + } return true; } + }; - CloseGossipMenuFor(player); - - switch (action) - { - case GOSSIP_ACTION_TRADE: player->GetSession()->SendListInventory(creature->GetGUID()); break; - case GOSSIP_ACTION_INN: player->SetBindPoint(creature->GetGUID()); break; - } - return true; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_innkeeperAI(creature); } }; diff --git a/src/server/scripts/World/npc_professions.cpp b/src/server/scripts/World/npc_professions.cpp index a28a0e38abf..0d5bd2a29dc 100644 --- a/src/server/scripts/World/npc_professions.cpp +++ b/src/server/scripts/World/npc_professions.cpp @@ -432,159 +432,171 @@ class npc_prof_alchemy : public CreatureScript public: npc_prof_alchemy() : CreatureScript("npc_prof_alchemy") { } - inline bool HasAlchemySpell(Player* player) + struct npc_prof_alchemyAI : public ScriptedAI { - return (player->HasSpell(S_TRANSMUTE) || player->HasSpell(S_ELIXIR) || player->HasSpell(S_POTION)); - } + npc_prof_alchemyAI(Creature* creature) : ScriptedAI(creature) { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + inline bool HasAlchemySpell(Player* player) + { + return (player->HasSpell(S_TRANSMUTE) || player->HasSpell(S_ELIXIR) || player->HasSpell(S_POTION)); + } - if (creature->IsVendor()) - 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()); - if (creature->IsTrainer()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - if (player->HasSkill(SKILL_ALCHEMY) && player->GetBaseSkillValue(SKILL_ALCHEMY) >= 350 && player->getLevel() > 67) - { - if (player->GetQuestRewardStatus(Q_MASTER_TRANSMUTE) || player->GetQuestRewardStatus(Q_MASTER_ELIXIR) || player->GetQuestRewardStatus(Q_MASTER_POTION)) + if (me->IsTrainer()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + + if (player->HasSkill(SKILL_ALCHEMY) && player->GetBaseSkillValue(SKILL_ALCHEMY) >= 350 && player->getLevel() > 67) { - switch (creature->GetEntry()) + if (player->GetQuestRewardStatus(Q_MASTER_TRANSMUTE) || player->GetQuestRewardStatus(Q_MASTER_ELIXIR) || player->GetQuestRewardStatus(Q_MASTER_POTION)) { - case N_TRAINER_TRANSMUTE: //Zarevhi - if (!HasAlchemySpell(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRANSMUTE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 1); - if (player->HasSpell(S_TRANSMUTE)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_TRANSMUTE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); - break; - case N_TRAINER_ELIXIR: //Lorokeem - if (!HasAlchemySpell(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELIXIR, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 2); - if (player->HasSpell(S_ELIXIR)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_ELIXIR, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 5); - break; - case N_TRAINER_POTION: //Lauranna Thar'well - if (!HasAlchemySpell(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_POTION, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 3); - if (player->HasSpell(S_POTION)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_POTION, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 6); - break; + switch (me->GetEntry()) + { + case N_TRAINER_TRANSMUTE: //Zarevhi + if (!HasAlchemySpell(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRANSMUTE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 1); + if (player->HasSpell(S_TRANSMUTE)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_TRANSMUTE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); + break; + case N_TRAINER_ELIXIR: //Lorokeem + if (!HasAlchemySpell(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELIXIR, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 2); + if (player->HasSpell(S_ELIXIR)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_ELIXIR, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 5); + break; + case N_TRAINER_POTION: //Lauranna Thar'well + if (!HasAlchemySpell(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_POTION, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 3); + if (player->HasSpell(S_POTION)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_POTION, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 6); + break; + } } } - } - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - void SendActionMenu(Player* player, Creature* creature, uint32 action) - { - switch (action) - { - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; - case GOSSIP_ACTION_TRAIN: - player->GetSession()->SendTrainerList(creature, TRAINER_ID_ALCHEMY); - break; - //Learn Alchemy - case GOSSIP_ACTION_INFO_DEF + 1: - ProcessCastaction(player, creature, S_TRANSMUTE, S_LEARN_TRANSMUTE, DoLearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - ProcessCastaction(player, creature, S_ELIXIR, S_LEARN_ELIXIR, DoLearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - ProcessCastaction(player, creature, S_POTION, S_LEARN_POTION, DoLearnCost(player)); - break; - //Unlearn Alchemy - case GOSSIP_ACTION_INFO_DEF + 4: - ProcessCastaction(player, creature, 0, S_UNLEARN_TRANSMUTE, DoHighUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 5: - ProcessCastaction(player, creature, 0, S_UNLEARN_ELIXIR, DoHighUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 6: - ProcessCastaction(player, creature, 0, S_UNLEARN_POTION, DoHighUnlearnCost(player)); - break; + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; } - } - void SendConfirmLearn(Player* player, Creature* creature, uint32 action) - { - if (action) + void SendActionMenu(Player* player, uint32 action) { - switch (creature->GetEntry()) + switch (action) { - case N_TRAINER_TRANSMUTE: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(me->GetGUID()); + break; + case GOSSIP_ACTION_TRAIN: + player->GetSession()->SendTrainerList(me, TRAINER_ID_ALCHEMY); + break; + //Learn Alchemy + case GOSSIP_ACTION_INFO_DEF + 1: + ProcessCastaction(player, me, S_TRANSMUTE, S_LEARN_TRANSMUTE, DoLearnCost(player)); break; - case N_TRAINER_ELIXIR: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELIXIR, GOSSIP_SENDER_CHECK, action); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + case GOSSIP_ACTION_INFO_DEF + 2: + ProcessCastaction(player, me, S_ELIXIR, S_LEARN_ELIXIR, DoLearnCost(player)); break; - case N_TRAINER_POTION: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_POTION, GOSSIP_SENDER_CHECK, action); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + case GOSSIP_ACTION_INFO_DEF + 3: + ProcessCastaction(player, me, S_POTION, S_LEARN_POTION, DoLearnCost(player)); + break; + //Unlearn Alchemy + case GOSSIP_ACTION_INFO_DEF + 4: + ProcessCastaction(player, me, 0, S_UNLEARN_TRANSMUTE, DoHighUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 5: + ProcessCastaction(player, me, 0, S_UNLEARN_ELIXIR, DoHighUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 6: + ProcessCastaction(player, me, 0, S_UNLEARN_POTION, DoHighUnlearnCost(player)); break; } } - } - void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) - { - if (action) + void SendConfirmLearn(Player* player, uint32 action) { - switch (creature->GetEntry()) + if (action) { - case N_TRAINER_TRANSMUTE: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_ELIXIR: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_ELIXIR, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_POTION: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_POTION, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; + switch (me->GetEntry()) + { + case N_TRAINER_TRANSMUTE: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_ELIXIR: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELIXIR, GOSSIP_SENDER_CHECK, action); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_POTION: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_POTION, GOSSIP_SENDER_CHECK, action); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + } } } - } - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override - { - ClearGossipMenuFor(player); - switch (sender) + void SendConfirmUnlearn(Player* player, uint32 action) + { + if (action) + { + switch (me->GetEntry()) + { + case N_TRAINER_TRANSMUTE: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_ELIXIR: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_ELIXIR, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_POTION: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_POTION, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + } + } + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_SENDER_MAIN: - SendActionMenu(player, creature, action); - break; + uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (sender) + { + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, action); + break; - case GOSSIP_SENDER_LEARN: - SendConfirmLearn(player, creature, action); - break; + case GOSSIP_SENDER_LEARN: + SendConfirmLearn(player, action); + break; - case GOSSIP_SENDER_UNLEARN: - SendConfirmUnlearn(player, creature, action); - break; + case GOSSIP_SENDER_UNLEARN: + SendConfirmUnlearn(player, action); + break; - case GOSSIP_SENDER_CHECK: - SendActionMenu(player, creature, action); - break; + case GOSSIP_SENDER_CHECK: + SendActionMenu(player, action); + break; + } + return true; } - return true; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_prof_alchemyAI(creature); } }; @@ -597,224 +609,236 @@ class npc_prof_blacksmith : public CreatureScript public: npc_prof_blacksmith() : CreatureScript("npc_prof_blacksmith") { } - inline bool HasWeaponSub(Player* player) + struct npc_prof_blacksmithAI : public ScriptedAI { - return (player->HasSpell(S_HAMMER) || player->HasSpell(S_AXE) || player->HasSpell(S_SWORD)); - } + npc_prof_blacksmithAI(Creature* creature) : ScriptedAI(creature) { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + inline bool HasWeaponSub(Player* player) + { + return (player->HasSpell(S_HAMMER) || player->HasSpell(S_AXE) || player->HasSpell(S_SWORD)); + } - if (creature->IsVendor()) - 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()); - if (creature->IsTrainer()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - uint32 creatureId = creature->GetEntry(); - //WEAPONSMITH & ARMORSMITH - if (player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 225) - { - switch (creatureId) + if (me->IsTrainer()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + + uint32 creatureId = me->GetEntry(); + //WEAPONSMITH & ARMORSMITH + if (player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 225) { - case N_TRAINER_SMITHOMNI1: - case N_TRAINER_SMITHOMNI2: - if (!player->HasSpell(S_ARMOR) && !player->HasSpell(S_WEAPON) && player->GetReputationRank(REP_ARMOR) >= REP_FRIENDLY) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ARMOR_LEARN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - if (!player->HasSpell(S_WEAPON) && !player->HasSpell(S_ARMOR) && player->GetReputationRank(REP_WEAPON) >= REP_FRIENDLY) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEAPON_LEARN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - break; - case N_TRAINER_WEAPON1: - case N_TRAINER_WEAPON2: - if (player->HasSpell(S_WEAPON)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEAPON_UNLEARN, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 3); - break; - case N_TRAINER_ARMOR1: - case N_TRAINER_ARMOR2: - if (player->HasSpell(S_ARMOR)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ARMOR_UNLEARN, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); - break; + switch (creatureId) + { + case N_TRAINER_SMITHOMNI1: + case N_TRAINER_SMITHOMNI2: + if (!player->HasSpell(S_ARMOR) && !player->HasSpell(S_WEAPON) && player->GetReputationRank(REP_ARMOR) >= REP_FRIENDLY) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ARMOR_LEARN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + if (!player->HasSpell(S_WEAPON) && !player->HasSpell(S_ARMOR) && player->GetReputationRank(REP_WEAPON) >= REP_FRIENDLY) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEAPON_LEARN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + break; + case N_TRAINER_WEAPON1: + case N_TRAINER_WEAPON2: + if (player->HasSpell(S_WEAPON)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEAPON_UNLEARN, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 3); + break; + case N_TRAINER_ARMOR1: + case N_TRAINER_ARMOR2: + if (player->HasSpell(S_ARMOR)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ARMOR_UNLEARN, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); + break; + } + } + //WEAPONSMITH SPEC + if (player->HasSpell(S_WEAPON) && player->getLevel() > 49 && player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 250) + { + switch (creatureId) + { + case N_TRAINER_HAMMER: + if (!HasWeaponSub(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 5); + if (player->HasSpell(S_HAMMER)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 8); + break; + case N_TRAINER_AXE: + if (!HasWeaponSub(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 6); + if (player->HasSpell(S_AXE)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 9); + break; + case N_TRAINER_SWORD: + if (!HasWeaponSub(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 7); + if (player->HasSpell(S_SWORD)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 10); + break; + } } + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; } - //WEAPONSMITH SPEC - if (player->HasSpell(S_WEAPON) && player->getLevel() > 49 && player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 250) + + void SendActionMenu(Player* player, uint32 action) { - switch (creatureId) + switch (action) { - case N_TRAINER_HAMMER: - if (!HasWeaponSub(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 5); - if (player->HasSpell(S_HAMMER)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 8); + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(me->GetGUID()); + break; + case GOSSIP_ACTION_TRAIN: + player->GetSession()->SendTrainerList(me, TRAINER_ID_BLACKSMITHING); break; - case N_TRAINER_AXE: - if (!HasWeaponSub(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 6); - if (player->HasSpell(S_AXE)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 9); + //Learn Armor/Weapon + case GOSSIP_ACTION_INFO_DEF + 1: + if (!player->HasSpell(S_ARMOR)) + { + player->CastSpell(player, S_LEARN_ARMOR, true); + //_Creature->CastSpell(player, S_REP_ARMOR, true); + } + CloseGossipMenuFor(player); break; - case N_TRAINER_SWORD: - if (!HasWeaponSub(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 7); - if (player->HasSpell(S_SWORD)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 10); + case GOSSIP_ACTION_INFO_DEF + 2: + if (!player->HasSpell(S_WEAPON)) + { + player->CastSpell(player, S_LEARN_WEAPON, true); + //_Creature->CastSpell(player, S_REP_WEAPON, true); + } + CloseGossipMenuFor(player); + break; + //Unlearn Armor/Weapon + case GOSSIP_ACTION_INFO_DEF + 3: + if (HasWeaponSub(player)) + { + //unknown textID (TALK_MUST_UNLEARN_WEAPON) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + } + else + ProcessUnlearnAction(player, me, S_UNLEARN_WEAPON, S_REP_ARMOR, DoLowUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + ProcessUnlearnAction(player, me, S_UNLEARN_ARMOR, S_REP_WEAPON, DoLowUnlearnCost(player)); + break; + //Learn Hammer/Axe/Sword + case GOSSIP_ACTION_INFO_DEF + 5: + player->CastSpell(player, S_LEARN_HAMMER, true); + CloseGossipMenuFor(player); + break; + case GOSSIP_ACTION_INFO_DEF + 6: + player->CastSpell(player, S_LEARN_AXE, true); + CloseGossipMenuFor(player); + break; + case GOSSIP_ACTION_INFO_DEF + 7: + player->CastSpell(player, S_LEARN_SWORD, true); + CloseGossipMenuFor(player); + break; + //Unlearn Hammer/Axe/Sword + case GOSSIP_ACTION_INFO_DEF + 8: + ProcessUnlearnAction(player, me, S_UNLEARN_HAMMER, 0, DoMedUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 9: + ProcessUnlearnAction(player, me, S_UNLEARN_AXE, 0, DoMedUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 10: + ProcessUnlearnAction(player, me, S_UNLEARN_SWORD, 0, DoMedUnlearnCost(player)); break; } } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - void SendActionMenu(Player* player, Creature* creature, uint32 action) - { - switch (action) + void SendConfirmLearn(Player* player, uint32 action) { - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; - case GOSSIP_ACTION_TRAIN: - player->GetSession()->SendTrainerList(creature, TRAINER_ID_BLACKSMITHING); - break; - //Learn Armor/Weapon - case GOSSIP_ACTION_INFO_DEF + 1: - if (!player->HasSpell(S_ARMOR)) - { - player->CastSpell(player, S_LEARN_ARMOR, true); - //_Creature->CastSpell(player, S_REP_ARMOR, true); - } - CloseGossipMenuFor(player); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - if (!player->HasSpell(S_WEAPON)) - { - player->CastSpell(player, S_LEARN_WEAPON, true); - //_Creature->CastSpell(player, S_REP_WEAPON, true); - } - CloseGossipMenuFor(player); - break; - //Unlearn Armor/Weapon - case GOSSIP_ACTION_INFO_DEF + 3: - if (HasWeaponSub(player)) + if (action) + { + switch (me->GetEntry()) { - //unknown textID (TALK_MUST_UNLEARN_WEAPON) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + case N_TRAINER_HAMMER: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_CHECK, action); + //unknown textID (TALK_HAMMER_LEARN) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_AXE: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_CHECK, action); + //unknown textID (TALK_AXE_LEARN) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_SWORD: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_CHECK, action); + //unknown textID (TALK_SWORD_LEARN) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; } - else - ProcessUnlearnAction(player, creature, S_UNLEARN_WEAPON, S_REP_ARMOR, DoLowUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 4: - ProcessUnlearnAction(player, creature, S_UNLEARN_ARMOR, S_REP_WEAPON, DoLowUnlearnCost(player)); - break; - //Learn Hammer/Axe/Sword - case GOSSIP_ACTION_INFO_DEF + 5: - player->CastSpell(player, S_LEARN_HAMMER, true); - CloseGossipMenuFor(player); - break; - case GOSSIP_ACTION_INFO_DEF + 6: - player->CastSpell(player, S_LEARN_AXE, true); - CloseGossipMenuFor(player); - break; - case GOSSIP_ACTION_INFO_DEF + 7: - player->CastSpell(player, S_LEARN_SWORD, true); - CloseGossipMenuFor(player); - break; - //Unlearn Hammer/Axe/Sword - case GOSSIP_ACTION_INFO_DEF + 8: - ProcessUnlearnAction(player, creature, S_UNLEARN_HAMMER, 0, DoMedUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 9: - ProcessUnlearnAction(player, creature, S_UNLEARN_AXE, 0, DoMedUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 10: - ProcessUnlearnAction(player, creature, S_UNLEARN_SWORD, 0, DoMedUnlearnCost(player)); - break; + } } - } - void SendConfirmLearn(Player* player, Creature* creature, uint32 action) - { - if (action) + void SendConfirmUnlearn(Player* player, uint32 action) { - switch (creature->GetEntry()) + if (action) { - case N_TRAINER_HAMMER: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_CHECK, action); - //unknown textID (TALK_HAMMER_LEARN) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_AXE: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_CHECK, action); - //unknown textID (TALK_AXE_LEARN) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_SWORD: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_CHECK, action); - //unknown textID (TALK_SWORD_LEARN) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; + switch (me->GetEntry()) + { + case N_TRAINER_WEAPON1: + case N_TRAINER_WEAPON2: + case N_TRAINER_ARMOR1: + case N_TRAINER_ARMOR2: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SMITH_SPEC, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ARMORORWEAPON, DoLowUnlearnCost(player), false); + //unknown textID (TALK_UNLEARN_AXEORWEAPON) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + + case N_TRAINER_HAMMER: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); + //unknown textID (TALK_HAMMER_UNLEARN) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_AXE: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); + //unknown textID (TALK_AXE_UNLEARN) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_SWORD: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); + //unknown textID (TALK_SWORD_UNLEARN) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + } } } - } - void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) - { - if (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - switch (creature->GetEntry()) + uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (sender) { - case N_TRAINER_WEAPON1: - case N_TRAINER_WEAPON2: - case N_TRAINER_ARMOR1: - case N_TRAINER_ARMOR2: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SMITH_SPEC, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ARMORORWEAPON, DoLowUnlearnCost(player), false); - //unknown textID (TALK_UNLEARN_AXEORWEAPON) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, action); break; - case N_TRAINER_HAMMER: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); - //unknown textID (TALK_HAMMER_UNLEARN) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + case GOSSIP_SENDER_LEARN: + SendConfirmLearn(player, action); break; - case N_TRAINER_AXE: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); - //unknown textID (TALK_AXE_UNLEARN) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + + case GOSSIP_SENDER_UNLEARN: + SendConfirmUnlearn(player, action); break; - case N_TRAINER_SWORD: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); - //unknown textID (TALK_SWORD_UNLEARN) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + + case GOSSIP_SENDER_CHECK: + SendActionMenu(player, action); break; } + return true; } - } + }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override + CreatureAI* GetAI(Creature* creature) const override { - ClearGossipMenuFor(player); - switch (sender) - { - case GOSSIP_SENDER_MAIN: - SendActionMenu(player, creature, action); - break; - - case GOSSIP_SENDER_LEARN: - SendConfirmLearn(player, creature, action); - break; - - case GOSSIP_SENDER_UNLEARN: - SendConfirmUnlearn(player, creature, action); - break; - - case GOSSIP_SENDER_CHECK: - SendActionMenu(player, creature, action); - break; - } - return true; + return new npc_prof_blacksmithAI(creature); } }; @@ -849,86 +873,98 @@ class npc_engineering_tele_trinket : public CreatureScript public: npc_engineering_tele_trinket() : CreatureScript("npc_engineering_tele_trinket") { } - bool CanLearn(Player* player, uint32 textId, uint32 altTextId, uint32 skillValue, uint32 reqSpellId, uint32 spellId, uint32& npcTextId) + struct npc_engineering_tele_trinketAI : public ScriptedAI { - bool res = false; - npcTextId = textId; - if (player->GetBaseSkillValue(SKILL_ENGINEERING) >= skillValue && player->HasSpell(reqSpellId)) + npc_engineering_tele_trinketAI(Creature* creature) : ScriptedAI(creature) { } + + bool CanLearn(Player* player, uint32 textId, uint32 altTextId, uint32 skillValue, uint32 reqSpellId, uint32 spellId, uint32& npcTextId) { - if (!player->HasSpell(spellId)) - res = true; - else - npcTextId = altTextId; + bool res = false; + npcTextId = textId; + if (player->GetBaseSkillValue(SKILL_ENGINEERING) >= skillValue && player->HasSpell(reqSpellId)) + { + if (!player->HasSpell(spellId)) + res = true; + else + npcTextId = altTextId; + } + return res; } - return res; - } - bool OnGossipHello(Player* player, Creature* creature) override - { - uint32 npcTextId = 0; - std::string gossipItem; - bool canLearn = false; + bool GossipHello(Player* player) override + { + uint32 npcTextId = 0; + std::string gossipItem; + bool canLearn = false; + + if (player->HasSkill(SKILL_ENGINEERING)) + { + switch (me->GetEntry()) + { + case NPC_ZAP: + canLearn = CanLearn(player, 6092, 0, 260, S_GOBLIN, SPELL_TO_EVERLOOK, npcTextId); + if (canLearn) + gossipItem = GOSSIP_ITEM_ZAP; + break; + case NPC_JHORDY: + canLearn = CanLearn(player, 7251, 7252, 260, S_GNOMISH, SPELL_TO_GADGET, npcTextId); + if (canLearn) + gossipItem = GOSSIP_ITEM_JHORDY; + break; + case NPC_KABLAM: + canLearn = CanLearn(player, 10365, 0, 350, S_GOBLIN, SPELL_TO_AREA52, npcTextId); + if (canLearn) + gossipItem = GOSSIP_ITEM_KABLAM; + break; + case NPC_SMILES: + canLearn = CanLearn(player, 10363, 0, 350, S_GNOMISH, SPELL_TO_TOSHLEY, npcTextId); + if (canLearn) + gossipItem = GOSSIP_ITEM_KABLAM; + break; + } + } + + if (canLearn) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, gossipItem, me->GetEntry(), GOSSIP_ACTION_INFO_DEF + 1); + + SendGossipMenuFor(player, npcTextId ? npcTextId : player->GetGossipTextId(me), me->GetGUID()); + return true; + } - if (player->HasSkill(SKILL_ENGINEERING)) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - switch (creature->GetEntry()) + uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + CloseGossipMenuFor(player); + + if (sender != me->GetEntry()) + return true; + + switch (sender) { case NPC_ZAP: - canLearn = CanLearn(player, 6092, 0, 260, S_GOBLIN, SPELL_TO_EVERLOOK, npcTextId); - if (canLearn) - gossipItem = GOSSIP_ITEM_ZAP; + player->CastSpell(player, SPELL_LEARN_TO_EVERLOOK, false); break; case NPC_JHORDY: - canLearn = CanLearn(player, 7251, 7252, 260, S_GNOMISH, SPELL_TO_GADGET, npcTextId); - if (canLearn) - gossipItem = GOSSIP_ITEM_JHORDY; + player->CastSpell(player, SPELL_LEARN_TO_GADGET, false); break; case NPC_KABLAM: - canLearn = CanLearn(player, 10365, 0, 350, S_GOBLIN, SPELL_TO_AREA52, npcTextId); - if (canLearn) - gossipItem = GOSSIP_ITEM_KABLAM; + player->CastSpell(player, SPELL_LEARN_TO_AREA52, false); break; case NPC_SMILES: - canLearn = CanLearn(player, 10363, 0, 350, S_GNOMISH, SPELL_TO_TOSHLEY, npcTextId); - if (canLearn) - gossipItem = GOSSIP_ITEM_KABLAM; + player->CastSpell(player, SPELL_LEARN_TO_TOSHLEY, false); break; } - } - - if (canLearn) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, gossipItem, creature->GetEntry(), GOSSIP_ACTION_INFO_DEF + 1); - - SendGossipMenuFor(player, npcTextId ? npcTextId : player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF + 1) - CloseGossipMenuFor(player); - - if (sender != creature->GetEntry()) return true; - - switch (sender) - { - case NPC_ZAP: - player->CastSpell(player, SPELL_LEARN_TO_EVERLOOK, false); - break; - case NPC_JHORDY: - player->CastSpell(player, SPELL_LEARN_TO_GADGET, false); - break; - case NPC_KABLAM: - player->CastSpell(player, SPELL_LEARN_TO_AREA52, false); - break; - case NPC_SMILES: - player->CastSpell(player, SPELL_LEARN_TO_TOSHLEY, false); - break; } + }; - return true; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_engineering_tele_trinketAI(creature); } }; @@ -941,112 +977,124 @@ class npc_prof_leather : public CreatureScript public: npc_prof_leather() : CreatureScript("npc_prof_leather") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_prof_leatherAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_prof_leatherAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + if (me->IsTrainer()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + + if (player->HasSkill(SKILL_LEATHERWORKING) && player->GetBaseSkillValue(SKILL_LEATHERWORKING) >= 250 && player->getLevel() > 49) + { + switch (me->GetEntry()) + { + case N_TRAINER_DRAGON1: + case N_TRAINER_DRAGON2: + if (player->HasSpell(S_DRAGON)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 1); + break; + case N_TRAINER_ELEMENTAL1: + case N_TRAINER_ELEMENTAL2: + if (player->HasSpell(S_ELEMENTAL)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 2); + break; + case N_TRAINER_TRIBAL1: + case N_TRAINER_TRIBAL2: + if (player->HasSpell(S_TRIBAL)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 3); + break; + } + } - if (creature->IsTrainer()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } - if (player->HasSkill(SKILL_LEATHERWORKING) && player->GetBaseSkillValue(SKILL_LEATHERWORKING) >= 250 && player->getLevel() > 49) + void SendActionMenu(Player* player, uint32 action) { - switch (creature->GetEntry()) + switch (action) { - case N_TRAINER_DRAGON1: - case N_TRAINER_DRAGON2: - if (player->HasSpell(S_DRAGON)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 1); + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(me->GetGUID()); + break; + case GOSSIP_ACTION_TRAIN: + player->GetSession()->SendTrainerList(me, TRAINER_ID_LEATHERWORKING); + break; + //Unlearn Leather + case GOSSIP_ACTION_INFO_DEF + 1: + ProcessUnlearnAction(player, me, S_UNLEARN_DRAGON, 0, DoMedUnlearnCost(player)); break; - case N_TRAINER_ELEMENTAL1: - case N_TRAINER_ELEMENTAL2: - if (player->HasSpell(S_ELEMENTAL)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 2); + case GOSSIP_ACTION_INFO_DEF + 2: + ProcessUnlearnAction(player, me, S_UNLEARN_ELEMENTAL, 0, DoMedUnlearnCost(player)); break; - case N_TRAINER_TRIBAL1: - case N_TRAINER_TRIBAL2: - if (player->HasSpell(S_TRIBAL)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 3); + case GOSSIP_ACTION_INFO_DEF + 3: + ProcessUnlearnAction(player, me, S_UNLEARN_TRIBAL, 0, DoMedUnlearnCost(player)); break; } } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - void SendActionMenu(Player* player, Creature* creature, uint32 action) - { - switch (action) + void SendConfirmUnlearn(Player* player, uint32 action) { - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; - case GOSSIP_ACTION_TRAIN: - player->GetSession()->SendTrainerList(creature, TRAINER_ID_LEATHERWORKING); - break; - //Unlearn Leather - case GOSSIP_ACTION_INFO_DEF + 1: - ProcessUnlearnAction(player, creature, S_UNLEARN_DRAGON, 0, DoMedUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - ProcessUnlearnAction(player, creature, S_UNLEARN_ELEMENTAL, 0, DoMedUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - ProcessUnlearnAction(player, creature, S_UNLEARN_TRIBAL, 0, DoMedUnlearnCost(player)); - break; + if (action) + { + switch (me->GetEntry()) + { + case N_TRAINER_DRAGON1: + case N_TRAINER_DRAGON2: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_ELEMENTAL1: + case N_TRAINER_ELEMENTAL2: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_TRIBAL1: + case N_TRAINER_TRIBAL2: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + } + } } - } - void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) - { - if (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - switch (creature->GetEntry()) + uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (sender) { - case N_TRAINER_DRAGON1: - case N_TRAINER_DRAGON2: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, action); break; - case N_TRAINER_ELEMENTAL1: - case N_TRAINER_ELEMENTAL2: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + + case GOSSIP_SENDER_UNLEARN: + SendConfirmUnlearn(player, action); break; - case N_TRAINER_TRIBAL1: - case N_TRAINER_TRIBAL2: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + + case GOSSIP_SENDER_CHECK: + SendActionMenu(player, action); break; } + return true; } - } + }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override + CreatureAI* GetAI(Creature* creature) const override { - ClearGossipMenuFor(player); - switch (sender) - { - case GOSSIP_SENDER_MAIN: - SendActionMenu(player, creature, action); - break; - - case GOSSIP_SENDER_UNLEARN: - SendConfirmUnlearn(player, creature, action); - break; - - case GOSSIP_SENDER_CHECK: - SendActionMenu(player, creature, action); - break; - } - return true; + return new npc_prof_leatherAI(creature); } }; @@ -1059,160 +1107,172 @@ class npc_prof_tailor : public CreatureScript public: npc_prof_tailor() : CreatureScript("npc_prof_tailor") { } - inline bool HasTailorSpell(Player* player) + struct npc_prof_tailorAI : public ScriptedAI { - return (player->HasSpell(S_MOONCLOTH) || player->HasSpell(S_SHADOWEAVE) || player->HasSpell(S_SPELLFIRE)); - } + npc_prof_tailorAI(Creature* creature) : ScriptedAI(creature) { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + inline bool HasTailorSpell(Player* player) + { + return (player->HasSpell(S_MOONCLOTH) || player->HasSpell(S_SHADOWEAVE) || player->HasSpell(S_SPELLFIRE)); + } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + + if (me->IsTrainer()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + + //TAILORING SPEC + if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 350 && player->getLevel() > 59) + { + if (player->GetQuestRewardStatus(10831) || player->GetQuestRewardStatus(10832) || player->GetQuestRewardStatus(10833)) + { + switch (me->GetEntry()) + { + case N_TRAINER_SPELLFIRE: + if (!HasTailorSpell(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 1); + if (player->HasSpell(S_SPELLFIRE)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); + break; + case N_TRAINER_MOONCLOTH: + if (!HasTailorSpell(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 2); + if (player->HasSpell(S_MOONCLOTH)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 5); + break; + case N_TRAINER_SHADOWEAVE: + if (!HasTailorSpell(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 3); + if (player->HasSpell(S_SHADOWEAVE)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 6); + break; + } + } + } - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } - if (creature->IsTrainer()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + void SendActionMenu(Player* player, uint32 action) + { + switch (action) + { + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(me->GetGUID()); + break; + case GOSSIP_ACTION_TRAIN: + player->GetSession()->SendTrainerList(me, TRAINER_ID_TAILORING); + break; + //Learn Tailor + case GOSSIP_ACTION_INFO_DEF + 1: + ProcessCastaction(player, me, S_SPELLFIRE, S_LEARN_SPELLFIRE, DoLearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + ProcessCastaction(player, me, S_MOONCLOTH, S_LEARN_MOONCLOTH, DoLearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + ProcessCastaction(player, me, S_SHADOWEAVE, S_LEARN_SHADOWEAVE, DoLearnCost(player)); + break; + //Unlearn Tailor + case GOSSIP_ACTION_INFO_DEF + 4: + ProcessUnlearnAction(player, me, S_UNLEARN_SPELLFIRE, 0, DoHighUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 5: + ProcessUnlearnAction(player, me, S_UNLEARN_MOONCLOTH, 0, DoHighUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 6: + ProcessUnlearnAction(player, me, S_UNLEARN_SHADOWEAVE, 0, DoHighUnlearnCost(player)); + break; + } + } - //TAILORING SPEC - if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 350 && player->getLevel() > 59) + void SendConfirmLearn(Player* player, uint32 action) { - if (player->GetQuestRewardStatus(10831) || player->GetQuestRewardStatus(10832) || player->GetQuestRewardStatus(10833)) + if (action) { - switch (creature->GetEntry()) + switch (me->GetEntry()) { case N_TRAINER_SPELLFIRE: - if (!HasTailorSpell(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 1); - if (player->HasSpell(S_SPELLFIRE)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); break; case N_TRAINER_MOONCLOTH: - if (!HasTailorSpell(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 2); - if (player->HasSpell(S_MOONCLOTH)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 5); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); break; case N_TRAINER_SHADOWEAVE: - if (!HasTailorSpell(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 3); - if (player->HasSpell(S_SHADOWEAVE)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 6); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); break; } } } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - void SendActionMenu(Player* player, Creature* creature, uint32 action) - { - switch (action) - { - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; - case GOSSIP_ACTION_TRAIN: - player->GetSession()->SendTrainerList(creature, TRAINER_ID_TAILORING); - break; - //Learn Tailor - case GOSSIP_ACTION_INFO_DEF + 1: - ProcessCastaction(player, creature, S_SPELLFIRE, S_LEARN_SPELLFIRE, DoLearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - ProcessCastaction(player, creature, S_MOONCLOTH, S_LEARN_MOONCLOTH, DoLearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - ProcessCastaction(player, creature, S_SHADOWEAVE, S_LEARN_SHADOWEAVE, DoLearnCost(player)); - break; - //Unlearn Tailor - case GOSSIP_ACTION_INFO_DEF + 4: - ProcessUnlearnAction(player, creature, S_UNLEARN_SPELLFIRE, 0, DoHighUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 5: - ProcessUnlearnAction(player, creature, S_UNLEARN_MOONCLOTH, 0, DoHighUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 6: - ProcessUnlearnAction(player, creature, S_UNLEARN_SHADOWEAVE, 0, DoHighUnlearnCost(player)); - break; - } - } - - void SendConfirmLearn(Player* player, Creature* creature, uint32 action) - { - if (action) + void SendConfirmUnlearn(Player* player, uint32 action) { - switch (creature->GetEntry()) + if (action) { - case N_TRAINER_SPELLFIRE: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_MOONCLOTH: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_SHADOWEAVE: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; + switch (me->GetEntry()) + { + case N_TRAINER_SPELLFIRE: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_MOONCLOTH: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_SHADOWEAVE: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + } } } - } - void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) - { - if (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - switch (creature->GetEntry()) + uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (sender) { - case N_TRAINER_SPELLFIRE: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, action); break; - case N_TRAINER_MOONCLOTH: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + + case GOSSIP_SENDER_LEARN: + SendConfirmLearn(player, action); + break; + + case GOSSIP_SENDER_UNLEARN: + SendConfirmUnlearn(player, action); break; - case N_TRAINER_SHADOWEAVE: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + + case GOSSIP_SENDER_CHECK: + SendActionMenu(player, action); break; } + return true; } - } + }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override + CreatureAI* GetAI(Creature* creature) const override { - ClearGossipMenuFor(player); - switch (sender) - { - case GOSSIP_SENDER_MAIN: - SendActionMenu(player, creature, action); - break; - - case GOSSIP_SENDER_LEARN: - SendConfirmLearn(player, creature, action); - break; - - case GOSSIP_SENDER_UNLEARN: - SendConfirmUnlearn(player, creature, action); - break; - - case GOSSIP_SENDER_CHECK: - SendActionMenu(player, creature, action); - break; - } - return true; + return new npc_prof_tailorAI(creature); } }; diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 7c367705d36..8bc2fe634c0 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -331,28 +331,24 @@ public: break; } } + + void QuestAccept(Player* /*player*/, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_CLUCK) + Reset(); + } + + void QuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override + { + if (quest->GetQuestId() == QUEST_CLUCK) + Reset(); + } }; CreatureAI* GetAI(Creature* creature) const override { return new npc_chicken_cluckAI(creature); } - - bool OnQuestAccept(Player* /*player*/, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_CLUCK) - ENSURE_AI(npc_chicken_cluck::npc_chicken_cluckAI, creature->AI())->Reset(); - - return true; - } - - bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*opt*/) override - { - if (quest->GetQuestId() == QUEST_CLUCK) - ENSURE_AI(npc_chicken_cluck::npc_chicken_cluckAI, creature->AI())->Reset(); - - return true; - } }; /*###### @@ -815,15 +811,13 @@ public: void UpdateAI(uint32 diff) override; void EnterCombat(Unit* /*who*/) override { } - }; - - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if ((quest->GetQuestId() == 6624) || (quest->GetQuestId() == 6622)) - ENSURE_AI(npc_doctor::npc_doctorAI, creature->AI())->BeginEvent(player); - return true; - } + void QuestAccept(Player* player, Quest const* quest) override + { + if ((quest->GetQuestId() == 6624) || (quest->GetQuestId() == 6622)) + BeginEvent(player); + } + }; CreatureAI* GetAI(Creature* creature) const override { @@ -1278,117 +1272,129 @@ class npc_sayge : public CreatureScript public: npc_sayge() : CreatureScript("npc_sayge") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_saygeAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetSpellHistory()->HasCooldown(SPELL_STRENGTH) || - player->GetSpellHistory()->HasCooldown(SPELL_AGILITY) || - player->GetSpellHistory()->HasCooldown(SPELL_STAMINA) || - player->GetSpellHistory()->HasCooldown(SPELL_SPIRIT) || - player->GetSpellHistory()->HasCooldown(SPELL_INTELLECT) || - player->GetSpellHistory()->HasCooldown(SPELL_ARMOR) || - player->GetSpellHistory()->HasCooldown(SPELL_DAMAGE) || - player->GetSpellHistory()->HasCooldown(SPELL_RESISTANCE)) - SendGossipMenuFor(player, GOSSIP_MENU_CANT_GIVE_YOU_YOUR, creature->GetGUID()); - else + npc_saygeAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (player->GetSpellHistory()->HasCooldown(SPELL_STRENGTH) || + player->GetSpellHistory()->HasCooldown(SPELL_AGILITY) || + player->GetSpellHistory()->HasCooldown(SPELL_STAMINA) || + player->GetSpellHistory()->HasCooldown(SPELL_SPIRIT) || + player->GetSpellHistory()->HasCooldown(SPELL_INTELLECT) || + player->GetSpellHistory()->HasCooldown(SPELL_ARMOR) || + player->GetSpellHistory()->HasCooldown(SPELL_DAMAGE) || + player->GetSpellHistory()->HasCooldown(SPELL_RESISTANCE)) + SendGossipMenuFor(player, GOSSIP_MENU_CANT_GIVE_YOU_YOUR, me->GetGUID()); + else + { + AddGossipItemFor(player, GOSSIP_I_AM_READY_TO_DISCOVER, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_MENU_I_HAVE_LONG_KNOWN, me->GetGUID()); + } + + return true; + } + + void SendAction(Player* player, uint32 action) { - AddGossipItemFor(player, GOSSIP_I_AM_READY_TO_DISCOVER, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, GOSSIP_MENU_I_HAVE_LONG_KNOWN, creature->GetGUID()); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE1, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE2, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE3, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE4, GOSSIP_MENU_OPTION_ID_ANSWER_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + SendGossipMenuFor(player, GOSSIP_MENU_YOU_HAVE_BEEN_TASKED, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE5, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 1, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE6, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 2, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE7, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 3, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, GOSSIP_MENU_SWORN_EXECUTIONER, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE8, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 4, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE9, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 5, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE10, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 2, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, GOSSIP_MENU_DIPLOMATIC_MISSION, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE11, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 6, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE12, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 7, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE13, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 8, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, GOSSIP_MENU_YOUR_BROTHER_SEEKS, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 5: + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE14, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 5, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE15, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 4, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE16, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 3, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, GOSSIP_MENU_A_TERRIBLE_BEAST, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF: + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE17, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); + SendGossipMenuFor(player, GOSSIP_MENU_YOUR_FORTUNE_IS_CAST, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 6: + DoCast(player, SPELL_FORTUNE, false); + SendGossipMenuFor(player, GOSSIP_MENU_HERE_IS_YOUR_FORTUNE, me->GetGUID()); + break; + } } - return true; - } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + uint32 spellId = 0; + switch (sender) + { + case GOSSIP_SENDER_MAIN: + SendAction(player, action); + break; + case GOSSIP_SENDER_MAIN + 1: + spellId = SPELL_DAMAGE; + break; + case GOSSIP_SENDER_MAIN + 2: + spellId = SPELL_RESISTANCE; + break; + case GOSSIP_SENDER_MAIN + 3: + spellId = SPELL_ARMOR; + break; + case GOSSIP_SENDER_MAIN + 4: + spellId = SPELL_SPIRIT; + break; + case GOSSIP_SENDER_MAIN + 5: + spellId = SPELL_INTELLECT; + break; + case GOSSIP_SENDER_MAIN + 6: + spellId = SPELL_STAMINA; + break; + case GOSSIP_SENDER_MAIN + 7: + spellId = SPELL_STRENGTH; + break; + case GOSSIP_SENDER_MAIN + 8: + spellId = SPELL_AGILITY; + break; + } - void SendAction(Player* player, Creature* creature, uint32 action) - { - switch (action) - { - case GOSSIP_ACTION_INFO_DEF + 1: - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE1, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE2, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE3, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE4, GOSSIP_MENU_OPTION_ID_ANSWER_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - SendGossipMenuFor(player, GOSSIP_MENU_YOU_HAVE_BEEN_TASKED, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE5, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 1, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE6, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 2, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE7, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 3, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, GOSSIP_MENU_SWORN_EXECUTIONER, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE8, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 4, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE9, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 5, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE10,GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 2, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, GOSSIP_MENU_DIPLOMATIC_MISSION, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 4: - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE11, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 6, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE12, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 7, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE13, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 8, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, GOSSIP_MENU_YOUR_BROTHER_SEEKS, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 5: - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE14, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 5, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE15, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 4, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE16, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 3, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, GOSSIP_MENU_A_TERRIBLE_BEAST, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF: - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE17, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); - SendGossipMenuFor(player, GOSSIP_MENU_YOUR_FORTUNE_IS_CAST, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 6: - creature->CastSpell(player, SPELL_FORTUNE, false); - SendGossipMenuFor(player, GOSSIP_MENU_HERE_IS_YOUR_FORTUNE, creature->GetGUID()); - break; + if (spellId) + { + DoCast(player, spellId, false); + player->GetSpellHistory()->AddCooldown(spellId, 0, std::chrono::hours(2)); + SendAction(player, action); + } + return true; } - } + }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override + CreatureAI* GetAI(Creature* creature) const override { - ClearGossipMenuFor(player); - uint32 spellId = 0; - switch (sender) - { - case GOSSIP_SENDER_MAIN: - SendAction(player, creature, action); - break; - case GOSSIP_SENDER_MAIN + 1: - spellId = SPELL_DAMAGE; - break; - case GOSSIP_SENDER_MAIN + 2: - spellId = SPELL_RESISTANCE; - break; - case GOSSIP_SENDER_MAIN + 3: - spellId = SPELL_ARMOR; - break; - case GOSSIP_SENDER_MAIN + 4: - spellId = SPELL_SPIRIT; - break; - case GOSSIP_SENDER_MAIN + 5: - spellId = SPELL_INTELLECT; - break; - case GOSSIP_SENDER_MAIN + 6: - spellId = SPELL_STAMINA; - break; - case GOSSIP_SENDER_MAIN + 7: - spellId = SPELL_STRENGTH; - break; - case GOSSIP_SENDER_MAIN + 8: - spellId = SPELL_AGILITY; - break; - } - - if (spellId) - { - creature->CastSpell(player, spellId, false); - player->GetSpellHistory()->AddCooldown(spellId, 0, std::chrono::hours(2)); - SendAction(player, creature, action); - } - return true; + return new npc_saygeAI(creature); } }; @@ -1863,8 +1869,6 @@ public: enum NPC_Wormhole { - DATA_SHOW_UNDERGROUND = 1, // -> Random 0 or 1 - MENU_ID_WORMHOLE = 10668, // "This tear in the fabric of time and space looks ominous." NPC_TEXT_WORMHOLE = 14785, // (not 907 "What brings you to this part of the world, $n?") GOSSIP_OPTION_1 = 0, // "Borean Tundra" @@ -1904,71 +1908,67 @@ class npc_wormhole : public CreatureScript Initialize(); } - uint32 GetData(uint32 type) const override - { - return (type == DATA_SHOW_UNDERGROUND && _showUnderground) ? 1 : 0; - } - - private: - bool _showUnderground; - }; - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsSummon()) + bool GossipHello(Player* player) override { - if (player == creature->ToTempSummon()->GetSummoner()) + if (me->IsSummon()) { - AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + if (player == me->ToTempSummon()->GetSummoner()) + { + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - if (creature->AI()->GetData(DATA_SHOW_UNDERGROUND)) - AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); + if (_showUnderground) + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); - SendGossipMenuFor(player, NPC_TEXT_WORMHOLE, creature->GetGUID()); + SendGossipMenuFor(player, NPC_TEXT_WORMHOLE, me->GetGUID()); + } } + + return true; } - return true; - } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: // Borean Tundra + CloseGossipMenuFor(player); + DoCast(player, SPELL_BOREAN_TUNDRA, false); + break; + case GOSSIP_ACTION_INFO_DEF + 2: // Howling Fjord + CloseGossipMenuFor(player); + DoCast(player, SPELL_HOWLING_FJORD, false); + break; + case GOSSIP_ACTION_INFO_DEF + 3: // Sholazar Basin + CloseGossipMenuFor(player); + DoCast(player, SPELL_SHOLAZAR_BASIN, false); + break; + case GOSSIP_ACTION_INFO_DEF + 4: // Icecrown + CloseGossipMenuFor(player); + DoCast(player, SPELL_ICECROWN, false); + break; + case GOSSIP_ACTION_INFO_DEF + 5: // Storm peaks + CloseGossipMenuFor(player); + DoCast(player, SPELL_STORM_PEAKS, false); + break; + case GOSSIP_ACTION_INFO_DEF + 6: // Underground + CloseGossipMenuFor(player); + DoCast(player, SPELL_UNDERGROUND, false); + break; + } - switch (action) - { - case GOSSIP_ACTION_INFO_DEF + 1: // Borean Tundra - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_BOREAN_TUNDRA, false); - break; - case GOSSIP_ACTION_INFO_DEF + 2: // Howling Fjord - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_HOWLING_FJORD, false); - break; - case GOSSIP_ACTION_INFO_DEF + 3: // Sholazar Basin - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_SHOLAZAR_BASIN, false); - break; - case GOSSIP_ACTION_INFO_DEF + 4: // Icecrown - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_ICECROWN, false); - break; - case GOSSIP_ACTION_INFO_DEF + 5: // Storm peaks - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_STORM_PEAKS, false); - break; - case GOSSIP_ACTION_INFO_DEF + 6: // Underground - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_UNDERGROUND, false); - break; + return true; } - return true; - } + private: + bool _showUnderground; + }; CreatureAI* GetAI(Creature* creature) const override { @@ -1993,36 +1993,47 @@ class npc_experience : public CreatureScript public: npc_experience() : CreatureScript("npc_experience") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_experienceAI : public ScriptedAI { - if (player->HasPlayerFlag(PLAYER_FLAGS_NO_XP_GAIN)) // not gaining XP + npc_experienceAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override { - AddGossipItemFor(player, MENU_ID_XP_ON_OFF, OPTION_ID_XP_ON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, NPC_TEXT_XP_ON_OFF, creature->GetGUID()); + if (player->HasPlayerFlag(PLAYER_FLAGS_NO_XP_GAIN)) // not gaining XP + { + AddGossipItemFor(player, MENU_ID_XP_ON_OFF, OPTION_ID_XP_ON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, NPC_TEXT_XP_ON_OFF, me->GetGUID()); + } + else // currently gaining XP + { + AddGossipItemFor(player, MENU_ID_XP_ON_OFF, OPTION_ID_XP_OFF, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, NPC_TEXT_XP_ON_OFF, me->GetGUID()); + } + return true; } - else // currently gaining XP + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - AddGossipItemFor(player, MENU_ID_XP_ON_OFF, OPTION_ID_XP_OFF, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - SendGossipMenuFor(player, NPC_TEXT_XP_ON_OFF, creature->GetGUID()); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: // XP ON selected + player->RemovePlayerFlag(PLAYER_FLAGS_NO_XP_GAIN); // turn on XP gain + break; + case GOSSIP_ACTION_INFO_DEF + 2: // XP OFF selected + player->AddPlayerFlag(PLAYER_FLAGS_NO_XP_GAIN); // turn off XP gain + break; + } + CloseGossipMenuFor(player); + return true; } - return true; - } + }; - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override + CreatureAI* GetAI(Creature* creature) const override { - ClearGossipMenuFor(player); - - switch (action) - { - case GOSSIP_ACTION_INFO_DEF + 1: // XP ON selected - player->RemovePlayerFlag(PLAYER_FLAGS_NO_XP_GAIN); // turn on XP gain - break; - case GOSSIP_ACTION_INFO_DEF + 2: // XP OFF selected - player->AddPlayerFlag(PLAYER_FLAGS_NO_XP_GAIN); // turn off XP gain - break; - } - CloseGossipMenuFor(player); - return true; + return new npc_experienceAI(creature); } }; @@ -2675,7 +2686,7 @@ public: }); } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { switch (gossipListId) { @@ -2726,6 +2737,7 @@ public: break; } player->PlayerTalkClass->SendCloseGossip(); + return false; } void UpdateAI(uint32 diff) override |