Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package tech.thatgravyboat.skyblockapi.api.area.atoll.trophyfrog

import net.minecraft.network.chat.Component
import net.minecraft.world.item.ItemStack
import tech.thatgravyboat.skyblockapi.api.datatype.defaults.trophy.TrophyTier
import tech.thatgravyboat.skyblockapi.utils.text.Text

data class TrophyFrog(val type: TrophyFrogType, val tier: TrophyTier) {
val item: ItemStack by lazy { type.getItem(tier) }
val displayName: Component by lazy {
if (tier == TrophyTier.NONE) {
return@lazy type.displayName.copy()
}

Text.join(type.displayName, " ", tier.nameSuffix)
}

val apiName by lazy {
if (tier == TrophyTier.NONE) {
return@lazy type.internalName.lowercase()
}

"${type.internalName.lowercase()}_${tier.name.lowercase()}"
}

companion object {
fun fromString(fish: String): TrophyFrog? {
if (fish.contains("/")) {
return fish.split("/").let {
TrophyFrog(
TrophyFrogType.getByInternalName(it[0]) ?: return null,
TrophyTier.getByName(it[1]),
)
}
}
return null
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
package tech.thatgravyboat.skyblockapi.api.area.atoll.trophyfrog

import me.owdding.ktmodules.Module
import tech.thatgravyboat.skyblockapi.api.data.stored.TrophyFrogStorage
import tech.thatgravyboat.skyblockapi.api.datatype.defaults.trophy.TrophyTier
import tech.thatgravyboat.skyblockapi.api.events.base.Subscription
import tech.thatgravyboat.skyblockapi.api.events.base.predicates.OnlyIn
import tech.thatgravyboat.skyblockapi.api.events.chat.ChatReceivedEvent
import tech.thatgravyboat.skyblockapi.api.events.location.atoll.TrophyFrogCaughtEvent
import tech.thatgravyboat.skyblockapi.api.events.screen.InventoryChangeEvent
import tech.thatgravyboat.skyblockapi.api.location.SkyBlockIsland
import tech.thatgravyboat.skyblockapi.utils.extentions.cleanName
import tech.thatgravyboat.skyblockapi.utils.extentions.getRawLore
import tech.thatgravyboat.skyblockapi.utils.regex.RegexGroup
import tech.thatgravyboat.skyblockapi.utils.regex.RegexUtils.match
import tech.thatgravyboat.skyblockapi.utils.text.CommonText
import tech.thatgravyboat.skyblockapi.utils.text.Text
import tech.thatgravyboat.skyblockapi.utils.text.Text.sendWithPrefix

@Module
object TrophyFrogAPI {

private val chatGroup = RegexGroup.CHAT.group("trophy_api")
private val inventoryGroup = RegexGroup.INVENTORY.group("trophy_api")

private val trophyFrogCaughtRegex = chatGroup.create(
"frog_caught",
"\uE02A TROPHY FROG! You caught an? (?<type>.+?) (?<tier>${TrophyTier.entries.joinToString("|", transform = { it.name })})!",
)

private val trophyFrogDescription = inventoryGroup.create(
"frog_description",
"(?<tier>Diamond|Silver|Gold|Bronze) \\S+(?: \\((?<amount>\\d+)\\))?",
)

@Subscription
@OnlyIn(SkyBlockIsland.LOTUS_ATOLL)
fun onChat(event: ChatReceivedEvent.Pre) {
val content = event.text.trim()
trophyFrogCaughtRegex.match(content, "type", "tier") { (type, tier) ->
val frogTier = TrophyTier.valueOf(tier)
val type = TrophyFrogType.getByDisplayName(type) ?: return@match

Text.of {
append("Caught: ")
append(type.displayName)
append(CommonText.SPACE)
append(frogTier.nameSuffix)
}.sendWithPrefix()
TrophyFrogStorage.addCaught(type, frogTier)
TrophyFrogCaughtEvent(type, frogTier).post()
}
}

@Subscription
@OnlyIn(SkyBlockIsland.LOTUS_ATOLL)
fun onInventory(event: InventoryChangeEvent) {
if (event.title != "Trophy Frogs") return
if (event.isInPlayerInventory) return
if (!event.isInMainPart) return
if (event.isSkyBlockFiller) return

val byName = TrophyFrogType.getByDisplayName(event.item.cleanName) ?: return
val caught = mutableMapOf<TrophyTier, Int>()
event.item.getRawLore().forEach {
trophyFrogDescription.match(it, "tier", "amount") { match ->
val (tierName) = match
val amount = match["amount"] ?: "0"
val tier = TrophyTier.getByName(tierName)
caught[tier] = amount.toInt()
}
}
Text.of {
append(byName.displayName)
caught.forEach { (tier, tierAmount) ->
append(CommonText.SPACE)
append(tier.nameSuffix)
append(": $tierAmount")
}
}.sendWithPrefix()
TrophyFrogStorage.setAmounts(byName, caught)
}

// TODO: Data
/*@OptIn(SkyBlockPvRequired::class)
@Subscription
@OnlyOnSkyBlock
fun onPv(event: SkyBlockPvOpenedEvent) {
val obtained = event.member["trophy_fish"].asMap { key, value ->
if (!value.isJsonPrimitive) null to 0
else key to value.asInt(0)
}.filterKeysNotNull()
var hasLoadedAny = false

val grouped = obtained.entries.groupBy { group -> TrophyFrogType.entries.find { group.key.startsWith(it.internalName, true) } }.filterKeysNotNull()
val unlocked = grouped.mapValues { entry ->
val caught = getCaught(entry.key)
entry.value.associate { value ->
val tier = TrophyTier.entries.find { value.key.endsWith(it.name, true) }
val previous = tier?.let(caught::get) ?: 0
val value = value.value

if (tier != null && value > previous) {
hasLoadedAny = true
}

tier to max(value, previous)
}.filterKeysNotNull()
}

if (hasLoadedAny) {
PvLoadingHelper.markLoaded(LoadedData.TROPHY_FISH)
}
unlocked.forEach(TrophyFrogStorage::setAmounts)
}

fun getCaught(type: TrophyFrogType): Map<TrophyTier, Int> {
return TrophyFrogStorage.getCaught(type)
}*/
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package tech.thatgravyboat.skyblockapi.api.area.atoll.trophyfrog

import me.owdding.ktcodecs.GenerateCodec
import tech.thatgravyboat.skyblockapi.api.datatype.defaults.trophy.TrophyTier
import tech.thatgravyboat.skyblockapi.generated.SkyblockAPICodecs

@GenerateCodec
data class TrophyFrogData(
val data: MutableMap<TrophyFrogType, MutableMap<TrophyTier, Int>> = mutableMapOf(),
) {
companion object {
val CODEC = SkyblockAPICodecs.getCodec<TrophyFrogData>()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package tech.thatgravyboat.skyblockapi.api.area.atoll.trophyfrog

import net.minecraft.ChatFormatting
import net.minecraft.network.chat.Component
import net.minecraft.world.item.ItemStack
import tech.thatgravyboat.skyblockapi.api.datatype.defaults.trophy.TrophyTier
import tech.thatgravyboat.skyblockapi.api.remote.api.SkyBlockId
import tech.thatgravyboat.skyblockapi.api.repo.apis.SkyBlockItemsRepo
import tech.thatgravyboat.skyblockapi.utils.lazy.registryBoundLazy
import tech.thatgravyboat.skyblockapi.utils.text.Text
import tech.thatgravyboat.skyblockapi.utils.text.TextProperties.stripped

enum class TrophyFrogType(
val displayName: Component,
internalName: String = "",
) {
COMMON_FROG(
displayName = Text.of("Common Frog") {
withStyle(ChatFormatting.WHITE)
},
),
LEAP_FROG(
displayName = Text.of("Leap Frog") {
withStyle(ChatFormatting.GREEN)
},
),
WETLANDS_FROG(
displayName = Text.of("Wetlands Frog") {
withStyle(ChatFormatting.GREEN)
},
),
REALITY_HOPPER(
displayName = Text.of("Reality Hopper") {
withStyle(ChatFormatting.GREEN)
},
),
EXPLODING_FROG(
displayName = Text.of("Exploding Frog") {
withStyle(ChatFormatting.GREEN)
},
),
BLESSED_FROG(
displayName = Text.of("Blessed Frog") {
withStyle(ChatFormatting.BLUE)
},
),
SEA_FROG(
displayName = Text.of("Sea Frog") {
withStyle(ChatFormatting.BLUE)
},
),
BULLFROG(
displayName = Text.of("Bullfrog") {
withStyle(ChatFormatting.BLUE)
},
),
TREE_FROG(
displayName = Text.of("Tree Frog") {
withStyle(ChatFormatting.DARK_PURPLE)
},
),
CAVE_FROG(
displayName = Text.of("Cave Frog") {
withStyle(ChatFormatting.DARK_PURPLE)
},
),
HIGHLANDS_FROG(
displayName = Text.of("Highlands Frog") {
withStyle(ChatFormatting.DARK_PURPLE)
},
),
PUDDLE_JUMPER(
displayName = Text.of("Puddle Jumper") {
withStyle(ChatFormatting.GOLD)
},
),
;

val internalName: String = internalName.takeUnless { it.isEmpty() } ?: name
val strippedName = displayName.stripped

val bronze by registryBoundLazy { SkyBlockItemsRepo.getItemStackOrDefault("${this.internalName}_BRONZE") }
val silver by registryBoundLazy { SkyBlockItemsRepo.getItemStackOrDefault("${this.internalName}_SILVER") }
val gold by registryBoundLazy { SkyBlockItemsRepo.getItemStackOrDefault("${this.internalName}_GOLD") }
val diamond by registryBoundLazy { SkyBlockItemsRepo.getItemStackOrDefault("${this.internalName}_DIAMOND") }

fun getItem(tier: TrophyTier): ItemStack {
return when (tier) {
TrophyTier.NONE -> bronze
TrophyTier.BRONZE -> bronze
TrophyTier.SILVER -> silver
TrophyTier.GOLD -> gold
TrophyTier.DIAMOND -> diamond
}
}

fun getId(tier: TrophyTier, default: TrophyTier = TrophyTier.BRONZE): SkyBlockId = SkyBlockId.item("${this.internalName}_${tier.takeUnless { it == TrophyTier.NONE } ?: default}")

companion object {
fun getByInternalName(internalName: String): TrophyFrogType? {
return entries.find { internalName.equals(it.internalName, ignoreCase = true) }
}

fun getByDisplayName(name: String): TrophyFrogType? {
return entries.find { name.equals(it.strippedName, ignoreCase = true) }
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,21 @@ package tech.thatgravyboat.skyblockapi.api.area.isle.trophyfish

import net.minecraft.network.chat.Component
import net.minecraft.world.item.ItemStack
import tech.thatgravyboat.skyblockapi.api.datatype.defaults.trophy.TrophyTier
import tech.thatgravyboat.skyblockapi.utils.text.Text

data class TrophyFish(val type: TrophyFishType, val tier: TrophyFishTier) {
data class TrophyFish(val type: TrophyFishType, val tier: TrophyTier) {
val item: ItemStack by lazy { type.getItem(tier) }
val displayName: Component by lazy {
if (tier == TrophyFishTier.NONE) {
if (tier == TrophyTier.NONE) {
return@lazy type.displayName.copy()
}

Text.join(type.displayName, " ", tier.nameSuffix)
}

val apiName by lazy {
if (tier == TrophyFishTier.NONE) {
if (tier == TrophyTier.NONE) {
return@lazy type.internalName.lowercase()
}

Expand All @@ -28,7 +29,7 @@ data class TrophyFish(val type: TrophyFishType, val tier: TrophyFishTier) {
return fish.split("/").let {
TrophyFish(
TrophyFishType.getByInternalName(it[0]) ?: return null,
TrophyFishTier.getByName(it[1]),
TrophyTier.getByName(it[1]),
)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package tech.thatgravyboat.skyblockapi.api.area.isle.trophyfish

import me.owdding.ktcodecs.GenerateCodec
import tech.thatgravyboat.skyblockapi.api.datatype.defaults.trophy.TrophyTier
import tech.thatgravyboat.skyblockapi.generated.SkyblockAPICodecs

@GenerateCodec
data class TrophyFishData(
val data: MutableMap<TrophyFishType, MutableMap<TrophyFishTier, Int>> = mutableMapOf(),
val data: MutableMap<TrophyFishType, MutableMap<TrophyTier, Int>> = mutableMapOf(),
) {
companion object {
val CODEC = SkyblockAPICodecs.getCodec<TrophyFishData>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package tech.thatgravyboat.skyblockapi.api.area.isle.trophyfish
import net.minecraft.ChatFormatting
import net.minecraft.network.chat.Component
import net.minecraft.world.item.ItemStack
import tech.thatgravyboat.skyblockapi.api.datatype.defaults.trophy.TrophyTier
import tech.thatgravyboat.skyblockapi.api.remote.api.SkyBlockId
import tech.thatgravyboat.skyblockapi.api.repo.apis.SkyBlockItemsRepo
import tech.thatgravyboat.skyblockapi.utils.lazy.registryBoundLazy
Expand Down Expand Up @@ -115,17 +116,17 @@ enum class TrophyFishType(
val gold by registryBoundLazy { SkyBlockItemsRepo.getItemStackOrDefault("${this.internalName}_GOLD") }
val diamond by registryBoundLazy { SkyBlockItemsRepo.getItemStackOrDefault("${this.internalName}_DIAMOND") }

fun getItem(tier: TrophyFishTier): ItemStack {
fun getItem(tier: TrophyTier): ItemStack {
return when (tier) {
TrophyFishTier.NONE -> bronze
TrophyFishTier.BRONZE -> bronze
TrophyFishTier.SILVER -> silver
TrophyFishTier.GOLD -> gold
TrophyFishTier.DIAMOND -> diamond
TrophyTier.NONE -> bronze
TrophyTier.BRONZE -> bronze
TrophyTier.SILVER -> silver
TrophyTier.GOLD -> gold
TrophyTier.DIAMOND -> diamond
}
}

fun getId(tier: TrophyFishTier, default: TrophyFishTier = TrophyFishTier.BRONZE): SkyBlockId = SkyBlockId.item("${this.internalName}_${tier.takeUnless { it == TrophyFishTier.NONE } ?: default}")
fun getId(tier: TrophyTier, default: TrophyTier = TrophyTier.BRONZE): SkyBlockId = SkyBlockId.item("${this.internalName}_${tier.takeUnless { it == TrophyTier.NONE } ?: default}")

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this might be aswell?


companion object {
fun getByInternalName(internalName: String): TrophyFishType? {
Expand Down
Loading