diff options
Diffstat (limited to 'src/main/java/at')
3 files changed, 168 insertions, 0 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt index 9fa6c5d8f..b2e6427a8 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt @@ -279,6 +279,7 @@ class SkyHanniMod { loadModule(GardenStartLocation) loadModule(PetCandyUsedDisplay()) loadModule(ServerRestartTitle()) + loadModule(CityProjectMaterialHelper()) init() diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/Misc.java b/src/main/java/at/hannibal2/skyhanni/config/features/Misc.java index 5643892ca..28d7093c0 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/Misc.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/Misc.java @@ -364,6 +364,27 @@ public class Misc { public boolean inventoryNumbers = false; } + @ConfigOption(name = "City Project", desc = "") + @Accordion + @Expose + public CityProject cityProject = new CityProject(); + + public static class CityProject { + + @Expose + @ConfigOption(name = "Show Materials", desc = "Show materials needed for contributing to the City Project.") + @ConfigEditorBoolean + public boolean showMaterials = true; + + @Expose + @ConfigOption(name = "Show Ready", desc = "Mark Contributions that are ready to participate.") + @ConfigEditorBoolean + public boolean showReady = true; + + @Expose + public Position pos = new Position(394, 124, false, true); + } + @Expose @ConfigOption(name = "Exp Bottles", desc = "Hides all the experience orbs lying on the ground.") @ConfigEditorBoolean diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/CityProjectMaterialHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/CityProjectMaterialHelper.kt new file mode 100644 index 000000000..869154ec1 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/CityProjectMaterialHelper.kt @@ -0,0 +1,146 @@ +package at.hannibal2.skyhanni.features.misc + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.events.GuiContainerEvent +import at.hannibal2.skyhanni.events.GuiRenderEvent +import at.hannibal2.skyhanni.events.InventoryCloseEvent +import at.hannibal2.skyhanni.events.InventoryOpenEvent +import at.hannibal2.skyhanni.features.garden.AnitaMedalProfit +import at.hannibal2.skyhanni.utils.* +import at.hannibal2.skyhanni.utils.ItemUtils.getLore +import at.hannibal2.skyhanni.utils.ItemUtils.name +import at.hannibal2.skyhanni.utils.LorenzUtils.addAsSingletonList +import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators +import at.hannibal2.skyhanni.utils.RenderUtils.highlight +import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems +import at.hannibal2.skyhanni.utils.StringUtils.removeColor +import at.hannibal2.skyhanni.utils.renderables.Renderable +import net.minecraft.client.Minecraft +import net.minecraft.client.gui.inventory.GuiChest +import net.minecraft.client.gui.inventory.GuiEditSign +import net.minecraft.inventory.ContainerChest +import net.minecraft.item.ItemStack +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent + +class CityProjectMaterialHelper { + private val config get() = SkyHanniMod.feature.misc.cityProject + private var display = listOf<List<Any>>() + private var inCityProjectInventory = false + + @SubscribeEvent + fun onInventoryClose(event: InventoryCloseEvent) { + AnitaMedalProfit.inInventory = false + } + + @SubscribeEvent + fun onInventoryOpen(event: InventoryOpenEvent) { + if (!LorenzUtils.inSkyBlock) return + if (!config.showMaterials) return + + val lore = event.inventoryItems[4]?.getLore() ?: return + if (lore.isEmpty()) return + if (lore[0] != "§8City Project") return + inCityProjectInventory = true + + // internal name -> amount + val materials = mutableMapOf<String, Int>() + for ((_, item) in event.inventoryItems) { + val itemName = item.name ?: continue + if (itemName != "§eContribute this component!") continue + fetchMaterials(item, materials) + } + + println("materials: $materials") + + display = buildList(materials) + } + + private fun buildList(materials: MutableMap<String, Int>) = buildList<List<Any>> { + addAsSingletonList("§7City Project Materials") + + if (materials.isEmpty()) { + addAsSingletonList("§cNo Materials to contribute.") + return@buildList + } + + for ((internalName, amount) in materials) { + val stack = NEUItems.getItemStack(internalName) + val name = stack.name ?: continue + val list = mutableListOf<Any>() + list.add(" §7- ") + list.add(stack) + + list.add(Renderable.optionalLink("$name §ex${amount.addSeparators()}", { + if (Minecraft.getMinecraft().currentScreen is GuiEditSign) { + LorenzUtils.setTextIntoSign("$amount") + } else if (!NEUItems.neuHasFocus() && !LorenzUtils.noTradeMode) { + LorenzUtils.sendCommandToServer("bz ${name.removeColor()}") + OSUtils.copyToClipboard("$amount") + } + }) { inCityProjectInventory && !NEUItems.neuHasFocus() }) + + val price = NEUItems.getPrice(internalName) * amount + val format = NumberUtil.format(price) + list.add(" §7(§6$format§7)") + add(list) + } + } + + private fun fetchMaterials(item: ItemStack, materials: MutableMap<String, Int>) { + var next = false + for (line in item.getLore()) { + if (line == "§7Cost") { + next = true + continue + } + if (!next) continue + if (line == "") break + if (line.contains("Bits")) break + + println(" ") + println("line: '$line'") + val (name, amount) = ItemUtils.readItemAmount(line) + if (name != null) { + val internalName = NEUItems.getInternalName(name) + println("internalName: $internalName") + println("amount: $amount") + val old = materials.getOrPut(internalName) { 0 } + materials[internalName] = old + amount + } + } + } + + @SubscribeEvent + fun onBackgroundDraw(event: GuiRenderEvent.ChestBackgroundRenderEvent) { + if (!LorenzUtils.inSkyBlock) return + if (!config.showMaterials) return + if (!inCityProjectInventory) return + + config.pos.renderStringsAndItems(display, posLabel = "City Project Materials") + } + + @SubscribeEvent + fun onBackgroundDrawn(event: GuiContainerEvent.BackgroundDrawnEvent) { + if (!LorenzUtils.inSkyBlock) return + if (!config.showReady) return + if (!inCityProjectInventory) return + + + if (event.gui !is GuiChest) return + val guiChest = event.gui + val chest = guiChest.inventorySlots as ContainerChest + + for (slot in chest.inventorySlots) { + if (slot == null) continue + if (slot.slotNumber != slot.slotIndex) continue + val stack = slot.stack ?: continue + val lore = stack.getLore() + if (lore.isEmpty()) continue + val last = lore.last() + if (last == "§eClick to contribute!") { + slot highlight LorenzColor.YELLOW + } + } + } + +} |