diff --git a/Source/Framework/Constants/QuestConst.cs b/Source/Framework/Constants/QuestConst.cs index 5a2b5cb4c..8d3ac9710 100644 --- a/Source/Framework/Constants/QuestConst.cs +++ b/Source/Framework/Constants/QuestConst.cs @@ -387,8 +387,6 @@ namespace Framework.Constants CovenantCallingQuest = 0x80000, CovenantCallingRewardCompleteNoPOI = 0x100000, CovenantCallingRewardCompletePOI = 0x200000, - - ScriptedDefault = 0x80000000 } [Flags] diff --git a/Source/Game/AI/CoreAI/CreatureAI.cs b/Source/Game/AI/CoreAI/CreatureAI.cs index 7f6c73417..93cf5d500 100644 --- a/Source/Game/AI/CoreAI/CreatureAI.cs +++ b/Source/Game/AI/CoreAI/CreatureAI.cs @@ -29,8 +29,8 @@ namespace Game.AI { bool _moveInLineOfSightLocked; List _boundary = new(); - bool _negateBoundary; - + bool _negateBoundary; + protected new Creature me; protected EventMap _events = new(); @@ -470,6 +470,36 @@ namespace Game.AI // called when the corpse of this creature gets removed public virtual void CorpseRemoved(long respawnDelay) { } + /// == Gossip system ================================ + + // Called when the dialog status between a player and the creature is requested. + public virtual QuestGiverStatus? GetDialogStatus(Player player) + { + return null; + } + + // Called when a player opens a gossip dialog with the creature. + public virtual bool GossipHello(Player player) { return false; } + + // Called when a player selects a gossip item in the creature's gossip menu. + public virtual bool GossipSelect(Player player, uint menuId, uint gossipListId) { return false; } + + // Called when a player selects a gossip with a code in the creature's gossip menu. + public virtual bool GossipSelectCode(Player player, uint menuId, uint gossipListId, string code) + { + return false; + } + + // Called when a player accepts a quest from the creature. + public virtual void QuestAccept(Player player, Quest quest) { } + + // Called when a player completes a quest and is rewarded, opt is the selected item's index or 0 + public virtual void QuestReward(Player player, Quest quest, uint opt) + { + QuestReward(player, quest, LootItemType.Item, opt); + } + public virtual void QuestReward(Player player, Quest quest, LootItemType type, uint opt) { } + public virtual void PassengerBoarded(Unit passenger, sbyte seatId, bool apply) { } public virtual void OnSpellClick(Unit clicker, ref bool result) { } diff --git a/Source/Game/AI/CoreAI/GameObjectAI.cs b/Source/Game/AI/CoreAI/GameObjectAI.cs index 99c983843..33c0d432c 100644 --- a/Source/Game/AI/CoreAI/GameObjectAI.cs +++ b/Source/Game/AI/CoreAI/GameObjectAI.cs @@ -47,6 +47,11 @@ namespace Game.AI public virtual void SetGUID(ObjectGuid guid, int id = 0) { } public virtual ObjectGuid GetGUID(int id = 0) { return ObjectGuid.Empty; } + /// + /// Called when the dialog status between a player and the gameobject is requested. + /// + public virtual QuestGiverStatus? GetDialogStatus(Player player) { return null; } + /// /// Called when a player opens a gossip dialog with the gameobject. /// @@ -76,11 +81,6 @@ namespace Game.AI } public virtual void QuestReward(Player player, Quest quest, LootItemType type, uint opt) { } - /// - /// Called when the dialog status between a player and the gameobject is requested. - /// - public virtual QuestGiverStatus GetDialogStatus(Player player) { return QuestGiverStatus.ScriptedDefault; } - // Called when a Player clicks a GameObject, before GossipHello // prevents achievement tracking if returning true public virtual bool OnReportUse(Player player) { return false; } diff --git a/Source/Game/AI/CoreAI/UnitAI.cs b/Source/Game/AI/CoreAI/UnitAI.cs index 3efecdd8f..24c207bac 100644 --- a/Source/Game/AI/CoreAI/UnitAI.cs +++ b/Source/Game/AI/CoreAI/UnitAI.cs @@ -491,43 +491,11 @@ namespace Game.AI public virtual void HealDone(Unit to, uint addhealth) { } public virtual void SpellInterrupted(uint spellId, uint unTimeMs) { } - /// - /// Called when a player opens a gossip dialog with the creature. - /// - public virtual bool GossipHello(Player player) { return false; } - - /// - /// Called when a player selects a gossip item in the creature's gossip menu. - /// - public virtual bool GossipSelect(Player player, uint menuId, uint gossipListId) { return false; } - - /// - /// Called when a player selects a gossip with a code in the creature's gossip menu. - /// - public virtual bool GossipSelectCode(Player player, uint menuId, uint gossipListId, string code) { return false; } - - /// - /// Called when a player accepts a quest from the creature. - /// - public virtual void QuestAccept(Player player, Quest quest) { } - - /// - /// Called when a player completes a quest and is rewarded, opt is the selected item's index or 0 - /// - public virtual void QuestReward(Player player, Quest quest, uint opt) - { - QuestReward(player, quest, LootItemType.Item, opt); - } - public virtual void QuestReward(Player player, Quest quest, LootItemType type, uint opt) { } - /// /// Called when a game event starts or ends /// public virtual void OnGameEvent(bool start, ushort eventId) { } - // Called when the dialog status between a player and the creature is requested. - public virtual QuestGiverStatus GetDialogStatus(Player player) { return QuestGiverStatus.ScriptedDefault; } - public virtual void WaypointPathStarted(uint nodeId, uint pathId) { } public virtual void WaypointStarted(uint nodeId, uint pathId) { } diff --git a/Source/Game/Entities/Player/Player.Quest.cs b/Source/Game/Entities/Player/Player.Quest.cs index 284125e17..127f76f54 100644 --- a/Source/Game/Entities/Player/Player.Quest.cs +++ b/Source/Game/Entities/Player/Player.Quest.cs @@ -1854,18 +1854,20 @@ namespace Game.Entities { case TypeId.GameObject: { - QuestGiverStatus questStatus = questgiver.ToGameObject().GetAI().GetDialogStatus(this); - if (questStatus != QuestGiverStatus.ScriptedDefault) - return questStatus; + QuestGiverStatus? questStatus = questgiver.ToGameObject().GetAI().GetDialogStatus(this); + if (questStatus.HasValue) + return questStatus.Value; + qr = Global.ObjectMgr.GetGOQuestRelationBounds(questgiver.GetEntry()); qir = Global.ObjectMgr.GetGOQuestInvolvedRelationBounds(questgiver.GetEntry()); break; } case TypeId.Unit: { - QuestGiverStatus questStatus = questgiver.ToCreature().GetAI().GetDialogStatus(this); - if (questStatus != QuestGiverStatus.ScriptedDefault) - return questStatus; + QuestGiverStatus? questStatus = questgiver.ToCreature().GetAI().GetDialogStatus(this); + if (questStatus.HasValue) + return questStatus.Value; + qr = Global.ObjectMgr.GetCreatureQuestRelationBounds(questgiver.GetEntry()); qir = Global.ObjectMgr.GetCreatureQuestInvolvedRelationBounds(questgiver.GetEntry()); break; diff --git a/Source/Game/Handlers/QuestHandler.cs b/Source/Game/Handlers/QuestHandler.cs index 61045f955..ba88995b9 100644 --- a/Source/Game/Handlers/QuestHandler.cs +++ b/Source/Game/Handlers/QuestHandler.cs @@ -360,7 +360,6 @@ namespace Game case TypeId.Player: { //For AutoSubmition was added plr case there as it almost same exclute AI script cases. - Unit unitQGiver = obj.ToUnit(); // Send next quest Quest nextQuest = _player.GetNextQuest(packet.QuestGiverGUID, quest); if (nextQuest != null) @@ -376,9 +375,9 @@ namespace Game } _player.PlayerTalkClass.ClearMenus(); - var qGiverAI = unitQGiver.GetAI(); - if (qGiverAI != null) - qGiverAI.QuestReward(_player, quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID); + Creature creatureQGiver = obj.ToCreature(); + if (creatureQGiver != null) + creatureQGiver.GetAI().QuestReward(_player, quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID); break; } case TypeId.GameObject: