diff options
Diffstat (limited to 'src/main/java/moe/nea/ultranotifier')
6 files changed, 251 insertions, 11 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 +} |