package micdoodle8.mods.galacticraft.core.tile; import micdoodle8.mods.galacticraft.api.transmission.NetworkType; import micdoodle8.mods.galacticraft.api.transmission.tile.IConnector; import micdoodle8.mods.galacticraft.core.blocks.BlockMachine; import micdoodle8.mods.galacticraft.core.energy.tile.TileBaseUniversalElectricalSource; import micdoodle8.mods.galacticraft.core.inventory.IInventoryDefaults; import micdoodle8.mods.galacticraft.core.util.GCCoreUtil; import micdoodle8.mods.miccore.Annotations.NetworkedField; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.EnumFacing; import net.minecraftforge.fml.relauncher.Side; import java.util.EnumSet; public class TileEntityCoalGenerator extends TileBaseUniversalElectricalSource implements IInventoryDefaults, ISidedInventory, IConnector { //New energy rates: // //Tier 1 machine typically consumes 600 gJ/s = 30 gJ/t //Coal generator on max heat can power up to 4 Tier 1 machines //(fewer if one of them is an Electric Furnace) //Basic solar gen in full sun can power 1 Tier 1 machine //1 lump of coal is equivalent to 38400 gJ //because on max heat it produces 120 gJ/t over 320 ticks //Below the min_generate, all heat is wasted //At max generate, 100% efficient conversion coal energy -> electric makes 120 gJ/t public static final int MAX_GENERATE_GJ_PER_TICK = 150; public static final int MIN_GENERATE_GJ_PER_TICK = 30; private static final float BASE_ACCELERATION = 0.3f; public float prevGenerateWatts = 0; @NetworkedField(targetSide = Side.CLIENT) public float heatGJperTick = 0; /** * The number of ticks that a fresh copy of the currently-burning item would * keep the furnace burning for */ @NetworkedField(targetSide = Side.CLIENT) public int itemCookTime = 0; /** * The ItemStacks that hold the items currently being used in the battery * box */ private ItemStack[] containingItems = new ItemStack[1]; public TileEntityCoalGenerator() { this.storage.setMaxExtract(TileEntityCoalGenerator.MAX_GENERATE_GJ_PER_TICK - TileEntityCoalGenerator.MIN_GENERATE_GJ_PER_TICK); } @Override public void update() { if (!this.worldObj.isRemote && this.heatGJperTick - TileEntityCoalGenerator.MIN_GENERATE_GJ_PER_TICK > 0) { this.receiveEnergyGC(null, (this.heatGJperTick - TileEntityCoalGenerator.MIN_GENERATE_GJ_PER_TICK), false); } super.update(); if (!this.worldObj.isRemote) { if (this.itemCookTime > 0) { this.itemCookTime--; this.heatGJperTick = Math.min(this.heatGJperTick + Math.max(this.heatGJperTick * 0.005F, TileEntityCoalGenerator.BASE_ACCELERATION), TileEntityCoalGenerator.MAX_GENERATE_GJ_PER_TICK); } if (this.itemCookTime <= 0 && this.containingItems[0] != null) { if (this.containingItems[0].getItem() == Items.coal && this.containingItems[0].stackSize > 0) { this.itemCookTime = 320; this.decrStackSize(0, 1); } else if (this.containingItems[0].getItem() == Item.getItemFromBlock(Blocks.coal_block) && this.containingItems[0].stackSize > 0) { this.itemCookTime = 320 * 10; this.decrStackSize(0, 1); } } this.produce(); if (this.itemCookTime <= 0) { this.heatGJperTick = Math.max(this.heatGJperTick - 0.3F, 0); } this.heatGJperTick = Math.min(Math.max(this.heatGJperTick, 0.0F), this.getMaxEnergyStoredGC()); } } /** * Reads a tile entity from NBT. */ @Override public void readFromNBT(NBTTagCompound par1NBTTagCompound) { super.readFromNBT(par1NBTTagCompound); this.itemCookTime = par1NBTTagCompound.getInteger("itemCookTime"); this.heatGJperTick = par1NBTTagCompound.getInteger("generateRateInt"); NBTTagList var2 = par1NBTTagCompound.getTagList("Items", 10); this.containingItems = new ItemStack[this.getSizeInventory()]; for (int var3 = 0; var3 < var2.tagCount(); ++var3) { NBTTagCompound var4 = var2.getCompoundTagAt(var3); int var5 = var4.getByte("Slot") & 255; if (var5 < this.containingItems.length) { this.containingItems[var5] = ItemStack.loadItemStackFromNBT(var4); } } } /** * Writes a tile entity to NBT. */ @Override public void writeToNBT(NBTTagCompound par1NBTTagCompound) { super.writeToNBT(par1NBTTagCompound); par1NBTTagCompound.setInteger("itemCookTime", this.itemCookTime); par1NBTTagCompound.setFloat("generateRate", this.heatGJperTick); NBTTagList var2 = new NBTTagList(); for (int var3 = 0; var3 < this.containingItems.length; ++var3) { if (this.containingItems[var3] != null) { NBTTagCompound var4 = new NBTTagCompound(); var4.setByte("Slot", (byte) var3); this.containingItems[var3].writeToNBT(var4); var2.appendTag(var4); } } par1NBTTagCompound.setTag("Items", var2); } @Override public int getSizeInventory() { return this.containingItems.length; } @Override public ItemStack getStackInSlot(int par1) { return this.containingItems[par1]; } @Override public ItemStack decrStackSize(int par1, int par2) { if (this.containingItems[par1] != null) { ItemStack var3; if (this.containingItems[par1].stackSize <= par2) { var3 = this.containingItems[par1]; this.containingItems[par1] = null; return var3; } else { var3 = this.containingItems[par1].splitStack(par2); if (this.containingItems[par1].stackSize == 0) { this.containingItems[par1] = null; } return var3; } } else { return null; } } @Override public ItemStack removeStackFromSlot(int par1) { if (this.containingItems[par1] != null) { ItemStack var2 = this.containingItems[par1]; this.containingItems[par1] = null; return var2; } else { return null; } } @Override public void setInventorySlotContents(int par1, ItemStack par2ItemStack) { this.containingItems[par1] = par2ItemStack; if (par2ItemStack != null && par2ItemStack.stackSize > this.getInventoryStackLimit()) { par2ItemStack.stackSize = this.getInventoryStackLimit(); } } @Override public String getName() { return GCCoreUtil.translate("tile.machine.0.name"); } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer) { return this.worldObj.getTileEntity(this.getPos()) == this && par1EntityPlayer.getDistanceSq(this.getPos().getX() + 0.5D, this.getPos().getY() + 0.5D, this.getPos().getZ() + 0.5D) <= 64.0D; } // @Override // public boolean hasCustomName() // { // return true; // } @Override public boolean isItemValidForSlot(int slotID, ItemStack itemstack) { return itemstack.getItem() == Items.coal || itemstack.getItem() == Item.getItemFromBlock(Blocks.coal_block); } // @Override // public int[] getAccessibleSlotsFromSide(int var1) // { // return new int[] { 0 }; // } @Override public int[] getSlotsForFace(EnumFacing side) { return new int[0]; } @Override public boolean canInsertItem(int slotID, ItemStack itemstack, EnumFacing direction) { return this.isItemValidForSlot(slotID, itemstack); } @Override public boolean canExtractItem(int slotID, ItemStack itemstack, EnumFacing direction) { return slotID == 0; } // @Override // public boolean canInsertItem(int slotID, ItemStack itemstack, int j) // { // return this.isItemValidForSlot(slotID, itemstack); // } // // @Override // public boolean canExtractItem(int slotID, ItemStack itemstack, int j) // { // return slotID == 0; // } @Override public float receiveElectricity(EnumFacing from, float energy, int tier, boolean doReceive) { return 0; } /* @Override public float getRequest(EnumFacing direction) { return 0; } */ @Override public EnumSet<EnumFacing> getElectricalInputDirections() { return EnumSet.noneOf(EnumFacing.class); } @Override public EnumSet<EnumFacing> getElectricalOutputDirections() { return EnumSet.of(this.getElectricOutputDirection()); } public EnumFacing getFront() { return this.worldObj.getBlockState(getPos()).getValue(BlockMachine.FACING); } @Override public EnumFacing getElectricOutputDirection() { return getFront().rotateY(); } @Override public boolean canConnect(EnumFacing direction, NetworkType type) { if (direction == null || type != NetworkType.POWER) { return false; } return direction == this.getElectricOutputDirection(); } }