diff --git a/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/MCAccessBukkitModern.java b/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/MCAccessBukkitModern.java index 8868a2b8..74bb3015 100644 --- a/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/MCAccessBukkitModern.java +++ b/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/MCAccessBukkitModern.java @@ -4,14 +4,14 @@ import java.util.HashMap; import java.util.Map; import org.bukkit.Material; -import org.bukkit.block.data.type.Gate; import fr.neatmonster.nocheatplus.compat.BridgeMaterial; import fr.neatmonster.nocheatplus.compat.blocks.init.BlockInit; +import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitFence; +import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitGate; import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitShapeModel; import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitSlab; import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitStairs; -import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitFence; import fr.neatmonster.nocheatplus.config.WorldConfigProvider; import fr.neatmonster.nocheatplus.utilities.map.BlockCache; import fr.neatmonster.nocheatplus.utilities.map.BlockFlags; @@ -28,6 +28,8 @@ public class MCAccessBukkitModern extends MCAccessBukkit { 0.1375 + 0.3, 0.8625 - 0.3, 1.0); private static final BukkitShapeModel MODEL_THICK_FENCE = new BukkitFence( 0.075 + 0.3, 0.925 - 0.3, 1.5); + private static final BukkitShapeModel MODEL_GATE = new BukkitGate( + 0.075 + 0.3, 0.925 - 0.3, 1.5); public MCAccessBukkitModern() { super(); @@ -81,11 +83,12 @@ public class MCAccessBukkitModern extends MCAccessBukkit { } // Fences, cobblestone wall. if (BlockFlags.hasAnyFlag(flags, BlockProperties.F_THICK_FENCE)) { + processedBlocks.add(mat); if (BlockFlags.hasAnyFlag(flags, BlockProperties.F_PASSABLE_X4)) { // TODO: Perhaps another model flag. + shapeModels.put(mat, MODEL_GATE); } else { - processedBlocks.add(mat); shapeModels.put(mat, MODEL_THICK_FENCE); } } diff --git a/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/model/BukkitGate.java b/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/model/BukkitGate.java new file mode 100644 index 00000000..1bc06c91 --- /dev/null +++ b/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/model/BukkitGate.java @@ -0,0 +1,61 @@ +package fr.neatmonster.nocheatplus.compat.bukkit.model; + +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Directional; +import org.bukkit.block.data.Openable; + +import fr.neatmonster.nocheatplus.utilities.map.BlockCache; + +public class BukkitGate implements BukkitShapeModel { + + private final double minXZ; + private final double maxXZ; + private final double height; + + public BukkitGate(double minXZ, double maxXZ, double height) { + this.minXZ = minXZ; + this.maxXZ = maxXZ; + this.height = height; + } + + @Override + public double[] getShape(final BlockCache blockCache, + final World world, final int x, final int y, final int z) { + final Block block = world.getBlockAt(x, y, z); + final BlockState state = block.getState(); + final BlockData blockData = state.getBlockData(); + if (blockData instanceof Directional) { + switch (((Directional) blockData).getFacing()) { + case WEST: + return new double[] {minXZ, 0.0, 0.0, maxXZ, height, 1.0}; + case EAST: + return new double[] {minXZ, 0.0, 0.0, maxXZ, height, 1.0}; + case NORTH: + return new double[] {0.0, 0.0, minXZ, 1.0, height, maxXZ}; + case SOUTH: + return new double[] {0.0, 0.0, minXZ, 1.0, height, maxXZ}; + default: + break; + } + } + return new double[] {0.0, 0.0, 0.0, 1.0, 1.0, 1.0}; + } + + @Override + public int getFakeData(final BlockCache blockCache, + final World world, final int x, final int y, final int z) { + final Block block = world.getBlockAt(x, y, z); + final BlockState state = block.getState(); + final BlockData blockData = state.getBlockData(); + if (blockData instanceof Openable) { + return ((Openable) blockData).isOpen() ? 0x4 : 0; + } + else { + return 0; + } + } + +}