diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/techhider/TechHider.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/techhider/TechHider.java index 46e53bcf..0428c78c 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/techhider/TechHider.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/techhider/TechHider.java @@ -104,51 +104,6 @@ public class TechHider { public static final Class multiBlockChangePacket = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundSectionBlocksUpdatePacket"); public static final UnaryOperator multiBlockChangeCloner = ProtocolUtils.shallowCloneGenerator(TechHider.multiBlockChangePacket); - private static final Class blockChangePacket = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket"); - private static final Function 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, diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/techhider/TechHiderUpdated.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/techhider/TechHiderUpdated.java index 097de47d..b5def8e9 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/techhider/TechHiderUpdated.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/techhider/TechHiderUpdated.java @@ -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>> bypassingPackets; private final Map>, BiFunction, Packet>> packetProcessors; private final TinyProtocol interceptor; + private final Set blockIdsToObfuscate; + private final BlockState blockToObfuscateTo; - public TechHiderUpdated(Plugin plugin) { + public TechHiderUpdated(Plugin plugin, Set 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, Packet> 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; + } }