Skip to content

Fix: Fix 1.21.6+ and 26.x version compatibility - #211

Open
Fenad2 wants to merge 9 commits into
plusls:mainfrom
Fenad2:fix
Open

Fix: Fix 1.21.6+ and 26.x version compatibility#211
Fenad2 wants to merge 9 commits into
plusls:mainfrom
Fenad2:fix

Conversation

@Fenad2

@Fenad2 Fenad2 commented Jul 30, 2026

Copy link
Copy Markdown

基于fix/issue-209分支修复了一些问题
已测试在1.21.8 ~ 26.2单人模式下可以正常使用“渲染村民的第一本附魔书”、“渲染村民绑定工作方块”等
在1.21.8 ~ 26.1安装PCA的服务器内可以正常获取数据及正常使用“渲染村民的第一本附魔书”、“渲染村民绑定工作方块”等

  • prevent recursive config GUI redraws
  • update favorites support click handling for 1.21.10+
  • fix PcaSyncProtocol villager restock data
  • update villager trade offer access for 1.21.10+
  • update inventory preview select mixin signatures for 26.1+
  • update hand restock support for 26.1+
  • adjust hand restock crafting mixin handling
  • update SearchMobSpawnPointUtil for 26.2
  • update MalilibFavoritesData for 26.1+
  • update Litematica easy place mixin injections
  • update inventory preview select mixin signatures
  • update inventory preview rendering support for 26.1+
  • update inventory preview selection mixin handling for 26.1 and 26.2
  • update malilib config screen and favorites support for newer Minecraft APIs
  • update container cache and inventory preview sync mixins
  • add MagicLib immediate text drawer support for 26.2
  • fix villager tracer entity filter precedence
  • update multi-version rendering and malilib compatibility
  • add Java 25 toolchain support for 26.1+
  • update entity info camera access for 1.21.11+ and 26.2
  • centralize villager offer access for 1.21.6+
  • update villager restock, trade info, and trade preview handling
  • add malilib JSON and inventory overlay type compatibility helpers
  • update level renderer injection handling for 1.21.6-1.21.9
  • update RenderUtil line rendering for 1.21.1+
  • update restock, inventory preview, and masa config GUI compatibility handling
  • update litematica easy place mixin requirements for 26.1+
  • update 26.2 spawn point entity lookup and immediate text drawer support

Hendrix-Shen and others added 5 commits July 25, 2026 18:54
Also fix crash with RenderUtil::drawLine

Signed-off-by: Hendrix-Shen <HendrixShen@hendrixshen.top>
- prevent recursive config GUI redraws

- update favorites support click handling for 1.21.10+

- fix PcaSyncProtocol villager restock data

- update villager trade offer access for 1.21.10+

- update inventory preview select mixin signatures for 26.1+
- adjust hand restock crafting mixin handling
- update SearchMobSpawnPointUtil for 26.2
- update MalilibFavoritesData for 26.1+
- update Litematica easy place mixin injections
- update inventory preview select mixin signatures
- update inventory preview selection mixin handling for 26.1 and 26.2
- update malilib config screen and favorites support for newer Minecraft APIs
- update container cache and inventory preview sync mixins
- add MagicLib immediate text drawer support for 26.2
- fix villager tracer entity filter precedence
- add Java 25 toolchain support for 26.1+
- update entity info camera access for 1.21.11+ and 26.2
- centralize villager offer access for 1.21.6+
- update villager restock, trade info, and trade preview handling
- add malilib JSON and inventory overlay type compatibility helpers
- update level renderer injection handling for 1.21.6-1.21.9
- update RenderUtil line rendering for 1.21.1+
- update restock, inventory preview, and masa config GUI compatibility handling
- update litematica easy place mixin requirements for 26.1+
- update 26.2 spawn point entity lookup and immediate text drawer support
@Fenad2 Fenad2 changed the title Fix Fix: Fix 1.21.6+ and 26.x version compatibility Jul 30, 2026

@Hendrix-Shen Hendrix-Shen left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

您好 @Fenad2
感谢您花时间向本仓库贡献,我们已经彻底审查了您的代码,在推进下一步行动前,我们恳请您按照以下建议进行修改:

  • 请不要将 MagicLib 已经包装过的方法回退至预编译写法
  • 请不要将已经编写 extraMappings 的类 / 方法 / 字段回退至预编译写法
  • 请将新增的预编译条件:
    • 使用点分版本号(例如:MC >= 26.2)
    • 连续比较中高版本在前,且不要出现等于号(例如:26.2 > MC && MC > 1.21.11)
    • 高版本号条件段应当在低版本条件段之前,单一条件优先于复合条件
  • 请核对 MC 原版代码变化是否在对应版本发生,请不要因为引入新的修复而破坏旧版本
  • 请不要使用预编译控制括号的位置
  • 请不要在 mixins.json 中使用预编译,正确的操作是使用@Mixin(DummyClass.class)占位

以上未提及内容已在详细审查附言中给出,请注意审查附言中可能仅在问题首次发生时标注,不代表问题只发生过一次。此外,我们强烈建议您在完成修改后运行checkstyleMain任务以检查您的代码格式是否符合我们的标准。
感谢您的理解与配合,我们期待着和您的进一步合作。祝您过得愉快!
再次感谢您的贡献!

if (mcVersion >= 26_01_00) {
java.setSourceCompatibility(JavaVersion.VERSION_25);
java.setTargetCompatibility(JavaVersion.VERSION_25);
java.getToolchain().getLanguageVersion().set(JavaLanguageVersion.of(25));

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

该选项似乎并非是必要的设置。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里为方便构建留下的,可有可与。现已删除

Comment thread src/main/java/com/plusls/MasaGadget/game/Configs.java

private static TextRenderer rotationAround(@NotNull TextRenderer renderer, @NotNull Position centerPos, double range) {
Position camPos = MinecraftCompat.getInstance().getMainCameraCompat().getPosition();
//#if MC >= 260200

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

新添加的预编译版本条件请使用点分版本号,例如 MC >= 26.2

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已将新添加的版本条件改为点分版本号

//$$ return false;
//$$ }
//$$
//$$ for (MerchantOffer offer : offers) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

此处格式化请写作

for (
        //#if MC >= 1.21.6
        //$$ MerchantOffer offer : offers
        //#else
        MerchantOffer offer : villager.getOffers()
        //#endif
)

另外 MC 1.21.1 开始 AbstractVillager#getOffers(),添加了 level instanceof ServerLevel,多人游戏是否会产生崩溃?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

旧版本依旧采用villager.getOffers()

}

Screen screen = configScreenFactoryCompat.create(MinecraftCompat.getInstance().getScreen());
Screen screen = configScreenFactoryCompat.create(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

此处使用 MagicLib 的包装方法目的就是减少反复编写预编译的工作量

if (ItemStackCompat.isSameItemSameTags(recipe.getResult(), itemStack)) {
InventoryUtils.tryMoveItemsToFirstCraftingGrid(recipe, gui, false);
//#if MC >= 260100
//$$ mc.gameMode.handleContainerInput(player.inventoryMenu.containerId, 0, 0, ContainerInput.PICKUP, player);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个方法写了 extraMapping,为什么要使用预编译?

PlayerCompat.of(player).getInventory().selected + 36
:
//#endif
45,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

空格?

//$$ EntityType<?> entityType2 = levelCompat.getDimensionLocation().equals(ResourceLocationCompat.withDefaultNamespace("the_nether")) ? null : EntityTypes.SPIDER;
//$$ EntityType<?> entityType = levelCompat.getDimensionLocation().equals(ResourceLocationCompat.withDefaultNamespace("the_nether"))
//$$ ? BuiltInRegistries.ENTITY_TYPE.getValue(ResourceLocationCompat.withDefaultNamespace("zombified_piglin"))
//$$ :

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

多余的换行?

"compatibilityLevel": "JAVA_8",
"plugin": "top.hendrixshen.magiclib.impl.mixin.MagicMixinPlugin",
"client": [
//#if MC >= 26.2

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

不要在 mixin.json 中使用预编译,请使用 DummyClass 并标记版本范围

// CHECKSTYLE.OFF: JavadocStyle
/**
 * <li>mc1.14 ~ mc26.1: subproject 1.16.5 (main project) [dummy]        &lt;--------</li>
 * <li>mc26.2+        : subproject 26.2</li>
 */
// CHECKSTYLE.ON: JavadocStyle
@Mixin(DummyClass.class)

Comment thread src/main/resources/masa_gadget_mod.mixins.json
@Fenad2

Fenad2 commented Jul 31, 2026

Copy link
Copy Markdown
Author
版本 单人 多人 (PCA)
1.21-fabric 可运行 可运行
1.21.4 可运行 未测试
1.21.5 可运行 可运行
1.21.8 可运行 可运行
1.21.11 可运行 可运行
26.1 可运行 可运行
26.2 可运行 (无PCA26.2)

MixinRenderUtils我没有很好的合并为共享类的思路,所以在1.21.11/26.1.2/26.2选择写成三个子版本覆盖类

@Fenad2
Fenad2 requested a review from Hendrix-Shen July 31, 2026 05:41

@Hendrix-Shen Hendrix-Shen left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

您好 @Fenad2
感谢您花时间向本仓库贡献,我们收到了来自您的审查请求,在彻底审查您的更新后,我们发现部分问题仍未解决且未进行相应的回复。我们恳请您针对新提出的问题进行修改并对您认为不需要修改的部分给出相应的解释。
请注意审查附言中可能仅在问题首次发生时标注,不代表问题只发生过一次。
感谢您的理解与配合,我们期待着和您的进一步合作。祝您过得愉快!
再次感谢您的贡献!

// CHECKSTYLE.ON: ImportOrder

import net.minecraft.client.gui.screens.Screen;
// CHECKSTYLE.ON: ImportOrder

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

//#else
GuiRenderContext renderContext
//#endif
,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

逗号不要另起一行

@Inject(
method = "restockNewStackToHand",
at = @At("RETURN"),
//#if MC >= 26.1

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

尽量不要使用软失败或 require = 0,上游变动时强制崩溃有利于排查问题,软失败不易发现问题

import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
import top.hendrixshen.magiclib.libs.com.llamalad7.mixinextras.sugar.Local;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

在子版本创建覆盖类时,请使用 Javadoc 标注,仅在新版本引入的覆盖也应当在根项目放置空的 abstract 类用于占位。
示例:

// CHECKSTYLE.OFF: JavadocStyle
/**
 * <li>mc1.14 ~ mc26.1: subproject 1.16.5 (main project) [dummy]        &lt;--------</li>
 * <li>mc26.2+        : subproject 26.2</li>
 */
// CHECKSTYLE.ON: JavadocStyle
@Mixin(DummyClass.class)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里有两个问题:
第一是 JaveDoc 中的对齐问题。
第二是修改后是否真的进行了相应的测试?此处编译器会产生编译警告:

{projectRoot}\versions\1.21.11-fabric\build\preprocessed\main\java\com\plusls\MasaGadget\mixin\mod_tweak\tweakeroo\inventoryPreviewSupportSelect\MixinInventoryOverlay.java:21: Warning: Cannot find target method "renderStackAt(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/world/item/ItemStack;FFFLnet/minecraft/client/Minecraft;DD)V" for @Inject.method="renderStackAt(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/world/item/ItemStack;FFFLnet/minecraft/client/Minecraft;DD)V" in fi.dy.masa.malilib.render.InventoryOverlay
    @Inject(

运行时异常:

[20:13:49] [Render thread/INFO] (FabricLoader/Mixin/audit) Force-loading class fi.dy.masa.tweakeroo.renderer.RenderUtils
[20:13:49] [Render thread/ERROR] (FabricLoader/Mixin) Mixin apply for mod masa_gadget_mod failed masa_gadget_mod.mixins.json:mod_tweak.tweakeroo.inventoryPreviewSupportTradeOfferList.MixinRenderUtils from mod masa_gadget_mod -> fi.dy.masa.tweakeroo.renderer.RenderUtils: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException Critical injection failure: @ModifyVariable annotation on renderTradeOfferList could not find any targets matching 'renderInventoryOverlay' in fi/dy/masa/tweakeroo/renderer/RenderUtils. No refMap loaded. [INJECT_PREPARE_LEGACY Applicator Phase -> masa_gadget_mod.mixins.json:mod_tweak.tweakeroo.inventoryPreviewSupportTradeOfferList.MixinRenderUtils from mod masa_gadget_mod -> Prepare Legacy Injections -> localvar$bph000$masa_gadget_mod$renderTradeOfferList(Lnet/minecraft/world/Container;Lnet/minecraft/client/gui/GuiGraphics;)Lnet/minecraft/world/Container; -> Parse ->  -> Validate Targets]

org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: Critical injection failure: @ModifyVariable annotation on renderTradeOfferList could not find any targets matching 'renderInventoryOverlay' in fi/dy/masa/tweakeroo/renderer/RenderUtils. No refMap loaded. [INJECT_PREPARE_LEGACY Applicator Phase -> masa_gadget_mod.mixins.json:mod_tweak.tweakeroo.inventoryPreviewSupportTradeOfferList.MixinRenderUtils from mod masa_gadget_mod -> Prepare Legacy Injections -> localvar$bph000$masa_gadget_mod$renderTradeOfferList(Lnet/minecraft/world/Container;Lnet/minecraft/client/gui/GuiGraphics;)Lnet/minecraft/world/Container; -> Parse ->  -> Validate Targets]
	at org.spongepowered.asm.mixin.injection.selectors.TargetSelectors.validate(TargetSelectors.java:346)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.readAnnotation(InjectionInfo.java:369)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.<init>(InjectionInfo.java:340)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.<init>(InjectionInfo.java:331)
	at org.spongepowered.asm.mixin.injection.struct.ModifyVariableInjectionInfo.<init>(ModifyVariableInjectionInfo.java:47)
	at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:483)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo$InjectorEntry.create(InjectionInfo.java:196)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.parse(InjectionInfo.java:664)
	at knot//com.llamalad7.mixinextras.sugar.impl.SugarWrapperImpl.<init>(SugarWrapperImpl.java:50)
	at knot//com.llamalad7.mixinextras.wrapper.WrapperInjectionInfo.<init>(WrapperInjectionInfo.java:30)
	at knot//com.llamalad7.mixinextras.sugar.impl.SugarWrapperInjectionInfo.<init>(SugarWrapperInjectionInfo.java:14)
	at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:483)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo$InjectorEntry.create(InjectionInfo.java:196)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.parse(InjectionInfo.java:664)
	at org.spongepowered.asm.mixin.transformer.MixinTargetContext.prepareInjections(MixinTargetContext.java:1386)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.prepareInjections(MixinApplicatorStandard.java:811)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.lambda$runApplicatorPass$3(MixinApplicatorStandard.java:323)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.processMixins(MixinApplicatorStandard.java:381)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.runApplicatorPass(MixinApplicatorStandard.java:320)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.apply(MixinApplicatorStandard.java:240)
	at org.spongepowered.asm.mixin.transformer.TargetClassContext.apply(TargetClassContext.java:437)
	at org.spongepowered.asm.mixin.transformer.TargetClassContext.applyMixins(TargetClassContext.java:418)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:351)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClass(MixinTransformer.java:237)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClassBytes(MixinTransformer.java:202)
	at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.getPostMixinClassByteArray(KnotClassDelegate.java:435)
	at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.tryLoadClass(KnotClassDelegate.java:336)
	at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.loadClass(KnotClassDelegate.java:231)
	at net.fabricmc.loader.impl.launch.knot.KnotClassLoader.loadClass(KnotClassLoader.java:119)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:490)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:547)
	at net.fabricmc.loader.impl.launch.knot.MixinServiceKnot.findClass(MixinServiceKnot.java:104)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.audit(MixinProcessor.java:253)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.audit(MixinTransformer.java:171)
	at org.spongepowered.asm.mixin.MixinEnvironment.audit(MixinEnvironment.java:1718)
	at knot//top.hendrixshen.magiclib.impl.mixin.audit.MixinAuditor.runMixinAuditImpl(MixinAuditor.java:66)
	at knot//top.hendrixshen.magiclib.impl.mixin.audit.MixinAuditor.runMixinAudit(MixinAuditor.java:41)
	at knot//top.hendrixshen.magiclib.impl.mixin.audit.MixinAuditor.trigger(MixinAuditor.java:23)
	at knot//top.hendrixshen.magiclib.entrypoint.core.MagicLibFabric.onInitialize(MagicLibFabric.java:19)
	at net.fabricmc.loader.impl.FabricLoaderImpl.invokeEntrypoints(FabricLoaderImpl.java:409)
	at net.fabricmc.loader.impl.game.minecraft.Hooks.startClient(Hooks.java:52)
	at knot//net.minecraft.client.Minecraft.<init>(Minecraft.java:475)
	at knot//net.minecraft.client.main.Main.main(Main.java:234)
	at net.fabricmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:514)
	at net.fabricmc.loader.impl.launch.knot.Knot.launch(Knot.java:72)
	at net.fabricmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:23)
	at net.fabricmc.devlaunchinjector.Main.main(Main.java:86)
[20:13:49] [Render thread/ERROR] (magiclib) Exception occurs while auditing mixin.

java.lang.RuntimeException: Mixin transformation of fi.dy.masa.tweakeroo.renderer.RenderUtils failed
	at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.getPostMixinClassByteArray(KnotClassDelegate.java:440)
	at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.tryLoadClass(KnotClassDelegate.java:336)
	at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.loadClass(KnotClassDelegate.java:231)
	at net.fabricmc.loader.impl.launch.knot.KnotClassLoader.loadClass(KnotClassLoader.java:119)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:490)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:547)
	at net.fabricmc.loader.impl.launch.knot.MixinServiceKnot.findClass(MixinServiceKnot.java:104)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.audit(MixinProcessor.java:253)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.audit(MixinTransformer.java:171)
	at org.spongepowered.asm.mixin.MixinEnvironment.audit(MixinEnvironment.java:1718)
	at knot//top.hendrixshen.magiclib.impl.mixin.audit.MixinAuditor.runMixinAuditImpl(MixinAuditor.java:66)
	at knot//top.hendrixshen.magiclib.impl.mixin.audit.MixinAuditor.runMixinAudit(MixinAuditor.java:41)
	at knot//top.hendrixshen.magiclib.impl.mixin.audit.MixinAuditor.trigger(MixinAuditor.java:23)
	at knot//top.hendrixshen.magiclib.entrypoint.core.MagicLibFabric.onInitialize(MagicLibFabric.java:19)
	at net.fabricmc.loader.impl.FabricLoaderImpl.invokeEntrypoints(FabricLoaderImpl.java:409)
	at net.fabricmc.loader.impl.game.minecraft.Hooks.startClient(Hooks.java:52)
	at knot//net.minecraft.client.Minecraft.<init>(Minecraft.java:475)
	at knot//net.minecraft.client.main.Main.main(Main.java:234)
	at net.fabricmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:514)
	at net.fabricmc.loader.impl.launch.knot.Knot.launch(Knot.java:72)
	at net.fabricmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:23)
	at net.fabricmc.devlaunchinjector.Main.main(Main.java:86)
Caused by: org.spongepowered.asm.mixin.transformer.throwables.MixinTransformerError: An unexpected critical error was encountered
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:380)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClass(MixinTransformer.java:237)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClassBytes(MixinTransformer.java:202)
Caused by: org.spongepowered.asm.mixin.transformer.throwables.MixinTransformerError: An unexpected critical error was encountered

	at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.getPostMixinClassByteArray(KnotClassDelegate.java:435)
	... 22 more
Caused by: org.spongepowered.asm.mixin.throwables.MixinApplyError: Mixin [masa_gadget_mod.mixins.json:mod_tweak.tweakeroo.inventoryPreviewSupportTradeOfferList.MixinRenderUtils from mod masa_gadget_mod] from phase [DEFAULT] in config [masa_gadget_mod.mixins.json] FAILED during APPLY
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.handleMixinError(MixinProcessor.java:685)
Caused by: org.spongepowered.asm.mixin.throwables.MixinApplyError: Mixin [masa_gadget_mod.mixins.json:mod_tweak.tweakeroo.inventoryPreviewSupportTradeOfferList.MixinRenderUtils from mod masa_gadget_mod] from phase [DEFAULT] in config [masa_gadget_mod.mixins.json] FAILED during APPLY

	at org.spongepowered.asm.mixin.transformer.MixinProcessor.handleMixinApplyError(MixinProcessor.java:636)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:367)
	... 25 more
Caused by: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: Critical injection failure: @ModifyVariable annotation on renderTradeOfferList could not find any targets matching 'renderInventoryOverlay' in fi/dy/masa/tweakeroo/renderer/RenderUtils. No refMap loaded. [INJECT_PREPARE_LEGACY Applicator Phase -> masa_gadget_mod.mixins.json:mod_tweak.tweakeroo.inventoryPreviewSupportTradeOfferList.MixinRenderUtils from mod masa_gadget_mod -> Prepare Legacy Injections -> localvar$bph000$masa_gadget_mod$renderTradeOfferList(Lnet/minecraft/world/Container;Lnet/minecraft/client/gui/GuiGraphics;)Lnet/minecraft/world/Container; -> Parse ->  -> Validate Targets]
Caused by: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: Critical injection failure: @ModifyVariable annotation on renderTradeOfferList could not find any targets matching 'renderInventoryOverlay' in fi/dy/masa/tweakeroo/renderer/RenderUtils. No refMap loaded. [INJECT_PREPARE_LEGACY Applicator Phase -> masa_gadget_mod.mixins.json:mod_tweak.tweakeroo.inventoryPreviewSupportTradeOfferList.MixinRenderUtils from mod masa_gadget_mod -> Prepare Legacy Injections -> localvar$bph000$masa_gadget_mod$renderTradeOfferList(Lnet/minecraft/world/Container;Lnet/minecraft/client/gui/GuiGraphics;)Lnet/minecraft/world/Container; -> Parse ->  -> Validate Targets]

	at org.spongepowered.asm.mixin.injection.selectors.TargetSelectors.validate(TargetSelectors.java:346)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.readAnnotation(InjectionInfo.java:369)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.<init>(InjectionInfo.java:340)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.<init>(InjectionInfo.java:331)
	at org.spongepowered.asm.mixin.injection.struct.ModifyVariableInjectionInfo.<init>(ModifyVariableInjectionInfo.java:47)
	at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:483)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo$InjectorEntry.create(InjectionInfo.java:196)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.parse(InjectionInfo.java:664)
	at knot//com.llamalad7.mixinextras.sugar.impl.SugarWrapperImpl.<init>(SugarWrapperImpl.java:50)
	at knot//com.llamalad7.mixinextras.wrapper.WrapperInjectionInfo.<init>(WrapperInjectionInfo.java:30)
	at knot//com.llamalad7.mixinextras.sugar.impl.SugarWrapperInjectionInfo.<init>(SugarWrapperInjectionInfo.java:14)
	at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:483)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo$InjectorEntry.create(InjectionInfo.java:196)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.parse(InjectionInfo.java:664)
	at org.spongepowered.asm.mixin.transformer.MixinTargetContext.prepareInjections(MixinTargetContext.java:1386)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.prepareInjections(MixinApplicatorStandard.java:811)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.lambda$runApplicatorPass$3(MixinApplicatorStandard.java:323)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.processMixins(MixinApplicatorStandard.java:381)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.runApplicatorPass(MixinApplicatorStandard.java:320)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.apply(MixinApplicatorStandard.java:240)
	at org.spongepowered.asm.mixin.transformer.TargetClassContext.apply(TargetClassContext.java:437)
	at org.spongepowered.asm.mixin.transformer.TargetClassContext.applyMixins(TargetClassContext.java:418)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:351)
	... 25 more

@Fenad2

Fenad2 commented Aug 1, 2026

Copy link
Copy Markdown
Author

变更说明

相较于 4e6e6c,本次主要进行了兼容性代码和格式整理:

  • 统一库存预览相关代码使用 GuiRenderContext,减少不必要的版本分支和代码移动。
  • 修正 RenderUtil 的预处理条件顺序。
  • 移除不必要的 CAPTURE_FAILSOFTremap = false 及交易列表预览中的重复 accessor 分支。
  • 补充各子版本覆盖类的 Javadoc 版本范围说明。
  • 整理导入分组和 Checkstyle 标记。

验证

版本 单人 多人 (PCA)
1.21-fabric 可运行 可运行
1.21.4 可运行 未测试
1.21.5 可运行 可运行
1.21.8 可运行 可运行
1.21.11 可运行 可运行
26.1 可运行 可运行
26.2 可运行 (无PCA26.2)

@Fenad2
Fenad2 requested a review from Hendrix-Shen August 1, 2026 13:34

@Hendrix-Shen Hendrix-Shen left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

您好 @Fenad2
感谢您花时间向本仓库贡献,我们收到了来自您的审查请求,在彻底审查您的更新后,我们进行了进一步的测试,发现您的提交未能通过 Mixin Audit 运行时测试,我们已在相应的位置标出。
我们在先前的项目更新中移除了部分功能是因为 Tweakeroo / MiniHUD 已经配合 Servux 更好的实现了对应功能,在我们重构同步方案前,无意更新相关逻辑,因此允许部分功能无效,但需要在 Configs 当中添加对应的依赖检查。
请注意审查附言中可能仅在问题首次发生时标注,不代表问题只发生过一次。
感谢您的理解与配合,我们期待着和您的进一步合作。祝您过得愉快!
再次感谢您的贡献!

import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
import top.hendrixshen.magiclib.libs.com.llamalad7.mixinextras.sugar.Local;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里有两个问题:
第一是 JaveDoc 中的对齐问题。
第二是修改后是否真的进行了相应的测试?此处编译器会产生编译警告:

{projectRoot}\versions\1.21.11-fabric\build\preprocessed\main\java\com\plusls\MasaGadget\mixin\mod_tweak\tweakeroo\inventoryPreviewSupportSelect\MixinInventoryOverlay.java:21: Warning: Cannot find target method "renderStackAt(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/world/item/ItemStack;FFFLnet/minecraft/client/Minecraft;DD)V" for @Inject.method="renderStackAt(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/world/item/ItemStack;FFFLnet/minecraft/client/Minecraft;DD)V" in fi.dy.masa.malilib.render.InventoryOverlay
    @Inject(

运行时异常:

[20:13:49] [Render thread/INFO] (FabricLoader/Mixin/audit) Force-loading class fi.dy.masa.tweakeroo.renderer.RenderUtils
[20:13:49] [Render thread/ERROR] (FabricLoader/Mixin) Mixin apply for mod masa_gadget_mod failed masa_gadget_mod.mixins.json:mod_tweak.tweakeroo.inventoryPreviewSupportTradeOfferList.MixinRenderUtils from mod masa_gadget_mod -> fi.dy.masa.tweakeroo.renderer.RenderUtils: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException Critical injection failure: @ModifyVariable annotation on renderTradeOfferList could not find any targets matching 'renderInventoryOverlay' in fi/dy/masa/tweakeroo/renderer/RenderUtils. No refMap loaded. [INJECT_PREPARE_LEGACY Applicator Phase -> masa_gadget_mod.mixins.json:mod_tweak.tweakeroo.inventoryPreviewSupportTradeOfferList.MixinRenderUtils from mod masa_gadget_mod -> Prepare Legacy Injections -> localvar$bph000$masa_gadget_mod$renderTradeOfferList(Lnet/minecraft/world/Container;Lnet/minecraft/client/gui/GuiGraphics;)Lnet/minecraft/world/Container; -> Parse ->  -> Validate Targets]

org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: Critical injection failure: @ModifyVariable annotation on renderTradeOfferList could not find any targets matching 'renderInventoryOverlay' in fi/dy/masa/tweakeroo/renderer/RenderUtils. No refMap loaded. [INJECT_PREPARE_LEGACY Applicator Phase -> masa_gadget_mod.mixins.json:mod_tweak.tweakeroo.inventoryPreviewSupportTradeOfferList.MixinRenderUtils from mod masa_gadget_mod -> Prepare Legacy Injections -> localvar$bph000$masa_gadget_mod$renderTradeOfferList(Lnet/minecraft/world/Container;Lnet/minecraft/client/gui/GuiGraphics;)Lnet/minecraft/world/Container; -> Parse ->  -> Validate Targets]
	at org.spongepowered.asm.mixin.injection.selectors.TargetSelectors.validate(TargetSelectors.java:346)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.readAnnotation(InjectionInfo.java:369)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.<init>(InjectionInfo.java:340)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.<init>(InjectionInfo.java:331)
	at org.spongepowered.asm.mixin.injection.struct.ModifyVariableInjectionInfo.<init>(ModifyVariableInjectionInfo.java:47)
	at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:483)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo$InjectorEntry.create(InjectionInfo.java:196)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.parse(InjectionInfo.java:664)
	at knot//com.llamalad7.mixinextras.sugar.impl.SugarWrapperImpl.<init>(SugarWrapperImpl.java:50)
	at knot//com.llamalad7.mixinextras.wrapper.WrapperInjectionInfo.<init>(WrapperInjectionInfo.java:30)
	at knot//com.llamalad7.mixinextras.sugar.impl.SugarWrapperInjectionInfo.<init>(SugarWrapperInjectionInfo.java:14)
	at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:483)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo$InjectorEntry.create(InjectionInfo.java:196)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.parse(InjectionInfo.java:664)
	at org.spongepowered.asm.mixin.transformer.MixinTargetContext.prepareInjections(MixinTargetContext.java:1386)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.prepareInjections(MixinApplicatorStandard.java:811)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.lambda$runApplicatorPass$3(MixinApplicatorStandard.java:323)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.processMixins(MixinApplicatorStandard.java:381)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.runApplicatorPass(MixinApplicatorStandard.java:320)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.apply(MixinApplicatorStandard.java:240)
	at org.spongepowered.asm.mixin.transformer.TargetClassContext.apply(TargetClassContext.java:437)
	at org.spongepowered.asm.mixin.transformer.TargetClassContext.applyMixins(TargetClassContext.java:418)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:351)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClass(MixinTransformer.java:237)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClassBytes(MixinTransformer.java:202)
	at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.getPostMixinClassByteArray(KnotClassDelegate.java:435)
	at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.tryLoadClass(KnotClassDelegate.java:336)
	at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.loadClass(KnotClassDelegate.java:231)
	at net.fabricmc.loader.impl.launch.knot.KnotClassLoader.loadClass(KnotClassLoader.java:119)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:490)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:547)
	at net.fabricmc.loader.impl.launch.knot.MixinServiceKnot.findClass(MixinServiceKnot.java:104)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.audit(MixinProcessor.java:253)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.audit(MixinTransformer.java:171)
	at org.spongepowered.asm.mixin.MixinEnvironment.audit(MixinEnvironment.java:1718)
	at knot//top.hendrixshen.magiclib.impl.mixin.audit.MixinAuditor.runMixinAuditImpl(MixinAuditor.java:66)
	at knot//top.hendrixshen.magiclib.impl.mixin.audit.MixinAuditor.runMixinAudit(MixinAuditor.java:41)
	at knot//top.hendrixshen.magiclib.impl.mixin.audit.MixinAuditor.trigger(MixinAuditor.java:23)
	at knot//top.hendrixshen.magiclib.entrypoint.core.MagicLibFabric.onInitialize(MagicLibFabric.java:19)
	at net.fabricmc.loader.impl.FabricLoaderImpl.invokeEntrypoints(FabricLoaderImpl.java:409)
	at net.fabricmc.loader.impl.game.minecraft.Hooks.startClient(Hooks.java:52)
	at knot//net.minecraft.client.Minecraft.<init>(Minecraft.java:475)
	at knot//net.minecraft.client.main.Main.main(Main.java:234)
	at net.fabricmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:514)
	at net.fabricmc.loader.impl.launch.knot.Knot.launch(Knot.java:72)
	at net.fabricmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:23)
	at net.fabricmc.devlaunchinjector.Main.main(Main.java:86)
[20:13:49] [Render thread/ERROR] (magiclib) Exception occurs while auditing mixin.

java.lang.RuntimeException: Mixin transformation of fi.dy.masa.tweakeroo.renderer.RenderUtils failed
	at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.getPostMixinClassByteArray(KnotClassDelegate.java:440)
	at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.tryLoadClass(KnotClassDelegate.java:336)
	at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.loadClass(KnotClassDelegate.java:231)
	at net.fabricmc.loader.impl.launch.knot.KnotClassLoader.loadClass(KnotClassLoader.java:119)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:490)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:547)
	at net.fabricmc.loader.impl.launch.knot.MixinServiceKnot.findClass(MixinServiceKnot.java:104)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.audit(MixinProcessor.java:253)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.audit(MixinTransformer.java:171)
	at org.spongepowered.asm.mixin.MixinEnvironment.audit(MixinEnvironment.java:1718)
	at knot//top.hendrixshen.magiclib.impl.mixin.audit.MixinAuditor.runMixinAuditImpl(MixinAuditor.java:66)
	at knot//top.hendrixshen.magiclib.impl.mixin.audit.MixinAuditor.runMixinAudit(MixinAuditor.java:41)
	at knot//top.hendrixshen.magiclib.impl.mixin.audit.MixinAuditor.trigger(MixinAuditor.java:23)
	at knot//top.hendrixshen.magiclib.entrypoint.core.MagicLibFabric.onInitialize(MagicLibFabric.java:19)
	at net.fabricmc.loader.impl.FabricLoaderImpl.invokeEntrypoints(FabricLoaderImpl.java:409)
	at net.fabricmc.loader.impl.game.minecraft.Hooks.startClient(Hooks.java:52)
	at knot//net.minecraft.client.Minecraft.<init>(Minecraft.java:475)
	at knot//net.minecraft.client.main.Main.main(Main.java:234)
	at net.fabricmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:514)
	at net.fabricmc.loader.impl.launch.knot.Knot.launch(Knot.java:72)
	at net.fabricmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:23)
	at net.fabricmc.devlaunchinjector.Main.main(Main.java:86)
Caused by: org.spongepowered.asm.mixin.transformer.throwables.MixinTransformerError: An unexpected critical error was encountered
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:380)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClass(MixinTransformer.java:237)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClassBytes(MixinTransformer.java:202)
Caused by: org.spongepowered.asm.mixin.transformer.throwables.MixinTransformerError: An unexpected critical error was encountered

	at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.getPostMixinClassByteArray(KnotClassDelegate.java:435)
	... 22 more
Caused by: org.spongepowered.asm.mixin.throwables.MixinApplyError: Mixin [masa_gadget_mod.mixins.json:mod_tweak.tweakeroo.inventoryPreviewSupportTradeOfferList.MixinRenderUtils from mod masa_gadget_mod] from phase [DEFAULT] in config [masa_gadget_mod.mixins.json] FAILED during APPLY
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.handleMixinError(MixinProcessor.java:685)
Caused by: org.spongepowered.asm.mixin.throwables.MixinApplyError: Mixin [masa_gadget_mod.mixins.json:mod_tweak.tweakeroo.inventoryPreviewSupportTradeOfferList.MixinRenderUtils from mod masa_gadget_mod] from phase [DEFAULT] in config [masa_gadget_mod.mixins.json] FAILED during APPLY

	at org.spongepowered.asm.mixin.transformer.MixinProcessor.handleMixinApplyError(MixinProcessor.java:636)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:367)
	... 25 more
Caused by: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: Critical injection failure: @ModifyVariable annotation on renderTradeOfferList could not find any targets matching 'renderInventoryOverlay' in fi/dy/masa/tweakeroo/renderer/RenderUtils. No refMap loaded. [INJECT_PREPARE_LEGACY Applicator Phase -> masa_gadget_mod.mixins.json:mod_tweak.tweakeroo.inventoryPreviewSupportTradeOfferList.MixinRenderUtils from mod masa_gadget_mod -> Prepare Legacy Injections -> localvar$bph000$masa_gadget_mod$renderTradeOfferList(Lnet/minecraft/world/Container;Lnet/minecraft/client/gui/GuiGraphics;)Lnet/minecraft/world/Container; -> Parse ->  -> Validate Targets]
Caused by: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: Critical injection failure: @ModifyVariable annotation on renderTradeOfferList could not find any targets matching 'renderInventoryOverlay' in fi/dy/masa/tweakeroo/renderer/RenderUtils. No refMap loaded. [INJECT_PREPARE_LEGACY Applicator Phase -> masa_gadget_mod.mixins.json:mod_tweak.tweakeroo.inventoryPreviewSupportTradeOfferList.MixinRenderUtils from mod masa_gadget_mod -> Prepare Legacy Injections -> localvar$bph000$masa_gadget_mod$renderTradeOfferList(Lnet/minecraft/world/Container;Lnet/minecraft/client/gui/GuiGraphics;)Lnet/minecraft/world/Container; -> Parse ->  -> Validate Targets]

	at org.spongepowered.asm.mixin.injection.selectors.TargetSelectors.validate(TargetSelectors.java:346)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.readAnnotation(InjectionInfo.java:369)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.<init>(InjectionInfo.java:340)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.<init>(InjectionInfo.java:331)
	at org.spongepowered.asm.mixin.injection.struct.ModifyVariableInjectionInfo.<init>(ModifyVariableInjectionInfo.java:47)
	at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:483)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo$InjectorEntry.create(InjectionInfo.java:196)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.parse(InjectionInfo.java:664)
	at knot//com.llamalad7.mixinextras.sugar.impl.SugarWrapperImpl.<init>(SugarWrapperImpl.java:50)
	at knot//com.llamalad7.mixinextras.wrapper.WrapperInjectionInfo.<init>(WrapperInjectionInfo.java:30)
	at knot//com.llamalad7.mixinextras.sugar.impl.SugarWrapperInjectionInfo.<init>(SugarWrapperInjectionInfo.java:14)
	at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:483)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo$InjectorEntry.create(InjectionInfo.java:196)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.parse(InjectionInfo.java:664)
	at org.spongepowered.asm.mixin.transformer.MixinTargetContext.prepareInjections(MixinTargetContext.java:1386)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.prepareInjections(MixinApplicatorStandard.java:811)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.lambda$runApplicatorPass$3(MixinApplicatorStandard.java:323)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.processMixins(MixinApplicatorStandard.java:381)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.runApplicatorPass(MixinApplicatorStandard.java:320)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.apply(MixinApplicatorStandard.java:240)
	at org.spongepowered.asm.mixin.transformer.TargetClassContext.apply(TargetClassContext.java:437)
	at org.spongepowered.asm.mixin.transformer.TargetClassContext.applyMixins(TargetClassContext.java:418)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:351)
	... 25 more

@Fenad2

Fenad2 commented Aug 8, 2026

Copy link
Copy Markdown
Author

您好 @Hendrix-Shen
感谢您抽出时间对本次提交进行审查,我已经注意到本次提交所存在的问题。

  • 对于 javadoc (1.21.11 ~ 26.2版本下)的格式对齐问题已经修改为与项目风格一致的格式。

  • 先前的测试内容主要为渲染村民第一本附魔书渲染补货渲染村民绑定工作方块/床
    因此忽略了 Tweakeroo 相关功能可能存在的问题。

    对于 Tweakeroo 环境下的容器预览崩溃问题位于 inventoryPreviewSupportSelect.MixinInventoryOverlay
    Minecraft1.21.11+ 已使用新版 Malilib 的新方法签名:

    // Minecraft 1.21.6 - 1.21.10
    public static void renderStackAt(
            GuiGraphics guiGraphics,
            ItemStack stack,
            float x,
            float y,
            float scale,
            Minecraft minecraft,
            double zLevel,
            double alpha
    )
  // Minecraft 1.21.11+
   public static void renderStackAt(
       GuiContext context,
       ItemStack stack,
       float x,
       float y,
       float scale,
       double zLevel,
       double alpha
)

原先代码仅从 MC >= 26.1 起选择新版签名,因此 Minecraft 1.21.11 会错误落入 MC >= 1.21.6 分支,并尝试注入旧的 GuiGraphics 签名。

现已将版本条件从 MC >= 26.1 修正为 MC >= 1.21.11 ,并添加了 remap = true 以确保能正确转换

  • 而对于日志报告中所呈现出的 inventoryPreviewSupportTradeOfferList 仍尝试向旧的:
    fi.dy.masa.tweakeroo.renderer.RenderUtils.renderInventoryOverlay注入,1.21+ 的 Tweakeroo 中该方法已不存在
    我看到项目中已经在 Configs 添加了相关限制( Minecraft < 1.21 ),但对应的 Mixin 中并没有没有相关限制。
    如果要修复该问题似乎需要在对应 Mixin 中添加:
@Dependencies(require = {
        @Dependency(ModId.tweakeroo),
        @Dependency(value = ModId.minecraft, versionPredicates = "<1.21")
})

作为版本限制。
因为需要修改的类为早期游戏版本的相关类且之后并没有进行该版本限制的改动。
所以我不确定是否一定是这里的问题,故没有进行修改。

  • 此外,我发现 搜索怪物生成点 在 1.21.11 开始部分失效,具体表现为发送到玩家聊天栏的坐标会呈现消息文本占位符 [%d, %d, %d]形式,
    1.21.11 的原版 Component.translatable 处理这种组件文本时,稳定支持的是 %s 格式占位符;%d 不会被参数替换,于是原样显示为 [%d, %d, %d]。
    spawn_pos: 'Spawn pos: [%d, %d, %d] -> spawn_pos: 'Spawn pos: [%s, %s, %s]
    此处暂不进行修改

@Hendrix-Shen

Copy link
Copy Markdown
Collaborator

您好 @Hendrix-Shen , 感谢您抽出时间对本次提交进行审查,我已经注意到本次提交所存在的问题。

* 对于 javadoc (1.21.11 ~ 26.2版本下)的格式对齐问题已经修改为与项目风格一致的格式。

* 先前的测试内容主要为`渲染村民第一本附魔书`、`渲染补货`、`渲染村民绑定工作方块/床`。
  因此忽略了 Tweakeroo 相关功能可能存在的问题。
  对于 Tweakeroo 环境下的容器预览崩溃问题位于 `inventoryPreviewSupportSelect.MixinInventoryOverlay`
  Minecraft1.21.11+ 已使用新版 Malilib 的新方法签名:
    // Minecraft 1.21.6 - 1.21.10
    public static void renderStackAt(
            GuiGraphics guiGraphics,
            ItemStack stack,
            float x,
            float y,
            float scale,
            Minecraft minecraft,
            double zLevel,
            double alpha
    )
  // Minecraft 1.21.11+
   public static void renderStackAt(
       GuiContext context,
       ItemStack stack,
       float x,
       float y,
       float scale,
       double zLevel,
       double alpha
)

原先代码仅从 MC >= 26.1 起选择新版签名,因此 Minecraft 1.21.11 会错误落入 MC >= 1.21.6 分支,并尝试注入旧的 GuiGraphics 签名。

现已将版本条件从 MC >= 26.1 修正为 MC >= 1.21.11 ,并添加了 remap = true 以确保能正确转换

* 而对于日志报告中所呈现出的 `inventoryPreviewSupportTradeOfferList` 仍尝试向旧的:
  `fi.dy.masa.tweakeroo.renderer.RenderUtils.renderInventoryOverlay`注入,1.21+ 的 Tweakeroo 中该方法已不存在
  我看到项目中已经在 Configs 添加了相关限制( Minecraft < 1.21 ),但对应的 Mixin 中并没有没有相关限制。
  如果要修复该问题似乎需要在对应 Mixin 中添加:
@Dependencies(require = {
        @Dependency(ModId.tweakeroo),
        @Dependency(value = ModId.minecraft, versionPredicates = "<1.21")
})

作为版本限制。 因为需要修改的类为早期游戏版本的相关类且之后并没有进行该版本限制的改动。 所以我不确定是否一定是这里的问题,故没有进行修改。

* 此外,我发现 `搜索怪物生成点` 在 1.21.11 开始部分失效,具体表现为发送到玩家聊天栏的坐标会呈现消息文本占位符 [%d, %d, %d]形式,
  1.21.11 的原版 Component.translatable 处理这种组件文本时,稳定支持的是 %s 格式占位符;%d 不会被参数替换,于是原样显示为 [%d, %d, %d]。
  `spawn_pos: 'Spawn pos: [%d, %d, %d]  -> spawn_pos: 'Spawn pos: [%s, %s, %s]`
  此处暂不进行修改

您好 @Fenad2

感谢您的回复,有关您提出的问题我们做出以下回复:

对于 com.plusls.MasaGadget.mixin.mod_tweak.tweakeroo.inventoryPreviewSupportTradeOfferList.MixinRenderUtils.java 我们已经在 1.21.1-fabric 中添加覆盖类,因此在 Preprocessor 流程中,mc1.21.1 及以上版本将使用 Dummy 类占位,因此没有使用依赖注解。

对于 Component.translatable,您可以使用变通方法 Component.literal 和 top.hendrixshen.magiclib.api.i18n.I18n 来使用 %d 或者通过 vanilla 的 Component.translatable 配合 %s 来实现。

感谢您的理解与配合,我们期待着和您的进一步合作。祝您过得愉快!

再次感谢您的贡献!

@Fenad2

Fenad2 commented Aug 8, 2026

Copy link
Copy Markdown
Author

感谢说明!

  • 已移除 1.21.11、26.1.2 和 26.2 中 inventoryPreviewSupportTradeOfferList.MixinRenderUtils 的高版本实现,使 Minecraft 1.21+ 统一使用 1.21.1-fabric 中已有的 Dummy 覆盖类,不再尝试注入1.21+已不再维护的 Tweakeroo 容器预览内部逻辑。

  • 已修复“搜索怪物生成点”在 1.21.11+ 中将坐标显示为 [%d, %d, %d] 的问题。
    现在先通过 MagicLib I18n.tr 完成 %d 格式化

验证

1.21.10(单人模式):Tweakeroo容器预览正常
1.21.11(单人模式):Tweakeroo容器预览正常、SearchMobSpawnPoint 功能正常

@Fenad2
Fenad2 requested a review from Hendrix-Shen August 8, 2026 11:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants