Package buildcraft.energy

Source Code of buildcraft.energy.BlockEngine

/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.energy;

import java.util.List;
import java.util.Random;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.IIcon;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.Vec3;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;

import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

import net.minecraftforge.common.util.ForgeDirection;

import buildcraft.BuildCraftCore;
import buildcraft.api.events.BlockInteractionEvent;
import buildcraft.core.BlockBuildCraft;
import buildcraft.core.ICustomHighlight;
import buildcraft.core.IItemPipe;

public class BlockEngine extends BlockBuildCraft implements ICustomHighlight {

  private static final AxisAlignedBB[][] boxes = {
      {AxisAlignedBB.getBoundingBox(0.0, 0.5, 0.0, 1.0, 1.0, 1.0), AxisAlignedBB.getBoundingBox(0.25, 0.0, 0.25, 0.75, 0.5, 0.75)}, // -Y
      {AxisAlignedBB.getBoundingBox(0.0, 0.0, 0.0, 1.0, 0.5, 1.0), AxisAlignedBB.getBoundingBox(0.25, 0.5, 0.25, 0.75, 1.0, 0.75)}, // +Y
      {AxisAlignedBB.getBoundingBox(0.0, 0.0, 0.5, 1.0, 1.0, 1.0), AxisAlignedBB.getBoundingBox(0.25, 0.25, 0.0, 0.75, 0.75, 0.5)}, // -Z
      {AxisAlignedBB.getBoundingBox(0.0, 0.0, 0.0, 1.0, 1.0, 0.5), AxisAlignedBB.getBoundingBox(0.25, 0.25, 0.5, 0.75, 0.75, 1.0)}, // +Z
      {AxisAlignedBB.getBoundingBox(0.5, 0.0, 0.0, 1.0, 1.0, 1.0), AxisAlignedBB.getBoundingBox(0.0, 0.25, 0.25, 0.5, 0.75, 0.75)}, // -X
      {AxisAlignedBB.getBoundingBox(0.0, 0.0, 0.0, 0.5, 1.0, 1.0), AxisAlignedBB.getBoundingBox(0.5, 0.25, 0.25, 1.0, 0.75, 0.75)} // +X
  };

  private static IIcon woodTexture;
  private static IIcon stoneTexture;
  private static IIcon ironTexture;

  public BlockEngine() {
    super(Material.iron);
    setBlockName("engineBlock");
  }

  @Override
  public boolean isOpaqueCube() {
    return false;
  }

  @Override
  public boolean renderAsNormalBlock() {
    return false;
  }

  @Override
  @SideOnly(Side.CLIENT)
  public void registerBlockIcons(IIconRegister par1IconRegister) {
    woodTexture = par1IconRegister.registerIcon("buildcraft:engineWoodBottom");
    stoneTexture = par1IconRegister.registerIcon("buildcraft:engineStoneBottom");
    ironTexture = par1IconRegister.registerIcon("buildcraft:engineIronBottom");
  }

  @Override
  public int getRenderType() {
    return BuildCraftCore.blockByEntityModel;
  }

  @Override
  public TileEntity createTileEntity(World world, int metadata) {
    switch (metadata) {
      case 0:
        return new TileEngineWood();
      case 1:
        return new TileEngineStone();
      case 2:
        return new TileEngineIron();
      case 3:
        return new TileEngineCreative();
      default:
        return new TileEngineWood();
    }
  }

  @Override
  public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) {
    TileEntity tile = world.getTileEntity(x, y, z);

    if (tile instanceof TileEngine) {
      return ((TileEngine) tile).orientation.getOpposite() == side;
    } else {
      return false;
    }
  }

  @Override
  public boolean rotateBlock(World world, int x, int y, int z, ForgeDirection axis) {
    TileEntity tile = world.getTileEntity(x, y, z);

    if (tile instanceof TileEngine) {
      return ((TileEngine) tile).switchOrientation(false);
    } else {
      return false;
    }
  }

  @Override
  public boolean onBlockActivated(World world, int i, int j, int k, EntityPlayer player, int side, float par7, float par8, float par9) {

    TileEntity tile = world.getTileEntity(i, j, k);

    // REMOVED DUE TO CREATIVE ENGINE REQUIREMENTS - dmillerw
    // Drop through if the player is sneaking
//    if (player.isSneaking()) {
//      return false;
//    }

    BlockInteractionEvent event = new BlockInteractionEvent(player, this, world.getBlockMetadata(i, j, k));
    FMLCommonHandler.instance().bus().post(event);
    if (event.isCanceled()) {
      return false;
    }

    // Do not open guis when having a pipe in hand
    if (player.getCurrentEquippedItem() != null) {
      if (player.getCurrentEquippedItem().getItem() instanceof IItemPipe) {
        return false;
      }
    }

    if (tile instanceof TileEngine) {
      return ((TileEngine) tile).onBlockActivated(player, ForgeDirection.getOrientation(side));
    }

    return false;
  }

  @Override
  @SuppressWarnings("unchecked")
  public void addCollisionBoxesToList(World wrd, int x, int y, int z, AxisAlignedBB mask, List list, Entity ent) {
    TileEntity tile = wrd.getTileEntity(x, y, z);
    if (tile instanceof TileEngine) {
      AxisAlignedBB[] aabbs = boxes[((TileEngine) tile).orientation.ordinal()];
      for (AxisAlignedBB aabb : aabbs) {
        AxisAlignedBB aabbTmp = aabb.getOffsetBoundingBox(x, y, z);
        if (mask.intersectsWith(aabbTmp)) {
          list.add(aabbTmp);
        }
      }
    } else {
      super.addCollisionBoxesToList(wrd, x, y, z, mask, list, ent);
    }
  }

  @Override
  public AxisAlignedBB[] getBoxes(World wrd, int x, int y, int z, EntityPlayer player) {
    TileEntity tile = wrd.getTileEntity(x, y, z);
    if (tile instanceof TileEngine) {
      return boxes[((TileEngine) tile).orientation.ordinal()];
    } else {
      return new AxisAlignedBB[]{AxisAlignedBB.getBoundingBox(0.0, 0.0, 0.0, 1.0, 1.0, 1.0)};
    }
  }

  @Override
  public double getExpansion() {
    return 0.0075;
  }

  @Override
  public MovingObjectPosition collisionRayTrace(World wrd, int x, int y, int z, Vec3 origin, Vec3 direction) {
    TileEntity tile = wrd.getTileEntity(x, y, z);
    if (tile instanceof TileEngine) {
      AxisAlignedBB[] aabbs = boxes[((TileEngine) tile).orientation.ordinal()];
      MovingObjectPosition closest = null;
      for (AxisAlignedBB aabb : aabbs) {
        MovingObjectPosition mop = aabb.getOffsetBoundingBox(x, y, z).calculateIntercept(origin, direction);
        if (mop != null) {
          if (closest != null && mop.hitVec.distanceTo(origin) < closest.hitVec.distanceTo(origin)) {
            closest = mop;
          } else {
            closest = mop;
          }
        }
      }
      if (closest != null) {
        closest.blockX = x;
        closest.blockY = y;
        closest.blockZ = z;
      }
      return closest;
    } else {
      return super.collisionRayTrace(wrd, x, y, z, origin, direction);
    }
  }

  @Override
  public void onPostBlockPlaced(World world, int x, int y, int z, int par5) {
    TileEntity tile = world.getTileEntity(x, y, z);
    if (tile instanceof TileEngine) {
      TileEngine engine = (TileEngine) tile;
      engine.orientation = ForgeDirection.UP;
      if (!engine.isOrientationValid()) {
        engine.switchOrientation(true);
      }
    }
  }

  @Override
  public int damageDropped(int i) {
    return i;
  }

  @SuppressWarnings({"all"})
  @Override
  public void randomDisplayTick(World world, int i, int j, int k, Random random) {
    TileEntity tile = world.getTileEntity(i, j, k);

    if (tile instanceof TileEngine && !((TileEngine) tile).isBurning()) {
      return;
    }

    float f = i + 0.5F;
    float f1 = j + 0.0F + (random.nextFloat() * 6F) / 16F;
    float f2 = k + 0.5F;
    float f3 = 0.52F;
    float f4 = random.nextFloat() * 0.6F - 0.3F;

    world.spawnParticle("reddust", f - f3, f1, f2 + f4, 0.0D, 0.0D, 0.0D);
    world.spawnParticle("reddust", f + f3, f1, f2 + f4, 0.0D, 0.0D, 0.0D);
    world.spawnParticle("reddust", f + f4, f1, f2 - f3, 0.0D, 0.0D, 0.0D);
    world.spawnParticle("reddust", f + f4, f1, f2 + f3, 0.0D, 0.0D, 0.0D);
  }

  @SuppressWarnings({"unchecked", "rawtypes"})
  @Override
  public void getSubBlocks(Item item, CreativeTabs par2CreativeTabs, List itemList) {
    itemList.add(new ItemStack(this, 1, 0)); // WOOD
    itemList.add(new ItemStack(this, 1, 1)); // STONE
    itemList.add(new ItemStack(this, 1, 2)); // IRON
    itemList.add(new ItemStack(this, 1, 3)); // CREATIVE
  }

  @Override
  public void onNeighborBlockChange(World world, int x, int y, int z, Block block) {
    TileEntity tile = world.getTileEntity(x, y, z);

    if (tile instanceof TileEngine) {
      ((TileEngine) tile).onNeighborUpdate();
    }
  }

  @Override
  @SideOnly(Side.CLIENT)
  public IIcon getIcon(int side, int meta) {
    switch (meta) {
      case 0:
        return woodTexture;
      case 1:
        return stoneTexture;
      case 2:
        return ironTexture;
      default:
        return null;
    }
  }

  @Override
  public TileEntity createNewTileEntity(World world, int metadata) {
    return null;
  }
}
TOP

Related Classes of buildcraft.energy.BlockEngine

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.