Fixed NullPointerException in yCoordHelper
I believe I've fixed the cause of a NullPointerException that some players have been experiencing. It seems to have been caused by unregistered block IDs being present in Limbo. Possibly because people removed mods and they had generated structures in Limbo. Or the players had placed blocks and then removed the mods, or changed block IDs around. This fixes issue #47.
This commit is contained in:
parent
7044d80457
commit
eb9c8822d9
1 changed files with 48 additions and 43 deletions
|
@ -2,66 +2,71 @@ 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);
|
||||
return yCoordHelper.getFirstUncovered(
|
||||
pointerLink.destDimID,
|
||||
pointerLink.destXCoord,
|
||||
pointerLink.destYCoord,
|
||||
pointerLink.destZCoord);
|
||||
}
|
||||
|
||||
public static int getFirstUncovered(int worldID, int x, int yStart, int z)
|
||||
{
|
||||
if(dimHelper.getWorld(worldID)==null||dimHelper.getWorld(worldID).provider==null)
|
||||
if (dimHelper.getWorld(worldID) == null ||
|
||||
dimHelper.getWorld(worldID).provider == null)
|
||||
{
|
||||
dimHelper.initDimension(worldID);
|
||||
}
|
||||
|
||||
return yCoordHelper.getFirstUncovered(dimHelper.getWorld(worldID),x,yStart,z);
|
||||
return yCoordHelper.getFirstUncovered(dimHelper.getWorld(worldID), x, yStart, z);
|
||||
}
|
||||
|
||||
public static int getFirstUncovered(World world, int x, int yStart, int z)
|
||||
{
|
||||
int yCoord=yStart;
|
||||
|
||||
Chunk chunk = world.getChunkProvider().loadChunk(x >> 4, z >> 4);
|
||||
|
||||
int xC=(x % 16)< 0 ? (x % 16)+16 : (x % 16);
|
||||
int yC=yCoord;
|
||||
int zC=(z % 16)< 0 ? (z % 16)+16 : (z % 16);
|
||||
|
||||
|
||||
boolean flag=false;
|
||||
|
||||
do
|
||||
{
|
||||
flag=false;
|
||||
if(yC>0&&chunk.getBlockID(xC, yC-1, zC)!=0)
|
||||
{
|
||||
if(!Block.blocksList[chunk.getBlockID(xC, yC-1, zC)].blockMaterial.isReplaceable()||Block.blocksList[chunk.getBlockID(xC, yC-1, zC)].blockMaterial.isLiquid())
|
||||
{
|
||||
|
||||
flag=true;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if(yC>0&&chunk.getBlockID(xC, yC, zC)!=0)
|
||||
{
|
||||
if(!Block.blocksList[chunk.getBlockID(xC, yC, zC)].blockMaterial.isReplaceable()||Block.blocksList[chunk.getBlockID(xC, yC, zC)].blockMaterial.isLiquid())
|
||||
{
|
||||
|
||||
flag=true;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
yC++;
|
||||
}
|
||||
while(flag&&yC<245);
|
||||
|
||||
|
||||
return yC-1;
|
||||
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;
|
||||
|
||||
boolean covered = true;
|
||||
for (y = yStart; y < height && covered; y++)
|
||||
{
|
||||
covered = IsCoveredBlock(chunk, localX, y - 1, localZ) || IsCoveredBlock(chunk, localX, y, localZ);
|
||||
}
|
||||
|
||||
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());
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue