diff options
Diffstat (limited to 'src/main')
36 files changed, 1365 insertions, 37 deletions
diff --git a/src/main/java/moe/nea/ultranotifier/mixin/AccessorChatHudImpl.java b/src/main/java/moe/nea/ultranotifier/mixin/AccessorChatHudImpl.java new file mode 100644 index 0000000..ec30dcf --- /dev/null +++ b/src/main/java/moe/nea/ultranotifier/mixin/AccessorChatHudImpl.java @@ -0,0 +1,23 @@ +package moe.nea.ultranotifier.mixin; + +import moe.nea.ultranotifier.util.minecrat.AccessorChatHud; +import net.minecraft.client.gui.hud.ChatHud; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(ChatHud.class) +public abstract class AccessorChatHudImpl implements AccessorChatHud { + + //#if MC>1.17 + @Shadow + protected abstract int getLineHeight(); + //#endif + @Override + public int getLineHeight_ultranotifier() { + //#if MC>1.17 + return getLineHeight(); + //#else + //$$return 9; // TODO: better typing here + //#endif + } +} 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/java/moe/nea/ultranotifier/mixin/ChatHudCategoryTracker.java b/src/main/java/moe/nea/ultranotifier/mixin/ChatHudCategoryTracker.java new file mode 100644 index 0000000..6205506 --- /dev/null +++ b/src/main/java/moe/nea/ultranotifier/mixin/ChatHudCategoryTracker.java @@ -0,0 +1,49 @@ +package moe.nea.ultranotifier.mixin; + +import moe.nea.ultranotifier.datamodel.CategorizedChatLine; +import moe.nea.ultranotifier.datamodel.ChatCategoryArbiter; +import moe.nea.ultranotifier.datamodel.HasCategorizedChatLine; +import net.minecraft.client.gui.hud.ChatHudLine; +import net.minecraft.text.Text; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +//#if MC> 1.20 +import net.minecraft.client.gui.hud.MessageIndicator; +import net.minecraft.network.message.MessageSignatureData; +//#endif + +@Mixin(ChatHudLine.class) +public class ChatHudCategoryTracker<T> implements HasCategorizedChatLine { + @Unique + CategorizedChatLine categorizedSelf; + + @Inject(method = "<init>", at = @At("RETURN")) + private void onInit( + int creationTick, + //#if MC>1.20 + Text content, + //#elseif MC<1.16 + //$$net.minecraft.util.text.ITextComponent content, + //$$int weird, + //#else + //$$T content, + //$$int weird, + //#endif + //#if MC>1.20 + MessageSignatureData signature, MessageIndicator tag, + //#endif + CallbackInfo ci + ) { + categorizedSelf = ChatCategoryArbiter.INSTANCE.categorize((Text)content); + } + + @Override + public @NotNull CategorizedChatLine getCategorizedChatLine_ultraNotifier() { + return categorizedSelf; + } +} diff --git a/src/main/java/moe/nea/ultranotifier/mixin/ChatHudMessageAdded.java b/src/main/java/moe/nea/ultranotifier/mixin/ChatHudMessageAdded.java index 2b65282..d7ed298 100644 --- a/src/main/java/moe/nea/ultranotifier/mixin/ChatHudMessageAdded.java +++ b/src/main/java/moe/nea/ultranotifier/mixin/ChatHudMessageAdded.java @@ -3,7 +3,7 @@ package moe.nea.ultranotifier.mixin; import moe.nea.ultranotifier.event.ChatGuiLineEvent; import moe.nea.ultranotifier.event.UltraNotifierEvents; import net.minecraft.client.gui.hud.ChatHud; -//#if MC > 11404 +//#if MC >= 1.20 import net.minecraft.client.gui.hud.MessageIndicator; import net.minecraft.network.message.MessageSignatureData; //#endif @@ -18,25 +18,26 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; ) public class ChatHudMessageAdded { @Inject( -//#if MC <= 11404 -//#if FORGE -//$$ method = "printChatMessageWithOptionalDeletion", -//#else -//$$ method = "addMessage(Lnet/minecraft/text/Text;I)V", -//#endif -//#else +//#if MC >= 1.20 method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;Lnet/minecraft/client/gui/hud/MessageIndicator;)V", +//#elseif MC >= 1.16 +//$$ method = "addMessage(Lnet/minecraft/text/Text;IIZ)V", +//#else +//$$ method = "printChatMessageWithOptionalDeletion", //#endif at = @At("HEAD"), cancellable = true) private void onAddMessage( Text message, -//#if MC <= 11404 -//$$ int chatLineId, -//#else +//#if MC >= 1.20 MessageSignatureData signatureData, MessageIndicator indicator, +//#elseif MC >= 1.16 +//$$ int chatLineId, int timestamp, boolean bl, +//#else +//$$ int chatLineId, //#endif CallbackInfo ci ) { + // TODO: in this method prevent messages from being flushed (to preserve more history) if (UltraNotifierEvents.post(new ChatGuiLineEvent(message)).isCancelled()) { ci.cancel(); } diff --git a/src/main/java/moe/nea/ultranotifier/mixin/ChatScreenTabRenderer.java b/src/main/java/moe/nea/ultranotifier/mixin/ChatScreenTabRenderer.java new file mode 100644 index 0000000..972e40c --- /dev/null +++ b/src/main/java/moe/nea/ultranotifier/mixin/ChatScreenTabRenderer.java @@ -0,0 +1,77 @@ +package moe.nea.ultranotifier.mixin; + +import moe.nea.ultranotifier.gui.ChatUi; +import moe.nea.ultranotifier.util.render.ScreenRenderUtils; +import net.minecraft.client.gui.screen.ChatScreen; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +//#if MC>1.16 +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.util.math.MatrixStack; +//#endif + +@Mixin(ChatScreen.class) +public abstract class ChatScreenTabRenderer { + + private ChatUi chatUi_ultraNotifier = new ChatUi((ChatScreen) (Object) this); + + @Unique + ChatUi chatUi() {return chatUi_ultraNotifier;} + + @Inject( +//#if MC > 1.16 + method = "render", +//#else +//$$ method="drawScreen", +//#endif + at = @At("HEAD")) + private void onRender( +//#if MC >1.20 + DrawContext context, +//#elseif MC > 1.16 +//$$ MatrixStack context, +//#endif + int mouseX, int mouseY, + float delta, + CallbackInfo ci) { + chatUi().renderButtons( + ScreenRenderUtils.umatrix( + //#if MC > 1.16 + context + //#endif + ), + mouseX, mouseY + ); + } + + @Inject( + method = "mouseClicked", + at = @At(value = "INVOKE", + //#if MC > 1.16 + target = "Lnet/minecraft/client/gui/screen/Screen;mouseClicked(DDI)Z", + //#else + //$$target = "Lnet/minecraft/client/gui/GuiScreen;mouseClicked(III)V", + //#endif + opcode = Opcodes.INVOKESPECIAL) + ) + private void onMouseClick( + //#if MC > 1.16 + double mouseX, double mouseY, + //#else + //$$int mouseX, int mouseY, + //#endif + int button, + //#if MC > 1.16 + CallbackInfoReturnable<Boolean> cir + //#else + //$$CallbackInfo cir + //#endif + ) { + chatUi().clickMouse(mouseX, mouseY, button); + } +} diff --git a/src/main/java/moe/nea/ultranotifier/mixin/FilterVisibleMessagePatch.java b/src/main/java/moe/nea/ultranotifier/mixin/FilterVisibleMessagePatch.java new file mode 100644 index 0000000..22e06b5 --- /dev/null +++ b/src/main/java/moe/nea/ultranotifier/mixin/FilterVisibleMessagePatch.java @@ -0,0 +1,72 @@ +package moe.nea.ultranotifier.mixin; + +import moe.nea.ultranotifier.event.UltraNotifierEvents; +import moe.nea.ultranotifier.event.VisibleChatMessageAddedEvent; +import net.minecraft.client.gui.hud.ChatHud; +import net.minecraft.client.gui.hud.ChatHudLine; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import java.util.Collections; +import java.util.List; + +@Mixin(ChatHud.class) +public class FilterVisibleMessagePatch { +//#if MC > 1.18 + @Inject( + method = "addVisibleMessage", + at = @At("HEAD"), + cancellable = true + ) + private void onAddVisibleMessage(ChatHudLine message, CallbackInfo ci) { + if (UltraNotifierEvents.post(new VisibleChatMessageAddedEvent(message)).isCancelled()) { + ci.cancel(); + } + } +//#else +//$$ @Unique +//$$ ChatHudLine lastAddedChatLine; +//$$ +//$$ @Inject(method = "reset()V", +//$$ at = @At(value = "INVOKE", +//$$ target = "Lnet/minecraft/client/gui/hud/ChatHud;addMessage(Lnet/minecraft/text/Text;IIZ)V"), +//$$ locals = LocalCapture.CAPTURE_FAILHARD) +//$$ private void saveMessageAboutToBeRefreshed(CallbackInfo ci, int i, ChatHudLine chatLine) { +//$$ lastAddedChatLine = chatLine; +//$$ } +//$$ +//$$ @Inject(method = "addMessage(Lnet/minecraft/text/Text;IIZ)V", at = @At(value = "INVOKE", +//#if MC > 1.16 +//$$ target = "Lnet/minecraft/client/util/ChatMessages;breakRenderedChatMessageLines(Lnet/minecraft/text/StringVisitable;ILnet/minecraft/client/font/TextRenderer;)Ljava/util/List;" +//#else +//$$ target = "Lnet/minecraft/client/gui/GuiUtilRenderComponents;splitText(Lnet/minecraft/util/text/ITextComponent;ILnet/minecraft/client/gui/FontRenderer;ZZ)Ljava/util/List;" +//#endif +//$$ )) +//$$ private void saveMessage(Text chatComponent, int chatLineId, int updateCounter, boolean displayOnly, CallbackInfo ci) { +//$$ if (lastAddedChatLine != null && lastAddedChatLine.getText() != chatComponent) { +//$$ throw new RuntimeException("Out of order message received"); +//$$ } +//$$ if (lastAddedChatLine == null) +//$$ lastAddedChatLine = new ChatHudLine(chatLineId, chatComponent, updateCounter); +//$$ } +//$$ +//$$ @ModifyVariable( +//$$ method = "addMessage(Lnet/minecraft/text/Text;IIZ)V", +//$$ at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/ChatHud;isChatFocused()Z") +//$$ ) +//$$ private List onAddVisibleMessage(List value) { +//$$ VisibleChatMessageAddedEvent event = new VisibleChatMessageAddedEvent(lastAddedChatLine); +//$$ lastAddedChatLine = null; +//$$ if (UltraNotifierEvents.post(event).isCancelled()) { +//$$ return Collections.emptyList(); +//$$ } +//$$ return value; +//$$ } +//#endif +} diff --git a/src/main/kotlin/AllModules.kt b/src/main/kotlin/AllModules.kt new file mode 100644 index 0000000..01cfb36 --- /dev/null +++ b/src/main/kotlin/AllModules.kt @@ -0,0 +1,17 @@ +package moe.nea.ultranotifier + +import moe.nea.ultranotifier.commands.Commands +import moe.nea.ultranotifier.datamodel.ChatCategoryArbiter +import moe.nea.ultranotifier.event.SubscriptionTarget +import moe.nea.ultranotifier.event.TickEvent +import moe.nea.ultranotifier.gui.ScreenUtil + +object AllModules { + val allModules: List<SubscriptionTarget> = listOf( + ChatStore, + Commands, + ScreenUtil, + TickEvent, + ChatCategoryArbiter, + ) +} diff --git a/src/main/kotlin/ChatStore.kt b/src/main/kotlin/ChatStore.kt new file mode 100644 index 0000000..4cc6ee1 --- /dev/null +++ b/src/main/kotlin/ChatStore.kt @@ -0,0 +1,53 @@ +package moe.nea.ultranotifier + +import com.mojang.brigadier.builder.LiteralArgumentBuilder +import moe.nea.ultranotifier.commands.UltraCommandSource +import moe.nea.ultranotifier.commands.literalText +import moe.nea.ultranotifier.event.ChatGuiLineEvent +import moe.nea.ultranotifier.event.CommandRegistrationEvent +import moe.nea.ultranotifier.event.PacketChatLineEvent +import moe.nea.ultranotifier.event.SubscriptionTarget +import moe.nea.ultranotifier.event.UltraSubscribe +import moe.nea.ultranotifier.gui.MessageUi +import moe.nea.ultranotifier.gui.ScreenUtil +import moe.nea.ultranotifier.util.IdentityCharacteristics +import net.minecraft.text.Text + +object ChatStore : SubscriptionTarget { + + data class ChatLine( + val text: Text, + var fromPacket: Boolean = false, + var isDisplayed: Boolean = false, + ) + + val allLines = object : LinkedHashMap<IdentityCharacteristics<Text>, ChatLine>() { + override fun removeEldestEntry(eldest: MutableMap.MutableEntry<IdentityCharacteristics<Text>, ChatLine>?): Boolean { + return size > 500 // TODO: config + } + } + + fun insertChatLine(text: Text): ChatLine { + return allLines.getOrPut(IdentityCharacteristics(text)) { ChatLine(text) } + } + + @UltraSubscribe + fun onMessageDisplayed(event: ChatGuiLineEvent) { + insertChatLine(event.component).isDisplayed = true + } + + @UltraSubscribe + fun registerCommands(event: CommandRegistrationEvent) { + event.dispatcher.register(LiteralArgumentBuilder.literal<UltraCommandSource?>("ultranotifier") + .executes { + it.source.sendFeedback(literalText("Opening screen")) + ScreenUtil.openScreen = (MessageUi()) + 0 + }) + } + + @UltraSubscribe + fun onMessageReceived(event: PacketChatLineEvent) { + insertChatLine(event.component).fromPacket = true + } +} diff --git a/src/main/kotlin/Constants.kt b/src/main/kotlin/Constants.kt index a1903ce..46d4236 100644 --- a/src/main/kotlin/Constants.kt +++ b/src/main/kotlin/Constants.kt @@ -1,6 +1,6 @@ package moe.nea.ultranotifier - +// TODO: blossom this shit object Constants { const val MOD_ID = "ultranotifier" const val VERSION = "1.0.0" @@ -23,5 +23,15 @@ object Constants { "1.20.6" //#elseif MC == 11404 //$$ "1.14.4" +//#elseif MC == 11202 +//$$ "1.12.2" +//#elseif MC == 11605 +//$$ "1.16.5" +//#elseif MC == 11602 +//$$ "1.16.2" +//#elseif MC == 12100 +//$$ "1.21" +//#elseif MC == 12101 +//$$ "1.21.1" //#endif } diff --git a/src/main/kotlin/UltraNotifier.kt b/src/main/kotlin/UltraNotifier.kt index dce1fda..ddf8e87 100644 --- a/src/main/kotlin/UltraNotifier.kt +++ b/src/main/kotlin/UltraNotifier.kt @@ -1,12 +1,14 @@ package moe.nea.ultranotifier -import moe.nea.ultranotifier.commands.Commands +import moe.nea.ultranotifier.event.RegistrationFinishedEvent +import moe.nea.ultranotifier.event.UltraEvent +import moe.nea.ultranotifier.event.UltraNotifierEvents import moe.nea.ultranotifier.init.NeaMixinConfig import java.io.File object UltraNotifier { val logger = -//#if MC <= 11404 +//#if MC <= 1.17 //$$ org.apache.logging.log4j.LogManager.getLogger("UltraNotifier")!! //#else org.slf4j.LoggerFactory.getLogger("UltraNotifier")!! @@ -17,7 +19,15 @@ object UltraNotifier { for (mixinPlugin in NeaMixinConfig.getMixinPlugins()) { logger.info("Loaded ${mixinPlugin.mixins.size} mixins for ${mixinPlugin.mixinPackage}.") } - Commands.init() + logger.info("All modules: ${AllModules.allModules}") + AllModules.allModules.forEach { + logger.info("Registering $it") + UltraNotifierEvents.register(it) + it.init() + } + + RegistrationFinishedEvent().post() + } val configFolder = File("config/ultra-notifier").also { diff --git a/src/main/kotlin/UltraNotifierEntryPoint.kt b/src/main/kotlin/UltraNotifierEntryPoint.kt index 42ae064..aa84dc5 100644 --- a/src/main/kotlin/UltraNotifierEntryPoint.kt +++ b/src/main/kotlin/UltraNotifierEntryPoint.kt @@ -3,14 +3,14 @@ package moe.nea.ultranotifier //#if FORGE //$$import net.minecraftforge.fml.common.Mod //$$ -//#if MC == 10809 +//#if MC < 1.13 //$$import net.minecraftforge.fml.common.event.FMLInitializationEvent //$$@Mod(modid = Constants.MOD_ID, version = Constants.VERSION, useMetadata = true) //#else //$$@Mod(Constants.MOD_ID) //#endif //$$class UltraNotifierEntryPoint { -//#if MC == 10809 +//#if MC < 1.13 //$$ @Mod.EventHandler //$$ fun onInit(@Suppress("UNUSED_PARAMETER") event: FMLInitializationEvent) { //#else diff --git a/src/main/kotlin/commands/BrigadierPatchbay.kt b/src/main/kotlin/commands/BrigadierPatchbay.kt new file mode 100644 index 0000000..b88d0e7 --- /dev/null +++ b/src/main/kotlin/commands/BrigadierPatchbay.kt @@ -0,0 +1,119 @@ +package moe.nea.ultranotifier.commands + +//#if MC < 1.16 +//$$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.event.SubscriptionTarget +//$$import moe.nea.ultranotifier.mixin.AccessorCommandHandler +//$$import net.minecraft.command.CommandBase +//$$import net.minecraft.command.CommandHandler +//$$import net.minecraft.command.ICommandSender +//$$import net.minecraft.server.MinecraftServer +//$$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.sendMessage(text) +//$$ } +//$$} +//$$ +//$$class BrigadierCommand( +//$$ val dispatcher: CommandDispatcher<UltraCommandSource>, +//$$ val node: CommandNode<UltraCommandSource> +//$$) : CommandBase() { +//#if MC >= 1.12 +//$$ override fun checkPermission(server: MinecraftServer, sender: ICommandSender): Boolean { +//$$ return true +//$$ } +//#else +//$$ override fun canCommandSenderUseCommand(sender: ICommandSender): Boolean { +//$$ return true +//$$ } +//#endif +//$$ +//$$ override fun getName(): String { +//$$ return node.name +//$$ } +//$$ +//$$ override fun getUsage(sender: ICommandSender): String { +//$$ return "" +//$$ } +//$$ +//$$ private fun getCommandLineText(args: Array<out String>) = "${node.name} ${args.joinToString(" ")}".trim() +//$$ +//$$ +//#if MC < 1.12 +//$$ override fun processCommand(sender: ICommandSender, args: Array<out String>) { +//#else +//$$ override fun execute(server: MinecraftServer, sender: ICommandSender, args: Array<out String>) { +//#endif +//$$ val source = BridgedCommandSource(sender) +//$$ val results = dispatcher.parse(getCommandLineText(args), source) +//$$ kotlin.runCatching { +//$$ dispatcher.execute(results) +//$$ Unit +//$$ }.recoverCatching { +//$$ source.sendFeedback(literalText("Could not execute ultra command: ${it.message}")) +//$$ } +//$$ } +//$$} +//$$ +//$$object BrigadierPatchbay : SubscriptionTarget { +//$$ +//$$ @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..5975bb2 100644 --- a/src/main/kotlin/commands/Commands.kt +++ b/src/main/kotlin/commands/Commands.kt @@ -1,9 +1,11 @@ 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.SubscriptionTarget import moe.nea.ultranotifier.event.UltraNotifierEvents +import moe.nea.ultranotifier.event.UltraSubscribe import net.minecraft.text.Text interface CustomSource { @@ -14,35 +16,50 @@ interface CustomSource { typealias UltraCommandSource = //#if FORGE //$$ CustomSource -//#else +//#elseif MC > 1.18 net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource - +//#else +//$$ net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource //#endif +fun translatableText(key: String, vararg args: String) = +//#if MC > 1.17 + Text.translatable(key, *args) +//#else +//$$ net.minecraft.text.TranslatableText(key, *args) +//#endif + fun literalText(string: String): Text = -//#if MC >= 11400 +//#if MC > 1.17 Text.literal(string) //#else -//$$ net.minecraft.util.ChatComponentText(string) +//$$ net.minecraft.text.LiteralText(string) //#endif -object Commands { - fun registerAll(dispatcher: CommandDispatcher<UltraCommandSource>) { - dispatcher.register(LiteralArgumentBuilder.literal<UltraCommandSource>("hello") - .executes { - it.source.sendFeedback(literalText("Hello World")) - 0 - }) +object Commands : SubscriptionTarget { + @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 MC <= 1.18 && FABRIC +//$$ @UltraSubscribe +//$$ fun registerEverythingOnce(event: moe.nea.ultranotifier.event.RegistrationFinishedEvent) { +//$$ CommandRegistrationEvent(net.fabricmc.fabric.api.client.command.v1.ClientCommandManager.DISPATCHER).post() +//$$ } +//#endif + + override fun init() { //#if FORGE -//$$ -//#else +//$$ UltraNotifierEvents.register(BrigadierPatchbay) +//#elseif MC > 1.18 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/datamodel/ChatType.kt b/src/main/kotlin/datamodel/ChatType.kt new file mode 100644 index 0000000..47abe2a --- /dev/null +++ b/src/main/kotlin/datamodel/ChatType.kt @@ -0,0 +1,175 @@ +package moe.nea.ultranotifier.datamodel + +import moe.nea.ultranotifier.UltraNotifier +import moe.nea.ultranotifier.event.SubscriptionTarget +import moe.nea.ultranotifier.event.TickEvent +import moe.nea.ultranotifier.event.UltraSubscribe +import moe.nea.ultranotifier.event.VisibleChatMessageAddedEvent +import moe.nea.ultranotifier.util.GsonUtil +import moe.nea.ultranotifier.util.duplicatesBy +import moe.nea.ultranotifier.util.minecrat.MC +import moe.nea.ultranotifier.util.minecrat.category +import moe.nea.ultranotifier.util.minecrat.getFormattedTextCompat +import moe.nea.ultranotifier.util.minecrat.removeFormattingCodes +import net.minecraft.text.Text +import util.KSerializable +import java.util.function.Predicate +import java.util.regex.Pattern + +data class ChatTypeId( + val id: String +) + +@KSerializable +data class ChatType( + val name: String, + val patterns: List<ChatPattern>, +) + +data class ChatPattern( + val text: String +) { + val pattern = Pattern.compile(text) + val predicate: Predicate<String> = +//#if JAVA > 11 + pattern.asMatchPredicate() +//#else +//$$ Predicate { it: String -> pattern.matcher(it).matches() } +//#endif +} + +data class CategoryId(val id: String) + +@KSerializable +data class ChatCategory( + val id: CategoryId, + val label: String, + val chatTypes: Set<ChatTypeId>, +) + +data class ChatUniverse( + val name: String, + val types: Map<ChatTypeId, ChatType>, + val categories: List<ChatCategory>, +) { + fun categorize( + text: String + ): CategorizedChatLine { + val types = this.types + .asSequence() + .filter { + it.value.patterns.any { + it.predicate.test(text) + } + } + .map { + it.key |
