Move over signle block event package processing

This commit is contained in:
Manuel Frohn
2026-05-13 16:24:45 +02:00
parent 744dc67ca9
commit d3aad6a198
2 changed files with 52 additions and 51 deletions
@@ -104,51 +104,6 @@ public class TechHider {
public static final Class<?> multiBlockChangePacket = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundSectionBlocksUpdatePacket");
public static final UnaryOperator<Object> multiBlockChangeCloner = ProtocolUtils.shallowCloneGenerator(TechHider.multiBlockChangePacket);
private static final Class<?> blockChangePacket = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket");
private static final Function<Object, Object> blockChangeCloner = ProtocolUtils.shallowCloneGenerator(blockChangePacket);
private static final Reflection.Field<?> blockChangePosition = Reflection.getField(blockChangePacket, blockPosition, 0);
private static final Reflection.Field<?> blockChangeBlockData = Reflection.getField(blockChangePacket, iBlockData, 0);
private Object blockChangeHider(Player p, Object packet) {
switch (locationEvaluator.checkBlockPos(p, blockChangePosition.get(packet))) {
case SKIP:
return packet;
case CHECK:
if(!iBlockDataHidden(blockChangeBlockData.get(packet)))
return packet;
case HIDE:
packet = blockChangeCloner.apply(packet);
blockChangeBlockData.set(packet, obfuscationTarget);
return packet;
case HIDE_AIR:
default:
packet = blockChangeCloner.apply(packet);
blockChangeBlockData.set(packet, AIR);
return packet;
}
}
private static final Class<?> blockActionPacket = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundBlockEventPacket");
private static final Reflection.Field<?> blockActionPosition = Reflection.getField(blockActionPacket, blockPosition, 0);
private Object blockActionHider(Player p, Object packet) {
if (locationEvaluator.checkBlockPos(p, blockActionPosition.get(packet)) == State.SKIP)
return packet;
return null;
}
public static final Class<?> tileEntityDataPacket = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket");
private static final Reflection.Field<?> tileEntityDataPosition = Reflection.getField(tileEntityDataPacket, blockPosition, 0);
private Object tileEntityDataHider(Player p, Object packet) {
switch (locationEvaluator.checkBlockPos(p, tileEntityDataPosition.get(packet))) {
case SKIP:
return packet;
case CHECK:
if(ProtocolWrapper.impl.unfilteredTileEntityDataAction(packet))
return packet;
default:
return null;
}
}
public enum State {
SKIP,
CHECK,
@@ -10,13 +10,12 @@ import org.bukkit.plugin.Plugin;
import com.comphenix.tinyprotocol.TinyProtocol;
import io.netty.channel.Channel;
import net.minecraft.core.BlockPos;
import net.minecraft.network.PacketListener;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.common.ClientCommonPacketListener;
import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket;
import net.minecraft.network.protocol.common.ClientboundKeepAlivePacket;
import net.minecraft.network.protocol.common.ClientboundPingPacket;
import net.minecraft.network.protocol.game.ClientboundBlockChangedAckPacket;
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;
import net.minecraft.network.protocol.game.ClientboundBlockEventPacket;
import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket;
@@ -45,6 +44,8 @@ import net.minecraft.network.protocol.login.ClientboundCustomQueryPacket;
import net.minecraft.network.protocol.login.ClientboundHelloPacket;
import net.minecraft.network.protocol.login.ClientboundLoginCompressionPacket;
import net.minecraft.network.protocol.login.ClientboundLoginFinishedPacket;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
/**
* The TechHider follows the default-deny security principle,
@@ -55,9 +56,13 @@ public class TechHiderUpdated {
private final Set<Class<? extends Packet<? extends PacketListener>>> bypassingPackets;
private final Map<Class<? extends Packet<? extends PacketListener>>, BiFunction<Player, Packet<? extends PacketListener>, Packet<? extends PacketListener>>> packetProcessors;
private final TinyProtocol interceptor;
private final Set<Integer> blockIdsToObfuscate;
private final BlockState blockToObfuscateTo;
public TechHiderUpdated(Plugin plugin) {
public TechHiderUpdated(Plugin plugin, Set<Integer> blockIdsToObfuscate, BlockState blockToObfuscateTo) {
this.blockIdsToObfuscate = blockIdsToObfuscate;
this.blockToObfuscateTo = blockToObfuscateTo;
this.bypassingPackets = Set.of(
// --- Handshake & Login Protocol ---
// These must be whitelisted to allow the player to actually reach the 'Play'
@@ -101,9 +106,9 @@ public class TechHiderUpdated {
BiFunction<Player, Packet<? extends PacketListener>, Packet<? extends PacketListener>> tossPacket = (p, packet) -> null;
this.packetProcessors = Map.of(
ClientboundBlockEventPacket.class, tossPacket,
ClientboundBlockUpdatePacket.class, tossPacket,
ClientboundBlockEntityDataPacket.class, tossPacket,
ClientboundBlockEventPacket.class, (p, packet) -> processBlockEventPacket(p, (ClientboundBlockEventPacket) packet),
ClientboundBlockUpdatePacket.class, (p, packet) -> processBlockUpdatePacket(p, (ClientboundBlockUpdatePacket) packet),
ClientboundBlockEntityDataPacket.class, (p, packet) -> processBlockEntityDataPacket(p, (ClientboundBlockEntityDataPacket) packet),
ClientboundSectionBlocksUpdatePacket.class, tossPacket,
ClientboundLevelChunkWithLightPacket.class, tossPacket
);
@@ -124,4 +129,45 @@ public class TechHiderUpdated {
}
};
}
private ClientboundBlockEventPacket processBlockEventPacket(Player player, ClientboundBlockEventPacket packet) {
BlockPos blockPos = packet.getPos();
if(isPlayerPrivilegedToAccessBlockPos(player, blockPos)) {
return packet;
}
else {
return null;
}
}
private ClientboundBlockUpdatePacket processBlockUpdatePacket(Player p, ClientboundBlockUpdatePacket packet) {
int id = BlockIds.impl.getCombinedId(packet.getBlockState());
if(blockIdsToObfuscate.contains(id)) {
// Return a modified copy of the packet with the obfuscated block state
ClientboundBlockUpdatePacket modifiedPacket = new ClientboundBlockUpdatePacket(packet.getPos(), blockToObfuscateTo);
return modifiedPacket;
}
else {
return packet;
}
}
private ClientboundBlockEntityDataPacket processBlockEntityDataPacket(Player p, ClientboundBlockEntityDataPacket packet) {
if(isPlayerPrivilegedToAccessBlockPos(p, packet.getPos()) ) {
return packet;
}
else if(ProtocolWrapper.impl.unfilteredTileEntityDataAction(packet)){
return packet;
}
else {
return null;
}
}
public boolean isPlayerPrivilegedToAccessBlockPos(Player p, BlockPos block) {
return false;
}
}