aboutsummaryrefslogtreecommitdiff
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
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.
-rw-r--r--src/main/java/at/hannibal2/skyhanni/events/VisitorAcceptEvent.kt5
-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
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