Fix MaterialData directions being incorrect. Fixes BUKKIT-3160

Prior to 49690f9, BlockFaces were mostly correct in their respective
MaterialData classes. However, a lot of things were not updated since
implementation and broke without being addressed.

This fixes any discrepancies with Block data.

By: feildmaster <admin@feildmaster.com>
This commit is contained in:
Bukkit/Spigot
2012-12-15 23:25:19 -06:00
parent fb2cf30fbe
commit 87f538df31
9 changed files with 130 additions and 103 deletions

View File

@@ -39,21 +39,21 @@ public class Vine extends MaterialData {
byte data = 0;
if (faces.contains(BlockFace.WEST)) {
data |= VINE_NORTH;
}
if (faces.contains(BlockFace.NORTH)) {
data |= VINE_EAST;
}
if (faces.contains(BlockFace.SOUTH)) {
data |= VINE_WEST;
}
if (faces.contains(BlockFace.EAST)) {
if (faces.contains(BlockFace.NORTH)) {
data |= VINE_NORTH;
}
if (faces.contains(BlockFace.SOUTH)) {
data |= VINE_SOUTH;
}
if (faces.contains(BlockFace.EAST)) {
data |= VINE_EAST;
}
setData(data);
}
@@ -67,21 +67,21 @@ public class Vine extends MaterialData {
public boolean isOnFace(BlockFace face) {
switch (face) {
case WEST:
return (getData() & VINE_NORTH) > 0;
return (getData() & VINE_WEST) == VINE_WEST;
case NORTH:
return (getData() & VINE_EAST) > 0;
return (getData() & VINE_NORTH) == VINE_NORTH;
case SOUTH:
return (getData() & VINE_WEST) > 0;
return (getData() & VINE_SOUTH) == VINE_SOUTH;
case EAST:
return (getData() & VINE_SOUTH) > 0;
return (getData() & VINE_EAST) == VINE_EAST;
case NORTH_EAST:
return isOnFace(BlockFace.WEST) && isOnFace(BlockFace.NORTH);
case NORTH_WEST:
return isOnFace(BlockFace.WEST) && isOnFace(BlockFace.SOUTH);
case SOUTH_EAST:
return isOnFace(BlockFace.EAST) && isOnFace(BlockFace.NORTH);
case SOUTH_WEST:
case NORTH_WEST:
return isOnFace(BlockFace.WEST) && isOnFace(BlockFace.NORTH);
case SOUTH_EAST:
return isOnFace(BlockFace.EAST) && isOnFace(BlockFace.SOUTH);
case SOUTH_WEST:
return isOnFace(BlockFace.WEST) && isOnFace(BlockFace.SOUTH);
case UP: // It's impossible to be accurate with this since it's contextual
return true;
default:
@@ -97,30 +97,30 @@ public class Vine extends MaterialData {
public void putOnFace(BlockFace face) {
switch(face) {
case WEST:
setData((byte) (getData() | VINE_NORTH));
break;
case NORTH:
setData((byte) (getData() | VINE_EAST));
break;
case SOUTH:
setData((byte) (getData() | VINE_WEST));
break;
case EAST:
case NORTH:
setData((byte) (getData() | VINE_NORTH));
break;
case SOUTH:
setData((byte) (getData() | VINE_SOUTH));
break;
case NORTH_EAST:
putOnFace(BlockFace.WEST);
putOnFace(BlockFace.NORTH);
case EAST:
setData((byte) (getData() | VINE_EAST));
break;
case NORTH_WEST:
putOnFace(BlockFace.WEST);
putOnFace(BlockFace.SOUTH);
break;
case SOUTH_EAST:
putOnFace(BlockFace.EAST);
putOnFace(BlockFace.NORTH);
break;
case SOUTH_WEST:
putOnFace(BlockFace.WEST);
putOnFace(BlockFace.SOUTH);
break;
case NORTH_EAST:
putOnFace(BlockFace.EAST);
putOnFace(BlockFace.NORTH);
break;
case SOUTH_EAST:
putOnFace(BlockFace.EAST);
putOnFace(BlockFace.SOUTH);
break;
@@ -139,30 +139,30 @@ public class Vine extends MaterialData {
public void removeFromFace(BlockFace face) {
switch(face) {
case WEST:
setData((byte) (getData() &~ VINE_NORTH));
setData((byte) (getData() & ~VINE_WEST));
break;
case NORTH:
setData((byte) (getData() &~ VINE_EAST));
setData((byte) (getData() & ~VINE_NORTH));
break;
case SOUTH:
setData((byte) (getData() &~ VINE_WEST));
setData((byte) (getData() & ~VINE_SOUTH));
break;
case EAST:
setData((byte) (getData() &~ VINE_SOUTH));
break;
case NORTH_EAST:
removeFromFace(BlockFace.WEST);
removeFromFace(BlockFace.NORTH);
setData((byte) (getData() & ~VINE_EAST));
break;
case NORTH_WEST:
removeFromFace(BlockFace.WEST);
removeFromFace(BlockFace.SOUTH);
break;
case SOUTH_EAST:
removeFromFace(BlockFace.EAST);
removeFromFace(BlockFace.NORTH);
break;
case SOUTH_WEST:
removeFromFace(BlockFace.WEST);
removeFromFace(BlockFace.SOUTH);
break;
case NORTH_EAST:
removeFromFace(BlockFace.EAST);
removeFromFace(BlockFace.NORTH);
break;
case SOUTH_EAST:
removeFromFace(BlockFace.EAST);
removeFromFace(BlockFace.SOUTH);
break;