aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/AI/CoreAI/GameObjectAI.cpp4
-rw-r--r--src/server/game/AI/CoreAI/GameObjectAI.h8
-rw-r--r--src/server/game/AI/CoreAI/UnitAI.cpp11
-rw-r--r--src/server/game/AI/CoreAI/UnitAI.h21
-rw-r--r--src/server/game/AI/CreatureAI.cpp11
-rw-r--r--src/server/game/AI/CreatureAI.h25
-rw-r--r--src/server/game/Entities/Player/Player.cpp44
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp9
-rw-r--r--src/server/game/Quests/QuestDef.h2
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);