diff options
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | FEATURES.md | 1 | ||||
-rw-r--r-- | src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java | 2 | ||||
-rw-r--r-- | src/main/java/at/hannibal2/skyhanni/config/Features.java | 5 | ||||
-rw-r--r-- | src/main/java/at/hannibal2/skyhanni/config/features/Minions.java | 16 | ||||
-rw-r--r-- | src/main/java/at/hannibal2/skyhanni/features/minion/MinionCraftHelper.kt | 130 |
6 files changed, 155 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 26969f2c7..bbe16cf0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ## Features + Added highlight for stuff that is missing in the skyblock level guide inventory. + Added Bingo Card display. ++ **Minion Craft Helper** - Show how many more items you need to upgrade the minion in your inventory. Especially useful for bingo. ## Version 0.15.1 (2023-01-25) diff --git a/FEATURES.md b/FEATURES.md index af45ee3b2..bcc869fe2 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -88,6 +88,7 @@ - Option to hide mob nametags close to minions. - Minion hopper coins per day display (Using the held coins in the hopper and the last time the hopper was collected to calculate the coins a hopper collects in a day) - Minion name display with minion tier. +- **Minion Craft Helper** - Show how many more items you need to upgrade the minion in your inventory. Especially useful for bingo. ## Bazaar - Showing colors in the order inventory for outbid or fully bought/sold items. diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java index d2c427ff5..e4b190fe2 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java @@ -26,6 +26,7 @@ import at.hannibal2.skyhanni.features.fishing.*; import at.hannibal2.skyhanni.features.inventory.*; import at.hannibal2.skyhanni.features.itemabilities.FireVeilWandParticles; import at.hannibal2.skyhanni.features.itemabilities.abilitycooldown.ItemAbilityCooldown; +import at.hannibal2.skyhanni.features.minion.MinionCraftHelper; import at.hannibal2.skyhanni.features.minion.MinionFeatures; import at.hannibal2.skyhanni.features.misc.*; import at.hannibal2.skyhanni.features.misc.tiarelay.TiaRelayHelper; @@ -183,6 +184,7 @@ public class SkyHanniMod { loadModule(new TiaRelayWaypoints()); loadModule(new BingoCardDisplay()); loadModule(new BingoNextStepHelper()); + loadModule(new MinionCraftHelper()); Commands.INSTANCE.init(); diff --git a/src/main/java/at/hannibal2/skyhanni/config/Features.java b/src/main/java/at/hannibal2/skyhanni/config/Features.java index effa92726..40fce3437 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/Features.java +++ b/src/main/java/at/hannibal2/skyhanni/config/Features.java @@ -126,6 +126,11 @@ public class Features extends Config { editOverlay(activeConfigCategory, 200, 16, fishing.sharkFishCounterPos); return; } + + if (runnableId.equals("minionCraftHelper")) { + editOverlay(activeConfigCategory, 200, 16, minions.minionCraftHelperPos); + return; + } } @Expose diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/Minions.java b/src/main/java/at/hannibal2/skyhanni/config/features/Minions.java index d29eb45bd..8d2963ea8 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/Minions.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/Minions.java @@ -82,6 +82,22 @@ public class Minions { @ConfigAccordionId(id = 2) public Position hopperProfitPos = new Position(10, 10, false, true); + @ConfigOption(name = "Minion Craft Helper", desc = "") + @ConfigEditorAccordion(id = 3) + public boolean minionCraftHelper = false; + + @Expose + @ConfigOption(name = "Minion Craft Helper", desc = "Show how many more items you need to upgrade the minion in your inventory. Especially useful for bingo.") + @ConfigEditorBoolean + @ConfigAccordionId(id = 3) + public boolean minionCraftHelperEnabled = false; + + @Expose + @ConfigOption(name = "Minion Craft Helper Position", desc = "") + @ConfigEditorButton(runnableId = "minionCraftHelper", buttonText = "Edit") + @ConfigAccordionId(id = 3) + public Position minionCraftHelperPos = new Position(10, 10, false, true); + @Expose @ConfigOption(name = "Hide Mob Nametag", desc = "Hiding the nametag of mobs close to minions") @ConfigEditorBoolean diff --git a/src/main/java/at/hannibal2/skyhanni/features/minion/MinionCraftHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/minion/MinionCraftHelper.kt new file mode 100644 index 000000000..cfaa2fe10 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/minion/MinionCraftHelper.kt @@ -0,0 +1,130 @@ +package at.hannibal2.skyhanni.features.minion + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.utils.ItemUtils.name +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.NumberUtil.romanToDecimal +import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings +import at.hannibal2.skyhanni.utils.StringUtils.removeColor +import io.github.moulberry.notenoughupdates.NotEnoughUpdates +import io.github.moulberry.notenoughupdates.recipes.CraftingRecipe +import io.github.moulberry.notenoughupdates.recipes.NeuRecipe +import net.minecraft.client.Minecraft +import net.minecraftforge.client.event.RenderGameOverlayEvent +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import net.minecraftforge.fml.common.gameevent.TickEvent +import java.util.regex.Pattern + +class MinionCraftHelper { + + private var minionNamePattern = Pattern.compile("(.*) Minion (.*)") + + var tick = 0 + var display = mutableListOf<String>() + + @SubscribeEvent + fun onTick(event: TickEvent.ClientTickEvent) { + if (event.phase != TickEvent.Phase.START) return + if (!LorenzUtils.inSkyBlock) return + if (!SkyHanniMod.feature.minions.minionCraftHelperEnabled) return + + tick++ + if (tick % 5 != 0) return + + val mainInventory = Minecraft.getMinecraft()?.thePlayer?.inventory?.mainInventory ?: return + + val minions = mutableMapOf<String, String>() + val otherItems = mutableMapOf<String, Int>() + + for (item in mainInventory) { + val name = item?.name?.removeColor() ?: continue + if (name.contains(" Minion ")) { + val minionId = NotEnoughUpdates.INSTANCE.manager.createItemResolutionQuery() + .withItemStack(item) + .resolveInternalName() ?: continue + minions[name] = minionId + } else { + val (itemName, multiplier) = getMultiplier(name) + val old = otherItems.getOrDefault(itemName, 0) + otherItems[itemName] = old + item.stackSize * multiplier + } + } + + display.clear() + for ((minionName, minionId) in minions) { + val matcher = minionNamePattern.matcher(minionName) + if (!matcher.matches()) return + val cleanName = matcher.group(1).removeColor() + val number = matcher.group(2).romanToDecimal() + addMinion(cleanName, number, minionId, otherItems) + } + } + + private fun getMultiplier(name: String) = if (name.startsWith("Enchanted")) { + Pair(name.substring(10), 160) + } else { + Pair(name, 1) + } + + private fun addMinion( + minionName: String, + minionNumber: Int, + minionId: String, + otherItems: MutableMap<String, Int> + ) { + val nextNumber = minionNumber + 1 + display.add("$minionName Minion $minionNumber -> $nextNumber") + val recipes: List<NeuRecipe> = NotEnoughUpdates.INSTANCE.manager.getAvailableUsagesFor(minionId) + for (recipe in recipes) { + if (recipe !is CraftingRecipe) continue + val output = recipe.output + val internalItemId = output.internalItemId + if (!internalItemId.contains("_GENERATOR_")) continue + val map = mutableMapOf<String, Int>() + for (input in recipe.inputs) { + val itemId = input.internalItemId + if (minionId != itemId) { + val itemName = input.itemStack.name?.removeColor()!! + val count = input.count.toInt() + val old = map.getOrDefault(itemName, 0) + map[itemName] = old + count + } + } + for ((name, need) in map) { + val (itemName, multiplier) = getMultiplier(name) + val needAmount = need * multiplier + val have = otherItems.getOrDefault(itemName, 0) + val percentage = have.toDouble() / needAmount + if (percentage >= 1) { + display.add(" $itemName§8: §aDONE") + display.add(" ") + otherItems[itemName] = have - needAmount + addMinion(minionName, minionNumber + 1, minionId.addOneToId(), otherItems) + } else { + val format = LorenzUtils.formatPercentage(percentage) + val haveFormat = LorenzUtils.formatInteger(have) + val needFormat = LorenzUtils.formatInteger(needAmount) + display.add("$itemName§8: §e$format §8(§7$haveFormat§8/§7$needFormat§8)") + display.add(" ") + } + } + } + } + + @SubscribeEvent + fun onRenderOverlay(event: RenderGameOverlayEvent.Post) { + if (event.type != RenderGameOverlayEvent.ElementType.ALL) return + if (!LorenzUtils.inSkyBlock) return + if (!SkyHanniMod.feature.minions.minionCraftHelperEnabled) return + + SkyHanniMod.feature.minions.minionCraftHelperPos.renderStrings(display, center = true) + } +} + +private fun String.addOneToId(): String { + val split = split("_") + val lastText = split.last() + val next = lastText.toInt() + 1 + val result = replace(lastText, "" + next) + return result +} |