/** * 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%になりません。"); } }
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())); } }
// 일반티 생성 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; }