package dev.modzuozhi; import net.minecraft.core.*; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.phys.*; import net.neoforged.neoforge.network.handling.ServerPayloadContext; /** Actual optional mod handlers, invoked through the shared context. No production dependencies. */ public final class ModInteractionRegression { public static void run(MinecraftServer server,ServerPayloadContext ctx) throws Exception { if(!net.neoforged.fml.ModList.get().isLoaded("create"))return; var level=server.overworld();var pos=new BlockPos(12,115,8);var player=ctx.player(); player.setPos(12,114,8); var block=BuiltInRegistries.BLOCK.get(ResourceLocation.parse("create:rotation_speed_controller")); level.setBlockAndUpdate(pos,block.defaultBlockState());var be=level.getBlockEntity(pos); PayloadRegression.check(be!=null,"Create speed controller fixture"); var speed=be.getClass().getField("targetSpeed").get(be); var valueType=Class.forName("com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBehaviour"); int netId=(int)SimulatedHandleRegression.call(valueType,speed,"netId",int.class,new Class[]{}); var packetType=Class.forName("com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsPacket"); var hit=new BlockHitResult(Vec3.atCenterOf(pos),Direction.UP,pos,false); var packet=packetType.getConstructor(BlockPos.class,int.class,int.class,net.minecraft.world.InteractionHand.class, BlockHitResult.class,Direction.class,boolean.class,int.class).newInstance(pos,0,32,null,hit,Direction.UP,false,netId); var packetBase=Class.forName("com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket"); var speedType=Class.forName("com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ScrollValueBehaviour"); try { ctx.enqueueWork(() -> { try {SimulatedHandleRegression.call(packetBase,packet,"handle",void.class,new Class[]{ServerPlayer.class},player);} catch(Exception e){throw new RuntimeException(e);} }).join(); int configured=(int)SimulatedHandleRegression.call(speedType,speed,"getValue",int.class,new Class[]{}); PayloadRegression.check(Math.abs(configured)==32,"actual Create speed packet failed: "+configured); player.setPos(10000,115,10000); var denied=packetType.getConstructor(BlockPos.class,int.class,int.class,net.minecraft.world.InteractionHand.class, BlockHitResult.class,Direction.class,boolean.class,int.class).newInstance(pos,0,64,null,hit,Direction.UP,false,netId); ctx.enqueueWork(() -> { try {SimulatedHandleRegression.call(packetBase,denied,"handle",void.class,new Class[]{ServerPlayer.class},player);} catch(Exception e){throw new RuntimeException(e);} }).join(); PayloadRegression.check((int)SimulatedHandleRegression.call(speedType,speed,"getValue",int.class,new Class[]{})==configured,"Create distance check bypassed"); ModZuozhi.LOGGER.info("CREATE CONFIG PASS: real speed packet and original distance denial"); player.setPos(12,114,8); if(net.neoforged.fml.ModList.get().isLoaded("jade"))jade(ctx,pos,be,hit); } finally {level.setBlockAndUpdate(pos,net.minecraft.world.level.block.Blocks.AIR.defaultBlockState());} } static void jade(ServerPayloadContext ctx,BlockPos pos,Object be,BlockHitResult hit) throws Exception { var dataType=Class.forName("snownee.jade.impl.BlockAccessorImpl$SyncData"); var data=dataType.getConstructor(boolean.class,BlockHitResult.class,net.minecraft.world.level.block.state.BlockState.class,net.minecraft.world.item.ItemStack.class) .newInstance(false,hit,ctx.player().level().getBlockState(pos),net.minecraft.world.item.ItemStack.EMPTY); var requestType=Class.forName("snownee.jade.network.RequestBlockPacket"); var request=requestType.getConstructor(dataType,java.util.List.class).newInstance(data,java.util.List.of()); var jadeContext=Class.forName("snownee.jade.network.ServerPayloadContext"); var proxy=java.lang.reflect.Proxy.newProxyInstance(jadeContext.getClassLoader(),new Class[]{jadeContext},(self,method,args) -> { if(method.getName().equals("player"))return ctx.player(); return java.lang.reflect.InvocationHandler.invokeDefault(self,method,args); }); var accessorType=Class.forName("snownee.jade.api.BlockAccessor"); var accessorImpl=Class.forName("snownee.jade.impl.BlockAccessorImpl"); var seen=new java.util.concurrent.atomic.AtomicInteger(); java.util.function.Consumer consumer=tag -> { PayloadRegression.check(tag.getInt("x")==pos.getX(),"Jade response coordinate");seen.incrementAndGet(); }; Runnable query=() -> { try { var accessor=SimulatedHandleRegression.call(dataType,data,"unpack",accessorType,new Class[]{ServerPlayer.class},ctx.player()); PayloadRegression.check(SimulatedHandleRegression.call(accessorType,accessor,"getBlockEntity",net.minecraft.world.level.block.entity.BlockEntity.class,new Class[]{})==be,"Jade BE identity"); SimulatedHandleRegression.call(accessorImpl,null,"handleRequest",void.class,new Class[]{requestType,jadeContext,java.util.function.Consumer.class},request,proxy,consumer); } catch(Exception e){throw new RuntimeException(e);} }; ctx.enqueueWork(query).join();PayloadRegression.check(seen.get()==1,"Jade query callback missing"); ctx.player().setPos(10000,115,10000);ctx.enqueueWork(query).join(); PayloadRegression.check(seen.get()==1,"Jade range guard bypassed"); ModZuozhi.LOGGER.info("JADE REQUEST PASS: real lookup/execute/query and original range denial"); } }