public static Boolean canSpawn(Location loc, float width, float height, float length) { net.minecraft.server.v1_7_R1.World mcWorld = ((CraftWorld) loc.getWorld()).getHandle(); float halfEntityWidth = width / 2; AxisAlignedBB bb = AxisAlignedBB.a( loc.getX() - halfEntityWidth, loc.getY() - height, loc.getZ() - halfEntityWidth, loc.getX() + halfEntityWidth, loc.getY() - height + length, loc.getZ() + halfEntityWidth); return getBlockBBsInBB(loc.getWorld(), bb).isEmpty() && !mcWorld.containsLiquid(bb); }
@Override public boolean standsOnEntity( final Entity entity, final double minX, final double minY, final double minZ, final double maxX, final double maxY, final double maxZ) { try { // TODO: Probably check other ids too before doing this ? final net.minecraft.server.v1_7_R1.Entity mcEntity = ((CraftEntity) entity).getHandle(); final AxisAlignedBB box = useBox.b(minX, minY, minZ, maxX, maxY, maxZ); @SuppressWarnings("rawtypes") final List list = world.getEntities(mcEntity, box); @SuppressWarnings("rawtypes") final Iterator iterator = list.iterator(); while (iterator.hasNext()) { final net.minecraft.server.v1_7_R1.Entity other = (net.minecraft.server.v1_7_R1.Entity) iterator.next(); if (!(other instanceof EntityBoat)) { // && !(other instanceof EntityMinecart)) continue; continue; } if (minY >= other.locY && minY - other.locY <= 0.7) { return true; } // Still check this for some reason. final AxisAlignedBB otherBox = other.boundingBox; if (box.a > otherBox.d || box.d < otherBox.a || box.b > otherBox.e || box.e < otherBox.b || box.c > otherBox.f || box.f < otherBox.c) continue; else { return true; } } } catch (Throwable t) { // Ignore exceptions (Context: DisguiseCraft). } return false; }
public class BlockCacheCBDev extends BlockCache implements IBlockAccess { /** Box for one time use, no nesting, no extra storing this(!). */ protected static final AxisAlignedBB useBox = AxisAlignedBB.a(0, 0, 0, 0, 0, 0); protected net.minecraft.server.v1_7_R1.WorldServer world; public BlockCacheCBDev(World world) { setAccess(world); } @Override public void setAccess(World world) { this.world = world == null ? null : ((CraftWorld) world).getHandle(); } @Override public int fetchTypeId(final int x, final int y, final int z) { return world.getTypeId(x, y, z); } @Override public int fetchData(final int x, final int y, final int z) { return world.getData(x, y, z); } @Override public double[] fetchBounds(final int x, final int y, final int z) { // TODO: change api for this / use nodes (!) final int id = getTypeId(x, y, z); final net.minecraft.server.v1_7_R1.Block block = net.minecraft.server.v1_7_R1.Block.e(id); if (block == null) return null; block.updateShape(this, x, y, z); // TODO: use THIS instead of world. // minX, minY, minZ, maxX, maxY, maxZ return new double[] {block.x(), block.z(), block.B(), block.y(), block.A(), block.C()}; } @Override public boolean standsOnEntity( final Entity entity, final double minX, final double minY, final double minZ, final double maxX, final double maxY, final double maxZ) { try { // TODO: Probably check other ids too before doing this ? final net.minecraft.server.v1_7_R1.Entity mcEntity = ((CraftEntity) entity).getHandle(); final AxisAlignedBB box = useBox.b(minX, minY, minZ, maxX, maxY, maxZ); @SuppressWarnings("rawtypes") final List list = world.getEntities(mcEntity, box); @SuppressWarnings("rawtypes") final Iterator iterator = list.iterator(); while (iterator.hasNext()) { final net.minecraft.server.v1_7_R1.Entity other = (net.minecraft.server.v1_7_R1.Entity) iterator.next(); if (!(other instanceof EntityBoat)) { // && !(other instanceof EntityMinecart)) continue; continue; } if (minY >= other.locY && minY - other.locY <= 0.7) { return true; } // Still check this for some reason. final AxisAlignedBB otherBox = other.boundingBox; if (box.a > otherBox.d || box.d < otherBox.a || box.b > otherBox.e || box.e < otherBox.b || box.c > otherBox.f || box.f < otherBox.c) continue; else { return true; } } } catch (Throwable t) { // Ignore exceptions (Context: DisguiseCraft). } return false; } /* (non-Javadoc) * @see fr.neatmonster.nocheatplus.utilities.BlockCache#cleanup() */ @Override public void cleanup() { super.cleanup(); world = null; } @Override public TileEntity getTileEntity(final int x, final int y, final int z) { return world.getTileEntity(x, y, z); } @Override public Vec3DPool getVec3DPool() { return world.getVec3DPool(); } @Override public int getBlockPower(final int arg0, final int arg1, final int arg2, final int arg3) { return world.getBlockPower(arg0, arg1, arg2, arg3); } @Override public Block getType(int x, int y, int z) { return world.getType(x, y, z); } }