Last active
December 19, 2015 15:29
-
-
Save IQAndreas/5976815 to your computer and use it in GitHub Desktop.
Snippet from MineCraft's BlockLeaves.java showing the leaf decay code.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.