generated from tilera/1710mod
491 lines
17 KiB
Java
491 lines
17 KiB
Java
package net.anvilcraft.thaummach.tiles;
|
|
|
|
import java.util.stream.IntStream;
|
|
|
|
import dev.tilera.auracore.api.machine.TileVisUser;
|
|
import dev.tilera.auracore.aura.AuraManager;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.inventory.ISidedInventory;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.item.crafting.FurnaceRecipes;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.nbt.NBTTagList;
|
|
import net.minecraft.tileentity.TileEntity;
|
|
import net.minecraft.tileentity.TileEntityFurnace;
|
|
import net.minecraft.world.EnumSkyBlock;
|
|
import net.minecraftforge.common.util.ForgeDirection;
|
|
import thaumcraft.api.aspects.Aspect;
|
|
import thaumcraft.api.aspects.AspectList;
|
|
|
|
public class TileArcaneFurnace extends TileVisUser implements ISidedInventory {
|
|
private ItemStack[] furnaceItemStacks = new ItemStack[19];
|
|
public int furnaceBurnTime = 0;
|
|
public int currentItemBurnTime = 0;
|
|
public int furnaceCookTime = 0;
|
|
public int furnaceMaxCookTime = 180;
|
|
public int bellows = 0;
|
|
public float vis;
|
|
public boolean boost;
|
|
|
|
// TODO: GUIs
|
|
//public GuiScreen getGui(EntityPlayer player) {
|
|
// return new GuiArcaneFurnace(player.inventory, this);
|
|
//}
|
|
|
|
@Override
|
|
public int getSizeInventory() {
|
|
return this.furnaceItemStacks.length;
|
|
}
|
|
|
|
//@Override
|
|
//public int getStartInventorySide(int side) {
|
|
// if (side == 0) {
|
|
// return 18;
|
|
// } else {
|
|
// return side == 1 ? 0 : 9;
|
|
// }
|
|
//}
|
|
|
|
//@Override
|
|
//public int getSizeInventorySide(int side) {
|
|
// return side == 0 ? 1 : 9;
|
|
//}
|
|
|
|
@Override
|
|
public ItemStack getStackInSlot(int i) {
|
|
return this.furnaceItemStacks[i];
|
|
}
|
|
|
|
@Override
|
|
public ItemStack decrStackSize(int i, int j) {
|
|
if (this.furnaceItemStacks[i] != null) {
|
|
ItemStack itemstack1;
|
|
if (this.furnaceItemStacks[i].stackSize <= j) {
|
|
itemstack1 = this.furnaceItemStacks[i];
|
|
this.furnaceItemStacks[i] = null;
|
|
return itemstack1;
|
|
} else {
|
|
itemstack1 = this.furnaceItemStacks[i].splitStack(j);
|
|
if (this.furnaceItemStacks[i].stackSize == 0) {
|
|
this.furnaceItemStacks[i] = null;
|
|
}
|
|
|
|
return itemstack1;
|
|
}
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void setInventorySlotContents(int i, ItemStack itemstack) {
|
|
this.furnaceItemStacks[i] = itemstack;
|
|
if (itemstack != null && itemstack.stackSize > this.getInventoryStackLimit()) {
|
|
itemstack.stackSize = this.getInventoryStackLimit();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void readFromNBT(NBTTagCompound nbttagcompound) {
|
|
super.readFromNBT(nbttagcompound);
|
|
NBTTagList nbttaglist = nbttagcompound.getTagList("Items", 10);
|
|
this.furnaceItemStacks = new ItemStack[this.getSizeInventory()];
|
|
|
|
for (int i = 0; i < nbttaglist.tagCount(); ++i) {
|
|
NBTTagCompound nbttagcompound1
|
|
= (NBTTagCompound) nbttaglist.getCompoundTagAt(i);
|
|
byte byte0 = nbttagcompound1.getByte("Slot");
|
|
if (byte0 >= 0 && byte0 < this.furnaceItemStacks.length) {
|
|
this.furnaceItemStacks[byte0]
|
|
= ItemStack.loadItemStackFromNBT(nbttagcompound1);
|
|
}
|
|
}
|
|
|
|
this.furnaceBurnTime = nbttagcompound.getShort("BurnTime");
|
|
this.currentItemBurnTime = nbttagcompound.getShort("MaxBurnTime");
|
|
this.furnaceCookTime = nbttagcompound.getShort("CookTime");
|
|
this.furnaceMaxCookTime = nbttagcompound.getShort("MaxCookTime");
|
|
this.bellows = nbttagcompound.getShort("bellows");
|
|
this.boost = nbttagcompound.getBoolean("boost");
|
|
this.vis = nbttagcompound.getFloat("vis");
|
|
}
|
|
|
|
@Override
|
|
public void writeToNBT(NBTTagCompound nbttagcompound) {
|
|
super.writeToNBT(nbttagcompound);
|
|
nbttagcompound.setShort("BurnTime", (short) this.furnaceBurnTime);
|
|
nbttagcompound.setShort("CookTime", (short) this.furnaceCookTime);
|
|
nbttagcompound.setShort("MaxBurnTime", (short) this.currentItemBurnTime);
|
|
nbttagcompound.setShort("MaxCookTime", (short) this.furnaceMaxCookTime);
|
|
nbttagcompound.setShort("bellows", (short) this.bellows);
|
|
nbttagcompound.setBoolean("boost", this.boost);
|
|
nbttagcompound.setFloat("vis", this.vis);
|
|
NBTTagList nbttaglist = new NBTTagList();
|
|
|
|
for (int i = 0; i < this.furnaceItemStacks.length; ++i) {
|
|
if (this.furnaceItemStacks[i] != null) {
|
|
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
|
|
nbttagcompound1.setByte("Slot", (byte) i);
|
|
this.furnaceItemStacks[i].writeToNBT(nbttagcompound1);
|
|
nbttaglist.appendTag(nbttagcompound1);
|
|
}
|
|
}
|
|
|
|
nbttagcompound.setTag("Items", nbttaglist);
|
|
}
|
|
|
|
@Override
|
|
public int getInventoryStackLimit() {
|
|
return 64;
|
|
}
|
|
|
|
public int getCookProgressScaled(int i) {
|
|
return this.furnaceCookTime * i / this.furnaceMaxCookTime;
|
|
}
|
|
|
|
public int getBurnTimeRemainingScaled(int i) {
|
|
int bt = this.currentItemBurnTime;
|
|
if (bt == 0) {
|
|
bt = 200;
|
|
}
|
|
|
|
return this.furnaceBurnTime * i / bt;
|
|
}
|
|
|
|
public boolean isBurning() {
|
|
return this.furnaceBurnTime > 0
|
|
//&& !super.worldObj.isBlockGettingPowered(
|
|
// super.xCoord, super.yCoord, super.zCoord
|
|
//)
|
|
&& !super.worldObj.isBlockIndirectlyGettingPowered(
|
|
super.xCoord, super.yCoord, super.zCoord
|
|
);
|
|
}
|
|
|
|
public boolean isWorking() {
|
|
return this.furnaceBurnTime > 0
|
|
&& (this.furnaceCookTime > 0 || this.belowHeatableTile())
|
|
//&& !super.worldObj.isBlockGettingPowered(
|
|
// super.xCoord, super.yCoord, super.zCoord
|
|
//)
|
|
&& !super.worldObj.isBlockIndirectlyGettingPowered(
|
|
super.xCoord, super.yCoord, super.zCoord
|
|
);
|
|
}
|
|
|
|
public boolean belowHeatableTile() {
|
|
TileEntity te
|
|
= super.worldObj.getTileEntity(super.xCoord, super.yCoord + 1, super.zCoord);
|
|
return te != null && te instanceof TileCrucible;
|
|
}
|
|
|
|
@Override
|
|
public void updateEntity() {
|
|
boolean flag = this.furnaceBurnTime > 0;
|
|
boolean flag1 = false;
|
|
this.setSuction(0);
|
|
if (!super.worldObj.isRemote && this.vis < this.getMaxVis()) {
|
|
this.vis += this.getAvailablePureVis(this.getMaxVis() - this.vis);
|
|
}
|
|
|
|
if (!super.worldObj.isRemote
|
|
//&& !super.worldObj.isBlockGettingPowered(
|
|
// super.xCoord, super.yCoord, super.zCoord
|
|
//)
|
|
&& !super.worldObj.isBlockIndirectlyGettingPowered(
|
|
super.xCoord, super.yCoord, super.zCoord
|
|
)) {
|
|
if (this.furnaceBurnTime > 0
|
|
&& (this.furnaceCookTime > 0 || this.belowHeatableTile())) {
|
|
--this.furnaceBurnTime;
|
|
}
|
|
|
|
if (this.furnaceBurnTime <= 0
|
|
&& (this.canSmelt() || this.belowHeatableTile())) {
|
|
this.currentItemBurnTime = this.furnaceBurnTime
|
|
= getItemBurnTime(this.furnaceItemStacks[18]);
|
|
if (this.furnaceBurnTime > 0) {
|
|
if (this.vis >= (float) this.currentItemBurnTime / 1600.0F) {
|
|
this.vis -= (float) this.currentItemBurnTime / 1600.0F;
|
|
this.currentItemBurnTime
|
|
= (int) ((float) this.currentItemBurnTime * 1.25F);
|
|
this.furnaceBurnTime
|
|
= (int) ((float) this.furnaceBurnTime * 1.25F);
|
|
}
|
|
|
|
flag1 = true;
|
|
if (this.furnaceItemStacks[18] != null) {
|
|
if (this.vis >= 0.25F) {
|
|
this.vis -= 0.25F;
|
|
this.furnaceMaxCookTime = 100;
|
|
this.boost = true;
|
|
} else {
|
|
this.furnaceMaxCookTime = 180;
|
|
this.boost = false;
|
|
}
|
|
|
|
this.furnaceMaxCookTime = (int
|
|
) ((float) this.furnaceMaxCookTime
|
|
* (1.0F - (float) this.bellows * 0.1F));
|
|
this.worldObj.markBlockForUpdate(
|
|
this.xCoord, this.yCoord, this.zCoord
|
|
);
|
|
super.worldObj.updateLightByType(
|
|
EnumSkyBlock.Block, super.xCoord, super.yCoord, super.zCoord
|
|
);
|
|
// TODO: WTF
|
|
//if (this.furnaceItemStacks[18].getItem().func_46056_k()) {
|
|
// this.furnaceItemStacks[18] = new ItemStack(
|
|
// this.furnaceItemStacks[18].getItem().setFull3D()
|
|
// );
|
|
//} else {
|
|
--this.furnaceItemStacks[18].stackSize;
|
|
//}
|
|
|
|
if (this.furnaceItemStacks[18].stackSize == 0) {
|
|
this.furnaceItemStacks[18] = null;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this.isBurning() && this.canSmelt()) {
|
|
++this.furnaceCookTime;
|
|
if (this.furnaceCookTime >= this.furnaceMaxCookTime) {
|
|
this.furnaceCookTime = 0;
|
|
if (this.vis >= 0.25F) {
|
|
this.vis -= 0.25F;
|
|
this.furnaceMaxCookTime = 100;
|
|
this.boost = true;
|
|
} else {
|
|
this.furnaceMaxCookTime = 180;
|
|
this.boost = false;
|
|
}
|
|
|
|
this.furnaceMaxCookTime = (int
|
|
) ((float) this.furnaceMaxCookTime
|
|
* (1.0F - (float) this.bellows * 0.2F));
|
|
this.smeltItem();
|
|
this.worldObj.markBlockForUpdate(
|
|
this.xCoord, this.yCoord, this.zCoord
|
|
);
|
|
super.worldObj.updateLightByType(
|
|
EnumSkyBlock.Block, super.xCoord, super.yCoord, super.zCoord
|
|
);
|
|
flag1 = true;
|
|
}
|
|
} else {
|
|
this.furnaceCookTime = 0;
|
|
}
|
|
|
|
if (flag != this.furnaceBurnTime > 0) {
|
|
flag1 = true;
|
|
}
|
|
}
|
|
|
|
if (flag1) {
|
|
// TODO: WTF
|
|
//this.onInventoryChanged();
|
|
}
|
|
}
|
|
|
|
private boolean canSmelt(int slotIn, int slotOut) {
|
|
if (this.furnaceItemStacks[slotIn] == null) {
|
|
return false;
|
|
} else {
|
|
ItemStack itemstack = FurnaceRecipes.smelting().getSmeltingResult(
|
|
this.furnaceItemStacks[slotIn]
|
|
);
|
|
if (itemstack == null) {
|
|
return false;
|
|
} else if (this.furnaceItemStacks[slotOut] == null) {
|
|
return true;
|
|
} else if (!this.furnaceItemStacks[slotOut].isItemEqual(itemstack)) {
|
|
return false;
|
|
} else {
|
|
int result
|
|
= this.furnaceItemStacks[slotOut].stackSize + itemstack.stackSize;
|
|
return result <= this.getInventoryStackLimit()
|
|
&& result <= itemstack.getMaxStackSize();
|
|
}
|
|
}
|
|
}
|
|
|
|
private boolean canSmelt() {
|
|
for (int input = 9; input < 18; ++input) {
|
|
for (int output = 0; output < 9; ++output) {
|
|
if (this.canSmelt(input, output)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public void smeltItem() {
|
|
for (int input = 9; input < 18; ++input) {
|
|
for (int output = 0; output < 9; ++output) {
|
|
boolean smelted = false;
|
|
|
|
boolean tryAgain;
|
|
do {
|
|
tryAgain = false;
|
|
if (this.canSmelt(input, output)) {
|
|
ItemStack itemstack = FurnaceRecipes.smelting().getSmeltingResult(
|
|
this.furnaceItemStacks[input]
|
|
);
|
|
if (this.furnaceItemStacks[output] != null
|
|
&& this.furnaceItemStacks[output].isItemEqual(itemstack)
|
|
&& this.furnaceItemStacks[output].getItemDamage()
|
|
== itemstack.getItemDamage()) {
|
|
ItemStack var10000 = this.furnaceItemStacks[output];
|
|
var10000.stackSize += itemstack.stackSize;
|
|
smelted = true;
|
|
} else if (this.furnaceItemStacks[output] == null) {
|
|
this.furnaceItemStacks[output] = itemstack.copy();
|
|
smelted = true;
|
|
}
|
|
|
|
if (smelted
|
|
&& super.worldObj.rand.nextInt(90) < 5 + this.bellows * 7
|
|
&& this.vis >= 0.5F) {
|
|
this.vis -= 0.5F;
|
|
tryAgain = true;
|
|
AuraManager.addFluxToClosest(
|
|
this.worldObj,
|
|
this.xCoord,
|
|
this.yCoord,
|
|
this.zCoord,
|
|
new AspectList().add(Aspect.FIRE, 2)
|
|
);
|
|
}
|
|
}
|
|
} while (tryAgain);
|
|
|
|
if (smelted) {
|
|
// TODO: WTF
|
|
//if (this.furnaceItemStacks[input].getItem().func_46056_k()) {
|
|
// this.furnaceItemStacks[input] = new ItemStack(
|
|
// this.furnaceItemStacks[input].getItem().setFull3D()
|
|
// );
|
|
//} else {
|
|
--this.furnaceItemStacks[input].stackSize;
|
|
//}
|
|
|
|
if (this.furnaceItemStacks[input].stackSize <= 0) {
|
|
this.furnaceItemStacks[input] = null;
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static int getItemBurnTime(ItemStack par1ItemStack) {
|
|
return TileEntityFurnace.getItemBurnTime(par1ItemStack);
|
|
}
|
|
|
|
@Override
|
|
public boolean isUseableByPlayer(EntityPlayer entityplayer) {
|
|
if (super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord)
|
|
!= this) {
|
|
return false;
|
|
} else {
|
|
return entityplayer.getDistanceSq(
|
|
(double) super.xCoord + 0.5,
|
|
(double) super.yCoord + 0.5,
|
|
(double) super.zCoord + 0.5
|
|
)
|
|
<= 64.0;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean getConnectable(ForgeDirection face) {
|
|
switch (face) {
|
|
case DOWN:
|
|
case EAST:
|
|
case SOUTH:
|
|
case WEST:
|
|
case NORTH:
|
|
return true;
|
|
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public ItemStack getStackInSlotOnClosing(int var1) {
|
|
if (this.furnaceItemStacks[var1] != null) {
|
|
ItemStack var2 = this.furnaceItemStacks[var1];
|
|
this.furnaceItemStacks[var1] = null;
|
|
return var2;
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public float getPureVis() {
|
|
return this.vis;
|
|
}
|
|
|
|
@Override
|
|
public float getMaxVis() {
|
|
return 5.0F;
|
|
}
|
|
|
|
@Override
|
|
public String getInventoryName() {
|
|
return "thaummach:arcane_furnace";
|
|
}
|
|
|
|
@Override
|
|
public boolean hasCustomInventoryName() {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public void openInventory() {}
|
|
|
|
@Override
|
|
public void closeInventory() {}
|
|
|
|
@Override
|
|
public boolean isItemValidForSlot(int slot, ItemStack is) {
|
|
if (slot >= 9 && slot <= 17)
|
|
return false;
|
|
|
|
if (slot == 18)
|
|
return getItemBurnTime(is) > 0;
|
|
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public int[] getAccessibleSlotsFromSide(int side) {
|
|
if (side == 0)
|
|
return new int[] { 18 };
|
|
|
|
if (side == 1)
|
|
return IntStream.rangeClosed(0, 8).toArray();
|
|
|
|
return IntStream.rangeClosed(9, 17).toArray();
|
|
}
|
|
|
|
@Override
|
|
public boolean
|
|
canInsertItem(int slot, ItemStack is, int side) {
|
|
return this.isItemValidForSlot(slot, is);
|
|
}
|
|
|
|
@Override
|
|
public boolean
|
|
canExtractItem(int slot, ItemStack is, int side) {
|
|
return slot >= 9 && slot <= 17;
|
|
}
|
|
}
|