Implement leaderboard page offsets

This commit is contained in:
EmosewaMC 2023-05-08 19:35:19 -07:00
parent 5c086909ed
commit d98ad4b94f
5 changed files with 23 additions and 27 deletions

View File

@ -14,7 +14,6 @@ std::vector<MetricVariable> Metrics::m_Variables = {
MetricVariable::CPUTime, MetricVariable::CPUTime,
MetricVariable::Sleep, MetricVariable::Sleep,
MetricVariable::Frame, MetricVariable::Frame,
MetricVariable::Leaderboard,
}; };
void Metrics::AddMeasurement(MetricVariable variable, int64_t value) { void Metrics::AddMeasurement(MetricVariable variable, int64_t value) {

View File

@ -33,6 +33,9 @@ void Leaderboard::WriteLeaderboardRow(std::ostringstream& leaderboard, const uin
} }
void Leaderboard::Serialize(RakNet::BitStream* bitStream) { void Leaderboard::Serialize(RakNet::BitStream* bitStream) {
bitStream->Write(gameID);
bitStream->Write(leaderboardType);
std::ostringstream leaderboard; std::ostringstream leaderboard;
leaderboard << "ADO.Result=7:1\n"; // Unused in 1.10.64, but is in captures leaderboard << "ADO.Result=7:1\n"; // Unused in 1.10.64, but is in captures
@ -49,7 +52,9 @@ void Leaderboard::Serialize(RakNet::BitStream* bitStream) {
} }
// Serialize the thing to a BitStream // Serialize the thing to a BitStream
bitStream->Write(leaderboard.str().c_str(), leaderboard.tellp()); bitStream->WriteAlignedBytes((const unsigned char*)leaderboard.str().c_str(), leaderboard.tellp());
bitStream->Write0();
bitStream->Write0();
} }
bool Leaderboard::GetRankingQuery(std::string& lookupReturn) const { bool Leaderboard::GetRankingQuery(std::string& lookupReturn) const {
@ -234,7 +239,7 @@ std::string Leaderboard::GetOrdering(Leaderboard::Type leaderboardType) {
return orderBase; return orderBase;
} }
void Leaderboard::SetupLeaderboard() { void Leaderboard::SetupLeaderboard(uint32_t resultStart, uint32_t resultEnd) {
std::string queryBase = std::string queryBase =
R"QUERY( R"QUERY(
WITH leaderboardsRanked AS ( WITH leaderboardsRanked AS (
@ -259,9 +264,9 @@ void Leaderboard::SetupLeaderboard() {
SELECT %s, character_id, UNIX_TIMESTAMP(last_played) as lastPlayed, leaderboardsRanked.name, leaderboardsRanked.ranking FROM leaderboardsRanked, myStanding, lowestRanking SELECT %s, character_id, UNIX_TIMESTAMP(last_played) as lastPlayed, leaderboardsRanked.name, leaderboardsRanked.ranking FROM leaderboardsRanked, myStanding, lowestRanking
WHERE leaderboardsRanked.ranking WHERE leaderboardsRanked.ranking
BETWEEN BETWEEN
LEAST(GREATEST(CAST(myRank AS SIGNED) - 5, 1), lowestRanking.lowestRank - 10) LEAST(GREATEST(CAST(myRank AS SIGNED) - 5, %i), lowestRanking.lowestRank - 10)
AND AND
LEAST(GREATEST(myRank + 5, 11), lowestRanking.lowestRank) LEAST(GREATEST(myRank + 5, %i), lowestRanking.lowestRank)
ORDER BY ranking ASC; ORDER BY ranking ASC;
)QUERY"; )QUERY";
@ -289,8 +294,14 @@ void Leaderboard::SetupLeaderboard() {
constexpr uint16_t STRING_LENGTH = 1526; constexpr uint16_t STRING_LENGTH = 1526;
char lookupBuffer[STRING_LENGTH]; char lookupBuffer[STRING_LENGTH];
// If we are getting the friends leaderboard, add the friends query, otherwise fill it in with nothing. // If we are getting the friends leaderboard, add the friends query, otherwise fill it in with nothing.
if (this->infoType == InfoType::Friends) snprintf(lookupBuffer, STRING_LENGTH, queryBase.c_str(), orderBase.c_str(), friendsQuery, selectBase.c_str()); if (this->infoType == InfoType::Friends) {
else snprintf(lookupBuffer, STRING_LENGTH, queryBase.c_str(), orderBase.c_str(), "", selectBase.c_str()); snprintf(lookupBuffer, STRING_LENGTH, queryBase.c_str(),
orderBase.c_str(), friendsQuery, selectBase.c_str(), resultStart + 1, resultEnd + 1);
}
else {
snprintf(lookupBuffer, STRING_LENGTH, queryBase.c_str(),
orderBase.c_str(), "", selectBase.c_str(), resultStart + 1, resultEnd + 1);
}
std::string baseLookupStr; std::string baseLookupStr;
char baseRankingBuffer[STRING_LENGTH]; char baseRankingBuffer[STRING_LENGTH];
@ -328,7 +339,7 @@ void Leaderboard::SetupLeaderboard() {
QueryToLdf(result); QueryToLdf(result);
} }
void Leaderboard::Send(LWOOBJID targetID) const { void Leaderboard::Send(LWOOBJID targetID) {
auto* player = EntityManager::Instance()->GetEntity(relatedPlayer); auto* player = EntityManager::Instance()->GetEntity(relatedPlayer);
if (player != nullptr) { if (player != nullptr) {
GameMessages::SendActivitySummaryLeaderboardData(targetID, this, player->GetSystemAddress()); GameMessages::SendActivitySummaryLeaderboardData(targetID, this, player->GetSystemAddress());
@ -516,14 +527,12 @@ void LeaderboardManager::SaveScore(const LWOOBJID& playerID, GameID gameID, Lead
va_end(argsCopy); va_end(argsCopy);
} }
// Done
void LeaderboardManager::SendLeaderboard(uint32_t gameID, Leaderboard::InfoType infoType, bool weekly, LWOOBJID targetID, LWOOBJID playerID) { void LeaderboardManager::SendLeaderboard(uint32_t gameID, Leaderboard::InfoType infoType, bool weekly, LWOOBJID targetID, LWOOBJID playerID) {
Leaderboard leaderboard(gameID, infoType, weekly, playerID, GetLeaderboardType(gameID)); Leaderboard leaderboard(gameID, infoType, weekly, playerID, GetLeaderboardType(gameID));
leaderboard.SetupLeaderboard(); leaderboard.SetupLeaderboard();
leaderboard.Send(targetID); leaderboard.Send(targetID);
} }
// Done
Leaderboard::Type LeaderboardManager::GetLeaderboardType(const GameID gameID) { Leaderboard::Type LeaderboardManager::GetLeaderboardType(const GameID gameID) {
auto lookup = leaderboardCache.find(gameID); auto lookup = leaderboardCache.find(gameID);
if (lookup != leaderboardCache.end()) return lookup->second; if (lookup != leaderboardCache.end()) return lookup->second;

View File

@ -64,12 +64,12 @@ public:
/** /**
* Builds the leaderboard from the database based on the associated gameID * Builds the leaderboard from the database based on the associated gameID
*/ */
void SetupLeaderboard(); void SetupLeaderboard(uint32_t resultStart = 0, uint32_t resultEnd = 10);
/** /**
* Sends the leaderboard to the client specified by targetID. * Sends the leaderboard to the client specified by targetID.
*/ */
void Send(LWOOBJID targetID) const; void Send(LWOOBJID targetID);
// Helper functions to get the columns, ordering and insert format for a leaderboard // Helper functions to get the columns, ordering and insert format for a leaderboard
static std::string GetColumns(Type leaderboardType); static std::string GetColumns(Type leaderboardType);

View File

@ -1631,26 +1631,14 @@ void GameMessages::HandleActivitySummaryLeaderboardData(RakNet::BitStream* instr
Game::logger->Log("AGS", "We got mail!"); Game::logger->Log("AGS", "We got mail!");
} }
void GameMessages::SendActivitySummaryLeaderboardData(const LWOOBJID& objectID, const Leaderboard* leaderboard, const SystemAddress& sysAddr) { void GameMessages::SendActivitySummaryLeaderboardData(const LWOOBJID& objectID, Leaderboard* leaderboard, const SystemAddress& sysAddr) {
CBITSTREAM; CBITSTREAM;
CMSGHEADER; CMSGHEADER;
bitStream.Write(objectID); bitStream.Write(objectID);
bitStream.Write(GAME_MSG::GAME_MSG_SEND_ACTIVITY_SUMMARY_LEADERBOARD_DATA); bitStream.Write(GAME_MSG::GAME_MSG_SEND_ACTIVITY_SUMMARY_LEADERBOARD_DATA);
throw "";
//bitStream.Write(leaderboard->GetGameID());
//bitStream.Write(leaderboard->GetInfoType());
// Leaderboard is written back as LDF string leaderboard->Serialize(&bitStream);
//const auto leaderboardString = leaderboard->ToString();
//bitStream.Write<uint32_t>(leaderboardString.size());
//for (const auto c : leaderboardString) {
// bitStream.Write<uint16_t>(c);
//}
//if (!leaderboardString.empty()) bitStream.Write(uint16_t(0));
bitStream.Write0();
bitStream.Write0();
SEND_PACKET; SEND_PACKET;
} }

View File

@ -561,7 +561,7 @@ namespace GameMessages {
void SendUpdateReputation(const LWOOBJID objectId, const int64_t reputation, const SystemAddress& sysAddr); void SendUpdateReputation(const LWOOBJID objectId, const int64_t reputation, const SystemAddress& sysAddr);
// Leaderboards // Leaderboards
void SendActivitySummaryLeaderboardData(const LWOOBJID& objectID, const Leaderboard* leaderboard, void SendActivitySummaryLeaderboardData(const LWOOBJID& objectID, Leaderboard* leaderboard,
const SystemAddress& sysAddr = UNASSIGNED_SYSTEM_ADDRESS); const SystemAddress& sysAddr = UNASSIGNED_SYSTEM_ADDRESS);
void HandleActivitySummaryLeaderboardData(RakNet::BitStream* instream, Entity* entity, const SystemAddress& sysAddr); void HandleActivitySummaryLeaderboardData(RakNet::BitStream* instream, Entity* entity, const SystemAddress& sysAddr);
void SendRequestActivitySummaryLeaderboardData(const LWOOBJID& objectID, const LWOOBJID& targetID, void SendRequestActivitySummaryLeaderboardData(const LWOOBJID& objectID, const LWOOBJID& targetID,