diff --git a/Source/Game/Handlers/QuestHandler.cs b/Source/Game/Handlers/QuestHandler.cs index ff5e22130..1afb6d120 100644 --- a/Source/Game/Handlers/QuestHandler.cs +++ b/Source/Game/Handlers/QuestHandler.cs @@ -574,6 +574,19 @@ namespace Game } } + [WorldPacketHandler(ClientOpcodes.QuestGiverCloseQuest)] + void HandleQuestgiverCloseQuest(QuestGiverCloseQuest questGiverCloseQuest) + { + if (_player.FindQuestSlot(questGiverCloseQuest.QuestID) >= SharedConst.MaxQuestLogSize) + return; + + Quest quest = Global.ObjectMgr.GetQuestTemplate(questGiverCloseQuest.QuestID); + if (quest == null) + return; + + Global.ScriptMgr.OnQuestAcknowledgeAutoAccept(_player, quest); + } + [WorldPacketHandler(ClientOpcodes.PushQuestToParty)] void HandlePushQuestToParty(PushQuestToParty packet) { diff --git a/Source/Game/Networking/Packets/QuestPackets.cs b/Source/Game/Networking/Packets/QuestPackets.cs index 5796b866f..e7dd97a64 100644 --- a/Source/Game/Networking/Packets/QuestPackets.cs +++ b/Source/Game/Networking/Packets/QuestPackets.cs @@ -406,6 +406,18 @@ namespace Game.Networking.Packets public bool FromScript; // 0 - standart complete quest mode with npc, 1 - auto-complete mode } + public class QuestGiverCloseQuest : ClientPacket + { + public QuestGiverCloseQuest(WorldPacket packet) : base(packet) { } + + public override void Read() + { + QuestID = _worldPacket.ReadUInt32(); + } + + public uint QuestID; + } + public class QuestGiverQuestDetails : ServerPacket { public QuestGiverQuestDetails() : base(ServerOpcodes.QuestGiverQuestDetails) { } diff --git a/Source/Game/Scripting/CoreScripts.cs b/Source/Game/Scripting/CoreScripts.cs index 62932a62b..ca5947cc6 100644 --- a/Source/Game/Scripting/CoreScripts.cs +++ b/Source/Game/Scripting/CoreScripts.cs @@ -792,6 +792,9 @@ namespace Game.Scripting // Called when a quest status change public virtual void OnQuestStatusChange(Player player, Quest quest, QuestStatus oldStatus, QuestStatus newStatus) { } + // Called for auto accept quests when player closes quest UI after seeing initial quest details + public virtual void OnAcknowledgeAutoAccept(Player player, Quest quest) { } + // Called when a quest objective data change public virtual void OnQuestObjectiveChange(Player player, Quest quest, QuestObjective objective, int oldAmount, int newAmount) { } } diff --git a/Source/Game/Scripting/ScriptManager.cs b/Source/Game/Scripting/ScriptManager.cs index 30ad48e8b..a716f3211 100644 --- a/Source/Game/Scripting/ScriptManager.cs +++ b/Source/Game/Scripting/ScriptManager.cs @@ -1188,6 +1188,13 @@ namespace Game.Scripting RunScript(script => script.OnQuestStatusChange(player, quest, oldStatus, newStatus), quest.ScriptId); } + public void OnQuestAcknowledgeAutoAccept(Player player, Quest quest) + { + Cypher.Assert(player); + Cypher.Assert(quest != null); + + RunScript(script => script.OnAcknowledgeAutoAccept(player, quest), quest.ScriptId); + } public void OnQuestObjectiveChange(Player player, Quest quest, QuestObjective objective, int oldAmount, int newAmount) { Cypher.Assert(player);