2013-06-02 13:38:59 +10:00
|
|
|
package codechicken.multipart.minecraft;
|
|
|
|
|
|
|
|
|
|
import net.minecraft.block.Block;
|
|
|
|
|
import net.minecraft.block.BlockLever;
|
|
|
|
|
import net.minecraft.client.renderer.RenderBlocks;
|
|
|
|
|
import net.minecraft.entity.player.EntityPlayer;
|
2013-06-02 19:47:07 +10:00
|
|
|
import net.minecraft.item.ItemStack;
|
|
|
|
|
import net.minecraft.util.MovingObjectPosition;
|
|
|
|
|
import net.minecraft.world.IBlockAccess;
|
2013-06-02 13:38:59 +10:00
|
|
|
import net.minecraft.world.World;
|
|
|
|
|
import net.minecraftforge.common.ForgeDirection;
|
|
|
|
|
import codechicken.core.vec.BlockCoord;
|
|
|
|
|
import codechicken.core.vec.Cuboid6;
|
2013-06-03 13:30:36 +10:00
|
|
|
import codechicken.multipart.IRedstonePart;
|
2013-06-02 13:38:59 +10:00
|
|
|
|
2013-06-03 13:30:36 +10:00
|
|
|
public class LeverPart extends McSidedMetaPart implements IRedstonePart
|
2013-06-02 13:38:59 +10:00
|
|
|
{
|
|
|
|
|
public static BlockLever lever = (BlockLever) Block.lever;
|
|
|
|
|
public static int[] metaSideMap = new int[]{1, 4, 5, 2, 3, 0, 0, 1};
|
|
|
|
|
public static int[] sideMetaMap = new int[]{6, 0, 3, 4, 1, 2};
|
|
|
|
|
public static int[] metaSwapMap = new int[]{5, 7};
|
|
|
|
|
|
|
|
|
|
public LeverPart()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public LeverPart(int meta)
|
|
|
|
|
{
|
|
|
|
|
super(meta);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public Block getBlock()
|
|
|
|
|
{
|
|
|
|
|
return lever;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public String getType()
|
|
|
|
|
{
|
|
|
|
|
return "mc_lever";
|
|
|
|
|
}
|
|
|
|
|
|
2013-06-03 19:58:06 +10:00
|
|
|
public boolean active()
|
|
|
|
|
{
|
|
|
|
|
return (meta&8) > 0;
|
|
|
|
|
}
|
|
|
|
|
|
2013-06-02 13:38:59 +10:00
|
|
|
@Override
|
|
|
|
|
public Cuboid6 getBounds()
|
|
|
|
|
{
|
|
|
|
|
int m = meta & 7;
|
|
|
|
|
double d = 0.1875;
|
|
|
|
|
|
|
|
|
|
if (m == 1)
|
|
|
|
|
return new Cuboid6(0, 0.2, 0.5 - d, d * 2, 0.8, 0.5 + d);
|
|
|
|
|
if (m == 2)
|
|
|
|
|
return new Cuboid6(1 - d * 2, 0.2, 0.5 - d, 1, 0.8, 0.5 + d);
|
|
|
|
|
if (m == 3)
|
|
|
|
|
return new Cuboid6(0.5 - d, 0.2, 0, 0.5 + d, 0.8, d * 2);
|
|
|
|
|
if (m == 4)
|
|
|
|
|
return new Cuboid6(0.5 - d, 0.2, 1 - d * 2, 0.5 + d, 0.8, 1);
|
|
|
|
|
|
|
|
|
|
d = 0.25;
|
|
|
|
|
if (m == 0 || m == 7)
|
|
|
|
|
return new Cuboid6(0.5 - d, 0.4, 0.5 - d, 0.5 + d, 1, 0.5 + d);
|
|
|
|
|
|
|
|
|
|
return new Cuboid6(0.5 - d, 0, 0.5 - d, 0.5 + d, 0.6, 0.5 + d);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int sideForMeta(int meta)
|
|
|
|
|
{
|
|
|
|
|
return metaSideMap[meta&7];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static McBlockPart placement(World world, BlockCoord pos, EntityPlayer player, int side)
|
|
|
|
|
{
|
|
|
|
|
pos = pos.copy().offset(side^1);
|
|
|
|
|
if(!world.isBlockSolidOnSide(pos.x, pos.y, pos.z, ForgeDirection.getOrientation(side)))
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
int meta = sideMetaMap[side^1];
|
|
|
|
|
if(side < 2 && ((int)(player.rotationYaw / 90 + 0.5) & 1) == 0)
|
|
|
|
|
meta = metaSwapMap[side^1];
|
|
|
|
|
|
|
|
|
|
return new LeverPart(meta);
|
|
|
|
|
}
|
2013-06-02 19:47:07 +10:00
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean activate(EntityPlayer player, MovingObjectPosition part, ItemStack item)
|
|
|
|
|
{
|
2013-06-06 17:25:24 +10:00
|
|
|
World world = world();
|
2013-06-02 19:47:07 +10:00
|
|
|
if(world.isRemote)
|
|
|
|
|
return true;
|
|
|
|
|
|
2013-06-06 17:25:24 +10:00
|
|
|
world.playSoundEffect(x() + 0.5, y() + 0.5, z() + 0.5, "random.click", 0.3F, !active() ? 0.6F : 0.5F);
|
2013-06-04 01:47:51 +10:00
|
|
|
meta ^= 8;
|
2013-06-02 19:47:07 +10:00
|
|
|
sendDescUpdate();
|
|
|
|
|
tile().notifyPartChange();
|
2013-06-03 13:30:36 +10:00
|
|
|
tile().notifyNeighborChange(metaSideMap[meta&7]);
|
2013-06-02 19:47:07 +10:00
|
|
|
tile().markDirty();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2013-06-03 19:58:06 +10:00
|
|
|
|
|
|
|
|
@Override
|
2013-06-02 19:47:07 +10:00
|
|
|
public void drawBreaking(RenderBlocks renderBlocks)
|
|
|
|
|
{
|
|
|
|
|
IBlockAccess actual = renderBlocks.blockAccess;
|
|
|
|
|
renderBlocks.blockAccess = new PartMetaAccess(this);
|
2013-06-06 17:25:24 +10:00
|
|
|
renderBlocks.renderBlockLever(lever, x(), y(), z());
|
2013-06-02 19:47:07 +10:00
|
|
|
renderBlocks.blockAccess = actual;
|
|
|
|
|
}
|
2013-06-03 19:58:06 +10:00
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onRemoved()
|
|
|
|
|
{
|
|
|
|
|
if(active())
|
|
|
|
|
tile().notifyNeighborChange(metaSideMap[meta&7]);
|
|
|
|
|
}
|
2013-06-03 13:30:36 +10:00
|
|
|
|
2013-06-03 19:58:06 +10:00
|
|
|
@Override
|
|
|
|
|
public void onConverted()
|
|
|
|
|
{
|
|
|
|
|
if(active())
|
|
|
|
|
tile().notifyNeighborChange(metaSideMap[meta&7]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2013-06-03 13:30:36 +10:00
|
|
|
public int weakPowerLevel(int side)
|
|
|
|
|
{
|
2013-06-03 19:58:06 +10:00
|
|
|
return active() ? 15 : 0;
|
2013-06-03 13:30:36 +10:00
|
|
|
}
|
2013-06-03 19:58:06 +10:00
|
|
|
|
|
|
|
|
@Override
|
2013-06-03 13:30:36 +10:00
|
|
|
public int strongPowerLevel(int side)
|
|
|
|
|
{
|
2013-06-03 19:58:06 +10:00
|
|
|
return active() && side == metaSideMap[meta&7] ? 15 : 0;
|
2013-06-03 13:30:36 +10:00
|
|
|
}
|
2013-06-03 19:58:06 +10:00
|
|
|
|
|
|
|
|
@Override
|
2013-06-03 13:30:36 +10:00
|
|
|
public boolean canConnectRedstone(int side)
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2013-06-02 13:38:59 +10:00
|
|
|
}
|