diff options
author | Shauren <shauren.trinity@gmail.com> | 2021-11-12 21:53:40 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-11-12 21:53:40 +0100 |
commit | 14b8d7d8393bb99ef66ec833bf89c3d6ce7683ab (patch) | |
tree | 4df4ff4db3bc8895488a20c92543d667e398afdb | |
parent | c1915d386c192f75a164ba4157f874fbfbf663dc (diff) |
Core/PacketIO: Implemented splash screen opcodes
-rw-r--r-- | sql/updates/hotfixes/master/2021_11_12_00_hotfixes.sql | 59 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/HotfixDatabase.cpp | 9 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/HotfixDatabase.h | 4 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2LoadInfo.h | 28 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.cpp | 2 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.h | 1 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Structure.h | 20 | ||||
-rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 17 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MiscPackets.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MiscPackets.h | 18 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 3 |
12 files changed, 170 insertions, 2 deletions
diff --git a/sql/updates/hotfixes/master/2021_11_12_00_hotfixes.sql b/sql/updates/hotfixes/master/2021_11_12_00_hotfixes.sql new file mode 100644 index 00000000000..198a129275f --- /dev/null +++ b/sql/updates/hotfixes/master/2021_11_12_00_hotfixes.sql @@ -0,0 +1,59 @@ +-- +-- Table structure for table `ui_splash_screen` +-- +DROP TABLE IF EXISTS `ui_splash_screen`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ui_splash_screen` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Header` text, + `TopLeftFeatureTitle` text, + `TopLeftFeatureDesc` text, + `BottomLeftFeatureTitle` text, + `BottomLeftFeatureDesc` text, + `RightFeatureTitle` text, + `RightFeatureDesc` text, + `AllianceQuestID` int(11) NOT NULL DEFAULT '0', + `HordeQuestID` int(11) NOT NULL DEFAULT '0', + `ScreenType` tinyint(4) NOT NULL DEFAULT '0', + `TextureKitID` int(11) NOT NULL DEFAULT '0', + `SoundKitID` int(11) NOT NULL DEFAULT '0', + `PlayerConditionID` int(11) NOT NULL DEFAULT '0', + `CharLevelConditionID` int(11) NOT NULL DEFAULT '0', + `RequiredTimeEventPassed` int(11) 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 `ui_splash_screen_locale` +-- +DROP TABLE IF EXISTS `ui_splash_screen_locale`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ui_splash_screen_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Header_lang` text, + `TopLeftFeatureTitle_lang` text, + `TopLeftFeatureDesc_lang` text, + `BottomLeftFeatureTitle_lang` text, + `BottomLeftFeatureDesc_lang` text, + `RightFeatureTitle_lang` text, + `RightFeatureDesc_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 */; diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index d247e0d6685..81669da1420 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -1639,6 +1639,15 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_UI_MAP_X_MAP_ART, "SELECT ID, PhaseID, UiMapArtID, UiMapID FROM ui_map_x_map_art WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_UI_MAP_X_MAP_ART, "SELECT MAX(ID) + 1 FROM ui_map_x_map_art", CONNECTION_SYNCH); + // UiSplashScreen.db2 + PrepareStatement(HOTFIX_SEL_UI_SPLASH_SCREEN, "SELECT ID, Header, TopLeftFeatureTitle, TopLeftFeatureDesc, BottomLeftFeatureTitle, " + "BottomLeftFeatureDesc, RightFeatureTitle, RightFeatureDesc, AllianceQuestID, HordeQuestID, ScreenType, TextureKitID, SoundKitID, " + "PlayerConditionID, CharLevelConditionID, RequiredTimeEventPassed FROM ui_splash_screen WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PREPARE_MAX_ID_STMT(HOTFIX_SEL_UI_SPLASH_SCREEN, "SELECT MAX(ID) + 1 FROM ui_splash_screen", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_UI_SPLASH_SCREEN, "SELECT ID, Header_lang, TopLeftFeatureTitle_lang, TopLeftFeatureDesc_lang, " + "BottomLeftFeatureTitle_lang, BottomLeftFeatureDesc_lang, RightFeatureTitle_lang, RightFeatureDesc_lang FROM ui_splash_screen_locale" + " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); + // UnitPowerBar.db2 PrepareStatement(HOTFIX_SEL_UNIT_POWER_BAR, "SELECT ID, Name, Cost, OutOfError, ToolTip, MinPower, MaxPower, StartPower, CenterPower, " "RegenerationPeace, RegenerationCombat, BarType, Flags, StartInset, EndInset, FileDataID1, FileDataID2, FileDataID3, FileDataID4, " diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index 8051a913c40..73aa6c24e1c 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -956,6 +956,10 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_UI_MAP_X_MAP_ART, HOTFIX_SEL_UI_MAP_X_MAP_ART_MAX_ID, + HOTFIX_SEL_UI_SPLASH_SCREEN, + HOTFIX_SEL_UI_SPLASH_SCREEN_MAX_ID, + HOTFIX_SEL_UI_SPLASH_SCREEN_LOCALE, + HOTFIX_SEL_UNIT_POWER_BAR, HOTFIX_SEL_UNIT_POWER_BAR_MAX_ID, HOTFIX_SEL_UNIT_POWER_BAR_LOCALE, diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h index 10ab3244764..1d4b28ccfaa 100644 --- a/src/server/game/DataStores/DB2LoadInfo.h +++ b/src/server/game/DataStores/DB2LoadInfo.h @@ -6280,6 +6280,34 @@ struct UiMapXMapArtLoadInfo } }; +struct UiSplashScreenLoadInfo +{ + static DB2LoadInfo const* Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Header" }, + { false, FT_STRING, "TopLeftFeatureTitle" }, + { false, FT_STRING, "TopLeftFeatureDesc" }, + { false, FT_STRING, "BottomLeftFeatureTitle" }, + { false, FT_STRING, "BottomLeftFeatureDesc" }, + { false, FT_STRING, "RightFeatureTitle" }, + { false, FT_STRING, "RightFeatureDesc" }, + { true, FT_INT, "AllianceQuestID" }, + { true, FT_INT, "HordeQuestID" }, + { true, FT_BYTE, "ScreenType" }, + { true, FT_INT, "TextureKitID" }, + { true, FT_INT, "SoundKitID" }, + { true, FT_INT, "PlayerConditionID" }, + { true, FT_INT, "CharLevelConditionID" }, + { true, FT_INT, "RequiredTimeEventPassed" }, + }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, UISplashScreenMeta::Instance(), HOTFIX_SEL_UI_SPLASH_SCREEN); + return &loadInfo; + } +}; + struct UnitPowerBarLoadInfo { static DB2LoadInfo const* Instance() diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 4503e269dc1..2f629d2d2fe 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -323,6 +323,7 @@ DB2Storage<UiMapEntry> sUiMapStore("UiMap.db2", UiMapLo DB2Storage<UiMapAssignmentEntry> sUiMapAssignmentStore("UiMapAssignment.db2", UiMapAssignmentLoadInfo::Instance()); DB2Storage<UiMapLinkEntry> sUiMapLinkStore("UiMapLink.db2", UiMapLinkLoadInfo::Instance()); DB2Storage<UiMapXMapArtEntry> sUiMapXMapArtStore("UiMapXMapArt.db2", UiMapXMapArtLoadInfo::Instance()); +DB2Storage<UISplashScreenEntry> sUISplashScreenStore("UISplashScreen.db2", UiSplashScreenLoadInfo::Instance()); DB2Storage<UnitPowerBarEntry> sUnitPowerBarStore("UnitPowerBar.db2", UnitPowerBarLoadInfo::Instance()); DB2Storage<VehicleEntry> sVehicleStore("Vehicle.db2", VehicleLoadInfo::Instance()); DB2Storage<VehicleSeatEntry> sVehicleSeatStore("VehicleSeat.db2", VehicleSeatLoadInfo::Instance()); @@ -890,6 +891,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul LOAD_DB2(sUiMapAssignmentStore); LOAD_DB2(sUiMapLinkStore); LOAD_DB2(sUiMapXMapArtStore); + LOAD_DB2(sUISplashScreenStore); LOAD_DB2(sUnitPowerBarStore); LOAD_DB2(sVehicleStore); LOAD_DB2(sVehicleSeatStore); diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index 443ec535a1b..cd8e074fb7a 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -238,6 +238,7 @@ TC_GAME_API extern DB2Storage<TransmogSetItemEntry> sTransmogSet TC_GAME_API extern DB2Storage<TransportAnimationEntry> sTransportAnimationStore; TC_GAME_API extern DB2Storage<TransportRotationEntry> sTransportRotationStore; TC_GAME_API extern DB2Storage<UiMapEntry> sUiMapStore; +TC_GAME_API extern DB2Storage<UISplashScreenEntry> sUISplashScreenStore; TC_GAME_API extern DB2Storage<UnitPowerBarEntry> sUnitPowerBarStore; TC_GAME_API extern DB2Storage<VehicleEntry> sVehicleStore; TC_GAME_API extern DB2Storage<VehicleSeatEntry> sVehicleSeatStore; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index 66dd37fa2c4..b0e47e6f028 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -3780,6 +3780,26 @@ struct UiMapXMapArtEntry uint32 UiMapID; }; +struct UISplashScreenEntry +{ + uint32 ID; + LocalizedString Header; + LocalizedString TopLeftFeatureTitle; + LocalizedString TopLeftFeatureDesc; + LocalizedString BottomLeftFeatureTitle; + LocalizedString BottomLeftFeatureDesc; + LocalizedString RightFeatureTitle; + LocalizedString RightFeatureDesc; + int32 AllianceQuestID; + int32 HordeQuestID; + int8 ScreenType; + int32 TextureKitID; + int32 SoundKitID; + int32 PlayerConditionID; + int32 CharLevelConditionID; + int32 RequiredTimeEventPassed; // serverside TimeEvent table, see ModifierTreeType::HasTimeEventPassed +}; + struct UnitPowerBarEntry { uint32 ID; diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index bad9721eb72..9c49cfa17bf 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1171,3 +1171,20 @@ void WorldSession::HandleConversationLineStarted(WorldPackets::Misc::Conversatio if (Conversation* convo = ObjectAccessor::GetConversation(*_player, conversationLineStarted.ConversationGUID)) sScriptMgr->OnConversationLineStarted(convo, conversationLineStarted.LineID, _player); } + +void WorldSession::HandleRequestLatestSplashScreen(WorldPackets::Misc::RequestLatestSplashScreen& /*requestLatestSplashScreen*/) +{ + UISplashScreenEntry const* splashScreen = nullptr; + for (auto itr = sUISplashScreenStore.begin(); itr != sUISplashScreenStore.end(); ++itr) + { + if (PlayerConditionEntry const* playerCondition = sPlayerConditionStore.LookupEntry(itr->CharLevelConditionID)) + if (!ConditionMgr::IsPlayerMeetingCondition(_player, playerCondition)) + continue; + + splashScreen = *itr; + } + + WorldPackets::Misc::SplashScreenShowLatest splashScreenShowLatest; + splashScreenShowLatest.UISplashScreenID = splashScreen ? splashScreen->ID : 0; + SendPacket(splashScreenShowLatest.Write()); +} diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index 4f1f7217e8c..b568f0108d8 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -729,3 +729,10 @@ void WorldPackets::Misc::ConversationLineStarted::Read() _worldPacket >> ConversationGUID; _worldPacket >> LineID; } + +WorldPacket const* WorldPackets::Misc::SplashScreenShowLatest::Write() +{ + _worldPacket << int32(UISplashScreenID); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index 882658cd05a..9e868b33b51 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -934,6 +934,24 @@ namespace WorldPackets ObjectGuid ConversationGUID; uint32 LineID = 0; }; + + class RequestLatestSplashScreen final : public ClientPacket + { + public: + RequestLatestSplashScreen(WorldPacket&& packet) : ClientPacket(CMSG_REQUEST_LATEST_SPLASH_SCREEN, std::move(packet)) { } + + void Read() override { } + }; + + class SplashScreenShowLatest final : public ServerPacket + { + public: + SplashScreenShowLatest() : ServerPacket(SMSG_SPLASH_SCREEN_SHOW_LATEST, 4) { } + + WorldPacket const* Write() override; + + int32 UISplashScreenID = 0; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 05c5f828627..fa1c4deb44b 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -745,7 +745,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_REQUEST_GARRISON_TALENT_WORLD_QUEST_UNLOCKS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_GUILD_PARTY_STATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildRequestPartyState); DEFINE_HANDLER(CMSG_REQUEST_GUILD_REWARDS_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestGuildRewardsList); - DEFINE_HANDLER(CMSG_REQUEST_LATEST_SPLASH_SCREEN, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_REQUEST_LATEST_SPLASH_SCREEN, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestLatestSplashScreen); DEFINE_HANDLER(CMSG_REQUEST_LFG_LIST_BLACKLIST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_MYTHIC_PLUS_AFFIXES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_MYTHIC_PLUS_SEASON_DATA, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); @@ -1930,7 +1930,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_PREPARE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_START, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_VISUAL_LOAD_SCREEN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLASH_SCREEN_SHOW_LATEST, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLASH_SCREEN_SHOW_LATEST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPIRIT_HEALER_CONFIRM, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_STAND_STATE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_ELAPSED_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 7ed836c5ea1..6f56ed013ee 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -506,6 +506,7 @@ namespace WorldPackets class MountSetFavorite; class CloseInteraction; class ConversationLineStarted; + class RequestLatestSplashScreen; } namespace Movement @@ -1784,6 +1785,8 @@ class TC_GAME_API WorldSession void HandleAzeriteEmpoweredItemViewed(WorldPackets::Azerite::AzeriteEmpoweredItemViewed& azeriteEmpoweredItemViewed); void HandleAzeriteEmpoweredItemSelectPower(WorldPackets::Azerite::AzeriteEmpoweredItemSelectPower& azeriteEmpoweredItemSelectPower); + void HandleRequestLatestSplashScreen(WorldPackets::Misc::RequestLatestSplashScreen& requestLatestSplashScreen); + union ConnectToKey { struct |