aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/garden/farming/EliteFarmingWeight.kt102
1 files changed, 57 insertions, 45 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/EliteFarmingWeight.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/EliteFarmingWeight.kt
index ca7ad1cc5..52344999c 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/EliteFarmingWeight.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/EliteFarmingWeight.kt
@@ -10,7 +10,6 @@ import at.hannibal2.skyhanni.features.garden.GardenAPI
import at.hannibal2.skyhanni.features.garden.farming.GardenCropSpeed.getSpeed
import at.hannibal2.skyhanni.utils.APIUtil
import at.hannibal2.skyhanni.utils.LorenzUtils
-import at.hannibal2.skyhanni.utils.LorenzUtils.round
import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings
import at.hannibal2.skyhanni.utils.TimeUtils
import kotlinx.coroutines.Dispatchers
@@ -47,9 +46,8 @@ class EliteFarmingWeight {
leaderboardPosition = -1
dirtyCropWeight = true
lastLeaderboardUpdate = 0
- nextPlayerWeight = 0.0
- nextPlayerName = ""
- hasPassedNext = false
+
+ nextPlayers.clear()
localCounter.clear()
}
@@ -58,7 +56,7 @@ class EliteFarmingWeight {
display = emptyList()
profileId = ""
weight = -2.0
-
+ nextPlayers.clear()
}
var tick = 0
@@ -86,9 +84,8 @@ class EliteFarmingWeight {
private var isLoadingWeight = false
private var isLoadingLeaderboard = false
- private var nextPlayerName = ""
- private var nextPlayerWeight = 0.0
- private var hasPassedNext = false
+ private var nextPlayers = mutableListOf<UpcomingPlayer>()
+ private val nextPlayer get() = nextPlayers.firstOrNull()
private fun update() {
if (!GardenAPI.inGarden()) return
@@ -134,8 +131,8 @@ class EliteFarmingWeight {
private fun getLeaderboard(): String {
if (!config.eliteFarmingWeightLeaderboard) return ""
- // Fetching new leaderboard position every 10 minutes
- if (System.currentTimeMillis() > lastLeaderboardUpdate + 600_000) {
+ // Fetching new leaderboard position every 10.5 minutes
+ if (System.currentTimeMillis() > lastLeaderboardUpdate + 630_000) {
if (!isLoadingLeaderboard) {
isLoadingLeaderboard = true
SkyHanniMod.coroutineScope.launch {
@@ -171,30 +168,40 @@ class EliteFarmingWeight {
private fun getETA(): String {
if (weight < 0) return ""
- if (nextPlayerName.isEmpty()) return ""
- val nextName = if (leaderboardPosition == -1) "#1000" else nextPlayerName
+ var nextPlayer = nextPlayer ?: return ""
+ var nextName = if (leaderboardPosition == -1) "#10000" else nextPlayer.name
+
val totalWeight = (localWeight + weight)
- val weightUntilOvertake = nextPlayerWeight - totalWeight
+ var weightUntilOvertake = nextPlayer.weight - totalWeight
+
if (weightUntilOvertake < 0) {
- if (!hasPassedNext) {
- if (weightPerSecond > 0) {
- LorenzUtils.debug("weightPerSecond: '$weightPerSecond'")
- LorenzUtils.chat("§e[SkyHanni] You passed §b$nextName §ein the Farming Weight Leaderboard!")
- }
- if (leaderboardPosition == -1) {
- leaderboardPosition = 1000
- } else {
- leaderboardPosition--
- }
- hasPassedNext = true
+ if (weightPerSecond > 0) {
+ LorenzUtils.debug("weightPerSecond: '$weightPerSecond'")
+ LorenzUtils.chat("§e[SkyHanni] You passed §b$nextName §ein the Farming Weight Leaderboard!")
}
- return "§cWaiting for leaderboard update..."
+
+ // Lower leaderboard position
+ if (leaderboardPosition == -1) {
+ leaderboardPosition = 10000
+ } else {
+ leaderboardPosition--
+ }
+
+ // Remove passed player to present the next one
+ nextPlayers.removeFirst()
+
+ // Display waiting message if nextPlayers list is empty
+ nextPlayer = this.nextPlayer ?: return "§cWaiting for leaderboard update..."
+ // Update values to next player
+ nextName = nextPlayer.name
+ weightUntilOvertake = nextPlayer.weight - totalWeight
}
- if (nextPlayerWeight == 0.0) {
+ if (nextPlayer.weight == 0.0) {
return "§cRejoin the garden to show ETA!"
}
+
val timeFormat = if (weightPerSecond != -1.0) {
val timeTillOvertake = (weightUntilOvertake / weightPerSecond) * 1000
val format = TimeUtils.formatDuration(timeTillOvertake.toLong())
@@ -225,7 +232,7 @@ class EliteFarmingWeight {
}
private fun getExactWeight(): Double {
- val values = calculateCollectionWeight(false).values
+ val values = calculateCollectionWeight().values
return if (values.isNotEmpty()) {
values.sum()
} else 0.0
@@ -233,14 +240,18 @@ class EliteFarmingWeight {
private suspend fun loadLeaderboardPosition() = try {
val uuid = LorenzUtils.getPlayerUuid()
- val showNext = if (isEtaEnabled()) "?showNext=true" else ""
- val url = "https://elitebot.dev/api/leaderboard/rank/weight/farming/$uuid/$profileId$showNext"
+ val includeUpcoming = if (isEtaEnabled()) "?includeUpcoming=true" else ""
+ val url = "https://api.elitebot.dev/leaderboard/rank/farmingweight/$uuid/$profileId$includeUpcoming"
val result = withContext(Dispatchers.IO) { APIUtil.getJSONResponse(url) }.asJsonObject
if (isEtaEnabled()) {
- result["next"]?.asJsonObject?.let {
- nextPlayerName = it["ign"].asString
- nextPlayerWeight = it["amount"].asDouble
+ nextPlayers.clear()
+ // Array of 0-5 upcoming players (or possibly null)
+ result["upcomingPlayers"]?.asJsonArray?.let {
+ for (player in it) {
+ val playerData = player.asJsonObject
+ nextPlayers.add(UpcomingPlayer(playerData["ign"].asString, playerData["amount"].asDouble))
+ }
}
}
@@ -253,16 +264,16 @@ class EliteFarmingWeight {
private suspend fun loadWeight(localProfile: String) {
val uuid = LorenzUtils.getPlayerUuid()
- val url = "https://elitebot.dev/api/weight/$uuid"
+ val url = "https://api.elitebot.dev/weight/$uuid"
try {
val result = withContext(Dispatchers.IO) { APIUtil.getJSONResponse(url) }.asJsonObject
- for (profileEntry in result["profiles"].asJsonObject.entrySet()) {
- val profile = profileEntry.value.asJsonObject
- val profileName = profile["cute_name"].asString.lowercase()
+ for (profileEntry in result["profiles"].asJsonArray) {
+ val profile = profileEntry.asJsonObject
+ val profileName = profile["profileName"].asString.lowercase()
if (profileName == localProfile) {
- profileId = profileEntry.key
- weight = profile["farming"].asJsonObject["total"].asDouble
+ profileId = profile["profileId"].asString
+ weight = profile["totalWeight"].asDouble
localCounter.clear()
dirtyCropWeight = true
@@ -286,14 +297,13 @@ class EliteFarmingWeight {
LorenzUtils.chat("§eYou can re-enter the garden to try to fix the problem. If this message repeats itself, please report it on Discord!")
}
- private fun calculateCollectionWeight(round: Boolean = true): MutableMap<CropType, Double> {
+ private fun calculateCollectionWeight(): MutableMap<CropType, Double> {
val weightPerCrop = mutableMapOf<CropType, Double>()
var totalWeight = 0.0
for (crop in CropType.values()) {
val weight = crop.getLocalCounter() / crop.getFactor()
- val roundedWeight = weight.let { if (round) it.round(2) else it }
- weightPerCrop[crop] = roundedWeight
- totalWeight += roundedWeight
+ weightPerCrop[crop] = weight
+ totalWeight += weight
}
if (totalWeight > 0) {
weightPerCrop[CropType.MUSHROOM] = specialMushroomWeight(weightPerCrop, totalWeight)
@@ -319,16 +329,18 @@ class EliteFarmingWeight {
private val factorPerCrop by lazy {
mapOf(
CropType.WHEAT to 100_000.0,
- CropType.CARROT to 300_000.0,
+ CropType.CARROT to 302_061.86,
CropType.POTATO to 300_000.0,
CropType.SUGAR_CANE to 200_000.0,
CropType.NETHER_WART to 250_000.0,
- CropType.PUMPKIN to 90_066.27,
- CropType.MELON to 450_324.6,
+ CropType.PUMPKIN to 98_284.71,
+ CropType.MELON to 485_308.47,
CropType.MUSHROOM to 90_178.06,
CropType.COCOA_BEANS to 267_174.04,
CropType.CACTUS to 177_254.45,
)
}
+
+ data class UpcomingPlayer(val name: String, val weight: Double)
}
} \ No newline at end of file