| package universalelectricity.prefab.block; |
| |
| import net.minecraft.block.material.Material; |
| import net.minecraft.entity.EntityLivingBase; |
| import net.minecraft.entity.player.EntityPlayer; |
| import net.minecraft.item.ItemStack; |
| import net.minecraft.util.MathHelper; |
| import net.minecraft.world.World; |
| import net.minecraftforge.common.ForgeDirection; |
| |
| /** |
| * A block that can rotate based on placed position and wrenching. |
| * |
| * @author Calclavia |
| * |
| */ |
| public abstract class BlockRotatable extends BlockTile |
| { |
| public BlockRotatable(int id, Material material) |
| { |
| super(id, material); |
| } |
| |
| @Override |
| public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entityLiving, ItemStack itemStack) |
| { |
| int angle = MathHelper.floor_double((entityLiving.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; |
| int change = 3; |
| |
| switch (angle) |
| { |
| case 0: |
| change = 2; |
| break; |
| |
| case 1: |
| change = 5; |
| break; |
| |
| case 2: |
| change = 3; |
| break; |
| |
| case 3: |
| change = 4; |
| break; |
| } |
| |
| world.setBlockMetadataWithNotify(x, y, z, change, 3); |
| } |
| |
| @Override |
| public boolean onUseWrench(World world, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) |
| { |
| this.rotateBlock(world, x, y, z, ForgeDirection.getOrientation(side)); |
| return true; |
| } |
| |
| public static boolean rotateBlock(World worldObj, int x, int y, int z, ForgeDirection axis, int mask) |
| { |
| int rotMeta = worldObj.getBlockMetadata(x, y, z); |
| int masked = rotMeta & ~mask; |
| ForgeDirection orientation = ForgeDirection.getOrientation(rotMeta & mask); |
| ForgeDirection rotated = orientation.getRotation(axis); |
| worldObj.setBlockMetadataWithNotify(x, y, z, rotated.ordinal() & mask | masked, 3); |
| return true; |
| } |
| } |