/**
   * TreasureBoxを開けるPCにアイテムを入手させる。PCがアイテムを持ちきれなかった場合は アイテムは地面に落ちる。
   *
   * @param pc - TreasureBoxを開けるPC
   * @return 開封した結果何らかのアイテムが出てきた場合はtrueを返す。 持ちきれず地面に落ちた場合もtrueになる。
   */
  public boolean open(L1PcInstance pc) {
    L1ItemInstance item = null;

    if (getType().equals(TYPE.SPECIFIC)) {
      // 出るアイテムが決まっているもの
      for (Item each : getItems()) {
        item = ItemTable.getInstance().createItem(each.getItemId());
        if (item != null) {
          item.setCount(each.getCount());
          storeItem(pc, item);
        }
      }

    } else if (getType().equals(TYPE.RANDOM)) {
      // 出るアイテムがランダムに決まるもの
      RandomGenerator random = RandomGeneratorFactory.getSharedRandom();
      int chance = 0;

      int r = random.nextInt(getTotalChance());

      for (Item each : getItems()) {
        chance += each.getChance();

        if (r < chance) {
          item = ItemTable.getInstance().createItem(each.getItemId());
          if (item != null) {
            item.setCount(each.getCount());
            storeItem(pc, item);
          }
          break;
        }
      }
    }

    if (item == null) {
      return false;
    } else {
      int itemId = getBoxId();

      // 魂の結晶の破片、魔族のスクロール、ブラックエントの実
      if (itemId == 40576
          || itemId == 40577
          || itemId == 40578
          || itemId == 40411
          || itemId == 49013) {
        pc.death(null); // キャラクターを死亡させる
      }
      return true;
    }
  }
 private void init() {
   for (Item each : getItems()) {
     _totalChance += each.getChance();
     if (ItemTable.getInstance().getTemplate(each.getItemId()) == null) {
       getItems().remove(each);
       _log.warning("アイテムID " + each.getItemId() + " のテンプレートが見つかりません。");
     }
   }
   if (getTotalChance() != 0 && getTotalChance() != 1000000) {
     _log.warning("ID " + getBoxId() + " の確率の合計が100%になりません。");
   }
 }
Example #3
0
 private void createNewItem(L1PcInstance pc, int item_id, int count) {
   L1ItemInstance item = ItemTable.getInstance().createItem(item_id);
   item.setCount(count);
   if (item != null) {
     if (pc.getInventory().checkAddItem(item, count) == L1Inventory.OK) {
       pc.getInventory().storeItem(item);
     } else {
       L1World.getInstance().getInventory(pc.getX(), pc.getY(), pc.getMapId()).storeItem(item);
     }
     pc.sendPackets(new S_ServerMessage(403, item.getLogName()));
   }
 }
Example #4
0
 // 일반티 생성
 private boolean createNewItemR(L1PcInstance pc, int item_id, int count, int enchant) {
   L1ItemInstance item = ItemTable.getInstance().createItem(item_id);
   item.setCount(count);
   item.setIdentified(true);
   item.setEnchantLevel(enchant);
   if (item != null) {
     if (pc.getInventory().checkAddItem(item, count) == L1Inventory.OK) {
       pc.getInventory().storeItem(item);
       pc.sendPackets(new S_ServerMessage(403, item.getLogName()));
     } else {
       L1World.getInstance().getInventory(pc.getX(), pc.getY(), pc.getMapId()).storeItem(item);
     }
     return true;
   } else {
     return false;
   }
 }
  private boolean makeItems(L1PcInstance pc, String npcName, int amount) {
    if (amount <= 0) {
      return false;
    }

    boolean isEnoughMaterials = true;
    for (L1ObjectAmount<Integer> material : _materials) {
      if (!pc.getInventory()
          .checkItemNotEquipped(material.getObject(), material.getAmount() * amount)) {
        L1Item temp = ItemTable.getInstance().getTemplate(material.getObject());
        pc.sendPackets(
            new S_ServerMessage(
                337,
                temp.getName()
                    + "("
                    + ((material.getAmount() * amount)
                        - pc.getInventory().countItems(temp.getItemId()))
                    + ")")); // \f1%0が不足しています。
        isEnoughMaterials = false;
      }
    }
    if (!isEnoughMaterials) {
      return false;
    }

    // 容量と重量の計算
    int countToCreate = 0; // アイテムの個数(纏まる物は1個)
    int weight = 0;

    for (L1ObjectAmount<Integer> makingItem : _items) {
      L1Item temp = ItemTable.getInstance().getTemplate(makingItem.getObject());
      if (temp.isStackable()) {
        if (!pc.getInventory().checkItem(makingItem.getObject())) {
          countToCreate += 1;
        }
      } else {
        countToCreate += makingItem.getAmount() * amount;
      }
      weight += temp.getWeight() * (makingItem.getAmount() * amount) / 1000;
    }
    // 容量確認
    if (pc.getInventory().getSize() + countToCreate > 180) {
      pc.sendPackets(new S_ServerMessage(263)); // \f1一人のキャラクターが持って歩けるアイテムは最大180個までです。
      return false;
    }
    // 重量確認
    if (pc.getMaxWeight() < pc.getInventory().getWeight() + weight) {
      pc.sendPackets(new S_ServerMessage(82)); // アイテムが重すぎて、これ以上持てません。
      return false;
    }

    for (L1ObjectAmount<Integer> material : _materials) {
      // 材料消費
      pc.getInventory().consumeItem(material.getObject(), material.getAmount() * amount);
    }

    for (L1ObjectAmount<Integer> makingItem : _items) {
      L1ItemInstance item =
          pc.getInventory().storeItem(makingItem.getObject(), makingItem.getAmount() * amount);
      if (item != null) {
        String itemName = ItemTable.getInstance().getTemplate(makingItem.getObject()).getName();
        if (makingItem.getAmount() * amount > 1) {
          itemName = itemName + " (" + makingItem.getAmount() * amount + ")";
        }
        pc.sendPackets(new S_ServerMessage(143, npcName, itemName)); // \f1%0が%1をくれました。
      }
    }
    return true;
  }