From b422d077dba12fc009af0dd1c6fd975c0e06627e Mon Sep 17 00:00:00 2001 From: asofold Date: Sun, 26 Aug 2018 10:54:35 +0200 Subject: [PATCH] Brewing stand, cauldron, hopper, end portal frame. --- .../compat/bukkit/MCAccessBukkit.java | 11 ---- .../compat/bukkit/MCAccessBukkitModern.java | 31 +++++++++-- .../bukkit/model/BukkitEndPortalFrame.java | 43 +++++++++++++++ .../blocks/init/vanilla/BlocksMC1_5.java | 4 +- .../utilities/map/BlockProperties.java | 55 +++++++++++++++---- 5 files changed, 117 insertions(+), 27 deletions(-) create mode 100644 NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/model/BukkitEndPortalFrame.java 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 8d335e82..4bd28e9c 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 @@ -20,7 +20,6 @@ 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.logging.StaticLog; @@ -56,16 +55,6 @@ public class MCAccessBukkit extends MCAccessBukkitBase implements BlockPropertie itchyBlocks.add(mat); } } - // Blocks that are reported to be full and solid, but which are not. - final long flags = BlockProperties.F_IGN_PASSABLE | BlockProperties.F_GROUND_HEIGHT; - for (final Material mat : new Material[]{ - BridgeMaterial.END_PORTAL_FRAME, - }) { - if (!processedBlocks.contains(mat)) { - BlockProperties.setBlockFlags(mat, BlockProperties.getBlockFlags(mat) | flags); - itchyBlocks.add(mat); - } - } if (!itchyBlocks.isEmpty()) { StaticLog.logDebug("The following blocks can not be modeled correctly: " + StringUtil.join(itchyBlocks, ", ")); } 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 c32adac6..28936088 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 @@ -23,6 +23,7 @@ import fr.neatmonster.nocheatplus.compat.BridgeMaterial; import fr.neatmonster.nocheatplus.compat.blocks.init.BlockInit; import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitDirectionalCentered; import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitDoor; +import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitEndPortalFrame; import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitFence; import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitGate; import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitShapeModel; @@ -48,6 +49,8 @@ public class MCAccessBukkitModern extends MCAccessBukkit { 0.375, 1.5); private static final BukkitShapeModel MODEL_SHULKER_BOX = new BukkitShulkerBox(); + // Blocks with different heights based on whatever. + private static final BukkitShapeModel MODEL_END_PORTAL_FRAME = new BukkitEndPortalFrame(); // Blocks that have a different shape, based on how they have been placed. private static final BukkitShapeModel MODEL_SLAB = new BukkitSlab(); @@ -88,15 +91,18 @@ public class MCAccessBukkitModern extends MCAccessBukkit { 0.5625); private static final BukkitShapeModel MODEL_XZ100_HEIGHT4_3 = new BukkitStatic( 0.75); + private static final BukkitShapeModel MODEL_XZ100_HEIGHT8_7 = new BukkitStatic( + 0.875); private static final BukkitShapeModel MODEL_XZ100_HEIGHT16_15 = new BukkitStatic( 0.9375); /* * TODO: - * BREWING_STAND, CAULDRON, CONDUIT, HOPPER, END_PORTAL_FRAME, + * LADDER, + * CONDUIT, * CHORUS_FLOWER, CHORUS_PLANT, COCOA, * TURTLE_EGG, SEA_PICKLE, - * VINE, LADDER, + * VINE, * CAKE, */ // TODO: anvils, dead coral fans @@ -129,11 +135,18 @@ public class MCAccessBukkitModern extends MCAccessBukkit { // TODO: Also consider removing flags (passable_x4 etc). + // Adjust flags for individual blocks. + BlockProperties.setBlockFlags(Material.CAULDRON, + BlockFlags.SOLID_GROUND | BlockProperties.F_GROUND_HEIGHT + | BlockProperties.F_MIN_HEIGHT4_1); + // Directly keep blocks as is. for (final Material mat : new Material[] { + Material.CAULDRON, + BridgeMaterial.COBWEB, + Material.HOPPER, BridgeMaterial.MOVING_PISTON, - Material.SNOW, - BridgeMaterial.COBWEB + Material.SNOW }) { processedBlocks.add(mat); } @@ -141,6 +154,9 @@ public class MCAccessBukkitModern extends MCAccessBukkit { // Lily pad addModel(BridgeMaterial.LILY_PAD, MODEL_LILY_PAD); + // End portal frame. + addModel(BridgeMaterial.END_PORTAL_FRAME, MODEL_END_PORTAL_FRAME); + // End rod. addModel(Material.END_ROD, MODEL_END_ROD); @@ -174,6 +190,13 @@ public class MCAccessBukkitModern extends MCAccessBukkit { addModel(mat, MODEL_XZ100_HEIGHT4_3); } + // 7/8 height. + for (Material mat : new Material[] { + Material.BREWING_STAND // TODO: base is 1/8, center 0.875 - needs multi-cuboid. + }) { + addModel(mat, MODEL_XZ100_HEIGHT8_7); + } + // 16/15 height, full xz bounds. for (Material mat : new Material[] { Material.GRASS_PATH, BridgeMaterial.FARMLAND diff --git a/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/model/BukkitEndPortalFrame.java b/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/model/BukkitEndPortalFrame.java new file mode 100644 index 00000000..01f3ec3a --- /dev/null +++ b/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/model/BukkitEndPortalFrame.java @@ -0,0 +1,43 @@ +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.type.EndPortalFrame; + +import fr.neatmonster.nocheatplus.utilities.map.BlockCache; + +public class BukkitEndPortalFrame implements BukkitShapeModel { + + @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 EndPortalFrame) { + return ((EndPortalFrame) blockData).hasEye() + ? new double[] {0.0, 0.0, 0.0, 1.0, 1.0, 1.0} + : new double[] {0.0, 0.0, 0.0, 1.0, 0.8125, 1.0}; + } + else { + 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 EndPortalFrame) { + return ((EndPortalFrame) blockData).hasEye() ? 0x4 : 0; + } + else { + return 0; + } + } + +} diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/compat/blocks/init/vanilla/BlocksMC1_5.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/compat/blocks/init/vanilla/BlocksMC1_5.java index 119f595a..7eae0679 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/compat/blocks/init/vanilla/BlocksMC1_5.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/compat/blocks/init/vanilla/BlocksMC1_5.java @@ -91,8 +91,8 @@ public class BlocksMC1_5 implements BlockPropertiesSetup { // 154 Hopper BlockInit.setAs("HOPPER", Material.COAL_ORE); - // TODO: Needs workaround. [workaround-flag + different purpose flag sets ?] - BlockFlags.addFlags("HOPPER", BlockProperties.F_IGN_PASSABLE | BlockProperties.F_GROUND_HEIGHT); + BlockFlags.addFlags("HOPPER", BlockProperties.F_GROUND_HEIGHT + | BlockProperties.F_MIN_HEIGHT16_11); // 155 Block of Quartz BlockInit.setAs("QUARTZ_BLOCK", Material.SANDSTONE); 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 f7228263..f77cda92 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 @@ -778,11 +778,34 @@ public class BlockProperties { */ public static final long F_MIN_HEIGHT16_15 = f_flag(); + /** + * Minimum height 13/16 (8125).
+ * Only applies with F_GROUND_HEIGHT set. + */ + public static final long F_MIN_HEIGHT16_13 = f_flag(); + + /** + * Minimum height 11/16 (0.6875).
+ * Only applies with F_GROUND_HEIGHT set. + */ + public static final long F_MIN_HEIGHT16_11 = f_flag(); + + /** + * Minimum height 5/16 (0.3125).
+ * Only applies with F_GROUND_HEIGHT set. + */ + public static final long F_MIN_HEIGHT16_5 = f_flag(); + + /** + * Minimum height 1/4 (0.25).
+ * Only applies with F_GROUND_HEIGHT set. + */ + public static final long F_MIN_HEIGHT4_1 = f_flag(); + /** * Minimum height 1/16 (0.0625).
* Only applies with F_GROUND_HEIGHT set. */ - // TODO: Lily pad min height of MC versions? public static final long F_MIN_HEIGHT16_1 = f_flag(); /** CARPET. **/ @@ -1189,6 +1212,7 @@ public class BlockProperties { }) { setFlag(mat, F_GROUND_HEIGHT); } + setFlag(BridgeMaterial.END_PORTAL_FRAME, F_MIN_HEIGHT16_13); // Issues standing on with F_PASSABLE_X4. Note getGroundMinHeight. for (Material mat : MaterialUtil.WOODEN_TRAP_DOORS) { setFlag(mat, F_GROUND_HEIGHT); @@ -1357,6 +1381,8 @@ public class BlockProperties { setBlock(mat, brickType); } } + setBlockFlags(Material.CAULDRON, BlockFlags.SOLID_GROUND + | F_GROUND_HEIGHT | F_MIN_HEIGHT16_5); // LEGACY setBlock(BridgeMaterial.CRAFTING_TABLE, chestType); setBlock(Material.CHEST, chestType); for (Material mat : MaterialUtil.WOODEN_DOORS) { @@ -3068,7 +3094,8 @@ public class BlockProperties { } } else if (id == Material.CAULDRON) { - if (Math.min(fy, fy + dY * dT) >= 0.3125) { + if (Math.min(fy, fy + dY * dT) >= getGroundMinHeight( + access, bx, by, bz, node, flags)) { // Check for moving through walls or floor. // TODO: Maybe this is too exact... return isInsideCenter(fx, fz, dX, dZ, dT, 0.125); @@ -3272,20 +3299,12 @@ public class BlockProperties { // else if (id == BridgeMaterial.CAKE.getId()) { // return 0.4375; // } - else if (id == Material.CAULDRON) { - // TODO: slightly over 0. - return 0.3125; - } else if (id == Material.CACTUS) { return 0.9375; } else if (id == BridgeMaterial.PISTON_HEAD) { return 0.625; } - else if (id == BridgeMaterial.END_PORTAL_FRAME) { - // Allow moving as if no eye was inserted. - return 0.8125; - } else if (bounds == null) { return 0.0; } @@ -3295,6 +3314,22 @@ public class BlockProperties { // 1/16 return 0.0625; } + if ((flags & F_MIN_HEIGHT4_1) != 0) { + // 1/4 + return 0.25; + } + if ((flags & F_MIN_HEIGHT16_5) != 0) { + // 5/16 + return 0.3125; + } + if ((flags & F_MIN_HEIGHT16_11) != 0) { + // 11/16 + return 0.6875; + } + if ((flags & F_MIN_HEIGHT16_13) != 0) { + // 13/16 + return 0.8125; + } if ((flags & F_MIN_HEIGHT16_15) != 0) { // 15/16 return 0.9375;