From 383495a7e91ca85f6dc0c506506ce7a1ec144943 Mon Sep 17 00:00:00 2001 From: ronancpl Date: Thu, 2 May 2019 13:48:49 -0300 Subject: [PATCH] Clean slate counting Vicious Hammer + Scroll Handler patch Improved clean slate, now taking Vicious Hammer slots into max upgrade slots account. Solved some exploit cases within Scroll Handler. --- .../channel/handlers/ScrollHandler.java | 215 ++++++++++-------- .../channel/handlers/UseCashItemHandler.java | 2 +- src/server/MapleItemInformationProvider.java | 2 +- 3 files changed, 124 insertions(+), 95 deletions(-) diff --git a/src/net/server/channel/handlers/ScrollHandler.java b/src/net/server/channel/handlers/ScrollHandler.java index 40d1b1c2a1..654463ec36 100644 --- a/src/net/server/channel/handlers/ScrollHandler.java +++ b/src/net/server/channel/handlers/ScrollHandler.java @@ -49,106 +49,135 @@ public final class ScrollHandler extends AbstractMaplePacketHandler { @Override public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { - slea.readInt(); // whatever... - short slot = slea.readShort(); - short dst = slea.readShort(); - byte ws = (byte) slea.readShort(); - boolean whiteScroll = false; // white scroll being used? - boolean legendarySpirit = false; // legendary spirit skill - if ((ws & 2) == 2) { - whiteScroll = true; - } - - MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); - MapleCharacter chr = c.getPlayer(); - Equip toScroll = (Equip) chr.getInventory(MapleInventoryType.EQUIPPED).getItem(dst); - Skill LegendarySpirit = SkillFactory.getSkill(1003); - if (chr.getSkillLevel(LegendarySpirit) > 0 && dst >= 0) { - legendarySpirit = true; - toScroll = (Equip) chr.getInventory(MapleInventoryType.EQUIP).getItem(dst); - } - byte oldLevel = toScroll.getLevel(); - byte oldSlots = toScroll.getUpgradeSlots(); - MapleInventory useInventory = chr.getInventory(MapleInventoryType.USE); - Item scroll = useInventory.getItem(slot); - Item wscroll = null; + if (c.tryacquireClient()) { + try { + slea.readInt(); // whatever... + short slot = slea.readShort(); + short dst = slea.readShort(); + byte ws = (byte) slea.readShort(); + boolean whiteScroll = false; // white scroll being used? + boolean legendarySpirit = false; // legendary spirit skill + if ((ws & 2) == 2) { + whiteScroll = true; + } - if (ItemConstants.isCleanSlate(scroll.getItemId())) { - Map eqStats = ii.getEquipStats(toScroll.getItemId()); // clean slate issue found thanks to Masterrulax - if (eqStats == null || eqStats.get("tuc") == 0) { - c.announce(MaplePacketCreator.getInventoryFull()); - return; - } - } else if (!ItemConstants.isModifierScroll(scroll.getItemId()) && ((Equip) toScroll).getUpgradeSlots() < 1) { - c.announce(MaplePacketCreator.getInventoryFull()); - return; - } - - List scrollReqs = ii.getScrollReqs(scroll.getItemId()); - if (scrollReqs.size() > 0 && !scrollReqs.contains(toScroll.getItemId())) { - c.announce(MaplePacketCreator.getInventoryFull()); - return; - } - if (whiteScroll) { - wscroll = useInventory.findById(2340000); - if (wscroll == null) { - whiteScroll = false; - } - } + MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); + MapleCharacter chr = c.getPlayer(); + Equip toScroll = (Equip) chr.getInventory(MapleInventoryType.EQUIPPED).getItem(dst); + Skill LegendarySpirit = SkillFactory.getSkill(1003); + if (chr.getSkillLevel(LegendarySpirit) > 0 && dst >= 0) { + legendarySpirit = true; + toScroll = (Equip) chr.getInventory(MapleInventoryType.EQUIP).getItem(dst); + } + byte oldLevel = toScroll.getLevel(); + byte oldSlots = toScroll.getUpgradeSlots(); + MapleInventory useInventory = chr.getInventory(MapleInventoryType.USE); + Item scroll = useInventory.getItem(slot); + Item wscroll = null; - if (!ItemConstants.isChaosScroll(scroll.getItemId()) && !ItemConstants.isCleanSlate(scroll.getItemId())) { - if (!canScroll(scroll.getItemId(), toScroll.getItemId())) { - return; - } - } - - if (ItemConstants.isCleanSlate(scroll.getItemId()) && !ii.canUseCleanSlate(toScroll)) { - return; - } - - Equip scrolled = (Equip) ii.scrollEquipWithId(toScroll, scroll.getItemId(), whiteScroll, 0, chr.isGM()); - ScrollResult scrollSuccess = Equip.ScrollResult.FAIL; // fail - if (scrolled == null) { - scrollSuccess = Equip.ScrollResult.CURSE; - } else if (scrolled.getLevel() > oldLevel || (ItemConstants.isCleanSlate(scroll.getItemId()) && scrolled.getUpgradeSlots() == oldSlots + 1) || ItemConstants.isFlagModifier(scroll.getItemId(), scrolled.getFlag())) { - scrollSuccess = Equip.ScrollResult.SUCCESS; - } - MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, scroll.getPosition(), (short) 1, false); - if (whiteScroll && !ItemConstants.isCleanSlate(scroll.getItemId())) { - MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, wscroll.getPosition(), (short) 1, false, false); - } - final List mods = new ArrayList<>(); - if (scrollSuccess == Equip.ScrollResult.CURSE) { - if(!ItemConstants.isWeddingRing(toScroll.getItemId())) { - mods.add(new ModifyInventory(3, toScroll)); - if (dst < 0) { - MapleInventory inv = chr.getInventory(MapleInventoryType.EQUIPPED); + if (ItemConstants.isCleanSlate(scroll.getItemId())) { + Map eqStats = ii.getEquipStats(toScroll.getItemId()); // clean slate issue found thanks to Masterrulax + if (eqStats == null || eqStats.get("tuc") == 0) { + c.announce(MaplePacketCreator.getInventoryFull()); + return; + } + } else if (!ItemConstants.isModifierScroll(scroll.getItemId()) && ((Equip) toScroll).getUpgradeSlots() < 1) { + c.announce(MaplePacketCreator.getInventoryFull()); + return; + } + + List scrollReqs = ii.getScrollReqs(scroll.getItemId()); + if (scrollReqs.size() > 0 && !scrollReqs.contains(toScroll.getItemId())) { + c.announce(MaplePacketCreator.getInventoryFull()); + return; + } + if (whiteScroll) { + wscroll = useInventory.findById(2340000); + if (wscroll == null) { + whiteScroll = false; + } + } + + if (!ItemConstants.isChaosScroll(scroll.getItemId()) && !ItemConstants.isCleanSlate(scroll.getItemId())) { + if (!canScroll(scroll.getItemId(), toScroll.getItemId())) { + return; + } + } + + if (ItemConstants.isCleanSlate(scroll.getItemId()) && !ii.canUseCleanSlate(toScroll)) { + return; + } + + Equip scrolled = (Equip) ii.scrollEquipWithId(toScroll, scroll.getItemId(), whiteScroll, 0, chr.isGM()); + ScrollResult scrollSuccess = Equip.ScrollResult.FAIL; // fail + if (scrolled == null) { + scrollSuccess = Equip.ScrollResult.CURSE; + } else if (scrolled.getLevel() > oldLevel || (ItemConstants.isCleanSlate(scroll.getItemId()) && scrolled.getUpgradeSlots() == oldSlots + 1) || ItemConstants.isFlagModifier(scroll.getItemId(), scrolled.getFlag())) { + scrollSuccess = Equip.ScrollResult.SUCCESS; + } + + useInventory.lockInventory(); + try { + if (scroll.getQuantity() < 1) { + return; + } - inv.lockInventory(); - try { - chr.unequippedItem(toScroll); - inv.removeItem(toScroll.getPosition()); - } finally { - inv.unlockInventory(); + if (whiteScroll && !ItemConstants.isCleanSlate(scroll.getItemId())) { + if (wscroll.getQuantity() < 1) { + return; + } + + MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, wscroll.getPosition(), (short) 1, false, false); + } + + MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, scroll.getPosition(), (short) 1, false); + } finally { + useInventory.unlockInventory(); + } + + final List mods = new ArrayList<>(); + if (scrollSuccess == Equip.ScrollResult.CURSE) { + if(!ItemConstants.isWeddingRing(toScroll.getItemId())) { + mods.add(new ModifyInventory(3, toScroll)); + if (dst < 0) { + MapleInventory inv = chr.getInventory(MapleInventoryType.EQUIPPED); + + inv.lockInventory(); + try { + chr.unequippedItem(toScroll); + inv.removeItem(toScroll.getPosition()); + } finally { + inv.unlockInventory(); + } + } else { + MapleInventory inv = chr.getInventory(MapleInventoryType.EQUIP); + + inv.lockInventory(); + try { + inv.removeItem(toScroll.getPosition()); + } finally { + inv.unlockInventory(); + } + } + } else { + scrolled = toScroll; + scrollSuccess = Equip.ScrollResult.FAIL; + + mods.add(new ModifyInventory(3, scrolled)); + mods.add(new ModifyInventory(0, scrolled)); } } else { - chr.getInventory(MapleInventoryType.EQUIP).removeItem(toScroll.getPosition()); + mods.add(new ModifyInventory(3, scrolled)); + mods.add(new ModifyInventory(0, scrolled)); } - } else { - scrolled = toScroll; - scrollSuccess = Equip.ScrollResult.FAIL; - - mods.add(new ModifyInventory(3, scrolled)); - mods.add(new ModifyInventory(0, scrolled)); + c.announce(MaplePacketCreator.modifyInventory(true, mods)); + chr.getMap().broadcastMessage(MaplePacketCreator.getScrollEffect(chr.getId(), scrollSuccess, legendarySpirit)); + if (dst < 0 && (scrollSuccess == Equip.ScrollResult.SUCCESS || scrollSuccess == Equip.ScrollResult.CURSE)) { + chr.equipChanged(); + } + } finally { + c.releaseClient(); } - } else { - mods.add(new ModifyInventory(3, scrolled)); - mods.add(new ModifyInventory(0, scrolled)); - } - c.announce(MaplePacketCreator.modifyInventory(true, mods)); - chr.getMap().broadcastMessage(MaplePacketCreator.getScrollEffect(chr.getId(), scrollSuccess, legendarySpirit)); - if (dst < 0 && (scrollSuccess == Equip.ScrollResult.SUCCESS || scrollSuccess == Equip.ScrollResult.CURSE)) { - chr.equipChanged(); } } diff --git a/src/net/server/channel/handlers/UseCashItemHandler.java b/src/net/server/channel/handlers/UseCashItemHandler.java index 00bd0c5b20..929637f2da 100644 --- a/src/net/server/channel/handlers/UseCashItemHandler.java +++ b/src/net/server/channel/handlers/UseCashItemHandler.java @@ -507,7 +507,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler { int itemSlot = slea.readInt(); slea.readInt(); final Equip equip = (Equip) player.getInventory(MapleInventoryType.EQUIP).getItem((short) itemSlot); - if (equip.getVicious() == 2 || player.getInventory(MapleInventoryType.CASH).findById(5570000) == null) { + if (equip.getVicious() >= 2 || player.getInventory(MapleInventoryType.CASH).findById(5570000) == null) { return; } equip.setVicious(equip.getVicious() + 1); diff --git a/src/server/MapleItemInformationProvider.java b/src/server/MapleItemInformationProvider.java index 1881e8c7f1..8758e6797e 100644 --- a/src/server/MapleItemInformationProvider.java +++ b/src/server/MapleItemInformationProvider.java @@ -913,7 +913,7 @@ public class MapleItemInformationProvider { public boolean canUseCleanSlate(Equip nEquip) { Map eqstats = this.getEquipStats(nEquip.getItemId()); - return ServerConstants.USE_ENHANCED_CLNSLATE || nEquip.getUpgradeSlots() < (byte) (eqstats.get("tuc") + nEquipe.getVicious()); // issue with clean slate found thanks to Masterrulax + return ServerConstants.USE_ENHANCED_CLNSLATE || nEquip.getUpgradeSlots() < (byte) (eqstats.get("tuc") + nEquip.getVicious()); // issue with clean slate found thanks to Masterrulax, vicious added in the check thanks to Crypter (CrypterDEV) } public Item scrollEquipWithId(Item equip, int scrollId, boolean usingWhiteScroll, int vegaItemId, boolean isGM) {