From 3addbe7dd418259149c39fc3b9423f7809de696a Mon Sep 17 00:00:00 2001 From: Osleyder85 Date: Sun, 14 Mar 2021 00:21:31 +0100 Subject: Core/AdventureJournal: Handle CMSG_ADVENTURE_JOURNAL_OPEN_QUEST and CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS Merges #26000 --- .../Database/Implementation/HotfixDatabase.cpp | 9 +++ .../Database/Implementation/HotfixDatabase.h | 4 ++ src/server/game/DataStores/DB2LoadInfo.h | 37 ++++++++++++ src/server/game/DataStores/DB2Stores.cpp | 2 + src/server/game/DataStores/DB2Stores.h | 1 + src/server/game/DataStores/DB2Structure.h | 27 +++++++++ .../game/Handlers/AdventureJournalHandler.cpp | 59 +++++++++++++++++++ .../Server/Packets/AdventureJournalPackets.cpp | 54 ++++++++++++++++++ .../game/Server/Packets/AdventureJournalPackets.h | 66 ++++++++++++++++++++++ src/server/game/Server/Packets/AllPackets.h | 1 + src/server/game/Server/Protocol/Opcodes.cpp | 6 +- src/server/game/Server/WorldSession.h | 10 ++++ 12 files changed, 273 insertions(+), 3 deletions(-) create mode 100644 src/server/game/Handlers/AdventureJournalHandler.cpp create mode 100644 src/server/game/Server/Packets/AdventureJournalPackets.cpp create mode 100644 src/server/game/Server/Packets/AdventureJournalPackets.h (limited to 'src') diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index 33102e07235..227cb119562 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -43,6 +43,15 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_ACHIEVEMENT, "SELECT ID, Description_lang, Title_lang, Reward_lang FROM achievement_locale" " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); + // AdventureJournal.db2 + PrepareStatement(HOTFIX_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 WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PREPARE_MAX_ID_STMT(HOTFIX_SEL_ADVENTURE_JOURNAL, "SELECT MAX(ID) + 1 FROM adventure_journal", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_ADVENTURE_JOURNAL, "SELECT ID, Name_lang, Description_lang, ButtonText_lang, RewardDescription_lang, " + "ContinueDescription_lang FROM adventure_journal_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); + // AnimationData.db2 PrepareStatement(HOTFIX_SEL_ANIMATION_DATA, "SELECT ID, BehaviorID, BehaviorTier, Fallback, Flags1, Flags2 FROM animation_data" " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index 4990680e6c9..ab10790569b 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -35,6 +35,10 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_ACHIEVEMENT_MAX_ID, HOTFIX_SEL_ACHIEVEMENT_LOCALE, + HOTFIX_SEL_ADVENTURE_JOURNAL, + HOTFIX_SEL_ADVENTURE_JOURNAL_MAX_ID, + HOTFIX_SEL_ADVENTURE_JOURNAL_LOCALE, + HOTFIX_SEL_ANIMATION_DATA, HOTFIX_SEL_ANIMATION_DATA_MAX_ID, diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h index 7af372f4fac..1e1b95b98f5 100644 --- a/src/server/game/DataStores/DB2LoadInfo.h +++ b/src/server/game/DataStores/DB2LoadInfo.h @@ -53,6 +53,43 @@ struct AchievementLoadInfo } }; +struct AdventureJournalLoadInfo +{ + static DB2LoadInfo const* Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_STRING, "Description" }, + { false, FT_STRING, "ButtonText" }, + { false, FT_STRING, "RewardDescription" }, + { false, FT_STRING, "ContinueDescription" }, + { false, FT_BYTE, "Type" }, + { false, FT_INT, "PlayerConditionId" }, + { false, FT_BYTE, "Flags" }, + { false, FT_BYTE, "ButtonActionType" }, + { true, FT_INT, "TextureFileDataId" }, + { false, FT_SHORT, "LfgDungeonId" }, + { true, FT_INT, "QuestId" }, + { false, FT_SHORT, "BattleMasterListId" }, + { false, FT_BYTE, "PriorityMin" }, + { false, FT_BYTE, "PriorityMax" }, + { true, FT_INT, "ItemId" }, + { false, FT_INT, "ItemQuantity" }, + { false, FT_SHORT, "CurrencyType" }, + { false, FT_INT, "CurrencyQuantity" }, + { false, FT_SHORT, "UiMapId" }, + { false, FT_INT, "BonusPlayerConditionId1" }, + { false, FT_INT, "BonusPlayerConditionId2" }, + { false, FT_BYTE, "BonusValue1" }, + { false, FT_BYTE, "BonusValue2" }, + }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, AdventureJournalMeta::Instance(), HOTFIX_SEL_ADVENTURE_JOURNAL); + return &loadInfo; + } +}; + struct AnimationDataLoadInfo { static DB2LoadInfo const* Instance() diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 21aa5f25cda..e92e3eccc99 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -42,6 +42,7 @@ #endif DB2Storage sAchievementStore("Achievement.db2", AchievementLoadInfo::Instance()); +DB2Storage sAdventureJournalStore("AdventureJournal.db2", AdventureJournalLoadInfo::Instance()); DB2Storage sAnimationDataStore("AnimationData.db2", AnimationDataLoadInfo::Instance()); DB2Storage sAnimKitStore("AnimKit.db2", AnimKitLoadInfo::Instance()); DB2Storage sAreaGroupMemberStore("AreaGroupMember.db2", AreaGroupMemberLoadInfo::Instance()); @@ -575,6 +576,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul #define LOAD_DB2(store) LoadDB2(availableDb2Locales, loadErrors, _stores, &store, db2Path, defaultLocale, GetCppRecordSize(store)) LOAD_DB2(sAchievementStore); + LOAD_DB2(sAdventureJournalStore); LOAD_DB2(sAnimationDataStore); LOAD_DB2(sAnimKitStore); LOAD_DB2(sAreaGroupMemberStore); diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index dc4d0aa8c34..522ff49fa91 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -36,6 +36,7 @@ class DB2HotfixGeneratorBase; TC_GAME_API extern DB2Storage sAchievementStore; +TC_GAME_API extern DB2Storage sAdventureJournalStore; TC_GAME_API extern DB2Storage sAnimationDataStore; TC_GAME_API extern DB2Storage sAnimKitStore; TC_GAME_API extern DB2Storage sAreaTableStore; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index 6a03d0d138c..bebc686f461 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -46,6 +46,33 @@ struct AchievementEntry int32 CovenantID; }; +struct AdventureJournalEntry +{ + uint32 ID; + LocalizedString Name; + LocalizedString Description; + LocalizedString ButtonText; + LocalizedString RewardDescription; + LocalizedString ContinueDescription; + uint8 Type; + uint32 PlayerConditionID; + uint8 Flags; + uint8 ButtonActionType; + int32 TextureFileDataID; + uint16 LfgDungeonID; + int32 QuestID; + uint16 BattleMasterListID; + uint8 PriorityMin; + uint8 PriorityMax; + int32 ItemID; + uint32 ItemQuantity; + uint16 CurrencyType; + uint32 CurrencyQuantity; + uint16 UiMapID; + int32 BonusPlayerConditionID[2]; + uint8 BonusValue[2]; +}; + struct AnimationDataEntry { uint32 ID; diff --git a/src/server/game/Handlers/AdventureJournalHandler.cpp b/src/server/game/Handlers/AdventureJournalHandler.cpp new file mode 100644 index 00000000000..bd7ea30e511 --- /dev/null +++ b/src/server/game/Handlers/AdventureJournalHandler.cpp @@ -0,0 +1,59 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * 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 2 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 . + */ + +#include "WorldSession.h" +#include "AdventureJournalPackets.h" +#include "DB2Stores.h" +#include "GossipDef.h" +#include "ObjectMgr.h" +#include "Player.h" + +void WorldSession::HandleAdventureJournalOpenQuest(WorldPackets::AdventureJournal::AdventureJournalOpenQuest& openQuest) +{ + AdventureJournalEntry const* adventureJournal = sAdventureJournalStore.LookupEntry(openQuest.AdventureJournalID); + if (!adventureJournal) + return; + + if (!_player->MeetPlayerCondition(adventureJournal->PlayerConditionID)) + return; + + Quest const* quest = sObjectMgr->GetQuestTemplate(adventureJournal->QuestID); + if (!quest) + return; + + if (_player->CanTakeQuest(quest, true)) + _player->PlayerTalkClass->SendQuestGiverQuestDetails(quest, _player->GetGUID(), true, false); +} + +void WorldSession::HandleAdventureJournalUpdateSuggestions(WorldPackets::AdventureJournal::AdventureJournalUpdateSuggestions& updateSuggestions) +{ + WorldPackets::AdventureJournal::AdventureJournalDataResponse response; + response.OnLevelUp = updateSuggestions.OnLevelUp; + + for (AdventureJournalEntry const* adventureJournal : sAdventureJournalStore) + { + if (_player->MeetPlayerCondition(adventureJournal->PlayerConditionID)) + { + WorldPackets::AdventureJournal::AdventureJournalEntry adventureJournalData; + adventureJournalData.AdventureJournalID = int32(adventureJournal->ID); + adventureJournalData.Priority = int32(adventureJournal->PriorityMax); + response.Entries.push_back(adventureJournalData); + } + } + + SendPacket(response.Write()); +} diff --git a/src/server/game/Server/Packets/AdventureJournalPackets.cpp b/src/server/game/Server/Packets/AdventureJournalPackets.cpp new file mode 100644 index 00000000000..49f4b9e785d --- /dev/null +++ b/src/server/game/Server/Packets/AdventureJournalPackets.cpp @@ -0,0 +1,54 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * 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 2 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 . + */ + +#include "AdventureJournalPackets.h" + +namespace WorldPackets +{ +namespace AdventureJournal +{ +void AdventureJournalOpenQuest::Read() +{ + _worldPacket >> AdventureJournalID; +} + +void AdventureJournalUpdateSuggestions::Read() +{ + OnLevelUp = _worldPacket.ReadBit(); +} + +ByteBuffer& operator<<(ByteBuffer& data, AdventureJournalEntry const& adventureJournalEntry) +{ + data << int32(adventureJournalEntry.AdventureJournalID); + data << int32(adventureJournalEntry.Priority); + + return data; +} + +WorldPacket const* AdventureJournalDataResponse::Write() +{ + _worldPacket.WriteBit(OnLevelUp); + _worldPacket.FlushBits(); + _worldPacket << uint32(Entries.size()); + + for (AdventureJournalEntry const& adventureJournalEntry : Entries) + _worldPacket << adventureJournalEntry; + + return &_worldPacket; +} +} +} diff --git a/src/server/game/Server/Packets/AdventureJournalPackets.h b/src/server/game/Server/Packets/AdventureJournalPackets.h new file mode 100644 index 00000000000..b87638b929c --- /dev/null +++ b/src/server/game/Server/Packets/AdventureJournalPackets.h @@ -0,0 +1,66 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * 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 2 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 . + */ + +#ifndef AdventureJournalPackets_h__ +#define AdventureJournalPackets_h__ + +#include "Packet.h" + +namespace WorldPackets +{ + namespace AdventureJournal + { + class AdventureJournalOpenQuest final : public ClientPacket + { + public: + AdventureJournalOpenQuest(WorldPacket&& packet) : ClientPacket(CMSG_ADVENTURE_JOURNAL_OPEN_QUEST, std::move(packet)) { } + + void Read() override; + + int32 AdventureJournalID = 0; + }; + + class AdventureJournalUpdateSuggestions final : public ClientPacket + { + public: + AdventureJournalUpdateSuggestions(WorldPacket&& packet) : ClientPacket(CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS, std::move(packet)) { } + + void Read() override; + + bool OnLevelUp = false; + }; + + struct AdventureJournalEntry + { + int32 AdventureJournalID = 0; + int32 Priority = 0; + }; + + class AdventureJournalDataResponse final : public ServerPacket + { + public: + AdventureJournalDataResponse() : ServerPacket(SMSG_ADVENTURE_JOURNAL_DATA_RESPONSE, 7) { } + + WorldPacket const* Write() override; + + bool OnLevelUp = false; + std::vector Entries; + }; + } +} + +#endif // AdventureJournalPackets_h__ diff --git a/src/server/game/Server/Packets/AllPackets.h b/src/server/game/Server/Packets/AllPackets.h index e095cd30f6a..2f7d09f732d 100644 --- a/src/server/game/Server/Packets/AllPackets.h +++ b/src/server/game/Server/Packets/AllPackets.h @@ -20,6 +20,7 @@ #include "AchievementPackets.h" #include "AddonPackets.h" +#include "AdventureJournalPackets.h" #include "AreaTriggerPackets.h" #include "ArtifactPackets.h" #include "AuctionHousePackets.h" diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 94aa90fbc11..91942f5937d 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -141,9 +141,9 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_ADD_FRIEND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAddFriendOpcode); DEFINE_HANDLER(CMSG_ADD_IGNORE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAddIgnoreOpcode); DEFINE_HANDLER(CMSG_ADD_TOY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAddToy); - DEFINE_HANDLER(CMSG_ADVENTURE_JOURNAL_OPEN_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_ADVENTURE_JOURNAL_OPEN_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAdventureJournalOpenQuest); DEFINE_HANDLER(CMSG_ADVENTURE_JOURNAL_START_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAdventureJournalUpdateSuggestions); DEFINE_HANDLER(CMSG_ALTER_APPEARANCE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAlterAppearance); DEFINE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAreaSpiritHealerQueryOpcode); DEFINE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUEUE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAreaSpiritHealerQueueOpcode); @@ -934,7 +934,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADD_LOSS_OF_CONTROL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADD_RUNE_POWER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADJUST_SPLINE_DURATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADVENTURE_JOURNAL_DATA_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADVENTURE_JOURNAL_DATA_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADVENTURE_MAP_OPEN_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AE_LOOT_TARGETS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AE_LOOT_TARGET_ACK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 139a2afa9a0..aabd13e98c9 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -92,6 +92,12 @@ namespace WorldPackets class GuildGetAchievementMembers; } + namespace AdventureJournal + { + class AdventureJournalOpenQuest; + class AdventureJournalUpdateSuggestions; + } + namespace AreaTrigger { class AreaTrigger; @@ -1680,6 +1686,10 @@ class TC_GAME_API WorldSession void HandleRequestCategoryCooldowns(WorldPackets::Spells::RequestCategoryCooldowns& requestCategoryCooldowns); void HandleCloseInteraction(WorldPackets::Misc::CloseInteraction& closeInteraction); + // Adventure Journal + void HandleAdventureJournalOpenQuest(WorldPackets::AdventureJournal::AdventureJournalOpenQuest& openQuest); + void HandleAdventureJournalUpdateSuggestions(WorldPackets::AdventureJournal::AdventureJournalUpdateSuggestions& updateSuggestions); + // Toys void HandleAddToy(WorldPackets::Toy::AddToy& packet); void HandleUseToy(WorldPackets::Toy::UseToy& packet); -- cgit v1.2.3