blob: 2348a09136bc57dd68e37dfc9ed55d368c3f4129 [file] [log] [blame] [raw]
package com.gildedgames.the_aether.tileentity;
import java.util.List;
import java.util.Map;
import com.gildedgames.the_aether.api.AetherAPI;
import com.gildedgames.the_aether.api.events.AetherHooks;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import com.gildedgames.the_aether.api.enchantments.AetherEnchantment;
import com.gildedgames.the_aether.blocks.BlocksAether;
import com.gildedgames.the_aether.blocks.container.BlockAetherContainer;
import com.gildedgames.the_aether.tileentity.util.AetherTileEntity;
import com.gildedgames.the_aether.util.FilledList;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class TileEntityEnchanter extends AetherTileEntity {
public int progress, ticksRequired, powerRemaining;
private final FilledList<ItemStack> enchantedItemStacks = new FilledList<ItemStack>(3, null);
private AetherEnchantment currentEnchantment;
public TileEntityEnchanter() {
super("Altar");
}
@Override
public List<ItemStack> getTileInventory() {
return this.enchantedItemStacks;
}
@Override
public void onSlotChanged(int index) {
}
@Override
public void updateEntity() {
boolean flag = this.isEnchanting();
if (this.powerRemaining > 0) {
this.powerRemaining--;
if (this.currentEnchantment != null) {
if (this.worldObj.getBlock(this.xCoord, this.yCoord - 1, this.zCoord) == BlocksAether.enchanted_gravitite) {
this.progress += 2.5F;
} else {
this.progress++;
}
}
}
if (this.currentEnchantment != null) {
if (this.progress >= this.ticksRequired) {
if (!this.worldObj.isRemote) {
ItemStack result = this.currentEnchantment.getOutput().copy();
EnchantmentHelper.setEnchantments(EnchantmentHelper.getEnchantments(this.getStackInSlot(0)), result);
if (this.getStackInSlot(0).hasTagCompound())
{
result.setTagCompound(this.getStackInSlot(0).getTagCompound());
}
if (this.getStackInSlot(2) != null && this.getStackInSlot(2).isStackable()) {
result.stackSize += (this.getStackInSlot(2).stackSize);
this.setInventorySlotContents(2, result);
} else {
this.setInventorySlotContents(2, result);
}
if (this.getStackInSlot(0).getItem().hasContainerItem(this.getStackInSlot(0))) {
this.setInventorySlotContents(0, this.getStackInSlot(0).getItem().getContainerItem(this.getStackInSlot(0)));
} else {
this.decrStackSize(0, 1);
}
}
this.progress = 0;
AetherHooks.onItemEnchant(this, this.currentEnchantment);
}
if (this.getStackInSlot(0) == null || (this.getStackInSlot(0) != null && AetherAPI.instance().getEnchantment(this.getStackInSlot(0)) != this.currentEnchantment)) {
this.currentEnchantment = null;
this.progress = 0;
}
if (this.powerRemaining <= 0) {
if (this.getStackInSlot(1) != null && AetherAPI.instance().isEnchantmentFuel(this.getStackInSlot(1))) {
this.powerRemaining += AetherAPI.instance().getEnchantmentFuel(this.getStackInSlot(1)).getTimeGiven();
if (!this.worldObj.isRemote) {
this.decrStackSize(1, 1);
}
} else {
this.currentEnchantment = null;
this.progress = 0;
}
}
} else if (this.getStackInSlot(0) != null) {
ItemStack itemstack = this.getStackInSlot(0);
AetherEnchantment enchantment = AetherAPI.instance().getEnchantment(itemstack);
if (enchantment != null) {
if (this.getStackInSlot(2) == null || (enchantment.getOutput().getItem() == this.getStackInSlot(2).getItem() && enchantment.getOutput().getItemDamage() == this.getStackInSlot(2).getItemDamage() && this.getStackInSlot(2).isStackable())) {
this.currentEnchantment = enchantment;
this.ticksRequired = this.currentEnchantment.getTimeRequired();
this.addEnchantmentWeight(itemstack);
this.ticksRequired = AetherHooks.onSetEnchantmentTime(this, this.currentEnchantment, this.ticksRequired);
}
}
}
if (flag != this.isEnchanting()) {
this.markDirty();
BlockAetherContainer.setState(this.worldObj, this.xCoord, this.yCoord, this.zCoord, this.isEnchanting());
}
}
@SuppressWarnings("unchecked")
public void addEnchantmentWeight(ItemStack stack) {
Map<Enchantment, Integer> enchantments = EnchantmentHelper.getEnchantments(stack);
if (!enchantments.isEmpty()) {
for (int levels : enchantments.values()) {
this.ticksRequired += (levels * 1250);
}
}
}
@SideOnly(Side.CLIENT)
public int getEnchantmentProgressScaled(int i) {
if (this.ticksRequired == 0) {
return 0;
}
return (this.progress * i) / this.ticksRequired;
}
@SideOnly(Side.CLIENT)
public int getEnchantmentTimeRemaining(int i) {
return (this.powerRemaining * i) / 500;
}
public boolean isEnchanting() {
return this.powerRemaining > 0;
}
@Override
public void readFromNBT(NBTTagCompound compound) {
super.readFromNBT(compound);
this.progress = compound.getInteger("progress");
this.powerRemaining = compound.getInteger("powerRemaining");
this.ticksRequired = compound.getInteger("ticksRequired");
}
@Override
public void writeToNBT(NBTTagCompound compound) {
super.writeToNBT(compound);
compound.setInteger("progress", this.progress);
compound.setInteger("powerRemaining", this.powerRemaining);
compound.setInteger("ticksRequired", this.ticksRequired);
}
@Override
public boolean isValidSlotItem(int slot, ItemStack stackInSlot) {
if (slot == 2) {
return false;
} else if (slot == 1 && AetherAPI.instance().isEnchantmentFuel(stackInSlot)) {
return true;
} else if (slot == 0 && AetherAPI.instance().hasEnchantment(stackInSlot)) {
return true;
}
return false;
}
@Override
public int[] getAccessibleSlotsFromSide(int side) {
return side == 0 ? new int[]{2} : new int[]{0, 1};
}
}