From 85f6fa03d235e2b3ca09b9ae2b3b34dd4bf4fcfb Mon Sep 17 00:00:00 2001 From: CalMWolfs <94038482+CalMWolfs@users.noreply.github.com> Date: Mon, 29 May 2023 22:20:27 +1000 Subject: Fortune guide - Mostly done (#160) Co-authored-by: hannibal2 <24389977+hannibal00212@users.noreply.github.com> --- src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt | 2 + .../at/hannibal2/skyhanni/config/ConfigManager.kt | 11 + .../java/at/hannibal2/skyhanni/config/Storage.java | 33 ++- .../hannibal2/skyhanni/config/commands/Commands.kt | 14 + .../config/core/config/gui/GuiPositionEditor.kt | 44 +-- .../hannibal2/skyhanni/config/features/Garden.java | 12 +- .../at/hannibal2/skyhanni/data/RenderGuiData.kt | 5 +- .../features/garden/FarmingFortuneDisplay.kt | 48 +++- .../skyhanni/features/garden/GardenAPI.kt | 71 +++++ .../skyhanni/features/garden/GardenLevelDisplay.kt | 87 +----- .../skyhanni/features/garden/ToolTooltipTweaks.kt | 34 ++- .../garden/fortuneguide/CaptureFarmingGear.kt | 198 ++++++++++++++ .../features/garden/fortuneguide/FFGuideGUI.kt | 299 +++++++++++++++++++++ .../features/garden/fortuneguide/FFStats.kt | 204 ++++++++++++++ .../features/garden/fortuneguide/FFTypes.kt | 7 + .../features/garden/fortuneguide/FarmingItems.kt | 6 + .../features/garden/fortuneguide/TODO list | 26 ++ .../garden/fortuneguide/pages/CactusPage.kt | 61 +++++ .../features/garden/fortuneguide/pages/CanePage.kt | 74 +++++ .../garden/fortuneguide/pages/CarrotPage.kt | 76 ++++++ .../garden/fortuneguide/pages/CocoaPage.kt | 64 +++++ .../garden/fortuneguide/pages/MelonPage.kt | 66 +++++ .../garden/fortuneguide/pages/MushroomPage.kt | 72 +++++ .../garden/fortuneguide/pages/OverviewPage.kt | 208 ++++++++++++++ .../garden/fortuneguide/pages/PotatoPage.kt | 74 +++++ .../garden/fortuneguide/pages/PumpkinPage.kt | 66 +++++ .../features/garden/fortuneguide/pages/WartPage.kt | 74 +++++ .../garden/fortuneguide/pages/WheatPage.kt | 74 +++++ .../garden/visitor/GardenVisitorDropStatistics.kt | 56 ++-- .../garden/visitor/GardenVisitorFeatures.kt | 1 + .../features/garden/visitor/GardenVisitorTimer.kt | 1 + .../at/hannibal2/skyhanni/utils/GuiRenderUtils.kt | 208 ++++++++++++++ .../java/at/hannibal2/skyhanni/utils/NEUItems.kt | 22 ++ .../at/hannibal2/skyhanni/utils/RenderUtils.kt | 14 +- .../skyhanni/utils/SkyBlockItemModifierUtils.kt | 16 +- .../java/at/hannibal2/skyhanni/utils/SoundUtils.kt | 5 + .../at/hannibal2/skyhanni/utils/StringUtils.kt | 21 ++ 37 files changed, 2180 insertions(+), 174 deletions(-) create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/CaptureFarmingGear.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFGuideGUI.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFStats.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFTypes.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FarmingItems.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/TODO list create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/CactusPage.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/CanePage.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/CarrotPage.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/CocoaPage.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/MelonPage.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/MushroomPage.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/OverviewPage.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/PotatoPage.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/PumpkinPage.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/WartPage.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/pages/WheatPage.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/utils/GuiRenderUtils.kt diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt index 95bbdfbe3..ef8ba9814 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt @@ -28,6 +28,7 @@ import at.hannibal2.skyhanni.features.garden.composter.ComposterOverlay import at.hannibal2.skyhanni.features.garden.composter.GardenComposterInventoryFeatures import at.hannibal2.skyhanni.features.garden.contest.* import at.hannibal2.skyhanni.features.garden.farming.* +import at.hannibal2.skyhanni.features.garden.fortuneguide.CaptureFarmingGear import at.hannibal2.skyhanni.features.garden.inventory.* import at.hannibal2.skyhanni.features.garden.visitor.GardenVisitorColorNames import at.hannibal2.skyhanni.features.garden.visitor.GardenVisitorDropStatistics @@ -275,6 +276,7 @@ class SkyHanniMod { loadModule(TrevorSolver) loadModule(BingoCardTips()) loadModule(GardenVisitorDropStatistics) + loadModule(CaptureFarmingGear()) loadModule(SackDisplay()) loadModule(GardenStartLocation) loadModule(PetCandyUsedDisplay()) diff --git a/src/main/java/at/hannibal2/skyhanni/config/ConfigManager.kt b/src/main/java/at/hannibal2/skyhanni/config/ConfigManager.kt index dbd197436..44044fa48 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/ConfigManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/ConfigManager.kt @@ -5,6 +5,7 @@ import at.hannibal2.skyhanni.features.garden.CropType import at.hannibal2.skyhanni.features.misc.update.UpdateManager import at.hannibal2.skyhanni.utils.LorenzLogger import at.hannibal2.skyhanni.utils.LorenzVec +import at.hannibal2.skyhanni.utils.NEUItems import com.google.gson.GsonBuilder import com.google.gson.TypeAdapter import com.google.gson.stream.JsonReader @@ -13,6 +14,7 @@ import io.github.moulberry.moulconfig.observer.PropertyTypeAdapterFactory import io.github.moulberry.moulconfig.processor.BuiltinMoulConfigGuis import io.github.moulberry.moulconfig.processor.ConfigProcessorDriver import io.github.moulberry.moulconfig.processor.MoulConfigProcessor +import net.minecraft.item.ItemStack import java.io.* import java.nio.charset.StandardCharsets import java.util.* @@ -43,6 +45,15 @@ class ConfigManager { return LorenzVec(x, y, z) } }.nullSafe()) + .registerTypeAdapter(ItemStack::class.java, object : TypeAdapter() { + override fun write(out: JsonWriter, value: ItemStack) { + out.value(NEUItems.saveNBTData(value)) + } + + override fun read(reader: JsonReader): ItemStack { + return NEUItems.loadNBTData(reader.nextString()) + } + }.nullSafe()) .enableComplexMapKeySerialization() .create() } diff --git a/src/main/java/at/hannibal2/skyhanni/config/Storage.java b/src/main/java/at/hannibal2/skyhanni/config/Storage.java index 9b51acddd..8f9aba6bf 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/Storage.java +++ b/src/main/java/at/hannibal2/skyhanni/config/Storage.java @@ -3,9 +3,11 @@ package at.hannibal2.skyhanni.config; import at.hannibal2.skyhanni.data.model.ComposterUpgrade; import at.hannibal2.skyhanni.features.garden.CropAccessory; import at.hannibal2.skyhanni.features.garden.CropType; +import at.hannibal2.skyhanni.features.garden.fortuneguide.FarmingItems; import at.hannibal2.skyhanni.features.garden.visitor.VisitorReward; import at.hannibal2.skyhanni.utils.LorenzVec; import com.google.gson.annotations.Expose; +import net.minecraft.item.ItemStack; import java.util.*; @@ -25,7 +27,8 @@ public class Storage { @Expose public Map profiles = new HashMap<>(); // profile name - // TODO save community shop account upgrades here + @Expose + public Integer gardenCommunityUpgrade = -1; } public static class ProfileSpecific { @@ -139,6 +142,9 @@ public class Storage { @Expose public long farmingExp = 0; + @Expose + public int gardenExp = 0; + @Expose public long coinsSpent = 0; @@ -148,7 +154,30 @@ public class Storage { @Expose public Map cropStartLocations = new HashMap<>(); - } + @Expose + public Fortune fortune = new Fortune(); + + public static class Fortune { + + @Expose + public int anitaUpgrade = -1; + + @Expose + public int farmingStrength = -1; + + @Expose + public int farmingLevel = -1; + + @Expose + public int plotsUnlocked = -1; + + @Expose + public long cakeExpiring = -1L; + + @Expose + public Map farmingItems = new HashMap<>(); + } + } } } 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 72abc47ca..657f675d7 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt @@ -14,6 +14,8 @@ import at.hannibal2.skyhanni.features.garden.GardenCropTimeCommand import at.hannibal2.skyhanni.features.garden.composter.ComposterOverlay import at.hannibal2.skyhanni.features.garden.farming.CropMoneyDisplay import at.hannibal2.skyhanni.features.garden.farming.CropSpeedMeter +import at.hannibal2.skyhanni.features.garden.fortuneguide.CaptureFarmingGear +import at.hannibal2.skyhanni.features.garden.fortuneguide.FFGuideGUI import at.hannibal2.skyhanni.features.garden.farming.GardenStartLocation import at.hannibal2.skyhanni.features.minion.MinionFeatures import at.hannibal2.skyhanni.features.misc.CollectionCounter @@ -24,6 +26,7 @@ import at.hannibal2.skyhanni.test.SkyHanniTestCommand import at.hannibal2.skyhanni.test.TestBingo import at.hannibal2.skyhanni.test.command.* import at.hannibal2.skyhanni.utils.APIUtil +import at.hannibal2.skyhanni.utils.LorenzUtils import net.minecraft.command.ICommandSender import net.minecraftforge.client.ClientCommandHandler @@ -46,6 +49,8 @@ object Commands { // main commands registerCommand("sh", openMainMenu) registerCommand("skyhanni", openMainMenu) + + registerCommand("ff") { openFortuneGuide() } // for users - regular commands registerCommand("shmarkplayer") { MarkedPlayerManager.command(it) } @@ -90,6 +95,15 @@ object Commands { registerCommand("shcopyerror") { CopyErrorCommand.command(it) } } + @JvmStatic + fun openFortuneGuide() { + if (!LorenzUtils.inSkyBlock) { + LorenzUtils.chat("§cJoin Skyblock to open the fortune guide!") + } else { + CaptureFarmingGear.captureFarmingGear() + SkyHanniMod.screenToOpen = FFGuideGUI() + } + } private fun registerCommand(name: String, function: (Array) -> Unit) { ClientCommandHandler.instance.registerCommand(SimpleCommand(name, createCommand(function))) diff --git a/src/main/java/at/hannibal2/skyhanni/config/core/config/gui/GuiPositionEditor.kt b/src/main/java/at/hannibal2/skyhanni/config/core/config/gui/GuiPositionEditor.kt index c80ad2ea5..0044ed6ea 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/core/config/gui/GuiPositionEditor.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/core/config/gui/GuiPositionEditor.kt @@ -22,8 +22,8 @@ import at.hannibal2.skyhanni.config.core.config.Position import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsX import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsY import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getDummySize +import at.hannibal2.skyhanni.utils.GuiRenderUtils import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.RenderUtils import net.minecraft.client.Minecraft import net.minecraft.client.gui.GuiScreen import net.minecraft.client.gui.ScaledResolution @@ -52,10 +52,7 @@ class GuiPositionEditor(private val positions: List, private val borde } private fun renderLabels(hoveredPos: Int) { - RenderUtils.drawStringCentered( - "§cSkyHanni Position Editor", - Minecraft.getMinecraft().fontRendererObj, (getScaledWidth() / 2).toFloat(), 8f, true, 0xffffff - ) + GuiRenderUtils.drawStringCentered("§cSkyHanni Position Editor", getScaledWidth() / 2, 8) var displayPos = -1 if (clickedPos != -1) { @@ -67,30 +64,17 @@ class GuiPositionEditor(private val positions: List, private val borde displayPos = hoveredPos } - // When the mouse is not currently hovering over an gui element + // When the mouse is not currently hovering over a gui element if (displayPos == -1) { - RenderUtils.drawStringCentered( - "§eTo edit hidden GUI elements set a key in /sh edit", - Minecraft.getMinecraft().fontRendererObj, (getScaledWidth() / 2).toFloat(), 20f, true, 0xffffff - ) - - RenderUtils.drawStringCentered( - "§ethen click that key while the GUI element is visible", - Minecraft.getMinecraft().fontRendererObj, (getScaledWidth() / 2).toFloat(), 32f, true, 0xffffff - ) + GuiRenderUtils.drawStringCentered("§eTo edit hidden GUI elements set a key in /sh edit", getScaledWidth() / 2, 20) + GuiRenderUtils.drawStringCentered("§ethen click that key while the GUI element is visible", getScaledWidth() / 2, 32) return } val pos = positions[displayPos] - RenderUtils.drawStringCentered( - "§b" + pos.internalName, - Minecraft.getMinecraft().fontRendererObj, (getScaledWidth() / 2).toFloat(), 18f, true, 0xffffff - ) val location = "§7x: §e${pos.rawX}§7, y: §e${pos.rawY}" - RenderUtils.drawStringCentered( - location, - Minecraft.getMinecraft().fontRendererObj, (getScaledWidth() / 2).toFloat(), 28f, true, 0xffffff - ) + GuiRenderUtils.drawStringCentered("§b" + pos.internalName, getScaledWidth() / 2, 18) + GuiRenderUtils.drawStringCentered(location, getScaledWidth() / 2, 28) } private fun renderRectangles(): Int { @@ -114,7 +98,7 @@ class GuiPositionEditor(private val positions: List, private val borde elementHeight = position.getDummySize().y drawRect(x - border, y - border, x + elementWidth + border * 2, y + elementHeight + border * 2, -0x7fbfbfc0) - if (inXY(mouseX, x, mouseY, y, elementWidth, elementHeight)) { + if (GuiRenderUtils.isPointInRect(mouseX, mouseY, x - border, y - border, elementWidth + border * 2, elementHeight + border * 2)) { hoveredPos = index } } @@ -140,7 +124,7 @@ class GuiPositionEditor(private val positions: List, private val borde val x = position.getAbsX() val y = position.getAbsY() if (!position.clicked) { - if (inXY(mouseX, x, mouseY, y, elementWidth, elementHeight)) { + if (GuiRenderUtils.isPointInRect(mouseX, mouseY, x - border, y - border, elementWidth + border * 2, elementHeight + border * 2)) { clickedPos = i position.clicked = true grabbedX = mouseX @@ -151,16 +135,6 @@ class GuiPositionEditor(private val positions: List, private val borde } } - private fun inXY( - mouseX: Int, - x: Int, - mouseY: Int, - y: Int, - elementWidth: Int, - elementHeight: Int, - ) = - mouseX >= x - border && mouseY >= y - border && mouseX <= x + elementWidth + border * 2 && mouseY <= y + elementHeight + border * 2 - @Throws(IOException::class) override fun keyTyped(typedChar: Char, keyCode: Int) { super.keyTyped(typedChar, keyCode) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/Garden.java b/src/main/java/at/hannibal2/skyhanni/config/features/Garden.java index d4c3a5859..b4ebe1ff0 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/Garden.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/Garden.java @@ -1,5 +1,6 @@ package at.hannibal2.skyhanni.config.features; +import at.hannibal2.skyhanni.config.commands.Commands; import at.hannibal2.skyhanni.config.core.config.Position; import com.google.gson.annotations.Expose; import io.github.moulberry.moulconfig.annotations.*; @@ -205,7 +206,7 @@ public class Garden { "§c254 Denied", " ", "§c62,072 Copper", - "§23.2m Farming EXP", + "§33.2m Farming EXP", "§647.2m Coins Spent", "§b23 §9Flowering Bouquet", "§b4 §9Overgrown Grass", @@ -214,6 +215,7 @@ public class Garden { "§b6 §9Music Rune", "§b1 §cSpace Helmet", " ", // If they want another empty row + "§212,735 Garden EXP", } ) public List textFormat = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12)); @@ -1013,14 +1015,14 @@ public class Garden { public Position composterDisplayPos = new Position(-363, 13, false, true); @Expose - @ConfigOption(name = "True Farming Fortune", desc = "") + @ConfigOption(name = "Farming Fortune Display", desc = "") @ConfigEditorAccordion(id = 22) public boolean farmingFortune = false; @Expose @ConfigOption( name = "FF Display", - desc = "Displays current farming fortune, including crop-specific bonuses." + desc = "Displays the true farming fortune for the current crop, including all crop-specific and hidden bonuses." ) @ConfigEditorBoolean @ConfigAccordionId(id = 22) @@ -1036,6 +1038,10 @@ public class Garden { @ConfigAccordionId(id = 22) public boolean farmingFortuneDropMultiplier = true; + @ConfigOption(name = "Farming Fortune Guide", desc = "Opens a guide that breaks down your farming fortune.\n§eCommand: /ff") + @ConfigEditorButton(buttonText = "§2Open") + public Runnable positions = Commands::openFortuneGuide; + @Expose public Position farmingFortunePos = new Position(-375, -200, false, true); diff --git a/src/main/java/at/hannibal2/skyhanni/data/RenderGuiData.kt b/src/main/java/at/hannibal2/skyhanni/data/RenderGuiData.kt index 3f0562f0d..53815366e 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/RenderGuiData.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/RenderGuiData.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.data import at.hannibal2.skyhanni.events.GuiRenderEvent +import at.hannibal2.skyhanni.features.garden.fortuneguide.FFGuideGUI import net.minecraft.client.Minecraft import net.minecraft.client.gui.inventory.GuiChest import net.minecraft.client.gui.inventory.GuiInventory @@ -15,7 +16,7 @@ class RenderGuiData { fun onRenderOverlay(event: RenderGameOverlayEvent.Pre) { // if (!ProfileStorage.loaded) return if (event.type != RenderGameOverlayEvent.ElementType.HOTBAR) return - if (GuiEditManager.isInGui()) return + if (GuiEditManager.isInGui() || FFGuideGUI.isInGui()) return GuiRenderEvent.GameOverlayRenderEvent().postAndCatch() } @@ -23,7 +24,7 @@ class RenderGuiData { @SubscribeEvent fun onBackgroundDraw(event: GuiScreenEvent.BackgroundDrawnEvent) { // if (!ProfileStorage.loaded) return - if (GuiEditManager.isInGui()) return + if (GuiEditManager.isInGui() || FFGuideGUI.isInGui()) return val currentScreen = Minecraft.getMinecraft().currentScreen ?: return if (currentScreen !is GuiInventory && currentScreen !is GuiChest) return 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 a4bff0222..f501dd910 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/FarmingFortuneDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/FarmingFortuneDisplay.kt @@ -148,6 +148,9 @@ class FarmingFortuneDisplay { } private val collectionPattern = "§7You have §6\\+([\\d]{1,3})☘ Farming Fortune".toRegex() + private val tooltipFortunePattern = + "^§7Farming Fortune: §a\\+([\\d.]+)(?: §2\\(\\+\\d\\))?(?: §9\\(\\+(\\d+)\\))?$".toRegex() + private val armorAbilityPattern = "§6Tiered Bonus: .* [(](?.*)/4[)]".toPattern() var displayedFortune = 0.0 var reforgeFortune = 0.0 @@ -156,6 +159,9 @@ class FarmingFortuneDisplay { fun getToolFortune(tool: ItemStack?): Double { val internalName = tool?.getInternalName() ?: return 0.0 + if (internalName == "THEORETICAL_HOE") { + return 0.0 + } return if (internalName.startsWith("THEORETICAL_HOE")) { listOf(10.0, 25.0, 50.0)[internalName.last().digitToInt() - 1] } else when (internalName) { @@ -200,27 +206,45 @@ class FarmingFortuneDisplay { fun getHarvestingFortune(tool: ItemStack?): Double { return (tool?.getEnchantments()?.get("harvesting") ?: 0) * 12.5 } fun getCultivatingFortune(tool: ItemStack?): Double { return (tool?.getEnchantments()?.get("cultivating") ?: 0).toDouble()} - fun getAbilityFortune(tool: ItemStack?): Double { // add armor ability stuff here + fun getAbilityFortune(tool: ItemStack?): Double { val lotusAbilityPattern = "§7Piece Bonus: §6+(?.*)☘".toPattern() - if (tool?.getInternalName()?.contains("LOTUS") == true) { - for (line in tool.getLore()) { + // todo confirm it works on Melon and Cropie armor + val armorAbilityFortune = "§7.*§7Grants §6(?.*)☘.*".toPattern() + var pieces = 0.0 + for (line in tool?.getLore()!!) { + if (tool.getInternalName().contains("LOTUS")) { lotusAbilityPattern.matchMatcher(line) { return group("bonus").toDouble() } } + armorAbilityPattern.matchMatcher(line) { + pieces = group("pieces").toDouble() + } + + armorAbilityFortune.matchMatcher(line) { + return group("bonus").toDouble() / pieces + } } return 0.0 } - fun loadFortuneLineData(tool: ItemStack?, enchantmentFortune: Double, match: MatchGroupCollection) { - displayedFortune = match[1]!!.value.toDouble() - reforgeFortune = match[2]!!.value.toDouble() - if (tool != null) { - itemBaseFortune = if (tool.getInternalName().contains("LOTUS")) 5.0 - else displayedFortune - reforgeFortune - enchantmentFortune - greenThumbFortune = if (tool.getInternalName().contains("LOTUS")) { - displayedFortune - reforgeFortune - itemBaseFortune - } else 0.0 + fun loadFortuneLineData(tool: ItemStack?, enchantmentFortune: Double) { + displayedFortune = 0.0 + reforgeFortune = 0.0 + itemBaseFortune = 0.0 + greenThumbFortune = 0.0 + for (line in tool?.getLore()!!) { + val match = tooltipFortunePattern.matchEntire(line)?.groups + if (match != null) { + displayedFortune = match[1]!!.value.toDouble() + reforgeFortune = match[2]?.value?.toDouble() ?: 0.0 + + itemBaseFortune = if (tool.getInternalName().contains("LOTUS")) 5.0 + else displayedFortune - reforgeFortune - enchantmentFortune + greenThumbFortune = if (tool.getInternalName().contains("LOTUS")) { + displayedFortune - reforgeFortune - itemBaseFortune + } else 0.0 + } } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenAPI.kt index 34a8e96a3..dbf3486b3 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenAPI.kt @@ -181,4 +181,75 @@ object GardenAPI { lastLocation = position CropClickEvent(cropBroken, blockState, event.clickType, event.itemInHand).postAndCatch() } + + fun getExpForLevel(requestedLevel: Int): Long { + var totalExp = 0L + var tier = 0 + for (tierExp in gardenExperience) { + totalExp += tierExp + tier++ + if (tier == requestedLevel) { + return totalExp + } + } + return 0 + } + + fun getLevelForExp(gardenExp: Long): Int { + var tier = 0 + var totalExp = 0L + for (tierExp in gardenExperience) { + totalExp += tierExp + if (totalExp > gardenExp) { + return tier + } + tier++ + } + return tier + } + + private val gardenExperience = listOf( + 0, + 70, + 100, + 140, + 240, + 600, + 1500, + 2000, + 2500, + 3000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, // level 15 + + // overflow levels till 40 for now, in 10k steps + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + 10_000, + ) } \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenLevelDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenLevelDisplay.kt index be00854f4..8948c88e7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenLevelDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenLevelDisplay.kt @@ -43,9 +43,9 @@ class GardenLevelDisplay { } private fun addExp(moreExp: Int) { - val oldLevel = getLevelForExp(gardenExp.toLong()) + val oldLevel = GardenAPI.getLevelForExp(gardenExp.toLong()) gardenExp += moreExp - val newLevel = getLevelForExp(gardenExp.toLong()) + val newLevel = GardenAPI.getLevelForExp(gardenExp.toLong()) if (newLevel == oldLevel + 1) { if (newLevel > 15) { LorenzUtils.chat( @@ -77,7 +77,7 @@ class GardenLevelDisplay { return } } - val expForLevel = getExpForLevel(currentLevel).toInt() + val expForLevel = GardenAPI.getExpForLevel(currentLevel).toInt() gardenExp = expForLevel + nextLevelExp update() } @@ -89,10 +89,10 @@ class GardenLevelDisplay { private fun drawDisplay(): String { if (gardenExp == -1) return "§aGarden Level ? §cOpen the desk!" - val currentLevel = getLevelForExp(gardenExp.toLong()) - val needForLevel = getExpForLevel(currentLevel).toInt() + val currentLevel = GardenAPI.getLevelForExp(gardenExp.toLong()) + val needForLevel = GardenAPI.getExpForLevel(currentLevel).toInt() val nextLevel = currentLevel + 1 - val needForNextLevel = getExpForLevel(nextLevel).toInt() + val needForNextLevel = GardenAPI.getExpForLevel(nextLevel).toInt() return "§aGarden Level $currentLevel" + if (needForNextLevel != 0) { val overflow = gardenExp - needForLevel @@ -104,35 +104,6 @@ class GardenLevelDisplay { } else "" } - private fun getLevelForExp(gardenExp: Long): Int { - var tier = 0 - var totalCrops = 0L - for (tierCrops in gardenExperience) { - totalCrops += tierCrops - if (totalCrops > gardenExp) { - return tier - } - tier++ - } - - return tier - } - - // TODO make table utils method - private fun getExpForLevel(requestedLevel: Int): Long { - var totalCrops = 0L - var tier = 0 - for (tierCrops in gardenExperience) { - totalCrops += tierCrops - tier++ - if (tier == requestedLevel) { - return totalCrops - } - } - - return 0 - } - @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent.GameOverlayRenderEvent) { if (!isEnabled()) return @@ -141,50 +112,4 @@ class GardenLevelDisplay { } private fun isEnabled() = GardenAPI.inGarden() && config.gardenLevelDisplay - - // TODO use repo - private val gardenExperience = listOf( - 0, - 70, - 100, - 140, - 240, - 600, - 1500, - 2000, - 2500, - 3000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, // level 15 - - // overflow levels till 40 for now, in 10k steps - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - 10_000, - ) } \ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/ToolTooltipTweaks.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/ToolTooltipTweaks.kt index 668848ce8..4e578e6f7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/ToolTooltipTweaks.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/ToolTooltipTweaks.kt @@ -4,11 +4,13 @@ import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.events.LorenzToolTipEvent import at.hannibal2.skyhanni.features.garden.FarmingFortuneDisplay.Companion.getAbilityFortune import at.hannibal2.skyhanni.features.garden.GardenAPI.getCropType +import at.hannibal2.skyhanni.features.garden.fortuneguide.FFGuideGUI import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getFarmingForDummiesCount import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getReforgeName import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase +import at.hannibal2.skyhanni.utils.StringUtils.removeColor import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import org.lwjgl.input.Keyboard import java.text.DecimalFormat @@ -17,9 +19,12 @@ import kotlin.math.roundToInt class ToolTooltipTweaks { private val config get() = SkyHanniMod.feature.garden private val tooltipFortunePattern = - "^§5§o§7Farming Fortune: §a\\+([\\d.]+)(?: §2\\(\\+\\d\\))?(?: §9\\(\\+(\\d+)\\))\$".toRegex() + "^§5§o§7Farming Fortune: §a\\+([\\d.]+)(?: §2\\(\\+\\d\\))?(?: §9\\(\\+(\\d+)\\))?$".toRegex() private val counterStartLine = setOf("§5§o§6Logarithmic Counter", "§5§o§6Collection Analysis") private val reforgeEndLine = setOf("§5§o", "§5§o§7chance for multiple crops.") + private val abilityDescriptionStart = "§5§o§7These boots gain §a+2❈ Defense" + private val abilityDescriptionEnd = "§5§o§7Skill level." + private val statFormatter = DecimalFormat("0.##") @SubscribeEvent @@ -49,13 +54,14 @@ class ToolTooltipTweaks { var removingFarmhandDescription = false var removingCounterDescription = false var removingReforgeDescription = false + var removingAbilityDescription = false for (line in iterator) { val match = tooltipFortunePattern.matchEntire(line)?.groups if (match != null) { val enchantmentFortune = sunderFortune + harvestingFortune + cultivatingFortune - FarmingFortuneDisplay.loadFortuneLineData(itemStack, enchantmentFortune, match) + FarmingFortuneDisplay.loadFortuneLineData(itemStack, enchantmentFortune) val displayedFortune = FarmingFortuneDisplay.displayedFortune val reforgeFortune = FarmingFortuneDisplay.reforgeFortune @@ -77,10 +83,10 @@ class ToolTooltipTweaks { iterator.set(fortuneLine) if (Keyboard.isKeyDown(config.fortuneTooltipKeybind)) { - iterator.addStat(" §7Base: §a+", baseFortune) + iterator.addStat(" §7Base: §6+", baseFortune) iterator.addStat(" §7Tool: §6+", toolFortune) - iterator.addStat(" $reforgeName: §9+", reforgeFortune) - iterator.addStat(" §7Ability: §a+", abilityFortune) + iterator.addStat(" §7${reforgeName?.removeColor()}: §9+", reforgeFortune) + iterator.addStat(" §7Ability: §2+", abilityFortune) iterator.addStat(" §7Green Thumb: §a+", greenThumbFortune) iterator.addStat(" §7Sunder: §a+", sunderFortune) iterator.addStat(" §7Harvesting: §a+", harvestingFortune) @@ -93,7 +99,7 @@ class ToolTooltipTweaks { } } // Beware, dubious control flow beyond these lines - if (config.compactToolTooltips) { + if (config.compactToolTooltips || FFGuideGUI.isInGui()) { if (line.startsWith("§5§o§7§8Bonus ")) removingFarmhandDescription = true if (removingFarmhandDescription) { iterator.remove() @@ -113,6 +119,22 @@ class ToolTooltipTweaks { removingReforgeDescription = !reforgeEndLine.contains(line) } if (line == "§5§o§9Bountiful Bonus") removingReforgeDescription = true + + if (FFGuideGUI.isInGui()) { + if (line.contains("Click to ") || line.contains("§7§8This item can be reforged!") || line.contains("Dyed")) { + iterator.remove() + } + + if (line == abilityDescriptionStart) { + removingAbilityDescription = true + } + if (removingAbilityDescription) { + iterator.remove() + if (line == abilityDescriptionEnd) { + removingAbilityDescription = false + } + } + } } } 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 new file mode 100644 index 000000000..47d44e5c1 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/CaptureFarmingGear.kt @@ -0,0 +1,198 @@ +package at.hannibal2.skyhanni.features.garden.fortuneguide + +import at.hannibal2.skyhanni.data.ProfileStorageData +import at.hannibal2.skyhanni.events.GardenToolChangeEvent +import at.hannibal2.skyhanni.events.InventoryOpenEvent +import at.hannibal2.skyhanni.events.LorenzChatEvent +import at.hannibal2.skyhanni.features.garden.GardenAPI +import at.hannibal2.skyhanni.features.garden.GardenAPI.getCropType +import at.hannibal2.skyhanni.utils.InventoryUtils +import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName +import at.hannibal2.skyhanni.utils.ItemUtils.getLore +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.NumberUtil.romanToDecimal +import at.hannibal2.skyhanni.utils.NumberUtil.romanToDecimalIfNeeded +import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +import at.hannibal2.skyhanni.utils.StringUtils.removeColor +import at.hannibal2.skyhanni.utils.TabListData +import net.minecraft.client.Minecraft +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent + +class CaptureFarmingGear { + private val farmingItems get() = GardenAPI.config?.fortune?.farmingItems + + private val farmingLevelUpPattern = "SKILL LEVEL UP Farming .*➜(?.*)".toPattern() + private val fortuneUpgradePattern = "You claimed the Garden Farming Fortune (?.*) upgrade!".toPattern() + private val anitaBuffPattern = "You tiered up the Extra Farming Drops upgrade to [+](?.*)%!".toPattern() + private val anitaMenuPattern = "You have: [+](?.*)%".toPattern() + + + companion object { + private val strengthPattern = " Strength: §r§c❁(?.*)".toPattern() + private val farmingSets = arrayListOf("FERMENTO", "SQUASH", "CROPIE", "MELON", "FARM", + "RANCHERS", "FARMER", "RABBIT") + private val farmingItems get() = GardenAPI.config?.fortune?.farmingItems + + fun captureFarmingGear() { + val farmingItems = farmingItems ?: return + val resultList = mutableListOf() + + val itemStack = Minecraft.getMinecraft().thePlayer.inventory.getCurrentItem() ?: return + val itemID = itemStack.getInternalName() + resultList.add(itemStack.displayName.toString()) + resultList.add(itemID) + + val currentCrop = itemStack.getCropType() + + if (currentCrop == null) { + //todo generic tool as fallback item + //todo Daedalus axe + } else { + for (item in FarmingItems.values()) { + if (item.name == currentCrop.name) { + farmingItems[item] = itemStack + } + } + } + for (armor in InventoryUtils.getArmor()) { + if (armor == null) continue + val split = armor.getInternalName().split("_") + if (split.first() in farmingSets) { + for (item in FarmingItems.values()) { + if (item.name == split.last()) { + farmingItems[item] = armor + } + } + } + } + for (line in TabListData.getTabList()) { + strengthPattern.matchMatcher(line) { + GardenAPI.config?.fortune?.farmingStrength = group("strength").toInt() + } + } + } + } + + @SubscribeEvent + fun onGardenToolChange(event: GardenToolChangeEvent) { + captureFarmingGear() + } + + @SubscribeEvent + fun onInventoryOpen(event: InventoryOpenEvent) { + if (!LorenzUtils.inSkyBlock) return + val hidden = GardenAPI.config?.fortune ?: return + val farmingItems = farmingItems ?: return + if (event.inventoryName == "Your Equipment and Stats") { + for ((_, slot) in event.inventoryItems) { + val split = slot.getInternalName().split("_") + if (split.first() == "LOTUS") { + for (item in FarmingItems.values()) { + if (item.name == split.last()) { + farmingItems[item] = slot + } + } + } + } + } + if (event.inventoryName.contains("Pets")) { + // If they have 2 of same pet, one will be overwritten + farmingItems[FarmingItems.ELEPHANT] = FFGuideGUI.getFallbackItem(FarmingItems.ELEPHANT) + farmingItems[FarmingItems.MOOSHROOM_COW] = FFGuideGUI.getFallbackItem(FarmingItems.MOOSHROOM_COW) + farmingItems[FarmingItems.RABBIT] = FFGuideGUI.getFallbackItem(FarmingItems.RABBIT) + var highestElephantLvl = -1 + var highestMooshroomLvl = -1 + var highestRabbitLvl = -1 + + for ((_, item) in event.inventoryItems) { + val split = item.getInternalName().split(";") + if (split.first() == "ELEPHANT") { + if (split.last().toInt() > highestElephantLvl) { + farmingItems[FarmingItems.ELEPHANT] = item + highestElephantLvl = split.last().toInt() + } + } + if (split.first() == "MOOSHROOM_COW") { + if (split.last().toInt() > highestMooshroomLvl) { + farmingItems[FarmingItems.MOOSHROOM_COW] = item + highestMooshroomLvl = split.last().toInt() + } + } + if (split.first() == "RABBIT") { + if (split.last().toInt() > highestRabbitLvl) { + farmingItems[FarmingItems.RABBIT] = item + highestRabbitLvl = split.last().toInt() + } + } + } + } + + if (event.inventoryName.contains("Your Skills")) { + for ((_, item) in event.inventoryItems) { + if (item.displayName.contains("Farming ")) { + hidden.farmingLevel = item.displayName.split(" ").last().romanToDecimalIfNeeded() + } + } + } + if (event.inventoryName.contains("Community Shop")) { + for ((_, item) in event.inventoryItems) { + if (item.displayName.contains("Garden Farming Fortune")) { + if (item.getLore().contains("§aMaxed out!")) { + ProfileStorageData.playerSpecific?.gardenCommunityUpgrade = + item.displayName.split(" ").last().romanToDecimal() + } else { + ProfileStorageData.playerSpecific?.gardenCommunityUpgrade = + item.displayName.split(" ").last().romanToDecimal() - 1 + } + } + } + } + if (event.inventoryName.contains("Configure Plots")) { + var plotsUnlocked = 24 + for (slot in event.inventoryItems) { + if (slot.value.getLore().contains("§7Cost:")) { + plotsUnlocked -= 1 + } + } + hidden.plotsUnlocked = plotsUnlocked + } + if (event.inventoryName.contains("Anita")) { + var level = -1 + for ((_, item) in event.inventoryItems) { + if (item.displayName.contains("Extra Farming Drops")) { + level = 0 + for (line in item.getLore()) { + anitaMenuPattern.matchMatcher(line.removeColor()) { + level = group("level").toInt() / 2 + } + } + } + } + if (level == -1) { + hidden.anitaUpgrade = 15 + } else { + hidden.anitaUpgrade = level + } + } + } + + //todo pet level up + @SubscribeEvent + fun onChat(event: LorenzChatEvent) { + if (!LorenzUtils.inSkyBlock) return + val hidden = GardenAPI.config?.fortune ?: return + val msg = event.message.removeColor().trim() + fortuneUpgradePattern.matchMatcher(msg) { + ProfileStorageData.playerSpecific?.gardenCommunityUpgrade = group("level").romanToDecimal() + } + farmingLevelUpPattern.matchMatcher(msg) { + hidden.farmingLevel = group("level").romanToDecimalIfNeeded() + } + anitaBuffPattern.matchMatcher(msg) { + hidden.anitaUpgrade = group("level").toInt() / 2 + } + if (msg == "Yum! You gain +5☘ Farming Fortune for 48 hours!") { + hidden.cakeExpiring = System.currentTimeMillis() + 172800000 + } + } +} 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 new file mode 100644 index 000000000..25636ae8f --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFGuideGUI.kt @@ -0,0 +1,299 @@ +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.features.garden.fortuneguide.pages.* +import at.hannibal2.skyhanni.utils.GuiRenderUtils +import at.hannibal2.skyhanni.utils.SoundUtils +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.item.ItemStack +import org.lwjgl.input.Mouse +import java.io.IOException +import java.util.* + +open class FFGuideGUI : GuiScreen() { + companion object { + val pages = mutableMapOf() + + var guiLeft = 0 + var guiTop = 0 + var screenHeight = 0 + + const val sizeX = 360 + const val sizeY = 180 + + var selectedPage = FortuneGuidePage.OVERVIEW + var breakdownMode = true + var currentPet = 0 + var currentArmor = 0 + var currentEquipment = 0 + + var mouseX = 0 + var mouseY = 0 + + var tooltipToDisplay = mutableListOf() + + fun isInGui() = Minecraft.getMinecraft().currentScreen is FFGuideGUI + + var cakeBuffTime = -1L + + fun FarmingItems.getItem(): ItemStack { + val fortune = GardenAPI.config?.fortune ?: return getFallbackItem(this) + + val farmingItems = fortune.farmingItems + farmingItems[this]?.let { return it } + + val fallbackItem = getFallbackItem(this) + farmingItems[this] = fallbackItem + return fallbackItem + } + + fun getFallbackItem(item: FarmingItems): ItemStack = + ItemStack(Blocks.barrier).setStackDisplayName("§cNo saved ${item.name.lowercase().replace("_", " ")}") + } + + init { + FFStats.loadFFData() + pages[FortuneGuidePage.OVERVIEW] = OverviewPage() + pages[FortuneGuidePage.WHEAT] = WheatPage() + pages[FortuneGuidePage.CARROT] = CarrotPage() + pages[FortuneGuidePage.POTATO] = PotatoPage() + pages[FortuneGuidePage.PUMPKIN] = PumpkinPage() + pages[FortuneGuidePage.SUGAR_CANE] = CanePage() + pages[FortuneGuidePage.MELON] = MelonPage() + pages[FortuneGuidePage.CACTUS] = CactusPage() + pages[FortuneGuidePage.COCOA_BEANS] = CocoaPage() + pages[FortuneGuidePage.MUSHROOM] = MushroomPage() + pages[FortuneGuidePage.NETHER_WART] = WartPage() + + GardenAPI.config?.fortune?.let { + cakeBuffTime = it.cakeExpiring + } + } + + 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 (breakdownMode) { + if (selectedPage != FortuneGuidePage.OVERVIEW) { + GuiRenderUtils.renderItemAndTip( + FarmingItems.ELEPHANT.getItem(), guiLeft + 152, guiTop + 160, mouseX, mouseY, + if (currentPet == 0) 0xFF00FF00.toInt() else 0xFF43464B.toInt() + ) + GuiRenderUtils.renderItemAndTip( + FarmingItems.MOOSHROOM_COW.getItem(), guiLeft + 172, guiTop + 160, mouseX, mouseY, + if (currentPet == 1) 0xFF00FF00.toInt() else 0xFF43464B.toInt() + ) + GuiRenderUtils.renderItemAndTip( + FarmingItems.RABBIT.getItem(), guiLeft + 192, guiTop + 160, mouseX, mouseY, + if (currentPet == 2) 0xFF00FF00.toInt() else 0xFF43464B.toInt() + ) + + GuiRenderUtils.renderItemAndTip( + FarmingItems.HELMET.getItem(), guiLeft + 162, guiTop + 80, mouseX, mouseY) + GuiRenderUtils.renderItemAndTip( + FarmingItems.CHESTPLATE.getItem(), guiLeft + 162, guiTop + 100, mouseX, mouseY) + GuiRenderUtils.renderItemAndTip( + FarmingItems.LEGGINGS.getItem(), guiLeft + 162, guiTop + 120, mouseX, mouseY) + GuiRenderUtils.renderItemAndTip( + FarmingItems.BOOTS.getItem(), guiLeft + 162, guiTop + 140, mouseX, mouseY) + + GuiRenderUtils.renderItemAndTip( + FarmingItems.NECKLACE.getItem(), guiLeft + 182, guiTop + 80, mouseX, mouseY) + GuiRenderUtils.renderItemAndTip( + FarmingItems.CLOAK.getItem(), guiLeft + 182, guiTop + 100, mouseX, mouseY) + GuiRenderUtils.renderItemAndTip( + FarmingItems.BELT.getItem(), guiLeft + 182, guiTop + 120, mouseX, mouseY) + GuiRenderUtils.renderItemAndTip( + FarmingItems.BRACELET.getItem(), guiLeft + 182, guiTop + 140, mouseX, mouseY) + + } else { + GuiRenderUtils.renderItemAndTip( + FarmingItems.HELMET.getItem(), guiLeft + 142, guiTop + 5, mouseX, mouseY, + if (currentArmor == 1) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() + ) + GuiRenderUtils.renderItemAndTip( + FarmingItems.CHESTPLATE.getItem(), guiLeft + 162, guiTop + 5, mouseX, mouseY, + if (currentArmor == 2) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() + ) + GuiRenderUtils.renderItemAndTip( + FarmingItems.LEGGINGS.getItem(), guiLeft + 182, guiTop + 5, mouseX, mouseY, + if (currentArmor == 3) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() + ) + GuiRenderUtils.renderItemAndTip( + FarmingItems.BOOTS.getItem(), guiLeft + 202, guiTop + 5, mouseX, mouseY, + if (currentArmor == 4) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() + ) + + GuiRenderUtils.renderItemAndTip( + FarmingItems.NECKLACE.getItem(), guiLeft + 262, guiTop + 5, mouseX, mouseY, + if (currentEquipment == 1) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() + ) + GuiRenderUtils.renderItemAndTip( + FarmingItems.CLOAK.getItem(), guiLeft + 282, guiTop + 5, mouseX, mouseY, + if (currentEquipment == 2) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() + ) + GuiRenderUtils.renderItemAndTip( + FarmingItems.BELT.getItem(), guiLeft + 302, guiTop + 5, mouseX, mouseY, + if (currentEquipment == 3) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() + ) + GuiRenderUtils.renderItemAndTip( + FarmingItems.BRACELET.getItem(), guiLeft + 322, guiTop + 5, mouseX, mouseY, + if (currentEquipment == 4) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() + ) + + GuiRenderUtils.renderItemAndTip( + FarmingItems.ELEPHANT.getItem(), guiLeft + 152, guiTop + 130, mouseX, mouseY, + if (currentPet == 0) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() + ) + GuiRenderUtils.renderItemAndTip( + FarmingItems.MOOSHROOM_COW.getItem(), guiLeft + 172, guiTop + 130, mouseX, mouseY, + if (currentPet == 1) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() + ) + GuiRenderUtils.renderItemAndTip( + FarmingItems.RABBIT.getItem(), guiLeft + 192, guiTop + 130, mouseX, mouseY, + if (currentPet == 2) 0xFFB3FFB3.toInt() else 0xFF43464B.toInt() + ) + } + } + + GuiRenderUtils.drawStringCentered("§7SkyHanni", guiLeft + 325, guiTop + 170) + GuiRenderUtils.drawStringCentered("§cIn beta! Report issues and suggestions on the discord", guiLeft + sizeX / 2, guiTop + sizeY + 10) + + pages[selectedPage]?.drawPage(mouseX, mouseY, partialTicks) + + GlStateManager.popMatrix() + + if (tooltipToDisplay.isNotEmpty()) { + GuiRenderUtils.drawTooltip(tooltipToDisplay, mouseX, mouseY, height) + tooltipToDisplay.clear() + } + } + + @Throws(IOException::class) + override fun mouseClicked(originalX: Int, originalY: Int, mouseButton: Int) { + super.mouseClicked(originalX, originalY, mouseButton) + + for (page in FortuneGuidePage.values()) { + val x = guiLeft + (page.ordinal) * 30 + 15 + val y = guiTop - 28 + + if (GuiRenderUtils.isPointInRect(mouseX, mouseY, x, y, 25, 28)) { + if (selectedPage != page) { + SoundUtils.playClickSound() + selectedPage = page + } + } + } + if (selectedPage == FortuneGuidePage.OVERVIEW) { + if (GuiRenderUtils.isPointInRect(mouseX, mouseY, guiLeft + 152, guiTop + 130, 16, 16) && currentPet != 0) { + SoundUtils.playClickSound() + currentPet = 0 + FFStats.totalFF(FFStats.elephantFF) + } else if (GuiRenderUtils.isPointInRect(mouseX, mouseY, guiLeft + 172, guiTop + 130, 16, 16) && currentPet != 1 + ) { + SoundUtils.playClickSound() + currentPet = 1 + FFStats.totalFF(FFStats.mooshroomFF) + } else if (GuiRenderUtils.isPointInRect(mouseX, mouseY, guiLeft + 192, guiTop + 130, 16, 16) && currentPet != 2 + ) { + SoundUtils.playClickSound() + currentPet = 2 + FFStats.totalFF(FFStats.rabbitFF) + } else if (GuiRenderUtils.isPointInRect(mouseX, mouseY, guiLeft + 142, guiTop + 5, 16, 16)) { + SoundUtils.playClickSound() + currentArmor = if (currentArmor == 1) 0 else 1 + } else if (GuiRenderUtils.isPointInRect(mouseX, mouseY, guiLeft + 162, guiTop + 5, 16, 16)) { + SoundUtils.playClickSound() + currentArmor = if (currentArmor == 2) 0 else 2 + } else if (GuiRenderUtils.isPointInRect(mouseX, mouseY, guiLeft + 182, guiTop + 5, 16, 16)) { + SoundUtils.playClickSound() + currentArmor = if (currentArmor == 3) 0 else 3 + } else if (GuiRenderUtils.isPointInRect(mouseX, mouseY, guiLeft + 202, guiTop + 5, 16, 16)) { + SoundUtils.playClickSound() + currentArmor = if (currentArmor == 4) 0 else 4 + } else if (GuiRenderUtils.isPointInRect(mouseX, mouseY, guiLeft + 262, guiTop + 5, 16, 16)) { + SoundUtils.playClickSound() + currentEquipment = if (currentEquipment == 1) 0 else 1 + } else if (GuiRenderUtils.isPointInRect(mouseX, mouseY, guiLeft + 282, guiTop + 5, 16, 16)) { + SoundUtils.playClickSound() + currentEquipment = if (currentEquipment == 2) 0 else 2 + } else if (GuiRenderUtils.isPointInRect(mouseX, mouseY, guiLeft + 302, guiTop + 5, 16, 16)) { + SoundUtils.playClickSound() + currentEquipment = if (currentEquipment == 3) 0 else 3 + } else if (GuiRenderUtils.isPointInRect(mouseX, mouseY, guiLeft + 322, guiTop + 5, 16, 16)) { + SoundUtils.playClickSound() + currentEquipment = if (currentEquipment == 4) 0 else 4 + } + + } else { + if (GuiRenderUtils.isPointInRect(mouseX, mouseY, guiLeft + 152, guiTop + 160, 16, 16) && currentPet != 0) { + SoundUtils.playClickSound() + currentPet = 0 + FFStats.totalFF(FFStats.elephantFF) + } else if (GuiRenderUtils.isPointInRect(mouseX, mouseY, guiLeft + 172, guiTop + 160, 16, 16) && currentPet != 1 + ) { + SoundUtils.playClickSound() + currentPet = 1 + FFStats.totalFF(FFStats.mooshroomFF) + } else if (GuiRenderUtils.isPointInRect(mouseX, mouseY, guiLeft + 192, guiTop + 160, 16, 16) && currentPet != 2 + ) { + SoundUtils.playClickSound() + currentPet = 2 + FFStats.totalFF(FFStats.rabbitFF) + } + } + } + + private fun renderTabs() { + for (page in FortuneGuidePage.values()) { + val x = guiLeft + (page.ordinal) * 30 + 15 + val y = guiTop - 28 + drawRect(x, y, x + 25, y + 28, if (page == selectedPage) 0x50555555 else 0x50000000) + + if (page.crop != null) { + GuiRenderUtils.renderItemStack(page.crop.icon, x + 5, y + 5) + } else GuiRenderUtils.renderItemStack(ItemStack(Blocks.grass), x + 5, y + 5) + + if (GuiRenderUtils.isPointInRect(mouseX, mouseY, x, y, 25, 25)) { + tooltipToDisplay.add(page.pageName) + } + } + } + + enum class FortuneGuidePage(val crop: CropType?) { + OVERVIEW(null), + WHEAT(CropType.WHEAT), + CARROT(CropType.CARROT), + POTATO(CropType.POTATO), + NETHER_WART(CropType.NETHER_WART), + PUMPKIN(CropType.PUMPKIN), + MELON(CropType.MELON), + COCOA_BEANS(CropType.COCOA_BEANS), + SUGAR_CANE(CropType.SUGAR_CANE), + CACTUS(CropType.CACTUS), + MUSHROOM(CropType.MUSHROOM), + ; + + val pageName = crop?.let { "§e" + crop.cropName } ?: "§eOverview" + } + + abstract class FFGuidePage { + abstract fun drawPage(mouseX: Int, mouseY: Int, partialTicks: Float) + } +} + 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 new file mode 100644 index 000000000..1d5638061 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/fortuneguide/FFStats.kt @@ -0,0 +1,204 @@ +package at.hannibal2.skyhanni.features.garden.fortuneguide + +import at.hannibal2.skyhanni.data.CropAccessoryData +import at.hannibal2.skyhanni.data.GardenCropUpgrades.Companion.getUpgradeLevel +import at.hannibal2.skyhanni.data.ProfileStorageData +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.features.garden.fortuneguide.FFGuideGUI.Companion.getItem +import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName +import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getFarmingForDummiesCount +import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getPetItem +import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getPetLevel +import net.minecraft.item.ItemStack + +object FFStats { + private val farmingBoots = arrayListOf("RANCHERS_BOOTS", "FARMER_BOOTS") + val necklaceFF = mutableMapOf() + val cloakFF = mutableMapOf() + val beltFF = mutableMapOf() + val braceletFF = mutableMapOf() + var equipmentTotalFF = mutableMapOf() + + val helmetFF = mutableMapOf() + val chestplateFF = mutableMapOf() + val leggingsFF = mutableMapOf() + val bootsFF = mutableMapOf() + var armorTotalFF = mutableMapOf() + var usingSpeedBoots = false + + val elephantFF = mutableMapOf() + val mooshroomFF = mutableMapOf() + val rabbitFF = mutableMapOf() + var currentPetItem = "" + + var baseFF = mutableMapOf() + + var totalBaseFF = mutableMapOf() + + val wheatFF = mutableMapOf() + val carrotFF = mutableMapOf() + val potatoFF = mutableMapOf() + val caneFF = mutableMapOf() + val wartFF = mutableMapOf() + val pumpkinFF = mutableMapOf() + val melonFF = mutableMapOf() + val mushroomFF = mutableMapOf() + val cocoaFF = mutableMapOf() + val cactusFF = mutableMapOf() + + fun loadFFData() { + getEquipmentFFData(FarmingItems.NECKLACE.getItem(), necklaceFF) + getEquipmentFFData(FarmingItems.CLOAK.getItem(), cloakFF) + getEquipmentFFData(FarmingItems.BELT.getItem(), beltFF) + getEquipmentFFData(FarmingItems.BRACELET.getItem(), braceletFF) + + equipmentTotalFF = + (necklaceFF.toList() + cloakFF.toList() + beltFF.toList() + braceletFF.toList()).groupBy({ it.first }, + { it.second }).map { (key, values) -> key to values.sum() } + .toMap() as MutableMap + + getArmorFFData(FarmingItems.HELMET.getItem(), helmetFF) + getArmorFFData(FarmingItems.CHESTPLATE.getItem(), chestplateFF) + getArmorFFData(FarmingItems.LEGGINGS.getItem(), leggingsFF) + getArmorFFData(FarmingItems.BOOTS.getItem(), bootsFF) + + armorTotalFF = + (helmetFF.toList() + chestplateFF.toList() + leggingsFF.toList() + bootsFF.toList()).groupBy({ it.first }, + { it.second }).map { (key, values) -> key to values.sum() } + .toMap() as MutableMap + + usingSpeedBoots = FarmingItems.BOOTS.getItem().getInternalName() in farmingBoots + + getPetFFData(FarmingItems.ELEPHANT.getItem(), elephantFF) + getPetFFData(FarmingItems.MOOSHROOM_COW.getItem(), mooshroomFF) + getPetFFData(FarmingItems.RABBIT.getItem(), rabbitFF) + + getGenericFF(baseFF) + getToolFF(FarmingItems.WHEAT.getItem(), wheatFF) + getToolFF(FarmingItems.CARROT.getItem(), carrotFF) + getToolFF(FarmingItems.POTATO.getItem(), potatoFF) + getToolFF(FarmingItems.SUGAR_CANE.getItem(), caneFF) + getToolFF(FarmingItems.NETHER_WART.getItem(), wartFF) + getToolFF(FarmingItems.PUMPKIN.getItem(), pumpkinFF) + getToolFF(FarmingItems.MELON.getItem(), melonFF) + getToolFF(FarmingItems.MUSHROOM.getItem(), mushroomFF) + getToolFF(FarmingItems.COCOA_BEANS.getItem(), cocoaFF) + getToolFF(FarmingItems.CACTUS.getItem(), cactusFF) + + currentPetItem = FarmingItems.ELEPHANT.getItem().getPetItem().toString() + + when (FFGuideGUI.currentPet) { + 0 -> totalFF(elephantFF) + 1 -> totalFF(mooshroomFF) + 2 -> totalFF(rabbitFF) + } + } + + private fun getEquipmentFFData(item: ItemStack, out: MutableMap) { + FarmingFortuneDisplay.loadFortuneLineData(item, 0.0) + out[FFTypes.TOTAL] = 0.0 + out[FFTypes.BASE] = FarmingFortuneDisplay.itemBaseFortune + out[FFT