265 lines
8.4 KiB
Java
265 lines
8.4 KiB
Java
/**
|
|
* Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team
|
|
* http://www.mod-buildcraft.com
|
|
* <p/>
|
|
* 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.core.lib.engines;
|
|
|
|
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.entity.Entity;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
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.api.transport.IItemPipe;
|
|
import buildcraft.core.lib.block.BlockBuildCraft;
|
|
import buildcraft.core.lib.render.ICustomHighlight;
|
|
|
|
public abstract class BlockEngineBase 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
|
|
};
|
|
|
|
public BlockEngineBase() {
|
|
super(Material.iron);
|
|
}
|
|
|
|
public abstract String getTexturePrefix(int meta, boolean addPrefix);
|
|
|
|
@Override
|
|
@SideOnly(Side.CLIENT)
|
|
public IIcon getIconAbsolute(int side, int metadata) {
|
|
return icons[metadata] == null ? icons[0][0] : icons[metadata][0];
|
|
}
|
|
|
|
@Override
|
|
@SideOnly(Side.CLIENT)
|
|
public void registerBlockIcons(IIconRegister register) {
|
|
icons = new IIcon[16][];
|
|
for (int meta = 0; meta < 16; meta++) {
|
|
String prefix = getTexturePrefix(meta, false);
|
|
if (prefix != null) {
|
|
icons[meta] = new IIcon[1];
|
|
icons[meta][0] = register.registerIcon(prefix + "/icon");
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean isOpaqueCube() {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean renderAsNormalBlock() {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public int getRenderType() {
|
|
return BuildCraftCore.blockByEntityModel;
|
|
}
|
|
|
|
@Override
|
|
public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) {
|
|
TileEntity tile = world.getTileEntity(x, y, z);
|
|
|
|
if (tile instanceof TileEngineBase) {
|
|
return ((TileEngineBase) 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 TileEngineBase) {
|
|
return ((TileEngineBase) 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);
|
|
|
|
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 TileEngineBase) {
|
|
return ((TileEngineBase) 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 TileEngineBase) {
|
|
AxisAlignedBB[] aabbs = boxes[((TileEngineBase) 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 TileEngineBase) {
|
|
return boxes[((TileEngineBase) 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 TileEngineBase) {
|
|
AxisAlignedBB[] aabbs = boxes[((TileEngineBase) 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 TileEngineBase) {
|
|
TileEngineBase engine = (TileEngineBase) 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 TileEngineBase)) {
|
|
return;
|
|
}
|
|
|
|
if (((TileEngineBase) tile).getEnergyStage() == TileEngineBase.EnergyStage.OVERHEAT) {
|
|
for (int f = 0; f < 16; f++) {
|
|
world.spawnParticle("smoke", i + 0.4F + (random.nextFloat() * 0.2F),
|
|
j + (random.nextFloat() * 0.5F),
|
|
k + 0.4F + (random.nextFloat() * 0.2F),
|
|
random.nextFloat() * 0.04F - 0.02F,
|
|
random.nextFloat() * 0.05F + 0.02F,
|
|
random.nextFloat() * 0.04F - 0.02F);
|
|
}
|
|
} else if (((TileEngineBase) tile).isBurning()) {
|
|
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);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onNeighborBlockChange(World world, int x, int y, int z, Block block) {
|
|
TileEntity tile = world.getTileEntity(x, y, z);
|
|
|
|
if (tile instanceof TileEngineBase) {
|
|
((TileEngineBase) tile).onNeighborUpdate();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public TileEntity createNewTileEntity(World world, int metadata) {
|
|
return null;
|
|
}
|
|
|
|
public abstract String getUnlocalizedName(int metadata);
|
|
|
|
public abstract TileEntity createTileEntity(World world, int metadata);
|
|
|
|
/**
|
|
* Checks to see if this block has an engine tile for the given metadata.
|
|
*/
|
|
public abstract boolean hasEngine(int meta);
|
|
}
|