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 { 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 { if (!isInSkyblock) isInSkyblock = objectiveName == "SBScoreboard" } onReceive (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 { 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 } }