OSDN Git Service

4f50e87b52686453901c95c2377589e5109b7cd4
[chemicraft/ChemiCraftNext.git] / common / pcc / chemicraft / container / ContainerChemicalCraftingTable.java
1 package pcc.chemicraft.container;
2
3 import java.awt.Toolkit;
4
5 import net.minecraft.entity.player.EntityPlayer;
6 import net.minecraft.inventory.Container;
7 import net.minecraft.inventory.IInventory;
8 import net.minecraft.inventory.Slot;
9 import net.minecraft.item.ItemStack;
10 import net.minecraft.world.World;
11 import pcc.chemicraft.ChemiCraft;
12 import pcc.chemicraft.ChemiCraftAPI;
13 import pcc.chemicraft.inventory.InventoryChemicalCraftingMaterial;
14 import pcc.chemicraft.inventory.InventoryChemicalCraftingNBT;
15 import pcc.chemicraft.inventory.InventoryChemicalCraftingResult;
16 import pcc.chemicraft.slot.SlotChemicalCraftingTableResult;
17 import pcc.chemicraft.tileentity.TileEntityChemicalCraftingTable;
18 import pcc.chemicraft.util.ChemicalNBTRecipe;
19
20 public class ContainerChemicalCraftingTable extends Container {
21
22         /**
23          * Worldのインスタンス
24          */
25         private World worldObj;
26
27
28         /**
29          * BlockのX, Y, Z座標
30          */
31         private int posX;
32         private int posY;
33         private int posZ;
34
35
36         /**
37          * the TileEntity.
38          */
39         private TileEntityChemicalCraftingTable tileEntity;
40
41
42         private InventoryChemicalCraftingMaterial invm;
43         private InventoryChemicalCraftingResult invr;
44         private InventoryChemicalCraftingNBT invn;
45
46         private ChemicalNBTRecipe useNBT;
47
48
49
50         public ContainerChemicalCraftingTable(EntityPlayer par1EntityPlayer, TileEntityChemicalCraftingTable par2)
51         {
52                 super();
53                 this.worldObj = par2.worldObj;
54                 this.posX = par2.xCoord;
55                 this.posY = par2.yCoord;
56                 this.posZ = par2.zCoord;
57                 this.tileEntity = par2;
58                 this.invm = (InventoryChemicalCraftingMaterial) this.tileEntity.chemicalCraftingInvMaterial;
59                 this.invr = (InventoryChemicalCraftingResult) this.tileEntity.chemicalCraftingInvResult;
60                 this.invn = (InventoryChemicalCraftingNBT) this.tileEntity.chemicalCraftingInvNBT;
61                 //GenerateInventory
62                 this.generateSlots(this.invm, this.invr, this.invn);
63                 //GeneratePlayerInventory
64                 int var3;
65
66                 for (var3 = 0; var3 < 3; ++var3)
67                 {
68                         for (int var4 = 0; var4 < 9; ++var4)
69                         {
70                                 this.addSlotToContainer(new Slot(par1EntityPlayer.inventory, var4 + var3 * 9 + 9, 8 + var4 * 18, 85 + var3 * 18));
71                         }
72                 }
73
74                 for (var3 = 0; var3 < 9; ++var3)
75                 {
76                         this.addSlotToContainer(new Slot(par1EntityPlayer.inventory, var3, 8 + var3 * 18, 143));
77                 }
78
79                 this.invm.setEventHandler(this);
80                 this.invr.setEventHandler(this);
81                 this.invn.setEventHandler(this);
82                 this.onCraftMatrixChanged(invm);
83         }
84
85
86
87         @Override
88         public void onCraftMatrixChanged(IInventory par1IInventory){
89                 this.useNBT = ChemiCraftAPI.instance().getCraftingManager().chemicalCrafting(this.invm, this.invr, this.invn);
90         }
91
92         @Override
93         public void onCraftGuiClosed(EntityPlayer par1EntityPlayer){
94                 super.onCraftGuiClosed(par1EntityPlayer);
95         }
96
97         @Override
98         public ItemStack slotClick(int par1, int par2, int par3, EntityPlayer par4EntityPlayer)
99         {
100                 if(par1 == 12){
101                         if(this.invr.getStackInSlot(0) == null) return super.slotClick(par1, par2, par3, par4EntityPlayer);
102                         ItemStack var1 = par4EntityPlayer.inventory.getItemStack();
103                         if(var1 != null){
104                                 if(var1.stackSize + this.invr.getStackInSlot(0).stackSize >= var1.getMaxStackSize()) return super.slotClick(par1, par2, par3, par4EntityPlayer);
105                         }
106                         for(int i = 0;i < this.invm.getSizeInventory();i++){
107                                 if(this.invm.getStackInSlot(i) != null){
108                                         if(this.invm.getStackInSlot(i).stackSize > 1){
109                                                 this.invm.getStackInSlot(i).stackSize--;
110                                         }else{
111                                                 this.invm.setInventorySlotContents(i, null);
112                                         }
113                                 }
114                         }
115                         ItemStack[] matchNBT = new ItemStack[this.invn.getSizeInventory()];
116                         for(int i = 0;i < this.invn.getSizeInventory();i++){
117                                 matchNBT[i] = this.invn.getStackInSlot(i);
118                         }
119                         if(this.useNBT == null) return super.slotClick(par1, par2, par3, par4EntityPlayer);
120                         ItemStack[] useItems = this.useNBT.getMatchItems(matchNBT);
121                         for(int i = 0;i < useItems.length;i++){
122                                 if(useItems[i] != null){
123                                         this.invn.setInventorySlotContents(i, null);
124                                 }
125                         }
126                 }
127                 return super.slotClick(par1, par2, par3, par4EntityPlayer);
128         }
129
130         @Override
131         public boolean canInteractWith(EntityPlayer par1EntityPlayer){
132                 return this.worldObj.getBlockId(this.posX, this.posY, this.posZ) != ChemiCraft.instance.chemicalCraftingTableID ? false : par1EntityPlayer.getDistanceSq((double)this.posX + 0.5D, (double)this.posY + 0.5D, (double)this.posZ + 0.5D) <= 64.0D;
133         }
134
135
136
137         @Override
138         public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2) {
139                 ItemStack var3 = null;
140                 Slot var4 = (Slot)this.inventorySlots.get(par2);
141                 Slot var6 = (Slot)this.inventorySlots.get(0);
142
143                 if (var4 != null && var4.getHasStack()) {
144                         ItemStack var5 = var4.getStack();
145                         var3 = var5.copy();
146                         if (par2 >= 0 && par2 < 13) {
147                                 if (!this.mergeItemStack(var5, 13, 13+36, false)) {
148                                         return null;
149                                 }
150                         } else if (par2 >= 16 && par2 < 53) {
151                                 if (var6.isItemValid(var3)) {
152                                         if (!this.mergeItemStack(var5, 3, 13, false)) {
153                                                 return null;
154                                         }
155                                 }
156                         }
157
158                         if (var5.stackSize == 0) {
159                                 var4.putStack((ItemStack)null);
160                         } else {
161                                 var4.onSlotChanged();
162                         }
163
164                         if (var5.stackSize == var3.stackSize) {
165                                 return null;
166                         }
167
168                         var4.onPickupFromSlot(par1EntityPlayer, var5);
169                 }
170
171                 return var3;
172         }
173
174
175
176         private void generateSlots(IInventory materialInv, IInventory resultInv, IInventory nbtInv){
177                 for(int i = 0;i < 3;i++){
178                         this.addSlotToContainer(new Slot(invn, i, 30 + 18 * i, 7));
179                 }
180                 for(int i = 0;i < 3;i++){
181                         for(int j = 0;j < 3;j++){
182                                 this.addSlotToContainer(new Slot(invm, i * 3 + j, 30 + 18 * j, 27 + 18 * i));
183                         }
184                 }
185                 this.addSlotToContainer(new SlotChemicalCraftingTableResult(invr, 0, 123, 33));
186         }
187 }