diff --git a/src/server/game/AI/CoreAI/GameObjectAI.h b/src/server/game/AI/CoreAI/GameObjectAI.h index 1aaa64cd5e6..1d938be7b1a 100644 --- a/src/server/game/AI/CoreAI/GameObjectAI.h +++ b/src/server/game/AI/CoreAI/GameObjectAI.h @@ -29,9 +29,9 @@ 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 int32 Permissible(GameObject const* /*go*/) { return PERMIT_BASE_NO; } + // 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 4f4240887ff..42f7cd6a63e 100644 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -297,13 +297,26 @@ 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*/, char const* /*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 ada61de1168..8df12baec6f 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -795,24 +795,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); } @@ -902,7 +907,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); } @@ -951,10 +956,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(); } @@ -971,41 +976,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) +bool SmartGameObjectAI::GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) { - GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_SELECT, player, sender, action, false, nullptr, go); + GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_SELECT, player, menuId, gossipListId, 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) @@ -1025,9 +1028,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 bf0405eb1ea..1b5c733a8f7 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.h +++ b/src/server/game/AI/SmartScripts/SmartAI.h @@ -178,13 +178,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; @@ -256,15 +255,15 @@ class TC_GAME_API SmartGameObjectAI : public GameObjectAI static int32 Permissible(GameObject const* /*go*/) { return PERMIT_BASE_NO; } 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 1dd6a70694f..d3f57181165 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -2736,16 +2736,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, 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, 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, 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, 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, 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, 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, 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, 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, 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: @@ -3592,9 +3592,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 5b798a40732..a23ad8870e5 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -811,7 +811,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 161258f1112..9e4dfc1a8bb 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -182,7 +182,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) @@ -405,8 +405,8 @@ struct SmartEvent struct { - uint32 state; - } goStateChanged; + uint32 lootState; + } goLootStateChanged; struct { @@ -588,7 +588,7 @@ enum SMART_ACTION SMART_ACTION_LOAD_EQUIPMENT = 124, // id SMART_ACTION_TRIGGER_RANDOM_TIMED_EVENT = 125, // id min range, id max range SMART_ACTION_REMOVE_ALL_GAMEOBJECTS = 126, - SMART_ACTION_STOP_MOTION = 127, // stopMoving, movementExpired + SMART_ACTION_STOP_MOTION = 127, // stopMoving, movementExpired SMART_ACTION_PLAY_ANIMKIT = 128, // id, type (0 = oneShot, 1 = aiAnim, 2 = meleeAnim, 3 = movementAnim) SMART_ACTION_END = 129 @@ -1464,7 +1464,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 a4b096c6696..22226c52acf 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -712,8 +712,6 @@ void Creature::Update(uint32 diff) default: break; } - - sScriptMgr->OnCreatureUpdate(this, diff); } void Creature::RegenerateMana() diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 6bf67e52022..2f9cdf6b3d0 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -33,6 +33,7 @@ #include "UpdateFieldFlags.h" #include "World.h" #include "Transport.h" +#include "GossipDef.h" GameObject::GameObject() : WorldObject(false), MapObject(), m_model(nullptr), m_goValue(), m_AI(nullptr) @@ -721,7 +722,6 @@ void GameObject::Update(uint32 diff) break; } } - sScriptMgr->OnGameObjectUpdate(this, diff); } void GameObject::Refresh() @@ -1239,9 +1239,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; } @@ -2068,7 +2066,7 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* case GO_DESTRUCTIBLE_DAMAGED: { EventInform(m_goInfo->building.damagedEvent, eventInvoker); - sScriptMgr->OnGameObjectDamaged(this, eventInvoker); + AI()->Damaged(eventInvoker, m_goInfo->building.damageEvent); RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED); SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED); @@ -2092,8 +2090,9 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* } case GO_DESTRUCTIBLE_DESTROYED: { - sScriptMgr->OnGameObjectDestroyed(this, eventInvoker); EventInform(m_goInfo->building.destroyedEvent, eventInvoker); + AI()->Destroyed(eventInvoker, m_goInfo->building.destroyedEvent); + if (eventInvoker) if (Battleground* bg = eventInvoker->GetBattleground()) bg->DestroyGate(eventInvoker, this); @@ -2146,8 +2145,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; @@ -2166,7 +2164,8 @@ void GameObject::SetLootState(LootState state, Unit* unit) void GameObject::SetGoState(GOState state) { SetByteValue(GAMEOBJECT_BYTES_1, 0, 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 5ed13b49bd4..19e81a9c3e8 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -14879,8 +14879,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: @@ -14905,7 +14905,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: @@ -16021,11 +16021,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()); @@ -16034,7 +16035,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 c1e406d3535..06205471465 100644 --- a/src/server/game/Events/GameEventMgr.cpp +++ b/src/server/game/Events/GameEventMgr.cpp @@ -1684,7 +1684,7 @@ class GameEventAIHookWorker { 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& gameObjectMap) diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index c33d5904ac4..1689b8efea8 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -147,14 +147,12 @@ void WorldSession::HandleGossipSelectOptionOpcode(WorldPacket& recvData) { if (unit) { - unit->AI()->sGossipSelectCode(_player, menuId, gossipListId, code.c_str()); - if (!sScriptMgr->OnGossipSelectCode(_player, unit, _player->PlayerTalkClass->GetGossipOptionSender(gossipListId), _player->PlayerTalkClass->GetGossipOptionAction(gossipListId), code.c_str())) + if (!unit->AI()->GossipSelectCode(_player, menuId, gossipListId, code.c_str())) _player->OnGossipSelect(unit, gossipListId, menuId); } else { - go->AI()->GossipSelectCode(_player, menuId, gossipListId, code.c_str()); - if (!sScriptMgr->OnGossipSelectCode(_player, go, _player->PlayerTalkClass->GetGossipOptionSender(gossipListId), _player->PlayerTalkClass->GetGossipOptionAction(gossipListId), code.c_str())) + if (!go->AI()->GossipSelectCode(_player, menuId, gossipListId, code.c_str())) _player->OnGossipSelect(go, gossipListId, menuId); } } @@ -162,14 +160,12 @@ void WorldSession::HandleGossipSelectOptionOpcode(WorldPacket& recvData) { if (unit) { - unit->AI()->sGossipSelect(_player, menuId, gossipListId); - if (!sScriptMgr->OnGossipSelect(_player, unit, _player->PlayerTalkClass->GetGossipOptionSender(gossipListId), _player->PlayerTalkClass->GetGossipOptionAction(gossipListId))) + if (!unit->AI()->GossipSelect(_player, menuId, gossipListId)) _player->OnGossipSelect(unit, gossipListId, menuId); } else { - go->AI()->GossipSelect(_player, menuId, gossipListId); - if (!sScriptMgr->OnGossipSelect(_player, go, _player->PlayerTalkClass->GetGossipOptionSender(gossipListId), _player->PlayerTalkClass->GetGossipOptionAction(gossipListId))) + if (!go->AI()->GossipSelect(_player, menuId, gossipListId)) _player->OnGossipSelect(go, gossipListId, menuId); } } @@ -618,19 +614,19 @@ void WorldSession::HandleResurrectResponseOpcode(WorldPacket& recvData) if (!GetPlayer()->IsResurrectRequestedBy(guid)) return; - if (Player* ressPlayer = ObjectAccessor::GetPlayer(*GetPlayer(), guid)) - { - if (InstanceScript* instance = ressPlayer->GetInstanceScript()) - { - if ((instance->IsEncounterInProgress() && ressPlayer->GetMap()->IsRaid())) - { - if (!instance->GetCombatResurrectionCharges()) - return; - else - instance->UseCombatResurrection(); - } - } - } + if (Player* ressPlayer = ObjectAccessor::GetPlayer(*GetPlayer(), guid)) + { + if (InstanceScript* instance = ressPlayer->GetInstanceScript()) + { + if ((instance->IsEncounterInProgress() && ressPlayer->GetMap()->IsRaid())) + { + if (!instance->GetCombatResurrectionCharges()) + return; + else + instance->UseCombatResurrection(); + } + } + } GetPlayer()->ResurrectUsingRequestData(); } diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index 41c24442f28..b4d5583c0c4 100644 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -364,13 +364,13 @@ void WorldSession::HandleGossipHelloOpcode(WorldPacket& recvData) } } - 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::HandleSpiritHealerActivateOpcode(WorldPacket& recvData) diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 2acaa287a7a..61e59a33449 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -89,13 +89,12 @@ void WorldSession::HandleQuestgiverHelloOpcode(WorldPacket& recvData) // Stop the npc if moving creature->StopMoving(); - if (sScriptMgr->OnGossipHello(_player, creature)) + _player->PlayerTalkClass->ClearMenus(); + if (creature->AI()->GossipHello(_player)) return; _player->PrepareGossipMenu(creature, creature->GetCreatureTemplate()->GossipMenuId, true); _player->SendPreparedGossip(creature); - - creature->AI()->sGossipHello(_player); } void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket& recvData) @@ -308,48 +307,42 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) case TYPEID_UNIT: case TYPEID_PLAYER: { - //For AutoSubmition was added plr case there as it almost same exclute AI script cases. - Creature* creatureQGiver = object->ToCreature(); - if (!creatureQGiver || !sScriptMgr->OnQuestReward(_player, creatureQGiver, quest, reward)) + // Send next quest + if (Quest const* nextQuest = _player->GetNextQuest(guid, quest)) { - // Send next quest - if (Quest const* nextQuest = _player->GetNextQuest(guid, quest)) + // Only send the quest to the player if the conditions are met + if (_player->CanTakeQuest(nextQuest, false)) { - // Only send the quest to the player if the conditions are met - if (_player->CanTakeQuest(nextQuest, false)) - { - if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) - _player->AddQuestAndCheckCompletion(nextQuest, object); + if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) + _player->AddQuestAndCheckCompletion(nextQuest, object); - _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true, false); - } + _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true, false); } - - if (creatureQGiver) - creatureQGiver->AI()->sQuestReward(_player, quest, reward); } + + _player->PlayerTalkClass->ClearMenus(); + if (Creature* creatureQGiver = object->ToCreature()) + creatureQGiver->AI()->QuestReward(_player, quest, reward); break; } case TYPEID_GAMEOBJECT: { - GameObject* questGiver = object->ToGameObject(); - if (!sScriptMgr->OnQuestReward(_player, questGiver, quest, reward)) + // Send next quest + if (Quest const* nextQuest = _player->GetNextQuest(guid, quest)) { - // Send next quest - if (Quest const* nextQuest = _player->GetNextQuest(guid, quest)) + // Only send the quest to the player if the conditions are met + if (_player->CanTakeQuest(nextQuest, false)) { - // Only send the quest to the player if the conditions are met - if (_player->CanTakeQuest(nextQuest, false)) - { - if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) - _player->AddQuestAndCheckCompletion(nextQuest, object); + if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) + _player->AddQuestAndCheckCompletion(nextQuest, object); - _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true, false); - } + _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true, false); } - - questGiver->AI()->QuestReward(_player, quest, reward); } + + _player->PlayerTalkClass->ClearMenus(); + if (GameObject* questGiver = object->ToGameObject()) + questGiver->AI()->QuestReward(_player, quest, reward); break; } default: diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 0040f016874..444635f147d 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -1560,78 +1560,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); @@ -1662,115 +1590,6 @@ GameObjectAI* ScriptMgr::GetGameObjectAI(GameObject* gameobject) return tmpscript->GetAI(gameobject); } -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) { ASSERT(player); diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 019cfdc322f..7982a123cc4 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -403,7 +403,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 +class TC_GAME_API CreatureScript : public UnitScript { protected: @@ -411,32 +411,11 @@ class TC_GAME_API CreatureScript : public UnitScript, public UpdatableScript @@ -447,38 +426,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*/) { return DIALOG_STATUS_SCRIPTED_NO_STATUS; } - - // 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 @@ -952,30 +901,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 b21113f0dfc..5e81a416877 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1675,9 +1675,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; @@ -4153,23 +4151,23 @@ void Spell::EffectSummonObject(SpellEffIndex effIndex) void Spell::EffectSummonDynObj(SpellEffIndex effIndex) { - if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) - return; + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; - Player* player = m_caster->ToPlayer(); - if (!player) - return; + Player* player = m_caster->ToPlayer(); + if (!player) + return; - float radius = m_spellInfo->Effects[effIndex].CalcRadius(m_caster); - DynamicObject* dynObj = new DynamicObject(false); + float radius = m_spellInfo->Effects[effIndex].CalcRadius(m_caster); + DynamicObject* dynObj = new DynamicObject(false); if (!dynObj->CreateDynamicObject(m_caster->GetMap()->GenerateLowGuid(), m_caster, m_spellInfo, *destTarget, radius, DYNAMIC_OBJECT_RAID_MARKER)) - { - delete dynObj; - return; - } + { + delete dynObj; + return; + } - int32 duration = m_spellInfo->GetDuration(); - dynObj->SetDuration(duration); + int32 duration = m_spellInfo->GetDuration(); + dynObj->SetDuration(duration); } void Spell::EffectSummonRaidMarker(SpellEffIndex effIndex) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp index a643d05fa95..d06b3e399ae 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp @@ -22,6 +22,7 @@ #include "blackrock_depths.h" #include "Player.h" #include "WorldSession.h" +#include "GameObjectAI.h" //go_shadowforge_brazier class go_shadowforge_brazier : public GameObjectScript @@ -29,21 +30,31 @@ class go_shadowforge_brazier : public GameObjectScript public: go_shadowforge_brazier() : GameObjectScript("go_shadowforge_brazier") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_shadowforge_brazierAI : public GameObjectAI { - if (InstanceScript* instance = go->GetInstanceScript()) + go_shadowforge_brazierAI(GameObject* go) : GameObjectAI(go) { } + + 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 (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); + if (InstanceScript* instance = me->GetInstanceScript()) + { + 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; } - return false; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_shadowforge_brazierAI(go); } }; @@ -429,45 +440,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)) + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (me->IsVendor() && player->GetReputationRank(59) >= REP_FRIENDLY) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_ITEM_SHOW_ACCESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + + 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); + } + + 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 { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_GET_CONTRACT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + return new npc_lokhtos_darkbargainerAI(creature); } - - if (player->GetReputationRank(59) < REP_FRIENDLY) - SendGossipMenuFor(player, 3673, creature->GetGUID()); - else - SendGossipMenuFor(player, 3677, creature->GetGUID()); - - return true; - } }; // npc_rocknot @@ -480,134 +503,134 @@ enum Rocknot class npc_rocknot : public CreatureScript { -public: - npc_rocknot() : CreatureScript("npc_rocknot") { } + 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) + struct npc_rocknotAI : public npc_escortAI { - 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) + npc_rocknotAI(Creature* creature) : npc_escortAI(creature) { - 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); + Initialize(); + instance = creature->GetInstanceScript(); } - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } - - struct npc_rocknotAI : public npc_escortAI - { - npc_rocknotAI(Creature* creature) : npc_escortAI(creature) - { - Initialize(); - instance = creature->GetInstanceScript(); - } - - void Initialize() - { - BreakKeg_Timer = 0; - BreakDoor_Timer = 0; - } - - InstanceScript* instance; - - uint32 BreakKeg_Timer; - uint32 BreakDoor_Timer; - - void Reset() override - { - if (HasEscortState(STATE_ESCORT_ESCORTING)) - return; - - Initialize(); - } - - void DoGo(uint32 id, uint32 state) - { - if (GameObject* go = instance->instance->GetGameObject(instance->GetGuidData(id))) - go->SetGoState((GOState)state); - } - - void WaypointReached(uint32 waypointId) override - { - switch (waypointId) + void Initialize() { - case 1: - me->HandleEmoteCommand(EMOTE_ONESHOT_KICK); - break; - case 2: - me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK_UNARMED); - break; - case 3: - me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK_UNARMED); - break; - case 4: - me->HandleEmoteCommand(EMOTE_ONESHOT_KICK); - break; - case 5: - me->HandleEmoteCommand(EMOTE_ONESHOT_KICK); - BreakKeg_Timer = 2000; - break; + BreakKeg_Timer = 0; + BreakDoor_Timer = 0; } - } - void UpdateAI(uint32 diff) override - { - if (BreakKeg_Timer) + InstanceScript* instance; + + uint32 BreakKeg_Timer; + uint32 BreakDoor_Timer; + + void Reset() override { - if (BreakKeg_Timer <= diff) + if (HasEscortState(STATE_ESCORT_ESCORTING)) + return; + + Initialize(); + } + + void DoGo(uint32 id, uint32 state) + { + if (GameObject* go = instance->instance->GetGameObject(instance->GetGuidData(id))) + go->SetGoState((GOState)state); + } + + void WaypointReached(uint32 waypointId) override + { + switch (waypointId) { - DoGo(DATA_GO_BAR_KEG, 0); - BreakKeg_Timer = 0; - BreakDoor_Timer = 1000; - } else BreakKeg_Timer -= diff; + case 1: + me->HandleEmoteCommand(EMOTE_ONESHOT_KICK); + break; + case 2: + me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK_UNARMED); + break; + case 3: + me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK_UNARMED); + break; + case 4: + me->HandleEmoteCommand(EMOTE_ONESHOT_KICK); + break; + case 5: + me->HandleEmoteCommand(EMOTE_ONESHOT_KICK); + BreakKeg_Timer = 2000; + break; + } } - if (BreakDoor_Timer) + void UpdateAI(uint32 diff) override { - if (BreakDoor_Timer <= diff) + if (BreakKeg_Timer) { - DoGo(DATA_GO_BAR_DOOR, 2); - DoGo(DATA_GO_BAR_KEG_TRAP, 0); //doesn't work very well, leaving code here for future - //spell by trap has effect61, this indicate the bar go hostile + if (BreakKeg_Timer <= diff) + { + DoGo(DATA_GO_BAR_KEG, 0); + BreakKeg_Timer = 0; + BreakDoor_Timer = 1000; + } + else BreakKeg_Timer -= diff; + } - if (Unit* tmp = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_PHALANX))) - tmp->SetFaction(FACTION_MONSTER); + if (BreakDoor_Timer) + { + if (BreakDoor_Timer <= diff) + { + DoGo(DATA_GO_BAR_DOOR, 2); + DoGo(DATA_GO_BAR_KEG_TRAP, 0); //doesn't work very well, leaving code here for future + //spell by trap has effect61, this indicate the bar go hostile - //for later, this event(s) has alot more to it. - //optionally, DONE can trigger bar to go hostile. - instance->SetData(TYPE_BAR, DONE); + if (Unit* tmp = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_PHALANX))) + tmp->SetFaction(FACTION_MONSTER); - BreakDoor_Timer = 0; - } else BreakDoor_Timer -= diff; + //for later, this event(s) has alot more to it. + //optionally, DONE can trigger bar to go hostile. + instance->SetData(TYPE_BAR, DONE); + + BreakDoor_Timer = 0; + } + else BreakDoor_Timer -= diff; + } + + npc_escortAI::UpdateAI(diff); } - npc_escortAI::UpdateAI(diff); + void QuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override + { + InstanceScript* instance = me->GetInstanceScript(); + if (!instance) + return; + + 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) + { + me->AI()->Talk(SAY_GOT_BEER); + me->CastSpell(me, SPELL_DRUNKEN_RAGE, false); + + if (npc_escortAI* escortAI = CAST_AI(npc_rocknot::npc_rocknotAI, me->AI())) + escortAI->Start(false, false); + } + } + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new 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 70173704fb2..37b7e892ae5 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp @@ -119,10 +119,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) { @@ -131,6 +131,8 @@ public: } else if (gossipListId == GOSSIP_OPTION_APOLOGIZE) CloseGossipMenuFor(player); + + return false; } void Reset() override @@ -425,16 +427,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 b4ebc8b05a6..f86b36f3ec1 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 @@ -54,45 +54,56 @@ class boss_gloomrel : public CreatureScript public: boss_gloomrel() : CreatureScript("boss_gloomrel") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override + struct boss_gloomrelAI : public ScriptedAI { - ClearGossipMenuFor(player); - switch (action) + boss_gloomrelAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override { - 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()) - { - //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; + 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); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; } - return true; - } - bool OnGossipHello(Player* player, Creature* creature) override + 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_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); + if (InstanceScript* instance = me->GetInstanceScript()) + { + //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; + } + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const 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); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; + return new boss_gloomrelAI(creature); } }; @@ -122,37 +133,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_DARK_IRON_DWARVES); - creature->RemoveFlag(UNIT_FIELD_FLAGS, 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) @@ -161,6 +141,39 @@ class boss_doomrel : public CreatureScript _instance = creature->GetInstanceScript(); } + 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_DARK_IRON_DWARVES); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + me->AI()->AttackStart(player); + InstanceScript* instance = me->GetInstanceScript(); + if (instance) + 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; + } + void Initialize() { _voidwalkers = false; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index 4791f4ecf13..4f5074d470d 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -370,7 +370,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) { @@ -378,6 +378,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 56b6731da84..3d535e65312 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -21,6 +21,7 @@ #include "SpellScript.h" #include "blackwing_lair.h" #include "Player.h" +#include "GameObjectAI.h" enum Say { @@ -174,20 +175,30 @@ 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)) - { - razorgore->Attack(player, true); - player->CastSpell(razorgore, SPELL_MINDCONTROL); - } - return true; - } + struct go_orb_of_dominationAI : public GameObjectAI + { + go_orb_of_dominationAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + if (instance->GetData(DATA_EGG_EVENT) != DONE) + if (Creature* razorgore = instance->GetCreature(DATA_RAZORGORE_THE_UNTAMED)) + { + razorgore->Attack(player, true); + player->CastSpell(razorgore, SPELL_MINDCONTROL); + } + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new 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 5ed364f0f02..784cf554303 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 c91b9bc813b..d0028bdd658 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp @@ -195,13 +195,15 @@ 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 true; } }; diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp index 120e56dc690..18bdc09d2d5 100644 --- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp +++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp @@ -121,7 +121,7 @@ public: } } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { if (gossipListId == 0) { @@ -132,6 +132,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 c40def9a5c6..474ccb1ed3b 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp @@ -20,6 +20,7 @@ #include "SpellScript.h" #include "SpellAuraEffects.h" #include "karazhan.h" +#include "GameObjectAI.h" enum NightbaneSpells { @@ -415,25 +416,35 @@ 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(GAMEOBJECT_FLAGS, 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 (Creature* nightbane = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_NIGHTBANE))) + struct go_blackened_urnAI : public GameObjectAI { - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); - nightbane->AI()->DoAction(ACTION_SUMMON); + go_blackened_urnAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (me->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE)) + return false; + + InstanceScript* instance = me->GetInstanceScript(); + if (!instance || instance->GetBossState(DATA_NIGHTBANE) == DONE || instance->GetBossState(DATA_NIGHTBANE) == IN_PROGRESS) + return false; + + if (Creature* nightbane = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_NIGHTBANE))) + { + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); + nightbane->AI()->DoAction(ACTION_SUMMON); + } + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new 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 0130f7b9a8f..2b9562b0d6c 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp @@ -816,7 +816,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) { @@ -828,6 +828,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 d45fa9fc9b2..cc678f8b534 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp @@ -335,74 +335,71 @@ 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); + + 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; + } + + return true; } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (InstanceScript* instance = creature->GetInstanceScript()) + 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) + if (InstanceScript* instance = me->GetInstanceScript()) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, OZ_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - - if (player->IsGameMaster()) + // 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) { - AddGossipItemFor(player, GOSSIP_ICON_DOT, OZ_GM_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - AddGossipItemFor(player, GOSSIP_ICON_DOT, OZ_GM_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - AddGossipItemFor(player, GOSSIP_ICON_DOT, OZ_GM_GOSSIP3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - } + AddGossipItemFor(player, GOSSIP_ICON_CHAT, OZ_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - if (npc_barnesAI* pBarnesAI = CAST_AI(npc_barnes::npc_barnesAI, creature->AI())) - { - if (!pBarnesAI->RaidWiped) - SendGossipMenuFor(player, 8970, creature->GetGUID()); + if (player->IsGameMaster()) + { + AddGossipItemFor(player, GOSSIP_ICON_DOT, OZ_GM_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + AddGossipItemFor(player, GOSSIP_ICON_DOT, OZ_GM_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + AddGossipItemFor(player, GOSSIP_ICON_DOT, OZ_GM_GOSSIP3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + } + + if (!RaidWiped) + SendGossipMenuFor(player, 8970, me->GetGUID()); else - SendGossipMenuFor(player, 8975, creature->GetGUID()); + SendGossipMenuFor(player, 8975, me->GetGUID()); 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/MagistersTerrace/magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp index 9792ea0cfba..588086b1225 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp @@ -68,46 +68,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); @@ -153,6 +113,47 @@ 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; }; diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 774cf41fd1a..093e575e950 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -27,6 +27,7 @@ #include "SpellInfo.h" #include "CreatureTextMgr.h" #include "MoveSplineInit.h" +#include "GameObjectAI.h" /*###### ##Quest 12848 @@ -322,16 +323,25 @@ class go_acherus_soul_prison : public GameObjectScript public: go_acherus_soul_prison() : GameObjectScript("go_acherus_soul_prison") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_acherus_soul_prisonAI : public GameObjectAI { - if (Creature* anchor = go->FindNearestCreature(29521, 15)) - if (ObjectGuid prisonerGUID = anchor->AI()->GetGUID()) - 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)) + if (ObjectGuid prisonerGUID = anchor->AI()->GetGUID()) + 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); } - }; /*###### @@ -473,47 +483,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->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - creature->RemoveFlag(UNIT_FIELD_FLAGS, 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) @@ -616,6 +585,48 @@ 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 (npc_death_knight_initiateAI* pInitiateAI = CAST_AI(npc_death_knight_initiate::npc_death_knight_initiateAI, me->AI())) + { + if (pInitiateAI->m_bIsDuelInProgress) + return true; + } + + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + me->RemoveFlag(UNIT_FIELD_FLAGS, 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 @@ -749,13 +760,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 5c492d9770e..c2779bcdf4b 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp @@ -199,18 +199,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) @@ -354,6 +342,16 @@ public: } } + void QuestAccept(Player* player, const Quest* 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 42c10ed929f..1bcda1676ce 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp @@ -270,33 +270,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); @@ -1636,6 +1609,34 @@ 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; + } }; }; diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp index 3102b7461d5..3ef55054cd0 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -31,6 +31,7 @@ EndScriptData */ #include "Player.h" #include "Group.h" #include "SpellInfo.h" +#include "GameObjectAI.h" //this texts are already used by 3975 and 3976 enum Says @@ -876,32 +877,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; - - return false; - } - - 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].x, FlightPoint[20].y, FlightPoint[20].z, 0, TEMPSUMMON_MANUAL_DESPAWN, 0)) + struct go_loosely_turned_soilAI : public GameObjectAI { - ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->PlayerGUID = player->GetGUID(); - ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->FlyMode(); + go_loosely_turned_soilAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) 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; + + return false; + } + + void QuestReward(Player* player, Quest const* /*quest*/, uint32 /*opt*/) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS) + return; + + player->AreaExploredOrEventHappens(11405); + if (Creature* horseman = me->SummonCreature(HH_MOUNTED, FlightPoint[20].x, FlightPoint[20].y, FlightPoint[20].z, 0, 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 + { + return new go_loosely_turned_soilAI(go); } - return true; - } }; void npc_head::npc_headAI::Disappear() 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 acb90732940..fd26fb7579b 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp @@ -280,12 +280,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 new go_brazier_of_the_heraldAI(go); } }; diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp index 78f286c82c7..5c819417932 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp @@ -97,7 +97,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) { @@ -105,6 +105,7 @@ class boss_apothecary_hummel : public CreatureScript CloseGossipMenuFor(player); DoAction(ACTION_START_EVENT); } + return false; } void Reset() override @@ -259,6 +260,12 @@ 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; @@ -268,14 +275,6 @@ class boss_apothecary_hummel : public CreatureScript { return GetInstanceAI(creature); } - - bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*opt*/) override - { - if (quest->GetQuestId() == QUEST_YOUVE_BEEN_SERVED) - creature->AI()->DoAction(ACTION_START_EVENT); - - return true; - } }; struct npc_apothecary_genericAI : public ScriptedAI diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp index 3b19da79654..ad78cc71b06 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp @@ -72,31 +72,6 @@ public: return GetInstanceAI(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) @@ -106,6 +81,31 @@ public: InstanceScript* instance; + 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 + { + InstanceScript* instance = me->GetInstanceScript(); + + if (instance && 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; + } + void WaypointReached(uint32 waypointId) override { switch (waypointId) diff --git a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp index 3ccf0e3dd19..71b396795ba 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp @@ -36,6 +36,7 @@ EndContentData */ #include "Group.h" #include "Player.h" #include "SpellInfo.h" +#include "GameObjectAI.h" /*###### ## go_gauntlet_gate (this is the _first_ of the gauntlet gates, two exist) @@ -46,38 +47,48 @@ class go_gauntlet_gate : public GameObjectScript public: go_gauntlet_gate() : GameObjectScript("go_gauntlet_gate") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_gauntlet_gateAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); + go_gauntlet_gateAI(GameObject* go) : GameObjectAI(go) { } - if (!instance) - return false; - - if (instance->GetData(TYPE_BARON_RUN) != NOT_STARTED) - return false; - - if (Group* group = player->GetGroup()) + bool GossipHello(Player* player, bool /*reportUse*/) override { - for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) + InstanceScript* instance = me->GetInstanceScript(); + + if (!instance) + return false; + + if (instance->GetData(TYPE_BARON_RUN) != NOT_STARTED) + return false; + + if (Group* group = player->GetGroup()) { - Player* pGroupie = itr->GetSource(); - if (!pGroupie || !pGroupie->IsInMap(player)) - continue; + for (GroupReference* itr = group->GetFirstMember(); itr != NULL; 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() == go->GetMap()) - pGroupie->CastSpell(pGroupie, SPELL_BARON_ULTIMATUM, true); + 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->CastSpell(player, SPELL_BARON_ULTIMATUM, true); + else if (player->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE && + !player->HasAura(SPELL_BARON_ULTIMATUM) && + 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 new go_gauntlet_gateAI(go); } - }; /*###### diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp index e6be567052d..fd971fa7c4d 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 "ScriptedCreature.h" #include "sunken_temple.h" #include "Player.h" +#include "GameObjectAI.h" /*##### # at_malfurion_Stormrage_trigger @@ -63,16 +64,25 @@ class at_malfurion_stormrage : public AreaTriggerScript 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) { } + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (InstanceScript* instance = player->GetInstanceScript()) + instance->SetData(EVENT_STATE, me->GetEntry()); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_atalai_statueAI(go); + } }; void AddSC_sunken_temple() diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index 5db76065f70..983baed4362 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -28,6 +28,7 @@ EndScriptData */ #include "sunwell_plateau.h" #include "Player.h" #include "WorldSession.h" +#include "GameObjectAI.h" enum Yells { @@ -536,27 +537,37 @@ 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 { - return true; - } +#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; + } #else - (void)go; + (void)me; #endif - player->CastSpell(player, SPELL_TELEPORT_SPECTRAL, true); - return true; + player->CastSpell(player, SPELL_TELEPORT_SPECTRAL, true); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new kalecgos_teleporterAI(go); } }; diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index 6e4a1cbb0ca..381a4220c25 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -29,6 +29,7 @@ EndScriptData */ #include "sunwell_plateau.h" #include #include "Player.h" +#include "GameObjectAI.h" /*** Speech and sounds***/ enum Yells @@ -359,25 +360,35 @@ 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(FACTION_NONE); + go_orb_of_the_blue_flightAI(GameObject* go) : GameObjectAI(go) { } - if (Creature* pKalec = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_KALECGOS_KJ))) - ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->SetRingOfBlueFlames(); + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (me->GetFaction() == 35) + { + InstanceScript* instance = me->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); + me->SetFaction(FACTION_NONE); - go->Refresh(); + if (Creature* pKalec = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_KALECGOS_KJ))) + ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->SetRingOfBlueFlames(); + + me->Refresh(); + } + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_orb_of_the_blue_flightAI(go); } - return true; - } }; //AI for Kil'jaeden Event Controller diff --git a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp index f03b0cbaf30..4d30a186ad2 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp @@ -30,6 +30,7 @@ EndScriptData */ #include "ScriptedCreature.h" #include "uldaman.h" #include "Player.h" +#include "GameObjectAI.h" enum Says { @@ -394,22 +395,28 @@ 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) { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - InstanceScript* instance = player->GetInstanceScript(); - if (!instance) + bool GossipHello(Player* player, bool /*reportUse*/) override + { + InstanceScript* instance = player->GetInstanceScript(); + if (!instance) + return false; + + player->CastSpell(player, SPELL_BOSS_OBJECT_VISUAL, false); + + instance->SetGuidData(0, player->GetGUID()); // activate archaedas return false; + } + }; - player->CastSpell (player, SPELL_BOSS_OBJECT_VISUAL, false); - - instance->SetGuidData(0, player->GetGUID()); // activate archaedas - return false; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_altar_of_archaedasAI(go); } }; diff --git a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp index 23f4c66ac79..4f0c263576b 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp @@ -33,6 +33,7 @@ EndContentData */ #include "ScriptedCreature.h" #include "uldaman.h" #include "Player.h" +#include "GameObjectAI.h" /*###### ## npc_jadespine_basilisk @@ -116,16 +117,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") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - if (InstanceScript* instance = go->GetInstanceScript()) - instance->SetData(DATA_IRONAYA_SEAL, IN_PROGRESS); //door animation and save state. + struct go_keystone_chamberAI : public GameObjectAI + { + go_keystone_chamberAI(GameObject* go) : GameObjectAI(go) { } - return false; - } + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + instance->SetData(DATA_IRONAYA_SEAL, IN_PROGRESS); //door animation and save state. + + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_keystone_chamberAI(go); + } }; /*###### diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp index c737e8d317e..bd13a10a48a 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp @@ -97,10 +97,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) { @@ -112,6 +112,8 @@ class npc_voljin_zulaman : public CreatureScript Talk(SAY_INTRO_1, player); me->SetWalk(true); } + + return true; } void DoAction(int32 action) override diff --git a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp index 533031aed4e..c9d846bd36c 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 bdb623c4f2b..5aef66e5d40 100644 --- a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp @@ -126,25 +126,21 @@ 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_ESCORTEE_N_NEUTRAL_PASSIVE); - - 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_ESCORTEE_N_NEUTRAL_PASSIVE); + Start(true, false, player->GetGUID()); + } } - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { return new npc_ranger_lilathaAI(creature); } - }; void AddSC_ghostlands() diff --git a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp index 5dea92a763f..328ac2e18df 100644 --- a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp @@ -72,7 +72,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 e05ad0541ac..026b5346aed 100644 --- a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp +++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp @@ -113,20 +113,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 37ac4d9804f..ba2fb6c4da2 100644 --- a/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp +++ b/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp @@ -52,7 +52,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(); @@ -78,11 +78,12 @@ class npc_tb_spirit_guide : public CreatureScript areaId = TB_GY_SOUTH_SPIRE; break; default: - return; + return true; } if (WorldSafeLocsEntry const* safeLoc = sWorldSafeLocsStore.LookupEntry(areaId)) player->TeleportTo(safeLoc->map_id, safeLoc->x, safeLoc->y, safeLoc->z, 0); + return true; } }; diff --git a/src/server/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp index ac797622445..4cbdf3b2e5a 100644 --- a/src/server/scripts/EasternKingdoms/zone_undercity.cpp +++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp @@ -101,14 +101,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) @@ -116,6 +108,12 @@ public: Initialize(); } + void QuestReward(Player* player, const Quest *_Quest, uint32 /*slot*/) override + { + if (_Quest->GetQuestId() == QUEST_JOURNEY_TO_UNDERCITY) + SetGUID(player->GetGUID(), GUID_EVENT_INVOKER); + } + void Initialize() { LamentEvent = false; diff --git a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp index f5dd22ed29c..f97527dcb4a 100644 --- a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp @@ -134,26 +134,35 @@ public: class npc_mikhail : public CreatureScript { -public: - npc_mikhail() : CreatureScript("npc_mikhail") { } + public: + npc_mikhail() : CreatureScript("npc_mikhail") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_MISSING_DIPLO_PT11) + struct npc_mikhailAI : public ScriptedAI { - Creature* pSlim = creature->FindNearestCreature(NPC_TAPOKE_SLIM_JAHN, 25.0f); + npc_mikhailAI(Creature* creature) : ScriptedAI(creature) { } - if (!pSlim) - return false; + void QuestAccept(Player* player, const Quest* quest) override + { + if (quest->GetQuestId() == QUEST_MISSING_DIPLO_PT11) + { + Creature* pSlim = me->FindNearestCreature(NPC_TAPOKE_SLIM_JAHN, 25.0f); - if (!pSlim->HasStealthAura()) - pSlim->CastSpell(pSlim, SPELL_STEALTH, true); + if (!pSlim) + return; - 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 (!pSlim->HasStealthAura()) + pSlim->CastSpell(pSlim, 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); + } + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_mikhailAI(creature); } - return false; - } }; /*###### diff --git a/src/server/scripts/Events/childrens_week.cpp b/src/server/scripts/Events/childrens_week.cpp index 11877f3e372..cc38aed2964 100644 --- a/src/server/scripts/Events/childrens_week.cpp +++ b/src/server/scripts/Events/childrens_week.cpp @@ -674,7 +674,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 97c0e33b944..b6b9cacf053 100644 --- a/src/server/scripts/Events/fireworks_show.cpp +++ b/src/server/scripts/Events/fireworks_show.cpp @@ -843,12 +843,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); @@ -857,7 +857,7 @@ public: if (_big) { - if (GameObject* firework = go->SummonGameObject(FireworksBIGOnlyPicker(), rndpos, G3D::Quat(0.f, 0.f, rndrot, rndrot2), 300)) + if (GameObject* firework = me->SummonGameObject(FireworksBIGOnlyPicker(), rndpos, G3D::Quat(0.f, 0.f, rndrot, rndrot2), 300)) { firework->SetRespawnTime(0); firework->Delete(); @@ -865,7 +865,7 @@ public: } else { - if (GameObject* firework = go->SummonGameObject(FireworksPicker(), rndpos, G3D::Quat(0.f, 0.f, rndrot, rndrot2), 300)) + if (GameObject* firework = me->SummonGameObject(FireworksPicker(), rndpos, G3D::Quat(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 333780d2b7d..64c2473e76d 100644 --- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp +++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp @@ -15,6 +15,7 @@ * with this program. If not, see . */ +#include "GameObjectAI.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" @@ -35,35 +36,53 @@ 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 new 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(); - - if (instance) + struct go_blackfathom_fireAI : public GameObjectAI { - go->SetGoState(GO_STATE_ACTIVE); - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - instance->SetData(DATA_FIRE, instance->GetData(DATA_FIRE) + 1); - return true; + go_blackfathom_fireAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + { + me->SetGoState(GO_STATE_ACTIVE); + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + instance->SetData(DATA_FIRE, instance->GetData(DATA_FIRE) + 1); + return true; + } + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_blackfathom_fireAI(go); } - return false; - } }; class npc_blackfathom_deeps_event : public CreatureScript @@ -226,9 +245,10 @@ public: } } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { DoCast(player, SPELL_TELEPORT_DARNASSUS); + return false; } }; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp index a0459e9eaf1..38dbd8b6e7e 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp @@ -50,208 +50,208 @@ EndContentData */ class npc_jaina_proudmoore : public CreatureScript { -public: - npc_jaina_proudmoore() : CreatureScript("npc_jaina_proudmoore") { } + 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) + 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; + 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 + { + return new npc_jaina_proudmooreAI(creature); } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); - if (ai->EventBegun) - return false; - - uint32 RageEncounter = ai->GetInstanceData(DATA_RAGEWINTERCHILLEVENT); - uint32 AnetheronEncounter = ai->GetInstanceData(DATA_ANETHERONEVENT); - if (RageEncounter == NOT_STARTED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEGIN_ALLY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - else if (RageEncounter == DONE && AnetheronEncounter == NOT_STARTED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ANETHERON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - else if (RageEncounter == DONE && AnetheronEncounter == DONE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_RETREAT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - - if (player->IsGameMaster()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_ITEM_GM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - SendGossipMenuFor(player, 907, creature->GetGUID()); - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - if (!creature->GetInstanceScript()) - return NULL; - - hyjalAI* ai = new hyjalAI(creature); - - ai->Reset(); - ai->EnterEvadeMode(); - - ai->Spells[0].SpellId = SPELL_BLIZZARD; - ai->Spells[0].Cooldown = urand(15000, 35000); - ai->Spells[0].TargetType = TARGETTYPE_RANDOM; - - ai->Spells[1].SpellId = SPELL_PYROBLAST; - ai->Spells[1].Cooldown = urand(5500, 9500); - ai->Spells[1].TargetType = TARGETTYPE_RANDOM; - - ai->Spells[2].SpellId = SPELL_SUMMON_ELEMENTALS; - ai->Spells[2].Cooldown = urand(15000, 45000); - ai->Spells[2].TargetType = TARGETTYPE_SELF; - - return ai; - } - }; class npc_thrall : public CreatureScript { -public: - npc_thrall() : CreatureScript("npc_thrall") { } + 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) + struct npc_thrallAI : public hyjalAI { - case GOSSIP_ACTION_INFO_DEF + 1: - ai->StartEvent(player); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - ai->FirstBossDead = true; - ai->WaveCount = 9; - ai->StartEvent(player); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - ai->Retreat(); - break; - case GOSSIP_ACTION_INFO_DEF: - ai->Debug = !ai->Debug; - TC_LOG_DEBUG("scripts", "HyjalAI - Debug mode has been toggled"); - break; - } - return true; - } + npc_thrallAI(Creature* creature) : hyjalAI(creature) + { + Reset(); + EnterEvadeMode(); - bool OnGossipHello(Player* player, Creature* creature) override - { - hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); - if (ai->EventBegun) - return false; + Spells[0].SpellId = SPELL_CHAIN_LIGHTNING; + Spells[0].Cooldown = urand(3000, 8000); + Spells[0].TargetType = TARGETTYPE_VICTIM; - 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)) + Spells[1].SpellId = SPELL_SUMMON_DIRE_WOLF; + Spells[1].Cooldown = urand(6000, 41000); + Spells[1].TargetType = TARGETTYPE_RANDOM; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + DeSpawnVeins();//despawn the alliance veins + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + StartEvent(player); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + FirstBossDead = true; + WaveCount = 9; + StartEvent(player); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + Retreat(); + break; + case GOSSIP_ACTION_INFO_DEF: + Debug = !Debug; + TC_LOG_DEBUG("scripts", "HyjalAI - Debug mode has been toggled"); + break; + } + return true; + } + + bool GossipHello(Player* player) override + { + if (EventBegun) + return false; + + uint32 AnetheronEvent = GetInstanceData(DATA_ANETHERONEVENT); + // Only let them start the Horde phases if Anetheron is dead. + if (AnetheronEvent == DONE && GetInstanceData(DATA_ALLIANCE_RETREAT)) + { + uint32 KazrogalEvent = GetInstanceData(DATA_KAZROGALEVENT); + uint32 AzgalorEvent = GetInstanceData(DATA_AZGALOREVENT); + if (KazrogalEvent == NOT_STARTED) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEGIN_HORDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + else if (KazrogalEvent == DONE && AzgalorEvent == NOT_STARTED) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AZGALOR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + else if (AzgalorEvent == DONE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_RETREAT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + } + + if (player->IsGameMaster()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_ITEM_GM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + + SendGossipMenuFor(player, 907, me->GetGUID()); + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - uint32 KazrogalEvent = ai->GetInstanceData(DATA_KAZROGALEVENT); - uint32 AzgalorEvent = ai->GetInstanceData(DATA_AZGALOREVENT); - if (KazrogalEvent == NOT_STARTED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEGIN_HORDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - else if (KazrogalEvent == DONE && AzgalorEvent == NOT_STARTED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AZGALOR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - else if (AzgalorEvent == DONE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_RETREAT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + return new npc_thrallAI(creature); } - - if (player->IsGameMaster()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_ITEM_GM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - SendGossipMenuFor(player, 907, creature->GetGUID()); - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - if (!creature->GetInstanceScript()) - return NULL; - - hyjalAI* ai = new hyjalAI(creature); - - ai->Reset(); - ai->EnterEvadeMode(); - - ai->Spells[0].SpellId = SPELL_CHAIN_LIGHTNING; - ai->Spells[0].Cooldown = urand(3000, 8000); - ai->Spells[0].TargetType = TARGETTYPE_VICTIM; - - ai->Spells[1].SpellId = SPELL_SUMMON_DIRE_WOLF; - ai->Spells[1].Cooldown = urand(6000, 41000); - ai->Spells[1].TargetType = TARGETTYPE_RANDOM; - - return ai; - } - }; class npc_tyrande_whisperwind : public CreatureScript { -public: - npc_tyrande_whisperwind() : CreatureScript("npc_tyrande_whisperwind") { } + public: + npc_tyrande_whisperwind() : CreatureScript("npc_tyrande_whisperwind") { } - CreatureAI* GetAI(Creature* creature) const override - { - if (!creature->GetInstanceScript()) - return NULL; - - hyjalAI* ai = new hyjalAI(creature); - ai->Reset(); - ai->EnterEvadeMode(); - return ai; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF) + struct npc_tyrande_whisperwindAI : public hyjalAI { - 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); + npc_tyrande_whisperwindAI(Creature* creature) : hyjalAI(creature) + { + Reset(); + EnterEvadeMode(); + } - SendGossipMenuFor(player, 907, creature->GetGUID()); + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF) + { + ItemPosCountVec dest; + uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_TEAR_OF_GODDESS, 1); + if (msg == EQUIP_ERR_OK) + if (Item* item = player->StoreNewItem(dest, ITEM_TEAR_OF_GODDESS, true)) + player->SendNewItem(item, 1, true, false, true); + + SendGossipMenuFor(player, 907, me->GetGUID()); + } + return true; + } + + bool GossipHello(Player* player) override + { + uint32 AzgalorEvent = GetInstanceData(DATA_AZGALOREVENT); + + // Only let them get item if Azgalor is dead. + if (AzgalorEvent == DONE && !player->HasItemCount(ITEM_TEAR_OF_GODDESS)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TYRANDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, 907, me->GetGUID()); + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new 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 9de4194c733..9c0388e8931 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp @@ -254,93 +254,6 @@ class npc_arthas : public CreatureScript public: npc_arthas() : CreatureScript("npc_arthas") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - npc_arthasAI* ai = CAST_AI(npc_arthas::npc_arthasAI, creature->AI()); - - if (!ai) - return false; - - switch (action) - { - case GOSSIP_ACTION_INFO_DEF: - ai->Start(true, true, player->GetGUID(), 0, false, false); - ai->SetDespawnAtEnd(false); - ai->bStepping = false; - ai->step = 1; - break; - case GOSSIP_ACTION_INFO_DEF+1: - ai->bStepping = true; - ai->step = 24; - break; - case GOSSIP_ACTION_INFO_DEF+2: - ai->SetHoldState(false); - ai->bStepping = false; - ai->step = 61; - break; - case GOSSIP_ACTION_INFO_DEF+3: - ai->SetHoldState(false); - break; - case GOSSIP_ACTION_INFO_DEF+4: - ai->bStepping = true; - ai->step = 84; - break; - case GOSSIP_ACTION_INFO_DEF+5: - ai->bStepping = true; - ai->step = 85; - break; - } - CloseGossipMenuFor(player); - ai->SetDespawnAtFar(false); - creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - npc_arthasAI* ai = CAST_AI(npc_arthas::npc_arthasAI, creature->AI()); - - if (ai && ai->bStepping == false) - { - switch (ai->gossipStep) - { - case 0: //This one is a workaround since the very beggining of the script is wrong. - { - QuestStatus status = player->GetQuestStatus(13149); - if (status != QUEST_STATUS_COMPLETE && status != QUEST_STATUS_REWARDED) - return false; - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, 907, creature->GetGUID()); - break; - } - case 1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_1, creature->GetGUID()); - break; - case 2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_2, creature->GetGUID()); - break; - case 3: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_3, creature->GetGUID()); - break; - case 4: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); - SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_4, creature->GetGUID()); - break; - case 5: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); - SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_5, creature->GetGUID()); - break; - default: - return false; - } - } - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return GetInstanceAI(creature); @@ -1231,6 +1144,88 @@ public: DoMeleeAttackIfReady(); } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + + switch (action) + { + case GOSSIP_ACTION_INFO_DEF: + Start(true, true, player->GetGUID(), 0, false, false); + SetDespawnAtEnd(false); + bStepping = false; + step = 1; + break; + case GOSSIP_ACTION_INFO_DEF + 1: + bStepping = true; + step = 24; + break; + case GOSSIP_ACTION_INFO_DEF + 2: + SetHoldState(false); + bStepping = false; + step = 61; + break; + case GOSSIP_ACTION_INFO_DEF + 3: + SetHoldState(false); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + bStepping = true; + step = 84; + break; + case GOSSIP_ACTION_INFO_DEF + 5: + bStepping = true; + step = 85; + break; + } + CloseGossipMenuFor(player); + SetDespawnAtFar(false); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + return true; + } + + bool GossipHello(Player* player) override + { + if (!bStepping) + { + switch (gossipStep) + { + case 0: //This one is a workaround since the very beggining of the script is wrong. + { + QuestStatus status = player->GetQuestStatus(13149); + if (status != QUEST_STATUS_COMPLETE && status != QUEST_STATUS_REWARDED) + return false; + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, 907, me->GetGUID()); + break; + } + case 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_1, me->GetGUID()); + break; + case 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_2, me->GetGUID()); + break; + case 3: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_3, me->GetGUID()); + break; + case 4: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_4, me->GetGUID()); + break; + case 5: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_5, me->GetGUID()); + break; + default: + return false; + } + } + return true; + } }; }; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp index f3b302497da..7bb18e3e09e 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp @@ -27,6 +27,7 @@ EndScriptData */ #include "ScriptedCreature.h" #include "old_hillsbrad.h" #include "ScriptedEscortAI.h" +#include "GameObjectAI.h" /*###### ## go_barrel_old_hillsbrad @@ -37,17 +38,27 @@ 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) { } + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override { - if (instance->GetData(TYPE_BARREL_DIVERSION) == DONE) - return false; + if (InstanceScript* instance = me->GetInstanceScript()) + { + if (instance->GetData(TYPE_BARREL_DIVERSION) == DONE) + return false; - instance->SetData(TYPE_BARREL_DIVERSION, IN_PROGRESS); + instance->SetData(TYPE_BARREL_DIVERSION, IN_PROGRESS); + } + + return false; } + }; - return false; + GameObjectAI* GetAI(GameObject* go) const override + { + return new 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 7c87459223b..227b89b459d 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp @@ -56,41 +56,52 @@ 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) { } + + 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 (gossipListId == GOSSIP_ACTION_INFO_DEF + 2) + { + CloseGossipMenuFor(player); + } + return true; } - if (action == GOSSIP_ACTION_INFO_DEF+2) + + bool GossipHello(Player* player) override { - CloseGossipMenuFor(player); + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + InstanceScript* instance = me->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); + + SendGossipMenuFor(player, 9778, me->GetGUID()); + + return true; } - return true; - } + }; - bool OnGossipHello(Player* player, Creature* creature) override + CreatureAI* GetAI(Creature* creature) const override { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - 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); - - SendGossipMenuFor(player, 9778, creature->GetGUID()); - - return true; + return new npc_erozionAI(creature); } }; @@ -190,88 +201,6 @@ public: return GetInstanceAI(creature); } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - InstanceScript* instance = creature->GetInstanceScript(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - CloseGossipMenuFor(player); - if (instance) - { - instance->SetData(TYPE_THRALL_EVENT, IN_PROGRESS); - instance->SetData(TYPE_THRALL_PART1, IN_PROGRESS); - } - - creature->AI()->Talk(SAY_TH_START_EVENT_PART1); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, creature->AI())) - pEscortAI->Start(true, true, player->GetGUID()); - - ENSURE_AI(npc_escortAI, (creature->AI()))->SetMaxPlayerDistance(100.0f);//not really needed, because it will not despawn if player is too far - ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtEnd(false); - ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtFar(false); - break; - - case GOSSIP_ACTION_INFO_DEF+2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_SKARLOC2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+20); - SendGossipMenuFor(player, GOSSIP_ID_SKARLOC2, creature->GetGUID()); - break; - - case GOSSIP_ACTION_INFO_DEF+20: - SendGossipMenuFor(player, GOSSIP_ID_SKARLOC3, creature->GetGUID()); - creature->SummonCreature(SKARLOC_MOUNT, 2038.81f, 270.26f, 63.20f, 5.41f, TEMPSUMMON_TIMED_DESPAWN, 12000); - if (instance) - instance->SetData(TYPE_THRALL_PART2, IN_PROGRESS); - - creature->AI()->Talk(SAY_TH_START_EVENT_PART2); - - ENSURE_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, creature->AI())->StartWP(); - break; - - case GOSSIP_ACTION_INFO_DEF+3: - CloseGossipMenuFor(player); - if (instance) - instance->SetData(TYPE_THRALL_PART3, IN_PROGRESS); - ENSURE_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, creature->AI())->StartWP(); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - { - player->PrepareQuestMenu(creature->GetGUID()); - player->SendPreparedQuest(creature->GetGUID()); - } - - InstanceScript* instance = creature->GetInstanceScript(); - if (instance) - { - if (instance->GetData(TYPE_BARREL_DIVERSION) == DONE && !instance->GetData(TYPE_THRALL_EVENT)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_WALKING, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, GOSSIP_ID_START, creature->GetGUID()); - } - - if (instance->GetData(TYPE_THRALL_PART1) == DONE && !instance->GetData(TYPE_THRALL_PART2)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_SKARLOC1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_ID_SKARLOC1, creature->GetGUID()); - } - - if (instance->GetData(TYPE_THRALL_PART2) == DONE && !instance->GetData(TYPE_THRALL_PART3)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TARREN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - SendGossipMenuFor(player, GOSSIP_ID_TARREN, creature->GetGUID()); - } - } - return true; - } - struct npc_thrall_old_hillsbradAI : public npc_escortAI { npc_thrall_old_hillsbradAI(Creature* creature) : npc_escortAI(creature) @@ -292,6 +221,88 @@ public: bool LowHp; bool HadMount; + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + InstanceScript* instance = me->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); + } + + 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); + if (instance) + instance->SetData(TYPE_THRALL_PART2, IN_PROGRESS); + + me->AI()->Talk(SAY_TH_START_EVENT_PART2); + + StartWP(); + break; + + case GOSSIP_ACTION_INFO_DEF + 3: + CloseGossipMenuFor(player); + if (instance) + instance->SetData(TYPE_THRALL_PART3, IN_PROGRESS); + StartWP(); + break; + } + return true; + } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + { + player->PrepareQuestMenu(me->GetGUID()); + player->SendPreparedQuest(me->GetGUID()); + } + + InstanceScript* instance = me->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, 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; + } + void WaypointReached(uint32 waypointId) override { switch (waypointId) @@ -568,43 +579,6 @@ public: return GetInstanceAI(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) @@ -614,6 +588,44 @@ public: InstanceScript* instance; + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + InstanceScript* instance = me->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, 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 + { + InstanceScript* instance = me->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, me->GetGUID()); + } + return true; + } + void WaypointReached(uint32 waypointId) override { switch (waypointId) @@ -635,7 +647,6 @@ public: npc_escortAI::UpdateAI(diff); } }; - }; /*###### diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp index f6b6f614c70..3cc85062c58 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp @@ -329,12 +329,12 @@ 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 menuId, uint32 gossipListId) override { if (_instance->GetBossState(DATA_VAULT_OF_LIGHTS) == DONE) - return; + return true; - if (me->GetCreatureTemplate()->GossipMenuId == sender && !action) + if (me->GetCreatureTemplate()->GossipMenuId == menuId && !gossipListId) { _instance->SetBossState(DATA_VAULT_OF_LIGHTS, IN_PROGRESS); _currentPoint = 0; @@ -344,6 +344,8 @@ class npc_brann_bronzebeard_anraphet : public CreatureScript Talk(BRANN_SAY_DOOR_INTRO); events.ScheduleEvent(EVENT_BRANN_UNLOCK_DOOR, 7500); } + + return true; } 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 4bdff3de272..b174cf59266 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp +++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp @@ -36,6 +36,7 @@ EndContentData */ #include "GridNotifiersImpl.h" #include "Cell.h" #include "CellImpl.h" +#include "GameObjectAI.h" /*### ## npc_belnistrasz for Quest 3525 "Extinguishing the Idol" @@ -127,7 +128,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) { @@ -371,22 +372,31 @@ public: class go_gong : public GameObjectScript { -public: - go_gong() : GameObjectScript("go_gong") { } + public: + go_gong() : GameObjectScript("go_gong") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - InstanceScript* instance = go->GetInstanceScript(); - - if (instance) + struct go_gongAI : public GameObjectAI { - go->SendCustomAnim(0); - instance->SetData(DATA_WAVE, IN_PROGRESS); - return true; - } - return false; - } + go_gongAI(GameObject* go) : GameObjectAI(go) { } + bool GossipHello(Player* player, bool /*reportUse*/) override + { + InstanceScript* instance = me->GetInstanceScript(); + + if (instance) + { + me->SendCustomAnim(0); + instance->SetData(DATA_WAVE, IN_PROGRESS); + return true; + } + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_gongAI(go); + } }; void AddSC_razorfen_downs() diff --git a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp index bfd92dce472..64feea50156 100644 --- a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp +++ b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp @@ -51,7 +51,7 @@ public: { npc_willixAI(Creature* creature) : npc_escortAI(creature) { } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_WILLIX_THE_IMPORTER) { diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp index 14ccca00ca1..d56a205fa0b 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp @@ -22,6 +22,7 @@ #include "SpellInfo.h" #include "WorldPacket.h" #include "Opcodes.h" +#include "GameObjectAI.h" enum Texts { @@ -278,18 +279,28 @@ 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) { } - Creature* Ossirian = player->FindNearestCreature(NPC_OSSIRIAN, 30.0f); - if (!Ossirian || Instance->GetBossState(DATA_OSSIRIAN) != IN_PROGRESS) - return false; + bool GossipHello(Player* player, bool /*reportUse*/) override + { + InstanceScript* Instance = player->GetInstanceScript(); + if (!Instance) + return false; - Ossirian->AI()->DoAction(ACTION_TRIGGER_WEAKNESS); - return true; + 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 new go_ossirian_crystalAI(go); } }; diff --git a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp index 36eb2f584ba..250ea964ff8 100644 --- a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp +++ b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp @@ -73,53 +73,6 @@ class npc_disciple_of_naralex : public CreatureScript public: npc_disciple_of_naralex() : CreatureScript("npc_disciple_of_naralex") { } - 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(DATA_NARALEX_EVENT, IN_PROGRESS); - - creature->AI()->Talk(SAY_MAKE_PREPARATIONS); - - creature->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_ACTIVE); - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - - ENSURE_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID()); - ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtFar(false); - ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtEnd(false); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if(InstanceScript* instance = creature->GetInstanceScript()) - { - creature->CastSpell(player, SPELL_MARK_OF_THE_WILD_RANK_2, true); - if ((instance->GetBossState(DATA_LORD_COBRAHN) == DONE) && (instance->GetBossState(DATA_LORD_PYTHAS) == DONE) && - (instance->GetBossState(DATA_LADY_ANACONDRA) == DONE) && (instance->GetBossState(DATA_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(DATA_NARALEX_YELLED)) - { - creature->AI()->Talk(SAY_AT_LAST); - instance->SetData(DATA_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) @@ -132,7 +85,53 @@ public: me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + InstanceScript* instance = me->GetInstanceScript(); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + if (instance) + instance->SetData(DATA_NARALEX_EVENT, IN_PROGRESS); + Talk(SAY_MAKE_PREPARATIONS); + + me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_ACTIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + + Start(false, false, player->GetGUID()); + SetDespawnAtFar(false); + SetDespawnAtEnd(false); + } + return true; + } + + bool GossipHello(Player* player) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + { + me->CastSpell(player, SPELL_MARK_OF_THE_WILD_RANK_2, true); + if ((instance->GetBossState(DATA_LORD_COBRAHN) == DONE) && (instance->GetBossState(DATA_LORD_PYTHAS) == DONE) && + (instance->GetBossState(DATA_LADY_ANACONDRA) == DONE) && (instance->GetBossState(DATA_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(DATA_NARALEX_YELLED)) + { + Talk(SAY_AT_LAST); + instance->SetData(DATA_NARALEX_YELLED, 1); + } + } + else + { + SendGossipMenuFor(player, NPC_TEXT_NARALEX_SLEEPS_AGAIN, me->GetGUID()); + } + } + return true; + } void WaypointReached(uint32 waypointId) override { diff --git a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp index ed166973fcf..ee4c2f982ad 100644 --- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp +++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp @@ -33,6 +33,7 @@ EndContentData */ #include "ScriptedGossip.h" #include "zulfarrak.h" #include "Player.h" +#include "GameObjectAI.h" /*###### ## npc_sergeant_bly @@ -57,37 +58,6 @@ class npc_sergeant_bly : public CreatureScript public: npc_sergeant_bly() : CreatureScript("npc_sergeant_bly") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); - ENSURE_AI(npc_sergeant_bly::npc_sergeant_blyAI, creature->AI())->PlayerGUID = player->GetGUID(); - creature->AI()->DoAction(0); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (InstanceScript* instance = creature->GetInstanceScript()) - { - if (instance->GetData(EVENT_PYRAMID) == PYRAMID_KILLED_ALL_TROLLS) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BLY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, 1517, creature->GetGUID()); - } - else - if (instance->GetData(EVENT_PYRAMID) == PYRAMID_NOT_STARTED) - SendGossipMenuFor(player, 1515, creature->GetGUID()); - else - SendGossipMenuFor(player, 1516, creature->GetGUID()); - return true; - } - return false; - } - CreatureAI* GetAI(Creature* creature) const override { return GetInstanceAI(creature); @@ -117,6 +87,38 @@ public: uint32 Revenge_Timer; //this is wrong, spell should never be used unless me->GetVictim() dodge, parry or block attack. Trinity support required. ObjectGuid PlayerGUID; + 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 (InstanceScript* instance = me->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, me->GetGUID()); + } + else + if (instance->GetData(EVENT_PYRAMID) == PYRAMID_NOT_STARTED) + SendGossipMenuFor(player, 1515, me->GetGUID()); + else + SendGossipMenuFor(player, 1516, me->GetGUID()); + return true; + } + return false; + } + void Reset() override { Initialize(); @@ -204,32 +206,42 @@ 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()) - { - instance->SetData(EVENT_PYRAMID, PYRAMID_CAGES_OPEN); - //set bly & co to aggressive & start moving to top of stairs - initBlyCrewMember(instance, ENTRY_BLY, 1884.99f, 1263, 41.52f); - initBlyCrewMember(instance, ENTRY_RAVEN, 1882.5f, 1263, 41.52f); - initBlyCrewMember(instance, ENTRY_ORO, 1886.47f, 1270.68f, 41.68f); - initBlyCrewMember(instance, ENTRY_WEEGLI, 1890, 1263, 41.52f); - initBlyCrewMember(instance, ENTRY_MURTA, 1891.19f, 1272.03f, 41.60f); - } - return false; - } + go_troll_cageAI(GameObject* go) : GameObjectAI(go) { } -private: - void initBlyCrewMember(InstanceScript* instance, uint32 entry, float x, float y, float z) - { - if (Creature* crew = instance->instance->GetCreature(instance->GetGuidData(entry))) + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override { - crew->SetReactState(REACT_AGGRESSIVE); - crew->SetWalk(true); - crew->SetHomePosition(x, y, z, 0); - crew->GetMotionMaster()->MovePoint(1, x, y, z); - crew->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_ACTIVE); + if (InstanceScript* instance = me->GetInstanceScript()) + { + instance->SetData(EVENT_PYRAMID, PYRAMID_CAGES_OPEN); + //set bly & co to aggressive & start moving to top of stairs + initBlyCrewMember(instance, ENTRY_BLY, 1884.99f, 1263, 41.52f); + initBlyCrewMember(instance, ENTRY_RAVEN, 1882.5f, 1263, 41.52f); + initBlyCrewMember(instance, ENTRY_ORO, 1886.47f, 1270.68f, 41.68f); + initBlyCrewMember(instance, ENTRY_WEEGLI, 1890, 1263, 41.52f); + initBlyCrewMember(instance, ENTRY_MURTA, 1891.19f, 1272.03f, 41.60f); + } + return false; } + + private: + void initBlyCrewMember(InstanceScript* instance, uint32 entry, float x, float y, float z) const + { + 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_ESCORTEE_N_NEUTRAL_ACTIVE); + } + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_troll_cageAI(go); } }; @@ -258,39 +270,6 @@ class npc_weegli_blastfuse : public CreatureScript public: npc_weegli_blastfuse() : CreatureScript("npc_weegli_blastfuse") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); - //here we make him run to door, set the charge and run away off to nowhere - creature->AI()->DoAction(0); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (InstanceScript* instance = creature->GetInstanceScript()) - { - switch (instance->GetData(EVENT_PYRAMID)) - { - case PYRAMID_KILLED_ALL_TROLLS: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEEGLI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, 1514, creature->GetGUID()); //if event can proceed to end - break; - case PYRAMID_NOT_STARTED: - SendGossipMenuFor(player, 1511, creature->GetGUID()); //if event not started - break; - default: - SendGossipMenuFor(player, 1513, creature->GetGUID()); //if event are in progress - } - return true; - } - return false; - } - CreatureAI* GetAI(Creature* creature) const override { return GetInstanceAI(creature); @@ -311,6 +290,40 @@ public: bool destroyingDoor; InstanceScript* instance; + 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 + { + if (InstanceScript* instance = me->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, 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; + } + return false; + } + void Reset() override { /*instance->SetData(0, NOT_STARTED);*/ @@ -368,11 +381,6 @@ public: }; } - void DoAction(int32 /*param*/) override - { - DestroyDoor(); - } - void DestroyDoor() { if (me->IsAlive()) @@ -402,24 +410,34 @@ enum ShallowGrave class go_shallow_grave : public GameObjectScript { -public: - go_shallow_grave() : GameObjectScript("go_shallow_grave") { } + public: + go_shallow_grave() : GameObjectScript("go_shallow_grave") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - // randomly summon a zombie or dead hero the first time a grave is used - if (go->GetUseCount() == 0) + struct go_shallow_graveAI : public GameObjectAI { - 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); + go_shallow_graveAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + // 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; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_shallow_graveAI(go); } - go->AddUse(); - return false; - } }; /*###### diff --git a/src/server/scripts/Kalimdor/zone_ashenvale.cpp b/src/server/scripts/Kalimdor/zone_ashenvale.cpp index d8a8affd136..2c906550acd 100644 --- a/src/server/scripts/Kalimdor/zone_ashenvale.cpp +++ b/src/server/scripts/Kalimdor/zone_ashenvale.cpp @@ -32,6 +32,7 @@ EndContentData */ #include "ScriptedEscortAI.h" #include "Player.h" #include "SpellScript.h" +#include "GameObjectAI.h" /*#### # npc_ruul_snowhoof @@ -78,7 +79,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) { @@ -220,7 +221,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) { @@ -327,20 +328,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 5718881c825..3229936cce7 100644 --- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp @@ -40,6 +40,7 @@ EndContentData */ #include "CellImpl.h" #include "GridNotifiersImpl.h" #include "GridNotifiers.h" +#include "GameObjectAI.h" /*###### ## npc_draenei_survivor @@ -228,11 +229,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_MONSTER); me->Attack(player, true); + return false; } void UpdateAI(uint32 diff) override @@ -358,7 +360,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) { @@ -627,23 +629,33 @@ enum RavegerCage class go_ravager_cage : public GameObjectScript { -public: - go_ravager_cage() : GameObjectScript("go_ravager_cage") { } + public: + go_ravager_cage() : GameObjectScript("go_ravager_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_STRENGTH_ONE) == QUEST_STATUS_INCOMPLETE) + struct go_ravager_cageAI : public GameObjectAI { - if (Creature* ravager = go->FindNearestCreature(NPC_DEATH_RAVAGER, 5.0f, true)) + go_ravager_cageAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - ravager->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - ravager->SetReactState(REACT_AGGRESSIVE); - ravager->AI()->AttackStart(player); + me->UseDoorOrButton(); + if (player->GetQuestStatus(QUEST_STRENGTH_ONE) == QUEST_STATUS_INCOMPLETE) + { + if (Creature* ravager = me->FindNearestCreature(NPC_DEATH_RAVAGER, 5.0f, true)) + { + ravager->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + ravager->SetReactState(REACT_AGGRESSIVE); + ravager->AI()->AttackStart(player); + } + } + return true; } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_ravager_cageAI(go); } - return true; - } }; class npc_death_ravager : public CreatureScript diff --git a/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp index 21b30c68fcc..9dfd78f52e9 100644 --- a/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp @@ -361,7 +361,7 @@ public: Initialize(); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_ENDING_THEIR_WORLD) { diff --git a/src/server/scripts/Kalimdor/zone_desolace.cpp b/src/server/scripts/Kalimdor/zone_desolace.cpp index 6fee111cb4e..33b7f161e39 100644 --- a/src/server/scripts/Kalimdor/zone_desolace.cpp +++ b/src/server/scripts/Kalimdor/zone_desolace.cpp @@ -102,25 +102,24 @@ 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 { return new npc_aged_dying_ancient_kodoAI(creature); } - }; void AddSC_desolace() diff --git a/src/server/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp index 2f638dc5ff5..7275a00abea 100644 --- a/src/server/scripts/Kalimdor/zone_silithus.cpp +++ b/src/server/scripts/Kalimdor/zone_silithus.cpp @@ -33,6 +33,7 @@ EndContentData */ #include "ScriptedGossip.h" #include "Group.h" #include "Player.h" +#include "GameObjectAI.h" /*##### # Quest: A Pawn on the Eternal Board @@ -949,60 +950,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 : public GameObjectAI { - if (quest->GetQuestId() == QUEST_A_PAWN_ON_THE_ETERNAL_BOARD) + go_crystalline_tearAI(GameObject* go) : GameObjectAI(go) { } + + void QuestAccept(Player* player, Quest const* quest) override { - if (Creature* trigger = go->FindNearestCreature(ANACHRONOS_QUEST_TRIGGER_INVISIBLE, 100)) + if (quest->GetQuestId() == QUEST_A_PAWN_ON_THE_ETERNAL_BOARD) { - Unit* Merithra = trigger->SummonCreature(NPC_MERITHRA_OF_THE_DREAM, -8034.535f, 1535.14f, 2.61f, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - Unit* Caelestrasz = trigger->SummonCreature(NPC_CAELESTRASZ, -8032.767f, 1533.148f, 2.61f, 1.5f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - Unit* Arygos = trigger->SummonCreature(NPC_ARYGOS, -8034.52f, 1537.843f, 2.61f, 5.7f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - /* Unit* Fandral = */ trigger->SummonCreature(NPC_FANDRAL_STAGHELM, -8028.462f, 1535.843f, 2.61f, 3.141592f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - Creature* Anachronos = trigger->SummonCreature(NPC_ANACHRONOS, -8028.75f, 1538.795f, 2.61f, 4, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - - if (Merithra) + if (Creature* trigger = me->FindNearestCreature(ANACHRONOS_QUEST_TRIGGER_INVISIBLE, 100)) { - Merithra->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); - Merithra->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - Merithra->SetUInt32Value(UNIT_FIELD_DISPLAYID, MERITHRA_NIGHT_ELF_FORM); - Merithra->SetFaction(FACTION_FRIENDLY); - } + Unit* Merithra = trigger->SummonCreature(NPC_MERITHRA_OF_THE_DREAM, -8034.535f, 1535.14f, 2.61f, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); + Unit* Caelestrasz = trigger->SummonCreature(NPC_CAELESTRASZ, -8032.767f, 1533.148f, 2.61f, 1.5f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); + Unit* Arygos = trigger->SummonCreature(NPC_ARYGOS, -8034.52f, 1537.843f, 2.61f, 5.7f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); + /* Unit* Fandral = */ trigger->SummonCreature(NPC_FANDRAL_STAGHELM, -8028.462f, 1535.843f, 2.61f, 3.141592f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); + Creature* Anachronos = trigger->SummonCreature(NPC_ANACHRONOS, -8028.75f, 1538.795f, 2.61f, 4, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - if (Caelestrasz) - { - Caelestrasz->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); - Caelestrasz->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - Caelestrasz->SetUInt32Value(UNIT_FIELD_DISPLAYID, CAELESTRASZ_NIGHT_ELF_FORM); - Caelestrasz->SetFaction(FACTION_FRIENDLY); - } - - if (Arygos) - { - Arygos->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); - Arygos->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - Arygos->SetUInt32Value(UNIT_FIELD_DISPLAYID, ARYGOS_GNOME_FORM); - Arygos->SetFaction(FACTION_FRIENDLY); - } - - 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 (npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI* triggerAI = CAST_AI(npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI, trigger->AI())) + if (Merithra) { - triggerAI->Failed = false; - triggerAI->PlayerGUID = player->GetGUID(); - triggerAI->EventStarted = true; - triggerAI->Announced = true; + Merithra->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + Merithra->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + Merithra->SetUInt32Value(UNIT_FIELD_DISPLAYID, MERITHRA_NIGHT_ELF_FORM); + Merithra->SetFaction(FACTION_FRIENDLY); + } + + if (Caelestrasz) + { + Caelestrasz->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + Caelestrasz->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + Caelestrasz->SetUInt32Value(UNIT_FIELD_DISPLAYID, CAELESTRASZ_NIGHT_ELF_FORM); + Caelestrasz->SetFaction(FACTION_FRIENDLY); + } + + if (Arygos) + { + Arygos->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + Arygos->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + Arygos->SetUInt32Value(UNIT_FIELD_DISPLAYID, ARYGOS_GNOME_FORM); + Arygos->SetFaction(FACTION_FRIENDLY); + } + + 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 (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); + } }; /*### @@ -1117,241 +1126,251 @@ class go_wind_stone : public GameObjectScript public: go_wind_stone() : GameObjectScript("go_wind_stone") { } - private: - uint8 GetPlayerRank(Player* player) // For random summoning + struct go_wind_stoneAI : public GameObjectAI { - bool setAura = player->HasAura(AURA_TWILIGHT_SET); - bool medallionAura = player->HasAura(AURA_MEDALLION); - bool ringAura = player->HasAura(AURA_RING); + go_wind_stoneAI(GameObject* go) : GameObjectAI(go) { } - if (setAura && medallionAura && ringAura) - return 3; - else if (setAura && medallionAura) - return 2; - else if (setAura) - return 1; - else - return 0; - } - - uint8 GetItems(Player* player, WS type) - { - uint8 result = 0x0; - - switch (type) + bool GossipHello(Player* player, bool /*reportUse*/) override { - case TEMPLAR: - { - if (player->HasItemCount(ITEM_TEMPLAR_FIRE)) - result |= FIRE; - if (player->HasItemCount(ITEM_TEMPLAR_WATER)) - result |= WATER; - if (player->HasItemCount(ITEM_TEMPLAR_EARTH)) - result |= EARTH; - if (player->HasItemCount(ITEM_TEMPLAR_AIR)) - result |= AIR; - break; - } - case DUKE: - { - if (player->HasItemCount(ITEM_DUKE_FIRE)) - result |= FIRE; - if (player->HasItemCount(ITEM_DUKE_WATER)) - result |= WATER; - if (player->HasItemCount(ITEM_DUKE_EARTH)) - result |= EARTH; - if (player->HasItemCount(ITEM_DUKE_AIR)) - result |= AIR; - break; - } - case ROYAL: - { - if (player->HasItemCount(ITEM_ROYAL_FIRE)) - result |= FIRE; - if (player->HasItemCount(ITEM_ROYAL_WATER)) - result |= WATER; - if (player->HasItemCount(ITEM_ROYAL_EARTH)) - result |= EARTH; - if (player->HasItemCount(ITEM_ROYAL_AIR)) - result |= AIR; - break; - } - default: - break; - } - return result; - } + uint8 rank = GetPlayerRank(player); - 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, player); - break; - case NPC_ROYAL_FIRE: - case NPC_ROYAL_AIR: - case NPC_ROYAL_EARTH: - case NPC_ROYAL_WATER: - summons->AI()->Talk(YELL_ROYAL_AGGRO, player); - break; - } - summons->RemoveFlag(UNIT_FIELD_FLAGS, 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: + uint32 gossipId = me->GetGOInfo()->GetGossipMenuId(); + switch (gossipId) { - 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 + case GOSSIP_ID_LESSER_WS: { - go->CastSpell(player, SPELL_PUNISHMENT); + if (rank >= 1) // 1 or 2 or 3 + AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + else + { + me->CastSpell(player, SPELL_PUNISHMENT); + break; + } + + uint8 item = GetItems(player, TEMPLAR); + if (item & FIRE) + AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_1_CRIMSON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + if (item & WATER) + AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_2_AZURE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + if (item & EARTH) + AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_3_EARTHEN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + if (item & AIR) + AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_4_HOARY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); break; } - - 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 + case GOSSIP_ID_WIND_STONE: { - go->CastSpell(player, SPELL_PUNISHMENT); + if (rank >= 2) // 2 or 3 + AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); + else + { + me->CastSpell(player, SPELL_PUNISHMENT); + break; + } + + uint8 item = GetItems(player, DUKE); + if (item & FIRE) + AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_1_CYNDERS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); + if (item & WATER) + AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_2_FATHOMS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8); + if (item & EARTH) + AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_3_SHARDS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); + if (item & AIR) + AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_4_ZEPHYRS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10); break; } - - 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 + case GOSSIP_ID_GREATER_WS: { - go->CastSpell(player, SPELL_PUNISHMENT); + if (rank == 3) // 3 + AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); + else + { + me->CastSpell(player, SPELL_PUNISHMENT); + break; + } + + uint8 item = GetItems(player, ROYAL); + if (item & FIRE) + AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_1_SKALDRENOX, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12); + if (item & WATER) + AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_2_SKWOL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13); + if (item & EARTH) + AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_3_KAZUM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14); + if (item & AIR) + AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_4_WHIRLAXIS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 15); break; } - - 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; } - default: - break; + + SendGossipMenuFor(player, player->GetGossipTextId(gossipId, me), me->GetGUID()); + return true; } - SendGossipMenuFor(player, player->GetGossipTextId(gossipId, go), go->GetGUID()); - return true; - } - - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - player->PlayerTalkClass->SendCloseGossip(); - - switch (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - 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; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + player->PlayerTalkClass->SendCloseGossip(); - 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; + 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 + 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; + 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; - default: - 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; } - return true; + + private: + uint8 GetPlayerRank(Player* player) const // 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) const + { + uint8 result = 0x0; + + switch (type) + { + case TEMPLAR: + { + if (player->HasItemCount(ITEM_TEMPLAR_FIRE)) + result |= FIRE; + if (player->HasItemCount(ITEM_TEMPLAR_WATER)) + result |= WATER; + if (player->HasItemCount(ITEM_TEMPLAR_EARTH)) + result |= EARTH; + if (player->HasItemCount(ITEM_TEMPLAR_AIR)) + result |= AIR; + break; + } + case DUKE: + { + if (player->HasItemCount(ITEM_DUKE_FIRE)) + result |= FIRE; + if (player->HasItemCount(ITEM_DUKE_WATER)) + result |= WATER; + if (player->HasItemCount(ITEM_DUKE_EARTH)) + result |= EARTH; + if (player->HasItemCount(ITEM_DUKE_AIR)) + result |= AIR; + break; + } + case ROYAL: + { + if (player->HasItemCount(ITEM_ROYAL_FIRE)) + result |= FIRE; + if (player->HasItemCount(ITEM_ROYAL_WATER)) + result |= WATER; + if (player->HasItemCount(ITEM_ROYAL_EARTH)) + result |= EARTH; + if (player->HasItemCount(ITEM_ROYAL_AIR)) + result |= AIR; + break; + } + default: + break; + } + return result; + } + + void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spell) const + { + 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, player); + break; + case NPC_ROYAL_FIRE: + case NPC_ROYAL_AIR: + case NPC_ROYAL_EARTH: + case NPC_ROYAL_WATER: + summons->AI()->Talk(YELL_ROYAL_AGGRO, player); + break; + } + summons->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + summons->SendMeleeAttackStart(player); + summons->CombatStart(player); + } + }; + + 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 441aa4736ec..3ed60b943cd 100644 --- a/src/server/scripts/Kalimdor/zone_tanaris.cpp +++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp @@ -194,22 +194,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(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); - creature->SetFullHealth(); - creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - creature->AI()->Talk(SAY_OOX_START); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_OOX17::npc_OOX17AI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); - } - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return new npc_OOX17AI(creature); @@ -219,6 +203,19 @@ public: { npc_OOX17AI(Creature* creature) : npc_escortAI(creature) { } + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == Q_OOX17) + { + me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); + me->SetFullHealth(); + me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + Talk(SAY_OOX_START); + Start(true, false, player->GetGUID()); + } + } + void WaypointReached(uint32 waypointId) override { if (Player* player = GetPlayerForEscort()) @@ -286,149 +283,143 @@ Position const ToWaterLoc = {-7032.664551f, -4906.199219f, -1.606446f, 0.0f}; class npc_tooga : public CreatureScript { -public: - npc_tooga() : CreatureScript("npc_tooga") { } + public: + npc_tooga() : CreatureScript("npc_tooga") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_TOOGA) + CreatureAI* GetAI(Creature* creature) const override { - if (npc_toogaAI* pToogaAI = CAST_AI(npc_tooga::npc_toogaAI, creature->AI())) - pToogaAI->StartFollow(player, FACTION_TOOG_ESCORTEE, quest); + return new npc_toogaAI(creature); } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_toogaAI(creature); - } - - struct npc_toogaAI : public FollowerAI - { - npc_toogaAI(Creature* creature) : FollowerAI(creature) + struct npc_toogaAI : public FollowerAI { - Initialize(); - } - - void Initialize() - { - CheckSpeechTimer = 2500; - PostEventTimer = 1000; - PhasePostEvent = 0; - - TortaGUID.Clear(); - } - - uint32 CheckSpeechTimer; - uint32 PostEventTimer; - uint32 PhasePostEvent; - - ObjectGuid TortaGUID; - - void Reset() override - { - Initialize(); - } - - void MoveInLineOfSight(Unit* who) override - { - FollowerAI::MoveInLineOfSight(who); - - if (!me->GetVictim() && !HasFollowState(STATE_FOLLOW_COMPLETE | STATE_FOLLOW_POSTEVENT) && who->GetEntry() == NPC_TORTA) + npc_toogaAI(Creature* creature) : FollowerAI(creature) { - if (me->IsWithinDistInMap(who, INTERACTION_DISTANCE)) - { - Player* player = GetLeaderForFollower(); - if (player && player->GetQuestStatus(QUEST_TOOGA) == QUEST_STATUS_INCOMPLETE) - player->GroupEventHappens(QUEST_TOOGA, me); - - TortaGUID = who->GetGUID(); - SetFollowComplete(true); - } - } - } - - void MovementInform(uint32 MotionType, uint32 PointId) override - { - FollowerAI::MovementInform(MotionType, PointId); - - if (MotionType != POINT_MOTION_TYPE) - return; - - if (PointId == POINT_ID_TO_WATER) - SetFollowComplete(); - } - - void UpdateFollowerAI(uint32 Diff) override - { - if (!UpdateVictim()) - { - //we are doing the post-event, or... - if (HasFollowState(STATE_FOLLOW_POSTEVENT)) - { - if (PostEventTimer <= Diff) - { - PostEventTimer = 5000; - - Creature* torta = ObjectAccessor::GetCreature(*me, TortaGUID); - if (!torta || !torta->IsAlive()) - { - //something happened, so just complete - SetFollowComplete(); - return; - } - - switch (PhasePostEvent) - { - case 1: - Talk(SAY_TOOG_POST_1); - break; - case 2: - torta->AI()->Talk(SAY_TORT_POST_2); - break; - case 3: - Talk(SAY_TOOG_POST_3); - break; - case 4: - torta->AI()->Talk(SAY_TORT_POST_4); - break; - case 5: - Talk(SAY_TOOG_POST_5); - break; - case 6: - torta->AI()->Talk(SAY_TORT_POST_6); - me->GetMotionMaster()->MovePoint(POINT_ID_TO_WATER, ToWaterLoc); - break; - } - - ++PhasePostEvent; - } - else - PostEventTimer -= Diff; - } - //...we are doing regular speech check - else if (HasFollowState(STATE_FOLLOW_INPROGRESS)) - { - if (CheckSpeechTimer <= Diff) - { - CheckSpeechTimer = 5000; - - if (urand(0, 9) > 8) - Talk(SAY_TOOG_WORRIED); - } - else - CheckSpeechTimer -= Diff; - } - - return; + Initialize(); } - DoMeleeAttackIfReady(); - } - }; + void Initialize() + { + CheckSpeechTimer = 2500; + PostEventTimer = 1000; + PhasePostEvent = 0; + TortaGUID.Clear(); + } + + uint32 CheckSpeechTimer; + uint32 PostEventTimer; + uint32 PhasePostEvent; + + ObjectGuid TortaGUID; + + void QuestAccept(Player* player, const Quest* quest) override + { + if (quest->GetQuestId() == QUEST_TOOGA) + StartFollow(player, FACTION_TOOG_ESCORTEE, quest); + } + + void Reset() override + { + Initialize(); + } + + void MoveInLineOfSight(Unit* who) override + { + FollowerAI::MoveInLineOfSight(who); + + if (!me->GetVictim() && !HasFollowState(STATE_FOLLOW_COMPLETE | STATE_FOLLOW_POSTEVENT) && who->GetEntry() == NPC_TORTA) + { + if (me->IsWithinDistInMap(who, INTERACTION_DISTANCE)) + { + Player* player = GetLeaderForFollower(); + if (player && player->GetQuestStatus(QUEST_TOOGA) == QUEST_STATUS_INCOMPLETE) + player->GroupEventHappens(QUEST_TOOGA, me); + + TortaGUID = who->GetGUID(); + SetFollowComplete(true); + } + } + } + + void MovementInform(uint32 MotionType, uint32 PointId) override + { + FollowerAI::MovementInform(MotionType, PointId); + + if (MotionType != POINT_MOTION_TYPE) + return; + + if (PointId == POINT_ID_TO_WATER) + SetFollowComplete(); + } + + void UpdateFollowerAI(uint32 Diff) override + { + if (!UpdateVictim()) + { + //we are doing the post-event, or... + if (HasFollowState(STATE_FOLLOW_POSTEVENT)) + { + if (PostEventTimer <= Diff) + { + PostEventTimer = 5000; + + Creature* torta = ObjectAccessor::GetCreature(*me, TortaGUID); + if (!torta || !torta->IsAlive()) + { + //something happened, so just complete + SetFollowComplete(); + return; + } + + switch (PhasePostEvent) + { + case 1: + Talk(SAY_TOOG_POST_1); + break; + case 2: + torta->AI()->Talk(SAY_TORT_POST_2); + break; + case 3: + Talk(SAY_TOOG_POST_3); + break; + case 4: + torta->AI()->Talk(SAY_TORT_POST_4); + break; + case 5: + Talk(SAY_TOOG_POST_5); + break; + case 6: + torta->AI()->Talk(SAY_TORT_POST_6); + me->GetMotionMaster()->MovePoint(POINT_ID_TO_WATER, ToWaterLoc); + break; + } + + ++PhasePostEvent; + } + else + PostEventTimer -= Diff; + } + //...we are doing regular speech check + else if (HasFollowState(STATE_FOLLOW_INPROGRESS)) + { + if (CheckSpeechTimer <= Diff) + { + CheckSpeechTimer = 5000; + + if (urand(0, 9) > 8) + Talk(SAY_TOOG_WORRIED); + } + else + CheckSpeechTimer -= Diff; + } + + return; + } + + DoMeleeAttackIfReady(); + } + }; }; void AddSC_tanaris() diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp index 5d20090a6c5..f2e45de0c7a 100644 --- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp +++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp @@ -55,13 +55,14 @@ class npc_beaten_corpse : public CreatureScript { } - 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 true; } }; @@ -96,21 +97,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); @@ -120,6 +106,19 @@ public: { npc_giltharesAI(Creature* creature) : npc_escortAI(creature) { } + void QuestAccept(Player* player, const Quest* 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); + } + } + void Reset() override { } void WaypointReached(uint32 waypointId) override @@ -646,19 +645,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_winterspring.cpp b/src/server/scripts/Kalimdor/zone_winterspring.cpp index 8a8de5d879b..c05db28ee69 100644 --- a/src/server/scripts/Kalimdor/zone_winterspring.cpp +++ b/src/server/scripts/Kalimdor/zone_winterspring.cpp @@ -33,6 +33,7 @@ EndContentData */ #include "ScriptedEscortAI.h" #include "Player.h" #include "WorldSession.h" +#include "GameObjectAI.h" enum Says { @@ -258,21 +259,7 @@ 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_ESCORTEE_A_NEUTRAL_PASSIVE); - if (npc_ranshallaAI* escortAI = dynamic_cast(creature->AI())) - escortAI->Start(false, false, player->GetGUID(), quest); - - return true; - } - - return false; - } CreatureAI* GetAI(Creature* creature) const override { return new npc_ranshallaAI(creature); @@ -299,6 +286,16 @@ public: ObjectGuid _voiceEluneGUID; ObjectGuid _altarGUID; + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_GUARDIANS_ALTAR) + { + Talk(SAY_QUEST_START); + me->SetFaction(FACTION_ESCORTEE_A_NEUTRAL_PASSIVE); + Start(false, false, player->GetGUID(), quest); + } + } + void Reset() override { Initialize(); @@ -565,25 +562,35 @@ public: 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; + public: + go_elune_fire() : GameObjectScript("go_elune_fire") { } - if (go->GetEntry() == GO_ELUNE_ALTAR) - isAltar = true; - - if (Creature* ranshalla = GetClosestCreatureWithEntry(go, NPC_RANSHALLA, 10.0f)) + struct go_elune_fireAI : public GameObjectAI { - if (npc_ranshalla::npc_ranshallaAI* escortAI = dynamic_cast(ranshalla->AI())) - escortAI->DoContinueEscort(isAltar); - } - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + go_elune_fireAI(GameObject* go) : GameObjectAI(go) { } - return false; - } + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + // 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(ranshalla->AI())) + escortAI->DoContinueEscort(isAltar); + } + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_elune_fireAI(go); + } }; void AddSC_winterspring() 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 32e296a508a..a2f8d768e44 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp @@ -20,6 +20,7 @@ #include "SpellScript.h" #include "Player.h" #include "ahnkahet.h" +#include "GameObjectAI.h" enum Spells { @@ -380,33 +381,43 @@ 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) { } - Creature* PrinceTaldaram = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_PRINCE_TALDARAM)); - if (PrinceTaldaram && PrinceTaldaram->IsAlive()) + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override { - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + InstanceScript* instance = me->GetInstanceScript(); + if (!instance) + return false; - switch (go->GetEntry()) + 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->SetFlag(GAMEOBJECT_FLAGS, 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 new 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 473d08abf98..38bfb9f220a 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -1379,7 +1379,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 708db6bb8df..3bb4a121d6c 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 @@ -446,49 +446,49 @@ public: break; } } + + bool GossipHello(Player* player) override + { + InstanceScript* instance = me->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 + 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 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); + StartEncounter(); + } + return true; + } }; CreatureAI* GetAI(Creature* creature) const override { return GetInstanceAI(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 - 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 OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); - ENSURE_AI(npc_announcer_toc5::npc_announcer_toc5AI, creature->AI())->StartEncounter(); - } - - return true; - } }; void AddSC_trial_of_the_champion() 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 3b1e84d5eec..598caddd72f 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -514,20 +514,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 new 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 711be2c5772..86b16216d97 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 @@ -123,92 +123,92 @@ class npc_announcer_toc10 : public CreatureScript } void AttackStart(Unit* /*who*/) override { } + + bool GossipHello(Player* player) override + { + InstanceScript* instance = me->GetInstanceScript(); + if (!instance) + return true; + + char const* _message = "We are ready!"; + + 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)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, _message, GOSSIP_SENDER_MAIN, _GossipMessage[i].id); + break; + } + } + + if (i >= NUM_MESSAGES) + return false; + + SendGossipMenuFor(player, _GossipMessage[i].msgnum, me->GetGUID()); + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + { + ClearGossipMenuFor(player); + CloseGossipMenuFor(player); + InstanceScript* instance = me->GetInstanceScript(); + if (!instance) + 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) + { + // if Jaraxxus is spawned, but the raid wiped + if (Creature* jaraxxus = ObjectAccessor::GetCreature(*player, instance->GetGuidData(NPC_JARAXXUS))) + { + jaraxxus->RemoveAurasDueToSpell(SPELL_JARAXXUS_CHAINS); + jaraxxus->RemoveFlag(UNIT_FIELD_FLAGS, 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->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + return true; + } }; - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - if (!instance) - return true; - - char const* _message = "We are ready!"; - - 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)) - { - 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; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override - { - ClearGossipMenuFor(player); - CloseGossipMenuFor(player); - InstanceScript* instance = creature->GetInstanceScript(); - if (!instance) - 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) - { - // if Jaraxxus is spawned, but the raid wiped - if (Creature* jaraxxus = ObjectAccessor::GetCreature(*player, instance->GetGuidData(NPC_JARAXXUS))) - { - jaraxxus->RemoveAurasDueToSpell(SPELL_JARAXXUS_CHAINS); - jaraxxus->RemoveFlag(UNIT_FIELD_FLAGS, 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 (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->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return new npc_announcer_toc10AI(creature); 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 4e11e4afdb9..ca15dec665e 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp @@ -99,7 +99,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) { @@ -109,6 +109,7 @@ public: events.Reset(); events.ScheduleEvent(EVENT_INTRO_1, 1000); } + return false; } void UpdateAI(uint32 diff) override @@ -196,7 +197,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) { @@ -206,6 +207,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 eb3cb7ed7bd..f0ecdc07dc4 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -343,20 +343,6 @@ 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 - { - // override default gossip - if (InstanceScript* instance = creature->GetInstanceScript()) - 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) @@ -364,7 +350,21 @@ class npc_jaina_or_sylvanas_intro_hor : public CreatureScript _instance = me->GetInstanceScript(); } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipHello(Player* player) override + { + // override default gossip + if (InstanceScript* instance = me->GetInstanceScript()) + 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; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { ClearGossipMenuFor(player); @@ -383,6 +383,7 @@ class npc_jaina_or_sylvanas_intro_hor : public CreatureScript default: break; } + return false; } void Reset() override @@ -790,21 +791,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), @@ -858,7 +844,22 @@ 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 (InstanceScript* instance = me->GetInstanceScript()) + 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); @@ -872,6 +873,7 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript default: break; } + return false; } void DestroyIceWall() diff --git a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp index b35b4f7696d..1670d037a30 100644 --- a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp +++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp @@ -20,6 +20,7 @@ #include "ScriptMgr.h" #include "gundrak.h" #include "EventMap.h" +#include "GameObjectAI.h" DoorData const doorData[] = { @@ -350,18 +351,28 @@ 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->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + go_gundrak_altarAI(GameObject* go) : GameObjectAI(go) { } - if (InstanceScript* instance = go->GetInstanceScript()) + bool GossipHello(Player* player, bool /*reportUse*/) override { - instance->SetData(DATA_STATUE_ACTIVATE, go->GetEntry()); - return true; - } + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + me->SetGoState(GO_STATE_ACTIVE); - return false; + if (InstanceScript* instance = me->GetInstanceScript()) + { + instance->SetData(DATA_STATUE_ACTIVATE, me->GetEntry()); + return true; + } + + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new 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 2e074d8c73e..cea762cca39 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -635,13 +635,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) { player->PlayerTalkClass->SendCloseGossip(); DoAction(ACTION_START_EVENT); } + return false; } void DoAction(int32 action) override @@ -831,13 +832,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) { player->PlayerTalkClass->SendCloseGossip(); 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 0e4e9a1ee6b..f2fcf44fd8c 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp @@ -962,7 +962,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->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); me->GetTransport()->EnableMovement(true); @@ -972,6 +972,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 @@ -1230,7 +1231,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->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); me->GetTransport()->EnableMovement(true); @@ -1241,6 +1242,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 @@ -1395,10 +1397,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); player->PlayerTalkClass->SendCloseGossip(); + 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 a4e857fc51f..078b2dd5132 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -1202,7 +1202,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) { @@ -1211,6 +1211,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 104df273adc..067520caf08 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -717,12 +717,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 GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) 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)) + me->CastSpell(me, 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 c8064e169de..29e0d9f1555 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp @@ -389,21 +389,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 1a9216efda0..40052a51250 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp @@ -21,6 +21,7 @@ #include "SpellAuraEffects.h" #include "Player.h" #include "nexus.h" +#include "GameObjectAI.h" enum Spells { @@ -224,22 +225,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) { } - Creature* pKeristrasza = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_KERISTRASZA)); - if (pKeristrasza && pKeristrasza->IsAlive()) + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override { - // maybe these are hacks :( - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + InstanceScript* instance = me->GetInstanceScript(); - ENSURE_AI(boss_keristrasza::boss_keristraszaAI, pKeristrasza->AI())->CheckContainmentSpheres(true); + Creature* pKeristrasza = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KERISTRASZA)); + if (pKeristrasza && pKeristrasza->IsAlive()) + { + // maybe these are hacks :( + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + me->SetGoState(GO_STATE_ACTIVE); + + ENSURE_AI(boss_keristrasza::boss_keristraszaAI, pKeristrasza->AI())->CheckContainmentSpheres(true); + } + return true; } - return true; - } + }; + GameObjectAI* GetAI(GameObject* go) const override + { + return new containment_sphereAI(go); + } }; class spell_intense_cold : public SpellScriptLoader diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp index 66095046f66..9fa184da932 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp @@ -141,7 +141,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) { @@ -156,7 +156,6 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript StoreEssence(player, ITEM_EMERALD_ESSENCE); break; } - return; case GOSSIP_MENU_ETERNOS: if (gossipListId >= 1 && gossipListId <= 3) { @@ -168,7 +167,6 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript StoreEssence(player, ITEM_AMBER_ESSENCE); break; } - return; case GOSSIP_MENU_BELGARISTRASZ: if (gossipListId <= 2) { @@ -180,11 +178,11 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript StoreEssence(player, ITEM_RUBY_ESSENCE); break; } - return; default: - return; + break; } player->PlayerTalkClass->SendCloseGossip(); + 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 fdb0b539804..c9b83d7e010 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp @@ -269,29 +269,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) @@ -322,6 +299,30 @@ public: bool bIsLowHP; bool brannSparklinNews; + 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; + } + void Reset() override { if (!HasEscortState(STATE_ESCORT_ESCORTING)) 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 e0b76341735..a9989c111c9 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 @@ -981,11 +981,11 @@ class go_celestial_planetarium_access : public GameObjectScript bool GossipHello(Player* player, bool /*reportUse*/) override { - if (go->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE)) + if (me->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE)) return true; bool hasKey = true; - if (LockEntry const* lock = sLockStore.LookupEntry(go->GetGOInfo()->goober.lockId)) + if (LockEntry const* lock = sLockStore.LookupEntry(me->GetGOInfo()->goober.lockId)) { hasKey = false; for (uint32 i = 0; i < MAX_LOCK_CASE; ++i) @@ -1005,18 +1005,18 @@ class go_celestial_planetarium_access : public GameObjectScript return false; // Start Algalon event - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); + me->SetFlag(GAMEOBJECT_FLAGS, 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()) + if (InstanceScript* instance = me->GetInstanceScript()) { instance->SetData(DATA_ALGALON_SUMMON_STATE, 1); - if (GameObject* sigil = ObjectAccessor::GetGameObject(*go, instance->GetGuidData(DATA_SIGILDOOR_01))) + 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))) + if (GameObject* sigil = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_SIGILDOOR_02))) sigil->SetGoState(GO_STATE_ACTIVE); } @@ -1035,7 +1035,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 fedc245b57d..412295a664b 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -39,6 +39,7 @@ #include "VehicleDefines.h" #include "ulduar.h" #include "Spell.h" +#include "GameObjectAI.h" enum Spells { @@ -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->RemoveFlag(UNIT_NPC_FLAGS, 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,40 @@ 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 { - InstanceScript* instance = go->GetInstanceScript(); - if (!instance) - return; + go_ulduar_towerAI(GameObject* go) : GameObjectAI(go) { } - switch (go->GetEntry()) + void Destroyed(Player* /*player*/, uint32 /*eventId*/) override { - 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; - } + InstanceScript* instance = me->GetInstanceScript(); + if (!instance) + return; - if (Creature* trigger = go->FindNearestCreature(NPC_ULDUAR_GAUNTLET_GENERATOR, 15.0f, true)) - trigger->DisappearAndDie(); + 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 + { + return new 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 e56de3450c4..804dcce4bba 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 "ulduar.h" #include "Vehicle.h" +#include "GameObjectAI.h" enum Yells { @@ -1645,20 +1646,30 @@ 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(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE)) + go_mimiron_hardmode_buttonAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (me->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE)) + return true; + + InstanceScript* instance = me->GetInstanceScript(); + if (!instance) + return false; + + if (Creature* computer = instance->GetCreature(DATA_COMPUTER)) + computer->AI()->DoAction(DO_ACTIVATE_COMPUTER); + me->SetGoState(GO_STATE_ACTIVE); + me->SetFlag(GAMEOBJECT_FLAGS, 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); - go->SetGoState(GO_STATE_ACTIVE); - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new 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 e6aa2654d54..31e63bdab2b 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -24,6 +24,7 @@ #include "ulduar.h" #include "SpellInfo.h" #include "Player.h" +#include "GameObjectAI.h" enum Says { @@ -316,12 +317,22 @@ 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()) - if (instance->GetCreature(BOSS_RAZORSCALE)) - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - return false; + go_razorscale_harpoonAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + if (instance->GetCreature(BOSS_RAZORSCALE)) + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_razorscale_harpoonAI(go); } }; @@ -734,37 +745,37 @@ class npc_expedition_commander : public CreatureScript else AttackStartTimer -= Diff; } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + ClearGossipMenuFor(player); + switch (gossipListId) + { + case GOSSIP_ACTION_INFO_DEF: + CloseGossipMenuFor(player); + ENSURE_AI(npc_expedition_commanderAI, me->AI())->Phase = 1; + return true; + } + return false; + } + + bool GossipHello(Player* player) override + { + InstanceScript* instance = me->GetInstanceScript(); + if (instance && 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; + } }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF: - CloseGossipMenuFor(player); - ENSURE_AI(npc_expedition_commanderAI, creature->AI())->Phase = 1; - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - if (instance && instance->GetBossState(BOSS_RAZORSCALE) == NOT_STARTED) - { - player->PrepareGossipMenu(creature); - - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, 13853, creature->GetGUID()); - } - else - SendGossipMenuFor(player, 13910, creature->GetGUID()); - - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return GetUlduarAI(creature); 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 7fbb84e35bf..38979ecd66b 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -1523,10 +1523,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 true; me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); me->DespawnOrUnsummon(2000); @@ -1549,6 +1549,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 d39608cb53f..eec8538c9bc 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp @@ -20,6 +20,7 @@ #include "utgarde_pinnacle.h" #include "SpellScript.h" #include "SpellAuraEffects.h" +#include "GameObjectAI.h" enum Spells { @@ -555,19 +556,29 @@ 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) { } + + 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->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); - palehoof->AI()->DoAction(ACTION_START_ENCOUNTER); - } + if (InstanceScript* instance = me->GetInstanceScript()) + { + if (Creature* palehoof = instance->GetCreature(DATA_GORTOK_PALEHOOF)) + if (palehoof->IsAlive() && instance->GetBossState(DATA_GORTOK_PALEHOOF) != DONE) + { + me->SetFlag(GAMEOBJECT_FLAGS, 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 new go_palehoof_sphereAI(go); } }; diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index b2061ea6369..eedf29c1c49 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -23,6 +23,7 @@ #include "SpellAuraEffects.h" #include "SpellScript.h" #include "violet_hold.h" +#include "GameObjectAI.h" /* * TODO: @@ -317,30 +318,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) @@ -369,7 +346,31 @@ class npc_sinclari_vh : public CreatureScript } } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipHello(Player* player) override + { + // override default gossip + if (InstanceScript* instance = me->GetInstanceScript()) + { + 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) { @@ -383,6 +384,7 @@ class npc_sinclari_vh : public CreatureScript me->CastSpell(player, SPELL_TELEPORT_PLAYER, true); player->PlayerTalkClass->SendCloseGossip(); } + return false; } void DoAction(int32 actionId) override @@ -1309,10 +1311,20 @@ class go_activation_crystal : public GameObjectScript public: go_activation_crystal() : GameObjectScript("go_activation_crystal") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_blackfathom_altarAI : public GameObjectAI { - player->CastSpell(player, SPELL_CRYSTAL_ACTIVATION, true); - return false; + go_blackfathom_altarAI(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 + { + return new go_blackfathom_altarAI(go); } }; diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index f7d3e774501..003f660a8a7 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -241,31 +241,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); - - 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) + bool GossipHello(Player* player) override { - CloseGossipMenuFor(player); + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - player->CastSpell(player, SPELL_SUMMON_WYRMREST_SKYTALON, true); - player->CastSpell(player, SPELL_WYRMREST_SKYTALON_RIDE_PERIODIC, 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); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; } - 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) + { + CloseGossipMenuFor(player); + + player->CastSpell(player, SPELL_SUMMON_WYRMREST_SKYTALON, true); + player->CastSpell(player, SPELL_WYRMREST_SKYTALON_RIDE_PERIODIC, true); + } + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_corastraszaAI(creature); } }; @@ -284,31 +293,42 @@ enum Iruk class npc_iruk : public CreatureScript { -public: - npc_iruk() : CreatureScript("npc_iruk") { } + public: + npc_iruk() : CreatureScript("npc_iruk") { } - bool OnGossipHello(Player* player, Creature* creature) 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); - - player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXT_I, creature->GetGUID()); - return true; - } - - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + struct npc_irukAI : public ScriptedAI { - case GOSSIP_ACTION_INFO_DEF+1: - player->CastSpell(player, SPELL_CREATURE_TOTEM_OF_ISSLIRUK, true); - CloseGossipMenuFor(player); - break; + npc_irukAI(Creature* creature) : ScriptedAI(creature) { } + 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); + + player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXT_I, me->GetGUID()); + return 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: + player->CastSpell(player, SPELL_CREATURE_TOTEM_OF_ISSLIRUK, true); + CloseGossipMenuFor(player); + break; + + } + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_irukAI(creature); } - return true; - } }; /*###### @@ -544,136 +564,132 @@ enum Lurgglbr class npc_lurgglbr : public CreatureScript { -public: - npc_lurgglbr() : CreatureScript("npc_lurgglbr") { } + public: + npc_lurgglbr() : CreatureScript("npc_lurgglbr") { } - struct npc_lurgglbrAI : public npc_escortAI - { - npc_lurgglbrAI(Creature* creature) : npc_escortAI(creature) + struct npc_lurgglbrAI : public npc_escortAI { - Initialize(); - } - - void Initialize() - { - IntroTimer = 0; - IntroPhase = 0; - } - - uint32 IntroTimer; - uint32 IntroPhase; - - void Reset() override - { - if (!HasEscortState(STATE_ESCORT_ESCORTING)) + npc_lurgglbrAI(Creature* creature) : npc_escortAI(creature) + { Initialize(); - } - - void WaypointReached(uint32 waypointId) override - { - switch (waypointId) - { - case 0: - IntroPhase = 1; - IntroTimer = 2000; - break; - case 41: - SetEscortPaused(true); - IntroPhase = 4; - IntroTimer = 2000; - break; } - } - void UpdateAI(uint32 diff) override - { - if (IntroPhase) + void Initialize() { - if (IntroTimer <= diff) + IntroTimer = 0; + IntroPhase = 0; + } + + uint32 IntroTimer; + uint32 IntroPhase; + + void Reset() override + { + if (!HasEscortState(STATE_ESCORT_ESCORTING)) + Initialize(); + } + + void WaypointReached(uint32 waypointId) override + { + switch (waypointId) { - switch (IntroPhase) + case 0: + IntroPhase = 1; + IntroTimer = 2000; + break; + case 41: + SetEscortPaused(true); + IntroPhase = 4; + IntroTimer = 2000; + break; + } + } + + void UpdateAI(uint32 diff) override + { + if (IntroPhase) + { + if (IntroTimer <= diff) { - case 1: - if (Player* player = GetPlayerForEscort()) - Talk(SAY_START_1, player); - IntroPhase = 2; - IntroTimer = 7500; + switch (IntroPhase) + { + case 1: + if (Player* player = GetPlayerForEscort()) + Talk(SAY_START_1, player); + IntroPhase = 2; + IntroTimer = 7500; + break; + case 2: + Talk(SAY_START_2); + IntroPhase = 3; + IntroTimer = 7500; + break; + case 3: + me->SetReactState(REACT_DEFENSIVE); + IntroPhase = 0; + IntroTimer = 0; + break; + case 4: + Talk(SAY_END_1); + IntroPhase = 5; + IntroTimer = 8000; + break; + case 5: + if (Player* player = GetPlayerForEscort()) + Talk(SAY_END_2, player); + IntroPhase = 6; + IntroTimer = 2500; + break; + case 6: + if (Player* player = GetPlayerForEscort()) + player->AreaExploredOrEventHappens(QUEST_ESCAPE_WINTERFIN_CAVERNS); + IntroPhase = 7; + IntroTimer = 2500; + break; + case 7: + me->DespawnOrUnsummon(); + IntroPhase = 0; + IntroTimer = 0; + break; + } + } else IntroTimer -= diff; + } + npc_escortAI::UpdateAI(diff); + + if (!UpdateVictim()) + return; + } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_ESCAPE_WINTERFIN_CAVERNS) + { + if (GameObject* go = me->FindNearestGameObject(GO_CAGE, 5.0f)) + { + go->SetRespawnTime(0); + go->UseDoorOrButton(20000); + } + + Start(true, false, player->GetGUID()); + + switch (player->GetTeam()) + { + case ALLIANCE: + me->SetFaction(FACTION_ESCORTEE_A_PASSIVE); break; - case 2: - Talk(SAY_START_2); - IntroPhase = 3; - IntroTimer = 7500; - break; - case 3: - me->SetReactState(REACT_DEFENSIVE); - IntroPhase = 0; - IntroTimer = 0; - break; - case 4: - Talk(SAY_END_1); - IntroPhase = 5; - IntroTimer = 8000; - break; - case 5: - if (Player* player = GetPlayerForEscort()) - Talk(SAY_END_2, player); - IntroPhase = 6; - IntroTimer = 2500; - break; - case 6: - if (Player* player = GetPlayerForEscort()) - player->AreaExploredOrEventHappens(QUEST_ESCAPE_WINTERFIN_CAVERNS); - IntroPhase = 7; - IntroTimer = 2500; - break; - case 7: - me->DespawnOrUnsummon(); - IntroPhase = 0; - IntroTimer = 0; + default: + case HORDE: + me->SetFaction(FACTION_ESCORTEE_H_PASSIVE); break; } - } else IntroTimer -= diff; + } } - npc_escortAI::UpdateAI(diff); + }; - 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) + CreatureAI* GetAI(Creature* creature) const override { - if (GameObject* go = creature->FindNearestGameObject(GO_CAGE, 5.0f)) - { - go->SetRespawnTime(0); - go->UseDoorOrButton(20000); - } - - if (npc_escortAI* pEscortAI = CAST_AI(npc_lurgglbr::npc_lurgglbrAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); - - switch (player->GetTeam()) - { - case ALLIANCE: - creature->SetFaction(FACTION_ESCORTEE_A_PASSIVE); - break; - default: - case HORDE: - creature->SetFaction(FACTION_ESCORTEE_H_PASSIVE); - break; - } - - return true; + return new npc_lurgglbrAI(creature); } - return false; - } }; enum red_dragonblood @@ -1041,33 +1057,34 @@ 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); - - 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 GossipHello(Player* player) 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; + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->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); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + + return true; } - return 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: + Start(true, false, player->GetGUID()); + SetMaxPlayerDistance(200.0f); + break; + } + return true; + } + }; CreatureAI* GetAI(Creature* creature) const override { @@ -1616,30 +1633,29 @@ 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_PASSIVE); - break; - case HORDE: - creature->SetFaction(FACTION_ESCORTEE_H_PASSIVE); - 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) { } + 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_PASSIVE); + break; + case HORDE: + me->SetFaction(FACTION_ESCORTEE_H_PASSIVE); + break; + } + me->SetStandState(UNIT_STAND_STATE_STAND); + Talk(SAY_1, player); + Start(true, false, player->GetGUID()); + } + } + void Reset() override { SetDespawnAtFar(false); @@ -1706,17 +1722,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) @@ -1731,6 +1736,16 @@ public: uint32 Bonker_agro; + 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()); + } + } + void Reset() override { Initialize(); @@ -2204,7 +2219,7 @@ public: uiEventPhase = 1; } - void SetGUID(ObjectGuid uiGuid, int32 /*iId*/) override + void SetGUID(ObjectGuid uiGuid, int32 /*iId*/ = 0) override { uiPlayerGUID = uiGuid; } @@ -2275,65 +2290,65 @@ public: DoMeleeAttackIfReady(); } + + bool GossipHello(Player* player) override + { + uint32 uiGossipText = 0; + const char* charGossipItem; + + 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 (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); + + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + + SendGossipMenuFor(player, uiGossipText, 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) + { + CloseGossipMenuFor(player); + SetGUID(player->GetGUID()); + DoAction(1); + } + + if (action == GOSSIP_ACTION_TRADE) + player->GetSession()->SendListInventory(me->GetGUID()); + + return true; + } }; 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()) - { - 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 (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); - - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - - SendGossipMenuFor(player, uiGossipText, 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); - creature->AI()->SetGUID(player->GetGUID()); - creature->AI()->DoAction(1); - } - - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); - - return true; - } - }; enum WindsoulTotemAura diff --git a/src/server/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp index 255d11361ab..54403a910db 100644 --- a/src/server/scripts/Northrend/zone_dragonblight.cpp +++ b/src/server/scripts/Northrend/zone_dragonblight.cpp @@ -492,33 +492,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) @@ -539,6 +512,34 @@ class npc_wyrmrest_defender : public CreatureScript uint32 RenewRecoveryChecker; + 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 (gossipListId == 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; + } + void Reset() override { Initialize(); diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp index b3a5cc7f4fa..9eb66ad9f3e 100644 --- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp +++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp @@ -182,25 +182,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); @@ -764,9 +762,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 64b2b8618ea..29a87e32d69 100644 --- a/src/server/scripts/Northrend/zone_howling_fjord.cpp +++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp @@ -78,15 +78,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) @@ -94,6 +85,12 @@ public: Initialize(); } + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_TRAIL_OF_FIRE) + StartEscort(player); + } + void StartEscort(Player* player) { events.ScheduleEvent(EVENT_BEGIN, Seconds(2)); @@ -331,50 +328,61 @@ 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()) - { - 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; - } - 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 GossipHello(Player* player) 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; + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (player->GetQuestStatus(QUEST_REPORTS_FROM_THE_FIELD) == QUEST_STATUS_INCOMPLETE) + 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(me), me->GetGUID()); + return true; } - return 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: + 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; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_razael_and_lyanaAI(creature); } }; @@ -404,17 +412,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 { @@ -432,6 +429,12 @@ public: bool bEventInProgress; ObjectGuid uiPlayerGUID; + void QuestAccept(Player* player, const Quest* quest) override + { + if (quest->GetQuestId() == QUEST_DEFEAT_AT_RING) + StartEvent(player->GetGUID()); + } + void Reset() override { Initialize(); diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp index 6bd5f0ba334..9bf9cf1017c 100644 --- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp +++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp @@ -150,28 +150,24 @@ public: m_uiChatTimer -= uiDiff; } } + + void QuestAccept(Player* player, const Quest* quest) override + { + if (quest->GetQuestId() == QUEST_DISASTER) + { + me->GetMotionMaster()->MoveJumpTo(0, 0.4f, 0.4f); + me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); + + Start(false, false, player->GetGUID()); + Talk(SAY_WP_1); + } + } }; 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) - { - if (npc_engineer_heliceAI* pEscortAI = CAST_AI(npc_engineer_helice::npc_engineer_heliceAI, creature->AI())) - { - creature->GetMotionMaster()->MoveJumpTo(0, 0.4f, 0.4f); - creature->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); - - pEscortAI->Start(false, false, player->GetGUID()); - creature->AI()->Talk(SAY_WP_1); - } - } - return true; - } }; /*##### diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp index 0754ec3fe2a..ab3300c0db1 100644 --- a/src/server/scripts/Northrend/zone_storm_peaks.cpp +++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp @@ -42,72 +42,71 @@ enum InjuredGoblinMiner class npc_injured_goblin : public CreatureScript { -public: - npc_injured_goblin() : CreatureScript("npc_injured_goblin") { } + public: + npc_injured_goblin() : CreatureScript("npc_injured_goblin") { } - struct npc_injured_goblinAI : public npc_escortAI - { - npc_injured_goblinAI(Creature* creature) : npc_escortAI(creature) { } - - void WaypointReached(uint32 waypointId) override + struct npc_injured_goblinAI : public npc_escortAI { - Player* player = GetPlayerForEscort(); - if (!player) - return; + npc_injured_goblinAI(Creature* creature) : npc_escortAI(creature) { } - switch (waypointId) + void WaypointReached(uint32 waypointId) override { - case 26: - Talk(SAY_END_WP_REACHED, player); - break; - case 27: - player->GroupEventHappens(QUEST_BITTER_DEPARTURE, me); - break; + Player* player = GetPlayerForEscort(); + if (!player) + return; + + switch (waypointId) + { + case 26: + Talk(SAY_END_WP_REACHED, player); + break; + case 27: + player->GroupEventHappens(QUEST_BITTER_DEPARTURE, me); + break; + } } - } - void EnterCombat(Unit* /*who*/) override { } + void EnterCombat(Unit* /*who*/) override { } - void Reset() override { } + void Reset() override { } - void JustDied(Unit* /*killer*/) override - { - Player* player = GetPlayerForEscort(); - if (HasEscortState(STATE_ESCORT_ESCORTING) && player) - player->FailQuest(QUEST_BITTER_DEPARTURE); - } - - void UpdateAI(uint32 uiDiff) override - { - npc_escortAI::UpdateAI(uiDiff); - if (!UpdateVictim()) - return; - DoMeleeAttackIfReady(); - } - - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override - { - if (menuId == GOSSIP_ID && gossipListId == GOSSIP_OPTION_ID) + void JustDied(Unit* /*killer*/) override { - CloseGossipMenuFor(player); - me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); - Start(true, true, player->GetGUID()); + Player* player = GetPlayerForEscort(); + if (HasEscortState(STATE_ESCORT_ESCORTING) && player) + player->FailQuest(QUEST_BITTER_DEPARTURE); } + + void UpdateAI(uint32 uiDiff) override + { + npc_escortAI::UpdateAI(uiDiff); + if (!UpdateVictim()) + return; + DoMeleeAttackIfReady(); + } + + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + { + if (menuId == GOSSIP_ID && gossipListId == GOSSIP_OPTION_ID) + { + CloseGossipMenuFor(player); + me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); + 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); + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_injured_goblinAI(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - 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; - } }; /*###### @@ -122,42 +121,53 @@ enum RoxiRamrocket class npc_roxi_ramrocket : public CreatureScript { -public: - npc_roxi_ramrocket() : CreatureScript("npc_roxi_ramrocket") { } + public: + npc_roxi_ramrocket() : CreatureScript("npc_roxi_ramrocket") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - //Quest Menu - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - //Trainer Menu - if ( creature->IsTrainer() ) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); - - //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); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + struct npc_roxi_ramrocketAI : public ScriptedAI { - case GOSSIP_ACTION_TRAIN: - player->GetSession()->SendTrainerList(creature->GetGUID()); - break; - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; + npc_roxi_ramrocketAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override + { + //Quest Menu + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + //Trainer Menu + if (me->IsTrainer()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + + //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); + + 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); + switch (action) + { + case GOSSIP_ACTION_TRAIN: + player->GetSession()->SendTrainerList(me->GetGUID()); + break; + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(me->GetGUID()); + break; + } + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_roxi_ramrocketAI(creature); } - return true; - } }; /*###### @@ -457,151 +467,152 @@ enum BrannBronzebeard class npc_brann_bronzebeard_keystone : public CreatureScript { -public: - npc_brann_bronzebeard_keystone() : CreatureScript("npc_brann_bronzebeard_keystone") { } + public: + npc_brann_bronzebeard_keystone() : CreatureScript("npc_brann_bronzebeard_keystone") { } - struct npc_brann_bronzebeard_keystoneAI : public ScriptedAI - { - npc_brann_bronzebeard_keystoneAI(Creature* creature) : ScriptedAI(creature) + struct npc_brann_bronzebeard_keystoneAI : public ScriptedAI { - objectCounter = 0; - } - - void Reset() override - { - for (ObjectGuid& guid : objectGUID) - guid.Clear(); - - playerGUID.Clear(); - voiceGUID.Clear(); - objectCounter = 0; - } - - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override - { - CloseGossipMenuFor(player); - playerGUID = player->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_1, 100); - } - - void UpdateAI(uint32 diff) override - { - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) + npc_brann_bronzebeard_keystoneAI(Creature* creature) : ScriptedAI(creature) { - switch (eventId) + objectCounter = 0; + } + + void Reset() override + { + for (ObjectGuid& guid : objectGUID) + guid.Clear(); + + playerGUID.Clear(); + voiceGUID.Clear(); + objectCounter = 0; + } + + 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 + { + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) { - case EVENT_SCRIPT_1: - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - Talk(SAY_BRANN_1, player); - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); - if (Creature* voice = me->SummonCreature(NPC_A_DISTANT_VOICE, 7863.43f, -1396.585f, 1538.076f, 2.949606f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 49000)) - voiceGUID = voice->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_2, 4000); - break; - case EVENT_SCRIPT_2: - me->SetWalk(true); - me->GetMotionMaster()->MovePoint(0, 7861.488f, -1396.376f, 1534.059f, false); - events.ScheduleEvent(EVENT_SCRIPT_3, 6000); - break; - case EVENT_SCRIPT_3: - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_WORK_MINING); - events.ScheduleEvent(EVENT_SCRIPT_4, 6000); - break; - case EVENT_SCRIPT_4: - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); - if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) - { - voice->CastSpell(voice, SPELL_RESURRECTION); + switch (eventId) + { + case EVENT_SCRIPT_1: if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - voice->AI()->Talk(SAY_VOICE_1, player); - } - if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_1, 7860.273f, -1383.622f, 1538.302f, -1.658062f, G3D::Quat(0.f, 0.f, -0.737277f, 0.6755905f), 0)) - objectGUID[objectCounter++] = go->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_5, 6000); - break; - case EVENT_SCRIPT_5: - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + Talk(SAY_BRANN_1, player); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); + if (Creature* voice = me->SummonCreature(NPC_A_DISTANT_VOICE, 7863.43f, -1396.585f, 1538.076f, 2.949606f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 49000)) + voiceGUID = voice->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_2, 4000); + break; + case EVENT_SCRIPT_2: + me->SetWalk(true); + me->GetMotionMaster()->MovePoint(0, 7861.488f, -1396.376f, 1534.059f, false); + events.ScheduleEvent(EVENT_SCRIPT_3, 6000); + break; + case EVENT_SCRIPT_3: + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_WORK_MINING); + events.ScheduleEvent(EVENT_SCRIPT_4, 6000); + break; + case EVENT_SCRIPT_4: + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) - voice->AI()->Talk(SAY_VOICE_2, player); - if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_2, 7875.67f, -1387.266f, 1538.323f, -2.373644f, G3D::Quat(0.f, 0.f, -0.9271832f, 0.3746083f), 0)) - objectGUID[objectCounter++] = go->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_6, 6000); - break; - case EVENT_SCRIPT_6: - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + { + voice->CastSpell(voice, SPELL_RESURRECTION); + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + voice->AI()->Talk(SAY_VOICE_1, player); + } + if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_1, 7860.273f, -1383.622f, 1538.302f, -1.658062f, G3D::Quat(0.f, 0.f, -0.737277f, 0.6755905f), 0)) + objectGUID[objectCounter++] = go->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_5, 6000); + break; + case EVENT_SCRIPT_5: + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) + voice->AI()->Talk(SAY_VOICE_2, player); + if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_2, 7875.67f, -1387.266f, 1538.323f, -2.373644f, G3D::Quat(0.f, 0.f, -0.9271832f, 0.3746083f), 0)) + objectGUID[objectCounter++] = go->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_6, 6000); + break; + case EVENT_SCRIPT_6: + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) + voice->AI()->Talk(SAY_VOICE_3, player); + if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_3, 7879.212f, -1401.175f, 1538.279f, 2.967041f, G3D::Quat(0.f, 0.f, 0.9961939f, 0.08716504f), 0)) + objectGUID[objectCounter++] = go->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_7, 6000); + break; + case EVENT_SCRIPT_7: + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) + voice->AI()->Talk(SAY_VOICE_4, player); + if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_4, 7868.944f, -1411.18f, 1538.213f, 2.111848f, G3D::Quat(0.f, 0.f, 0.8703556f, 0.4924237f), 0)) + objectGUID[objectCounter++] = go->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_8, 6000); + break; + case EVENT_SCRIPT_8: + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) + voice->AI()->Talk(SAY_VOICE_5, player); + if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_5, 7855.11f, -1406.839f, 1538.42f, 1.151916f, G3D::Quat(0.f, 0.f, 0.5446386f, 0.8386708f), 0)) + objectGUID[objectCounter] = go->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_9, 6000); + break; + case EVENT_SCRIPT_9: if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) - voice->AI()->Talk(SAY_VOICE_3, player); - if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_3, 7879.212f, -1401.175f, 1538.279f, 2.967041f, G3D::Quat(0.f, 0.f, 0.9961939f, 0.08716504f), 0)) - objectGUID[objectCounter++] = go->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_7, 6000); - break; - case EVENT_SCRIPT_7: - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) - voice->AI()->Talk(SAY_VOICE_4, player); - if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_4, 7868.944f, -1411.18f, 1538.213f, 2.111848f, G3D::Quat(0.f, 0.f, 0.8703556f, 0.4924237f), 0)) - objectGUID[objectCounter++] = go->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_8, 6000); - break; - case EVENT_SCRIPT_8: - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) - voice->AI()->Talk(SAY_VOICE_5, player); - if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_5, 7855.11f, -1406.839f, 1538.42f, 1.151916f, G3D::Quat(0.f, 0.f, 0.5446386f, 0.8386708f), 0)) - objectGUID[objectCounter] = go->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_9, 6000); - break; - case EVENT_SCRIPT_9: - if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) - voice->CastSpell(voice, SPELL_RESURRECTION); - events.ScheduleEvent(EVENT_SCRIPT_10, 6000); - break; - case EVENT_SCRIPT_10: - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - { - Talk(SAY_BRANN_2, player); - player->KilledMonsterCredit(me->GetEntry()); - } - events.ScheduleEvent(EVENT_SCRIPT_11, 6000); - break; - case EVENT_SCRIPT_11: - me->SetFacingTo(2.932153f); - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - Talk(SAY_BRANN_3, player); + voice->CastSpell(voice, SPELL_RESURRECTION); + events.ScheduleEvent(EVENT_SCRIPT_10, 6000); + break; + case EVENT_SCRIPT_10: + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + { + Talk(SAY_BRANN_2, player); + player->KilledMonsterCredit(me->GetEntry()); + } + events.ScheduleEvent(EVENT_SCRIPT_11, 6000); + break; + case EVENT_SCRIPT_11: + me->SetFacingTo(2.932153f); + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + Talk(SAY_BRANN_3, player); - for (uint8 i = 0; i < 5; ++i) - if (GameObject* go = ObjectAccessor::GetGameObject(*me, objectGUID[i])) - go->Delete(); + for (uint8 i = 0; i < 5; ++i) + if (GameObject* go = ObjectAccessor::GetGameObject(*me, objectGUID[i])) + go->Delete(); - events.ScheduleEvent(EVENT_SCRIPT_12, 6000); - break; - case EVENT_SCRIPT_12: - me->GetMotionMaster()->Clear(); - me->SetWalk(false); - me->GetMotionMaster()->MovePoint(0, 7799.908f, -1413.561f, 1534.829f, false); - events.ScheduleEvent(EVENT_SCRIPT_13, 10000); - break; - case EVENT_SCRIPT_13: - me->DisappearAndDie(); - break; + events.ScheduleEvent(EVENT_SCRIPT_12, 6000); + break; + case EVENT_SCRIPT_12: + me->GetMotionMaster()->Clear(); + me->SetWalk(false); + me->GetMotionMaster()->MovePoint(0, 7799.908f, -1413.561f, 1534.829f, false); + events.ScheduleEvent(EVENT_SCRIPT_13, 10000); + break; + case EVENT_SCRIPT_13: + me->DisappearAndDie(); + break; + } } } + + private: + EventMap events; + ObjectGuid playerGUID; + ObjectGuid objectGUID[5]; + ObjectGuid voiceGUID; + uint8 objectCounter; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_brann_bronzebeard_keystoneAI(creature); } - - private: - EventMap events; - ObjectGuid playerGUID; - ObjectGuid objectGUID[5]; - ObjectGuid voiceGUID; - uint8 objectCounter; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_brann_bronzebeard_keystoneAI(creature); - } }; /*##### diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp index 1be3ec65403..2a1238d5e4e 100644 --- a/src/server/scripts/Northrend/zone_wintergrasp.cpp +++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp @@ -115,69 +115,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(me), me->GetGUID()); + return true; } - 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; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - CloseGossipMenuFor(player); - - 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: + me->CastSpell(player, SPELL_BUILD_CATAPULT_FORCE, true); + break; + case 1: + me->CastSpell(player, SPELL_BUILD_DEMOLISHER_FORCE, true); + break; + case 2: + me->CastSpell(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)) + me->CastSpell(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); } }; @@ -186,40 +197,6 @@ class npc_wg_spirit_guide : public CreatureScript public: npc_wg_spirit_guide() : CreatureScript("npc_wg_spirit_guide") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; - - 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); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override - { - 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 = sWorldSafeLocsStore.LookupEntry(gy[i]->GetGraveyardId())) - player->TeleportTo(safeLoc->map_id, safeLoc->x, safeLoc->y, safeLoc->z, 0); - } - return true; - } - struct npc_wg_spirit_guideAI : public ScriptedAI { npc_wg_spirit_guideAI(Creature* creature) : ScriptedAI(creature) { } @@ -229,6 +206,41 @@ class npc_wg_spirit_guide : public CreatureScript if (!me->HasUnitState(UNIT_STATE_CASTING)) DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL); } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) + return true; + + 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); + + 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); + 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 = sWorldSafeLocsStore.LookupEntry(gy[i]->GetGraveyardId())) + player->TeleportTo(safeLoc->map_id, safeLoc->x, safeLoc->y, safeLoc->z, 0); + } + return true; + } }; CreatureAI* GetAI(Creature* creature) const override @@ -274,60 +286,60 @@ class npc_wg_queue : public CreatureScript DoMeleeAttackIfReady(); } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) + return true; + + 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, me->GetGUID()); + } + else + { + uint32 timer = wintergrasp->GetTimer() / 1000; + player->SendUpdateWorldState(4354, time(NULL) + timer); + 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, me->GetGUID()); + } + else + SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, me->GetGUID()); + } + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + { + CloseGossipMenuFor(player); + + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) + return true; + + if (wintergrasp->IsWarTime()) + wintergrasp->InvitePlayerToWar(player); + else + { + uint32 timer = wintergrasp->GetTimer() / 1000; + if (timer < 15 * MINUTE) + wintergrasp->InvitePlayerToQueue(player); + } + return true; + } }; CreatureAI* GetAI(Creature* creature) const override { return new npc_wg_queueAI(creature); } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; - - 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()); - } - else - { - uint32 timer = wintergrasp->GetTimer() / 1000; - player->SendUpdateWorldState(4354, time(NULL) + timer); - 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()); - } - else - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, creature->GetGUID()); - } - return true; - } - - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 /*action*/) override - { - CloseGossipMenuFor(player); - - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; - - if (wintergrasp->IsWarTime()) - wintergrasp->InvitePlayerToWar(player); - else - { - uint32 timer = wintergrasp->GetTimer() / 1000; - if (timer < 15 * MINUTE) - wintergrasp->InvitePlayerToQueue(player); - } - return true; - } }; class go_wg_vehicle_teleporter : public GameObjectScript @@ -339,39 +351,41 @@ class go_wg_vehicle_teleporter : public GameObjectScript { go_wg_vehicle_teleporterAI(GameObject* gameObject) : GameObjectAI(gameObject), _checkTimer(0) { } - bool IsFriendly(Unit* passenger) - { - return ((go->GetFaction() == WintergraspFaction[TEAM_HORDE] && passenger->GetFaction() == HORDE) || - (go->GetFaction() == WintergraspFaction[TEAM_ALLIANCE] && passenger->GetFaction() == ALLIANCE)); - } - - Creature* GetValidVehicle(Creature* cVeh) - { - if (!cVeh->HasAura(SPELL_VEHICLE_TELEPORT)) - 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)) - return teleportTrigger; - - return nullptr; - } - - void UpdateAI(uint32 diff) + void UpdateAI(uint32 diff) override { _checkTimer += diff; 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); _checkTimer = 0; } } + private: uint32 _checkTimer; + + bool IsFriendly(Unit* passenger) const + { + return ((me->GetFaction() == WintergraspFaction[TEAM_HORDE] && passenger->GetFaction() == HORDE) || + (me->GetFaction() == WintergraspFaction[TEAM_ALLIANCE] && passenger->GetFaction() == ALLIANCE)); + } + + Creature* GetValidVehicle(Creature* cVeh) const + { + if (!cVeh->HasAura(SPELL_VEHICLE_TELEPORT)) + if (Vehicle* vehicle = cVeh->GetVehicleKit()) + if (Unit* passenger = vehicle->GetPassenger(0)) + if (IsFriendly(passenger)) + if (Creature* teleportTrigger = passenger->SummonTrigger(me->GetPositionX() - 60.0f, me->GetPositionY(), me->GetPositionZ() + 1.0f, cVeh->GetOrientation(), 1000)) + return teleportTrigger; + + return nullptr; + } + }; GameObjectAI* GetAI(GameObject* go) const override diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp index 3335b20e423..da5f0e864d2 100644 --- a/src/server/scripts/Northrend/zone_zuldrak.cpp +++ b/src/server/scripts/Northrend/zone_zuldrak.cpp @@ -25,6 +25,7 @@ #include "SpellAuras.h" #include "SpellAuraEffects.h" #include "Vehicle.h" +#include "GameObjectAI.h" /*#### ## npc_drakuru_shackles @@ -267,12 +268,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: @@ -300,25 +302,35 @@ enum ScourgeEnclosure class go_scourge_enclosure : public GameObjectScript { -public: - go_scourge_enclosure() : GameObjectScript("go_scourge_enclosure") { } + public: + go_scourge_enclosure() : GameObjectScript("go_scourge_enclosure") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_OUR_ONLY_HOPE) == QUEST_STATUS_INCOMPLETE) + struct go_scourge_enclosureAI : public GameObjectAI { - Creature* gymerDummy = go->FindNearestCreature(NPC_GYMER_DUMMY, 20.0f); - if (gymerDummy) + go_scourge_enclosureAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - player->KilledMonsterCredit(gymerDummy->GetEntry(), gymerDummy->GetGUID()); - gymerDummy->CastSpell(gymerDummy, SPELL_GYMER_LOCK_EXPLOSION, true); - gymerDummy->DespawnOrUnsummon(4 * IN_MILLISECONDS); + me->UseDoorOrButton(); + if (player->GetQuestStatus(QUEST_OUR_ONLY_HOPE) == QUEST_STATUS_INCOMPLETE) + { + Creature* gymerDummy = me->FindNearestCreature(NPC_GYMER_DUMMY, 20.0f); + if (gymerDummy) + { + player->KilledMonsterCredit(gymerDummy->GetEntry(), gymerDummy->GetGUID()); + gymerDummy->CastSpell(gymerDummy, SPELL_GYMER_LOCK_EXPLOSION, true); + gymerDummy->DespawnOrUnsummon(4 * IN_MILLISECONDS); + } + } + return true; } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_scourge_enclosureAI(go); } - return true; - } -}; + }; /*###### ## Quest: Troll Patrol: The Alchemist's Apprentice @@ -552,13 +564,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: @@ -575,14 +588,24 @@ public: class go_finklesteins_cauldron : public GameObjectScript { -public: - go_finklesteins_cauldron() : GameObjectScript("go_finklesteins_cauldron") { } + public: + go_finklesteins_cauldron() : GameObjectScript("go_finklesteins_cauldron") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - player->CastSpell(player, SPELL_POT_CHECK); - return true; - } + 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 + { + return new go_finklesteins_cauldronAI(go); + } }; uint32 const FetchIngredients[21][4] = diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index 5da2471c0f2..b48b0d3b2b1 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -1055,7 +1055,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) { @@ -1065,7 +1065,6 @@ public: if (Creature* illidan = _instance->GetCreature(DATA_ILLIDAN_STORMRAGE)) illidan->AI()->DoAction(ACTION_INTRO_DONE); CloseGossipMenuFor(player); - } else if (gossipListId == GOSSIP_START_FIGHT) { @@ -1074,6 +1073,7 @@ public: me->RemoveFlag(UNIT_NPC_FLAGS, 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 d67317586ae..c2131a46696 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp @@ -545,13 +545,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 bd389da60b3..b58a2e50379 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp @@ -22,6 +22,7 @@ #include "SpellInfo.h" #include "SpellScript.h" #include "GridNotifiers.h" +#include "GameObjectAI.h" enum Texts { @@ -169,20 +170,30 @@ public: class go_najentus_spine : public GameObjectScript { -public: - go_najentus_spine() : GameObjectScript("go_najentus_spine") { } + public: + go_najentus_spine() : GameObjectScript("go_najentus_spine") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (InstanceScript* instance = go->GetInstanceScript()) - 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(); - } - return true; - } + struct go_najentus_spineAI : public GameObjectAI + { + go_najentus_spineAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + if (Creature* najentus = instance->GetCreature(DATA_HIGH_WARLORD_NAJENTUS)) + if (ENSURE_AI(boss_najentus::boss_najentusAI, najentus->AI())->RemoveImpalingSpine()) + { + me->CastSpell(player, SPELL_CREATE_NAJENTUS_SPINE, true); + me->Delete(); + } + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_najentus_spineAI(go); + } }; // 39992 - Needle Spine Targeting 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 0d766785627..1c6c6f25623 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp @@ -28,6 +28,7 @@ EndScriptData */ #include "serpent_shrine.h" #include "Spell.h" #include "Player.h" +#include "GameObjectAI.h" enum Spells { @@ -434,21 +435,31 @@ 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()) - if (!urand(0, 3)) - { - if (instanceScript->GetData(DATA_STRANGE_POOL) == NOT_STARTED) - { - go->CastSpell(player, 54587); - instanceScript->SetData(DATA_STRANGE_POOL, IN_PROGRESS); - } - return true; - } + go_strange_poolAI(GameObject* go) : GameObjectAI(go) { } - return false; + bool GossipHello(Player* player, bool /*reportUse*/) override + { + // 25% + if (InstanceScript* instanceScript = me->GetInstanceScript()) + if (!urand(0, 3)) + { + if (instanceScript->GetData(DATA_STRANGE_POOL) == NOT_STARTED) + { + me->CastSpell(player, 54587); + instanceScript->SetData(DATA_STRANGE_POOL, IN_PROGRESS); + } + return true; + } + + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new 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 26d1a8233cb..42f30ec5920 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp @@ -28,6 +28,7 @@ EndScriptData */ #include "serpent_shrine.h" #include "Player.h" #include "TemporarySummon.h" +#include "GameObjectAI.h" #define MAX_ENCOUNTER 6 @@ -64,17 +65,27 @@ 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) { } - if (!instance) - return false; + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + InstanceScript* instance = me->GetInstanceScript(); - if (instance) - instance->SetData(DATA_CONTROL_CONSOLE, DONE); + if (!instance) + return false; - return true; + if (instance) + instance->SetData(DATA_CONTROL_CONSOLE, DONE); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_bridge_consoleAI(go); } }; 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 30ea7ab41fe..1be6cd5cdfa 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp @@ -18,28 +18,39 @@ #include "ScriptMgr.h" #include "InstanceScript.h" #include "steam_vault.h" +#include "GameObjectAI.h" 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) { } - 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); + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + InstanceScript* instance = me->GetInstanceScript(); + if (!instance) + return false; - 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); + 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); - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + 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); - return true; + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + me->SetGoState(GO_STATE_ACTIVE); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_main_chambers_access_panelAI(go); } }; diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp index 702496500ec..d169a21f0d4 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp @@ -23,6 +23,7 @@ #include "SpellAuraEffects.h" #include "SpellScript.h" #include "the_slave_pens.h" +#include "GameObjectAI.h" enum Spells { @@ -646,25 +647,34 @@ 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) { } - ClearGossipMenuFor(player); - - if (Creature* ahuneBunny = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_AHUNE_BUNNY))) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { - ahuneBunny->AI()->DoAction(ACTION_START_EVENT); - ahuneBunny->SetInCombatWithZone(); - } - if (Creature* luma = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_LUMA_SKYMOTHER))) - luma->CastSpell(player, SPELL_SUMMONING_RHYME_AURA, true); - CloseGossipMenuFor(player); - go->Delete(); + InstanceScript* instance = me->GetInstanceScript(); + if (!instance) + return false; - return true; + 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; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_ahune_ice_stoneAI(go); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp index 190b41134d3..89998cb9feb 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp @@ -20,6 +20,7 @@ #include "SpellScript.h" #include "SpellAuraEffects.h" #include "blood_furnace.h" +#include "GameObjectAI.h" enum Yells { @@ -127,18 +128,28 @@ 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()) - 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))) - broggok->AI()->DoAction(ACTION_PREPARE_BROGGOK); - } + go_broggok_leverAI(GameObject* go) : GameObjectAI(go) { } - go->UseDoorOrButton(); - return false; + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + if (instance->GetBossState(DATA_BROGGOK) != DONE && instance->GetBossState(DATA_BROGGOK) != IN_PROGRESS) + { + instance->SetBossState(DATA_BROGGOK, IN_PROGRESS); + if (Creature* broggok = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_BROGGOK))) + broggok->AI()->DoAction(ACTION_PREPARE_BROGGOK); + } + + me->UseDoorOrButton(); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new 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 fee33645646..eed9490fbb6 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp @@ -23,6 +23,7 @@ #include "SpellScript.h" #include "SpellAuraEffects.h" #include "PassiveAI.h" +#include "GameObjectAI.h" enum Yells { @@ -460,20 +461,30 @@ public: class go_manticron_cube : public GameObjectScript { -public: - go_manticron_cube() : GameObjectScript("go_manticron_cube") { } + public: + go_manticron_cube() : GameObjectScript("go_manticron_cube") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->HasAura(SPELL_MIND_EXHAUSTION) || player->HasAura(SPELL_SHADOW_GRASP)) - return true; + struct go_manticron_cubeAI : public GameObjectAI + { + go_manticron_cubeAI(GameObject* go) : GameObjectAI(go) { } - if (Creature* trigger = player->FindNearestCreature(NPC_HELFIRE_RAID_TRIGGER, 10.0f)) - trigger->CastSpell((Unit*)nullptr, SPELL_SHADOW_GRASP_VISUAL); + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->HasAura(SPELL_MIND_EXHAUSTION) || player->HasAura(SPELL_SHADOW_GRASP)) + return true; - player->CastSpell((Unit*)nullptr, SPELL_SHADOW_GRASP, true); - return true; - } + 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; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_manticron_cubeAI(go); + } }; // 30541 - Blaze diff --git a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp index 69485615013..00d6182489f 100644 --- a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp +++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp @@ -40,6 +40,7 @@ EndContentData */ #include "SpellScript.h" #include "SpellAuras.h" #include "SpellAuraEffects.h" +#include "GameObjectAI.h" /*###### ## npc_nether_drake @@ -297,46 +298,56 @@ enum LegionObelisk class go_legion_obelisk : public GameObjectScript { -public: - go_legion_obelisk() : GameObjectScript("go_legion_obelisk") { } + public: + go_legion_obelisk() : GameObjectScript("go_legion_obelisk") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (player->GetQuestStatus(QUEST_YOURE_FIRED) == QUEST_STATUS_INCOMPLETE) + struct go_legion_obeliskAI : public GameObjectAI { - switch (go->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; - } + go_legion_obeliskAI(GameObject* go) : GameObjectAI(go) { } - if (obelisk_one == true && obelisk_two == true && obelisk_three == true && obelisk_four == true && obelisk_five == true) + bool GossipHello(Player* player, bool /*reportUse*/) override { - 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 (player->GetQuestStatus(QUEST_YOURE_FIRED) == QUEST_STATUS_INCOMPLETE) + { + 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) + { + 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; } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_legion_obeliskAI(go); } - - return true; - } }; enum SimonGame @@ -877,14 +888,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.spellId, 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.spellId, true); + me->AddUse(); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_simon_clusterAI(go); } }; @@ -903,27 +924,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 large = (go->GetEntry() == GO_APEXIS_MONUMENT); - if (player->HasItemCount(ITEM_APEXIS_SHARD, large ? 35 : 1)) + bool GossipHello(Player* player, bool /*reportUse*/) override { - player->CastSpell(player, large ? SPELL_TAKE_REAGENTS_GROUP : SPELL_TAKE_REAGENTS_SOLO, false); - - if (Creature* bunny = player->SummonCreature(NPC_SIMON_BUNNY, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ())) - bunny->AI()->SetGUID(player->GetGUID(), large); + player->PrepareGossipMenu(me, me->GetGOInfo()->questgiver.gossipID); + player->SendPreparedGossip(me); + return true; } - return true; + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + { + 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); + } + + 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 d15e3583769..55d28f3d6a5 100644 --- a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp +++ b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp @@ -273,7 +273,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) { @@ -513,15 +513,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) @@ -546,6 +537,15 @@ public: bool success; + bool GossipHello(Player* player) override + { + if (success) + player->KilledMonsterCredit(NPC_COLONEL_JULES, ObjectGuid::Empty); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } + void DoAction(int32 action) override { switch (action) @@ -682,19 +682,20 @@ public: me->RemoveFlag(UNIT_FIELD_FLAGS, 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) { case 1: player->PlayerTalkClass->SendCloseGossip(); - me->AI()->Talk(SAY_BARADA_1); - me->AI()->DoAction(ACTION_START_EVENT); + Talk(SAY_BARADA_1); + DoAction(ACTION_START_EVENT); break; default: break; } + return false; } void DoAction(int32 action) override @@ -938,18 +939,18 @@ 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) { } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + { + CloseGossipMenuFor(player); + me->StopMoving(); + StartFight(player); + return true; + } + void StartFight(Player* player) { me->Dismount(); diff --git a/src/server/scripts/Outland/zone_nagrand.cpp b/src/server/scripts/Outland/zone_nagrand.cpp index fd53ec8ba0b..d6f8fe1033f 100644 --- a/src/server/scripts/Outland/zone_nagrand.cpp +++ b/src/server/scripts/Outland/zone_nagrand.cpp @@ -33,6 +33,7 @@ EndContentData */ #include "ScriptedEscortAI.h" #include "Player.h" #include "SpellInfo.h" +#include "GameObjectAI.h" /*###### ## npc_maghar_captive @@ -69,25 +70,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(creature->AI())) - { - creature->SetStandState(UNIT_STAND_STATE_STAND); - creature->SetFaction(FACTION_ESCORTEE_H_NEUTRAL_ACTIVE); - 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); @@ -101,6 +83,21 @@ public: uint32 HealTimer; uint32 FrostShockTimer; + void QuestAccept(Player* player, const Quest* quest) override + { + if (quest->GetQuestId() == QUEST_TOTEM_KARDASH_H) + { + me->SetStandState(UNIT_STAND_STATE_STAND); + me->SetFaction(FACTION_ESCORTEE_H_NEUTRAL_ACTIVE); + 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); + } + } + void Reset() override { ChainLightningTimer = 1000; @@ -287,43 +284,53 @@ enum CorkiData class go_corkis_prison : public GameObjectScript { -public: - go_corkis_prison() : GameObjectScript("go_corkis_prison") { } + public: + 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) + struct go_corkis_prisonAI : public GameObjectAI { - 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); - } - } + go_corkis_prisonAI(GameObject* go) : GameObjectAI(go) { } - if (go->GetEntry() == GO_CORKIS_PRISON_2) - { - if (Creature* corki = go->FindNearestCreature(NPC_CORKI_2, 25, true)) + bool GossipHello(Player* player, bool /*reportUse*/) override { - corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()-5, go->GetPositionY(), go->GetPositionZ()); - if (player) - player->KilledMonsterCredit(NPC_CORKI_2); - } - } + 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); + 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); } - return true; - } }; class npc_corki : public CreatureScript @@ -423,25 +430,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(creature->AI())) - { - creature->SetStandState(UNIT_STAND_STATE_STAND); - creature->SetFaction(FACTION_ESCORTEE_A_NEUTRAL_ACTIVE); - 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); @@ -465,6 +453,21 @@ public: uint32 HealTimer; uint32 FrostShockTimer; + void QuestAccept(Player* player, const Quest* quest) override + { + if (quest->GetQuestId() == QUEST_TOTEM_KARDASH_A) + { + me->SetStandState(UNIT_STAND_STATE_STAND); + me->SetFaction(FACTION_ESCORTEE_A_NEUTRAL_ACTIVE); + 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); + } + } + void Reset() override { Initialize(); @@ -602,20 +605,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; - prisoner->AI()->Talk(SAY_FREE, player); - prisoner->DespawnOrUnsummon(6000); + if (Creature* prisoner = me->FindNearestCreature(NPC_MAGHAR_PRISONER, 5.0f)) + { + player->KilledMonsterCredit(NPC_MAGHAR_PRISONER); + + 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 4f2eccd7513..6eec0a3508c 100644 --- a/src/server/scripts/Outland/zone_netherstorm.cpp +++ b/src/server/scripts/Outland/zone_netherstorm.cpp @@ -35,6 +35,7 @@ EndContentData */ #include "ScriptedGossip.h" #include "ScriptedEscortAI.h" #include "Player.h" +#include "GameObjectAI.h" /*###### ## npc_commander_dawnforge @@ -489,74 +490,73 @@ enum BessyData class npc_bessy : public CreatureScript { -public: - npc_bessy() : CreatureScript("npc_bessy") { } + public: + npc_bessy() : CreatureScript("npc_bessy") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == Q_ALMABTRIEB) + CreatureAI* GetAI(Creature* creature) const override { - creature->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); - creature->RemoveFlag(UNIT_FIELD_FLAGS, 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) { } - - void JustDied(Unit* /*killer*/) override - { - if (Player* player = GetPlayerForEscort()) - player->FailQuest(Q_ALMABTRIEB); + return new npc_bessyAI(creature); } - void WaypointReached(uint32 waypointId) override + struct npc_bessyAI : public npc_escortAI { - Player* player = GetPlayerForEscort(); - if (!player) - return; + npc_bessyAI(Creature* creature) : npc_escortAI(creature) { } - switch (waypointId) + void QuestAccept(Player* player, Quest const* quest) override { - case 3: //first spawn - me->SummonCreature(SPAWN_FIRST, 2449.67f, 2183.11f, 96.85f, 6.20f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(SPAWN_FIRST, 2449.53f, 2184.43f, 96.36f, 6.27f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(SPAWN_FIRST, 2449.85f, 2186.34f, 97.57f, 6.08f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - break; - case 7: - me->SummonCreature(SPAWN_SECOND, 2309.64f, 2186.24f, 92.25f, 6.06f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(SPAWN_SECOND, 2309.25f, 2183.46f, 91.75f, 6.22f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - break; - case 12: - player->GroupEventHappens(Q_ALMABTRIEB, me); - if (me->FindNearestCreature(N_THADELL, 30)) - Talk(SAY_THADELL_1); - break; - case 13: - if (me->FindNearestCreature(N_THADELL, 30)) - Talk(SAY_THADELL_2, player); - break; + if (quest->GetQuestId() == Q_ALMABTRIEB) + { + me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + Start(true, false, player->GetGUID()); + } } - } - void JustSummoned(Creature* summoned) override - { - summoned->AI()->AttackStart(me); - } + void JustDied(Unit* /*killer*/) override + { + if (Player* player = GetPlayerForEscort()) + player->FailQuest(Q_ALMABTRIEB); + } - void Reset() override - { - me->RestoreFaction(); - } - }; + void WaypointReached(uint32 waypointId) override + { + Player* player = GetPlayerForEscort(); + if (!player) + return; + + switch (waypointId) + { + case 3: //first spawn + me->SummonCreature(SPAWN_FIRST, 2449.67f, 2183.11f, 96.85f, 6.20f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(SPAWN_FIRST, 2449.53f, 2184.43f, 96.36f, 6.27f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(SPAWN_FIRST, 2449.85f, 2186.34f, 97.57f, 6.08f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + break; + case 7: + me->SummonCreature(SPAWN_SECOND, 2309.64f, 2186.24f, 92.25f, 6.06f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(SPAWN_SECOND, 2309.25f, 2183.46f, 91.75f, 6.22f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + break; + case 12: + player->GroupEventHappens(Q_ALMABTRIEB, me); + if (me->FindNearestCreature(N_THADELL, 30)) + Talk(SAY_THADELL_1); + break; + case 13: + if (me->FindNearestCreature(N_THADELL, 30)) + Talk(SAY_THADELL_2, player); + break; + } + } + + void JustSummoned(Creature* summoned) override + { + summoned->AI()->AttackStart(me); + } + + void Reset() override + { + me->RestoreFaction(); + } + }; }; /*###### @@ -654,20 +654,16 @@ public: } DoMeleeAttackIfReady(); } - }; - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_MARK_V_IS_ALIVE) + void QuestAccept(Player* player, const Quest* 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(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); - pEscortAI->Start(false, false, player->GetGUID()); + me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); + Start(false, false, player->GetGUID()); } } - return true; - } + }; }; /*###### @@ -685,16 +681,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 a7c4bf2829a..0acc455a62d 100644 --- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp +++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp @@ -44,6 +44,7 @@ EndContentData */ #include "SpellScript.h" #include "Player.h" #include "WorldSession.h" +#include "GameObjectAI.h" /*##### # npc_invis_infernal_caster @@ -591,19 +592,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_RING); - - 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); @@ -623,6 +611,16 @@ public: uint32 m_uiHealingTimer; + void QuestAccept(Player* player, const Quest* quest) override + { + if (quest->GetQuestId() == QUEST_ESCAPE_COILSCAR) + { + Talk(SAY_WIL_START, player); + me->SetFaction(FACTION_EARTHEN_RING); + Start(false, false, player->GetGUID(), quest); + } + } + void Reset() override { Initialize(); @@ -1341,24 +1339,33 @@ void npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave() class go_crystal_prison : public GameObjectScript { -public: - go_crystal_prison() : GameObjectScript("go_crystal_prison") { } + public: + go_crystal_prison() : GameObjectScript("go_crystal_prison") { } - bool OnQuestAccept(Player* player, GameObject* /*go*/, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_BATTLE_OF_THE_CRIMSON_WATCH) + struct go_crystal_prisonAI : public GameObjectAI { - 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 { - 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; + if (quest->GetQuestId() == QUEST_BATTLE_OF_THE_CRIMSON_WATCH) + { + 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; + } + } } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_crystal_prisonAI(go); } - return true; - } }; /*#### diff --git a/src/server/scripts/Outland/zone_terokkar_forest.cpp b/src/server/scripts/Outland/zone_terokkar_forest.cpp index cce88ab5846..5f7d3a6a39f 100644 --- a/src/server/scripts/Outland/zone_terokkar_forest.cpp +++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp @@ -39,6 +39,7 @@ EndContentData */ #include "Group.h" #include "Player.h" #include "WorldSession.h" +#include "GameObjectAI.h" /*###### ## npc_unkor_the_ruthless @@ -322,96 +323,97 @@ enum Floon class npc_floon : public CreatureScript { -public: - npc_floon() : CreatureScript("npc_floon") { } + 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) + CreatureAI* GetAI(Creature* creature) const override { - 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_ARAKKOA); - 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) - { - Initialize(); - m_uiNormFaction = creature->GetFaction(); + return new npc_floonAI(creature); } - void Initialize() + struct npc_floonAI : public ScriptedAI { - Silence_Timer = 2000; - Frostbolt_Timer = 4000; - FrostNova_Timer = 9000; - } - - uint32 m_uiNormFaction; - uint32 Silence_Timer; - uint32 Frostbolt_Timer; - uint32 FrostNova_Timer; - - void Reset() override - { - Initialize(); - if (me->GetFaction() != m_uiNormFaction) - me->SetFaction(m_uiNormFaction); - } - - void EnterCombat(Unit* /*who*/) override { } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (Silence_Timer <= diff) + npc_floonAI(Creature* creature) : ScriptedAI(creature) { - DoCastVictim(SPELL_SILENCE); - Silence_Timer = 30000; - } else Silence_Timer -= diff; + Initialize(); + m_uiNormFaction = creature->GetFaction(); + } - if (FrostNova_Timer <= diff) + void Initialize() { - DoCast(me, SPELL_FROST_NOVA); - FrostNova_Timer = 20000; - } else FrostNova_Timer -= diff; + Silence_Timer = 2000; + Frostbolt_Timer = 4000; + FrostNova_Timer = 9000; + } - if (Frostbolt_Timer <= diff) + uint32 m_uiNormFaction; + uint32 Silence_Timer; + uint32 Frostbolt_Timer; + uint32 FrostNova_Timer; + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - DoCastVictim(SPELL_FROSTBOLT); - Frostbolt_Timer = 5000; - } else Frostbolt_Timer -= diff; + 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_ARAKKOA); + Talk(SAY_FLOON_ATTACK, player); + AttackStart(player); + } + return true; + } - DoMeleeAttackIfReady(); - } - }; + 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; + } + + void Reset() override + { + Initialize(); + if (me->GetFaction() != m_uiNormFaction) + me->SetFaction(m_uiNormFaction); + } + + void EnterCombat(Unit* /*who*/) override { } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + if (Silence_Timer <= diff) + { + DoCastVictim(SPELL_SILENCE); + Silence_Timer = 30000; + } else Silence_Timer -= diff; + + if (FrostNova_Timer <= diff) + { + DoCast(me, SPELL_FROST_NOVA); + FrostNova_Timer = 20000; + } else FrostNova_Timer -= diff; + + if (Frostbolt_Timer <= diff) + { + DoCastVictim(SPELL_FROSTBOLT); + Frostbolt_Timer = 5000; + } else Frostbolt_Timer -= diff; + + DoMeleeAttackIfReady(); + } + }; }; /*###### @@ -493,17 +495,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_N_NEUTRAL_PASSIVE); + if (quest->GetQuestId() == ESCAPE_FROM_FIREWING_POINT_H || quest->GetQuestId() == ESCAPE_FROM_FIREWING_POINT_A) + { + Start(true, false, player->GetGUID()); + me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); + } } - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { @@ -531,51 +532,64 @@ enum SkullPile class go_skull_pile : public GameObjectScript { -public: - go_skull_pile() : GameObjectScript("go_skull_pile") { } + public: + go_skull_pile() : GameObjectScript("go_skull_pile") { } - bool OnGossipSelect(Player* player, GameObject* go, uint32 sender, uint32 action) override - { - ClearGossipMenuFor(player); - switch (sender) + struct go_skull_pileAI : public GameObjectAI { - case GOSSIP_SENDER_MAIN: SendActionMenu(player, go, action); break; - } - return true; - } + go_skull_pileAI(GameObject* go) : GameObjectAI(go) { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if ((player->GetQuestStatus(ADVERSARIAL_BLOOD) == QUEST_STATUS_INCOMPLETE) || player->GetQuestRewardStatus(ADVERSARIAL_BLOOD)) + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + { + ClearGossipMenuFor(player); + switch (gossipListId) + { + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, me, gossipListId); + break; + } + return true; + } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + 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, me->GetGOInfo()->questgiver.gossipID, me->GetGUID()); + return true; + } + + private: + void SendActionMenu(Player* player, GameObject* /*go*/, uint32 action) const + { + 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 { - 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); + return new go_skull_pileAI(go); } - - SendGossipMenuFor(player, go->GetGOInfo()->questgiver.gossipID, go->GetGUID()); - return true; - } - - void SendActionMenu(Player* player, GameObject* /*go*/, uint32 action) - { - 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; - } - } }; /*###### @@ -591,30 +605,40 @@ enum Slim class npc_slim : public CreatureScript { -public: - npc_slim() : CreatureScript("npc_slim") { } + public: + npc_slim() : CreatureScript("npc_slim") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); - - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsVendor() && player->GetReputationRank(FACTION_CONSORTIUM) >= REP_FRIENDLY) + struct npc_slimAI : public ScriptedAI { - 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()); - } - else - SendGossipMenuFor(player, NPC_TEXT_NEITHER_SLIM_NOR_SHADY, creature->GetGUID()); + npc_slimAI(Creature* creature) : ScriptedAI(creature) { } - return true; - } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + ClearGossipMenuFor(player); + if (gossipListId == GOSSIP_ACTION_TRADE) + player->GetSession()->SendListInventory(me->GetGUID()); + + return true; + } + + bool GossipHello(Player* player) override + { + 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; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_slimAI(creature); + } }; /*######## @@ -629,57 +653,55 @@ enum Akuno class npc_akuno : public CreatureScript { -public: - npc_akuno() : CreatureScript("npc_akuno") { } + public: + npc_akuno() : CreatureScript("npc_akuno") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCAPING_THE_TOMB) + CreatureAI* GetAI(Creature* creature) const override { - 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_ESCORTEE_A_NEUTRAL_PASSIVE); - else - creature->SetFaction(FACTION_ESCORTEE_H_NEUTRAL_PASSIVE); + return new npc_akunoAI(creature); } - 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) { } - - void WaypointReached(uint32 waypointId) override + struct npc_akunoAI : public npc_escortAI { - Player* player = GetPlayerForEscort(); - if (!player) - return; + npc_akunoAI(Creature* creature) : npc_escortAI(creature) { } - switch (waypointId) + void QuestAccept(Player* player, Quest const* quest) override { - case 3: - me->SummonCreature(NPC_CABAL_SKRIMISHER, -2795.99f, 5420.33f, -34.53f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(NPC_CABAL_SKRIMISHER, -2793.55f, 5412.79f, -34.53f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - break; - case 11: - if (player->GetTypeId() == TYPEID_PLAYER) - player->GroupEventHappens(QUEST_ESCAPING_THE_TOMB, me); - break; - } - } + if (quest->GetQuestId() == QUEST_ESCAPING_THE_TOMB) + { + Start(false, false, player->GetGUID()); - void JustSummoned(Creature* summon) override - { - summon->AI()->AttackStart(me); - } - }; + if (player->GetTeamId() == TEAM_ALLIANCE) + me->SetFaction(FACTION_ESCORTEE_A_NEUTRAL_PASSIVE); + else + me->SetFaction(FACTION_ESCORTEE_H_NEUTRAL_PASSIVE); + } + } + + void WaypointReached(uint32 waypointId) override + { + Player* player = GetPlayerForEscort(); + if (!player) + return; + + switch (waypointId) + { + case 3: + me->SummonCreature(NPC_CABAL_SKRIMISHER, -2795.99f, 5420.33f, -34.53f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(NPC_CABAL_SKRIMISHER, -2793.55f, 5412.79f, -34.53f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + break; + case 11: + if (player->GetTypeId() == TYPEID_PLAYER) + player->GroupEventHappens(QUEST_ESCAPING_THE_TOMB, me); + break; + } + } + + void JustSummoned(Creature* summon) override + { + summon->AI()->AttackStart(me); + } + }; }; void AddSC_terokkar_forest() diff --git a/src/server/scripts/Outland/zone_zangarmarsh.cpp b/src/server/scripts/Outland/zone_zangarmarsh.cpp index 8baffeed086..e4d352f9229 100644 --- a/src/server/scripts/Outland/zone_zangarmarsh.cpp +++ b/src/server/scripts/Outland/zone_zangarmarsh.cpp @@ -60,91 +60,102 @@ enum AshyenAndKeleth class npcs_ashyen_and_keleth : public CreatureScript { -public: - npcs_ashyen_and_keleth() : CreatureScript("npcs_ashyen_and_keleth") { } + public: + npcs_ashyen_and_keleth() : CreatureScript("npcs_ashyen_and_keleth") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetReputationRank(942) > REP_NEUTRAL) + struct npcs_ashyen_and_kelethAI : public ScriptedAI { - if (creature->GetEntry() == NPC_ASHYEN) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_ASH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + npcs_ashyen_and_kelethAI(Creature* creature) : ScriptedAI(creature) { } - 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()); - - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - 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 + bool GossipHello(Player* player) override { - 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 (spell) + if (player->GetReputationRank(942) > REP_NEUTRAL) { - creature->CastSpell(player, spell, true); + if (me->GetEntry() == NPC_ASHYEN) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_ASH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + 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; } - if (creature->GetEntry() == NPC_KELETH) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - uint32 spell = 0; - switch (player->GetReputationRank(942)) //mark of war + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) { - 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; - } + 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) - { - creature->CastSpell(player, spell, true); + if (me->GetEntry() == NPC_ASHYEN) //check which Creature we are dealing with + { + 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 (spell) + { + me->CastSpell(player, spell, true); + } + } + + if (me->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) + { + me->CastSpell(player, spell, true); + } + } + CloseGossipMenuFor(player); + player->TalkedToCreature(me->GetEntry(), me->GetGUID()); } + return true; } - CloseGossipMenuFor(player); - player->TalkedToCreature(creature->GetEntry(), creature->GetGUID()); + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npcs_ashyen_and_kelethAI(creature); } - return true; - } }; /*###### @@ -165,64 +176,61 @@ enum Kayra class npc_kayra_longmane : public CreatureScript { -public: - npc_kayra_longmane() : CreatureScript("npc_kayra_longmane") { } + public: + npc_kayra_longmane() : CreatureScript("npc_kayra_longmane") { } - struct npc_kayra_longmaneAI : public npc_escortAI - { - npc_kayra_longmaneAI(Creature* creature) : npc_escortAI(creature) { } - - void Reset() override { } - - void WaypointReached(uint32 waypointId) override + struct npc_kayra_longmaneAI : public npc_escortAI { - Player* player = GetPlayerForEscort(); - if (!player) - return; + npc_kayra_longmaneAI(Creature* creature) : npc_escortAI(creature) { } - switch (waypointId) + void Reset() override { } + + void WaypointReached(uint32 waypointId) override { - case 4: - Talk(SAY_AMBUSH1, player); - DoSpawnCreature(NPC_SLAVEBINDER, -10.0f, -5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - DoSpawnCreature(NPC_SLAVEBINDER, -8.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - break; - case 5: - Talk(SAY_PROGRESS, player); - SetRun(); - break; - case 16: - Talk(SAY_AMBUSH2, player); - DoSpawnCreature(NPC_SLAVEBINDER, -10.0f, -5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - DoSpawnCreature(NPC_SLAVEBINDER, -8.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - break; - case 17: - SetRun(false); - break; - case 25: - Talk(SAY_END, player); - player->GroupEventHappens(QUEST_ESCAPE_FROM, me); - break; + Player* player = GetPlayerForEscort(); + if (!player) + return; + + switch (waypointId) + { + case 4: + Talk(SAY_AMBUSH1, player); + DoSpawnCreature(NPC_SLAVEBINDER, -10.0f, -5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + DoSpawnCreature(NPC_SLAVEBINDER, -8.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + break; + case 5: + Talk(SAY_PROGRESS, player); + SetRun(); + break; + case 16: + Talk(SAY_AMBUSH2, player); + DoSpawnCreature(NPC_SLAVEBINDER, -10.0f, -5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + DoSpawnCreature(NPC_SLAVEBINDER, -8.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + break; + case 17: + SetRun(false); + break; + case 25: + Talk(SAY_END, player); + player->GroupEventHappens(QUEST_ESCAPE_FROM, me); + 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 + { + if (quest->GetQuestId() == QUEST_ESCAPE_FROM) + { + Talk(SAY_START, player); + Start(false, false, player->GetGUID()); + } + } + }; + + CreatureAI* GetAI(Creature* creature) const 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()); + return new npc_kayra_longmaneAI(creature); } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_kayra_longmaneAI(creature); - } }; /*###### diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp index 3d5369b45ef..474b3bdf461 100644 --- a/src/server/scripts/World/go_scripts.cpp +++ b/src/server/scripts/World/go_scripts.cpp @@ -65,14 +65,24 @@ enum CatFigurine class go_cat_figurine : public GameObjectScript { -public: - go_cat_figurine() : GameObjectScript("go_cat_figurine") { } + public: + go_cat_figurine() : GameObjectScript("go_cat_figurine") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - player->CastSpell(player, SPELL_SUMMON_GHOST_SABER, true); - return false; - } + struct go_cat_figurineAI : public GameObjectAI + { + 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); + } }; /*###### @@ -81,16 +91,26 @@ public: class go_barov_journal : public GameObjectScript { -public: - go_barov_journal() : GameObjectScript("go_barov_journal") { } + public: + go_barov_journal() : GameObjectScript("go_barov_journal") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 280 && !player->HasSpell(26086)) - player->CastSpell(player, 26095, false); + struct go_barov_journalAI : public GameObjectAI + { + go_barov_journalAI(GameObject* go) : GameObjectAI(go) { } - return true; - } + 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; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_barov_journalAI(go); + } }; /*###### @@ -105,21 +125,31 @@ enum GildedBrazier class go_gilded_brazier : public GameObjectScript { -public: - go_gilded_brazier() : GameObjectScript("go_gilded_brazier") { } + public: + go_gilded_brazier() : GameObjectScript("go_gilded_brazier") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + struct go_gilded_brazierAI : public GameObjectAI { - if (player->GetQuestStatus(QUEST_THE_FIRST_TRIAL) == QUEST_STATUS_INCOMPLETE) + go_gilded_brazierAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - if (Creature* Stillblade = player->SummonCreature(NPC_STILLBLADE, 8106.11f, -7542.06f, 151.775f, 3.02598f, TEMPSUMMON_DEAD_DESPAWN, 60000)) - Stillblade->AI()->AttackStart(player); + if (me->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + { + 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; } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_gilded_brazierAI(go); } - return true; - } }; /*###### @@ -128,16 +158,26 @@ public: class go_orb_of_command : public GameObjectScript { -public: - go_orb_of_command() : GameObjectScript("go_orb_of_command") { } + public: + go_orb_of_command() : GameObjectScript("go_orb_of_command") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->GetQuestRewardStatus(7761)) - player->CastSpell(player, 23460, true); + struct go_orb_of_commandAI : public GameObjectAI + { + go_orb_of_commandAI(GameObject* go) : GameObjectAI(go) { } - return true; - } + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->GetQuestRewardStatus(7761)) + player->CastSpell(player, 23460, true); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_orb_of_commandAI(go); + } }; /*###### @@ -146,16 +186,26 @@ public: class go_tablet_of_madness : public GameObjectScript { -public: - go_tablet_of_madness() : GameObjectScript("go_tablet_of_madness") { } + public: + go_tablet_of_madness() : GameObjectScript("go_tablet_of_madness") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->HasSkill(SKILL_ALCHEMY) && player->GetSkillValue(SKILL_ALCHEMY) >= 300 && !player->HasSpell(24266)) - player->CastSpell(player, 24267, false); + struct go_tablet_of_madnessAI : public GameObjectAI + { + 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); + } }; /*###### @@ -164,20 +214,30 @@ public: class go_tablet_of_the_seven : public GameObjectScript { -public: - go_tablet_of_the_seven() : GameObjectScript("go_tablet_of_the_seven") { } + 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 - { - if (go->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) - return true; + struct go_tablet_of_the_sevenAI : public GameObjectAI + { + go_tablet_of_the_sevenAI(GameObject* go) : GameObjectAI(go) { } - if (player->GetQuestStatus(4296) == QUEST_STATUS_INCOMPLETE) - player->CastSpell(player, 15065, false); + /// @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; - return true; - } + if (player->GetQuestStatus(4296) == QUEST_STATUS_INCOMPLETE) + player->CastSpell(player, 15065, false); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_tablet_of_the_sevenAI(go); + } }; /*##### @@ -186,16 +246,26 @@ public: class go_jump_a_tron : public GameObjectScript { -public: - go_jump_a_tron() : GameObjectScript("go_jump_a_tron") { } + public: + go_jump_a_tron() : GameObjectScript("go_jump_a_tron") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->GetQuestStatus(10111) == QUEST_STATUS_INCOMPLETE) - player->CastSpell(player, 33382, true); + struct go_jump_a_tronAI : public GameObjectAI + { + go_jump_a_tronAI(GameObject* go) : GameObjectAI(go) { } - return true; - } + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->GetQuestStatus(10111) == QUEST_STATUS_INCOMPLETE) + player->CastSpell(player, 33382, true); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_jump_a_tronAI(go); + } }; /*###### @@ -220,43 +290,53 @@ const uint32 NpcPrisonEntry[] = class go_ethereum_prison : public GameObjectScript { -public: - go_ethereum_prison() : GameObjectScript("go_ethereum_prison") { } + public: + go_ethereum_prison() : GameObjectScript("go_ethereum_prison") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - go->UseDoorOrButton(); - int Random = rand32() % (sizeof(NpcPrisonEntry) / sizeof(uint32)); - - if (Creature* creature = player->SummonCreature(NpcPrisonEntry[Random], go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), - TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) + struct go_ethereum_prisonAI : public GameObjectAI { - if (!creature->IsHostileTo(player)) + go_ethereum_prisonAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - if (FactionTemplateEntry const* pFaction = creature->GetFactionTemplateEntry()) + 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)) { - uint32 Spell = 0; - - switch (pFaction->faction) + if (!creature->IsHostileTo(player)) { - 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 (FactionTemplateEntry const* pFaction = creature->GetFactionTemplateEntry()) + { + uint32 Spell = 0; + + 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()); + } } - - 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); + } }; /*###### @@ -270,19 +350,29 @@ const uint32 NpcStasisEntry[] = class go_ethereum_stasis : public GameObjectScript { -public: - go_ethereum_stasis() : GameObjectScript("go_ethereum_stasis") { } + public: + go_ethereum_stasis() : GameObjectScript("go_ethereum_stasis") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - go->UseDoorOrButton(); - int Random = rand32() % (sizeof(NpcStasisEntry) / sizeof(uint32)); + struct go_ethereum_stasisAI : public GameObjectAI + { + 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)); - return false; - } + player->SummonCreature(NpcStasisEntry[Random], me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetAngle(player), + TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_ethereum_stasisAI(go); + } }; /*###### @@ -296,16 +386,26 @@ enum ResoniteCask class go_resonite_cask : public GameObjectScript { -public: - go_resonite_cask() : GameObjectScript("go_resonite_cask") { } + public: + go_resonite_cask() : GameObjectScript("go_resonite_cask") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - 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); + struct go_resonite_caskAI : public GameObjectAI + { + go_resonite_caskAI(GameObject* go) : GameObjectAI(go) { } - return false; - } + 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; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_resonite_caskAI(go); + } }; /*###### @@ -319,16 +419,26 @@ enum SacredFireOfLife class go_sacred_fire_of_life : public GameObjectScript { -public: - go_sacred_fire_of_life() : GameObjectScript("go_sacred_fire_of_life") { } + public: + go_sacred_fire_of_life() : GameObjectScript("go_sacred_fire_of_life") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - 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); + struct go_sacred_fire_of_lifeAI : public GameObjectAI + { + go_sacred_fire_of_lifeAI(GameObject* go) : GameObjectAI(go) { } - return true; - } + 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; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_sacred_fire_of_lifeAI(go); + } }; /*###### @@ -347,34 +457,44 @@ enum ShrineOfTheBirds class go_shrine_of_the_birds : public GameObjectScript { -public: - go_shrine_of_the_birds() : GameObjectScript("go_shrine_of_the_birds") { } + public: + go_shrine_of_the_birds() : GameObjectScript("go_shrine_of_the_birds") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - uint32 BirdEntry = 0; - - float fX, fY, fZ; - go->GetClosePoint(fX, fY, fZ, go->GetObjectSize(), INTERACTION_DISTANCE); - - switch (go->GetEntry()) + struct go_shrine_of_the_birdsAI : public GameObjectAI { - 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; + go_shrine_of_the_birdsAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + uint32 BirdEntry = 0; + + float fX, fY, fZ; + me->GetClosePoint(fX, fY, fZ, me->GetObjectSize(), 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; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_shrine_of_the_birdsAI(go); } - - if (BirdEntry) - player->SummonCreature(BirdEntry, fX, fY, fZ, go->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - - return false; - } }; /*###### @@ -390,19 +510,29 @@ enum Southfury class go_southfury_moonstone : public GameObjectScript { -public: - go_southfury_moonstone() : GameObjectScript("go_southfury_moonstone") { } + public: + go_southfury_moonstone() : GameObjectScript("go_southfury_moonstone") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) 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); + struct go_southfury_moonstoneAI : public GameObjectAI + { + go_southfury_moonstoneAI(GameObject* go) : GameObjectAI(go) { } - 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); + 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); - return 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; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_southfury_moonstoneAI(go); + } }; /*###### @@ -419,18 +549,28 @@ enum DalaranCrystal class go_tele_to_dalaran_crystal : public GameObjectScript { -public: - go_tele_to_dalaran_crystal() : GameObjectScript("go_tele_to_dalaran_crystal") { } + public: + go_tele_to_dalaran_crystal() : GameObjectScript("go_tele_to_dalaran_crystal") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->GetQuestRewardStatus(QUEST_TELE_CRYSTAL_FLAG)) - return false; + struct go_tele_to_dalaran_crystalAI : public GameObjectAI + { + 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; - return true; - } + player->GetSession()->SendNotification(GO_TELE_TO_DALARAN_CRYSTAL_FAILED); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_tele_to_dalaran_crystalAI(go); + } }; /*###### @@ -439,16 +579,26 @@ public: class go_tele_to_violet_stand : public GameObjectScript { -public: - go_tele_to_violet_stand() : GameObjectScript("go_tele_to_violet_stand") { } + public: + go_tele_to_violet_stand() : GameObjectScript("go_tele_to_violet_stand") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->GetQuestRewardStatus(QUEST_LEARN_LEAVE_RETURN) || player->GetQuestStatus(QUEST_LEARN_LEAVE_RETURN) == QUEST_STATUS_INCOMPLETE) - return false; + struct go_tele_to_violet_standAI : public GameObjectAI + { + go_tele_to_violet_standAI(GameObject* go) : GameObjectAI(go) { } - return true; - } + 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; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_tele_to_violet_standAI(go); + } }; /*###### @@ -469,45 +619,56 @@ enum FelCrystalforge class go_fel_crystalforge : public GameObjectScript { -public: - go_fel_crystalforge() : GameObjectScript("go_fel_crystalforge") { } + public: + go_fel_crystalforge() : GameObjectScript("go_fel_crystalforge") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (go->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ - player->PrepareQuestMenu(go->GetGUID()); /* return true*/ - - 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()); - - return true; - } - - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + struct go_fel_crystalforgeAI : public GameObjectAI { - 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: + go_fel_crystalforgeAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (me->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ + player->PrepareQuestMenu(me->GetGUID()); /* return true*/ + 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; + + SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_TEXT, me->GetGUID()); + + return 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: + 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; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_fel_crystalforgeAI(go); } - return true; - } }; /*###### @@ -528,45 +689,56 @@ enum BashirCrystalforge class go_bashir_crystalforge : public GameObjectScript { -public: - go_bashir_crystalforge() : GameObjectScript("go_bashir_crystalforge") { } + public: + go_bashir_crystalforge() : GameObjectScript("go_bashir_crystalforge") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (go->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ - player->PrepareQuestMenu(go->GetGUID()); /* return true*/ - - 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()); - - return true; - } - - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + struct go_bashir_crystalforgeAI : public GameObjectAI { - 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: + go_bashir_crystalforgeAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (me->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ + player->PrepareQuestMenu(me->GetGUID()); /* return true*/ + 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; + + SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_TEXT, me->GetGUID()); + + return 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: + 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; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_bashir_crystalforgeAI(go); } - return true; - } }; /*###### @@ -592,46 +764,56 @@ enum MatrixPunchograph class go_matrix_punchograph : public GameObjectScript { -public: - go_matrix_punchograph() : GameObjectScript("go_matrix_punchograph") { } + public: + go_matrix_punchograph() : GameObjectScript("go_matrix_punchograph") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - switch (go->GetEntry()) + struct go_matrix_punchographAI : public GameObjectAI { - case MATRIX_PUNCHOGRAPH_3005_A: - if (player->HasItemCount(ITEM_WHITE_PUNCH_CARD)) + go_matrix_punchographAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + switch (me->GetEntry()) { - player->DestroyItemCount(ITEM_WHITE_PUNCH_CARD, 1, true); - player->CastSpell(player, SPELL_YELLOW_PUNCH_CARD, true); + 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; } - 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; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_matrix_punchographAI(go); } - return false; - } }; /*###### @@ -645,20 +827,30 @@ enum ScourgeCage class go_scourge_cage : public GameObjectScript { -public: - go_scourge_cage() : GameObjectScript("go_scourge_cage") { } + public: + go_scourge_cage() : GameObjectScript("go_scourge_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - go->UseDoorOrButton(); - if (Creature* pNearestPrisoner = go->FindNearestCreature(NPC_SCOURGE_PRISONER, 5.0f, true)) + struct go_scourge_cageAI : public GameObjectAI { - player->KilledMonsterCredit(NPC_SCOURGE_PRISONER, pNearestPrisoner->GetGUID()); - pNearestPrisoner->DisappearAndDie(); - } + go_scourge_cageAI(GameObject* go) : GameObjectAI(go) { } - return true; - } + bool GossipHello(Player* player, bool /*reportUse*/) override + { + me->UseDoorOrButton(); + if (Creature* pNearestPrisoner = me->FindNearestCreature(NPC_SCOURGE_PRISONER, 5.0f, true)) + { + player->KilledMonsterCredit(NPC_SCOURGE_PRISONER, pNearestPrisoner->GetGUID()); + pNearestPrisoner->DisappearAndDie(); + } + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_scourge_cageAI(go); + } }; /*###### @@ -673,19 +865,29 @@ enum ArcanePrison class go_arcane_prison : public GameObjectScript { -public: - go_arcane_prison() : GameObjectScript("go_arcane_prison") { } + public: + go_arcane_prison() : GameObjectScript("go_arcane_prison") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (player->GetQuestStatus(QUEST_PRISON_BREAK) == QUEST_STATUS_INCOMPLETE) + struct go_arcane_prisonAI : public GameObjectAI { - 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; + go_arcane_prisonAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + 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; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_arcane_prisonAI(go); } - return false; - } }; /*###### @@ -700,16 +902,26 @@ enum BloodFilledOrb class go_blood_filled_orb : public GameObjectScript { -public: - go_blood_filled_orb() : GameObjectScript("go_blood_filled_orb") { } + public: + go_blood_filled_orb() : GameObjectScript("go_blood_filled_orb") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - 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); + struct go_blood_filled_orbAI : public GameObjectAI + { + go_blood_filled_orbAI(GameObject* go) : GameObjectAI(go) { } - return true; - } + 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; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_blood_filled_orbAI(go); + } }; /*###### @@ -731,45 +943,55 @@ enum JotunheimCage class go_jotunheim_cage : public GameObjectScript { -public: - go_jotunheim_cage() : GameObjectScript("go_jotunheim_cage") { } + public: + go_jotunheim_cage() : GameObjectScript("go_jotunheim_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - go->UseDoorOrButton(); - Creature* pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_HUMAN, 5.0f, true); - if (!pPrisoner) + struct go_jotunheim_cageAI : public GameObjectAI { - pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_TROLL, 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_ORC, 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_NE, 5.0f, true); - } - } - if (!pPrisoner || !pPrisoner->IsAlive()) - return false; + { + pPrisoner = me->FindNearestCreature(NPC_EBON_BLADE_PRISONER_TROLL, 5.0f, true); + if (!pPrisoner) + { + 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; - pPrisoner->DisappearAndDie(); - player->KilledMonsterCredit(NPC_EBON_BLADE_PRISONER_HUMAN); - switch (pPrisoner->GetEntry()) + 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; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override { - 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 new go_jotunheim_cageAI(go); } - return true; - } }; enum TableTheka @@ -781,18 +1003,28 @@ enum TableTheka class go_table_theka : public GameObjectScript { -public: - go_table_theka() : GameObjectScript("go_table_theka") { } + public: + go_table_theka() : GameObjectScript("go_table_theka") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (player->GetQuestStatus(QUEST_SPIDER_GOLD) == QUEST_STATUS_INCOMPLETE) - player->AreaExploredOrEventHappens(QUEST_SPIDER_GOLD); + struct go_table_thekaAI : public GameObjectAI + { + 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); + } }; /*###### @@ -807,18 +1039,28 @@ enum InconspicuousLandmark class go_inconspicuous_landmark : public GameObjectScript { -public: - go_inconspicuous_landmark() : GameObjectScript("go_inconspicuous_landmark") { } + public: + go_inconspicuous_landmark() : GameObjectScript("go_inconspicuous_landmark") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->HasItemCount(ITEM_CUERGOS_KEY)) - return false; + struct go_inconspicuous_landmarkAI : public GameObjectAI + { + go_inconspicuous_landmarkAI(GameObject* go) : GameObjectAI(go) { } - player->CastSpell(player, SPELL_SUMMON_PIRATES_TREASURE_AND_TRIGGER_MOB, true); + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->HasItemCount(ITEM_CUERGOS_KEY)) + return false; - return true; - } + player->CastSpell(player, SPELL_SUMMON_PIRATES_TREASURE_AND_TRIGGER_MOB, true); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_inconspicuous_landmarkAI(go); + } }; /*###### @@ -842,7 +1084,7 @@ class go_soulwell : public GameObjectScript /// on the well. We have to find how to segregate REPORT_USE and USE. 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; @@ -871,39 +1113,49 @@ enum PrisonersOfWyrmskull class go_dragonflayer_cage : public GameObjectScript { -public: - go_dragonflayer_cage() : GameObjectScript("go_dragonflayer_cage") { } + public: + go_dragonflayer_cage() : GameObjectScript("go_dragonflayer_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_PRISONERS_OF_WYRMSKULL) != QUEST_STATUS_INCOMPLETE) - return true; - - Creature* pPrisoner = go->FindNearestCreature(NPC_PRISONER_PRIEST, 2.0f); - if (!pPrisoner) + struct go_dragonflayer_cageAI : public GameObjectAI { - pPrisoner = go->FindNearestCreature(NPC_PRISONER_MAGE, 2.0f); - if (!pPrisoner) + go_dragonflayer_cageAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - pPrisoner = go->FindNearestCreature(NPC_PRISONER_WARRIOR, 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_PALADIN, 2.0f); + { + pPrisoner = me->FindNearestCreature(NPC_PRISONER_MAGE, 2.0f); + if (!pPrisoner) + { + pPrisoner = me->FindNearestCreature(NPC_PRISONER_WARRIOR, 2.0f); + if (!pPrisoner) + pPrisoner = me->FindNearestCreature(NPC_PRISONER_PALADIN, 2.0f); + } + } + + if (!pPrisoner || !pPrisoner->IsAlive()) + return true; + + Quest const* qInfo = sObjectMgr->GetQuestTemplate(QUEST_PRISONERS_OF_WYRMSKULL); + if (qInfo) + { + /// @todo prisoner should help player for a short period of time + player->KilledMonsterCredit(qInfo->RequiredNpcOrGo[0]); + pPrisoner->DisappearAndDie(); + } + return true; } - } + }; - if (!pPrisoner || !pPrisoner->IsAlive()) - return true; - - Quest const* qInfo = sObjectMgr->GetQuestTemplate(QUEST_PRISONERS_OF_WYRMSKULL); - if (qInfo) + GameObjectAI* GetAI(GameObject* go) const override { - /// @todo prisoner should help player for a short period of time - player->KilledMonsterCredit(qInfo->RequiredNpcOrGo[0]); - pPrisoner->DisappearAndDie(); + return new go_dragonflayer_cageAI(go); } - return true; - } }; /*###### @@ -927,47 +1179,58 @@ enum AmberpineOuthouse class go_amberpine_outhouse : public GameObjectScript { -public: - go_amberpine_outhouse() : GameObjectScript("go_amberpine_outhouse") { } + public: + go_amberpine_outhouse() : GameObjectScript("go_amberpine_outhouse") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - QuestStatus status = player->GetQuestStatus(QUEST_DOING_YOUR_DUTY); - if (status == QUEST_STATUS_INCOMPLETE || status == QUEST_STATUS_COMPLETE || status == QUEST_STATUS_REWARDED) + struct go_amberpine_outhouseAI : public GameObjectAI { - 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()); + go_amberpine_outhouseAI(GameObject* go) : GameObjectAI(go) { } - return true; - } - - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF +1) - { - CloseGossipMenuFor(player); - Creature* target = GetClosestCreatureWithEntry(player, NPC_OUTHOUSE_BUNNY, 3.0f); - if (target) + bool GossipHello(Player* player, bool /*reportUse*/) override { - target->AI()->SetData(1, player->getGender()); - go->CastSpell(target, SPELL_INDISPOSED_III); + 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, me->GetGUID()); + } + else + SendGossipMenuFor(player, GOSSIP_OUTHOUSE_INUSE, me->GetGUID()); + + return true; } - go->CastSpell(player, SPELL_INDISPOSED); - if (player->HasItemCount(ITEM_ANDERHOLS_SLIDER_CIDER)) - go->CastSpell(player, SPELL_CREATE_AMBERSEEDS); - return true; - } - else + + 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); + 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 { - CloseGossipMenuFor(player); - player->GetSession()->SendNotification(GO_ANDERHOLS_SLIDER_CIDER_NOT_FOUND); - return false; + return new go_amberpine_outhouseAI(go); } - } }; /*###### @@ -983,16 +1246,26 @@ enum Hives class go_hive_pod : public GameObjectScript { -public: - go_hive_pod() : GameObjectScript("go_hive_pod") { } + public: + go_hive_pod() : GameObjectScript("go_hive_pod") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - 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; - } + struct go_hive_podAI : public GameObjectAI + { + 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); + } }; class go_massive_seaforium_charge : public GameObjectScript @@ -1000,10 +1273,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); } }; @@ -1023,23 +1306,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 childrenList; - GetCreatureListWithEntryInGrid(childrenList, go, NPC_CAPTIVE_CHILD, INTERACTION_DISTANCE); - for (std::list::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::list childrenList; + GetCreatureListWithEntryInGrid(childrenList, me, NPC_CAPTIVE_CHILD, INTERACTION_DISTANCE); + for (std::list::const_iterator itr = childrenList.begin(); itr != childrenList.end(); ++itr) + { + player->KilledMonsterCredit(NPC_CAPTIVE_CHILD, (*itr)->GetGUID()); + (*itr)->DespawnOrUnsummon(5000); + (*itr)->GetMotionMaster()->MovePoint(1, me->GetPositionX() + 5, me->GetPositionY(), me->GetPositionZ()); + (*itr)->AI()->Talk(SAY_FREE_0); + (*itr)->GetMotionMaster()->Clear(); + } } + return false; } - return false; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_veil_skith_cageAI(go); } }; @@ -1057,20 +1350,30 @@ enum TheCleansing class go_frostblade_shrine : public GameObjectScript { -public: - go_frostblade_shrine() : GameObjectScript("go_frostblade_shrine") { } + public: + go_frostblade_shrine() : GameObjectScript("go_frostblade_shrine") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - 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) + struct go_frostblade_shrineAI : public GameObjectAI + { + go_frostblade_shrineAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - player->CastSpell(player, SPELL_CLEANSING_SOUL); - player->SetStandState(UNIT_STAND_STATE_SIT); + me->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) + { + 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); + } }; /*###### @@ -1084,15 +1387,25 @@ enum MidsummerBonfire class go_midsummer_bonfire : public GameObjectScript { -public: - go_midsummer_bonfire() : GameObjectScript("go_midsummer_bonfire") { } + public: + go_midsummer_bonfire() : GameObjectScript("go_midsummer_bonfire") { } - bool OnGossipSelect(Player* player, GameObject* /*go*/, uint32 /*sender*/, uint32 /*action*/) override - { - player->CastSpell(player, STAMP_OUT_BONFIRE_QUEST_COMPLETE, true); - CloseGossipMenuFor(player); - return false; - } + struct go_midsummer_bonfireAI : public GameObjectAI + { + go_midsummer_bonfireAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) 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); + } }; enum MidsummerPoleRibbon @@ -1105,18 +1418,28 @@ enum MidsummerPoleRibbon class go_midsummer_ribbon_pole : public GameObjectScript { -public: - go_midsummer_ribbon_pole() : GameObjectScript("go_midsummer_ribbon_pole") { } + public: + go_midsummer_ribbon_pole() : GameObjectScript("go_midsummer_ribbon_pole") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (Creature* creature = go->FindNearestCreature(NPC_POLE_RIBBON_BUNNY, 10.0f)) + struct go_midsummer_ribbon_poleAI : public GameObjectAI { - creature->GetAI()->DoAction(ACTION_COSMETIC_FIRES); - player->CastSpell(creature, SPELL_POLE_DANCE, true); + go_midsummer_ribbon_poleAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + 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; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_midsummer_ribbon_poleAI(go); } - return true; - } }; enum ToyTrainSpells @@ -1139,7 +1462,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; } } @@ -1147,7 +1470,7 @@ class go_toy_train_set : public GameObjectScript // triggered on wrecker'd void DoAction(int32 /*action*/) override { - go->Delete(); + me->Delete(); } private: @@ -1239,39 +1562,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; } } @@ -1332,13 +1655,13 @@ public: break; std::vector 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; @@ -1394,7 +1717,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: @@ -1448,7 +1771,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: @@ -1514,16 +1837,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; @@ -1559,7 +1882,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 837ac0e9fe8..3755217f150 100644 --- a/src/server/scripts/World/npc_innkeeper.cpp +++ b/src/server/scripts/World/npc_innkeeper.cpp @@ -53,102 +53,114 @@ enum Spells class npc_innkeeper : public CreatureScript { -public: - npc_innkeeper() : CreatureScript("npc_innkeeper") { } + public: + npc_innkeeper() : CreatureScript("npc_innkeeper") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED)) + struct npc_innkeeperAI : public ScriptedAI { - 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); - } + npc_innkeeperAI(Creature* creature) : ScriptedAI(creature) { } - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (creature->IsVendor()) + bool GossipHello(Player* player) override { - char const* localizedEntry; - switch (player->GetSession()->GetSessionDbcLocale()) + if (IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED)) { - case LOCALE_frFR: localizedEntry = LOCALE_VENDOR_2; break; - case LOCALE_deDE: localizedEntry = LOCALE_VENDOR_3; break; - case LOCALE_esES: localizedEntry = LOCALE_VENDOR_6; break; - case LOCALE_enUS: default: localizedEntry = LOCALE_VENDOR_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_VENDOR, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - } - if (creature->IsInnkeeper()) - { - const char* localizedEntry; - switch (player->GetSession()->GetSessionDbcLocale()) - { - case LOCALE_frFR: localizedEntry = LOCALE_INNKEEPER_2; break; - case LOCALE_deDE: localizedEntry = LOCALE_INNKEEPER_3; break; - case LOCALE_esES: localizedEntry = LOCALE_INNKEEPER_6; break; - case LOCALE_enUS: default: localizedEntry = LOCALE_INNKEEPER_0; - } - AddGossipItemFor(player, GOSSIP_ICON_INTERACT_1, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INN); - } + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - player->TalkedToCreature(creature->GetEntry(), creature->GetGUID()); - 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 && IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED)) - { - player->CastSpell(player, SPELL_TRICK_OR_TREATED, true); - - if (urand(0, 1)) - player->CastSpell(player, SPELL_TREAT, true); - else - { - uint32 trickspell = 0; - switch (urand(0, 13)) + if (me->IsVendor()) { - 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 + char const* localizedEntry; + switch (player->GetSession()->GetSessionDbcLocale()) + { + case LOCALE_frFR: localizedEntry = LOCALE_VENDOR_2; break; + case LOCALE_deDE: localizedEntry = LOCALE_VENDOR_3; break; + case LOCALE_esES: localizedEntry = LOCALE_VENDOR_6; break; + case LOCALE_enUS: default: localizedEntry = LOCALE_VENDOR_0; + } + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); } - player->CastSpell(player, trickspell, true); + + + if (me->IsInnkeeper()) + { + const char* localizedEntry; + switch (player->GetSession()->GetSessionDbcLocale()) + { + case LOCALE_frFR: localizedEntry = LOCALE_INNKEEPER_2; break; + case LOCALE_deDE: localizedEntry = LOCALE_INNKEEPER_3; break; + case LOCALE_esES: localizedEntry = LOCALE_INNKEEPER_6; break; + case LOCALE_enUS: default: localizedEntry = LOCALE_INNKEEPER_0; + } + AddGossipItemFor(player, GOSSIP_ICON_INTERACT_1, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INN); + } + + player->TalkedToCreature(me->GetEntry(), me->GetGUID()); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; } - CloseGossipMenuFor(player); - return true; - } - CloseGossipMenuFor(player); + 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 && IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED)) + { + player->CastSpell(player, SPELL_TRICK_OR_TREATED, true); - switch (action) + if (urand(0, 1)) + player->CastSpell(player, SPELL_TREAT, true); + else + { + 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); + } + 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; + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - case GOSSIP_ACTION_TRADE: player->GetSession()->SendListInventory(creature->GetGUID()); break; - case GOSSIP_ACTION_INN: player->SetBindPoint(creature->GetGUID()); break; + return new npc_innkeeperAI(creature); } - return true; - } }; void AddSC_npc_innkeeper() diff --git a/src/server/scripts/World/npc_professions.cpp b/src/server/scripts/World/npc_professions.cpp index 38fd29c5e5a..c359c8d0276 100644 --- a/src/server/scripts/World/npc_professions.cpp +++ b/src/server/scripts/World/npc_professions.cpp @@ -381,224 +381,237 @@ 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()); - - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - - if (creature->IsTrainer()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); - - uint32 creatureId = creature->GetEntry(); - //WEAPONSMITH & ARMORSMITH - if (player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 225) + bool GossipHello(Player* player) override { - switch (creatureId) + 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); + + 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; - } - } - //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(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->GetGUID()); - break; - //Learn Armor/Weapon - case GOSSIP_ACTION_INFO_DEF + 1: - if (!player->HasSpell(S_ARMOR)) + switch (creatureId) { - player->CastSpell(player, S_LEARN_ARMOR, true); - //_Creature->CastSpell(player, S_REP_ARMOR, true); + 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; } - 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)) - { - //unknown textID (TALK_MUST_UNLEARN_WEAPON) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - } - 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) - { - switch (creature->GetEntry()) + } + //WEAPONSMITH SPEC + if (player->HasSpell(S_WEAPON) && player->getLevel() > 49 && player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 250) { - 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()); + 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; + } + + 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); + switch (sender) + { + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, action); 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()); + + case GOSSIP_SENDER_LEARN: + SendConfirmLearn(player, action); 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()); + + case GOSSIP_SENDER_UNLEARN: + SendConfirmUnlearn(player, action); + break; + + case GOSSIP_SENDER_CHECK: + SendActionMenu(player, action); + break; + } + return true; + } + + private: + bool HasWeaponSub(Player* player) const + { + return (player->HasSpell(S_HAMMER) || player->HasSpell(S_AXE) || player->HasSpell(S_SWORD)); + } + + void SendConfirmLearn(Player* player, uint32 action) const + { + if (action) + { + switch (me->GetEntry()) + { + 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; + } + } + } + + void SendConfirmUnlearn(Player* player, uint32 action) const + { + if (action) + { + 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 SendActionMenu(Player* player, uint32 action) const + { + switch (action) + { + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(me->GetGUID()); + break; + case GOSSIP_ACTION_TRAIN: + player->GetSession()->SendTrainerList(me->GetGUID()); + 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)) + { + //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; } } - } + }; - void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) + CreatureAI* GetAI(Creature* creature) const override { - if (action) - { - switch (creature->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(creature), creature->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(creature), creature->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(creature), creature->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(creature), creature->GetGUID()); - break; - } - } - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) 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); } }; @@ -633,86 +646,100 @@ 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 GossipHello(Player* player) override { - if (!player->HasSpell(spellId)) - res = true; - else - npcTextId = altTextId; + 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; } - return res; - } - bool OnGossipHello(Player* player, Creature* creature) override - { - uint32 npcTextId = 0; - std::string gossipItem; - bool canLearn = false; - - 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; + private: + bool CanLearn(Player* player, uint32 textId, uint32 altTextId, uint32 skillValue, uint32 reqSpellId, uint32 spellId, uint32& npcTextId) const + { + 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; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_engineering_tele_trinketAI(creature); } }; @@ -722,116 +749,129 @@ public: class npc_prof_leather : public CreatureScript { -public: - npc_prof_leather() : CreatureScript("npc_prof_leather") { } + public: + npc_prof_leather() : CreatureScript("npc_prof_leather") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - - if (creature->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) + struct npc_prof_leatherAI : public ScriptedAI { - switch (creature->GetEntry()) + npc_prof_leatherAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override { - 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 (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); + + 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; + } + } + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; } - } - 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->GetGUID()); - 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; - } - } - - void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) - { - if (action) - { - switch (creature->GetEntry()) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - 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()); - 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()); - 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()); - 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, me, action); + break; + + case GOSSIP_SENDER_UNLEARN: + SendConfirmUnlearn(player, me, action); + break; + + case GOSSIP_SENDER_CHECK: + SendActionMenu(player, me, action); + break; + } + return true; } - } - } - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override - { - ClearGossipMenuFor(player); - switch (sender) + private: + void SendActionMenu(Player* player, Creature* creature, uint32 action) const + { + switch (action) + { + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(creature->GetGUID()); + break; + case GOSSIP_ACTION_TRAIN: + player->GetSession()->SendTrainerList(creature->GetGUID()); + 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; + } + } + + void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) const + { + if (action) + { + switch (creature->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(creature), creature->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(creature), creature->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(creature), creature->GetGUID()); + break; + } + } + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - 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 new npc_prof_leatherAI(creature); } - return true; - } }; /*### @@ -840,164 +880,177 @@ public: class npc_prof_tailor : public CreatureScript { -public: - npc_prof_tailor() : CreatureScript("npc_prof_tailor") { } + public: + npc_prof_tailor() : CreatureScript("npc_prof_tailor") { } - inline bool HasTailorSpell(Player* player) - { - return (player->HasSpell(S_MOONCLOTH) || player->HasSpell(S_SHADOWEAVE) || player->HasSpell(S_SPELLFIRE)); - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - - if (creature->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) + struct npc_prof_tailorAI : public ScriptedAI { - if (player->GetQuestRewardStatus(10831) || player->GetQuestRewardStatus(10832) || player->GetQuestRewardStatus(10833)) + npc_prof_tailorAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override { - switch (creature->GetEntry()) + 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) { - 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); + 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; + } + } + } + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + 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); + switch (sender) + { + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, action); 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); + + case GOSSIP_SENDER_LEARN: + SendConfirmLearn(player, action); 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); + + case GOSSIP_SENDER_UNLEARN: + SendConfirmUnlearn(player, action); + break; + + case GOSSIP_SENDER_CHECK: + SendActionMenu(player, action); + break; + } + return true; + } + + private: + bool HasTailorSpell(Player* player) const + { + return (player->HasSpell(S_MOONCLOTH) || player->HasSpell(S_SHADOWEAVE) || player->HasSpell(S_SPELLFIRE)); + } + + 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->GetGUID()); + 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; } } - } - 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->GetGUID()); - 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) - { - switch (creature->GetEntry()) + void SendConfirmLearn(Player* player, uint32 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; + if (action) + { + switch (me->GetEntry()) + { + case N_TRAINER_SPELLFIRE: + 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: + 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: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + } + } } - } - } - void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) - { - if (action) - { - switch (creature->GetEntry()) + void SendConfirmUnlearn(Player* player, uint32 action) { - 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()); - 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()); - 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()); - break; + if (action) + { + 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; + } + } } - } - } + }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override - { - ClearGossipMenuFor(player); - switch (sender) + CreatureAI* GetAI(Creature* creature) const override { - 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 new npc_prof_tailorAI(creature); } - return true; - } }; enum MultiProfessionTrainer @@ -1041,7 +1094,7 @@ public: { npc_multi_profession_trainerAI(Creature* creature) : ScriptedAI(creature) { } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { switch (gossipListId) { @@ -1102,6 +1155,7 @@ public: default: break; } + return true; } void SendTrainerList(Player* player, uint32 Index) diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 04d939503a4..c632eca0163 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -327,28 +327,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; - } }; /*###### @@ -811,16 +807,14 @@ public: void UpdateAI(uint32 diff) override; void EnterCombat(Unit* /*who*/) override { } + + void QuestAccept(Player* player, Quest const* quest) override + { + if ((quest->GetQuestId() == 6624) || (quest->GetQuestId() == 6622)) + BeginEvent(player); + } }; - 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; - } - CreatureAI* GetAI(Creature* creature) const override { return new npc_doctorAI(creature); @@ -1271,121 +1265,134 @@ enum Sayge class npc_sayge : public CreatureScript { -public: - npc_sayge() : CreatureScript("npc_sayge") { } + public: + npc_sayge() : CreatureScript("npc_sayge") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - 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 + struct npc_saygeAI : public ScriptedAI { - 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()); - } + npc_saygeAI(Creature* creature) : ScriptedAI(creature) { } - return true; - } + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - void SendAction(Player* player, Creature* creature, uint32 action) - { - switch (action) + 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; + } + + 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; + } + + if (spellId) + { + me->CastSpell(player, spellId, false); + player->GetSpellHistory()->AddCooldown(spellId, 0, std::chrono::hours(2)); + SendAction(player, action); + } + return true; + } + + private: + void SendAction(Player* player, uint32 action) const + { + 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: + me->CastSpell(player, SPELL_FORTUNE, false); + SendGossipMenuFor(player, GOSSIP_MENU_HERE_IS_YOUR_FORTUNE, me->GetGUID()); + break; + } + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - 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; + return new npc_saygeAI(creature); } - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) 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; - } }; class npc_steam_tonk : public CreatureScript @@ -1934,67 +1941,68 @@ class npc_wormhole : public CreatureScript return (type == DATA_SHOW_UNDERGROUND && _showUnderground) ? 1 : 0; } + bool GossipHello(Player* player) override + { + if (me->IsSummon()) + { + 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 (GetData(DATA_SHOW_UNDERGROUND)) + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); + + SendGossipMenuFor(player, NPC_TEXT_WORMHOLE, me->GetGUID()); + } + } + + return 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: // Borean Tundra + CloseGossipMenuFor(player); + me->CastSpell(player, SPELL_BOREAN_TUNDRA, false); + break; + case GOSSIP_ACTION_INFO_DEF + 2: // Howling Fjord + CloseGossipMenuFor(player); + me->CastSpell(player, SPELL_HOWLING_FJORD, false); + break; + case GOSSIP_ACTION_INFO_DEF + 3: // Sholazar Basin + CloseGossipMenuFor(player); + me->CastSpell(player, SPELL_SHOLAZAR_BASIN, false); + break; + case GOSSIP_ACTION_INFO_DEF + 4: // Icecrown + CloseGossipMenuFor(player); + me->CastSpell(player, SPELL_ICECROWN, false); + break; + case GOSSIP_ACTION_INFO_DEF + 5: // Storm peaks + CloseGossipMenuFor(player); + me->CastSpell(player, SPELL_STORM_PEAKS, false); + break; + case GOSSIP_ACTION_INFO_DEF + 6: // Underground + CloseGossipMenuFor(player); + me->CastSpell(player, SPELL_UNDERGROUND, false); + break; + } + + return true; + } + private: bool _showUnderground; }; - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsSummon()) - { - if (player == creature->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); - - SendGossipMenuFor(player, NPC_TEXT_WORMHOLE, creature->GetGUID()); - } - } - - return true; - } - - 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); - 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; - } - CreatureAI* GetAI(Creature* creature) const override { return new npc_wormholeAI(creature); @@ -2013,27 +2021,28 @@ enum PetTrainer class npc_pet_trainer : public CreatureScript { -public: - npc_pet_trainer() : CreatureScript("npc_pet_trainer") { } + public: + npc_pet_trainer() : CreatureScript("npc_pet_trainer") { } - struct npc_pet_trainerAI : public ScriptedAI - { - npc_pet_trainerAI(Creature* creature) : ScriptedAI(creature) { } - - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + struct npc_pet_trainerAI : public ScriptedAI { - if (menuId == MENU_ID_PET_UNLEARN && gossipListId == OPTION_ID_PLEASE_DO) - { - player->ResetPetTalents(); - CloseGossipMenuFor(player); - } - } - }; + npc_pet_trainerAI(Creature* creature) : ScriptedAI(creature) { } - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_pet_trainerAI(creature); - } + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + { + if (menuId == MENU_ID_PET_UNLEARN && gossipListId == OPTION_ID_PLEASE_DO) + { + player->ResetPetTalents(); + CloseGossipMenuFor(player); + } + return false; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_pet_trainerAI(creature); + } }; /*###### @@ -2050,40 +2059,51 @@ enum BehstenSlahtz class npc_experience : public CreatureScript { -public: - npc_experience() : CreatureScript("npc_experience") { } + public: + npc_experience() : CreatureScript("npc_experience") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN)) // not gaining XP + struct npc_experienceAI : public ScriptedAI { - 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()); - } - 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, creature->GetGUID()); - } - return true; - } + npc_experienceAI(Creature* creature) : ScriptedAI(creature) { } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); - switch (action) + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: // XP ON selected + player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN); // turn on XP gain + break; + case GOSSIP_ACTION_INFO_DEF + 2: // XP OFF selected + player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN); // turn off XP gain + break; + } + CloseGossipMenuFor(player); + return true; + } + + bool GossipHello(Player* player) override + { + if (player->HasFlag(PLAYER_FLAGS, 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; + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - case GOSSIP_ACTION_INFO_DEF + 1: // XP ON selected - player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN); // turn on XP gain - break; - case GOSSIP_ACTION_INFO_DEF + 2: // XP OFF selected - player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN); // turn off XP gain - break; + return new npc_experienceAI(creature); } - CloseGossipMenuFor(player); - return true; - } }; enum Fireworks @@ -2543,11 +2563,11 @@ class npc_stable_master : public CreatureScript { npc_stable_masterAI(Creature* creature) : SmartAI(creature) { } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { - SmartAI::sGossipSelect(player, menuId, gossipListId); + SmartAI::GossipSelect(player, menuId, gossipListId); if (menuId != STABLE_MASTER_GOSSIP_SUB_MENU) - return; + return true; switch (gossipListId) { @@ -2573,10 +2593,11 @@ class npc_stable_master : public CreatureScript player->CastSpell(player, SPELL_WOLPERTINGER, false); break; default: - return; + return false; } player->PlayerTalkClass->SendCloseGossip(); + return false; } }; @@ -2797,7 +2818,7 @@ public: }); } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { switch (gossipListId) { @@ -2848,6 +2869,7 @@ public: break; } player->PlayerTalkClass->SendCloseGossip(); + return false; } void UpdateAI(uint32 diff) override