001package net.minecraftforge.common;
002
003import net.minecraft.block.Block;
004import net.minecraft.block.BlockChest;
005import net.minecraft.block.BlockDispenser;
006import net.minecraft.block.BlockDropper;
007import net.minecraft.block.BlockPistonBase;
008import net.minecraft.world.World;
009import static net.minecraftforge.common.ForgeDirection.*;
010
011public class RotationHelper {
012
013    private static final ForgeDirection[] UP_DOWN_AXES = new ForgeDirection[] { UP, DOWN };
014    public static ForgeDirection[] getValidVanillaBlockRotations(Block block)
015    {
016        return block instanceof BlockChest ? UP_DOWN_AXES : VALID_DIRECTIONS;
017    }
018
019    public static boolean rotateVanillaBlock(Block block, World worldObj, int x, int y, int z, ForgeDirection axis)
020    {
021        if (worldObj.isRemote)
022        {
023            return false;
024        }
025
026        if (block instanceof BlockChest && (axis == UP || axis == DOWN))
027        {
028            return rotateBlock(worldObj, x, y, z, axis, 0x7);
029        }
030        if (block instanceof BlockPistonBase || block instanceof BlockDropper || block instanceof BlockDispenser)
031        {
032            return rotateBlock(worldObj, x, y, z, axis, 0x7);
033        }
034        return false;
035    }
036
037    private static boolean rotateBlock(World worldObj, int x, int y, int z, ForgeDirection axis, int mask)
038    {
039        int rotMeta = worldObj.getBlockMetadata(x, y, z);
040        int masked = rotMeta & ~mask;
041        ForgeDirection orientation = ForgeDirection.getOrientation(rotMeta & mask);
042        ForgeDirection rotated = orientation.getRotation(axis);
043        worldObj.setBlockMetadataWithNotify(x,y,z,rotated.ordinal() & mask | masked,3);
044        return true;
045    }
046
047}