Skip to content

Commit

Permalink
fix: remove destroyable damage data field for profile updates, lb enh…
Browse files Browse the repository at this point in the history
…ancements
  • Loading branch information
chatasma committed Jul 14, 2024
1 parent 087be9c commit 22fe0de
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ sealed class PlayerUpdateData {
@SerialName("MatchEndUpdateData")
data class MatchEndUpdateData(val data: MatchEndData) : PlayerUpdateData()
@SerialName("DestroyableDamageUpdateData")
data class DestroyableDamageUpdateData(val data: DestroyableDamageData, val blockCount: Int) : PlayerUpdateData()
data class DestroyableDamageUpdateData(val blockCount: Int) : PlayerUpdateData()
@SerialName("DestroyableDestroyUpdateData")
data class DestroyableDestroyUpdateData(val percentage: Float, val blockCount: Int) : PlayerUpdateData()
@SerialName("CoreLeakUpdateData")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ data class LeaderboardEntry(
)

enum class LeaderboardScoreType {
KILLS, DEATHS, XP
KILLS, DEATHS, XP, WINS, LOSSES
}

enum class LeaderboardPeriod {
ALL_TIME, DAILY
ALL_TIME, DAILY, WEEKLY, MONTHLY, YEARLY
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import net.kyori.adventure.text.Component
import net.kyori.adventure.text.format.NamedTextColor
import network.warzone.mars.Mars
import network.warzone.mars.player.commands.ModCommands
import network.warzone.mars.player.feature.PlayerFeature
import network.warzone.mars.player.models.PlayerProfile
import network.warzone.mars.player.models.PlayerStats
import network.warzone.mars.utils.enumify
import network.warzone.mars.utils.getUsername
Expand Down Expand Up @@ -35,13 +37,21 @@ class LeaderboardCommands {
}
Mars.asyncAsFutureWithResult {
LeaderboardClient.fetchLeaderboardEntries(scoreTypeAndPeriod.first, scoreTypeAndPeriod.second)
}.thenCompose {
Mars.asyncAsFutureWithResult {
it.map { entry ->
val player = PlayerFeature.fetch(entry.name)
player to entry
}
}
}.thenApply { lbEntries ->
val message = audience.multiLine()
lbEntries.mapIndexed { idx, entry ->
val username = getUsername(UUID.fromString(entry.id), entry.name, match, offlineNameProvider = ModCommands.offlineNameProvider)
val (entryPlayer, lbEntry) = entry
val username = getUsername(UUID.fromString(lbEntry.id), lbEntry.name, match, offlineNameProvider = ModCommands.offlineNameProvider)
Component.text("${idx + 1}. ", NamedTextColor.GOLD)
.append(username).append(Component.text(": ", NamedTextColor.GRAY))
.append(formatScore(scoreTypeAndPeriod.first, entry.score))
.append(formatScore(scoreTypeAndPeriod.first, scoreTypeAndPeriod.second, lbEntry.score, entryPlayer))
}.forEach {
message.appendMultiLineComponent(it)
}
Expand All @@ -55,17 +65,35 @@ class LeaderboardCommands {
}
}

private fun formatScore(scoreType: LeaderboardScoreType, score: Int) : Component =
private fun formatScore(scoreType: LeaderboardScoreType, period: LeaderboardPeriod, score: Int, player: PlayerProfile?) : Component =
when (scoreType) {
LeaderboardScoreType.XP -> {
Component.text(score, NamedTextColor.YELLOW).append(
Component.text(" (Level: ${PlayerStats.EXP_FORMULA.getLevelFromExp(score.toDouble())})",
NamedTextColor.GRAY)
)
Component.text(score, NamedTextColor.YELLOW)
.append(Component.space())
.append(
if (period == LeaderboardPeriod.ALL_TIME)
Component.text(
" (Level: ${PlayerStats.EXP_FORMULA.getLevelFromExp(score.toDouble())})",
NamedTextColor.GRAY
)
else getLevelsGainedFormatted(score, player)
)
}
else -> Component.text(score, NamedTextColor.YELLOW)
}

private fun getLevelsGainedFormatted(differential: Int, player: PlayerProfile?) : Component {
if (player == null) return Component.empty()
val playerXp = player.stats.xp
val prevLevel = PlayerStats.EXP_FORMULA.getLevelFromExp((playerXp - differential).toDouble())
val currentLevel = PlayerStats.EXP_FORMULA.getLevelFromExp(playerXp.toDouble())
val gained = currentLevel - prevLevel
if (gained == 0) {
return Component.text("(No levels gained)", NamedTextColor.GRAY)
}
return Component.text("(Gained ${gained} level${if (gained == 1) "" else "s"})", NamedTextColor.LIGHT_PURPLE)
}

private fun validateScoreTypeAndPeriod(scoreType: String?, period: String?) : Pair<LeaderboardScoreType, LeaderboardPeriod>? {
if (scoreType == null) return null
val scoreType = getEnumVariant<LeaderboardScoreType>(scoreType)
Expand Down

0 comments on commit 22fe0de

Please sign in to comment.