/* * Copyright (C) 2024 NotEnoughUpdates contributors * * This file is part of NotEnoughUpdates. * * NotEnoughUpdates is free software: you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, either * version 3 of the License, or (at your option) any later version. * * NotEnoughUpdates is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with NotEnoughUpdates. If not, see . */ package io.github.moulberry.notenoughupdates.miscfeatures.profileviewer import com.google.gson.JsonObject import io.github.moulberry.notenoughupdates.NotEnoughUpdates import io.github.moulberry.notenoughupdates.core.util.StringUtils import io.github.moulberry.notenoughupdates.miscfeatures.PetInfoOverlay import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewerPage import io.github.moulberry.notenoughupdates.profileviewer.SkyblockProfiles import io.github.moulberry.notenoughupdates.profileviewer.data.APIDataJson import io.github.moulberry.notenoughupdates.util.Constants import io.github.moulberry.notenoughupdates.util.MC import io.github.moulberry.notenoughupdates.util.PetLeveling import io.github.moulberry.notenoughupdates.util.Utils import io.github.moulberry.notenoughupdates.util.roundToDecimals import io.github.moulberry.notenoughupdates.util.toRoman import net.minecraft.client.renderer.GlStateManager import net.minecraft.init.Blocks import net.minecraft.init.Items import net.minecraft.item.ItemStack import net.minecraft.util.ResourceLocation import org.lwjgl.opengl.GL11 class HoppityPage(pvInstance: GuiProfileViewer) : GuiProfileViewerPage(pvInstance) { private val manager get() = NotEnoughUpdates.INSTANCE.manager private val pv_hoppity = ResourceLocation("notenoughupdates:pv_hoppity.png") private var hoppityJson = Constants.HOPPITY private var guiLeft = GuiProfileViewer.getGuiLeft() private var guiTop = GuiProfileViewer.getGuiTop() private var currentProfile: SkyblockProfiles.SkyblockProfile? = null private val rabbitFamilyInfo = mutableListOf() private val rabbitFamilyInfo2 = mutableListOf() private val factoryModifiersInfo = mutableListOf() private val otherModifiersInfo = mutableListOf() private var currentChocolate = 0L private var prestigeChocolate = 0L private var allTimeChocolate = 0L private var prestigeLevel = 0 private var barnCapacity = 20 private var baseMultiplier = 1.0 private var rawChocolatePerSecond = 0 private var multiplier = 0.0 private var chocolatePerSecond = 0.0 private var talisman: String? = null private var talismanChocolate = 0 private var timeTowerCharges = 0 private var timeTowerLevel = 0 private var lastChargeTime = 0L private var lastActivationTime = 0L private var lastViewedChocolateFactory = 0L private var muTimeTowerBonus = 0f private var chocolateSpent = 0L private val rabbitToRarity = mutableMapOf() private var tooltipToDisplay = listOf() override fun drawPage(mouseX: Int, mouseY: Int, partialTicks: Float) { guiLeft = GuiProfileViewer.getGuiLeft() guiTop = GuiProfileViewer.getGuiTop() if (selectedProfile?.APIDataJson?.events?.easter == null) { Utils.drawStringCentered("§cMissing Profile Data", guiLeft + 220, guiTop + 101, true, 0) return } if (hoppityJson == null) { Utils.drawStringCentered("§cMissing Repo Data", guiLeft + 220, guiTop + 101, true, 0) Utils.showOutdatedRepoNotification("hoppity.json") return } val newProfile = selectedProfile if (newProfile != currentProfile) { getData() currentProfile = selectedProfile } if (rabbitToRarity.isEmpty()) { Utils.drawStringCentered("§cMissing Repo Data", guiLeft + 220, guiTop + 101, true, 0) Utils.showOutdatedRepoNotification("rabbitToRarity is empty") return } MC.textureManager.bindTexture(pv_hoppity) Utils.drawTexturedRect( guiLeft.toFloat(), guiTop.toFloat(), instance.sizeX.toFloat(), instance.sizeY.toFloat(), GL11.GL_NEAREST ) Utils.renderShadowedString("§eRabbit Family", (guiLeft + 74).toFloat(), (guiTop + 11).toFloat(), 105) Utils.renderShadowedString("§eModifiers / Other", (guiLeft + 74).toFloat(), (guiTop + 105).toFloat(), 105) Utils.renderShadowedString("§eChocolate Factory", (guiLeft + 214).toFloat(), (guiTop + 12).toFloat(), 105) Utils.renderShadowedString("§eStats", (guiLeft + 214).toFloat(), (guiTop + 28).toFloat(), 105) GlStateManager.enableDepth() drawAlignedStringWithHover( "§eChocolate:", "§f${StringUtils.shortNumberFormat(currentChocolate.toDouble())}", guiLeft + 160, guiTop + 53, 110, mouseX, mouseY, listOf("§7Current Chocolate: §6${StringUtils.formatNumber(currentChocolate)}") ) drawAlignedStringWithHover( "§eSince Prestige:", "§f${StringUtils.shortNumberFormat(prestigeChocolate.toDouble())}", guiLeft + 160, guiTop + 68, 110, mouseX, mouseY, listOf("§7Chocolate Since Prestige: §6${StringUtils.formatNumber(prestigeChocolate)}") ) drawAlignedStringWithHover( "§eAll Time:", "§f${StringUtils.shortNumberFormat(allTimeChocolate.toDouble())}", guiLeft + 160, guiTop + 83, 110, mouseX, mouseY, listOf("§7All Time Chocolate: §6${StringUtils.formatNumber(allTimeChocolate)}") ) fun chocolateForNextPrestige(): Long { return when (prestigeLevel) { 1 -> 150_000_000 2 -> 1_000_000_000 3 -> 4_000_000_000 4 -> 10_000_000_000 5 -> 30_000_000_000 else -> 0 } } Utils.renderAlignedString( "§eUntil Prestige:", if (chocolateForNextPrestige() != 0L) { val amount = chocolateForNextPrestige().toDouble() - prestigeChocolate.toDouble() if (amount < 0) { "§f0" } else { "§f${StringUtils.shortNumberFormat(amount)}" } } else { "§f§lMax" }, (guiLeft + 160).toFloat(), (guiTop + 98).toFloat(), 110 ) val chocolateTilPrestigePercentage = (prestigeChocolate.toFloat() / chocolateForNextPrestige()).coerceIn(0f, 1f) if (chocolateTilPrestigePercentage == 1f) { instance.renderGoldBar(guiLeft + 160.toFloat(), guiTop + 109.toFloat(), 110f) } else { instance.renderBar(guiLeft + 160.toFloat(), guiTop + 109.toFloat(), 110f, chocolateTilPrestigePercentage) } val xBar = guiLeft + 160 val yBar = guiTop + 109 if (mouseX in xBar..(xBar + 110) && mouseY in yBar..(yBar + 5)) { if (chocolateForNextPrestige() != 0L) { tooltipToDisplay = buildList { add( "§6${StringUtils.formatNumber(prestigeChocolate)}§7/§6${ StringUtils.formatNumber( chocolateForNextPrestige() ) }" ) } } else { tooltipToDisplay = buildList { add( "§6Maxed!" ) } } } Utils.renderAlignedString( "§eLast Updated:", if (lastViewedChocolateFactory == 0L) { "§fNever" } else { "§f${Utils.timeSinceMillisecond(lastViewedChocolateFactory)}" }, (guiLeft + 160).toFloat(), (guiTop + 117).toFloat(), 110 ) drawAlignedStringWithHover( "§eMultiplier:", "§f${multiplier.roundToDecimals(3)}x", guiLeft + 160, guiTop + 133, 110, mouseX, mouseY, listOf( "§7Normal Multiplier: §6${multiplier.roundToDecimals(3)}x", "§7Multiplier with Time Tower: §d${ (multiplier + ((timeTowerLevel * 0.1) + muTimeTowerBonus)).roundToDecimals( 3 ) }x" ) ) drawAlignedStringWithHover( "§eChocolate/Second:", "§f${StringUtils.formatNumber(chocolatePerSecond.roundToDecimals(2))}", guiLeft + 160, guiTop + 148, 110, mouseX, mouseY, listOf( "§7Raw Chocolate/Second: §6${StringUtils.formatNumber(rawChocolatePerSecond)}", "§7Chocolate/Millisecond: §6${StringUtils.formatNumber(chocolatePerSecond.roundToDecimals(2) / 1000)}", "§7Chocolate/Second: §6${StringUtils.formatNumber(chocolatePerSecond.roundToDecimals(2))}", "§7Chocolate/Minute: §6${StringUtils.formatNumber(chocolatePerSecond.roundToDecimals(2) * 60)}", "§7Chocolate/Hour: §6${StringUtils.formatNumber(chocolatePerSecond.roundToDecimals(2) * 3600)}", "§7Chocolate/Day: §6${StringUtils.formatNumber(chocolatePerSecond.roundToDecimals(2) * 86400)}", "§7Chocolate/Week: §6${StringUtils.formatNumber(chocolatePerSecond.roundToDecimals(2) * 86400 * 7)}", "§7Chocolate/Fortnight: §6${StringUtils.formatNumber(chocolatePerSecond.roundToDecimals(2) * 86400 * 14)}", "§7Chocolate/Month: §6${StringUtils.formatNumber(chocolatePerSecond.roundToDecimals(2) * 86400 * 28)}", "§7Chocolate/Year: §6${StringUtils.formatNumber(chocolatePerSecond.roundToDecimals(2) * 86400 * 365.28)}", "§7Chocolate/Leap Year: §6${StringUtils.formatNumber(chocolatePerSecond.roundToDecimals(2) * 86400 * 366.28)}", ) ) drawAlignedStringWithHover( "§eChocolate Spent:", "§f${StringUtils.shortNumberFormat(chocolateSpent.toDouble())}", guiLeft + 160, guiTop + 163, 110, mouseX, mouseY, listOf("§7Chocolate Spent: §6${StringUtils.formatNumber(chocolateSpent)}") ) drawAlignedStringWithHover( "§eLeaderboard Rank:", "§f${HoppityLeaderboardRank.getRankInfo()}", guiLeft + 160, guiTop + 178, 110, mouseX, mouseY, listOf( HoppityLeaderboardRank.getAdditionalInfo(), "", "Data provided by the Elitebot API.", "§eClick to view on the Elitebot website." ) ) rabbitFamilyInfo.displayInfo(31, 32, mouseX, mouseY) rabbitFamilyInfo2.displayInfo(42, 66, mouseX, mouseY) factoryModifiersInfo.displayInfo(31, 125, mouseX, mouseY) otherModifiersInfo.displayInfo(42, 159, mouseX, mouseY) drawRabbitStats(mouseX, mouseY) if (tooltipToDisplay.isNotEmpty()) { tooltipToDisplay = tooltipToDisplay.map { "§7$it" } Utils.drawHoveringText(tooltipToDisplay, mouseX, mouseY, instance.width, instance.height, -1) tooltipToDisplay = listOf() } } override fun mouseClicked(mouseX: Int, mouseY: Int, mouseButton: Int): Boolean { if (mouseButton == 0) { if (mouseX in (guiLeft + 160)..(guiLeft + 270) && mouseY in (guiTop + 178)..(guiTop + 190)) { HoppityLeaderboardRank.openWebsite() } } return false } private fun drawAlignedStringWithHover( first: String, second: String, x: Int, y: Int, length: Int, mouseX: Int, mouseY: Int, hover: List, ) { Utils.renderAlignedString(first, second, x.toFloat(), y.toFloat(), length) if (mouseX in x..(x + length) && mouseY in y..(y + 13)) { tooltipToDisplay = hover } } private fun List.displayInfo(xPos: Int, yPos: Int, mouseX: Int, mouseY: Int) { var x = guiLeft + xPos val y = guiTop + yPos this.forEach { upgradeInfo -> Utils.drawStringCentered( "${upgradeInfo.colourCode}${upgradeInfo.level}§f", x + 10, y + 26, true, 0 ) MC.textureManager.bindTexture(GuiProfileViewer.pv_elements) Utils.drawTexturedRect( (x).toFloat(), (y).toFloat(), 20f, 20f, 0f, 20 / 256f, 0f, 20 / 256f, GL11.GL_NEAREST ) Utils.drawItemStack(upgradeInfo.stack, x + 2, y + 2) if (mouseX in x..(x + 20) && mouseY in y..(y + 20)) { val tooltip = when (upgradeInfo.upgradeType) { UpgradeType.RABBIT_EMPLOYEES -> { if (upgradeInfo.level == 0) { fallbackList(upgradeInfo.displayName) } else { buildList { add("${upgradeInfo.colourCode}${upgradeInfo.displayName} §8- §7[${upgradeInfo.level}] ${upgradeInfo.colourCode}${upgradeInfo.suffixName}") add("") add("§7Produces §6+${StringUtils.formatNumber(upgradeInfo.level * upgradeInfo.extraCps)} Chocolate §7per second.") } } } UpgradeType.HAND_BAKED_CHOCOLATE -> { if (upgradeInfo.level == 0) { fallbackList(upgradeInfo.displayName) } else { buildList { add("§d${upgradeInfo.displayName} ${upgradeInfo.level.toRoman()}") add("") add("§7Chocolate Per Click: §6+${upgradeInfo.level} Chocolate") } } } UpgradeType.TIME_TOWER -> { if (upgradeInfo.level == 0) { fallbackList(upgradeInfo.displayName) } else { buildList { add("§d${upgradeInfo.displayName} ${upgradeInfo.level.toRoman()}") add("") add("§6+${((upgradeInfo.level * 0.1) + muTimeTowerBonus).roundToDecimals(1)}x Chocolate §7per second for §a1h§7.") add("§7Time Tower charges: §a$timeTowerCharges§7/§a3") if (lastActivationTime != 0L) { add("§7Last Activation Time: §b${Utils.timeSinceMillisecond(lastActivationTime)}") } else { add("§7Last Activation Time: §cNever") } if (lastChargeTime == 0L) { add("§7Last Charge Time: §cNever") } else { add("§7Last Charge Time: §b${Utils.timeSinceMillisecond(lastChargeTime)}") } } } } UpgradeType.RABBIT_SHRINE -> { if (upgradeInfo.level == 0) { fallbackList(upgradeInfo.displayName) } else { buildList { add("§d${upgradeInfo.displayName} ${upgradeInfo.level.toRoman()}") add("") add("§7Increases §dodds §7of finding") add("§aChocolate Rabbits §7of higher rarity") add("§7by §a${upgradeInfo.level}% §7during §dHoppity's Hunt§7.") } } } UpgradeType.COACH_JACKRABBIT -> { if (upgradeInfo.level == 0) { fallbackList(upgradeInfo.displayName) } else { buildList { add("§d${upgradeInfo.displayName} ${upgradeInfo.level.toRoman()}") add("") add("§7Chocolate Multiplier increased by") add("§6+${upgradeInfo.level * 0.01}x Chocolate §7per second.") } } } UpgradeType.CHOCOLATE_FACTORY -> { buildList { add("§6${upgradeInfo.displayName} ${upgradeInfo.level.toRoman()}") upgradeInfo.chocolateFactoryTooltip.lines().forEach { add(it) } } } UpgradeType.RABBIT_BARN -> { if (upgradeInfo.level == 0) { buildList { add("§a${upgradeInfo.displayName} I") add("§7Barn: §a${RabbitCollectionRarity.TOTAL.uniques}§7/§a20") } } else { buildList { add("§a${upgradeInfo.displayName} ${upgradeInfo.level.toRoman()}") add("§7Rabbit Barn: §a${RabbitCollectionRarity.TOTAL.uniques}§7/§a${(upgradeInfo.level * 2) + 18}") } } } UpgradeType.TALISMAN -> { if (upgradeInfo.level == 0) { fallbackList(upgradeInfo.displayName) } else { Utils.getRawTooltip(upgradeInfo.stack) .dropLastWhile { !Utils.cleanColour(it).startsWith("Cost") } .dropLast(2) } } UpgradeType.OTHER -> buildList { add("§d§l:3") } } tooltipToDisplay = tooltip } x += 22 } } private fun fallbackList(name: String) = listOf( "§d${name} §7hasn't been obtained yet!", "§8${GuiProfileViewer.getDisplayName()} §8hasn't obtained this yet" ) private fun drawRabbitStats(mouseX: Int, mouseY: Int) { val x = guiLeft + 299 var y = guiTop + 14 RabbitCollectionRarity.values().forEach { rabbitInfo -> Utils.renderAlignedString( rabbitInfo.displayName, "§f${rabbitInfo.uniques}/${rabbitInfo.maximum}", (x + 30).toFloat(), (y + 7).toFloat(), 90 ) MC.textureManager.bindTexture(GuiProfileViewer.pv_elements) Utils.drawTexturedRect( (x).toFloat(), (y).toFloat(), 20f, 20f, 0f, 20 / 256f, 0f, 20 / 256f, GL11.GL_NEAREST ) if (mouseX in x..(x + 120) && mouseY in y..(y + 20)) { val tooltip = if (rabbitInfo.uniques < 1) { buildList { add("§l${rabbitInfo.displayName} Rabbits") if (rabbitInfo == RabbitCollectionRarity.TOTAL) { add("§8${GuiProfileViewer.getDisplayName()} hasn't found any rabbits.") } else { add("§8${GuiProfileViewer.getDisplayName()} hasn't found any ${rabbitInfo.apiName} rabbits.") } } } else { buildList { add("§l${rabbitInfo.displayName} Rabbits") add("${rabbitInfo.apiName} rabbits found: §a${rabbitInfo.uniques}§7/§a${rabbitInfo.maximum}") add("Duplicate Rabbits: §a${rabbitInfo.duplicates}") add("Total Rabbits Found: §a${rabbitInfo.uniques + rabbitInfo.duplicates}") add("") add("§6+${StringUtils.formatNumber(rabbitInfo.chocolatePerSecond)} Chocolate §7per second.") add("§6+${rabbitInfo.multiplier.roundToDecimals(3)}x Chocolate §7per second.") } } tooltipToDisplay = tooltip } Utils.drawItemStack(rabbitInfo.stack, x + 2, y + 2) y += 22 } } private fun getData() { val data = selectedProfile?.APIDataJson ?: return if (data.events?.easter == null) return val easterData = data.events?.easter ?: return baseMultiplier = 1.0 if (data.profile?.cookie_buff_active == true) { baseMultiplier = 1.25 } val activePetInfo = selectedProfile?.petsInfo?.get("active_pet") if (activePetInfo != null && !activePetInfo.isJsonNull) { activePetInfo.asJsonObject?.let { pet -> if (pet.get("type").asString == "RABBIT" && pet.get("tier").asString == "MYTHIC") { val petLevel = PetLeveling.getPetLevelingForPet("RABBIT", PetInfoOverlay.Rarity.MYTHIC) .getPetLevel(pet.get("exp").asDouble).currentLevel //calculation is 0.01 + 0.0004 per pet level baseMultiplier += 0.01 + (petLevel * 0.0004) } } } rabbitToRarity.clear() RabbitCollectionRarity.resetData() val profileId = selectedProfile?.outerProfileJson?.get("profile_id")?.asString?.replace("-", "") val uuid = GuiProfileViewer.getProfile()?.uuid HoppityLeaderboardRank.resetData() HoppityLeaderboardRank.loadData(uuid, profileId) val hoppityData = hoppityJson.getAsJsonObject("hoppity") ?: return val rabbitRarities = hoppityData.getAsJsonObject("rarities") ?: return val specialRabbits = hoppityData.getAsJsonObject("special") ?: return val prestigeMultipliers = hoppityData.getAsJsonObject("prestigeMultipliers") ?: return val talismanChocolateData = hoppityData.getAsJsonObject("talisman") ?: return val foundMythicRabbits = mutableSetOf() getTalismanTier(talismanChocolateData) for (rarity in rabbitRarities.entrySet()) { val rarityName = rarity.key val rarityInfo = rarity.value.asJsonObject val rabbits = rarityInfo.getAsJsonArray("rabbits") for (rabbit in rabbits) { rabbitToRarity[rabbit.asString] = rarityName } val rabbitRarity = RabbitCollectionRarity.fromApiName(rarityName) ?: continue rabbitRarity.maximum = rabbits.size() } val rabbits = easterData.rabbits ?: JsonObject() for ((rabbitName, rabbitInfo) in rabbits.entrySet()) { if (rabbitInfo.isJsonObject) continue val rabbitRarity = rabbitToRarity[rabbitName]?.let { RabbitCollectionRarity.fromApiName(it) } ?: continue rabbitRarity.addAmount(rabbitInfo.asInt) if (rabbitRarity == RabbitCollectionRarity.MYTHIC) { foundMythicRabbits.add(rabbitName) } } for (rarity in rabbitRarities.entrySet()) { val rabbitRarity = RabbitCollectionRarity.fromApiName(rarity.key) ?: continue val rarityInfo = rarity.value.asJsonObject val cps = rarityInfo.get("chocolate").asInt val multiplier = rarityInfo.get("multiplier").asDouble rabbitRarity.setChocolateData(cps, multiplier) } for (mythic in foundMythicRabbits) { if (mythic == "sigma") { RabbitCollectionRarity.MYTHIC.chocolatePerSecond += 5 * foundMythicRabbits.size } if (mythic == "mu") { muTimeTowerBonus = 0.7f } val specialRabbit = specialRabbits.getAsJsonObject(mythic) val cps = specialRabbit.get("chocolate").asInt val multiplier = specialRabbit.get("multiplier").asDouble RabbitCollectionRarity.MYTHIC.chocolatePerSecond += cps RabbitCollectionRarity.MYTHIC.multiplier += multiplier } val totalRabbit = RabbitCollectionRarity.TOTAL totalRabbit.uniques = RabbitCollectionRarity.values().sumOf { it.uniques } totalRabbit.duplicates = RabbitCollectionRarity.values().sumOf { it.duplicates } totalRabbit.chocolatePerSecond = RabbitCollectionRarity.values().sumOf { it.chocolatePerSecond } totalRabbit.multiplier = RabbitCollectionRarity.values().sumOf { it.multiplier } totalRabbit.maximum = RabbitCollectionRarity.values().sumOf { it.maximum } rabbitFamilyInfo.clear() rabbitFamilyInfo2.clear() factoryModifiersInfo.clear() otherModifiersInfo.clear() val employeesData = easterData.employees ?: APIDataJson.Events.EasterEventData.EmployeeData() val timeTowerInfo = easterData.time_tower ?: APIDataJson.Events.EasterEventData.TimeTowerData() val coachLevel = easterData.chocolate_multiplier_upgrades val barnLevel = easterData.rabbit_barn_capacity_level barnCapacity = barnLevel * 2 + 18 rabbitFamilyInfo.add( UpgradeInfo( rabbitBro, employeesData.rabbit_bro, UpgradeType.RABBIT_EMPLOYEES, "Rabbit Bro", 1 ) ) rabbitFamilyInfo.add( UpgradeInfo( rabbitCousin, employeesData.rabbit_cousin, UpgradeType.RABBIT_EMPLOYEES, "Rabbit Cousin", 2 ) ) rabbitFamilyInfo.add( UpgradeInfo( rabbitSis, employeesData.rabbit_sis, UpgradeType.RABBIT_EMPLOYEES, "Rabbit Sis", 3 ) ) rabbitFamilyInfo.add( UpgradeInfo( rabbitDaddy, employeesData.rabbit_father, UpgradeType.RABBIT_EMPLOYEES, "Rabbit Daddy", 4 ) ) rabbitFamilyInfo2.add( UpgradeInfo( rabbitGranny, employeesData.rabbit_grandma, UpgradeType.RABBIT_EMPLOYEES, "Rabbit Granny", 5, ) ) rabbitFamilyInfo2.add( UpgradeInfo( rabbitUncle, employeesData.rabbit_uncle, UpgradeType.RABBIT_EMPLOYEES, "Rabbit Uncle", 6 ) ) rabbitFamilyInfo2.add( UpgradeInfo( rabbitDog, employeesData.rabbit_dog, UpgradeType.RABBIT_EMPLOYEES, "Rabbit Dog", 7, ) ) prestigeLevel = easterData.chocolate_level timeTowerLevel = timeTowerInfo.level if (prestigeLevel > 1) timeTowerLevel = timeTowerLevel.coerceAtLeast(1) factoryModifiersInfo.add( UpgradeInfo( handBaked, easterData.click_upgrades + 1, UpgradeType.HAND_BAKED_CHOCOLATE, "Hand-Baked Chocolate" ) ) factoryModifiersInfo.add( UpgradeInfo( timeTower, timeTowerLevel, UpgradeType.TIME_TOWER, "Time Tower" ) ) factoryModifiersInfo.add( UpgradeInfo( rabbitShrine, easterData.rabbit_rarity_upgrades, UpgradeType.RABBIT_SHRINE, "Rabbit Shrine" ) ) factoryModifiersInfo.add( UpgradeInfo( coachJackrabbit, coachLevel, UpgradeType.COACH_JACKRABBIT, "Coach Jackrabbit" ) ) otherModifiersInfo.add( UpgradeInfo( prestigeItem, prestigeLevel, UpgradeType.CHOCOLATE_FACTORY, "Chocolate Factory" ) ) otherModifiersInfo.add( UpgradeInfo( rabbitBarn, barnLevel, UpgradeType.RABBIT_BARN, "Rabbit Barn" ) ) val shownTalismanItem = talisman?.let { manager.createItem(it) } ?: talismanItem otherModifiersInfo.add( UpgradeInfo( shownTalismanItem, talismanChocolate / 10, UpgradeType.TALISMAN, "Chocolate Talisman" ) ) currentChocolate = easterData.chocolate prestigeChocolate = easterData.chocolate_since_prestige allTimeChocolate = easterData.total_chocolate timeTowerCharges = timeTowerInfo.charges lastChargeTime = timeTowerInfo.last_charge_time lastActivationTime = timeTowerInfo.activation_time lastViewedChocolateFactory = easterData.last_viewed_chocolate_factory val prestigeMultiplier = prestigeMultipliers.get(prestigeLevel.toString()).asDouble val coachMultiplier = 0.01 * coachLevel val rabbitMultiplier = RabbitCollectionRarity.TOTAL.multiplier multiplier = baseMultiplier + prestigeMultiplier + coachMultiplier + rabbitMultiplier val rabbitChocolate = RabbitCollectionRarity.TOTAL.chocolatePerSecond val employeeChocolate = rabbitFamilyInfo.sumOf { it.extraCps * it.level } + rabbitFamilyInfo2.sumOf { it.extraCps * it.level } rawChocolatePerSecond = rabbitChocolate + employeeChocolate + talismanChocolate chocolatePerSecond = rawChocolatePerSecond * multiplier chocolateSpent = easterData.shop?.chocolate_spent ?: 0 } private fun getTalismanTier(talismanChocolateData: JsonObject) { talisman = null var bestTalisman: String? = null var bestTalismanCps = 0 val playerItems = GuiProfileViewer.getSelectedProfile()?.inventoryInfo ?: return val talismanInventory = playerItems["talisman_bag"] ?: return val playerInventory = playerItems["inv_contents"] ?: return for (item in talismanInventory) { if (item.isJsonNull) continue val internalName = item.asJsonObject.get("internalname").asString if (talismanChocolateData.has(internalName)) { val cps = talismanChocolateData.get(internalName).asInt if (cps > bestTalismanCps) { bestTalisman = internalName bestTalismanCps = cps } } } for (item in playerInventory) { if (item.isJsonNull) continue val internalName = item.asJsonObject.get("internalname").asString if (talismanChocolateData.has(internalName)) { val cps = talismanChocolateData.get(internalName).asInt if (cps > bestTalismanCps) { bestTalisman = internalName bestTalismanCps = cps } } } talisman = bestTalisman talismanChocolate = bestTalismanCps } private val rabbitBro: ItemStack = Utils.createSkull( "ThatGravyBoat", "6adb1fab-c55c-31b1-a575-052b11f3a9c9", "ewogICJ0aW1lc3RhbXAiIDogMTcxMjU5NDI0NjM2MywKICAicHJvZmlsZUlkIiA6ICJjZjc4YzFkZjE3ZTI0Y2Q5YTIxYmU4NWQ0NDk5ZWE4ZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNYXR0c0FybW9yU3RhbmRzIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzI4NzkzNGJkZDlkZjI3MDViMjUxYmI5OTdlMDI5YjE4YzFlOTRkZjEyOTkyYjgxMDdlNzQ0OTdiMjA1Y2E3ZTgiCiAgICB9CiAgfQp9" ) private val rabbitCousin: ItemStack = Utils.createSkull( "ThatGravyBoat", "3c2e46e4-0bd8-3e75-ac59-c6fe48ce2155", "ewogICJ0aW1lc3RhbXAiIDogMTcxMjU5NDI2ODkxNCwKICAicHJvZmlsZUlkIiA6ICJlMjc5NjliODYyNWY0NDg1YjkyNmM5NTBhMDljMWMwMSIsCiAgInByb2ZpbGVOYW1lIiA6ICJLRVZJTktFTE9LRSIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9hOTgyODI1YzAxYjY1OGYzNDhhMDk5YjQ1NzkwMjlhMTgwZDJlNDE1MTgzOTUxYjJlNmU1ZTI3MjU3ZGY0MjU0IgogICAgfQogIH0KfQ==" ) private val rabbitSis: ItemStack = Utils.createSkull( "ThatGravyBoat", "8b08b9b4-28da-33fe-971b-2c15c6526d80", "ewogICJ0aW1lc3RhbXAiIDogMTcxMjg0NzA5MzAxMSwKICAicHJvZmlsZUlkIiA6ICIyMWNjMzkxZmNkMjc0NzY5OTg5Y2M3M2VjYWRiNTE3YiIsCiAgInByb2ZpbGVOYW1lIiA6ICJHT1NUTFk5NyIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9mZDA3NmUwZTNkNDA3MmQwZmZmZWUwYTg3YTVkNzI2ZmMzNGIyYmNlYzM4YzI2NGZiOWI2Nzg3MWE4ZWFkNjMzIgogICAgfQogIH0KfQ==" ) private val rabbitDaddy: ItemStack = Utils.createSkull( "ThatGravyBoat", "794aa517-c2a6-3762-8791-187665c4eda0", "ewogICJ0aW1lc3RhbXAiIDogMTcxMjg0NzA0NzAwNSwKICAicHJvZmlsZUlkIiA6ICIzOThiZGM3NWVhYzQ0ZjMzYWEyMDBiMTYyNTRmMDhlOSIsCiAgInByb2ZpbGVOYW1lIiA6ICJJa2h3YW4wNTEwIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzU3Y2FiMGMzNGQ3ZGRjZjcyZGI1NmZmMzZmMjg4M2Y1NTRjZmY3NmViNWQzYjNlMDU2MjMzODAzNmM5NzYwNDMiCiAgICB9CiAgfQp9" ) private val rabbitGranny: ItemStack = Utils.createSkull( "ThatGravyBoat", "d6c31145-355d-3807-868c-a7e26e11fc59", "ewogICJ0aW1lc3RhbXAiIDogMTcxMjU5NDIyNDA2NCwKICAicHJvZmlsZUlkIiA6ICI2OGVmMmM5NTc5NjM0MjE4YjYwNTM5YWVlOTU3NWJiNSIsCiAgInByb2ZpbGVOYW1lIiA6ICJUaGVNdWx0aUFjb3VudCIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9kNmViMmQ4NWVlOGUzYWYxYzJlYzkzNGJlYjcwYTM5YzVlNzY2YjIzYmRhYjYzMjEwYmQyYWFjZDczY2JiZmM4IgogICAgfQogIH0KfQ==" ) private val rabbitUncle: ItemStack = Utils.createSkull( "catgirlseraid", "10241221-b83d-3b62-91d8-e3abe8f4c40e", "ewogICJ0aW1lc3RhbXAiIDogMTcxNDc3NjY2NDI1NSwKICAicHJvZmlsZUlkIiA6ICIzZWUxYWRlMzljZDI0ZjFkOWYwODliYjA2ZTkzNTY5YSIsCiAgInByb2ZpbGVOYW1lIiA6ICJSdXNvR01SIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzc2MDkyY2FmMDkxMGEzMzhmZTRmMTIxODI2MzFiNWZjYTY1NTQ5OTcwMmUwMmM0MTQ0MTNjNzU1Y2VjOGY5YTEiCiAgICB9CiAgfQp9==" ) private val rabbitDog: ItemStack = Utils.createSkull( "catgirlseraid", "ef693a86-8b91-3753-a563-2efea7606d13", "ewogICJ0aW1lc3RhbXAiIDogMTcxNDk1OTAyNzAyNCwKICAicHJvZmlsZUlkIiA6ICJiZDNhNWRmY2ZkZjg0NDczOTViZDJiZmUwNGY0YzAzMiIsCiAgInByb2ZpbGVOYW1lIiA6ICJwcmVja3Jhc25vIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzM1Y2E5OGJlZGUzODY1ZGQxMjA1ZTRkMDkxMDM2Y2Q5ZGMzNjc5MWI4M2VhNGUwZmY0YTk5YWQ2MWI3MWU4OTgiCiAgICB9CiAgfQp9==" ) private val handBaked = ItemStack(Items.cookie) private val timeTower = ItemStack(Items.clock) private val rabbitShrine = ItemStack(Items.rabbit_foot) private val coachJackrabbit: ItemStack = Utils.createSkull( "ThatGravyBoat", "4793d1f6-8b13-3e09-857b-cfb47dea24d3", "ewogICJ0aW1lc3RhbXAiIDogMTcxMzAyMjkyOTYwNCwKICAicHJvZmlsZUlkIiA6ICI2NGY0MGFiNzFmM2E0NGZiYjg0N2I5ZWFhOWZjNDRlNSIsCiAgInByb2ZpbGVOYW1lIiA6ICJvZGF2aWRjZXNhciIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9iYzBjYzY3ZTc5YzIyOGU1NDFlNjhhZWIxZDgxZWQ3YWY1MTE2NjYyMmFkNGRiOTQxN2Q3YTI5ZDFiODlhZjk1IgogICAgfQogIH0KfQ==" ) private val prestigeItem = ItemStack(Blocks.dropper) private val rabbitBarn = ItemStack(Blocks.oak_fence) private val talismanItem = ItemStack(Items.dye, 1, 8) data class UpgradeInfo( val stack: ItemStack, val level: Int, val upgradeType: UpgradeType, var displayName: String, val extraCps: Int = 0 ) { val colourCode: String get() { if (upgradeType == UpgradeType.RABBIT_EMPLOYEES) { return when (level) { in (0..9) -> "§f" in (10..74) -> "§a" in (75..124) -> "§9" in (125..174) -> "§5" in (175..199) -> "§6" in (200..219) -> "§d" in (220..225) -> "§b" else -> "§7" } } if (upgradeType == UpgradeType.HAND_BAKED_CHOCOLATE) { return if (level >= 10) "§d" else "§7" } if (upgradeType == UpgradeType.TIME_TOWER) { return if (level >= 15) "§d" else "§7" } if (upgradeType == UpgradeType.RABBIT_SHRINE) { return if (level >= 20) "§d" else "§7" } if (upgradeType == UpgradeType.COACH_JACKRABBIT) { return if (level >= 20) "§d" else "§7" } if (upgradeType == UpgradeType.CHOCOLATE_FACTORY) { return if (level >= 6) "§d" else "§7" } if (upgradeType == UpgradeType.RABBIT_BARN) { return if (level >= 222) "§d" else "§7" } if (upgradeType == UpgradeType.TALISMAN) { return if (level >= 5) "§d" else "§7" } return "§7" } val suffixName: String get() { if (upgradeType == UpgradeType.RABBIT_EMPLOYEES) { return when (level) { in (0..9) -> "Intern" in (10..74) -> "Employee" in (75..124) -> "Assistant" in (125..174) -> "Manager" in (175..199) -> "Director" in (200..219) -> "Executive" in (220..225) -> "Board Member" else -> "" } } return "" } val chocolateFactoryTooltip: String get() { if (upgradeType == UpgradeType.CHOCOLATE_FACTORY) { return when (level) { 1 -> "§7Chocolate Production Multiplier: §61x\n" + "§7Max Rabbit Rarity: §a§lUNCOMMON\n" + "§7Max Chocolate: §6500M\n" + "§7Max Employee: [120] §9Assistant" 2 -> "Chocolate Production Multiplier: §61.1x\n" + "Max Rabbit Rarity: §9§lRARE\n" + "Max Chocolate: §61.2B\n" + "Max Employee: [140] §5Manager" 3 -> "Chocolate Production Multiplier: §61.25x\n" + "Max Rabbit Rarity: §5§lEPIC\n" + "Max Chocolate: §64B\n" + "Max Employee: [160] §5Manager" 4 -> "Chocolate Production Multiplier: §61.5x\n" + "Max Rabbit Rarity: §6§lLEGENDARY\n" + "Max Chocolate: §610B\n" + "Max Employee: [180] §6Director" 5 -> "Chocolate Production Multiplier: §62x\n" + "Max Rabbit Rarity: §d§lMYTHIC\n" + "Max Chocolate: §625B\n" + "Max Employee: [200] §dExecutive" 6 -> "Chocolate Production Multiplier: §62.5x\n" + "Max Rabbit Rarity: §b§lDIVINE\n" + "Max Chocolate: §660B\n" + "Max Employee: [220] §bBoard Member" else -> "" } } return "" } } enum class UpgradeType { RABBIT_EMPLOYEES, HAND_BAKED_CHOCOLATE, TIME_TOWER, RABBIT_SHRINE, COACH_JACKRABBIT, CHOCOLATE_FACTORY, RABBIT_BARN, TALISMAN, OTHER } companion object { private val totalRabbit: ItemStack = Utils.createSkull( "CalMWolfs", "c67dc557-0d47-38a4-a2d4-4e776001ed82", "ewogICJ0aW1lc3RhbXAiIDogMTcxMTYzNDM5MTg3OCwKICAicHJvZmlsZUlkIiA6ICIxNmQ4NjI4NzYzMWY0NDY2OGQ0NDM2ZTJlY2IwNTllNSIsCiAgInByb2ZpbGVOYW1lIiA6ICJSZXphVG91cm5leSIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9iNzllN2YzMzQxYjY3MmQ5ZGU2NTY0Y2JhY2EwNTJhNmE3MjNlYTQ2NmEyZTY2YWYzNWJhMWJhODU1ZjBkNjkyIgogICAgfQogIH0KfQ==" ) private val commonRabbit: ItemStack = Utils.createSkull( "CalMWolfs", "12cfcf5a-aaf8-3a88-ab5a-bacb8557f002", "ewogICJ0aW1lc3RhbXAiIDogMTcxMTYzNTExNDE5OCwKICAicHJvZmlsZUlkIiA6ICI5ZDE1OGM1YjNiN2U0ZGNlOWU0OTA5MTdjNmJlYmM5MSIsCiAgInByb2ZpbGVOYW1lIiA6ICJTbm9uX1NTIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzE1ZDBmMGMzNjhlNTRkMjBlM2M1ZTU1MGEwNGE0NjlkMDE2MWIxZmVjZjI2YzhlNTE4MzE4YzA5ZTExMzRmNmIiCiAgICB9CiAgfQp9" ) private val uncommonRabbit: ItemStack = Utils.createSkull( "CalMWolfs", "60b1f785-0d68-342c-8047-9f13a235e68a", "ewogICJ0aW1lc3RhbXAiIDogMTcxMTYzNTM2MzM0NCwKICAicHJvZmlsZUlkIiA6ICI0MzFhMmRlYTQ4YTE0NTMxYjEyZDU5MzY0NDUxNmIyNSIsCiAgInByb2ZpbGVOYW1lIiA6ICJpQ2FwdGFpbk5lbW8iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjgxMDdjNTIwMWVhMjFiYWE4OTU1MTc1MTBiMDA3ZjVmNjE1ZTNjNjYxNWRmNjk2YjkwNmFiOThlNmY5ZjA2IgogICAgfQogIH0KfQ" ) private val rareRabbit: ItemStack = Utils.createSkull( "CalMWolfs", "68beea4d-1f24-341f-910c-bca2155f1070", "ewogICJ0aW1lc3RhbXAiIDogMTcxMTYzNTI0MDkwNCwKICAicHJvZmlsZUlkIiA6ICJmY2ZhYTg0MzA0YjE0NDUxOThkNWYxNzQ3ZjI0Y2Q5MCIsCiAgInByb2ZpbGVOYW1lIiA6ICJMYXJzVGhlV29sZiIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS80NTZhMjA5ODAzZTFlOGViOTQxMTc3ZTJjYzhhMDFiY2VhODg0ZDk0ZGM3N2MzOGUyMmY1Y2QxYTg2MmY4OWNhIgogICAgfQogIH0KfQ" ) private val epicRabbit: ItemStack = Utils.createSkull( "CalMWolfs", "217a75ba-42a7-3cf9-b366-35c07316942b", "ewogICJ0aW1lc3RhbXAiIDogMTcxMTYzNDg4OTY5NywKICAicHJvZmlsZUlkIiA6ICIzYmFlMTVhMWU0Zjg0ZTc5OWE3N2QwZDBhZTNlZDc5NiIsCiAgInByb2ZpbGVOYW1lIiA6ICJiYXlyb25fZ2FtZXJfMjU0IiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzMzNmYwYTUxY2ZiMTBiODE5ZGUxZmNkZjM0NzBmM2QzMzZkYjI2MWQxZmZiYTk0M2E3ODU2NTQwODA5ZGI0ZWUiCiAgICB9CiAgfQp9" ) private val legendaryRabbit: ItemStack = Utils.createSkull( "CalMWolfs", "447a59da-2eff-3b06-8487-6af08e798c81", "ewogICJ0aW1lc3RhbXAiIDogMTcxMTYzNDc1NTM1NCwKICAicHJvZmlsZUlkIiA6ICI5YzM5OTdhMjVjNWY0NmY0OWZlMWFhY2RlZjRiMmMwNSIsCiAgInByb2ZpbGVOYW1lIiA6ICJLaWxsZXJmcmVkZHk4OTQiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGUxYzE3MGI0ZjZjMzc2MTRlZTk2MDk2MDE2NDg1NWFiNzQyNmNlZmI0NDA5N2Y3OTU3ZmEzMGE2N2I5MzVlZiIKICAgIH0KICB9Cn0" ) private val mythicRabbit: ItemStack = Utils.createSkull( "catgirlseraid", "aa834561-cabc-3d33-8d0a-5d01342e796b", "ewogICJ0aW1lc3RhbXAiIDogMTcxNTEwMzM0ODczNywKICAicHJvZmlsZUlkIiA6ICI3OTZjMDBhNmY0MDA0Mjg2OWMyMTIyNjc0ZmI0MWNiZSIsCiAgInByb2ZpbGVOYW1lIiA6ICJTZWRvbnlhIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzUwZGU1NDVmN2M0MGE2ZWM4ODhhZTNjZjlhZTk4M2Q5Mjc4OWRmNzc4Y2Y1NWQ5ZjVhM2QzY2IzYzZkMWI3NjgiCiAgICB9CiAgfQp9" ) private val divineRabbit: ItemStack = Utils.createSkull( "Throwpo", "4e2dea5e-25f9-35b5-b4b1-883347d584e9", "ewogICJ0aW1lc3RhbXAiIDogMTcxNTEwMzA0NzIwNywKICAicHJvZmlsZUlkIiA6ICJlZTg4M2RmMjM0ZWI0YWM1YTFlNDEwODhhYzZkZWIxNyIsCiAgInByb2ZpbGVOYW1lIiA6ICJUdW5lc0Jsb2NrIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2JmYzQ3MWUwMThiZjQzZjMxNWIwMGVjNDE5YWU3YTdmOWRlNjY5MDQ0NGIzMGU5ZTVkMzRjZjc5YTMxNmMwMjMiCiAgICB9CiAgfQp9" ) } private enum class RabbitCollectionRarity( val apiName: String, colourCode: String, val stack: ItemStack, var uniques: Int, var duplicates: Int, var chocolatePerSecond: Int = 0, var multiplier: Double = 0.0, var maximum: Int = 0 ) { TOTAL("Total", "§c", totalRabbit, 0, 0), COMMON("Common", "§f", commonRabbit, 0, 0), UNCOMMON("Uncommon", "§a", uncommonRabbit, 0, 0), RARE("Rare", "§9", rareRabbit, 0, 0), EPIC("Epic", "§5", epicRabbit, 0, 0), LEGENDARY("Legendary", "§6", legendaryRabbit, 0, 0), MYTHIC("Mythic", "§d", mythicRabbit, 0, 0), DIVINE("Divine", "§b", divineRabbit, 0, 0), ; val displayName = "$colourCode$apiName" fun addAmount(amount: Int) { if (amount == 0) return this.uniques += 1 this.duplicates += amount - 1 } fun setChocolateData(cps: Int, multiplier: Double) { this.chocolatePerSecond = cps * uniques this.multiplier = multiplier * uniques } companion object { fun fromApiName(apiName: String): RabbitCollectionRarity? { return values().firstOrNull { it.apiName.lowercase() == apiName } } fun resetData() { values().forEach { it.uniques = 0 it.duplicates = 0 it.chocolatePerSecond = 0 it.multiplier = 0.0 it.maximum = 0 } } } } }