Пример #1
0
 /**
  * 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;
    }
  }
Пример #3
0
  /**
   * 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();
  }
Пример #4
0
 /**
  * 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;
 }
Пример #5
0
 /**
  * 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;
    }
  }