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: Experiments Profit Tracker bottle counting + edit tracker #2594

Merged
merged 8 commits into from
Sep 29, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,17 @@ object ExperimentationTableAPI {
/**
* REGEX-TEST: Titanic Experience Bottle
*/
val experienceBottleChatPattern by patternGroup.pattern(
"chat.xpbottle",
"(?:Colossal |Titanic |Grand |\\b)Experience Bottle",
)

/**
* REGEX-TEST: TITANIC_EXP_BOTTLE
*/
val experienceBottlePattern by patternGroup.pattern(
"xpbottle",
"(?:Titanic |Grand |\\b)Experience Bottle",
"(?:COLOSSAL_|TITANIC_|GRAND_|\\b)EXP_BOTTLE",
)

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,18 @@ package at.hannibal2.skyhanni.features.inventory.experimentationtable
import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.data.ClickType
import at.hannibal2.skyhanni.data.IslandType
import at.hannibal2.skyhanni.data.ItemAddManager
import at.hannibal2.skyhanni.events.GuiContainerEvent
import at.hannibal2.skyhanni.events.GuiRenderEvent
import at.hannibal2.skyhanni.events.InventoryCloseEvent
import at.hannibal2.skyhanni.events.InventoryUpdatedEvent
import at.hannibal2.skyhanni.events.IslandChangeEvent
import at.hannibal2.skyhanni.events.ItemAddEvent
import at.hannibal2.skyhanni.events.ItemClickEvent
import at.hannibal2.skyhanni.events.LorenzChatEvent
import at.hannibal2.skyhanni.features.inventory.experimentationtable.ExperimentationTableAPI.claimMessagePattern
import at.hannibal2.skyhanni.features.inventory.experimentationtable.ExperimentationTableAPI.enchantingExpPattern
import at.hannibal2.skyhanni.features.inventory.experimentationtable.ExperimentationTableAPI.experienceBottleChatPattern
import at.hannibal2.skyhanni.features.inventory.experimentationtable.ExperimentationTableAPI.experienceBottlePattern
import at.hannibal2.skyhanni.features.inventory.experimentationtable.ExperimentationTableAPI.experimentRenewPattern
import at.hannibal2.skyhanni.features.inventory.experimentationtable.ExperimentationTableAPI.experimentsDropPattern
Expand All @@ -28,7 +32,6 @@ import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.LorenzVec
import at.hannibal2.skyhanni.utils.NEUInternalName
import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators
import at.hannibal2.skyhanni.utils.NumberUtil.roundTo
import at.hannibal2.skyhanni.utils.NumberUtil.shortFormat
import at.hannibal2.skyhanni.utils.RegexUtils.matchMatcher
import at.hannibal2.skyhanni.utils.RegexUtils.matches
Expand Down Expand Up @@ -56,7 +59,7 @@ object ExperimentsProfitTracker {
{ it.experimentation.experimentsProfitTracker },
) { drawDisplay(it) }

private var lastSplashes = mutableListOf<ItemStack>()
private val lastSplashes = mutableListOf<ItemStack>()
private var lastSplashTime = SimpleTimeMark.farPast()
private var lastBottlesInInventory = mutableMapOf<NEUInternalName, Int>()
private var currentBottlesInInventory = mutableMapOf<NEUInternalName, Int>()
Expand Down Expand Up @@ -95,6 +98,13 @@ object ExperimentsProfitTracker {
var startCost = 0L
}

@SubscribeEvent
fun onItemAdd(event: ItemAddEvent) {
if (!isEnabled() || event.source != ItemAddManager.Source.COMMAND) return

tracker.addItem(event.internalName, event.amount, command = true)
}

@SubscribeEvent
fun onChat(event: LorenzChatEvent) {
if (!isEnabled()) return
Expand All @@ -120,7 +130,7 @@ object ExperimentsProfitTracker {
private fun LorenzChatEvent.handleDrop(reward: String) {
blockedReason = when {
enchantingExpPattern.matches(reward) && ExperimentMessages.EXPERIENCE.isSelected() -> "EXPERIENCE_DROP"
experienceBottlePattern.matches(reward) && ExperimentMessages.BOTTLES.isSelected() -> "BOTTLE_DROP"
experienceBottleChatPattern.matches(reward) && ExperimentMessages.BOTTLES.isSelected() -> "BOTTLE_DROP"
listOf("Metaphysical Serum", "Experiment The Fish").contains(reward) && ExperimentMessages.MISC.isSelected() -> "MISC_DROP"
ExperimentMessages.ENCHANTMENTS.isSelected() -> "ENCHANT_DROP"
else -> ""
Expand All @@ -134,37 +144,49 @@ object ExperimentsProfitTracker {
}

val internalName = NEUInternalName.fromItemNameOrNull(reward) ?: return
if (!experienceBottlePattern.matches(reward)) tracker.addItem(internalName, 1, false)
if (!experienceBottleChatPattern.matches(reward)) tracker.addItem(internalName, 1, false)
else DelayedRun.runDelayed(100.milliseconds) { handleExpBottles(true) }
}

@SubscribeEvent
fun onSlotClick(event: GuiContainerEvent.SlotClickEvent) {
if (!isEnabled() ||
InventoryUtils.openInventoryName() != "Bottles of Enchanting" ||
!listOf(11, 12, 14, 15).contains(event.slotId)
) return
val stack = event.slot?.stack ?: return

val internalName = stack.getInternalName()
if (internalName.isExpBottle()) {
tracker.modify {
it.startCost -= calculateBottlePrice(internalName)
}
}
}

@SubscribeEvent
fun onItemClick(event: ItemClickEvent) {
if (event.clickType == ClickType.RIGHT_CLICK) {
if (isEnabled() && event.clickType == ClickType.RIGHT_CLICK) {
val item = event.itemInHand ?: return
if (experienceBottlePattern.matches(item.displayName.removeColor())) {
if (item.getInternalName().isExpBottle()) {
lastSplashTime = SimpleTimeMark.now()
lastSplashes.add(item)
}
}
}

private fun NEUInternalName.isExpBottle() = experienceBottlePattern.matches(asString())

@SubscribeEvent
fun onInventoryUpdated(event: InventoryUpdatedEvent) {
if (!isEnabled()) return

if (inventoriesPattern.matches(event.inventoryName)) {
var startCostTemp = 0
val iterator = lastSplashes.iterator()
while (iterator.hasNext()) {
val item = iterator.next()
val internalName = item.getInternalName()
val price = internalName.getPrice()
val npcPrice = internalName.getNpcPriceOrNull() ?: 0.0
val maxPrice = npcPrice.coerceAtLeast(price)
startCostTemp += maxPrice.roundTo(0).toInt()
iterator.remove()
for (item in lastSplashes) {
startCostTemp += calculateBottlePrice(item.getInternalName())
}
lastSplashes.clear()
tracker.modify {
it.startCost -= startCostTemp
}
Expand All @@ -174,6 +196,13 @@ object ExperimentsProfitTracker {
handleExpBottles(false)
}

private fun calculateBottlePrice(internalName: NEUInternalName): Int {
val price = internalName.getPrice()
val npcPrice = internalName.getNpcPriceOrNull() ?: 0.0
val maxPrice = npcPrice.coerceAtLeast(price)
return maxPrice.toInt()
}

@SubscribeEvent
fun onInventoryClose(event: InventoryCloseEvent) {
if (!isEnabled()) return
Expand Down
Loading