40310688ed
This is used for the code that determines where to come out of Limbo in. It tries to search from the top down to find a solid block to stand on. Isn't complete, though. This code does need some considerations put in, though... I'm concerned about Natura's clouds, for instance.
89 lines
2.3 KiB
Java
89 lines
2.3 KiB
Java
package StevenDimDoors.mod_pocketDim.helpers;
|
|
|
|
import StevenDimDoors.mod_pocketDim.LinkData;
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.block.material.Material;
|
|
import net.minecraft.world.World;
|
|
import net.minecraft.world.chunk.Chunk;
|
|
|
|
|
|
public class yCoordHelper
|
|
{
|
|
private static final int MAXIMUM_UNCOVERED_Y = 245;
|
|
|
|
public static int getFirstUncovered(LinkData pointerLink)
|
|
{
|
|
return yCoordHelper.getFirstUncovered(
|
|
pointerLink.destDimID,
|
|
pointerLink.destXCoord,
|
|
pointerLink.destYCoord,
|
|
pointerLink.destZCoord);
|
|
}
|
|
|
|
public static int getFirstUncovered(int worldID, int x, int yStart, int z)
|
|
{ return getFirstUncovered(worldID, x, yStart, z, false); }
|
|
|
|
public static int getFirstUncovered(int worldID, int x, int yStart, int z, boolean fromTop)
|
|
{
|
|
if (dimHelper.getWorld(worldID) == null ||
|
|
dimHelper.getWorld(worldID).provider == null)
|
|
{
|
|
dimHelper.initDimension(worldID);
|
|
}
|
|
|
|
return yCoordHelper.getFirstUncovered(dimHelper.getWorld(worldID), x, yStart, z, fromTop);
|
|
}
|
|
|
|
public static int getFirstUncovered(World world, int x, int yStart, int z)
|
|
{ return getFirstUncovered(world, x, yStart, z, false); }
|
|
|
|
public static int getFirstUncovered(World world, int x, int yStart, int z, boolean fromTop)
|
|
{
|
|
Chunk chunk = world.getChunkProvider().loadChunk(x >> 4, z >> 4);
|
|
|
|
int localX = x < 0 ? (x % 16) + 16 : (x % 16);
|
|
int localZ = z < 0 ? (z % 16) + 16 : (z % 16);
|
|
int height = MAXIMUM_UNCOVERED_Y; //world.getHeight();
|
|
int y;
|
|
|
|
if(!fromTop)
|
|
{
|
|
boolean covered = true;
|
|
for (y = yStart; y < height && covered; y++)
|
|
{
|
|
covered = IsCoveredBlock(chunk, localX, y - 1, localZ) || IsCoveredBlock(chunk, localX, y, localZ);
|
|
}
|
|
} else {
|
|
boolean covered = false;
|
|
for (y = MAXIMUM_UNCOVERED_Y; y > 1 && !covered; y--)
|
|
{
|
|
covered = IsCoveredBlock(chunk, localX, y - 1, localZ);
|
|
}
|
|
if (!covered) y = 63;
|
|
y++;
|
|
}
|
|
|
|
return y;
|
|
}
|
|
|
|
public static boolean IsCoveredBlock(Chunk chunk, int localX, int y, int localZ)
|
|
{
|
|
int blockID;
|
|
Block block;
|
|
Material material;
|
|
|
|
if (y < 0)
|
|
return false;
|
|
|
|
blockID = chunk.getBlockID(localX, y, localZ);
|
|
if (blockID == 0)
|
|
return false;
|
|
|
|
block = Block.blocksList[blockID];
|
|
if (block == null)
|
|
return false;
|
|
|
|
material = block.blockMaterial;
|
|
return (material.isLiquid() || !material.isReplaceable());
|
|
}
|
|
}
|