Skip to content
Open
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/main/java/at/hannibal2/skyhanni/api/HotfApi.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package at.hannibal2.skyhanni.api

import at.hannibal2.skyhanni.data.hotx.HotfData
import at.hannibal2.skyhanni.data.hotx.HotxPatterns.asPatternId
import at.hannibal2.skyhanni.data.hotx.RotatingPerk
import at.hannibal2.skyhanni.data.model.SkyblockStat
Expand All @@ -10,7 +11,7 @@ import org.intellij.lang.annotations.Language
@SkyHanniModule
object HotfApi {

var lottery: LotteryPerk? = null
val lottery: LotteryPerk? get() = HotfData.rotatingPerkSlots.firstNotNullOfOrNull { it.currentPerk as? LotteryPerk }

enum class LotteryPerk(
override val displayDescription: String,
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/at/hannibal2/skyhanni/api/HotmApi.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package at.hannibal2.skyhanni.api

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.api.HotfApi.LotteryPerk
import at.hannibal2.skyhanni.config.storage.ProfileSpecificStorage
import at.hannibal2.skyhanni.data.ProfileStorageData
import at.hannibal2.skyhanni.data.hotx.HotfData
import at.hannibal2.skyhanni.data.hotx.HotmData
import at.hannibal2.skyhanni.data.hotx.HotxPatterns.asPatternId
import at.hannibal2.skyhanni.data.hotx.RotatingPerk
Expand Down Expand Up @@ -104,7 +106,7 @@ object HotmApi {
}
}

var skymall: SkymallPerk? = null
val skymall: SkymallPerk? get() = HotfData.rotatingPerkSlots.firstNotNullOfOrNull { it.currentPerk as? SkymallPerk }
Comment thread
AverageUser125 marked this conversation as resolved.
Outdated

var mineshaftMayhem: MayhemPerk? = null

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@ import at.hannibal2.skyhanni.utils.SkyBlockUtils
import at.hannibal2.skyhanni.utils.StringUtils
import org.lwjgl.glfw.GLFW

abstract class CurrencyPerHotxPerk<HotxType : HotxHandler<*, *, *>>(private val hotx: HotxType, private val displayText: String) {

abstract class CurrencyPerHotxPerk<HotxType : HotxHandler<*, *>>(
private val hotx: HotxType,
private val displayText: String
) {
fun handleHotxCurrency(
event: ToolTipTextEvent,
showCurrencySpent: Boolean,
Expand Down
12 changes: 8 additions & 4 deletions src/main/java/at/hannibal2/skyhanni/data/hotx/HotfData.kt
Original file line number Diff line number Diff line change
Expand Up @@ -263,12 +263,16 @@ enum class HotfData(
override fun getStorage(): HotxTree? = ProfileStorageData.profileSpecific?.foraging?.hotFTree

@SkyHanniModule
companion object : HotxHandler<HotfData, HotfReward, HotfApi.LotteryPerk>(entries) {
companion object : HotxHandler<HotfData, HotfReward>(entries) {
override val name: String = "HotF"
override val core: HotfData = CENTER_OF_THE_FOREST
override val rotatingPerks = HotfApi.LotteryPerk.entries
override val rotatingPerkEntry = LOTTERY
override var currentRotPerk = HotfApi.lottery
override val rotatingPerkSlots = listOf(
object : RotatingPerkSlot<HotfData> {
override val entry: HotfData = LOTTERY
override val perks = HotfApi.LotteryPerk.entries
override var currentPerk: RotatingPerk? = null
},
)
override val islandTypeTag = IslandTypeTag.FORAGING
private val config get() = SkyHanniMod.feature.foraging.hotf

Expand Down
15 changes: 9 additions & 6 deletions src/main/java/at/hannibal2/skyhanni/data/hotx/HotmData.kt
Original file line number Diff line number Diff line change
Expand Up @@ -419,17 +419,20 @@ enum class HotmData(
override val totalCostMaxLevel = calculateTotalCost(maxLevel)

override fun getStorage(): HotxTree? = ProfileStorageData.profileSpecific?.mining?.hotmTree

// TODO move all object functions into hotm api?
@SkyHanniModule
companion object : HotxHandler<HotmData, HotmReward, SkymallPerk>(entries) {
companion object : HotxHandler<HotmData, HotmReward>(entries) {

override val name: String = "HotM"
override val rotatingPerks = SkymallPerk.entries
override val rotatingPerkEntry: HotmData = SKY_MALL
override var currentRotPerk = HotmApi.skymall
override val islandTypeTag = IslandTypeTag.MINING
override val rotatingPerkSlots = listOf(
object : RotatingPerkSlot<HotmData> {
override val entry: HotmData = SKY_MALL
override val perks = SkymallPerk.entries
override var currentPerk: RotatingPerk? = null
},
)

override val islandTypeTag = IslandTypeTag.MINING
private val config get() = SkyHanniMod.feature.mining.hotm
override val position: Position get() = config.skyMallPosition

Expand Down
95 changes: 55 additions & 40 deletions src/main/java/at/hannibal2/skyhanni/data/hotx/HotxHandler.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,7 @@ import net.minecraft.world.inventory.Slot
import java.util.regex.Matcher
import java.util.regex.Pattern

abstract class HotxHandler<Data : HotxData<Reward>, Reward, RotPerkE>(val data: Collection<Data>)
where RotPerkE : Enum<*>,
RotPerkE : RotatingPerk {
abstract class HotxHandler<Data : HotxData<Reward>, Reward>(val data: Collection<Data>) {

/**
* Name of the Tree Eg: HotM, HotF
Expand Down Expand Up @@ -78,13 +76,18 @@ abstract class HotxHandler<Data : HotxData<Reward>, Reward, RotPerkE>(val data:
it.enabled = false
it.isUnlocked = false
}

rotatingPerkSlots.forEach {
it.currentPerk = null
}

currencyReset()
}

fun Slot.parse() {
val item = this.item.takeUnlessEmpty() ?: return

if (this.handleCurrency()) return
if (handleCurrency()) return

val entry = data.firstOrNull { it.guiNamePattern.matches(item.cleanName) } ?: return
entry.slot = this
Expand Down Expand Up @@ -121,9 +124,8 @@ abstract class HotxHandler<Data : HotxData<Reward>, Reward, RotPerkE>(val data:
}
entry.enabled = lore.any { enabledPattern.matches(it) }

fetchRotatingPerk(entry, lore)?.let {
currentRotPerk = it
}
fetchRotatingPerk(entry, lore)

extraHandling(entry, lore)
}

Expand Down Expand Up @@ -186,7 +188,7 @@ abstract class HotxHandler<Data : HotxData<Reward>, Reward, RotPerkE>(val data:
extraInventoryHandling()
}
},
onCloseInventory = { _ ->
onCloseInventory = {
data.forEach {
it.slot = null
it.item = null
Expand All @@ -196,11 +198,9 @@ abstract class HotxHandler<Data : HotxData<Reward>, Reward, RotPerkE>(val data:
)
}

protected open val rotatingPerkPattern: Pattern by lazy { HotxPatterns.rotatingPerkPattern }
protected abstract val rotatingPerks: List<RotPerkE>
protected abstract val islandTypeTag: IslandTypeTag
abstract var currentRotPerk: RotPerkE?
protected set
protected open val rotatingPerkPattern: Pattern by lazy { HotxPatterns.rotatingPerkPattern }
abstract val rotatingPerkSlots: List<RotatingPerkSlot<Data>>

abstract val resetChatPattern: Pattern

Expand All @@ -219,47 +219,62 @@ abstract class HotxHandler<Data : HotxData<Reward>, Reward, RotPerkE>(val data:
fun tryReadRotatingPerkChat(event: SkyHanniChatEvent.Allow): Boolean? {
rotatingPerkPattern.matchMatcher(event.cleanMessage) {
val perkString = group("perk")
val foundPerk = rotatingPerks.firstNotNullOfOrNull { perk ->
if (!perk.chatPattern.matches(perkString)) return@firstNotNullOfOrNull null
perk

val result = rotatingPerkSlots.firstNotNullOfOrNull { slot ->
val perk = slot.perks.firstOrNull {
it.chatPattern.matches(perkString)
}

if (perk != null) {
slot to perk
} else {
null
}
} ?: return false

tryBlock(event)
currentRotPerk = foundPerk
result.first.currentPerk = result.second

return true
}

return null
}

abstract val rotatingPerkEntry: Data
private fun fetchRotatingPerk(entry: Data, lore: List<String>) {
val slot = rotatingPerkSlots.firstOrNull {
it.entry == entry
} ?: return

if (!entry.enabled || !entry.isUnlocked) return

val index = HotxPatterns.itemPreEffectPattern.indexOfFirstMatch(lore)
?: run {
ErrorManager.logErrorStateWithData(
"Could not read rotating perk from $name tree",
"itemPreEffectPattern didn't match",
"lore" to lore,
)
return
}

private fun fetchRotatingPerk(entry: Data, lore: List<String>): RotPerkE? {
if (entry != rotatingPerkEntry || !entry.enabled || !entry.isUnlocked) return null
val nextLine = lore.getOrNull(index + 1) ?: return

val index = HotxPatterns.itemPreEffectPattern.indexOfFirstMatch(lore) ?: run {
ErrorManager.logErrorStateWithData(
"Could not read the ${rotatingPerkEntry.guiName} effect from the $name tree",
"itemPreEffectPattern didn't match",
"lore" to lore,
)
return null
}
val nextLine = lore[index + 1]
val perkLore = HotxPatterns.rotatingPerkPattern.matchGroup(nextLine, "perk") ?: return null
val perkEnum: RotPerkE? = rotatingPerks.firstNotNullOfOrNull { perk ->
if (perk.itemPattern.matches(perkLore)) perk
else null
val perkLore = HotxPatterns.rotatingPerkPattern
.matchGroup(nextLine, "perk")
?: return

slot.currentPerk = slot.perks.firstOrNull {
it.itemPattern.matches(perkLore)
}
if (perkEnum == null) {

if (slot.currentPerk == null) {
ErrorManager.logErrorStateWithData(
"Could not read the ${rotatingPerkEntry.guiName} effect from the $name tree",
"Could not read rotating perk from $name tree",
"no itemPattern matched",
"nextLine" to nextLine,
"entry" to entry.guiName,
"perkLore" to perkLore,
)
}
return perkEnum
}

interface RotatingPerk {
val perkDescription: String
}
}
6 changes: 6 additions & 0 deletions src/main/java/at/hannibal2/skyhanni/data/hotx/RotatingPerk.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,9 @@ interface RotatingPerk {
val chatPattern: Pattern
val itemPattern: Pattern
}

interface RotatingPerkSlot<Data> {
val entry: Data
val perks: List<RotatingPerk>
var currentPerk: RotatingPerk?
}
34 changes: 18 additions & 16 deletions src/main/java/at/hannibal2/skyhanni/features/mining/HotxFeatures.kt
Original file line number Diff line number Diff line change
Expand Up @@ -34,25 +34,27 @@ object HotxFeatures {
handlers.forEach { it.renderOverlay() }
}

private fun HotxHandler<*, *, *>.renderOverlay() {
private fun HotxHandler<*, *>.renderOverlay() {
if (!shouldShowDisplay) return
val rotatingPerkEntry = rotatingPerkEntry
if (!rotatingPerkEntry.isUnlocked || !rotatingPerkEntry.enabled) return
val currentPerk = currentRotPerk

val perkDescriptionFormat = currentPerk?.displayDescription
?: "§cUnknown! Run ${"§b/${name.lowercase()}"} §cto fix this."
val finalFormat = "§b${rotatingPerkEntry.guiName}§8: $perkDescriptionFormat"

position.renderRenderable(
Renderable.text(finalFormat),
posLabel = "${rotatingPerkEntry.guiName} Display",
)
rotatingPerkSlots.forEach { slot ->
val entry = slot.entry
if (!entry.isUnlocked || !entry.enabled) return@forEach
val currentPerk = slot.currentPerk
val perkDescriptionFormat = currentPerk?.displayDescription
?: "§cUnknown! Run ${"§b/${name.lowercase()}"} §cto fix this."
val finalFormat = "§b${entry.guiName}§8: $perkDescriptionFormat"

position.renderRenderable(
Renderable.text(finalFormat),
posLabel = "${entry.guiName} Display",
)
}
}

@HandleEvent(onlyOnSkyblock = true)
fun onChat(event: SkyHanniChatEvent.Allow) {
val claimMap: Map<HotxHandler<*, *, *>, Boolean?> = listOf(
val claimMap: Map<HotxHandler<*, *>, Boolean?> = listOf(
HotmData, HotfData,
).associateWith { data ->
data.tryReadRotatingPerkChat(event)
Expand All @@ -72,7 +74,7 @@ object HotxFeatures {

@HandleEvent(GuiContainerEvent.BackgroundDrawnEvent::class, onlyOnSkyblock = true)
fun onBackgroundDrawn() {
val handler: HotxHandler<*, *, *> = when {
val handler: HotxHandler<*, *> = when {
HotmData.inInventory && configHotm.highlightEnabledPerks -> HotmData
HotfData.inInventory && configHotf.highlightEnabledPerks -> HotfData
else -> return
Expand All @@ -91,7 +93,7 @@ object HotxFeatures {
}

private fun handleLevelStackSize(event: RenderItemTipEvent) {
val handler: HotxHandler<*, *, *> = when {
val handler: HotxHandler<*, *> = when {
HotmData.inInventory && configHotm.levelStackSize -> HotmData
HotfData.inInventory && configHotf.levelStackSize -> HotfData
else -> return
Expand All @@ -105,7 +107,7 @@ object HotxFeatures {
}

private fun handleTokenStackSize(event: RenderItemTipEvent) {
val handler: HotxHandler<*, *, *> = when {
val handler: HotxHandler<*, *> = when {
HotmData.inInventory && configHotm.tokenStackSize -> HotmData
HotfData.inInventory && configHotf.tokenStackSize -> HotfData
else -> return
Expand Down
Loading