diff options
| author | hannibal2 <24389977+hannibal00212@users.noreply.github.com> | 2023-02-02 20:43:28 +0100 |
|---|---|---|
| committer | hannibal2 <24389977+hannibal00212@users.noreply.github.com> | 2023-02-02 20:43:28 +0100 |
| commit | 9484d930bd52ead1af076fc251aed691226ceee5 (patch) | |
| tree | c95e5ce19b7f21dd725877de260cec4906d11e6b /src/main/java/at/hannibal2/skyhanni/data | |
| parent | 7b329087dc47842e2a8337e650e6c037230da7ba (diff) | |
| download | skyhanni-9484d930bd52ead1af076fc251aed691226ceee5.tar.gz skyhanni-9484d930bd52ead1af076fc251aed691226ceee5.tar.bz2 skyhanni-9484d930bd52ead1af076fc251aed691226ceee5.zip | |
Prepare for bingo stuff.
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/data')
| -rw-r--r-- | src/main/java/at/hannibal2/skyhanni/data/IslandType.kt | 10 | ||||
| -rw-r--r-- | src/main/java/at/hannibal2/skyhanni/data/SkillExperience.kt | 210 |
2 files changed, 217 insertions, 3 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/data/IslandType.kt b/src/main/java/at/hannibal2/skyhanni/data/IslandType.kt index e2e99970c..362060918 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/IslandType.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/IslandType.kt @@ -1,16 +1,20 @@ package at.hannibal2.skyhanni.data -enum class IslandType(val displayName: String) { +enum class IslandType(val displayName: String, val apiName: String = "null") { PRIVATE_ISLAND("Private Island"), PRIVATE_ISLAND_GUEST("Private Island Guest"), THE_END("The End"), KUUDRA_ARENA("Instanced"), CRIMSON_ISLE("Crimson Isle"), DWARVEN_MINES("Dwarven Mines"), - DUNGEON_HUB("Dungeon Hub"), + DUNGEON_HUB("Dungeon Hub", "dungeon_hub"), - HUB("Hub"), + HUB("Hub", "village"), THE_FARMING_ISLANDS("The Farming Islands"), + CRYSTAL_HOLLOWS("Crystal Hollows"), + THE_PARK("The Park", "floating_islands_1"), + DEEP_CAVERNS("Deep Caverns", "deep_caverns"), + GOLD_MINES("Gold Mine", "gold_mine"),//TODO confirm NONE(""), UNKNOWN("???"), diff --git a/src/main/java/at/hannibal2/skyhanni/data/SkillExperience.kt b/src/main/java/at/hannibal2/skyhanni/data/SkillExperience.kt new file mode 100644 index 000000000..7b5df45df --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/data/SkillExperience.kt @@ -0,0 +1,210 @@ +package at.hannibal2.skyhanni.data + +import at.hannibal2.skyhanni.events.LorenzActionBarEvent +import at.hannibal2.skyhanni.events.ProfileApiDataLoadedEvent +import at.hannibal2.skyhanni.utils.InventoryUtils +import at.hannibal2.skyhanni.utils.ItemUtils.getLore +import at.hannibal2.skyhanni.utils.ItemUtils.name +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.NumberUtil.romanToDecimal +import at.hannibal2.skyhanni.utils.StringUtils.removeColor +import net.minecraftforge.event.world.WorldEvent +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import net.minecraftforge.fml.common.gameevent.TickEvent +import java.util.regex.Pattern + +class SkillExperience { + + private val actionBarPattern = Pattern.compile("(?:.*)§3\\+(?:.*) (.*) \\((.*)\\/(.*)\\)(?:.*)") + + @SubscribeEvent + fun onProfileDataLoad(event: ProfileApiDataLoadedEvent) { + val profileData = event.profileData + for ((key, value) in profileData.entrySet()) { + if (key.startsWith("experience_skill_")) { + val label = key.substring(17) + val exp = value.asLong + skillExp[label] = exp + } + } + } + + @SubscribeEvent + fun onActionBar(event: LorenzActionBarEvent) { + if (!LorenzUtils.inSkyBlock) return + + val matcher = actionBarPattern.matcher(event.message) + if (!matcher.matches()) return + + val skill = matcher.group(1).lowercase() + val overflow = matcher.group(2).formatNumber() + val neededForNextLevel = matcher.group(3).formatNumber() + val nextLevel = getLevelForExp(neededForNextLevel) + val baseExp = getExpForLevel(nextLevel - 1) + skillExp[skill] = baseExp + overflow + } + + private var tick = 0 + private var dirty = true + + @SubscribeEvent + fun onTick(event: TickEvent.ClientTickEvent) { + if (event.phase != TickEvent.Phase.START) return + + tick++ + if (tick % 20 != 0) return + if (InventoryUtils.openInventoryName() != "Your Skills") return + + if (!dirty) return + dirty = false + + for (slot in InventoryUtils.getItemsInOpenChest()) { + val stack = slot.stack + val name = stack.name?.removeColor() ?: continue + + val lore = stack.getLore() + + var next = false + for (line in lore) { + if (line.contains("Progress to Level")) { + next = true + continue + } + if (next) { + if (!name.contains(" ")) continue + val split = name.split(" ") + val skillName = split[0].lowercase() + val level = split[1].romanToDecimal() + val baseExp = getExpForLevel(level) + val pattern = Pattern.compile("(?:.*) §e(.*)§6\\/(?:.*)") + val matcher = pattern.matcher(line) + if (matcher.matches()) { + val rawNumber = matcher.group(1) + val overflow = rawNumber.formatNumber() + val experience = baseExp + overflow + skillExp[skillName] = experience + } + next = false + } + } + + } + if (skillExp.isNotEmpty()) return + } + + @SubscribeEvent + fun onWorldChange(event: WorldEvent.Load) { + dirty = true + } + + companion object { + private val skillExp = mutableMapOf<String, Long>() + + private fun getLevelForExp(experience: Long): Int { + var level = 1 + for (levelXp in levelingExp) { + if (levelXp.toLong() == experience) { + return level + } + level++ + } + + return 0 + } + + fun getExpForLevel(requestedLevel: Int): Long { + var total = 0L + var level = 0 + for (levelXp in levelingExp) { + total += levelXp + level++ + if (level == requestedLevel) { + return total + } + } + + return 0 + } + + //TODO create additional event + fun getExpForSkill(skillName: String) = skillExp[skillName.lowercase()] ?: 0 + + private val levelingExp = listOf( + 50, + 125, + 200, + 300, + 500, + 750, + 1000, + 1500, + 2000, + 3500, + 5000, + 7500, + 10000, + 15000, + 20000, + 30000, + 50000, + 75000, + 100000, + 200000, + 300000, + 400000, + 500000, + 600000, + 700000, + 800000, + 900000, + 1000000, + 1100000, + 1200000, + 1300000, + 1400000, + 1500000, + 1600000, + 1700000, + 1800000, + 1900000, + 2000000, + 2100000, + 2200000, + 2300000, + 2400000, + 2500000, + 2600000, + 2750000, + 2900000, + 3100000, + 3400000, + 3700000, + 4000000, + 4300000, + 4600000, + 4900000, + 5200000, + 5500000, + 5800000, + 6100000, + 6400000, + 6700000, + 7000000 + ) + } +} + +private fun String.formatNumber(): Long { + var text = replace(",", "") + val multiplier = if (text.endsWith("k")) { + text = text.substring(0, text.length - 1) + 1_000 + } else if (text.endsWith("m")) { + text = text.substring(0, text.length - 1) + 1_000_000 + } else { + 1 + } + val d = text.toDouble() + return (d * multiplier).toLong() +} |
