From 70c1354a4a96698758a88c032866288f79de6f5a Mon Sep 17 00:00:00 2001 From: Benjamin Culkin Date: Sat, 24 Aug 2024 08:16:37 -0400 Subject: Initial commit --- .../jp/plusplus/fbs/storage/TileEntityMeal.java | 328 +++++++++++++++++++++ 1 file changed, 328 insertions(+) create mode 100644 src/main/java/jp/plusplus/fbs/storage/TileEntityMeal.java (limited to 'src/main/java/jp/plusplus/fbs/storage/TileEntityMeal.java') diff --git a/src/main/java/jp/plusplus/fbs/storage/TileEntityMeal.java b/src/main/java/jp/plusplus/fbs/storage/TileEntityMeal.java new file mode 100644 index 0000000..65999b6 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/storage/TileEntityMeal.java @@ -0,0 +1,328 @@ +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