From 42faba70d9017a4798027477952fe051fa349dde Mon Sep 17 00:00:00 2001 From: Manuel Frohn Date: Thu, 14 May 2026 22:08:17 +0200 Subject: [PATCH] Add remaining packets with toss handler for now --- .../src/de/steamwar/techhider/TechHider.java | 196 +++++++++++++++--- 1 file changed, 172 insertions(+), 24 deletions(-) diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/techhider/TechHider.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/techhider/TechHider.java index a4386a08..a5b2c505 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/techhider/TechHider.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/techhider/TechHider.java @@ -1,12 +1,12 @@ package de.steamwar.techhider; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.BiFunction; -import java.util.stream.Collectors; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; @@ -14,13 +14,9 @@ import org.bukkit.plugin.Plugin; import com.comphenix.tinyprotocol.TinyProtocol; import de.steamwar.Reflection; -import de.steamwar.techhider.ChunkHider.SectionHider; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.PacketListener; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.common.ClientboundClearDialogPacket; @@ -35,19 +31,26 @@ import net.minecraft.network.protocol.common.ClientboundServerLinksPacket; import net.minecraft.network.protocol.common.ClientboundShowDialogPacket; import net.minecraft.network.protocol.common.ClientboundStoreCookiePacket; import net.minecraft.network.protocol.common.ClientboundTransferPacket; +import net.minecraft.network.protocol.common.ClientboundUpdateTagsPacket; import net.minecraft.network.protocol.configuration.ClientboundFinishConfigurationPacket; import net.minecraft.network.protocol.configuration.ClientboundRegistryDataPacket; import net.minecraft.network.protocol.configuration.ClientboundUpdateEnabledFeaturesPacket; import net.minecraft.network.protocol.cookie.ClientboundCookieRequestPacket; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.network.protocol.game.ClientboundAnimatePacket; import net.minecraft.network.protocol.game.ClientboundAwardStatsPacket; +import net.minecraft.network.protocol.game.ClientboundBlockChangedAckPacket; +import net.minecraft.network.protocol.game.ClientboundBlockDestructionPacket; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundBlockEventPacket; import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket; import net.minecraft.network.protocol.game.ClientboundBossEventPacket; import net.minecraft.network.protocol.game.ClientboundBundleDelimiterPacket; +import net.minecraft.network.protocol.game.ClientboundBundlePacket; import net.minecraft.network.protocol.game.ClientboundChangeDifficultyPacket; import net.minecraft.network.protocol.game.ClientboundChunkBatchFinishedPacket; import net.minecraft.network.protocol.game.ClientboundChunkBatchStartPacket; +import net.minecraft.network.protocol.game.ClientboundChunksBiomesPacket; import net.minecraft.network.protocol.game.ClientboundClearTitlesPacket; import net.minecraft.network.protocol.game.ClientboundCommandSuggestionsPacket; import net.minecraft.network.protocol.game.ClientboundCommandsPacket; @@ -57,27 +60,54 @@ import net.minecraft.network.protocol.game.ClientboundContainerSetDataPacket; import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; import net.minecraft.network.protocol.game.ClientboundCooldownPacket; import net.minecraft.network.protocol.game.ClientboundCustomChatCompletionsPacket; +import net.minecraft.network.protocol.game.ClientboundDamageEventPacket; +import net.minecraft.network.protocol.game.ClientboundDebugSamplePacket; import net.minecraft.network.protocol.game.ClientboundDeleteChatPacket; import net.minecraft.network.protocol.game.ClientboundDisguisedChatPacket; +import net.minecraft.network.protocol.game.ClientboundEntityEventPacket; +import net.minecraft.network.protocol.game.ClientboundEntityPositionSyncPacket; +import net.minecraft.network.protocol.game.ClientboundExplodePacket; +import net.minecraft.network.protocol.game.ClientboundForgetLevelChunkPacket; import net.minecraft.network.protocol.game.ClientboundGameEventPacket; +import net.minecraft.network.protocol.game.ClientboundHorseScreenOpenPacket; +import net.minecraft.network.protocol.game.ClientboundHurtAnimationPacket; import net.minecraft.network.protocol.game.ClientboundInitializeBorderPacket; import net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket; +import net.minecraft.network.protocol.game.ClientboundLevelEventPacket; +import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket; +import net.minecraft.network.protocol.game.ClientboundLightUpdatePacket; import net.minecraft.network.protocol.game.ClientboundLoginPacket; +import net.minecraft.network.protocol.game.ClientboundMapItemDataPacket; import net.minecraft.network.protocol.game.ClientboundMerchantOffersPacket; +import net.minecraft.network.protocol.game.ClientboundMoveEntityPacket; +import net.minecraft.network.protocol.game.ClientboundMoveEntityPacket.Pos; +import net.minecraft.network.protocol.game.ClientboundMoveEntityPacket.PosRot; +import net.minecraft.network.protocol.game.ClientboundMoveEntityPacket.Rot; +import net.minecraft.network.protocol.game.ClientboundMoveMinecartPacket; +import net.minecraft.network.protocol.game.ClientboundMoveVehiclePacket; import net.minecraft.network.protocol.game.ClientboundOpenBookPacket; import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket; +import net.minecraft.network.protocol.game.ClientboundOpenSignEditorPacket; import net.minecraft.network.protocol.game.ClientboundPlaceGhostRecipePacket; import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket; import net.minecraft.network.protocol.game.ClientboundPlayerChatPacket; import net.minecraft.network.protocol.game.ClientboundPlayerCombatEndPacket; import net.minecraft.network.protocol.game.ClientboundPlayerCombatEnterPacket; +import net.minecraft.network.protocol.game.ClientboundPlayerCombatKillPacket; +import net.minecraft.network.protocol.game.ClientboundPlayerInfoRemovePacket; +import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket; +import net.minecraft.network.protocol.game.ClientboundPlayerLookAtPacket; import net.minecraft.network.protocol.game.ClientboundPlayerPositionPacket; import net.minecraft.network.protocol.game.ClientboundPlayerRotationPacket; +import net.minecraft.network.protocol.game.ClientboundProjectilePowerPacket; import net.minecraft.network.protocol.game.ClientboundRecipeBookAddPacket; import net.minecraft.network.protocol.game.ClientboundRecipeBookRemovePacket; import net.minecraft.network.protocol.game.ClientboundRecipeBookSettingsPacket; +import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; +import net.minecraft.network.protocol.game.ClientboundRemoveMobEffectPacket; import net.minecraft.network.protocol.game.ClientboundResetScorePacket; import net.minecraft.network.protocol.game.ClientboundRespawnPacket; +import net.minecraft.network.protocol.game.ClientboundRotateHeadPacket; import net.minecraft.network.protocol.game.ClientboundSectionBlocksUpdatePacket; import net.minecraft.network.protocol.game.ClientboundSelectAdvancementsTabPacket; import net.minecraft.network.protocol.game.ClientboundSetActionBarTextPacket; @@ -86,29 +116,45 @@ import net.minecraft.network.protocol.game.ClientboundSetBorderLerpSizePacket; import net.minecraft.network.protocol.game.ClientboundSetBorderSizePacket; import net.minecraft.network.protocol.game.ClientboundSetBorderWarningDelayPacket; import net.minecraft.network.protocol.game.ClientboundSetBorderWarningDistancePacket; +import net.minecraft.network.protocol.game.ClientboundSetCameraPacket; import net.minecraft.network.protocol.game.ClientboundSetChunkCacheCenterPacket; import net.minecraft.network.protocol.game.ClientboundSetChunkCacheRadiusPacket; import net.minecraft.network.protocol.game.ClientboundSetCursorItemPacket; import net.minecraft.network.protocol.game.ClientboundServerDataPacket; import net.minecraft.network.protocol.game.ClientboundSetDefaultSpawnPositionPacket; import net.minecraft.network.protocol.game.ClientboundSetDisplayObjectivePacket; +import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; +import net.minecraft.network.protocol.game.ClientboundSetEntityLinkPacket; +import net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket; +import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket; import net.minecraft.network.protocol.game.ClientboundSetExperiencePacket; import net.minecraft.network.protocol.game.ClientboundSetHeldSlotPacket; import net.minecraft.network.protocol.game.ClientboundSetHealthPacket; import net.minecraft.network.protocol.game.ClientboundSetObjectivePacket; +import net.minecraft.network.protocol.game.ClientboundSetPassengersPacket; import net.minecraft.network.protocol.game.ClientboundSetPlayerInventoryPacket; +import net.minecraft.network.protocol.game.ClientboundSetPlayerTeamPacket; import net.minecraft.network.protocol.game.ClientboundSetScorePacket; import net.minecraft.network.protocol.game.ClientboundSetSimulationDistancePacket; import net.minecraft.network.protocol.game.ClientboundSetSubtitleTextPacket; import net.minecraft.network.protocol.game.ClientboundSetTimePacket; import net.minecraft.network.protocol.game.ClientboundSetTitleTextPacket; import net.minecraft.network.protocol.game.ClientboundSetTitlesAnimationPacket; +import net.minecraft.network.protocol.game.ClientboundSoundEntityPacket; +import net.minecraft.network.protocol.game.ClientboundSoundPacket; import net.minecraft.network.protocol.game.ClientboundStartConfigurationPacket; +import net.minecraft.network.protocol.game.ClientboundStopSoundPacket; import net.minecraft.network.protocol.game.ClientboundSystemChatPacket; import net.minecraft.network.protocol.game.ClientboundTabListPacket; +import net.minecraft.network.protocol.game.ClientboundTagQueryPacket; +import net.minecraft.network.protocol.game.ClientboundTakeItemEntityPacket; +import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; import net.minecraft.network.protocol.game.ClientboundTickingStatePacket; import net.minecraft.network.protocol.game.ClientboundTickingStepPacket; +import net.minecraft.network.protocol.game.ClientboundTrackedWaypointPacket; import net.minecraft.network.protocol.game.ClientboundUpdateAdvancementsPacket; +import net.minecraft.network.protocol.game.ClientboundUpdateAttributesPacket; +import net.minecraft.network.protocol.game.ClientboundUpdateMobEffectPacket; import net.minecraft.network.protocol.game.ClientboundUpdateRecipesPacket; import net.minecraft.network.protocol.login.ClientboundCustomQueryPacket; import net.minecraft.network.protocol.login.ClientboundHelloPacket; @@ -243,32 +289,134 @@ public class TechHider { )); BiFunction, Packet> tossPacket = (p, packet) -> null; + Map>, BiFunction, Packet>> processors = new HashMap<>(); - this.packetProcessors = Map.of( - 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, - (p, packet) -> processSectionUpdate(p, (ClientboundSectionBlocksUpdatePacket) packet), - ClientboundLevelChunkWithLightPacket.class, - (p, packet) -> processChunkWithLight(p, (ClientboundLevelChunkWithLightPacket) packet) - ); + // 7.1.x Bundle Packet: packet container; blocked until nested packets are safely unbundled/processed. + processors.put(ClientboundBundlePacket.class, tossPacket); + + // 7.1.2 Spawn Entity: entity type and position can reveal hidden contraptions. + processors.put(ClientboundAddEntityPacket.class, tossPacket); + // 7.1.3 Entity Animation: entity id based signal, keep blocked until entity visibility is modeled. + processors.put(ClientboundAnimatePacket.class, tossPacket); + // 7.1.5 Acknowledge Block Change: block interaction side channel; blocked pending review. + processors.put(ClientboundBlockChangedAckPacket.class, tossPacket); + // 7.1.6 Set Block Destroy Stage: block position and mining progress can reveal activity. + processors.put(ClientboundBlockDestructionPacket.class, tossPacket); + // 7.1.7 Block Entity Data: currently filtered by block position and allowed tile-entity actions. + processors.put(ClientboundBlockEntityDataPacket.class, (p, packet) -> processBlockEntityDataPacket(p, (ClientboundBlockEntityDataPacket) packet)); + // 7.1.8 Block Action: currently filtered by block position. + processors.put(ClientboundBlockEventPacket.class, (p, packet) -> processBlockEventPacket(p, (ClientboundBlockEventPacket) packet)); + // 7.1.9 Block Update: currently filtered/obfuscated by block position and block id. + processors.put(ClientboundBlockUpdatePacket.class, (p, packet) -> processBlockUpdatePacket(p, (ClientboundBlockUpdatePacket) packet)); + // 7.1.14 Chunk Biomes: chunk/world data side channel. + processors.put(ClientboundChunksBiomesPacket.class, tossPacket); + // 7.1.26 Damage Event: entity ids and damage source location can leak hidden activity. + processors.put(ClientboundDamageEventPacket.class, tossPacket); + // 7.1.31 Debug Sample: debug telemetry; blocked by default. + processors.put(ClientboundDebugSamplePacket.class, tossPacket); + // 7.1.35 Entity Event: entity id based signal. + processors.put(ClientboundEntityEventPacket.class, tossPacket); + // 7.1.36 Teleport Entity: entity id and absolute position. + processors.put(ClientboundTeleportEntityPacket.class, tossPacket); + // 7.1.37 Explosion: position, affected blocks, and knockback can reveal TNT/tech. + processors.put(ClientboundExplodePacket.class, tossPacket); + // 7.1.38 Unload Chunk: chunk visibility side channel. + processors.put(ClientboundForgetLevelChunkPacket.class, tossPacket); + // 7.1.41 Open Horse Screen: entity id based container. + processors.put(ClientboundHorseScreenOpenPacket.class, tossPacket); + // 7.1.42 Hurt Animation: entity id based signal. + processors.put(ClientboundHurtAnimationPacket.class, tossPacket); + // 7.1.45 Chunk Data and Update Light: currently filtered/obfuscated by chunk data processor. + processors.put(ClientboundLevelChunkWithLightPacket.class, (p, packet) -> processChunkWithLight(p, (ClientboundLevelChunkWithLightPacket) packet)); + // 7.1.46 World Event: block position/event id can leak activity. + processors.put(ClientboundLevelEventPacket.class, tossPacket); + // 7.1.47 Particle: particle type and position can reveal hidden machinery. + processors.put(ClientboundLevelParticlesPacket.class, tossPacket); + // 7.1.48 Update Light: lighting can reveal hidden blocks/operations. + processors.put(ClientboundLightUpdatePacket.class, tossPacket); + // 7.1.50 Map Data: map pixels/icons can reveal player/world state. + processors.put(ClientboundMapItemDataPacket.class, tossPacket); + // 7.1.52/53/55 Update Entity Position/Rotation: entity id and movement signal. + processors.put(ClientboundMoveEntityPacket.class, tossPacket); + processors.put(Pos.class, tossPacket); + processors.put(PosRot.class, tossPacket); + processors.put(Rot.class, tossPacket); + // 7.1.54 Move Minecart Along Track: entity path and position signal. + processors.put(ClientboundMoveMinecartPacket.class, tossPacket); + // 7.1.56 Move Vehicle (clientbound): vehicle position signal. + processors.put(ClientboundMoveVehiclePacket.class, tossPacket); + // 7.1.59 Open Sign Editor: block position. + processors.put(ClientboundOpenSignEditorPacket.class, tossPacket); + // 7.1.67 Combat Death: entity/player ids and death message context. + processors.put(ClientboundPlayerCombatKillPacket.class, tossPacket); + // 7.1.68 Player Info Remove: other-player identity/state. + processors.put(ClientboundPlayerInfoRemovePacket.class, tossPacket); + // 7.1.69 Player Info Update: other-player identity/state. + processors.put(ClientboundPlayerInfoUpdatePacket.class, tossPacket); + // 7.1.70 Look At: target position/entity. + processors.put(ClientboundPlayerLookAtPacket.class, tossPacket); + // 7.1.76 Remove Entities: entity id visibility side channel. + processors.put(ClientboundRemoveEntitiesPacket.class, tossPacket); + // 7.1.77 Remove Entity Effect: entity id and effect state. + processors.put(ClientboundRemoveMobEffectPacket.class, tossPacket); + // 7.1.82 Set Head Rotation: entity id and rotation. + processors.put(ClientboundRotateHeadPacket.class, tossPacket); + // 7.1.83 Update Section Blocks: currently filtered/obfuscated by section block processor. + processors.put(ClientboundSectionBlocksUpdatePacket.class, (p, packet) -> processSectionUpdate(p, (ClientboundSectionBlocksUpdatePacket) packet)); + // 7.1.92 Set Camera: entity id. + processors.put(ClientboundSetCameraPacket.class, tossPacket); + // 7.1.98 Set Entity Metadata: entity state can reveal blocks/items/displays. + processors.put(ClientboundSetEntityDataPacket.class, tossPacket); + // 7.1.99 Link Entities: entity relationship signal. + processors.put(ClientboundSetEntityLinkPacket.class, tossPacket); + // 7.1.100 Set Entity Velocity: entity id and movement. + processors.put(ClientboundSetEntityMotionPacket.class, tossPacket); + // 7.1.101 Set Equipment: entity equipment can reveal wargear. + processors.put(ClientboundSetEquipmentPacket.class, tossPacket); + // 7.1.106 Set Passengers: entity relationship signal. + processors.put(ClientboundSetPassengersPacket.class, tossPacket); + // 7.1.108 Update Teams: player/team membership can be used as intel. + processors.put(ClientboundSetPlayerTeamPacket.class, tossPacket); + // 7.1.115 Entity Sound Effect: entity id and sound. + processors.put(ClientboundSoundEntityPacket.class, tossPacket); + // 7.1.116 Sound Effect: sound type and position. + processors.put(ClientboundSoundPacket.class, tossPacket); + // 7.1.118 Stop Sound: sound state side channel. + processors.put(ClientboundStopSoundPacket.class, tossPacket); + // 7.1.122 Tag Query Response: block-entity query result. + processors.put(ClientboundTagQueryPacket.class, tossPacket); + // 7.1.123 Pickup Item: item/entity ids and pickup activity. + processors.put(ClientboundTakeItemEntityPacket.class, tossPacket); + // 7.1.124 Synchronize Vehicle Position: entity/vehicle position. + processors.put(ClientboundEntityPositionSyncPacket.class, tossPacket); + // 7.1.130 Update Attributes: entity id and attribute state. + processors.put(ClientboundUpdateAttributesPacket.class, tossPacket); + // 7.1.131 Entity Effect: entity id and effect state. + processors.put(ClientboundUpdateMobEffectPacket.class, tossPacket); + // 7.1.133 Update Tags (play): registry/tag data can be added back after review. + processors.put(ClientboundUpdateTagsPacket.class, tossPacket); + // 7.1.134 Projectile Power: projectile/entity signal. + processors.put(ClientboundProjectilePowerPacket.class, tossPacket); + // 7.1.137 Waypoint: world/entity tracking signal. + processors.put(ClientboundTrackedWaypointPacket.class, tossPacket); + + this.packetProcessors = processors; this.interceptor = new TinyProtocol(plugin) { @Override public Object onPacketOutAsync(Player receiver, Channel channel, Object packet) { - if (bypassingPackets.stream().anyMatch(clazz -> clazz.isInstance(packet))) { - return packet; - } else if (packetProcessors.containsKey(packet.getClass())) { - return packetProcessors.get(packet.getClass()).apply(receiver, (Packet) packet); - } else { + try { + if (bypassingPackets.contains(packet.getClass())) { + return packet; + } + + BiFunction, Packet> processor = packetProcessors.get(packet.getClass()); + return processor == null ? null : processor.apply(receiver, (Packet) packet); + } catch(Error e) { + // Errors during packet processing leeding to packet being tossed + e.printStackTrace(); return null; } - - } }; }