/** * Attempts to add an item into the next free slot. * * @param item The item. * @return <code>true</code> if the item was added, <code>false</code> if not. */ public boolean add(Item item) { if (item.getDefinition().isStackable() || type.equals(Type.ALWAYS_STACK)) { for (int i = 0; i < items.length; i++) { if (items[i] != null && items[i].getId() == item.getId()) { int totalCount = item.getCount() + items[i].getCount(); if (totalCount >= Integer.MAX_VALUE || totalCount < 1) { return false; } set(i, new Item(items[i].getId(), items[i].getCount() + item.getCount())); return true; } } int slot = freeSlot(); if (slot == -1) { return false; } else { set(slot, item); return true; } } else { int slots = freeSlots(); if (slots >= item.getCount()) { for (int i = 0; i < item.getCount(); i++) { set(freeSlot(), new Item(item.getId())); } return true; } else { return false; } } }
/** * 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; } }
/** * Remove item result. * * @param id the id * @param quantity the quantity * @return the result * @throws RemoteServerException the remote server exception * @throws LoginFailedException the login failed exception */ public Result removeItem(ItemId id, int quantity) throws RemoteServerException, LoginFailedException { Item item = getItem(id); if (item.getCount() < quantity) { throw new IllegalArgumentException("You cannont remove more quantity than you have"); } RecycleInventoryItemMessage msg = RecycleInventoryItemMessage.newBuilder().setItemId(id).setCount(quantity).build(); ServerRequest serverRequest = new ServerRequest(RequestTypeOuterClass.RequestType.RECYCLE_INVENTORY_ITEM, msg); pgo.getRequestHandler().sendServerRequests(serverRequest); RecycleInventoryItemResponseOuterClass.RecycleInventoryItemResponse response; try { response = RecycleInventoryItemResponseOuterClass.RecycleInventoryItemResponse.parseFrom( serverRequest.getData()); } catch (InvalidProtocolBufferException e) { throw new RemoteServerException(e); } if (response.getResult() == RecycleInventoryItemResponseOuterClass.RecycleInventoryItemResponse.Result.SUCCESS) { item.setCount(response.getNewCount()); } return response.getResult(); }
/** * Get used space inside of player inventory. * * @return used space */ public int getItemsCount() { int ct = 0; for (Item item : items.values()) { ct += item.getCount(); } return ct; }
/** * Removes an item. * * @param preferredSlot The preferred slot. * @param item The item to remove. * @return The number of items removed. */ public int remove(int preferredSlot, Item item) { int removed = 0; if (item.getDefinition().isStackable() || type.equals(Type.ALWAYS_STACK)) { int slot = getSlotById(item.getId()); Item stack = get(slot); if (stack.getCount() > item.getCount()) { removed = item.getCount(); set(slot, new Item(stack.getId(), stack.getCount() - item.getCount())); } else { removed = stack.getCount(); set(slot, null); } } else { for (int i = 0; i < item.getCount(); i++) { int slot = getSlotById(item.getId()); if (i == 0 && preferredSlot != -1) { Item inSlot = get(preferredSlot); if (inSlot.getId() == item.getId()) { slot = preferredSlot; } } if (slot != -1) { removed++; set(slot, null); } else { break; } } } return removed; }
/** * TreasureBoxを開けるPCにアイテムを入手させる。PCがアイテムを持ちきれなかった場合は アイテムは地面に落ちる。 * * @param pc - TreasureBoxを開けるPC * @return 開封した結果何らかのアイテムが出てきた場合はtrueを返す。 持ちきれず地面に落ちた場合もtrueになる。 */ public boolean open(PcInstance pc) { ItemInstance item = null; if (getType().equals(TYPE.SPECIFIC)) { // 出るアイテムが決まっているもの for (Item each : getItems()) { item = ItemTable.getInstance().createItem(each.getItemId()); item.setEnchantLevel(each.getEnchant()); // Enchant Feature for treasure_box if (item != null) { item.setCount(each.getCount()); storeItem(pc, item); } } } else if (getType().equals(TYPE.RANDOM)) { // 出るアイテムがランダムに決まるもの int chance = 0; int r = Random.nextInt(getTotalChance()); for (Item each : getItems()) { chance += each.getChance(); if (r < chance) { item = ItemTable.getInstance().createItem(each.getItemId()); item.setEnchantLevel(each.getEnchant()); // Enchant Feature for treasure_box 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); // キャラクターを死亡させる } // 多魯嘉之袋 if ((itemId == 46000)) { ItemInstance box = pc.getInventory().findItemId(itemId); box.setChargeCount(box.getChargeCount() - 1); pc.getInventory().updateItem(box, LsimulatorPcInventory.COL_CHARGE_COUNT); if (box.getChargeCount() < 1) { pc.getInventory().removeItem(box, 1); } } return true; } }