fix Chinese IME support for BetterQuesting, BiblioCraft, StevesFactory, LogisticsPipes (#385)

This commit is contained in:
paulzzh authored and GitHub committed 2026-10-30 18:50:10 +00:00
1 parent 4dfbe07fd7
commit 77cd7c49c0
14 files changed
+349 -1

No files matched your search

+5
View File
@@ -65,7 +65,12 @@ dependencies {
compileOnly(rfg.deobf("curse.maven:xaeros-minimap-263420:6012805"))
compileOnly(rfg.deobf("curse.maven:xaeros-world-map-317780:5987124"))
compileOnly(rfg.deobf("curse.maven:bibliocraft-228027:2423369"))
compileOnly('com.github.GTNewHorizons:OpenComputers:1.12.64-GTNH:dev')
compileOnly('com.github.GTNewHorizons:BetterQuesting:3.8.92-GTNH:dev')
compileOnly('com.github.GTNewHorizons:StevesAddons:0.15.5:dev')
compileOnly('com.github.GTNewHorizons:LogisticsPipes:1.5.37-GTNH:dev')
compileOnly('ganymedes01.etfuturum:Et-Futurum-Requiem:2.6.64-GTNH:dev')
runtimeOnlyNonPublishable('com.github.GTNewHorizons:NotEnoughItems:2.8.160-GTNH:dev')
// runtimeOnlyNonPublishable('com.github.GTNewHorizons:OpenComputers:1.12.64-GTNH:dev')
@@ -60,6 +60,33 @@ public enum Mixins implements IMixins {
OPENCOMPUTERS_KEYBOARD_INPUT_FIX(Phase.EARLY, new MixinBuilder()
.addClientMixins("oc.OcInputBuffer")
.addRequiredMod(TargetedMod.OPENCOMPUTERS)),
BETTERQUESTING_TEXT_FIELD_SDL_INPUT(Phase.LATE, new MixinBuilder()
.addClientMixins(
"bq.BqTextInput",
"bq.BqPanelTextField")
.addRequiredMod(TargetedMod.BETTERQUESTING)),
BIBLIOCRAFT_TEXT_FIELD_SDL_INPUT(Phase.LATE, new MixinBuilder()
.addClientMixins(
"biblio.BiblioCraftClipboard",
"biblio.BiblioCraftFancySign",
"biblio.BiblioCraftTextField")
.addRequiredMod(TargetedMod.BIBLIOCRAFT)),
STEVES_ADDON_TEXT_FIELD_SDL_INPUT(Phase.LATE, new MixinBuilder()
.addClientMixins("steves.StevesAddonLabeler")
.addRequiredMod(TargetedMod.STEVES_ADDON)),
STEVES_FACTORY_TEXT_FIELD_SDL_INPUT(Phase.LATE, new MixinBuilder()
.addClientMixins(
"steves.StevesFactoryManager",
"steves.StevesFactoryTextField")
.addRequiredMod(TargetedMod.STEVES_FACTORY)),
LOGISTICSPIPES_TEXT_FIELD_SDL_INPUT(Phase.LATE, new MixinBuilder()
.addClientMixins(
"logistics.LogisticsPipesTextInput",
"logistics.LogisticsPipesTextField")
.addRequiredMod(TargetedMod.LOGISTICSPIPES)),
ETFUTURUM_TEXT_FIELD_SDL_INPUT(Phase.LATE, new MixinBuilder()
.addClientMixins("etfuturum.EtfuturumWoodSign")
.addRequiredMod(TargetedMod.ETFUTURUM)),
// apply the texture stitching mixin if
// - you don't have fastcraft
@@ -30,7 +30,13 @@ public enum TargetedMod implements ITargetMod {
XAEROS_WORLDMAP(new TargetModBuilder().setModId("XaeroWorldMap")),
// Support both the NH fork and upstream
OPENCOMPUTERS(new TargetModBuilder().setCoreModClass("li.cil.oc.common.launch.TransformerLoader")
.setModId("OpenComputers"))
.setModId("OpenComputers")),
BETTERQUESTING(new TargetModBuilder().setModId("betterquesting")),
BIBLIOCRAFT(new TargetModBuilder().setModId("BiblioCraft")),
STEVES_ADDON(new TargetModBuilder().setModId("StevesAddons")),
STEVES_FACTORY(new TargetModBuilder().setModId("StevesFactoryManager")),
LOGISTICSPIPES(new TargetModBuilder().setModId("LogisticsPipes")),
ETFUTURUM(new TargetModBuilder().setModId("etfuturum"))
//
;
@@ -0,0 +1,23 @@
package me.eigenraven.lwjgl3ify.mixins.late.biblio;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import jds.bibliocraft.gui.GuiClipboard;
import me.eigenraven.lwjgl3ify.client.TextFieldHandler;
@Mixin(value = GuiClipboard.class)
public class BiblioCraftClipboard {
@Inject(method = "initGui()V", at = @At("HEAD"))
private void lwjgl3ify$onInit(CallbackInfo ci) {
TextFieldHandler.beginTextInput();
}
@Inject(method = "onGuiClosed()V", at = @At("HEAD"))
private void lwjgl3ify$onClosed(CallbackInfo ci) {
TextFieldHandler.endTextInput(null);
}
}
@@ -0,0 +1,23 @@
package me.eigenraven.lwjgl3ify.mixins.late.biblio;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import jds.bibliocraft.gui.GuiFancySign;
import me.eigenraven.lwjgl3ify.client.TextFieldHandler;
@Mixin(value = GuiFancySign.class)
public class BiblioCraftFancySign {
@Inject(method = "initGui()V", at = @At("HEAD"))
private void lwjgl3ify$onInit(CallbackInfo ci) {
TextFieldHandler.beginTextInput();
}
@Inject(method = "onGuiClosed()V", at = @At("HEAD"))
private void lwjgl3ify$onClosed(CallbackInfo ci) {
TextFieldHandler.endTextInput(null);
}
}
@@ -0,0 +1,29 @@
package me.eigenraven.lwjgl3ify.mixins.late.biblio;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Slice;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import jds.bibliocraft.gui.GuiBiblioTextField;
@Mixin(value = GuiBiblioTextField.class)
public abstract class BiblioCraftTextField {
@Inject(
method = "textboxKeyTyped",
at = @At(
value = "INVOKE",
target = "Ljds/bibliocraft/gui/GuiBiblioTextField;writeText(Ljava/lang/String;)V",
remap = false),
slice = @Slice(
from = @At(value = "INVOKE", target = "Lnet/minecraft/util/ChatAllowedCharacters;isAllowedCharacter(C)Z")),
remap = false,
cancellable = true)
public void lwjgl3ify$fixDoubleChar(char typedChar, int keyCode, CallbackInfoReturnable<Boolean> cir) {
if (keyCode != 0) {
cir.setReturnValue(true);
}
}
}
@@ -0,0 +1,29 @@
package me.eigenraven.lwjgl3ify.mixins.late.bq;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Slice;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import betterquesting.api2.client.gui.controls.PanelTextField;
@Mixin(value = PanelTextField.class)
public abstract class BqPanelTextField {
@Inject(
method = "onKeyTyped",
at = @At(
value = "INVOKE",
target = "Lbetterquesting/api2/client/gui/controls/PanelTextField;writeText(Ljava/lang/String;)V",
remap = false),
slice = @Slice(
from = @At(value = "INVOKE", target = "Lnet/minecraft/util/ChatAllowedCharacters;isAllowedCharacter(C)Z")),
remap = false,
cancellable = true)
public void lwjgl3ify$fixDoubleChar(char typedChar, int keyCode, CallbackInfoReturnable<Boolean> cir) {
if (keyCode != 0) {
cir.setReturnValue(true);
}
}
}
@@ -0,0 +1,35 @@
package me.eigenraven.lwjgl3ify.mixins.late.bq;
import net.minecraft.client.gui.GuiScreen;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import betterquesting.client.gui2.GuiQuestSearch;
import betterquesting.client.gui2.editors.GuiQuestLinesEditor;
import betterquesting.client.gui2.editors.GuiTaskEditor;
import betterquesting.client.gui2.editors.nbt.GuiEntitySelection;
import betterquesting.client.gui2.editors.nbt.GuiFluidSelection;
import betterquesting.client.gui2.editors.nbt.GuiNbtAdd;
import bq_standard.client.gui.editors.GuiEditLootGroup;
import bq_standard.client.gui.editors.tasks.GuiEditTaskScoreboard;
import me.eigenraven.lwjgl3ify.client.TextFieldHandler;
@Mixin(
value = { GuiQuestSearch.class, GuiEditLootGroup.class, GuiEditTaskScoreboard.class, GuiEntitySelection.class,
GuiFluidSelection.class, GuiQuestLinesEditor.class, GuiTaskEditor.class, GuiNbtAdd.class })
public abstract class BqTextInput extends GuiScreen {
@Inject(method = "initPanel()V", at = @At("HEAD"), remap = false)
private void lwjgl3ify$onInit(CallbackInfo ci) {
TextFieldHandler.beginTextInput();
}
@Override
public void onGuiClosed() {
super.onGuiClosed();
TextFieldHandler.endTextInput(null);
}
}
@@ -0,0 +1,33 @@
package me.eigenraven.lwjgl3ify.mixins.late.etfuturum;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import ganymedes01.etfuturum.client.gui.inventory.GuiEditWoodSign;
import me.eigenraven.lwjgl3ify.client.TextFieldHandler;
@Mixin(value = GuiEditWoodSign.class)
public class EtfuturumWoodSign {
@Inject(method = "initGui()V", at = @At("HEAD"))
private void lwjgl3ify$onInit(CallbackInfo ci) {
TextFieldHandler.beginTextInput();
}
@Inject(method = "onGuiClosed()V", at = @At("HEAD"))
private void lwjgl3ify$onClosed(CallbackInfo ci) {
TextFieldHandler.endTextInput(null);
}
@Inject(
method = "keyTyped",
at = @At(value = "INVOKE", target = "Lnet/minecraft/util/ChatAllowedCharacters;isAllowedCharacter(C)Z"),
cancellable = true)
private void lwjgl3ify$fixDoubleChar(char typedChar, int keyCode, CallbackInfo ci) {
if (keyCode != 0) {
ci.cancel();
}
}
}
@@ -0,0 +1,23 @@
package me.eigenraven.lwjgl3ify.mixins.late.logistics;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import logisticspipes.utils.gui.SearchBar;
@Mixin(value = SearchBar.class)
public abstract class LogisticsPipesTextField {
@Inject(
method = "handleKey",
at = @At(value = "INVOKE", target = "Ljava/lang/Character;isISOControl(C)Z"),
remap = false,
cancellable = true)
public void lwjgl3ify$fixDoubleChar(char typedChar, int keyCode, CallbackInfoReturnable<Boolean> cir) {
if (keyCode != 0) {
cir.setReturnValue(true);
}
}
}
@@ -0,0 +1,27 @@
package me.eigenraven.lwjgl3ify.mixins.late.logistics;
import net.minecraft.client.gui.GuiScreen;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import logisticspipes.gui.orderer.GuiOrderer;
import logisticspipes.gui.popup.GuiAddTracking;
import me.eigenraven.lwjgl3ify.client.TextFieldHandler;
@Mixin(value = { GuiOrderer.class, GuiAddTracking.class })
public abstract class LogisticsPipesTextInput extends GuiScreen {
@Inject(method = "initGui()V", at = @At("HEAD"))
private void lwjgl3ify$onInit(CallbackInfo ci) {
TextFieldHandler.beginTextInput();
}
@Override
public void onGuiClosed() {
super.onGuiClosed();
TextFieldHandler.endTextInput(null);
}
}
@@ -0,0 +1,33 @@
package me.eigenraven.lwjgl3ify.mixins.late.steves;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import me.eigenraven.lwjgl3ify.client.TextFieldHandler;
import stevesaddons.interfaces.GuiLabeler;
@Mixin(value = GuiLabeler.class)
public class StevesAddonLabeler {
@Inject(method = "initGui()V", at = @At("HEAD"))
private void lwjgl3ify$onInit(CallbackInfo ci) {
TextFieldHandler.beginTextInput();
}
@Inject(method = "onGuiClosed()V", at = @At("HEAD"))
private void lwjgl3ify$onClosed(CallbackInfo ci) {
TextFieldHandler.endTextInput(null);
}
@Inject(
method = "keyTyped",
at = @At(value = "INVOKE", target = "Lstevesaddons/interfaces/GuiTextField;keyTyped(CI)V", remap = false),
cancellable = true)
private void lwjgl3ify$fixDoubleChar(char character, int keyCode, CallbackInfo ci) {
if (Character.isLetterOrDigit(character) && keyCode != 0) {
ci.cancel();
}
}
}
@@ -0,0 +1,26 @@
package me.eigenraven.lwjgl3ify.mixins.late.steves;
import net.minecraft.client.gui.GuiScreen;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import me.eigenraven.lwjgl3ify.client.TextFieldHandler;
import vswe.stevesfactory.interfaces.GuiManager;
@Mixin(value = GuiManager.class)
public abstract class StevesFactoryManager extends GuiScreen {
@Override
public void initGui() {
super.initGui();
TextFieldHandler.beginTextInput();
}
@Inject(method = "onGuiClosed()V", at = @At("HEAD"))
private void lwjgl3ify$onClosed(CallbackInfo ci) {
TextFieldHandler.endTextInput(null);
}
}
@@ -0,0 +1,29 @@
package me.eigenraven.lwjgl3ify.mixins.late.steves;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Slice;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import vswe.stevesfactory.components.TextBoxLogic;
import vswe.stevesfactory.interfaces.GuiManager;
@Mixin(value = TextBoxLogic.class)
public abstract class StevesFactoryTextField {
@Inject(
method = "onKeyStroke",
at = @At(
value = "INVOKE",
target = "Lvswe/stevesfactory/components/TextBoxLogic;addText(Lvswe/stevesfactory/interfaces/GuiManager;Ljava/lang/String;)V",
remap = false),
slice = @Slice(from = @At(value = "INVOKE", target = "Ljava/lang/Character;isISOControl(C)Z")),
remap = false,
cancellable = true)
public void lwjgl3ify$fixDoubleChar(GuiManager gui, char c, int k, CallbackInfo ci) {
if (k != 0) {
ci.cancel();
}
}
}