forked from SteamWar/SteamWar
Move over signle block event package processing
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user