Move flag checking methods to BlockProperties. TypeIdCache is really

only the cache now.
This commit is contained in:
asofold 2012-10-09 23:35:39 +02:00
parent 4ee1880a4d
commit 0a777735e7
3 changed files with 120 additions and 136 deletions

View File

@ -6,6 +6,7 @@ import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import net.minecraft.server.AxisAlignedBB;
import net.minecraft.server.Block; import net.minecraft.server.Block;
import net.minecraft.server.IBlockAccess; import net.minecraft.server.IBlockAccess;
@ -917,5 +918,98 @@ public class BlockProperties {
else blockFlags[id] |= F_IGN_PASSABLE; else blockFlags[id] |= F_IGN_PASSABLE;
} }
} }
/**
*
* @param box
* @param flags Block flags (@see fr.neatmonster.nocheatplus.utilities.BlockProperties).
* @return If any block has the flags.
*/
public static final boolean hasAnyFlags(final IBlockAccess access, final AxisAlignedBB box, final long flags){
return hasAnyFlags(access, box.a, box.b, box.c, box.d, box.e, box.f, flags);
}
/**
*
* @param minX
* @param minY
* @param minZ
* @param maxX
* @param maxY
* @param maxZ
* @param flags Block flags (@see fr.neatmonster.nocheatplus.utilities.BlockProperties).
* @return If any block has the flags.
*/
public static final boolean hasAnyFlags(final IBlockAccess access, final double minX, double minY, final double minZ, final double maxX, final double maxY, final double maxZ, final long flags){
return hasAnyFlags(access, Location.locToBlock(minX), Location.locToBlock(minY), Location.locToBlock(minZ), Location.locToBlock(maxX), Location.locToBlock(maxY), Location.locToBlock(maxZ), flags);
}
/**
*
* @param minX
* @param minY
* @param minZ
* @param maxX
* @param maxY
* @param maxZ
* @param flags Block flags (@see fr.neatmonster.nocheatplus.utilities.BlockProperties).
* @return If any block has the flags.
*/
public static final boolean hasAnyFlags(final IBlockAccess access,final int minX, int minY, final int minZ, final int maxX, final int maxY, final int maxZ, final long flags){
for (int x = minX; x <= maxX; x++){
for (int z = minZ; z <= maxZ; z++){
for (int y = minY; y <= maxY; y++){
if ((BlockProperties.getBLockFlags(access.getTypeId(x, y, z)) & flags) != 0) return true;
}
}
}
return false;
}
/**
* Test if the box collide with any block that matches the flags somehow.
* @param box
* @param flags
* @return
*/
public static final boolean collides(final IBlockAccess access, final AxisAlignedBB box, final long flags){
return collides(access, box.a, box.b, box.c, box.d, box.e, box.f, flags);
}
/**
* Test if the box collide with any block that matches the flags somehow.
* @param minX
* @param minY
* @param minZ
* @param maxX
* @param maxY
* @param maxZ
* @param flags
* @return
*/
public static final boolean collides(final IBlockAccess access, final double minX, double minY, final double minZ, final double maxX, final double maxY, final double maxZ, final long flags){
for (int x = Location.locToBlock(minX); x <= Location.locToBlock(maxX); x++){
for (int z = Location.locToBlock(minZ); z <= Location.locToBlock(maxZ); z++){
for (int y = Location.locToBlock(minY); y <= Location.locToBlock(maxY); y++){
final int id = access.getTypeId(x, y, z);
if ((BlockProperties.getBLockFlags(id) & flags) != 0){
// Might collide.
final Block block = Block.byId[id];
block.updateShape(access, x, y, z);
if (minX > block.maxX + x || maxX < block.minX + x) continue;
else if (minY > block.maxY + y || maxY < block.minY + y) continue;
else if (minZ > block.maxZ + z || maxZ < block.minZ + z) continue;
return true;
}
}
}
}
return false;
}
public static final boolean isOnGround(final IBlockAccess access, final double minX, double minY, final double minZ, final double maxX, final double maxY, final double maxZ){
return collides(access, minX, minY, minZ, maxX, maxY, maxZ, F_SOLID);
}
} }

View File

@ -184,12 +184,7 @@ public class PlayerLocation {
if (inLava == null) { if (inLava == null) {
AxisAlignedBB boundingBoxLava = boundingBox.clone(); AxisAlignedBB boundingBoxLava = boundingBox.clone();
boundingBoxLava = boundingBoxLava.grow(-0.10000000149011612D, -0.40000000596046448D, -0.10000000149011612D); boundingBoxLava = boundingBoxLava.grow(-0.10000000149011612D, -0.40000000596046448D, -0.10000000149011612D);
if (idCache != null){ inLava = BlockProperties.collides(getBlockAccess(), boundingBoxLava, BlockProperties.F_LAVA);
inLava = idCache.collides(boundingBoxLava, BlockProperties.F_LAVA);
}
else{
inLava = worldServer.a(boundingBoxLava, net.minecraft.server.Material.LAVA);
}
} }
return inLava; return inLava;
} }
@ -204,12 +199,7 @@ public class PlayerLocation {
AxisAlignedBB boundingBoxWater = boundingBox.clone(); AxisAlignedBB boundingBoxWater = boundingBox.clone();
boundingBoxWater = boundingBoxWater.grow(0.0D, -0.40000000596046448D, 0.0D); boundingBoxWater = boundingBoxWater.grow(0.0D, -0.40000000596046448D, 0.0D);
boundingBoxWater = boundingBoxWater.shrink(0.001D, 0.001D, 0.001D); boundingBoxWater = boundingBoxWater.shrink(0.001D, 0.001D, 0.001D);
if (idCache !=null){ inWater = BlockProperties.collides(getBlockAccess(), boundingBoxWater, BlockProperties.F_WATER);
inWater = idCache.collides(boundingBoxWater, BlockProperties.F_WATER);
}
else{
inWater = worldServer.a(boundingBoxWater, net.minecraft.server.Material.WATER, entity);
}
} }
return inWater; return inWater;
} }
@ -254,41 +244,33 @@ public class PlayerLocation {
*/ */
public boolean isOnGround() { public boolean isOnGround() {
if (onGround == null) { if (onGround == null) {
if (idCache != null){ onGround = BlockProperties.isOnGround(getBlockAccess(), boundingBox.a, boundingBox.b - yOnGround, boundingBox.c, boundingBox.d, boundingBox.e, boundingBox.f);
onGround = idCache.collides(boundingBox.a, boundingBox.b - yOnGround, boundingBox.c, boundingBox.d, boundingBox.e, boundingBox.f, BlockProperties.F_SOLID); if (!onGround){
if (!onGround){ // TODO: Probably check other ids too before doing this ?
// TODO: Probably check other ids too before doing this ? // TODO: clean this up, use other checking method, detach it to blockproperties ?
// TODO: clean this up, use other checking method. double d0 = 0.25D;
double d0 = 0.25D; AxisAlignedBB axisalignedbb = boundingBox.clone();
AxisAlignedBB axisalignedbb = boundingBox.clone(); axisalignedbb = axisalignedbb.d(0D, -getyOnGround(), 0D);
axisalignedbb = axisalignedbb.d(0D, -getyOnGround(), 0D); @SuppressWarnings("rawtypes")
@SuppressWarnings("rawtypes") List list = worldServer.getEntities(entity, axisalignedbb.grow(d0, d0, d0));
List list = worldServer.getEntities(entity, axisalignedbb.grow(d0, d0, d0)); @SuppressWarnings("rawtypes")
@SuppressWarnings("rawtypes") Iterator iterator = list.iterator();
Iterator iterator = list.iterator(); while (iterator.hasNext()) {
while (iterator.hasNext()) { final Entity entity1 = (Entity) iterator.next();
final Entity entity1 = (Entity) iterator.next(); final EntityType type = entity.getBukkitEntity().getType();
final EntityType type = entity.getBukkitEntity().getType(); if (type != EntityType.BOAT && type != EntityType.MINECART) continue;
if (type != EntityType.BOAT && type != EntityType.MINECART) continue; AxisAlignedBB axisalignedbb1 = entity1.E();
AxisAlignedBB axisalignedbb1 = entity1.E(); if (axisalignedbb1 != null && axisalignedbb1.a(axisalignedbb)) {
if (axisalignedbb1 != null && axisalignedbb1.a(axisalignedbb)) { onGround = true;
onGround = true; return true;
return true; }
} axisalignedbb1 = entity.g(entity1);
axisalignedbb1 = entity.g(entity1); if (axisalignedbb1 != null && axisalignedbb1.a(axisalignedbb)) {
if (axisalignedbb1 != null && axisalignedbb1.a(axisalignedbb)) { onGround = true;
onGround = true; return true;
return true;
}
} }
} }
} }
else{
AxisAlignedBB boundingBoxGround = boundingBox.clone();
boundingBoxGround = boundingBoxGround.d(0D, -getyOnGround(), 0D);
onGround = worldServer.getCubes(entity, boundingBoxGround).size() > 0;
}
// TODO: Check for entities (boats etc.)
} }
return onGround; return onGround;
} }

View File

@ -3,13 +3,10 @@ package fr.neatmonster.nocheatplus.utilities;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import net.minecraft.server.AxisAlignedBB;
import net.minecraft.server.Block;
import net.minecraft.server.IBlockAccess; import net.minecraft.server.IBlockAccess;
import net.minecraft.server.Material; import net.minecraft.server.Material;
import net.minecraft.server.TileEntity; import net.minecraft.server.TileEntity;
import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.CraftWorld;
@ -136,95 +133,6 @@ public class TypeIdCache implements IBlockAccess{
dataMap.put(pos, nData); dataMap.put(pos, nData);
return nData; return nData;
} }
/**
*
* @param box
* @param flags Block flags (@see fr.neatmonster.nocheatplus.utilities.BlockProperties).
* @return If any block has the flags.
*/
public final boolean hasAnyFlags(final AxisAlignedBB box, final long flags){
return hasAnyFlags(box.a, box.b, box.c, box.d, box.e, box.f, flags);
}
/**
*
* @param minX
* @param minY
* @param minZ
* @param maxX
* @param maxY
* @param maxZ
* @param flags Block flags (@see fr.neatmonster.nocheatplus.utilities.BlockProperties).
* @return If any block has the flags.
*/
public final boolean hasAnyFlags(final double minX, double minY, final double minZ, final double maxX, final double maxY, final double maxZ, final long flags){
return hasAnyFlags(Location.locToBlock(minX), Location.locToBlock(minY), Location.locToBlock(minZ), Location.locToBlock(maxX), Location.locToBlock(maxY), Location.locToBlock(maxZ), flags);
}
/**
*
* @param minX
* @param minY
* @param minZ
* @param maxX
* @param maxY
* @param maxZ
* @param flags Block flags (@see fr.neatmonster.nocheatplus.utilities.BlockProperties).
* @return If any block has the flags.
*/
public final boolean hasAnyFlags(final int minX, int minY, final int minZ, final int maxX, final int maxY, final int maxZ, final long flags){
for (int x = minX; x <= maxX; x++){
for (int z = minZ; z <= maxZ; z++){
for (int y = minY; y <= maxY; y++){
if ((BlockProperties.getBLockFlags(getTypeId(x, y, z)) & flags) != 0) return true;
}
}
}
return false;
}
/**
* Test if the box collide with any block that matches the flags somehow.
* @param box
* @param flags
* @return
*/
public final boolean collides(final AxisAlignedBB box, final long flags){
return collides(box.a, box.b, box.c, box.d, box.e, box.f, flags);
}
/**
* Test if the box collide with any block that matches the flags somehow.
* @param minX
* @param minY
* @param minZ
* @param maxX
* @param maxY
* @param maxZ
* @param flags
* @return
*/
public final boolean collides(final double minX, double minY, final double minZ, final double maxX, final double maxY, final double maxZ, final long flags){
for (int x = Location.locToBlock(minX); x <= Location.locToBlock(maxX); x++){
for (int z = Location.locToBlock(minZ); z <= Location.locToBlock(maxZ); z++){
for (int y = Location.locToBlock(minY); y <= Location.locToBlock(maxY); y++){
final int id = getTypeId(x, y, z);
if ((BlockProperties.getBLockFlags(id) & flags) != 0){
// Might collide.
final Block block = Block.byId[id];
block.updateShape(this, x, y, z);
if (minX > block.maxX + x || maxX < block.minX + x) continue;
else if (minY > block.maxY + y || maxY < block.minY + y) continue;
else if (minZ > block.maxZ + z || maxZ < block.minZ + z) continue;
return true;
}
}
}
}
return false;
}
/** /**
* Not Optimized. * Not Optimized.