MapleInventoryManipulator.java
上传用户:gwt600
上传日期:2021-06-03
资源大小:704k
文件大小:29k
源码类别:

游戏

开发平台:

Java

  1. /*
  2. This file is part of the OdinMS Maple Story Server
  3. Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc> 
  4. Matthias Butz <matze@odinms.de>
  5. Jan Christian Meyer <vimes@odinms.de>
  6. This program is free software: you can redistribute it and/or modify
  7. it under the terms of the GNU Affero General Public License version 3
  8. as published by the Free Software Foundation. You may not use, modify
  9. or distribute this program under any other version of the
  10. GNU Affero General Public License.
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU Affero General Public License for more details.
  15. You should have received a copy of the GNU Affero General Public License
  16. along with this program.  If not, see <http://www.gnu.org/licenses/>.
  17.  */
  18. /*
  19.  * MapleInventoryManipulator.java
  20.  * 
  21.  * Created on 27. November 2007, 16:19
  22.  */
  23. package net.sf.odinms.server;
  24. import java.awt.Point;
  25. import java.util.Iterator;
  26. import java.util.List;
  27. import net.sf.odinms.client.Equip;
  28. import net.sf.odinms.client.IItem;
  29. import net.sf.odinms.client.InventoryException;
  30. import net.sf.odinms.client.Item;
  31. import net.sf.odinms.client.MapleBuffStat;
  32. import net.sf.odinms.client.MapleCharacter;
  33. import net.sf.odinms.client.MapleClient;
  34. import net.sf.odinms.client.MapleInventoryType;
  35. import net.sf.odinms.tools.MaplePacketCreator;
  36. import org.slf4j.Logger;
  37. import org.slf4j.LoggerFactory;
  38. /**
  39.  * 
  40.  * @author Matze
  41.  */
  42. public class MapleInventoryManipulator {
  43.     private static Logger log = LoggerFactory.getLogger(MapleInventoryManipulator.class);
  44.     /** Creates a new instance of MapleInventoryManipulator */
  45.     private MapleInventoryManipulator() {
  46.     }
  47.     public static boolean addRing(MapleCharacter chr, int itemId, int ringId) {
  48.         MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
  49.         MapleInventoryType type = ii.getInventoryType(itemId);
  50.         IItem nEquip = ii.getEquipById(itemId, ringId);
  51.         byte newSlot = chr.getInventory(type).addItem(nEquip);
  52.         if (newSlot == -1) {
  53.             return false;
  54.         }
  55.         chr.getClient().getSession().write(MaplePacketCreator.addInventorySlot(type, nEquip));
  56.         return true;
  57.     }
  58.     public static boolean addById(MapleClient c, int itemId, short quantity) {
  59.         return addById(c, itemId, quantity, null);
  60.     }
  61.     public static boolean addById(MapleClient c, int itemId, short quantity, String owner) {
  62.         return addById(c, itemId, quantity, owner, -1);
  63.     }
  64.     public static boolean addById(MapleClient c, int itemId, short quantity, String owner, int petid) {
  65.         MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
  66.         MapleInventoryType type = ii.getInventoryType(itemId);
  67.         if (!type.equals(MapleInventoryType.EQUIP)) {
  68.             short slotMax = ii.getSlotMax(c, itemId);
  69.             List<IItem> existing = c.getPlayer().getInventory(type).listById(itemId);
  70.             if (!ii.isThrowingStar(itemId) && !ii.isBullet(itemId)) {
  71.                 if (existing.size() > 0) { // first update all existing slots to slotMax
  72.                     Iterator<IItem> i = existing.iterator();
  73.                     while (quantity > 0) {
  74.                         if (i.hasNext()) {
  75.                             Item eItem = (Item) i.next();
  76.                             short oldQ = eItem.getQuantity();
  77.                             if (oldQ < slotMax && (eItem.getOwner().equals(owner) || owner == null)) {
  78.                                 short newQ = (short) Math.min(oldQ + quantity, slotMax);
  79.                                 quantity -= (newQ - oldQ);
  80.                                 eItem.setQuantity(newQ);
  81.                                 c.getSession().write(MaplePacketCreator.updateInventorySlot(type, eItem));
  82.                             }
  83.                         } else {
  84.                             break;
  85.                         }
  86.                     }
  87.                 }
  88.                 // add new slots if there is still something left
  89.                 while (quantity > 0 || ii.isThrowingStar(itemId) || ii.isBullet(itemId)) {
  90.                     short newQ = (short) Math.min(quantity, slotMax);
  91.                     if (newQ != 0) {
  92.                         quantity -= newQ;
  93.                         Item nItem = new Item(itemId, (byte) 0, newQ, petid);
  94.                         byte newSlot = c.getPlayer().getInventory(type).addItem(nItem);
  95.                         if (newSlot == -1) {
  96.                             c.getSession().write(MaplePacketCreator.getInventoryFull());
  97.                             c.getSession().write(MaplePacketCreator.getShowInventoryFull());
  98.                             return false;
  99.                         }
  100.                         if (owner != null) {
  101.                             nItem.setOwner(owner);
  102.                         }
  103.                         c.getSession().write(MaplePacketCreator.addInventorySlot(type, nItem));
  104.                         if ((ii.isThrowingStar(itemId) || ii.isBullet(itemId)) && quantity == 0) {
  105.                             break;
  106.                         }
  107.                     } else {
  108.                         c.getSession().write(MaplePacketCreator.enableActions());
  109.                         return false;
  110.                     }
  111.                 }
  112.             } else {
  113.                 // Throwing Stars and Bullets - Add all into one slot regardless of quantity.
  114.                 Item nItem = new Item(itemId, (byte) 0, quantity);
  115.                 byte newSlot = c.getPlayer().getInventory(type).addItem(nItem);
  116.                 if (newSlot == -1) {
  117.                     c.getSession().write(MaplePacketCreator.getInventoryFull());
  118.                     c.getSession().write(MaplePacketCreator.getShowInventoryFull());
  119.                     return false;
  120.                 }
  121.                 c.getSession().write(MaplePacketCreator.addInventorySlot(type, nItem));
  122.                 c.getSession().write(MaplePacketCreator.enableActions());
  123.             }
  124.         } else {
  125.             if (quantity == 1) {
  126.                 IItem nEquip = ii.getEquipById(itemId);
  127.                 if (owner != null) {
  128.                     nEquip.setOwner(owner);
  129.                 }
  130.                 byte newSlot = c.getPlayer().getInventory(type).addItem(nEquip);
  131.                 if (newSlot == -1) {
  132.                     c.getSession().write(MaplePacketCreator.getInventoryFull());
  133.                     c.getSession().write(MaplePacketCreator.getShowInventoryFull());
  134.                     return false;
  135.                 }
  136.                 c.getSession().write(MaplePacketCreator.addInventorySlot(type, nEquip));
  137.             } else {
  138.                 throw new InventoryException("Trying to create equip with non-one quantity");
  139.             }
  140.         }
  141.         return true;
  142.     }
  143.     public static boolean addFromDrop(MapleClient c, IItem item) {
  144.         return addFromDrop(c, item, true);
  145.     }
  146.     public static boolean addFromDrop(MapleClient c, IItem item, boolean show) {
  147.         return addFromDrop(c, item, show, null);
  148.     }
  149.     public static boolean addFromDrop(MapleClient c, IItem item, boolean show, String owner) {
  150.         MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
  151.         MapleInventoryType type = ii.getInventoryType(item.getItemId());
  152.         if (!c.getChannelServer().allowMoreThanOne() && ii.isPickupRestricted(item.getItemId()) && c.getPlayer().haveItem(item.getItemId(), 1, true, false)) {
  153.             c.getSession().write(MaplePacketCreator.getInventoryFull());
  154.             c.getSession().write(MaplePacketCreator.showItemUnavailable());
  155.             return false;
  156.         }
  157.         short quantity = item.getQuantity();
  158.         if (!type.equals(MapleInventoryType.EQUIP)) {
  159.             short slotMax = ii.getSlotMax(c, item.getItemId());
  160.             List<IItem> existing = c.getPlayer().getInventory(type).listById(item.getItemId());
  161.             if (!ii.isThrowingStar(item.getItemId()) && !ii.isBullet(item.getItemId())) {
  162.                 if (existing.size() > 0) { // first update all existing slots to slotMax
  163.                     Iterator<IItem> i = existing.iterator();
  164.                     while (quantity > 0) {
  165.                         if (i.hasNext()) {
  166.                             Item eItem = (Item) i.next();
  167.                             short oldQ = eItem.getQuantity();
  168.                             if (oldQ < slotMax && item.getOwner().equals(eItem.getOwner())) {
  169.                                 short newQ = (short) Math.min(oldQ + quantity, slotMax);
  170.                                 quantity -= (newQ - oldQ);
  171.                                 eItem.setQuantity(newQ);
  172.                                 c.getSession().write(MaplePacketCreator.updateInventorySlot(type, eItem, true));
  173.                             }
  174.                         } else {
  175.                             break;
  176.                         }
  177.                     }
  178.                 }
  179.                 // add new slots if there is still something left
  180.                 while (quantity > 0 || ii.isThrowingStar(item.getItemId()) || ii.isBullet(item.getItemId())) {
  181.                     short newQ = (short) Math.min(quantity, slotMax);
  182.                     quantity -= newQ;
  183.                     Item nItem = new Item(item.getItemId(), (byte) 0, newQ);
  184.                     nItem.setOwner(item.getOwner());
  185.                     byte newSlot = c.getPlayer().getInventory(type).addItem(nItem);
  186.                     if (newSlot == -1) {
  187.                         c.getSession().write(MaplePacketCreator.getInventoryFull());
  188.                         c.getSession().write(MaplePacketCreator.getShowInventoryFull());
  189.                         item.setQuantity((short) (quantity + newQ));
  190.                         return false;
  191.                     }
  192.                     c.getSession().write(MaplePacketCreator.addInventorySlot(type, nItem, true));
  193.                 }
  194.             } else {
  195.                 // Throwing Stars and Bullets - Add all into one slot regardless of quantity.
  196.                 Item nItem = new Item(item.getItemId(), (byte) 0, quantity);
  197.                 byte newSlot = c.getPlayer().getInventory(type).addItem(nItem);
  198.                 if (newSlot == -1) {
  199.                     c.getSession().write(MaplePacketCreator.getInventoryFull());
  200.                     c.getSession().write(MaplePacketCreator.getShowInventoryFull());
  201.                     return false;
  202.                 }
  203.                 c.getSession().write(MaplePacketCreator.addInventorySlot(type, nItem));
  204.                 c.getSession().write(MaplePacketCreator.enableActions());
  205.             }
  206.         } else {
  207.             if (quantity == 1) {
  208.                 byte newSlot = c.getPlayer().getInventory(type).addItem(item);
  209.                 if (newSlot == -1) {
  210.                     c.getSession().write(MaplePacketCreator.getInventoryFull());
  211.                     c.getSession().write(MaplePacketCreator.getShowInventoryFull());
  212.                     return false;
  213.                 }
  214.                 c.getSession().write(MaplePacketCreator.addInventorySlot(type, item, true));
  215.             } else {
  216.                 throw new RuntimeException("Trying to create equip with non-one quantity");
  217.             }
  218.         }
  219.         if (owner != null) {
  220.             item.setOwner(owner);
  221.         }
  222.         if (show) {
  223.             c.getSession().write(MaplePacketCreator.getShowItemGain(item.getItemId(), item.getQuantity()));
  224.         }
  225.         return true;
  226.     }
  227.     public static boolean checkSpace(MapleClient c, int itemid, int quantity, String owner) {
  228.         MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
  229.         MapleInventoryType type = ii.getInventoryType(itemid);
  230.         if (!type.equals(MapleInventoryType.EQUIP)) {
  231.             short slotMax = ii.getSlotMax(c, itemid);
  232.             List<IItem> existing = c.getPlayer().getInventory(type).listById(itemid);
  233.             if (!ii.isThrowingStar(itemid) && !ii.isBullet(itemid)) {
  234.                 if (existing.size() > 0) { // first update all existing slots to slotMax
  235.                     for (IItem eItem : existing) {
  236.                         short oldQ = eItem.getQuantity();
  237.                         if (oldQ < slotMax && owner.equals(eItem.getOwner())) {
  238.                             short newQ = (short) Math.min(oldQ + quantity, slotMax);
  239.                             quantity -= (newQ - oldQ);
  240.                         }
  241.                         if (quantity <= 0) {
  242.                             break;
  243.                         }
  244.                     }
  245.                 }
  246.             }
  247.             // add new slots if there is still something left
  248.             final int numSlotsNeeded;
  249.             if (slotMax > 0) {
  250.                 numSlotsNeeded = (int) (Math.ceil(((double) quantity) / slotMax));
  251.             } else if (ii.isThrowingStar(itemid) || ii.isBullet(itemid)) {
  252.                 numSlotsNeeded = 1;
  253.             } else {
  254.                 numSlotsNeeded = 1;
  255.                 System.err.println("SUCK ERROR - FIX ME! - 0 slotMax");
  256.             }
  257.             return !c.getPlayer().getInventory(type).isFull(numSlotsNeeded - 1);
  258.         } else {
  259.             return !c.getPlayer().getInventory(type).isFull();
  260.         }
  261.     }
  262.     public static void removeFromSlot(MapleClient c, MapleInventoryType type, byte slot, short quantity, boolean fromDrop) {
  263.         removeFromSlot(c, type, slot, quantity, fromDrop, false);
  264.     }
  265.     public static void removeFromSlot(MapleClient c, MapleInventoryType type, byte slot, short quantity, boolean fromDrop, boolean consume) {
  266.         IItem item = c.getPlayer().getInventory(type).getItem(slot);
  267.         MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
  268.         boolean allowZero = consume && (ii.isThrowingStar(item.getItemId()) || ii.isBullet(item.getItemId()));
  269.         c.getPlayer().getInventory(type).removeItem(slot, quantity, allowZero);
  270.         if (item.getQuantity() == 0 && !allowZero) {
  271.             c.getSession().write(MaplePacketCreator.clearInventoryItem(type, item.getPosition(), fromDrop));
  272.         } else {
  273.             c.getSession().write(MaplePacketCreator.updateInventorySlot(type, (Item) item, fromDrop));
  274.         }
  275.     }
  276.     public static void removeById(MapleClient c, MapleInventoryType type, int itemId, int quantity, boolean fromDrop, boolean consume, boolean v) {
  277.         List<IItem> items = c.getPlayer().getInventory(type).listById(itemId);
  278.         int remremove = quantity;
  279.         for (IItem item : items) {
  280.             if (remremove <= item.getQuantity()) {
  281.                 removeFromSlot(c, type, item.getPosition(), (short) remremove, fromDrop, consume);
  282.                 remremove = 0;
  283.                 break;
  284.             } else {
  285.                 remremove -= item.getQuantity();
  286.                 removeFromSlot(c, type, item.getPosition(), item.getQuantity(), fromDrop, consume);
  287.             }
  288.         }
  289.         if (remremove > 0) {
  290.             throw new InventoryException("[h4x] Not enough cheese available (" + itemId + ", " + (quantity - remremove) +
  291.                     "/" + quantity + ")");
  292.         }
  293.     }
  294.     public static void removeById(MapleClient c, MapleInventoryType type, int itemId, int quantity, boolean fromDrop, boolean consume) {
  295.         List<IItem> items = c.getPlayer().getInventory(type).listById(itemId);
  296.         int remremove = quantity;
  297.         for (IItem item : items) {
  298.             if (remremove <= item.getQuantity()) {
  299.                 removeFromSlot(c, type, item.getPosition(), (short) remremove, fromDrop, consume);
  300.                 remremove = 0;
  301.                 break;
  302.             } else {
  303.                 remremove -= item.getQuantity();
  304.                 removeFromSlot(c, type, item.getPosition(), item.getQuantity(), fromDrop, consume);
  305.             }
  306.         }
  307.         if (remremove > 0) {
  308.             throw new InventoryException("[h4x] Not enough cheese available (" + itemId + ", " + (quantity - remremove) +
  309.                     "/" + quantity + ")");
  310.         }
  311.     }
  312.     public static void removeAllById(MapleClient c, int itemId, boolean checkEquipped) {
  313.         MapleInventoryType type = MapleItemInformationProvider.getInstance().getInventoryType(itemId);
  314.         for (IItem item : c.getPlayer().getInventory(type).listById(itemId)) {
  315.             if (item != null) {
  316.                 removeFromSlot(c, type, item.getPosition(), item.getQuantity(), true, false);
  317.             }
  318.         }
  319.         if (checkEquipped) {
  320.             IItem ii = c.getPlayer().getInventory(type).findById(itemId);
  321.             if (ii != null) {
  322.                 c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).removeItem(ii.getPosition());
  323.                 c.getPlayer().equipChanged();
  324.             }
  325.         }
  326.     }
  327.     public static void move(MapleClient c, MapleInventoryType type, byte src, byte dst) {
  328.         if (src < 0 || dst < 0) {
  329.             return;
  330.         }
  331.         MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
  332.         IItem source = c.getPlayer().getInventory(type).getItem(src);
  333.         IItem initialTarget = c.getPlayer().getInventory(type).getItem(dst);
  334.         if (source == null) {
  335.             return;
  336.         }
  337.         short olddstQ = -1;
  338.         if (initialTarget != null) {
  339.             olddstQ = initialTarget.getQuantity();
  340.         }
  341.         short oldsrcQ = source.getQuantity();
  342.         short slotMax = ii.getSlotMax(c, source.getItemId());
  343.         c.getPlayer().getInventory(type).move(src, dst, slotMax);
  344.         if (!type.equals(MapleInventoryType.EQUIP) && initialTarget != null && initialTarget.getItemId() == source.getItemId() && !ii.isThrowingStar(source.getItemId()) && !ii.isBullet(source.getItemId())) {
  345.             if ((olddstQ + oldsrcQ) > slotMax) {
  346.                 c.getSession().write(MaplePacketCreator.moveAndMergeWithRestInventoryItem(type, src, dst, (short) ((olddstQ + oldsrcQ) - slotMax), slotMax));
  347.             } else {
  348.                 c.getSession().write(MaplePacketCreator.moveAndMergeInventoryItem(type, src, dst, ((Item) c.getPlayer().getInventory(type).getItem(dst)).getQuantity()));
  349.             }
  350.         } else {
  351.             c.getSession().write(MaplePacketCreator.moveInventoryItem(type, src, dst));
  352.         }
  353.     }
  354.     public static void equip(MapleClient c, byte src, byte dst) {
  355.         MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
  356.         Equip source = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(src);
  357.         Equip target = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(dst);
  358.         if (source == null) {
  359.             return;
  360.         }
  361.         if (source.getItemId() == 1812006) {
  362.             removeAllById(c, source.getItemId(), false);
  363.             c.getPlayer().dropMessage(1, "Magic Scale Has Been Blocked");
  364.             return;
  365.         }
  366.         if (dst == -6) {
  367.             // unequip the overall
  368.             IItem top = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -5);
  369.             if (top != null && ii.isOverall(top.getItemId())) {
  370.                 if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
  371.                     c.getSession().write(MaplePacketCreator.getInventoryFull());
  372.                     c.getSession().write(MaplePacketCreator.getShowInventoryFull());
  373.                     return;
  374.                 }
  375.                 unequip(c, (byte) -5, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
  376.             }
  377.         } else if (dst == -5) {
  378.             // unequip the bottom and top
  379.             IItem top = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -5);
  380.             IItem bottom = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -6);
  381.             if (top != null && ii.isOverall(source.getItemId())) {
  382.                 if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull(bottom != null && ii.isOverall(source.getItemId()) ? 1 : 0)) {
  383.                     c.getSession().write(MaplePacketCreator.getInventoryFull());
  384.                     c.getSession().write(MaplePacketCreator.getShowInventoryFull());
  385.                     return;
  386.                 }
  387.                 unequip(c, (byte) -5, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
  388.             }
  389.             if (bottom != null && ii.isOverall(source.getItemId())) {
  390.                 if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
  391.                     c.getSession().write(MaplePacketCreator.getInventoryFull());
  392.                     c.getSession().write(MaplePacketCreator.getShowInventoryFull());
  393.                     return;
  394.                 }
  395.                 unequip(c, (byte) -6, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
  396.             }
  397.         } else if (dst == -10) {
  398.             // check if weapon is two-handed
  399.             IItem weapon = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -11);
  400.             if (weapon != null && ii.isTwoHanded(weapon.getItemId())) {
  401.                 if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
  402.                     c.getSession().write(MaplePacketCreator.getInventoryFull());
  403.                     c.getSession().write(MaplePacketCreator.getShowInventoryFull());
  404.                     return;
  405.                 }
  406.                 unequip(c, (byte) -11, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
  407.             }
  408.         } else if (dst == -11) {
  409.             IItem shield = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -10);
  410.             if (shield != null && ii.isTwoHanded(source.getItemId())) {
  411.                 if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
  412.                     c.getSession().write(MaplePacketCreator.getInventoryFull());
  413.                     c.getSession().write(MaplePacketCreator.getShowInventoryFull());
  414.                     return;
  415.                 }
  416.                 unequip(c, (byte) -10, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
  417.             }
  418.         } else if (dst == -18) {
  419.             c.getPlayer().getMount().setItemId(source.getItemId());
  420.         }
  421.         source = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(src);
  422.         target = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(dst);
  423.         c.getPlayer().getInventory(MapleInventoryType.EQUIP).removeSlot(src);
  424.         if (target != null) {
  425.             c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).removeSlot(dst);
  426.         }
  427.         source.setPosition(dst);
  428.         c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).addFromDB(source);
  429.         if (target != null) {
  430.             target.setPosition(src);
  431.             c.getPlayer().getInventory(MapleInventoryType.EQUIP).addFromDB(target);
  432.         }
  433.         if (c.getPlayer().getBuffedValue(MapleBuffStat.BOOSTER) != null && ii.isWeapon(source.getItemId())) {
  434.             c.getPlayer().cancelBuffStats(MapleBuffStat.BOOSTER);
  435.         }
  436.         c.getSession().write(MaplePacketCreator.moveInventoryItem(MapleInventoryType.EQUIP, src, dst, (byte) 2));
  437.         c.getPlayer().equipChanged();
  438.     }
  439.     public static void unequip(MapleClient c, byte src, byte dst) {
  440.         Equip source = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(src);
  441.         Equip target = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(dst);
  442.         if (dst < 0) {
  443.             log.warn("Unequipping to negative slot. ({}: {}->{})", new Object[]{c.getPlayer().getName(), src, dst});
  444.         }
  445.         if (source == null) {
  446.             return;
  447.         }
  448.         if (target != null && src <= 0) {
  449.             // do not allow switching with equip
  450.             c.getSession().write(MaplePacketCreator.getInventoryFull());
  451.             return;
  452.         }
  453.         c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).removeSlot(src);
  454.         if (target != null) {
  455.             c.getPlayer().getInventory(MapleInventoryType.EQUIP).removeSlot(dst);
  456.         }
  457.         source.setPosition(dst);
  458.         c.getPlayer().getInventory(MapleInventoryType.EQUIP).addFromDB(source);
  459.         if (target != null) {
  460.             target.setPosition(src);
  461.             c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).addFromDB(target);
  462.         }
  463.         c.getSession().write(MaplePacketCreator.moveInventoryItem(MapleInventoryType.EQUIP, src, dst, (byte) 1));
  464.         c.getPlayer().equipChanged();
  465.     }
  466.     public static void drop(MapleClient c, MapleInventoryType type, byte src, short quantity) {
  467.         MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
  468.         if (src < 0) {
  469.             type = MapleInventoryType.EQUIPPED;
  470.         }
  471.         IItem source = c.getPlayer().getInventory(type).getItem(src);
  472.         int itemId = source.getItemId();
  473.         if (c.getPlayer().getItemEffect() == itemId && source.getQuantity() == 1) {
  474.             c.getPlayer().setItemEffect(0);
  475.             c.getPlayer().getMap().broadcastMessage(MaplePacketCreator.itemEffect(c.getPlayer().getId(), 0));
  476.         } else if (itemId == 5370000 || itemId == 5370001) {
  477.             if (c.getPlayer().getItemQuantity(itemId, false) == 1) {
  478.                 c.getPlayer().setChalkboard(null);
  479.             }
  480.         }
  481.         if (quantity < 0 || source == null || quantity == 0 && !ii.isThrowingStar(itemId) && !ii.isBullet(itemId)) {
  482.             String message = "Dropping " + quantity + " " + (source == null ? "?" : itemId) + " (" +
  483.                     type.name() + "/" + src + ")";
  484.             //AutobanManager.getInstance().addPoints(c, 1000, 0, message);
  485.             log.info(MapleClient.getLogMessage(c, message));
  486.             c.getSession().close(); // disconnect the client as is inventory is inconsistent with the serverside inventory -> fuck
  487.             return;
  488.         }
  489.         Point dropPos = new Point(c.getPlayer().getPosition());
  490.         //dropPos.y -= 99;
  491.         if (quantity < source.getQuantity() && !ii.isThrowingStar(itemId) && !ii.isBullet(itemId)) {
  492.             IItem target = source.copy();
  493.             target.setQuantity(quantity);
  494.             source.setQuantity((short) (source.getQuantity() - quantity));
  495.             c.getSession().write(MaplePacketCreator.dropInventoryItemUpdate(type, source));
  496.             boolean weddingRing = source.getItemId() == 1112803 || source.getItemId() == 1112806 || source.getItemId() == 1112807 || source.getItemId() == 1112809;
  497.             if (weddingRing) {
  498.                 c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
  499.             } else if (c.getPlayer().getMap().getEverlast()) {
  500.                 if (!c.getChannelServer().allowUndroppablesDrop() && ii.isDropRestricted(target.getItemId())) {
  501.                     c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
  502.                 } else {
  503.                     c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true, false);
  504.                 }
  505.             } else {
  506.                 if (!c.getChannelServer().allowUndroppablesDrop() && ii.isDropRestricted(target.getItemId())) {
  507.                     c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
  508.                 } else {
  509.                     c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true, true);
  510.                 }
  511.             }
  512.         } else {
  513.             c.getPlayer().getInventory(type).removeSlot(src);
  514.             c.getSession().write(MaplePacketCreator.dropInventoryItem(
  515.                     (src < 0 ? MapleInventoryType.EQUIP : type), src));
  516.             if (src < 0) {
  517.                 c.getPlayer().equipChanged();
  518.             }
  519.             if (c.getPlayer().getMap().getEverlast()) {
  520.                 if (!c.getChannelServer().allowUndroppablesDrop() && ii.isDropRestricted(itemId)) {
  521.                     c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos);
  522.                 } else {
  523.                     c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true, false);
  524.                 }
  525.             } else {
  526.                 if (!c.getChannelServer().allowUndroppablesDrop() && ii.isDropRestricted(itemId)) {
  527.                     c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos);
  528.                 } else {
  529.                     c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true, true);
  530.                 }
  531.             }
  532.         }
  533.     }
  534. }