From 5a04ad230cc4fb94884b34f795124d3b65af07ea Mon Sep 17 00:00:00 2001 From: Thunderblade73 <85900443+Thunderblade73@users.noreply.github.com> Date: Wed, 5 Jun 2024 15:39:55 +0200 Subject: Improvement: Refactor of /ff for Improved Modularity and Code Reusability (#873) Co-authored-by: Cal --- .../skyhanni/config/ConfigUpdaterMigrator.kt | 2 +- .../hannibal2/skyhanni/config/commands/Commands.kt | 16 +- .../config/storage/ProfileSpecificStorage.java | 8 +- .../features/commands/tabcomplete/TabComplete.kt | 2 + .../hannibal2/skyhanni/features/garden/CropType.kt | 25 +- .../features/garden/FarmingFortuneDisplay.kt | 3 +- .../garden/farming/FarmingWeightDisplay.kt | 5 +- .../garden/fortuneguide/CaptureFarmingGear.kt | 169 +++---- .../features/garden/fortuneguide/CarrolynTable.kt | 58 +++ .../features/garden/fortuneguide/FFGuideGUI.kt | 535 ++------------------- .../features/garden/fortuneguide/FFInfos.kt | 153 ++++++ .../features/garden/fortuneguide/FFStats.kt | 242 ++++------ .../features/garden/fortuneguide/FarmingItems.kt | 186 ++++++- .../garden/fortuneguide/FarmingReforges.kt | 1 + .../features/garden/fortuneguide/FortuneStats.kt | 81 +++- .../features/garden/fortuneguide/FortuneUpgrade.kt | 10 +- .../garden/fortuneguide/FortuneUpgrades.kt | 24 +- .../features/garden/fortuneguide/pages/CropPage.kt | 122 +++-- .../garden/fortuneguide/pages/OverviewPage.kt | 430 ++++++++--------- .../garden/fortuneguide/pages/UpgradePage.kt | 185 ++++--- .../at/hannibal2/skyhanni/utils/CollectionUtils.kt | 43 ++ .../at/hannibal2/skyhanni/utils/GuiRenderUtils.kt | 176 ++----- .../java/at/hannibal2/skyhanni/utils/NEUItems.kt | 9 +- .../at/hannibal2/skyhanni/utils/guide/GuideGUI.kt | 121 +++++ .../at/hannibal2/skyhanni/utils/guide/GuidePage.kt | 15 + .../skyhanni/utils/guide/GuideRenderablePage.kt | 23 + .../skyhanni/utils/guide/GuideScrollPage.kt | 31 ++ .../at/hannibal2/skyhanni/utils/guide/GuideTab.kt | 67 +++ .../skyhanni/utils/guide/GuideTablePage.kt | 33 ++ .../skyhanni/utils/renderables/Renderable.kt | 117 ++++- .../skyhanni/utils/renderables/RenderableUtils.kt | 11 +- 31 files changed, 1553 insertions(+), 1350 deletions(-) create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/CarrolynTable.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFInfos.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/guide/GuideGUI.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/guide/GuidePage.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/guide/GuideRenderablePage.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/guide/GuideScrollPage.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/guide/GuideTab.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/guide/GuideTablePage.kt (limited to 'src/main/java') diff --git a/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt b/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt index 4f5f0aa50..fdedfdbab 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt @@ -12,7 +12,7 @@ import com.google.gson.JsonPrimitive object ConfigUpdaterMigrator { val logger = LorenzLogger("ConfigMigration") - const val CONFIG_VERSION = 47 + const val CONFIG_VERSION = 48 fun JsonElement.at(chain: List, init: Boolean): JsonElement? { if (chain.isEmpty()) return this if (this !is JsonObject) return null diff --git a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt index bd6cc8efe..89980d349 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt @@ -371,17 +371,11 @@ object Commands { "Disables/enables the rendering of all skyhanni guis." ) { SkyHanniDebugsAndTests.toggleRender() } registerCommand( - "shcarrot", - "Toggles receiving the 12 fortune from carrots" - ) { CaptureFarmingGear.reverseCarrotFortune() } - registerCommand( - "shpumpkin", - "Toggles receiving the 12 fortune from pumpkins" - ) { CaptureFarmingGear.reversePumpkinFortune() } - registerCommand( - "shcocoabeans", - "Toggles receiving the 12 fortune from cocoa beans" - ) { CaptureFarmingGear.reverseCocoaBeansFortune() } + "shcarrolyn", + "Toggels if the specified crops effect is active from carrolyn" + ) { + CaptureFarmingGear.handelCarrolyn(it) + } registerCommand( "shrepostatus", "Shows the status of all the mods constants" diff --git a/src/main/java/at/hannibal2/skyhanni/config/storage/ProfileSpecificStorage.java b/src/main/java/at/hannibal2/skyhanni/config/storage/ProfileSpecificStorage.java index d88ccb315..cbdc90978 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/storage/ProfileSpecificStorage.java +++ b/src/main/java/at/hannibal2/skyhanni/config/storage/ProfileSpecificStorage.java @@ -373,13 +373,7 @@ public class ProfileSpecificStorage { public long cakeExpiring = -1L; @Expose - public boolean carrotFortune = false; - - @Expose - public boolean pumpkinFortune = false; - - @Expose - public boolean cocoaBeansFortune = false; + public Map carrolyn = new HashMap<>(); @Expose public Map farmingItems = new HashMap<>(); diff --git a/src/main/java/at/hannibal2/skyhanni/features/commands/tabcomplete/TabComplete.kt b/src/main/java/at/hannibal2/skyhanni/features/commands/tabcomplete/TabComplete.kt index 49bde5993..87130298c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/commands/tabcomplete/TabComplete.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/commands/tabcomplete/TabComplete.kt @@ -3,6 +3,7 @@ package at.hannibal2.skyhanni.features.commands.tabcomplete import at.hannibal2.skyhanni.events.TabCompletionEvent import at.hannibal2.skyhanni.features.commands.PartyCommands import at.hannibal2.skyhanni.features.commands.ViewRecipeCommand +import at.hannibal2.skyhanni.features.garden.fortuneguide.CarrolynTable import at.hannibal2.skyhanni.features.misc.CollectionTracker import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -28,6 +29,7 @@ object TabComplete { CollectionTracker.handleTabComplete(command)?.let { return it } PartyCommands.customTabComplete(command)?.let { return it } ViewRecipeCommand.customTabComplete(command)?.let { return it } + CarrolynTable.customTabComplete(command)?.let { return it } return null } diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/CropType.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/CropType.kt index b7480f259..3a661161e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/CropType.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/CropType.kt @@ -1,5 +1,6 @@ package at.hannibal2.skyhanni.features.garden +import at.hannibal2.skyhanni.features.garden.fortuneguide.FarmingItems import net.minecraft.block.state.IBlockState import net.minecraft.init.Blocks import net.minecraft.init.Items @@ -13,48 +14,49 @@ enum class CropType( val baseDrops: Double, iconSupplier: () -> ItemStack, val simpleName: String, + val farmingItem: FarmingItems, val replenish: Boolean = false, ) { WHEAT( "Wheat", "THEORETICAL_HOE_WHEAT", "CROPIE", 1.0, - { ItemStack(Items.wheat) }, "wheat" + { ItemStack(Items.wheat) }, "wheat", FarmingItems.WHEAT ), CARROT( "Carrot", "THEORETICAL_HOE_CARROT", "CROPIE", 3.0, - { ItemStack(Items.carrot) }, "carrot", replenish = true + { ItemStack(Items.carrot) }, "carrot", FarmingItems.CARROT, replenish = true ), POTATO( "Potato", "THEORETICAL_HOE_POTATO", "CROPIE", 3.0, - { ItemStack(Items.potato) }, "potato", replenish = true + { ItemStack(Items.potato) }, "potato", FarmingItems.POTATO, replenish = true ), NETHER_WART( "Nether Wart", "THEORETICAL_HOE_WARTS", "FERMENTO", 2.5, - { ItemStack(Items.nether_wart) }, "wart", replenish = true + { ItemStack(Items.nether_wart) }, "wart", FarmingItems.NETHER_WART, replenish = true ), PUMPKIN( "Pumpkin", "PUMPKIN_DICER", "SQUASH", 1.0, - { ItemStack(Blocks.pumpkin) }, "pumpkin" + { ItemStack(Blocks.pumpkin) }, "pumpkin", FarmingItems.PUMPKIN ), MELON( "Melon", "MELON_DICER", "SQUASH", 5.0, - { ItemStack(Items.melon) }, "melon" + { ItemStack(Items.melon) }, "melon", FarmingItems.MELON ), COCOA_BEANS( "Cocoa Beans", "COCO_CHOPPER", "SQUASH", 3.0, - { ItemStack(Items.dye, 1, EnumDyeColor.BROWN.dyeDamage) }, "cocoa", replenish = true + { ItemStack(Items.dye, 1, EnumDyeColor.BROWN.dyeDamage) }, "cocoa", FarmingItems.COCOA_BEANS, replenish = true ), SUGAR_CANE( "Sugar Cane", "THEORETICAL_HOE_CANE", "FERMENTO", 2.0, - { ItemStack(Items.reeds) }, "cane" + { ItemStack(Items.reeds) }, "cane", FarmingItems.SUGAR_CANE ), CACTUS( "Cactus", "CACTUS_KNIFE", "FERMENTO", 2.0, - { ItemStack(Blocks.cactus) }, "cactus" + { ItemStack(Blocks.cactus) }, "cactus", FarmingItems.CACTUS ), MUSHROOM( "Mushroom", "FUNGI_CUTTER", "FERMENTO", 1.0, - { ItemStack(Blocks.red_mushroom_block) }, "mushroom" + { ItemStack(Blocks.red_mushroom_block) }, "mushroom", FarmingItems.MUSHROOM ), ; @@ -64,6 +66,9 @@ enum class CropType( override fun toString(): String = cropName + val patternKeyName = name.lowercase().replace('_', '.') + val niceName = name.lowercase().replace('_', ' ') + companion object { fun getByNameOrNull(itemName: String): CropType? { diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/FarmingFortuneDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/FarmingFortuneDisplay.kt index 0d75c9325..41ea1aa71 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/FarmingFortuneDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/FarmingFortuneDisplay.kt @@ -345,7 +345,8 @@ object FarmingFortuneDisplay { // TODO code cleanup (after ff rework) - for (line in tool?.getLore()!!) { + val lore = tool?.getLore() ?: return + for (line in lore) { tooltipFortunePattern.matchMatcher(line) { displayedFortune = group("display")?.toDouble() ?: 0.0 reforgeFortune = groupOrNull("reforge")?.toDouble() ?: 0.0 diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/FarmingWeightDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/FarmingWeightDisplay.kt index 6f8523c34..0aac3e747 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/FarmingWeightDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/FarmingWeightDisplay.kt @@ -192,8 +192,9 @@ class FarmingWeightDisplay { list.add( Renderable.clickAndHover( "§6Farming Weight§7: $weight$leaderboard", - listOf("§eClick to open your Farming Profile."), - onClick = { openWebsite(LorenzUtils.getPlayerName()) } + listOf("§eClick to open your Farming Profile."), onClick = { + openWebsite(LorenzUtils.getPlayerName()) + } ) ) diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/CaptureFarmingGear.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/CaptureFarmingGear.kt index 55e756780..158d1309e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/CaptureFarmingGear.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/CaptureFarmingGear.kt @@ -1,17 +1,21 @@ package at.hannibal2.skyhanni.features.garden.fortuneguide +import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator import at.hannibal2.skyhanni.config.storage.ProfileSpecificStorage import at.hannibal2.skyhanni.data.PetAPI import at.hannibal2.skyhanni.data.ProfileStorageData import at.hannibal2.skyhanni.events.GardenToolChangeEvent import at.hannibal2.skyhanni.events.InventoryFullyOpenedEvent import at.hannibal2.skyhanni.events.LorenzChatEvent +import at.hannibal2.skyhanni.features.garden.CropType import at.hannibal2.skyhanni.features.garden.FarmingFortuneDisplay import at.hannibal2.skyhanni.features.garden.GardenAPI import at.hannibal2.skyhanni.features.garden.GardenAPI.getCropType import at.hannibal2.skyhanni.utils.ChatUtils import at.hannibal2.skyhanni.utils.InventoryUtils +import at.hannibal2.skyhanni.utils.ItemCategory import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName +import at.hannibal2.skyhanni.utils.ItemUtils.getItemCategoryOrNull import at.hannibal2.skyhanni.utils.ItemUtils.getItemRarityOrNull import at.hannibal2.skyhanni.utils.ItemUtils.getLore import at.hannibal2.skyhanni.utils.LorenzUtils @@ -29,7 +33,6 @@ import kotlin.math.round import kotlin.time.Duration.Companion.days object CaptureFarmingGear { - private val farmingItems get() = GardenAPI.storage?.fortune?.farmingItems private val outdatedItems get() = GardenAPI.storage?.fortune?.outdatedItems private val patternGroup = RepoPattern.group("garden.fortuneguide.capture") @@ -80,9 +83,24 @@ object CaptureFarmingGear { "RANCHERS", "FARMER", "RABBIT" ) + init { + CarrolynTable.entries.forEach { + it.completeMessagePattern + it.thxMessagePattern + } + } + // TODO upadte armor on equpment/wardeobe update as well fun captureFarmingGear() { - val farmingItems = farmingItems ?: return + for (armor in InventoryUtils.getArmor()) { + if (armor == null) continue + val split = armor.getInternalName().asString().split("_") + if (split.first() in farmingSets) { + val category = armor.getItemCategoryOrNull() ?: continue + FarmingItems.getFromItemCategoryOne(category)?.setItem(armor) + } + } + val itemStack = InventoryUtils.getItemInHand() ?: return val currentCrop = itemStack.getCropType() @@ -91,22 +109,7 @@ object CaptureFarmingGear { //todo better fall back items //todo Daedalus axe } else { - for (item in FarmingItems.entries) { - if (item.name == currentCrop.name) { - farmingItems[item] = itemStack - } - } - } - for (armor in InventoryUtils.getArmor()) { - if (armor == null) continue - val split = armor.getInternalName().asString().split("_") - if (split.first() in farmingSets) { - for (item in FarmingItems.entries) { - if (item.name == split.last()) { - farmingItems[item] = armor - } - } - } + currentCrop.farmingItem.setItem(itemStack) } TabListData.getTabList().matchFirst(strengthPattern) { @@ -114,22 +117,13 @@ object CaptureFarmingGear { } } - fun reverseCarrotFortune() { - val storage = GardenAPI.storage?.fortune ?: return - storage.carrotFortune = !storage.carrotFortune - ChatUtils.chat("Toggled exportable carrot fortune to: ${storage.carrotFortune}") - } - - fun reversePumpkinFortune() { - val storage = GardenAPI.storage?.fortune ?: return - storage.pumpkinFortune = !storage.pumpkinFortune - ChatUtils.chat("Toggled expired pumpkin fortune to: ${storage.pumpkinFortune}") - } - - fun reverseCocoaBeansFortune() { - val storage = GardenAPI.storage?.fortune ?: return - storage.cocoaBeansFortune = !storage.cocoaBeansFortune - ChatUtils.chat("Toggled supreme chocolate bar fortune to: ${storage.cocoaBeansFortune}") + fun handelCarrolyn(input: Array) { + val string = input.joinToString("_").uppercase() + val crop = CropType.entries.firstOrNull { it.name == string } + ?: ChatUtils.userError("Invalid Argument, no crop with the name: $string").run { return } + val carrolyn = CarrolynTable.getByCrop(crop) + ?: ChatUtils.userError("Invalid Argument, crop is not valid").run { return } + carrolyn.setVisibleActive(!carrolyn.get()) } private fun getUniqueVisitorsForTier(tier: Int): Int { @@ -151,15 +145,14 @@ object CaptureFarmingGear { fun onInventoryOpen(event: InventoryFullyOpenedEvent) { if (!LorenzUtils.inSkyBlock) return val storage = GardenAPI.storage?.fortune ?: return - val farmingItems = farmingItems ?: return val outdatedItems = outdatedItems ?: return val items = event.inventoryItems if (PetAPI.isPetMenu(event.inventoryName)) { - pets(farmingItems, items, outdatedItems) + pets(items, outdatedItems) return } when (event.inventoryName) { - "Your Equipment and Stats" -> equipmentAndStats(items, farmingItems, outdatedItems) + "Your Equipment and Stats" -> equipmentAndStats(items, outdatedItems) "Your Skills" -> skills(items, storage) "Community Shop" -> communityShop(items) "Configure Plots" -> configurePlots(items, storage) @@ -248,69 +241,54 @@ object CaptureFarmingGear { } private fun pets( - farmingItems: MutableMap, items: Map, outdatedItems: MutableMap, ) { // If they've 2 of same pet, one will be overwritten - // optimize - - for (pet in listOf( - FarmingItems.ELEPHANT, - FarmingItems.MOOSHROOM_COW, - FarmingItems.RABBIT, - FarmingItems.BEE - )) { - if (farmingItems[pet] == null) { - farmingItems[pet] = FFGuideGUI.getFallbackItem(pet) - } - } // setting to current saved level -1 to stop later pages saving low rarity pets - var highestElephantRarity = (farmingItems[FarmingItems.ELEPHANT]?.getItemRarityOrNull()?.id ?: -1) - 1 - var highestMooshroomRarity = (farmingItems[FarmingItems.MOOSHROOM_COW]?.getItemRarityOrNull()?.id ?: -1) - 1 - var highestRabbitRarity = (farmingItems[FarmingItems.RABBIT]?.getItemRarityOrNull()?.id ?: -1) - 1 - var highestBeeRarity = (farmingItems[FarmingItems.BEE]?.getItemRarityOrNull()?.id ?: -1) - 1 + var highestElephantRarity = (FarmingItems.ELEPHANT.getItemOrNull()?.getItemRarityOrNull()?.id ?: -1) - 1 + var highestMooshroomRarity = (FarmingItems.MOOSHROOM_COW.getItemOrNull()?.getItemRarityOrNull()?.id ?: -1) - 1 + var highestRabbitRarity = (FarmingItems.RABBIT.getItemOrNull()?.getItemRarityOrNull()?.id ?: -1) - 1 + var highestBeeRarity = (FarmingItems.BEE.getItemOrNull()?.getItemRarityOrNull()?.id ?: -1) - 1 for ((_, item) in items) { - val split = item.getInternalName().asString().split(";") - if (split.first() == "ELEPHANT" && split.last().toInt() > highestElephantRarity) { - farmingItems[FarmingItems.ELEPHANT] = item + if (item.getItemCategoryOrNull() != ItemCategory.PET) continue + val (name, rarity) = item.getInternalName().asString().split(";") + if (name == "ELEPHANT" && rarity.toInt() > highestElephantRarity) { + FarmingItems.ELEPHANT.setItem(item) outdatedItems[FarmingItems.ELEPHANT] = false - highestElephantRarity = split.last().toInt() + highestElephantRarity = rarity.toInt() } - if (split.first() == "MOOSHROOM_COW" && split.last().toInt() > highestMooshroomRarity) { - farmingItems[FarmingItems.MOOSHROOM_COW] = item + if (name == "MOOSHROOM_COW" && rarity.toInt() > highestMooshroomRarity) { + FarmingItems.MOOSHROOM_COW.setItem(item) outdatedItems[FarmingItems.MOOSHROOM_COW] = false - highestMooshroomRarity = split.last().toInt() + highestMooshroomRarity = rarity.toInt() } - if (split.first() == "RABBIT" && split.last().toInt() > highestRabbitRarity) { - farmingItems[FarmingItems.RABBIT] = item + if (name == "RABBIT" && rarity.toInt() > highestRabbitRarity) { + FarmingItems.RABBIT.setItem(item) outdatedItems[FarmingItems.RABBIT] = false - highestRabbitRarity = split.last().toInt() + highestRabbitRarity = rarity.toInt() } - if (split.first() == "BEE" && split.last().toInt() > highestBeeRarity) { - farmingItems[FarmingItems.BEE] = item + if (name == "BEE" && rarity.toInt() > highestBeeRarity) { + FarmingItems.BEE.setItem(item) outdatedItems[FarmingItems.BEE] = false - highestBeeRarity = split.last().toInt() + highestBeeRarity = rarity.toInt() } } } private fun equipmentAndStats( items: Map, - farmingItems: MutableMap, outdatedItems: MutableMap, ) { for ((_, slot) in items) { val split = slot.getInternalName().asString().split("_") + val category = slot.getItemCategoryOrNull() ?: continue if (split.first() == "LOTUS") { - for (item in FarmingItems.entries) { - if (item.name == split.last()) { - farmingItems[item] = slot - outdatedItems[item] = false - } - } + val item = FarmingItems.getFromItemCategoryOne(category) ?: continue + item.setItem(slot) + outdatedItems[item] = false FarmingFortuneDisplay.loadFortuneLineData(slot, 0.0) val enchantments = slot.getEnchantments() ?: emptyMap() val greenThumbLvl = (enchantments["green_thumb"] ?: continue) @@ -328,12 +306,15 @@ object CaptureFarmingGear { val msg = event.message.removeColor().trim() fortuneUpgradePattern.matchMatcher(msg) { ProfileStorageData.playerSpecific?.gardenCommunityUpgrade = group("level").romanToDecimal() + return } farmingLevelUpPattern.matchMatcher(msg) { storage.farmingLevel = group("level").romanToDecimalIfNecessary() + return } anitaBuffPattern.matchMatcher(msg) { storage.anitaUpgrade = group("level").toInt() / 4 + return } lotusUpgradePattern.matchMatcher(msg) { val piece = group("piece").uppercase() @@ -342,6 +323,7 @@ object CaptureFarmingGear { outdatedItems[item] = true } } + return } petLevelUpPattern.matchMatcher(msg) { val pet = group("pet").uppercase().replace("✦", "").trim().replace(" ", "_") @@ -350,30 +332,29 @@ object CaptureFarmingGear { outdatedItems[item] = true } } + return } cakePattern.matchMatcher(msg) { storage.cakeExpiring = System.currentTimeMillis() + 2.days.inWholeMilliseconds + return } - if (msg == "CARROTS EXPORTATION COMPLETE!") { - storage.carrotFortune = true - } - if (msg == "PUMPKINS EXPORTATION COMPLETE!") { - storage.pumpkinFortune = true - } - if (msg == "CHOCOLATE BARS EXPORTATION COMPLETE!") { - storage.cocoaBeansFortune = true - } - if (msg == "[NPC] Carrolyn: Thank you for the carrots.") { - storage.carrotFortune = true - ChatUtils.chat("§aYou have already given Carrolyn enough Exportable Carrots.") - } - if (msg == "[NPC] Carrolyn: Thank you for the pumpkins.") { - storage.pumpkinFortune = true - ChatUtils.chat("§aYou have already given Carrolyn enough Expired Pumpkins.") - } - if (msg == "[NPC] Carrolyn: Thank you for the chocolate.") { - storage.cocoaBeansFortune = true - ChatUtils.chat("§aYou have already given Carrolyn enough Supreme Chocolate Bars.") + CarrolynTable.entries.forEach { + it.completeMessagePattern.matchMatcher(msg) { + it.set(true) + return + } + it.thxMessagePattern.matchMatcher(msg) { + it.set(true) + ChatUtils.chat(it.thxResponse) + return + } } } + + @SubscribeEvent + fun onConfigUpdaterMigratorConfigFix(event: ConfigUpdaterMigrator.ConfigFixEvent) { + event.move(48, "#profile.garden.fortune.carrotFortune", "#profile.garden.fortune.carrolyn.CARROT") + event.move(48, "#profile.garden.fortune.pumpkinFortune", "#profile.garden.fortune.carrolyn.PUMPKIN") + event.move(48, "#profile.garden.fortune.cocoaBeansFortune", "#profile.garden.fortune.carrolyn.COCOA_BEANS") + } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/CarrolynTable.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/CarrolynTable.kt new file mode 100644 index 000000000..b7163768b --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/CarrolynTable.kt @@ -0,0 +1,58 @@ +package at.hannibal2.skyhanni.features.garden.fortuneguide + +import at.hannibal2.skyhanni.features.garden.CropType +import at.hannibal2.skyhanni.features.garden.GardenAPI +import at.hannibal2.skyhanni.utils.ChatUtils +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern + +enum class CarrolynTable(val crop: CropType, val label: String, completeMessage: String, thxMessage: String) { + EXPORTABLE_CARROTS( + CropType.CARROT, + "Exportable Carrots", + "CARROTS EXPORTATION COMPLETE!", + "[NPC] Carrolyn: Thank you for the carrots." + ), + EXPIRED_PUMPKIN( + CropType.PUMPKIN, + "Expired Pumpkin", + "PUMPKINS EXPORTATION COMPLETE!", + "[NPC] Carrolyn: Thank you for the pumpkins." + ), + SUPREME_CHOCOLATE_BAR( + CropType.COCOA_BEANS, + "Supreme Chocolate Bar", + "CHOCOLATE BARS EXPORTATION COMPLETE!", + "[NPC] Carrolyn: Thank you for the chocolate." + ), + ; + + val completeMessagePattern by RepoPattern.pattern( + "garden.ff.carrolyn.complete.${crop.patternKeyName}", completeMessage + ) + val thxMessagePattern by RepoPattern.pattern( + "garden.ff.carrolyn.thx.${crop.patternKeyName}", thxMessage + ) + + val thxResponse = "§aYou have already given Carrolyn enough $label." + + fun get() = GardenAPI.storage?.fortune?.carrolyn?.get(crop) ?: false + fun set(value: Boolean) = GardenAPI.storage?.fortune?.carrolyn?.set(crop, value) + + fun setVisibleActive(value: Boolean) { + set(value) + ChatUtils.chat("Toggled $label fortune to: ${get()}") + } + + companion object { + fun getByCrop(crop: CropType?) = if (crop == null) null else entries.firstOrNull { it.crop == crop } + + fun isCarrolynCrop(crop: CropType): Boolean = CarrolynTable.getByCrop(crop) != null + fun customTabComplete(command: String): List? { + if (command == "shcarrolyn") { + return entries.map { it.crop.name } + } + + return null + } + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFGuideGUI.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFGuideGUI.kt index 0cafabd1c..ff81cae6d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFGuideGUI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFGuideGUI.kt @@ -2,528 +2,95 @@ package at.hannibal2.skyhanni.features.garden.fortuneguide import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.features.garden.CropType -import at.hannibal2.skyhanni.features.garden.GardenAPI import at.hannibal2.skyhanni.features.garden.fortuneguide.pages.CropPage import at.hannibal2.skyhanni.features.garden.fortuneguide.pages.OverviewPage import at.hannibal2.skyhanni.features.garden.fortuneguide.pages.UpgradePage -import at.hannibal2.skyhanni.utils.ChatUtils -import at.hannibal2.skyhanni.utils.GuiRenderUtils -import at.hannibal2.skyhanni.utils.ItemUtils.name -import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.OSUtils -import at.hannibal2.skyhanni.utils.SoundUtils +import at.hannibal2.skyhanni.utils.guide.GuideGUI +import at.hannibal2.skyhanni.utils.guide.GuideTab +import at.hannibal2.skyhanni.utils.renderables.Renderable import net.minecraft.client.Minecraft -import net.minecraft.client.gui.GuiScreen -import net.minecraft.client.renderer.GlStateManager import net.minecraft.init.Blocks import net.minecraft.init.Items import net.minecraft.item.ItemStack -import org.lwjgl.input.Mouse -import java.io.IOException -open class FFGuideGUI : GuiScreen() { - companion object { - - private var firefoxTrials = 0 - - fun open() { - if (LorenzUtils.isAprilFoolsDay) { - when (firefoxTrials) { - 0 -> { - ChatUtils.chat("Are you looking for the FF browser?", prefix = false) - } - - 1 -> { - ChatUtils.chat("Quickly, download Firefox! NOW!", prefix = false) - OSUtils.openBrowser("https://www.mozilla.org/en-US/firefox/new/") - } - - 2 -> { - ChatUtils.chat("Have you tried Firefix from Mozilla already?", prefix = false) - } - - 10 -> { - ChatUtils.chat("Firefox is simply the best!", prefix = false) - } - - 20 -> { - ChatUtils.chat( - "What do you mean with \"farming fortune\"? This is a web browser!", - prefix = false - ) - } - - 30 -> { - ChatUtils.chat("What are you still doing here? get Firefox!", prefix = false) - } - - else -> { - CaptureFarmingGear.captureFarmingGear() - SkyHanniMod.screenToOpen = FFGuideGUI() - } - } - firefoxTrials++ - } else { - CaptureFarmingGear.captureFarmingGear() - SkyHanniMod.screenToOpen = FFGuideGUI() - } - } - - val pages = mutableMapOf() - - var guiLeft = 0 - var guiTop = 0 - var screenHeight = 0 - - const val sizeX = 360 - const val sizeY = 180 +class FFGuideGUI : GuideGUI(FortuneGuidePage.OVERVIEW) { - var selectedPage = FortuneGuidePage.OVERVIEW - var currentCrop: CropType? = null + override val sizeX = 360 + override val sizeY = 180 - // todo set this to what they have equip - var currentPet = FarmingItems.ELEPHANT - var currentArmor = 0 - var currentEquipment = 0 - - var mouseX = 0 - var mouseY = 0 - var lastMouseScroll = 0 - var noMouseScrollFrames = 0 - var lastClickedHeight = 0 - - var tooltipToDisplay = mutableListOf() + companion object { fun isInGui() = Minecraft.getMinecraft().currentScreen is FFGuideGUI - fun FarmingItems.getItem(): ItemStack { - val fortune = GardenAPI.storage?.fortune ?: return getFallbackItem(this) - - val farmingItems = fortune.farmingItems - farmingItems[this]?.let { return it } - - val fallbackItem = getFallbackItem(this) - farmingItems[this] = fallbackItem - return fallbackItem + fun open() { + CaptureFarmingGear.captureFarmingGear() + SkyHanniMod.screenToOpen = FFGuideGUI() } - private val fallbackItems = mutableMapOf() - - fun getFallbackItem(item: FarmingItems) = fallbackItems.getOrPut(item) { - val name = "§cNo saved ${item.name.lowercase().replace("_", " ")}" - ItemStack(Blocks.barrier).setStackDisplayName(name) + fun updateDisplay() { + with(Minecraft.getMinecraft().currentScreen) { + if (this !is FFGuideGUI) return + this.refreshPage() + } } - - fun isFallbackItem(item: ItemStack) = item.name.startsWith("§cNo saved ") } + /** Value for which crop page is active */ + private var currentCrop: CropType? = null + init { FFStats.loadFFData() FortuneUpgrades.generateGenericUpgrades() - pages[FortuneGuidePage.OVERVIEW] = OverviewPage() - pages[FortuneGuidePage.CROP] = CropPage() - pages[FortuneGuidePage.UPGRADES] = UpgradePage() + FarmingItems.setDefaultPet() - if (currentCrop != null) { - for (item in FarmingItems.entries) { - if (item.name == currentCrop?.name) { - FFStats.getCropStats(currentCrop!!, item.getItem()) + pageList = mapOf( + FortuneGuidePage.OVERVIEW to OverviewPage(sizeX, sizeY), + FortuneGuidePage.CROP to CropPage({ currentCrop!! }, sizeX, sizeY), + FortuneGuidePage.UPGRADES to UpgradePage({ currentCrop }, sizeX, sizeY - 2), + ) + verticalTabs = listOf( + vTab(ItemStack(Items.gold_ingot), Renderable.string("§eBreakdown")) { + currentPage = if (currentCrop == null) FortuneGuidePage.OVERVIEW else FortuneGuidePage.CROP + }, + vTab(ItemStack(Items.map), Renderable.string("§eUpgrades")) { + currentPage = FortuneGuidePage.UPGRADES + }) + horizontalTabs = buildList { + add( + hTab(ItemStack(Blocks.grass), Renderable.string("§eOverview")) { + currentCrop = null + + it.pageSwitchHorizontal() } - } - } - } - - override fun drawScreen(unusedX: Int, unusedY: Int, partialTicks: Float) { - super.drawScreen(unusedX, unusedY, partialTicks) - drawDefaultBackground() - screenHeight = height - guiLeft = (width - sizeX) / 2 - guiTop = (height - sizeY) / 2 - - mouseX = Mouse.getX() * width / Minecraft.getMinecraft().displayWidth - mouseY = height - Mouse.getY() * height / Minecraft.getMinecraft().displayHeight - 1 - - GlStateManager.pushMatrix() - drawRect(guiLeft, guiTop, guiLeft + sizeX, guiTop + sizeY, 0x50000000) - renderTabs() - - if (selectedPage == FortuneGuidePage.UPGRADES) { - // - } else { - GuiRenderUtils.drawStringCentered("§7SkyHanni", guiLeft + 325, guiTop + 170) - if (currentCrop == null) { - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.HELMET.getItem(), guiLeft + 142, guiTop + 5, mouseX, mouseY, - if (currentArmor == 1) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() - ) - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.CHESTPLATE.getItem(), guiLeft + 162, guiTop + 5, mouseX, mouseY, - if (currentArmor == 2) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() - ) - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.LEGGINGS.getItem(), guiLeft + 182, guiTop + 5, mouseX, mouseY, - if (currentArmor == 3) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() - ) - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.BOOTS.getItem(), guiLeft + 202, guiTop + 5, mouseX, mouseY, - if (currentArmor == 4) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() - ) + ) + for (crop in CropType.entries) { + add( + hTab(crop.icon, Renderable.string("§e${crop.cropName}")) { + currentCrop = crop - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.NECKLACE.getItem(), guiLeft + 262, guiTop + 5, mouseX, mouseY, - if (currentEquipment == 1) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() - ) - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.CLOAK.getItem(), guiLeft + 282, guiTop + 5, mouseX, mouseY, - if (currentEquipment == 2) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() - ) - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.BELT.getItem(), guiLeft + 302, guiTop + 5, mouseX, mouseY, - if (currentEquipment == 3) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() - ) - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.BRACELET.getItem(), guiLeft + 322, guiTop + 5, mouseX, mouseY, - if (currentEquipment == 4) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() - ) - - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.ELEPHANT.getItem(), guiLeft + 142, guiTop + 130, mouseX, mouseY, - if (currentPet == FarmingItems.ELEPHANT) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() - ) - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.MOOSHROOM_COW.getItem(), guiLeft + 162, guiTop + 130, mouseX, mouseY, - if (currentPet == FarmingItems.MOOSHROOM_COW) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() - ) - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.RABBIT.getItem(), guiLeft + 182, guiTop + 130, mouseX, mouseY, - if (currentPet == FarmingItems.RABBIT) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() - ) - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.BEE.getItem(), guiLeft + 202, guiTop + 130, mouseX, mouseY, - if (currentPet == FarmingItems.BEE) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() - ) - } else { - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.ELEPHANT.getItem(), guiLeft + 142, guiTop + 160, mouseX, mouseY, - if (currentPet == FarmingItems.ELEPHANT) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() - ) - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.MOOSHROOM_COW.getItem(), guiLeft + 162, guiTop + 160, mouseX, mouseY, - if (currentPet == FarmingItems.MOOSHROOM_COW) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() - ) - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.RABBIT.getItem(), guiLeft + 182, guiTop + 160, mouseX, mouseY, - if (currentPet == FarmingItems.RABBIT) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() - ) - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.BEE.getItem(), guiLeft + 202, guiTop + 160, mouseX, mouseY, - if (currentPet == FarmingItems.BEE) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() - ) - - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.HELMET.getItem(), guiLeft + 162, guiTop + 80, mouseX, mouseY - ) - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.CHESTPLATE.getItem(), guiLeft + 162, guiTop + 100, mouseX, mouseY - ) - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.LEGGINGS.getItem(), guiLeft + 162, guiTop + 120, mouseX, mouseY - ) - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.BOOTS.getItem(), guiLeft + 162, guiTop + 140, mouseX, mouseY - ) - - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.NECKLACE.getItem(), guiLeft + 182, guiTop + 80, mouseX, mouseY - ) - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.CLOAK.getItem(), guiLeft + 182, guiTop + 100, mouseX, mouseY - ) - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.BELT.getItem(), guiLeft + 182, guiTop + 120, mouseX, mouseY - ) - GuiRenderUtils.renderItemAndTip( - tooltipToDisplay, - FarmingItems.BRACELET.getItem(), guiLeft + 182, guiTop + 140, mouseX, mouseY + it.pageSwitchHorizontal() + } ) } } - pages[selectedPage]?.drawPage(mouseX, mouseY, partialTicks) + horizontalTabs.firstOrNull()?.fakeClick() + verticalTabs.firstOrNull()?.fakeClick() - GlStateManager.popMatrix() - - if (tooltipToDisplay.isNotEmpty()) { - GuiRenderUtils.drawTooltip(tooltipToDisplay, mouseX, mouseY, height) - tooltipToDisplay.clear() - } } - override fun handleMouseInput() { - super.handleMouseInput() - - if (Mouse.getEventButtonState()) { - mouseClickEvent() - } - if (!Mouse.getEventButtonState() && Mouse.getEventDWheel() != 0) { - lastMouseScroll = Mouse.getEventDWheel() - noMouseScrollFrames = 0 - } - } - - @Throws(IOException::class) - fun mouseClickEvent() { - var x = guiLeft + 15 - var y = guiTop - 28 - if (isMouseIn(x, y, 25, 28)) { - SoundUtils.playClickSound() - if (currentCrop != null) { - currentCrop = null - if (selectedPage != FortuneGuidePage.UPGRADES) { - selectedPage = FortuneGuidePage.OVERVIEW - } - } else { - if (selectedPage == FortuneGuidePage.UPGRADES) { - selectedPage = FortuneGuidePage.OVERVIEW - } else { - selectedPage = FortuneGuidePage.UPGRADES - } - } - } - for (crop in CropType.entries) { - x += 30 - if (isMouseIn(x, y, 25, 28)) { - SoundUtils.playClickSound() - if (currentCrop != crop) { - currentCrop = crop - if (selectedPage == FortuneGuidePage.OVERVIEW) { - selectedPage = FortuneGuidePage.CROP - } - for (item in FarmingItems.entries) { - if (item.name == crop.name) { - FFStats.getCropStats(crop, item.getItem()) - FortuneUpgrades.getCropSpecific(item.getItem()) - } - } - } else { - if (selectedPage == FortuneGuidePage.CROP) { - selectedPage = FortuneGuidePage.UPGRADES - for (item in FarmingItems.entries) { - if (item.name == crop.name) { - FortuneUpgrades.getCropSpecific(item.getItem()) - } - } - } else { - selectedPage = FortuneGuidePage.CROP - for (item in FarmingItems.entries) { - if (item.name == crop.name) { - FFStats.getCropStats(crop, item.getItem()) - } - } - } - } - } - } - - x = guiLeft - 28 - y = guiTop + 15 - if (isMouseIn(x, y, 28, 25) && - selectedPage != FortuneGuidePage.CROP && selectedPage != FortuneGuidePage.OVERVIEW - ) { - SoundUtils.playClickSound() - selectedPage = if (currentCrop == null) { - FortuneGuidePage.OVERVIEW - } else { - FortuneGuidePage.CROP - } - } - y += 30 - if (isMouseIn(x, y, 28, 25) && selectedPage != FortuneGuidePage.UPGRADES) { - selectedPage = FortuneGuidePage.UPGRADES - SoundUtils.playClickSound() - } - - if (selectedPage != FortuneGuidePage.UPGRADES) { - if (currentCrop == null) { - when { - isMouseInRect(guiLeft + 142, guiTop + 130) && currentPet != FarmingItems.ELEPHANT -> { - SoundUtils.playClickSound() - currentPet = FarmingItems.ELEPHANT - FFStats.getTotalFF() - } - - isMouseInRect(guiLeft + 162, guiTop + 130) && currentPet != FarmingItems.MOOSHROOM_COW -> { - SoundUtils.playClickSound() - currentPet = FarmingItems.MOOSHROOM_COW - FFStats.getTotalFF() - } - - isMouseInRect(guiLeft + 182, guiTop + 130) && currentPet != FarmingItems.RABBIT -> { - SoundUtils.playClickSound() - currentPet = FarmingItems.RABBIT - FFStats.getTotalFF() - } - - isMouseInRect(guiLeft + 202, guiTop + 130) && currentPet != FarmingItems.BEE -> { - SoundUtils.playClickSound() - currentPet = FarmingItems.BEE - FFStats.getTotalFF() - } - - isMouseInRect(guiLeft + 142, guiTop + 5) -> { - SoundUtils.playClickSound() - currentArmor = if (currentArmor == 1) 0 else 1 - } - - isMouseInRect(guiLeft + 162, guiTop + 5) -> { - SoundUtils.playClickSound() - currentArmor = if (currentArmor == 2) 0 else 2 - } - - isMouseInRect(guiLeft + 182, guiTop + 5) -> { - SoundUtils.playClickSound() - currentArmor = if (currentArmor == 3) 0 else 3 - } - - isMouseInRect(guiLeft + 202, guiTop + 5) -> { - SoundUtils.playClickSound() - currentArmor = if (currentArmor == 4) 0 else 4 - } - - isMouseInRect(guiLeft + 262, guiTop + 5) -> { - SoundUtils.playClickSound() - currentEquipment = if (currentEquipment == 1) 0 else 1 - } - - isMouseInRect(guiLeft + 282, guiTop + 5) -> { - SoundUtils.playClickSound() - currentEquipment = if (currentEquipment == 2) 0 else 2 - } - - isMouseInRect(guiLeft + 302, guiTop + 5) -> { - SoundUtils.playClickSound() - currentEquipment = if (currentEquipment == 3) 0 else 3 - } - - isMouseInRect(guiLeft + 322, guiTop + 5) -> { - SoundUtils.playClickSound() - currentEquipment = if (currentEquipment == 4) 0 else 4 - } - } - } else { - when { - isMouseInRect(guiLeft + 142, guiTop + 160) && currentPet != FarmingItems.ELEPHANT -> { - SoundUtils.playClickSound() - currentPet = FarmingItems.ELEPHANT - FFStats.getTotalFF() - } - - isMouseInRect(guiLeft + 162, guiTop + 160) && currentPet != FarmingItems.MOOSHROOM_COW -> { - SoundUtils.playClickSound() - currentPet = FarmingItems.MOOSHROOM_COW - FFStats.getTotalFF() - } - - isMouseInRect(guiLeft + 182, guiTop + 160) && currentPet != FarmingItems.RABBIT -> { - SoundUtils.playClickSound() - currentPet = FarmingItems.RABBIT - FFStats.getTotalFF() - } - - isMouseInRect(guiLeft + 202, guiTop + 160) && currentPet != FarmingItems.BEE -> { - SoundUtils.playClickSound() - currentPet = FarmingItems.BEE - FFStats.getTotalFF() - } - } - } + private fun GuideTab.pageSwitchHorizontal() { + if (isSelected()) { + verticalTabs.first { it != lastVerticalTabWrapper.tab }.fakeClick() // Double Click Logic } else { - if (isMouseIn(guiLeft, guiTop, sizeX, sizeY)) { - lastClickedHeight = mouseY - } - } - } - - private fun isMouseInRect(left: Int, top: Int) = isMouseIn(left, top, 16, 16) - - private fun isMouseIn(x: Int, y: Int, width: Int, height: Int) = - GuiRenderUtils.isPointInRect(mouseX, mouseY, x, y, width, height) - - private fun renderTabs() { - var x = guiLeft + 15 - var y = guiTop - 28 - val selectedColor = 0x50000000 - val notSelectedColor = 0x50303030 - drawRect(x, y, x + 25, y + 28, if (currentCrop == null) selectedColor else notSelectedColor) - GuiRenderUtils.renderItemStack(ItemStack(Blocks.grass), x + 5, y + 5) - if (isMouseIn(x, y, 25, 28)) { - tooltipToDisplay.add("§eOverview") - } - - for (crop in CropType.entries) { - x += 30 - drawRect(x, y, x + 25, y + 28, if (currentCrop == crop) selectedColor else notSelectedColor) - GuiRenderUtils.renderItemStack(crop.icon, x + 5, y + 5) - if (isMouseIn(x, y, 25, 28)) { - tooltipToDisplay.add("§e${crop.cropName}") - } - } - - x = guiLeft - 28 - y = guiTop + 15 - - drawRect( - x, y, - x + 28, y + 25, - if (selectedPage != FortuneGuidePage.UPGRADES) selectedColor else notSelectedColor - ) - GuiRenderUtils.renderItemStack(ItemStack(Items.gold_ingot), x + 5, y + 5) - if (isMouseIn(x, y, 28, 25)) { - tooltipToDisplay.add("§eBreakdown") - } - y += 30 - drawRect( - x, y, - x + 28, y + 25, - if (selectedPage == FortuneGuidePage.UPGRADES) selectedColor else notSelectedColor - ) - GuiRenderUtils.renderItemStack(ItemStack(Items.map), x + 5, y + 5) - if (isMouseIn(x, y, 28, 25)) { - tooltipToDisplay.add("§eUpgrades") + lastVerticalTabWrapper.tab?.fakeClick() // First Click Logic } } enum class FortuneGuidePage { OVERVIEW, CROP, - UPGRADES - } - - abstract class FFGuidePage { + UPGRADES, - abstract fun drawPage(mouseX: Int, mouseY: Int, partialTicks: Float) } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFInfos.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFInfos.kt new file mode 100644 index 000000000..19597e6db --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFInfos.kt @@ -0,0 +1,153 @@ +package at.hannibal2.skyhanni.features.garden.fortuneguide + +import at.hannibal2.skyhanni.utils.GuiRenderUtils + +internal enum class FFInfos( + val sumTo: FFInfos?, + private val currentF: () -> Number, + private val maxF: (FFInfos) -> Number, +) { + UNIVERSAL(null, { FFStats.totalBaseFF }, FFTypes.TOTAL, { + val backupArmor = FarmingItems.currentArmor + val backupEquip = FarmingItems.currentEquip + FarmingItems.currentArmor = null + FarmingItems.currentEquip = null + val total = maxSumToThis(it) + 100 + FarmingItems.currentArmor = backupArmor + FarmingItems.currentEquip = backupEquip + total + }), + ANITA_BUFF(UNIVERSAL, { FFStats.baseFF }, FFTypes.ANITA, 60), + FARMING_LEVEL(UNIVERSAL, { FFStats.baseFF }, FFTypes.FARMING_LVL, 240), + COMMUNITY_SHOP(UNIVERSAL, { FFStats.baseFF }, FFTypes.COMMUNITY_SHOP, 40), + GARDEN_PLOTS(UNIVERSAL, { FFStats.baseFF }, FFTypes.PLOTS, 72), + CAKE_BUFF(UNIVERSAL, { FFStats.baseFF }, FFTypes.CAKE, 5), + TOTAL_ARMOR(UNIVERSAL, { FarmingItems.currentArmor?.getFFData() ?: FFStats.armorTotalFF }, FFTypes.TOTAL), + BASE_ARMOR(TOTAL_ARMOR, { FarmingItems.currentArmor?.getFFData() ?: FFStats.armorTotalFF }, FFTypes.BASE, { + when (FarmingItems.currentArmor) { + FarmingItems.HELMET -> 30 + FarmingItems.CHESTPLATE, FarmingItems.LEGGINGS -> 35 + FarmingItems.BOOTS -> if (FFStats.usingSpeedBoots) 60 else 30 + else -> if (FFStats.usingSpeedBoots) 160 else 130 + } + }), + ABILITY_ARMOR(TOTAL_ARMOR, { FarmingItems.currentArmor?.getFFData() ?: FFStats.armorTotalFF }, FFTypes.ABILITY, { + when (FarmingItems.currentArmor) { + FarmingItems.HELMET, FarmingItems.CHESTPLATE, FarmingItems.LEGGINGS -> if (FFStats.usingSpeedBoots) 16.667 else 18.75 + FarmingItems.BOOTS -> if (FFStats.usingSpeedBoots) 0 else 18.75 + else -> if (FFStats.usingSpeedBoots) 50 else 75 + } + }), + REFORGE_ARMOR(TOTAL_ARMOR, { FarmingItems.currentArmor?.getFFData() ?: FFStats.armorTotalFF }, FFTypes.REFORGE, { + when (FarmingItems.currentArmor) { + FarmingItems.HELMET, FarmingItems.CHESTPLATE, FarmingItems.LEGGINGS -> 30 + FarmingItems.BOOTS -> if (FFStats.usingSpeedBoots) 25 else 30 + else -> if (FFStats.usingSpeedBoots) 115 else 120 + } + }), + ENCHANT_ARMOR( + sumTo = TOTAL_ARMOR, + from = { FarmingItems.currentArmor?.getFFData() ?: FFStats.armorTotalFF }, + what = FFTypes.PESTERMINATOR, + x4 = { FarmingItems.currentArmor == null }, + max = 5 + ), + GEMSTONE_ARMOR(TOTAL_ARMOR, { FarmingItems.currentArmor?.getFFData() ?: FFStats.armorTotalFF }, FFTypes.GEMSTONE, { + when (FarmingItems.currentArmor) { + FarmingItems.HELMET, FarmingItems.CHESTPLATE, FarmingItems.LEGGINGS -> 20 + FarmingItems.BOOTS -> if (FFStats.usingSpeedBoots) 16 else 20 + else -> if (FFStats.usingSpeedBoots) 76 else 80 + } + }), + TOTAL_PET(UNIVERSAL, { FarmingItems.currentPet.getFFData() }, FFTypes.TOTAL), + PET_BASE(TOTAL_PET, { FarmingItems.currentPet.getFFData() }, FFTypes.BASE, { + when (FarmingItems.currentPet) { + FarmingItems.ELEPHANT -> 150 + FarmingItems.MOOSHROOM_COW -> 157 + FarmingItems.BEE -> 30 + else -> 0 + } + }), + PET_ITEM(TOTAL_PET, { FarmingItems.currentPet.getFFData() }, FFTypes.PET_ITEM, 60), + TOTAL_EQUIP( + sumTo = UNIVERSAL, + from = { FarmingItems.currentEquip?.getFFData() ?: FFStats.equipmentTotalFF }, + what = FFTypes.TOTAL + ), + BASE_EQUIP( + sumTo = TOTAL_EQUIP, + from = { FarmingItems.currentEquip?.getFFData() ?: FFStats.equipmentTotalFF }, + what = FFTypes.BASE, + x4 = { FarmingItems.currentEquip == null }, + max = 5.0 + ), + ABILITY_EQUIP( + sumTo = TOTAL_EQUIP, + from = { FarmingItems.currentEquip?.getFFData() ?: FFStats.equipmentTotalFF }, + what = FFTypes.ABILITY, + x4 = { FarmingItems.currentEquip == null }, + max = 15.0 + ), + REFORGE_EQUIP( + sumTo = TOTAL_EQUIP, + from = { FarmingItems.currentEquip?.getFFData() ?: FFStats.equipmentTotalFF }, + what = FFTypes.REFORGE, + x4 = { FarmingItems.currentEquip == null }, + max = 15.0 + ), + ENCHANT_EQUIP( + sumTo = TOTAL_EQUIP, + from = { FarmingItems.currentEquip?.getFFData() ?: FFStats.equipmentTotalFF }, + what = FFTypes.GREEN_THUMB, + x4 = { FarmingItems.currentEquip == null }, + max = { at.hannibal2.skyhanni.features.garden.GardenAPI.totalAmountVisitorsExisting.toDouble() / 4.0 } + ), + ; + + val current get() = currentF().toDouble() + val max get() = maxF(this).toDouble() + + fun bar(label: String, tooltip: String) = GuiRenderUtils.getFarmingBar(label, tooltip, current, max, 90) + + constructor(sumTo: FFInfos?, current: () -> Number, max: Number) : this(sumTo, current, { max }) + constructor(sumTo: FFInfos?, from: () -> Map, what: FFTypes, max: Number) : this(sumTo, { + from()[what] ?: 0.0 + }, { max } + ) + + constructor( + sumTo: FFInfos?, + from: () -> Map, + what: FFTypes, + x4: () -> Boolean, + max: Number, + ) : this(sumTo, { from()[what] ?: 0.0 }, { if (x4()) max.toDouble() * 4 else max } + ) + + constructor( + sumTo: FFInfos?, + from: () -> Map, + what: FFTypes, + x4: () -> Boolean, + max: () -> Number, + ) : this(sumTo, { from()[what] ?: 0.0 }, { if (x4()) max().toDouble() * 4 else max() } + ) + + constructor( + sumTo: FFInfos?, + from: () -> Map, + what: FFTypes, + max: (FFInfos) -> Number, + ) : this( + sumTo, { from()[what] ?: 0.0 }, max + ) + + constructor( + sumTo: FFInfos?, + from: () -> Map, + what: FFTypes, + ) : this(sumTo, { from()[what] ?: 0.0 }, ::maxSumToThis) + +} + +private fun maxSumToThis(self: FFInfos): Double = FFInfos.entries.filter { it.sumTo == self }.sumOf { it.max } diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFStats.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFStats.kt index 2f1ce1860..772177c82 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFStats.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFStats.kt @@ -6,8 +6,8 @@ import at.hannibal2.skyhanni.data.ProfileStorageData import at.hannibal2.skyhanni.features.garden.CropType import at.hannibal2.skyhanni.features.garden.FarmingFortuneDisplay import at.hannibal2.skyhanni.features.garden.GardenAPI -import at.hannibal2.skyhanni.features.garden.fortuneguide.FFGuideGUI.Companion.getItem import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName +import at.hannibal2.skyhanni.utils.SimpleTimeMark import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getFarmingForDummiesCount import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getPetItem import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getPetLevel @@ -16,225 +16,166 @@ import kotlin.math.floor object FFStats { - private val mathCrops = + private val mathCrops by lazy { listOf(CropType.WHEAT, CropType.CARROT, CropType.POTATO, CropType.SUGAR_CANE, CropType.NETHER_WART) - private val dicerCrops = listOf(CropType.PUMPKIN, CropType.MELON) + } + private val dicerCrops by lazy { listOf(CropType.PUMPKIN, CropType.MELON) } private val farmingBoots = arrayListOf("RANCHERS_BOOTS", "FARMER_BOOTS") - var cakeExpireTime = 0L + var cakeExpireTime = SimpleTimeMark.farPast() - val necklaceFF = mutableMapOf() - val cloakFF = mutableMapOf() - val beltFF = mutableMapOf() - val braceletFF = mutableMapOf() - var equipmentTotalFF = mutableMapOf() + var equipmentTotalFF = mapOf() - val helmetFF = mutableMapOf() - val chestplateFF = mutableMapOf() - val leggingsFF = mutableMapOf() - val bootsFF = mutableMapOf() - var armorTotalFF = mutableMapOf() + var armorTotalFF = mapOf() var usingSpeedBoots = false - val elephantFF = mutableMapOf() - val mooshroomFF = mutableMapOf() - val rabbitFF = mutableMapOf() - val beeFF = mutableMapOf() var currentPetItem = "" - var baseFF = mutableMapOf() - - var totalBaseFF = mutableMapOf() + var baseFF = mapOf() - val cropPage = mutableMapOf>() + var totalBaseFF = mapOf() fun loadFFData() { - cakeExpireTime = GardenAPI.storage?.fortune?.cakeExpiring ?: -1L - - getEquipmentFFData(FarmingItems.NECKLACE.getItem(), necklaceFF) - getEquipmentFFData(FarmingItems.CLOAK.getItem(), cloakFF) - getEquipmentFFData(FarmingItems.BELT.getItem(), beltFF) - getEquipmentFFData(FarmingItems.BRACELET.getItem(), braceletFF) + cakeExpireTime = SimpleTimeMark(GardenAPI.storage?.fortune?.cakeExpiring ?: -1L) - equipmentTotalFF = - (necklaceFF.toList() + cloakFF.toList() + beltFF.toList() + braceletFF.toList()).groupBy({ it.first }, - { it.second }).map { (key, values) -> key to values.sum() } - .toMap() as MutableMap + FarmingItems.resetFFData() - getArmorFFData(FarmingItems.HELMET.getItem(), helmetFF) - getArmorFFData(FarmingItems.CHESTPLATE.getItem(), chestplateFF) - getArmorFFData(FarmingItems.LEGGINGS.getItem(), leggingsFF) - getArmorFFData(FarmingItems.BOOTS.getItem(), bootsFF) + equipmentTotalFF = FarmingItems.equip.getFFData() - armorTotalFF = - (helmetFF.toList() + chestplateFF.toList() + leggingsFF.toList() + bootsFF.toList()).groupBy({ it.first }, - { it.second }).map { (key, values) -> key to values.sum() } - .toMap() as MutableMap + armorTotalFF = FarmingItems.armor.getFFData() - usingSpeedBoots = FarmingItems.BOOTS.getItem().getInternalName().asString() in farmingBoots + usingSpeedBoots = FarmingItems.BOOTS.getItem()?.getInternalName()?.asString() in farmingBoots - getPetFFData(FarmingItems.ELEPHANT.getItem(), elephantFF) - getPetFFData(FarmingItems.MOOSHROOM_COW.getItem(), mooshroomFF) - getPetFFData(FarmingItems.RABBIT.getItem(), rabbitFF) - getPetFFData(FarmingItems.BEE.getItem(), beeFF) - - getGenericFF(baseFF) + baseFF = getGenericFF() getTotalFF() } - fun getCropStats(crop: CropType, tool: ItemStack) { - cropPage.clear()