generated from tilera/1710mod
286 lines
8.1 KiB
Java
286 lines
8.1 KiB
Java
package com.eloraam.redpower.base;
|
|
|
|
import com.eloraam.redpower.RedPowerBase;
|
|
import com.eloraam.redpower.core.CoreLib;
|
|
import com.eloraam.redpower.core.CraftLib;
|
|
import java.util.stream.IntStream;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.inventory.IInventory;
|
|
import net.minecraft.inventory.ISidedInventory;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.nbt.NBTTagList;
|
|
import net.minecraft.tileentity.TileEntityFurnace;
|
|
import net.minecraft.world.EnumSkyBlock;
|
|
|
|
public class TileAlloyFurnace extends TileAppliance implements IInventory, ISidedInventory {
|
|
private ItemStack[] contents = new ItemStack[11];
|
|
int totalburn = 0;
|
|
int burntime = 0;
|
|
int cooktime = 0;
|
|
|
|
private void updateLight() {
|
|
super.worldObj.updateLightByType(EnumSkyBlock.Block, super.xCoord, super.yCoord, super.zCoord);
|
|
}
|
|
|
|
@Override
|
|
public int getExtendedID() {
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
public void updateEntity() {
|
|
super.updateEntity();
|
|
boolean btu = false;
|
|
if (this.burntime > 0) {
|
|
--this.burntime;
|
|
if (this.burntime == 0) {
|
|
btu = true;
|
|
super.Active = false;
|
|
}
|
|
}
|
|
|
|
if (!super.worldObj.isRemote) {
|
|
boolean cs = this.canSmelt();
|
|
if (this.burntime == 0 && cs && this.contents[9] != null) {
|
|
this.burntime = this.totalburn = CoreLib.getBurnTime(this.contents[9]);
|
|
if (this.burntime > 0) {
|
|
super.Active = true;
|
|
if (this.contents[9].getItem().getContainerItem() != null) {
|
|
this.contents[9] = new ItemStack(this.contents[9].getItem().getContainerItem());
|
|
} else {
|
|
--this.contents[9].stackSize;
|
|
}
|
|
|
|
if (this.contents[9].stackSize == 0) {
|
|
this.contents[9] = null;
|
|
}
|
|
|
|
if (!btu) {
|
|
this.updateBlock();
|
|
this.updateLight();
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this.burntime > 0 && cs) {
|
|
++this.cooktime;
|
|
if (this.cooktime == 200) {
|
|
this.cooktime = 0;
|
|
this.smeltItem();
|
|
this.markDirty();
|
|
}
|
|
} else {
|
|
this.cooktime = 0;
|
|
}
|
|
|
|
if (btu) {
|
|
this.updateBlock();
|
|
this.updateLight();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
private boolean canSmelt() {
|
|
ItemStack ist = CraftLib.getAlloyResult(this.contents, 0, 9, false);
|
|
if (ist == null) {
|
|
return false;
|
|
} else if (this.contents[10] == null) {
|
|
return true;
|
|
} else if (!this.contents[10].isItemEqual(ist)) {
|
|
return false;
|
|
} else {
|
|
int st = this.contents[10].stackSize + ist.stackSize;
|
|
return st <= this.getInventoryStackLimit() && st <= ist.getMaxStackSize();
|
|
}
|
|
}
|
|
|
|
private void smeltItem() {
|
|
if (this.canSmelt()) {
|
|
ItemStack ist = CraftLib.getAlloyResult(this.contents, 0, 9, true);
|
|
if (this.contents[10] == null) {
|
|
this.contents[10] = ist.copy();
|
|
} else {
|
|
this.contents[10].stackSize += ist.stackSize;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
int getCookScaled(int i) {
|
|
return this.cooktime * i / 200;
|
|
}
|
|
|
|
int getBurnScaled(int i) {
|
|
return this.totalburn == 0 ? 0 : this.burntime * i / this.totalburn;
|
|
}
|
|
|
|
@Override
|
|
public boolean onBlockActivated(EntityPlayer player) {
|
|
if (player.isSneaking()) {
|
|
return false;
|
|
} else {
|
|
if (!super.worldObj.isRemote) {
|
|
player.openGui(RedPowerBase.instance, 1, super.worldObj, super.xCoord, super.yCoord, super.zCoord);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onBlockRemoval() {
|
|
for(int i = 0; i < 11; ++i) {
|
|
ItemStack ist = this.contents[i];
|
|
if (ist != null && ist.stackSize > 0) {
|
|
CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
public int getSizeInventory() {
|
|
return 11;
|
|
}
|
|
|
|
public ItemStack getStackInSlot(int slotId) {
|
|
return this.contents[slotId];
|
|
}
|
|
|
|
public ItemStack decrStackSize(int slotId, int amount) {
|
|
if (this.contents[slotId] == null) {
|
|
return null;
|
|
} else if (this.contents[slotId].stackSize <= amount) {
|
|
ItemStack tr = this.contents[slotId];
|
|
this.contents[slotId] = null;
|
|
this.markDirty();
|
|
return tr;
|
|
} else {
|
|
ItemStack tr = this.contents[slotId].splitStack(amount);
|
|
if (this.contents[slotId].stackSize == 0) {
|
|
this.contents[slotId] = null;
|
|
}
|
|
|
|
this.markDirty();
|
|
return tr;
|
|
}
|
|
}
|
|
|
|
public ItemStack getStackInSlotOnClosing(int slotId) {
|
|
if (this.contents[slotId] == null) {
|
|
return null;
|
|
} else {
|
|
ItemStack ist = this.contents[slotId];
|
|
this.contents[slotId] = null;
|
|
return ist;
|
|
}
|
|
}
|
|
|
|
public void setInventorySlotContents(int slotId, ItemStack ist) {
|
|
this.contents[slotId] = ist;
|
|
if (ist != null && ist.stackSize > this.getInventoryStackLimit()) {
|
|
ist.stackSize = this.getInventoryStackLimit();
|
|
}
|
|
|
|
this.markDirty();
|
|
}
|
|
|
|
public String getInventoryName() {
|
|
return "tile.rpafurnace.name";
|
|
}
|
|
|
|
public int getInventoryStackLimit() {
|
|
return 64;
|
|
}
|
|
|
|
public boolean isUseableByPlayer(EntityPlayer player) {
|
|
return !this.isInvalid()
|
|
&& super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this
|
|
&& player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0;
|
|
}
|
|
|
|
public void closeInventory() {
|
|
}
|
|
|
|
public void openInventory() {
|
|
}
|
|
|
|
@Override
|
|
public void readFromNBT(NBTTagCompound data) {
|
|
NBTTagList items = data.getTagList("Items", 10);
|
|
this.contents = new ItemStack[this.getSizeInventory()];
|
|
|
|
for(int i = 0; i < items.tagCount(); ++i) {
|
|
NBTTagCompound item = items.getCompoundTagAt(i);
|
|
int j = item.getByte("Slot") & 255;
|
|
if (j >= 0 && j < this.contents.length) {
|
|
this.contents[j] = ItemStack.loadItemStackFromNBT(item);
|
|
}
|
|
}
|
|
|
|
this.totalburn = data.getShort("TotalBurn");
|
|
this.burntime = data.getShort("BurnTime");
|
|
this.cooktime = data.getShort("CookTime");
|
|
super.readFromNBT(data);
|
|
}
|
|
|
|
@Override
|
|
public void writeToNBT(NBTTagCompound data) {
|
|
NBTTagList items = new NBTTagList();
|
|
|
|
for(int i = 0; i < this.contents.length; ++i) {
|
|
if (this.contents[i] != null) {
|
|
NBTTagCompound item = new NBTTagCompound();
|
|
item.setByte("Slot", (byte)i);
|
|
this.contents[i].writeToNBT(item);
|
|
items.appendTag(item);
|
|
}
|
|
}
|
|
|
|
data.setTag("Items", items);
|
|
data.setShort("TotalBurn", (short)this.totalburn);
|
|
data.setShort("BurnTime", (short)this.burntime);
|
|
data.setShort("CookTime", (short)this.cooktime);
|
|
super.writeToNBT(data);
|
|
}
|
|
|
|
public int[] getAccessibleSlotsFromSide(int side) {
|
|
switch(side) {
|
|
case 0:
|
|
return new int[]{10};
|
|
case 1:
|
|
return IntStream.range(0, 9).toArray();
|
|
default:
|
|
return side != (super.Rotation ^ 1) ? new int[]{9} : new int[0];
|
|
}
|
|
}
|
|
|
|
public boolean canInsertItem(int slotID, ItemStack stack, int side) {
|
|
switch(side) {
|
|
case 1:
|
|
return slotID >= 0 && slotID < 9;
|
|
default:
|
|
return side != (super.Rotation ^ 1) ? TileEntityFurnace.isItemFuel(stack) : false;
|
|
}
|
|
}
|
|
|
|
public boolean canExtractItem(int slotID, ItemStack stack, int side) {
|
|
return slotID == 10 && side == 0;
|
|
}
|
|
|
|
public boolean hasCustomInventoryName() {
|
|
return false;
|
|
}
|
|
|
|
public boolean isItemValidForSlot(int slotID, ItemStack stack) {
|
|
return TileEntityFurnace.isItemFuel(stack) && slotID == 9 || slotID >= 0 && slotID < 9;
|
|
}
|
|
|
|
@Override
|
|
protected void readFromPacket(NBTTagCompound tag) {
|
|
super.readFromPacket(tag);
|
|
this.updateLight();
|
|
}
|
|
}
|