From 07368361e23743fb3a0c097200666360085f3f36 Mon Sep 17 00:00:00 2001 From: asofold Date: Mon, 20 Aug 2018 15:11:37 +0200 Subject: [PATCH] More smart block setup (first batch). * Initialize fully solid (in terms of shape + passable) blocks explicitly with full bounds and solid flags. * Use MaterialUtil#addBlocks and BridgeMaterial#getAllBlocks where appropriate. * MCAccessBukkit(Base): don't touch fully solid nor fully passable ones. --- .../compat/bukkit/BlockCacheBukkit.java | 13 ++ .../compat/bukkit/MCAccessBukkit.java | 32 +---- .../compat/bukkit/MCAccessBukkitBase.java | 36 ++++++ .../nocheatplus/compat/BridgeMaterial.java | 11 ++ .../blocks/init/vanilla/BlocksMC1_13.java | 2 +- .../nocheatplus/utilities/map/BlockFlags.java | 36 ++++++ .../utilities/map/BlockProperties.java | 13 ++ .../utilities/map/MaterialUtil.java | 120 ++++++++++++++---- .../test/TestPassableRayTracing.java | 4 +- 9 files changed, 210 insertions(+), 57 deletions(-) diff --git a/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/BlockCacheBukkit.java b/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/BlockCacheBukkit.java index f3b9091d..9ea59808 100644 --- a/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/BlockCacheBukkit.java +++ b/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/BlockCacheBukkit.java @@ -58,6 +58,19 @@ public class BlockCacheBukkit extends BlockCache { @Override public double[] fetchBounds(final int x, final int y, final int z){ // minX, minY, minZ, maxX, maxY, maxZ + + + /* + * TODO: Since whenever available: use bukkit methods to do the + * (somewhat) obvious shapes. Might introduce block models and for now + * trigger with flags (stairs, half_blocks), then get the precise shape + * via evaluating directional/whatnot. Reliably detect full blocks. + * Attempt to initialize more smart (don't override flags for anything + * known otherwise, ModelBlock with a + * directional/soandso-bukklit-interface based shape building with + * parameter(s).) + */ + // TODO: Want to maintain a list with manual entries or at least half / full blocks ? // Always return full bounds, needs extra adaption to BlockProperties (!). return new double[]{0D, 0D, 0D, 1D, 1D, 1D}; diff --git a/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/MCAccessBukkit.java b/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/MCAccessBukkit.java index 08b85e3b..df8b2b53 100644 --- a/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/MCAccessBukkit.java +++ b/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/MCAccessBukkit.java @@ -15,18 +15,11 @@ package fr.neatmonster.nocheatplus.compat.bukkit; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - import org.bukkit.Material; -import fr.neatmonster.nocheatplus.compat.BridgeMaterial; import fr.neatmonster.nocheatplus.compat.blocks.BlockPropertiesSetup; import fr.neatmonster.nocheatplus.config.WorldConfigProvider; import fr.neatmonster.nocheatplus.utilities.map.BlockProperties; -import fr.neatmonster.nocheatplus.utilities.map.MaterialUtil; public class MCAccessBukkit extends MCAccessBukkitBase implements BlockPropertiesSetup{ @@ -38,34 +31,10 @@ public class MCAccessBukkit extends MCAccessBukkitBase implements BlockPropertie public void setupBlockProperties(final WorldConfigProvider worldConfigProvider) { // Note deprecation suppression: These ids should be unique for a server run, that should be ok for setting up generic properties. // TODO: (?) Set some generic properties matching what BlockCache.getShape returns. - final Set fullBlocks = new HashSet(); - for (final Material mat : new Material[]{ - // TODO: Ice !? / Packed ice !? - Material.GLASS, Material.GLOWSTONE, Material.ICE, - BridgeMaterial.COMMAND_BLOCK, Material.BEACON, - BridgeMaterial.PISTON, - }) { - fullBlocks.add(mat); - } - @SuppressWarnings("unchecked") - final List> fullBlockSets = Arrays.asList( - // TODO: GLASS_TYPES, ICE_TYPES, - MaterialUtil.LEAVES, - BridgeMaterial.getAll( - "repeating_command_block", "chain_command_block" - )); - for (final Set set : fullBlockSets) { - for (final Material mat : set) { - fullBlocks.add(mat); - } - } for (final Material mat : Material.values()) { if (!mat.isBlock()) { continue; } - else if (fullBlocks.contains(mat)) { - continue; - } else if (guessItchyBlock(mat)) { // Uncertain bounding-box, allow passing through. long flags = BlockProperties.F_IGN_PASSABLE; @@ -80,6 +49,7 @@ public class MCAccessBukkit extends MCAccessBukkitBase implements BlockPropertie for (final Material mat : new Material[]{ Material.ENDER_PORTAL_FRAME, }) { + // TODO: Add BlockFlags.FULL_BOUNDS? final long flags = BlockProperties.F_IGN_PASSABLE | BlockProperties.F_GROUND_HEIGHT; BlockProperties.setBlockFlags(mat, BlockProperties.getBlockFlags(mat) | flags); } diff --git a/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/MCAccessBukkitBase.java b/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/MCAccessBukkitBase.java index b916929a..16eff0b8 100644 --- a/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/MCAccessBukkitBase.java +++ b/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/MCAccessBukkitBase.java @@ -34,6 +34,8 @@ import fr.neatmonster.nocheatplus.compat.MCAccess; import fr.neatmonster.nocheatplus.utilities.PotionUtil; import fr.neatmonster.nocheatplus.utilities.ReflectionUtil; import fr.neatmonster.nocheatplus.utilities.map.BlockCache; +import fr.neatmonster.nocheatplus.utilities.map.BlockFlags; +import fr.neatmonster.nocheatplus.utilities.map.BlockProperties; import fr.neatmonster.nocheatplus.utilities.map.MaterialUtil; public class MCAccessBukkitBase implements MCAccess { @@ -46,6 +48,40 @@ public class MCAccessBukkitBase implements MCAccess { } protected boolean guessItchyBlock(final Material mat) { + // General considerations first. + if (BlockProperties.isAir(mat) || BlockProperties.isLiquid(mat)) { + return false; + } + // Fully solid/ground blocks. + final long flags = BlockProperties.getBlockFlags(mat); + /* + * Skip fully passable blocks (partially passable blocks may be itchy, + * though slabs will be easy to handle). + */ + if (BlockFlags.hasAnyFlag(flags,BlockProperties.F_IGN_PASSABLE)) { + // TODO: Blocks with min_height may actually be ok, if xz100 and some height are set. + if (BlockFlags.hasNoFlags(flags, + BlockProperties.F_GROUND_HEIGHT + | BlockProperties.F_GROUND + | BlockProperties.F_SOLID)) { + // Explicitly passable. + return false; + } + else { + // Potentially itchy. + return true; + } + } + long testFlags = (BlockProperties.F_SOLID | BlockProperties.F_XZ100 + | BlockProperties.F_HEIGHT100); + if (BlockFlags.hasAllFlags(flags, testFlags)) { + // Fully solid block! + return false; + } + + // TODO: Directional stairs / slabs (wall heads, ...) + // TODO: Ground heads/skulls. + // TODO: Use working route. return guessItchyBlockPre1_13(mat); } diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/compat/BridgeMaterial.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/compat/BridgeMaterial.java index 0300181f..7a70d4d0 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/compat/BridgeMaterial.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/compat/BridgeMaterial.java @@ -143,6 +143,17 @@ public class BridgeMaterial { return res; } + public static Set getAllBlocks(String... names) { + final LinkedHashSet res = new LinkedHashSet(); + for (final String name : names) { + final Material mat = get(name); + if (mat != null && mat.isBlock()) { + res.add(mat); + } + } + return res; + } + public static boolean has(String name) { return all.containsKey(name.toLowerCase()); } diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/compat/blocks/init/vanilla/BlocksMC1_13.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/compat/blocks/init/vanilla/BlocksMC1_13.java index 0e360586..6315c5c2 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/compat/blocks/init/vanilla/BlocksMC1_13.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/compat/blocks/init/vanilla/BlocksMC1_13.java @@ -80,7 +80,7 @@ public class BlocksMC1_13 implements BlockPropertiesSetup { BlockInit.setInstantAir("WALL_TORCH"); // Stone types. - for (Material mat : BridgeMaterial.getAll("andesite", "diorite", "granite", + for (Material mat : BridgeMaterial.getAllBlocks("andesite", "diorite", "granite", "polished_andesite", "polished_diorite", "polished_granite", "smooth_stone")) { BlockInit.setAs(mat, Material.STONE); diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/map/BlockFlags.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/map/BlockFlags.java index 661acedf..eadda9eb 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/map/BlockFlags.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/map/BlockFlags.java @@ -25,6 +25,9 @@ import org.bukkit.Material; */ public class BlockFlags { + /** Explicitly set full bounds. */ + public static final long FULL_BOUNDS = BlockProperties.F_XZ100 | BlockProperties.F_HEIGHT100; + /** * Set flags of id same as already set with flags for the given material. * (Uses BlockProperties.) @@ -97,4 +100,37 @@ public class BlockFlags { BlockProperties.setBlockFlags(id, BlockProperties.getBlockFlags(id) & ~flags); } + /** + * Test if any flags within testFlags are contained. + * + * @param flags + * @param testFlags + * @return + */ + public static boolean hasAnyFlag(long flags, long testFlags) { + return (flags & testFlags) != 0L; + } + + /** + * Test if all flags within testFlags are contained. + * + * @param flags + * @param testFlags + * @return + */ + public static boolean hasAllFlags(long flags, long testFlags) { + return (flags & testFlags) == testFlags; + } + + /** + * Test if no flags within testFlags are contained. + * + * @param flags + * @param testFlags + * @return + */ + public static boolean hasNoFlags(long flags, long testFlags) { + return (flags & testFlags) == 0L; + } + } diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/map/BlockProperties.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/map/BlockProperties.java index 81c89efd..0c8678a3 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/map/BlockProperties.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/map/BlockProperties.java @@ -1550,6 +1550,19 @@ public class BlockProperties { // TODO: Model shears directly somehow (per-block list). } + // Fully solid blocks (shape / passable) - simplifies MCAccessBukkit setup, aim at 1.13+. + for (Material mat : MaterialUtil.FULLY_SOLID_BLOCKS) { + BlockFlags.addFlags(mat, + // Full bounds for sure. + BlockFlags.FULL_BOUNDS + /* + * Ensure solid is set (slight abuse/ambiguity + * with ground, and potential future use of + * Material#isSolid. + */ + | BlockProperties.F_SOLID); + } + } /** diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/map/MaterialUtil.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/map/MaterialUtil.java index d9e4a309..b57401eb 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/map/MaterialUtil.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/map/MaterialUtil.java @@ -66,6 +66,28 @@ public class MaterialUtil { return res; } + /** + * Get a new set containing the given set, as well as all non-null results + * from names. + * + * @param set + * @param names + * @return + */ + private static Set addBlocks(Set set, String... names) { + final LinkedHashSet res = new LinkedHashSet(set); + res.addAll(BridgeMaterial.getAllBlocks(names)); + return res; + } + + private static Set join(final Set...sets ) { + final Set res = new LinkedHashSet(); + for (final Set set : sets) { + res.addAll(set); + } + return res; + } + /** * Dump public static fields of type Set to StaticLog, using * StringUtil.join (not recursive). @@ -99,7 +121,7 @@ public class MaterialUtil { // (May not always have all aspects in common.) ///////////////////////////////////////////////// - public static final Set BANNERS = Collections.unmodifiableSet(add( + public static final Set BANNERS = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getByPrefixAndSuffix( null, Arrays.asList("_banner"), @@ -107,7 +129,7 @@ public class MaterialUtil { "legacy", "_wall" ), "standing_banner")); - public static final Set BEDS = Collections.unmodifiableSet(add( + public static final Set BEDS = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getBySuffix("_bed", AlmostBoolean.YES, "legacy"), "bed_block")); @@ -126,15 +148,15 @@ public class MaterialUtil { public static final Set BUSHES = Collections.unmodifiableSet( BridgeMaterial.getBySuffix("bush", AlmostBoolean.YES, "legacy", "potted")); - public static final Set CARPETS = Collections.unmodifiableSet(add( + public static final Set CARPETS = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getBySuffix("_carpet", AlmostBoolean.YES, "legacy"), "carpet")); - public static final Set CONCRETE_BLOCKS = Collections.unmodifiableSet(add( + public static final Set CONCRETE_BLOCKS = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getBySuffix("_concrete", AlmostBoolean.YES, "legacy"), "concrete")); - public static final Set CONCRETE_POWDER_BLOCKS = Collections.unmodifiableSet(add( + public static final Set CONCRETE_POWDER_BLOCKS = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getBySuffix("_concrete_powder", AlmostBoolean.YES, "legacy"), "concrete_powder")); @@ -156,16 +178,16 @@ public class MaterialUtil { )); /** Flower pot and potted plants / things. */ - public static final Set FLOWER_POTS = Collections.unmodifiableSet(add( + public static final Set FLOWER_POTS = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getByPrefix( "potted_", AlmostBoolean.YES), "flower_pot")); /** Stained and other. */ - public static final Set GLASS_BLOCKS = Collections.unmodifiableSet(add( + public static final Set GLASS_BLOCKS = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getBySuffix("_glass", AlmostBoolean.YES, "legacy"), "glass")); - public static final Set GLASS_PANES = Collections.unmodifiableSet(add( + public static final Set GLASS_PANES = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getBySuffix("_glass_pane", AlmostBoolean.YES, "legacy"), "glass_pane", "thin_glass")); @@ -174,7 +196,7 @@ public class MaterialUtil { ); /** Heads placed on the ground. Includes skulls. */ - public static final Set HEADS_GROUND = Collections.unmodifiableSet(add( + public static final Set HEADS_GROUND = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getByPrefixAndSuffix( null, Arrays.asList("_skull", "_head"), @@ -192,14 +214,14 @@ public class MaterialUtil { )); /** Blocks that are infested with silverfish. */ - public static final Set INFESTED_BLOCKS = Collections.unmodifiableSet(add( + public static final Set INFESTED_BLOCKS = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getByPrefix("infested_", AlmostBoolean.YES), "monster_eggs")); /** All lava blocks. */ public static final Set LAVA = Collections.unmodifiableSet( - BridgeMaterial.getAll("lava", "stationary_lava")); + BridgeMaterial.getAllBlocks("lava", "stationary_lava")); - public static final Set LEAVES = Collections.unmodifiableSet(add( + public static final Set LEAVES = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getByPrefixAndSuffix( woodTypes, Arrays.asList("_leaves"), // Strictly _pressure_plate for 1.13. @@ -208,7 +230,7 @@ public class MaterialUtil { ), "leaves", "leaves_2")); /** LOGS. */ - public static final Set LOGS = Collections.unmodifiableSet(add( + public static final Set LOGS = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getByPrefixAndSuffix( woodTypes, Arrays.asList("_log"), @@ -217,7 +239,7 @@ public class MaterialUtil { ), "log", "log_2")); /** Mushroom blocks (huge ones). */ - public static final Set MUSHROOM_BLOCKS = Collections.unmodifiableSet(add( + public static final Set MUSHROOM_BLOCKS = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getBySuffix( "_mushroom_block", AlmostBoolean.YES, @@ -233,7 +255,7 @@ public class MaterialUtil { "dead", "legacy" )); - public static final Set PLANKS = Collections.unmodifiableSet(add( + public static final Set PLANKS = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getBySuffix("_planks", AlmostBoolean.YES, "legacy"), "wood")); @@ -266,7 +288,7 @@ public class MaterialUtil { ); /** All ordinary terracotta (hard clay) blocks. */ - public static final Set TERRACOTTA_BLOCKS = Collections.unmodifiableSet(add( + public static final Set TERRACOTTA_BLOCKS = Collections.unmodifiableSet(addBlocks( // TODO: exclude GLAZED or not? BridgeMaterial.getByPrefixAndSuffix( null, Arrays.asList("_terracotta"), @@ -279,7 +301,32 @@ public class MaterialUtil { public static final Set TULIPS = Collections.unmodifiableSet( BridgeMaterial.getBySuffix("tulip", AlmostBoolean.YES, "legacy", "potted")); - public static final Set WALL_BANNERS = Collections.unmodifiableSet(add( + /** + * Collect fully solid blocks, that are not contained in other collections + * (of blocks that are fully solid too). + */ + public static final Set VARIOUS_FULLY_SOLID = Collections.unmodifiableSet(addBlocks( + BridgeMaterial.getBySuffix( + Arrays.asList( + "_bricks", "_ore", "prismarine", + "andesite", "diorite", "granite", + "command_block" + ), + AlmostBoolean.YES, "legacy"), + "observer", "structure_block", + "note_block", "piston", "piston_base", "tnt", + "dispenser", "dropper", "furnace", + "pumpkin", "melon_block", "hay_block", "bone_block", + "nether_wart_block", "cobweb", "web", + "snow_block", "ice", "magma_block", + "diamond_block", "gold_block", "iron_block", "coal_block", + "emerald_block", "lapis_block", "redstone_block", + "purpur_block", "smooth_stone", "smooth_quartz", "quartz_block", + "sand", "stone", "gravel", "dirt", "grass_block", "grass", + "sea_lantern", "redstone_lamp" + )); + + public static final Set WALL_BANNERS = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getByPrefixAndSuffix( null, Arrays.asList("_wall_banner"), @@ -289,10 +336,10 @@ public class MaterialUtil { /** All water blocks. */ public static final Set WATER = Collections.unmodifiableSet( - BridgeMaterial.getAll("water", "stationary_water")); + BridgeMaterial.getAllBlocks("water", "stationary_water")); /** Wood types (1.13 rather). */ - public static final Set WOOD_BLOCKS = Collections.unmodifiableSet(add( + public static final Set WOOD_BLOCKS = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getByPrefixAndSuffix( woodTypes, Arrays.asList("_wood"), @@ -315,7 +362,7 @@ public class MaterialUtil { "trap" )); - public static final Set WOODEN_FENCES = Collections.unmodifiableSet(add( + public static final Set WOODEN_FENCES = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getByPrefixAndSuffix( woodTypes, Arrays.asList("_fence"), @@ -323,7 +370,7 @@ public class MaterialUtil { // , ... ), "fence")); - public static final Set WOODEN_FENCE_GATES = Collections.unmodifiableSet(add( + public static final Set WOODEN_FENCE_GATES = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getByPrefixAndSuffix( woodTypes, Arrays.asList("_fence_gate"), @@ -358,7 +405,7 @@ public class MaterialUtil { // , ... )); - public static final Set WOODEN_TRAP_DOORS = Collections.unmodifiableSet(add( + public static final Set WOODEN_TRAP_DOORS = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getByPrefixAndSuffix( woodTypes, Arrays.asList("_trap_door", "_trapdoor"), @@ -366,13 +413,40 @@ public class MaterialUtil { // , ... ), "trap_door")); - public static final Set WOOL_BLOCKS = Collections.unmodifiableSet(add( + public static final Set WOOL_BLOCKS = Collections.unmodifiableSet(addBlocks( BridgeMaterial.getBySuffix( "_wool", AlmostBoolean.YES, "legacy" ), "wool")); + /////////////////////////////// + // Collections of collections + /////////////////////////////// + + /** + * Sets of fully solid blocks (in terms of: can walk on, can't pass through, + * full bounds - not necessarily 'solid' officially). + */ + @SuppressWarnings("unchecked") + public static final Set FULLY_SOLID_BLOCKS = Collections.unmodifiableSet(join( + CONCRETE_BLOCKS, + CONCRETE_POWDER_BLOCKS, + CORAL_BLOCKS, + GLASS_BLOCKS, + GLAZED_TERRACOTTA_BLOCKS, + INFESTED_BLOCKS, + LEAVES, + LOGS, + MUSHROOM_BLOCKS, + PLANKS, + STRIPPED_LOGS, + STRIPPED_WOOD_BLOCKS, + TERRACOTTA_BLOCKS, + VARIOUS_FULLY_SOLID, + WOOD_BLOCKS, + WOOL_BLOCKS + )); //////////////////// // Access methods. diff --git a/NCPPlugin/src/test/java/fr/neatmonster/nocheatplus/test/TestPassableRayTracing.java b/NCPPlugin/src/test/java/fr/neatmonster/nocheatplus/test/TestPassableRayTracing.java index 9372a759..f14fdc82 100644 --- a/NCPPlugin/src/test/java/fr/neatmonster/nocheatplus/test/TestPassableRayTracing.java +++ b/NCPPlugin/src/test/java/fr/neatmonster/nocheatplus/test/TestPassableRayTracing.java @@ -17,6 +17,7 @@ package fr.neatmonster.nocheatplus.test; import org.bukkit.Material; import org.junit.Test; +import fr.neatmonster.nocheatplus.compat.BridgeMaterial; import fr.neatmonster.nocheatplus.logging.StaticLog; import fr.neatmonster.nocheatplus.utilities.build.BuildParameters; import fr.neatmonster.nocheatplus.utilities.collision.PassableRayTracing; @@ -152,8 +153,7 @@ public class TestPassableRayTracing { final double[] stepBounds = new double[]{0.0, 0.0, 0.0, 1.0, 0.5, 1.0}; for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { - // STONE = HACK (CompatBukkit block-flags problem). - bc.set(x, 65, z, Material.STONE, stepBounds); + bc.set(x, 65, z, BridgeMaterial.STONE_SLAB, stepBounds); } } PassableRayTracing rt = new PassableRayTracing();