Skip to content

Instantly share code, notes, and snippets.

@IQAndreas
Last active December 19, 2015 15:29
Show Gist options
  • Save IQAndreas/5976815 to your computer and use it in GitHub Desktop.
Save IQAndreas/5976815 to your computer and use it in GitHub Desktop.
Snippet from MineCraft's BlockLeaves.java showing the leaf decay code.
/**
* Ticks the block if it's been scheduled
*/
public void updateTick(World world, int leafX, int leafY, int leafZ, Random random)
{
if (!world.isRemote)
{
int meta = world.getBlockMetadata(leafX, leafY, leafZ);
//If bit 0x8 is set, the leaves will be checked for decay.
//If bit 0x4 is set, the leaves are permanent and will never decay. This bit is set on player-placed leaf blocks.
if ((meta & 0x8) != 0 && (meta & 0x4) == 0)
{
byte radius1 = 4;
int radius2 = radius1 + 1;
byte var9 = 32;
int var10 = var9 * var9;
int var11 = var9 / 2;
if (this.adjacentTreeBlocks == null)
{
this.adjacentTreeBlocks = new int[var9 * var9 * var9];
}
if (world.checkChunksExist(leafX - radius2, leafY - radius2, leafZ - radius2, leafX + radius2, leafY + radius2, leafZ + radius2))
{
int offsetX;
int offsetY;
int offsetZ;
for (offsetX = -radius1; offsetX <= radius1; ++offsetX)
{
for (offsetY = -radius1; offsetY <= radius1; ++offsetY)
{
for (offsetZ = -radius1; offsetZ <= radius1; ++offsetZ)
{
int blockID = world.getBlockId(leafX + offsetX, leafY + offsetY, leafZ + offsetZ);
if (blockID == Block.wood.blockID)
{
this.adjacentTreeBlocks[(offsetX + var11) * var10 + (offsetY + var11) * var9 + offsetZ + var11] = 0;
}
else if (blockID == Block.leaves.blockID)
{
this.adjacentTreeBlocks[(offsetX + var11) * var10 + (offsetY + var11) * var9 + offsetZ + var11] = -2;
}
else
{
this.adjacentTreeBlocks[(offsetX + var11) * var10 + (offsetY + var11) * var9 + offsetZ + var11] = -1;
}
}
}
}
int var21;
for (var21 = 1; var21 <= 4; ++var21)
{
for (offsetX = -radius1; offsetX <= radius1; ++offsetX)
{
for (offsetY = -radius1; offsetY <= radius1; ++offsetY)
{
for (offsetZ = -radius1; offsetZ <= radius1; ++offsetZ)
{
if (this.adjacentTreeBlocks[(offsetX + var11) * var10 + (offsetY + var11) * var9 + offsetZ + var11] == var21 - 1)
{
if (this.adjacentTreeBlocks[(offsetX + var11 - 1) * var10 + (offsetY + var11) * var9 + offsetZ + var11] == -2)
{
this.adjacentTreeBlocks[(offsetX + var11 - 1) * var10 + (offsetY + var11) * var9 + offsetZ + var11] = var21;
}
if (this.adjacentTreeBlocks[(offsetX + var11 + 1) * var10 + (offsetY + var11) * var9 + offsetZ + var11] == -2)
{
this.adjacentTreeBlocks[(offsetX + var11 + 1) * var10 + (offsetY + var11) * var9 + offsetZ + var11] = var21;
}
if (this.adjacentTreeBlocks[(offsetX + var11) * var10 + (offsetY + var11 - 1) * var9 + offsetZ + var11] == -2)
{
this.adjacentTreeBlocks[(offsetX + var11) * var10 + (offsetY + var11 - 1) * var9 + offsetZ + var11] = var21;
}
if (this.adjacentTreeBlocks[(offsetX + var11) * var10 + (offsetY + var11 + 1) * var9 + offsetZ + var11] == -2)
{
this.adjacentTreeBlocks[(offsetX + var11) * var10 + (offsetY + var11 + 1) * var9 + offsetZ + var11] = var21;
}
if (this.adjacentTreeBlocks[(offsetX + var11) * var10 + (offsetY + var11) * var9 + (offsetZ + var11 - 1)] == -2)
{
this.adjacentTreeBlocks[(offsetX + var11) * var10 + (offsetY + var11) * var9 + (offsetZ + var11 - 1)] = var21;
}
if (this.adjacentTreeBlocks[(offsetX + var11) * var10 + (offsetY + var11) * var9 + offsetZ + var11 + 1] == -2)
{
this.adjacentTreeBlocks[(offsetX + var11) * var10 + (offsetY + var11) * var9 + offsetZ + var11 + 1] = var21;
}
}
}
}
}
}
}
var21 = this.adjacentTreeBlocks[var11 * var10 + var11 * var9 + var11];
if (var21 >= 0)
{
world.setBlockMetadata(leafX, leafY, leafZ, meta & -9);
}
else
{
this.removeLeaves(world, leafX, leafY, leafZ);
}
}
}
}
@IQAndreas
Copy link
Author

I'm getting a bit mixed up as to how the variables on lines 16-18 are used, though, they are definitely being used to create a three-dimensional out of a one-dimensional array.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment