Added dust block and melting dusts into fluids

This commit is contained in:
Calclavia 2014-01-28 22:42:12 +08:00
parent af4ce9b93c
commit 22f75bf48d
16 changed files with 516 additions and 369 deletions

View file

@ -22,7 +22,7 @@ public class BlockFirebox extends BlockRI
public BlockFirebox() public BlockFirebox()
{ {
super("firebox", Material.wood); super("firebox", Material.rock);
this.setTickRandomly(true); this.setTickRandomly(true);
} }

View file

@ -7,12 +7,14 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.Packet;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityFurnace; import net.minecraft.tileentity.TileEntityFurnace;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import resonantinduction.core.ResonantInduction; import resonantinduction.core.ResonantInduction;
import resonantinduction.core.resource.TileMaterial;
import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.Vector3;
import calclavia.lib.network.IPacketReceiver; import calclavia.lib.network.IPacketReceiver;
import calclavia.lib.network.IPacketSender; import calclavia.lib.network.IPacketSender;
@ -42,7 +44,12 @@ public class TileFirebox extends TileExternalInventory implements IPacketSender,
* It takes 338260 J to boile water. * It takes 338260 J to boile water.
*/ */
private final long requiredBoilWaterEnergy = 338260; private final long requiredBoilWaterEnergy = 338260;
private long boilEnergy = 0;
/**
* Requires about 6.6MJ of energy to melt iron.
*/
private final long requiredMeltIronEnergy = 4781700 + 1904000;
private long heatEnergy = 0;
@Override @Override
public void updateEntity() public void updateEntity()
@ -58,20 +65,52 @@ public class TileFirebox extends TileExternalInventory implements IPacketSender,
worldObj.setBlock(xCoord, yCoord + 1, zCoord, Block.fire.blockID); worldObj.setBlock(xCoord, yCoord + 1, zCoord, Block.fire.blockID);
} }
if (blockID == Block.waterStill.blockID) /**
{ * Try to heat up and melt blocks above it.
boilEnergy += POWER / 20; */
heatEnergy += POWER / 20;
boolean usedHeat = false;
if (boilEnergy >= requiredBoilWaterEnergy) if (blockID == ResonantInduction.blockDust.blockID)
{
usedHeat = true;
if (heatEnergy >= requiredMeltIronEnergy)
{
TileEntity dustTile = worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord);
if (dustTile instanceof TileMaterial)
{
String name = ((TileMaterial) dustTile).name;
worldObj.setBlock(xCoord, yCoord + 1, zCoord, ResonantInduction.blockFluidMaterial.blockID, 8, 3);
TileEntity tile = worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord);
if (tile instanceof TileMaterial)
{
((TileMaterial) tile).name = name;
}
heatEnergy = 0;
}
}
}
else if (blockID == Block.waterStill.blockID)
{
usedHeat = true;
if (heatEnergy >= requiredBoilWaterEnergy)
{ {
if (FluidRegistry.getFluid("steam") != null) if (FluidRegistry.getFluid("steam") != null)
MinecraftForge.EVENT_BUS.post(new BoilEvent(worldObj, new Vector3(this).translate(0, 1, 0), new FluidStack(FluidRegistry.WATER, FluidContainerRegistry.BUCKET_VOLUME), new FluidStack(FluidRegistry.getFluid("steam"), FluidContainerRegistry.BUCKET_VOLUME), 2)); MinecraftForge.EVENT_BUS.post(new BoilEvent(worldObj, new Vector3(this).translate(0, 1, 0), new FluidStack(FluidRegistry.WATER, FluidContainerRegistry.BUCKET_VOLUME), new FluidStack(FluidRegistry.getFluid("steam"), FluidContainerRegistry.BUCKET_VOLUME), 2));
worldObj.setBlock(xCoord, yCoord + 1, zCoord, 0); worldObj.setBlock(xCoord, yCoord + 1, zCoord, 0);
boilEnergy = 0; heatEnergy = 0;
} }
} }
if (!usedHeat)
{
heatEnergy = 0;
}
if (--burnTime == 0) if (--burnTime == 0)
{ {
if (blockID == Block.fire.blockID) if (blockID == Block.fire.blockID)

View file

@ -13,9 +13,12 @@ import org.modstats.Modstats;
import resonantinduction.core.handler.FluidEventHandler; import resonantinduction.core.handler.FluidEventHandler;
import resonantinduction.core.handler.ToolModeLink; import resonantinduction.core.handler.ToolModeLink;
import resonantinduction.core.prefab.part.PacketMultiPart; import resonantinduction.core.prefab.part.PacketMultiPart;
import resonantinduction.core.resource.BlockDust;
import resonantinduction.core.resource.ResourceGenerator; import resonantinduction.core.resource.ResourceGenerator;
import resonantinduction.core.resource.TileMaterial;
import resonantinduction.core.resource.fluid.BlockFluidMaterial;
import resonantinduction.core.resource.fluid.BlockFluidMixture; import resonantinduction.core.resource.fluid.BlockFluidMixture;
import resonantinduction.core.resource.fluid.TileLiquidMixture; import resonantinduction.core.resource.fluid.TileFluidMixture;
import resonantinduction.core.resource.item.ItemOreResource; import resonantinduction.core.resource.item.ItemOreResource;
import calclavia.components.tool.ToolMode; import calclavia.components.tool.ToolMode;
import calclavia.lib.content.ContentRegistry; import calclavia.lib.content.ContentRegistry;
@ -69,10 +72,13 @@ public class ResonantInduction
public static ItemOreResource itemRubble; public static ItemOreResource itemRubble;
public static ItemOreResource itemDust; public static ItemOreResource itemDust;
public static ItemOreResource itemRefinedDust; public static ItemOreResource itemRefinedDust;
public static Block blockDust;
public static Block blockFluidMixture; public static Block blockFluidMixture;
public static Block blockFluidMaterial;
public static Block blockGas; public static Block blockGas;
public static Fluid fluidMixture = null; public static Fluid fluidMixture;
public static Fluid fluidMaterial;
public static final ContentRegistry contentRegistry = new ContentRegistry(Settings.CONFIGURATION, ID); public static final ContentRegistry contentRegistry = new ContentRegistry(Settings.CONFIGURATION, ID);
@ -92,7 +98,17 @@ public class ResonantInduction
fluidMixture = new Fluid("water"); fluidMixture = new Fluid("water");
FluidRegistry.registerFluid(fluidMixture); FluidRegistry.registerFluid(fluidMixture);
blockFluidMixture = new BlockFluidMixture(Settings.CONFIGURATION.getBlock("FluidMixture", Settings.getNextBlockID()).getInt(), fluidMixture); blockFluidMixture = contentRegistry.createTile(BlockFluidMixture.class, TileFluidMixture.class);
/**
* Melting dusts
*/
blockDust = contentRegistry.createTile(BlockDust.class, TileMaterial.class);
fluidMaterial = new Fluid("moltenMaterial");
fluidMaterial.setDensity(7);
fluidMaterial.setViscosity(10000);
fluidMaterial.setTemperature(273 + 1538);
FluidRegistry.registerFluid(fluidMaterial);
blockFluidMaterial = contentRegistry.createTile(BlockFluidMaterial.class, TileMaterial.class);
// Items // Items
itemRubble = new ItemOreResource(Settings.getNextItemID(), "oreRubble"); itemRubble = new ItemOreResource(Settings.getNextItemID(), "oreRubble");
@ -103,9 +119,6 @@ public class ResonantInduction
GameRegistry.registerItem(itemDust, itemDust.getUnlocalizedName()); GameRegistry.registerItem(itemDust, itemDust.getUnlocalizedName());
GameRegistry.registerItem(itemRefinedDust, itemRefinedDust.getUnlocalizedName()); GameRegistry.registerItem(itemRefinedDust, itemRefinedDust.getUnlocalizedName());
GameRegistry.registerBlock(blockFluidMixture, blockFluidMixture.getUnlocalizedName());
GameRegistry.registerTileEntity(TileLiquidMixture.class, blockFluidMixture.getUnlocalizedName());
Settings.save(); Settings.save();
proxy.preInit(); proxy.preInit();
} }

View file

@ -0,0 +1,208 @@
package resonantinduction.core.resource;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.entity.EntityLivingBase;
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.world.IBlockAccess;
import net.minecraft.world.World;
import resonantinduction.core.Reference;
import resonantinduction.core.ResonantInduction;
import resonantinduction.core.prefab.block.BlockRI;
import resonantinduction.core.resource.item.ItemOreResource;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
/**
* The block form of the item dust.
*
* @author Calclavia
*
*/
public class BlockDust extends BlockRI
{
public BlockDust()
{
super("dust", Material.iron);
setCreativeTab(null);
setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F);
setBlockBoundsForSnowDepth(0);
setTextureName(Reference.PREFIX + "material_sand");
}
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase par5EntityLivingBase, ItemStack itemStack)
{
TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
if (tileEntity instanceof TileMaterial)
{
((TileMaterial) tileEntity).name = ((ItemOreResource) itemStack.getItem()).getMaterialFromStack(itemStack);
}
}
@Override
public int colorMultiplier(IBlockAccess access, int x, int y, int z)
{
TileEntity tileEntity = access.getBlockTileEntity(x, y, z);
if (tileEntity instanceof TileMaterial)
{
if (((TileMaterial) tileEntity).name != null)
{
return ResourceGenerator.materialColors.get(((TileMaterial) tileEntity).name);
}
}
return 16777215;
}
@Override
public TileEntity createNewTileEntity(World var1)
{
return new TileMaterial();
}
/**
* Returns a bounding box from the pool of bounding boxes (this means this box can change after
* the pool has been
* cleared to be reused)
*/
public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
{
int l = par1World.getBlockMetadata(par2, par3, par4) & 7;
float f = 0.125F;
return AxisAlignedBB.getAABBPool().getAABB((double) par2 + this.minX, (double) par3 + this.minY, (double) par4 + this.minZ, (double) par2 + this.maxX, (double) ((float) par3 + (float) l * f), (double) par4 + this.maxZ);
}
/**
* Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the
* shared face of two
* adjacent blocks and also whether the player can attach torches, redstone wire, etc to this
* block.
*/
public boolean isOpaqueCube()
{
return false;
}
/**
* If this block doesn't render as an ordinary block it will return False (examples: signs,
* buttons, stairs, etc)
*/
public boolean renderAsNormalBlock()
{
return false;
}
/**
* Sets the block's bounds for rendering it as an item
*/
public void setBlockBoundsForItemRender()
{
this.setBlockBoundsForSnowDepth(0);
}
/**
* Updates the blocks bounds based on its current state. Args: world, x, y, z
*/
public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
{
this.setBlockBoundsForSnowDepth(par1IBlockAccess.getBlockMetadata(par2, par3, par4));
}
/**
* calls setBlockBounds based on the depth of the snow. Int is any values 0x0-0x7, usually this
* blocks metadata.
*/
protected void setBlockBoundsForSnowDepth(int par1)
{
int j = par1 & 7;
float f = (float) (2 * (1 + j)) / 16.0F;
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, f, 1.0F);
}
/**
* Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y,
* z
*/
public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4)
{
return true;
}
/**
* Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed
* (coordinates passed are
* their own) Args: x, y, z, neighbor blockID
*/
public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5)
{
this.canSnowStay(par1World, par2, par3, par4);
}
/**
* Checks if this snow block can stay at this location.
*/
private boolean canSnowStay(World par1World, int par2, int par3, int par4)
{
if (!this.canPlaceBlockAt(par1World, par2, par3, par4))
{
par1World.setBlockToAir(par2, par3, par4);
return false;
}
else
{
return true;
}
}
/**
* Called when the player destroys a block with an item that can harvest it. (i, j, k) are the
* coordinates of the
* block and l is the block's subtype/damage.
*/
public void harvestBlock(World par1World, EntityPlayer par2EntityPlayer, int par3, int par4, int par5, int par6)
{
super.harvestBlock(par1World, par2EntityPlayer, par3, par4, par5, par6);
par1World.setBlockToAir(par3, par4, par5);
}
/**
* Returns the ID of the items to drop on destruction.
*/
public int idDropped(int par1, Random par2Random, int par3)
{
return ResonantInduction.itemRefinedDust.itemID;
}
/**
* Returns the quantity of items to drop on block destruction.
*/
public int quantityDropped(Random par1Random)
{
return 1;
}
@SideOnly(Side.CLIENT)
/**
* Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
* coordinates. Args: blockAccess, x, y, z, side
*/
public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
{
return par5 == 1 ? true : super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5);
}
@Override
public int quantityDropped(int meta, int fortune, Random random)
{
return (meta & 7) + 1;
}
}

View file

@ -1,122 +0,0 @@
package resonantinduction.core.resource;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Icon;
import net.minecraftforge.oredict.OreDictionary;
import resonantinduction.core.Reference;
import resonantinduction.core.ResonantInduction;
import resonantinduction.core.Settings;
import calclavia.lib.ore.OreGenReplaceStone;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class BlockOre extends Block
{
Icon[] icons = new Icon[EnumTierMaterial.values().length];
public BlockOre()
{
super(Settings.CONFIGURATION.getBlock("Ore", Settings.getNextBlockID()).getInt(), Material.rock);
this.setCreativeTab(CreativeTabs.tabBlock);
this.setUnlocalizedName(Reference.PREFIX + "Ore");
this.setHardness(2.5f);
this.setResistance(5.0f);
for (OreData data : OreData.values())
{
data.stack = new ItemStack(this.blockID, 1, data.ordinal());
}
this.loadOreNames();
}
@Override
public int damageDropped(int par1)
{
return par1;
}
@Override
public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List)
{
for (OreData data : OreData.values())
{
par3List.add(data.stack);
}
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IconRegister par1IconRegister)
{
for (OreData data : OreData.values())
{
data.oreIcon = par1IconRegister.registerIcon(Reference.PREFIX + data.name + "Ore");
}
}
@Override
@SideOnly(Side.CLIENT)
public Icon getIcon(int side, int metadata)
{
if (metadata < OreData.values().length)
{
return OreData.values()[metadata].oreIcon;
}
return Block.stone.getIcon(side, metadata);
}
public void loadOreNames()
{
for (OreData data : OreData.values())
{
OreDictionary.registerOre(data.oreName, data.stack);
}
}
public static enum OreData
{
TIN(EnumTierMaterial.TIN, "tin", "oreTin", 20, 8, 128),
COPPER(EnumTierMaterial.COPPER, "copper", "copperOre", 20, 8, 128),
SILVER(EnumTierMaterial.SILVER, "silver", "silverOre", 3, 8, 45),
LEAD(EnumTierMaterial.LEAD, "lead", "leadOre", 1, 6, 30),
Bauxite(EnumTierMaterial.ALUMINIUM, "bauxite", "bauxiteOre", 4, 6, 128);
public String name, oreName;
public ItemStack stack;
public EnumTierMaterial mat;
@SideOnly(Side.CLIENT)
public Icon oreIcon;
/* ORE GENERATOR OPTIONS */
public boolean doWorldGen = true;
public int ammount, branch, maxY;
private OreData(EnumTierMaterial mat, String name, String oreName, int ammount, int branch, int maxY)
{
this.name = name;
this.oreName = oreName;
this.mat = mat;
this.maxY = maxY;
this.ammount = ammount;
this.branch = branch;
}
public OreGenReplaceStone getGeneratorSettings()
{
if (this.doWorldGen)
{
ItemStack stack = new ItemStack(ResonantInduction.blockOre, 1, this.ordinal());
return (OreGenReplaceStone) new OreGenReplaceStone(this.name, this.name + "Ore", stack, this.maxY, this.ammount, this.branch).enable(Settings.CONFIGURATION);
}
return null;
}
}
}

View file

@ -1,40 +0,0 @@
package resonantinduction.core.resource;
public enum EnumRecipePart
{
RUBBLE("Rubble"), DUST("Dust"), INGOTS("Ingot"), PLATES("Plate"), GEARS("Gears"), TUBE("Tube"),
ROD("Rod"), SCRAPS("Scraps"), MOLTEN("Molten");
public String simpleName;
private EnumRecipePart(String name)
{
this.simpleName = name;
}
/**
* This gets the part name based on the meta value of the ore dirv item. However can also be
* used to get the part name if under X value
*/
public static String getPartName(int meta)
{
int partID = meta % EnumTierMaterial.itemCountPerMaterial;
if (partID < EnumRecipePart.values().length)
{
return EnumRecipePart.values()[partID].simpleName;
}
return "Part[" + partID + "]";
}
/** This gets the full name based on the metadata of the ore dirv item */
public static String getFullName(int itemMetaData)
{
int matID = itemMetaData / EnumTierMaterial.itemCountPerMaterial;
int partID = itemMetaData % EnumTierMaterial.itemCountPerMaterial;
if (matID < EnumTierMaterial.values().length && partID < EnumRecipePart.values().length)
{
return EnumTierMaterial.values()[matID].simpleName + EnumRecipePart.values()[partID].simpleName;
}
return "OrePart[" + matID + "][" + partID + "]";
}
}

View file

@ -1,143 +0,0 @@
package resonantinduction.core.resource;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.item.EnumToolMaterial;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Icon;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
/**
* Class for storing materials, there icon names, sub items to be made from them or there sub ores
*
*
* @author DarkGuardsman
*/
public enum EnumTierMaterial
{
WOOD("Wood", EnumToolMaterial.WOOD, EnumRecipePart.INGOTS, EnumRecipePart.PLATES, EnumRecipePart.RUBBLE, EnumRecipePart.ROD, EnumRecipePart.MOLTEN),
STONE("Stone", EnumToolMaterial.STONE, EnumRecipePart.INGOTS, EnumRecipePart.SCRAPS, EnumRecipePart.MOLTEN),
IRON("Iron", EnumToolMaterial.IRON, EnumRecipePart.INGOTS),
OBBY("Obby", true, 7.0f, 500, 4, EnumRecipePart.INGOTS, EnumRecipePart.RUBBLE, EnumRecipePart.SCRAPS, EnumRecipePart.PLATES, EnumRecipePart.MOLTEN),
GOLD("Gold", EnumToolMaterial.GOLD, EnumRecipePart.GEARS, EnumRecipePart.INGOTS),
COAL("Coal", EnumToolMaterial.WOOD, EnumRecipePart.GEARS, EnumRecipePart.TUBE, EnumRecipePart.PLATES, EnumRecipePart.RUBBLE, EnumRecipePart.SCRAPS, EnumRecipePart.MOLTEN),
COPPER("Copper", true, 3.5f, 79, 1),
TIN("Tin", true, 2.0f, 50, 1, EnumRecipePart.GEARS, EnumRecipePart.TUBE),
LEAD("Lead", false, 0, 0, 1, EnumRecipePart.GEARS, EnumRecipePart.TUBE),
ALUMINIUM("Aluminum", true, 5.0f, 100, 2, EnumRecipePart.GEARS, EnumRecipePart.TUBE),
SILVER("Silver", true, 11.0f, 30, 0, EnumRecipePart.GEARS),
STEEL("Steel", true, 7.0f, 4, 1000, EnumRecipePart.RUBBLE),
BRONZE("Bronze", true, 6.5f, 3, 560, EnumRecipePart.RUBBLE);
/** Name of the material */
public String simpleName;
/** List of ore parts that to not be created for the material */
public List<EnumRecipePart> unneedItems;
public boolean hasTools = false;
/** Limit by which each material is restricted by for creating orePart sub items */
public static final int itemCountPerMaterial = 50;
/** Client side only var used by ore items to store icon per material set */
@SideOnly(Side.CLIENT)
public Icon[] itemIcons;
public float materialEffectiveness = 2.0f;
public int maxUses = 100;
public float damageBoost = 0;
private EnumTierMaterial(String name, EnumToolMaterial material, EnumRecipePart... enumOreParts)
{
this(name, false, material.getEfficiencyOnProperMaterial(), material.getMaxUses(), material.getDamageVsEntity(), enumOreParts);
}
private EnumTierMaterial(String name, boolean tool, float effectiveness, int toolUses, float damage, EnumRecipePart... enumOreParts)
{
this.simpleName = name;
this.hasTools = tool;
this.materialEffectiveness = effectiveness;
this.maxUses = toolUses;
this.damageBoost = damage;
unneedItems = new ArrayList<EnumRecipePart>();
for (int i = 0; enumOreParts != null && i < enumOreParts.length; i++)
{
unneedItems.add(enumOreParts[i]);
}
}
/**
* Creates a new item stack using material and part given. Uses a preset length of 50 for parts
* enum so to prevent any unwanted changes in loading of itemStacks metadata.
*
* @param mat - material
* @param part - part
* @return new ItemStack created from the two enums as long as everything goes right
*/
public static ItemStack getStack(Item item, EnumTierMaterial mat, EnumRecipePart part, int ammount)
{
ItemStack reStack = null;
if (mat != null && part != null)
{
if (part == EnumRecipePart.INGOTS)
{
if (mat == EnumTierMaterial.IRON)
{
return new ItemStack(Item.ingotIron, 1);
}
else if (mat == EnumTierMaterial.GOLD)
{
return new ItemStack(Item.ingotGold, 1);
}
}
int meta = mat.ordinal() * itemCountPerMaterial;
meta += part.ordinal();
return new ItemStack(item, ammount, meta);
}
return reStack;
}
public ItemStack getStack(Item item, EnumRecipePart part)
{
return this.getStack(item, part, 1);
}
public ItemStack getStack(Item item, EnumRecipePart part, int ammount)
{
return getStack(item, this, part, ammount);
}
public static Icon getIcon(int metadata)
{
int mat = metadata / EnumTierMaterial.itemCountPerMaterial;
if (mat < EnumTierMaterial.values().length)
{
return EnumTierMaterial.values()[metadata / EnumTierMaterial.itemCountPerMaterial].itemIcons[metadata % EnumTierMaterial.itemCountPerMaterial];
}
return null;
}
public static String getOreName(EnumTierMaterial mat, EnumRecipePart part)
{
return mat.getOreName(part);
}
public String getOreName(EnumRecipePart part)
{
return part.simpleName.toLowerCase() + this.simpleName;
}
public boolean shouldCreateItem(EnumRecipePart part)
{
return this.unneedItems == null || !this.unneedItems.contains(part);
}
public boolean shouldCreateTool()
{
return this.hasTools;
}
}

View file

@ -0,0 +1,35 @@
package resonantinduction.core.resource;
import net.minecraft.nbt.NBTTagCompound;
import calclavia.lib.prefab.tile.TileAdvanced;
/**
* A tile that stores the material name.
*
* @author Calclavia
*
*/
public class TileMaterial extends TileAdvanced
{
public String name;
@Override
public boolean canUpdate()
{
return false;
}
@Override
public void readFromNBT(NBTTagCompound nbt)
{
super.readFromNBT(nbt);
name = nbt.getString("name");
}
@Override
public void writeToNBT(NBTTagCompound nbt)
{
super.writeToNBT(nbt);
nbt.setString("name", name);
}
}

View file

@ -0,0 +1,82 @@
package resonantinduction.core.resource.fluid;
import net.minecraft.block.ITileEntityProvider;
import net.minecraft.block.material.Material;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.Configuration;
import net.minecraftforge.fluids.BlockFluidFinite;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidStack;
import resonantinduction.core.Reference;
import resonantinduction.core.ResonantInduction;
import resonantinduction.core.Settings;
import resonantinduction.core.resource.ResourceGenerator;
import resonantinduction.core.resource.TileMaterial;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
/**
* Fluid class uses for molten materials.
*
* @author Calclavia
*
*/
public class BlockFluidMaterial extends BlockFluidFinite implements ITileEntityProvider
{
public BlockFluidMaterial()
{
super(Settings.CONFIGURATION.get(Configuration.CATEGORY_BLOCK, "fluidMaterial", Settings.getNextBlockID()).getInt(), ResonantInduction.fluidMaterial, Material.lava);
setTextureName("lava_flow");
this.setUnlocalizedName(Reference.PREFIX + "fluidMaterial");
}
public void setQuanta(World world, int x, int y, int z, int quanta)
{
if (quanta > 0)
world.setBlockMetadataWithNotify(x, y, z, quanta, 3);
else
world.setBlockToAir(x, y, z);
}
/* IFluidBlock */
@Override
public FluidStack drain(World world, int x, int y, int z, boolean doDrain)
{
TileMaterial tileFluid = (TileMaterial) world.getBlockTileEntity(x, y, z);
FluidStack stack = new FluidStack(ResonantInduction.fluidMaterial, (int) (FluidContainerRegistry.BUCKET_VOLUME * this.getFilledPercentage(world, x, y, z)));
return stack;
}
@SideOnly(Side.CLIENT)
@Override
public int colorMultiplier(IBlockAccess access, int x, int y, int z)
{
TileEntity tileEntity = access.getBlockTileEntity(x, y, z);
if (tileEntity instanceof TileMaterial)
{
if (((TileMaterial) tileEntity).name != null)
{
return ResourceGenerator.materialColors.get(((TileMaterial) tileEntity).name);
}
}
return 16777215;
}
@Override
public boolean canDrain(World world, int x, int y, int z)
{
return true;
}
@Override
public TileEntity createNewTileEntity(World world)
{
return new TileMaterial();
}
}

View file

@ -6,12 +6,15 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.Configuration;
import net.minecraftforge.fluids.BlockFluidClassic; import net.minecraftforge.fluids.BlockFluidClassic;
import net.minecraftforge.fluids.BlockFluidFinite; import net.minecraftforge.fluids.BlockFluidFinite;
import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import resonantinduction.core.Reference;
import resonantinduction.core.ResonantInduction; import resonantinduction.core.ResonantInduction;
import resonantinduction.core.Settings;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly; import cpw.mods.fml.relauncher.SideOnly;
@ -21,10 +24,11 @@ import cpw.mods.fml.relauncher.SideOnly;
*/ */
public class BlockFluidMixture extends BlockFluidFinite implements ITileEntityProvider public class BlockFluidMixture extends BlockFluidFinite implements ITileEntityProvider
{ {
public BlockFluidMixture(int id, Fluid fluid) public BlockFluidMixture()
{ {
super(id, fluid, Material.water); super(Settings.CONFIGURATION.get(Configuration.CATEGORY_BLOCK, "fluidMixture", Settings.getNextBlockID()).getInt(), ResonantInduction.fluidMixture, Material.water);
setTextureName("water_flow"); setTextureName("water_flow");
this.setUnlocalizedName(Reference.PREFIX + "fluidMixture");
} }
public void setQuanta(World world, int x, int y, int z, int quanta) public void setQuanta(World world, int x, int y, int z, int quanta)
@ -39,7 +43,7 @@ public class BlockFluidMixture extends BlockFluidFinite implements ITileEntityPr
@Override @Override
public FluidStack drain(World world, int x, int y, int z, boolean doDrain) public FluidStack drain(World world, int x, int y, int z, boolean doDrain)
{ {
TileLiquidMixture tileFluid = (TileLiquidMixture) world.getBlockTileEntity(x, y, z); TileFluidMixture tileFluid = (TileFluidMixture) world.getBlockTileEntity(x, y, z);
FluidStack stack = new FluidStack(ResonantInduction.fluidMixture, (int) (FluidContainerRegistry.BUCKET_VOLUME * this.getFilledPercentage(world, x, y, z))); FluidStack stack = new FluidStack(ResonantInduction.fluidMixture, (int) (FluidContainerRegistry.BUCKET_VOLUME * this.getFilledPercentage(world, x, y, z)));
tileFluid.writeFluidToNBT(stack.tag != null ? stack.tag : new NBTTagCompound()); tileFluid.writeFluidToNBT(stack.tag != null ? stack.tag : new NBTTagCompound());
return stack; return stack;
@ -49,7 +53,7 @@ public class BlockFluidMixture extends BlockFluidFinite implements ITileEntityPr
@Override @Override
public int colorMultiplier(IBlockAccess access, int x, int y, int z) public int colorMultiplier(IBlockAccess access, int x, int y, int z)
{ {
TileLiquidMixture tileFluid = (TileLiquidMixture) access.getBlockTileEntity(x, y, z); TileFluidMixture tileFluid = (TileFluidMixture) access.getBlockTileEntity(x, y, z);
return tileFluid.getColor(); return tileFluid.getColor();
} }
@ -62,6 +66,6 @@ public class BlockFluidMixture extends BlockFluidFinite implements ITileEntityPr
@Override @Override
public TileEntity createNewTileEntity(World world) public TileEntity createNewTileEntity(World world)
{ {
return new TileLiquidMixture(); return new TileFluidMixture();
} }
} }

View file

@ -24,7 +24,7 @@ import cpw.mods.fml.relauncher.SideOnly;
* @author Calclavia * @author Calclavia
* *
*/ */
public class TileLiquidMixture extends TileAdvanced implements IPacketReceiver public class TileFluidMixture extends TileAdvanced implements IPacketReceiver
{ {
public final Set<ItemStack> items = new HashSet<ItemStack>(); public final Set<ItemStack> items = new HashSet<ItemStack>();
public final Set<FluidStack> fluids = new HashSet<FluidStack>(); public final Set<FluidStack> fluids = new HashSet<FluidStack>();

View file

@ -1,34 +0,0 @@
package resonantinduction.core.resource.item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import resonantinduction.core.Reference;
import resonantinduction.core.resource.BlockOre.OreData;
public class ItemBlockOre extends ItemBlock
{
public ItemBlockOre(int par1)
{
super(par1);
this.setMaxDamage(0);
this.setHasSubtypes(true);
}
@Override
public int getMetadata(int damage)
{
return damage;
}
@Override
public String getUnlocalizedName(ItemStack par1ItemStack)
{
if (par1ItemStack != null && par1ItemStack.getItemDamage() < OreData.values().length)
{
return "tile." + Reference.PREFIX + OreData.values()[par1ItemStack.getItemDamage()].name + "Ore";
}
return super.getUnlocalizedName();
}
}

View file

@ -7,13 +7,16 @@ import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.oredict.OreDictionary;
import resonantinduction.api.recipe.MachineRecipes; import resonantinduction.api.recipe.MachineRecipes;
import resonantinduction.api.recipe.MachineRecipes.RecipeType; import resonantinduction.api.recipe.MachineRecipes.RecipeType;
import resonantinduction.api.recipe.RecipeUtils.Resource; import resonantinduction.api.recipe.RecipeUtils.Resource;
import resonantinduction.core.ResonantInduction;
import resonantinduction.core.prefab.item.ItemRI; import resonantinduction.core.prefab.item.ItemRI;
import resonantinduction.core.resource.ResourceGenerator; import resonantinduction.core.resource.ResourceGenerator;
import resonantinduction.core.resource.TileMaterial;
import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.Vector3;
import calclavia.lib.utility.LanguageUtility; import calclavia.lib.utility.LanguageUtility;
import calclavia.lib.utility.inventory.InventoryUtility; import calclavia.lib.utility.inventory.InventoryUtility;
@ -29,6 +32,8 @@ import cpw.mods.fml.relauncher.SideOnly;
*/ */
public class ItemOreResource extends ItemRI public class ItemOreResource extends ItemRI
{ {
private int blockID = ResonantInduction.blockDust.blockID;;
public ItemOreResource(int id, String name) public ItemOreResource(int id, String name)
{ {
super(name, id); super(name, id);
@ -60,6 +65,87 @@ public class ItemOreResource extends ItemRI
@Override @Override
public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
{ {
/**
* Allow refined dust to be placed down.
*/
if (stack.getItem() == ResonantInduction.itemRefinedDust)
{
if (stack.stackSize == 0)
{
return false;
}
else if (!player.canPlayerEdit(x, y, z, side, stack))
{
return false;
}
else
{
TileEntity tile = world.getBlockTileEntity(x, y, z);
if (world.getBlockId(x, y, z) == blockID && tile instanceof TileMaterial)
{
if (getMaterialFromStack(stack).equals(((TileMaterial) tile).name))
{
Block block = Block.blocksList[blockID];
int j1 = world.getBlockMetadata(x, y, z);
int k1 = j1 & 7;
if (k1 <= 6 && world.checkNoEntityCollision(block.getCollisionBoundingBoxFromPool(world, x, y, z)) && world.setBlockMetadataWithNotify(x, y, z, k1 + 1 | j1 & -8, 2))
{
world.playSoundEffect((double) ((float) x + 0.5F), (double) ((float) y + 0.5F), (double) ((float) z + 0.5F), block.stepSound.getPlaceSound(), (block.stepSound.getVolume() + 1.0F) / 2.0F, block.stepSound.getPitch() * 0.8F);
--stack.stackSize;
return true;
}
}
}
if (side == 0)
{
--y;
}
if (side == 1)
{
++y;
}
if (side == 2)
{
--z;
}
if (side == 3)
{
++z;
}
if (side == 4)
{
--x;
}
if (side == 5)
{
++x;
}
if (world.canPlaceEntityOnSide(blockID, x, y, z, false, side, player, stack))
{
Block block = Block.blocksList[blockID];
int j1 = this.getMetadata(stack.getItemDamage());
int k1 = Block.blocksList[blockID].onBlockPlaced(world, x, y, z, side, hitX, hitY, hitZ, j1);
if (placeBlockAt(stack, player, world, x, y, z, side, hitX, hitY, hitZ, k1))
{
world.playSoundEffect((double) ((float) x + 0.5F), (double) ((float) y + 0.5F), (double) ((float) z + 0.5F), block.stepSound.getPlaceSound(), (block.stepSound.getVolume() + 1.0F) / 2.0F, block.stepSound.getPitch() * 0.8F);
--stack.stackSize;
}
return true;
}
}
}
/** /**
* Manually wash dust into refined dust. * Manually wash dust into refined dust.
*/ */
@ -98,6 +184,22 @@ public class ItemOreResource extends ItemRI
return false; return false;
} }
public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int metadata)
{
if (!world.setBlock(x, y, z, this.blockID, metadata, 3))
{
return false;
}
if (world.getBlockId(x, y, z) == this.blockID)
{
Block.blocksList[this.blockID].onBlockPlacedBy(world, x, y, z, player, stack);
Block.blocksList[this.blockID].onPostBlockPlaced(world, x, y, z, metadata);
}
return true;
}
public ItemStack getStackFromMaterial(String name) public ItemStack getStackFromMaterial(String name)
{ {
ItemStack itemStack = new ItemStack(this); ItemStack itemStack = new ItemStack(this);

View file

@ -339,11 +339,14 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
@Override @Override
public void onMultiBlockChanged() public void onMultiBlockChanged()
{ {
tile().notifyPartChange(this); if (world() != null)
if (!world().isRemote)
{ {
sendDescUpdate(); tile().notifyPartChange(this);
if (!world().isRemote)
{
sendDescUpdate();
}
} }
} }

View file

@ -14,7 +14,7 @@ import resonantinduction.api.recipe.RecipeUtils.Resource;
import resonantinduction.core.ResonantInduction; import resonantinduction.core.ResonantInduction;
import resonantinduction.core.prefab.block.BlockRI; import resonantinduction.core.prefab.block.BlockRI;
import resonantinduction.core.resource.fluid.BlockFluidMixture; import resonantinduction.core.resource.fluid.BlockFluidMixture;
import resonantinduction.core.resource.fluid.TileLiquidMixture; import resonantinduction.core.resource.fluid.TileFluidMixture;
import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.Vector3;
import calclavia.lib.utility.inventory.InventoryUtility; import calclavia.lib.utility.inventory.InventoryUtility;
@ -53,11 +53,11 @@ public class BlockFilter extends BlockRI implements ITileEntityProvider
TileEntity tileAbove = checkAbove.getTileEntity(world); TileEntity tileAbove = checkAbove.getTileEntity(world);
TileEntity tileBelow = checkBelow.getTileEntity(world); TileEntity tileBelow = checkBelow.getTileEntity(world);
if (tileAbove instanceof TileLiquidMixture && (tileBelow == null || tileBelow instanceof TileLiquidMixture)) if (tileAbove instanceof TileFluidMixture && (tileBelow == null || tileBelow instanceof TileFluidMixture))
{ {
world.spawnParticle("dripWater", x + 0.5, y, z + 0.5, 0, 0, 0); world.spawnParticle("dripWater", x + 0.5, y, z + 0.5, 0, 0, 0);
if (((TileLiquidMixture) tileAbove).items.size() > 0) if (((TileFluidMixture) tileAbove).items.size() > 0)
{ {
/** /**
* Leak the fluid down. * Leak the fluid down.
@ -71,7 +71,7 @@ public class BlockFilter extends BlockRI implements ITileEntityProvider
if (amount <= 1) if (amount <= 1)
{ {
System.out.println("filter dropped"); System.out.println("filter dropped");
for (ItemStack itemStack : ((TileLiquidMixture) tileAbove).items) for (ItemStack itemStack : ((TileFluidMixture) tileAbove).items)
{ {
for (Resource resoure : MachineRecipes.INSTANCE.getOutput(RecipeType.MIXER, itemStack)) for (Resource resoure : MachineRecipes.INSTANCE.getOutput(RecipeType.MIXER, itemStack))
{ {

View file

@ -15,7 +15,7 @@ import resonantinduction.api.recipe.MachineRecipes;
import resonantinduction.api.recipe.MachineRecipes.RecipeType; import resonantinduction.api.recipe.MachineRecipes.RecipeType;
import resonantinduction.core.Reference; import resonantinduction.core.Reference;
import resonantinduction.core.ResonantInduction; import resonantinduction.core.ResonantInduction;
import resonantinduction.core.resource.fluid.TileLiquidMixture; import resonantinduction.core.resource.fluid.TileFluidMixture;
import resonantinduction.mechanical.network.TileMechanical; import resonantinduction.mechanical.network.TileMechanical;
import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.Vector3;
@ -158,10 +158,10 @@ public class TileMixer extends TileMechanical
Vector3 mixPosition = new Vector3(entity.posX, yCoord, entity.posZ); Vector3 mixPosition = new Vector3(entity.posX, yCoord, entity.posZ);
TileEntity tileEntity = mixPosition.getTileEntity(worldObj); TileEntity tileEntity = mixPosition.getTileEntity(worldObj);
if (tileEntity instanceof TileLiquidMixture) if (tileEntity instanceof TileFluidMixture)
{ {
ItemStack itemStack = entity.getEntityItem().copy(); ItemStack itemStack = entity.getEntityItem().copy();
if (((TileLiquidMixture) tileEntity).mix(itemStack)) if (((TileFluidMixture) tileEntity).mix(itemStack))
{ {
System.out.println("MIXED"); System.out.println("MIXED");
worldObj.notifyBlocksOfNeighborChange(mixPosition.intX(), mixPosition.intY(), mixPosition.intZ(), mixPosition.getBlockID(worldObj)); worldObj.notifyBlocksOfNeighborChange(mixPosition.intX(), mixPosition.intY(), mixPosition.intZ(), mixPosition.getBlockID(worldObj));