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.inventory.InventoryPyrolysisTableFuel;
15 import chemicraft.inventory.InventoryPyrolysisTableMaterial;
16 import chemicraft.inventory.InventoryPyrolysisTableResult;
17 import chemicraft.system.PacketHandler;
19 import com.google.common.io.ByteArrayDataInput;
21 public class TileEntityPyrolysisTable extends TileEntity {
23 private InventoryPyrolysisTableMaterial invm = new InventoryPyrolysisTableMaterial();
24 private InventoryPyrolysisTableResult invr = new InventoryPyrolysisTableResult();
25 private InventoryPyrolysisTableFuel invf = new InventoryPyrolysisTableFuel();
30 private float heat = 0;
35 private float burnTime = 0;
40 private float fuelRestTime = 0;
45 private static final int MAX_HEAT = 1700;
50 private static final int MIN_HEAT = 400;
53 * 燃料の燃焼速度比率・素材の燃焼速度比率の中心となる熱量
55 private static final int CENTER_HEAT = 1050;
60 private static final int MAX_BURN_TIME = 2000;
65 public static final Random rand = new Random();
70 private static HashMap<ItemStack, Integer> fuelList = new HashMap<ItemStack, Integer>();
75 private static HashMap<ItemStack, ItemStack[]> recipeList = new HashMap<ItemStack, ItemStack[]>();
78 public void updateEntity() {
80 //boolean var2 = false;
82 boolean var1 = this.worldObj.canBlockSeeTheSky(xCoord, yCoord + 1, zCoord);
83 if (this.worldObj.getBlockId(xCoord, yCoord-1, zCoord) == Block.fire.blockID) {
84 if (this.heat < 1700) {
85 if (this.worldObj.isRaining() && var1 && !this.worldObj.isThundering()) {
87 } else if (this.worldObj.isThundering() && var1) {
97 if(this.worldObj.isRaining() && var1 && !this.worldObj.isThundering()) {
99 } else if(this.worldObj.isThundering() && var1) {
109 if (this.fuelRestTime >= 0) {
110 this.burnTime += 10 * CENTER_HEAT / this.heat;
111 this.fuelRestTime -= 10 * CENTER_HEAT / this.heat;
114 if (this.burnTime >= MAX_BURN_TIME) {
115 Iterator<ItemStack> itMaterial = recipeList.keySet().iterator();
116 while (itMaterial.hasNext()) {
117 ItemStack itemstackMaterial = itMaterial.next();
118 ItemStack materialItem = this.invm.getStackInSlot(0);
119 if (materialItem != null) {
120 if (this.isInItemCheck(itemstackMaterial)) {
122 if (itemstackMaterial.itemID == materialItem.itemID && itemstackMaterial.getItemDamage() == materialItem.getItemDamage()) {
123 this.inItem(itemstackMaterial);
124 if (materialItem.stackSize > 1) {
125 this.invm.setInventorySlotContents(0, new ItemStack(materialItem.itemID, --materialItem.stackSize, materialItem.getItemDamage()));
127 this.invm.setInventorySlotContents(0, null);
137 boolean var3 = false;
138 if (this.heat > MIN_HEAT) {
139 Iterator<ItemStack> itMaterial = recipeList.keySet().iterator();
140 while (itMaterial.hasNext()) {
141 ItemStack itemstackMaterial = itMaterial.next();
142 ItemStack materialItem = this.invm.getStackInSlot(0);
143 if (materialItem != null) {
144 if (this.isInItemCheck(itemstackMaterial)) {
146 if (itemstackMaterial.itemID == materialItem.itemID && itemstackMaterial.getItemDamage() == materialItem.getItemDamage()) {
148 if (this.fuelRestTime <= 0) {
149 Iterator<ItemStack> itFuel = fuelList.keySet().iterator();
150 while (itFuel.hasNext()) {
151 ItemStack itemstackFuel = itFuel.next();
152 ItemStack fuelItem = this.invf.getStackInSlot(0);
153 if (fuelItem != null) {
154 if (itemstackFuel.itemID == fuelItem.itemID && itemstackFuel.getItemDamage() == fuelItem.getItemDamage()) {
155 this.fuelRestTime = fuelList.get(itemstackFuel);
156 if (fuelItem.stackSize > 1) {
157 this.invf.setInventorySlotContents(0, new ItemStack(fuelItem.itemID, --fuelItem.stackSize, fuelItem.getItemDamage()));
160 this.invf.setInventorySlotContents(0, null);
180 DebugTick.setDebugData("PyrolysisTable" +
181 "(x:" + this.xCoord +
182 " y:" + this.yCoord +
183 " z:" + this.zCoord + ")",
184 new DebugData("Heat", this.heat),
185 new DebugData("FuelRestTime", this.fuelRestTime),
186 new DebugData("BurnTime", this.burnTime),
187 new DebugData("アイテムが入るか", var2)
193 public void readFromNBT(NBTTagCompound par1) {
194 super.readFromNBT(par1);
195 this.heat = par1.getFloat("Heat");
196 this.burnTime = par1.getFloat("BurnTime");
197 this.fuelRestTime = par1.getFloat("FuelRestTime");
199 NBTTagList var2 = par1.getTagList("Items");
200 for (int var3 = 0; var3 < var2.tagCount(); ++var3)
202 NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
203 int var5 = var4.getByte("Slot") & 255;
205 if (var5 >= 0 && var5 < this.invm.getSizeInventory())
207 this.invm.setInventorySlotContents(var5, ItemStack.loadItemStackFromNBT(var4));
211 NBTTagList var6 = par1.getTagList("Items2");
212 for (int var3 = 0; var3 < var6.tagCount(); ++var3)
214 NBTTagCompound var7 = (NBTTagCompound)var6.tagAt(var3);
215 int var8 = var7.getByte("Slot2") & 255;
217 if (var8 >= 0 && var8 < this.invr.getSizeInventory())
219 this.invr.setInventorySlotContents(var8, ItemStack.loadItemStackFromNBT(var7));
223 NBTTagList var9 = par1.getTagList("Items3");
224 for (int var3 = 0; var3 < var9.tagCount(); ++var3)
226 NBTTagCompound var10 = (NBTTagCompound)var9.tagAt(var3);
227 int var11 = var10.getByte("Slot3") & 255;
229 if (var11 >= 0 && var11 < this.invf.getSizeInventory())
231 this.invf.setInventorySlotContents(var11, ItemStack.loadItemStackFromNBT(var10));
237 public void writeToNBT(NBTTagCompound par1) {
238 super.writeToNBT(par1);
239 par1.setFloat("Heat", this.heat);
240 par1.setFloat("BurnTime", this.burnTime);
241 par1.setFloat("FuelRestTime", this.fuelRestTime);
243 NBTTagList var2 = new NBTTagList();
244 for (int var3 = 0; var3 < this.invm.getSizeInventory(); ++var3)
246 if (this.invm.getStackInSlot(var3) != null)
248 NBTTagCompound var4 = new NBTTagCompound();
249 var4.setByte("Slot", (byte)var3);
250 this.invm.getStackInSlot(var3).writeToNBT(var4);
251 var2.appendTag(var4);
254 par1.setTag("Items", var2);
256 NBTTagList var5 = new NBTTagList();
257 for (int var6 = 0; var6 < this.invr.getSizeInventory(); ++var6)
259 if (this.invr.getStackInSlot(var6) != null)
261 NBTTagCompound var7 = new NBTTagCompound();
262 var7.setByte("Slot2", (byte)var6);
263 this.invr.getStackInSlot(var6).writeToNBT(var7);
264 var5.appendTag(var7);
267 par1.setTag("Items2", var5);
269 NBTTagList var8 = new NBTTagList();
270 for (int var9 = 0; var9 < this.invf.getSizeInventory(); ++var9)
272 if (this.invf.getStackInSlot(var9) != null)
274 NBTTagCompound var10 = new NBTTagCompound();
275 var10.setByte("Slot3", (byte)var9);
276 this.invf.getStackInSlot(var9).writeToNBT(var10);
277 var8.appendTag(var10);
280 par1.setTag("Items3", var8);
284 public Packet getDescriptionPacket() {
285 return PacketHandler.getPacket(this);
288 public void readPacket(ByteArrayDataInput data) {
290 this.heat = data.readFloat();
291 this.burnTime = data.readInt();
292 this.fuelRestTime = data.readFloat();
293 for(int i = 0;i < this.invm.getSizeInventory();i++){
294 int id = data.readInt();
295 int size = data.readByte();
296 int damage = data.readInt();
297 if (id != 0 && size != 0){
298 this.invm.setInventorySlotContents(i, new ItemStack(id, size, damage));
300 this.invm.setInventorySlotContents(i, null);
304 for(int i = 0;i < this.invr.getSizeInventory();i++){
305 int id = data.readInt();
306 int size = data.readByte();
307 int damage = data.readInt();
308 if (id != 0 && size != 0){
309 this.invr.setInventorySlotContents(i, new ItemStack(id, size, damage));
311 this.invr.setInventorySlotContents(i, null);
315 for(int i = 0;i < this.invf.getSizeInventory();i++){
316 int id = data.readInt();
317 int size = data.readByte();
318 int damage = data.readInt();
319 if (id != 0 && size != 0){
320 this.invf.setInventorySlotContents(i, new ItemStack(id, size, damage));
322 this.invf.setInventorySlotContents(i, null);
325 } catch (Exception e) {
331 public void writePacket(DataOutputStream dos){
333 dos.writeFloat(this.heat);
334 dos.writeFloat(this.burnTime);
335 dos.writeFloat(this.fuelRestTime);
336 for(int i = 0;i < this.invm.getSizeInventory();i++){
340 ItemStack itemstack = this.invm.getStackInSlot(i);
341 if (itemstack != null){
342 id = itemstack.itemID;
343 size = itemstack.stackSize;
344 damage = itemstack.getItemDamage();
347 dos.writeInt(damage);
355 for(int i = 0;i < this.invr.getSizeInventory();i++){
359 ItemStack itemstack = this.invr.getStackInSlot(i);
360 if (itemstack != null){
361 id = itemstack.itemID;
362 size = itemstack.stackSize;
363 damage = itemstack.getItemDamage();
366 dos.writeInt(damage);
374 for(int i = 0;i < this.invf.getSizeInventory();i++){
378 ItemStack itemstack = this.invf.getStackInSlot(i);
379 if (itemstack != null){
380 id = itemstack.itemID;
381 size = itemstack.stackSize;
382 damage = itemstack.getItemDamage();
385 dos.writeInt(damage);
392 } catch (Exception e) {
397 public float getBurnTime() {
398 return this.burnTime;
401 public float getHeat() {
405 public InventoryPyrolysisTableMaterial getInvMaterial() {
409 public InventoryPyrolysisTableResult getInvResult() {
413 public InventoryPyrolysisTableFuel getInvFuel() {
417 public boolean isInItemCheck(ItemStack key) {
418 ItemStack[] results = recipeList.get(key).clone();
419 ItemStack[] containerResults = new ItemStack[this.invr.getSizeInventory()];
420 for (int j = 0; j < this.invr.getSizeInventory(); j++) {
421 containerResults[j] = this.invr.getStackInSlot(j);
424 for (int i = 0; i < results.length; i++) {
425 int var1 = results[i].itemID;
426 int var3 = results[i].getItemDamage();
427 int var5 = results[i].stackSize;
428 for (int j = 0; j < containerResults.length; j++) {
429 if (containerResults[j] == null) {
430 containerResults[j] = results[i];
434 int var2 = containerResults[j].itemID;
435 int var4 = containerResults[j].getItemDamage();
436 int var6 = containerResults[j].stackSize;
437 int var7 = containerResults[j].getMaxStackSize();
438 if (var1 == var2 && var3 == var4) {
439 if (var5 + var6 <= var7) {
440 containerResults[j] = results[i];
450 for (int i = 0; i < results.length; i++) {
451 if (results[i] != null) {
458 public void inItem(ItemStack key) {
459 ItemStack[] results = recipeList.get(key);
461 for (int i = 0; i < results.length; i++) {
462 ItemStack[] containerResults = new ItemStack[this.invr.getSizeInventory()];
463 for (int j = 0; j < this.invr.getSizeInventory(); j++) {
464 containerResults[j] = this.invr.getStackInSlot(j);
466 int var1 = results[i].itemID;
467 int var3 = results[i].getItemDamage();
468 int var5 = results[i].stackSize;
469 for (int j = 0; j < containerResults.length; j++) {
470 if (containerResults[j] == null) {
471 this.invr.setInventorySlotContents(j, results[i]);
474 int var2 = containerResults[j].itemID;
475 int var4 = containerResults[j].getItemDamage();
476 int var6 = containerResults[j].stackSize;
477 int var7 = containerResults[j].getMaxStackSize();
478 if (var1 == var2 && var3 == var4) {
479 if (var5 + var6 <= var7) {
480 this.invr.setInventorySlotContents(j, new ItemStack(results[i].itemID, var5 + var6, results[i].getItemDamage()));
483 this.invr.setInventorySlotContents(j, new ItemStack(results[i].itemID, var7, results[i].getItemDamage()));
492 public static void addFuel(ItemStack itemstack, int burnTime) {
493 fuelList.put(itemstack, burnTime);
496 public static void addRecipe(ItemStack material, ItemStack[] result) {
497 recipeList.put(material, result);