1 package 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 chemicraft.debug.DebugData;
15 import chemicraft.debug.DebugTick;
16 import chemicraft.inventory.InventoryPyrolysisTableFuel;
17 import chemicraft.inventory.InventoryPyrolysisTableMaterial;
18 import chemicraft.inventory.InventoryPyrolysisTableResult;
19 import chemicraft.system.PacketHandler;
21 import com.google.common.io.ByteArrayDataInput;
23 import cpw.mods.fml.common.network.PacketDispatcher;
24 import cpw.mods.fml.relauncher.Side;
25 import cpw.mods.fml.relauncher.SideOnly;
27 public class TileEntityPyrolysisTable extends TileEntity {
29 private InventoryPyrolysisTableMaterial invm = new InventoryPyrolysisTableMaterial();
30 private InventoryPyrolysisTableResult invr = new InventoryPyrolysisTableResult();
31 private InventoryPyrolysisTableFuel invf = new InventoryPyrolysisTableFuel();
36 private float heat = 0;
41 private float burnTime = 0;
46 private float fuelRestTime = 0;
51 private static final int MAX_HEAT = 1700;
56 private static final int MIN_HEAT = 400;
59 * 燃料の燃焼速度比率・素材の燃焼速度比率の中心となる熱量
61 private static final int CENTER_HEAT = 1050;
66 private static final int MAX_BURN_TIME = 2000;
71 public static final Random rand = new Random();
76 private static HashMap<ItemStack, Integer> fuelList = new HashMap<ItemStack, Integer>();
81 private static HashMap<ItemStack, ItemStack[]> recipeList = new HashMap<ItemStack, ItemStack[]>();
84 public void updateEntity() {
86 //boolean var2 = false;
88 boolean var1 = this.worldObj.canBlockSeeTheSky(xCoord, yCoord + 1, zCoord);
89 if (this.worldObj.getBlockId(xCoord, yCoord-1, zCoord) == Block.fire.blockID) {
90 if (this.heat < 1700) {
91 if (this.worldObj.isRaining() && var1 && !this.worldObj.isThundering()) {
93 } else if (this.worldObj.isThundering() && var1) {
103 if(this.worldObj.isRaining() && var1 && !this.worldObj.isThundering()) {
105 } else if(this.worldObj.isThundering() && var1) {
115 if (this.fuelRestTime >= 0) {
116 this.burnTime += 10 * CENTER_HEAT / this.heat;
117 this.fuelRestTime -= 10 * CENTER_HEAT / this.heat;
120 if (this.burnTime >= MAX_BURN_TIME) {
121 Iterator<ItemStack> itMaterial = recipeList.keySet().iterator();
122 while (itMaterial.hasNext()) {
123 ItemStack itemstackMaterial = itMaterial.next();
124 ItemStack materialItem = this.invm.getStackInSlot(0);
125 if (materialItem != null) {
126 if (this.isInItemCheck(itemstackMaterial)) {
128 if (itemstackMaterial.itemID == materialItem.itemID && itemstackMaterial.getItemDamage() == materialItem.getItemDamage()) {
129 this.inItem(itemstackMaterial);
130 if (materialItem.stackSize >= 1) {
131 this.invm.setInventorySlotContents(0, new ItemStack(materialItem.itemID, --materialItem.stackSize, materialItem.getItemDamage()));
133 this.invm.setInventorySlotContents(0, null);
143 boolean var3 = false;
144 if (this.heat > MIN_HEAT) {
145 Iterator<ItemStack> itMaterial = recipeList.keySet().iterator();
146 while (itMaterial.hasNext()) {
147 ItemStack itemstackMaterial = itMaterial.next();
148 ItemStack materialItem = this.invm.getStackInSlot(0);
149 if (materialItem != null) {
150 if (this.isInItemCheck(itemstackMaterial)) {
152 if (itemstackMaterial.itemID == materialItem.itemID && itemstackMaterial.getItemDamage() == materialItem.getItemDamage()) {
154 if (this.fuelRestTime <= 0) {
155 Iterator<ItemStack> itFuel = fuelList.keySet().iterator();
156 while (itFuel.hasNext()) {
157 ItemStack itemstackFuel = itFuel.next();
158 ItemStack fuelItem = this.invf.getStackInSlot(0);
159 if (fuelItem != null) {
160 if (itemstackFuel.itemID == fuelItem.itemID && itemstackFuel.getItemDamage() == fuelItem.getItemDamage()) {
161 this.fuelRestTime = fuelList.get(itemstackFuel);
162 if (fuelItem.stackSize >= 1) {
163 this.invf.setInventorySlotContents(0, new ItemStack(fuelItem.itemID, --fuelItem.stackSize, fuelItem.getItemDamage()));
166 this.invf.setInventorySlotContents(0, null);
186 DebugTick.setDebugData("PyrolysisTable" +
187 "(x:" + this.xCoord +
188 " y:" + this.yCoord +
189 " z:" + this.zCoord + ")",
190 new DebugData("Heat", this.heat),
191 new DebugData("FuelRestTime", this.fuelRestTime),
192 new DebugData("BurnTime", this.burnTime),
193 new DebugData("アイテムが入るか", var2)
199 public void readFromNBT(NBTTagCompound par1) {
200 super.readFromNBT(par1);
201 this.heat = par1.getFloat("Heat");
202 this.burnTime = par1.getFloat("BurnTime");
203 this.fuelRestTime = par1.getFloat("FuelRestTime");
205 NBTTagList var2 = par1.getTagList("Items");
206 for (int var3 = 0; var3 < var2.tagCount(); ++var3)
208 NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
209 int var5 = var4.getByte("Slot") & 255;
211 if (var5 >= 0 && var5 < this.invm.getSizeInventory())
213 this.invm.setInventorySlotContents(var5, ItemStack.loadItemStackFromNBT(var4));
217 NBTTagList var6 = par1.getTagList("Items2");
218 for (int var3 = 0; var3 < var6.tagCount(); ++var3)
220 NBTTagCompound var7 = (NBTTagCompound)var6.tagAt(var3);
221 int var8 = var7.getByte("Slot2") & 255;
223 if (var8 >= 0 && var8 < this.invr.getSizeInventory())
225 this.invr.setInventorySlotContents(var8, ItemStack.loadItemStackFromNBT(var7));
229 NBTTagList var9 = par1.getTagList("Items3");
230 for (int var3 = 0; var3 < var9.tagCount(); ++var3)
232 NBTTagCompound var10 = (NBTTagCompound)var9.tagAt(var3);
233 int var11 = var10.getByte("Slot3") & 255;
235 if (var11 >= 0 && var11 < this.invf.getSizeInventory())
237 this.invf.setInventorySlotContents(var11, ItemStack.loadItemStackFromNBT(var10));
243 public void writeToNBT(NBTTagCompound par1) {
244 super.writeToNBT(par1);
245 par1.setFloat("Heat", this.heat);
246 par1.setFloat("BurnTime", this.burnTime);
247 par1.setFloat("FuelRestTime", this.fuelRestTime);
249 NBTTagList var2 = new NBTTagList();
250 for (int var3 = 0; var3 < this.invm.getSizeInventory(); ++var3)
252 if (this.invm.getStackInSlot(var3) != null)
254 NBTTagCompound var4 = new NBTTagCompound();
255 var4.setByte("Slot", (byte)var3);
256 this.invm.getStackInSlot(var3).writeToNBT(var4);
257 var2.appendTag(var4);
260 par1.setTag("Items", var2);
262 NBTTagList var5 = new NBTTagList();
263 for (int var6 = 0; var6 < this.invr.getSizeInventory(); ++var6)
265 if (this.invr.getStackInSlot(var6) != null)
267 NBTTagCompound var7 = new NBTTagCompound();
268 var7.setByte("Slot2", (byte)var6);
269 this.invr.getStackInSlot(var6).writeToNBT(var7);
270 var5.appendTag(var7);
273 par1.setTag("Items2", var5);
275 NBTTagList var8 = new NBTTagList();
276 for (int var9 = 0; var9 < this.invf.getSizeInventory(); ++var9)
278 if (this.invf.getStackInSlot(var9) != null)
280 NBTTagCompound var10 = new NBTTagCompound();
281 var10.setByte("Slot3", (byte)var9);
282 this.invf.getStackInSlot(var9).writeToNBT(var10);
283 var8.appendTag(var10);
286 par1.setTag("Items3", var8);
290 public Packet getDescriptionPacket() {
291 return PacketHandler.getPacket(this);
294 public void readPacket(ByteArrayDataInput data) {
296 this.heat = data.readFloat();
297 this.burnTime = data.readInt();
298 this.fuelRestTime = data.readFloat();
299 for(int i = 0;i < this.invm.getSizeInventory();i++){
300 int id = data.readInt();
301 int size = data.readByte();
302 int damage = data.readInt();
303 if (id != 0 && size != 0){
304 this.invm.setInventorySlotContents(i, new ItemStack(id, size, damage));
306 this.invm.setInventorySlotContents(i, null);
310 for(int i = 0;i < this.invr.getSizeInventory();i++){
311 int id = data.readInt();
312 int size = data.readByte();
313 int damage = data.readInt();
314 if (id != 0 && size != 0){
315 this.invr.setInventorySlotContents(i, new ItemStack(id, size, damage));
317 this.invr.setInventorySlotContents(i, null);
321 for(int i = 0;i < this.invf.getSizeInventory();i++){
322 int id = data.readInt();
323 int size = data.readByte();
324 int damage = data.readInt();
325 if (id != 0 && size != 0){
326 this.invf.setInventorySlotContents(i, new ItemStack(id, size, damage));
328 this.invf.setInventorySlotContents(i, null);
331 } catch (Exception e) {
337 public void writePacket(DataOutputStream dos){
339 dos.writeFloat(this.heat);
340 dos.writeFloat(this.burnTime);
341 dos.writeFloat(this.fuelRestTime);
342 for(int i = 0;i < this.invm.getSizeInventory();i++){
346 ItemStack itemstack = this.invm.getStackInSlot(i);
347 if (itemstack != null){
348 id = itemstack.itemID;
349 size = itemstack.stackSize;
350 damage = itemstack.getItemDamage();
353 dos.writeInt(damage);
361 for(int i = 0;i < this.invr.getSizeInventory();i++){
365 ItemStack itemstack = this.invr.getStackInSlot(i);
366 if (itemstack != null){
367 id = itemstack.itemID;
368 size = itemstack.stackSize;
369 damage = itemstack.getItemDamage();
372 dos.writeInt(damage);
380 for(int i = 0;i < this.invf.getSizeInventory();i++){
384 ItemStack itemstack = this.invf.getStackInSlot(i);
385 if (itemstack != null){
386 id = itemstack.itemID;
387 size = itemstack.stackSize;
388 damage = itemstack.getItemDamage();
391 dos.writeInt(damage);
398 } catch (Exception e) {
403 public float getBurnTime() {
404 return this.burnTime;
407 public float getHeat() {
411 public InventoryPyrolysisTableMaterial getInvMaterial() {
415 public InventoryPyrolysisTableResult getInvResult() {
419 public InventoryPyrolysisTableFuel getInvFuel() {
423 public boolean isInItemCheck(ItemStack key) {
424 ItemStack[] results = recipeList.get(key).clone();
425 ItemStack[] containerResults = new ItemStack[this.invr.getSizeInventory()];
426 for (int i = 0; i < this.invr.getSizeInventory(); i++) {
427 containerResults[i] = this.invr.getStackInSlot(i);
430 for (int i = 0; i < results.length; i++) {
431 int var1 = results[i].itemID;
432 int var3 = results[i].getItemDamage();
433 int var5 = results[i].stackSize;
434 for (int j = 0; j < containerResults.length; j++) {
435 if (containerResults[j] == null) {
439 int var2 = containerResults[j].itemID;
440 int var4 = containerResults[j].getItemDamage();
441 int var6 = containerResults[j].stackSize;
442 int var7 = containerResults[j].getMaxStackSize();
443 if (var1 == var2 && var3 == var4) {
444 if (var5 + var6 <= var7) {
454 for (int i = 0; i < results.length; i++) {
455 if (results[i] != null) {
462 public void inItem(ItemStack key) {
463 ItemStack[] results = recipeList.get(key);
464 ItemStack[] containerResults = new ItemStack[this.invr.getSizeInventory()];
465 for (int i = 0; i < this.invr.getSizeInventory(); i++) {
466 containerResults[i] = this.invr.getStackInSlot(i);
469 for (int i = 0; i < results.length; i++) {
470 int var1 = results[i].itemID;
471 int var3 = results[i].getItemDamage();
472 int var5 = results[i].stackSize;
473 for (int j = 0; j < containerResults.length; j++) {
474 if (containerResults[j] == null) {
475 this.invr.setInventorySlotContents(j, results[i]);
478 int var2 = containerResults[j].itemID;
479 int var4 = containerResults[j].getItemDamage();
480 int var6 = containerResults[j].stackSize;
481 int var7 = containerResults[j].getMaxStackSize();
482 if (var1 == var2 && var3 == var4) {
483 if (var5 + var6 <= var7) {
484 System.out.println(var5);
485 System.out.println(var6);
486 System.out.println(var5 + var6);
487 System.out.println(i);
488 System.out.println(j);
489 this.invr.setInventorySlotContents(j, new ItemStack(results[i].itemID, var5 + var6, results[i].getItemDamage()));
492 this.invr.setInventorySlotContents(j, new ItemStack(results[i].itemID, var7, results[i].getItemDamage()));
501 public static void addFuel(ItemStack itemstack, int burnTime) {
502 fuelList.put(itemstack, burnTime);
505 public static void addRecipe(ItemStack material, ItemStack[] result) {
506 recipeList.put(material, result);