package jp.plusplus.fbs.storage; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import jp.plusplus.fbs.FBS; import jp.plusplus.fbs.api.FBSEntityPropertiesAPI; import jp.plusplus.fbs.packet.PacketHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import java.util.*; /** * Created by plusplus_F on 2016/03/07. */ public class TileEntityMeal extends TileEntity { protected ArrayList listBlocks=new ArrayList(); protected ArrayList listItems=new ArrayList(); private LinkedList cache=new LinkedList(); public static final int FRAGEMNT_INTERVAL=20*60*5; protected int fragmentTicks=FRAGEMNT_INTERVAL; private boolean loaded; @Override public Packet getDescriptionPacket() { NBTTagCompound nbtTagCompound = new NBTTagCompound(); this.writeToNBT(nbtTagCompound); return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 1, nbtTagCompound); } @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { this.readFromNBT(pkt.func_148857_g()); } @Override public void readFromNBT(NBTTagCompound par1NBTTagCompound){ super.readFromNBT(par1NBTTagCompound); cache.clear(); fragmentTicks=par1NBTTagCompound.getInteger("FragmentTicks"); NBTTagList nbttaglist = (NBTTagList)par1NBTTagCompound.getTag("Items"); listItems.clear(); for (int i=0;i list=null; if(itemStack.getItem() instanceof ItemBlock) list=listBlocks; else list=listItems; //どこに突っ込むか探す boolean found=false; for(ItemStack it : list){ if(isItemEquals(it, itemStack)){ it.stackSize+=itemStack.stackSize; found=true; //キャッシュの更新 updateCache(it); break; } } if(!found){ ItemStack a=itemStack.copy(); list.add(a); //キャッシュの更新 updateCache(a); } //更新 markDirty(); sendUpdate(); } /** * 全てのアイテムを得る
* ただし、ここではItemStackはコピーされないので注意 * @return */ public ItemStack[] getAllItemStacks(){ int sizeBlock=listBlocks.size(), sizeItem=listItems.size(); ItemStack[] ret=new ItemStack[sizeBlock+sizeItem]; if(ret.length>0){ int i=0; for(;i() { @Override public int compare(ItemStack o1, ItemStack o2) { int t=Item.getIdFromItem(o1.getItem())-Item.getIdFromItem(o2.getItem()); return t!=0?t:o1.getItemDamage()-o2.getItemDamage(); } }); } return ret; } /** * キャッシュを更新する * @param itemStack */ private void updateCache(ItemStack itemStack){ cache.addFirst(itemStack); if(cache.size()>10) cache.removeLast(); } /** * リストを走査して、存在しないItemStackが含まれていた場合、それを削除する */ private void refreshList(){ ArrayList[] lists=new ArrayList[]{listBlocks, listItems}; for(ArrayList list : lists){ int size=list.size(); for(int i=0;i0) updateCache(itemStack); else refreshList(); sendUpdate(); return ret; } } //リストを見る ArrayList list=(req.getItem() instanceof ItemBlock)?listBlocks:listItems; for(ItemStack itemStack : list){ if(isItemEquals(itemStack, req)){ stackSize=Math.min(stackSize, itemStack.stackSize); stackSize=Math.min(stackSize, itemStack.getMaxStackSize()); ItemStack ret=itemStack.copy(); itemStack.stackSize-=stackSize; ret.stackSize=stackSize; if(itemStack.stackSize>0) updateCache(itemStack); else refreshList(); sendUpdate(); return ret; } } return null; } public boolean hasFragment(){ return fragmentTicks>=FRAGEMNT_INTERVAL; } public ItemStack getFragment(boolean reset){ if(reset) fragmentTicks=0; return ItemMealFragment.getItemStack(worldObj, xCoord, yCoord, zCoord); } @Override public void updateEntity(){ if(!worldObj.isRemote){ if (fragmentTicks < FRAGEMNT_INTERVAL) fragmentTicks++; else if (fragmentTicks == FRAGEMNT_INTERVAL) { fragmentTicks++; markDirty(); worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); } if(worldObj.getWorldTime()%20==0){ AxisAlignedBB aabb=AxisAlignedBB.getBoundingBox(xCoord-2, yCoord-1, zCoord-2, xCoord+3, yCoord+3, yCoord+3); List list=worldObj.getEntitiesWithinAABB(EntityPlayer.class, aabb); for(int i=0;i