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 107959f95be6..2ec370dee577 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenAPI.kt @@ -28,6 +28,7 @@ import at.hannibal2.skyhanni.features.inventory.chocolatefactory.ChocolateFactor import at.hannibal2.skyhanni.features.inventory.chocolatefactory.ChocolateShopPrice import at.hannibal2.skyhanni.utils.BlockUtils.isBabyCrop import at.hannibal2.skyhanni.utils.ChatUtils +import at.hannibal2.skyhanni.utils.CollectionUtils.addItemStack import at.hannibal2.skyhanni.utils.DelayedRun import at.hannibal2.skyhanni.utils.InventoryUtils import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName @@ -41,6 +42,7 @@ import at.hannibal2.skyhanni.utils.NEUItems import at.hannibal2.skyhanni.utils.RenderUtils.addItemIcon import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getCultivatingCounter import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getHoeCounter +import at.hannibal2.skyhanni.utils.renderables.Renderable import net.minecraft.client.Minecraft import net.minecraft.item.ItemStack import net.minecraft.network.play.client.C09PacketHeldItemChange @@ -169,6 +171,15 @@ object GardenAPI { ) = addItemIcon(crop.icon.copy(), highlight, scale = scale) + // TODO rename to addCropIcon + fun MutableList.addCropIconRenderable( + crop: CropType, + scale: Double = NEUItems.itemFontSize, + highlight: Boolean = false, + ) { + addItemStack(crop.icon.copy(), highlight = highlight, scale = scale) + } + fun hideExtraGuis() = ComposterOverlay.inInventory || AnitaMedalProfit.inInventory || SkyMartCopperPrice.inInventory || FarmingContestAPI.inInventory || VisitorAPI.inInventory || FFGuideGUI.isInGui() || ChocolateShopPrice.inInventory || ChocolateFactoryAPI.inChocolateFactory || diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/GardenCropMilestoneDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/GardenCropMilestoneDisplay.kt index 9e10a8941b55..7a91b8765988 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/farming/GardenCropMilestoneDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/farming/GardenCropMilestoneDisplay.kt @@ -17,29 +17,30 @@ import at.hannibal2.skyhanni.events.ProfileJoinEvent 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.addCropIcon +import at.hannibal2.skyhanni.features.garden.GardenAPI.addCropIconRenderable import at.hannibal2.skyhanni.features.garden.GardenAPI.getCropType import at.hannibal2.skyhanni.features.garden.farming.GardenCropSpeed.setSpeed import at.hannibal2.skyhanni.test.command.ErrorManager -import at.hannibal2.skyhanni.utils.CollectionUtils.addAsSingletonList +import at.hannibal2.skyhanni.utils.CollectionUtils.addString import at.hannibal2.skyhanni.utils.ConditionalUtils import at.hannibal2.skyhanni.utils.ConfigUtils import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.round import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators +import at.hannibal2.skyhanni.utils.RenderUtils.renderRenderables import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems import at.hannibal2.skyhanni.utils.SoundUtils import at.hannibal2.skyhanni.utils.TimeUnit import at.hannibal2.skyhanni.utils.TimeUtils +import at.hannibal2.skyhanni.utils.renderables.Renderable import net.minecraftforge.fml.common.eventhandler.EventPriority import net.minecraftforge.fml.common.eventhandler.SubscribeEvent -import java.util.Collections import kotlin.time.Duration.Companion.seconds object GardenCropMilestoneDisplay { - private var progressDisplay = emptyList>() - private var mushroomCowPerkDisplay = emptyList>() + private var progressDisplay = emptyList() + private var mushroomCowPerkDisplay = emptyList() private val cultivatingData = mutableMapOf() private val config get() = GardenAPI.config.cropMilestones private val overflowConfig get() = config.overflow @@ -71,12 +72,12 @@ object GardenCropMilestoneDisplay { if (!isEnabled()) return if (GardenAPI.hideExtraGuis()) return - config.progressDisplayPos.renderStringsAndItems( + config.progressDisplayPos.renderRenderables( progressDisplay, posLabel = "Crop Milestone Progress" ) if (config.mushroomPetPerk.enabled) { - config.mushroomPetPerk.pos.renderStringsAndItems( + config.mushroomPetPerk.pos.renderRenderables( mushroomCowPerkDisplay, posLabel = "Mushroom Cow Perk" ) } @@ -144,10 +145,10 @@ object GardenCropMilestoneDisplay { } } - private fun drawProgressDisplay(crop: CropType): MutableList> { + private fun drawProgressDisplay(crop: CropType): List { val counter = crop.getCounter() - val lineMap = HashMap>() - lineMap[0] = Collections.singletonList("§6Crop Milestones") + val lineMap = mutableMapOf() + lineMap[0] = Renderable.string("§6Crop Milestones") val customTargetLevel = storage?.get(crop) ?: 0 val overflowDisplay = overflowConfig.cropMilestoneDisplay @@ -158,14 +159,14 @@ object GardenCropMilestoneDisplay { val useCustomGoal = customTargetLevel != 0 && customTargetLevel > currentTier nextTier = if (useCustomGoal) customTargetLevel else nextTier - val list = mutableListOf() - list.addCropIcon(crop) - if (crop.isMaxed(overflowDisplay)) { - list.add("§7" + crop.cropName + " §eMAXED") - } else { - list.add("§7" + crop.cropName + " §8$currentTier➜§3$nextTier") - } - lineMap[1] = list + lineMap[1] = Renderable.horizontalContainer(buildList { + addCropIconRenderable(crop) + if (crop.isMaxed(overflowDisplay) && !overflowDisplay) { + addString("§7" + crop.cropName + " §eMAXED") + } else { + addString("§7" + crop.cropName + " §8$currentTier➜§3$nextTier") + } + }) val allowOverflowOrCustom = overflowDisplay || useCustomGoal val cropsForNextTier = GardenCropMilestones.getCropsForTier(nextTier, crop, allowOverflowOrCustom) @@ -178,13 +179,13 @@ object GardenCropMilestoneDisplay { Pair(have, need) } - lineMap[2] = if (crop.isMaxed(overflowDisplay)) { + lineMap[2] = if (crop.isMaxed(overflowDisplay) && !overflowDisplay) { val haveFormat = counter.addSeparators() - Collections.singletonList("§7Counter: §e$haveFormat") + Renderable.string("§7Counter: §e$haveFormat") } else { val haveFormat = have.addSeparators() val needFormat = need.addSeparators() - Collections.singletonList("§e$haveFormat§8/§e$needFormat") + Renderable.string("§e$haveFormat§8/§e$needFormat") } val farmingFortune = FarmingFortuneDisplay.getCurrentFarmingFortune() @@ -193,7 +194,7 @@ object GardenCropMilestoneDisplay { if (farmingFortuneSpeed > 0) { crop.setSpeed(farmingFortuneSpeed) - if (!crop.isMaxed(overflowDisplay)) { + if (!crop.isMaxed(overflowDisplay) || overflowDisplay) { val missing = need - have val missingTimeSeconds = missing / farmingFortuneSpeed val millis = missingTimeSeconds * 1000 @@ -204,30 +205,38 @@ object GardenCropMilestoneDisplay { tryWarn(millis, "§b${crop.cropName} $nextTier in $duration") val speedText = "§7In §b$duration" - lineMap[3] = Collections.singletonList(speedText) + lineMap[3] = Renderable.string(speedText) GardenAPI.itemInHand?.let { if (GardenAPI.readCounter(it) == -1L) { - lineMap[3] = listOf(speedText, " §7Inaccurate!") + lineMap[3] = Renderable.string("$speedText §7Inaccurate!") } } } val format = (farmingFortuneSpeed * 60).addSeparators() - lineMap[4] = Collections.singletonList("§7Crops/Minute§8: §e$format") + lineMap[4] = Renderable.string("§7Crops/Minute§8: §e$format") val formatBps = speed.round(config.blocksBrokenPrecision).addSeparators() - lineMap[5] = Collections.singletonList("§7Blocks/Second§8: §e$formatBps") + lineMap[5] = Renderable.string("§7Blocks/Second§8: §e$formatBps") } val percentageFormat = LorenzUtils.formatPercentage(have.toDouble() / need.toDouble()) - lineMap[6] = if (crop.isMaxed(overflowDisplay)) { - Collections.singletonList("§7Percentage: §e100%") + lineMap[6] = if (crop.isMaxed(overflowDisplay) && !overflowDisplay) { + Renderable.string("§7Percentage: §e100%") } else { - Collections.singletonList("§7Percentage: §e$percentageFormat") + Renderable.string("§7Percentage: §e$percentageFormat") } + if (overflowConfig.chat) { + if (currentTier >= 46 && currentTier == previousNext && + nextRealTier == currentTier + 1 && lastWarnedLevel != currentTier) { + GardenCropMilestones.onOverflowLevelUp(crop, currentTier - 1, nextRealTier - 1) + lastWarnedLevel = currentTier + } + } if (overflowConfig.chat) { - if (currentTier >= 46 && currentTier == previousNext && nextRealTier == currentTier + 1 && lastWarnedLevel != currentTier) { + if (currentTier >= 46 && currentTier == previousNext && + nextRealTier == currentTier + 1 && lastWarnedLevel != currentTier) { GardenCropMilestones.onOverflowLevelUp(crop, currentTier - 1, nextRealTier - 1) lastWarnedLevel = currentTier } @@ -256,8 +265,8 @@ object GardenCropMilestoneDisplay { } } - private fun formatDisplay(lineMap: HashMap>): MutableList> { - val newList = mutableListOf>() + private fun formatDisplay(lineMap: MutableMap): List { + val newList = mutableListOf() for (index in config.text) { // TODO, change functionality to use enum rather than ordinals lineMap[index.ordinal]?.let { @@ -266,7 +275,7 @@ object GardenCropMilestoneDisplay { } if (needsInventory) { - newList.addAsSingletonList("§cOpen §e/cropmilestones §cto update!") + newList.addString("§cOpen §e/cropmilestones §cto update!") } return newList @@ -277,13 +286,13 @@ object GardenCropMilestoneDisplay { val allowOverflow = overflowConfig.cropMilestoneDisplay if (mushroom.isMaxed(allowOverflow)) { mushroomCowPerkDisplay = listOf( - listOf("§6Mooshroom Cow Perk"), - listOf("§eMushroom crop is maxed!"), + Renderable.string("§6Mooshroom Cow Perk"), + Renderable.string("§eMushroom crop is maxed!"), ) return } - val lineMap = HashMap>() + val lineMap = HashMap() val counter = mushroom.getCounter() val currentTier = GardenCropMilestones.getTierForCropCount(counter, mushroom, allowOverflow) @@ -300,14 +309,15 @@ object GardenCropMilestoneDisplay { val missing = need - have - lineMap[0] = Collections.singletonList("§6Mooshroom Cow Perk") - - val list = mutableListOf() - list.addCropIcon(mushroom) - list.add("§7Mushroom Tier $nextTier") - lineMap[1] = list + lineMap[0] = Renderable.string("§6Mooshroom Cow Perk") + lineMap[1] = Renderable.horizontalContainer( + buildList { + addCropIconRenderable(mushroom) + addString("§7Mushroom Tier $nextTier") + } + ) - lineMap[2] = Collections.singletonList("§e$haveFormat§8/§e$needFormat") + lineMap[2] = Renderable.string("§e$haveFormat§8/§e$needFormat") val speed = GardenCropSpeed.averageBlocksPerSecond if (speed != 0.0) { @@ -318,18 +328,18 @@ object GardenCropMilestoneDisplay { // TODO, change functionality to use enum rather than ordinals val biggestUnit = TimeUnit.entries[config.highestTimeFormat.get().ordinal] val duration = TimeUtils.formatDuration(millis.toLong(), biggestUnit) - lineMap[3] = Collections.singletonList("§7In §b$duration") + lineMap[3] = Renderable.string("§7In §b$duration") } val percentageFormat = LorenzUtils.formatPercentage(have.toDouble() / need.toDouble()) - lineMap[4] = Collections.singletonList("§7Percentage: §e$percentageFormat") + lineMap[4] = Renderable.string("§7Percentage: §e$percentageFormat") if (currentTier >= 46 && currentTier == previousMushNext && nextTier == currentTier + 1 && lastMushWarnedLevel != currentTier) { GardenCropMilestones.onOverflowLevelUp(mushroom, currentTier - 1, nextTier - 1) lastMushWarnedLevel = currentTier } - val newList = mutableListOf>() + val newList = mutableListOf() for (index in config.mushroomPetPerk.text) { // TODO, change functionality to use enum rather than ordinals lineMap[index.ordinal]?.let { diff --git a/src/main/java/at/hannibal2/skyhanni/utils/CollectionUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/CollectionUtils.kt index df4f15e47f5c..2da2fbda2f7b 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/CollectionUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/CollectionUtils.kt @@ -2,6 +2,7 @@ package at.hannibal2.skyhanni.utils import at.hannibal2.skyhanni.utils.NEUItems.getItemStack import at.hannibal2.skyhanni.utils.renderables.Renderable +import net.minecraft.enchantment.Enchantment import net.minecraft.item.ItemStack import java.util.Collections import java.util.Queue @@ -202,8 +203,16 @@ object CollectionUtils { } // TODO add internal name support, and caching - fun MutableList.addItemStack(itemStack: ItemStack) { - add(Renderable.itemStack(itemStack)) + fun MutableList.addItemStack( + itemStack: ItemStack, + highlight: Boolean = false, + scale: Double = NEUItems.itemFontSize, + ) { + if (highlight) { + // Hack to add enchant glint, like Hypixel does it + itemStack.addEnchantment(Enchantment.protection, 0) + } + add(Renderable.itemStack(itemStack, scale = scale)) } fun MutableList.addItemStack(internalName: NEUInternalName) { diff --git a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt index 2f512cb871c1..d17831fb57cb 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt @@ -637,6 +637,7 @@ object RenderUtils { return offsetX } + @Deprecated("use renderable item list", ReplaceWith("")) fun MutableList.addItemIcon( item: ItemStack, highlight: Boolean = false,