public static void unequip(MapleClient c, byte src, byte dst) { Equip source = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(src); Equip target = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(dst); if (dst < 0) { log.warn( "Unequipping to negative slot. ({}: {}->{})", new Object[] {c.getPlayer().getName(), src, dst}); } if (source == null) { return; } if (target != null && src <= 0) { // do not allow switching with equip c.getSession().write(MaplePacketCreator.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.getSession() .write(MaplePacketCreator.moveInventoryItem(MapleInventoryType.EQUIP, src, dst, (byte) 1)); c.getPlayer().equipChanged(); }
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 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; }
public static void equip(MapleClient c, byte src, byte dst) { MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); Equip source = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(src); Equip target = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(dst); if (source == null) { return; } if (!c.getPlayer().isGM() && !c.getChannelServer().CanGMItem()) { switch (source.getItemId()) { case 1002140: // Wizet Invincible Hat case 1042003: // Wizet Plain Suit case 1062007: // Wizet Plain Suit Pants case 1322013: // Wizet Secret Agent Suitcase removeAllById(c, source.getItemId(), false); c.getPlayer().dropMessage(1, "You're not a GM"); return; } } if (source.getItemId() == 1302065 || source.getItemId() == 1302033) { c.getPlayer().dropMessage(6, "You cannot equip the Capture the Flag items."); return; } if (source.getItemId() == 1812006) { removeAllById(c, source.getItemId(), false); c.getPlayer().dropMessage(1, "Magic Scale Has Been Blocked"); return; } if (source.getItemId() == 1002425 && c.getPlayer().getLevel() == 200) { c.getPlayer().setLevel(2); c.getPlayer().setJob(0); c.getPlayer().setReborns(1); c.getPlayer().doReborn(); c.getPlayer().setRebirthPoints(c.getPlayer().getRebirthPoints() + 1); c.getPlayer() .dropMessage("Congratulations on your rebirth! I have given you one rebrth point."); } if (source.getItemId() == 1002083 && c.getPlayer().getLevel() >= 120) { c.getPlayer().saveToDB(true, true); c.getPlayer().changeJob(MapleJob.getById(412)); // Night Lord removeAllById(c, source.getItemId(), false); } if (source.getItemId() == 1002082 && c.getPlayer().getLevel() >= 120) { c.getPlayer().saveToDB(true, true); c.getPlayer().changeJob(MapleJob.getById(422)); // Bandit removeAllById(c, source.getItemId(), false); } if (source.getItemId() == 1002081 && c.getPlayer().getLevel() >= 120) { c.getPlayer().saveToDB(true, true); c.getPlayer().changeJob(MapleJob.getById(112)); // hero removeAllById(c, source.getItemId(), false); } if (source.getItemId() == 1002080 && c.getPlayer().getLevel() >= 120) { c.getPlayer().saveToDB(true, true); c.getPlayer().changeJob(MapleJob.getById(122)); // paladin removeAllById(c, source.getItemId(), false); } if (source.getItemId() == 1002393 && c.getPlayer().getLevel() >= 120) { c.getPlayer().saveToDB(true, true); c.getPlayer().changeJob(MapleJob.getById(132)); // DK removeAllById(c, source.getItemId(), false); } if (source.getItemId() == 1002394 && c.getPlayer().getLevel() >= 120) { c.getPlayer().saveToDB(true, true); c.getPlayer().changeJob(MapleJob.getById(212)); // Bishop removeAllById(c, source.getItemId(), false); } if (source.getItemId() == 1002392 && c.getPlayer().getLevel() >= 120) { c.getPlayer().saveToDB(true, true); c.getPlayer().changeJob(MapleJob.getById(222)); // FP mage removeAllById(c, source.getItemId(), false); } if (source.getItemId() == 1002391 && c.getPlayer().getLevel() >= 120) { c.getPlayer().saveToDB(true, true); c.getPlayer().changeJob(MapleJob.getById(232)); // IL mage removeAllById(c, source.getItemId(), false); } if (source.getItemId() == 1002395 && c.getPlayer().getLevel() >= 120) { c.getPlayer().saveToDB(true, true); c.getPlayer().changeJob(MapleJob.getById(512)); // brawler removeAllById(c, source.getItemId(), false); } if (source.getItemId() == 1002515 && c.getPlayer().getLevel() >= 120) { c.getPlayer().saveToDB(true, true); c.getPlayer().changeJob(MapleJob.getById(312)); // bowman removeAllById(c, source.getItemId(), false); } if (source.getItemId() == 1002397 && c.getPlayer().getLevel() >= 120) { c.getPlayer().saveToDB(true, true); c.getPlayer().changeJob(MapleJob.getById(322)); // xbow removeAllById(c, source.getItemId(), false); } if (dst == -6) { // unequip the overall IItem top = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -5); if (top != null && ii.isOverall(top.getItemId())) { if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) { c.getSession().write(MaplePacketCreator.getInventoryFull()); c.getSession().write(MaplePacketCreator.getShowInventoryFull()); return; } unequip( c, (byte) -5, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot()); } } else if (dst == -5) { // unequip the bottom and top IItem top = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -5); IItem bottom = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -6); if (top != null && ii.isOverall(source.getItemId())) { if (c.getPlayer() .getInventory(MapleInventoryType.EQUIP) .isFull(bottom != null && ii.isOverall(source.getItemId()) ? 1 : 0)) { c.getSession().write(MaplePacketCreator.getInventoryFull()); c.getSession().write(MaplePacketCreator.getShowInventoryFull()); return; } unequip( c, (byte) -5, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot()); } if (bottom != null && ii.isOverall(source.getItemId())) { if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) { c.getSession().write(MaplePacketCreator.getInventoryFull()); c.getSession().write(MaplePacketCreator.getShowInventoryFull()); return; } unequip( c, (byte) -6, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot()); } } else if (dst == -10) { // check if weapon is two-handed IItem weapon = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -11); if (weapon != null && ii.isTwoHanded(weapon.getItemId())) { if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) { c.getSession().write(MaplePacketCreator.getInventoryFull()); c.getSession().write(MaplePacketCreator.getShowInventoryFull()); return; } unequip( c, (byte) -11, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot()); } } else if (dst == -11) { IItem shield = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -10); if (shield != null && ii.isTwoHanded(source.getItemId())) { if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) { c.getSession().write(MaplePacketCreator.getInventoryFull()); c.getSession().write(MaplePacketCreator.getShowInventoryFull()); return; } unequip( c, (byte) -10, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot()); } } else if (dst == -18) { c.getPlayer().getMount().setItemId(source.getItemId()); } source = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(src); target = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(dst); 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 && ii.isWeapon(source.getItemId())) { c.getPlayer().cancelBuffStats(MapleBuffStat.BOOSTER); } c.getSession() .write(MaplePacketCreator.moveInventoryItem(MapleInventoryType.EQUIP, src, dst, (byte) 2)); c.getPlayer().equipChanged(); }
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()); }