Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: Compact Item Stars #2741

Merged
merged 10 commits into from
Oct 16, 2024
123 changes: 29 additions & 94 deletions src/main/java/at/hannibal2/skyhanni/features/inventory/ItemStars.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,19 @@ package at.hannibal2.skyhanni.features.inventory

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.config.features.inventory.InventoryConfig.ItemNumberEntry.CRIMSON_ARMOR
import at.hannibal2.skyhanni.data.jsonobjects.repo.ItemsJson
import at.hannibal2.skyhanni.events.LorenzToolTipEvent
import at.hannibal2.skyhanni.events.RenderItemTipEvent
import at.hannibal2.skyhanni.events.RepositoryReloadEvent
import at.hannibal2.skyhanni.features.inventory.ItemDisplayOverlayFeatures.isSelected
import at.hannibal2.skyhanni.features.nether.kuudra.KuudraAPI.getKuudraTier
import at.hannibal2.skyhanni.features.nether.kuudra.KuudraAPI.isKuudraArmor
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import at.hannibal2.skyhanni.utils.ItemUtils.getInternalNameOrNull
import at.hannibal2.skyhanni.utils.ItemUtils.name
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.RegexUtils.matches
import at.hannibal2.skyhanni.utils.RegexUtils.findMatcher
import at.hannibal2.skyhanni.utils.SkyBlockItemModifierUtils.getDungeonStarCount
import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern
import net.minecraft.item.ItemStack
import net.minecraftforge.fml.common.eventhandler.EventPriority
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent

Expand All @@ -20,115 +23,47 @@ object ItemStars {

private val config get() = SkyHanniMod.feature.inventory

private val starPattern by RepoPattern.pattern(
"inventory.itemstars.stars",
"(.*)§.✪(.*)"
)
private val repoGroup = RepoPattern.group("inventory.itemstars")

private val armorNames = mutableListOf<String>()
private val tiers = mutableMapOf<String, Int>()
private val armorParts = listOf("Helmet", "Chestplate", "Leggings", "Boots")
/**
* REGEX-TEST: §6Ancient Terror Leggings §d✪✪§6✪✪✪
* REGEX-TEST: §dRenowned Burning Crimson Helmet §6✪✪✪✪✪
*/
private val starPattern by repoGroup.pattern(
"stars",
"^(?<name>.+) (?<stars>(?:(?:§.)?✪)+)"
)

@SubscribeEvent(priority = EventPriority.LOW)
fun onTooltip(event: LorenzToolTipEvent) {
if (!isEnabled()) return
val stack = event.itemStack
if (stack.stackSize != 1) return

val itemName = stack.name
val stars = getStars(itemName)

if (stars > 0) {
var name = itemName
while (starPattern.matches(name)) {
name = name.replaceFirst("§.✪".toRegex(), "")
}
name = name.trim()
val stars = stack.getStarCount() ?: return
starPattern.findMatcher(stack.name) {
val name = group("name")
event.toolTip[0] = "$name §c$stars✪"
}
}

@SubscribeEvent
fun onRepoReload(event: RepositoryReloadEvent) {
val data = event.getConstant<ItemsJson>("Items")
armorNames.clear()
tiers.clear()
armorNames.addAll(data.crimsonArmors)
for (tier in data.crimsonTiers) {
tiers[tier.key] = tier.value
}
}

@SubscribeEvent
fun onRenderItemTip(event: RenderItemTipEvent) {
if (!LorenzUtils.inSkyBlock) return
if (!CRIMSON_ARMOR.isSelected()) return
val stack = event.stack
val number = getCrimsonStars(stack.name)
if (number != -1) {
event.stackTip = number.toString()
}
}

private fun getStars(name: String): Int {
val stars = getCrimsonStars(name)
if (stars != -1) {
return stars
}

return getOtherStars(name)
if (stack.getInternalNameOrNull()?.isKuudraArmor() != true) return
val stars = stack.getStarCount() ?: return
event.stackTip = stars.toString()
}

private fun getCrimsonStars(name: String): Int {
if (!armorNames.any { name.contains(it) } || !armorParts.any { name.contains(it) }) {
return -1
private fun ItemStack.getStarCount(): Int? {
val internalName = getInternalNameOrNull() ?: return null
val baseStars = getDungeonStarCount() ?: getStarCount() ?: return null
ItsEmpa marked this conversation as resolved.
Show resolved Hide resolved
if (internalName.isKuudraArmor()) {
val tier = internalName.getKuudraTier() ?: return baseStars
return baseStars + tier * 10
}
var name1 = name
var gold = 0
var pink = 0
var aqua = 0
while (name1.contains("§6✪")) {
name1 = name1.replaceFirst("§6✪", "")
gold++
}
while (name1.contains("§d✪")) {
name1 = name1.replaceFirst("§d✪", "")
pink++
}
while (name1.contains("§b✪")) {
name1 = name1.replaceFirst("§b✪", "")
aqua++
}
return (tiers.entries.find { name1.contains(it.key) }?.value ?: 0) + if (aqua > 0) {
10 + aqua
} else if (pink > 0) {
5 + pink
} else {
gold
}
}

private fun getOtherStars(originalName: String): Int {
var name = originalName

var gold = 0
var red = 0
while (name.contains("§6✪")) {
name = name.replaceFirst("§6✪", "")
gold++
}
while (name.contains("§c✪")) {
name = name.replaceFirst("§c✪", "")
red++
}
while (name.contains("§d✪")) {
name = name.replaceFirst("§d✪", "")
red++
}

if (red > 0) return 5 + red
if (gold > 0) return gold

return -1
return baseStars
}

private fun isEnabled() = LorenzUtils.inSkyBlock && config.itemStars
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package at.hannibal2.skyhanni.features.misc.items

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.api.ReforgeAPI
import at.hannibal2.skyhanni.features.nether.kuudra.KuudraAPI.getKuudraTier
import at.hannibal2.skyhanni.features.nether.kuudra.KuudraAPI.isKuudraArmor
import at.hannibal2.skyhanni.test.command.ErrorManager
import at.hannibal2.skyhanni.utils.CollectionUtils.addOrPut
import at.hannibal2.skyhanni.utils.CollectionUtils.sorted
Expand Down Expand Up @@ -69,6 +71,7 @@ object EstimatedItemValueCalculator {

private val config get() = SkyHanniMod.feature.inventory.estimatedItemValues

// TODO move into KuudraAPI
private val kuudraSets = listOf("AURORA", "CRIMSON", "TERROR", "HOLLOW", "FERVOR")

var starChange = 0
Expand Down Expand Up @@ -134,15 +137,7 @@ object EstimatedItemValueCalculator {
return Pair(totalPrice, basePrice)
}

private fun isKuudraSet(internalName: String) = (
kuudraSets.any { internalName.contains(it) } &&
listOf(
"CHESTPLATE",
"LEGGINGS",
"HELMET",
"BOOTS",
).any { internalName.endsWith(it) }
)
fun isKuudraSet(internalName: String) = internalName.asInternalName().isKuudraArmor()

private fun addAttributeCost(stack: ItemStack, list: MutableList<String>): Double {
val attributes = stack.getAttributes() ?: return 0.0
Expand Down Expand Up @@ -495,8 +490,8 @@ object EstimatedItemValueCalculator {
var totalStars = inputStars
val rawInternalName = internalName.asString()
val (price, maxStars) = if (isKuudraSet(rawInternalName)) {
val tier = getKuudraTier(internalName)
totalStars += (tier + 1) * 10
val tier = internalName.getKuudraTier() ?: 0
totalStars += tier * 10

var remainingStars = totalStars

Expand All @@ -508,7 +503,7 @@ object EstimatedItemValueCalculator {

for ((id, _) in EssenceItemUtils.itemPrices) {
if (!id.contains(removed)) continue
tiers[id] = getKuudraTier(id)
tiers[id] = (id.getKuudraTier() ?: 0) - 1

}
for ((id, _) in tiers.sorted()) {
Expand All @@ -535,17 +530,6 @@ object EstimatedItemValueCalculator {
return price to (havingStars to maxStars)
}

private fun getKuudraTier(internalName: NEUInternalName): Int {
for (tier in kuudraUpgradeTiers) {
if (internalName.asString().contains(tier)) {
return kuudraUpgradeTiers.indexOf(tier)
}
}
return -1
}
// private fun getKuudraTier(internalName: NEUInternalName): Int? =
// kuudraUpgradeTiers.firstOrNull { it in internalName.toString() }?.let { kuudraUpgradeTiers.indexOf(it) }

private fun getPriceFor(
prices: Map<Int, EssenceItemUtils.EssenceUpgradePrice>,
totalStars: Int,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import at.hannibal2.skyhanni.events.LorenzTickEvent
import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.NEUInternalName
import at.hannibal2.skyhanni.utils.RegexUtils.matchMatcher
import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
Expand All @@ -26,6 +27,26 @@ object KuudraAPI {
"§.\\s*(?:§.)*KUUDRA DOWN!"
)

private val kuudraTiers = listOf("HOT_", "BURNING_", "FIERY_", "INFERNAL_")

private val kuudraArmors: List<String>
ItsEmpa marked this conversation as resolved.
Show resolved Hide resolved

init {
val kuudraSets = listOf("AURORA_", "CRIMSON_", "TERROR_", "HOLLOW_", "FERVOR_")
val armorPieces = listOf("HELMET", "CHESTPLATE", "LEGGINGS", "BOOTS")
kuudraArmors = (kuudraTiers + "").flatMap { tier ->
kuudraSets.flatMap { set ->
armorPieces.map { piece ->
"$set$tier$piece"
}
}
}
}

fun NEUInternalName.isKuudraArmor(): Boolean = asString() in kuudraArmors

fun NEUInternalName.getKuudraTier(): Int? = kuudraTiers.indexOfFirst { asString().startsWith(it) }.takeIf { it != -1 }?.let { it + 1 }

var kuudraTier: Int? = null
fun inKuudra() = kuudraTier != null

Expand Down
Loading