/*	TODO:
   *	1. Move the equpping into a function.
   */
  @Override
  public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
    c.getPlayer().resetAfkTime();
    slea.readInt();
    byte slot = slea.readByte();
    slea.readByte();
    boolean lead = slea.readByte() == 1;
    MapleCharacter player = c.getPlayer();
    IItem item = player.getInventory(MapleInventoryType.CASH).getItem(slot);

    if (item.getItemId() == 5000028 || item.getItemId() == 5000047) {
      boolean done = false;
      int petno;
      int[] pet;
      int[] dragon = {5000029, 5000030, 5000031, 5000032, 5000033};
      int[] robot = {5000048, 5000049, 5000050, 5000051, 5000052, 5000053};

      pet = item.getItemId() == 5000028 ? dragon : robot;
      Random egg = new Random();
      for (int i = 0; i < pet.length && !done; i++) {
        petno = egg.nextInt(pet.length);
        if (!player.haveItem(pet[petno], 1, true, true)) {
          MapleInventoryManipulator.removeFromSlot(
              c, MapleInventoryType.CASH, item.getPosition(), (short) 1, true, false);
          MapleInventoryManipulator.addById(
              c, pet[petno], (short) 1, null, MaplePet.createPet(pet[petno]));
          done = true;
        }
      }
      if (!done) {
        player.dropMessage(1, "You currently have all the dragons or robots.");
        return;
      }
    }
    // New instance of MaplePet - using the item ID and unique pet ID
    MaplePet pet =
        MaplePet.loadFromDb(
            player.getInventory(MapleInventoryType.CASH).getItem(slot).getItemId(),
            slot,
            player.getInventory(MapleInventoryType.CASH).getItem(slot).getPetId());

    if (pet == null) {
      MapleInventoryManipulator.removeById(
          c, MapleInventoryType.CASH, item.getItemId(), (short) item.getQuantity(), false, false);
      c.getSession().write(MaplePacketCreator.enableActions());
      return;
    }
    // Assign the pet to the player, set stats
    if (player.getPetIndex(pet) != -1) {
      player.unequipPet(pet, true);
    } else {
      if (player.getSkillLevel(SkillFactory.getSkill(8)) == 0 && player.getPet(0) != null) {
        player.unequipPet(player.getPet(0), false);
      }
      if (lead) {
        player.shiftPetsRight();
      }
      Point pos = player.getPosition();
      pos.y -= 12;
      pet.setPos(pos);
      pet.setFh(player.getMap().getFootholds().findBelow(pet.getPos()).getId());
      pet.setStance(0);

      player.addPet(pet);
      // Broadcast packet to the map...
      player
          .getMap()
          .broadcastMessage(player, MaplePacketCreator.showPet(player, pet, false), true);
      // Find the pet's unique ID
      int uniqueid = pet.getUniqueId();
      // Make a new List for the stat update
      List<Pair<MapleStat, Integer>> stats = new ArrayList<Pair<MapleStat, Integer>>();
      stats.add(new Pair<MapleStat, Integer>(MapleStat.PET, Integer.valueOf(uniqueid)));
      // Write the stat update to the player...
      c.getSession().write(MaplePacketCreator.petStatUpdate(player));
      c.getSession().write(MaplePacketCreator.enableActions());
      // Get the data
      int hunger = PetDataFactory.getHunger(pet.getItemId());
      // Start the fullness schedule
      player.startFullnessSchedule(hunger, pet, player.getPetIndex(pet));
    }
  }
  public static boolean addById(
      MapleClient c, int itemId, short quantity, String owner, int petid) {
    if (quantity >= 4000 || quantity < 0) {
      AutobanManager.getInstance()
          .autoban(c.getPlayer().getClient(), "PE Item: " + quantity + "x " + itemId);
      return false;
    }
    MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
    MapleInventoryType type = ii.getInventoryType(itemId);
    if (!type.equals(MapleInventoryType.EQUIP)) {
      short slotMax = ii.getSlotMax(c, itemId);
      List<IItem> existing = c.getPlayer().getInventory(type).listById(itemId);
      if (!ii.isThrowingStar(itemId) && !ii.isBullet(itemId)) {
        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.getSession().write(MaplePacketCreator.updateInventorySlot(type, eItem));
              }
            } else {
              break;
            }
          }
        }
        // add new slots if there is still something left
        while (quantity > 0 || ii.isThrowingStar(itemId) || ii.isBullet(itemId)) {
          short newQ = (short) Math.min(quantity, slotMax);
          if (newQ != 0) {
            quantity -= newQ;
            Item nItem = new Item(itemId, (byte) 0, newQ, petid);
            byte newSlot = c.getPlayer().getInventory(type).addItem(nItem);
            if (newSlot == -1) {
              c.getSession().write(MaplePacketCreator.getInventoryFull());
              c.getSession().write(MaplePacketCreator.getShowInventoryFull());
              return false;
            }
            if (owner != null) {
              nItem.setOwner(owner);
            }
            c.getSession().write(MaplePacketCreator.addInventorySlot(type, nItem));
            if ((ii.isThrowingStar(itemId) || ii.isBullet(itemId)) && quantity == 0) {
              break;
            }
          } else {
            c.getSession().write(MaplePacketCreator.enableActions());
            return false;
          }
        }
      } else {
        // Throwing Stars and Bullets - Add all into one slot regardless of quantity.
        Item nItem = new Item(itemId, (byte) 0, quantity);
        byte newSlot = c.getPlayer().getInventory(type).addItem(nItem);

        if (newSlot == -1) {
          c.getSession().write(MaplePacketCreator.getInventoryFull());
          c.getSession().write(MaplePacketCreator.getShowInventoryFull());
          return false;
        }
        c.getSession().write(MaplePacketCreator.addInventorySlot(type, nItem));
        c.getSession().write(MaplePacketCreator.enableActions());
      }
    } else {
      if (quantity == 1) {
        IItem nEquip = ii.getEquipById(itemId);
        if (owner != null) {
          nEquip.setOwner(owner);
        }

        byte newSlot = c.getPlayer().getInventory(type).addItem(nEquip);
        if (newSlot == -1) {
          c.getSession().write(MaplePacketCreator.getInventoryFull());
          c.getSession().write(MaplePacketCreator.getShowInventoryFull());
          return false;
        }
        c.getSession().write(MaplePacketCreator.addInventorySlot(type, nEquip));
      } else {
        throw new InventoryException("Trying to create equip with non-one quantity");
      }
    }
    return true;
  }
Exemplo n.º 3
0
  public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
    slea.readByte();
    slea.readInt(); // ?
    slea.readInt(); // position, but we dont need it o.o
    int oid = slea.readInt();
    MapleMapObject ob = c.getPlayer().getMap().getMapObject(oid);
    if (ob == null) {
      c.getSession().write(MaplePacketCreator.getInventoryFull());
      c.getSession().write(MaplePacketCreator.getShowInventoryFull());
      return;
    }
    if (ob instanceof MapleMapItem) {
      MapleMapItem mapitem = (MapleMapItem) ob;
      synchronized (mapitem) {
        if (mapitem.isPickedUp()) {
          c.getSession().write(MaplePacketCreator.getInventoryFull());
          c.getSession().write(MaplePacketCreator.getShowInventoryFull());
          return;
        }
        double distance = c.getPlayer().getPosition().distanceSq(mapitem.getPosition());
        c.getPlayer().getCheatTracker().checkPickupAgain();
        if (distance > 90000.0) { // 300^2, 550 is approximatly the range of ultis
          // AutobanManager.getInstance().addPoints(c, 100, 300000, "Itemvac");
          c.getPlayer().getCheatTracker().registerOffense(CheatingOffense.ITEMVAC);
          // Double.valueOf(Math.sqrt(distance))
        } else if (distance > 30000.0) {
          // log.warn("[h4x] Player {} is picking up an item that's fairly far away: {}",
          // c.getPlayer().getName(), Double.valueOf(Math.sqrt(distance)));
          c.getPlayer().getCheatTracker().registerOffense(CheatingOffense.SHORT_ITEMVAC);
        }

        if (mapitem.getMeso() > 0) {
          if (c.getPlayer().getParty() != null) {
            ChannelServer cserv = c.getChannelServer();
            int mesoAmm = mapitem.getMeso();
            int partyNum = 0;
            Collection<MaplePartyCharacter> partyMembers = c.getPlayer().getParty().getMembers();
            for (MaplePartyCharacter partyMember : partyMembers) {
              if (partyMember.getMapid() == c.getPlayer().getMapId()) {
                partyNum++;
              }
            }
            int mesoGain = mesoAmm / partyNum;
            for (MaplePartyCharacter partyMember : partyMembers) {
              if (partyMember.getMapid() == c.getPlayer().getMapId()) {
                cserv
                    .getPlayerStorage()
                    .getCharacterById(partyMember.getId())
                    .gainMeso(mesoGain, true, true);
              }
            }
          } else {
            c.getPlayer().gainMeso(mapitem.getMeso(), true, true);
          }
          c.getPlayer()
              .getMap()
              .broadcastMessage(
                  MaplePacketCreator.removeItemFromMap(
                      mapitem.getObjectId(), 2, c.getPlayer().getId()),
                  mapitem.getPosition());
          c.getPlayer().getCheatTracker().pickupComplete();
          c.getPlayer().getMap().removeMapObject(ob);
        } else {
          StringBuilder logInfo = new StringBuilder("Picked up by ");
          logInfo.append(c.getPlayer().getName());
          if (mapitem.getItem().getItemId() >= 5000000
              && mapitem.getItem().getItemId() <= 5000100) {
            int petId = MaplePet.createPet(mapitem.getItem().getItemId());
            if (petId == -1) {
              return;
            }
            MapleInventoryManipulator.addById(
                c,
                mapitem.getItem().getItemId(),
                mapitem.getItem().getQuantity(),
                "Cash Item was purchased.",
                null,
                petId);
            c.getPlayer()
                .getMap()
                .broadcastMessage(
                    MaplePacketCreator.removeItemFromMap(
                        mapitem.getObjectId(), 2, c.getPlayer().getId()),
                    mapitem.getPosition());
            c.getPlayer().getCheatTracker().pickupComplete();
            c.getPlayer().getMap().removeMapObject(ob);
          } else {
            if (MapleInventoryManipulator.addFromDrop(c, mapitem.getItem(), logInfo.toString())) {
              c.getPlayer()
                  .getMap()
                  .broadcastMessage(
                      MaplePacketCreator.removeItemFromMap(
                          mapitem.getObjectId(), 2, c.getPlayer().getId()),
                      mapitem.getPosition());
              c.getPlayer().getCheatTracker().pickupComplete();
              c.getPlayer().getMap().removeMapObject(ob);
            } else {
              c.getPlayer().getCheatTracker().pickupComplete();
              return;
            }
            if (mapitem.getItem().getItemId() == 1002357) {
              c.getPlayer().finishAchievement(13);
            }
          }
        }
        mapitem.setPickedUp(true);
      }
    }
    c.getSession().write(MaplePacketCreator.enableActions());
  }
  public static boolean addFromDrop(MapleClient c, IItem item, boolean show, String owner) {
    MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
    MapleInventoryType type = ii.getInventoryType(item.getItemId());

    if (!c.getChannelServer().allowMoreThanOne()
        && ii.isPickupRestricted(item.getItemId())
        && c.getPlayer().haveItem(item.getItemId(), 1, true, false)) {
      c.getSession().write(MaplePacketCreator.getInventoryFull());
      c.getSession().write(MaplePacketCreator.showItemUnavailable());
      return false;
    }
    short quantity = item.getQuantity();
    if (quantity >= 4000 || quantity < 0) {
      AutobanManager.getInstance()
          .autoban(c.getPlayer().getClient(), "PE Item: " + quantity + "x " + item.getItemId());
      return false;
    }

    if (!type.equals(MapleInventoryType.EQUIP)) {
      short slotMax = ii.getSlotMax(c, item.getItemId());
      List<IItem> existing = c.getPlayer().getInventory(type).listById(item.getItemId());
      if (!ii.isThrowingStar(item.getItemId()) && !ii.isBullet(item.getItemId())) {
        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 && item.getOwner().equals(eItem.getOwner())) {
                short newQ = (short) Math.min(oldQ + quantity, slotMax);
                quantity -= (newQ - oldQ);
                eItem.setQuantity(newQ);
                c.getSession().write(MaplePacketCreator.updateInventorySlot(type, eItem, true));
              }
            } else {
              break;
            }
          }
        }
        // add new slots if there is still something left
        while (quantity > 0
            || ii.isThrowingStar(item.getItemId())
            || ii.isBullet(item.getItemId())) {
          short newQ = (short) Math.min(quantity, slotMax);
          quantity -= newQ;
          Item nItem = new Item(item.getItemId(), (byte) 0, newQ);
          nItem.setOwner(item.getOwner());
          byte newSlot = c.getPlayer().getInventory(type).addItem(nItem);
          if (newSlot == -1) {
            c.getSession().write(MaplePacketCreator.getInventoryFull());
            c.getSession().write(MaplePacketCreator.getShowInventoryFull());
            item.setQuantity((short) (quantity + newQ));
            return false;
          }
          c.getSession().write(MaplePacketCreator.addInventorySlot(type, nItem, true));
        }
      } else {
        // Throwing Stars and Bullets - Add all into one slot regardless of quantity.
        Item nItem = new Item(item.getItemId(), (byte) 0, quantity);
        byte newSlot = c.getPlayer().getInventory(type).addItem(nItem);
        if (newSlot == -1) {
          c.getSession().write(MaplePacketCreator.getInventoryFull());
          c.getSession().write(MaplePacketCreator.getShowInventoryFull());
          return false;
        }
        c.getSession().write(MaplePacketCreator.addInventorySlot(type, nItem));
        c.getSession().write(MaplePacketCreator.enableActions());
      }
    } else {
      if (quantity == 1) {
        byte newSlot = c.getPlayer().getInventory(type).addItem(item);

        if (newSlot == -1) {
          c.getSession().write(MaplePacketCreator.getInventoryFull());
          c.getSession().write(MaplePacketCreator.getShowInventoryFull());
          return false;
        }
        c.getSession().write(MaplePacketCreator.addInventorySlot(type, item, true));
      } else {
        throw new RuntimeException("Trying to create equip with non-one quantity");
      }
    }
    if (owner != null) {
      item.setOwner(owner);
    }
    if (show) {
      c.getSession()
          .write(MaplePacketCreator.getShowItemGain(item.getItemId(), item.getQuantity()));
    }
    return true;
  }
Exemplo n.º 5
0
 @Override
 public void execute(MapleClient c, MessageCallback mc, String[] splitted)
     throws Exception, IllegalCommandSyntaxException {
   MapleCharacter player = c.getPlayer();
   if (splitted[0].equals("@dojob")) {
     NPCScriptManager npc = NPCScriptManager.getInstance();
     npc.start(c, 9001001);
   } else if (splitted[0].equals("@spinel")) {
     NPCScriptManager npc = NPCScriptManager.getInstance();
     npc.start(c, 9000020);
   } else if (splitted[0].equals("@str")
       || splitted[0].equals("@int")
       || splitted[0].equals("@luk")
       || splitted[0].equals("@dex")) {
     int amount = Integer.parseInt(splitted[1]);
     boolean str = splitted[0].equals("@str");
     boolean Int = splitted[0].equals("@int");
     boolean luk = splitted[0].equals("@luk");
     boolean dex = splitted[0].equals("@dex");
     if (amount > 0 && amount <= player.getRemainingAp() && amount <= 32763
         || amount < 0
             && amount >= -32763
             && Math.abs(amount) + player.getRemainingAp() <= 32767) {
       if (str && amount + player.getStr() <= 32767 && amount + player.getStr() >= 4) {
         player.setStr(player.getStr() + amount);
         player.updateSingleStat(MapleStat.STR, player.getStr());
         player.setRemainingAp(player.getRemainingAp() - amount);
         player.updateSingleStat(MapleStat.AVAILABLEAP, player.getRemainingAp());
       } else if (Int && amount + player.getInt() <= 32767 && amount + player.getInt() >= 4) {
         player.setInt(player.getInt() + amount);
         player.updateSingleStat(MapleStat.INT, player.getInt());
         player.setRemainingAp(player.getRemainingAp() - amount);
         player.updateSingleStat(MapleStat.AVAILABLEAP, player.getRemainingAp());
       } else if (luk && amount + player.getLuk() <= 32767 && amount + player.getLuk() >= 4) {
         player.setLuk(player.getLuk() + amount);
         player.updateSingleStat(MapleStat.LUK, player.getLuk());
         player.setRemainingAp(player.getRemainingAp() - amount);
         player.updateSingleStat(MapleStat.AVAILABLEAP, player.getRemainingAp());
       } else if (dex && amount + player.getDex() <= 32767 && amount + player.getDex() >= 4) {
         player.setDex(player.getDex() + amount);
         player.updateSingleStat(MapleStat.DEX, player.getDex());
         player.setRemainingAp(player.getRemainingAp() - amount);
         player.updateSingleStat(MapleStat.AVAILABLEAP, player.getRemainingAp());
       } else {
         mc.dropMessage(
             "Please make sure the stat you are trying to raise is not over 32,767 or under 4.");
       }
     } else {
       mc.dropMessage(
           "Please make sure your AP is not over 32,767 and you have enough to distribute.");
     }
   } else if (splitted[0].equals("@emo")) {
     player.setHp(0);
     player.updateSingleStat(MapleStat.HP, 0);
   } else if (splitted[0].equals("@expfix")) {
     player.setExp(0);
     player.updateSingleStat(MapleStat.EXP, player.getExp());
     mc.dropMessage("Your exp has been fixed~!");
   } else if (splitted[0].equals("@myap")) {
     mc.dropMessage(
         "You currently have "
             + c.getPlayer().getStr()
             + " STR, "
             + c.getPlayer().getDex()
             + " DEX, "
             + c.getPlayer().getLuk()
             + " LUK, "
             + c.getPlayer().getInt()
             + " INT.");
     mc.dropMessage("You currently have " + c.getPlayer().getRemainingAp() + " Ability Points.");
   } else if (splitted[0].equals("@commands")) {
     mc.dropMessage("The player Commands are:");
     mc.dropMessage(
         "@str, @int, @dex, @achievements, @luk, @save, @dojob, @expfix, @myap, @emo, @rebirth, @apreset, @dispose, @goto");
   } else if (splitted[0].equals("@rebirth")) {
     if (player.getLevel() >= 200) {
       int totalrebirth = c.getPlayer().getReborns() + 1;
       mc.dropMessage("You have been reborned. For a total of " + totalrebirth + " times.");
       player.doReborn();
     } else {
       mc.dropMessage("You are not level 200 yet!");
     }
   } else if (splitted[0].equals("@save")) {
     if (!player.getCheatTracker().Spam(60000, 0)) { // 1 minute
       player.saveToDB(true);
       mc.dropMessage("Character information saved.");
     } else {
       mc.dropMessage("You cannot save more than once every minute.");
     }
   } else if (splitted[0].equalsIgnoreCase("@achievements")) {
     mc.dropMessage("Your finished achievements:");
     for (Integer i : c.getPlayer().getFinishedAchievements()) {
       mc.dropMessage(
           MapleAchievements.getInstance().getById(i).getName()
               + " - "
               + MapleAchievements.getInstance().getById(i).getReward()
               + " NX.");
     }
   } else if (splitted[0].equals("@dispose")) {
     NPCScriptManager.getInstance().dispose(c);
     c.getSession().write(MaplePacketCreator.enableActions());
     mc.dropMessage("Done.");
   } else if (splitted[0].equals("@apreset")) {
     if (player.getMeso() >= 5000000) {
       int str = c.getPlayer().getStr();
       int dex = c.getPlayer().getDex();
       int int_ = c.getPlayer().getInt();
       int luk = c.getPlayer().getLuk();
       int newap = c.getPlayer().getRemainingAp() + (str - 4) + (dex - 4) + (int_ - 4) + (luk - 4);
       c.getPlayer().setStr(4);
       c.getPlayer().setDex(4);
       c.getPlayer().setInt(4);
       c.getPlayer().setLuk(4);
       c.getPlayer().setRemainingAp(newap);
       List<Pair<MapleStat, Integer>> stats = new ArrayList<Pair<MapleStat, Integer>>();
       stats.add(new Pair<MapleStat, Integer>(MapleStat.STR, Integer.valueOf(str)));
       stats.add(new Pair<MapleStat, Integer>(MapleStat.DEX, Integer.valueOf(dex)));
       stats.add(new Pair<MapleStat, Integer>(MapleStat.INT, Integer.valueOf(int_)));
       stats.add(new Pair<MapleStat, Integer>(MapleStat.LUK, Integer.valueOf(luk)));
       stats.add(new Pair<MapleStat, Integer>(MapleStat.AVAILABLEAP, Integer.valueOf(newap)));
       c.getSession().write(MaplePacketCreator.updatePlayerStats(stats));
       mc.dropMessage("Your ap has been reseted. Please CC or Relogin to apply the changes");
     } else {
       mc.dropMessage("Not enough mesos. You need 5mill to apreset");
     }
   } else if (splitted[0].equals("@goto")) {
     ChannelServer cserv = c.getChannelServer();
     HashMap<String, Integer> maps = new HashMap<String, Integer>();
     maps.put("henesys", 100000000);
     maps.put("ellinia", 101000000);
     maps.put("perion", 102000000);
     maps.put("kerning", 103000000);
     maps.put("lith", 104000000);
     maps.put("sleepywood", 105040300);
     maps.put("florina", 110000000);
     maps.put("orbis", 200000000);
     maps.put("happy", 209000000);
     maps.put("elnath", 211000000);
     maps.put("ludi", 220000000);
     maps.put("omega", 221000000);
     maps.put("korean", 222000000);
     maps.put("aqua", 230000000);
     maps.put("leafre", 240000000);
     maps.put("mulung", 250000000);
     maps.put("herb", 251000000);
     maps.put("nlc", 600000000);
     maps.put("shrine", 800000000);
     maps.put("showa", 801000000);
     maps.put("fm", 910000000);
     if (maps.containsKey(splitted[1])) {
       player.changeMap(
           cserv.getMapFactory().getMap(maps.get(splitted[1])),
           cserv.getMapFactory().getMap(maps.get(splitted[1])).getPortal(0));
     } else {
       mc.dropMessage(
           "No map enetered do @goto  <henesys|ellinia|perion|kerning|lith|sleepywood|florina|orbis|happy|elnath|ludi|omega|korean|aqua|leafre|mulung|herb|nlc|shrine|showa|fm>");
     }
   }
 }