Hbm-s-Nuclear-Tech-GIT/com/hbm/tileentity/machine/TileEntityMachineBattery.java

278 lines
6.2 KiB
Java

package com.hbm.tileentity.machine;
import java.util.ArrayList;
import java.util.List;
import com.hbm.blocks.machine.MachineBattery;
import com.hbm.interfaces.IConsumer;
import com.hbm.interfaces.ISource;
import com.hbm.items.machine.ItemBattery;
import com.hbm.lib.Library;
import com.hbm.tileentity.TileEntityMachineBase;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
public class TileEntityMachineBattery extends TileEntityMachineBase implements IConsumer, ISource {
public long power = 0;
public long maxPower = 1000000;
//0: input only
//1: buffer
//2: output only
//3: nothing
public short redLow = 0;
public short redHigh = 2;
public boolean conducts = false;
private static final int[] slots_top = new int[] {0};
private static final int[] slots_bottom = new int[] {0, 1};
private static final int[] slots_side = new int[] {1};
public int age = 0;
public List<IConsumer> list = new ArrayList();
private String customName;
public TileEntityMachineBattery() {
super(2);
slots = new ItemStack[2];
}
public TileEntityMachineBattery(long maxPower) {
super(2);
slots = new ItemStack[2];
this.maxPower = maxPower;
}
@Override
public String getName() {
return "container.battery";
}
@Override
public String getInventoryName() {
return this.hasCustomInventoryName() ? this.customName : getName();
}
@Override
public boolean hasCustomInventoryName() {
return this.customName != null && this.customName.length() > 0;
}
public void setCustomName(String name) {
this.customName = name;
}
@Override
public boolean isItemValidForSlot(int i, ItemStack stack) {
switch(i)
{
case 0:
if(stack.getItem() instanceof ItemBattery)
return true;
break;
case 1:
if(stack.getItem() instanceof ItemBattery)
return true;
break;
}
return true;
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
NBTTagList list = nbt.getTagList("items", 10);
this.power = nbt.getLong("power");
this.redLow = nbt.getShort("redLow");
this.redHigh = nbt.getShort("redHigh");
slots = new ItemStack[getSizeInventory()];
for(int i = 0; i < list.tagCount(); i++)
{
NBTTagCompound nbt1 = list.getCompoundTagAt(i);
byte b0 = nbt1.getByte("slot");
if(b0 >= 0 && b0 < slots.length)
{
slots[b0] = ItemStack.loadItemStackFromNBT(nbt1);
}
}
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setLong("power", power);
nbt.setShort("redLow", redLow);
nbt.setShort("redHigh", redHigh);
NBTTagList list = new NBTTagList();
for(int i = 0; i < slots.length; i++)
{
if(slots[i] != null)
{
NBTTagCompound nbt1 = new NBTTagCompound();
nbt1.setByte("slot", (byte)i);
slots[i].writeToNBT(nbt1);
list.appendTag(nbt1);
}
}
nbt.setTag("items", list);
}
@Override
public int[] getAccessibleSlotsFromSide(int p_94128_1_)
{
return p_94128_1_ == 0 ? slots_bottom : (p_94128_1_ == 1 ? slots_top : slots_side);
}
@Override
public boolean canInsertItem(int i, ItemStack itemStack, int j) {
return this.isItemValidForSlot(i, itemStack);
}
@Override
public boolean canExtractItem(int i, ItemStack itemStack, int j) {
if(itemStack.getItem() instanceof ItemBattery) {
if(i == 0 && ItemBattery.getCharge(itemStack) == 0) {
return true;
}
if(i == 1 && ItemBattery.getCharge(itemStack) == ItemBattery.getMaxChargeStatic(itemStack)) {
return true;
}
}
return false;
}
public long getPowerRemainingScaled(long i) {
return (power * i) / maxPower;
}
@Override
public void updateEntity() {
if(worldObj.getBlock(xCoord, yCoord, zCoord) instanceof MachineBattery && !worldObj.isRemote) {
this.maxPower = ((MachineBattery)worldObj.getBlock(xCoord, yCoord, zCoord)).maxPower;
short mode = (short) this.getRelevantMode();
if(mode == 1 || mode == 2)
{
age++;
if(age >= 20)
{
age = 0;
}
if(age == 9 || age == 19)
ffgeuaInit();
}
power = Library.chargeTEFromItems(slots, 0, power, maxPower);
power = Library.chargeItemsFromTE(slots, 1, power, maxPower);
NBTTagCompound nbt = new NBTTagCompound();
nbt.setLong("power", power);
nbt.setLong("maxPower", maxPower);
nbt.setShort("redLow", redLow);
nbt.setShort("redHigh", redHigh);
this.networkPack(nbt, 20);
}
}
@Override
public void networkUnpack(NBTTagCompound nbt) {
this.power = nbt.getLong("power");
this.maxPower = nbt.getLong("maxPower");
this.redLow = nbt.getShort("redLow");
this.redHigh = nbt.getShort("redHigh");
}
@Override
public void setPower(long i) {
power = i;
}
@Override
public long getPower() {
return power;
}
@Override
public void ffgeua(int x, int y, int z, boolean newTact) {
Library.ffgeua(x, y, z, newTact, this, worldObj);
}
@Override
public void ffgeuaInit() {
ffgeua(this.xCoord, this.yCoord + 1, this.zCoord, getTact());
ffgeua(this.xCoord, this.yCoord - 1, this.zCoord, getTact());
ffgeua(this.xCoord - 1, this.yCoord, this.zCoord, getTact());
ffgeua(this.xCoord + 1, this.yCoord, this.zCoord, getTact());
ffgeua(this.xCoord, this.yCoord, this.zCoord - 1, getTact());
ffgeua(this.xCoord, this.yCoord, this.zCoord + 1, getTact());
}
@Override
public boolean getTact() {
if(age >= 0 && age < 10)
{
return true;
}
return false;
}
public short getRelevantMode() {
if(worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) {
return this.redHigh;
} else {
return this.redLow;
}
}
@Override
public long getMaxPower() {
if(!worldObj.isRemote && getRelevantMode() >= 2)
return 0;
return maxPower;
}
@Override
public long getSPower() {
return power;
}
@Override
public void setSPower(long i) {
this.power = i;
}
@Override
public List<IConsumer> getList() {
return list;
}
@Override
public void clearList() {
this.list.clear();
}
}