summaryrefslogtreecommitdiff
path: root/src/main/java/jp/plusplus/fbs/storage/TileEntityMealOutletSingle.java
blob: e79ca170a93fa9ef8fddb7942f502324482ec268 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package jp.plusplus.fbs.storage;

import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityChest;
import net.minecraft.tileentity.TileEntityFurnace;
import net.minecraftforge.common.util.ForgeDirection;

/**
 * Created by plusplus_F on 2016/03/07.
 */
public class TileEntityMealOutletSingle extends TileEntityMealInlet {
    public ItemStack requirement;

    @Override
    public void readFromNBT(NBTTagCompound par1NBTTagCompound){
        super.readFromNBT(par1NBTTagCompound);
        if(par1NBTTagCompound.hasKey("Requirement")) requirement=ItemStack.loadItemStackFromNBT(par1NBTTagCompound.getCompoundTag("Requirement"));
        else requirement=null;
    }
    @Override
    public void writeToNBT(NBTTagCompound par1NBTTagCompound){
        super.writeToNBT(par1NBTTagCompound);
        if(requirement!=null) par1NBTTagCompound.setTag("Requirement", requirement.writeToNBT(new NBTTagCompound()));
    }

    public boolean hasRequirement(){
        return requirement!=null;
    }
    public ItemStack getRequirement(){
        return requirement;
    }
    public void setRequirement(ItemStack req){
        requirement=req;
    }

    protected ItemStack getItemStack(){
        if(!hasRequirement() && !hasFragment()) return null;

        TileEntityMeal tem=ItemMealFragment.getTileEntity(getFragment());
        return tem.exportItemStack(requirement, requirement.stackSize);
    }

    @Override
    public void updateEntity(){
        if(!worldObj.isRemote && requirement!=null && worldObj.getWorldTime()%10==0){
            TileEntityMeal tem=ItemMealFragment.getTileEntity(fragment);
            if(tem==null) return;

            ForgeDirection dir=ForgeDirection.getOrientation(worldObj.getBlockMetadata(xCoord, yCoord, zCoord)&7);
            TileEntity te=worldObj.getTileEntity(xCoord+dir.offsetX, yCoord+dir.offsetY, zCoord+dir.offsetZ);

            if(te instanceof ISidedInventory){
                ISidedInventory inv=(ISidedInventory)te;
                int side=dir.ordinal()^1;
                int[] index=inv.getAccessibleSlotsFromSide(side);

                for(int i=0;i<index.length;i++){
                    if(((ISidedInventory) te).canInsertItem(index[i], requirement, side)){
                        ItemStack itemStack=inv.getStackInSlot(index[i]);
                        if((itemStack==null || (itemStack.isItemEqual(requirement) && ItemStack.areItemStackTagsEqual(itemStack, requirement) && itemStack.stackSize+1<=itemStack.getMaxStackSize()))){
                            ItemStack p=tem.exportItemStack(requirement, 1);
                            if(p==null) return;

                            if(itemStack==null) inv.setInventorySlotContents(i, p.copy());
                            else itemStack.stackSize++;

                            te.markDirty();
                            return;
                        }
                    }
                }
            }
            else if(te instanceof TileEntityChest){
                TileEntityChest[] c=new TileEntityChest[2];
                c[0]=(TileEntityChest)te;

                if(c[0].adjacentChestXPos!=null) c[1]=c[0].adjacentChestXPos;
                if(c[0].adjacentChestXNeg!=null) c[1]=c[0].adjacentChestXNeg;
                if(c[0].adjacentChestZPos!=null) c[1]=c[0].adjacentChestZPos;
                if(c[0].adjacentChestZNeg!=null) c[1]=c[0].adjacentChestZNeg;

                for(TileEntityChest inv : c){
                    if(inv==null) break;

                    int size=inv.getSizeInventory();
                    for(int i=0;i<size;i++){
                        ItemStack itemStack=inv.getStackInSlot(i);
                        if((itemStack==null || (itemStack.isItemEqual(requirement) && ItemStack.areItemStackTagsEqual(itemStack, requirement) && itemStack.stackSize+1<=itemStack.getMaxStackSize()))){
                            ItemStack p=tem.exportItemStack(requirement, 1);
                            if(p==null) return;

                            if(itemStack==null) inv.setInventorySlotContents(i, p.copy());
                            else itemStack.stackSize++;

                            te.markDirty();
                            return;
                        }
                    }
                }
            }
            else if(te instanceof IInventory){
                IInventory inv=(IInventory)te;
                int size=inv.getSizeInventory();
                for(int i=0;i<size;i++){
                    ItemStack itemStack=inv.getStackInSlot(i);
                    if((itemStack==null || (itemStack.isItemEqual(requirement) && ItemStack.areItemStackTagsEqual(itemStack, requirement) && itemStack.stackSize+1<=itemStack.getMaxStackSize()))){
                        ItemStack p=tem.exportItemStack(requirement, 1);
                        if(p==null) return;

                        if(itemStack==null) inv.setInventorySlotContents(i, p.copy());
                        else itemStack.stackSize++;

                        te.markDirty();
                        return;
                    }
                }
            }
        }
    }
}