Skip to content

Commit 481bb37

Browse files
committed
Support LDLib2 mod.
1 parent 0bcec09 commit 481bb37

11 files changed

Lines changed: 253 additions & 2 deletions

File tree

README.en.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ That's why we need IMBlocker, which can tweak your IME depends on current input
5050
[SuperMartijn642's Core Lib](https://github.com/SuperMartijn642/SuperMartijn642sCoreLib)
5151
[Essential Mod](https://essential.gg/)*
5252
[Armourer's Workshop](https://github.com/Armourers-Workshop/Armourers-Workshop)
53-
[ModernUI](https://github.com/BloCamLimb/ModernUI-MC)
53+
[ModernUI](https://github.com/BloCamLimb/ModernUI-MC)
54+
[LDLib2](https://github.com/Low-Drag-MC/LDLib2)
5455

5556
*On Fabric, you need to extract the file named "essential-<32-bit code>.jar" from the root directory of its mod JAR and **only** put this file into your mod folder.

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ IMBlocker 模组能够识别当前游戏状态,并自动启用/禁用输入法
5050
[SuperMartijn642's Core Lib](https://github.com/SuperMartijn642/SuperMartijn642sCoreLib)
5151
[Essential Mod](https://essential.gg/)*
5252
[Armourer's Workshop](https://github.com/Armourers-Workshop/Armourers-Workshop)
53-
[ModernUI](https://github.com/BloCamLimb/ModernUI-MC)
53+
[ModernUI](https://github.com/BloCamLimb/ModernUI-MC)
54+
[LDLib2](https://github.com/Low-Drag-MC/LDLib2)
5455

5556
*在 Fabric 下使用此模组时需要手动使用压缩软件将其 JAR 根目录下名为“essential-<32位序列码>”的文件提取到模组文件夹并**移除原模组文件**
5657

common/src/main/java/io/github/reserveword/imblocker/common/IMBlockerMixinPlugin.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,12 @@ public class IMBlockerMixinPlugin implements IMixinConfigPlugin {
103103
validMixins.add("compat.ModernUITextViewMixin");
104104
validMixins.add("compat.ModernUIEditTextMixin");
105105
}
106+
107+
if(IMBlockerCore.hasMod("ldlib2")) {
108+
validMixins.add("compat.LDLibUIElementMixin");
109+
validMixins.add("compat.LDLibTextFieldMixin");
110+
validMixins.add("compat.LDLibTextAreaMixin");
111+
}
106112
}
107113

108114
@Override

common/src/main/java/io/github/reserveword/imblocker/common/MinecraftClientUtil.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
import net.minecraft.DetectedVersion;
1616
import net.minecraft.client.Minecraft;
1717
import net.minecraft.client.input.CharacterEvent;
18+
import net.minecraft.network.chat.Component;
19+
import net.minecraft.network.chat.FontDescription;
20+
import net.minecraft.resources.Identifier;
1821
import net.minecraft.util.GsonHelper;
1922

2023
public abstract class MinecraftClientUtil {
@@ -51,6 +54,10 @@ public static int getStringWidth(String text) {
5154
return Minecraft.getInstance().font.width(text);
5255
}
5356

57+
public static int getStringWidth(String text, Identifier font) {
58+
return Minecraft.getInstance().font.width(Component.literal(text).withStyle(style -> style.withFont(new FontDescription.Resource(font))));
59+
}
60+
5461
static {
5562
int protocolVersion;
5663
try (InputStream is = DetectedVersion.class.getResourceAsStream("/version.json");
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package io.github.reserveword.imblocker.mixin.compat;
2+
3+
import java.util.List;
4+
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.Shadow;
7+
import org.spongepowered.asm.mixin.injection.At;
8+
import org.spongepowered.asm.mixin.injection.Inject;
9+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
10+
11+
import com.lowdragmc.lowdraglib2.gui.ui.UIElement;
12+
import com.lowdragmc.lowdraglib2.gui.ui.elements.TextArea;
13+
import com.lowdragmc.lowdraglib2.gui.ui.elements.TextArea.TextAreaStyle;
14+
import com.lowdragmc.lowdraglib2.gui.ui.event.UIEvent;
15+
16+
import io.github.reserveword.imblocker.common.IMManager;
17+
import io.github.reserveword.imblocker.common.MinecraftClientUtil;
18+
import io.github.reserveword.imblocker.common.StringUtil;
19+
import io.github.reserveword.imblocker.common.gui.FocusContainer;
20+
import io.github.reserveword.imblocker.common.gui.FocusManager;
21+
import io.github.reserveword.imblocker.common.gui.Point;
22+
import io.github.reserveword.imblocker.common.gui.Rectangle;
23+
24+
@Mixin(value = TextArea.class, remap = false)
25+
public abstract class LDLibTextAreaMixin extends LDLibUIElementMixin {
26+
27+
@Shadow
28+
private UIElement contentView;
29+
30+
@Shadow
31+
private TextAreaStyle textAreaStyle;
32+
33+
@Shadow protected List<String> lines;
34+
@Shadow private int cursorLine;
35+
@Shadow private int cursorCol;
36+
@Shadow private float scrollX;
37+
@Shadow private float scrollY;
38+
39+
@Shadow public abstract boolean isEditable();
40+
41+
@Inject(method = "onCharTyped", at = @At("HEAD"), cancellable = true)
42+
public void checkFocusTracking(UIEvent event, CallbackInfo ci) {
43+
if(FocusManager.isTrackingFocus) {
44+
if(isEditable()) {
45+
FocusContainer.MINECRAFT.switchFocus(this);
46+
}
47+
ci.cancel();
48+
}
49+
}
50+
51+
@Inject(method = "updateScrollers", at = @At("TAIL"))
52+
public void onScrollersUpdated(CallbackInfo ci) {
53+
IMManager.updateCaretPosition();
54+
}
55+
56+
@Inject(method = { "onHorizontalScroll", "onVerticalScroll" }, at = @At("TAIL"))
57+
public void onScrolling(float value, CallbackInfo ci) {
58+
IMManager.updateCaretPosition();
59+
}
60+
61+
@Override
62+
public void imblocker$onFocusFactorsChanged() {
63+
imblocker$onFocusChanged(isEditable());
64+
}
65+
66+
@Override
67+
public Rectangle getBoundsAbs() {
68+
return new Rectangle(getGuiScale(),
69+
(int) contentView.getContentX(), (int) contentView.getContentY(),
70+
(int) contentView.getContentWidth(), (int) contentView.getContentHeight());
71+
}
72+
73+
@Override
74+
public Point getCaretPos() {
75+
float fontSize = textAreaStyle.fontSize();
76+
int caretX = (int) (MinecraftClientUtil.getStringWidth(
77+
StringUtil.getSubstring(lines.get(cursorLine), 0, cursorCol), textAreaStyle.font()) * fontSize / 9.0F - scrollX);
78+
int caretY = (int) (cursorLine * (fontSize + textAreaStyle.lineSpacing()) - scrollY);
79+
return new Point(getGuiScale(), caretX, caretY);
80+
}
81+
82+
@Override
83+
public int getFontHeight() {
84+
return (int) textAreaStyle.fontSize();
85+
}
86+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package io.github.reserveword.imblocker.mixin.compat;
2+
3+
import org.spongepowered.asm.mixin.Mixin;
4+
import org.spongepowered.asm.mixin.Shadow;
5+
import org.spongepowered.asm.mixin.injection.At;
6+
import org.spongepowered.asm.mixin.injection.Inject;
7+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
8+
9+
import com.lowdragmc.lowdraglib2.gui.ui.elements.TextField;
10+
import com.lowdragmc.lowdraglib2.gui.ui.elements.TextField.TextFieldStyle;
11+
import com.lowdragmc.lowdraglib2.gui.ui.event.UIEvent;
12+
13+
import io.github.reserveword.imblocker.common.IMManager;
14+
import io.github.reserveword.imblocker.common.MinecraftClientUtil;
15+
import io.github.reserveword.imblocker.common.StringUtil;
16+
import io.github.reserveword.imblocker.common.gui.FocusContainer;
17+
import io.github.reserveword.imblocker.common.gui.FocusManager;
18+
import io.github.reserveword.imblocker.common.gui.Point;
19+
20+
@Mixin(value = TextField.class, remap = false)
21+
public abstract class LDLibTextFieldMixin extends LDLibUIElementMixin {
22+
23+
@Shadow
24+
private TextFieldStyle textFieldStyle;
25+
26+
@Shadow private int cursorPos;
27+
@Shadow private String rawText;
28+
@Shadow private float displayOffset;
29+
30+
@Shadow
31+
public abstract boolean isEditable();
32+
33+
@Inject(method = "onCharTyped", at = @At("HEAD"), cancellable = true)
34+
public void checkFocusTracking(UIEvent event, CallbackInfo ci) {
35+
if(FocusManager.isTrackingFocus) {
36+
if(isEditable()) {
37+
FocusContainer.MINECRAFT.switchFocus(this);
38+
}
39+
ci.cancel();
40+
}
41+
}
42+
43+
@Inject(method = "updateDisplayOffset", at = @At("TAIL"))
44+
public void onDisplayOffsetUpdated(CallbackInfo ci) {
45+
IMManager.updateCaretPosition();
46+
}
47+
48+
@Override
49+
public void imblocker$onFocusFactorsChanged() {
50+
imblocker$onFocusChanged(isEditable());
51+
}
52+
53+
@Override
54+
public Point getCaretPos() {
55+
float fontSize = textFieldStyle.fontSize();
56+
int caretX = (int) (MinecraftClientUtil.getStringWidth(
57+
StringUtil.getSubstring(rawText, 0, cursorPos), textFieldStyle.font()) * fontSize / 9.0F - displayOffset);
58+
int caretY = (int) ((getContentHeight() - fontSize) / 2);
59+
return new Point(getGuiScale(), caretX, caretY);
60+
}
61+
62+
@Override
63+
public int getFontHeight() {
64+
return (int) textFieldStyle.fontSize();
65+
}
66+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package io.github.reserveword.imblocker.mixin.compat;
2+
3+
import org.spongepowered.asm.mixin.Mixin;
4+
import org.spongepowered.asm.mixin.Shadow;
5+
import org.spongepowered.asm.mixin.injection.At;
6+
import org.spongepowered.asm.mixin.injection.Inject;
7+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
8+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
9+
10+
import com.lowdragmc.lowdraglib2.gui.ui.UIElement;
11+
12+
import io.github.reserveword.imblocker.common.gui.MinecraftFocusableWidget;
13+
import io.github.reserveword.imblocker.common.gui.Rectangle;
14+
15+
@Mixin(value = UIElement.class, remap = false)
16+
public abstract class LDLibUIElementMixin implements MinecraftFocusableWidget {
17+
@Shadow public abstract float getContentX();
18+
@Shadow public abstract float getContentY();
19+
@Shadow public abstract float getContentWidth();
20+
@Shadow public abstract float getContentHeight();
21+
22+
@Inject(method = "addClass", at = @At("TAIL"))
23+
public void onClassAdded(String clazz, CallbackInfoReturnable<?> cir) {
24+
if(clazz.equals("__focused__") || clazz.equals("__disabled__")) {
25+
imblocker$onFocusFactorsChanged();
26+
}
27+
}
28+
29+
@Inject(method = "removeClass", at = @At("TAIL"))
30+
public void onClassRemoved(String clazz, CallbackInfoReturnable<?> cir) {
31+
if(clazz.equals("__focused__") || clazz.equals("__disabled__")) {
32+
imblocker$onFocusFactorsChanged();
33+
}
34+
}
35+
36+
@Inject(method = "setVisible", at = @At("TAIL"))
37+
public void onVisibilityChanged(boolean isVisible, CallbackInfoReturnable<?> cir) {
38+
imblocker$onFocusFactorsChanged();
39+
}
40+
41+
@Inject(method = "markTaffyStyleDirty", at = @At("TAIL"))
42+
public void onTaffyStyleChanged(CallbackInfo ci) {
43+
imblocker$onFocusFactorsChanged();
44+
}
45+
46+
public void imblocker$onFocusFactorsChanged() {}
47+
48+
@Override
49+
public Rectangle getBoundsAbs() {
50+
return new Rectangle(getGuiScale(), (int) getContentX(), (int) getContentY(), (int) getContentWidth(), (int) getContentHeight());
51+
}
52+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.lowdragmc.lowdraglib2.gui.ui;
2+
3+
public abstract class UIElement {
4+
public abstract float getContentX();
5+
public abstract float getContentY();
6+
public abstract float getContentWidth();
7+
public abstract float getContentHeight();
8+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.lowdragmc.lowdraglib2.gui.ui.elements;
2+
3+
import net.minecraft.resources.Identifier;
4+
5+
public abstract class TextArea {
6+
public abstract class TextAreaStyle {
7+
public abstract float fontSize();
8+
public abstract float lineSpacing();
9+
public abstract Identifier font();
10+
}
11+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.lowdragmc.lowdraglib2.gui.ui.elements;
2+
3+
import net.minecraft.resources.Identifier;
4+
5+
public abstract class TextField {
6+
public abstract class TextFieldStyle {
7+
public abstract float fontSize();
8+
public abstract Identifier font();
9+
}
10+
}

0 commit comments

Comments
 (0)