/* * Copyright (c) CovertJaguar, 2014 http://railcraft.info * * This code is the property of CovertJaguar * and may only be used with explicit written * permission unless otherwise specified on the * license page at http://railcraft.info/wiki/info:license. */ package mods.railcraft.common.blocks.machine.gamma; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import mods.railcraft.api.carts.IEnergyTransfer; import mods.railcraft.common.carts.CartUtils; import net.minecraft.entity.item.EntityMinecart; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; import mods.railcraft.common.modules.ModuleIC2; import mods.railcraft.common.plugins.ic2.IC2Plugin; import mods.railcraft.common.util.inventory.InvTools; import mods.railcraft.common.util.misc.Game; import mods.railcraft.common.util.misc.MiscTools; import net.minecraft.entity.EntityLivingBase; import net.minecraft.inventory.ISidedInventory; import net.minecraft.tileentity.TileEntity; public abstract class TileLoaderEnergyBase extends TileLoaderBase implements ISidedInventory { private static final int SLOT_CHARGE = 0; private static final int SLOT_BATTERY = 1; private static final int TIER = 2; private static final int CAPACITY = 100000; private static final int MAX_OVERCLOCKS = 10; private static final int MAX_LAPOTRON = 6; private static final int[] SLOTS = InvTools.buildSlotArray(0, 2); public int transferRate; public short storageUpgrades; public short lapotronUpgrades; protected int energy; protected short transformerUpgrades; protected short overclockerUpgrades; protected ForgeDirection direction = ForgeDirection.NORTH; protected boolean transferredEnergy; private boolean addedToIC2EnergyNet; public TileLoaderEnergyBase() { super(); setInventorySize(6); } @Override public int[] getAccessibleSlotsFromSide(int side) { return SLOTS; } @Override public boolean canInsertItem(int slot, ItemStack stack, int side) { switch (slot) { case SLOT_CHARGE: return IC2Plugin.canCharge(stack, getTier()); case SLOT_BATTERY: return IC2Plugin.canDischarge(stack, getTier()); default: return false; } } @Override public boolean canExtractItem(int slot, ItemStack stack, int side) { return true; } @Override public void onBlockPlacedBy(EntityLivingBase entityliving, ItemStack stack) { super.onBlockPlacedBy(entityliving, stack); direction = MiscTools.getSideFacingTrack(worldObj, xCoord, yCoord, zCoord); if (direction == ForgeDirection.UNKNOWN) direction = MiscTools.getSideClosestToPlayer(worldObj, xCoord, yCoord, zCoord, entityliving); } protected void countUpgrades() { ItemStack storage = IC2Plugin.getItem("energyStorageUpgrade"); ItemStack overclocker = IC2Plugin.getItem("overclockerUpgrade"); ItemStack transformer = IC2Plugin.getItem("transformerUpgrade"); Item lapotron = ModuleIC2.lapotronUpgrade; storageUpgrades = 0; overclockerUpgrades = 0; transformerUpgrades = 0; lapotronUpgrades = 0; for (int i = 2; i < 6; i++) { ItemStack stack = getStackInSlot(i); if (stack != null) if (storage != null && stack.isItemEqual(storage)) storageUpgrades += stack.stackSize; else if (overclocker != null && stack.isItemEqual(overclocker)) overclockerUpgrades += stack.stackSize; else if (transformer != null && stack.isItemEqual(transformer)) transformerUpgrades += stack.stackSize; else if (lapotron != null && stack.getItem() == lapotron) lapotronUpgrades += stack.stackSize; } if (overclockerUpgrades > MAX_OVERCLOCKS) overclockerUpgrades = MAX_OVERCLOCKS; if (lapotronUpgrades > MAX_LAPOTRON) lapotronUpgrades = MAX_LAPOTRON; } @Override public void markDirty() { super.markDirty(); countUpgrades(); } @Override public boolean isManualMode() { return false; } @Override public boolean canHandleCart(EntityMinecart cart) { if (isSendCartGateAction()) return false; if (!(cart instanceof IEnergyTransfer)) return false; IEnergyTransfer energyCart = (IEnergyTransfer) cart; if (energyCart.getTier() > getTier()) return false; // ItemStack minecartSlot1 = getCartFilters().getStackInSlot(0); // ItemStack minecartSlot2 = getCartFilters().getStackInSlot(1); // if (minecartSlot1 != null || minecartSlot2 != null) // if (!CartUtils.doesCartMatchFilter(minecartSlot1, cart) && !CartUtils.doesCartMatchFilter(minecartSlot2, cart)) // return false; return true; } @Override public boolean isProcessing() { return transferredEnergy; } public abstract TileEntity getIC2Delegate(); @Override public void updateEntity() { super.updateEntity(); if (Game.isNotHost(getWorld())) return; if (!addedToIC2EnergyNet) { IC2Plugin.addTileToNet(getIC2Delegate()); addedToIC2EnergyNet = true; } int capacity = getCapacity(); if (energy > capacity) energy = capacity; ItemStack charge = getStackInSlot(SLOT_CHARGE); if (charge != null) energy -= IC2Plugin.chargeItem(charge, energy, getTier()); ItemStack battery = getStackInSlot(SLOT_BATTERY); if (battery != null && energy < capacity) energy += IC2Plugin.dischargeItem(battery, capacity - energy, getTier()); if (clock % 64 == 0) countUpgrades(); } private void dropFromNet() { if (addedToIC2EnergyNet) IC2Plugin.removeTileFromNet(getIC2Delegate()); } @Override public void onChunkUnload() { super.onChunkUnload(); dropFromNet(); } @Override public void invalidate() { super.invalidate(); dropFromNet(); } @Override public void writeToNBT(NBTTagCompound data) { super.writeToNBT(data); data.setInteger("energy", energy); data.setByte("direction", (byte) direction.ordinal()); } @Override public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); energy = data.getInteger("energy"); direction = ForgeDirection.getOrientation(data.getByte("direction")); countUpgrades(); } @Override public void writePacketData(DataOutputStream data) throws IOException { super.writePacketData(data); data.writeByte(direction.ordinal()); data.writeShort(storageUpgrades); data.writeShort(lapotronUpgrades); } @Override public void readPacketData(DataInputStream data) throws IOException { super.readPacketData(data); direction = ForgeDirection.getOrientation(data.readByte()); storageUpgrades = data.readShort(); lapotronUpgrades = data.readShort(); } @Override public boolean rotateBlock(ForgeDirection axis) { if (direction == axis) direction = axis.getOpposite(); else direction = axis; markBlockForUpdate(); return true; } public double getEnergy() { return energy; } public void setEnergy(int energy) { this.energy = energy; } public int getCapacity() { int capacity = CAPACITY; capacity += storageUpgrades * 10000; capacity += lapotronUpgrades * 5000000; return capacity; } public int getTier() { return TIER + transformerUpgrades; } public int getTransferRate() { return transferRate; } public int getEnergyBarScaled(int scale) { return ((int) getEnergy() * scale) / getCapacity(); } }