首先,我想改的是net.minecraft.server.integrated.IntegratedPlayerManager构造函数里的数字8复制代码
一开始我试了@ModifyConstant,因为这里的字节码显然有个bipush 8,所以应该可以用吧……然后这是我写的复制代码然后崩了复制代码照我看的mixin教程,mixin的这个注解不能直接修改常量的值,而是把这个常量放进函数里在返回出来,所以这个崩溃给我的感觉就是……mixin好像忘了增加这个构造函数的maxStack
然后我照着教程举的@ModifyArgs的例子写了(虽然是forge的教程,但mixin的写法应该是一样的吧)复制代码然后还是崩复制代码
后来我看到wiki里说@ModifyArg注解可以指定多参数方法中的其中一个参数(我看的教程里没有讲这个),于是我写了复制代码还是不行复制代码
这是我第一次用mixin,感觉不如隔壁forge的coremod
- public IntegratedPlayerManager(IntegratedServer server, DynamicRegistryManager.Immutable registryManager, WorldSaveHandler saveHandler) {
 
-         super(server, registryManager, saveHandler, 8);
 
-         this.setViewDistance(10);
 
- }
一开始我试了@ModifyConstant,因为这里的字节码显然有个bipush 8,所以应该可以用吧……然后这是我写的
- @Mixin(IntegratedPlayerManager.class)
 
- public abstract class ExampleMixin {
 
-     @ModifyConstant(method = "<init>", constant = @Constant(intValue = 8)
 
-     )
 
-     private int modifyConstant(int maxplayer) {
 
-         return 20;
 
-     }
 
- }
- java.lang.VerifyError: Bad type on operand stack
 
- Exception Details:
 
-   Location:
 
-     net/minecraft/class_1130.<init>(Lnet/minecraft/class_1132;Lnet/minecraft/class_5455$class_5457;Lnet/minecraft/class_29;)V @7: invokespecial
 
-   Reason:
 
-     Type uninitializedThis (current frame, stack[4]) is not assignable to 'net/minecraft/class_1130'
 
-   Current Frame:
 
-     bci: @7
 
-     flags: { flagThisUninit }
 
-     locals: { uninitializedThis, 'net/minecraft/class_1132', 'net/minecraft/class_5455$class_5457', 'net/minecraft/class_29' }
 
-     stack: { uninitializedThis, 'net/minecraft/class_1132', 'net/minecraft/class_5455$class_5457', 'net/minecraft/class_29', uninitializedThis, integer }
 
-   Bytecode:
 
-     0000000: 2a2b 2c2d 2a10 08b7 0016 b700 192a 100a
 
-     0000010: b600 1db1                              
 
 
-         at net.minecraft.class_1132.<init>(class_1132.java:57)
 
- 以下略
然后我照着教程举的@ModifyArgs的例子写了(虽然是forge的教程,但mixin的写法应该是一样的吧)
- @Mixin(IntegratedPlayerManager.class)
 
- public abstract class ExampleMixin {
 
-     @ModifyArgs(
 
-         method = "<init>",
 
-         at = @At(value = "INVOKE", target = "Lnet/minecraft/server/PlayerManager;<init>(Lnet/minecraft/server/MinecraftServer;Lnet/minecraft/util/registry/DynamicRegistryManager$Immutable;Lnet/minecraft/world/WorldSaveHandler;I)V",
 
-         remap = false)
 
-     )
 
-     private static void modifyArgs_$init$(Args args, IntegratedServer server,
 
-         DynamicRegistryManager.Immutable registryManager,
 
-         WorldSaveHandler saveHandler) {
 
-         args.set(3, 20);
 
-     }
 
- }
- Caused by: org.spongepowered.asm.mixin.transformer.throwables.InvalidMixinException: Unexpecteded ClassMetadataNotFoundException whilst transforming the mixin class: [MAIN Applicator Phase -> modid.mixins.json:ExampleMixin -> Apply Methods -> (Lorg/spongepowered/asm/mixin/injection/invoke/arg/Args;Lnet/minecraft/class_1132;Lnet/minecraft/class_5455$class_6890;Lnet/minecraft/class_29;)V:args$zih000$modifyArgs_$init$ -> Transform Descriptor -> desc=Lnet/minecraft/class_5455$class_6890;]
后来我看到wiki里说@ModifyArg注解可以指定多参数方法中的其中一个参数(我看的教程里没有讲这个),于是我写了
- @Mixin(IntegratedPlayerManager.class)
 
- public abstract class ExampleMixin {
 
-     @ModifyArg(
 
-         method = "<init>",
 
-         at = @At(value = "INVOKE",
 
-         target = "Lnet/minecraft/server/PlayerManager;<init>(Lnet/minecraft/server/MinecraftServer;Lnet/minecraft/util/registry/DynamicRegistryManager$Immutable;Lnet/minecraft/world/WorldSaveHandler;I)V", remap = false),
 
-         index = 3)
 
-     private static int modifyArg(int max) {
 
-         return 20;
 
-     }
 
- }
- Caused by: org.spongepowered.asm.mixin.injection.throwables.InjectionError: Critical injection failure: Argument modifier method modifyArg(I)I in modid.mixins.json:ExampleMixin from mod modid failed injection check, (0/1) succeeded. Scanned 1 target(s). Using refmap fabric-example-mod-refmap.json
这是我第一次用mixin,感觉不如隔壁forge的coremod
@ModifyArg的index是从0开始的呀,如果是第三个参数的话应该是2。