Core/PacketIO: Implemented splash screen opcodes

This commit is contained in:
Shauren
2021-11-12 21:53:40 +01:00
parent c1915d386c
commit 14b8d7d839
12 changed files with 170 additions and 2 deletions

View File

@@ -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 */;

View File

@@ -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, "

View File

@@ -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,

View File

@@ -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()

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;

View File

@@ -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());
}

View File

@@ -729,3 +729,10 @@ void WorldPackets::Misc::ConversationLineStarted::Read()
_worldPacket >> ConversationGUID;
_worldPacket >> LineID;
}
WorldPacket const* WorldPackets::Misc::SplashScreenShowLatest::Write()
{
_worldPacket << int32(UISplashScreenID);
return &_worldPacket;
}

View File

@@ -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;
};
}
}

View File

@@ -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);

View File

@@ -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