Search in sources :

Example 6 with Vec3d

use of net.minecraft.util.math.Vec3d in project ImmersiveEngineering by BluSunrize.

the class ClientEventHandler method drawBlockOverlayArrow.

public static void drawBlockOverlayArrow(Tessellator tessellator, VertexBuffer vertexbuffer, Vec3d directionVec, EnumFacing side, AxisAlignedBB targetedBB) {
    Vec3d[] translatedPositions = new Vec3d[arrowCoords.length];
    Matrix4 mat = new Matrix4();
    Vec3d defaultDir = side.getAxis() == Axis.Y ? new Vec3d(0, 0, 1) : new Vec3d(0, 1, 0);
    directionVec = directionVec.normalize();
    double angle = Math.acos(defaultDir.dotProduct(directionVec));
    Vec3d axis = defaultDir.crossProduct(directionVec);
    mat.rotate(angle, axis.xCoord, axis.yCoord, axis.zCoord);
    if (side != null) {
        if (side.getAxis() == Axis.Z)
            mat.rotate(Math.PI / 2, 1, 0, 0).rotate(Math.PI, 0, 1, 0);
        else if (side.getAxis() == Axis.X)
            mat.rotate(Math.PI / 2, 0, 0, 1).rotate(Math.PI / 2, 0, 1, 0);
    }
    for (int i = 0; i < translatedPositions.length; i++) {
        Vec3d vec = mat.apply(new Vec3d(arrowCoords[i][0], 0, arrowCoords[i][1])).addVector(.5, .5, .5);
        if (side != null && targetedBB != null)
            vec = new Vec3d(side == EnumFacing.WEST ? targetedBB.minX - .002 : side == EnumFacing.EAST ? targetedBB.maxX + .002 : vec.xCoord, side == EnumFacing.DOWN ? targetedBB.minY - .002 : side == EnumFacing.UP ? targetedBB.maxY + .002 : vec.yCoord, side == EnumFacing.NORTH ? targetedBB.minZ - .002 : side == EnumFacing.SOUTH ? targetedBB.maxZ + .002 : vec.zCoord);
        translatedPositions[i] = vec;
    }
    vertexbuffer.begin(6, DefaultVertexFormats.POSITION_COLOR);
    for (Vec3d point : translatedPositions) vertexbuffer.pos(point.xCoord, point.yCoord, point.zCoord).color(Lib.COLOUR_F_ImmersiveOrange[0], Lib.COLOUR_F_ImmersiveOrange[1], Lib.COLOUR_F_ImmersiveOrange[2], 0.4F).endVertex();
    tessellator.draw();
    vertexbuffer.begin(2, DefaultVertexFormats.POSITION_COLOR);
    for (Vec3d point : translatedPositions) vertexbuffer.pos(point.xCoord, point.yCoord, point.zCoord).color(0, 0, 0, 0.4F).endVertex();
    tessellator.draw();
}
Also used : Vec3d(net.minecraft.util.math.Vec3d) Matrix4(blusunrize.immersiveengineering.common.util.chickenbones.Matrix4)

Example 7 with Vec3d

use of net.minecraft.util.math.Vec3d in project ImmersiveEngineering by BluSunrize.

the class ClientEventHandler method renderAdditionalBlockBounds.

@SubscribeEvent()
public void renderAdditionalBlockBounds(DrawBlockHighlightEvent event) {
    if (event.getSubID() == 0 && event.getTarget().typeOfHit == RayTraceResult.Type.BLOCK) {
        float f1 = 0.002F;
        double px = -TileEntityRendererDispatcher.staticPlayerX;
        double py = -TileEntityRendererDispatcher.staticPlayerY;
        double pz = -TileEntityRendererDispatcher.staticPlayerZ;
        TileEntity tile = event.getPlayer().worldObj.getTileEntity(event.getTarget().getBlockPos());
        ItemStack stack = event.getPlayer().getHeldItem(EnumHand.MAIN_HAND);
        //			if(event.getPlayer().worldObj.getBlockState(event.getTarget().getBlockPos()).getBlock() instanceof IEBlockInterfaces.ICustomBoundingboxes)
        if (tile instanceof IAdvancedSelectionBounds) {
            //				IEBlockInterfaces.ICustomBoundingboxes block = (IEBlockInterfaces.ICustomBoundingboxes) event.getPlayer().worldObj.getBlockState(event.getTarget().getBlockPos()).getBlock();
            IAdvancedSelectionBounds iasb = (IAdvancedSelectionBounds) tile;
            List<AxisAlignedBB> boxes = iasb.getAdvancedSelectionBounds();
            if (boxes != null && !boxes.isEmpty()) {
                GlStateManager.enableBlend();
                GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
                GlStateManager.glLineWidth(2.0F);
                GlStateManager.disableTexture2D();
                GlStateManager.depthMask(false);
                ArrayList<AxisAlignedBB> additionalBoxes = new ArrayList<AxisAlignedBB>();
                AxisAlignedBB overrideBox = null;
                for (AxisAlignedBB aabb : boxes) if (aabb != null) {
                    if (iasb.isOverrideBox(aabb, event.getPlayer(), event.getTarget(), additionalBoxes))
                        overrideBox = aabb;
                }
                if (overrideBox != null)
                    RenderGlobal.func_189697_a(overrideBox.expand(f1, f1, f1).offset(px, py, pz), 0, 0, 0, 0.4f);
                else
                    for (AxisAlignedBB aabb : additionalBoxes.isEmpty() ? boxes : additionalBoxes) RenderGlobal.func_189697_a(aabb.expand(f1, f1, f1).offset(px, py, pz), 0, 0, 0, 0.4f);
                GlStateManager.depthMask(true);
                GlStateManager.enableTexture2D();
                GlStateManager.disableBlend();
                event.setCanceled(true);
            }
        }
        if (Utils.isHammer(stack) && tile instanceof TileEntityTurntable) {
            BlockPos pos = event.getTarget().getBlockPos();
            GlStateManager.enableBlend();
            GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
            GlStateManager.glLineWidth(2.0F);
            GlStateManager.disableTexture2D();
            GlStateManager.depthMask(false);
            Tessellator tessellator = Tessellator.getInstance();
            VertexBuffer vertexbuffer = tessellator.getBuffer();
            EnumFacing f = ((TileEntityTurntable) tile).getFacing();
            double tx = pos.getX() + .5;
            double ty = pos.getY() + .5;
            double tz = pos.getZ() + .5;
            if (!event.getPlayer().worldObj.isAirBlock(pos.offset(f))) {
                tx += f.getFrontOffsetX();
                ty += f.getFrontOffsetY();
                tz += f.getFrontOffsetZ();
            }
            vertexbuffer.setTranslation(tx + px, ty + py, tz + pz);
            double angle = -event.getPlayer().ticksExisted % 80 / 40d * Math.PI;
            drawRotationArrows(tessellator, vertexbuffer, f, angle, ((TileEntityTurntable) tile).invert);
            vertexbuffer.setTranslation(0, 0, 0);
            GlStateManager.depthMask(true);
            GlStateManager.enableTexture2D();
            GlStateManager.disableBlend();
        }
        World world = event.getPlayer().worldObj;
        if (stack != null && IEContent.blockConveyor.equals(Block.getBlockFromItem(stack.getItem())) && event.getTarget().sideHit.getAxis() == Axis.Y) {
            EnumFacing side = event.getTarget().sideHit;
            BlockPos pos = event.getTarget().getBlockPos();
            AxisAlignedBB targetedBB = world.getBlockState(pos).getSelectedBoundingBox(world, pos);
            if (targetedBB != null)
                targetedBB = targetedBB.offset(-pos.getX(), -pos.getY(), -pos.getZ());
            GlStateManager.enableBlend();
            GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
            GlStateManager.glLineWidth(2.0F);
            GlStateManager.disableTexture2D();
            GlStateManager.depthMask(false);
            Tessellator tessellator = Tessellator.getInstance();
            VertexBuffer vertexbuffer = tessellator.getBuffer();
            vertexbuffer.setTranslation(pos.getX() + px, pos.getY() + py, pos.getZ() + pz);
            double[][] points = new double[4][];
            if (side.getAxis() == Axis.Y) {
                points[0] = new double[] { 0 - f1, side == EnumFacing.DOWN ? ((targetedBB != null ? targetedBB.minY : 0) - f1) : ((targetedBB != null ? targetedBB.maxY : 1) + f1), 0 - f1 };
                points[1] = new double[] { 1 + f1, side == EnumFacing.DOWN ? ((targetedBB != null ? targetedBB.minY : 0) - f1) : ((targetedBB != null ? targetedBB.maxY : 1) + f1), 1 + f1 };
                points[2] = new double[] { 0 - f1, side == EnumFacing.DOWN ? ((targetedBB != null ? targetedBB.minY : 0) - f1) : ((targetedBB != null ? targetedBB.maxY : 1) + f1), 1 + f1 };
                points[3] = new double[] { 1 + f1, side == EnumFacing.DOWN ? ((targetedBB != null ? targetedBB.minY : 0) - f1) : ((targetedBB != null ? targetedBB.maxY : 1) + f1), 0 - f1 };
            } else if (side.getAxis() == Axis.Z) {
                points[0] = new double[] { 1 + f1, 1 + f1, side == EnumFacing.NORTH ? ((targetedBB != null ? targetedBB.minZ : 0) - f1) : ((targetedBB != null ? targetedBB.maxZ : 1) + f1) };
                points[1] = new double[] { 0 - f1, 0 - f1, side == EnumFacing.NORTH ? ((targetedBB != null ? targetedBB.minZ : 0) - f1) : ((targetedBB != null ? targetedBB.maxZ : 1) + f1) };
                points[2] = new double[] { 0 - f1, 1 + f1, side == EnumFacing.NORTH ? ((targetedBB != null ? targetedBB.minZ : 0) - f1) : ((targetedBB != null ? targetedBB.maxZ : 1) + f1) };
                points[3] = new double[] { 1 + f1, 0 - f1, side == EnumFacing.NORTH ? ((targetedBB != null ? targetedBB.minZ : 0) - f1) : ((targetedBB != null ? targetedBB.maxZ : 1) + f1) };
            } else {
                points[0] = new double[] { side == EnumFacing.WEST ? ((targetedBB != null ? targetedBB.minX : 0) - f1) : ((targetedBB != null ? targetedBB.maxX : 1) + f1), 1 + f1, 1 + f1 };
                points[1] = new double[] { side == EnumFacing.WEST ? ((targetedBB != null ? targetedBB.minX : 0) - f1) : ((targetedBB != null ? targetedBB.maxX : 1) + f1), 0 - f1, 0 - f1 };
                points[2] = new double[] { side == EnumFacing.WEST ? ((targetedBB != null ? targetedBB.minX : 0) - f1) : ((targetedBB != null ? targetedBB.maxX : 1) + f1), 1 + f1, 0 - f1 };
                points[3] = new double[] { side == EnumFacing.WEST ? ((targetedBB != null ? targetedBB.minX : 0) - f1) : ((targetedBB != null ? targetedBB.maxX : 1) + f1), 0 - f1, 1 + f1 };
            }
            vertexbuffer.begin(1, DefaultVertexFormats.POSITION_COLOR);
            for (double[] point : points) vertexbuffer.pos(point[0], point[1], point[2]).color(0, 0, 0, 0.4F).endVertex();
            tessellator.draw();
            vertexbuffer.begin(2, DefaultVertexFormats.POSITION_COLOR);
            vertexbuffer.pos(points[0][0], points[0][1], points[0][2]).color(0, 0, 0, 0.4F).endVertex();
            vertexbuffer.pos(points[2][0], points[2][1], points[2][2]).color(0, 0, 0, 0.4F).endVertex();
            vertexbuffer.pos(points[1][0], points[1][1], points[1][2]).color(0, 0, 0, 0.4F).endVertex();
            vertexbuffer.pos(points[3][0], points[3][1], points[3][2]).color(0, 0, 0, 0.4F).endVertex();
            tessellator.draw();
            float xFromMid = side.getAxis() == Axis.X ? 0 : (float) event.getTarget().hitVec.xCoord - pos.getX() - .5f;
            float yFromMid = side.getAxis() == Axis.Y ? 0 : (float) event.getTarget().hitVec.yCoord - pos.getY() - .5f;
            float zFromMid = side.getAxis() == Axis.Z ? 0 : (float) event.getTarget().hitVec.zCoord - pos.getZ() - .5f;
            float max = Math.max(Math.abs(yFromMid), Math.max(Math.abs(xFromMid), Math.abs(zFromMid)));
            Vec3d dir = new Vec3d(max == Math.abs(xFromMid) ? Math.signum(xFromMid) : 0, max == Math.abs(yFromMid) ? Math.signum(yFromMid) : 0, max == Math.abs(zFromMid) ? Math.signum(zFromMid) : 0);
            if (dir != null)
                drawBlockOverlayArrow(tessellator, vertexbuffer, dir, side, targetedBB);
            vertexbuffer.setTranslation(0, 0, 0);
            GlStateManager.depthMask(true);
            GlStateManager.enableTexture2D();
            GlStateManager.disableBlend();
        }
        if (stack != null && stack.getItem() instanceof ItemDrill && ((ItemDrill) stack.getItem()).isEffective(world.getBlockState(event.getTarget().getBlockPos()).getMaterial())) {
            ItemStack head = ((ItemDrill) stack.getItem()).getHead(stack);
            if (head != null) {
                ImmutableList<BlockPos> blocks = ((IDrillHead) head.getItem()).getExtraBlocksDug(head, world, event.getPlayer(), event.getTarget());
                drawAdditionalBlockbreak(event.getContext(), event.getPlayer(), event.getPartialTicks(), blocks);
            }
        }
    }
}
Also used : AxisAlignedBB(net.minecraft.util.math.AxisAlignedBB) IDrillHead(blusunrize.immersiveengineering.api.tool.IDrillHead) TileEntityTurntable(blusunrize.immersiveengineering.common.blocks.wooden.TileEntityTurntable) EnumFacing(net.minecraft.util.EnumFacing) World(net.minecraft.world.World) Vec3d(net.minecraft.util.math.Vec3d) TileEntity(net.minecraft.tileentity.TileEntity) IAdvancedSelectionBounds(blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IAdvancedSelectionBounds) BlockPos(net.minecraft.util.math.BlockPos) ItemStack(net.minecraft.item.ItemStack) SubscribeEvent(net.minecraftforge.fml.common.eventhandler.SubscribeEvent)

Example 8 with Vec3d

use of net.minecraft.util.math.Vec3d in project ImmersiveEngineering by BluSunrize.

the class ConveyorVertical method getDirection.

@Override
public Vec3d getDirection(TileEntity conveyorTile, Entity entity, EnumFacing facing) {
    BlockPos posWall = conveyorTile.getPos().offset(facing);
    double d = .625 + entity.width;
    double distToWall = Math.abs((facing.getAxis() == Axis.Z ? posWall.getZ() : posWall.getX()) + .5 - (facing.getAxis() == Axis.Z ? entity.posZ : entity.posX));
    if (distToWall > d)
        return super.getDirection(conveyorTile, entity, facing);
    double vBase = entity instanceof EntityLivingBase ? 1.5 : 1.15;
    double distY = Math.abs(conveyorTile.getPos().add(0, 1, 0).getY() + .5 - entity.posY);
    double treshold = .9;
    boolean contact = distY < treshold;
    double vX = entity.motionX;
    double vY = 0.1 * vBase;
    double vZ = entity.motionZ;
    if (entity.motionY < 0)
        vY += entity.motionY * .9;
    if (!(entity instanceof EntityPlayer)) {
        vX = 0.05 * facing.getFrontOffsetX();
        vZ = 0.05 * facing.getFrontOffsetZ();
        if (facing == EnumFacing.WEST || facing == EnumFacing.EAST) {
            if (entity.posZ > conveyorTile.getPos().getZ() + 0.65D)
                vZ = -0.1D * vBase;
            else if (entity.posZ < conveyorTile.getPos().getZ() + 0.35D)
                vZ = 0.1D * vBase;
        } else if (facing == EnumFacing.NORTH || facing == EnumFacing.SOUTH) {
            if (entity.posX > conveyorTile.getPos().getX() + 0.65D)
                vX = -0.1D * vBase;
            else if (entity.posX < conveyorTile.getPos().getX() + 0.35D)
                vX = 0.1D * vBase;
        }
    }
    //Little boost at the top of a conveyor to help players and minecarts to get off
    if (contact && !(conveyorTile.getWorld().getTileEntity(conveyorTile.getPos().add(0, 1, 0)) instanceof IConveyorTile))
        vY *= 2.25;
    return new Vec3d(vX, vY, vZ);
}
Also used : EntityLivingBase(net.minecraft.entity.EntityLivingBase) EntityPlayer(net.minecraft.entity.player.EntityPlayer) BlockPos(net.minecraft.util.math.BlockPos) IConveyorTile(blusunrize.immersiveengineering.api.tool.ConveyorHandler.IConveyorTile) Vec3d(net.minecraft.util.math.Vec3d)

Example 9 with Vec3d

use of net.minecraft.util.math.Vec3d in project ImmersiveEngineering by BluSunrize.

the class ConveyorVertical method onEntityCollision.

@Override
public void onEntityCollision(TileEntity tile, Entity entity, EnumFacing facing) {
    if (!isActive(tile))
        return;
    BlockPos posWall = tile.getPos().offset(facing);
    double d = .625 + entity.width;
    double distToWall = Math.abs((facing.getAxis() == Axis.Z ? posWall.getZ() : posWall.getX()) + .5 - (facing.getAxis() == Axis.Z ? entity.posZ : entity.posX));
    if (distToWall > d) {
        super.onEntityCollision(tile, entity, facing);
        return;
    }
    if (entity != null && !entity.isDead && !(entity instanceof EntityPlayer && entity.isSneaking())) {
        double distY = Math.abs(tile.getPos().add(0, 1, 0).getY() + .5 - entity.posY);
        double treshold = .9;
        boolean contact = distY < treshold;
        entity.onGround = false;
        if (entity.fallDistance < 3)
            entity.fallDistance = 0;
        else
            entity.fallDistance *= .9;
        Vec3d vec = getDirection(tile, entity, facing);
        entity.motionX = vec.xCoord;
        entity.motionY = vec.yCoord;
        entity.motionZ = vec.zCoord;
        if (!contact)
            ConveyorHandler.applyMagnetSupression(entity, (IConveyorTile) tile);
        else {
            BlockPos posTop = tile.getPos().add(0, 1, 0);
            if (!((tile.getWorld().getTileEntity(posTop) instanceof IConveyorTile) || (tile.getWorld().isAirBlock(posTop) && (tile.getWorld().getTileEntity(posTop.offset(facing)) instanceof IConveyorTile))))
                ConveyorHandler.revertMagnetSupression(entity, (IConveyorTile) tile);
        }
        if (entity instanceof EntityItem) {
            ((EntityItem) entity).setNoDespawn();
            TileEntity inventoryTile;
            inventoryTile = tile.getWorld().getTileEntity(tile.getPos().add(0, 1, 0));
            if (!tile.getWorld().isRemote) {
                if (contact && inventoryTile != null && !(inventoryTile instanceof IConveyorTile)) {
                    ItemStack stack = ((EntityItem) entity).getEntityItem();
                    if (stack != null) {
                        ItemStack ret = Utils.insertStackIntoInventory(inventoryTile, stack, EnumFacing.DOWN);
                        if (ret == null)
                            entity.setDead();
                        else if (ret.stackSize < stack.stackSize)
                            ((EntityItem) entity).setEntityItemStack(ret);
                    }
                }
            }
        }
    }
}
Also used : TileEntity(net.minecraft.tileentity.TileEntity) EntityPlayer(net.minecraft.entity.player.EntityPlayer) BlockPos(net.minecraft.util.math.BlockPos) ItemStack(net.minecraft.item.ItemStack) IConveyorTile(blusunrize.immersiveengineering.api.tool.ConveyorHandler.IConveyorTile) Vec3d(net.minecraft.util.math.Vec3d) EntityItem(net.minecraft.entity.item.EntityItem)

Example 10 with Vec3d

use of net.minecraft.util.math.Vec3d in project ImmersiveEngineering by BluSunrize.

the class TileEntityWatermill method getHorizontalVec.

Vec3d getHorizontalVec() {
    Vec3d dir = new Vec3d(0, 0, 0);
    boolean faceZ = facing.ordinal() <= 3;
    dir = Utils.addVectors(dir, Utils.getFlowVector(worldObj, getPos().add(-(faceZ ? 1 : 0), +3, -(faceZ ? 0 : 1))));
    dir = Utils.addVectors(dir, Utils.getFlowVector(worldObj, getPos().add(0, +3, 0)));
    dir = Utils.addVectors(dir, Utils.getFlowVector(worldObj, getPos().add(+(faceZ ? 1 : 0), +3, +(faceZ ? 0 : 1))));
    dir = Utils.addVectors(dir, Utils.getFlowVector(worldObj, getPos().add(-(faceZ ? 2 : 0), +2, -(faceZ ? 0 : 2))));
    dir = Utils.addVectors(dir, Utils.getFlowVector(worldObj, getPos().add(+(faceZ ? 2 : 0), +2, +(faceZ ? 0 : 2))));
    dir = dir.subtract(Utils.getFlowVector(worldObj, getPos().add(-(faceZ ? 2 : 0), -2, -(faceZ ? 0 : 2))));
    dir = dir.subtract(Utils.getFlowVector(worldObj, getPos().add(+(faceZ ? 2 : 0), -2, +(faceZ ? 0 : 2))));
    dir = dir.subtract(Utils.getFlowVector(worldObj, getPos().add(-(faceZ ? 1 : 0), -3, -(faceZ ? 0 : 1))));
    dir = dir.subtract(Utils.getFlowVector(worldObj, getPos().add(0, -3, 0)));
    dir = dir.subtract(Utils.getFlowVector(worldObj, getPos().add(+(faceZ ? 1 : 0), -3, +(faceZ ? 0 : 1))));
    return dir;
}
Also used : Vec3d(net.minecraft.util.math.Vec3d)

Aggregations

Vec3d (net.minecraft.util.math.Vec3d)161 BlockPos (net.minecraft.util.math.BlockPos)44 Entity (net.minecraft.entity.Entity)27 IBlockState (net.minecraft.block.state.IBlockState)21 TileEntity (net.minecraft.tileentity.TileEntity)20 EntityLivingBase (net.minecraft.entity.EntityLivingBase)18 EntityPlayer (net.minecraft.entity.player.EntityPlayer)17 AxisAlignedBB (net.minecraft.util.math.AxisAlignedBB)17 EnumFacing (net.minecraft.util.EnumFacing)16 ItemStack (net.minecraft.item.ItemStack)13 RayTraceResult (net.minecraft.util.math.RayTraceResult)12 World (net.minecraft.world.World)10 SideOnly (net.minecraftforge.fml.relauncher.SideOnly)8 PhysicsWrapperEntity (ValkyrienWarfareBase.PhysicsManagement.PhysicsWrapperEntity)7 Matrix4 (blusunrize.immersiveengineering.common.util.chickenbones.Matrix4)7 NBTTagList (net.minecraft.nbt.NBTTagList)7 EntityItem (net.minecraft.entity.item.EntityItem)6 NBTTagCompound (net.minecraft.nbt.NBTTagCompound)6 Vector (ValkyrienWarfareBase.API.Vector)5 IImmersiveConnectable (blusunrize.immersiveengineering.api.energy.wires.IImmersiveConnectable)5