From ee84a09894c450c35ac619cd3870b3887059985d Mon Sep 17 00:00:00 2001 From: hannibal2 <24389977+hannibal002@users.noreply.github.com> Date: Wed, 19 Apr 2023 15:34:43 +0200 Subject: composter fix (#50) Co-authored-by: hannibal2 <24389977+hannibal00212@users.noreply.github.com> --- .../java/at/hannibal2/skyhanni/SkyHanniMod.java | 2 +- .../at/hannibal2/skyhanni/data/MayorElection.kt | 90 +++++++++++++++++++++ .../hannibal2/skyhanni/data/MayorElectionData.kt | 91 ---------------------- .../at/hannibal2/skyhanni/data/repo/RepoUtils.kt | 7 +- .../skyhanni/events/RepositoryReloadEvent.kt | 9 ++- .../features/garden/composter/ComposterOverlay.kt | 37 +++++---- .../garden/farming/GardenCropMilestoneDisplay.kt | 6 +- .../at/hannibal2/skyhanni/utils/MayorData.java | 77 ------------------ .../skyhanni/utils/jsonobjects/GardenJson.java | 14 ++++ .../skyhanni/utils/jsonobjects/MayorJson.java | 77 ++++++++++++++++++ 10 files changed, 215 insertions(+), 195 deletions(-) create mode 100644 src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt delete mode 100644 src/main/java/at/hannibal2/skyhanni/data/MayorElectionData.kt delete mode 100644 src/main/java/at/hannibal2/skyhanni/utils/MayorData.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/GardenJson.java create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MayorJson.java (limited to 'src/main/java') diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java index 734e4921a..76633751e 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java @@ -145,7 +145,7 @@ public class SkyHanniMod { loadModule(new GuiEditManager()); loadModule(UpdateManager.INSTANCE); loadModule(new CropAccessoryData()); - loadModule(new MayorElectionData()); + loadModule(new MayorElection()); loadModule(new GardenComposterUpgradesData()); // APIs diff --git a/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt b/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt new file mode 100644 index 000000000..04da1e777 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/data/MayorElection.kt @@ -0,0 +1,90 @@ +package at.hannibal2.skyhanni.data + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.utils.APIUtil +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.jsonobjects.MayorJson +import com.google.gson.GsonBuilder +import io.github.moulberry.moulconfig.observer.PropertyTypeAdapterFactory +import io.github.moulberry.notenoughupdates.util.SkyBlockTime +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import net.minecraftforge.fml.common.gameevent.TickEvent + +class MayorElection { + private var tick = 0 + private var lastUpdate = 0L + + private val gson = GsonBuilder().setPrettyPrinting() + .registerTypeAdapterFactory(PropertyTypeAdapterFactory()) + .create() + + companion object { + var rawMayorData: MayorJson? = null + var candidates = mapOf() + var currentCandidate: MayorJson.Candidate? = null + + fun isPerkActive(mayor: String, perk: String): Boolean { + return currentCandidate?.let { currentCandidate -> + currentCandidate.name == mayor && currentCandidate.perks.any { it.name == perk } + } ?: false + } + + } + + @SubscribeEvent + fun onTick(event: TickEvent.ClientTickEvent) { + if (event.phase != TickEvent.Phase.START) return + if (!LorenzUtils.onHypixel) return + + tick++ + + if (tick % 60 == 0) { + check() + } + } + + private fun check() { + if (System.currentTimeMillis() > lastUpdate + 60_000 * 5) { + lastUpdate = System.currentTimeMillis() + SkyHanniMod.coroutineScope.launch { + val url = "https://api.hypixel.net/resources/skyblock/election" + val jsonObject = withContext(Dispatchers.IO) { APIUtil.getJSONResponse(url) } + rawMayorData = gson.fromJson(jsonObject, MayorJson::class.java) + val data = rawMayorData ?: return@launch + val map = mutableMapOf() + map put data.mayor.election.getPairs() + data.current?.let { + map put data.current.getPairs() + } + candidates = map + } + } + + checkCurrentMayor() + } + + private fun checkCurrentMayor() { + var currentYear = SkyBlockTime.now().year + + // The time in the current skyblock year when the election circle will restart + val month = 3 // Late Spring + val nextMayorTime = SkyBlockTime(currentYear, month, day = 27).toMillis() + + // Is it still the major from old sb year? + if (nextMayorTime > System.currentTimeMillis()) { + currentYear-- + } + currentCandidate = candidates[currentYear] + } + + private fun MayorJson.Election.getPairs() = year + 1 to candidates.bestCandidate() + + private fun List.bestCandidate() = maxBy { it.votes } + + private infix fun MutableMap.put(pairs: Pair) { + this[pairs.first] = pairs.second + } +} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/data/MayorElectionData.kt b/src/main/java/at/hannibal2/skyhanni/data/MayorElectionData.kt deleted file mode 100644 index 70f30a021..000000000 --- a/src/main/java/at/hannibal2/skyhanni/data/MayorElectionData.kt +++ /dev/null @@ -1,91 +0,0 @@ -package at.hannibal2.skyhanni.data - -import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.utils.APIUtil -import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.MayorData -import at.hannibal2.skyhanni.utils.MayorData.Candidate -import com.google.gson.GsonBuilder -import io.github.moulberry.moulconfig.observer.PropertyTypeAdapterFactory -import io.github.moulberry.notenoughupdates.util.SkyBlockTime -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent -import net.minecraftforge.fml.common.gameevent.TickEvent - -class MayorElectionData { - private var tick = 0 - private var lastUpdate = 0L - - private val gson = GsonBuilder().setPrettyPrinting() - .registerTypeAdapterFactory(PropertyTypeAdapterFactory()) - .create() - - companion object { - var rawMayorData: MayorData? = null - var candidates = mapOf() - var currentCandidate: Candidate? = null - - fun isPerkActive(mayor: String, perk: String): Boolean { - return currentCandidate?.let { currentCandidate -> - currentCandidate.name == mayor && currentCandidate.perks.any { it.name == perk } - } ?: false - } - - } - - @SubscribeEvent - fun onTick(event: TickEvent.ClientTickEvent) { - if (event.phase != TickEvent.Phase.START) return - if (!LorenzUtils.onHypixel) return - - tick++ - - if (tick % 60 == 0) { - check() - } - } - - private fun check() { - if (System.currentTimeMillis() > lastUpdate + 60_000 * 5) { - lastUpdate = System.currentTimeMillis() - SkyHanniMod.coroutineScope.launch { - val url = "https://api.hypixel.net/resources/skyblock/election" - val jsonObject = withContext(Dispatchers.IO) { APIUtil.getJSONResponse(url) } - rawMayorData = gson.fromJson(jsonObject, MayorData::class.java) - val data = rawMayorData ?: return@launch - val map = mutableMapOf() - map put data.mayor.election.getPairs() - data.current?.let { - map put data.current.getPairs() - } - candidates = map - } - } - - checkCurrentMayor() - } - - private fun checkCurrentMayor() { - var currentYear = SkyBlockTime.now().year - - // The time in the current skyblock year when the election circle will restart - val month = 3 // Late Spring - val nextMayorTime = SkyBlockTime(currentYear, month, day = 27).toMillis() - - // Is it still the major from old sb year? - if (nextMayorTime > System.currentTimeMillis()) { - currentYear-- - } - currentCandidate = candidates[currentYear] - } - - private fun MayorData.Election.getPairs() = year + 1 to candidates.bestCandidate() - - private fun List.bestCandidate() = maxBy { it.votes } - - private infix fun MutableMap.put(pairs: Pair) { - this[pairs.first] = pairs.second - } -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/data/repo/RepoUtils.kt b/src/main/java/at/hannibal2/skyhanni/data/repo/RepoUtils.kt index 969b526cc..3e67adcac 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/repo/RepoUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/repo/RepoUtils.kt @@ -1,7 +1,6 @@ package at.hannibal2.skyhanni.data.repo import com.google.gson.Gson -import com.google.gson.JsonObject import java.io.* import java.nio.charset.StandardCharsets import java.nio.file.Files @@ -77,11 +76,7 @@ object RepoUtils { return false } - fun getConstant(repoLocation: File, constant: String, gson: Gson): JsonObject? { - return getConstant(repoLocation, constant, gson, JsonObject::class.java) - } - - private fun getConstant(repo: File, constant: String, gson: Gson, clazz: Class?): T? { + fun getConstant(repo: File, constant: String, gson: Gson, clazz: Class?): T? { if (repo.exists()) { val jsonFile = File(repo, "constants/$constant.json") try { diff --git a/src/main/java/at/hannibal2/skyhanni/events/RepositoryReloadEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/RepositoryReloadEvent.kt index 06fbc93d6..5cfd59aa1 100644 --- a/src/main/java/at/hannibal2/skyhanni/events/RepositoryReloadEvent.kt +++ b/src/main/java/at/hannibal2/skyhanni/events/RepositoryReloadEvent.kt @@ -5,8 +5,9 @@ import com.google.gson.Gson import com.google.gson.JsonObject import java.io.File -class RepositoryReloadEvent(private val repoLocation: File, val gson: Gson): LorenzEvent() { - fun getConstant(constant: String): JsonObject? { - return RepoUtils.getConstant(repoLocation, constant, gson) - } +class RepositoryReloadEvent(val repoLocation: File, val gson: Gson): LorenzEvent() { + fun getConstant(constant: String) = getConstant(constant) + + inline fun getConstant(constant: String) = + RepoUtils.getConstant(repoLocation, constant, gson, T::class.java) } \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/composter/ComposterOverlay.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/composter/ComposterOverlay.kt index 0e0271b52..adbe90245 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/composter/ComposterOverlay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/composter/ComposterOverlay.kt @@ -17,12 +17,14 @@ import at.hannibal2.skyhanni.utils.NumberUtil.romanToDecimalIfNeeded import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.StringUtils.removeColor import at.hannibal2.skyhanni.utils.TimeUtils +import at.hannibal2.skyhanni.utils.jsonobjects.GardenJson import at.hannibal2.skyhanni.utils.renderables.Renderable import io.github.moulberry.notenoughupdates.NotEnoughUpdates import net.minecraftforge.event.entity.player.ItemTooltipEvent import net.minecraftforge.fml.common.eventhandler.EventPriority import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent +import java.util.* import kotlin.math.ceil import kotlin.time.Duration import kotlin.time.DurationUnit @@ -64,6 +66,8 @@ class ComposterOverlay { var inInventory = false } + var garden: GardenJson? = null + @SubscribeEvent fun onInventoryClose(event: GuiContainerEvent.CloseWindowEvent) { inInventory = false @@ -128,6 +132,12 @@ class ComposterOverlay { } private fun update() { + if (organicMatterFactors.isEmpty()) { + organicMatterDisplay = + Collections.singletonList(listOf("§cSkyHanni composter error:", "§cRepo data not loaded!")) + return + } + if (inComposter) { organicMatterDisplay = drawOrganicMatterDisplay() fuelExtraDisplay = drawFuelExtraDisplay() @@ -379,29 +389,30 @@ class ComposterOverlay { return price } + @SubscribeEvent + fun onRepoReload(event: io.github.moulberry.notenoughupdates.events.RepositoryReloadEvent) { + updateOrganicMatterFactors() + } + @SubscribeEvent fun onRepoReload(event: RepositoryReloadEvent) { - try { - val garden = event.getConstant("Garden")!! + garden = event.getConstant("Garden")!! + updateOrganicMatterFactors() + } - val baseValues = mutableMapOf() - for ((name, value) in garden["organic_matter"].asJsonObject.entrySet()) { - baseValues[name] = value.asDouble - } - organicMatterFactors = updateOrganicMatterFactors(baseValues) + private fun updateOrganicMatterFactors() { + try { + val garden = this.garden ?: return + organicMatterFactors = updateOrganicMatterFactors(garden.organic_matter) + fuelFactors = garden.fuel - val fuelMap = mutableMapOf() - for ((name, value) in garden["fuel"].asJsonObject.entrySet()) { - fuelMap[name] = value.asDouble - } - fuelFactors = fuelMap } catch (e: Exception) { e.printStackTrace() LorenzUtils.error("error in RepositoryReloadEvent") } } - private fun updateOrganicMatterFactors(baseValues: MutableMap): Map { + private fun updateOrganicMatterFactors(baseValues: Map): Map { val map = mutableMapOf() for ((internalName, _) in NotEnoughUpdates.INSTANCE.manager.itemInformation) { if (internalName.endsWith("_BOOTS")) continue diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/GardenCropMilestoneDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/GardenCropMilestoneDisplay.kt index 7145c77d2..7b644578a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/GardenCropMilestoneDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/GardenCropMilestoneDisplay.kt @@ -5,7 +5,7 @@ import at.hannibal2.skyhanni.data.ClickType import at.hannibal2.skyhanni.data.GardenCropMilestones import at.hannibal2.skyhanni.data.GardenCropMilestones.Companion.getCounter import at.hannibal2.skyhanni.data.GardenCropMilestones.Companion.setCounter -import at.hannibal2.skyhanni.data.MayorElectionData +import at.hannibal2.skyhanni.data.MayorElection import at.hannibal2.skyhanni.data.TitleUtils import at.hannibal2.skyhanni.events.* import at.hannibal2.skyhanni.features.garden.CropType @@ -151,8 +151,8 @@ class GardenCropMilestoneDisplay { private fun finneganPerkActive(): Boolean { val forcefullyEnabledAlwaysFinnegan = config.forcefullyEnabledAlwaysFinnegan - val perkActive = MayorElectionData.isPerkActive("Finnegan", "Farming Simulator") - MayorElectionData.currentCandidate?.let { + val perkActive = MayorElection.isPerkActive("Finnegan", "Farming Simulator") + MayorElection.currentCandidate?.let { } return forcefullyEnabledAlwaysFinnegan || perkActive diff --git a/src/main/java/at/hannibal2/skyhanni/utils/MayorData.java b/src/main/java/at/hannibal2/skyhanni/utils/MayorData.java deleted file mode 100644 index 1c73572d4..000000000 --- a/src/main/java/at/hannibal2/skyhanni/utils/MayorData.java +++ /dev/null @@ -1,77 +0,0 @@ -package at.hannibal2.skyhanni.utils; - -import com.google.gson.annotations.Expose; - -import java.util.ArrayList; - -public class MayorData { - @Expose - public boolean success; - @Expose - public long lastUpdated; - @Expose - public Mayor mayor; - @Expose - public Election current; - - public class Candidate { - @Expose - public String key; - @Expose - public String name; - @Expose - public ArrayList perks; - @Expose - public int votes; - - @Override - public String toString() { - return "Candidate{" + - "key='" + key + '\'' + - ", name='" + name + '\'' + - ", perks=" + perks + - ", votes=" + votes + - '}'; - } - } - -// public class Current { -// @Expose -// public int year; -// @Expose -// public ArrayList candidates; -// } - - public class Election { - @Expose - public int year; - @Expose - public ArrayList candidates; - } - - public class Mayor { - @Expose - public String key; - @Expose - public String name; - @Expose - public ArrayList perks; - @Expose - public Election election; - } - - public class Perk { - @Expose - public String name; - @Expose - public String description; - - @Override - public String toString() { - return "Perk{" + - "name='" + name + '\'' + - ", description='" + description + '\'' + - '}'; - } - } -} \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/GardenJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/GardenJson.java new file mode 100644 index 000000000..0a5a76c43 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/GardenJson.java @@ -0,0 +1,14 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.Map; + +public class GardenJson { + + @Expose + public Map organic_matter; + + @Expose + public Map fuel; +} diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MayorJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MayorJson.java new file mode 100644 index 000000000..813020bc1 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/MayorJson.java @@ -0,0 +1,77 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import com.google.gson.annotations.Expose; + +import java.util.ArrayList; + +public class MayorJson { + @Expose + public boolean success; + @Expose + public long lastUpdated; + @Expose + public Mayor mayor; + @Expose + public Election current; + + public class Candidate { + @Expose + public String key; + @Expose + public String name; + @Expose + public ArrayList perks; + @Expose + public int votes; + + @Override + public String toString() { + return "Candidate{" + + "key='" + key + '\'' + + ", name='" + name + '\'' + + ", perks=" + perks + + ", votes=" + votes + + '}'; + } + } + +// public class Current { +// @Expose +// public int year; +// @Expose +// public ArrayList candidates; +// } + + public class Election { + @Expose + public int year; + @Expose + public ArrayList candidates; + } + + public class Mayor { + @Expose + public String key; + @Expose + public String name; + @Expose + public ArrayList perks; + @Expose + public Election election; + } + + public class Perk { + @Expose + public String name; + @Expose + public String description; + + @Override + public String toString() { + return "Perk{" + + "name='" + name + '\'' + + ", description='" + description + '\'' + + '}'; + } + } +} \ No newline at end of file -- cgit