summaryrefslogtreecommitdiff
path: root/java/darkknight/jewelrycraft/util/BlockUtils.java
blob: 385c1757178356d2456d5492454ba71942500cc9 (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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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;
    }
    
}