micdoodle8.mods.galacticraft.core.tile.GCCoreTileEntityCoalGenerator.java Source code

Java tutorial

Introduction

Here is the source code for micdoodle8.mods.galacticraft.core.tile.GCCoreTileEntityCoalGenerator.java

Source

package micdoodle8.mods.galacticraft.core.tile;

import java.util.EnumSet;
import java.util.HashSet;
import java.util.Set;

import micdoodle8.mods.galacticraft.api.transmission.ElectricityPack;
import micdoodle8.mods.galacticraft.api.transmission.tile.IElectrical;
import micdoodle8.mods.galacticraft.core.GalacticraftCore;
import micdoodle8.mods.galacticraft.core.network.GCCorePacketManager;
import micdoodle8.mods.galacticraft.core.network.IPacketReceiver;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
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.network.INetworkManager;
import net.minecraft.network.packet.Packet;
import net.minecraft.network.packet.Packet250CustomPayload;
import net.minecraft.util.StatCollector;
import net.minecraftforge.common.ForgeDirection;

import com.google.common.io.ByteArrayDataInput;

import cpw.mods.fml.common.network.PacketDispatcher;
import cpw.mods.fml.common.network.Player;

/**
 * GCCoreTileEntityCoalGenerator.java
 *
 * This file is part of the Galacticraft project
 *
 * @author micdoodle8
 * @license Lesser GNU Public License v3 (http://www.gnu.org/licenses/lgpl.html)
 * 
 */
public class GCCoreTileEntityCoalGenerator extends GCCoreTileEntityUniversalElectrical
        implements IElectrical, IInventory, ISidedInventory, IPacketReceiver {
    /**
     * Maximum amount of energy needed to generate electricity
     */
    public static final float MAX_GENERATE_WATTS = 0.5f;

    /**
     * Amount of heat the coal generator needs before generating electricity.
     */
    public static final float MIN_GENERATE_WATTS = 0.1f;

    private static final float BASE_ACCELERATION = 0.0003f;

    /**
     * Per second
     */
    public float prevGenerateWatts, generateWatts = 0;

    /**
     * The number of ticks that a fresh copy of the currently-burning item would
     * keep the furnace burning for
     */
    public int itemCookTime = 0;
    /**
     * The ItemStacks that hold the items currently being used in the battery
     * box
     */
    private ItemStack[] containingItems = new ItemStack[1];

    public final Set<EntityPlayer> playersUsing = new HashSet<EntityPlayer>();

    @Override
    public void updateEntity() {
        this.setEnergyStored(this.generateWatts);

        super.updateEntity();

        if (!this.worldObj.isRemote) {
            this.prevGenerateWatts = this.generateWatts;

            if (this.itemCookTime > 0) {
                this.itemCookTime--;

                if (this.getEnergyStored() < this.getMaxEnergyStored()) {
                    this.generateWatts = Math.min(
                            this.generateWatts + Math.min(this.generateWatts * 0.000005F
                                    + GCCoreTileEntityCoalGenerator.BASE_ACCELERATION, 0.005F),
                            GCCoreTileEntityCoalGenerator.MAX_GENERATE_WATTS);
                }
            }

            if (this.containingItems[0] != null) {
                if (this.containingItems[0].getItem().itemID == Item.coal.itemID) {
                    if (this.itemCookTime <= 0) {
                        this.itemCookTime = 320;
                        this.decrStackSize(0, 1);
                    }
                }
            }

            this.produce();

            if (this.itemCookTime <= 0) {
                this.generateWatts = Math.max(this.generateWatts - 0.008F, 0);
            }

            this.generateWatts = Math.min(Math.max(this.generateWatts, 0.0F), this.getMaxEnergyStored());

            if (this.ticks % 3 == 0) {
                for (EntityPlayer player : this.playersUsing) {
                    PacketDispatcher.sendPacketToPlayer(this.getDescriptionPacket(), (Player) player);
                }
            }

            if (this.prevGenerateWatts <= 0 && this.generateWatts > 0
                    || this.prevGenerateWatts > 0 && this.generateWatts <= 0) {
                GCCorePacketManager.sendPacketToClients(this.getDescriptionPacket(), this.worldObj);
            }
        }
    }

    @Override
    public Packet getDescriptionPacket() {
        return GCCorePacketManager.getPacket(GalacticraftCore.CHANNELENTITIES, this, this.generateWatts,
                this.itemCookTime, this.getEnergyStored());
    }

    @Override
    public void handlePacketData(INetworkManager network, int type, Packet250CustomPayload packet,
            EntityPlayer player, ByteArrayDataInput dataStream) {
        try {
            if (this.worldObj.isRemote) {
                this.generateWatts = dataStream.readFloat();
                this.itemCookTime = dataStream.readInt();
                this.setEnergyStored(dataStream.readFloat());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void openChest() {
    }

    @Override
    public void closeChest() {
    }

    /**
     * Reads a tile entity from NBT.
     */
    @Override
    public void readFromNBT(NBTTagCompound par1NBTTagCompound) {
        super.readFromNBT(par1NBTTagCompound);
        this.itemCookTime = par1NBTTagCompound.getInteger("itemCookTime");
        this.generateWatts = par1NBTTagCompound.getFloat("generateRate");
        NBTTagList var2 = par1NBTTagCompound.getTagList("Items");
        this.containingItems = new ItemStack[this.getSizeInventory()];

        for (int var3 = 0; var3 < var2.tagCount(); ++var3) {
            NBTTagCompound var4 = (NBTTagCompound) var2.tagAt(var3);
            byte var5 = var4.getByte("Slot");

            if (var5 >= 0 && 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.generateWatts);
        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 getStackInSlotOnClosing(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 getInvName() {
        return StatCollector.translateToLocal("tile.machine.0.name");
    }

    @Override
    public int getInventoryStackLimit() {
        return 64;
    }

    @Override
    public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer) {
        return this.worldObj.getBlockTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false
                : par1EntityPlayer.getDistanceSq(this.xCoord + 0.5D, this.yCoord + 0.5D,
                        this.zCoord + 0.5D) <= 64.0D;
    }

    @Override
    public boolean isInvNameLocalized() {
        return true;
    }

    @Override
    public boolean isItemValidForSlot(int slotID, ItemStack itemstack) {
        return itemstack.itemID == Item.coal.itemID;
    }

    @Override
    public int[] getAccessibleSlotsFromSide(int var1) {
        return new int[] { 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(ForgeDirection from, ElectricityPack electricityPack, boolean doReceive) {
        return 0;
    }

    @Override
    public float getRequest(ForgeDirection direction) {
        return 0;
    }

    @Override
    public float getProvide(ForgeDirection direction) {
        return this.generateWatts < GCCoreTileEntityCoalGenerator.MIN_GENERATE_WATTS ? 0 : this.generateWatts;
    }

    @Override
    public EnumSet<ForgeDirection> getElectricalInputDirections() {
        return EnumSet.noneOf(ForgeDirection.class);
    }

    @Override
    public EnumSet<ForgeDirection> getElectricalOutputDirections() {
        return EnumSet.of(ForgeDirection.getOrientation(this.getBlockMetadata() + 2));
    }

    @Override
    public float getMaxEnergyStored() {
        return GCCoreTileEntityCoalGenerator.MAX_GENERATE_WATTS;
    }
}