461 lines
17 KiB
Java
Executable file
461 lines
17 KiB
Java
Executable file
package game.block;
|
|
|
|
import game.entity.npc.EntityNPC;
|
|
import game.entity.types.EntityLiving;
|
|
import game.init.Blocks;
|
|
import game.init.Items;
|
|
import game.init.SoundEvent;
|
|
import game.item.Item;
|
|
import game.model.ModelRotation;
|
|
import game.properties.IProperty;
|
|
import game.properties.IStringSerializable;
|
|
import game.properties.PropertyBool;
|
|
import game.properties.PropertyEnum;
|
|
import game.renderer.blockmodel.ModelBlock;
|
|
import game.rng.Random;
|
|
import game.tileentity.TileEntity;
|
|
import game.tileentity.TileEntityComparator;
|
|
import game.world.BlockPos;
|
|
import game.world.Facing;
|
|
import game.world.IWorldAccess;
|
|
import game.world.State;
|
|
import game.world.World;
|
|
import game.world.WorldServer;
|
|
|
|
public class BlockRedstoneComparator extends BlockRedstoneDiode implements ITileEntityProvider
|
|
{
|
|
public static final PropertyBool POWERED = PropertyBool.create("powered");
|
|
public static final PropertyEnum<BlockRedstoneComparator.Mode> MODE = PropertyEnum.<BlockRedstoneComparator.Mode>create("mode", BlockRedstoneComparator.Mode.class);
|
|
|
|
public BlockRedstoneComparator(boolean powered)
|
|
{
|
|
super(powered);
|
|
this.setDefaultState(this.getBaseState().withProperty(FACING, Facing.NORTH).withProperty(POWERED, Boolean.valueOf(false)).withProperty(MODE, BlockRedstoneComparator.Mode.COMPARE));
|
|
this.hasTile = true;
|
|
}
|
|
|
|
// /**
|
|
// * Gets the localized name of this block. Used for the statistics page.
|
|
// */
|
|
// public String getLocalizedName()
|
|
// {
|
|
// return "Redstone-Komparator";
|
|
// }
|
|
|
|
/**
|
|
* Get the Item that this Block should drop when harvested.
|
|
*/
|
|
public Item getItemDropped(State state, Random rand, int fortune)
|
|
{
|
|
return Items.comparator;
|
|
}
|
|
|
|
public Item getItem(World worldIn, BlockPos pos)
|
|
{
|
|
return Items.comparator;
|
|
}
|
|
|
|
protected int getDelay(State state)
|
|
{
|
|
return 2;
|
|
}
|
|
|
|
protected State getPoweredState(State unpoweredState)
|
|
{
|
|
Boolean obool = (Boolean)unpoweredState.getValue(POWERED);
|
|
BlockRedstoneComparator.Mode blockredstonecomparator$mode = (BlockRedstoneComparator.Mode)unpoweredState.getValue(MODE);
|
|
Facing enumfacing = (Facing)unpoweredState.getValue(FACING);
|
|
return Blocks.powered_comparator.getState().withProperty(FACING, enumfacing).withProperty(POWERED, obool).withProperty(MODE, blockredstonecomparator$mode);
|
|
}
|
|
|
|
protected State getUnpoweredState(State poweredState)
|
|
{
|
|
Boolean obool = (Boolean)poweredState.getValue(POWERED);
|
|
BlockRedstoneComparator.Mode blockredstonecomparator$mode = (BlockRedstoneComparator.Mode)poweredState.getValue(MODE);
|
|
Facing enumfacing = (Facing)poweredState.getValue(FACING);
|
|
return Blocks.comparator.getState().withProperty(FACING, enumfacing).withProperty(POWERED, obool).withProperty(MODE, blockredstonecomparator$mode);
|
|
}
|
|
|
|
protected boolean isPowered(State state)
|
|
{
|
|
return this.isRepeaterPowered || ((Boolean)state.getValue(POWERED)).booleanValue();
|
|
}
|
|
|
|
protected int getActiveSignal(IWorldAccess worldIn, BlockPos pos, State state)
|
|
{
|
|
TileEntity tileentity = worldIn.getTileEntity(pos);
|
|
return tileentity instanceof TileEntityComparator ? ((TileEntityComparator)tileentity).getOutputSignal() : 0;
|
|
}
|
|
|
|
private int calculateOutput(World worldIn, BlockPos pos, State state)
|
|
{
|
|
return state.getValue(MODE) == BlockRedstoneComparator.Mode.SUBTRACT ? Math.max(this.calculateInputStrength(worldIn, pos, state) - this.getPowerOnSides(worldIn, pos, state), 0) : this.calculateInputStrength(worldIn, pos, state);
|
|
}
|
|
|
|
protected boolean shouldBePowered(World worldIn, BlockPos pos, State state)
|
|
{
|
|
int i = this.calculateInputStrength(worldIn, pos, state);
|
|
|
|
if (i >= 15)
|
|
{
|
|
return true;
|
|
}
|
|
else if (i == 0)
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
int j = this.getPowerOnSides(worldIn, pos, state);
|
|
return j == 0 ? true : i >= j;
|
|
}
|
|
}
|
|
|
|
protected int calculateInputStrength(World worldIn, BlockPos pos, State state)
|
|
{
|
|
int i = super.calculateInputStrength(worldIn, pos, state);
|
|
Facing enumfacing = (Facing)state.getValue(FACING);
|
|
BlockPos blockpos = pos.offset(enumfacing);
|
|
Block block = worldIn.getState(blockpos).getBlock();
|
|
|
|
if (block.hasComparatorInputOverride())
|
|
{
|
|
i = block.getComparatorInputOverride(worldIn, blockpos);
|
|
}
|
|
else if (i < 15 && block.isNormalCube())
|
|
{
|
|
blockpos = blockpos.offset(enumfacing);
|
|
block = worldIn.getState(blockpos).getBlock();
|
|
|
|
if (block.hasComparatorInputOverride())
|
|
{
|
|
i = block.getComparatorInputOverride(worldIn, blockpos);
|
|
}
|
|
// else if (block.getMaterial() == Material.air)
|
|
// {
|
|
// EntityFrame entityitemframe = this.findItemFrame(worldIn, enumfacing, blockpos);
|
|
//
|
|
// if (entityitemframe != null)
|
|
// {
|
|
// i = entityitemframe.getItemRotation();
|
|
// }
|
|
// }
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
// private EntityFrame findItemFrame(World worldIn, final Facing facing, BlockPos pos)
|
|
// {
|
|
// List<EntityFrame> list = worldIn.<EntityFrame>getEntitiesWithinAABB(EntityFrame.class, new BoundingBox((double)pos.getX(), (double)pos.getY(), (double)pos.getZ(), (double)(pos.getX() + 1), (double)(pos.getY() + 1), (double)(pos.getZ() + 1)), new Predicate<Entity>()
|
|
// {
|
|
// public boolean apply(Entity p_apply_1_)
|
|
// {
|
|
// return p_apply_1_ != null && p_apply_1_.getHorizontalFacing() == facing;
|
|
// }
|
|
// });
|
|
// return list.size() == 1 ? (EntityFrame)list.get(0) : null;
|
|
// }
|
|
|
|
public boolean onBlockActivated(World worldIn, BlockPos pos, State state, EntityNPC playerIn, Facing side, float hitX, float hitY, float hitZ)
|
|
{
|
|
// if (!playerIn.capabilities.allowEdit)
|
|
// {
|
|
// return false;
|
|
// }
|
|
// else
|
|
// {
|
|
state = state.cycleProperty(MODE);
|
|
worldIn.playSound(SoundEvent.CLICK, (double)pos.getX() + 0.5D, (double)pos.getY() + 0.5D, (double)pos.getZ() + 0.5D, 0.3F);
|
|
worldIn.setState(pos, state, 2);
|
|
this.onStateChange(worldIn, pos, state);
|
|
return true;
|
|
// }
|
|
}
|
|
|
|
protected void updateState(World worldIn, BlockPos pos, State state)
|
|
{
|
|
if (worldIn.client || !((WorldServer)worldIn).isBlockTickPending(pos, this))
|
|
{
|
|
int i = this.calculateOutput(worldIn, pos, state);
|
|
TileEntity tileentity = worldIn.getTileEntity(pos);
|
|
int j = tileentity instanceof TileEntityComparator ? ((TileEntityComparator)tileentity).getOutputSignal() : 0;
|
|
|
|
if (i != j || this.isPowered(state) != this.shouldBePowered(worldIn, pos, state))
|
|
{
|
|
if (this.isFacingTowardsRepeater(worldIn, pos, state))
|
|
{
|
|
if(!worldIn.client)
|
|
((WorldServer)worldIn).updateBlockTick(pos, this, 2, -1);
|
|
}
|
|
else
|
|
{
|
|
if(!worldIn.client)
|
|
((WorldServer)worldIn).updateBlockTick(pos, this, 2, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void onStateChange(World worldIn, BlockPos pos, State state)
|
|
{
|
|
int i = this.calculateOutput(worldIn, pos, state);
|
|
TileEntity tileentity = worldIn.getTileEntity(pos);
|
|
int j = 0;
|
|
|
|
if (tileentity instanceof TileEntityComparator)
|
|
{
|
|
TileEntityComparator tileentitycomparator = (TileEntityComparator)tileentity;
|
|
j = tileentitycomparator.getOutputSignal();
|
|
tileentitycomparator.setOutputSignal(i);
|
|
}
|
|
|
|
if (j != i || state.getValue(MODE) == BlockRedstoneComparator.Mode.COMPARE)
|
|
{
|
|
boolean flag1 = this.shouldBePowered(worldIn, pos, state);
|
|
boolean flag = this.isPowered(state);
|
|
|
|
if (flag && !flag1)
|
|
{
|
|
worldIn.setState(pos, state.withProperty(POWERED, Boolean.valueOf(false)), 2);
|
|
}
|
|
else if (!flag && flag1)
|
|
{
|
|
worldIn.setState(pos, state.withProperty(POWERED, Boolean.valueOf(true)), 2);
|
|
}
|
|
|
|
this.notifyNeighbors(worldIn, pos, state);
|
|
}
|
|
}
|
|
|
|
public void updateTick(WorldServer worldIn, BlockPos pos, State state, Random rand)
|
|
{
|
|
if (this.isRepeaterPowered)
|
|
{
|
|
worldIn.setState(pos, this.getUnpoweredState(state).withProperty(POWERED, Boolean.valueOf(true)), 4);
|
|
}
|
|
|
|
this.onStateChange(worldIn, pos, state);
|
|
}
|
|
|
|
public void onBlockAdded(WorldServer worldIn, BlockPos pos, State state)
|
|
{
|
|
super.onBlockAdded(worldIn, pos, state);
|
|
worldIn.setTileEntity(pos, this.createNewTileEntity(worldIn, 0));
|
|
}
|
|
|
|
public void onBlockRemoved(WorldServer worldIn, BlockPos pos, State state)
|
|
{
|
|
super.onBlockRemoved(worldIn, pos, state);
|
|
worldIn.removeTileEntity(pos);
|
|
this.notifyNeighbors(worldIn, pos, state);
|
|
}
|
|
|
|
/**
|
|
* Called on both Client and Server when World#addBlockEvent is called
|
|
*/
|
|
public boolean onBlockEventReceived(World worldIn, BlockPos pos, State state, int eventID, int eventParam)
|
|
{
|
|
super.onBlockEventReceived(worldIn, pos, state, eventID, eventParam);
|
|
TileEntity tileentity = worldIn.getTileEntity(pos);
|
|
return tileentity == null ? false : tileentity.receiveClientEvent(eventID, eventParam);
|
|
}
|
|
|
|
/**
|
|
* Returns a new instance of a block's tile entity class. Called on placing the block.
|
|
*/
|
|
public TileEntity createNewTileEntity(World worldIn, int meta)
|
|
{
|
|
return new TileEntityComparator();
|
|
}
|
|
|
|
/**
|
|
* Convert the given metadata into a BlockState for this Block
|
|
*/
|
|
public State getStateFromMeta(int meta)
|
|
{
|
|
return this.getState().withProperty(FACING, Facing.getHorizontal(meta)).withProperty(POWERED, Boolean.valueOf((meta & 8) > 0)).withProperty(MODE, (meta & 4) > 0 ? BlockRedstoneComparator.Mode.SUBTRACT : BlockRedstoneComparator.Mode.COMPARE);
|
|
}
|
|
|
|
/**
|
|
* Convert the BlockState into the correct metadata value
|
|
*/
|
|
public int getMetaFromState(State state)
|
|
{
|
|
int i = 0;
|
|
i = i | ((Facing)state.getValue(FACING)).getHorizontalIndex();
|
|
|
|
if (((Boolean)state.getValue(POWERED)).booleanValue())
|
|
{
|
|
i |= 8;
|
|
}
|
|
|
|
if (state.getValue(MODE) == BlockRedstoneComparator.Mode.SUBTRACT)
|
|
{
|
|
i |= 4;
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
protected IProperty[] getProperties()
|
|
{
|
|
return new IProperty[] {FACING, MODE, POWERED};
|
|
}
|
|
|
|
/**
|
|
* Called by ItemBlocks just before a block is actually set in the world, to allow for adjustments to the
|
|
* IBlockstate
|
|
*/
|
|
public State onBlockPlaced(World worldIn, BlockPos pos, Facing facing, float hitX, float hitY, float hitZ, int meta, EntityLiving placer)
|
|
{
|
|
return this.getState().withProperty(FACING, placer.getHorizontalFacing().getOpposite()).withProperty(POWERED, Boolean.valueOf(false)).withProperty(MODE, BlockRedstoneComparator.Mode.COMPARE);
|
|
}
|
|
|
|
public ModelBlock getModel(String name, State state) {
|
|
return (state.getValue(POWERED) ? (state.getValue(MODE) == Mode.SUBTRACT ? new ModelBlock("comparator_on").noOcclude()
|
|
.add(0, 0, 0, 16, 2, 16)
|
|
.d("double_stone_top").uv(0, 0, 16, 16)
|
|
.u().uv(0, 0, 16, 16).noCull()
|
|
.n("double_stone_top").uv(0, 14, 16, 16)
|
|
.s("double_stone_top").uv(0, 14, 16, 16)
|
|
.w("double_stone_top").uv(0, 14, 16, 16)
|
|
.e("double_stone_top").uv(0, 14, 16, 16)
|
|
.add(4, 7, 11, 6, 7, 13)
|
|
.u("redstone_torch").uv(7, 6, 9, 8).noCull()
|
|
.add(4, 2, 10, 6, 8, 14)
|
|
.w("redstone_torch").uv(6, 5, 10, 11).noCull()
|
|
.e("redstone_torch").uv(6, 5, 10, 11).noCull()
|
|
.add(3, 2, 11, 7, 8, 13)
|
|
.n("redstone_torch").uv(6, 5, 10, 11).noCull()
|
|
.s("redstone_torch").uv(6, 5, 10, 11).noCull()
|
|
.add(10, 7, 11, 12, 7, 13)
|
|
.u("redstone_torch").uv(7, 6, 9, 8).noCull()
|
|
.add(10, 2, 10, 12, 8, 14)
|
|
.w("redstone_torch").uv(6, 5, 10, 11).noCull()
|
|
.e("redstone_torch").uv(6, 5, 10, 11).noCull()
|
|
.add(9, 2, 11, 13, 8, 13)
|
|
.n("redstone_torch").uv(6, 5, 10, 11).noCull()
|
|
.s("redstone_torch").uv(6, 5, 10, 11).noCull()
|
|
.add(7, 5, 2, 9, 5, 4)
|
|
.u("redstone_torch").uv(7, 6, 9, 8).noCull()
|
|
.add(7, 2, 1, 9, 6, 5)
|
|
.w("redstone_torch").uv(6, 5, 10, 9).noCull()
|
|
.e("redstone_torch").uv(6, 5, 10, 9).noCull()
|
|
.add(6, 2, 2, 10, 6, 4)
|
|
.n("redstone_torch").uv(6, 5, 10, 9).noCull()
|
|
.s("redstone_torch").uv(6, 5, 10, 9).noCull() : new ModelBlock("comparator_on").noOcclude()
|
|
.add(0, 0, 0, 16, 2, 16)
|
|
.d("double_stone_top").uv(0, 0, 16, 16)
|
|
.u().uv(0, 0, 16, 16).noCull()
|
|
.n("double_stone_top").uv(0, 14, 16, 16)
|
|
.s("double_stone_top").uv(0, 14, 16, 16)
|
|
.w("double_stone_top").uv(0, 14, 16, 16)
|
|
.e("double_stone_top").uv(0, 14, 16, 16)
|
|
.add(4, 7, 11, 6, 7, 13)
|
|
.u("redstone_torch").uv(7, 6, 9, 8).noCull()
|
|
.add(4, 2, 10, 6, 8, 14)
|
|
.w("redstone_torch").uv(6, 5, 10, 11).noCull()
|
|
.e("redstone_torch").uv(6, 5, 10, 11).noCull()
|
|
.add(3, 2, 11, 7, 8, 13)
|
|
.n("redstone_torch").uv(6, 5, 10, 11).noCull()
|
|
.s("redstone_torch").uv(6, 5, 10, 11).noCull()
|
|
.add(10, 7, 11, 12, 7, 13)
|
|
.u("redstone_torch").uv(7, 6, 9, 8).noCull()
|
|
.add(10, 2, 10, 12, 8, 14)
|
|
.w("redstone_torch").uv(6, 5, 10, 11).noCull()
|
|
.e("redstone_torch").uv(6, 5, 10, 11).noCull()
|
|
.add(9, 2, 11, 13, 8, 13)
|
|
.n("redstone_torch").uv(6, 5, 10, 11).noCull()
|
|
.s("redstone_torch").uv(6, 5, 10, 11).noCull()
|
|
.add(7, 2, 2, 9, 4, 4)
|
|
.d("unlit_redstone_torch").uv(7, 13, 9, 15).noCull()
|
|
.u("unlit_redstone_torch").uv(7, 6, 9, 8).noCull()
|
|
.n("unlit_redstone_torch").uv(7, 6, 9, 8).noCull()
|
|
.s("unlit_redstone_torch").uv(7, 6, 9, 8).noCull()
|
|
.w("unlit_redstone_torch").uv(7, 6, 9, 8).noCull()
|
|
.e("unlit_redstone_torch").uv(7, 6, 9, 8).noCull())
|
|
: (state.getValue(MODE) == Mode.SUBTRACT ? new ModelBlock("comparator_off").noOcclude()
|
|
.add(0, 0, 0, 16, 2, 16)
|
|
.d("double_stone_top").uv(0, 0, 16, 16)
|
|
.u().uv(0, 0, 16, 16).noCull()
|
|
.n("double_stone_top").uv(0, 14, 16, 16)
|
|
.s("double_stone_top").uv(0, 14, 16, 16)
|
|
.w("double_stone_top").uv(0, 14, 16, 16)
|
|
.e("double_stone_top").uv(0, 14, 16, 16)
|
|
.add(4, 2, 11, 6, 7, 13)
|
|
.d("unlit_redstone_torch").uv(7, 13, 9, 15).noCull()
|
|
.u("unlit_redstone_torch").uv(7, 6, 9, 8).noCull()
|
|
.n("unlit_redstone_torch").uv(7, 6, 9, 11).noCull()
|
|
.s("unlit_redstone_torch").uv(7, 6, 9, 11).noCull()
|
|
.w("unlit_redstone_torch").uv(7, 6, 9, 11).noCull()
|
|
.e("unlit_redstone_torch").uv(7, 6, 9, 11).noCull()
|
|
.add(10, 2, 11, 12, 7, 13)
|
|
.d("unlit_redstone_torch").uv(7, 13, 9, 15).noCull()
|
|
.u("unlit_redstone_torch").uv(7, 6, 9, 8).noCull()
|
|
.n("unlit_redstone_torch").uv(7, 6, 9, 11).noCull()
|
|
.s("unlit_redstone_torch").uv(7, 6, 9, 11).noCull()
|
|
.w("unlit_redstone_torch").uv(7, 6, 9, 11).noCull()
|
|
.e("unlit_redstone_torch").uv(7, 6, 9, 11).noCull()
|
|
.add(7, 5, 2, 9, 5, 4)
|
|
.u("redstone_torch").uv(7, 6, 9, 8).noCull()
|
|
.add(7, 2, 1, 9, 6, 5)
|
|
.w("redstone_torch").uv(6, 5, 10, 9).noCull()
|
|
.e("redstone_torch").uv(6, 5, 10, 9).noCull()
|
|
.add(6, 2, 2, 10, 6, 4)
|
|
.n("redstone_torch").uv(6, 5, 10, 9).noCull()
|
|
.s("redstone_torch").uv(6, 5, 10, 9).noCull() : new ModelBlock("comparator_off").noOcclude()
|
|
.add(0, 0, 0, 16, 2, 16)
|
|
.d("double_stone_top").uv(0, 0, 16, 16)
|
|
.u().uv(0, 0, 16, 16).noCull()
|
|
.n("double_stone_top").uv(0, 14, 16, 16)
|
|
.s("double_stone_top").uv(0, 14, 16, 16)
|
|
.w("double_stone_top").uv(0, 14, 16, 16)
|
|
.e("double_stone_top").uv(0, 14, 16, 16)
|
|
.add(4, 2, 11, 6, 7, 13)
|
|
.d("unlit_redstone_torch").uv(7, 13, 9, 15).noCull()
|
|
.u("unlit_redstone_torch").uv(7, 6, 9, 8).noCull()
|
|
.n("unlit_redstone_torch").uv(7, 6, 9, 11).noCull()
|
|
.s("unlit_redstone_torch").uv(7, 6, 9, 11).noCull()
|
|
.w("unlit_redstone_torch").uv(7, 6, 9, 11).noCull()
|
|
.e("unlit_redstone_torch").uv(7, 6, 9, 11).noCull()
|
|
.add(10, 2, 11, 12, 7, 13)
|
|
.d("unlit_redstone_torch").uv(7, 13, 9, 15).noCull()
|
|
.u("unlit_redstone_torch").uv(7, 6, 9, 8).noCull()
|
|
.n("unlit_redstone_torch").uv(7, 6, 9, 11).noCull()
|
|
.s("unlit_redstone_torch").uv(7, 6, 9, 11).noCull()
|
|
.w("unlit_redstone_torch").uv(7, 6, 9, 11).noCull()
|
|
.e("unlit_redstone_torch").uv(7, 6, 9, 11).noCull()
|
|
.add(7, 2, 2, 9, 4, 4)
|
|
.d("unlit_redstone_torch").uv(7, 13, 9, 15).noCull()
|
|
.u("unlit_redstone_torch").uv(7, 6, 9, 8).noCull()
|
|
.n("unlit_redstone_torch").uv(7, 6, 9, 8).noCull()
|
|
.s("unlit_redstone_torch").uv(7, 6, 9, 8).noCull()
|
|
.w("unlit_redstone_torch").uv(7, 6, 9, 8).noCull()
|
|
.e("unlit_redstone_torch").uv(7, 6, 9, 8).noCull()))
|
|
.rotate(ModelRotation.getNorthRot(state.getValue(FACING).getOpposite()));
|
|
}
|
|
|
|
public static enum Mode implements IStringSerializable
|
|
{
|
|
COMPARE("compare"),
|
|
SUBTRACT("subtract");
|
|
|
|
private final String name;
|
|
|
|
private Mode(String name)
|
|
{
|
|
this.name = name;
|
|
}
|
|
|
|
public String toString()
|
|
{
|
|
return this.name;
|
|
}
|
|
|
|
public String getName()
|
|
{
|
|
return this.name;
|
|
}
|
|
}
|
|
}
|