示例#1
0
  public void CookItem(int i) {
    ItemStack cookingItemStack = fireItemStacks[i];
    TECrucible crucibleTE =
        (worldObj.getTileEntity(xCoord, yCoord - 1, zCoord) instanceof TECrucible)
            ? (TECrucible) worldObj.getTileEntity(xCoord, yCoord - 1, zCoord)
            : null;

    /*
     * Only allow the ore to be smelted if there is a tuyere in the blast furnace,
     * a crucible below the blast furnace that isn't full, and the delay timer has completed.
     */
    if (cookingItemStack != null
        && crucibleTE != null
        && crucibleTE.getTotalMetal() < crucibleTE.MAX_UNITS
        && storage[1] != null /*Tuyere*/
        && cookDelay == 0) {
      Random R = new Random();
      HeatRegistry manager = HeatRegistry.getInstance();
      HeatIndex index = manager.findMatchingIndex(cookingItemStack);

      if (index != null && TFC_ItemHeat.GetTemp(cookingItemStack) >= index.meltTemp) {
        int output = 0;
        Item cookingItem = cookingItemStack.getItem();

        if (cookingItem instanceof ISmeltable) {
          output = ((ISmeltable) cookingItem).GetMetalReturnAmount(cookingItemStack);
          // Attempt to add metal to crucible.
          if (!crucibleTE.addMetal(
              ((ISmeltable) cookingItem).GetMetalType(cookingItemStack), output))
            return; // Do not decrease fuel or ore if the crucible is too full.
        } else {
          Metal m = MetalRegistry.instance.getMetalFromItem(cookingItem);
          output = index.getOutput(cookingItemStack, R).getItemDamage();
          if (m != null) {
            // Attempt to add metal to crucible.
            if (!crucibleTE.addMetal(m, (short) (100 - output)))
              return; // Do not decrease fuel or ore if the crucible is too full.
          }
        }

        oreCount--;
        charcoalCount--;
        cookDelay = 100; // Five seconds (20 tps) until the next piece of ore can be smelted
        fireItemStacks[i] = null; // Delete cooked item

        /*
         * Treat fireItemStacks as a queue, and shift everything forward when an item is melted.
         * This way the hottest item is always in the first slot - Kitty
         */
        Queue<ItemStack> buffer = new ArrayBlockingQueue<ItemStack>(fireItemStacks.length);
        for (ItemStack is : fireItemStacks) {
          if (is != null) {
            buffer.offer(is);
          }
        }

        fireItemStacks = buffer.toArray(new ItemStack[fireItemStacks.length]);

        // Damage the tuyere 1 point per item (not metal unit) smelted.
        storage[1].setItemDamage(storage[1].getItemDamage() + 1);
        if (storage[1] != null && storage[1].getItemDamage() == storage[1].getMaxDamage()) {
          setInventorySlotContents(1, null);
        }

        // Update crucible temperature
        crucibleTE.temperature = (int) fireTemp;
      }
    }
  }
示例#2
0
  public void cookItem() {
    HeatRegistry manager = HeatRegistry.getInstance();
    Random r = new Random();
    if (fireItemStacks[1] != null) {
      HeatIndex index = manager.findMatchingIndex(fireItemStacks[1]);
      if (index != null && TFC_ItemHeat.getTemp(fireItemStacks[1]) > index.meltTemp) {
        ItemStack output = index.getOutput(fireItemStacks[1], r);
        ItemCookEvent eventMelt = new ItemCookEvent(fireItemStacks[1], output, this);
        MinecraftForge.EVENT_BUS.post(eventMelt);
        output = eventMelt.result;
        int damage = 0;
        ItemStack mold = null;
        if (output != null) {
          damage = output.getItemDamage();
          if (output.getItem() == fireItemStacks[1].getItem())
            damage = fireItemStacks[1].getItemDamage();

          // If the input is unshaped metal
          if (fireItemStacks[1].getItem() instanceof ItemMeltedMetal) {
            // if both output slots are empty then just lower the input item into the first output
            // slot
            if (fireItemStacks[7] == null && fireItemStacks[8] == null) {
              fireItemStacks[7] = fireItemStacks[1].copy();
              fireItemStacks[1] = null;
              return;
            }
            // Otherwise if the first output has an item that doesnt match the input item then put
            // the item in the second output slot
            else if (fireItemStacks[7] != null
                && fireItemStacks[7].getItem() != TFCItems.ceramicMold
                && (fireItemStacks[7].getItem() != fireItemStacks[1].getItem()
                    || fireItemStacks[7].getItemDamage() == 0)) {
              if (fireItemStacks[8] == null) {
                fireItemStacks[8] = fireItemStacks[1].copy();
                fireItemStacks[1] = null;
                return;
              }
            }
            mold = new ItemStack(TFCItems.ceramicMold, 1);
            mold.stackSize = 1;
            mold.setItemDamage(1);
          }
        }
        // Morph the input
        float temp = TFC_ItemHeat.getTemp(fireItemStacks[1]);
        fireItemStacks[1] = index.getMorph();
        if (fireItemStacks[1] != null && manager.findMatchingIndex(fireItemStacks[1]) != null) {
          // if the input is a new item, then apply the old temperature to it
          TFC_ItemHeat.setTemp(fireItemStacks[1], temp);
        }

        // Check if we should combine the output with a pre-existing output
        if (output != null && output.getItem() instanceof ItemMeltedMetal) {
          int leftover = 0;
          boolean addLeftover = false;
          int fromSide = 0;
          if (fireItemStacks[7] != null
              && output.getItem() == fireItemStacks[7].getItem()
              && fireItemStacks[7].getItemDamage() > 0) {
            int amt1 = 100 - damage; // the percentage of the output
            int amt2 =
                100 - fireItemStacks[7].getItemDamage(); // the percentage currently in the out slot
            int amt3 = amt1 + amt2; // combined amount
            leftover =
                amt3
                    - 100; // assign the leftover so that we can add to the other slot if applicable
            if (leftover > 0) addLeftover = true;
            int amt4 = 100 - amt3; // convert the percent back to mc damage
            if (amt4 < 0) amt4 = 0; // stop the infinite glitch
            fireItemStacks[7] = output.copy();
            fireItemStacks[7].setItemDamage(amt4);

            TFC_ItemHeat.setTemp(fireItemStacks[7], temp);

            if (fireItemStacks[1] == null && mold != null) fireItemStacks[1] = mold;
          } else if (fireItemStacks[8] != null
              && output.getItem() == fireItemStacks[8].getItem()
              && fireItemStacks[8].getItemDamage() > 0) {
            int amt1 = 100 - damage; // the percentage of the output
            int amt2 =
                100 - fireItemStacks[8].getItemDamage(); // the percentage currently in the out slot
            int amt3 = amt1 + amt2; // combined amount
            leftover =
                amt3
                    - 100; // assign the leftover so that we can add to the other slot if applicable
            if (leftover > 0) addLeftover = true;
            fromSide = 1;
            int amt4 = 100 - amt3; // convert the percent back to mc damage
            if (amt4 < 0) amt4 = 0; // stop the infinite glitch
            fireItemStacks[8] = output.copy();
            fireItemStacks[8].setItemDamage(amt4);

            TFC_ItemHeat.setTemp(fireItemStacks[8], temp);

            if (fireItemStacks[1] == null && mold != null) fireItemStacks[1] = mold;
          } else if (fireItemStacks[7] != null
              && fireItemStacks[7].getItem() == TFCItems.ceramicMold) {
            fireItemStacks[7] = output.copy();
            fireItemStacks[7].setItemDamage(damage);

            TFC_ItemHeat.setTemp(fireItemStacks[7], temp);
          } else if (fireItemStacks[8] != null
              && fireItemStacks[8].getItem() == TFCItems.ceramicMold) {
            fireItemStacks[8] = output.copy();
            fireItemStacks[8].setItemDamage(damage);

            TFC_ItemHeat.setTemp(fireItemStacks[8], temp);
          }

          if (addLeftover) {
            int dest = fromSide == 1 ? 7 : 8;
            if (fireItemStacks[dest] != null
                && output.getItem() == fireItemStacks[dest].getItem()
                && fireItemStacks[dest].getItemDamage() > 0) {
              int amt1 = 100 - leftover; // the percentage of the output
              int amt2 =
                  100
                      - fireItemStacks[dest]
                          .getItemDamage(); // the percentage currently in the out slot
              int amt3 = amt1 + amt2; // combined amount
              int amt4 = 100 - amt3; // convert the percent back to mc damage
              if (amt4 < 0) amt4 = 0; // stop the infinite glitch
              fireItemStacks[dest] = output.copy();
              fireItemStacks[dest].setItemDamage(amt4);

              TFC_ItemHeat.setTemp(fireItemStacks[dest], temp);
            } else if (fireItemStacks[dest] != null
                && fireItemStacks[dest].getItem() == TFCItems.ceramicMold) {
              fireItemStacks[dest] = output.copy();
              fireItemStacks[dest].setItemDamage(100 - leftover);
              TFC_ItemHeat.setTemp(fireItemStacks[dest], temp);
            }
          }
        } else if (output != null) {
          if (fireItemStacks[7] != null
              && fireItemStacks[7].getItem() == output.getItem()
              && fireItemStacks[7].stackSize + output.stackSize
                  <= fireItemStacks[7].getMaxStackSize()) {
            fireItemStacks[7].stackSize += output.stackSize;
          } else if (fireItemStacks[8] != null
              && fireItemStacks[8].getItem() == output.getItem()
              && fireItemStacks[8].stackSize + output.stackSize
                  <= fireItemStacks[8].getMaxStackSize()) {
            fireItemStacks[8].stackSize += output.stackSize;
          } else if (fireItemStacks[7] == null) {
            fireItemStacks[7] = output.copy();
          } else if (fireItemStacks[8] == null) {
            fireItemStacks[8] = output.copy();
          } else if (fireItemStacks[7].stackSize == fireItemStacks[7].getMaxStackSize()
                  && fireItemStacks[8].stackSize == fireItemStacks[8].getMaxStackSize()
              || fireItemStacks[7].getItem() != output.getItem()
                  && fireItemStacks[8].getItem() != output.getItem()
              || fireItemStacks[7].stackSize == fireItemStacks[7].getMaxStackSize()
                  && fireItemStacks[8].getItem() != output.getItem()
              || fireItemStacks[7].getItem() != output.getItem()
                  && fireItemStacks[8].stackSize == fireItemStacks[8].getMaxStackSize()) {
            fireItemStacks[1] = output.copy();
          }
        }
      }
    }
  }