You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
364 lines
13 KiB
Java
364 lines
13 KiB
Java
package net.minecraft.block;
|
|
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
import java.util.Random;
|
|
import net.minecraft.block.material.Material;
|
|
import net.minecraft.entity.EntityLivingBase;
|
|
import net.minecraft.init.Blocks;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.util.Direction;
|
|
import net.minecraft.util.IIcon;
|
|
import net.minecraft.util.MathHelper;
|
|
import net.minecraft.world.IBlockAccess;
|
|
import net.minecraft.world.World;
|
|
|
|
public abstract class BlockRedstoneDiode extends BlockDirectional
|
|
{
|
|
/** Tells whether the repeater is powered or not */
|
|
protected final boolean isRepeaterPowered;
|
|
private static final String __OBFID = "CL_00000226";
|
|
|
|
protected BlockRedstoneDiode(boolean p_i45400_1_)
|
|
{
|
|
super(Material.circuits);
|
|
this.isRepeaterPowered = p_i45400_1_;
|
|
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F);
|
|
}
|
|
|
|
/**
|
|
* If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
|
|
*/
|
|
public boolean renderAsNormalBlock()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z
|
|
*/
|
|
public boolean canPlaceBlockAt(World worldIn, int x, int y, int z)
|
|
{
|
|
return !World.doesBlockHaveSolidTopSurface(worldIn, x, y - 1, z) ? false : super.canPlaceBlockAt(worldIn, x, y, z);
|
|
}
|
|
|
|
/**
|
|
* Can this block stay at this position. Similar to canPlaceBlockAt except gets checked often with plants.
|
|
*/
|
|
public boolean canBlockStay(World worldIn, int x, int y, int z)
|
|
{
|
|
return !World.doesBlockHaveSolidTopSurface(worldIn, x, y - 1, z) ? false : super.canBlockStay(worldIn, x, y, z);
|
|
}
|
|
|
|
/**
|
|
* Ticks the block if it's been scheduled
|
|
*/
|
|
public void updateTick(World worldIn, int x, int y, int z, Random random)
|
|
{
|
|
int l = worldIn.getBlockMetadata(x, y, z);
|
|
|
|
if (!this.func_149910_g(worldIn, x, y, z, l))
|
|
{
|
|
boolean flag = this.isGettingInput(worldIn, x, y, z, l);
|
|
|
|
if (this.isRepeaterPowered && !flag)
|
|
{
|
|
worldIn.setBlock(x, y, z, this.getBlockUnpowered(), l, 2);
|
|
}
|
|
else if (!this.isRepeaterPowered)
|
|
{
|
|
worldIn.setBlock(x, y, z, this.getBlockPowered(), l, 2);
|
|
|
|
if (!flag)
|
|
{
|
|
worldIn.scheduleBlockUpdateWithPriority(x, y, z, this.getBlockPowered(), this.func_149899_k(l), -1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Gets the block's texture. Args: side, meta
|
|
*/
|
|
@SideOnly(Side.CLIENT)
|
|
public IIcon getIcon(int side, int meta)
|
|
{
|
|
return side == 0 ? (this.isRepeaterPowered ? Blocks.redstone_torch.getBlockTextureFromSide(side) : Blocks.unlit_redstone_torch.getBlockTextureFromSide(side)) : (side == 1 ? this.blockIcon : Blocks.double_stone_slab.getBlockTextureFromSide(1));
|
|
}
|
|
|
|
/**
|
|
* Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
|
|
* coordinates. Args: blockAccess, x, y, z, side
|
|
*/
|
|
@SideOnly(Side.CLIENT)
|
|
public boolean shouldSideBeRendered(IBlockAccess worldIn, int x, int y, int z, int side)
|
|
{
|
|
return side != 0 && side != 1;
|
|
}
|
|
|
|
/**
|
|
* The type of render function that is called for this block
|
|
*/
|
|
public int getRenderType()
|
|
{
|
|
return 36;
|
|
}
|
|
|
|
protected boolean func_149905_c(int p_149905_1_)
|
|
{
|
|
return this.isRepeaterPowered;
|
|
}
|
|
|
|
public int isProvidingStrongPower(IBlockAccess worldIn, int x, int y, int z, int side)
|
|
{
|
|
return this.isProvidingWeakPower(worldIn, x, y, z, side);
|
|
}
|
|
|
|
public int isProvidingWeakPower(IBlockAccess worldIn, int x, int y, int z, int side)
|
|
{
|
|
int i1 = worldIn.getBlockMetadata(x, y, z);
|
|
|
|
if (!this.func_149905_c(i1))
|
|
{
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
int j1 = getDirection(i1);
|
|
return j1 == 0 && side == 3 ? this.func_149904_f(worldIn, x, y, z, i1) : (j1 == 1 && side == 4 ? this.func_149904_f(worldIn, x, y, z, i1) : (j1 == 2 && side == 2 ? this.func_149904_f(worldIn, x, y, z, i1) : (j1 == 3 && side == 5 ? this.func_149904_f(worldIn, x, y, z, i1) : 0)));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are
|
|
* their own) Args: x, y, z, neighbor Block
|
|
*/
|
|
public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighbor)
|
|
{
|
|
if (!this.canBlockStay(worldIn, x, y, z))
|
|
{
|
|
this.dropBlockAsItem(worldIn, x, y, z, worldIn.getBlockMetadata(x, y, z), 0);
|
|
worldIn.setBlockToAir(x, y, z);
|
|
worldIn.notifyBlocksOfNeighborChange(x + 1, y, z, this);
|
|
worldIn.notifyBlocksOfNeighborChange(x - 1, y, z, this);
|
|
worldIn.notifyBlocksOfNeighborChange(x, y, z + 1, this);
|
|
worldIn.notifyBlocksOfNeighborChange(x, y, z - 1, this);
|
|
worldIn.notifyBlocksOfNeighborChange(x, y - 1, z, this);
|
|
worldIn.notifyBlocksOfNeighborChange(x, y + 1, z, this);
|
|
}
|
|
else
|
|
{
|
|
this.func_149897_b(worldIn, x, y, z, neighbor);
|
|
}
|
|
}
|
|
|
|
protected void func_149897_b(World p_149897_1_, int p_149897_2_, int p_149897_3_, int p_149897_4_, Block p_149897_5_)
|
|
{
|
|
int l = p_149897_1_.getBlockMetadata(p_149897_2_, p_149897_3_, p_149897_4_);
|
|
|
|
if (!this.func_149910_g(p_149897_1_, p_149897_2_, p_149897_3_, p_149897_4_, l))
|
|
{
|
|
boolean flag = this.isGettingInput(p_149897_1_, p_149897_2_, p_149897_3_, p_149897_4_, l);
|
|
|
|
if ((this.isRepeaterPowered && !flag || !this.isRepeaterPowered && flag) && !p_149897_1_.isBlockTickScheduledThisTick(p_149897_2_, p_149897_3_, p_149897_4_, this))
|
|
{
|
|
byte b0 = -1;
|
|
|
|
if (this.func_149912_i(p_149897_1_, p_149897_2_, p_149897_3_, p_149897_4_, l))
|
|
{
|
|
b0 = -3;
|
|
}
|
|
else if (this.isRepeaterPowered)
|
|
{
|
|
b0 = -2;
|
|
}
|
|
|
|
p_149897_1_.scheduleBlockUpdateWithPriority(p_149897_2_, p_149897_3_, p_149897_4_, this, this.func_149901_b(l), b0);
|
|
}
|
|
}
|
|
}
|
|
|
|
public boolean func_149910_g(IBlockAccess p_149910_1_, int p_149910_2_, int p_149910_3_, int p_149910_4_, int p_149910_5_)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
protected boolean isGettingInput(World p_149900_1_, int p_149900_2_, int p_149900_3_, int p_149900_4_, int p_149900_5_)
|
|
{
|
|
return this.getInputStrength(p_149900_1_, p_149900_2_, p_149900_3_, p_149900_4_, p_149900_5_) > 0;
|
|
}
|
|
|
|
/**
|
|
* Returns the signal strength at one input of the block. Args: world, X, Y, Z, side
|
|
*/
|
|
protected int getInputStrength(World p_149903_1_, int p_149903_2_, int p_149903_3_, int p_149903_4_, int p_149903_5_)
|
|
{
|
|
int i1 = getDirection(p_149903_5_);
|
|
int j1 = p_149903_2_ + Direction.offsetX[i1];
|
|
int k1 = p_149903_4_ + Direction.offsetZ[i1];
|
|
int l1 = p_149903_1_.getIndirectPowerLevelTo(j1, p_149903_3_, k1, Direction.directionToFacing[i1]);
|
|
return l1 >= 15 ? l1 : Math.max(l1, p_149903_1_.getBlock(j1, p_149903_3_, k1) == Blocks.redstone_wire ? p_149903_1_.getBlockMetadata(j1, p_149903_3_, k1) : 0);
|
|
}
|
|
|
|
protected int func_149902_h(IBlockAccess p_149902_1_, int p_149902_2_, int p_149902_3_, int p_149902_4_, int p_149902_5_)
|
|
{
|
|
int i1 = getDirection(p_149902_5_);
|
|
|
|
switch (i1)
|
|
{
|
|
case 0:
|
|
case 2:
|
|
return Math.max(this.func_149913_i(p_149902_1_, p_149902_2_ - 1, p_149902_3_, p_149902_4_, 4), this.func_149913_i(p_149902_1_, p_149902_2_ + 1, p_149902_3_, p_149902_4_, 5));
|
|
case 1:
|
|
case 3:
|
|
return Math.max(this.func_149913_i(p_149902_1_, p_149902_2_, p_149902_3_, p_149902_4_ + 1, 3), this.func_149913_i(p_149902_1_, p_149902_2_, p_149902_3_, p_149902_4_ - 1, 2));
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
protected int func_149913_i(IBlockAccess p_149913_1_, int p_149913_2_, int p_149913_3_, int p_149913_4_, int p_149913_5_)
|
|
{
|
|
Block block = p_149913_1_.getBlock(p_149913_2_, p_149913_3_, p_149913_4_);
|
|
return this.func_149908_a(block) ? (block == Blocks.redstone_wire ? p_149913_1_.getBlockMetadata(p_149913_2_, p_149913_3_, p_149913_4_) : p_149913_1_.isBlockProvidingPowerTo(p_149913_2_, p_149913_3_, p_149913_4_, p_149913_5_)) : 0;
|
|
}
|
|
|
|
/**
|
|
* Can this block provide power. Only wire currently seems to have this change based on its state.
|
|
*/
|
|
public boolean canProvidePower()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Called when the block is placed in the world.
|
|
*/
|
|
public void onBlockPlacedBy(World worldIn, int x, int y, int z, EntityLivingBase placer, ItemStack itemIn)
|
|
{
|
|
int l = ((MathHelper.floor_double((double)(placer.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3) + 2) % 4;
|
|
worldIn.setBlockMetadataWithNotify(x, y, z, l, 3);
|
|
boolean flag = this.isGettingInput(worldIn, x, y, z, l);
|
|
|
|
if (flag)
|
|
{
|
|
worldIn.scheduleBlockUpdate(x, y, z, this, 1);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Called whenever the block is added into the world. Args: world, x, y, z
|
|
*/
|
|
public void onBlockAdded(World worldIn, int x, int y, int z)
|
|
{
|
|
this.func_149911_e(worldIn, x, y, z);
|
|
}
|
|
|
|
protected void func_149911_e(World p_149911_1_, int p_149911_2_, int p_149911_3_, int p_149911_4_)
|
|
{
|
|
int l = getDirection(p_149911_1_.getBlockMetadata(p_149911_2_, p_149911_3_, p_149911_4_));
|
|
|
|
if (l == 1)
|
|
{
|
|
p_149911_1_.notifyBlockOfNeighborChange(p_149911_2_ + 1, p_149911_3_, p_149911_4_, this);
|
|
p_149911_1_.notifyBlocksOfNeighborChange(p_149911_2_ + 1, p_149911_3_, p_149911_4_, this, 4);
|
|
}
|
|
|
|
if (l == 3)
|
|
{
|
|
p_149911_1_.notifyBlockOfNeighborChange(p_149911_2_ - 1, p_149911_3_, p_149911_4_, this);
|
|
p_149911_1_.notifyBlocksOfNeighborChange(p_149911_2_ - 1, p_149911_3_, p_149911_4_, this, 5);
|
|
}
|
|
|
|
if (l == 2)
|
|
{
|
|
p_149911_1_.notifyBlockOfNeighborChange(p_149911_2_, p_149911_3_, p_149911_4_ + 1, this);
|
|
p_149911_1_.notifyBlocksOfNeighborChange(p_149911_2_, p_149911_3_, p_149911_4_ + 1, this, 2);
|
|
}
|
|
|
|
if (l == 0)
|
|
{
|
|
p_149911_1_.notifyBlockOfNeighborChange(p_149911_2_, p_149911_3_, p_149911_4_ - 1, this);
|
|
p_149911_1_.notifyBlocksOfNeighborChange(p_149911_2_, p_149911_3_, p_149911_4_ - 1, this, 3);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Called right before the block is destroyed by a player. Args: world, x, y, z, metaData
|
|
*/
|
|
public void onBlockDestroyedByPlayer(World worldIn, int x, int y, int z, int meta)
|
|
{
|
|
if (this.isRepeaterPowered)
|
|
{
|
|
worldIn.notifyBlocksOfNeighborChange(x + 1, y, z, this);
|
|
worldIn.notifyBlocksOfNeighborChange(x - 1, y, z, this);
|
|
worldIn.notifyBlocksOfNeighborChange(x, y, z + 1, this);
|
|
worldIn.notifyBlocksOfNeighborChange(x, y, z - 1, this);
|
|
worldIn.notifyBlocksOfNeighborChange(x, y - 1, z, this);
|
|
worldIn.notifyBlocksOfNeighborChange(x, y + 1, z, this);
|
|
}
|
|
|
|
super.onBlockDestroyedByPlayer(worldIn, x, y, z, meta);
|
|
}
|
|
|
|
/**
|
|
* Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two
|
|
* adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
|
|
*/
|
|
public boolean isOpaqueCube()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
protected boolean func_149908_a(Block p_149908_1_)
|
|
{
|
|
return p_149908_1_.canProvidePower();
|
|
}
|
|
|
|
protected int func_149904_f(IBlockAccess p_149904_1_, int p_149904_2_, int p_149904_3_, int p_149904_4_, int p_149904_5_)
|
|
{
|
|
return 15;
|
|
}
|
|
|
|
public static boolean isRedstoneRepeaterBlockID(Block p_149909_0_)
|
|
{
|
|
return Blocks.unpowered_repeater.func_149907_e(p_149909_0_) || Blocks.unpowered_comparator.func_149907_e(p_149909_0_);
|
|
}
|
|
|
|
public boolean func_149907_e(Block p_149907_1_)
|
|
{
|
|
return p_149907_1_ == this.getBlockPowered() || p_149907_1_ == this.getBlockUnpowered();
|
|
}
|
|
|
|
public boolean func_149912_i(World p_149912_1_, int p_149912_2_, int p_149912_3_, int p_149912_4_, int p_149912_5_)
|
|
{
|
|
int i1 = getDirection(p_149912_5_);
|
|
|
|
if (isRedstoneRepeaterBlockID(p_149912_1_.getBlock(p_149912_2_ - Direction.offsetX[i1], p_149912_3_, p_149912_4_ - Direction.offsetZ[i1])))
|
|
{
|
|
int j1 = p_149912_1_.getBlockMetadata(p_149912_2_ - Direction.offsetX[i1], p_149912_3_, p_149912_4_ - Direction.offsetZ[i1]);
|
|
int k1 = getDirection(j1);
|
|
return k1 != i1;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
protected int func_149899_k(int p_149899_1_)
|
|
{
|
|
return this.func_149901_b(p_149899_1_);
|
|
}
|
|
|
|
protected abstract int func_149901_b(int p_149901_1_);
|
|
|
|
protected abstract BlockRedstoneDiode getBlockPowered();
|
|
|
|
protected abstract BlockRedstoneDiode getBlockUnpowered();
|
|
|
|
public boolean isAssociatedBlock(Block other)
|
|
{
|
|
return this.func_149907_e(other);
|
|
}
|
|
} |