You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java开发Minecraft模组时如何向不可修改方法传入伪造参数?

可行实现方案

你这个场景属于Minecraft模组开发中典型的不可修改源码的方法逻辑篡改需求,由于Java参数为值传递,你不可能在方法外部通过传入“伪造参数”的方式替换方法内部实际接收到的入参,直接通过字节码注入修改目标方法逻辑是唯一可行路径,目前主流的实现方式如下:

  • 优先使用Mixin实现(当前Forge/Fabric模组生态的标准注入方案,开发成本最低)
    你不需要替换传入参数,直接在方法返回节点插入自定义判断逻辑即可,代码示例如下:
    // 替换targets为mayPlaceOn方法所属类的全限定名,例如花草方块对应的net.minecraft.block.FlowerBlock
    @Mixin(targets = "net.minecraft.block.xxx.目标类")
    public class BlockPlaceOnMixin {
        @Inject(method = "mayPlaceOn", at = @At("RETURN"), cancellable = true)
        private void overridePlaceCheck(BlockState inputState, BlockGetter level, BlockPos pos, CallbackInfoReturnable<Boolean> cir) {
            // 当传入方块为石头等原本判定不通过的方块时,强制返回true
            if (inputState.is(Blocks.STONE)) {
                cir.setReturnValue(true);
            }
        }
    }
    
    如果你一定要实现“替换方法接收到的参数为Farmland”的逻辑,可以在方法头部注入修改本地参数表的对应值:
    @Mixin(targets = "net.minecraft.block.xxx.目标类")
    public class BlockPlaceOnMixin {
        @Inject(method = "mayPlaceOn", at = @At("HEAD"))
        private void replaceInputParam(CallbackInfoReturnable<Boolean> cir, @Local(argsOnly = true, ordinal = 0) LocalRef<BlockState> stateArg) {
            BlockState originState = stateArg.get();
            if (originState.is(Blocks.STONE)) {
                stateArg.set(Blocks.FARMLAND.defaultBlockState());
            }
        }
    }
    
    写完Mixin类后记得在模组的mixins配置文件中注册该类,重启游戏即可生效。
  • 核心模组(Coremod)ASM注入
    如果你的开发场景不允许使用Mixin,可以通过编写核心模组的ClassVisitor,在类加载阶段扫描到mayPlaceOn方法后,插入自定义字节码逻辑实现参数替换或返回值修改,该方案需要手动处理字节码偏移、栈帧计算,开发复杂度高,无特殊需求不推荐使用。

注意:不要尝试通过包装参数、创建代理类的方式在调用层修改入参,Java的值传递机制决定了方法外部的对象引用修改无法影响方法内部接收到的原始入参,这类方案完全不可能生效。

内容的提问来源于stack exchange,提问作者Mat NX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:06:18