aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/features
diff options
context:
space:
mode:
authorhannibal2 <24389977+hannibal00212@users.noreply.github.com>2023-09-30 11:50:19 +0200
committerhannibal2 <24389977+hannibal00212@users.noreply.github.com>2023-09-30 11:50:19 +0200
commit6a353ffab19c25eed64d36eee32be5bfa1fd4aa9 (patch)
treed841592fce26eaa9f97ca4ce8a670d777ece5c01 /src/main/java/at/hannibal2/skyhanni/features
parent044e8574a0f32cb739f94eb2abaf92782c860305 (diff)
downloadskyhanni-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.
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/features')
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorDropStatistics.kt30
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorFeatures.kt96
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/garden/visitor/VisitorReward.kt35
3 files changed, 96 insertions, 65 deletions
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