diff options
Diffstat (limited to 'src')
11 files changed, 238 insertions, 78 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt index e79f89452..07ac3c422 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt @@ -191,6 +191,8 @@ class SkyHanniMod { loadModule(DungeonCleanEnd()) loadModule(DungeonBossMessages()) loadModule(DungeonBossHideDamageSplash()) + loadModule(TrophyFishManager()) + loadModule(TrophyFishFillet()) loadModule(TrophyFishMessages()) loadModule(BazaarBestSellMethod()) loadModule(AnvilCombineHelper()) diff --git a/src/main/java/at/hannibal2/skyhanni/config/ConfigManager.kt b/src/main/java/at/hannibal2/skyhanni/config/ConfigManager.kt index 44044fa48..da971355d 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/ConfigManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/ConfigManager.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.config import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.features.fishing.TrophyRarity import at.hannibal2.skyhanni.features.garden.CropType import at.hannibal2.skyhanni.features.misc.update.UpdateManager import at.hannibal2.skyhanni.utils.LorenzLogger @@ -45,6 +46,16 @@ class ConfigManager { return LorenzVec(x, y, z) } }.nullSafe()) + .registerTypeAdapter(TrophyRarity::class.java, object : TypeAdapter<TrophyRarity>() { + override fun write(out: JsonWriter, value: TrophyRarity) { + value.run { out.value(value.name) } + } + + override fun read(reader: JsonReader): TrophyRarity { + val text = reader.nextString() + return TrophyRarity.getByName(text) ?: error("Could not parse TrophyRarity from '$text'") + } + }.nullSafe()) .registerTypeAdapter(ItemStack::class.java, object : TypeAdapter<ItemStack>() { override fun write(out: JsonWriter, value: ItemStack) { out.value(NEUItems.saveNBTData(value)) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/Fishing.java b/src/main/java/at/hannibal2/skyhanni/config/features/Fishing.java index e7fcff1ff..2374a9e2f 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/Fishing.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/Fishing.java @@ -44,6 +44,12 @@ public class Fishing { public boolean trophyFishTotalAmount = false; @Expose + @ConfigOption(name = "Trophy Fish Info", desc = "Show information and stats about a trophy fish when hovering over a catch message in chat.") + @ConfigEditorBoolean + @ConfigAccordionId(id = 0) + public boolean trophyFishTooltip = true; + + @Expose @ConfigOption(name = "Bronze Duplicates", desc = "Hide duplicate messages for bronze trophy fishes from chat.") @ConfigEditorBoolean @ConfigAccordionId(id = 0) @@ -56,6 +62,12 @@ public class Fishing { public boolean trophyFishSilverHider = false; @Expose + @ConfigOption(name = "Fillet Tooltip", desc = "Show fillet value of trophy fish in tooltip.") + @ConfigEditorBoolean + @ConfigAccordionId(id = 0) + public boolean trophyFilletTooltip = true; + + @Expose @ConfigOption(name = "Odger Waypoint", desc = "Show the Odger waypoint when trophy fishes are in the inventory and no lava rod in hand.") @ConfigEditorBoolean @ConfigAccordionId(id = 0) diff --git a/src/main/java/at/hannibal2/skyhanni/features/fishing/TrophyFishFillet.kt b/src/main/java/at/hannibal2/skyhanni/features/fishing/TrophyFishFillet.kt new file mode 100644 index 000000000..32d31595b --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/fishing/TrophyFishFillet.kt @@ -0,0 +1,34 @@ +package at.hannibal2.skyhanni.features.fishing + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.events.LorenzToolTipEvent +import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName +import at.hannibal2.skyhanni.utils.ItemUtils.name +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.NEUItems +import at.hannibal2.skyhanni.utils.NumberUtil +import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import org.lwjgl.input.Keyboard + +class TrophyFishFillet { + + @SubscribeEvent + fun onTooltip(event: LorenzToolTipEvent) { + if (!isEnabled()) return + if (event.slot.inventory.name.contains("Sack")) return + val internalName = event.itemStack.getInternalName() + val trophyFishName = internalName.substringBeforeLast("_") + .replace("_", "").lowercase() + val trophyRarityName = internalName.substringAfterLast("_") + val info = TrophyFishManager.getInfo(trophyFishName) ?: return + val rarity = TrophyRarity.getByName(trophyRarityName) ?: return + val multiplier = if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) event.itemStack.stackSize else 1 + val filletValue = info.getFilletValue(rarity) * multiplier + val filletPrice = filletValue * NEUItems.getPrice("MAGMA_FISH") + event.toolTip.add("§7Fillet: §8${filletValue.addSeparators()} Magmafish §7(§6${NumberUtil.format(filletPrice)}§7)") + } + + private fun isEnabled() = LorenzUtils.inSkyBlock && SkyHanniMod.feature.fishing.trophyFilletTooltip + +}
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/fishing/TrophyFishInfo.kt b/src/main/java/at/hannibal2/skyhanni/features/fishing/TrophyFishInfo.kt new file mode 100644 index 000000000..104a71a07 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/fishing/TrophyFishInfo.kt @@ -0,0 +1,48 @@ +package at.hannibal2.skyhanni.features.fishing + +import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators +import at.hannibal2.skyhanni.utils.StringUtils.splitLines +import com.google.gson.annotations.Expose +import net.minecraft.event.HoverEvent +import net.minecraft.util.ChatComponentText +import net.minecraft.util.ChatStyle + +data class TrophyFishInfo( + @Expose + val displayName: String, + @Expose + private val description: String, + @Expose + private val rate: Int?, + @Expose + private val fillet: Map<TrophyRarity, Int> +) { + + // Credit to NotEnoughUpdates (Trophy Fish profile viewer page) for the format. + fun getTooltip(counts: Map<TrophyRarity, Int>): ChatStyle { + val bestFishObtained = counts.keys.maxOrNull() ?: TrophyRarity.BRONZE + val display = """ + |$displayName §8[§7$rate%§8] + |${description.splitLines(150)} + | + |${TrophyRarity.DIAMOND.formattedString}: ${formatCount(counts, TrophyRarity.DIAMOND)} + |${TrophyRarity.GOLD.formattedString}: ${formatCount(counts, TrophyRarity.GOLD)} + |${TrophyRarity.SILVER.formattedString}: ${formatCount(counts, TrophyRarity.SILVER)} + |${TrophyRarity.BRONZE.formattedString}: ${formatCount(counts, TrophyRarity.BRONZE)} + | + |§7Total: ${bestFishObtained.formatCode}${counts.values.sum().addSeparators()} + """.trimMargin() + return ChatStyle().setChatHoverEvent( + HoverEvent(HoverEvent.Action.SHOW_TEXT, ChatComponentText(display)) + ) + } + + fun getFilletValue(rarity: TrophyRarity): Int { + return fillet.getOrDefault(rarity, -1) + } + + private fun formatCount(counts: Map<TrophyRarity, Int>, rarity: TrophyRarity): String { + val count = counts.getOrDefault(rarity, 0) + return if (count > 0) "§6${count.addSeparators()}" else "§c✖" + } +}
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/fishing/TrophyFishManager.kt b/src/main/java/at/hannibal2/skyhanni/features/fishing/TrophyFishManager.kt new file mode 100644 index 000000000..df8c95d57 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/fishing/TrophyFishManager.kt @@ -0,0 +1,62 @@ +package at.hannibal2.skyhanni.features.fishing + +import at.hannibal2.skyhanni.data.ProfileStorageData +import at.hannibal2.skyhanni.events.ProfileApiDataLoadedEvent +import at.hannibal2.skyhanni.events.ProfileJoinEvent +import at.hannibal2.skyhanni.events.RepositoryReloadEvent +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.jsonobjects.TrophyFishJson +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent + + +class TrophyFishManager { + + @SubscribeEvent + fun onProfileJoin(event: ProfileJoinEvent) { + hasLoadedTrophyFish = false + } + + @SubscribeEvent + fun onProfileDataLoad(event: ProfileApiDataLoadedEvent) { + if (hasLoadedTrophyFish) return + val trophyFishes = fishes ?: return + val profileData = event.profileData + trophyFishes.clear() + for ((rawName, value) in profileData["trophy_fish"].asJsonObject.entrySet()) { + val rarity = TrophyRarity.getByName(rawName) ?: continue + val text = rawName.replace("_", "") + val displayName = text.substring(0, text.length - rarity.name.length) + + val amount = value.asInt + val rarities = trophyFishes.getOrPut(displayName) { mutableMapOf() } + rarities[rarity] = amount + hasLoadedTrophyFish = true + } + } + + @SubscribeEvent + fun onRepoReload(event: RepositoryReloadEvent) { + try { + val json = event.getConstant<TrophyFishJson>("TrophyFish") + ?: error("Could not read repo data from TrophyFish.json") + trophyFishInfo = json.trophy_fish + LorenzUtils.debug("Loaded trophy fish from repo") + } catch (e: Exception) { + e.printStackTrace() + LorenzUtils.error("error in RepositoryReloadEvent") + } + } + + companion object { + private var hasLoadedTrophyFish = false + + val fishes: MutableMap<String, MutableMap<TrophyRarity, Int>>? + get() = ProfileStorageData.profileSpecific?.crimsonIsle?.trophyFishes + + private var trophyFishInfo = mapOf<String, TrophyFishInfo>() + + fun getInfo(internalName: String) = trophyFishInfo[internalName] + + fun getInfoByName(name: String) = trophyFishInfo.values.find { it.displayName == name } + } +}
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/fishing/TrophyFishMessages.kt b/src/main/java/at/hannibal2/skyhanni/features/fishing/TrophyFishMessages.kt index bdefdebf6..b655c9893 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/fishing/TrophyFishMessages.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/fishing/TrophyFishMessages.kt @@ -1,10 +1,8 @@ package at.hannibal2.skyhanni.features.fishing import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.data.ProfileStorageData import at.hannibal2.skyhanni.events.LorenzChatEvent -import at.hannibal2.skyhanni.events.ProfileApiDataLoadedEvent -import at.hannibal2.skyhanni.events.ProfileJoinEvent +import at.hannibal2.skyhanni.features.fishing.TrophyFishManager.Companion.fishes import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.addOrPut import at.hannibal2.skyhanni.utils.LorenzUtils.sumAllValues @@ -16,54 +14,29 @@ import net.minecraft.util.ChatComponentText import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class TrophyFishMessages { - private var hasLoadedTrophyFish = false - private val fishes get() = ProfileStorageData.profileSpecific?.crimsonIsle?.trophyFishes private val trophyFishPattern = Regex("§6§lTROPHY FISH! §r§bYou caught an? §r(?<displayName>§[0-9a-f](?:§k)?[\\w -]+)§r§r§r §r§l§r(?<displayRarity>§[0-9a-f]§l\\w+)§r§b\\.") private val config get() = SkyHanniMod.feature.fishing @SubscribeEvent - fun onProfileJoin(event: ProfileJoinEvent) { - hasLoadedTrophyFish = false - } - - @SubscribeEvent - fun onProfileDataLoad(event: ProfileApiDataLoadedEvent) { - if (hasLoadedTrophyFish) return - val trophyFishes = fishes ?: return - val profileData = event.profileData - trophyFishes.clear() - for ((rawName, value) in profileData["trophy_fish"].asJsonObject.entrySet()) { - val rarity = getByName(rawName) ?: continue - val text = rawName.replace("_", "") - val displayName = text.substring(0, text.length - rarity.name.length) - - val amount = value.asInt - val rarities = trophyFishes.getOrPut(displayName) { mutableMapOf() } - rarities[rarity] = amount - hasLoadedTrophyFish = true - } - } - - @SubscribeEvent fun onStatusBar(event: LorenzChatEvent) { - if (!LorenzUtils.inSkyBlock || !config.trophyCounter) return + if (!LorenzUtils.inSkyBlock) return val match = trophyFishPattern.matchEntire(event.message)?.groups ?: return val displayName = match["displayName"]!!.value.replace("§k", "") val displayRarity = match["displayRarity"]!!.value - val fishName = displayName.replace("Obfuscated", "Obfuscated Fish") + val internalName = displayName.replace("Obfuscated", "Obfuscated Fish") .replace("[- ]".toRegex(), "").lowercase().removeColor() val rawRarity = displayRarity.lowercase().removeColor() - val rarity = getByName(rawRarity) ?: return + val rarity = TrophyRarity.getByName(rawRarity) ?: return val trophyFishes = fishes ?: return - val rarities = trophyFishes.getOrPut(fishName) { mutableMapOf() } - val amount = rarities.addOrPut(rarity, 1) + val trophyFishCounts = trophyFishes.getOrPut(internalName) { mutableMapOf() } + val amount = trophyFishCounts.addOrPut(rarity, 1) event.blockedReason = "trophy_fish" - if (config.trophyDesign == 0 && amount == 1) { + if (config.trophyCounter && config.trophyDesign == 0 && amount == 1) { LorenzUtils.chat("§6§lTROPHY FISH! §c§lFIRST §r$displayRarity $displayName") return } @@ -71,23 +44,26 @@ class TrophyFishMessages { if (config.trophyFishBronzeHider && rarity == TrophyRarity.BRONZE && amount != 1) return if (config.trophyFishSilverHider && rarity == TrophyRarity.SILVER && amount != 1) return val totalText = if (config.trophyFishTotalAmount) { - val total = rarities.sumAllValues() + val total = trophyFishCounts.sumAllValues() " §7(${total.addSeparators()}. total)" } else "" - val trophyMessage = "§6§lTROPHY FISH! " + when (config.trophyDesign) { - 0 -> "§7$amount. §r$displayRarity $displayName$totalText" - 1 -> "§bYou caught a $displayName $displayRarity§b. §7(${amount.addSeparators()})$totalText" - else -> "§bYou caught your ${amount.addSeparators()}${amount.ordinal()} $displayRarity $displayName§b.$totalText" + val component = ChatComponentText(if (config.trophyCounter) { + "§6§lTROPHY FISH! " + when (config.trophyDesign) { + 0 -> "§7$amount. §r$displayRarity $displayName$totalText" + 1 -> "§bYou caught a $displayName $displayRarity§b. §7(${amount.addSeparators()})$totalText" + else -> "§bYou caught your ${amount.addSeparators()}${amount.ordinal()} $displayRarity $displayName§b.$totalText" + } + } else event.message) + + if (config.trophyFishTooltip) { + TrophyFishManager.getInfo(internalName)?.let { + component.chatStyle = it.getTooltip(trophyFishCounts) + } } Minecraft.getMinecraft().ingameGUI.chatGUI.printChatMessageWithOptionalDeletion( - ChatComponentText(trophyMessage), - if (config.trophyFishDuplicateHider) (fishName + rarity).hashCode() else 0 + component, if (config.trophyFishDuplicateHider) (internalName + rarity).hashCode() else 0 ) } - - fun getByName(rawName: String) = TrophyRarity.values().firstOrNull { rawName.uppercase().endsWith(it.name) } - - data class TrophyFish(val rarities: MutableMap<TrophyRarity, Int> = mutableMapOf()) } diff --git a/src/main/java/at/hannibal2/skyhanni/features/fishing/TrophyRarity.kt b/src/main/java/at/hannibal2/skyhanni/features/fishing/TrophyRarity.kt index b87d3d60e..d4df5f2eb 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/fishing/TrophyRarity.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/fishing/TrophyRarity.kt @@ -1,5 +1,16 @@ package at.hannibal2.skyhanni.features.fishing -enum class TrophyRarity { - BRONZE, SILVER, GOLD, DIAMOND; +import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase + +enum class TrophyRarity(val formatCode: String) { + BRONZE("§8"), + SILVER("§7"), + GOLD("§6"), + DIAMOND("§b"); + + val formattedString get() = "$formatCode${name.firstLetterUppercase()}" + + companion object { + fun getByName(rawName: String) = values().firstOrNull { rawName.uppercase().endsWith(it.name) } + } }
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/inventory/SackDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/inventory/SackDisplay.kt index 5f66d3ea6..346e51c93 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/inventory/SackDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/inventory/SackDisplay.kt @@ -5,6 +5,7 @@ import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.events.InventoryCloseEvent import at.hannibal2.skyhanni.events.InventoryOpenEvent import at.hannibal2.skyhanni.features.bazaar.BazaarApi +import at.hannibal2.skyhanni.features.fishing.TrophyFishManager import at.hannibal2.skyhanni.features.fishing.TrophyRarity import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName import at.hannibal2.skyhanni.utils.ItemUtils.getLore @@ -124,8 +125,11 @@ class SackDisplay { item.stored = stored item.total = total if (isTrophySack) { - val trophyName = name.removeColor().uppercase().replace(" ", "_").replace("-", "_") - item.price = calculatePrice("MAGMA_FISH", Trophy.valueOf(trophyName).convert(sackRarity, stored)) + val trophyName = internalName.lowercase() + .substringBeforeLast("_").replace("_", "") + val filletValue = TrophyFishManager.getInfoByName(trophyName)?.getFilletValue(sackRarity!!) ?: 0 + val storedNumber = stored.formatNumber().toInt() + item.price = calculatePrice("MAGMA_FISH", (filletValue * storedNumber).toString()) } else { item.price = if (calculatePrice(internalName, stored) < 0) 0 else calculatePrice(internalName, stored) } @@ -327,35 +331,6 @@ class SackDisplay { var price: Int = 0, ) - enum class Trophy(private val bronzeValue: Int, private val silverValue: Int) { - BLOBFISH(4, 5), - FLYFISH(32, 48), - GOLDEN_FISH(400, 700), - GUSHER(32, 48), - KARATE_FISH(40, 60), - LAVAHORSE(12, 16), - MANA_RAY(40, 60), - MOLDFIN(32, 48), - SKELETON_FISH(32, 48), - SLUGFISH(40, 60), - SOUL_FISH(32, 48), - STEAMING_HOT_FLOUNDER(20, 28), - SULPHUR_SKITTER(40, 60), - VANILLE(80, 120), - VOLCANIC_STONEFISH(20, 28), - OBFUSCATED_1(16, 24), - OBFUSCATED_2(40, 60), - OBFUSCATED_3(400, 700); - - fun convert(rarity: TrophyRarity?, stored: String): String { - return when (rarity) { - TrophyRarity.BRONZE -> (this.bronzeValue * stored.formatNumber().toInt()).toString() - TrophyRarity.SILVER -> (this.silverValue * stored.formatNumber().toInt()).toString() - else -> "0" - } - } - } - private fun isEnabled() = LorenzUtils.inSkyBlock && config.enabled private fun isRuneDisplayEnabled() = config.showRunes diff --git a/src/main/java/at/hannibal2/skyhanni/utils/StringUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/StringUtils.kt index 917ec5c88..aaff447a9 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/StringUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/StringUtils.kt @@ -2,6 +2,8 @@ package at.hannibal2.skyhanni.utils import at.hannibal2.skyhanni.utils.GuiRenderUtils.darkenColor import net.minecraft.client.Minecraft +import net.minecraft.client.gui.GuiUtilRenderComponents +import net.minecraft.util.ChatComponentText import org.intellij.lang.annotations.Language import java.util.* import java.util.regex.Matcher @@ -106,5 +108,21 @@ object StringUtils { } } + + fun String.removeWordsAtEnd(i: Int) = split(" ").dropLast(i).joinToString(" ") + + fun String.splitLines(width: Int): String { + val fr = Minecraft.getMinecraft().fontRendererObj + return GuiUtilRenderComponents.splitText( + ChatComponentText(this), width, fr, false, false + ).joinToString("\n") { + val text = it.formattedText + val formatCode = Regex("(?:§[a-f0-9l-or]|\\s)*") + formatCode.matchAt(text, 0)?.let { matcher -> + val codes = matcher.value.replace("\\s".toRegex(), "") + codes + text.removeRange(matcher.range) + } ?: text + } + } }
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TrophyFishJson.java b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TrophyFishJson.java new file mode 100644 index 000000000..48d0908a9 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/jsonobjects/TrophyFishJson.java @@ -0,0 +1,11 @@ +package at.hannibal2.skyhanni.utils.jsonobjects; + +import at.hannibal2.skyhanni.features.fishing.TrophyFishInfo; +import com.google.gson.annotations.Expose; + +import java.util.Map; + +public class TrophyFishJson { + @Expose + public Map<String, TrophyFishInfo> trophy_fish; +} |