196 lines
4.6 KiB
Java
196 lines
4.6 KiB
Java
package resonantinduction.core.resource;
|
|
|
|
import java.awt.Color;
|
|
import java.util.List;
|
|
import java.util.Random;
|
|
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.block.material.MapColor;
|
|
import net.minecraft.block.material.Material;
|
|
import net.minecraft.block.material.MaterialTransparent;
|
|
import net.minecraft.client.renderer.texture.IconRegister;
|
|
import net.minecraft.creativetab.CreativeTabs;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.util.AxisAlignedBB;
|
|
import net.minecraft.util.Icon;
|
|
import net.minecraft.world.IBlockAccess;
|
|
import net.minecraft.world.World;
|
|
import net.minecraftforge.common.ForgeDirection;
|
|
import net.minecraftforge.fluids.Fluid;
|
|
import net.minecraftforge.fluids.FluidStack;
|
|
import net.minecraftforge.fluids.IFluidBlock;
|
|
import resonantinduction.core.Reference;
|
|
import resonantinduction.core.Settings;
|
|
import resonantinduction.mechanical.fluid.EnumGas;
|
|
import universalelectricity.api.vector.Vector3;
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
|
|
/**
|
|
* Gas that is designed to generate underground in the same way as an ore
|
|
*
|
|
* TODO code actual gas behavior such as expanding to fill an area but at the same time losing
|
|
* volume
|
|
*
|
|
* @author DarkGuardsman
|
|
*/
|
|
public class BlockGasOre extends Block implements IFluidBlock
|
|
{
|
|
public static final int[] volumePerMeta = new int[] { 10, 35, 75, 125, 250, 500, 1000, 2000, 4000, 8000, 16000, 32000, 64000, 12800, 256000, 512000 };
|
|
public static final Material gas = new MaterialTransparent(MapColor.airColor).setReplaceable();
|
|
|
|
public BlockGasOre()
|
|
{
|
|
super(Settings.CONFIGURATION.getBlock("GasBlock", Settings.getNextBlockID()).getInt(), gas);
|
|
this.setUnlocalizedName("BlockGas");
|
|
this.setTickRandomly(true);
|
|
}
|
|
|
|
@Override
|
|
public int tickRate(World par1World)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
@Override
|
|
public void updateTick(World world, int x, int y, int z, Random rand)
|
|
{
|
|
if (!world.isRemote)
|
|
{
|
|
|
|
final Vector3 vec = new Vector3(x, y, z);
|
|
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
|
|
{
|
|
int meta = world.getBlockMetadata(x, y, z);
|
|
|
|
Vector3 sVec = vec.clone().modifyPositionFromSide(dir);
|
|
int sMeta = sVec.getBlockMetadata(world);
|
|
int blockID = sVec.getBlockID(world);
|
|
Block block = Block.blocksList[blockID];
|
|
|
|
if (blockID == 0 || block == null || block != null && block.isAirBlock(world, x, y, z) && blockID != this.blockID)
|
|
{
|
|
if (meta == 0)
|
|
{
|
|
world.setBlockToAir(x, y, z);
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
world.setBlock(x, y, z, this.blockID, meta / 2, 2);
|
|
sVec.setBlock(world, this.blockID, meta / 2, 2);
|
|
break;
|
|
}
|
|
}
|
|
else if (blockID == this.blockID && meta > sMeta)
|
|
{
|
|
meta += sMeta;
|
|
world.setBlock(x, y, z, this.blockID, meta / 2, 2);
|
|
sVec.setBlock(world, this.blockID, meta / 2, 2);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* IFluidBlock */
|
|
@Override
|
|
public FluidStack drain(World world, int x, int y, int z, boolean doDrain)
|
|
{
|
|
int meta = world.getBlockMetadata(x, y, z);
|
|
FluidStack fluid = new FluidStack(EnumGas.NATURAL_GAS.getGas(), volumePerMeta[meta]);
|
|
if (doDrain || fluid == null)
|
|
{
|
|
world.setBlockToAir(x, y, z);
|
|
}
|
|
return fluid;
|
|
}
|
|
|
|
@Override
|
|
public boolean canDrain(World world, int x, int y, int z)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public Fluid getFluid()
|
|
{
|
|
return EnumGas.NATURAL_GAS.getGas();
|
|
}
|
|
|
|
@Override
|
|
public int idDropped(int par1, Random par2Random, int par3)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public boolean isCollidable()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public Icon getIcon(int par1, int par2)
|
|
{
|
|
return this.blockIcon;
|
|
}
|
|
|
|
@Override
|
|
public void registerIcons(IconRegister par1IconRegister)
|
|
{
|
|
this.blockIcon = par1IconRegister.registerIcon(Reference.PREFIX + "gas");
|
|
}
|
|
|
|
@Override
|
|
public int getRenderBlockPass()
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
@Override
|
|
public boolean isOpaqueCube()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean renderAsNormalBlock()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
@SideOnly(Side.CLIENT)
|
|
public int getBlockColor()
|
|
{
|
|
return Color.yellow.getRGB();
|
|
}
|
|
|
|
@Override
|
|
@SideOnly(Side.CLIENT)
|
|
public int getRenderColor(int par1)
|
|
{
|
|
// TODO make the color darker as the meta value goes higher
|
|
return this.getBlockColor();
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
@Override
|
|
public int colorMultiplier(IBlockAccess world, int x, int y, int z)
|
|
{
|
|
return this.getRenderColor(world.getBlockMetadata(x, y, z));
|
|
}
|
|
|
|
@Override
|
|
public void getSubBlocks(int blockID, CreativeTabs tab, List creativeTabList)
|
|
{
|
|
creativeTabList.add(new ItemStack(blockID, 1, 15));
|
|
}
|
|
}
|