package server; import client.MapleBuffStat; import client.MapleCharacter; import client.MapleClient; import client.MapleQuestStatus; import client.MapleTrait.MapleTraitType; import client.PlayerStats; import client.Skill; import client.SkillEntry; import client.SkillFactory; import client.inventory.*; import constants.GameConstants; import java.awt.Point; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; import server.quest.MapleQuest; import tools.Pair; import tools.StringUtil; import tools.packet.CField; import tools.packet.CWvsContext; import tools.packet.CWvsContext.InfoPacket; import tools.packet.CWvsContext.InventoryPacket; import tools.packet.CSPacket; public class MapleInventoryManipulator { public static void addRing(MapleCharacter chr, int itemId, int ringId, int sn, String partner) { CashItemInfo csi = CashItemFactory.getInstance().getItem(sn); if (csi == null) { return; } Item ring = chr.getCashInventory().toItem(csi, ringId); if (ring == null || ring.getUniqueId() != ringId || ring.getUniqueId() <= 0 || ring.getItemId() != itemId) { return; } chr.getCashInventory().addToInventory(ring); chr.getClient().getSession().write(CSPacket.sendBoughtRings(GameConstants.isCrushRing(itemId), ring, sn, chr.getClient().getAccID(), partner)); } public static boolean addbyItem(final MapleClient c, final Item item) { return addbyItem(c, item, false) >= 0; } public static short addbyItem(final MapleClient c, final Item item, final boolean fromcs) { final MapleInventoryType type = GameConstants.getInventoryType(item.getItemId()); final short newSlot = c.getPlayer().getInventory(type).addItem(item); if (newSlot == -1) { if (!fromcs) { c.getSession().write(InventoryPacket.getInventoryFull()); c.getSession().write(InventoryPacket.getShowInventoryFull()); } return newSlot; } if (GameConstants.isHarvesting(item.getItemId())) { c.getPlayer().getStat().handleProfessionTool(c.getPlayer()); } c.getSession().write(InventoryPacket.addInventorySlot(type, item)); c.getPlayer().havePartyQuest(item.getItemId()); return newSlot; } public static int getUniqueId(int itemId, MaplePet pet) { int uniqueid = -1; if (GameConstants.isPet(itemId)) { if (pet != null) { uniqueid = pet.getUniqueId(); } else { uniqueid = MapleInventoryIdentifier.getInstance(); } } else if (GameConstants.getInventoryType(itemId) == MapleInventoryType.CASH || MapleItemInformationProvider.getInstance().isCash(itemId)) { //less work to do uniqueid = MapleInventoryIdentifier.getInstance(); //shouldnt be generated yet, so put it here } return uniqueid; } public static boolean addById(MapleClient c, int itemId, short quantity, String gmLog) { return addById(c, itemId, quantity, null, null, 0, false, gmLog); } public static boolean addById(MapleClient c, int itemId, short quantity, String owner, String gmLog) { return addById(c, itemId, quantity, owner, null, 0, false, gmLog); } public static byte addId(MapleClient c, int itemId, short quantity, String owner, String gmLog) { return addId(c, itemId, quantity, owner, null, 0, false, gmLog); } public static boolean addById(MapleClient c, int itemId, short quantity, String owner, MaplePet pet, String gmLog) { return addById(c, itemId, quantity, owner, pet, 0, false, gmLog); } public static boolean addById(MapleClient c, int itemId, short quantity, String owner, MaplePet pet, long period, boolean hours, String gmLog) { return addId(c, itemId, quantity, owner, pet, period, hours, gmLog) >= 0; } public static byte addId(MapleClient c, int itemId, short quantity, String owner, MaplePet pet, long period, boolean hours, String gmLog) { final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); if ((ii.isPickupRestricted(itemId) && c.getPlayer().haveItem(itemId, 1, true, false)) || (!ii.itemExists(itemId))) { c.getSession().write(InventoryPacket.getInventoryFull()); c.getSession().write(InventoryPacket.showItemUnavailable()); return -1; } if (itemId >= 4031332 && itemId <= 4031341) { c.getSession().write(CField.getGameMessage("Hint: Use @event to exchange a certificate of straight wins.", (short) 8)); } final MapleInventoryType type = GameConstants.getInventoryType(itemId); int uniqueid = getUniqueId(itemId, pet); short newSlot = -1; if (!type.equals(MapleInventoryType.EQUIP)) { final short slotMax = ii.getSlotMax(itemId); final List<Item> existing = c.getPlayer().getInventory(type).listById(itemId); if (!GameConstants.isRechargable(itemId)) { if (existing.size() > 0) { // first update all existing slots to slotMax Iterator<Item> 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) && eItem.getExpiration() == -1) { short newQ = (short) Math.min(oldQ + quantity, slotMax); quantity -= (newQ - oldQ); eItem.setQuantity(newQ); c.getSession().write(InventoryPacket.updateInventorySlot(type, eItem, false)); } } else { break; } } } Item nItem; // add new slots if there is still something left while (quantity > 0) { short newQ = (short) Math.min(quantity, slotMax); if (newQ != 0) { quantity -= newQ; nItem = new Item(itemId, (byte) 0, newQ, (byte) 0, uniqueid); newSlot = c.getPlayer().getInventory(type).addItem(nItem); if (newSlot == -1) { c.getSession().write(InventoryPacket.getInventoryFull()); c.getSession().write(InventoryPacket.getShowInventoryFull()); return -1; } if (gmLog != null) { nItem.setGMLog(gmLog); } if (owner != null) { nItem.setOwner(owner); } if (period > 0) { nItem.setExpiration(System.currentTimeMillis() + (period * (hours ? 1 : 24) * 60 * 60 * 1000)); } if (pet != null) { nItem.setPet(pet); pet.setInventoryPosition(newSlot); c.getPlayer().addPet(pet); } c.getSession().write(InventoryPacket.addInventorySlot(type, nItem)); if (GameConstants.isRechargable(itemId) && quantity == 0) { break; } } else { c.getPlayer().havePartyQuest(itemId); c.getSession().write(CWvsContext.enableActions()); return (byte) newSlot; } } } else { // Throwing Stars and Bullets - Add all into one slot regardless of quantity. final Item nItem = new Item(itemId, (byte) 0, quantity, (byte) 0, uniqueid); newSlot = c.getPlayer().getInventory(type).addItem(nItem); if (newSlot == -1) { c.getSession().write(InventoryPacket.getInventoryFull()); c.getSession().write(InventoryPacket.getShowInventoryFull()); return -1; } if (period > 0) { nItem.setExpiration(System.currentTimeMillis() + (period * 24 * 60 * 60 * 1000)); } if (gmLog != null) { nItem.setGMLog(gmLog); } c.getSession().write(InventoryPacket.addInventorySlot(type, nItem)); c.getSession().write(CWvsContext.enableActions()); } } else { if (quantity == 1) { final Item nEquip = ii.getEquipById(itemId, uniqueid); if (owner != null) { nEquip.setOwner(owner); } if (gmLog != null) { nEquip.setGMLog(gmLog); } if (period > 0) { nEquip.setExpiration(System.currentTimeMillis() + (period * 24 * 60 * 60 * 1000)); } newSlot = c.getPlayer().getInventory(type).addItem(nEquip); if (newSlot == -1) { c.getSession().write(InventoryPacket.getInventoryFull()); c.getSession().write(InventoryPacket.getShowInventoryFull()); return -1; } c.getSession().write(InventoryPacket.addInventorySlot(type, nEquip)); if (GameConstants.isHarvesting(itemId)) { c.getPlayer().getStat().handleProfessionTool(c.getPlayer()); } } else { throw new InventoryException("Trying to create equip with non-one quantity"); } } c.getPlayer().havePartyQuest(itemId); return (byte) newSlot; } public static Item addbyId_Gachapon(final MapleClient c, final int itemId, short quantity) { if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot() == -1 || c.getPlayer().getInventory(MapleInventoryType.USE).getNextFreeSlot() == -1 || c.getPlayer().getInventory(MapleInventoryType.ETC).getNextFreeSlot() == -1 || c.getPlayer().getInventory(MapleInventoryType.SETUP).getNextFreeSlot() == -1) { return null; } final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); if ((ii.isPickupRestricted(itemId) && c.getPlayer().haveItem(itemId, 1, true, false)) || (!ii.itemExists(itemId))) { c.getSession().write(InventoryPacket.getInventoryFull()); c.getSession().write(InventoryPacket.showItemUnavailable()); return null; } final MapleInventoryType type = GameConstants.getInventoryType(itemId); if (!type.equals(MapleInventoryType.EQUIP)) { short slotMax = ii.getSlotMax(itemId); final List<Item> existing = c.getPlayer().getInventory(type).listById(itemId); if (!GameConstants.isRechargable(itemId)) { Item nItem = null; boolean recieved = false; if (existing.size() > 0) { // first update all existing slots to slotMax Iterator<Item> i = existing.iterator(); while (quantity > 0) { if (i.hasNext()) { nItem = (Item) i.next(); short oldQ = nItem.getQuantity(); if (oldQ < slotMax) { recieved = true; short newQ = (short) Math.min(oldQ + quantity, slotMax); quantity -= (newQ - oldQ); nItem.setQuantity(newQ); c.getSession().write(InventoryPacket.updateInventorySlot(type, nItem, false)); } } else { break; } } } // add new slots if there is still something left while (quantity > 0) { short newQ = (short) Math.min(quantity, slotMax); if (newQ != 0) { quantity -= newQ; nItem = new Item(itemId, (byte) 0, newQ, (byte) 0); final short newSlot = c.getPlayer().getInventory(type).addItem(nItem); if (newSlot == -1 && recieved) { return nItem; } else if (newSlot == -1) { return null; } recieved = true; c.getSession().write(InventoryPacket.addInventorySlot(type, nItem)); if (GameConstants.isRechargable(itemId) && quantity == 0) { break; } } else { break; } } if (recieved) { c.getPlayer().havePartyQuest(nItem.getItemId()); return nItem; } } else { // Throwing Stars and Bullets - Add all into one slot regardless of quantity. final Item nItem = new Item(itemId, (byte) 0, quantity, (byte) 0); final short newSlot = c.getPlayer().getInventory(type).addItem(nItem); if (newSlot == -1) { return null; } c.getSession().write(InventoryPacket.addInventorySlot(type, nItem)); c.getPlayer().havePartyQuest(nItem.getItemId()); return nItem; } } else { if (quantity == 1) { final Item item = ii.randomizeStats((Equip) ii.getEquipById(itemId)); final short newSlot = c.getPlayer().getInventory(type).addItem(item); if (newSlot == -1) { return null; } c.getSession().write(InventoryPacket.addInventorySlot(type, item, true)); c.getPlayer().havePartyQuest(item.getItemId()); return item; } else { throw new InventoryException("Trying to create equip with non-one quantity"); } } return null; } public static boolean addFromDrop(final MapleClient c, final Item item, final boolean show) { return addFromDrop(c, item, show, false); } public static boolean addFromDrop(final MapleClient c, Item item, final boolean show, final boolean enhance) { final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); if (c.getPlayer() == null || (ii.isPickupRestricted(item.getItemId()) && c.getPlayer().haveItem(item.getItemId(), 1, true, false)) || (!ii.itemExists(item.getItemId()))) { c.getSession().write(InventoryPacket.getInventoryFull()); c.getSession().write(InventoryPacket.showItemUnavailable()); return false; } final int before = c.getPlayer().itemQuantity(item.getItemId()); short quantity = item.getQuantity(); final MapleInventoryType type = GameConstants.getInventoryType(item.getItemId()); if (!type.equals(MapleInventoryType.EQUIP)) { final short slotMax = ii.getSlotMax(item.getItemId()); final List<Item> existing = c.getPlayer().getInventory(type).listById(item.getItemId()); if (!GameConstants.isRechargable(item.getItemId())) { if (quantity <= 0) { //wth c.getSession().write(InventoryPacket.getInventoryFull()); c.getSession().write(InventoryPacket.showItemUnavailable()); return false; } if (existing.size() > 0) { // first update all existing slots to slotMax Iterator<Item> 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()) && item.getExpiration() == eItem.getExpiration()) { final short newQ = (short) Math.min(oldQ + quantity, slotMax); quantity -= (newQ - oldQ); eItem.setQuantity(newQ); c.getSession().write(InventoryPacket.updateInventorySlot(type, eItem, true)); } } else { break; } } } // add new slots if there is still something left while (quantity > 0) { final short newQ = (short) Math.min(quantity, slotMax); quantity -= newQ; final Item nItem = new Item(item.getItemId(), (byte) 0, newQ, item.getFlag()); nItem.setExpiration(item.getExpiration()); nItem.setOwner(item.getOwner()); nItem.setPet(item.getPet()); nItem.setGMLog(item.getGMLog()); short newSlot = c.getPlayer().getInventory(type).addItem(nItem); if (newSlot == -1) { c.getSession().write(InventoryPacket.getInventoryFull()); c.getSession().write(InventoryPacket.getShowInventoryFull()); item.setQuantity((short) (quantity + newQ)); return false; } c.getSession().write(InventoryPacket.addInventorySlot(type, nItem, true)); } } else { // Throwing Stars and Bullets - Add all into one slot regardless of quantity. final Item nItem = new Item(item.getItemId(), (byte) 0, quantity, item.getFlag()); nItem.setExpiration(item.getExpiration()); nItem.setOwner(item.getOwner()); nItem.setPet(item.getPet()); nItem.setGMLog(item.getGMLog()); final short newSlot = c.getPlayer().getInventory(type).addItem(nItem); if (newSlot == -1) { c.getSession().write(InventoryPacket.getInventoryFull()); c.getSession().write(InventoryPacket.getShowInventoryFull()); return false; } c.getSession().write(InventoryPacket.addInventorySlot(type, nItem)); c.getSession().write(CWvsContext.enableActions()); } } else { if (quantity == 1) { if (enhance) { item = checkEnhanced(item, c.getPlayer()); } final short newSlot = c.getPlayer().getInventory(type).addItem(item); if (newSlot == -1) { c.getSession().write(InventoryPacket.getInventoryFull()); c.getSession().write(InventoryPacket.getShowInventoryFull()); return false; } c.getSession().write(InventoryPacket.addInventorySlot(type, item, true)); if (GameConstants.isHarvesting(item.getItemId())) { c.getPlayer().getStat().handleProfessionTool(c.getPlayer()); } } else { throw new RuntimeException("Trying to create equip with non-one quantity"); } } if (item.getQuantity() >= 50 && item.getItemId() == 2340000) { c.setMonitored(true); } //if (before == 0) { // switch (item.getItemId()) { // case AramiaFireWorks.KEG_ID: // c.getPlayer().dropMessage(5, "You have gained a Powder Keg."); // break; // case AramiaFireWorks.SUN_ID: // c.getPlayer().dropMessage(5, "You have gained a Warm Sun."); // break; // case AramiaFireWorks.DEC_ID: // c.getPlayer().dropMessage(5, "You have gained a Tree Decoration."); // break; // } //} c.getPlayer().havePartyQuest(item.getItemId()); if (show) { c.getSession().write(InfoPacket.getShowItemGain(item.getItemId(), item.getQuantity())); } return true; } private static Item checkEnhanced(final Item before, final MapleCharacter chr) { if (before instanceof Equip) { final Equip eq = (Equip) before; if (eq.getState() == 0 && (eq.getUpgradeSlots() >= 1 || eq.getLevel() >= 1) && GameConstants.canScroll(eq.getItemId()) && Randomizer.nextInt(100) >= 80) { //20% chance of pot? eq.resetPotential(); } } return before; } public static boolean checkSpace(final MapleClient c, final int itemid, int quantity, final String owner) { final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); if (c.getPlayer() == null || (ii.isPickupRestricted(itemid) && c.getPlayer().haveItem(itemid, 1, true, false)) || (!ii.itemExists(itemid))) { c.getSession().write(CWvsContext.enableActions()); return false; } if (quantity <= 0 && !GameConstants.isRechargable(itemid)) { return false; } final MapleInventoryType type = GameConstants.getInventoryType(itemid); if (c == null || c.getPlayer() == null || c.getPlayer().getInventory(type) == null) { //wtf is causing this? return false; } if (!type.equals(MapleInventoryType.EQUIP)) { final short slotMax = ii.getSlotMax(itemid); final List<Item> existing = c.getPlayer().getInventory(type).listById(itemid); if (!GameConstants.isRechargable(itemid)) { if (existing.size() > 0) { // first update all existing slots to slotMax for (Item eItem : existing) { final short oldQ = eItem.getQuantity(); if (oldQ < slotMax && owner != null && owner.equals(eItem.getOwner())) { final short newQ = (short) Math.min(oldQ + quantity, slotMax); quantity -= (newQ - oldQ); } if (quantity <= 0) { break; } } } } // add new slots if there is still something left final int numSlotsNeeded; if (slotMax > 0 && !GameConstants.isRechargable(itemid)) { numSlotsNeeded = (int) (Math.ceil(((double) quantity) / slotMax)); } else { numSlotsNeeded = 1; } return !c.getPlayer().getInventory(type).isFull(numSlotsNeeded - 1); } else { return !c.getPlayer().getInventory(type).isFull(); } } public static boolean removeFromSlot(final MapleClient c, final MapleInventoryType type, final short slot, final short quantity, final boolean fromDrop) { return removeFromSlot(c, type, slot, quantity, fromDrop, false); } public static boolean removeFromSlot(final MapleClient c, final MapleInventoryType type, final short slot, short quantity, final boolean fromDrop, final boolean consume) { if (c.getPlayer() == null || c.getPlayer().getInventory(type) == null) { return false; } final Item item = c.getPlayer().getInventory(type).getItem(slot); if (item != null) { final boolean allowZero = consume && GameConstants.isRechargable(item.getItemId()); c.getPlayer().getInventory(type).removeItem(slot, quantity, allowZero); if (GameConstants.isHarvesting(item.getItemId())) { c.getPlayer().getStat().handleProfessionTool(c.getPlayer()); } if (item.getQuantity() == 0 && !allowZero) { c.getSession().write(InventoryPacket.clearInventoryItem(type, item.getPosition(), fromDrop)); } else { c.getSession().write(InventoryPacket.updateInventorySlot(type, (Item) item, fromDrop)); } return true; } return false; } public static boolean removeById(final MapleClient c, final MapleInventoryType type, final int itemId, final int quantity, final boolean fromDrop, final boolean consume) { int remremove = quantity; if (c.getPlayer() == null || c.getPlayer().getInventory(type) == null) { return false; } for (Item item : c.getPlayer().getInventory(type).listById(itemId)) { int theQ = item.getQuantity(); if (remremove <= theQ && removeFromSlot(c, type, item.getPosition(), (short) remremove, fromDrop, consume)) { remremove = 0; break; } else if (remremove > theQ && removeFromSlot(c, type, item.getPosition(), item.getQuantity(), fromDrop, consume)) { remremove -= theQ; } } return remremove <= 0; } public static boolean removeFromSlot_Lock(final MapleClient c, final MapleInventoryType type, final short slot, short quantity, final boolean fromDrop, final boolean consume) { if (c.getPlayer() == null || c.getPlayer().getInventory(type) == null) { return false; } final Item item = c.getPlayer().getInventory(type).getItem(slot); if (item != null) { if (ItemFlag.LOCK.check(item.getFlag()) || ItemFlag.UNTRADABLE.check(item.getFlag())) { return false; } return removeFromSlot(c, type, slot, quantity, fromDrop, consume); } return false; } public static boolean removeById_Lock(final MapleClient c, final MapleInventoryType type, final int itemId) { for (Item item : c.getPlayer().getInventory(type).listById(itemId)) { if (removeFromSlot_Lock(c, type, item.getPosition(), (short) 1, false, false)) { return true; } } return false; } public static void move(final MapleClient c, final MapleInventoryType type, final short src, final short dst) { if (src < 0 || dst < 0 || src == dst || type == MapleInventoryType.EQUIPPED) { return; } final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); final Item source = c.getPlayer().getInventory(type).getItem(src); final Item initialTarget = c.getPlayer().getInventory(type).getItem(dst); if (source == null) { return; } boolean bag = false, switchSrcDst = false, bothBag = false; short eqIndicator = -1; if (dst > c.getPlayer().getInventory(type).getSlotLimit()) { if (type == MapleInventoryType.ETC && dst > 100 && dst % 100 != 0) { final int eSlot = c.getPlayer().getExtendedSlot((dst / 100) - 1); if (eSlot > 0) { final MapleStatEffect ee = ii.getItemEffect(eSlot); if (dst % 100 > ee.getSlotCount() || ee.getType() != ii.getBagType(source.getItemId()) || ee.getType() <= 0) { c.getPlayer().dropMessage(1, "You may not move that item to the bag."); c.getSession().write(CWvsContext.enableActions()); return; } else { eqIndicator = 0; bag = true; } } else { c.getPlayer().dropMessage(1, "You may not move it to that bag."); c.getSession().write(CWvsContext.enableActions()); return; } } else { c.getPlayer().dropMessage(1, "You may not move it there."); c.getSession().write(CWvsContext.enableActions()); return; } } if (src > c.getPlayer().getInventory(type).getSlotLimit() && type == MapleInventoryType.ETC && src > 100 && src % 100 != 0) { //source should be not null so not much checks are needed if (!bag) { switchSrcDst = true; eqIndicator = 0; bag = true; } else { bothBag = true; } } short olddstQ = -1; if (initialTarget != null) { olddstQ = initialTarget.getQuantity(); } final short oldsrcQ = source.getQuantity(); final short slotMax = ii.getSlotMax(source.getItemId()); c.getPlayer().getInventory(type).move(src, dst, slotMax); if (GameConstants.isHarvesting(source.getItemId())) { c.getPlayer().getStat().handleProfessionTool(c.getPlayer()); } if (!type.equals(MapleInventoryType.EQUIP) && initialTarget != null && initialTarget.getItemId() == source.getItemId() && initialTarget.getOwner().equals(source.getOwner()) && initialTarget.getExpiration() == source.getExpiration() && !GameConstants.isRechargable(source.getItemId()) && !type.equals(MapleInventoryType.CASH)) { if (GameConstants.isHarvesting(initialTarget.getItemId())) { c.getPlayer().getStat().handleProfessionTool(c.getPlayer()); } if ((olddstQ + oldsrcQ) > slotMax) { c.getSession().write(InventoryPacket.moveAndMergeWithRestInventoryItem(type, src, dst, (short) ((olddstQ + oldsrcQ) - slotMax), slotMax, bag, switchSrcDst, bothBag)); } else { c.getSession().write(InventoryPacket.moveAndMergeInventoryItem(type, src, dst, ((Item) c.getPlayer().getInventory(type).getItem(dst)).getQuantity(), bag, switchSrcDst, bothBag)); } } else { c.getSession().write(InventoryPacket.moveInventoryItem(type, switchSrcDst ? dst : src, switchSrcDst ? src : dst, eqIndicator, bag, bothBag)); } } public static void equip(final MapleClient c, final short src, short dst) { final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); final MapleCharacter chr = c.getPlayer(); if (chr == null || (GameConstants.GMS && dst == -55)) { return; } c.getPlayer().getStat().recalcLocalStats(c.getPlayer()); final PlayerStats statst = c.getPlayer().getStat(); statst.recalcLocalStats(c.getPlayer()); Equip source = (Equip) chr.getInventory(MapleInventoryType.EQUIP).getItem(src); Equip target; if (source == null || source.getDurability() == 0 || GameConstants.isHarvesting(source.getItemId())) { c.getSession().write(CWvsContext.enableActions()); return; } if (GameConstants.isGMEquip(source.getItemId()) && !c.getPlayer().isStaff()) { c.getPlayer().dropMessage(1, "Only Game Masters are allowed to use this item."); c.getPlayer().removeAll(source.getItemId(), false); c.getSession().write(CWvsContext.enableActions()); return; } //if (GameConstants.isMadeByGM(c, source.getItemId(), src) && !c.getPlayer().isStaff()) { // c.getPlayer().dropMessage(1, "You are not allowed to use GM-Made equips."); // c.getSession().write(CWvsContext.enableActions()); // return; //} if (GameConstants.isOverPoweredEquip(c, source.getItemId(), src) && !c.getPlayer().isStaff()) { c.getPlayer().dropMessage(1, "It seems that the item is way too over powered, please report to the Admin if you think that the system is wrong."); //c.getPlayer().removeAll(source.getItemId(), false); //System might be wrong c.getSession().write(CWvsContext.enableActions()); return; } if (!c.getPlayer().isGM()) { if (source.getItemId() == 1112663 || source.getItemId() == 1112586) { c.getPlayer().dropMessage(1, "White Angelic Blessing, and Dark Angelic Blessing are currently not working."); c.getSession().write(CWvsContext.enableActions()); return; } } final Map<String, Integer> stats = ii.getEquipStats(source.getItemId()); if (stats == null) { c.getSession().write(CWvsContext.enableActions()); return; } if (dst > -1200 && dst < -999 && !GameConstants.isEvanDragonItem(source.getItemId()) && !GameConstants.isMechanicItem(source.getItemId())) { c.getSession().write(CWvsContext.enableActions()); return; // } else if ((dst <= -1200 || (dst >= -999 && dst < -99)) && !stats.containsKey("cash")) { // c.getSession().write(CWvsContext.enableActions()); // return; // } } else if (((dst < -5003) || ((dst >= -999) && (dst < -99))) &&(!stats.containsKey("cash"))) { c.getSession().write(CWvsContext.enableActions()); return; }else if (dst > -1400 && dst <= -1300 && c.getPlayer().getAndroid() == null) { c.getSession().write(CWvsContext.enableActions()); return; } else if (dst > -5000 && dst <= -1400) { c.getSession().write(CWvsContext.enableActions()); return; } else if (dst > -5100 && dst <= -5000 && source.getItemId() / 10000 != 120) { c.getSession().write(CWvsContext.enableActions()); return; } if (!ii.canEquip(stats, source.getItemId(), chr.getLevel(), chr.getJob(), chr.getFame(), statst.getTotalStr(), statst.getTotalDex(), statst.getTotalLuk(), statst.getTotalInt(), c.getPlayer().getStat().levelBonus, source.getReqLevel())) { c.getSession().write(CWvsContext.enableActions()); return; } if (GameConstants.isWeapon(source.getItemId()) && dst != -10 && dst != -11) { c.getSession().write(CWvsContext.enableActions()); return; } if (dst == -18 && !GameConstants.isMountItemAvailable(source.getItemId(), c.getPlayer().getJob())) { c.getSession().write(CWvsContext.enableActions()); return; } if (dst == -118 && source.getItemId() / 10000 != 190) { c.getSession().write(CWvsContext.enableActions()); return; } //totem2 if ((dst <= -5000) && (dst > -5003) && (source.getItemId() / 10000 != 120)) { c.getSession().write(CWvsContext.enableActions()); return; } if (dst == -59) { //pendant MapleQuestStatus stat = c.getPlayer().getQuestNoAdd(MapleQuest.getInstance(GameConstants.PENDANT_SLOT)); if (stat == null || stat.getCustomData() == null || Long.parseLong(stat.getCustomData()) < System.currentTimeMillis()) { c.getSession().write(CWvsContext.enableActions()); return; } } if (GameConstants.isKatara(source.getItemId()) || source.getItemId() / 10000 == 135) { dst = (byte) -10; //shield slot } if (GameConstants.isEvanDragonItem(source.getItemId()) && (chr.getJob() < 2200 || chr.getJob() > 2218)) { c.getSession().write(CWvsContext.enableActions()); return; } if (GameConstants.isMechanicItem(source.getItemId()) && (chr.getJob() < 3500 || chr.getJob() > 3512)) { c.getSession().write(CWvsContext.enableActions()); return; } if (source.getItemId() / 1000 == 1112) { //ring for (RingSet s : RingSet.values()) { if (s.id.contains(Integer.valueOf(source.getItemId()))) { List<Integer> theList = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).listIds(); for (Integer i : s.id) { if (theList.contains(i)) { c.getPlayer().dropMessage(1, "You may not equip this item because you already have a " + (StringUtil.makeEnumHumanReadable(s.name())) + " equipped."); c.getSession().write(CWvsContext.enableActions()); return; } } } } } switch (dst) { case -6: { // Top final Item top = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -5); if (top != null && GameConstants.isOverall(top.getItemId())) { if (chr.getInventory(MapleInventoryType.EQUIP).isFull()) { c.getSession().write(InventoryPacket.getInventoryFull()); c.getSession().write(InventoryPacket.getShowInventoryFull()); return; } unequip(c, (byte) -5, chr.getInventory(MapleInventoryType.EQUIP).getNextFreeSlot()); } break; } case -5: { final Item top = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -5); final Item bottom = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -6); if (top != null && GameConstants.isOverall(source.getItemId())) { if (chr.getInventory(MapleInventoryType.EQUIP).isFull(bottom != null && GameConstants.isOverall(source.getItemId()) ? 1 : 0)) { c.getSession().write(InventoryPacket.getInventoryFull()); c.getSession().write(InventoryPacket.getShowInventoryFull()); return; } unequip(c, (byte) -5, chr.getInventory(MapleInventoryType.EQUIP).getNextFreeSlot()); } if (bottom != null && GameConstants.isOverall(source.getItemId())) { if (chr.getInventory(MapleInventoryType.EQUIP).isFull()) { c.getSession().write(InventoryPacket.getInventoryFull()); c.getSession().write(InventoryPacket.getShowInventoryFull()); return; } unequip(c, (byte) -6, chr.getInventory(MapleInventoryType.EQUIP).getNextFreeSlot()); } break; } case -10: { // Shield Item weapon = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -11); if (GameConstants.isKatara(source.getItemId())) { if ((chr.getJob() != 900 && !GameConstants.isDualBlade(chr.getJob())) || weapon == null || !GameConstants.isDagger(weapon.getItemId())) { c.getSession().write(InventoryPacket.getInventoryFull()); c.getSession().write(InventoryPacket.getShowInventoryFull()); return; } } else if (weapon != null && GameConstants.isTwoHanded(weapon.getItemId()) && !GameConstants.isSpecialShield(source.getItemId())) { if (chr.getInventory(MapleInventoryType.EQUIP).isFull()) { c.getSession().write(InventoryPacket.getInventoryFull()); c.getSession().write(InventoryPacket.getShowInventoryFull()); return; } unequip(c, (byte) -11, chr.getInventory(MapleInventoryType.EQUIP).getNextFreeSlot()); } break; } case -11: { // Weapon Item shield = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -10); if (shield != null && GameConstants.isTwoHanded(source.getItemId()) && !GameConstants.isSpecialShield(shield.getItemId())) { if (chr.getInventory(MapleInventoryType.EQUIP).isFull()) { c.getSession().write(InventoryPacket.getInventoryFull()); c.getSession().write(InventoryPacket.getShowInventoryFull()); return; } unequip(c, (byte) -10, chr.getInventory(MapleInventoryType.EQUIP).getNextFreeSlot()); } break; } } source = (Equip) chr.getInventory(MapleInventoryType.EQUIP).getItem(src); // Equip target = (Equip) chr.getInventory(MapleInventoryType.EQUIPPED).getItem(dst); // Currently equipping if (source == null) { c.getSession().write(CWvsContext.enableActions()); return; } short flag = source.getFlag(); if (stats.get("equipTradeBlock") != null || source.getItemId() / 10000 == 167) { // Block trade when equipped. if (!ItemFlag.UNTRADABLE.check(flag)) { flag |= ItemFlag.UNTRADABLE.getValue(); source.setFlag(flag); c.getSession().write(InventoryPacket.updateSpecialItemUse_(source, MapleInventoryType.EQUIP.getType(), c.getPlayer())); } } if (source.getItemId() / 10000 == 166) { if (source.getAndroid() == null) { int uid = MapleInventoryIdentifier.getInstance(); source.setUniqueId(uid); source.setAndroid(MapleAndroid.create(source.getItemId(), uid)); flag = (short) (flag | ItemFlag.LOCK.getValue()); flag = (short) (flag | ItemFlag.UNTRADABLE.getValue()); flag = (short) (flag | ItemFlag.ANDROID_ACTIVATED.getValue()); source.setFlag(flag); c.getSession().write(CWvsContext.InventoryPacket.updateSpecialItemUse_(source, MapleInventoryType.EQUIP.getType(), c.getPlayer())); } chr.removeAndroid(); chr.setAndroid(source.getAndroid()); } else if ((dst <= -1300) && (chr.getAndroid() != null)) { chr.setAndroid(chr.getAndroid()); } if (source.getCharmEXP() > 0 && !ItemFlag.CHARM_EQUIPPED.check(flag)) { chr.getTrait(MapleTraitType.charm).addExp(source.getCharmEXP(), chr); source.setCharmEXP((short) 0); flag |= ItemFlag.CHARM_EQUIPPED.getValue(); source.setFlag(flag); c.getSession().write(InventoryPacket.updateSpecialItemUse_(source, GameConstants.getInventoryType(source.getItemId()).getType(), c.getPlayer())); } chr.getInventory(MapleInventoryType.EQUIP).removeSlot(src); if (target != null) { chr.getInventory(MapleInventoryType.EQUIPPED).removeSlot(dst); } source.setPosition(dst); chr.getInventory(MapleInventoryType.EQUIPPED).addFromDB(source); if (target != null) { target.setPosition(src); chr.getInventory(MapleInventoryType.EQUIP).addFromDB(target); } if (GameConstants.isWeapon(source.getItemId())) { c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.BOOSTER); c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.SPIRIT_CLAW); c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.SOULARROW); c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.WK_CHARGE); c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.LIGHTNING_CHARGE); } if (source.getItemId() / 10000 == 190 || source.getItemId() / 10000 == 191) { c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.MONSTER_RIDING); c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.MECH_CHANGE); } else if (GameConstants.isReverseItem(source.getItemId())) { // chr.finishAchievement(9); } else if (GameConstants.isTimelessItem(source.getItemId())) { //chr.finishAchievement(10); } else if (stats.containsKey("reqLevel") && stats.get("reqLevel") >= 140) { // chr.finishAchievement(41); } else if (stats.containsKey("reqLevel") && stats.get("reqLevel") >= 130) { //chr.finishAchievement(40); } else if (source.getItemId() == 1122017) { chr.startFairySchedule(true, true); } if (source.getState() >= 17) { final Map<Skill, SkillEntry> ss = new HashMap<>(); int[] potentials = {source.getPotential1(), source.getPotential2(), source.getPotential3(), source.getBonusPotential1(), source.getBonusPotential2()}; for (int i : potentials) { if (i > 0) { StructItemOption pot = ii.getPotentialInfo(i).get(ii.getReqLevel(source.getItemId()) / 10); if (pot != null && pot.get("skillID") > 0) { ss.put(SkillFactory.getSkill(PlayerStats.getSkillByJob(pot.get("skillID"), c.getPlayer().getJob())), new SkillEntry((byte) 1, (byte) 0, -1)); } } } c.getPlayer().changeSkillLevel_Skip(ss, true); } if (source.getSocketState() > 15) { final Map<Skill, SkillEntry> ss = new HashMap<>(); int[] sockets = {source.getSocket1(), source.getSocket2(), source.getSocket3()}; for (int i : sockets) { if (i > 0) { StructItemOption soc = ii.getSocketInfo(i); if (soc != null && soc.get("skillID") > 0) { ss.put(SkillFactory.getSkill(PlayerStats.getSkillByJob(soc.get("skillID"), c.getPlayer().getJob())), new SkillEntry((byte) 1, (byte) 0, -1)); } } } c.getPlayer().changeSkillLevel_Skip(ss, true); } c.getSession().write(InventoryPacket.moveInventoryItem(MapleInventoryType.EQUIP, src, dst, (byte) 2, false, false)); chr.equipChanged(); } 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 || source == null || (GameConstants.GMS && src == -55)) { return; } if (target != null && src <= 0) { // do not allow switching with equip c.getSession().write(InventoryPacket.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); } if (GameConstants.isWeapon(source.getItemId())) { c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.BOOSTER); c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.SPIRIT_CLAW); c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.SOULARROW); c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.WK_CHARGE); c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.LIGHTNING_CHARGE); } else if (source.getItemId() / 10000 == 190 || source.getItemId() / 10000 == 191) { c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.MONSTER_RIDING); c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.MECH_CHANGE); } else if (source.getItemId() / 10000 == 166 || source.getItemId() / 10000 == 167) { c.getPlayer().removeAndroid(); } else if (src <= -1300 && c.getPlayer().getAndroid() != null) { c.getPlayer().setAndroid(c.getPlayer().getAndroid()); } else if (source.getItemId() == 1122017) { c.getPlayer().cancelFairySchedule(true); } MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); if (source.getState() >= 17) { final Map<Skill, SkillEntry> ss = new HashMap<>(); int[] potentials = {source.getPotential1(), source.getPotential2(), source.getPotential3(), source.getBonusPotential1(), source.getBonusPotential2()}; for (int i : potentials) { if (i > 0) { StructItemOption pot = ii.getPotentialInfo(i).get(ii.getReqLevel(source.getItemId()) / 10); if (pot != null && pot.get("skillID") > 0) { ss.put(SkillFactory.getSkill(PlayerStats.getSkillByJob(pot.get("skillID"), c.getPlayer().getJob())), new SkillEntry((byte) 0, (byte) 0, -1)); } } } c.getPlayer().changeSkillLevel_Skip(ss, true); } if (source.getSocketState() > 15) { final Map<Skill, SkillEntry> ss = new HashMap<>(); int[] sockets = {source.getSocket1(), source.getSocket2(), source.getSocket3()}; for (int i : sockets) { if (i > 0) { StructItemOption soc = ii.getSocketInfo(i); if (soc != null && soc.get("skillID") > 0) { ss.put(SkillFactory.getSkill(PlayerStats.getSkillByJob(soc.get("skillID"), c.getPlayer().getJob())), new SkillEntry((byte) 1, (byte) 0, -1)); } } } c.getPlayer().changeSkillLevel_Skip(ss, true); } c.getSession().write(InventoryPacket.moveInventoryItem(MapleInventoryType.EQUIP, src, dst, (byte) 1, false, false)); c.getPlayer().equipChanged(); } public static boolean drop(final MapleClient c, MapleInventoryType type, final short src, final short quantity) { return drop(c, type, src, quantity, false); } public static boolean drop(final MapleClient c, MapleInventoryType type, final short src, short quantity, final boolean npcInduced) { final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); if (src < 0) { type = MapleInventoryType.EQUIPPED; } if (c.getPlayer() == null || c.getPlayer().getMap() == null) { return false; } final Item source = c.getPlayer().getInventory(type).getItem(src); if (quantity < 0 || source == null || (GameConstants.GMS && src == -55) || (!npcInduced && GameConstants.isPet(source.getItemId())) || (quantity == 0 && !GameConstants.isRechargable(source.getItemId())) || c.getPlayer().inPVP()) { c.getSession().write(CWvsContext.enableActions()); return false; } final short flag = source.getFlag(); if (quantity > source.getQuantity() && !GameConstants.isRechargable(source.getItemId())) { c.getSession().write(CWvsContext.enableActions()); return false; } if (ItemFlag.LOCK.check(flag) || (quantity != 1 && type == MapleInventoryType.EQUIP)) { // hack c.getSession().write(CWvsContext.enableActions()); return false; } final Point dropPos = new Point(c.getPlayer().getPosition()); c.getPlayer().getCheatTracker().checkDrop(); if (quantity < source.getQuantity() && !GameConstants.isRechargable(source.getItemId())) { final Item target = source.copy(); target.setQuantity(quantity); source.setQuantity((short) (source.getQuantity() - quantity)); c.getSession().write(InventoryPacket.dropInventoryItemUpdate(type, source)); if (ii.isDropRestricted(target.getItemId()) || ii.isAccountShared(target.getItemId())) { if (ItemFlag.KARMA_EQ.check(flag)) { target.setFlag((byte) (flag - ItemFlag.KARMA_EQ.getValue())); c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true, true); } else if (ItemFlag.KARMA_USE.check(flag)) { target.setFlag((byte) (flag - ItemFlag.KARMA_USE.getValue())); c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true, true); } else if (GameConstants.isAnyDropMap(c.getPlayer().getMapId())) { c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true, true); } else { c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos); } } else { if ((GameConstants.isPet(source.getItemId()) || ItemFlag.UNTRADABLE.check(flag)) && !GameConstants.isAnyDropMap(c.getPlayer().getMapId())) { c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos); } else { c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true, true); } } } else { c.getPlayer().getInventory(type).removeSlot(src); if (GameConstants.isHarvesting(source.getItemId())) { c.getPlayer().getStat().handleProfessionTool(c.getPlayer()); } c.getSession().write(InventoryPacket.dropInventoryItem((src < 0 ? MapleInventoryType.EQUIP : type), src)); if (src < 0) { c.getPlayer().equipChanged(); } if (ii.isDropRestricted(source.getItemId()) || ii.isAccountShared(source.getItemId())) { if (ItemFlag.KARMA_EQ.check(flag)) { source.setFlag((byte) (flag - ItemFlag.KARMA_EQ.getValue())); c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true, true); } else if (ItemFlag.KARMA_USE.check(flag)) { source.setFlag((byte) (flag - ItemFlag.KARMA_USE.getValue())); c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true, true); } else if (GameConstants.isAnyDropMap(c.getPlayer().getMapId())) { c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true, true); } else { c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos); } } else { if ((GameConstants.isPet(source.getItemId()) || ItemFlag.UNTRADABLE.check(flag)) && !GameConstants.isAnyDropMap(c.getPlayer().getMapId())) { c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos); } else { c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true, true); } } } return true; } public static String searchId(int type, String search) { String result = ""; MapleData data = null; MapleDataProvider dataProvider = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/" + "String.wz")); //result += "<<Type: " + type + " | Search: " + search + ">>"; switch (type) { case 1: List<String> retNpcs = new ArrayList<>(); data = dataProvider.getData("Npc.img"); List<Pair<Integer, String>> npcPairList = new LinkedList<>(); for (MapleData npcIdData : data.getChildren()) { npcPairList.add(new Pair<>(Integer.parseInt(npcIdData.getName()), MapleDataTool.getString(npcIdData.getChildByPath("name"), "NO-NAME"))); } for (Pair<Integer, String> npcPair : npcPairList) { if (npcPair.getRight().toLowerCase().contains(search.toLowerCase())) { retNpcs.add(npcPair.getLeft() + " - " + npcPair.getRight()); } } if (retNpcs != null && retNpcs.size() > 0) { for (String singleRetNpc : retNpcs) { result += singleRetNpc; } } else { result += "No NPC's Found"; } break; case 2: List<String> retMaps = new ArrayList<>(); data = dataProvider.getData("Map.img"); List<Pair<Integer, String>> mapPairList = new LinkedList<>(); for (MapleData mapAreaData : data.getChildren()) { for (MapleData mapIdData : mapAreaData.getChildren()) { mapPairList.add(new Pair<>(Integer.parseInt(mapIdData.getName()), MapleDataTool.getString(mapIdData.getChildByPath("streetName"), "NO-NAME") + " - " + MapleDataTool.getString(mapIdData.getChildByPath("mapName"), "NO-NAME"))); } } for (Pair<Integer, String> mapPair : mapPairList) { if (mapPair.getRight().toLowerCase().contains(search.toLowerCase())) { retMaps.add(mapPair.getLeft() + " - " + mapPair.getRight()); } } if (retMaps != null && retMaps.size() > 0) { for (String singleRetMap : retMaps) { result += singleRetMap; } } else { result += "No Maps Found"; } break; case 3: List<String> retMobs = new ArrayList<>(); data = dataProvider.getData("Mob.img"); List<Pair<Integer, String>> mobPairList = new LinkedList<>(); for (MapleData mobIdData : data.getChildren()) { mobPairList.add(new Pair<>(Integer.parseInt(mobIdData.getName()), MapleDataTool.getString(mobIdData.getChildByPath("name"), "NO-NAME"))); } for (Pair<Integer, String> mobPair : mobPairList) { if (mobPair.getRight().toLowerCase().contains(search.toLowerCase())) { retMobs.add(mobPair.getLeft() + " - " + mobPair.getRight()); } } if (retMobs != null && retMobs.size() > 0) { for (String singleRetMob : retMobs) { result += singleRetMob; } } else { result += "No Mobs Found"; } break; case 4: List<String> retItems = new ArrayList<>(); for (ItemInformation itemPair : MapleItemInformationProvider.getInstance().getAllItems()) { if (itemPair != null && itemPair.name != null && itemPair.name.toLowerCase().contains(search.toLowerCase())) { retItems.add("\r\n#b" + itemPair.itemId + " " + " #k- " + " #r#z" + itemPair.itemId + "##k"); } } if (retItems != null && retItems.size() > 0) { for (String singleRetItem : retItems) { if (result.length() < 10000) { result += singleRetItem; } else { result += "\r\n#bCouldn't load all items, there are too many results.#k"; return result; } } } else { result += "No Items Found"; } break; case 5: List<String> retQuests = new ArrayList<>(); for (MapleQuest itemPair : MapleQuest.getAllInstances()) { if (itemPair.getName().length() > 0 && itemPair.getName().toLowerCase().contains(search.toLowerCase())) { retQuests.add(itemPair.getId() + " - " + itemPair.getName()); } } if (retQuests != null && retQuests.size() > 0) { for (String singleRetQuest : retQuests) { result += singleRetQuest; } } else { result += "No Quests Found"; } break; case 6: List<String> retSkills = new ArrayList<>(); for (Skill skil : SkillFactory.getAllSkills()) { if (skil.getName() != null && skil.getName().toLowerCase().contains(search.toLowerCase())) { retSkills.add(skil.getId() + " - " + skil.getName()); } } if (retSkills != null && retSkills.size() > 0) { for (String singleRetSkill : retSkills) { result += singleRetSkill; } } else { result += "No Skills Found"; } break; default: result += "Invalid Type"; } return result; } }