mirror of
https://github.com/GTNewHorizons/ForgeMultipart.git
synced 2026-11-12 16:37:38 +00:00
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
147 lines
3.8 KiB
Java
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;
|
|
}
|
|
}
|