Adjustments and fixes for BlockProperties.

* Reinstate itchy blocks being processed at all (MCAccessBukkit).
* Refine block dump: add non-air blocks with no flags set to missing.
* Adjust/re-add/alter various flags.
This commit is contained in:
asofold 2018-08-20 22:14:16 +02:00
parent 07368361e2
commit 40b0107cc8
4 changed files with 92 additions and 66 deletions

View File

@ -676,40 +676,60 @@ public class BlockProperties {
/** The Constant blockFlags. */ /** The Constant blockFlags. */
protected static final Map<Material, Long> blockFlags = new HashMap<Material, Long>(); protected static final Map<Material, Long> blockFlags = new HashMap<Material, Long>();
/**
* Map flag to names.
*/
private static final Map<Long, String> flagNameMap = new LinkedHashMap<Long, String>();
/**
* Map flag name to flag, both names starting with F_... and the name
* without F_.
*/
private static final Map<String, Long> nameFlagMap = new LinkedHashMap<String, Long>();
private static long f_next = 1;
private static long f_flag() {
if (f_next <= 0L) {
throw new IllegalStateException("No more flags available.");
}
final long flag = f_next;
f_next *= 2L;
return flag;
}
/** Flag position for stairs. */ /** Flag position for stairs. */
public static final long F_STAIRS = 0x1L; public static final long F_STAIRS = f_flag();
/** The Constant F_LIQUID. */ /** The Constant F_LIQUID. */
public static final long F_LIQUID = 0x2L; public static final long F_LIQUID = f_flag();
// TODO: maybe remove F_SOLID use (unless for setting F_GROUND on init). // TODO: maybe remove F_SOLID use (unless for setting F_GROUND on init).
/** Minecraft isSolid result. Used for setting ground flag - Subject to change / rename.*/ /** Minecraft isSolid result. Used for setting ground flag - Subject to change / rename.*/
public static final long F_SOLID = 0x4L; public static final long F_SOLID = f_flag();
/** Compatibility flag: regard this block as passable always. */ /** Compatibility flag: regard this block as passable always. */
public static final long F_IGN_PASSABLE = 0x8L; public static final long F_IGN_PASSABLE = f_flag();
/** The Constant F_WATER. */ /** The Constant F_WATER. */
public static final long F_WATER = 0x10L; public static final long F_WATER = f_flag();
/** The Constant F_LAVA. */ /** The Constant F_LAVA. */
public static final long F_LAVA = 0x20L; public static final long F_LAVA = f_flag();
/** Override bounding box: 1.5 blocks high, like fences.<br> /** Override bounding box: 1.5 blocks high, like fences.<br>
* NOTE: This might have relevance for passable later. * NOTE: This might have relevance for passable later.
*/ */
public static final long F_HEIGHT150 = 0x40L; public static final long F_HEIGHT150 = f_flag();
/** The player can stand on these, sneaking or not. */ /** The player can stand on these, sneaking or not. */
public static final long F_GROUND = 0x80L; // TODO: public static final long F_GROUND = f_flag(); // TODO:
/** Override bounding box: 1 block height.<br> /** Override bounding box: 1 block height.<br>
* NOTE: This should later be ignored by passable, rather. * NOTE: This should later be ignored by passable, rather.
*/ */
public static final long F_HEIGHT100 = 0x100L; public static final long F_HEIGHT100 = f_flag();
/** Climbable like ladder and vine (allow to land on without taking damage). */ /** Climbable like ladder and vine (allow to land on without taking damage). */
public static final long F_CLIMBABLE = 0x200L; public static final long F_CLIMBABLE = f_flag();
/** The block can change shape. This is most likely not 100% accurate... */ /** The block can change shape. This is most likely not 100% accurate... */
public static final long F_VARIABLE = 0x400L; public static final long F_VARIABLE = f_flag();
// /** The block has full bounds (0..1), inaccurate! */ // /** The block has full bounds (0..1), inaccurate! */
// public static final int F_FULL = 0x800; // public static final int F_FULL = 0x800;
/** Block has full xz-bounds. */ /** Block has full xz-bounds. */
public static final long F_XZ100 = 0x800L; public static final long F_XZ100 = f_flag();
/** /**
* This flag indicates that everything between the minimum ground height and * This flag indicates that everything between the minimum ground height and
@ -720,122 +740,122 @@ public class BlockProperties {
* otherwise colliding blocks * otherwise colliding blocks
* ({@link #isPassableWorkaround(BlockCache, int, int, int, double, double, double, IBlockCacheNode, double, double, double, double)}). * ({@link #isPassableWorkaround(BlockCache, int, int, int, double, double, double, IBlockCacheNode, double, double, double, double)}).
*/ */
public static final long F_GROUND_HEIGHT = 0x1000L; public static final long F_GROUND_HEIGHT = f_flag();
/** /**
* The height is assumed to decrease from 1.0 with increasing data value from 0 to 0x7, with 0x7 being the lowest. * The height is assumed to decrease from 1.0 with increasing data value from 0 to 0x7, with 0x7 being the lowest.
* (repeating till 0x15)). 0x8 means falling/full block. This is meant to model flowing water/lava. <br> * (repeating till 0x15)). 0x8 means falling/full block. This is meant to model flowing water/lava. <br>
* However the hit-box for collision checks will be set to 0.5 height or 1.0 height only. * However the hit-box for collision checks will be set to 0.5 height or 1.0 height only.
*/ */
public static final long F_HEIGHT_8SIM_DEC = 0x2000L; public static final long F_HEIGHT_8SIM_DEC = f_flag();
/** /**
* The height is assumed to increase with data value up to 0x7, repeating up to 0x15.<br> * The height is assumed to increase with data value up to 0x7, repeating up to 0x15.<br>
* However the hit-box for collision checks will be set to 0.5 height or 1.0 height only,<br> * However the hit-box for collision checks will be set to 0.5 height or 1.0 height only,<br>
* as with the 1.4.x snow levels. * as with the 1.4.x snow levels.
*/ */
public static final long F_HEIGHT_8SIM_INC = 0x4000L; public static final long F_HEIGHT_8SIM_INC = f_flag();
/** /**
* The height increases with data value (8 heights).<br> * The height increases with data value (8 heights).<br>
* This is for MC 1.5 snow levels. * This is for MC 1.5 snow levels.
*/ */
public static final long F_HEIGHT_8_INC = 0x8000L; public static final long F_HEIGHT_8_INC = f_flag();
/** All rail types a minecart can move on. */ /** All rail types a minecart can move on. */
public static final long F_RAILS = 0x10000L; public static final long F_RAILS = f_flag();
/** ICE. */ /** ICE. */
public static final long F_ICE = 0x20000L; public static final long F_ICE = f_flag();
/** LEAVES. */ /** LEAVES. */
public static final long F_LEAVES = 0x40000L; public static final long F_LEAVES = f_flag();
/** THIN FENCE (glass panes, iron fence). */ /** THIN FENCE (glass panes, iron fence). */
public static final long F_THIN_FENCE = 0x80000L; public static final long F_THIN_FENCE = f_flag();
/** Meta-flag to indicate that the (max.-) edges should mean a collision, can be passed to collidesBlock. */ /** Meta-flag to indicate that the (max.-) edges should mean a collision, can be passed to collidesBlock. */
public static final long F_COLLIDE_EDGES = 0x100000L; public static final long F_COLLIDE_EDGES = f_flag();
/** Thick fence (default wooden fence). */ /** Thick fence (default wooden fence). */
public static final long F_THICK_FENCE = 0x200000L; public static final long F_THICK_FENCE = f_flag();
/** Fence gate style with 0x04 being fully passable. */ /** Fence gate style with 0x04 being fully passable. */
public static final long F_PASSABLE_X4 = 0x400000L; public static final long F_PASSABLE_X4 = f_flag();
// TODO: Separate no fall damage flag ? [-> on ground could return "dominating" flags, or extra flags] // TODO: Separate no fall damage flag ? [-> on ground could return "dominating" flags, or extra flags]
/** Like slime block: bounce back 25% of fall height without taking fall damage [TODO: Check/adjust]. */ /** Like slime block: bounce back 25% of fall height without taking fall damage [TODO: Check/adjust]. */
public static final long F_BOUNCE25 = 0x800000L; public static final long F_BOUNCE25 = f_flag();
/** /**
* The facing direction is described by the lower 3 data bits in order of * The facing direction is described by the lower 3 data bits in order of
* NSWE, starting at and defaulting to 2, which includes invalid states. * NSWE, starting at and defaulting to 2, which includes invalid states.
* Main purpose is ladders, no guarantees on defaults for other blocks yet. * Main purpose is ladders, no guarantees on defaults for other blocks yet.
*/ */
public static final long F_FACING_LOW3D2_NSWE = 0x1000000L; public static final long F_FACING_LOW3D2_NSWE = f_flag();
/** /**
* The direction the block is attached to is described by the lower 2 bits * The direction the block is attached to is described by the lower 2 bits
* in order of SNEW. * in order of SNEW.
*/ */
public static final long F_ATTACHED_LOW2_SNEW = 0x2000000L; public static final long F_ATTACHED_LOW2_SNEW = f_flag();
/** /**
* The hacky way to force sfNoLowJump when the block at from has this flag. * The hacky way to force sfNoLowJump when the block at from has this flag.
*/ */
public static final long F_ALLOW_LOWJUMP = 0x4000000L; public static final long F_ALLOW_LOWJUMP = f_flag();
/** One eighth block height (0.125). */ /** One eighth block height (0.125). */
public static final long F_HEIGHT8_1 = 0x8000000L; public static final long F_HEIGHT8_1 = f_flag();
/** /**
* Fall distance is divided by 2, if a move goes through this medium * Fall distance is divided by 2, if a move goes through this medium
* (currently only supports liquid). * (currently only supports liquid).
*/ */
public static final long F_FALLDIST_HALF = 0x10000000L; public static final long F_FALLDIST_HALF = f_flag();
/** /**
* Fall distance is set to zero, if a move goes through this medium * Fall distance is set to zero, if a move goes through this medium
* (currently only supports liquid). * (currently only supports liquid).
*/ */
public static final long F_FALLDIST_ZERO = 0x20000000L; public static final long F_FALLDIST_ZERO = f_flag();
/** /**
* Minimum height 15/16 (0.9375 = 1 - 0.0625). <br> * Minimum height 15/16 (0.9375 = 1 - 0.0625). <br>
* Only applies with F_GROUND_HEIGHT set. * Only applies with F_GROUND_HEIGHT set.
*/ */
public static final long F_MIN_HEIGHT16_15 = 0x40000000L; public static final long F_MIN_HEIGHT16_15 = f_flag();
/** /**
* Minimum height 1/16 (0.0625). <br> * Minimum height 1/16 (0.0625). <br>
* Only applies with F_GROUND_HEIGHT set. * Only applies with F_GROUND_HEIGHT set.
*/ */
// TODO: Lily pad min height of MC versions? // TODO: Lily pad min height of MC versions?
public static final long F_MIN_HEIGHT16_1 = 0x80000000L; public static final long F_MIN_HEIGHT16_1 = f_flag();
/** CARPET. **/ /** CARPET. **/
public static final long F_CARPET = 0x100000000L; public static final long F_CARPET = f_flag();
/** Cobweb like blocks (adhesive). */ /** Cobweb like blocks (adhesive). */
public static final long F_COBWEB = 0x200000000L; public static final long F_COBWEB = f_flag();
/** /**
* Block change tracking: ordinary right click interaction (use) can change * Block change tracking: ordinary right click interaction (use) can change
* the shape. * the shape.
*/ */
public static final long F_VARIABLE_USE = 0x400000000L; public static final long F_VARIABLE_USE = f_flag();
/** /**
* Block change tracking: block redstone events can change the shape. * Block change tracking: block redstone events can change the shape.
*/ */
public static final long F_VARIABLE_REDSTONE = 0x800000000L; public static final long F_VARIABLE_REDSTONE = f_flag();
/** /**
* Indicator to start recoding towards multiple flag types (shape, moving, * Indicator to start recoding towards multiple flag types (shape, moving,
* interaction, block-type/special, ...). * interaction, block-type/special, ...).
*/ */
public static final long F_MAX_FLAG = 0x80000000000000L; public static final long F_MAX_FLAG = f_flag();
// TODO: Convenience constants combining all height / minheight flags. // TODO: Convenience constants combining all height / minheight flags.
@ -845,16 +865,6 @@ public class BlockProperties {
/** Trap door is climbable with ladder underneath, both facing distinct. */ /** Trap door is climbable with ladder underneath, both facing distinct. */
private static boolean specialCaseTrapDoorAboveLadder = false; private static boolean specialCaseTrapDoorAboveLadder = false;
/**
* Map flag to names.
*/
private static final Map<Long, String> flagNameMap = new LinkedHashMap<Long, String>();
/**
* Map flag name to flag, both names starting with F_... and the name
* without F_.
*/
private static final Map<String, Long> nameFlagMap = new LinkedHashMap<String, Long>();
/** The Constant useLoc. */ /** The Constant useLoc. */
private static final Location useLoc = new Location(null, 0, 0, 0); private static final Location useLoc = new Location(null, 0, 0, 0);
@ -891,7 +901,8 @@ public class BlockProperties {
* @param worldConfigProvider * @param worldConfigProvider
* the world config provider * the world config provider
*/ */
public static void init(final IHandle<MCAccess> mcAccess, final WorldConfigProvider<?> worldConfigProvider) { public static void init(final IHandle<MCAccess> mcAccess,
final WorldConfigProvider<?> worldConfigProvider) {
wrapBlockCache = new WrapBlockCache(); wrapBlockCache = new WrapBlockCache();
rtRay = new PassableRayTracing(); rtRay = new PassableRayTracing();
rtAxis = new PassableAxisTracing(); rtAxis = new PassableAxisTracing();
@ -910,13 +921,14 @@ public class BlockProperties {
StaticLog.logSevere(t); StaticLog.logSevere(t);
} }
// Allow mcAccess to setup block properties. // Allow mcAccess to setup block properties.
if (mcAccess instanceof BlockPropertiesSetup) { final MCAccess handle = mcAccess.getHandle();
if (handle instanceof BlockPropertiesSetup) {
try{ try{
((BlockPropertiesSetup) mcAccess).setupBlockProperties(worldConfigProvider); ((BlockPropertiesSetup) handle).setupBlockProperties(worldConfigProvider);
blocksFeatures.add(mcAccess.getClass().getSimpleName()); blocksFeatures.add(handle.getClass().getSimpleName());
} }
catch(Throwable t) { catch(Throwable t) {
StaticLog.logSevere("McAccess.setupBlockProperties (" + mcAccess.getClass().getSimpleName() + ") could not execute properly: " + t.getClass().getSimpleName() + " - " + t.getMessage()); StaticLog.logSevere("McAccess.setupBlockProperties (" + handle.getClass().getSimpleName() + ") could not execute properly: " + t.getClass().getSimpleName() + " - " + t.getMessage());
StaticLog.logSevere(t); StaticLog.logSevere(t);
} }
} }
@ -1077,7 +1089,7 @@ public class BlockProperties {
BridgeMaterial.get("DIODE_BLOCK_OFF"), BridgeMaterial.get("DIODE_BLOCK_OFF"),
BridgeMaterial.get("DIODE_BLOCK_ON"), BridgeMaterial.get("DIODE_BLOCK_ON"),
Material.COCOA, Material.SNOW, Material.BREWING_STAND, Material.COCOA, Material.SNOW, Material.BREWING_STAND,
BridgeMaterial.MOVING_PISTON, BridgeMaterial.PISTON_HEAD, BridgeMaterial.PISTON_HEAD,
BridgeMaterial.STONE_SLAB, BridgeMaterial.STONE_SLAB,
}) { }) {
if (mat != null) { if (mat != null) {
@ -1085,6 +1097,10 @@ public class BlockProperties {
} }
} }
setBlockProps(BridgeMaterial.MOVING_PISTON, indestructibleType); // TODO: really?
setFlag(BridgeMaterial.MOVING_PISTON, F_IGN_PASSABLE | F_GROUND | F_GROUND_HEIGHT
| BlockFlags.FULL_BOUNDS);
// Full block height. // Full block height.
for (final Material mat : new Material[]{ for (final Material mat : new Material[]{
// BridgeMaterial.END_PORTAL_FRAME, // BridgeMaterial.END_PORTAL_FRAME,
@ -1233,7 +1249,7 @@ public class BlockProperties {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
List<Set<Material>> instantSets = Arrays.asList( List<Set<Material>> instantSets = Arrays.asList(
MaterialUtil.BUSHES, MaterialUtil.TULIPS, MaterialUtil.BUSHES, MaterialUtil.TULIPS,
MaterialUtil.SAPLINGS, MaterialUtil.FLOWER_POTS MaterialUtil.SAPLINGS
); );
for (final Set<Material> set : instantSets) { for (final Set<Material> set : instantSets) {
for (final Material mat : set) { for (final Material mat : set) {
@ -1290,7 +1306,7 @@ public class BlockProperties {
setBlock(Material.SOUL_SAND, sandType); setBlock(Material.SOUL_SAND, sandType);
for (Material mat: new Material[]{Material.LEVER, BridgeMaterial.PISTON, for (Material mat: new Material[]{Material.LEVER, BridgeMaterial.PISTON,
BridgeMaterial.PISTON_HEAD, BridgeMaterial.STICKY_PISTON, BridgeMaterial.PISTON_HEAD, BridgeMaterial.STICKY_PISTON,
Material.STONE_BUTTON, BridgeMaterial.MOVING_PISTON}) { Material.STONE_BUTTON, BridgeMaterial.PISTON}) {
setBlock(mat, leverType); setBlock(mat, leverType);
} }
// setBlock(Material.ICE, new BlockProps(woodPickaxe, 0.5f, secToMs(2.5, 0.4, 0.2, 0.15, 0.1, 0.1))); // setBlock(Material.ICE, new BlockProps(woodPickaxe, 0.5f, secToMs(2.5, 0.4, 0.2, 0.15, 0.1, 0.1)));
@ -1434,14 +1450,13 @@ public class BlockProperties {
props = new BlockProps(noTool, 8.5f, secToMs(1.45)); props = new BlockProps(noTool, 8.5f, secToMs(1.45));
for (Material mat : MaterialUtil.HEADS_GROUND) { for (Material mat : MaterialUtil.HEADS_GROUND) {
setBlock(mat, props); setBlock(mat, props);
setFlag(mat, F_GROUND); setFlag(mat, F_SOLID | F_GROUND);
}
for (Material mat : MaterialUtil.HEADS_GROUND) {
setBlock(mat, props);
setFlag(mat, F_GROUND); // TODO: Test !
} }
setBlock(Material.ANVIL, new BlockProps(woodPickaxe, 5f)); // TODO setBlock(Material.ANVIL, new BlockProps(woodPickaxe, 5f)); // TODO
setFlag(Material.FLOWER_POT, F_GROUND); for (final Material mat : MaterialUtil.FLOWER_POTS) {
BlockFlags.addFlags(mat, F_SOLID | F_GROUND);
setBlockProps(mat, instantType);
}
// Indestructible. // Indestructible.
for (Material mat : new Material[]{ for (Material mat : new Material[]{
@ -1601,7 +1616,7 @@ public class BlockProperties {
List<String> missing = new LinkedList<String>(); List<String> missing = new LinkedList<String>();
List<String> allBlocks = new LinkedList<String>(); List<String> allBlocks = new LinkedList<String>();
if (all) { if (all) {
allBlocks.add("Dump block properties for fastbreak check:"); allBlocks.add("Dump block properties:");
allBlocks.add("--- Present entries -------------------------------"); allBlocks.add("--- Present entries -------------------------------");
} }
List<String> tags = new ArrayList<String>(); List<String> tags = new ArrayList<String>();
@ -1623,9 +1638,12 @@ public class BlockProperties {
if (mat.equals("?")) { if (mat.equals("?")) {
continue; continue;
} }
missing.add("* MISSING (" + mat + tagsJoined + ") "); missing.add("* BLOCK BREAKING (" + mat + tagsJoined + ") ");
} }
else { else {
if (getBlockFlags(temp) == 0L && !isAir(temp)) {
missing.add("* FLAGS (" + mat + tagsJoined + ") " + getBlockProps(temp).toString());
}
if (all) { if (all) {
allBlocks.add(": (" + mat + tagsJoined + ") " + getBlockProps(temp).toString()); allBlocks.add(": (" + mat + tagsJoined + ") " + getBlockProps(temp).toString());
} }

View File

@ -310,11 +310,13 @@ public class MaterialUtil {
Arrays.asList( Arrays.asList(
"_bricks", "_ore", "prismarine", "_bricks", "_ore", "prismarine",
"andesite", "diorite", "granite", "andesite", "diorite", "granite",
"sandstone",
"command_block" "command_block"
), ),
AlmostBoolean.YES, "legacy"), AlmostBoolean.YES, "legacy"),
"observer", "structure_block", "observer", "structure_block",
"note_block", "piston", "piston_base", "tnt", "note_block", "tnt",
"piston", "sticky_piston", "piston_base", "piston_sticky_base",
"dispenser", "dropper", "furnace", "dispenser", "dropper", "furnace",
"pumpkin", "melon_block", "hay_block", "bone_block", "pumpkin", "melon_block", "hay_block", "bone_block",
"nether_wart_block", "cobweb", "web", "nether_wart_block", "cobweb", "web",
@ -323,7 +325,7 @@ public class MaterialUtil {
"emerald_block", "lapis_block", "redstone_block", "emerald_block", "lapis_block", "redstone_block",
"purpur_block", "smooth_stone", "smooth_quartz", "quartz_block", "purpur_block", "smooth_stone", "smooth_quartz", "quartz_block",
"sand", "stone", "gravel", "dirt", "grass_block", "grass", "sand", "stone", "gravel", "dirt", "grass_block", "grass",
"sea_lantern", "redstone_lamp" "sea_lantern", "redstone_lamp", "sponge", "wet_sponge"
)); ));
public static final Set<Material> WALL_BANNERS = Collections.unmodifiableSet(addBlocks( public static final Set<Material> WALL_BANNERS = Collections.unmodifiableSet(addBlocks(

View File

@ -36,7 +36,11 @@ public class WrapBlockCache implements IWrapBlockCache {
private BlockCache blockCache; private BlockCache blockCache;
public WrapBlockCache() { public WrapBlockCache() {
mcAccess = NCPAPIProvider.getNoCheatPlusAPI().getGenericInstanceHandle(MCAccess.class); this(NCPAPIProvider.getNoCheatPlusAPI().getGenericInstanceHandle(MCAccess.class));
}
public WrapBlockCache(IGenericInstanceHandle<MCAccess> mcAccess) {
this.mcAccess = mcAccess;
lastMCAccess = mcAccess == null ? null : mcAccess.getHandle(); lastMCAccess = mcAccess == null ? null : mcAccess.getHandle();
blockCache = mcAccess == null ? null : lastMCAccess.getBlockCache(); blockCache = mcAccess == null ? null : lastMCAccess.getBlockCache();
} }

View File

@ -21,6 +21,7 @@ import fr.neatmonster.nocheatplus.compat.BridgeMaterial;
import fr.neatmonster.nocheatplus.logging.StaticLog; import fr.neatmonster.nocheatplus.logging.StaticLog;
import fr.neatmonster.nocheatplus.utilities.build.BuildParameters; import fr.neatmonster.nocheatplus.utilities.build.BuildParameters;
import fr.neatmonster.nocheatplus.utilities.collision.PassableRayTracing; import fr.neatmonster.nocheatplus.utilities.collision.PassableRayTracing;
import fr.neatmonster.nocheatplus.utilities.map.BlockProperties;
import fr.neatmonster.nocheatplus.utilities.map.FakeBlockCache; import fr.neatmonster.nocheatplus.utilities.map.FakeBlockCache;
public class TestPassableRayTracing { public class TestPassableRayTracing {
@ -151,6 +152,7 @@ public class TestPassableRayTracing {
FakeBlockCache bc = new FakeBlockCache(); FakeBlockCache bc = new FakeBlockCache();
// Ground using 0.5 high step blocks. // Ground using 0.5 high step blocks.
final double[] stepBounds = new double[]{0.0, 0.0, 0.0, 1.0, 0.5, 1.0}; final double[] stepBounds = new double[]{0.0, 0.0, 0.0, 1.0, 0.5, 1.0};
BlockProperties.setBlockFlags(BridgeMaterial.STONE_SLAB, BlockProperties.F_SOLID | BlockProperties.F_GROUND);
for (int x = 0; x < 16; x++) { for (int x = 0; x < 16; x++) {
for (int z = 0; z < 16; z++) { for (int z = 0; z < 16; z++) {
bc.set(x, 65, z, BridgeMaterial.STONE_SLAB, stepBounds); bc.set(x, 65, z, BridgeMaterial.STONE_SLAB, stepBounds);