From 0369edcc39c72f2fe2f8efe8487ee1c1c1ce320d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maurice=20Eisenbl=C3=A4tter?= Date: Tue, 8 Mar 2022 22:13:11 +0100 Subject: [PATCH] feat: deobfuscate block on block fall event --- .../orebfuscator/nms/AbstractNmsManager.java | 13 +++++++++--- .../imprex/orebfuscator/nms/NmsManager.java | 2 ++ .../orebfuscator/nms/v1_10_R1/NmsManager.java | 3 ++- .../orebfuscator/nms/v1_11_R1/NmsManager.java | 3 ++- .../orebfuscator/nms/v1_12_R1/NmsManager.java | 3 ++- .../orebfuscator/nms/v1_13_R1/NmsManager.java | 4 +++- .../orebfuscator/nms/v1_13_R2/NmsManager.java | 4 +++- .../orebfuscator/nms/v1_14_R1/NmsManager.java | 4 +++- .../orebfuscator/nms/v1_15_R1/NmsManager.java | 4 +++- .../orebfuscator/nms/v1_16_R1/NmsManager.java | 4 +++- .../orebfuscator/nms/v1_16_R2/NmsManager.java | 4 +++- .../orebfuscator/nms/v1_16_R3/NmsManager.java | 4 +++- .../orebfuscator/nms/v1_17_R1/NmsManager.java | 4 +++- .../orebfuscator/nms/v1_18_R1/NmsManager.java | 4 +++- .../orebfuscator/nms/v1_18_R2/NmsManager.java | 4 +++- .../orebfuscator/nms/v1_9_R2/NmsManager.java | 3 ++- .../net/imprex/orebfuscator/NmsInstance.java | 4 ++++ .../obfuscation/DeobfuscationListener.java | 21 +++++++++++++++++++ 18 files changed, 75 insertions(+), 17 deletions(-) diff --git a/orebfuscator-nms/orebfuscator-nms-api/src/main/java/net/imprex/orebfuscator/nms/AbstractNmsManager.java b/orebfuscator-nms/orebfuscator-nms-api/src/main/java/net/imprex/orebfuscator/nms/AbstractNmsManager.java index f95cc7ea..c8c99c94 100644 --- a/orebfuscator-nms/orebfuscator-nms-api/src/main/java/net/imprex/orebfuscator/nms/AbstractNmsManager.java +++ b/orebfuscator-nms/orebfuscator-nms-api/src/main/java/net/imprex/orebfuscator/nms/AbstractNmsManager.java @@ -15,7 +15,8 @@ public abstract class AbstractNmsManager implements NmsManager { private static final byte FLAG_AIR = 1; private static final byte FLAG_OCCLUDING = 2; - private static final byte FLAG_TILE_ENTITY = 4; + private static final byte FLAG_FALLABLE = 4; + private static final byte FLAG_TILE_ENTITY = 8; private final AbstractRegionFileCache regionFileCache; private final Map> materialToIds = new HashMap<>(); @@ -31,10 +32,11 @@ protected final void registerMaterialId(Material material, int id) { this.materialToIds.computeIfAbsent(material, key -> new HashSet<>()).add(id); } - protected final void setBlockFlags(int blockId, boolean isAir, boolean canOcclude, boolean isTileEntity) { + protected final void setBlockFlags(int blockId, boolean isAir, boolean canOcclude, boolean canFall, boolean isTileEntity) { byte flags = this.blockFlags[blockId]; flags |= isAir ? FLAG_AIR : 0; flags |= canOcclude ? FLAG_OCCLUDING : 0; + flags |= canFall ? FLAG_FALLABLE : 0; flags |= isTileEntity ? FLAG_TILE_ENTITY : 0; this.blockFlags[blockId] = flags; } @@ -46,7 +48,7 @@ public final AbstractRegionFileCache getRegionFileCache() { @Override public final Set getBlockIds(Material material) { - return Collections.unmodifiableSet(this.materialToIds.get(material)); + return Collections.unmodifiableSet(this.materialToIds.getOrDefault(material, Collections.emptySet())); } @Override @@ -59,6 +61,11 @@ public final boolean isOccluding(int blockId) { return (this.blockFlags[blockId] & FLAG_OCCLUDING) != 0; } + @Override + public boolean isFallable(int blockId) { + return (this.blockFlags[blockId] & FLAG_FALLABLE) != 0; + } + @Override public final boolean isBlockEntity(int blockId) { return (this.blockFlags[blockId] & FLAG_TILE_ENTITY) != 0; diff --git a/orebfuscator-nms/orebfuscator-nms-api/src/main/java/net/imprex/orebfuscator/nms/NmsManager.java b/orebfuscator-nms/orebfuscator-nms-api/src/main/java/net/imprex/orebfuscator/nms/NmsManager.java index ed5adae9..d6a2b3c7 100644 --- a/orebfuscator-nms/orebfuscator-nms-api/src/main/java/net/imprex/orebfuscator/nms/NmsManager.java +++ b/orebfuscator-nms/orebfuscator-nms-api/src/main/java/net/imprex/orebfuscator/nms/NmsManager.java @@ -27,6 +27,8 @@ public interface NmsManager { boolean isOccluding(int blockId); + boolean isFallable(int blockId); + boolean isBlockEntity(int blockId); ReadOnlyChunk getReadOnlyChunk(World world, int chunkX, int chunkZ); diff --git a/orebfuscator-nms/orebfuscator-nms-v1_10_R1/src/main/java/net/imprex/orebfuscator/nms/v1_10_R1/NmsManager.java b/orebfuscator-nms/orebfuscator-nms-v1_10_R1/src/main/java/net/imprex/orebfuscator/nms/v1_10_R1/NmsManager.java index 89c4d1d6..9f9006af 100644 --- a/orebfuscator-nms/orebfuscator-nms-v1_10_R1/src/main/java/net/imprex/orebfuscator/nms/v1_10_R1/NmsManager.java +++ b/orebfuscator-nms/orebfuscator-nms-v1_10_R1/src/main/java/net/imprex/orebfuscator/nms/v1_10_R1/NmsManager.java @@ -18,6 +18,7 @@ import net.imprex.orebfuscator.nms.ReadOnlyChunk; import net.minecraft.server.v1_10_R1.Block; import net.minecraft.server.v1_10_R1.BlockAir; +import net.minecraft.server.v1_10_R1.BlockFalling; import net.minecraft.server.v1_10_R1.BlockPosition; import net.minecraft.server.v1_10_R1.Chunk; import net.minecraft.server.v1_10_R1.ChunkProviderServer; @@ -73,7 +74,7 @@ public NmsManager(Config config) { int blockId = getBlockId(blockData); this.registerMaterialId(material, blockId); Block block = blockData.getBlock(); - this.setBlockFlags(blockId, block instanceof BlockAir, material.isOccluding(), block.isTileEntity()); + this.setBlockFlags(blockId, block instanceof BlockAir, material.isOccluding(), block instanceof BlockFalling, block.isTileEntity()); } } diff --git a/orebfuscator-nms/orebfuscator-nms-v1_11_R1/src/main/java/net/imprex/orebfuscator/nms/v1_11_R1/NmsManager.java b/orebfuscator-nms/orebfuscator-nms-v1_11_R1/src/main/java/net/imprex/orebfuscator/nms/v1_11_R1/NmsManager.java index 4b389d36..0d9f1fd8 100644 --- a/orebfuscator-nms/orebfuscator-nms-v1_11_R1/src/main/java/net/imprex/orebfuscator/nms/v1_11_R1/NmsManager.java +++ b/orebfuscator-nms/orebfuscator-nms-v1_11_R1/src/main/java/net/imprex/orebfuscator/nms/v1_11_R1/NmsManager.java @@ -18,6 +18,7 @@ import net.imprex.orebfuscator.nms.ReadOnlyChunk; import net.minecraft.server.v1_11_R1.Block; import net.minecraft.server.v1_11_R1.BlockAir; +import net.minecraft.server.v1_11_R1.BlockFalling; import net.minecraft.server.v1_11_R1.BlockPosition; import net.minecraft.server.v1_11_R1.Chunk; import net.minecraft.server.v1_11_R1.ChunkProviderServer; @@ -73,7 +74,7 @@ public NmsManager(Config config) { int blockId = getBlockId(blockData); this.registerMaterialId(material, blockId); Block block = blockData.getBlock(); - this.setBlockFlags(blockId, block instanceof BlockAir, material.isOccluding(), block.isTileEntity()); + this.setBlockFlags(blockId, block instanceof BlockAir, material.isOccluding(), block instanceof BlockFalling, block.isTileEntity()); } } diff --git a/orebfuscator-nms/orebfuscator-nms-v1_12_R1/src/main/java/net/imprex/orebfuscator/nms/v1_12_R1/NmsManager.java b/orebfuscator-nms/orebfuscator-nms-v1_12_R1/src/main/java/net/imprex/orebfuscator/nms/v1_12_R1/NmsManager.java index 1606e0bd..3da7f8b5 100644 --- a/orebfuscator-nms/orebfuscator-nms-v1_12_R1/src/main/java/net/imprex/orebfuscator/nms/v1_12_R1/NmsManager.java +++ b/orebfuscator-nms/orebfuscator-nms-v1_12_R1/src/main/java/net/imprex/orebfuscator/nms/v1_12_R1/NmsManager.java @@ -18,6 +18,7 @@ import net.imprex.orebfuscator.nms.ReadOnlyChunk; import net.minecraft.server.v1_12_R1.Block; import net.minecraft.server.v1_12_R1.BlockAir; +import net.minecraft.server.v1_12_R1.BlockFalling; import net.minecraft.server.v1_12_R1.BlockPosition; import net.minecraft.server.v1_12_R1.Chunk; import net.minecraft.server.v1_12_R1.ChunkProviderServer; @@ -73,7 +74,7 @@ public NmsManager(Config config) { int blockId = getBlockId(blockData); this.registerMaterialId(material, blockId); Block block = blockData.getBlock(); - this.setBlockFlags(blockId, block instanceof BlockAir, material.isOccluding(), block.isTileEntity()); + this.setBlockFlags(blockId, block instanceof BlockAir, material.isOccluding(), block instanceof BlockFalling, block.isTileEntity()); } } diff --git a/orebfuscator-nms/orebfuscator-nms-v1_13_R1/src/main/java/net/imprex/orebfuscator/nms/v1_13_R1/NmsManager.java b/orebfuscator-nms/orebfuscator-nms-v1_13_R1/src/main/java/net/imprex/orebfuscator/nms/v1_13_R1/NmsManager.java index 574e01c1..e98d1f4f 100644 --- a/orebfuscator-nms/orebfuscator-nms-v1_13_R1/src/main/java/net/imprex/orebfuscator/nms/v1_13_R1/NmsManager.java +++ b/orebfuscator-nms/orebfuscator-nms-v1_13_R1/src/main/java/net/imprex/orebfuscator/nms/v1_13_R1/NmsManager.java @@ -18,6 +18,7 @@ import net.imprex.orebfuscator.nms.AbstractRegionFileCache; import net.imprex.orebfuscator.nms.ReadOnlyChunk; import net.minecraft.server.v1_13_R1.Block; +import net.minecraft.server.v1_13_R1.BlockFalling; import net.minecraft.server.v1_13_R1.BlockPosition; import net.minecraft.server.v1_13_R1.Chunk; import net.minecraft.server.v1_13_R1.ChunkProviderServer; @@ -71,8 +72,9 @@ public NmsManager(Config config) { IBlockData blockData = iterator.next(); Material material = CraftBlockData.fromData(blockData).getMaterial(); int blockId = getBlockId(blockData); + Block block = blockData.getBlock(); this.registerMaterialId(material, blockId); - this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), blockData.getBlock().isTileEntity()); + this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), block instanceof BlockFalling, blockData.getBlock().isTileEntity()); } } diff --git a/orebfuscator-nms/orebfuscator-nms-v1_13_R2/src/main/java/net/imprex/orebfuscator/nms/v1_13_R2/NmsManager.java b/orebfuscator-nms/orebfuscator-nms-v1_13_R2/src/main/java/net/imprex/orebfuscator/nms/v1_13_R2/NmsManager.java index 107c8b0e..e03230db 100644 --- a/orebfuscator-nms/orebfuscator-nms-v1_13_R2/src/main/java/net/imprex/orebfuscator/nms/v1_13_R2/NmsManager.java +++ b/orebfuscator-nms/orebfuscator-nms-v1_13_R2/src/main/java/net/imprex/orebfuscator/nms/v1_13_R2/NmsManager.java @@ -18,6 +18,7 @@ import net.imprex.orebfuscator.nms.AbstractRegionFileCache; import net.imprex.orebfuscator.nms.ReadOnlyChunk; import net.minecraft.server.v1_13_R2.Block; +import net.minecraft.server.v1_13_R2.BlockFalling; import net.minecraft.server.v1_13_R2.BlockPosition; import net.minecraft.server.v1_13_R2.Chunk; import net.minecraft.server.v1_13_R2.ChunkProviderServer; @@ -72,8 +73,9 @@ public NmsManager(Config config) { IBlockData blockData = iterator.next(); Material material = CraftBlockData.fromData(blockData).getMaterial(); int blockId = getBlockId(blockData); + Block block = blockData.getBlock(); this.registerMaterialId(material, blockId); - this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), blockData.getBlock().isTileEntity()); + this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), block instanceof BlockFalling, blockData.getBlock().isTileEntity()); } } diff --git a/orebfuscator-nms/orebfuscator-nms-v1_14_R1/src/main/java/net/imprex/orebfuscator/nms/v1_14_R1/NmsManager.java b/orebfuscator-nms/orebfuscator-nms-v1_14_R1/src/main/java/net/imprex/orebfuscator/nms/v1_14_R1/NmsManager.java index a72991e0..2d923e65 100644 --- a/orebfuscator-nms/orebfuscator-nms-v1_14_R1/src/main/java/net/imprex/orebfuscator/nms/v1_14_R1/NmsManager.java +++ b/orebfuscator-nms/orebfuscator-nms-v1_14_R1/src/main/java/net/imprex/orebfuscator/nms/v1_14_R1/NmsManager.java @@ -17,6 +17,7 @@ import net.imprex.orebfuscator.nms.AbstractRegionFileCache; import net.imprex.orebfuscator.nms.ReadOnlyChunk; import net.minecraft.server.v1_14_R1.Block; +import net.minecraft.server.v1_14_R1.BlockFalling; import net.minecraft.server.v1_14_R1.BlockPosition; import net.minecraft.server.v1_14_R1.Chunk; import net.minecraft.server.v1_14_R1.ChunkProviderServer; @@ -70,8 +71,9 @@ public NmsManager(Config config) { for (IBlockData blockData : Block.REGISTRY_ID) { Material material = CraftBlockData.fromData(blockData).getMaterial(); int blockId = getBlockId(blockData); + Block block = blockData.getBlock(); this.registerMaterialId(material, blockId); - this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), blockData.getBlock().isTileEntity()); + this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), block instanceof BlockFalling, blockData.getBlock().isTileEntity()); } } diff --git a/orebfuscator-nms/orebfuscator-nms-v1_15_R1/src/main/java/net/imprex/orebfuscator/nms/v1_15_R1/NmsManager.java b/orebfuscator-nms/orebfuscator-nms-v1_15_R1/src/main/java/net/imprex/orebfuscator/nms/v1_15_R1/NmsManager.java index c4a2128d..f053bd91 100644 --- a/orebfuscator-nms/orebfuscator-nms-v1_15_R1/src/main/java/net/imprex/orebfuscator/nms/v1_15_R1/NmsManager.java +++ b/orebfuscator-nms/orebfuscator-nms-v1_15_R1/src/main/java/net/imprex/orebfuscator/nms/v1_15_R1/NmsManager.java @@ -17,6 +17,7 @@ import net.imprex.orebfuscator.nms.AbstractRegionFileCache; import net.imprex.orebfuscator.nms.ReadOnlyChunk; import net.minecraft.server.v1_15_R1.Block; +import net.minecraft.server.v1_15_R1.BlockFalling; import net.minecraft.server.v1_15_R1.BlockPosition; import net.minecraft.server.v1_15_R1.Chunk; import net.minecraft.server.v1_15_R1.ChunkProviderServer; @@ -70,8 +71,9 @@ public NmsManager(Config config) { for (IBlockData blockData : Block.REGISTRY_ID) { Material material = CraftBlockData.fromData(blockData).getMaterial(); int blockId = getBlockId(blockData); + Block block = blockData.getBlock(); this.registerMaterialId(material, blockId); - this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), blockData.getBlock().isTileEntity()); + this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), block instanceof BlockFalling, blockData.getBlock().isTileEntity()); } } diff --git a/orebfuscator-nms/orebfuscator-nms-v1_16_R1/src/main/java/net/imprex/orebfuscator/nms/v1_16_R1/NmsManager.java b/orebfuscator-nms/orebfuscator-nms-v1_16_R1/src/main/java/net/imprex/orebfuscator/nms/v1_16_R1/NmsManager.java index 6420d616..8f77e858 100644 --- a/orebfuscator-nms/orebfuscator-nms-v1_16_R1/src/main/java/net/imprex/orebfuscator/nms/v1_16_R1/NmsManager.java +++ b/orebfuscator-nms/orebfuscator-nms-v1_16_R1/src/main/java/net/imprex/orebfuscator/nms/v1_16_R1/NmsManager.java @@ -17,6 +17,7 @@ import net.imprex.orebfuscator.nms.AbstractRegionFileCache; import net.imprex.orebfuscator.nms.ReadOnlyChunk; import net.minecraft.server.v1_16_R1.Block; +import net.minecraft.server.v1_16_R1.BlockFalling; import net.minecraft.server.v1_16_R1.BlockPosition; import net.minecraft.server.v1_16_R1.Chunk; import net.minecraft.server.v1_16_R1.ChunkProviderServer; @@ -70,8 +71,9 @@ public NmsManager(Config config) { for (IBlockData blockData : Block.REGISTRY_ID) { Material material = CraftBlockData.fromData(blockData).getMaterial(); int blockId = getBlockId(blockData); + Block block = blockData.getBlock(); this.registerMaterialId(material, blockId); - this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), blockData.getBlock().isTileEntity()); + this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), block instanceof BlockFalling, blockData.getBlock().isTileEntity()); } } diff --git a/orebfuscator-nms/orebfuscator-nms-v1_16_R2/src/main/java/net/imprex/orebfuscator/nms/v1_16_R2/NmsManager.java b/orebfuscator-nms/orebfuscator-nms-v1_16_R2/src/main/java/net/imprex/orebfuscator/nms/v1_16_R2/NmsManager.java index 951d696e..349cdf46 100644 --- a/orebfuscator-nms/orebfuscator-nms-v1_16_R2/src/main/java/net/imprex/orebfuscator/nms/v1_16_R2/NmsManager.java +++ b/orebfuscator-nms/orebfuscator-nms-v1_16_R2/src/main/java/net/imprex/orebfuscator/nms/v1_16_R2/NmsManager.java @@ -17,6 +17,7 @@ import net.imprex.orebfuscator.nms.AbstractRegionFileCache; import net.imprex.orebfuscator.nms.ReadOnlyChunk; import net.minecraft.server.v1_16_R2.Block; +import net.minecraft.server.v1_16_R2.BlockFalling; import net.minecraft.server.v1_16_R2.BlockPosition; import net.minecraft.server.v1_16_R2.Chunk; import net.minecraft.server.v1_16_R2.ChunkProviderServer; @@ -70,8 +71,9 @@ public NmsManager(Config config) { for (IBlockData blockData : Block.REGISTRY_ID) { Material material = CraftBlockData.fromData(blockData).getMaterial(); int blockId = getBlockId(blockData); + Block block = blockData.getBlock(); this.registerMaterialId(material, blockId); - this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), blockData.getBlock().isTileEntity()); + this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), block instanceof BlockFalling, blockData.getBlock().isTileEntity()); } } diff --git a/orebfuscator-nms/orebfuscator-nms-v1_16_R3/src/main/java/net/imprex/orebfuscator/nms/v1_16_R3/NmsManager.java b/orebfuscator-nms/orebfuscator-nms-v1_16_R3/src/main/java/net/imprex/orebfuscator/nms/v1_16_R3/NmsManager.java index d1464d1e..fc40a13b 100644 --- a/orebfuscator-nms/orebfuscator-nms-v1_16_R3/src/main/java/net/imprex/orebfuscator/nms/v1_16_R3/NmsManager.java +++ b/orebfuscator-nms/orebfuscator-nms-v1_16_R3/src/main/java/net/imprex/orebfuscator/nms/v1_16_R3/NmsManager.java @@ -17,6 +17,7 @@ import net.imprex.orebfuscator.nms.AbstractRegionFileCache; import net.imprex.orebfuscator.nms.ReadOnlyChunk; import net.minecraft.server.v1_16_R3.Block; +import net.minecraft.server.v1_16_R3.BlockFalling; import net.minecraft.server.v1_16_R3.BlockPosition; import net.minecraft.server.v1_16_R3.Chunk; import net.minecraft.server.v1_16_R3.ChunkProviderServer; @@ -70,8 +71,9 @@ public NmsManager(Config config) { for (IBlockData blockData : Block.REGISTRY_ID) { Material material = CraftBlockData.fromData(blockData).getMaterial(); int blockId = getBlockId(blockData); + Block block = blockData.getBlock(); this.registerMaterialId(material, blockId); - this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), blockData.getBlock().isTileEntity()); + this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), block instanceof BlockFalling, blockData.getBlock().isTileEntity()); } } diff --git a/orebfuscator-nms/orebfuscator-nms-v1_17_R1/src/main/java/net/imprex/orebfuscator/nms/v1_17_R1/NmsManager.java b/orebfuscator-nms/orebfuscator-nms-v1_17_R1/src/main/java/net/imprex/orebfuscator/nms/v1_17_R1/NmsManager.java index 715ecc46..d34c297d 100644 --- a/orebfuscator-nms/orebfuscator-nms-v1_17_R1/src/main/java/net/imprex/orebfuscator/nms/v1_17_R1/NmsManager.java +++ b/orebfuscator-nms/orebfuscator-nms-v1_17_R1/src/main/java/net/imprex/orebfuscator/nms/v1_17_R1/NmsManager.java @@ -25,6 +25,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Mth; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Fallable; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.LevelChunk; @@ -70,8 +71,9 @@ public NmsManager(Config config) { for (BlockState blockData : Block.BLOCK_STATE_REGISTRY) { Material material = CraftBlockData.fromData(blockData).getMaterial(); int blockId = getBlockId(blockData); + Block block = blockData.getBlock(); this.registerMaterialId(material, blockId); - this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), blockData.hasBlockEntity()); + this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), block instanceof Fallable, blockData.hasBlockEntity()); } } diff --git a/orebfuscator-nms/orebfuscator-nms-v1_18_R1/src/main/java/net/imprex/orebfuscator/nms/v1_18_R1/NmsManager.java b/orebfuscator-nms/orebfuscator-nms-v1_18_R1/src/main/java/net/imprex/orebfuscator/nms/v1_18_R1/NmsManager.java index e573c8c2..c6bdea44 100644 --- a/orebfuscator-nms/orebfuscator-nms-v1_18_R1/src/main/java/net/imprex/orebfuscator/nms/v1_18_R1/NmsManager.java +++ b/orebfuscator-nms/orebfuscator-nms-v1_18_R1/src/main/java/net/imprex/orebfuscator/nms/v1_18_R1/NmsManager.java @@ -25,6 +25,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Mth; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Fallable; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.LevelChunk; @@ -70,8 +71,9 @@ public NmsManager(Config config) { for (BlockState blockData : Block.BLOCK_STATE_REGISTRY) { Material material = CraftBlockData.fromData(blockData).getMaterial(); int blockId = getBlockId(blockData); + Block block = blockData.getBlock(); this.registerMaterialId(material, blockId); - this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), blockData.hasBlockEntity()); + this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), block instanceof Fallable, blockData.hasBlockEntity()); } } diff --git a/orebfuscator-nms/orebfuscator-nms-v1_18_R2/src/main/java/net/imprex/orebfuscator/nms/v1_18_R2/NmsManager.java b/orebfuscator-nms/orebfuscator-nms-v1_18_R2/src/main/java/net/imprex/orebfuscator/nms/v1_18_R2/NmsManager.java index 8ddf1fa1..78a744d9 100644 --- a/orebfuscator-nms/orebfuscator-nms-v1_18_R2/src/main/java/net/imprex/orebfuscator/nms/v1_18_R2/NmsManager.java +++ b/orebfuscator-nms/orebfuscator-nms-v1_18_R2/src/main/java/net/imprex/orebfuscator/nms/v1_18_R2/NmsManager.java @@ -25,6 +25,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Mth; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Fallable; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.LevelChunk; @@ -70,8 +71,9 @@ public NmsManager(Config config) { for (BlockState blockData : Block.BLOCK_STATE_REGISTRY) { Material material = CraftBlockData.fromData(blockData).getMaterial(); int blockId = getBlockId(blockData); + Block block = blockData.getBlock(); this.registerMaterialId(material, blockId); - this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), blockData.hasBlockEntity()); + this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), block instanceof Fallable, blockData.hasBlockEntity()); } } diff --git a/orebfuscator-nms/orebfuscator-nms-v1_9_R2/src/main/java/net/imprex/orebfuscator/nms/v1_9_R2/NmsManager.java b/orebfuscator-nms/orebfuscator-nms-v1_9_R2/src/main/java/net/imprex/orebfuscator/nms/v1_9_R2/NmsManager.java index a45c4a85..f0b90c70 100644 --- a/orebfuscator-nms/orebfuscator-nms-v1_9_R2/src/main/java/net/imprex/orebfuscator/nms/v1_9_R2/NmsManager.java +++ b/orebfuscator-nms/orebfuscator-nms-v1_9_R2/src/main/java/net/imprex/orebfuscator/nms/v1_9_R2/NmsManager.java @@ -18,6 +18,7 @@ import net.imprex.orebfuscator.nms.ReadOnlyChunk; import net.minecraft.server.v1_9_R2.Block; import net.minecraft.server.v1_9_R2.BlockAir; +import net.minecraft.server.v1_9_R2.BlockFalling; import net.minecraft.server.v1_9_R2.BlockPosition; import net.minecraft.server.v1_9_R2.Chunk; import net.minecraft.server.v1_9_R2.ChunkProviderServer; @@ -73,7 +74,7 @@ public NmsManager(Config config) { int blockId = getBlockId(blockData); this.registerMaterialId(material, blockId); Block block = blockData.getBlock(); - this.setBlockFlags(blockId, block instanceof BlockAir, material.isOccluding(), block.isTileEntity()); + this.setBlockFlags(blockId, block instanceof BlockAir, material.isOccluding(), block instanceof BlockFalling, block.isTileEntity()); } } diff --git a/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/NmsInstance.java b/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/NmsInstance.java index 211d3934..c48970c8 100644 --- a/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/NmsInstance.java +++ b/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/NmsInstance.java @@ -86,6 +86,10 @@ public static boolean isOccluding(int blockId) { return instance.isOccluding(blockId); } + public static boolean isFallable(int blockId) { + return instance.isFallable(blockId); + } + public static boolean isBlockEntity(int blockId) { return instance.isBlockEntity(blockId); } diff --git a/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/obfuscation/DeobfuscationListener.java b/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/obfuscation/DeobfuscationListener.java index d424d9cd..427b3d61 100644 --- a/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/obfuscation/DeobfuscationListener.java +++ b/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/obfuscation/DeobfuscationListener.java @@ -1,6 +1,9 @@ package net.imprex.orebfuscator.obfuscation; +import java.util.BitSet; + import org.bukkit.Bukkit; +import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.Event.Result; import org.bukkit.event.EventHandler; @@ -10,6 +13,7 @@ import org.bukkit.event.block.BlockBurnEvent; import org.bukkit.event.block.BlockDamageEvent; import org.bukkit.event.block.BlockExplodeEvent; +import org.bukkit.event.block.BlockPhysicsEvent; import org.bukkit.event.block.BlockPistonExtendEvent; import org.bukkit.event.block.BlockPistonRetractEvent; import org.bukkit.event.entity.EntityChangeBlockEvent; @@ -35,10 +39,20 @@ public static void createAndRegister(Orebfuscator orebfuscator, DeobfuscationWor private final OrebfuscatorConfig config; private final DeobfuscationWorker deobfuscationWorker; + private final BitSet occludingFallable = new BitSet(); + private DeobfuscationListener(Orebfuscator orebfuscator, DeobfuscationWorker deobfuscationWorker) { this.updateSystem = orebfuscator.getUpdateSystem(); this.config = orebfuscator.getOrebfuscatorConfig(); this.deobfuscationWorker = deobfuscationWorker; + + for (Material material : Material.values()) { + for (int blockId : NmsInstance.getBlockIds(material)) { + if (NmsInstance.isFallable(blockId) && NmsInstance.isOccluding(blockId)) { + this.occludingFallable.set(material.ordinal()); + } + } + } } @EventHandler @@ -73,6 +87,13 @@ public void onBlockPistonRetract(BlockPistonRetractEvent event) { this.deobfuscationWorker.deobfuscate(event.getBlocks(), true); } + @EventHandler + public void onBlockPhysics(BlockPhysicsEvent event) { + if (this.occludingFallable.get(event.getBlock().getType().ordinal())) { + this.deobfuscationWorker.deobfuscate(event.getBlock()); + } + } + @EventHandler public void onEntityExplode(EntityExplodeEvent event) { this.deobfuscationWorker.deobfuscate(event.blockList(), true);