diff options
-rw-r--r-- | src/server/game/AI/CoreAI/GameObjectAI.cpp | 4 | ||||
-rw-r--r-- | src/server/game/AI/CoreAI/GameObjectAI.h | 8 | ||||
-rw-r--r-- | src/server/game/AI/CoreAI/UnitAI.cpp | 11 | ||||
-rw-r--r-- | src/server/game/AI/CoreAI/UnitAI.h | 21 | ||||
-rw-r--r-- | src/server/game/AI/CreatureAI.cpp | 11 | ||||
-rw-r--r-- | src/server/game/AI/CreatureAI.h | 25 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 44 | ||||
-rw-r--r-- | src/server/game/Handlers/QuestHandler.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Quests/QuestDef.h | 2 |
9 files changed, 67 insertions, 68 deletions
diff --git a/src/server/game/AI/CoreAI/GameObjectAI.cpp b/src/server/game/AI/CoreAI/GameObjectAI.cpp index f65be59edbc..52032f240bd 100644 --- a/src/server/game/AI/CoreAI/GameObjectAI.cpp +++ b/src/server/game/AI/CoreAI/GameObjectAI.cpp @@ -31,9 +31,9 @@ void GameObjectAI::QuestReward(Player* player, Quest const* quest, uint32 opt) QuestReward(player, quest, LootItemType::Item, opt); } -QuestGiverStatus GameObjectAI::GetDialogStatus(Player* /*player*/) +Optional<QuestGiverStatus> GameObjectAI::GetDialogStatus(Player* /*player*/) { - return QuestGiverStatus::ScriptedDefault; + return {}; } NullGameObjectAI::NullGameObjectAI(GameObject* g) : GameObjectAI(g) { } diff --git a/src/server/game/AI/CoreAI/GameObjectAI.h b/src/server/game/AI/CoreAI/GameObjectAI.h index 4a82fecbf9d..41a785cc325 100644 --- a/src/server/game/AI/CoreAI/GameObjectAI.h +++ b/src/server/game/AI/CoreAI/GameObjectAI.h @@ -20,7 +20,7 @@ #include "Define.h" #include "ObjectGuid.h" -#include <list> +#include "Optional.h" class GameObject; class Player; @@ -51,6 +51,9 @@ class TC_GAME_API GameObjectAI static int32 Permissible(GameObject const* go); + // Called when the dialog status between a player and the gameobject is requested. + virtual Optional<QuestGiverStatus> GetDialogStatus(Player* player); + // Called when a player opens a gossip dialog with the gameobject. virtual bool GossipHello(Player* /*player*/) { return false; } @@ -67,9 +70,6 @@ class TC_GAME_API GameObjectAI virtual void QuestReward(Player* player, Quest const* quest, uint32 opt); virtual void QuestReward(Player* /*player*/, Quest const* /*quest*/, LootItemType /*type*/, uint32 /*opt*/) { } - // Called when the dialog status between a player and the gameobject is requested. - virtual QuestGiverStatus GetDialogStatus(Player* player); - // Called when a Player clicks a GameObject, before GossipHello // prevents achievement tracking if returning true virtual bool OnReportUse(Player* /*player*/) { return false; } diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp index 87277f7bfbf..f44742419e5 100644 --- a/src/server/game/AI/CoreAI/UnitAI.cpp +++ b/src/server/game/AI/CoreAI/UnitAI.cpp @@ -18,7 +18,6 @@ #include "UnitAI.h" #include "Creature.h" #include "CreatureAIImpl.h" -#include "LootMgr.h" #include "Map.h" #include "MotionMaster.h" #include "Player.h" @@ -303,16 +302,6 @@ void UnitAI::FillAISpellInfo() }); } -void UnitAI::QuestReward(Player* player, Quest const* quest, uint32 opt) -{ - QuestReward(player, quest, LootItemType::Item, opt); -} - -QuestGiverStatus UnitAI::GetDialogStatus(Player* /*player*/) -{ - return QuestGiverStatus::ScriptedDefault; -} - ThreatManager& UnitAI::GetThreatManager() { return me->GetThreatManager(); diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h index c00f53a6c36..bb5aee7b9d9 100644 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -44,8 +44,6 @@ struct AISpellInfoType; enum DamageEffectType : uint8; enum Difficulty : uint8; enum SpellEffIndex : uint8; -enum class LootItemType : uint8; -enum class QuestGiverStatus : uint32; //Selection method used by SelectTarget enum SelectAggroTarget @@ -318,28 +316,9 @@ class TC_GAME_API UnitAI static std::unordered_map<std::pair<uint32, Difficulty>, AISpellInfoType> AISpellInfo; static void FillAISpellInfo(); - // 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); - virtual void QuestReward(Player* /*player*/, Quest const* /*quest*/, LootItemType /*type*/, 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 QuestGiverStatus GetDialogStatus(Player* player); - virtual void WaypointPathStarted(uint32 /*nodeId*/, uint32 /*pathId*/) { } virtual void WaypointStarted(uint32 /*nodeId*/, uint32 /*pathId*/) { } virtual void WaypointReached(uint32 /*nodeId*/, uint32 /*pathId*/) { } diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index bb44c5d572f..1b7234dd939 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -23,6 +23,7 @@ #include "CreatureTextMgr.h" #include "Language.h" #include "Log.h" +#include "LootMgr.h" #include "Map.h" #include "MapReference.h" #include "MotionMaster.h" @@ -279,6 +280,16 @@ bool CreatureAI::_EnterEvadeMode(EvadeReason /*why*/) return true; } +Optional<QuestGiverStatus> CreatureAI::GetDialogStatus(Player* /*player*/) +{ + return {}; +} + +void CreatureAI::QuestReward(Player* player, Quest const* quest, uint32 opt) +{ + QuestReward(player, quest, LootItemType::Item, opt); +} + const uint32 BOUNDARY_VISUALIZE_CREATURE = 15425; const float BOUNDARY_VISUALIZE_CREATURE_SCALE = 0.25f; const int8 BOUNDARY_VISUALIZE_STEP_SIZE = 1; diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h index 4d946f569b8..fca77f0a5a4 100644 --- a/src/server/game/AI/CreatureAI.h +++ b/src/server/game/AI/CreatureAI.h @@ -21,6 +21,8 @@ #include "UnitAI.h" #include "Common.h" #include "ObjectDefines.h" +#include "Optional.h" +#include "QuestDef.h" class AreaBoundary; class AreaTrigger; @@ -30,6 +32,8 @@ class GameObject; class PlayerAI; class WorldObject; struct Position; +enum class LootItemType : uint8; +enum class QuestGiverStatus : uint32; typedef std::vector<AreaBoundary const*> CreatureBoundary; @@ -168,6 +172,27 @@ class TC_GAME_API CreatureAI : public UnitAI // Called when victim entered water and creature can not enter water //virtual bool CanReachByRangeAttack(Unit*) { return false; } + /// == Gossip system ================================ + + // Called when the dialog status between a player and the creature is requested. + virtual Optional<QuestGiverStatus> GetDialogStatus(Player* player); + + // 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); + virtual void QuestReward(Player* /*player*/, Quest const* /*quest*/, LootItemType /*type*/, uint32 /*opt*/) { } + /// == Fields ======================================= virtual void PassengerBoarded(Unit* /*passenger*/, int8 /*seatId*/, bool /*apply*/) { } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index e861136c286..22cb8b25ab6 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -16406,29 +16406,27 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver) switch (questgiver->GetTypeId()) { - case TYPEID_GAMEOBJECT: - { - QuestGiverStatus questStatus = questgiver->ToGameObject()->AI()->GetDialogStatus(this); - if (questStatus != QuestGiverStatus::ScriptedDefault) - return questStatus; - qr = sObjectMgr->GetGOQuestRelationBounds(questgiver->GetEntry()); - qir = sObjectMgr->GetGOQuestInvolvedRelationBounds(questgiver->GetEntry()); - break; - } - case TYPEID_UNIT: - { - QuestGiverStatus questStatus = questgiver->ToCreature()->AI()->GetDialogStatus(this); - if (questStatus != QuestGiverStatus::ScriptedDefault) - return questStatus; - qr = sObjectMgr->GetCreatureQuestRelationBounds(questgiver->GetEntry()); - qir = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(questgiver->GetEntry()); - break; - } - default: - // it's impossible, but check - TC_LOG_ERROR("entities.player.quest", "Player::GetQuestDialogStatus: Called with unexpected type (Entry: %u, Type: %u) by player '%s' (%s)", - questgiver->GetEntry(), questgiver->GetTypeId(), GetName().c_str(), GetGUID().ToString().c_str()); - return QuestGiverStatus::None; + case TYPEID_GAMEOBJECT: + { + if (Optional<QuestGiverStatus> questStatus = questgiver->ToGameObject()->AI()->GetDialogStatus(this)) + return *questStatus; + qr = sObjectMgr->GetGOQuestRelationBounds(questgiver->GetEntry()); + qir = sObjectMgr->GetGOQuestInvolvedRelationBounds(questgiver->GetEntry()); + break; + } + case TYPEID_UNIT: + { + if (Optional<QuestGiverStatus> questStatus = questgiver->ToCreature()->AI()->GetDialogStatus(this)) + return *questStatus; + qr = sObjectMgr->GetCreatureQuestRelationBounds(questgiver->GetEntry()); + qir = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(questgiver->GetEntry()); + break; + } + default: + // it's impossible, but check + TC_LOG_ERROR("entities.player.quest", "Player::GetQuestDialogStatus: Called with unexpected type (Entry: %u, Type: %u) by player '%s' (%s)", + questgiver->GetEntry(), questgiver->GetTypeId(), GetName().c_str(), GetGUID().ToString().c_str()); + return QuestGiverStatus::None; } QuestGiverStatus result = QuestGiverStatus::None; diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index a02fa586775..52ed231c53f 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -19,6 +19,7 @@ #include "Battleground.h" #include "Common.h" #include "Creature.h" +#include "CreatureAI.h" #include "DatabaseEnv.h" #include "DB2Stores.h" #include "GameObject.h" @@ -34,7 +35,6 @@ #include "QuestPackets.h" #include "ReputationMgr.h" #include "ScriptMgr.h" -#include "UnitAI.h" #include "World.h" void WorldSession::HandleQuestgiverStatusQueryOpcode(WorldPackets::Quest::QuestGiverStatusQuery& packet) @@ -93,7 +93,7 @@ void WorldSession::HandleQuestgiverHelloOpcode(WorldPackets::Quest::QuestGiverHe creature->SetHomePosition(creature->GetPosition()); _player->PlayerTalkClass->ClearMenus(); - if (creature->GetAI()->GossipHello(_player)) + if (creature->AI()->GossipHello(_player)) return; _player->PrepareGossipMenu(creature, creature->GetCreatureTemplate()->GossipMenuId, true); @@ -388,7 +388,6 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest case TYPEID_PLAYER: { //For AutoSubmition was added plr case there as it almost same exclute AI script cases. - Unit* unitQGiver = object->ToUnit(); // Send next quest if (Quest const* nextQuest = _player->GetNextQuest(packet.QuestGiverGUID, quest)) { @@ -403,8 +402,8 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest } _player->PlayerTalkClass->ClearMenus(); - if (UnitAI* qGiverAI = unitQGiver->GetAI()) - qGiverAI->QuestReward(_player, quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID); + if (Creature* creatureQGiver = object->ToCreature()) + creatureQGiver->AI()->QuestReward(_player, quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID); break; } case TYPEID_GAMEOBJECT: diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h index 600111bd856..cc31c021b49 100644 --- a/src/server/game/Quests/QuestDef.h +++ b/src/server/game/Quests/QuestDef.h @@ -140,8 +140,6 @@ enum class QuestGiverStatus : uint32 CovenantCallingQuest = 0x080000, CovenantCallingRewardCompleteNoPOI = 0x100000, CovenantCallingRewardCompletePOI = 0x200000, - - ScriptedDefault = 0x80000000 }; DEFINE_ENUM_FLAG(QuestGiverStatus); |