diff options
author | hannibal2 <24389977+hannibal00212@users.noreply.github.com> | 2023-09-30 11:50:19 +0200 |
---|---|---|
committer | hannibal2 <24389977+hannibal00212@users.noreply.github.com> | 2023-09-30 11:50:19 +0200 |
commit | 6a353ffab19c25eed64d36eee32be5bfa1fd4aa9 (patch) | |
tree | d841592fce26eaa9f97ca4ce8a670d777ece5c01 | |
parent | 044e8574a0f32cb739f94eb2abaf92782c860305 (diff) | |
download | skyhanni-6a353ffab19c25eed64d36eee32be5bfa1fd4aa9.tar.gz skyhanni-6a353ffab19c25eed64d36eee32be5bfa1fd4aa9.tar.bz2 skyhanni-6a353ffab19c25eed64d36eee32be5bfa1fd4aa9.zip |
made visitor rewards use internal name logic of GardenVisitorFeatures, fetching the item rewards off the item lore at opening the inventory once, and caching the item lore for performance.
4 files changed, 101 insertions, 65 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/events/VisitorAcceptEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/VisitorAcceptEvent.kt new file mode 100644 index 000000000..620694a22 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/events/VisitorAcceptEvent.kt @@ -0,0 +1,5 @@ +package at.hannibal2.skyhanni.events + +import at.hannibal2.skyhanni.features.garden.visitor.GardenVisitorFeatures + +class VisitorAcceptEvent(val visitor: GardenVisitorFeatures.Visitor) : LorenzEvent()
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorDropStatistics.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorDropStatistics.kt index fa828003d..0cb9588e3 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorDropStatistics.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorDropStatistics.kt @@ -7,11 +7,12 @@ import at.hannibal2.skyhanni.events.ConfigLoadEvent import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.events.LorenzChatEvent import at.hannibal2.skyhanni.events.PreProfileSwitchEvent +import at.hannibal2.skyhanni.events.VisitorAcceptEvent import at.hannibal2.skyhanni.features.garden.GardenAPI import at.hannibal2.skyhanni.test.command.CopyErrorCommand import at.hannibal2.skyhanni.utils.LorenzUtils.addAsSingletonList +import at.hannibal2.skyhanni.utils.LorenzUtils.addOrPut import at.hannibal2.skyhanni.utils.LorenzUtils.editCopy -import at.hannibal2.skyhanni.utils.NEUItems import at.hannibal2.skyhanni.utils.NumberUtil import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators import at.hannibal2.skyhanni.utils.NumberUtil.formatNumber @@ -55,6 +56,18 @@ object GardenVisitorDropStatistics { } @SubscribeEvent + fun onVisitorAccept(event: VisitorAcceptEvent) { + if (!GardenAPI.onBarnPlot) return + if (!ProfileStorageData.loaded) return + + for (internalName in event.visitor.allRewards) { + val reward = VisitorReward.getByInternalName(internalName) ?: continue + rewardsCount = rewardsCount.editCopy { addOrPut(reward, 1) } + saveAndUpdate() + } + } + + @SubscribeEvent fun onChat(event: LorenzChatEvent) { if (!GardenAPI.onBarnPlot) return if (!ProfileStorageData.loaded) return @@ -97,14 +110,6 @@ object GardenVisitorDropStatistics { setRarities(group("rarity")) saveAndUpdate() } - - for (reward in VisitorReward.entries) { - reward.pattern.matchMatcher(message) { - val old = rewardsCount[reward] ?: 0 - rewardsCount = rewardsCount.editCopy { this[reward] = old + 1 } - saveAndUpdate() - } - } } } @@ -131,7 +136,10 @@ object GardenVisitorDropStatistics { ) } else { addAsSingletonList("§c?") - CopyErrorCommand.logError(RuntimeException("visitorRarities is empty, maybe visitor refusing was the cause?"), "Error rendering visitor drop statistics") + CopyErrorCommand.logError( + RuntimeException("visitorRarities is empty, maybe visitor refusing was the cause?"), + "Error rendering visitor drop statistics" + ) } //3 addAsSingletonList(format(acceptedVisitors, "Accepted", "§2", "")) @@ -150,7 +158,7 @@ object GardenVisitorDropStatistics { for (reward in VisitorReward.entries) { val count = rewardsCount[reward] ?: 0 if (config.displayIcons) {// Icons - val stack = NEUItems.getItemStack(reward.internalName, true) + val stack = reward.itemStack if (config.displayNumbersFirst) add(listOf("§b${count.addSeparators()} ", stack)) else add(listOf(stack, " §b${count.addSeparators()}")) diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorFeatures.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorFeatures.kt index b618c1937..1b139190e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorFeatures.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorFeatures.kt @@ -14,6 +14,7 @@ import at.hannibal2.skyhanni.events.PacketEvent import at.hannibal2.skyhanni.events.PreProfileSwitchEvent import at.hannibal2.skyhanni.events.TabListLineRenderEvent import at.hannibal2.skyhanni.events.TabListUpdateEvent +import at.hannibal2.skyhanni.events.VisitorAcceptEvent import at.hannibal2.skyhanni.events.VisitorArrivalEvent import at.hannibal2.skyhanni.events.withAlpha import at.hannibal2.skyhanni.features.bazaar.BazaarApi @@ -84,7 +85,6 @@ class GardenVisitorFeatures { private val logger = LorenzLogger("garden/visitors") private var lastFullPrice = 0.0 - private val offerCache = mutableListOf<String>() companion object { var inVisitorInventory = false @@ -138,16 +138,7 @@ class GardenVisitorFeatures { val internalName = NEUInternalName.fromItemName(itemName) visitor.items[internalName] = amount } - - readReward(offerItem)?.let { reward -> - if (visitor.reward == reward) return@let - visitor.reward = reward - visitor.hasReward()?.let { - if (config.visitorRewardWarning.notifyInChat) { - LorenzUtils.chat("§e[SkyHanni] Found Visitor Reward ${it.displayName}§e!") - } - } - } + readToolTip(visitor, event.inventoryItems[29]) if (visitor.status == VisitorStatus.NEW) { val alreadyReady = event.inventoryItems[29]?.getLore()?.any { it == "§eClick to give!" } == true @@ -340,6 +331,7 @@ class GardenVisitorFeatures { } if (event.slotId == 29 && event.slot.stack?.getLore()?.any { it == "§eClick to give!" } == true) { changeStatus(visitor, VisitorStatus.ACCEPTED, "accepted") + acceptVisitor(visitor) update() GardenVisitorDropStatistics.coinsSpent += round(lastFullPrice).toLong() GardenVisitorDropStatistics.lastAccept = System.currentTimeMillis() @@ -347,6 +339,10 @@ class GardenVisitorFeatures { } } + private fun acceptVisitor(visitor: Visitor) { + VisitorAcceptEvent(visitor).postAndCatch() + } + private fun getVisitor(id: Int) = visitors.map { it.value }.find { it.entityId == id } @SubscribeEvent @@ -391,32 +387,24 @@ class GardenVisitorFeatures { if (!inVisitorInventory) return if (event.itemStack.name != "§aAccept Offer") return - if (offerCache.isEmpty()) { - drawToolTip(event.toolTip) - val temp = event.toolTip.listIterator() - for (line in temp) { - offerCache.add(line) - } - } else { - val iterator = event.toolTip.listIterator() - for (i in iterator) { - iterator.remove() - } - for (line in offerCache) { - iterator.add(line) - } + val visitor = getVisitor(lastClickedNpc) ?: return + + event.toolTip.let { + it.clear() + it.addAll(visitor.lastLore) } } - private fun drawToolTip(list: MutableList<String>) { - + private fun readToolTip(visitor: Visitor, itemStack: ItemStack?) { + println("readToolTip") + val stack = itemStack ?: error("Accept offer item not found for visitor ${visitor.visitorName}") var totalPrice = 0.0 var timeRequired = -1L var readingItemsNeeded = true lastFullPrice = 0.0 + val foundRewards = mutableListOf<NEUInternalName>() - for (line in list) { - val formattedLine = line.substring(4) + for (formattedLine in stack.getLore()) { if (formattedLine.contains("Rewards")) { readingItemsNeeded = false } @@ -429,6 +417,7 @@ class GardenVisitorFeatures { totalPrice += price lastFullPrice += price } else { + foundRewards.add(internalName) totalPrice -= price } } @@ -436,16 +425,28 @@ class GardenVisitorFeatures { totalPrice = 0.0 } - readingItemsNeeded = true - val iterator = list.listIterator() - for (line in iterator) { - val formattedLine = line.substring(4) + if (foundRewards.isNotEmpty()) { + val wasEmpty = visitor.allRewards.isEmpty() + visitor.allRewards = foundRewards + if (wasEmpty) { + visitor.hasReward()?.let { reward -> + if (config.visitorRewardWarning.notifyInChat) { + LorenzUtils.chat("§e[SkyHanni] Found Visitor Reward ${reward.displayName}§e!") + } + } + } + } + readingItemsNeeded = true + val finalList = stack.getLore().toMutableList() + var offset = 0 + for ((i, formattedLine) in finalList.toMutableList().withIndex()) { + val index = i + offset if (config.visitorExperiencePrice) { gardenExperiencePattern.matchMatcher(formattedLine) { val gardenExp = group("amount").replace(",", "").toInt() val pricePerCopper = NumberUtil.format((totalPrice / gardenExp).toInt()) - iterator.set("$formattedLine §7(§6$pricePerCopper §7per)") + finalList.set(index, "$formattedLine §7(§6$pricePerCopper §7per)") } } @@ -458,7 +459,7 @@ class GardenVisitorFeatures { if (config.visitorCopperTime) { copperLine += if (timeRequired != -1L) " §7(§b$timePerCopper §7per)" else " §7(§cno speed data!§7)" } - iterator.set(copperLine) + finalList.set(index, copperLine) } if (formattedLine.contains("Rewards")) { @@ -471,7 +472,7 @@ class GardenVisitorFeatures { if (config.visitorShowPrice) { val format = NumberUtil.format(price) - iterator.set("$formattedLine §7(§6$format§7)") + finalList[index] = "$formattedLine §7(§6$format§7)" } if (!readingItemsNeeded) continue val multiplier = NEUItems.getMultiplier(internalName) @@ -488,9 +489,11 @@ class GardenVisitorFeatures { "in §b$duration" } ?: "§cno speed data!" if (config.visitorExactAmountAndTime) { - iterator.add("§7- $formattedName($formattedSpeed§7)") + finalList.add(index + 1, "§7- $formattedName($formattedSpeed§7)") + offset++ } } + visitor.lastLore = finalList } @SubscribeEvent @@ -507,7 +510,6 @@ class GardenVisitorFeatures { @SubscribeEvent fun onInventoryClose(event: InventoryCloseEvent) { inVisitorInventory = false - offerCache.clear() } @SubscribeEvent @@ -624,7 +626,7 @@ class GardenVisitorFeatures { } if (GardenAPI.inGarden() && config.visitorHideChat && hideVisitorMessage(event.message)) { - event.blockedReason = "garden_visitor_message" + event.blockedReason = "garden_visitor_message" } } @@ -794,14 +796,26 @@ class GardenVisitorFeatures { var nameTagEntityId: Int = -1, var status: VisitorStatus, var inSacks: Boolean = false, - var reward: VisitorReward? = null, val items: MutableMap<NEUInternalName, Int> = mutableMapOf(), ) { + + var allRewards = listOf<NEUInternalName>() + var lastLore = listOf<String>() fun getEntity(): Entity? = Minecraft.getMinecraft().theWorld.getEntityByID(entityId) fun getNameTagEntity(): Entity? = Minecraft.getMinecraft().theWorld.getEntityByID(nameTagEntityId) - fun hasReward() = reward?.let { if (config.visitorRewardWarning.drops.contains(it.ordinal)) it else null } + fun hasReward(): VisitorReward? { + for (internalName in allRewards) { + val reward = VisitorReward.getByInternalName(internalName) ?: continue + + if (config.visitorRewardWarning.drops.contains(reward.ordinal)) { + return reward + } + } + + return null + } } enum class VisitorStatus(val displayName: String, val color: Int) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/VisitorReward.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/VisitorReward.kt index 81419939b..d21ffebe7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/VisitorReward.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/VisitorReward.kt @@ -1,17 +1,26 @@ package at.hannibal2.skyhanni.features.garden.visitor -import java.util.regex.Pattern +import at.hannibal2.skyhanni.utils.ItemUtils.nameWithEnchantment +import at.hannibal2.skyhanni.utils.NEUInternalName +import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName +import at.hannibal2.skyhanni.utils.NEUItems.getItemStack -enum class VisitorReward(val displayName: String, val internalName: String, val pattern: Pattern) { - FLOWERING_BOUQUET("§9Flowering Bouquet", "FLOWERING_BOUQUET", "Flowering Bouquet".toPattern()), - OVERGROWN_GRASS("§9Overgrown Grass", "OVERGROWN_GRASS", "Overgrown Grass".toPattern()), - GREEN_BANDANA("§9Green Bandana", "GREEN_BANDANA", "Green Bandana".toPattern()), - DEDICATION("§9Dedication IV", "DEDICATION;4", "Dedication (IV|4) Book".toPattern()), - MUSIC_RUNE("§9Music Rune", "MUSIC_RUNE;1", "◆ Music Rune [1I]".toPattern()), - SPACE_HELMET("§cSpace Helmet", "DCTR_SPACE_HELM", "Space Helmet".toPattern()), - CULTIVATING( - "§9Cultivating I", "CULTIVATING;1", - "Cultivating ([I1]) Book".toPattern() - ), - REPLENISH("§9Replenish I", "REPLENISH;1", "Replenish ([I1]) Book".toPattern()), +enum class VisitorReward(private val rawInternalName: String) { + FLOWERING_BOUQUET("FLOWERING_BOUQUET"), + OVERGROWN_GRASS("OVERGROWN_GRASS"), + GREEN_BANDANA("GREEN_BANDANA"), + DEDICATION("DEDICATION;4"), + MUSIC_RUNE("MUSIC_RUNE;1"), + SPACE_HELMET("DCTR_SPACE_HELM"), + CULTIVATING("CULTIVATING;1"), + REPLENISH("REPLENISH;1"), + ; + + private val internalName by lazy { rawInternalName.asInternalName() } + val itemStack by lazy { internalName.getItemStack() } + val displayName by lazy { itemStack.nameWithEnchantment ?: internalName.toString() } + + companion object { + fun getByInternalName(internalName: NEUInternalName) = entries.firstOrNull { it.internalName == internalName } + } }
\ No newline at end of file |