diff options
author | Shauren <shauren.trinity@gmail.com> | 2021-03-14 13:07:29 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-03-14 13:07:29 +0100 |
commit | d0246e5835ea184b22896e6b354fb28c28890810 (patch) | |
tree | 9631475374982307816ab5da5637168ef4975913 | |
parent | c15cf8b424be0cf60150fbc7ddaf4574f78d72fd (diff) |
Core/AdventureJournal: Check if player can access adventure journal with ChrClassUIDisplay.db2
-rw-r--r-- | sql/updates/hotfixes/master/2021_03_14_01_hotfixes.sql | 15 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/HotfixDatabase.cpp | 5 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/HotfixDatabase.h | 3 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2LoadInfo.h | 16 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.cpp | 15 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.h | 1 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Structure.h | 8 | ||||
-rw-r--r-- | src/server/game/Handlers/AdventureJournalHandler.cpp | 8 |
8 files changed, 71 insertions, 0 deletions
diff --git a/sql/updates/hotfixes/master/2021_03_14_01_hotfixes.sql b/sql/updates/hotfixes/master/2021_03_14_01_hotfixes.sql new file mode 100644 index 00000000000..78636252fd6 --- /dev/null +++ b/sql/updates/hotfixes/master/2021_03_14_01_hotfixes.sql @@ -0,0 +1,15 @@ +-- +-- Table structure for table `chr_class_ui_display` +-- +DROP TABLE IF EXISTS `chr_class_ui_display`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `chr_class_ui_display` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `ChrClassesID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `AdvGuidePlayerConditionID` int(10) unsigned NOT NULL DEFAULT '0', + `SplashPlayerConditionID` int(10) 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 */; diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index 9b354df9c84..ec64cfec926 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -290,6 +290,11 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_CHAT_CHANNELS, "SELECT ID, Name_lang, Shortcut_lang FROM chat_channels_locale WHERE (`VerifiedBuild` > 0) = ?" " AND locale = ?", CONNECTION_SYNCH); + // ChrClassUiDisplay.db2 + PrepareStatement(HOTFIX_SEL_CHR_CLASS_UI_DISPLAY, "SELECT ID, ChrClassesID, AdvGuidePlayerConditionID, SplashPlayerConditionID" + " FROM chr_class_ui_display WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_CLASS_UI_DISPLAY, "SELECT MAX(ID) + 1 FROM chr_class_ui_display", CONNECTION_SYNCH); + // ChrClasses.db2 PrepareStatement(HOTFIX_SEL_CHR_CLASSES, "SELECT Name, Filename, NameMale, NameFemale, PetNameToken, Description, RoleInfoString, DisabledString, " "HyphenatedNameMale, HyphenatedNameFemale, ID, CreateScreenFileDataID, SelectScreenFileDataID, IconFileDataID, LowResScreenFileDataID, Flags, " diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index ab10790569b..25578abe017 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -184,6 +184,9 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_CHAT_CHANNELS_MAX_ID, HOTFIX_SEL_CHAT_CHANNELS_LOCALE, + HOTFIX_SEL_CHR_CLASS_UI_DISPLAY, + HOTFIX_SEL_CHR_CLASS_UI_DISPLAY_MAX_ID, + HOTFIX_SEL_CHR_CLASSES, HOTFIX_SEL_CHR_CLASSES_MAX_ID, HOTFIX_SEL_CHR_CLASSES_LOCALE, diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h index 1e6a7be3926..9334aa9410b 100644 --- a/src/server/game/DataStores/DB2LoadInfo.h +++ b/src/server/game/DataStores/DB2LoadInfo.h @@ -932,6 +932,22 @@ struct ChatChannelsLoadInfo } }; +struct ChrClassUiDisplayLoadInfo +{ + static DB2LoadInfo const* Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_BYTE, "ChrClassesID" }, + { false, FT_INT, "AdvGuidePlayerConditionID" }, + { false, FT_INT, "SplashPlayerConditionID" }, + }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrClassUIDisplayMeta::Instance(), HOTFIX_SEL_CHR_CLASS_UI_DISPLAY); + return &loadInfo; + } +}; + struct ChrClassesLoadInfo { static DB2LoadInfo const* Instance() diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index e92e3eccc99..ca25dca78ba 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -87,6 +87,7 @@ DB2Storage<CharTitlesEntry> sCharTitlesStore("CharTitles.db2 DB2Storage<CharacterLoadoutEntry> sCharacterLoadoutStore("CharacterLoadout.db2", CharacterLoadoutLoadInfo::Instance()); DB2Storage<CharacterLoadoutItemEntry> sCharacterLoadoutItemStore("CharacterLoadoutItem.db2", CharacterLoadoutItemLoadInfo::Instance()); DB2Storage<ChatChannelsEntry> sChatChannelsStore("ChatChannels.db2", ChatChannelsLoadInfo::Instance()); +DB2Storage<ChrClassUIDisplayEntry> sChrClassUIDisplayStore("ChrClassUIDisplay.db2", ChrClassUiDisplayLoadInfo::Instance()); DB2Storage<ChrClassesEntry> sChrClassesStore("ChrClasses.db2", ChrClassesLoadInfo::Instance()); DB2Storage<ChrClassesXPowerTypesEntry> sChrClassesXPowerTypesStore("ChrClassesXPowerTypes.db2", ChrClassesXPowerTypesLoadInfo::Instance()); DB2Storage<ChrCustomizationChoiceEntry> sChrCustomizationChoiceStore("ChrCustomizationChoice.db2", ChrCustomizationChoiceLoadInfo::Instance()); @@ -393,6 +394,7 @@ namespace std::unordered_map<uint32 /*azeritePowerSetId*/, std::vector<AzeritePowerSetMemberEntry const*>> _azeritePowers; std::unordered_map<std::pair<uint32 /*azeriteUnlockSetId*/, ItemContext>, std::array<uint8, MAX_AZERITE_EMPOWERED_TIER>> _azeriteTierUnlockLevels; std::unordered_map<std::pair<uint32 /*itemId*/, ItemContext>, AzeriteUnlockMappingEntry const*> _azeriteUnlockMappings; + std::array<ChrClassUIDisplayEntry const*, MAX_CLASSES> _uiDisplayByClass; std::array<std::array<uint32, MAX_POWERS>, MAX_CLASSES> _powersByClass; std::unordered_map<uint32 /*chrCustomizationOptionId*/, std::vector<ChrCustomizationChoiceEntry const*>> _chrCustomizationChoicesByOption; std::unordered_map<std::pair<uint8, uint8>, ChrModelEntry const*> _chrModelsByRaceAndGender; @@ -620,6 +622,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul LOAD_DB2(sCharacterLoadoutStore); LOAD_DB2(sCharacterLoadoutItemStore); LOAD_DB2(sChatChannelsStore); + LOAD_DB2(sChrClassUIDisplayStore); LOAD_DB2(sChrClassesStore); LOAD_DB2(sChrClassesXPowerTypesStore); LOAD_DB2(sChrCustomizationChoiceStore); @@ -935,6 +938,12 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul ASSERT(BATTLE_PET_SPECIES_MAX_ID >= sBattlePetSpeciesStore.GetNumRows(), "BATTLE_PET_SPECIES_MAX_ID (%d) must be equal to or greater than %u", BATTLE_PET_SPECIES_MAX_ID, sBattlePetSpeciesStore.GetNumRows()); + for (ChrClassUIDisplayEntry const* uiDisplay : sChrClassUIDisplayStore) + { + ASSERT(uiDisplay->ChrClassesID < MAX_CLASSES); + _uiDisplayByClass[uiDisplay->ChrClassesID] = uiDisplay; + } + { std::set<ChrClassesXPowerTypesEntry const*, ChrClassesXPowerTypesEntryComparator> powers; for (ChrClassesXPowerTypesEntry const* power : sChrClassesXPowerTypesStore) @@ -1793,6 +1802,12 @@ char const* DB2Manager::GetBroadcastTextValue(BroadcastTextEntry const* broadcas return broadcastText->Text[DEFAULT_LOCALE]; } +ChrClassUIDisplayEntry const* DB2Manager::GetUiDisplayForClass(Classes unitClass) const +{ + ASSERT(unitClass < MAX_CLASSES); + return _uiDisplayByClass[unitClass]; +} + char const* DB2Manager::GetClassName(uint8 class_, LocaleConstant locale /*= DEFAULT_LOCALE*/) { ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(class_); diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index 522ff49fa91..e6736fd4fd1 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -337,6 +337,7 @@ public: std::vector<AzeritePowerSetMemberEntry const*> const* GetAzeritePowers(uint32 itemId) const; uint32 GetRequiredAzeriteLevelForAzeritePowerTier(uint32 azeriteUnlockSetId, ItemContext context, uint32 tier) const; static char const* GetBroadcastTextValue(BroadcastTextEntry const* broadcastText, LocaleConstant locale = DEFAULT_LOCALE, uint8 gender = GENDER_MALE, bool forceGender = false); + ChrClassUIDisplayEntry const* GetUiDisplayForClass(Classes unitClass) const; static char const* GetClassName(uint8 class_, LocaleConstant locale = DEFAULT_LOCALE); uint32 GetPowerIndexByClass(Powers power, uint32 classId) const; std::vector<ChrCustomizationChoiceEntry const*> const* GetCustomiztionChoices(uint32 chrCustomizationOptionId) const; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index aa88e0fc7b4..fc4a7fa6b21 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -549,6 +549,14 @@ struct ChatChannelsEntry int32 Ruleset; }; +struct ChrClassUIDisplayEntry +{ + uint32 ID; + uint8 ChrClassesID; + uint32 AdvGuidePlayerConditionID; + uint32 SplashPlayerConditionID; +}; + struct ChrClassesEntry { LocalizedString Name; diff --git a/src/server/game/Handlers/AdventureJournalHandler.cpp b/src/server/game/Handlers/AdventureJournalHandler.cpp index bd7ea30e511..7d8fffcf87f 100644 --- a/src/server/game/Handlers/AdventureJournalHandler.cpp +++ b/src/server/game/Handlers/AdventureJournalHandler.cpp @@ -24,6 +24,10 @@ void WorldSession::HandleAdventureJournalOpenQuest(WorldPackets::AdventureJournal::AdventureJournalOpenQuest& openQuest)
{
+ if (ChrClassUIDisplayEntry const* uiDisplay = sDB2Manager.GetUiDisplayForClass(Classes(_player->getClass())))
+ if (!_player->MeetPlayerCondition(uiDisplay->AdvGuidePlayerConditionID))
+ return;
+
AdventureJournalEntry const* adventureJournal = sAdventureJournalStore.LookupEntry(openQuest.AdventureJournalID);
if (!adventureJournal)
return;
@@ -41,6 +45,10 @@ void WorldSession::HandleAdventureJournalOpenQuest(WorldPackets::AdventureJourna void WorldSession::HandleAdventureJournalUpdateSuggestions(WorldPackets::AdventureJournal::AdventureJournalUpdateSuggestions& updateSuggestions)
{
+ if (ChrClassUIDisplayEntry const* uiDisplay = sDB2Manager.GetUiDisplayForClass(Classes(_player->getClass())))
+ if (!_player->MeetPlayerCondition(uiDisplay->AdvGuidePlayerConditionID))
+ return;
+
WorldPackets::AdventureJournal::AdventureJournalDataResponse response;
response.OnLevelUp = updateSuggestions.OnLevelUp;
|