Completed Unsafe Exit Teleportation
Completed the code in yCoordHelper for choosing a point to drop the player when using a Transdimensional Trapdoor. Made changes to DDTeleporter so that the player can be dropped at the specific point we want. This needs further testing, though, since I'm not completely sure it's working right.
This commit is contained in:
parent
7dbc6896b1
commit
027b329af8
2 changed files with 34 additions and 42 deletions
|
@ -75,7 +75,7 @@ public class DDTeleporter
|
||||||
player.setPositionAndUpdate(x + 0.5, y - 1, z + 1.5);
|
player.setPositionAndUpdate(x + 0.5, y - 1, z + 1.5);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
player.setPositionAndUpdate(x, y - 1, z);
|
player.setPositionAndUpdate(x + 0.5, y - 1, z + 0.5);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -108,7 +108,8 @@ public class DDTeleporter
|
||||||
entity.worldObj.updateEntityWithOptionalForce(entity, false);
|
entity.worldObj.updateEntityWithOptionalForce(entity, false);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DDTeleporter.setEntityPosition(entity, x, y, z);
|
DDTeleporter.setEntityPosition(entity, x + 0.5, y, z + 0.5);
|
||||||
|
entity.worldObj.updateEntityWithOptionalForce(entity, false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -129,7 +130,7 @@ public class DDTeleporter
|
||||||
setEntityPosition(entity, x + 0.5, y, z + 1.5);
|
setEntityPosition(entity, x + 0.5, y, z + 1.5);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
setEntityPosition(entity, x, y, z);
|
setEntityPosition(entity, x + 0.5, y, z + 0.5);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -455,10 +456,10 @@ public class DDTeleporter
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Point3D destination = yCoordHelper.findDropPoint(world, source.getX(), source.getY(), source.getZ());
|
Point3D destination = yCoordHelper.findDropPoint(world, source.getX(), source.getY() + 1, source.getZ());
|
||||||
if (destination != null)
|
if (destination != null)
|
||||||
{
|
{
|
||||||
current.root().setDestination(link, source.getX(), source.getY(), source.getZ());
|
current.root().setDestination(link, destination.getX(), destination.getY(), destination.getZ());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -218,10 +218,12 @@ public class yCoordHelper
|
||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Point3D findDropPoint(World world, int x, int y, int z)
|
public static Point3D findDropPoint(World world, int x, int startY, int z)
|
||||||
{
|
{
|
||||||
/*// Find a simple 2-block-high air gap
|
// Find a simple 2-block-high air gap
|
||||||
// Search across a 3x3 column
|
// Search across a 3x3 column
|
||||||
|
final int GAP_HEIGHT = 2;
|
||||||
|
|
||||||
int localX = x < 0 ? (x % 16) + 16 : (x % 16);
|
int localX = x < 0 ? (x % 16) + 16 : (x % 16);
|
||||||
int localZ = z < 0 ? (z % 16) + 16 : (z % 16);
|
int localZ = z < 0 ? (z % 16) + 16 : (z % 16);
|
||||||
int cornerX = x - localX;
|
int cornerX = x - localX;
|
||||||
|
@ -231,56 +233,45 @@ public class yCoordHelper
|
||||||
|
|
||||||
Chunk chunk = initializeChunkArea(world, x >> 4, z >> 4);
|
Chunk chunk = initializeChunkArea(world, x >> 4, z >> 4);
|
||||||
|
|
||||||
|
int y, dx, dz, index;
|
||||||
int height = world.getActualHeight();
|
int height = world.getActualHeight();
|
||||||
int y, dx, dz, blockID;
|
int[] gaps = new int[9];
|
||||||
boolean isSafe;
|
|
||||||
boolean hasBlocks;
|
|
||||||
Block block;
|
|
||||||
int layers = 0;
|
|
||||||
|
|
||||||
// Check if a 3x3 layer of blocks is empty
|
// Check 3x3 layers of blocks for air spaces
|
||||||
// If we find a layer that contains replaceable blocks, it can
|
for (y = Math.min(startY, height - 1); y > 0; y--)
|
||||||
// serve as the base where we'll place the player and door.
|
|
||||||
for (y = Math.min(startY + 2, height - 1); y >= 0; y--)
|
|
||||||
{
|
{
|
||||||
isSafe = true;
|
for (dx = -1, index = 0; dx <= 1; dx++)
|
||||||
hasBlocks = false;
|
|
||||||
for (dx = -1; dx <= 1 && isSafe; dx++)
|
|
||||||
{
|
{
|
||||||
for (dz = -1; dz <= 1 && isSafe; dz++)
|
for (dz = -1; dz <= 1; dz++, index++)
|
||||||
{
|
{
|
||||||
blockID = chunk.getBlockID(localX + dx, y, localZ + dz);
|
if (chunk.getBlockID(localX + dx, y, localZ + dz) != 0)
|
||||||
if (blockID != 0)
|
{
|
||||||
{
|
gaps[index] = 0;
|
||||||
block = Block.blocksList[blockID];
|
}
|
||||||
if (!block.blockMaterial.isReplaceable())
|
else
|
||||||
{
|
{
|
||||||
if (layers >= 3)
|
gaps[index]++;
|
||||||
{
|
|
||||||
return new Point3D(localX + cornerX, y + 1, localZ + cornerZ);
|
|
||||||
}
|
|
||||||
isSafe = false;
|
|
||||||
}
|
|
||||||
hasBlocks = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isSafe)
|
// Check if an acceptable gap exists in the center of the search column
|
||||||
|
if (gaps[index / 2] == GAP_HEIGHT)
|
||||||
{
|
{
|
||||||
layers++;
|
return new Point3D(localX + cornerX, y + GAP_HEIGHT - 1, localZ + cornerZ);
|
||||||
if (hasBlocks)
|
}
|
||||||
|
// Check the other positions in the column
|
||||||
|
for (dx = -1, index = 0; dx <= 1; dx++)
|
||||||
|
{
|
||||||
|
for (dz = -1; dz <= 1; dz++, index++)
|
||||||
{
|
{
|
||||||
if (layers >= 3)
|
if (gaps[index] == GAP_HEIGHT)
|
||||||
{
|
{
|
||||||
return new Point3D(localX + cornerX, y, localZ + cornerZ);
|
return new Point3D(localX + cornerX + dx, y + GAP_HEIGHT - 1, localZ + cornerZ + dz);
|
||||||
}
|
}
|
||||||
layers = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;*/
|
return null;
|
||||||
// Temporary measure to not break the build
|
|
||||||
return new Point3D(x, y - 2, z);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int adjustDestinationY(int y, int worldHeight, int entranceY, int dungeonHeight)
|
public static int adjustDestinationY(int y, int worldHeight, int entranceY, int dungeonHeight)
|
||||||
|
|
Loading…
Reference in a new issue