package handling.channel.handler; import client.MapleCharacter; import client.MapleClient; import client.PlayerStats; import client.SkillFactory; import client.inventory.Equip; import client.inventory.Item; import client.inventory.ItemFlag; import client.inventory.MapleInventoryType; import client.inventory.ModifyInventory; import constants.ItemConstants; import constants.ServerConstants; import java.util.ArrayList; import java.util.List; import server.MapleInventoryManipulator; import server.MapleItemInformationProvider; import tools.MaplePacketCreator; import tools.data.input.SeekableLittleEndianAccessor; import tools.packet.InventoryPacket; public class ItemScrollHandler { /** * 砸卷 * @param slea * @param c * @param chr * @param cash */ public static void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c, MapleCharacter chr, boolean cash) { // 2D 05 00 FF FF if ((chr == null) || (chr.getMap() == null)) { return; } byte slot = (byte) slea.readShort(); byte dst = (byte) slea.readShort(); if (cash) { Item scroll = chr.getInventory(MapleInventoryType.CASH).getItem(slot); if (scroll == null) { scroll = chr.getInventory(MapleInventoryType.USE).getItem(slot); if (scroll == null) { return; } cash = false; } } byte ws = 0; if (slea.available() >= 3L) { ws = (byte) slea.readShort(); } UseUpgradeScroll((short) slot, (short) dst, (short) ws, c, chr, 0, cash); } /** * 使用卷轴 * @param slot * @param dst * @param ws * @param c * @param chr * @param vegas * @param cash * @return */ public static boolean UseUpgradeScroll(short slot, short dst, short ws, MapleClient c, MapleCharacter chr, int vegas, boolean cash) { MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); chr.setScrolledPosition((short) 0); Equip toScroll; if (dst < 0) { toScroll = (Equip) chr.getInventory(MapleInventoryType.EQUIPPED).getItem(dst); } else { toScroll = (Equip) chr.getInventory(MapleInventoryType.EQUIP).getItem(dst); } if ((toScroll == null) || (c.getPlayer().hasBlockedInventory())) { return false; } byte oldLevel = toScroll.getLevel(); Item scroll; if (cash) { scroll = chr.getInventory(MapleInventoryType.CASH).getItem(slot); } else { scroll = chr.getInventory(MapleInventoryType.USE).getItem(slot); } if (scroll == null) { if (chr.isShowPacket()) { chr.dropMessage(0, "砸卷错误: 卷轴道具为空"); } c.getSession().write(InventoryPacket.getInventoryFull()); return false; } if (chr.isShowPacket()) { chr.dropSpouseMessage(10, new StringBuilder().append("砸卷信息: 卷轴ID ").append(scroll.getItemId()).append(" 卷轴名字 ").append(ii.getName(scroll.getItemId())).toString()); } if ((!ItemConstants.canScroll(toScroll.getItemId()))) { if (chr.isShowPacket()) { chr.dropMessage(0, new StringBuilder().append("砸卷错误: 卷轴是否能对装备进行砸卷 ").append(!ItemConstants.canScroll(toScroll.getItemId())).toString()); } c.getSession().write(InventoryPacket.getInventoryFull()); return false; } List scrollReqs = ii.getScrollReqs(scroll.getItemId()); if ((scrollReqs != null) && (scrollReqs.size() > 0) && (!scrollReqs.contains(toScroll.getItemId()))) { if (chr.isShowPacket()) { chr.dropMessage(0, "砸卷错误: 特定卷轴只能对指定的卷轴进行砸卷."); } c.getSession().write(InventoryPacket.getInventoryFull()); return false; } int scrollCount = scroll.getQuantity(); if (scrollCount <= 0) { chr.dropSpouseMessage(0, new StringBuilder().append("砸卷错误,背包卷轴[").append(ii.getName(scroll.getItemId())).append("]数量为 0 .").toString()); c.getSession().write(InventoryPacket.getInventoryFull()); return false; } Equip scrolled = (Equip) ii.scrollEquipWithId(toScroll, scroll, false, chr, vegas); Equip.ScrollResult scrollSuccess; if (scrolled != null) { if ((scrolled.getLevel() > oldLevel)) { scrollSuccess = Equip.ScrollResult.成功; } else { scrollSuccess = Equip.ScrollResult.失败; } } else { scrollSuccess = Equip.ScrollResult.消失; } // 消耗卷轴 chr.getInventory(ItemConstants.getInventoryType(scroll.getItemId())).removeItem(scroll.getPosition(), (short) 1, false); if (scrollCount == 1) { // 如果只有一个道具了,那么就需要移除道具,否则是更新道具数量 c.getSession().write(InventoryPacket.clearInventoryItem(ItemConstants.getInventoryType(scroll.getItemId()), scroll.getPosition(), false)); } else { c.getSession().write(InventoryPacket.updateInventorySlot(ItemConstants.getInventoryType(scroll.getItemId()), scroll, false)); } c.getSession().write(InventoryPacket.scrolledItem(scroll, toScroll, false)); chr.getMap().broadcastMessage(chr, InventoryPacket.getScrollEffect(chr.getId(), scrollSuccess), vegas == 0); if (scrollSuccess == Equip.ScrollResult.消失) { chr.dropMessage(1,"由于诅咒卷轴的力量,道具消失了!消失了!消失了!" ); c.getSession().write(InventoryPacket.clearInventoryItem(ItemConstants.getInventoryType(toScroll.getItemId()),toScroll.getPosition(), false)); if (dst < 0) { chr.getInventory(MapleInventoryType.EQUIPPED).removeItem(toScroll.getPosition()); } else { chr.getInventory(MapleInventoryType.EQUIP).removeItem(toScroll.getPosition()); } chr.equipChanged(); } return scrollSuccess == Equip.ScrollResult.成功; } }