223 lines
7.3 KiB
Java
223 lines
7.3 KiB
Java
package mods.tinker.tconstruct.blocks;
|
|
|
|
import java.util.Random;
|
|
|
|
import mods.tinker.tconstruct.client.block.BallRepeaterRender;
|
|
import mods.tinker.tconstruct.common.TContent;
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.block.BlockRedstoneLogic;
|
|
import net.minecraft.client.renderer.texture.IconRegister;
|
|
import net.minecraft.creativetab.CreativeTabs;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.util.Direction;
|
|
import net.minecraft.util.Icon;
|
|
import net.minecraft.world.IBlockAccess;
|
|
import net.minecraft.world.World;
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
|
|
public class RedstoneBallRepeater extends BlockRedstoneLogic
|
|
{
|
|
/** The offsets for the two torches in redstone repeater blocks. */
|
|
public static final double[] repeaterTorchOffset = new double[] { -0.0625D, 0.0625D, 0.1875D, 0.3125D};
|
|
|
|
/** The states in which the redstone repeater blocks can be. */
|
|
public static final int[] repeaterState = new int[] {1, 2, 3, 4};
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public static Icon field_94413_c;
|
|
@SideOnly(Side.CLIENT)
|
|
public static Icon field_94410_cO;
|
|
@SideOnly(Side.CLIENT)
|
|
public static Icon field_94411_cP;
|
|
@SideOnly(Side.CLIENT)
|
|
public static Icon field_94412_cQ;
|
|
|
|
public RedstoneBallRepeater(int par1, boolean par2)
|
|
{
|
|
super(par1, par2);
|
|
//this.setCreativeTab(CreativeTabs.tabRedstone);
|
|
}
|
|
|
|
/**
|
|
* Called upon block activation (right click on the block.)
|
|
*/
|
|
public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
|
|
{
|
|
int i1 = par1World.getBlockMetadata(par2, par3, par4);
|
|
int j1 = (i1 & 12) >> 2;
|
|
j1 = j1 + 1 << 2 & 12;
|
|
par1World.setBlockMetadataWithNotify(par2, par3, par4, j1 | i1 & 3, 3);
|
|
return true;
|
|
}
|
|
|
|
public int func_94481_j_(int par1)
|
|
{
|
|
return repeaterState[(par1 & 12) >> 2] * 2;
|
|
}
|
|
|
|
public BlockRedstoneLogic func_94485_e()
|
|
{
|
|
return Block.redstoneRepeaterActive;
|
|
}
|
|
|
|
public BlockRedstoneLogic func_94484_i()
|
|
{
|
|
return Block.redstoneRepeaterIdle;
|
|
}
|
|
|
|
/**
|
|
* Returns the ID of the items to drop on destruction.
|
|
*/
|
|
public int idDropped(int par1, Random par2Random, int par3)
|
|
{
|
|
return this.blockID;
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
/**
|
|
* only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative)
|
|
*/
|
|
/*public int idPicked(World par1World, int par2, int par3, int par4)
|
|
{
|
|
return Item.redstoneRepeater.itemID;
|
|
}*/
|
|
|
|
/**
|
|
* The type of render function that is called for this block
|
|
*/
|
|
public int getRenderType()
|
|
{
|
|
return BallRepeaterRender.model;
|
|
}
|
|
|
|
public boolean func_94476_e(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
|
|
{
|
|
return this.func_94482_f(par1IBlockAccess, par2, par3, par4, par5) > 0;
|
|
}
|
|
|
|
public boolean func_94477_d(int par1)
|
|
{
|
|
return isRedstoneRepeaterBlockID(par1);
|
|
}
|
|
|
|
public static boolean isPowerProviderOrWire(IBlockAccess par0IBlockAccess, int par1, int par2, int par3, int par4)
|
|
{
|
|
int i1 = par0IBlockAccess.getBlockId(par1, par2, par3);
|
|
|
|
if (i1 == Block.redstoneWire.blockID)
|
|
{
|
|
return true;
|
|
}
|
|
else if (i1 == 0)
|
|
{
|
|
return false;
|
|
}
|
|
else if (!Block.redstoneRepeaterIdle.func_94487_f(i1))
|
|
{
|
|
return (Block.blocksList[i1] != null && Block.blocksList[i1].canConnectRedstone(par0IBlockAccess, par1, par2, par3, par4));
|
|
}
|
|
else
|
|
{
|
|
int j1 = par0IBlockAccess.getBlockMetadata(par1, par2, par3);
|
|
return par4 == (j1 & 3) || par4 == Direction.rotateOpposite[j1 & 3];
|
|
}
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
/**
|
|
* A randomly called display update to be able to add particles or other items for display
|
|
*/
|
|
public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random)
|
|
{
|
|
if (this.isRepeaterPowered)
|
|
{
|
|
int l = par1World.getBlockMetadata(par2, par3, par4);
|
|
int i1 = getDirection(l);
|
|
double d0 = (double)((float)par2 + 0.5F) + (double)(par5Random.nextFloat() - 0.5F) * 0.2D;
|
|
double d1 = (double)((float)par3 + 0.4F) + (double)(par5Random.nextFloat() - 0.5F) * 0.2D;
|
|
double d2 = (double)((float)par4 + 0.5F) + (double)(par5Random.nextFloat() - 0.5F) * 0.2D;
|
|
double d3 = 0.0D;
|
|
double d4 = 0.0D;
|
|
|
|
if (par5Random.nextInt(2) == 0)
|
|
{
|
|
switch (i1)
|
|
{
|
|
case 0:
|
|
d4 = -0.3125D;
|
|
break;
|
|
case 1:
|
|
d3 = 0.3125D;
|
|
break;
|
|
case 2:
|
|
d4 = 0.3125D;
|
|
break;
|
|
case 3:
|
|
d3 = -0.3125D;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int j1 = (l & 12) >> 2;
|
|
|
|
switch (i1)
|
|
{
|
|
case 0:
|
|
d4 = repeaterTorchOffset[j1];
|
|
break;
|
|
case 1:
|
|
d3 = -repeaterTorchOffset[j1];
|
|
break;
|
|
case 2:
|
|
d4 = -repeaterTorchOffset[j1];
|
|
break;
|
|
case 3:
|
|
d3 = repeaterTorchOffset[j1];
|
|
}
|
|
}
|
|
|
|
par1World.spawnParticle("reddust", d0 + d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D);
|
|
}
|
|
}
|
|
|
|
|
|
public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4)
|
|
{
|
|
return par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4) || par1World.getBlockId(par2, par3 - 1, par4) == Block.glowStone.blockID;
|
|
}
|
|
|
|
/**
|
|
* 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)
|
|
{
|
|
super.breakBlock(par1World, par2, par3, par4, par5, par6);
|
|
this.func_94483_i_(par1World, par2, par3, par4);
|
|
}
|
|
|
|
@Override
|
|
public int colorMultiplier(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
|
|
{
|
|
return 8388608;
|
|
}
|
|
|
|
public void registerIcons(IconRegister par1IconRegister)
|
|
{
|
|
this.field_94413_c = par1IconRegister.registerIcon("tinker:repeaterDust_cross");
|
|
this.field_94410_cO = par1IconRegister.registerIcon("tinker:repeaterDust_line");
|
|
this.field_94411_cP = par1IconRegister.registerIcon("tinker:repeaterDust_cross_overlay");
|
|
this.field_94412_cQ = par1IconRegister.registerIcon("tinker:repeaterDust_line_overlay");
|
|
this.blockIcon = this.field_94413_c;
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public static Icon func_94409_b(String par0Str)
|
|
{
|
|
return par0Str == "repeaterDust_cross" ? field_94413_c : (par0Str == "repeaterDust_line" ? field_94410_cO : (par0Str == "repeaterDust_cross_overlay" ? field_94411_cP : (par0Str == "repeaterDust_line_overlay" ? field_94412_cQ : null)));
|
|
}
|
|
}
|