private static final boolean check(MapleCharacter chr, MerchItemPackage pack) {
   if (chr.getMeso() + pack.getMesos() < 0L) {
     return false;
   }
   byte eq = 0;
   byte use = 0;
   byte setup = 0;
   byte etc = 0;
   byte cash = 0;
   for (Item item : pack.getItems()) {
     MapleInventoryType invtype = GameConstants.getInventoryType(item.getItemId());
     if (invtype == MapleInventoryType.EQUIP) {
       eq = (byte) (eq + 1);
     } else if (invtype == MapleInventoryType.USE) {
       use = (byte) (use + 1);
     } else if (invtype == MapleInventoryType.SETUP) {
       setup = (byte) (setup + 1);
     } else if (invtype == MapleInventoryType.ETC) {
       etc = (byte) (etc + 1);
     } else if (invtype == MapleInventoryType.CASH) {
       cash = (byte) (cash + 1);
     }
   }
   if ((chr.getInventory(MapleInventoryType.EQUIP).getNumFreeSlot() < eq)
       || (chr.getInventory(MapleInventoryType.USE).getNumFreeSlot() < use)
       || (chr.getInventory(MapleInventoryType.SETUP).getNumFreeSlot() < setup)
       || (chr.getInventory(MapleInventoryType.ETC).getNumFreeSlot() < etc)
       || (chr.getInventory(MapleInventoryType.CASH).getNumFreeSlot() < cash)) {
     return false;
   }
   return true;
 }
  private static final MerchItemPackage loadItemFrom_Database(int accountid) {
    Connection con = DatabaseConnection.getConnection();
    try {
      PreparedStatement ps = con.prepareStatement("SELECT * from hiredmerch where accountid = ?");
      ps.setInt(1, accountid);

      ResultSet rs = ps.executeQuery();

      if (!rs.next()) {
        ps.close();
        rs.close();
        return null;
      }
      int packageid = rs.getInt("PackageId");

      MerchItemPackage pack = new MerchItemPackage();
      pack.setPackageid(packageid);
      pack.setMesos(rs.getInt("Mesos"));
      pack.setSavedTime(rs.getLong("time"));

      ps.close();
      rs.close();

      Map<Long, Pair<Item, MapleInventoryType>> items =
          ItemLoader.HIRED_MERCHANT.loadItems(false, packageid);
      if (items != null) {
        List iters = new ArrayList();
        for (Pair z : items.values()) {
          iters.add(z.left);
        }
        pack.setItems(iters);
      }

      return pack;
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return null;
  }
 private static void requestItems(MapleClient c, boolean request) {
   if (c.getPlayer().getConversation() != 3) {
     return;
   }
   boolean merch = World.hasMerchant(c.getPlayer().getAccountID(), c.getPlayer().getId());
   if (merch) {
     c.getPlayer().dropMessage(1, "Please close the existing store and try again.");
     c.getPlayer().setConversation(0);
     return;
   }
   MerchItemPackage pack = loadItemFrom_Database(c.getPlayer().getAccountID());
   if (pack == null) {
     c.getPlayer().dropMessage(1, "An unknown error occured.");
     return;
   }
   if (c.getChannelServer().isShutdown()) {
     c.getPlayer().dropMessage(1, "The world is going to shut down.");
     c.getPlayer().setConversation(0);
     return;
   }
   int days = StringUtil.getDaysAmount(pack.getSavedTime(), System.currentTimeMillis());
   double percentage = days / 100.0D;
   int fee = (int) Math.ceil(percentage * pack.getMesos());
   if ((request) && (days > 0) && (percentage > 0.0D) && (pack.getMesos() > 0) && (fee > 0)) {
     c.getSession().write(PlayerShopPacket.merchItemStore((byte) 38, days, fee));
     return;
   }
   if (fee < 0) {
     c.getSession().write(PlayerShopPacket.merchItem_Message(33));
     return;
   }
   if (c.getPlayer().getMeso() < fee) {
     c.getSession().write(PlayerShopPacket.merchItem_Message(35));
     return;
   }
   if (!check(c.getPlayer(), pack)) {
     c.getSession().write(PlayerShopPacket.merchItem_Message(36));
     return;
   }
   if (deletePackage(c.getPlayer().getAccountID(), pack.getPackageid(), c.getPlayer().getId())) {
     if (fee > 0) {
       c.getPlayer().gainMeso(-fee, true);
     }
     c.getPlayer().gainMeso(pack.getMesos(), false);
     for (Item item : pack.getItems()) {
       MapleInventoryManipulator.addFromDrop(c, item, false);
     }
     c.getSession().write(PlayerShopPacket.merchItem_Message(32));
   } else {
     c.getPlayer().dropMessage(1, "An unknown error occured.");
   }
 }
  public static void displayMerch(MapleClient c) {
    int conv = c.getPlayer().getConversation();
    boolean merch = World.hasMerchant(c.getPlayer().getAccountID(), c.getPlayer().getId());
    MerchItemPackage pack;
    if (merch) {
      c.getPlayer().dropMessage(1, "Please close the existing store and try again.");
      c.getPlayer().setConversation(0);
    } else if (c.getChannelServer().isShutdown()) {
      c.getPlayer().dropMessage(1, "The world is going to shut down.");
      c.getPlayer().setConversation(0);
    } else if (conv == 3) {
      pack = loadItemFrom_Database(c.getPlayer().getAccountID());

      if (pack == null) {
        c.getPlayer().dropMessage(1, "You do not have any item(s) with Fredrick.");
        c.getPlayer().setConversation(0);
      } else if (pack.getItems().size() <= 0) {
        if (!check(c.getPlayer(), pack)) {
          c.getSession().write(PlayerShopPacket.merchItem_Message(33));
          return;
        }
        if (deletePackage(
            c.getPlayer().getAccountID(), pack.getPackageid(), c.getPlayer().getId())) {
          c.getPlayer().fakeRelog();
          c.getPlayer().gainMeso(pack.getMesos(), false);
          c.getSession().write(PlayerShopPacket.merchItem_Message(29));
          c.getPlayer().dropMessage(1, "You have retrieved your mesos.");
        } else {
          c.getPlayer().dropMessage(1, "An unknown error occured.");
        }
        c.getPlayer().setConversation(0);
      } else {
        c.getSession().write(PlayerShopPacket.merchItemStore_ItemData(pack));
        MapleInventoryManipulator.checkSpace(c, conv, conv, null);
        for (Item item : pack.getItems()) {
          if (c.getPlayer()
              .getInventory(GameConstants.getInventoryType(item.getItemId()))
              .isFull()) {
            c.removeClickedNPC();
            c.getPlayer().dropMessage(1, "Your inventory is full (Please relog)");
            break;
          }
          MapleInventoryManipulator.addFromDrop(c, item, true);
          deletePackage(c.getPlayer().getAccountID(), pack.getPackageid(), c.getPlayer().getId());

          c.removeClickedNPC();
        }
        c.getPlayer().dropMessage(1, "Items have been returned to you, please relog.");
      }
    }

    c.getSession().write(CWvsContext.enableActions());
  }