package minefantasy.mf2.block.tileentity; import java.util.List; import java.util.Random; import minefantasy.mf2.api.crafting.IBasicMetre; import minefantasy.mf2.api.knowledge.InformationBase; import minefantasy.mf2.api.knowledge.InformationList; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.network.packet.ResearchTablePacket; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.WorldServer; public class TileEntityResearch extends TileEntity implements IInventory, IBasicMetre { private ItemStack[] items = new ItemStack[1]; public float progress; public float maxProgress; public int researchID = -1; public boolean interact(EntityPlayer user) { maxProgress = getMaxTime(); if(maxProgress > 0) { addProgress(user); return true; } else { progress = 0; } return false; } private void addProgress(EntityPlayer user) { ItemStack held = user.getHeldItem(); if(held != null && (held.getItem() == ComponentListMF.talisman_lesser || held.getItem() == ComponentListMF.talisman_greater)) { progress = maxProgress; if(!user.capabilities.isCreativeMode && held.getItem() == ComponentListMF.talisman_lesser) { --held.stackSize; if(held.stackSize <= 0) { user.setCurrentItemOrArmor(0, null); } } return; } float efficiency = 10F/60F;//10s taken each swing if(user.swingProgress > 0 && user.swingProgress <= 1.0) { efficiency *= (0.5F-user.swingProgress); } worldObj.playSoundEffect(xCoord+0.5, yCoord+0.5, zCoord+0.5, "minefantasy2:block.flipPage", 1.0F, rand.nextFloat()*0.4F+0.8F); efficiency *= getEnvironmentBoost(); progress += efficiency; } private float getEnvironmentBoost() { int books = 0; for(int x = -8; x <= 8; x++) { for(int y = -8; y <= 8; y++) { for(int z = -8; z <= 8; z++) { if(worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z) == Blocks.bookshelf) { ++books; } } } } return 1.0F + (0.1F*books); } private Random rand = new Random(); private void createComplete() { if(items[0] != null && items[0].getItem() == ToolListMF.research_scroll) { int id = items[0].getItemDamage(); ItemStack newItem = new ItemStack(ToolListMF.research_scroll_complete, 1, id); this.setInventorySlotContents(0, newItem); } this.maxProgress = 0; this.progress = 0; researchID = -1; } private int getMaxTime() { ItemStack item = items[0]; if(item == null || !(item.getItem() == ToolListMF.research_scroll)) { researchID = -1; progress = 0; return -1; } if(item.getItemDamage() >= InformationList.knowledgeList.size()) { researchID = -1; progress = 0; return -1; } InformationBase info = InformationList.knowledgeList.get(item.getItemDamage()); if(info != null) { researchID = info.ID; return info.getTime(); } researchID = -1; progress = 0; return -1; } private int ticksExisted; @Override public void updateEntity() { super.updateEntity(); if(!worldObj.isRemote) { if(++ticksExisted % 20 == 0) { maxProgress = getMaxTime(); progress += 1F/60F;//+1 each minute } if(maxProgress > 0 && progress >= maxProgress) { createComplete(); } } syncData(); } public void syncData() { if(worldObj.isRemote)return; List<EntityPlayer> players = ((WorldServer)worldObj).playerEntities; for(int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new ResearchTablePacket(this).generatePacket()); } } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("researchID", researchID); nbt.setInteger("ticksExisted", ticksExisted); nbt.setFloat("progress", progress); nbt.setFloat("maxProgress", maxProgress); NBTTagList savedItems = new NBTTagList(); for (int i = 0; i < this.items.length; ++i) { if (this.items[i] != null) { NBTTagCompound savedSlot = new NBTTagCompound(); savedSlot.setByte("Slot", (byte)i); this.items[i].writeToNBT(savedSlot); savedItems.appendTag(savedSlot); } } nbt.setTag("Items", savedItems); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); ticksExisted = nbt.getInteger("ticksExisted"); researchID = nbt.getInteger("researchID"); progress = nbt.getFloat("progress"); maxProgress = nbt.getFloat("maxProgress"); NBTTagList savedItems = nbt.getTagList("Items", 10); this.items = new ItemStack[this.getSizeInventory()]; for (int i = 0; i < savedItems.tagCount(); ++i) { NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); byte slotNum = savedSlot.getByte("Slot"); if (slotNum >= 0 && slotNum < this.items.length) { this.items[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); } } } @Override public int getSizeInventory() { return items.length; } @Override public ItemStack getStackInSlot(int slot) { return items[slot]; } @Override public ItemStack decrStackSize(int slot, int num) { if (this.items[slot] != null) { ItemStack itemstack; if (this.items[slot].stackSize <= num) { itemstack = this.items[slot]; this.items[slot] = null; return itemstack; } else { itemstack = this.items[slot].splitStack(num); if (this.items[slot].stackSize == 0) { this.items[slot] = null; } return itemstack; } } else { return null; } } @Override public ItemStack getStackInSlotOnClosing(int slot) { return items[slot]; } @Override public void setInventorySlotContents(int slot, ItemStack item) { items[slot] = item; } @Override public String getInventoryName() { return "gui.bombcraftmf.name"; } @Override public boolean hasCustomInventoryName() { return false; } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isUseableByPlayer(EntityPlayer user) { return user.getDistance(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D) < 8D; } @Override public void openInventory() { } @Override public void closeInventory() { } @Override public boolean isItemValidForSlot(int slot, ItemStack item) { return canAccept(item); } public static boolean canAccept(ItemStack item) { return item != null && item.getItem() == ToolListMF.research_scroll; } @Override public int getMetreScale(int size) { if(maxProgress <= 0) { return 0; } return (int)Math.min(size, Math.ceil(size / maxProgress * progress)); } @Override public boolean shouldShowMetre() { return maxProgress > 0; } @Override public String getLocalisedName() { if(researchID >= 0) { InformationBase base = InformationList.knowledgeList.get(researchID); if(base != null) { return base.getName(); } } return ""; } }