From eee335291f649873f1b90ddc2bca63f0d4245ec2 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Mon, 15 Mar 2021 16:55:55 -0400 Subject: [PATCH] Core/AdventureJournal: Handle CMSG_ADVENTURE_JOURNAL_OPEN_QUEST and CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS Port From (https://github.com/TrinityCore/TrinityCore/commit/3addbe7dd418259149c39fc3b9423f7809de696a) --- .../Database/Databases/HotfixDatabase.cs | 5 +- Source/Game/DataStorage/Structs/A_Records.cs | 2 +- .../Game/Handlers/AdventureJournalHandler.cs | 100 ++++++++++++++++++ Source/Game/Handlers/MiscHandler.cs | 65 ------------ .../Packets/AdventureJournalPackets.cs | 88 +++++++++++++++ Source/Game/Networking/Packets/MiscPackets.cs | 62 ----------- .../master/2021_03_14_00_hotfixes.sql | 66 ++++++++++++ 7 files changed, 257 insertions(+), 131 deletions(-) create mode 100644 Source/Game/Handlers/AdventureJournalHandler.cs create mode 100644 Source/Game/Networking/Packets/AdventureJournalPackets.cs create mode 100644 sql/updates/hotfixes/master/2021_03_14_00_hotfixes.sql diff --git a/Source/Framework/Database/Databases/HotfixDatabase.cs b/Source/Framework/Database/Databases/HotfixDatabase.cs index 246e0e93b..efa9d6350 100644 --- a/Source/Framework/Database/Databases/HotfixDatabase.cs +++ b/Source/Framework/Database/Databases/HotfixDatabase.cs @@ -28,9 +28,8 @@ namespace Framework.Database // AdventureJournal.db2 PrepareStatement(HotfixStatements.SEL_ADVENTURE_JOURNAL, "SELECT ID, Name, Description, ButtonText, RewardDescription, ContinueDescription, Type, " + - "PlayerConditionId, Flags, ButtonActionType, TextureFileDataId, LfgDungeonId, QuestId, BattleMasterListId, PriorityMin, PriorityMax, ItemId, " + - "ItemQuantity, CurrencyType, CurrencyQuantity, UiMapId, BonusPlayerConditionId1, BonusPlayerConditionId2, BonusValue1, BonusValue2" + - " FROM adventure_journal"); + "PlayerConditionID, Flags, ButtonActionType, TextureFileDataID, LfgDungeonID, QuestID, BattleMasterListID, PriorityMin, PriorityMax, ItemID, " + + "ItemQuantity, CurrencyType, CurrencyQuantity, UiMapID, BonusPlayerConditionID1, BonusPlayerConditionID2, BonusValue1, BonusValue2 FROM adventure_journal"); PrepareStatement(HotfixStatements.SEL_ADVENTURE_JOURNAL_LOCALE, "SELECT ID, Name_lang, Description_lang, ButtonText_lang, RewardDescription_lang, " + "ContinueDescription_lang FROM adventure_journal_locale WHERE locale = ?"); diff --git a/Source/Game/DataStorage/Structs/A_Records.cs b/Source/Game/DataStorage/Structs/A_Records.cs index 19cda97ac..f84556617 100644 --- a/Source/Game/DataStorage/Structs/A_Records.cs +++ b/Source/Game/DataStorage/Structs/A_Records.cs @@ -65,7 +65,7 @@ namespace Game.DataStorage public ushort CurrencyType; public uint CurrencyQuantity; public ushort UiMapID; - public int[] BonusPlayerConditionID = new int[2]; + public uint[] BonusPlayerConditionID = new uint[2]; public byte[] BonusValue = new byte[2]; } diff --git a/Source/Game/Handlers/AdventureJournalHandler.cs b/Source/Game/Handlers/AdventureJournalHandler.cs new file mode 100644 index 000000000..7c1447d78 --- /dev/null +++ b/Source/Game/Handlers/AdventureJournalHandler.cs @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2012-2020 CypherCore + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using Framework.Constants; +using Framework.IO; +using Game.BattleGrounds; +using Game.DataStorage; +using Game.Entities; +using Game.Groups; +using Game.Guilds; +using Game.Maps; +using Game.Misc; +using Game.Networking; +using Game.Networking.Packets; +using Game.PvP; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Game +{ + public partial class WorldSession + { + [WorldPacketHandler(ClientOpcodes.AdventureJournalOpenQuest)] + void HandleAdventureJournalOpenQuest(AdventureJournalOpenQuest openQuest) + { + var adventureJournal = CliDB.AdventureJournalStorage.LookupByKey(openQuest.AdventureJournalID); + if (adventureJournal == null) + return; + + if (!_player.MeetPlayerCondition(adventureJournal.PlayerConditionID)) + return; + + Quest quest = Global.ObjectMgr.GetQuestTemplate(adventureJournal.QuestID); + if (quest == null) + return; + + if (_player.CanTakeQuest(quest, true)) + _player.PlayerTalkClass.SendQuestGiverQuestDetails(quest, _player.GetGUID(), true, false); + } + + [WorldPacketHandler(ClientOpcodes.AdventureJournalStartQuest)] + void HandleAdventureJournalStartQuest(AdventureJournalStartQuest startQuest) + { + Quest quest = Global.ObjectMgr.GetQuestTemplate(startQuest.QuestID); + if (quest == null) + return; + + AdventureJournalRecord adventureJournalEntry = null; + foreach (var adventureJournal in CliDB.AdventureJournalStorage.Values) + { + if (quest.Id == adventureJournal.QuestID) + { + adventureJournalEntry = adventureJournal; + break; + } + } + + if (adventureJournalEntry == null) + return; + + if (_player.MeetPlayerCondition(adventureJournalEntry.PlayerConditionID) && _player.CanTakeQuest(quest, true)) + _player.AddQuestAndCheckCompletion(quest, null); + } + + [WorldPacketHandler(ClientOpcodes.AdventureJournalUpdateSuggestions)] + void HandleAdventureJournalUpdateSuggestions(AdventureJournalUpdateSuggestions updateSuggestions) + { + AdventureJournalDataResponse response = new AdventureJournalDataResponse(); + response.OnLevelUp = updateSuggestions.OnLevelUp; + + foreach (var adventureJournal in CliDB.AdventureJournalStorage.Values) + { + if (_player.MeetPlayerCondition(adventureJournal.PlayerConditionID)) + { + AdventureJournalEntry adventureJournalData; + adventureJournalData.AdventureJournalID = (int)adventureJournal.Id; + adventureJournalData.Priority = adventureJournal.PriorityMax; + response.AdventureJournalDatas.Add(adventureJournalData); + } + } + + SendPacket(response); + } + } +} diff --git a/Source/Game/Handlers/MiscHandler.cs b/Source/Game/Handlers/MiscHandler.cs index 97a1d7b3b..529720cf0 100644 --- a/Source/Game/Handlers/MiscHandler.cs +++ b/Source/Game/Handlers/MiscHandler.cs @@ -770,70 +770,5 @@ namespace Game break; } } - - [WorldPacketHandler(ClientOpcodes.AdventureJournalOpenQuest)] - void HandleAdventureJournalOpenQuest(AdventureJournalOpenQuest adventureJournalOpenQuest) - { - var adventureJournalEntry = CliDB.AdventureJournalStorage.LookupByKey(adventureJournalOpenQuest.AdventureJournalID); - if (adventureJournalEntry == null) - return; - - Quest quest = Global.ObjectMgr.GetQuestTemplate(adventureJournalEntry.QuestID); - if (quest == null) - return; - - if (_player.CanTakeQuest(quest, true)) - { - PlayerMenu menu = new PlayerMenu(_player.GetSession()); - menu.SendQuestGiverQuestDetails(quest, _player.GetGUID(), true, false); - } - } - - [WorldPacketHandler(ClientOpcodes.AdventureJournalStartQuest)] - void HandleAdventureJournalStartQuest(AdventureJournalStartQuest adventureJournalStartQuest) - { - Quest quest = Global.ObjectMgr.GetQuestTemplate(adventureJournalStartQuest.QuestID); - if (quest == null) - return; - - AdventureJournalRecord adventureJournalEntry = null; - foreach (var adventureJournal in CliDB.AdventureJournalStorage.Values) - { - if (quest.Id == adventureJournal.QuestID) - { - adventureJournalEntry = adventureJournal; - break; - } - } - - if (adventureJournalEntry == null) - return; - - if (_player.MeetPlayerCondition(adventureJournalEntry.PlayerConditionID) && _player.CanTakeQuest(quest, true)) - _player.AddQuestAndCheckCompletion(quest, null); - } - - [WorldPacketHandler(ClientOpcodes.AdventureJournalUpdateSuggestions)] - void HandleAdventureJournalUpdateSuggestions(AdventureJournalUpdateSuggestions adventureJournalUpdateSuggestions) - { - if (adventureJournalUpdateSuggestions.OnLevelUp && _player.GetLevel() < 10) - return; - - AdventureJournalDataResponse response = new AdventureJournalDataResponse(); - response.OnLevelUp = adventureJournalUpdateSuggestions.OnLevelUp; - - foreach (var adventureJournal in CliDB.AdventureJournalStorage.Values) - { - if (_player.MeetPlayerCondition(adventureJournal.PlayerConditionID)) - { - AdventureJournalData adventureJournalData; - adventureJournalData.AdventureJournalID = (int)adventureJournal.Id; - adventureJournalData.Priority = adventureJournal.PriorityMax; - response.AdventureJournalDatas.Add(adventureJournalData); - } - } - - SendPacket(response); - } } } diff --git a/Source/Game/Networking/Packets/AdventureJournalPackets.cs b/Source/Game/Networking/Packets/AdventureJournalPackets.cs new file mode 100644 index 000000000..8bdcc7232 --- /dev/null +++ b/Source/Game/Networking/Packets/AdventureJournalPackets.cs @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2012-2020 CypherCore + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using Framework.Constants; +using Framework.Dynamic; +using Framework.GameMath; +using Game.Entities; +using System; +using System.Collections.Generic; + +namespace Game.Networking.Packets +{ + class AdventureJournalOpenQuest : ClientPacket + { + public AdventureJournalOpenQuest(WorldPacket packet) : base(packet) { } + + public override void Read() + { + AdventureJournalID = _worldPacket.ReadUInt32(); + } + + public uint AdventureJournalID; + } + + class AdventureJournalStartQuest : ClientPacket + { + public AdventureJournalStartQuest(WorldPacket packet) : base(packet) { } + + public override void Read() + { + QuestID = _worldPacket.ReadUInt32(); + } + + public uint QuestID; + } + + class AdventureJournalUpdateSuggestions : ClientPacket + { + public AdventureJournalUpdateSuggestions(WorldPacket packet) : base(packet) { } + + public override void Read() + { + OnLevelUp = _worldPacket.HasBit(); + } + + public bool OnLevelUp; + } + + class AdventureJournalDataResponse : ServerPacket + { + public AdventureJournalDataResponse() : base(ServerOpcodes.AdventureJournalDataResponse) { } + + public override void Write() + { + _worldPacket.WriteBit(OnLevelUp); + _worldPacket.FlushBits(); + _worldPacket.WriteInt32(AdventureJournalDatas.Count); + foreach (var adventureJournal in AdventureJournalDatas) + { + _worldPacket.WriteInt32(adventureJournal.AdventureJournalID); + _worldPacket.WriteInt32(adventureJournal.Priority); + } + } + + public bool OnLevelUp; + public List AdventureJournalDatas = new List(); + } + + struct AdventureJournalEntry + { + public int AdventureJournalID; + public int Priority; + } +} diff --git a/Source/Game/Networking/Packets/MiscPackets.cs b/Source/Game/Networking/Packets/MiscPackets.cs index c2f0ad37a..bd43553db 100644 --- a/Source/Game/Networking/Packets/MiscPackets.cs +++ b/Source/Game/Networking/Packets/MiscPackets.cs @@ -1320,62 +1320,6 @@ namespace Game.Networking.Packets public ObjectGuid SourceGuid; } - - class AdventureJournalOpenQuest : ClientPacket - { - public AdventureJournalOpenQuest(WorldPacket packet) : base(packet) { } - - public override void Read() - { - AdventureJournalID = _worldPacket.ReadUInt32(); - } - - public uint AdventureJournalID; - } - - class AdventureJournalStartQuest : ClientPacket - { - public AdventureJournalStartQuest(WorldPacket packet) : base(packet) { } - - public override void Read() - { - QuestID = _worldPacket.ReadUInt32(); - } - - public uint QuestID; - } - - class AdventureJournalUpdateSuggestions : ClientPacket - { - public AdventureJournalUpdateSuggestions(WorldPacket packet) : base(packet) { } - - public override void Read() - { - OnLevelUp = _worldPacket.HasBit(); - } - - public bool OnLevelUp; - } - - class AdventureJournalDataResponse : ServerPacket - { - public AdventureJournalDataResponse() : base(ServerOpcodes.AdventureJournalDataResponse) { } - - public override void Write() - { - _worldPacket.WriteBit(OnLevelUp); - _worldPacket.FlushBits(); - _worldPacket.WriteInt32(AdventureJournalDatas.Count); - foreach (var adventureJournal in AdventureJournalDatas) - { - _worldPacket.WriteInt32(adventureJournal.AdventureJournalID); - _worldPacket.WriteInt32(adventureJournal.Priority); - } - } - - public bool OnLevelUp; - public List AdventureJournalDatas = new List(); - } //Structs struct PhaseShiftDataPhase @@ -1411,10 +1355,4 @@ namespace Game.Networking.Packets public List Phases = new List(); public ObjectGuid PersonalGUID; } - - struct AdventureJournalData - { - public int AdventureJournalID; - public int Priority; - } } diff --git a/sql/updates/hotfixes/master/2021_03_14_00_hotfixes.sql b/sql/updates/hotfixes/master/2021_03_14_00_hotfixes.sql new file mode 100644 index 000000000..1bf231c7e --- /dev/null +++ b/sql/updates/hotfixes/master/2021_03_14_00_hotfixes.sql @@ -0,0 +1,66 @@ +-- +-- Table structure for table `adventure_journal` +-- +DROP TABLE IF EXISTS `adventure_journal`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `adventure_journal` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `Description` text, + `ButtonText` text, + `RewardDescription` text, + `ContinueDescription` text, + `Type` tinyint(3) unsigned NOT NULL DEFAULT '0', + `PlayerConditionID` int(10) unsigned NOT NULL DEFAULT '0', + `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ButtonActionType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `TextureFileDataID` int(11) NOT NULL DEFAULT '0', + `LfgDungeonID` smallint(5) unsigned NOT NULL DEFAULT '0', + `QuestID` int(11) NOT NULL DEFAULT '0', + `BattleMasterListID` smallint(5) unsigned NOT NULL DEFAULT '0', + `PriorityMin` tinyint(3) unsigned NOT NULL DEFAULT '0', + `PriorityMax` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ItemID` int(11) NOT NULL DEFAULT '0', + `ItemQuantity` int(10) unsigned NOT NULL DEFAULT '0', + `CurrencyType` smallint(5) unsigned NOT NULL DEFAULT '0', + `CurrencyQuantity` int(10) unsigned NOT NULL DEFAULT '0', + `UiMapID` smallint(5) unsigned NOT NULL DEFAULT '0', + `BonusPlayerConditionID1` int(10) unsigned NOT NULL DEFAULT '0', + `BonusPlayerConditionID2` int(10) unsigned NOT NULL DEFAULT '0', + `BonusValue1` tinyint(3) unsigned NOT NULL DEFAULT '0', + `BonusValue2` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `adventure_journal_locale` +-- +DROP TABLE IF EXISTS `adventure_journal_locale`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `adventure_journal_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `Description_lang` text, + `ButtonText_lang` text, + `RewardDescription_lang` text, + `ContinueDescription_lang` text, + `VerifiedBuild` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci +/*!50500 PARTITION BY LIST COLUMNS(locale) +(PARTITION deDE VALUES IN ('deDE') ENGINE = InnoDB, + PARTITION esES VALUES IN ('esES') ENGINE = InnoDB, + PARTITION esMX VALUES IN ('esMX') ENGINE = InnoDB, + PARTITION frFR VALUES IN ('frFR') ENGINE = InnoDB, + PARTITION itIT VALUES IN ('itIT') ENGINE = InnoDB, + PARTITION koKR VALUES IN ('koKR') ENGINE = InnoDB, + PARTITION ptBR VALUES IN ('ptBR') ENGINE = InnoDB, + PARTITION ruRU VALUES IN ('ruRU') ENGINE = InnoDB, + PARTITION zhCN VALUES IN ('zhCN') ENGINE = InnoDB, + PARTITION zhTW VALUES IN ('zhTW') ENGINE = InnoDB) */; +/*!40101 SET character_set_client = @saved_cs_client */;