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

Improvement: Add ability to use /shedittracker with CorpseTracker #2582

Closed
Closed
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ package at.hannibal2.skyhanni.features.mining.glacitemineshaft

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.data.IslandType
import at.hannibal2.skyhanni.data.ItemAddManager
import at.hannibal2.skyhanni.data.MiningAPI
import at.hannibal2.skyhanni.events.GuiRenderEvent
import at.hannibal2.skyhanni.events.IslandChangeEvent
import at.hannibal2.skyhanni.events.ItemAddEvent
import at.hannibal2.skyhanni.events.mining.CorpseLootedEvent
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import at.hannibal2.skyhanni.utils.CollectionUtils.addOrPut
Expand Down Expand Up @@ -136,10 +138,17 @@ object CorpseTracker {
}
}

@SubscribeEvent
fun onItemAdd(event: ItemAddEvent) {
if (!isEnabled() || event.source != ItemAddManager.Source.COMMAND) return
tracker.addItemToSelectedBucket(event.internalName, event.amount, command = true)
}

fun resetCommand() {
tracker.resetCommand()
}

fun isEnabled() =
LorenzUtils.inSkyBlock && config.enabled && (IslandType.MINESHAFT.isInIsland() || (!config.onlyInMineshaft && MiningAPI.inGlacialTunnels()))
fun isEnabled() = LorenzUtils.inSkyBlock &&
config.enabled &&
(IslandType.MINESHAFT.isInIsland() || (!config.onlyInMineshaft && MiningAPI.inGlacialTunnels()))
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ abstract class BucketedItemTrackerData<E : Enum<E>> : TrackerData() {
resetItems()
}

fun addItem(internalName: NEUInternalName, stackSize: Int): Boolean = selectedBucket?.let {
addItem(it, internalName, stackSize)
true
} ?: false

fun addItem(bucket: E, internalName: NEUInternalName, stackSize: Int) {
val bucketMap = bucketedItems.getOrPut(bucket) { HashMap() }
val item = bucketMap.getOrPut(internalName) { TrackedItem() }
Expand Down Expand Up @@ -59,31 +64,35 @@ abstract class BucketedItemTrackerData<E : Enum<E>> : TrackerData() {
?: (this.javaClass.genericSuperclass as? ParameterizedTypeImpl)?.actualTypeArguments?.firstOrNull()?.let { type ->
(type as? Class<E>)?.enumConstants
} ?: ErrorManager.skyHanniError(
"Unable to retrieve enum constants for E in BucketedItemTrackerData",
"selectedBucket" to selectedBucket,
"dataClass" to this.javaClass.superclass.name,
)
"Unable to retrieve enum constants for E in BucketedItemTrackerData",
"selectedBucket" to selectedBucket,
"dataClass" to this.javaClass.superclass.name,
)
}

@Expose
private var selectedBucket: E? = null

@Expose
private var bucketedItems: MutableMap<E, MutableMap<NEUInternalName, TrackedItem>> = HashMap()

private fun getBucket(bucket: E): MutableMap<NEUInternalName, TrackedItem> = bucketedItems[bucket]?.toMutableMap() ?: HashMap()
private fun getPoppedBuckets(): MutableList<E> = (bucketedItems.toMutableMap().filter { it.value.isNotEmpty() }.keys).toMutableList()
fun getItemsProp(): MutableMap<NEUInternalName, TrackedItem> = getSelectedBucket()?.let { getBucket(it) } ?: flattenBuckets()
fun getSelectedBucket() = selectedBucket
fun selectNextSequentialBucket() {
fun getNextSequentialBucket(): E? {
// Move to the next ordinal, or wrap to null if at the last value
val nextOrdinal = selectedBucket?.let { it.ordinal + 1 } // Only calculate if selectedBucket is non-null
selectedBucket = when {
return when {
selectedBucket == null -> buckets.first() // If selectedBucket is null, start with the first enum
nextOrdinal != null && nextOrdinal >= buckets.size -> null // Wrap to null if we've reached the end
nextOrdinal != null -> buckets[nextOrdinal] // Move to the next enum value
else -> selectedBucket // Fallback, shouldn't happen
}
}
fun selectBucket(bucket: E?) {
selectedBucket = bucket
}

private fun flattenBuckets(): MutableMap<NEUInternalName, TrackedItem> {
val flatMap: MutableMap<NEUInternalName, TrackedItem> = HashMap()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package at.hannibal2.skyhanni.utils.tracker
import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.config.storage.ProfileSpecificStorage
import at.hannibal2.skyhanni.data.SlayerAPI
import at.hannibal2.skyhanni.data.TrackerManager
import at.hannibal2.skyhanni.utils.ChatUtils
import at.hannibal2.skyhanni.utils.CollectionUtils.addSearchableSelector
import at.hannibal2.skyhanni.utils.CollectionUtils.sortedDesc
Expand Down Expand Up @@ -32,19 +33,43 @@ class SkyHanniBucketedItemTracker<E : Enum<E>, BucketedData : BucketedItemTracke
val SKYBLOCK_COIN = NEUInternalName.SKYBLOCK_COIN
}

fun addCoins(bucket: E, coins: Int) {
addItem(bucket, SKYBLOCK_COIN, coins)
fun addItemToSelectedBucket(internalName: NEUInternalName, amount: Int, command: Boolean = false) {
val addSuccess: Boolean = tryModify {
it.addItem(internalName, amount)
}

if (!addSuccess) {
ChatUtils.chat(
"§cYou do not have a selected bucket for $name, and loot cannot be added to this tracker generically.\n" +
"§ePlease select a bucket in your inventory UI, then try again.",
)
} else processAddedItem(internalName, amount, command)
}

fun addItem(bucket: E, internalName: NEUInternalName, amount: Int) {
fun addItem(bucket: E, internalName: NEUInternalName, amount: Int, command: Boolean = false) {
modify {
it.addItem(bucket, internalName, amount)
}
processAddedItem(internalName, amount, command)
}

private fun processAddedItem(internalName: NEUInternalName, amount: Int, command: Boolean) {
getSharedTracker()?.let {
val hidden = it.get(DisplayMode.TOTAL).getItemsProp()[internalName]!!.hidden
it.get(DisplayMode.SESSION).getItemsProp()[internalName]!!.hidden = hidden
}

if (command) {
TrackerManager.commandEditTrackerSuccess = true
val displayName = internalName.itemName
if (amount > 0) {
ChatUtils.chat("Manually added to $name: §r$displayName §7(${amount}x§7)")
} else {
ChatUtils.chat("Manually removed from $name: §r$displayName §7(${-amount}x§7)")
}
return
}

val (itemName, price) = SlayerAPI.getItemNameAndPrice(internalName, amount)
if (config.warnings.chat && price >= config.warnings.minimumChat) {
ChatUtils.chat("§a+Tracker Drop§7: §r$itemName")
Expand All @@ -59,9 +84,9 @@ class SkyHanniBucketedItemTracker<E : Enum<E>, BucketedData : BucketedItemTracke
lists.addSearchableSelector<ItemPriceSource>(
"",
getName = { type -> type.sellName },
isCurrent = { it?.ordinal == config.priceSource.ordinal }, // todo avoid ordinal
isCurrent = { it.ordinal == config.priceSource.ordinal }, // todo avoid ordinal
onChange = {
config.priceSource = it?.let { ItemPriceSource.entries[it.ordinal] } // todo avoid ordinal
config.priceSource = it.let { ItemPriceSource.entries[it.ordinal] } // todo avoid ordinal
update()
},
)
Expand All @@ -79,8 +104,10 @@ class SkyHanniBucketedItemTracker<E : Enum<E>, BucketedData : BucketedItemTracke
prefix = "§7$sourceStringPrefix: ",
getName = data.getSelectedBucket()?.toString() ?: nullBucketLabel,
onChange = {
data.selectNextSequentialBucket()
update()
val nextBucket = data.getNextSequentialBucket()
modify {
it.selectBucket(nextBucket)
}
},
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ open class SkyHanniTracker<Data : TrackerData>(

fun isInventoryOpen() = inventoryOpen

fun resetCommand() = ChatUtils.clickableChat(
open fun resetCommand() = ChatUtils.clickableChat(
"Are you sure you want to reset your total $name? Click here to confirm.",
onClick = {
reset(DisplayMode.TOTAL, "Reset total $name!")
Expand All @@ -71,6 +71,13 @@ open class SkyHanniTracker<Data : TrackerData>(
update()
}

fun tryModify(modifyFunction: (Data) -> Boolean): Boolean {
val sharedTracker = getSharedTracker() ?: return false
val success = sharedTracker.tryModify(modifyFunction)
update()
return success
}

fun renderDisplay(position: Position) {
if (config.hideInEstimatedItemValue && EstimatedItemValue.isCurrentlyShowing()) return

Expand Down Expand Up @@ -186,6 +193,8 @@ open class SkyHanniTracker<Data : TrackerData>(
entries.values.forEach(modifyFunction)
}

fun tryModify(modifyFunction: (Data) -> Boolean): Boolean = entries.values.all(modifyFunction)

fun get(displayMode: DisplayMode) = entries[displayMode] ?: ErrorManager.skyHanniError(
"Unregistered display mode accessed on tracker",
"tracker" to name,
Expand All @@ -198,7 +207,6 @@ open class SkyHanniTracker<Data : TrackerData>(
TOTAL("Total"),
SESSION("This Session"),
MAYOR("This Mayor"),
;
}

enum class DefaultDisplayMode(val display: String, val mode: DisplayMode?) {
Expand Down
Loading