Add onNeighborTileChange callback to block by generalizing func_96440_m to all blocks rather than just comparators.

This commit is contained in:
Chicken Bones 2013-07-17 04:42:45 +10:00
parent 380c4ad2da
commit 5d5d4cb448
3 changed files with 133 additions and 31 deletions

View File

@ -167,7 +167,7 @@
}
/**
@@ -1454,4 +1477,952 @@
@@ -1454,4 +1477,974 @@
canBlockGrass[0] = true;
StatList.initBreakableStats();
}
@ -1118,5 +1118,27 @@
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Called when a tile entity on a side of this block changes is created or is destroyed.
+ * @param world The world
+ * @param x The x position of this block instance
+ * @param y The y position of this block instance
+ * @param z The z position of this block instance
+ * @param tileX The x position of the tile that changed
+ * @param tileY The y position of the tile that changed
+ * @param tileZ The z position of the tile that changed
+ */
+ public void onNeighborTileChange(World world, int x, int y, int z, int tileX, int tileY, int tileZ)
+ {
+ }
+
+ /**
+ * @return true if this block is to be notified of TileEntity changes directly through one solid block like comparators
+ */
+ public boolean weakTileChanges()
+ {
+ return false;
+ }
}

View File

@ -0,0 +1,20 @@
--- ../src_base/minecraft/net/minecraft/block/BlockComparator.java
+++ ../src_work/minecraft/net/minecraft/block/BlockComparator.java
@@ -266,4 +266,17 @@
{
return new TileEntityComparator();
}
+
+ @Override
+ public void onNeighborTileChange(World world, int x, int y, int z, int tileX, int tileY, int tileZ)
+ {
+ if(y == tileY)
+ onNeighborBlockChange(world, x, y, z, world.getBlockId(tileX, tileY, tileZ));
+ }
+
+ @Override
+ public boolean weakTileChanges()
+ {
+ return true;
+ }
}

View File

@ -446,7 +446,7 @@
while (iterator.hasNext())
{
TileEntity tileentity1 = (TileEntity)iterator.next();
@@ -2762,19 +2908,18 @@
@@ -2762,20 +2908,21 @@
iterator.remove();
}
}
@ -464,6 +464,7 @@
- chunk.setChunkBlockTileEntity(par1 & 15, par2, par3 & 15, par4TileEntity);
- }
- }
- }
+ loadedTileEntityList.add(par4TileEntity);
+ }
+ }
@ -472,10 +473,13 @@
+ if (chunk != null)
+ {
+ chunk.setChunkBlockTileEntity(par1 & 15, par2, par3 & 15, par4TileEntity);
}
+ }
+ //notify tile changes
+ func_96440_m(par1, par2, par3, 0);
}
@@ -2783,27 +2928,10 @@
/**
@@ -2783,28 +2930,13 @@
*/
public void removeBlockTileEntity(int par1, int par2, int par3)
{
@ -500,14 +504,18 @@
- {
- chunk.removeChunkBlockTileEntity(par1 & 15, par2, par3 & 15);
- }
- }
+ Chunk chunk = getChunkFromChunkCoords(par1 >> 4, par3 >> 4);
+ if (chunk != null)
+ {
+ chunk.removeChunkBlockTileEntity(par1 & 15, par2, par3 & 15);
}
+ }
+ //notify tile changes
+ func_96440_m(par1, par2, par3, 0);
}
@@ -2829,7 +2957,8 @@
/**
@@ -2829,7 +2961,8 @@
*/
public boolean isBlockNormalCube(int par1, int par2, int par3)
{
@ -517,7 +525,7 @@
}
public boolean isBlockFullCube(int par1, int par2, int par3)
@@ -2852,16 +2981,17 @@
@@ -2852,16 +2985,17 @@
*/
public boolean doesBlockHaveSolidTopSurface(int par1, int par2, int par3)
{
@ -537,7 +545,7 @@
return par1Block == null ? false : (par1Block.blockMaterial.isOpaque() && par1Block.renderAsNormalBlock() ? true : (par1Block instanceof BlockStairs ? (par2 & 4) == 4 : (par1Block instanceof BlockHalfSlab ? (par2 & 8) == 8 : (par1Block instanceof BlockHopper ? true : (par1Block instanceof BlockSnow ? (par2 & 7) == 7 : false)))));
}
@@ -2878,7 +3008,7 @@
@@ -2878,7 +3012,7 @@
if (chunk != null && !chunk.isEmpty())
{
Block block = Block.blocksList[this.getBlockId(par1, par2, par3)];
@ -546,7 +554,7 @@
}
else
{
@@ -2909,8 +3039,7 @@
@@ -2909,8 +3043,7 @@
*/
public void setAllowedSpawnTypes(boolean par1, boolean par2)
{
@ -556,7 +564,7 @@
}
/**
@@ -2926,6 +3055,11 @@
@@ -2926,6 +3059,11 @@
*/
private void calculateInitialWeather()
{
@ -568,7 +576,7 @@
if (this.worldInfo.isRaining())
{
this.rainingStrength = 1.0F;
@@ -2941,6 +3075,11 @@
@@ -2941,6 +3079,11 @@
* Updates all weather states.
*/
protected void updateWeather()
@ -580,7 +588,7 @@
{
if (!this.provider.hasNoSky)
{
@@ -3038,12 +3177,14 @@
@@ -3038,12 +3181,14 @@
public void toggleRain()
{
@ -596,7 +604,7 @@
this.theProfiler.startSection("buildList");
int i;
EntityPlayer entityplayer;
@@ -3150,6 +3291,11 @@
@@ -3150,6 +3295,11 @@
*/
public boolean canBlockFreeze(int par1, int par2, int par3, boolean par4)
{
@ -608,7 +616,7 @@
BiomeGenBase biomegenbase = this.getBiomeGenForCoords(par1, par3);
float f = biomegenbase.getFloatTemperature();
@@ -3208,6 +3354,11 @@
@@ -3208,6 +3358,11 @@
*/
public boolean canSnowAt(int par1, int par2, int par3)
{
@ -620,7 +628,7 @@
BiomeGenBase biomegenbase = this.getBiomeGenForCoords(par1, par3);
float f = biomegenbase.getFloatTemperature();
@@ -3251,10 +3402,12 @@
@@ -3251,10 +3406,12 @@
else
{
int l = this.getBlockId(par1, par2, par3);
@ -637,7 +645,7 @@
{
j1 = 1;
}
@@ -3350,7 +3503,9 @@
@@ -3350,7 +3507,9 @@
int j4 = i2 + Facing.offsetsXForSide[i4];
int k4 = j2 + Facing.offsetsYForSide[i4];
int l4 = k2 + Facing.offsetsZForSide[i4];
@ -648,7 +656,7 @@
i3 = this.getSavedLightValue(par1EnumSkyBlock, j4, k4, l4);
if (i3 == l2 - i5 && i1 < this.lightUpdateBlockList.length)
@@ -3453,10 +3608,10 @@
@@ -3453,10 +3612,10 @@
public List getEntitiesWithinAABBExcludingEntity(Entity par1Entity, AxisAlignedBB par2AxisAlignedBB, IEntitySelector par3IEntitySelector)
{
ArrayList arraylist = new ArrayList();
@ -663,7 +671,7 @@
for (int i1 = i; i1 <= j; ++i1)
{
@@ -3482,10 +3637,10 @@
@@ -3482,10 +3641,10 @@
public List selectEntitiesWithinAABB(Class par1Class, AxisAlignedBB par2AxisAlignedBB, IEntitySelector par3IEntitySelector)
{
@ -678,7 +686,7 @@
ArrayList arraylist = new ArrayList();
for (int i1 = i; i1 <= j; ++i1)
@@ -3578,11 +3733,14 @@
@@ -3578,11 +3737,14 @@
*/
public void addLoadedEntities(List par1List)
{
@ -696,7 +704,7 @@
}
}
@@ -3616,6 +3774,11 @@
@@ -3616,6 +3778,11 @@
else
{
if (block != null && (block == Block.waterMoving || block == Block.waterStill || block == Block.lavaMoving || block == Block.lavaStill || block == Block.fire || block.blockMaterial.isReplaceable()))
@ -708,7 +716,7 @@
{
block = null;
}
@@ -3910,7 +4073,7 @@
@@ -3910,7 +4077,7 @@
*/
public long getSeed()
{
@ -717,7 +725,7 @@
}
public long getTotalWorldTime()
@@ -3920,7 +4083,7 @@
@@ -3920,7 +4087,7 @@
public long getWorldTime()
{
@ -726,7 +734,7 @@
}
/**
@@ -3928,7 +4091,7 @@
@@ -3928,7 +4095,7 @@
*/
public void setWorldTime(long par1)
{
@ -735,7 +743,7 @@
}
/**
@@ -3936,13 +4099,13 @@
@@ -3936,13 +4103,13 @@
*/
public ChunkCoordinates getSpawnPoint()
{
@ -751,7 +759,7 @@
}
@SideOnly(Side.CLIENT)
@@ -3966,7 +4129,10 @@
@@ -3966,7 +4133,10 @@
if (!this.loadedEntityList.contains(par1Entity))
{
@ -763,7 +771,7 @@
}
}
@@ -3974,6 +4140,11 @@
@@ -3974,6 +4144,11 @@
* Called when checking if a certain block can be mined or not. The 'spawn safe zone' check is located here.
*/
public boolean canMineBlock(EntityPlayer par1EntityPlayer, int par2, int par3, int par4)
@ -775,7 +783,7 @@
{
return true;
}
@@ -4094,8 +4265,7 @@
@@ -4094,8 +4269,7 @@
*/
public boolean isBlockHighHumidity(int par1, int par2, int par3)
{
@ -785,7 +793,7 @@
}
/**
@@ -4170,7 +4340,7 @@
@@ -4170,7 +4344,7 @@
*/
public int getHeight()
{
@ -794,7 +802,7 @@
}
/**
@@ -4178,7 +4348,7 @@
@@ -4178,7 +4352,7 @@
*/
public int getActualHeight()
{
@ -803,7 +811,7 @@
}
public IUpdatePlayerListBox func_82735_a(EntityMinecart par1EntityMinecart)
@@ -4221,7 +4391,7 @@
@@ -4221,7 +4395,7 @@
*/
public double getHorizon()
{
@ -812,7 +820,59 @@
}
/**
@@ -4349,4 +4519,115 @@
@@ -4290,30 +4464,28 @@
public void func_96440_m(int par1, int par2, int par3, int par4)
{
- for (int i1 = 0; i1 < 4; ++i1)
- {
- int j1 = par1 + Direction.offsetX[i1];
- int k1 = par3 + Direction.offsetZ[i1];
- int l1 = this.getBlockId(j1, par2, k1);
-
- if (l1 != 0)
- {
- Block block = Block.blocksList[l1];
-
- if (Block.redstoneComparatorIdle.func_94487_f(l1))
- {
- block.onNeighborBlockChange(this, j1, par2, k1, par4);
- }
- else if (Block.isNormalCube(l1))
- {
- j1 += Direction.offsetX[i1];
- k1 += Direction.offsetZ[i1];
- l1 = this.getBlockId(j1, par2, k1);
+ for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
+ {
+ int j1 = par1 + dir.offsetX;
+ int y = par2 + dir.offsetY;
+ int k1 = par3 + dir.offsetZ;
+ int l1 = getBlockId(j1, y, k1);
+ Block block = Block.blocksList[l1];
+
+ if(block != null)
+ {
+ block.onNeighborTileChange(this, j1, y, k1, par1, par2, par3);
+
+ if(Block.isNormalCube(l1))
+ {
+ j1 += dir.offsetX;
+ y += dir.offsetY;
+ k1 += dir.offsetZ;
+ l1 = getBlockId(j1, y, k1);
block = Block.blocksList[l1];
-
- if (Block.redstoneComparatorIdle.func_94487_f(l1))
- {
- block.onNeighborBlockChange(this, j1, par2, k1, par4);
+ if(block != null && block.weakTileChanges())
+ {
+ block.onNeighborTileChange(this, j1, y, k1, par1, par2, par3);
}
}
}
@@ -4349,4 +4521,115 @@
return MathHelper.clamp_float(f, 0.0F, flag ? 1.5F : 1.0F);
}