HTTPS
https://git.nageyqma.icu/nageyqma/odin_next.git
SSH
git@git.nageyqma.icu:nageyqma/odin_next.git
HTTPS 链接可直接 git clone;推送代码请使用 SSH。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
package com.odtheking.odin.utils.skyblock
import com.odtheking.odin.OdinMod.mc
import com.odtheking.odin.events.LevelEvent
import com.odtheking.odin.events.LocationChangeEvent
import com.odtheking.odin.events.core.EventPriority
import com.odtheking.odin.events.core.on
import com.odtheking.odin.events.core.onReceive
import com.odtheking.odin.utils.equalsOneOf
import com.odtheking.odin.utils.noControlCodes
import com.odtheking.odin.utils.startsWithOneOf
import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket
import net.minecraft.network.protocol.game.ClientboundSetObjectivePacket
import net.minecraft.network.protocol.game.ClientboundSetPlayerTeamPacket
import kotlin.jvm.optionals.getOrNull
object LocationUtils {
var isInSkyblock: Boolean = false
private set
var currentArea: Island = Island.Unknown
private set(value) {
field = value
if (value !== Island.Unknown) LocationChangeEvent.postAndCatch()
}
var lobbyId: String? = null
private set
private val lobbyRegex = Regex("\\d\\d/\\d\\d/\\d\\d (\\w{0,6}) *")
init {
onReceive<ClientboundPlayerInfoUpdatePacket> {
if (!isCurrentArea(Island.Unknown) || actions().none { it.equalsOneOf(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME) }) return@onReceive
val area = entries().find { it.displayName?.string?.startsWithOneOf("Area: ", "Dungeon: ") == true }?.displayName?.string ?: return@onReceive
currentArea = Island.entries.firstOrNull { area.contains(it.displayName, true) } ?: Island.Unknown
}
onReceive<ClientboundSetObjectivePacket> {
if (!isInSkyblock) isInSkyblock = objectiveName == "SBScoreboard"
}
onReceive<ClientboundSetPlayerTeamPacket> (EventPriority.LOW) {
if (!isCurrentArea(Island.Unknown)) return@onReceive
val text = parameters.getOrNull()?.let { it.playerPrefix.string.plus(it.playerSuffix.string).noControlCodes } ?: return@onReceive
lobbyRegex.find(text)?.groupValues?.get(1)?.let { lobbyId = it }
}
on<LevelEvent.Load> {
currentArea = if (mc.hasSingleplayerServer()) Island.SinglePlayer else Island.Unknown
isInSkyblock = false
lobbyId = null
}
}
fun isCurrentArea(vararg areas: Island): Boolean =
currentArea == Island.SinglePlayer || areas.any { currentArea == it }
}