mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2024-11-22 05:27:19 +00:00
Fix shooting gallery leaderboard bugs
- add weekly functionality for top scores - Fix shooting gallery score saving - remove extra leaderboard fetch
This commit is contained in:
parent
d340874284
commit
238fc98ea5
@ -89,12 +89,12 @@ void Leaderboard::QueryToLdf(std::unique_ptr<sql::ResultSet>& rows) {
|
|||||||
entry.push_back(new LDFData<uint64_t>(u"RowNumber", rows->getInt("ranking")));
|
entry.push_back(new LDFData<uint64_t>(u"RowNumber", rows->getInt("ranking")));
|
||||||
switch (leaderboardType) {
|
switch (leaderboardType) {
|
||||||
case Type::ShootingGallery:
|
case Type::ShootingGallery:
|
||||||
entry.push_back(new LDFData<float>(u"HitPercentage", (rows->getInt("primaryScore") / 100.0f)));
|
entry.push_back(new LDFData<int32_t>(u"Score", rows->getInt("primaryScore")));
|
||||||
// HitPercentage:3 between 0 and 1
|
|
||||||
entry.push_back(new LDFData<int32_t>(u"Score", rows->getInt("secondaryScore")));
|
|
||||||
// Score:1
|
// Score:1
|
||||||
entry.push_back(new LDFData<int32_t>(u"Streak", rows->getInt("tertiaryScore")));
|
entry.push_back(new LDFData<int32_t>(u"Streak", rows->getInt("secondaryScore")));
|
||||||
// Streak:1
|
// Streak:1
|
||||||
|
entry.push_back(new LDFData<float>(u"HitPercentage", (rows->getInt("tertiaryScore") / 100.0f)));
|
||||||
|
// HitPercentage:3 between 0 and 1
|
||||||
break;
|
break;
|
||||||
case Type::Racing:
|
case Type::Racing:
|
||||||
entry.push_back(new LDFData<float>(u"BestTime", rows->getDouble("primaryScore")));
|
entry.push_back(new LDFData<float>(u"BestTime", rows->getDouble("primaryScore")));
|
||||||
@ -229,14 +229,14 @@ void Leaderboard::SetupLeaderboard(bool weekly, uint32_t resultStart, uint32_t r
|
|||||||
// For top query, we want to just rank all scores, but for all others we need the scores around a specific player
|
// For top query, we want to just rank all scores, but for all others we need the scores around a specific player
|
||||||
std::string baseLookup;
|
std::string baseLookup;
|
||||||
if (this->infoType == InfoType::Top) {
|
if (this->infoType == InfoType::Top) {
|
||||||
baseLookup = "SELECT id FROM leaderboard WHERE game_id = ? ORDER BY ";
|
baseLookup = "SELECT id, last_played FROM leaderboard WHERE game_id = ? " + (this->weekly ? weeklyFilter : std::string("")) + " ORDER BY ";
|
||||||
baseLookup += orderBase.data();
|
baseLookup += orderBase.data();
|
||||||
} else {
|
} else {
|
||||||
baseLookup = "SELECT id FROM leaderboard WHERE game_id = ? AND character_id = ";
|
baseLookup = "SELECT id, last_played FROM leaderboard WHERE game_id = ? " + (this->weekly ? weeklyFilter : std::string("")) + " AND character_id = ";
|
||||||
baseLookup += std::to_string(static_cast<uint32_t>(this->relatedPlayer));
|
baseLookup += std::to_string(static_cast<uint32_t>(this->relatedPlayer));
|
||||||
}
|
}
|
||||||
baseLookup += " LIMIT 1";
|
baseLookup += " LIMIT 1";
|
||||||
|
Game::logger->LogDebug("LeaderboardManager", "query is %s", baseLookup.c_str());
|
||||||
std::unique_ptr<sql::PreparedStatement> baseQuery(Database::CreatePreppedStmt(baseLookup));
|
std::unique_ptr<sql::PreparedStatement> baseQuery(Database::CreatePreppedStmt(baseLookup));
|
||||||
baseQuery->setInt(1, this->gameID);
|
baseQuery->setInt(1, this->gameID);
|
||||||
std::unique_ptr<sql::ResultSet> baseResult(baseQuery->executeQuery());
|
std::unique_ptr<sql::ResultSet> baseResult(baseQuery->executeQuery());
|
||||||
@ -251,7 +251,7 @@ void Leaderboard::SetupLeaderboard(bool weekly, uint32_t resultStart, uint32_t r
|
|||||||
int32_t res = snprintf(lookupBuffer.get(), STRING_LENGTH, queryBase.c_str(), orderBase.data(), filter.c_str(), resultStart, resultEnd);
|
int32_t res = snprintf(lookupBuffer.get(), STRING_LENGTH, queryBase.c_str(), orderBase.data(), filter.c_str(), resultStart, resultEnd);
|
||||||
DluAssert(res != -1);
|
DluAssert(res != -1);
|
||||||
std::unique_ptr<sql::PreparedStatement> query(Database::CreatePreppedStmt(lookupBuffer.get()));
|
std::unique_ptr<sql::PreparedStatement> query(Database::CreatePreppedStmt(lookupBuffer.get()));
|
||||||
|
Game::logger->LogDebug("LeaderboardManager", "Query is %s vars are %i %i %i", lookupBuffer.get(), this->gameID, this->relatedPlayer, relatedPlayerLeaderboardId);
|
||||||
query->setInt(1, this->gameID);
|
query->setInt(1, this->gameID);
|
||||||
if (this->infoType == InfoType::Friends) {
|
if (this->infoType == InfoType::Friends) {
|
||||||
query->setInt(2, this->relatedPlayer);
|
query->setInt(2, this->relatedPlayer);
|
||||||
|
@ -546,13 +546,13 @@ void SGCannon::StopGame(Entity* self, bool cancel) {
|
|||||||
|
|
||||||
// The player won, store all the score and send rewards
|
// The player won, store all the score and send rewards
|
||||||
if (!cancel) {
|
if (!cancel) {
|
||||||
int32_t percentage = 50;
|
int32_t percentage = 0.0f;
|
||||||
auto misses = self->GetVar<uint32_t>(MissesVariable);
|
auto misses = self->GetVar<uint32_t>(MissesVariable);
|
||||||
auto fired = self->GetVar<uint32_t>(ShotsFiredVariable);
|
auto fired = self->GetVar<uint32_t>(ShotsFiredVariable);
|
||||||
|
|
||||||
// if (fired > 0) {
|
if (fired > 0) {
|
||||||
// percentage = misses / fired;
|
percentage = misses / fired;
|
||||||
// }
|
}
|
||||||
|
|
||||||
auto* missionComponent = player->GetComponent<MissionComponent>();
|
auto* missionComponent = player->GetComponent<MissionComponent>();
|
||||||
|
|
||||||
@ -566,7 +566,7 @@ void SGCannon::StopGame(Entity* self, bool cancel) {
|
|||||||
|
|
||||||
StopActivity(self, player->GetObjectID(), self->GetVar<uint32_t>(TotalScoreVariable), self->GetVar<uint32_t>(MaxStreakVariable), percentage);
|
StopActivity(self, player->GetObjectID(), self->GetVar<uint32_t>(TotalScoreVariable), self->GetVar<uint32_t>(MaxStreakVariable), percentage);
|
||||||
SaveScore(self, player->GetObjectID(),
|
SaveScore(self, player->GetObjectID(),
|
||||||
static_cast<float>(self->GetVar<uint32_t>(TotalScoreVariable)), percentage, static_cast<float>(self->GetVar<uint32_t>(MaxStreakVariable)));
|
static_cast<float>(self->GetVar<uint32_t>(TotalScoreVariable)), static_cast<float>(self->GetVar<uint32_t>(MaxStreakVariable)), percentage);
|
||||||
self->SetNetworkVar<bool>(AudioFinalWaveDoneVariable, true);
|
self->SetNetworkVar<bool>(AudioFinalWaveDoneVariable, true);
|
||||||
|
|
||||||
// Give the player the model rewards they earned
|
// Give the player the model rewards they earned
|
||||||
@ -580,17 +580,6 @@ void SGCannon::StopGame(Entity* self, bool cancel) {
|
|||||||
self->SetNetworkVar<std::u16string>(u"UI_Rewards",
|
self->SetNetworkVar<std::u16string>(u"UI_Rewards",
|
||||||
GeneralUtils::to_u16string(self->GetVar<uint32_t>(TotalScoreVariable)) + u"_0_0_0_0_0_0"
|
GeneralUtils::to_u16string(self->GetVar<uint32_t>(TotalScoreVariable)) + u"_0_0_0_0_0_0"
|
||||||
);
|
);
|
||||||
|
|
||||||
GameMessages::SendRequestActivitySummaryLeaderboardData(
|
|
||||||
player->GetObjectID(),
|
|
||||||
self->GetObjectID(),
|
|
||||||
player->GetSystemAddress(),
|
|
||||||
GetGameID(self),
|
|
||||||
1,
|
|
||||||
10,
|
|
||||||
0,
|
|
||||||
false
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GameMessages::SendActivityStop(self->GetObjectID(), false, cancel, player->GetSystemAddress());
|
GameMessages::SendActivityStop(self->GetObjectID(), false, cancel, player->GetSystemAddress());
|
||||||
|
@ -5,8 +5,6 @@ ALTER TABLE leaderboard
|
|||||||
MODIFY time INT NOT NULL DEFAULT 0;
|
MODIFY time INT NOT NULL DEFAULT 0;
|
||||||
|
|
||||||
/* Can only ALTER one column at a time... */
|
/* Can only ALTER one column at a time... */
|
||||||
ALTER TABLE leaderboard
|
|
||||||
CHANGE last_played last_played TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP();
|
|
||||||
ALTER TABLE leaderboard CHANGE score primaryScore FLOAT NOT NULL DEFAULT 0;
|
ALTER TABLE leaderboard CHANGE score primaryScore FLOAT NOT NULL DEFAULT 0;
|
||||||
ALTER TABLE leaderboard CHANGE time secondaryScore FLOAT NOT NULL DEFAULT 0 AFTER primaryScore;
|
ALTER TABLE leaderboard CHANGE time secondaryScore FLOAT NOT NULL DEFAULT 0 AFTER primaryScore;
|
||||||
|
|
||||||
@ -14,3 +12,7 @@ ALTER TABLE leaderboard CHANGE time secondaryScore FLOAT NOT NULL DEFAULT 0 AFTE
|
|||||||
UPDATE leaderboard SET
|
UPDATE leaderboard SET
|
||||||
primaryScore = secondaryScore,
|
primaryScore = secondaryScore,
|
||||||
secondaryScore = 0 WHERE game_id IN (1, 44, 46, 47, 48, 49, 53, 103, 104, 108, 1901);
|
secondaryScore = 0 WHERE game_id IN (1, 44, 46, 47, 48, 49, 53, 103, 104, 108, 1901);
|
||||||
|
|
||||||
|
/* Do this last so we dont update entry times erroneously */
|
||||||
|
ALTER TABLE leaderboard
|
||||||
|
CHANGE last_played last_played TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP();
|
||||||
|
Loading…
Reference in New Issue
Block a user