1 package pcc.chemicraft.tileentity;
3 import java.io.DataOutputStream;
4 import java.util.HashMap;
5 import java.util.Iterator;
6 import java.util.Random;
8 import net.minecraft.block.Block;
9 import net.minecraft.item.ItemStack;
10 import net.minecraft.nbt.NBTTagCompound;
11 import net.minecraft.nbt.NBTTagList;
12 import net.minecraft.network.packet.Packet;
13 import net.minecraft.tileentity.TileEntity;
14 import pcc.chemicraft.ChemiCraftAPI;
15 import pcc.chemicraft.inventory.InventoryElectrolysisFuel;
16 import pcc.chemicraft.inventory.InventoryElectrolysisMaterial;
17 import pcc.chemicraft.inventory.InventoryElectrolysisResult;
18 import pcc.chemicraft.system.PacketHandler;
20 import com.google.common.io.ByteArrayDataInput;
22 public class TileEntityElectrolysisTable extends TileEntity
25 private InventoryElectrolysisMaterial invm = new InventoryElectrolysisMaterial();
26 private InventoryElectrolysisResult invr = new InventoryElectrolysisResult();
27 private InventoryElectrolysisFuel invf = new InventoryElectrolysisFuel();
32 private float heat = 0;
37 private float burnTime = 0;
42 private float fuelRestTime = 0;
47 private static final int MAX_HEAT = 1700;
52 private static final int MIN_HEAT = 400;
55 * 燃料の燃焼速度比率・素材の燃焼速度比率の中心となる熱量
57 private static final int CENTER_HEAT = 1050;
62 private static final int MAX_BURN_TIME = 2000;
67 public static final Random rand = new Random();
72 private static HashMap<ItemStack, ItemStack[]> recipeList = new HashMap<ItemStack, ItemStack[]>();
75 public void updateEntity()
77 if (this.fuelRestTime >= 0) {
78 this.burnTime += 10 * CENTER_HEAT / this.heat;
79 this.fuelRestTime -= 10 * CENTER_HEAT / this.heat;
82 if (this.burnTime >= MAX_BURN_TIME) {
83 Iterator<ItemStack> itMaterial = recipeList.keySet().iterator();
84 while (itMaterial.hasNext()) {
85 ItemStack itemstackMaterial = itMaterial.next();
86 ItemStack materialItem = this.invm.getStackInSlot(0);
87 if (materialItem != null) {
88 if (this.isInItemCheck(itemstackMaterial)) {
89 if (itemstackMaterial.itemID == materialItem.itemID && itemstackMaterial.getItemDamage() == materialItem.getItemDamage()) {
90 this.inItem(itemstackMaterial);
91 if (materialItem.stackSize > 1) {
92 this.invm.setInventorySlotContents(0, new ItemStack(materialItem.itemID, --materialItem.stackSize, materialItem.getItemDamage()));
94 this.invm.setInventorySlotContents(0, null);
104 boolean var1 = false;
105 if (this.heat > MIN_HEAT) {
106 Iterator<ItemStack> itMaterial = recipeList.keySet().iterator();
107 while (itMaterial.hasNext()) {
108 ItemStack itemstackMaterial = itMaterial.next();
109 ItemStack materialItem = this.invm.getStackInSlot(0);
110 if (materialItem != null) {
111 if (this.isInItemCheck(itemstackMaterial)) {
112 if (itemstackMaterial.itemID == materialItem.itemID && itemstackMaterial.getItemDamage() == materialItem.getItemDamage()) {
114 if (this.fuelRestTime <= 0) {
115 Iterator<ItemStack> itFuel = ChemiCraftAPI.instance().getChemicalCellsList().keySet().iterator();
116 while (itFuel.hasNext()) {
117 ItemStack itemstackFuel = itFuel.next();
118 ItemStack fuelItem = this.invf.getStackInSlot(0);
119 if (fuelItem != null) {
120 if (itemstackFuel.itemID == fuelItem.itemID && itemstackFuel.getItemDamage() == fuelItem.getItemDamage()) {
121 this.fuelRestTime = ChemiCraftAPI.instance().getChemicalCellsList().get(itemstackFuel);
122 if (fuelItem.stackSize > 1) {
123 this.invf.setInventorySlotContents(0, new ItemStack(fuelItem.itemID, --fuelItem.stackSize, fuelItem.getItemDamage()));
126 this.invf.setInventorySlotContents(0, null);
146 public void readFromNBT(NBTTagCompound par1) {
147 super.readFromNBT(par1);
148 this.heat = par1.getFloat("Heat");
149 this.burnTime = par1.getFloat("BurnTime");
150 this.fuelRestTime = par1.getFloat("FuelRestTime");
152 NBTTagList var2 = par1.getTagList("Items");
153 for (int var3 = 0; var3 < var2.tagCount(); ++var3)
155 NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
156 int var5 = var4.getByte("Slot") & 255;
158 if (var5 >= 0 && var5 < this.invm.getSizeInventory())
160 this.invm.setInventorySlotContents(var5, ItemStack.loadItemStackFromNBT(var4));
164 NBTTagList var6 = par1.getTagList("Items2");
165 for (int var3 = 0; var3 < var6.tagCount(); ++var3)
167 NBTTagCompound var7 = (NBTTagCompound)var6.tagAt(var3);
168 int var8 = var7.getByte("Slot2") & 255;
170 if (var8 >= 0 && var8 < this.invr.getSizeInventory())
172 this.invr.setInventorySlotContents(var8, ItemStack.loadItemStackFromNBT(var7));
176 NBTTagList var9 = par1.getTagList("Items3");
177 for (int var3 = 0; var3 < var9.tagCount(); ++var3)
179 NBTTagCompound var10 = (NBTTagCompound)var9.tagAt(var3);
180 int var11 = var10.getByte("Slot3") & 255;
182 if (var11 >= 0 && var11 < this.invf.getSizeInventory())
184 this.invf.setInventorySlotContents(var11, ItemStack.loadItemStackFromNBT(var10));
190 public void writeToNBT(NBTTagCompound par1) {
191 super.writeToNBT(par1);
192 par1.setFloat("Heat", this.heat);
193 par1.setFloat("BurnTime", this.burnTime);
194 par1.setFloat("FuelRestTime", this.fuelRestTime);
196 NBTTagList var2 = new NBTTagList();
197 for (int var3 = 0; var3 < this.invm.getSizeInventory(); ++var3)
199 if (this.invm.getStackInSlot(var3) != null)
201 NBTTagCompound var4 = new NBTTagCompound();
202 var4.setByte("Slot", (byte)var3);
203 this.invm.getStackInSlot(var3).writeToNBT(var4);
204 var2.appendTag(var4);
207 par1.setTag("Items", var2);
209 NBTTagList var5 = new NBTTagList();
210 for (int var6 = 0; var6 < this.invr.getSizeInventory(); ++var6)
212 if (this.invr.getStackInSlot(var6) != null)
214 NBTTagCompound var7 = new NBTTagCompound();
215 var7.setByte("Slot2", (byte)var6);
216 this.invr.getStackInSlot(var6).writeToNBT(var7);
217 var5.appendTag(var7);
220 par1.setTag("Items2", var5);
222 NBTTagList var8 = new NBTTagList();
223 for (int var9 = 0; var9 < this.invf.getSizeInventory(); ++var9)
225 if (this.invf.getStackInSlot(var9) != null)
227 NBTTagCompound var10 = new NBTTagCompound();
228 var10.setByte("Slot3", (byte)var9);
229 this.invf.getStackInSlot(var9).writeToNBT(var10);
230 var8.appendTag(var10);
233 par1.setTag("Items3", var8);
237 public Packet getDescriptionPacket() {
238 return PacketHandler.getPacket(this);
241 public void readPacket(ByteArrayDataInput data) {
243 this.heat = data.readFloat();
244 this.burnTime = data.readInt();
245 this.fuelRestTime = data.readFloat();
246 for(int i = 0;i < this.invm.getSizeInventory();i++){
247 int id = data.readInt();
248 int size = data.readByte();
249 int damage = data.readInt();
250 if (id != 0 && size != 0){
251 this.invm.setInventorySlotContents(i, new ItemStack(id, size, damage));
253 this.invm.setInventorySlotContents(i, null);
257 for(int i = 0;i < this.invr.getSizeInventory();i++){
258 int id = data.readInt();
259 int size = data.readByte();
260 int damage = data.readInt();
261 if (id != 0 && size != 0){
262 this.invr.setInventorySlotContents(i, new ItemStack(id, size, damage));
264 this.invr.setInventorySlotContents(i, null);
268 for(int i = 0;i < this.invf.getSizeInventory();i++){
269 int id = data.readInt();
270 int size = data.readByte();
271 int damage = data.readInt();
272 if (id != 0 && size != 0){
273 this.invf.setInventorySlotContents(i, new ItemStack(id, size, damage));
275 this.invf.setInventorySlotContents(i, null);
278 } catch (Exception e) {
284 public void writePacket(DataOutputStream dos){
286 dos.writeFloat(this.heat);
287 dos.writeFloat(this.burnTime);
288 dos.writeFloat(this.fuelRestTime);
289 for(int i = 0;i < this.invm.getSizeInventory();i++){
293 ItemStack itemstack = this.invm.getStackInSlot(i);
294 if (itemstack != null){
295 id = itemstack.itemID;
296 size = itemstack.stackSize;
297 damage = itemstack.getItemDamage();
300 dos.writeInt(damage);
308 for(int i = 0;i < this.invr.getSizeInventory();i++){
312 ItemStack itemstack = this.invr.getStackInSlot(i);
313 if (itemstack != null){
314 id = itemstack.itemID;
315 size = itemstack.stackSize;
316 damage = itemstack.getItemDamage();
319 dos.writeInt(damage);
327 for(int i = 0;i < this.invf.getSizeInventory();i++){
331 ItemStack itemstack = this.invf.getStackInSlot(i);
332 if (itemstack != null){
333 id = itemstack.itemID;
334 size = itemstack.stackSize;
335 damage = itemstack.getItemDamage();
338 dos.writeInt(damage);
345 } catch (Exception e) {
350 public float getBurnTime() {
351 return this.burnTime;
354 public float getHeat() {
358 public InventoryElectrolysisMaterial getInvMaterial(){
362 public InventoryElectrolysisResult getInvResult(){
366 public InventoryElectrolysisFuel getInvFuel(){
370 public boolean isInItemCheck(ItemStack key) {
371 ItemStack[] results = recipeList.get(key).clone();
372 ItemStack[] containerResults = new ItemStack[this.invr.getSizeInventory()];
373 for (int j = 0; j < this.invr.getSizeInventory(); j++) {
374 containerResults[j] = this.invr.getStackInSlot(j);
377 for (int i = 0; i < results.length; i++) {
378 int var1 = results[i].itemID;
379 int var3 = results[i].getItemDamage();
380 int var5 = results[i].stackSize;
381 for (int j = 0; j < containerResults.length; j++) {
382 if (containerResults[j] == null) {
383 containerResults[j] = results[i];
387 int var2 = containerResults[j].itemID;
388 int var4 = containerResults[j].getItemDamage();
389 int var6 = containerResults[j].stackSize;
390 int var7 = containerResults[j].getMaxStackSize();
391 if (var1 == var2 && var3 == var4) {
392 if (var5 + var6 <= var7) {
393 containerResults[j] = results[i];
403 for (int i = 0; i < results.length; i++) {
404 if (results[i] != null) {
411 public void inItem(ItemStack key) {
412 ItemStack[] results = recipeList.get(key);
414 for (int i = 0; i < results.length; i++) {
415 ItemStack[] containerResults = new ItemStack[this.invr.getSizeInventory()];
416 for (int j = 0; j < this.invr.getSizeInventory(); j++) {
417 containerResults[j] = this.invr.getStackInSlot(j);
419 int var1 = results[i].itemID;
420 int var3 = results[i].getItemDamage();
421 int var5 = results[i].stackSize;
422 for (int j = 0; j < containerResults.length; j++) {
423 if (containerResults[j] == null) {
424 this.invr.setInventorySlotContents(j, results[i]);
427 int var2 = containerResults[j].itemID;
428 int var4 = containerResults[j].getItemDamage();
429 int var6 = containerResults[j].stackSize;
430 int var7 = containerResults[j].getMaxStackSize();
431 if (var1 == var2 && var3 == var4) {
432 if (var5 + var6 <= var7) {
433 this.invr.setInventorySlotContents(j, new ItemStack(results[i].itemID, var5 + var6, results[i].getItemDamage()));
436 this.invr.setInventorySlotContents(j, new ItemStack(results[i].itemID, var7, results[i].getItemDamage()));
445 public static void addRecipe(ItemStack material, ItemStack[] result) {
446 recipeList.put(material, result);