Files
ForgeMultipart/codechicken/multipart/minecraft/LeverPart.java
T
Chicken Bones 16a3ea3875 Added some more redstone utilities and made sure masks line up
Fixed smoke particles on redstone torches (bugged in vanilla)
Added functions for world and coordinates on parts to clean code
Added more placement and world interaction events
Properly distinguished converted tiles
Fixed tick scheduler to remain in better sync with vanilla
2013-06-06 17:25:24 +10:00

147 lines
3.8 KiB
Java

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;
import net.minecraft.item.ItemStack;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeDirection;
import codechicken.core.vec.BlockCoord;
import codechicken.core.vec.Cuboid6;
import codechicken.multipart.IRedstonePart;
public class LeverPart extends McSidedMetaPart implements IRedstonePart
{
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";
}
public boolean active()
{
return (meta&8) > 0;
}
@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);
}
@Override
public boolean activate(EntityPlayer player, MovingObjectPosition part, ItemStack item)
{
World world = world();
if(world.isRemote)
return true;
world.playSoundEffect(x() + 0.5, y() + 0.5, z() + 0.5, "random.click", 0.3F, !active() ? 0.6F : 0.5F);
meta ^= 8;
sendDescUpdate();
tile().notifyPartChange();
tile().notifyNeighborChange(metaSideMap[meta&7]);
tile().markDirty();
return true;
}
@Override
public void drawBreaking(RenderBlocks renderBlocks)
{
IBlockAccess actual = renderBlocks.blockAccess;
renderBlocks.blockAccess = new PartMetaAccess(this);
renderBlocks.renderBlockLever(lever, x(), y(), z());
renderBlocks.blockAccess = actual;
}
@Override
public void onRemoved()
{
if(active())
tile().notifyNeighborChange(metaSideMap[meta&7]);
}
@Override
public void onConverted()
{
if(active())
tile().notifyNeighborChange(metaSideMap[meta&7]);
}
@Override
public int weakPowerLevel(int side)
{
return active() ? 15 : 0;
}
@Override
public int strongPowerLevel(int side)
{
return active() && side == metaSideMap[meta&7] ? 15 : 0;
}
@Override
public boolean canConnectRedstone(int side)
{
return true;
}
}