Files
DimensionalRipper/tests/payload/ModInteractionRegression.java
T

79 lines
6.1 KiB
Java

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<net.minecraft.nbt.CompoundTag> 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");
}
}