c3e23b87bc
It fixed shears not being damaged when used on leaves. Still have no idea why they don't drop instantly when using shears.
305 lines
12 KiB
Java
305 lines
12 KiB
Java
package tdwp_ftw.biomesop.blocks;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Random;
|
|
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.block.BlockLeavesBase;
|
|
import net.minecraft.block.material.Material;
|
|
import net.minecraft.client.renderer.texture.IconRegister;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.util.Icon;
|
|
import net.minecraft.world.IBlockAccess;
|
|
import net.minecraft.world.World;
|
|
import net.minecraftforge.common.IShearable;
|
|
import tdwp_ftw.biomesop.mod_BiomesOPlenty;
|
|
import tdwp_ftw.biomesop.declarations.BOPBlocks;
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
|
|
public class BlockOriginLeaves extends BlockLeavesBase implements IShearable
|
|
{
|
|
/**
|
|
* The base index in terrain.png corresponding to the fancy version of the leaf texture. This is stored so we can
|
|
* switch the displayed version between fancy and fast graphics (fast is this index + 1).
|
|
*/
|
|
private int baseIndexInPNG;
|
|
public static final String[] LEAF_TYPES = new String[] {"origin"};
|
|
int[] adjacentTreeBlocks;
|
|
private Icon[] blockIcon = new Icon[2];
|
|
|
|
public BlockOriginLeaves(int par1)
|
|
{
|
|
super(par1, Material.leaves, false);
|
|
this.setTickRandomly(true);
|
|
this.setBurnProperties(this.blockID, 30, 60);
|
|
this.setCreativeTab(mod_BiomesOPlenty.tabBiomesOPlenty);
|
|
}
|
|
|
|
@Override
|
|
@SideOnly(Side.CLIENT)
|
|
public void registerIcons(IconRegister par1IconRegister)
|
|
{
|
|
this.blockIcon[0] = par1IconRegister.registerIcon("BiomesOPlenty:originleaves1");
|
|
this.blockIcon[1] = par1IconRegister.registerIcon("BiomesOPlenty:originleaves2");
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public Icon getBlockTextureFromSideAndMetadata(int par1, int par2)
|
|
{
|
|
return blockIcon[(!isOpaqueCube() ? 0 : 1)];
|
|
}
|
|
|
|
/**
|
|
* ejects contained items into the world, and notifies neighbours of an update, as appropriate
|
|
*/
|
|
public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6)
|
|
{
|
|
byte var7 = 1;
|
|
int var8 = var7 + 1;
|
|
|
|
if (par1World.checkChunksExist(par2 - var8, par3 - var8, par4 - var8, par2 + var8, par3 + var8, par4 + var8))
|
|
{
|
|
for (int var9 = -var7; var9 <= var7; ++var9)
|
|
{
|
|
for (int var10 = -var7; var10 <= var7; ++var10)
|
|
{
|
|
for (int var11 = -var7; var11 <= var7; ++var11)
|
|
{
|
|
int var12 = par1World.getBlockId(par2 + var9, par3 + var10, par4 + var11);
|
|
|
|
if (var12 == BOPBlocks.originLeaves.blockID)
|
|
{
|
|
int var13 = par1World.getBlockMetadata(par2 + var9, par3 + var10, par4 + var11);
|
|
par1World.setBlockMetadataWithNotify(par2 + var9, par3 + var10, par4 + var11, var13 | 8, 2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Ticks the block if it's been scheduled
|
|
*/
|
|
public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random)
|
|
{
|
|
if (!par1World.isRemote)
|
|
{
|
|
int var6 = par1World.getBlockMetadata(par2, par3, par4);
|
|
|
|
if ((var6 & 8) != 0 && (var6 & 4) == 0)
|
|
{
|
|
byte var7 = 4;
|
|
int var8 = var7 + 1;
|
|
byte var9 = 32;
|
|
int var10 = var9 * var9;
|
|
int var11 = var9 / 2;
|
|
|
|
if (this.adjacentTreeBlocks == null)
|
|
{
|
|
this.adjacentTreeBlocks = new int[var9 * var9 * var9];
|
|
}
|
|
|
|
int var12;
|
|
|
|
if (par1World.checkChunksExist(par2 - var8, par3 - var8, par4 - var8, par2 + var8, par3 + var8, par4 + var8))
|
|
{
|
|
int var13;
|
|
int var14;
|
|
int var15;
|
|
|
|
for (var12 = -var7; var12 <= var7; ++var12)
|
|
{
|
|
for (var13 = -var7; var13 <= var7; ++var13)
|
|
{
|
|
for (var14 = -var7; var14 <= var7; ++var14)
|
|
{
|
|
var15 = par1World.getBlockId(par2 + var12, par3 + var13, par4 + var14);
|
|
|
|
if (var15 == Block.wood.blockID)
|
|
{
|
|
this.adjacentTreeBlocks[(var12 + var11) * var10 + (var13 + var11) * var9 + var14 + var11] = 0;
|
|
}
|
|
else if (var15 == BOPBlocks.originLeaves.blockID)
|
|
{
|
|
this.adjacentTreeBlocks[(var12 + var11) * var10 + (var13 + var11) * var9 + var14 + var11] = -2;
|
|
}
|
|
else
|
|
{
|
|
this.adjacentTreeBlocks[(var12 + var11) * var10 + (var13 + var11) * var9 + var14 + var11] = -1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (var12 = 1; var12 <= 4; ++var12)
|
|
{
|
|
for (var13 = -var7; var13 <= var7; ++var13)
|
|
{
|
|
for (var14 = -var7; var14 <= var7; ++var14)
|
|
{
|
|
for (var15 = -var7; var15 <= var7; ++var15)
|
|
{
|
|
if (this.adjacentTreeBlocks[(var13 + var11) * var10 + (var14 + var11) * var9 + var15 + var11] == var12 - 1)
|
|
{
|
|
if (this.adjacentTreeBlocks[(var13 + var11 - 1) * var10 + (var14 + var11) * var9 + var15 + var11] == -2)
|
|
{
|
|
this.adjacentTreeBlocks[(var13 + var11 - 1) * var10 + (var14 + var11) * var9 + var15 + var11] = var12;
|
|
}
|
|
|
|
if (this.adjacentTreeBlocks[(var13 + var11 + 1) * var10 + (var14 + var11) * var9 + var15 + var11] == -2)
|
|
{
|
|
this.adjacentTreeBlocks[(var13 + var11 + 1) * var10 + (var14 + var11) * var9 + var15 + var11] = var12;
|
|
}
|
|
|
|
if (this.adjacentTreeBlocks[(var13 + var11) * var10 + (var14 + var11 - 1) * var9 + var15 + var11] == -2)
|
|
{
|
|
this.adjacentTreeBlocks[(var13 + var11) * var10 + (var14 + var11 - 1) * var9 + var15 + var11] = var12;
|
|
}
|
|
|
|
if (this.adjacentTreeBlocks[(var13 + var11) * var10 + (var14 + var11 + 1) * var9 + var15 + var11] == -2)
|
|
{
|
|
this.adjacentTreeBlocks[(var13 + var11) * var10 + (var14 + var11 + 1) * var9 + var15 + var11] = var12;
|
|
}
|
|
|
|
if (this.adjacentTreeBlocks[(var13 + var11) * var10 + (var14 + var11) * var9 + (var15 + var11 - 1)] == -2)
|
|
{
|
|
this.adjacentTreeBlocks[(var13 + var11) * var10 + (var14 + var11) * var9 + (var15 + var11 - 1)] = var12;
|
|
}
|
|
|
|
if (this.adjacentTreeBlocks[(var13 + var11) * var10 + (var14 + var11) * var9 + var15 + var11 + 1] == -2)
|
|
{
|
|
this.adjacentTreeBlocks[(var13 + var11) * var10 + (var14 + var11) * var9 + var15 + var11 + 1] = var12;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
var12 = this.adjacentTreeBlocks[var11 * var10 + var11 * var9 + var11];
|
|
|
|
if (var12 >= 0)
|
|
{
|
|
par1World.setBlockMetadataWithNotify(par2, par3, par4, var6 & -9, 2);
|
|
}
|
|
else
|
|
{
|
|
this.removeLeaves(par1World, par2, par3, par4);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* A randomly called display update to be able to add particles or other items for display
|
|
*/
|
|
@SideOnly(Side.CLIENT)
|
|
public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random)
|
|
{
|
|
if (par1World.canLightningStrikeAt(par2, par3 + 1, par4) && !par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4) && par5Random.nextInt(15) == 1)
|
|
{
|
|
double var6 = (double)((float)par2 + par5Random.nextFloat());
|
|
double var8 = (double)par3 - 0.05D;
|
|
double var10 = (double)((float)par4 + par5Random.nextFloat());
|
|
par1World.spawnParticle("dripWater", var6, var8, var10, 0.0D, 0.0D, 0.0D);
|
|
}
|
|
}
|
|
|
|
private void removeLeaves(World par1World, int par2, int par3, int par4)
|
|
{
|
|
this.dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0);
|
|
par1World.setBlock(par2, par3, par4, 0);
|
|
}
|
|
|
|
/**
|
|
* Returns the quantity of items to drop on block destruction.
|
|
*/
|
|
public int quantityDropped(Random par1Random)
|
|
{
|
|
return par1Random.nextInt(20) == 0 ? 1 : 0;
|
|
}
|
|
|
|
/**
|
|
* Returns the ID of the items to drop on destruction.
|
|
*/
|
|
public int idDropped(int par1, Random par2Random, int par3)
|
|
{
|
|
return BOPBlocks.originSapling.blockID;
|
|
}
|
|
|
|
/**
|
|
* Drops the block items with a specified chance of dropping the specified items
|
|
*/
|
|
public void dropBlockAsItemWithChance(World par1World, int par2, int par3, int par4, int par5, float par6, int par7)
|
|
{
|
|
if (!par1World.isRemote)
|
|
{
|
|
byte var8 = 20;
|
|
|
|
if ((par5 & 3) == 3)
|
|
{
|
|
var8 = 40;
|
|
}
|
|
|
|
if (par1World.rand.nextInt(var8) == 0)
|
|
{
|
|
int var9 = this.idDropped(par5, par1World.rand, par7);
|
|
this.dropBlockAsItem_do(par1World, par2, par3, par4, new ItemStack(var9, 1, this.damageDropped(par5)));
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Called when the player destroys a block with an item that can harvest it. (i, j, k) are the coordinates of the
|
|
* block and l is the block's subtype/damage.
|
|
*/
|
|
public void harvestBlock(World par1World, EntityPlayer par2EntityPlayer, int par3, int par4, int par5, int par6)
|
|
{
|
|
super.harvestBlock(par1World, par2EntityPlayer, par3, par4, par5, par6);
|
|
}
|
|
|
|
/**
|
|
* Determines the damage on the item the block drops. Used in cloth and wood.
|
|
*/
|
|
public int damageDropped(int par1)
|
|
{
|
|
return par1 & 3;
|
|
}
|
|
|
|
@Override
|
|
public boolean isOpaqueCube() {
|
|
return Block.leaves.isOpaqueCube();
|
|
}
|
|
|
|
public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Pass true to draw this block using fancy graphics, or false for fast graphics.
|
|
*/
|
|
@SideOnly(Side.CLIENT)
|
|
public void setGraphicsLevel(boolean par1)
|
|
{
|
|
this.graphicsLevel = par1;
|
|
}
|
|
|
|
@Override
|
|
public boolean isShearable(ItemStack item, World world, int x, int y, int z)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public ArrayList<ItemStack> onSheared(ItemStack item, World world, int x, int y, int z, int fortune)
|
|
{
|
|
ArrayList<ItemStack> ret = new ArrayList<ItemStack>();
|
|
ret.add(new ItemStack(this, 1, world.getBlockMetadata(x, y, z) & 3));
|
|
return ret;
|
|
}
|
|
}
|