public static void unequip(final MapleClient c, final short src, final short dst) {
   Equip source = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(src);
   Equip target = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(dst);
   if (dst < 0) {
     System.out.println("Unequipping to negative slot.");
   }
   if (source == null) {
     return;
   }
   if (target != null && src <= 0) {
     c.announce(InventoryFactory.getInventoryFull());
     return;
   }
   c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).removeSlot(src);
   if (target != null) {
     c.getPlayer().getInventory(MapleInventoryType.EQUIP).removeSlot(dst);
   }
   source.setPosition(dst);
   c.getPlayer().getInventory(MapleInventoryType.EQUIP).addFromDB(source);
   if (target != null) {
     target.setPosition(src);
     c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).addFromDB(target);
   }
   c.announce(InventoryFactory.moveInventoryItem(MapleInventoryType.EQUIP, src, dst, (byte) 1));
   c.getPlayer().equipChanged();
 }
  @Override
  public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {

    String pic = slea.readMapleAsciiString();
    int charId = slea.readInt();
    byte world = (byte) slea.readInt(); // world
    c.setWorld(world);
    byte channel =
        (byte) Randomizer.rand(0, Server.getInstance().getWorld(world).getChannels().size());
    c.setChannel(channel);
    String macs = slea.readMapleAsciiString();
    c.updateMacs(macs);

    if (c.hasBannedMac()) {
      c.getSession().close(true);
      return;
    }
    if (c.checkPic(pic)) {
      try {
        if (c.getIdleTask() != null) {
          c.getIdleTask().cancel(true);
        }
        c.updateLoginState(MapleClient.LOGIN_SERVER_TRANSITION);

        String channelServerIP =
            MapleClient.getChannelServerIPFromSubnet(
                c.getSession().getRemoteAddress().toString().replace("/", "").split(":")[0],
                channel);
        if (channelServerIP.equals("0.0.0.0")) {
          String[] socket = Server.getInstance().getIP(world, channel).split(":");

          c.announce(
              MaplePacketCreator.getServerIP(
                  InetAddress.getByName(socket[0]), Integer.parseInt(socket[1]), charId));
        } else {
          String[] socket = Server.getInstance().getIP(world, channel).split(":");
          c.announce(
              MaplePacketCreator.getServerIP(
                  InetAddress.getByName(channelServerIP), Integer.parseInt(socket[1]), charId));
        }
      } catch (UnknownHostException e) {
        log.error("Host not found", e);
      }

    } else {

      c.announce(MaplePacketCreator.wrongPic());
    }
  }
 @Override
 public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
   int id = slea.readShort();
   if (id == -1) { // Cancel Chair
     c.getPlayer().setChair(0);
     c.announce(MaplePacketCreator.cancelChair(-1));
     c.getPlayer()
         .getMap()
         .broadcastMessage(
             c.getPlayer(), MaplePacketCreator.showChair(c.getPlayer().getId(), 0), false);
   } else { // Use In-Map Chair
     c.getPlayer().setChair(id);
     c.announce(MaplePacketCreator.cancelChair(id));
   }
 }
 public static void removeFromSlot(
     final MapleClient c,
     final MapleInventoryType type,
     final short slot,
     final short quantity,
     final boolean fromDrop,
     final boolean consume) {
   final IItem item = c.getPlayer().getInventory(type).getItem(slot);
   final boolean allowZero = consume && InventoryConstants.isRechargable(item.getId());
   c.getPlayer().getInventory(type).removeItem(slot, quantity, allowZero);
   if (item.getQuantity() == 0 && !allowZero) {
     c.announce(InventoryFactory.clearInventoryItem(type, item.getPosition(), fromDrop));
   } else {
     c.announce(InventoryFactory.updateInventorySlot(type, (Item) item, fromDrop));
   }
 }
Example #5
0
 @Override
 public void sendSpawnData(final MapleClient client) {
   if (questid <= 0
       || (client.getPlayer().getQuestStatus(questid) == 1
           && client.getPlayer().needQuestItem(questid, item.getItemId()))) {
     client.announce(
         MaplePacketCreator.dropItemFromMapObject(this, null, getPosition(), (byte) 2));
   }
 }
 public static void drop(MapleClient c, MapleInventoryType type, short src, short quantity) {
   if (src < 0) {
     type = MapleInventoryType.EQUIPPED;
   }
   IItem source = c.getPlayer().getInventory(type).getItem(src);
   int Id = source.getId();
   if (c.getPlayer().getItemEffect() == Id && source.getQuantity() == 1) {
     c.getPlayer().setItemEffect(0);
     c.getPlayer().getMap().broadcastMessage(EffectFactory.itemEffect(c.getPlayer().getId(), 0));
   } else if (Id == 5370000 || Id == 5370001) { // not actually possible
     if (c.getPlayer().getItemQuantity(Id, false) == 1) {
       c.getPlayer().setChalkboard(null);
     }
   } else if ((Id >= 5000000 && Id <= 5000100) || Id == 4031284) {
     c.getPlayer().dropMessage("This item may not be dropped.");
     return;
   }
   if (c.getPlayer().getItemQuantity(Id, true) < quantity
       || quantity < 0
       || source == null
       || source.getFlag() == InventoryConstants.LOCK
       || (quantity == 0 && !InventoryConstants.isRechargable(Id))) {
     return;
   }
   Point dropPos = new Point(c.getPlayer().getPosition());
   if (quantity < source.getQuantity() && !InventoryConstants.isRechargable(Id)) {
     IItem target = source.copy();
     target.setQuantity(quantity);
     source.setQuantity((short) (source.getQuantity() - quantity));
     c.announce(InventoryFactory.dropInventoryItemUpdate(type, source));
     dropItem(c, target, dropPos);
   } else {
     c.getPlayer().getInventory(type).removeSlot(src);
     c.announce(
         InventoryFactory.dropInventoryItem((src < 0 ? MapleInventoryType.EQUIP : type), src));
     if (src < 0) {
       c.getPlayer().equipChanged();
     }
     dropItem(c, source, dropPos);
   }
 }
 public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
   int itemId = slea.readInt();
   if (c.getPlayer().getInventory(MapleInventoryType.SETUP).findById(itemId) == null) {
     return;
   }
   c.getPlayer().setChair(itemId);
   c.getPlayer()
       .getMap()
       .broadcastMessage(
           c.getPlayer(), MaplePacketCreator.showChair(c.getPlayer().getId(), itemId), false);
   c.announce(MaplePacketCreator.enableActions());
 }
  public static void move(
      final MapleClient c, final MapleInventoryType type, final short src, final short dst) {
    if (src < 0 || dst < 0) {
      return;
    }
    final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
    final IItem source = c.getPlayer().getInventory(type).getItem(src);
    final IItem initialTarget = c.getPlayer().getInventory(type).getItem(dst);
    if (source == null) {
      return;
    }

    short olddstQ = -1;
    if (initialTarget != null) {
      olddstQ = initialTarget.getQuantity();
    }
    final short oldsrcQ = source.getQuantity();
    final short slotMax = ii.getSlotMax(c, source.getId());

    c.getPlayer().getInventory(type).move(src, dst, slotMax);
    if (!type.equals(MapleInventoryType.EQUIP)
        && initialTarget != null
        && initialTarget.getId() == source.getId()
        && !InventoryConstants.isRechargable(source.getId())) {
      if ((olddstQ + oldsrcQ) > slotMax) {
        c.announce(
            InventoryFactory.moveAndMergeWithRestInventoryItem(
                type, src, dst, (short) ((olddstQ + oldsrcQ) - slotMax), slotMax));
      } else {
        c.announce(
            InventoryFactory.moveAndMergeInventoryItem(
                type,
                src,
                dst,
                ((Item) c.getPlayer().getInventory(type).getItem(dst)).getQuantity()));
      }
    } else {
      c.announce(InventoryFactory.moveInventoryItem(type, src, dst));
    }
  }
Example #9
0
 public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
   if (!c.getPlayer().isAlive()) {
     c.announce(MaplePacketCreator.enableActions());
     return;
   }
   slea.readInt();
   byte slot = (byte) slea.readShort();
   int itemId = slea.readInt();
   MapleCharacter player = c.getPlayer();
   IItem toUse = c.getPlayer().getInventory(MapleInventoryType.USE).getItem(slot);
   if (toUse != null && toUse.getQuantity() == 1) {
     if (toUse.getItemId() != itemId) {
       return;
     }
     Map<String, Integer> skilldata =
         MapleItemInformationProvider.getInstance()
             .getSkillStats(toUse.getItemId(), c.getPlayer().getJob().getId());
     boolean canuse = false;
     boolean success = false;
     int skill = 0;
     int maxlevel = 0;
     if (skilldata == null) {
       return;
     }
     if (skilldata.get("skillid") == 0) {
       canuse = false;
     } else if (player.getMasterLevel(SkillFactory.getSkill(skilldata.get("skillid")))
             >= skilldata.get("reqSkillLevel")
         || skilldata.get("reqSkillLevel") == 0) {
       canuse = true;
       if (Randomizer.nextInt(101) < skilldata.get("success") && skilldata.get("success") != 0) {
         success = true;
         ISkill skill2 = SkillFactory.getSkill(skilldata.get("skillid"));
         player.changeSkillLevel(
             skill2,
             player.getSkillLevel(skill2),
             Math.max(skilldata.get("masterLevel"), player.getMasterLevel(skill2)),
             -1);
       } else {
         success = false;
         player.message(
             "The skill book lights up, but the skill winds up as if nothing happened.");
       }
       MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, slot, (short) 1, false);
     } else {
       canuse = false;
     }
     player
         .getClient()
         .announce(MaplePacketCreator.skillBookSuccess(player, skill, maxlevel, canuse, success));
   }
 }
Example #10
0
 public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
   byte type = slea.readByte(); // ?
   if (type == 0x01 && c.getGender() == 10) { // Packet shouldn't come if Gender isn't 10.
     c.setGender(slea.readByte());
     c.announce(MaplePacketCreator.getAuthSuccess(c));
     final MapleClient client = c;
     c.setIdleTask(
         TimerManager.getInstance()
             .schedule(
                 new Runnable() {
                   public void run() {
                     client.getSession().close(true);
                   }
                 },
                 600000));
   }
 }
 public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
   int min = slea.readInt();
   int max = slea.readInt();
   slea.readInt(); // members
   int jobs = slea.readInt();
   MapleCharacter chr = c.getPlayer();
   MapleMap map = chr.getMap();
   Collection<MapleMapObject> mapobjs = map.getAllPlayer();
   for (MapleMapObject mapobj : mapobjs) {
     if (chr.getParty().getMembers().size() > 5) {
       break;
     }
     if (mapobj instanceof MapleCharacter) {
       MapleCharacter tchar = (MapleCharacter) mapobj;
       int charlvl = tchar.getLevel();
       if (charlvl >= min && charlvl <= max && isValidJob(tchar.getJob(), jobs)) {
         if (c.getPlayer().getParty() == null) {
           // WorldChannelInterface wci =
           // c.getChannelServer().getWorldInterface();
           MapleParty party = c.getPlayer().getParty();
           party = c.getPlayer().getParty(); // .getParty(partyid);
           if (party != null) {
             if (party.getMembers().size() < 6) {
               // MaplePartyCharacter partyplayer = tchar.getMPC();
               // wci.updateParty(party.getId(),
               // PartyOperation.JOIN, partyplayer);
               c.getPlayer().receivePartyMemberHP();
               c.getPlayer().updatePartyMemberHP();
             } else {
               c.announce(MaplePacketCreator.partyStatusMessage(17));
             }
           }
         }
       }
     }
   }
 }
Example #12
0
 @Override
 public void sendDestroyData(final MapleClient client) {
   client.announce(MaplePacketCreator.removeItemFromMap(getObjectId(), 1, 0));
 }
 public static boolean addById(MapleClient c, int Id, short quantity, String owner, int petid) {
   final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
   final MapleInventoryType type = ii.getInventoryType(Id);
   if (!type.equals(MapleInventoryType.EQUIP)) {
     final short slotMax = ii.getSlotMax(c, Id);
     final List<IItem> existing = c.getPlayer().getInventory(type).listById(Id);
     if (!InventoryConstants.isRechargable(Id)) {
       if (existing.size() > 0) { // first update all existing slots to slotMax
         Iterator<IItem> i = existing.iterator();
         while (quantity > 0) {
           if (i.hasNext()) {
             Item eItem = (Item) i.next();
             short oldQ = eItem.getQuantity();
             if (oldQ < slotMax && (eItem.getOwner().equals(owner) || owner == null)) {
               short newQ = (short) Math.min(oldQ + quantity, slotMax);
               quantity -= (newQ - oldQ);
               eItem.setQuantity(newQ);
               c.announce(InventoryFactory.updateInventorySlot(type, eItem));
             }
           } else {
             break;
           }
         }
       }
       while (quantity > 0 || InventoryConstants.isRechargable(Id)) {
         short newQ = (short) Math.min(quantity, slotMax);
         if (newQ != 0) {
           quantity -= newQ;
           Item nItem = new Item(Id, (short) 0, newQ, petid);
           short newSlot = c.getPlayer().getInventory(type).addItem(nItem);
           if (newSlot == -1) {
             c.announce(InventoryFactory.getInventoryFull());
             c.announce(InventoryFactory.getShowInventoryFull());
             return false;
           }
           if (owner != null) {
             nItem.setOwner(owner);
           }
           c.announce(InventoryFactory.addInventorySlot(type, nItem));
           if ((InventoryConstants.isRechargable(Id)) && quantity == 0) {
             break;
           }
         } else {
           c.announce(IntraPersonalFactory.enableActions());
           return false;
         }
       }
     } else {
       final Item nItem = new Item(Id, (short) 0, quantity);
       final short newSlot = c.getPlayer().getInventory(type).addItem(nItem);
       if (newSlot == -1) {
         c.announce(InventoryFactory.getInventoryFull());
         c.announce(InventoryFactory.getShowInventoryFull());
         return false;
       }
       c.announce(InventoryFactory.addInventorySlot(type, nItem));
       c.announce(IntraPersonalFactory.enableActions());
     }
   } else if (quantity == 1) {
     IItem nEquip = ii.getEquipById(Id);
     if (owner != null) {
       nEquip.setOwner(owner);
     }
     short newSlot = c.getPlayer().getInventory(type).addItem(nEquip);
     if (newSlot == -1) {
       c.announce(InventoryFactory.getInventoryFull());
       c.announce(InventoryFactory.getShowInventoryFull());
       return false;
     }
     c.announce(InventoryFactory.addInventorySlot(type, nEquip));
   } else {
     throw new RuntimeException("Trying to create equip with non-one quantity");
   }
   return true;
 }
 public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
   c.announce(MaplePacketCreator.sendGuestTOS());
   Output.print(slea.toString());
   new LoginPasswordHandler().handlePacket(slea, c);
 }
Example #15
0
 public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
   if (!c.getPlayer().getCashShop().isOpened()) {
     return;
   }
   if (slea.available() > 0) {
     byte op = slea.readByte();
     if (op == 2) { // put item up for sale
       byte itemtype = slea.readByte();
       int itemid = slea.readInt();
       slea.readShort();
       slea.skip(7);
       short stars = 1;
       if (itemtype == 1) {
         slea.skip(32);
       } else {
         stars = slea.readShort();
       }
       slea.readMapleAsciiString(); // another useless thing (owner)
       if (itemtype == 1) {
         slea.skip(32);
       } else {
         slea.readShort();
       }
       byte slot = 1;
       short quantity = 1;
       if (itemtype != 1) {
         if (itemid / 10000 == 207 || itemid / 10000 == 233) {
           slea.skip(8);
         }
         slot = (byte) slea.readInt();
       } else {
         slot = (byte) slea.readInt();
       }
       if (itemtype != 1) {
         if (itemid / 10000 == 207 || itemid / 10000 == 233) {
           quantity = stars;
           slea.skip(4);
         } else {
           quantity = (short) slea.readInt();
         }
       } else {
         quantity = (byte) slea.readInt();
       }
       int price = slea.readInt();
       if (itemtype == 1) {
         quantity = 1;
       }
       if (quantity < 0
           || price < 110
           || c.getPlayer().getItemQuantity(itemid, false) < quantity) {
         return;
       }
       MapleInventoryType type =
           MapleItemInformationProvider.getInstance().getInventoryType(itemid);
       IItem i = c.getPlayer().getInventory(type).getItem(slot).copy();
       if (i != null && c.getPlayer().getMeso() >= 5000) {
         Connection con = DatabaseConnection.getConnection();
         try {
           PreparedStatement ps =
               con.prepareStatement("SELECT COUNT(*) FROM mts_items WHERE seller = ?");
           ps.setInt(1, c.getPlayer().getId());
           ResultSet rs = ps.executeQuery();
           if (rs.next()) {
             if (rs.getInt(1) > 10) { // They have more than 10
               // items up for sale
               // already!
               c.getPlayer().dropMessage(1, "You already have 10 items up for auction!");
               c.announce(getMTS(1, 0, 0));
               c.announce(
                   MaplePacketCreator.transferInventory(getTransfer(c.getPlayer().getId())));
               c.announce(MaplePacketCreator.notYetSoldInv(getNotYetSold(c.getPlayer().getId())));
               rs.close();
               ps.close();
               return;
             }
           }
           rs.close();
           ps.close();
           Calendar calendar = Calendar.getInstance();
           int year = 2008;
           int month = 6;
           int day = 17;
           int oldmax = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
           int oldday = calendar.get(Calendar.DAY_OF_MONTH) + 7;
           if (oldmax < oldday) {
             if (calendar.get(Calendar.MONTH) + 2 > 12) {
               year = calendar.get(Calendar.YEAR) + 1;
               month = 1;
               calendar.set(year, month, 1);
               day = oldday - oldmax;
             } else {
               month = calendar.get(Calendar.MONTH) + 2;
               year = calendar.get(Calendar.YEAR);
               calendar.set(year, month, 1);
               day = oldday - oldmax;
             }
           } else {
             day = calendar.get(Calendar.DAY_OF_MONTH) + 7;
             month = calendar.get(Calendar.MONTH);
             year = calendar.get(Calendar.YEAR);
           }
           String date = year + "-";
           if (month < 10) {
             date += "0" + month + "-";
           } else {
             date += month + "-";
           }
           if (day < 10) {
             date += "0" + day;
           } else {
             date += day + "";
           }
           if (i.getType() == 2) {
             Item item = (Item) i;
             ps =
                 con.prepareStatement(
                     "INSERT INTO mts_items (tab, type, itemid, quantity, seller, price, owner, sellername, sell_ends) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
             ps.setInt(1, 1);
             ps.setInt(2, (int) type.getType());
             ps.setInt(3, item.getItemId());
             ps.setInt(4, quantity);
             ps.setInt(5, c.getPlayer().getId());
             ps.setInt(6, price);
             ps.setString(7, item.getOwner());
             ps.setString(8, c.getPlayer().getName());
             ps.setString(9, date);
           } else {
             Equip equip = (Equip) i;
             ps =
                 con.prepareStatement(
                     "INSERT INTO mts_items (tab, type, itemid, quantity, seller, price, upgradeslots, level, str, dex, `int`, luk, hp, mp, watk, matk, wdef, mdef, acc, avoid, hands, speed, jump, locked, owner, sellername, sell_ends, vicious, flag) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
             ps.setInt(1, 1);
             ps.setInt(2, (int) type.getType());
             ps.setInt(3, equip.getItemId());
             ps.setInt(4, quantity);
             ps.setInt(5, c.getPlayer().getId());
             ps.setInt(6, price);
             ps.setInt(7, equip.getUpgradeSlots());
             ps.setInt(8, equip.getLevel());
             ps.setInt(9, equip.getStr());
             ps.setInt(10, equip.getDex());
             ps.setInt(11, equip.getInt());
             ps.setInt(12, equip.getLuk());
             ps.setInt(13, equip.getHp());
             ps.setInt(14, equip.getMp());
             ps.setInt(15, equip.getWatk());
             ps.setInt(16, equip.getMatk());
             ps.setInt(17, equip.getWdef());
             ps.setInt(18, equip.getMdef());
             ps.setInt(19, equip.getAcc());
             ps.setInt(20, equip.getAvoid());
             ps.setInt(21, equip.getHands());
             ps.setInt(22, equip.getSpeed());
             ps.setInt(23, equip.getJump());
             ps.setInt(24, 0);
             ps.setString(25, equip.getOwner());
             ps.setString(26, c.getPlayer().getName());
             ps.setString(27, date);
             ps.setInt(28, equip.getVicious());
             ps.setInt(29, equip.getFlag());
           }
           ps.executeUpdate();
           ps.close();
           MapleInventoryManipulator.removeFromSlot(c, type, slot, quantity, false);
         } catch (SQLException e) {
         }
         c.getPlayer().gainMeso(-5000, false);
         c.announce(MaplePacketCreator.MTSConfirmSell());
         c.announce(getMTS(1, 0, 0));
         c.announce(MaplePacketCreator.enableCSUse());
         c.announce(MaplePacketCreator.transferInventory(getTransfer(c.getPlayer().getId())));
         c.announce(MaplePacketCreator.notYetSoldInv(getNotYetSold(c.getPlayer().getId())));
       }
     } else if (op == 3) { // send offer for wanted item
     } else if (op == 4) { // list wanted item
       slea.readInt();
       slea.readInt();
       slea.readInt();
       slea.readShort();
       slea.readMapleAsciiString();
     } else if (op == 5) { // change page
       int tab = slea.readInt();
       int type = slea.readInt();
       int page = slea.readInt();
       c.getPlayer().changePage(page);
       if (tab == 4 && type == 0) {
         c.announce(getCart(c.getPlayer().getId()));
       } else if (tab == c.getPlayer().getCurrentTab()
           && type == c.getPlayer().getCurrentType()
           && c.getPlayer().getSearch() != null) {
         c.announce(
             getMTSSearch(
                 tab, type, c.getPlayer().getCurrentCI(), c.getPlayer().getSearch(), page));
       } else {
         c.getPlayer().setSearch(null);
         c.announce(getMTS(tab, type, page));
       }
       c.getPlayer().changeTab(tab);
       c.getPlayer().changeType(type);
       c.announce(MaplePacketCreator.enableCSUse());
       c.announce(MaplePacketCreator.transferInventory(getTransfer(c.getPlayer().getId())));
       c.announce(MaplePacketCreator.notYetSoldInv(getNotYetSold(c.getPlayer().getId())));
     } else if (op == 6) { // search
       int tab = slea.readInt();
       int type = slea.readInt();
       slea.readInt();
       int ci = slea.readInt();
       String search = slea.readMapleAsciiString();
       c.getPlayer().setSearch(search);
       c.getPlayer().changeTab(tab);
       c.getPlayer().changeType(type);
       c.getPlayer().changeCI(ci);
       c.announce(MaplePacketCreator.enableCSUse());
       c.announce(MaplePacketCreator.enableActions());
       c.announce(getMTSSearch(tab, type, ci, search, c.getPlayer().getCurrentPage()));
       c.announce(MaplePacketCreator.showMTSCash(c.getPlayer()));
       c.announce(MaplePacketCreator.transferInventory(getTransfer(c.getPlayer().getId())));
       c.announce(MaplePacketCreator.notYetSoldInv(getNotYetSold(c.getPlayer().getId())));
     } else if (op == 7) { // cancel sale
       int id = slea.readInt(); // id of the item
       Connection con = DatabaseConnection.getConnection();
       try {
         PreparedStatement ps =
             con.prepareStatement("UPDATE mts_items SET transfer = 1 WHERE id = ? AND seller = ?");
         ps.setInt(1, id);
         ps.setInt(2, c.getPlayer().getId());
         ps.executeUpdate();
         ps.close();
         ps = con.prepareStatement("DELETE FROM mts_cart WHERE itemid = ?");
         ps.setInt(1, id);
         ps.executeUpdate();
         ps.close();
       } catch (SQLException e) {
         e.printStackTrace();
       }
       c.announce(MaplePacketCreator.enableCSUse());
       c.announce(
           getMTS(
               c.getPlayer().getCurrentTab(),
               c.getPlayer().getCurrentType(),
               c.getPlayer().getCurrentPage()));
       c.announce(MaplePacketCreator.notYetSoldInv(getNotYetSold(c.getPlayer().getId())));
       c.announce(MaplePacketCreator.transferInventory(getTransfer(c.getPlayer().getId())));
     } else if (op == 8) { // transfer item from transfer inv.
       int id = slea.readInt(); // id of the item
       Connection con = DatabaseConnection.getConnection();
       PreparedStatement ps;
       ResultSet rs;
       try {
         ps =
             con.prepareStatement(
                 "SELECT * FROM mts_items WHERE seller = ? AND transfer = 1  AND id= ? ORDER BY id DESC");
         ps.setInt(1, c.getPlayer().getId());
         ps.setInt(2, id);
         rs = ps.executeQuery();
         if (rs.next()) {
           IItem i;
           if (rs.getInt("type") != 1) {
             Item ii = new Item(rs.getInt("itemid"), (byte) 0, (short) rs.getInt("quantity"));
             ii.setOwner(rs.getString("owner"));
             ii.setPosition(
                 c.getPlayer()
                     .getInventory(
                         MapleItemInformationProvider.getInstance()
                             .getInventoryType(rs.getInt("itemid")))
                     .getNextFreeSlot());
             i = ii.copy();
           } else {
             Equip equip = new Equip(rs.getInt("itemid"), (byte) rs.getInt("position"), -1);
             equip.setOwner(rs.getString("owner"));
             equip.setQuantity((short) 1);
             equip.setAcc((short) rs.getInt("acc"));
             equip.setAvoid((short) rs.getInt("avoid"));
             equip.setDex((short) rs.getInt("dex"));
             equip.setHands((short) rs.getInt("hands"));
             equip.setHp((short) rs.getInt("hp"));
             equip.setInt((short) rs.getInt("int"));
             equip.setJump((short) rs.getInt("jump"));
             equip.setLuk((short) rs.getInt("luk"));
             equip.setMatk((short) rs.getInt("matk"));
             equip.setMdef((short) rs.getInt("mdef"));
             equip.setMp((short) rs.getInt("mp"));
             equip.setSpeed((short) rs.getInt("speed"));
             equip.setStr((short) rs.getInt("str"));
             equip.setWatk((short) rs.getInt("watk"));
             equip.setWdef((short) rs.getInt("wdef"));
             equip.setUpgradeSlots((byte) rs.getInt("upgradeslots"));
             equip.setLevel((byte) rs.getInt("level"));
             equip.setVicious((byte) rs.getInt("vicious"));
             equip.setFlag((byte) rs.getInt("flag"));
             equip.setPosition(
                 c.getPlayer()
                     .getInventory(
                         MapleItemInformationProvider.getInstance()
                             .getInventoryType(rs.getInt("itemid")))
                     .getNextFreeSlot());
             i = equip.copy();
           }
           PreparedStatement pse =
               con.prepareStatement(
                   "DELETE FROM mts_items WHERE id = ? AND seller = ? AND transfer = 1");
           pse.setInt(1, id);
           pse.setInt(2, c.getPlayer().getId());
           pse.executeUpdate();
           pse.close();
           MapleInventoryManipulator.addFromDrop(c, i, false);
           c.announce(MaplePacketCreator.enableCSUse());
           c.announce(getCart(c.getPlayer().getId()));
           c.announce(
               getMTS(
                   c.getPlayer().getCurrentTab(),
                   c.getPlayer().getCurrentType(),
                   c.getPlayer().getCurrentPage()));
           c.announce(MaplePacketCreator.MTSConfirmTransfer(i.getQuantity(), i.getPosition()));
           c.announce(MaplePacketCreator.transferInventory(getTransfer(c.getPlayer().getId())));
         }
         rs.close();
         ps.close();
       } catch (SQLException e) {
         Output.print("MTS Transfer error: " + e);
       }
     } else if (op == 9) { // add to cart
       int id = slea.readInt(); // id of the item
       Connection con = DatabaseConnection.getConnection();
       try {
         PreparedStatement ps1 =
             con.prepareStatement("SELECT * FROM mts_items WHERE id = ? AND seller <> ?");
         ps1.setInt(1, id); // Previene que agregues al cart tus
         // propios items
         ps1.setInt(2, c.getPlayer().getId());
         ResultSet rs1 = ps1.executeQuery();
         if (rs1.next()) {
           PreparedStatement ps =
               con.prepareStatement("SELECT * FROM mts_cart WHERE cid = ? AND itemid = ?");
           ps.setInt(1, c.getPlayer().getId());
           ps.setInt(2, id);
           ResultSet rs = ps.executeQuery();
           if (!rs.next()) {
             PreparedStatement pse =
                 con.prepareStatement("INSERT INTO mts_cart (cid, itemid) VALUES (?, ?)");
             pse.setInt(1, c.getPlayer().getId());
             pse.setInt(2, id);
             pse.executeUpdate();
             pse.close();
           }
           rs.close();
         }
         rs1.close();
       } catch (SQLException e) {
         e.printStackTrace();
       }
       c.announce(
           getMTS(
               c.getPlayer().getCurrentTab(),
               c.getPlayer().getCurrentType(),
               c.getPlayer().getCurrentPage()));
       c.announce(MaplePacketCreator.enableCSUse());
       c.announce(MaplePacketCreator.enableActions());
       c.announce(MaplePacketCreator.transferInventory(getTransfer(c.getPlayer().getId())));
       c.announce(MaplePacketCreator.notYetSoldInv(getNotYetSold(c.getPlayer().getId())));
     } else if (op == 10) { // delete from cart
       int id = slea.readInt(); // id of the item
       Connection con = DatabaseConnection.getConnection();
       try {
         PreparedStatement ps =
             con.prepareStatement("DELETE FROM mts_cart WHERE itemid = ? AND cid = ?");
         ps.setInt(1, id);
         ps.setInt(2, c.getPlayer().getId());
         ps.executeUpdate();
         ps.close();
       } catch (SQLException e) {
         e.printStackTrace();
       }
       c.announce(getCart(c.getPlayer().getId()));
       c.announce(MaplePacketCreator.enableCSUse());
       c.announce(MaplePacketCreator.transferInventory(getTransfer(c.getPlayer().getId())));
       c.announce(MaplePacketCreator.notYetSoldInv(getNotYetSold(c.getPlayer().getId())));
     } else if (op == 12) { // put item up for auction
     } else if (op == 13) { // cancel wanted cart thing
     } else if (op == 14) { // buy auction item now
     } else if (op == 16) { // buy
       int id = slea.readInt(); // id of the item
       Connection con = DatabaseConnection.getConnection();
       PreparedStatement ps;
       ResultSet rs;
       try {
         ps = con.prepareStatement("SELECT * FROM mts_items WHERE id = ? ORDER BY id DESC");
         ps.setInt(1, id);
         rs = ps.executeQuery();
         if (rs.next()) {
           int price = rs.getInt("price") + 100 + (int) (rs.getInt("price") * 0.1); // taxes
           if (c.getPlayer().getCashShop().getCash(4) >= price) { // FIX
             boolean alwaysnull = true;
             for (Channel cserv : Server.getInstance().getAllChannels()) {
               MapleCharacter victim =
                   cserv.getPlayerStorage().getCharacterById(rs.getInt("seller"));
               if (victim != null) {
                 victim.getCashShop().gainCash(4, rs.getInt("price"));
                 alwaysnull = false;
               }
             }
             if (alwaysnull) {
               PreparedStatement pse =
                   con.prepareStatement("SELECT accountid FROM characters WHERE id = ?");
               pse.setInt(1, rs.getInt("seller"));
               ResultSet rse = pse.executeQuery();
               if (rse.next()) {
                 PreparedStatement psee =
                     con.prepareStatement(
                         "UPDATE accounts SET nxPrepaid = nxPrepaid + ? WHERE id = ?");
                 psee.setInt(1, rs.getInt("price"));
                 psee.setInt(2, rse.getInt("accountid"));
                 psee.executeUpdate();
                 psee.close();
               }
               pse.close();
               rse.close();
             }
             PreparedStatement pse =
                 con.prepareStatement(
                     "UPDATE mts_items SET seller = ?, transfer = 1 WHERE id = ?");
             pse.setInt(1, c.getPlayer().getId());
             pse.setInt(2, id);
             pse.executeUpdate();
             pse.close();
             pse = con.prepareStatement("DELETE FROM mts_cart WHERE itemid = ?");
             pse.setInt(1, id);
             pse.executeUpdate();
             pse.close();
             c.getPlayer().getCashShop().gainCash(4, -price);
             c.announce(MaplePacketCreator.enableCSUse());
             c.announce(
                 getMTS(
                     c.getPlayer().getCurrentTab(),
                     c.getPlayer().getCurrentType(),
                     c.getPlayer().getCurrentPage()));
             c.announce(MaplePacketCreator.MTSConfirmBuy());
             c.announce(MaplePacketCreator.showMTSCash(c.getPlayer()));
             c.announce(MaplePacketCreator.transferInventory(getTransfer(c.getPlayer().getId())));
             c.announce(MaplePacketCreator.notYetSoldInv(getNotYetSold(c.getPlayer().getId())));
             c.announce(MaplePacketCreator.enableActions());
           } else {
             c.announce(MaplePacketCreator.MTSFailBuy());
           }
         }
         rs.close();
         ps.close();
       } catch (SQLException e) {
         c.announce(MaplePacketCreator.MTSFailBuy());
       }
     } else if (op == 17) { // buy from cart
       int id = slea.readInt(); // id of the item
       Connection con = DatabaseConnection.getConnection();
       PreparedStatement ps;
       ResultSet rs;
       try {
         ps = con.prepareStatement("SELECT * FROM mts_items WHERE id = ? ORDER BY id DESC");
         ps.setInt(1, id);
         rs = ps.executeQuery();
         if (rs.next()) {
           int price = rs.getInt("price") + 100 + (int) (rs.getInt("price") * 0.1);
           if (c.getPlayer().getCashShop().getCash(4) >= price) {
             for (Channel cserv : Server.getInstance().getAllChannels()) {
               MapleCharacter victim =
                   cserv.getPlayerStorage().getCharacterById(rs.getInt("seller"));
               if (victim != null) {
                 victim.getCashShop().gainCash(4, rs.getInt("price"));
               } else {
                 PreparedStatement pse =
                     con.prepareStatement("SELECT accountid FROM characters WHERE id = ?");
                 pse.setInt(1, rs.getInt("seller"));
                 ResultSet rse = pse.executeQuery();
                 if (rse.next()) {
                   PreparedStatement psee =
                       con.prepareStatement(
                           "UPDATE accounts SET nxPrepaid = nxPrepaid + ? WHERE id = ?");
                   psee.setInt(1, rs.getInt("price"));
                   psee.setInt(2, rse.getInt("accountid"));
                   psee.executeUpdate();
                   psee.close();
                 }
                 pse.close();
                 rse.close();
               }
             }
             PreparedStatement pse =
                 con.prepareStatement(
                     "UPDATE mts_items SET seller = ?, transfer = 1 WHERE id = ?");
             pse.setInt(1, c.getPlayer().getId());
             pse.setInt(2, id);
             pse.executeUpdate();
             pse.close();
             pse = con.prepareStatement("DELETE FROM mts_cart WHERE itemid = ?");
             pse.setInt(1, id);
             pse.executeUpdate();
             pse.close();
             c.getPlayer().getCashShop().gainCash(4, -price);
             c.announce(getCart(c.getPlayer().getId()));
             c.announce(MaplePacketCreator.enableCSUse());
             c.announce(MaplePacketCreator.MTSConfirmBuy());
             c.announce(MaplePacketCreator.showMTSCash(c.getPlayer()));
             c.announce(MaplePacketCreator.transferInventory(getTransfer(c.getPlayer().getId())));
             c.announce(MaplePacketCreator.notYetSoldInv(getNotYetSold(c.getPlayer().getId())));
           } else {
             c.announce(MaplePacketCreator.MTSFailBuy());
           }
         }
         rs.close();
         ps.close();
       } catch (SQLException e) {
         c.announce(MaplePacketCreator.MTSFailBuy());
       }
     } else {
       System.out.println("Unhandled OP(MTS): " + op + " Packet: " + slea.toString());
     }
   } else {
     c.announce(MaplePacketCreator.showMTSCash(c.getPlayer()));
   }
 }
 public static boolean addFromDrop(
     final MapleClient c, final IItem item, final boolean show, final boolean showAnyMessage) {
   final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
   if (ii.isPickupRestricted(item.getId())
       && c.getPlayer().getItemQuantity(item.getId(), true) > 0
       && showAnyMessage) {
     c.announce(InventoryFactory.getInventoryFull());
     c.announce(InventoryFactory.showItemUnavailable());
     return false;
   }
   final MapleInventoryType type = ii.getInventoryType(item.getId());
   short quantity = item.getQuantity();
   if (!type.equals(MapleInventoryType.EQUIP)) {
     final short slotMax = ii.getSlotMax(c, item.getId());
     final List<IItem> existing = c.getPlayer().getInventory(type).listById(item.getId());
     if (!InventoryConstants.isRechargable(item.getId())) {
       if (existing.size() > 0) { // first update all existing slots to slotMax
         Iterator<IItem> i = existing.iterator();
         while (quantity > 0) {
           if (i.hasNext()) {
             final Item eItem = (Item) i.next();
             final short oldQ = eItem.getQuantity();
             if (oldQ < slotMax && item.getOwner().equals(eItem.getOwner())) {
               short newQ = (short) Math.min(oldQ + quantity, slotMax);
               quantity -= (newQ - oldQ);
               eItem.setQuantity(newQ);
               short newQi = (short) Math.min(quantity, slotMax);
               quantity -= newQi;
               Item nItem = new Item(item.getId(), (short) 0, newQi);
               nItem.setOwner(item.getOwner());
               if (c.getPlayer().getInventory(type).fakeAddItem(nItem) == -1) {
                 eItem.setQuantity(oldQ);
                 return false;
               }
               quantity += newQi;
               c.announce(InventoryFactory.updateInventorySlot(type, eItem, showAnyMessage));
             }
           } else {
             break;
           }
         }
       }
       while (quantity > 0 || InventoryConstants.isRechargable(item.getId())) {
         final short newQ = (short) Math.min(quantity, slotMax);
         quantity -= newQ;
         final Item nItem = new Item(item.getId(), (short) 0, newQ);
         nItem.setOwner(item.getOwner());
         final short newSlot = c.getPlayer().getInventory(type).addItem(nItem);
         if (newSlot == -1) {
           if (showAnyMessage) {
             c.announce(InventoryFactory.getInventoryFull());
             c.announce(InventoryFactory.getShowInventoryFull());
           }
           item.setQuantity((short) (quantity + newQ));
           return false;
         }
         c.announce(InventoryFactory.addInventorySlot(type, nItem, true));
         if ((InventoryConstants.isRechargable(item.getId())) && quantity == 0) {
           break;
         }
       }
     } else {
       final Item nItem = new Item(item.getId(), (short) 0, quantity);
       final short newSlot = c.getPlayer().getInventory(type).addItem(nItem);
       if (newSlot == -1) {
         if (showAnyMessage) {
           c.announce(InventoryFactory.getInventoryFull());
           c.announce(InventoryFactory.getShowInventoryFull());
         }
         return false;
       }
       c.announce(InventoryFactory.addInventorySlot(type, nItem));
       c.announce(IntraPersonalFactory.enableActions());
     }
   } else if (quantity == 1) {
     final short newSlot = c.getPlayer().getInventory(type).addItem(item);
     if (newSlot == -1) {
       if (showAnyMessage) {
         c.announce(InventoryFactory.getInventoryFull());
         c.announce(InventoryFactory.getShowInventoryFull());
       }
       return false;
     }
     c.announce(InventoryFactory.addInventorySlot(type, item, true));
   } else {
     return false;
   }
   if (show) {
     c.announce(EffectFactory.getShowItemGain(item.getId(), item.getQuantity()));
   }
   return true;
 }
Example #17
0
 public void buy(MapleClient c, int item, short quantity) {
   MaplePlayerShopItem pItem = items.get(item);
   synchronized (items) {
     IItem newItem = pItem.getItem().copy();
     newItem.setQuantity((short) ((pItem.getItem().getQuantity() * quantity)));
     if ((newItem.getFlag() & ItemConstants.KARMA) == ItemConstants.KARMA) {
       newItem.setFlag((byte) (newItem.getFlag() ^ ItemConstants.KARMA));
     }
     if (newItem.getType() == IItem.ITEM
         && (newItem.getFlag() & ItemConstants.SPIKES) == ItemConstants.SPIKES) {
       newItem.setFlag((byte) (newItem.getFlag() ^ ItemConstants.SPIKES));
     }
     if (quantity < 1
         || pItem.getBundles() < 1
         || !pItem.isExist()
         || pItem.getBundles() < quantity) {
       c.announce(MaplePacketCreator.enableActions());
       return;
     } else if (newItem.getType() == 1 && newItem.getQuantity() > 1) {
       c.announce(MaplePacketCreator.enableActions());
       return;
     } else if (!pItem.isExist()) {
       c.announce(MaplePacketCreator.enableActions());
       return;
     }
     int price = pItem.getPrice() * quantity;
     if (c.getPlayer().getMeso() >= price) {
       if (MapleInventoryManipulator.addFromDrop(c, newItem, true)) {
         c.getPlayer().gainMeso(-price, false);
         sold.add(
             new SoldItem(c.getPlayer().getName(), pItem.getItem().getItemId(), quantity, price));
         pItem.setBundles((short) (pItem.getBundles() - quantity));
         if (pItem.getBundles() < 1) {
           pItem.setDoesExist(false);
         }
         MapleCharacter owner =
             Server.getInstance().getWorld(world).getPlayerStorage().getCharacterByName(ownerName);
         if (owner != null) {
           owner.addMerchantMesos(price);
         } else {
           try {
             PreparedStatement ps =
                 DatabaseConnection.getConnection()
                     .prepareStatement(
                         "UPDATE characters SET MerchantMesos = MerchantMesos + "
                             + price
                             + " WHERE id = ?",
                         Statement.RETURN_GENERATED_KEYS);
             ps.setInt(1, ownerId);
             ps.executeUpdate();
             ps.close();
           } catch (Exception e) {
           }
         }
       } else {
         c.getPlayer()
             .dropMessage(
                 1, "Your inventory is full. Please clean a slot before buying this item.");
       }
     } else {
       c.getPlayer().dropMessage(1, "You do not have enough mesos.");
     }
     try {
       this.saveItems(false);
     } catch (Exception e) {
     }
   }
 }
 public static void equip(final MapleClient c, final short src, short dst) {
   Equip source = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(src);
   Equip target = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(dst);
   if (dst == -12 && target != null) {
     if (c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((short) -13) == null) {
       dst = (short) -13;
       target = null;
     }
     for (int i = 0; i < 2; i++) {
       if (c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((short) (i - 16))
           == null) {
         dst = (short) (i - 16);
         target = null;
       }
     }
     if (target != null) {
       return;
     }
   }
   if (isPE(source.getId(), dst)
       || source == null
       || (MapleItemInformationProvider.getInstance().getReqLevel(source.getId())
               > c.getPlayer().getLevel()
           && c.getPlayer().gmLevel() < 1)
       || (((source.getId() >= 1902000 && source.getId() <= 1902002) || source.getId() == 1912000)
           && c.getPlayer().getJobType() != 0)
       || (((source.getId() >= 1902005 && source.getId() <= 1902007) || source.getId() == 1912005)
           && c.getPlayer().getJobType() != 1)
       || (((source.getId() >= 1902015 && source.getId() <= 1902018) || source.getId() == 1912011)
           && !c.getPlayer().isAran())) {
     return;
   }
   if (MapleItemInformationProvider.getInstance().isUntradeableOnEquip(source.getId())) {
     source.setFlag((byte) InventoryConstants.UNTRADEABLE);
     c.announce(InventoryFactory.updateSlot(source));
   }
   if (dst == -6) { // unequip the overall
     final IItem top = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((short) -5);
     if (top != null && isOverall(top.getId())) {
       if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
         c.announce(InventoryFactory.getInventoryFull());
         c.announce(InventoryFactory.getShowInventoryFull());
         return;
       }
       unequip(
           c, (short) -5, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
     }
   } else if (dst == -5) { // equip overall
     final IItem bottom =
         c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((short) -6);
     if (bottom != null && isOverall(source.getId())) {
       if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
         c.announce(InventoryFactory.getInventoryFull());
         c.announce(InventoryFactory.getShowInventoryFull());
         return;
       }
       unequip(
           c, (short) -6, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
     }
   } else if (dst == -10) { // check if weapon is two-handed
     final IItem weapon =
         c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((short) -11);
     if (weapon != null
         && MapleItemInformationProvider.getInstance().isTwoHanded(weapon.getId())) {
       if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
         c.announce(InventoryFactory.getInventoryFull());
         c.announce(InventoryFactory.getShowInventoryFull());
         return;
       }
       unequip(
           c, (short) -11, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
     }
   } else if (dst == -11) { // unequip shield
     final IItem shield =
         c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((short) -10);
     if (shield != null
         && MapleItemInformationProvider.getInstance().isTwoHanded(source.getId())) {
       if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
         c.announce(InventoryFactory.getInventoryFull());
         c.announce(InventoryFactory.getShowInventoryFull());
         return;
       }
       unequip(
           c, (short) -10, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
     }
   }
   if (dst == -18) {
     if (c.getPlayer().getMount() != null) {
       c.getPlayer().getMount().setId(source.getId());
     }
   }
   c.getPlayer().getInventory(MapleInventoryType.EQUIP).removeSlot(src);
   if (target != null) {
     c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).removeSlot(dst);
   }
   source.setPosition(dst);
   c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).addFromDB(source);
   if (target != null) {
     target.setPosition(src);
     c.getPlayer().getInventory(MapleInventoryType.EQUIP).addFromDB(target);
   }
   if (c.getPlayer().getBuffedValue(MapleBuffStat.BOOSTER) != null && isWeapon(source.getId())) {
     c.getPlayer().cancelBuffStats(MapleBuffStat.BOOSTER);
   }
   c.announce(InventoryFactory.moveInventoryItem(MapleInventoryType.EQUIP, src, dst, (byte) 2));
   c.getPlayer().equipChanged();
   if (source.getId() >= 1112001 && source.getId() <= 1112006) {
     c.getPlayer().setMarriageRing(MapleRing.loadFromDB(c.getPlayer()));
     c.announce(IntraPersonalFactory.getCharInfo(c.getPlayer()));
     c.getPlayer().getMap().removePlayer(c.getPlayer());
     c.getPlayer().getMap().addPlayer(c.getPlayer());
   }
 }
Example #19
0
  public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
    slea.readInt(); // whatever...
    byte slot = (byte) slea.readShort();
    byte dst = (byte) slea.readShort();
    byte ws = (byte) slea.readShort();
    boolean whiteScroll = false; // white scroll being used?
    boolean legendarySpirit = false; // legendary spirit skill
    if ((ws & 2) == 2) {
      whiteScroll = true;
    }
    MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
    IEquip toScroll = (IEquip) c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(dst);
    ISkill LegendarySpirit = SkillFactory.getSkill(1003);
    if (c.getPlayer().getSkillLevel(LegendarySpirit) > 0 && dst >= 0) {
      legendarySpirit = true;
      toScroll = (IEquip) c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(dst);
    }
    byte oldLevel = toScroll.getLevel();
    if (((IEquip) toScroll).getUpgradeSlots() < 1) {
      c.announce(MaplePacketCreator.getInventoryFull());
      return;
    }
    MapleInventory useInventory = c.getPlayer().getInventory(MapleInventoryType.USE);
    IItem scroll = useInventory.getItem(slot);
    IItem wscroll = null;
    List<Integer> scrollReqs = ii.getScrollReqs(scroll.getItemId());
    if (scrollReqs.size() > 0 && !scrollReqs.contains(toScroll.getItemId())) {
      c.announce(MaplePacketCreator.getInventoryFull());
      return;
    }
    if (whiteScroll) {
      wscroll = useInventory.findById(2340000);
      if (wscroll == null || wscroll.getItemId() != 2340000) {
        whiteScroll = false;
      }
    }
    if (scroll.getItemId() != 2049100 && !isCleanSlate(scroll.getItemId())) {
      if (!canScroll(scroll.getItemId(), toScroll.getItemId())) {
        return;
      }
    }
    if (scroll.getQuantity() < 1) {
      return;
    }
    try {
      IEquip scrolled = null;
      ScrollResult scrollSuccess = null;
      int sExpAdd = 0;
      Enchantment enchantment =
          (Enchantment) c.getPlayer().getPowerSkill(PowerSkillType.ENCHANTMENT);
      boolean isMultiScroll = enchantment.getMultiScrollChance() > Randomizer.nextFloat();
      int scrollMulti = 1 + (isMultiScroll ? enchantment.getMultiScrollAmount() : 0);
      if (scrollMulti > 1) sExpAdd += Randomizer.rand(0, 4);
      boolean removeSlot = enchantment.getNoSlotUse() > Randomizer.nextFloat();
      if (scrollMulti > scroll.getQuantity()) {
        scrollMulti = scroll.getQuantity();
      }
      int scrollCount = 0;
      while (scroll.getQuantity() > 0 && scrollMulti > 0) {
        scrollMulti--;
        scrollCount++;
        int scrollRerolls = enchantment.getRerolls();
        sExpAdd += scrollRerolls;

        float statMultiplier = 1 + enchantment.getExtraStats();
        if (statMultiplier > 1) sExpAdd++;

        scrolled =
            (IEquip)
                ii.scrollEquipWithId(
                    toScroll,
                    scroll.getItemId(),
                    whiteScroll,
                    removeSlot,
                    scrollRerolls,
                    statMultiplier,
                    c.getPlayer().isGM());

        if (scrolled != null && enchantment.getDoubleScroll() > Randomizer.nextFloat()) {
          scrolled =
              (IEquip)
                  ii.scrollEquipWithId(
                      scrolled,
                      scroll.getItemId(),
                      whiteScroll,
                      removeSlot,
                      scrollRerolls,
                      statMultiplier,
                      c.getPlayer().isGM());
        }

        scrollSuccess = IEquip.ScrollResult.FAIL; // fail
        if (scrolled == null) {
          scrollSuccess = IEquip.ScrollResult.CURSE;
        } else if (scrolled.getLevel() > oldLevel
            || (isCleanSlate(scroll.getItemId()) && scrolled.getLevel() == oldLevel + 1)) {
          scrollSuccess = IEquip.ScrollResult.SUCCESS;
        }
        useInventory.removeItem(scroll.getPosition(), (short) 1, false);
        if (whiteScroll) {
          useInventory.removeItem(wscroll.getPosition(), (short) 1, false);
          if (wscroll.getQuantity() < 1) {
            c.announce(
                MaplePacketCreator.clearInventoryItem(
                    MapleInventoryType.USE, wscroll.getPosition(), false));
          } else {
            c.announce(
                MaplePacketCreator.updateInventorySlot(MapleInventoryType.USE, (Item) wscroll));
          }
        }
        c.getPlayer()
            .getMap()
            .broadcastMessage(
                MaplePacketCreator.getScrollEffect(
                    c.getPlayer().getId(), scrollSuccess, legendarySpirit));
        if (scrollSuccess == IEquip.ScrollResult.CURSE) {
          break;
        }
      }
      if (scrollSuccess == IEquip.ScrollResult.CURSE) {
        scrollMulti = 0;
        c.announce(MaplePacketCreator.scrolledItem(scroll, toScroll, true));
        if (dst < 0) {
          c.getPlayer()
              .getInventory(MapleInventoryType.EQUIPPED)
              .removeItem(toScroll.getPosition());
        } else {
          c.getPlayer().getInventory(MapleInventoryType.EQUIP).removeItem(toScroll.getPosition());
        }
      } else {
        c.announce(MaplePacketCreator.scrolledItem(scroll, scrolled, false));
      }
      if (dst < 0
          && (scrollSuccess == IEquip.ScrollResult.SUCCESS
              || scrollSuccess == IEquip.ScrollResult.CURSE)) {
        c.getPlayer().equipChanged();
      }
      // sExpAdd /= initMulti;
      if (scrollCount > 1)
        c.getPlayer().message("You have successfully multi-scrolled " + scrollCount + " times!");
      c.getPlayer().addPowerSkillExp(PowerSkillType.ENCHANTMENT, sExpAdd + Randomizer.nextInt(4));
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }