/* 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; }
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; }
@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>"); } } }