summaryrefslogtreecommitdiff
path: root/src/main/java/darkknight/jewelrycraft/util/BlockUtils.java
blob: a5f7684674bda6ef2b1613ef869ebe9e86803bfe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package darkknight.jewelrycraft.util;


import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MathHelper;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;

public class BlockUtils
{

    public static final ForgeDirection DEFAULT_BLOCK_DIRECTION = ForgeDirection.WEST;

    public static ForgeDirection get2dOrientation(EntityLivingBase entity) 
    {
        int l = MathHelper.floor_double(entity.rotationYaw * 4.0F / 360.0F + 0.5D) & 0x3;
        switch (l) {
            case 0:
                return ForgeDirection.SOUTH;
            case 1:
                return ForgeDirection.WEST;
            case 2:
                return ForgeDirection.NORTH;
            case 3:
                return ForgeDirection.EAST;
        }
        return ForgeDirection.SOUTH;

    }

    public static float getRotationFromDirection(ForgeDirection direction) {
        switch (direction) {
            case NORTH:
                return 0F;
            case SOUTH:
                return 180F;
            case WEST:
                return 90F;
            case EAST:
                return -90F;
            case DOWN:
                return -90f;
            case UP:
                return 90f;
            default:
                return 0f;
        }
    }

    public static ForgeDirection get3dOrientation(EntityLivingBase entity) {
        if (entity.rotationPitch > 45.5F) {
            return ForgeDirection.DOWN;
        } else if (entity.rotationPitch < -45.5F) { return ForgeDirection.UP; }
        return get2dOrientation(entity);
    }

    public static EntityItem dropItemStackInWorld(World worldObj, double x, double y, double z, ItemStack stack) {
        float f = 0.7F;
        float d0 = worldObj.rand.nextFloat() * f + (1.0F - f) * 0.5F;
        float d1 = worldObj.rand.nextFloat() * f + (1.0F - f) * 0.5F;
        float d2 = worldObj.rand.nextFloat() * f + (1.0F - f) * 0.5F;
        EntityItem entityitem = new EntityItem(worldObj, x + d0, y + d1, z + d2, stack);
        entityitem.delayBeforeCanPickup = 10;
        if (stack.hasTagCompound()) {
            entityitem.getEntityItem().setTagCompound((NBTTagCompound)stack.getTagCompound().copy());
        }
        worldObj.spawnEntityInWorld(entityitem);
        return entityitem;
    }

    public static EntityItem ejectItemInDirection(World world, double x, double y, double z, ForgeDirection direction, ItemStack stack) {
        EntityItem item = BlockUtils.dropItemStackInWorld(world, x, y, z, stack);
        item.motionX = direction.offsetX / 5F;
        item.motionY = direction.offsetY / 5F;
        item.motionZ = direction.offsetZ / 5F;
        return item;
    }

    public static void dropInventory(IInventory inventory, World world, double x, double y, double z) {
        if (inventory == null) { return; }
        for (int i = 0; i < inventory.getSizeInventory(); ++i) {
            ItemStack itemStack = inventory.getStackInSlot(i);
            if (itemStack != null) {
                dropItemStackInWorld(world, x, y, z, itemStack);
            }
        }
    }

    public static void dropInventory(IInventory inventory, World world, int x, int y, int z) {
        dropInventory(inventory, world, x + 0.5, y + 0.5, z + 0.5);
    }

    public static TileEntity getTileInDirection(TileEntity tile, ForgeDirection direction) {
        int targetX = tile.xCoord + direction.offsetX;
        int targetY = tile.yCoord + direction.offsetY;
        int targetZ = tile.zCoord + direction.offsetZ;
        return tile.getWorldObj().getTileEntity(targetX, targetY, targetZ);
    }

    public static int getFirstNonAirBlockFromTop(World world, int x, int z) {
        int y;
        for (y = world.getActualHeight(); world.isAirBlock(x, y - 1, z) && y > 0; y--) {}
        return y;
    }

    public static boolean isBlockHit(MovingObjectPosition mop, TileEntity tile) {
        if (tile == null) return false;
        return isBlockHit(mop, tile.xCoord, tile.yCoord, tile.zCoord);
    }

    public static boolean isBlockHit(MovingObjectPosition mop, int x, int y, int z) {
        if (mop == null) return false;
        return mop.blockX == x && mop.blockY == y && mop.blockZ == z;
    }

}