aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2021-11-12 21:53:40 +0100
committerShauren <shauren.trinity@gmail.com>2021-11-12 21:53:40 +0100
commit14b8d7d8393bb99ef66ec833bf89c3d6ce7683ab (patch)
tree4df4ff4db3bc8895488a20c92543d667e398afdb
parentc1915d386c192f75a164ba4157f874fbfbf663dc (diff)
Core/PacketIO: Implemented splash screen opcodes
-rw-r--r--sql/updates/hotfixes/master/2021_11_12_00_hotfixes.sql59
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.cpp9
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.h4
-rw-r--r--src/server/game/DataStores/DB2LoadInfo.h28
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp2
-rw-r--r--src/server/game/DataStores/DB2Stores.h1
-rw-r--r--src/server/game/DataStores/DB2Structure.h20
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp17
-rw-r--r--src/server/game/Server/Packets/MiscPackets.cpp7
-rw-r--r--src/server/game/Server/Packets/MiscPackets.h18
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
-rw-r--r--src/server/game/Server/WorldSession.h3
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