summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/moe/nea/ultranotifier/mixin/AccessorCommandHandler.java18
-rw-r--r--src/main/kotlin/UltraNotifier.kt4
-rw-r--r--src/main/kotlin/commands/BrigadierPatchbay.kt117
-rw-r--r--src/main/kotlin/commands/Commands.kt29
-rw-r--r--src/main/kotlin/event/CommandRegistrationEvent.kt10
-rw-r--r--src/main/kotlin/event/RegistrationFinishedEvent.kt6
-rw-r--r--src/main/kotlin/event/UltraEvent.kt4
7 files changed, 178 insertions, 10 deletions
diff --git a/src/main/java/moe/nea/ultranotifier/mixin/AccessorCommandHandler.java b/src/main/java/moe/nea/ultranotifier/mixin/AccessorCommandHandler.java
new file mode 100644
index 0000000..9218421
--- /dev/null
+++ b/src/main/java/moe/nea/ultranotifier/mixin/AccessorCommandHandler.java
@@ -0,0 +1,18 @@
+package moe.nea.ultranotifier.mixin;
+
+//#if FORGE
+//$$import net.minecraft.command.CommandHandler;
+//$$import net.minecraft.command.ICommand;
+//$$import org.jetbrains.annotations.NotNull;
+//$$import org.spongepowered.asm.mixin.Mixin;
+//$$import org.spongepowered.asm.mixin.gen.Accessor;
+//$$
+//$$import java.util.Set;
+//$$
+//$$@Mixin(CommandHandler.class)
+//$$public interface AccessorCommandHandler {
+//$$ @Accessor("commandSet")
+//$$ @NotNull
+//$$ Set<@NotNull ICommand> getCommandSet_ultraNotifier();
+//$$}
+//#endif \ No newline at end of file
diff --git a/src/main/kotlin/UltraNotifier.kt b/src/main/kotlin/UltraNotifier.kt
index dce1fda..f1bb8ff 100644
--- a/src/main/kotlin/UltraNotifier.kt
+++ b/src/main/kotlin/UltraNotifier.kt
@@ -1,6 +1,7 @@
package moe.nea.ultranotifier
import moe.nea.ultranotifier.commands.Commands
+import moe.nea.ultranotifier.event.RegistrationFinishedEvent
import moe.nea.ultranotifier.init.NeaMixinConfig
import java.io.File
@@ -18,6 +19,9 @@ object UltraNotifier {
logger.info("Loaded ${mixinPlugin.mixins.size} mixins for ${mixinPlugin.mixinPackage}.")
}
Commands.init()
+
+ RegistrationFinishedEvent().post()
+
}
val configFolder = File("config/ultra-notifier").also {
diff --git a/src/main/kotlin/commands/BrigadierPatchbay.kt b/src/main/kotlin/commands/BrigadierPatchbay.kt
new file mode 100644
index 0000000..7396b6c
--- /dev/null
+++ b/src/main/kotlin/commands/BrigadierPatchbay.kt
@@ -0,0 +1,117 @@
+package moe.nea.ultranotifier.commands
+
+//#if FORGE
+//$$import com.mojang.brigadier.CommandDispatcher
+//$$import com.mojang.brigadier.builder.LiteralArgumentBuilder
+//$$import com.mojang.brigadier.tree.CommandNode
+//$$import moe.nea.ultranotifier.event.CommandRegistrationEvent
+//$$import moe.nea.ultranotifier.event.RegistrationFinishedEvent
+//$$import moe.nea.ultranotifier.event.UltraNotifierEvents
+//$$import moe.nea.ultranotifier.event.UltraSubscribe
+//$$import moe.nea.ultranotifier.mixin.AccessorCommandHandler
+//$$import net.minecraft.command.CommandBase
+//$$import net.minecraft.command.CommandHandler
+//$$import net.minecraft.command.ICommandSender
+//$$import net.minecraft.util.BlockPos
+//$$import net.minecraft.util.ChatComponentText
+//$$import net.minecraft.util.text.ITextComponent
+//$$import net.minecraftforge.client.ClientCommandHandler
+//$$
+//$$fun CommandHandler.getCommandSet() = (this as AccessorCommandHandler).commandSet_ultraNotifier
+//$$
+//$$class BridgedCommandSource(
+//$$ val sender: ICommandSender
+//$$) : UltraCommandSource {
+//$$ override fun sendFeedback(text: ITextComponent) {
+//$$ sender.addChatMessage(text)
+//$$ }
+//$$}
+//$$
+//$$class BrigadierCommand(
+//$$ val dispatcher: CommandDispatcher<UltraCommandSource>,
+//$$ val node: CommandNode<UltraCommandSource>
+//$$) : CommandBase() {
+//$$ override fun addTabCompletionOptions(
+//$$ sender: ICommandSender?,
+//$$ args: Array<out String>?,
+//$$ pos: BlockPos?
+//$$ ): MutableList<String> {
+//$$ return super.addTabCompletionOptions(sender, args, pos)
+//$$ }
+//$$
+//$$ override fun canCommandSenderUseCommand(sender: ICommandSender?): Boolean {
+//$$ // TODO: proper check here maybe?
+//$$ return true
+//$$ }
+//$$
+//$$ override fun getCommandName(): String {
+//$$ return node.name
+//$$ }
+//$$
+//$$ override fun getCommandUsage(sender: ICommandSender?): String {
+//$$ return ""
+//$$ }
+//$$
+//$$ private fun getCommandLineText(args: Array<out String>) = "${node.name} ${args.joinToString(" ")}".trim()
+//$$
+//$$ override fun processCommand(sender: ICommandSender, args: Array<out String>) {
+//$$ val source = BridgedCommandSource(sender)
+//$$ val results = dispatcher.parse(getCommandLineText(args), source)
+//$$ kotlin.runCatching {
+//$$ dispatcher.execute(results)
+//$$ Unit
+//$$ }.recoverCatching {
+//$$ source.sendFeedback(ChatComponentText("Could not execute ultra command: ${it.message}"))
+//$$ }
+//$$ }
+//$$}
+//$$
+//$$object BrigadierPatchbay {
+//$$
+//$$ @UltraSubscribe
+//$$ fun onAfterRegistration(event: RegistrationFinishedEvent) {
+//$$ fullReload()
+//$$ }
+//$$
+//$$ @UltraSubscribe
+//$$ fun onCommands(event: CommandRegistrationEvent) {
+//$$ event.dispatcher
+//$$ .register(LiteralArgumentBuilder.literal<UltraCommandSource>("reloadcommands")
+//$$ .executes {
+//$$ it.source.sendFeedback(literalText("Reloading commands"))
+//$$ fullReload()
+//$$ it.source.sendFeedback(literalText("Reload completed"))
+//$$ 0
+//$$ })
+//$$ }
+//$$
+//$$ fun fullReload() {
+//$$ val handler = ClientCommandHandler.instance
+//$$ unpatch(handler)
+//$$ val dispatcher = createDispatcher()
+//$$ UltraNotifierEvents.post(CommandRegistrationEvent(dispatcher))
+//$$ patch(handler, dispatcher)
+//$$ }
+//$$
+//$$ fun createDispatcher() = CommandDispatcher<UltraCommandSource>()
+//$$
+//$$ fun unpatch(handler: CommandHandler) {
+//$$ handler.getCommandSet()
+//$$ .removeIf {
+//$$ it is BrigadierCommand
+//$$ }
+//$$ handler.commands.entries
+//$$ .removeIf {
+//$$ it.value is BrigadierCommand
+//$$ }
+//$$ }
+//$$
+//$$ fun patch(handler: CommandHandler, dispatcher: CommandDispatcher<UltraCommandSource>) {
+//$$ dispatcher.root.children
+//$$ .map { BrigadierCommand(dispatcher, it) }
+//$$ .forEach(handler::registerCommand)
+//$$ }
+//$$}
+//#endif
+
+
diff --git a/src/main/kotlin/commands/Commands.kt b/src/main/kotlin/commands/Commands.kt
index 75047cd..4509fcf 100644
--- a/src/main/kotlin/commands/Commands.kt
+++ b/src/main/kotlin/commands/Commands.kt
@@ -1,9 +1,10 @@
package moe.nea.ultranotifier.commands
-import com.mojang.brigadier.CommandDispatcher
import com.mojang.brigadier.builder.LiteralArgumentBuilder
import moe.nea.ultranotifier.UltraNotifier
+import moe.nea.ultranotifier.event.CommandRegistrationEvent
import moe.nea.ultranotifier.event.UltraNotifierEvents
+import moe.nea.ultranotifier.event.UltraSubscribe
import net.minecraft.text.Text
interface CustomSource {
@@ -20,29 +21,37 @@ typealias UltraCommandSource =
//#endif
+fun translatableText(key: String, vararg args: String) =
+//#if MC > 11400
+ Text.translatable(key, *args)
+//#else
+//$$ net.minecraft.util.ChatComponentTranslation(key, *args)
+//#endif
+
fun literalText(string: String): Text =
-//#if MC >= 11400
+//#if MC > 11400
Text.literal(string)
//#else
//$$ net.minecraft.util.ChatComponentText(string)
//#endif
object Commands {
- fun registerAll(dispatcher: CommandDispatcher<UltraCommandSource>) {
- dispatcher.register(LiteralArgumentBuilder.literal<UltraCommandSource>("hello")
- .executes {
- it.source.sendFeedback(literalText("Hello World"))
- 0
- })
+ @UltraSubscribe
+ fun registerTestCommand(event: CommandRegistrationEvent) {
+ event.dispatcher.register(LiteralArgumentBuilder.literal<UltraCommandSource>("hello")
+ .executes {
+ it.source.sendFeedback(literalText("Hello World"))
+ 0
+ })
}
fun init() {
UltraNotifierEvents.register(this)
//#if FORGE
-//$$
+//$$ UltraNotifierEvents.register(BrigadierPatchbay)
//#else
net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback.EVENT.register { dispatcher, registryAccess ->
- registerAll(dispatcher)
+ UltraNotifierEvents.post(CommandRegistrationEvent(dispatcher))
}
//#endif
UltraNotifier.logger.info("Initialized command subsystem")
diff --git a/src/main/kotlin/event/CommandRegistrationEvent.kt b/src/main/kotlin/event/CommandRegistrationEvent.kt
new file mode 100644
index 0000000..49bc637
--- /dev/null
+++ b/src/main/kotlin/event/CommandRegistrationEvent.kt
@@ -0,0 +1,10 @@
+package moe.nea.ultranotifier.event
+
+import com.mojang.brigadier.CommandDispatcher
+import moe.nea.ultranotifier.commands.UltraCommandSource
+
+/**
+ * Fired whenever commands need to be registered. This may be multiple times during each launch. Old commands will be
+ * automatically unregistered first.
+ */
+class CommandRegistrationEvent(val dispatcher: CommandDispatcher<UltraCommandSource>) : UltraEvent()
diff --git a/src/main/kotlin/event/RegistrationFinishedEvent.kt b/src/main/kotlin/event/RegistrationFinishedEvent.kt
new file mode 100644
index 0000000..325e1d8
--- /dev/null
+++ b/src/main/kotlin/event/RegistrationFinishedEvent.kt
@@ -0,0 +1,6 @@
+package moe.nea.ultranotifier.event
+
+/**
+ * Indicates that the registration of all ultra event handlers is done
+ */
+class RegistrationFinishedEvent : UltraEvent()
diff --git a/src/main/kotlin/event/UltraEvent.kt b/src/main/kotlin/event/UltraEvent.kt
index 42fa4f2..4f615c1 100644
--- a/src/main/kotlin/event/UltraEvent.kt
+++ b/src/main/kotlin/event/UltraEvent.kt
@@ -32,6 +32,10 @@ abstract class UltraEvent :
setCancelled(true)
}
+ fun post() {
+ UltraNotifierEvents.post(this)
+ }
+
}