Working in game!

- Add score saving for races
- Fix some bugs
- Still work to do.
This commit is contained in:
David Markowitz
2023-05-09 01:42:11 -07:00
parent 411c9eaf1f
commit 7a067e7b48
7 changed files with 46 additions and 31 deletions

View File

@@ -16,6 +16,8 @@
#include "CDActivitiesTable.h"
#include "Metrics.hpp"
LeaderboardManager::LeaderboardCache LeaderboardManager::leaderboardCache = {};
Leaderboard::Leaderboard(const GameID gameID, const Leaderboard::InfoType infoType, const bool weekly, LWOOBJID relatedPlayer, const Leaderboard::Type leaderboardType) {
this->gameID = gameID;
this->weekly = weekly;
@@ -34,10 +36,10 @@ void Leaderboard::WriteLeaderboardRow(std::ostringstream& leaderboard, const uin
void Leaderboard::Serialize(RakNet::BitStream* bitStream) {
bitStream->Write(gameID);
bitStream->Write(leaderboardType);
bitStream->Write(infoType);
std::ostringstream leaderboard;
Game::logger->Log("LeaderboardManager", "game is %i info type %i ", gameID, infoType);
leaderboard << "ADO.Result=7:1\n"; // Unused in 1.10.64, but is in captures
leaderboard << "Result.Count=1:1\n"; // number of results, always 1?
leaderboard << "Result[0].Index=0:RowNumber\n"; // "Primary key"
@@ -46,13 +48,18 @@ void Leaderboard::Serialize(RakNet::BitStream* bitStream) {
int32_t rowNumber = 0;
for (auto& entry : entries) {
for (auto* data : entry) {
Game::logger->Log("LeaderboardManager", "writing data %s", data->GetString().c_str());
WriteLeaderboardRow(leaderboard, rowNumber, data);
}
rowNumber++;
}
Game::logger->Log("LeaderboardManager", "leaderboard is %s", leaderboard.str().c_str());
// Serialize the thing to a BitStream
bitStream->WriteAlignedBytes((const unsigned char*)leaderboard.str().c_str(), leaderboard.tellp());
uint32_t leaderboardSize = leaderboard.tellp();
bitStream->Write<uint32_t>(leaderboardSize);
// Doing this all in 1 call so there is no possbility of a dangling pointer.
bitStream->WriteAlignedBytes(reinterpret_cast<const unsigned char*>(GeneralUtils::ASCIIToUTF16(leaderboard.str()).c_str()), leaderboard.tellp() * 2);
if (leaderboardSize > 0) bitStream->Write<uint16_t>(0);
bitStream->Write0();
bitStream->Write0();
}
@@ -80,7 +87,7 @@ void Leaderboard::QueryToLdf(std::unique_ptr<sql::ResultSet>& rows) {
entry.push_back(new LDFData<uint64_t>(u"LastPlayed", rows->getUInt64("lastPlayed")));
entry.push_back(new LDFData<int32_t>(u"NumPlayed", 1));
entry.push_back(new LDFData<std::u16string>(u"name", GeneralUtils::ASCIIToUTF16(rows->getString("name").c_str())));
entry.push_back(new LDFData<int32_t>(u"RowNumber", rows->getInt("ranking")));
entry.push_back(new LDFData<uint64_t>(u"RowNumber", rows->getInt("ranking")));
switch (leaderboardType) {
case Type::ShootingGallery:
entry.push_back(new LDFData<float>(u"HitPercentage", rows->getDouble("hitPercentage")));
@@ -101,7 +108,7 @@ void Leaderboard::QueryToLdf(std::unique_ptr<sql::ResultSet>& rows) {
// NumWins:1
break;
case Type::UnusedLeaderboard4:
entry.push_back(new LDFData<int32_t>(u"Score", rows->getInt("score")));
entry.push_back(new LDFData<int32_t>(u"Points", rows->getInt("score")));
// Points:1
break;
case Type::MonumentRace:
@@ -113,19 +120,19 @@ void Leaderboard::QueryToLdf(std::unique_ptr<sql::ResultSet>& rows) {
// Time:1
break;
case Type::Survival:
entry.push_back(new LDFData<int32_t>(u"Score", rows->getInt("score")));
entry.push_back(new LDFData<int32_t>(u"Points", rows->getInt("score")));
// Points:1
entry.push_back(new LDFData<int32_t>(u"Time", rows->getInt("bestTime")));
// Time:1
break;
case Type::SurvivalNS:
entry.push_back(new LDFData<int32_t>(u"Score", rows->getInt("score")));
entry.push_back(new LDFData<int32_t>(u"Wave", rows->getInt("score")));
// Wave:1
entry.push_back(new LDFData<int32_t>(u"Time", rows->getInt("bestTime")));
// Time:1
break;
case Type::Donations:
entry.push_back(new LDFData<int32_t>(u"Score", rows->getInt("score")));
entry.push_back(new LDFData<int32_t>(u"Points", rows->getInt("score")));
// Score:1
break;
case Type::None:
@@ -320,11 +327,13 @@ void Leaderboard::SetupLeaderboard(uint32_t resultStart, uint32_t resultEnd) {
}
std::unique_ptr<sql::ResultSet> baseResult(baseQuery->executeQuery());
Game::logger->Log("LeaderboardManager", "%s", baseRankingBuffer);
if (!baseResult->next()) return; // In this case, there are no entries in the leaderboard for this game.
uint32_t relatedPlayerLeaderboardId = baseResult->getInt("id");
// Create and execute the actual save here
Game::logger->Log("LeaderboardManager", "query is %s", lookupBuffer);
std::unique_ptr<sql::PreparedStatement> query(Database::CreatePreppedStmt(lookupBuffer));
query->setInt(1, this->gameID);
@@ -461,7 +470,7 @@ void LeaderboardManager::SaveScore(const LWOOBJID& playerID, GameID gameID, Lead
int32_t time;
time = va_arg(argsCopy, int32_t);
if (time < oldTime) {
if (time > oldTime) {
saveQuery = FormatInsert(selectedColumns, insertFormat, activityScore, true);
}
break;
@@ -507,7 +516,8 @@ void LeaderboardManager::SaveScore(const LWOOBJID& playerID, GameID gameID, Lead
case Leaderboard::Type::None:
default:
Game::logger->Log("LeaderboardManager", "Unknown leaderboard type %i. Cannot save score!", leaderboardType);
break;
va_end(argsCopy);
return;
}
} else {
saveQuery = FormatInsert(selectedColumns, insertFormat, activityScore, false);
@@ -543,7 +553,7 @@ Leaderboard::Type LeaderboardManager::GetLeaderboardType(const GameID gameID) {
std::vector<CDActivities> activities = activitiesTable->Query([=](const CDActivities& entry) {
return (entry.ActivityID == gameID);
});
auto type = activities.empty() ? static_cast<Leaderboard::Type>(activities.at(0).leaderboardType) : Leaderboard::Type::None;
auto type = !activities.empty() ? static_cast<Leaderboard::Type>(activities.at(0).leaderboardType) : Leaderboard::Type::None;
leaderboardCache.insert_or_assign(gameID, type);
return type;
}

View File

@@ -23,6 +23,7 @@
#include "dConfig.h"
#include "Loot.h"
#include "eMissionTaskType.h"
#include "LeaderboardManager.h"
#ifndef M_PI
#define M_PI 3.14159265358979323846264338327950288
@@ -391,9 +392,7 @@ void RacingControlComponent::HandleMessageBoxResponse(Entity* player,
}
if (id == "rewardButton") {
if (data->collectedRewards) {
return;
}
if (data->collectedRewards) return;
data->collectedRewards = true;
@@ -401,6 +400,8 @@ void RacingControlComponent::HandleMessageBoxResponse(Entity* player,
const auto score = m_LoadedPlayers * 10 + data->finished;
LootGenerator::Instance().GiveActivityLoot(player, m_Parent, m_ActivityID, score);
auto leaderboardType = LeaderboardManager::Instance().GetLeaderboardType(m_ActivityID);
LeaderboardManager::Instance().SaveScore(player->GetObjectID(), m_ActivityID, leaderboardType, 3, data->bestLapTime, data->raceTime, data->finished == 1);
// Giving rewards
GameMessages::SendNotifyRacingClient(

View File

@@ -1639,7 +1639,7 @@ void GameMessages::SendActivitySummaryLeaderboardData(const LWOOBJID& objectID,
bitStream.Write(GAME_MSG::GAME_MSG_SEND_ACTIVITY_SUMMARY_LEADERBOARD_DATA);
leaderboard->Serialize(&bitStream);
PacketUtils::SavePacket("leaderboardData.bin", (const char*)bitStream.GetData(), bitStream.GetNumberOfBytesUsed());
SEND_PACKET;
}
@@ -1661,7 +1661,7 @@ void GameMessages::HandleRequestActivitySummaryLeaderboardData(RakNet::BitStream
bool weekly = inStream->ReadBit();
LeaderboardManager::Instance().SendLeaderboard(gameID, queryType, weekly, target, resultsStart, resultsEnd);
LeaderboardManager::Instance().SendLeaderboard(gameID, queryType, weekly, entity->GetObjectID(), resultsStart, resultsEnd);
}
void GameMessages::HandleActivityStateChangeRequest(RakNet::BitStream* inStream, Entity* entity) {