Add quick /join command for catacombs and kuudra

This commit is contained in:
nea
2023-09-27 01:07:17 +02:00
parent eaf91279b8
commit 6754ab61dc
7 changed files with 180 additions and 18 deletions

View File

@@ -14,19 +14,8 @@ import io.ktor.client.plugins.compression.*
import io.ktor.client.plugins.contentnegotiation.* import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.client.plugins.logging.* import io.ktor.client.plugins.logging.*
import io.ktor.serialization.kotlinx.json.* import io.ktor.serialization.kotlinx.json.*
import kotlinx.coroutines.* import java.nio.file.Files
import kotlinx.serialization.json.Json import java.nio.file.Path
import moe.nea.firmament.commands.registerFirmamentCommand
import moe.nea.firmament.dbus.FirmamentDbusObject
import moe.nea.firmament.events.ItemTooltipEvent
import moe.nea.firmament.events.ScreenRenderPostEvent
import moe.nea.firmament.events.TickEvent
import moe.nea.firmament.events.registration.registerFirmamentChatEvents
import moe.nea.firmament.features.FeatureManager
import moe.nea.firmament.repo.HypixelStaticData
import moe.nea.firmament.repo.RepoManager
import moe.nea.firmament.util.SBData
import moe.nea.firmament.util.data.IDataHolder
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents
@@ -36,15 +25,32 @@ import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents
import net.fabricmc.loader.api.FabricLoader import net.fabricmc.loader.api.FabricLoader
import net.fabricmc.loader.api.Version import net.fabricmc.loader.api.Version
import net.fabricmc.loader.api.metadata.ModMetadata import net.fabricmc.loader.api.metadata.ModMetadata
import net.minecraft.command.CommandRegistryAccess
import net.minecraft.util.Identifier
import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.LogManager
import org.apache.logging.log4j.Logger import org.apache.logging.log4j.Logger
import org.freedesktop.dbus.connections.impl.DBusConnectionBuilder import org.freedesktop.dbus.connections.impl.DBusConnectionBuilder
import org.freedesktop.dbus.exceptions.DBusException import org.freedesktop.dbus.exceptions.DBusException
import java.nio.file.Files import kotlinx.coroutines.CoroutineName
import java.nio.file.Path import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.plus
import kotlinx.coroutines.runBlocking
import kotlinx.serialization.json.Json
import kotlin.coroutines.EmptyCoroutineContext import kotlin.coroutines.EmptyCoroutineContext
import net.minecraft.command.CommandRegistryAccess
import net.minecraft.util.Identifier
import moe.nea.firmament.commands.registerFirmamentCommand
import moe.nea.firmament.dbus.FirmamentDbusObject
import moe.nea.firmament.events.CommandEvent
import moe.nea.firmament.events.ItemTooltipEvent
import moe.nea.firmament.events.ScreenRenderPostEvent
import moe.nea.firmament.events.TickEvent
import moe.nea.firmament.events.registration.registerFirmamentChatEvents
import moe.nea.firmament.features.FeatureManager
import moe.nea.firmament.repo.HypixelStaticData
import moe.nea.firmament.repo.RepoManager
import moe.nea.firmament.util.SBData
import moe.nea.firmament.util.data.IDataHolder
object Firmament { object Firmament {
const val MOD_ID = "firmament" const val MOD_ID = "firmament"
@@ -101,6 +107,7 @@ object Firmament {
ctx: CommandRegistryAccess ctx: CommandRegistryAccess
) { ) {
registerFirmamentCommand(dispatcher) registerFirmamentCommand(dispatcher)
CommandEvent.publish(CommandEvent(dispatcher, ctx))
} }
@JvmStatic @JvmStatic

View File

@@ -0,0 +1,19 @@
/*
* SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package moe.nea.firmament.commands
import com.mojang.brigadier.StringReader
import com.mojang.brigadier.arguments.ArgumentType
object RestArgumentType : ArgumentType<String> {
override fun parse(reader: StringReader): String {
val remaining = reader.remaining
reader.cursor += remaining.length
return remaining
}
}

View File

@@ -0,0 +1,28 @@
/*
* SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package moe.nea.firmament.events
import com.mojang.brigadier.CommandDispatcher
import com.mojang.brigadier.tree.LiteralCommandNode
import net.minecraft.command.CommandRegistryAccess
import moe.nea.firmament.commands.CaseInsensitiveLiteralCommandNode
import moe.nea.firmament.commands.DefaultSource
import moe.nea.firmament.commands.literal
data class CommandEvent(
val dispatcher: CommandDispatcher<DefaultSource>,
val ctx: CommandRegistryAccess,
) : FirmamentEvent() {
companion object : FirmamentEventBus<CommandEvent>()
fun register(
name: String,
block: CaseInsensitiveLiteralCommandNode.Builder<DefaultSource>.() -> Unit
): LiteralCommandNode<DefaultSource> {
return dispatcher.register(literal(name, block))
}
}

View File

@@ -10,6 +10,7 @@ import kotlinx.serialization.Serializable
import kotlinx.serialization.serializer import kotlinx.serialization.serializer
import moe.nea.firmament.Firmament import moe.nea.firmament.Firmament
import moe.nea.firmament.features.chat.ChatLinks import moe.nea.firmament.features.chat.ChatLinks
import moe.nea.firmament.features.chat.QuickCommands
import moe.nea.firmament.features.debug.DebugView import moe.nea.firmament.features.debug.DebugView
import moe.nea.firmament.features.debug.DeveloperFeatures import moe.nea.firmament.features.debug.DeveloperFeatures
import moe.nea.firmament.features.debug.MinorTrolling import moe.nea.firmament.features.debug.MinorTrolling
@@ -53,6 +54,7 @@ object FeatureManager : DataHolder<FeatureManager.Config>(serializer(), "feature
loadFeature(PowerUserTools) loadFeature(PowerUserTools)
loadFeature(ChatLinks) loadFeature(ChatLinks)
loadFeature(CompatibliltyFeatures) loadFeature(CompatibliltyFeatures)
loadFeature(QuickCommands)
loadFeature(SaveCursorPosition) loadFeature(SaveCursorPosition)
loadFeature(CustomSkyBlockTextures) loadFeature(CustomSkyBlockTextures)
loadFeature(PriceData) loadFeature(PriceData)

View File

@@ -0,0 +1,100 @@
/*
* SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package moe.nea.firmament.features.chat
import com.mojang.brigadier.context.CommandContext
import net.minecraft.text.Text
import moe.nea.firmament.commands.DefaultSource
import moe.nea.firmament.commands.RestArgumentType
import moe.nea.firmament.commands.get
import moe.nea.firmament.commands.thenArgument
import moe.nea.firmament.commands.thenExecute
import moe.nea.firmament.events.CommandEvent
import moe.nea.firmament.features.FirmamentFeature
import moe.nea.firmament.util.MC
import moe.nea.firmament.util.SBData
object QuickCommands : FirmamentFeature {
override val identifier: String
get() = "quick-commands"
fun removePartialPrefix(text: String, prefix: String): String? {
var lf: String? = null
for (i in 1..prefix.length) {
if (text.startsWith(prefix.substring(0, i))) {
lf = text.substring(i)
}
}
return lf
}
val kuudraLevelNames = listOf("NORMAL", "HOT", "BURNING", "FIERY", "INFERNAL")
val dungeonLevelNames = listOf("ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN")
override fun onLoad() {
CommandEvent.subscribe {
it.register("join") {
thenArgument("what", RestArgumentType) { what ->
thenExecute {
val what = this[what]
if (!SBData.isOnSkyblock) {
MC.sendCommand("join $what")
return@thenExecute
}
val joinName = getNameForFloor(what.replace(" ", "").lowercase())
if (joinName == null) {
source.sendFeedback(Text.translatable("firmament.quick-commands.join.unknown",what))
} else {
source.sendFeedback(Text.translatable("firmament.quick-commands.join.success", joinName))
MC.sendCommand("joininstance $joinName")
}
}
}
thenExecute {
source.sendFeedback(Text.translatable("firmament.quick-commands.join.explain"))
}
}
}
}
fun CommandContext<DefaultSource>.getNameForFloor(w: String): String? {
val kuudraLevel = removePartialPrefix(w, "kuudratier") ?: removePartialPrefix(w, "tier")
if (kuudraLevel != null) {
val l = kuudraLevel.toIntOrNull()?.let { it - 1 } ?: kuudraLevelNames.indexOfFirst {
it.startsWith(
kuudraLevel,
true
)
}
if (l !in kuudraLevelNames.indices) {
source.sendFeedback(Text.translatable("firmament.quick-commands.join.unknown-kuudra", kuudraLevel))
return null
}
return "KUUDRA_${kuudraLevelNames[l]}"
}
val masterLevel = removePartialPrefix(w, "master")
val normalLevel =
removePartialPrefix(w, "floor") ?: removePartialPrefix(w, "catacombs") ?: removePartialPrefix(w, "dungeons")
val dungeonLevel = masterLevel ?: normalLevel
if (dungeonLevel != null) {
val l = dungeonLevel.toIntOrNull()?.let { it - 1 } ?: dungeonLevelNames.indexOfFirst {
it.startsWith(
dungeonLevel,
true
)
}
if (masterLevel == null && (l == -1 || null != removePartialPrefix(w, "entrance"))) {
return "CATACOMBS_ENTRANCE"
}
if (l !in dungeonLevelNames.indices) {
source.sendFeedback(Text.translatable("firmament.quick-commands.join.unknown-catacombs", kuudraLevel))
return null
}
return "${if (masterLevel != null) "MASTER_" else ""}CATACOMBS_FLOOR_${dungeonLevelNames[l]}"
}
return null
}
}

View File

@@ -30,6 +30,7 @@ object SBData {
var locraw: Locraw? = null var locraw: Locraw? = null
val skyblockLocation: String? get() = locraw?.skyblockLocation val skyblockLocation: String? get() = locraw?.skyblockLocation
val hasValidLocraw get() = locraw?.server !in listOf("limbo", null) val hasValidLocraw get() = locraw?.server !in listOf("limbo", null)
val isOnSkyblock get() = locraw?.gametype == "SKYBLOCK"
fun init() { fun init() {
OutgoingPacketEvent.subscribe { event -> OutgoingPacketEvent.subscribe { event ->

View File

@@ -126,5 +126,10 @@
"firmament.tooltip.copied.nbt": "Copied NBT data", "firmament.tooltip.copied.nbt": "Copied NBT data",
"firmament.config.compatibility": "Intermod Features", "firmament.config.compatibility": "Intermod Features",
"firmament.config.compatibility.explosion-enabled": "Redirect Enhanced Explosions", "firmament.config.compatibility.explosion-enabled": "Redirect Enhanced Explosions",
"firmament.config.compatibility.explosion-power": "Enhanced Explosion Power" "firmament.config.compatibility.explosion-power": "Enhanced Explosion Power",
"firmament.quick-commands.join.unknown": "Could not find instance for %s",
"firmament.quick-commands.join.success": "Joining: %s",
"firmament.quick-commands.join.explain": "Join a dungeon or kuudra floor by using commands like /join f1, /join m7, /join fe or /join khot",
"firmament.quick-commands.join.unknown-kuudra": "Unknown kuudra floor %s",
"firmament.quick-commands.join.unknown-catacombs": "Unknown catacombs floor %s"
} }