aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/cc/woverflow/chatting/mixin
diff options
context:
space:
mode:
authorWyvest <45589059+Wyvest@users.noreply.github.com>2023-01-14 15:23:07 -0500
committerWyvest <45589059+Wyvest@users.noreply.github.com>2023-01-14 15:23:07 -0500
commit9234829c2aeb4ca7e2d270273a803dc6e98fd889 (patch)
tree84950cdfe6b1d09bac89e7022bd95a7956d5c060 /src/main/java/cc/woverflow/chatting/mixin
parentee8f9de5a156f356e53eb70476f05cd2bf07ae89 (diff)
downloadChatting-9234829c2aeb4ca7e2d270273a803dc6e98fd889.tar.gz
Chatting-9234829c2aeb4ca7e2d270273a803dc6e98fd889.tar.bz2
Chatting-9234829c2aeb4ca7e2d270273a803dc6e98fd889.zip
add smooth messages
Diffstat (limited to 'src/main/java/cc/woverflow/chatting/mixin')
-rw-r--r--src/main/java/cc/woverflow/chatting/mixin/GuiNewChatMixin_ChatTabs.java12
-rw-r--r--src/main/java/cc/woverflow/chatting/mixin/GuiNewChatMixin_SmoothMessages.java99
2 files changed, 101 insertions, 10 deletions
diff --git a/src/main/java/cc/woverflow/chatting/mixin/GuiNewChatMixin_ChatTabs.java b/src/main/java/cc/woverflow/chatting/mixin/GuiNewChatMixin_ChatTabs.java
index 1d29941..d21097d 100644
--- a/src/main/java/cc/woverflow/chatting/mixin/GuiNewChatMixin_ChatTabs.java
+++ b/src/main/java/cc/woverflow/chatting/mixin/GuiNewChatMixin_ChatTabs.java
@@ -1,13 +1,11 @@
package cc.woverflow.chatting.mixin;
-import cc.woverflow.chatting.chat.ChatSearchingManager;
import cc.woverflow.chatting.chat.ChatTabs;
import cc.woverflow.chatting.config.ChattingConfig;
import cc.woverflow.chatting.utils.ModCompatHooks;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.ChatLine;
import net.minecraft.client.gui.GuiNewChat;
-import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IChatComponent;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
@@ -17,24 +15,18 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.List;
-import java.util.Locale;
-@Mixin(GuiNewChat.class)
+@Mixin(value = GuiNewChat.class, priority = 990)
public abstract class GuiNewChatMixin_ChatTabs {
@Shadow @Final private Minecraft mc;
@Shadow public abstract void deleteChatLine(int id);
@Shadow @Final private List<ChatLine> chatLines;
- @SuppressWarnings({"FieldCanBeLocal", "unused"})
- private float percentComplete; //betterchat support
@Inject(method = "printChatMessageWithOptionalDeletion", at = @At("HEAD"), cancellable = true)
private void handlePrintChatMessage(IChatComponent chatComponent, int chatLineId, CallbackInfo ci) {
handleChatTabMessage(chatComponent, chatLineId, mc.ingameGUI.getUpdateCounter(), false, ci);
- if (!EnumChatFormatting.getTextWithoutFormattingCodes(chatComponent.getUnformattedText()).toLowerCase(Locale.ENGLISH).contains(ChatSearchingManager.INSTANCE.getLastSearch().toLowerCase(Locale.ENGLISH))) {
- percentComplete = 1.0F;
- }
}
@Inject(method = "setChatLine", at = @At("HEAD"), cancellable = true)
@@ -45,7 +37,7 @@ public abstract class GuiNewChatMixin_ChatTabs {
private void handleChatTabMessage(IChatComponent chatComponent, int chatLineId, int updateCounter, boolean displayOnly, CallbackInfo ci) {
if (ChattingConfig.INSTANCE.getChatTabs()) {
if (!ChatTabs.INSTANCE.shouldRender(chatComponent)) {
- percentComplete = 1.0F;
+ ChatTabs.INSTANCE.setHasCancelledAnimation(true);
if (chatLineId != 0) {
deleteChatLine(chatLineId);
}
diff --git a/src/main/java/cc/woverflow/chatting/mixin/GuiNewChatMixin_SmoothMessages.java b/src/main/java/cc/woverflow/chatting/mixin/GuiNewChatMixin_SmoothMessages.java
new file mode 100644
index 0000000..a09fe0c
--- /dev/null
+++ b/src/main/java/cc/woverflow/chatting/mixin/GuiNewChatMixin_SmoothMessages.java
@@ -0,0 +1,99 @@
+package cc.woverflow.chatting.mixin;
+
+import cc.woverflow.chatting.chat.ChatSearchingManager;
+import cc.woverflow.chatting.chat.ChatTabs;
+import cc.woverflow.chatting.config.ChattingConfig;
+import net.minecraft.client.gui.GuiNewChat;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+import net.minecraft.util.MathHelper;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+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.ModifyArg;
+import org.spongepowered.asm.mixin.injection.ModifyVariable;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import java.util.List;
+import java.util.Locale;
+
+@Mixin(GuiNewChat.class)
+public abstract class GuiNewChatMixin_SmoothMessages {
+ @Shadow
+ private boolean isScrolled;
+
+ @Shadow
+ public abstract float getChatScale();
+
+ private float chatting$percentComplete; //be nice and allow other mods to access this :)
+ @Unique
+ private int chatting$newLines;
+ @Unique
+ private long chatting$prevMillis = System.currentTimeMillis();
+ @Unique
+ private float chatting$animationPercent;
+ @Unique
+ private int chatting$lineBeingDrawn;
+
+ private void updatePercentage(long diff) {
+ if (chatting$percentComplete < 1) chatting$percentComplete += 0.004f * diff;
+ chatting$percentComplete = MathHelper.clamp_float(chatting$percentComplete, 0, 1);
+ }
+
+ @Inject(method = "drawChat", at = @At("HEAD"))
+ private void modifyChatRendering(CallbackInfo ci) {
+ long current = System.currentTimeMillis();
+ long diff = current - chatting$prevMillis;
+ chatting$prevMillis = current;
+ updatePercentage(diff);
+ float t = chatting$percentComplete;
+ chatting$animationPercent = MathHelper.clamp_float(1 - (--t) * t * t * t, 0, 1);
+ }
+
+ @Inject(method = "drawChat", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/GlStateManager;pushMatrix()V", ordinal = 0, shift = At.Shift.AFTER))
+ private void translate(CallbackInfo ci) {
+ float y = 0;
+ if (ChattingConfig.INSTANCE.getSmoothChat() && !this.isScrolled) {
+ y += (9 - 9 * chatting$animationPercent) * this.getChatScale();
+ }
+ GlStateManager.translate(0, y, 0);
+ }
+
+ @ModifyArg(method = "drawChat", at = @At(value = "INVOKE", target = "Ljava/util/List;get(I)Ljava/lang/Object;", ordinal = 0, remap = false), index = 0)
+ private int getLineBeingDrawn(int line) {
+ chatting$lineBeingDrawn = line;
+ return line;
+ }
+
+ @ModifyArg(method = "drawChat", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/FontRenderer;drawStringWithShadow(Ljava/lang/String;FFI)I"), index = 3)
+ private int modifyTextOpacity(int original) {
+ if (ChattingConfig.INSTANCE.getSmoothChat() && chatting$lineBeingDrawn <= chatting$newLines) {
+ int opacity = (original >> 24) & 0xFF;
+ opacity *= chatting$animationPercent;
+ return (original & ~(0xFF << 24)) | (opacity << 24);
+ } else {
+ return original;
+ }
+ }
+
+ @Inject(method = "printChatMessageWithOptionalDeletion", at = @At("HEAD"))
+ private void resetPercentage(IChatComponent chatComponent, int chatLineId, CallbackInfo ci) {
+ if (!EnumChatFormatting.getTextWithoutFormattingCodes(chatComponent.getUnformattedText()).toLowerCase(Locale.ENGLISH).contains(ChatSearchingManager.INSTANCE.getLastSearch().toLowerCase(Locale.ENGLISH))) {
+ return;
+ }
+ if (ChatTabs.INSTANCE.getHasCancelledAnimation()) {
+ ChatTabs.INSTANCE.setHasCancelledAnimation(false);
+ return;
+ }
+ chatting$percentComplete = 0;
+ }
+
+ @ModifyVariable(method = "setChatLine", at = @At("STORE"), ordinal = 0)
+ private List<IChatComponent> setNewLines(List<IChatComponent> original) {
+ chatting$newLines = original.size() - 1;
+ return original;
+ }
+}