From 54c022f74de12a91a6b571193ec5a477d4fc17ce Mon Sep 17 00:00:00 2001 From: asofold Date: Tue, 21 Aug 2018 00:02:05 +0200 Subject: [PATCH] Prepare MCAccessBukkitModern (1.13). --- NCPCompatBukkit/pom.xml | 2 +- .../compat/bukkit/BlockCacheBukkitModern.java | 29 +++++++++++++++++ .../compat/bukkit/MCAccessBukkit.java | 19 +++++++----- .../compat/bukkit/MCAccessBukkitBase.java | 15 +++++++-- .../compat/bukkit/MCAccessBukkitModern.java | 31 +++++++++++++++++++ .../compat/registry/MCAccessFactory.java | 9 ++++++ 6 files changed, 94 insertions(+), 11 deletions(-) create mode 100644 NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/BlockCacheBukkitModern.java create mode 100644 NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/MCAccessBukkitModern.java diff --git a/NCPCompatBukkit/pom.xml b/NCPCompatBukkit/pom.xml index 4408938a..c691ff9a 100644 --- a/NCPCompatBukkit/pom.xml +++ b/NCPCompatBukkit/pom.xml @@ -17,7 +17,7 @@ org.bukkit bukkit - 1.11.2-R0.1-SNAPSHOT + 1.13-R0.1-SNAPSHOT provided diff --git a/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/BlockCacheBukkitModern.java b/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/BlockCacheBukkitModern.java new file mode 100644 index 00000000..29b666f5 --- /dev/null +++ b/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/BlockCacheBukkitModern.java @@ -0,0 +1,29 @@ +package fr.neatmonster.nocheatplus.compat.bukkit; + +import org.bukkit.World; + +/** + * BlockCache for MCAccessBukkitModern. + * + * @author asofold + * + */ +public class BlockCacheBukkitModern extends BlockCacheBukkit { + + public BlockCacheBukkitModern(World world) { + super(world); + } + + @Override + public int fetchData(int x, int y, int z) { + // TODO: Might fake here too. + return super.fetchData(x, y, z); + } + + @Override + public double[] fetchBounds(int x, int y, int z) { + // TODO: Fetch what's possible to fetch/guess (...). + return super.fetchBounds(x, y, z); + } + +} 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 df8b2b53..c3000cba 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 @@ -17,11 +17,13 @@ package fr.neatmonster.nocheatplus.compat.bukkit; 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; import fr.neatmonster.nocheatplus.utilities.map.BlockProperties; -public class MCAccessBukkit extends MCAccessBukkitBase implements BlockPropertiesSetup{ +public class MCAccessBukkit extends MCAccessBukkitBase implements BlockPropertiesSetup { public MCAccessBukkit() { super(); @@ -37,21 +39,24 @@ public class MCAccessBukkit extends MCAccessBukkitBase implements BlockPropertie } else if (guessItchyBlock(mat)) { // Uncertain bounding-box, allow passing through. + StaticLog.logDebug("Itchy: " + mat); long flags = BlockProperties.F_IGN_PASSABLE; - if ((BlockProperties.isSolid(mat) || BlockProperties.isGround(mat)) && !BlockProperties.isLiquid(mat)) { + if ((BlockProperties.isSolid(mat) + || BlockProperties.isGround(mat))) { // Block can be ground, so allow standing on any height. - flags |= BlockProperties.F_GROUND_HEIGHT; + flags |= BlockProperties.F_GROUND | BlockProperties.F_GROUND_HEIGHT; } BlockProperties.setBlockFlags(mat, BlockProperties.getBlockFlags(mat) | flags); } } // 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[]{ - Material.ENDER_PORTAL_FRAME, + BridgeMaterial.END_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); + if (!processedBlocks.contains(mat)) { + 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 16eff0b8..1a121cb8 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 @@ -14,6 +14,9 @@ */ package fr.neatmonster.nocheatplus.compat.bukkit; +import java.util.LinkedHashSet; +import java.util.Set; + import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.World; @@ -43,13 +46,19 @@ public class MCAccessBukkitBase implements MCAccess { // private AlmostBoolean entityPlayerAvailable = AlmostBoolean.MAYBE; protected final boolean bukkitHasGetHeightAndGetWidth; + /** + * Fill in already initialized blocks, to return false for guessItchyBlock. + */ + protected final Set processedBlocks = new LinkedHashSet(); + private boolean guessItchyBlockPre1_13(final Material mat) { return !mat.isOccluding() || !mat.isSolid() || mat.isTransparent(); } protected boolean guessItchyBlock(final Material mat) { // General considerations first. - if (BlockProperties.isAir(mat) || BlockProperties.isLiquid(mat)) { + if (processedBlocks.contains(mat) + || BlockProperties.isAir(mat) || BlockProperties.isLiquid(mat)) { return false; } // Fully solid/ground blocks. @@ -58,7 +67,7 @@ public class MCAccessBukkitBase implements MCAccess { * 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)) { + 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 @@ -75,7 +84,7 @@ public class MCAccessBukkitBase implements MCAccess { long testFlags = (BlockProperties.F_SOLID | BlockProperties.F_XZ100 | BlockProperties.F_HEIGHT100); if (BlockFlags.hasAllFlags(flags, testFlags)) { - // Fully solid block! + // Fully solid block. return false; } 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 new file mode 100644 index 00000000..e71639ff --- /dev/null +++ b/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/MCAccessBukkitModern.java @@ -0,0 +1,31 @@ +package fr.neatmonster.nocheatplus.compat.bukkit; + +import fr.neatmonster.nocheatplus.config.WorldConfigProvider; +import fr.neatmonster.nocheatplus.utilities.map.BlockCache; + +public class MCAccessBukkitModern extends MCAccessBukkit { + + public MCAccessBukkitModern() { + super(); + } + @Override + public String getMCVersion() { + return "1.13|?"; + } + + @Override + public BlockCache getBlockCache() { + return new BlockCacheBukkitModern(null); + } + + @Override + public void setupBlockProperties(final WorldConfigProvider worldConfigProvider) { + + // TODO: Initialize some blocks and add to this.processedBlocks. + + super.setupBlockProperties(worldConfigProvider); + } + + + +} diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/compat/registry/MCAccessFactory.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/compat/registry/MCAccessFactory.java index f45f8d58..9cb9e451 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/compat/registry/MCAccessFactory.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/compat/registry/MCAccessFactory.java @@ -22,6 +22,7 @@ import org.bukkit.Bukkit; import fr.neatmonster.nocheatplus.compat.MCAccess; import fr.neatmonster.nocheatplus.compat.bukkit.MCAccessBukkit; +import fr.neatmonster.nocheatplus.compat.bukkit.MCAccessBukkitModern; import fr.neatmonster.nocheatplus.compat.cbreflect.MCAccessCBReflect; import fr.neatmonster.nocheatplus.logging.StaticLog; @@ -66,6 +67,14 @@ public class MCAccessFactory { } } + // Bukkit API only: 1.13 (and possibly later). + try { + return new MCAccessBukkitModern(); + } + catch(Throwable t) { + throwables.add(t); + } + // Try to set up api-only access (since 1.4.6). try { mcAccess = new MCAccessBukkit();