aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/features/garden
diff options
context:
space:
mode:
authorhannibal2 <24389977+hannibal00212@users.noreply.github.com>2023-03-19 13:57:16 +0100
committerhannibal2 <24389977+hannibal00212@users.noreply.github.com>2023-03-19 13:57:16 +0100
commit25b6fe99c4d03c565bc8cb024c4b6e232203614d (patch)
tree148651d131c41acb5685638a82048d9d0a2bf8d4 /src/main/java/at/hannibal2/skyhanni/features/garden
parentfef46f5b4b6f6ade36dd56ebb39c199402f521b6 (diff)
downloadskyhanni-25b6fe99c4d03c565bc8cb024c4b6e232203614d.tar.gz
skyhanni-25b6fe99c4d03c565bc8cb024c4b6e232203614d.tar.bz2
skyhanni-25b6fe99c4d03c565bc8cb024c4b6e232203614d.zip
Added farming contest timer
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/features/garden')
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/garden/GardenNextJacobContest.kt187
1 files changed, 187 insertions, 0 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenNextJacobContest.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenNextJacobContest.kt
new file mode 100644
index 000000000..193efecc6
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenNextJacobContest.kt
@@ -0,0 +1,187 @@
+package at.hannibal2.skyhanni.features.garden
+
+import at.hannibal2.skyhanni.SkyHanniMod
+import at.hannibal2.skyhanni.events.GuiRenderEvent
+import at.hannibal2.skyhanni.events.InventoryCloseEvent
+import at.hannibal2.skyhanni.events.InventoryOpenEvent
+import at.hannibal2.skyhanni.utils.ItemUtils.getLore
+import at.hannibal2.skyhanni.utils.ItemUtils.name
+import at.hannibal2.skyhanni.utils.LorenzUtils
+import at.hannibal2.skyhanni.utils.RenderUtils.renderSingleLineWithItems
+import at.hannibal2.skyhanni.utils.TimeUtils
+import io.github.moulberry.notenoughupdates.util.SkyBlockTime
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
+import net.minecraftforge.fml.common.gameevent.TickEvent
+import java.time.Instant
+import java.util.regex.Pattern
+
+class GardenNextJacobContest {
+ private val config get() = SkyHanniMod.feature.garden
+ private val display = mutableListOf<Any>()
+ private var tick = 0
+ private var contests = mutableMapOf<Long, FarmingContest>()
+ private var inCalendar = false
+
+ private val maxContestsPerYear = 124
+ private val contestDuration = 1_000 * 60 * 20
+
+ @SubscribeEvent
+ fun onTick(event: TickEvent.ClientTickEvent) {
+ if (!isEnabled()) return
+ if (tick++ % (40) != 0) return
+
+ if (inCalendar) return
+ update()
+ }
+
+ @SubscribeEvent
+ fun onInventoryClose(event: InventoryCloseEvent) {
+ if (inCalendar) {
+ inCalendar = false
+ update()
+ }
+ }
+
+ @SubscribeEvent
+ fun onInventoryOpen(event: InventoryOpenEvent) {
+ if (!config.nextJacobContestDisplay) return
+
+ val backItem = event.inventoryItems[48] ?: return
+ val backName = backItem.name
+ if (backName != "§aGo Back") return
+ val lore = backItem.getLore()
+ if (lore.size != 1) return
+ if (lore[0] != "§7To Calendar and Events") return
+
+ inCalendar = true
+ readCalendar(event)
+ }
+
+ private fun readCalendar(event: InventoryOpenEvent) {
+ val inventoryName = event.inventoryName
+
+ val patternMonth = Pattern.compile("(.*), Year (.*)")
+ val matcher = patternMonth.matcher(inventoryName)
+ if (!matcher.matches()) return
+ val rawMonth = matcher.group(1)
+ val year = matcher.group(2).toInt()
+
+ if (contests.isNotEmpty()) {
+ val contest = contests.values.first()
+ val endTime = contest.endTime
+ val lastYear = SkyBlockTime.fromInstant(Instant.ofEpochMilli(endTime)).year
+ if (year != lastYear) {
+ contests.clear()
+ LorenzUtils.chat("§e[SkyHanni] New year detected, open all calendar months again!")
+ }
+ }
+
+
+ val month = LorenzUtils.getSBMonthByName(rawMonth)
+
+ val patternDay = Pattern.compile("§aDay (.*)")
+ val patternCrop = Pattern.compile("§e○ §7(.*)")
+ for (item in event.inventoryItems.values) {
+ val lore = item.getLore()
+ if (!lore.any { it.contains("§6§eJacob's Farming Contest") }) continue
+
+ val name = item.name ?: continue
+ val matcherDay = patternDay.matcher(name)
+ if (!matcherDay.matches()) continue
+
+ val day = matcherDay.group(1).toInt()
+
+ val sbTime = SkyBlockTime(year, month, day)
+ val startTime = sbTime.toMillis()
+ val crops = mutableListOf<String>()
+ for (line in lore) {
+ val matcherCrop = patternCrop.matcher(line)
+ if (!matcherCrop.matches()) continue
+
+ val crop = matcherCrop.group(1)
+ crops.add(crop)
+ }
+ val contest = FarmingContest(startTime + contestDuration, crops)
+ contests[startTime] = contest
+ }
+
+ update()
+ }
+
+ class FarmingContest(val endTime: Long, val crops: List<String>)
+
+ private fun update() {
+ val newDisplay = drawDisplay()
+ display.clear()
+ display.addAll(newDisplay)
+ }
+
+ private fun drawDisplay(): List<Any> {
+ val list = mutableListOf<Any>()
+
+ if (inCalendar) {
+ val size = contests.size
+ val percentage = size.toDouble() / maxContestsPerYear
+ val formatted = LorenzUtils.formatPercentage(percentage)
+ list.add("§eDetected $formatted of farming contests this year")
+
+ return list
+ }
+
+ if (contests.isEmpty()) {
+ list.add("§cOpen calendar to read jacob contest times!")
+ return list
+ }
+
+ val nextContest =
+ contests.filter { it.value.endTime > System.currentTimeMillis() }.toSortedMap().firstNotNullOfOrNull { it.value }
+ if (nextContest == null) {
+ if (contests.size == maxContestsPerYear) {
+ list.add("§cNew SkyBlock Year! Open calendar again!")
+ } else {
+ list.add("§cOpen calendar to read jacob contest times!")
+ }
+ return list
+ }
+
+ return drawNextContest(nextContest, list)
+ }
+
+ private fun drawNextContest(
+ nextContest: FarmingContest,
+ list: MutableList<Any>,
+ ): MutableList<Any> {
+ for (crop in nextContest.crops) {
+ GardenAPI.addGardenCropToList(crop, list)
+ list.add(" ")
+ }
+ var duration = nextContest.endTime - System.currentTimeMillis()
+ if (duration < contestDuration) {
+ list.add("§aActive ")
+ } else {
+ list.add("§eNext ")
+ duration -= contestDuration
+ }
+ val format = TimeUtils.formatDuration(duration)
+ list.add("§b$format ")
+
+ return list
+ }
+
+ @SubscribeEvent
+ fun onRenderOverlay(event: GuiRenderEvent.GameOverlayRenderEvent) {
+ if (!isEnabled()) return
+
+ config.nextJacobContestPos.renderSingleLineWithItems(display)
+ }
+
+ @SubscribeEvent
+ fun onRenderOverlay(event: GuiRenderEvent.ChestBackgroundRenderEvent) {
+ if (!config.nextJacobContestDisplay) return
+ if (!inCalendar) return
+
+ config.nextJacobContestPos.renderSingleLineWithItems(display)
+ }
+
+ private fun isEnabled() = GardenAPI.inGarden() && config.nextJacobContestDisplay
+} \ No newline at end of file