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

Java tutorial

Introduction

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

Source

package micdoodle8.mods.galacticraft.core.tile;

import micdoodle8.mods.galacticraft.api.transmission.core.item.IItemElectric;
import micdoodle8.mods.galacticraft.api.vector.Vector3;
import micdoodle8.mods.galacticraft.core.GalacticraftCore;
import micdoodle8.mods.galacticraft.core.items.GCCoreItemOilCanister;
import micdoodle8.mods.galacticraft.core.items.GCCoreItems;
import micdoodle8.mods.galacticraft.core.network.GCCorePacketManager;
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.packet.Packet;
import net.minecraft.util.StatCollector;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTank;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;

import com.google.common.io.ByteArrayDataInput;

/**
 * GCCoreTileEntityRefinery.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 GCCoreTileEntityRefinery extends GCCoreTileEntityElectricBlock
        implements IInventory, ISidedInventory, IFluidHandler {
    private final int tankCapacity = 24000;
    public FluidTank oilTank = new FluidTank(this.tankCapacity);
    public FluidTank fuelTank = new FluidTank(this.tankCapacity);

    public static final float WATTS_PER_TICK = 0.4F;
    public static final int PROCESS_TIME_REQUIRED = 2;
    public static final int OUTPUT_PER_SECOND = 1;
    public int processTicks = 0;
    private ItemStack[] containingItems = new ItemStack[3];

    public GCCoreTileEntityRefinery() {
        super(GCCoreTileEntityRefinery.WATTS_PER_TICK, 50);
    }

    @Override
    public void updateEntity() {
        super.updateEntity();

        if (!this.worldObj.isRemote) {
            if (this.containingItems[1] != null) {
                FluidStack liquid = FluidContainerRegistry.getFluidForFilledItem(this.containingItems[1]);

                if (liquid != null && FluidRegistry.getFluidName(liquid).equalsIgnoreCase("Oil")) {
                    if (this.oilTank.getFluid() == null
                            || this.oilTank.getFluid().amount + liquid.amount <= this.oilTank.getCapacity()) {
                        this.oilTank.fill(liquid, true);

                        if (this.containingItems[1].getItem() instanceof GCCoreItemOilCanister) {
                            this.containingItems[1] = new ItemStack(GCCoreItems.oilCanister, 1,
                                    GCCoreItems.oilCanister.getMaxDamage());
                        } else if (FluidContainerRegistry.isBucket(this.containingItems[1])
                                && FluidContainerRegistry.isFilledContainer(this.containingItems[1])) {
                            final int amount = this.containingItems[1].stackSize;
                            this.containingItems[1] = new ItemStack(Item.bucketEmpty, amount);
                        } else {
                            this.containingItems[1].stackSize--;

                            if (this.containingItems[1].stackSize == 0) {
                                this.containingItems[1] = null;
                            }
                        }
                    }
                }
            }

            if (this.containingItems[2] != null && FluidContainerRegistry.isContainer(this.containingItems[2])) {
                final FluidStack liquid = this.fuelTank.getFluid();

                if (liquid != null && this.fuelTank.getFluid() != null
                        && this.fuelTank.getFluid().getFluid().getName().equalsIgnoreCase("Fuel")) {
                    if (FluidContainerRegistry.isEmptyContainer(this.containingItems[2])) {
                        boolean isCanister = this.containingItems[2].isItemEqual(
                                new ItemStack(GCCoreItems.oilCanister, 1, GCCoreItems.oilCanister.getMaxDamage()));
                        final int amountToFill = Math.min(liquid.amount,
                                isCanister ? GCCoreItems.fuelCanister.getMaxDamage() - 1
                                        : FluidContainerRegistry.BUCKET_VOLUME);

                        if (isCanister) {
                            this.containingItems[2] = new ItemStack(GCCoreItems.fuelCanister, 1,
                                    GCCoreItems.fuelCanister.getMaxDamage() - amountToFill);
                        } else {
                            this.containingItems[2] = FluidContainerRegistry.fillFluidContainer(liquid,
                                    this.containingItems[2]);
                        }

                        this.fuelTank.drain(amountToFill, true);
                    }
                }
            }

            if (this.canProcess()) {
                if (this.processTicks == 0) {
                    this.processTicks = GCCoreTileEntityRefinery.PROCESS_TIME_REQUIRED;
                } else if (this.processTicks > 0) {
                    this.processTicks--;

                    if (this.processTicks < 1) {
                        this.smeltItem();
                        this.processTicks = 0;
                    }
                } else {
                    this.processTicks = 0;
                }
            } else {
                this.processTicks = 0;
            }
        }
    }

    public int getScaledOilLevel(int i) {
        return this.oilTank.getFluid() != null ? this.oilTank.getFluid().amount * i / this.oilTank.getCapacity()
                : 0;
    }

    public int getScaledFuelLevel(int i) {
        return this.fuelTank.getFluid() != null ? this.fuelTank.getFluid().amount * i / this.fuelTank.getCapacity()
                : 0;
    }

    @Override
    public void openChest() {
        if (!this.worldObj.isRemote) {
            GCCorePacketManager.sendPacketToClients(this.getPacket(), this.worldObj, new Vector3(this), 15);
        }
    }

    @Override
    public void closeChest() {
    }

    public boolean canProcess() {
        if (this.oilTank.getFluid() == null || this.oilTank.getFluid().amount <= 0) {
            return false;
        }

        if (this.getDisabled(0)) {
            return false;
        }

        if (this.getEnergyStored() == 0) {
            return false;
        }

        return true;
    }

    public void smeltItem() {
        if (this.canProcess()) {
            final int oilAmount = this.oilTank.getFluid().amount;
            final int fuelSpace = this.fuelTank.getCapacity()
                    - (this.fuelTank.getFluid() == null ? 0 : this.fuelTank.getFluid().amount);

            final int amountToDrain = Math.min(Math.min(oilAmount, fuelSpace),
                    GCCoreTileEntityRefinery.OUTPUT_PER_SECOND);

            this.oilTank.drain(amountToDrain, true);
            this.fuelTank.fill(FluidRegistry.getFluidStack("fuel", amountToDrain), true);
        }
    }

    @Override
    public void readFromNBT(NBTTagCompound nbt) {
        super.readFromNBT(nbt);
        this.processTicks = nbt.getInteger("smeltingTicks");
        final NBTTagList var2 = nbt.getTagList("Items");
        this.containingItems = new ItemStack[this.getSizeInventory()];

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

            if (var5 >= 0 && var5 < this.containingItems.length) {
                this.containingItems[var5] = ItemStack.loadItemStackFromNBT(var4);
            }
        }

        if (nbt.hasKey("oilTank")) {
            this.oilTank.readFromNBT(nbt.getCompoundTag("oilTank"));
        }

        if (nbt.hasKey("fuelTank")) {
            this.fuelTank.readFromNBT(nbt.getCompoundTag("fuelTank"));
        }
    }

    @Override
    public void writeToNBT(NBTTagCompound nbt) {
        super.writeToNBT(nbt);
        nbt.setInteger("smeltingTicks", this.processTicks);
        final NBTTagList var2 = new NBTTagList();

        for (int var3 = 0; var3 < this.containingItems.length; ++var3) {
            if (this.containingItems[var3] != null) {
                final NBTTagCompound var4 = new NBTTagCompound();
                var4.setByte("Slot", (byte) var3);
                this.containingItems[var3].writeToNBT(var4);
                var2.appendTag(var4);
            }
        }

        nbt.setTag("Items", var2);

        if (this.oilTank.getFluid() != null) {
            nbt.setTag("oilTank", this.oilTank.writeToNBT(new NBTTagCompound()));
        }

        if (this.fuelTank.getFluid() != null) {
            nbt.setTag("fuelTank", this.fuelTank.writeToNBT(new NBTTagCompound()));
        }
    }

    @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) {
            final 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("container.refinery.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;
    }

    // ISidedInventory Implementation:

    @Override
    public int[] getAccessibleSlotsFromSide(int side) {
        return new int[] { 0, 1, 2 };
    }

    @Override
    public boolean canInsertItem(int slotID, ItemStack itemstack, int side) {
        if (this.isItemValidForSlot(slotID, itemstack)) {
            switch (slotID) {
            case 0:
                return ((IItemElectric) itemstack.getItem()).getElectricityStored(itemstack) > 0;
            case 1:
                FluidStack stack = FluidContainerRegistry.getFluidForFilledItem(itemstack);
                return stack != null && stack.getFluid() != null
                        && stack.getFluid().getName().equalsIgnoreCase("oil");
            case 2:
                return FluidContainerRegistry.isEmptyContainer(itemstack);
            default:
                return false;
            }
        }
        return false;
    }

    @Override
    public boolean canExtractItem(int slotID, ItemStack itemstack, int side) {
        if (this.isItemValidForSlot(slotID, itemstack)) {
            switch (slotID) {
            case 0:
                return ((IItemElectric) itemstack.getItem()).getElectricityStored(itemstack) <= 0
                        || !this.shouldPullEnergy();
            case 1:
                return FluidContainerRegistry.isEmptyContainer(itemstack);
            case 2:
                FluidStack stack = FluidContainerRegistry.getFluidForFilledItem(itemstack);
                return stack != null && stack.getFluid() != null
                        && stack.getFluid().getName().equalsIgnoreCase("fuel");
            default:
                return false;
            }
        }
        return false;
    }

    @Override
    public boolean isItemValidForSlot(int slotID, ItemStack itemstack) {
        switch (slotID) {
        case 0:
            return itemstack.getItem() instanceof IItemElectric;
        case 1:
            FluidStack stack = FluidContainerRegistry.getFluidForFilledItem(itemstack);
            return stack != null && stack.getFluid() != null && stack.getFluid().getName().equalsIgnoreCase("oil")
                    || FluidContainerRegistry.isContainer(itemstack);
        case 2:
            FluidStack stack2 = FluidContainerRegistry.getFluidForFilledItem(itemstack);
            return stack2 != null && stack2.getFluid() != null
                    && stack2.getFluid().getName().equalsIgnoreCase("fuel")
                    || FluidContainerRegistry.isContainer(itemstack);
        }

        return false;
    }

    @Override
    public boolean shouldPullEnergy() {
        return this.getEnergyStored() <= this.getMaxEnergyStored() - this.ueWattsPerTick;
    }

    @Override
    public boolean shouldUseEnergy() {
        return this.canProcess();
    }

    @Override
    public void readPacket(ByteArrayDataInput data) {
        if (this.worldObj.isRemote) {
            this.setEnergyStored(data.readFloat());
            this.processTicks = data.readInt();
            this.oilTank.setFluid(new FluidStack(GalacticraftCore.fluidOil, data.readInt()));
            this.fuelTank.setFluid(new FluidStack(GalacticraftCore.fluidFuel, data.readInt()));
            this.disabled = data.readBoolean();
            this.disableCooldown = data.readInt();
        }
    }

    @Override
    public Packet getPacket() {
        return GCCorePacketManager.getPacket(GalacticraftCore.CHANNELENTITIES, this, this.getEnergyStored(),
                this.processTicks, this.oilTank.getFluid() == null ? 0 : this.oilTank.getFluid().amount,
                this.fuelTank.getFluid() == null ? 0 : this.fuelTank.getFluid().amount, this.disabled,
                this.disableCooldown);
    }

    @Override
    public ForgeDirection getElectricInputDirection() {
        return ForgeDirection.UP;
    }

    @Override
    public ItemStack getBatteryInSlot() {
        return this.getStackInSlot(0);
    }

    @Override
    public boolean canDrain(ForgeDirection from, Fluid fluid) {
        if (from.equals(ForgeDirection.getOrientation(this.getBlockMetadata() + 2))) {
            return this.fuelTank.getFluid() != null && this.fuelTank.getFluidAmount() > 0;
        }

        return false;
    }

    @Override
    public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) {
        if (from.equals(ForgeDirection.getOrientation(this.getBlockMetadata() + 2))) {
            return this.fuelTank.drain(resource.amount, doDrain);
        }

        return null;
    }

    @Override
    public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
        if (from.equals(ForgeDirection.getOrientation(this.getBlockMetadata() + 2))) {
            return this.drain(from, new FluidStack(GalacticraftCore.fluidFuel, maxDrain), doDrain);
        }

        return null;
    }

    @Override
    public boolean canFill(ForgeDirection from, Fluid fluid) {
        if (from.equals(ForgeDirection.getOrientation(this.getBlockMetadata() + 2).getOpposite())) {
            return this.oilTank.getFluid() == null || this.oilTank.getFluidAmount() < this.oilTank.getCapacity();
        }

        return false;
    }

    @Override
    public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
        int used = 0;

        if (from.equals(ForgeDirection.getOrientation(this.getBlockMetadata() + 2).getOpposite())) {
            final String liquidName = FluidRegistry.getFluidName(resource);

            if (liquidName != null && liquidName.equalsIgnoreCase("Oil")) {
                used = this.oilTank.fill(resource, doFill);
            }
        }

        return used;
    }

    @Override
    public FluidTankInfo[] getTankInfo(ForgeDirection from) {
        FluidTankInfo[] tankInfo = new FluidTankInfo[] {};

        if (from == ForgeDirection.getOrientation(this.getBlockMetadata() + 2).getOpposite()) {
            tankInfo = new FluidTankInfo[] { new FluidTankInfo(this.oilTank) };
        } else if (from == ForgeDirection.getOrientation(this.getBlockMetadata() + 2)) {
            tankInfo = new FluidTankInfo[] { new FluidTankInfo(this.fuelTank) };
        }

        return tankInfo;
    }
}