public static boolean UseUpgradeScroll(final short slot, final short dst, final short ws, final MapleClient c, final MapleCharacter chr, final int vegas, final boolean legendarySpirit) {
boolean whiteScroll = false; // white scroll being used?
final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
chr.setScrolledPosition((short) 0);
if ((ws & 2) == 2) {
whiteScroll = true;
}
Equip toScroll = null;
if (dst < 0) {
toScroll = (Equip) chr.getInventory(MapleInventoryType.EQUIPPED).getItem(dst);
} else /*if (legendarySpirit)*/ {//may want to create a boolean for strengthen ui? lol
toScroll = (Equip) chr.getInventory(MapleInventoryType.EQUIP).getItem(dst);
}
// if (toScroll == null || c.getPlayer().hasBlockedInventory()) {//removed just in case :P
// c.getSession().write(CWvsContext.enableActions());
// return false;
// }
//07 00 F5 FF 01 00 00
final byte oldLevel = toScroll.getLevel(); //07
final byte oldEnhance = toScroll.getEnhance(); // 00
final byte oldState = toScroll.getState(); // F5
final short oldFlag = toScroll.getFlag(); // FF 01
final short oldSlots = toScroll.getUpgradeSlots(); // v146+
Item scroll = chr.getInventory(MapleInventoryType.USE).getItem(slot);
if (scroll == null) {
scroll = chr.getInventory(MapleInventoryType.CASH).getItem(slot);
if (scroll == null) {
c.getSession().write(InventoryPacket.getInventoryFull());
c.getSession().write(CWvsContext.enableActions());
return false;
}
}
if (scroll.getItemId() == 5064200) { //TODO: test this
Item item = chr.getInventory(MapleInventoryType.EQUIPPED).getItem(toScroll.getPosition());
Equip equip = (Equip) item;
int itemid = toScroll.getItemId();
int potential1 = equip.getPotential1();
int potential2 = equip.getPotential2();
int potential3 = equip.getPotential3();
int bonuspotential1 = equip.getBonusPotential1();
int bonuspotential2 = equip.getBonusPotential2();
short position = toScroll.getPosition();
chr.getInventory(MapleInventoryType.EQUIPPED).removeItem(toScroll.getPosition());
Equip neweq = (Equip) ii.getEquipById(itemid);
neweq.setPotential1(potential1);
neweq.setPotential2(potential2);
neweq.setPotential3(potential3);
neweq.setBonusPotential1(bonuspotential1);
neweq.setBonusPotential2(bonuspotential2);
neweq.setPosition(position);
MapleInventoryManipulator.addbyItem(c, neweq);
}
if (GameConstants.isAzwanScroll(scroll.getItemId())) {
if (toScroll.getUpgradeSlots() < MapleItemInformationProvider.getInstance().getEquipStats(scroll.getItemId()).get("tuc")) {
c.getSession().write(InventoryPacket.getInventoryFull());
c.getSession().write(CWvsContext.enableActions());
return false;
}
}
if (!GameConstants.isSpecialScroll(scroll.getItemId()) && !GameConstants.isCleanSlate(scroll.getItemId()) && !GameConstants.isEquipScroll(scroll.getItemId()) && !GameConstants.isPotentialScroll(scroll.getItemId())) {
if (toScroll.getUpgradeSlots() < 1) {
c.getSession().write(InventoryPacket.getInventoryFull());
c.getSession().write(CWvsContext.enableActions());
return false;
}
} else if (GameConstants.isEquipScroll(scroll.getItemId())) {
if (toScroll.getUpgradeSlots() >= 1 || toScroll.getEnhance() >= 100 || vegas > 0 || ii.isCash(toScroll.getItemId())) {
c.getSession().write(InventoryPacket.getInventoryFull());
c.getSession().write(CWvsContext.enableActions());
return false;
}
} else if (GameConstants.isPotentialScroll(scroll.getItemId())) {
final boolean isEpic = scroll.getItemId() / 100 == 20497 && scroll.getItemId() < 2049750;
final boolean isUnique = scroll.getItemId() / 100 == 20497 && scroll.getItemId() >= 2049750;
if ((!isEpic && !isUnique && toScroll.getState() >= 1) || (isEpic && toScroll.getState() >= 18) || (isUnique && toScroll.getState() >= 19) || (toScroll.getLevel() == 0 && toScroll.getUpgradeSlots() == 0 && toScroll.getItemId() / 10000 != 135/* && !isEpic && !isUnique*/) || vegas > 0 || ii.isCash(toScroll.getItemId())) {
c.getSession().write(InventoryPacket.getInventoryFull());
c.getSession().write(CWvsContext.enableActions());
return false;
}
} else if (GameConstants.isSpecialScroll(scroll.getItemId())) {
if (ii.isCash(toScroll.getItemId()) || toScroll.getEnhance() >= 12) {
c.getSession().write(InventoryPacket.getInventoryFull());
c.getSession().write(CWvsContext.enableActions());
return false;
}
}
if (!GameConstants.canScroll(toScroll.getItemId()) && !GameConstants.isChaosScroll(toScroll.getItemId())) {
c.getSession().write(InventoryPacket.getInventoryFull());
c.getSession().write(CWvsContext.enableActions());
return false;
}
if ((GameConstants.isCleanSlate(scroll.getItemId()) || GameConstants.isTablet(scroll.getItemId()) || GameConstants.isGeneralScroll(scroll.getItemId()) || GameConstants.isChaosScroll(scroll.getItemId())) && (vegas > 0 || ii.isCash(toScroll.getItemId()))) {
c.getSession().write(InventoryPacket.getInventoryFull());
c.getSession().write(CWvsContext.enableActions());
return false;
}
if (GameConstants.isTablet(scroll.getItemId()) && toScroll.getDurability() < 0) { //not a durability item
c.getSession().write(InventoryPacket.getInventoryFull());
c.getSession().write(CWvsContext.enableActions());
return false;
} else if ((!GameConstants.isTablet(scroll.getItemId()) && !GameConstants.isPotentialScroll(scroll.getItemId()) && !GameConstants.isEquipScroll(scroll.getItemId()) && !GameConstants.isCleanSlate(scroll.getItemId()) && !GameConstants.isSpecialScroll(scroll.getItemId()) && !GameConstants.isChaosScroll(scroll.getItemId())) && toScroll.getDurability() >= 0) {
c.getSession().write(InventoryPacket.getInventoryFull());
c.getSession().write(CWvsContext.enableActions());
return false;
}
Item wscroll = null;
// Anti cheat and validation
List<Integer> scrollReqs = ii.getScrollReqs(scroll.getItemId());
if (scrollReqs != null && scrollReqs.size() > 0 && !scrollReqs.contains(toScroll.getItemId())) {
c.getSession().write(InventoryPacket.getInventoryFull());
c.getSession().write(CWvsContext.enableActions());
return false;
}
if (whiteScroll) {
wscroll = chr.getInventory(MapleInventoryType.USE).findById(2340000);
if (wscroll == null) {
whiteScroll = false;
}
}
if (GameConstants.isTablet(scroll.getItemId()) || GameConstants.isGeneralScroll(scroll.getItemId())) {
switch (scroll.getItemId() % 1000 / 100) {
case 0: //1h
if (GameConstants.isTwoHanded(toScroll.getItemId()) || !GameConstants.isWeapon(toScroll.getItemId())) {
c.getSession().write(CWvsContext.enableActions());
return false;
}
break;
case 1: //2h
if (!GameConstants.isTwoHanded(toScroll.getItemId()) || !GameConstants.isWeapon(toScroll.getItemId())) {
c.getSession().write(CWvsContext.enableActions());
return false;
}
break;
case 2: //armor
if (GameConstants.isAccessory(toScroll.getItemId()) || GameConstants.isWeapon(toScroll.getItemId())) {
c.getSession().write(CWvsContext.enableActions());
return false;
}
break;
case 3: //accessory
if (!GameConstants.isAccessory(toScroll.getItemId()) || GameConstants.isWeapon(toScroll.getItemId())) {
c.getSession().write(CWvsContext.enableActions());
return false;
}
break;
}
} else if (!GameConstants.isAccessoryScroll(scroll.getItemId()) && !GameConstants.isChaosScroll(scroll.getItemId()) && !GameConstants.isCleanSlate(scroll.getItemId()) && !GameConstants.isEquipScroll(scroll.getItemId()) && !GameConstants.isPotentialScroll(scroll.getItemId()) && !GameConstants.isSpecialScroll(scroll.getItemId())) {
if (!ii.canScroll(scroll.getItemId(), toScroll.getItemId())) {
c.getSession().write(CWvsContext.enableActions());
return false;
}
}
if (GameConstants.isAccessoryScroll(scroll.getItemId()) && !GameConstants.isAccessory(toScroll.getItemId())) {
c.getSession().write(CWvsContext.enableActions());
return false;
}
if (scroll.getQuantity() <= 0) {
c.getSession().write(CWvsContext.enableActions());
return false;
}
if (legendarySpirit && vegas == 0) {
if (chr.getSkillLevel(SkillFactory.getSkill(PlayerStats.getSkillByJob(1003, chr.getJob()))) <= 0) {
c.getSession().write(CWvsContext.enableActions());
return false;
}
}
// Scroll Success/ Failure/ Curse
Equip scrolled = (Equip) ii.scrollEquipWithId(toScroll, scroll, whiteScroll, chr, vegas);
ScrollResult scrollSuccess;
if (scrolled == null) {
if (ItemFlag.SHIELD_WARD.check(oldFlag)) {
scrolled = toScroll;
scrollSuccess = Equip.ScrollResult.FAIL;
scrolled.setFlag((short) (oldFlag - ItemFlag.SHIELD_WARD.getValue()));
} else {
scrollSuccess = Equip.ScrollResult.CURSE;
}
} else if ((scroll.getItemId() / 100 == 20497 && scrolled.getState() == 1) || scrolled.getLevel() > oldLevel || scrolled.getEnhance() > oldEnhance || scrolled.getState() > oldState || scrolled.getFlag() > oldFlag) {
scrollSuccess = Equip.ScrollResult.SUCCESS;
} else if ((GameConstants.isCleanSlate(scroll.getItemId()) && scrolled.getUpgradeSlots() > oldSlots)) {
scrollSuccess = Equip.ScrollResult.SUCCESS;
} else if (c.getPlayer().isGM()) {
scrollSuccess = Equip.ScrollResult.SUCCESS;
} else {
scrollSuccess = Equip.ScrollResult.FAIL;
}
// Update
chr.getInventory(GameConstants.getInventoryType(scroll.getItemId())).removeItem(scroll.getPosition(), (short) 1, false);
if (whiteScroll) {
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, wscroll.getPosition(), (short) 1, false, false);
} else if (scrollSuccess == Equip.ScrollResult.FAIL && scrolled.getUpgradeSlots() < oldSlots && c.getPlayer().getInventory(MapleInventoryType.CASH).findById(5640000) != null) {
chr.setScrolledPosition(scrolled.getPosition());
if (vegas == 0) {
c.getSession().write(CWvsContext.pamSongUI());
}
}
if (scrollSuccess == Equip.ScrollResult.CURSE) {
c.getSession().write(InventoryPacket.scrolledItem(scroll, MapleInventoryType.EQUIP, toScroll, true, false, false));
if (dst < 0) {
chr.getInventory(MapleInventoryType.EQUIPPED).removeItem(toScroll.getPosition());
} else {
chr.getInventory(MapleInventoryType.EQUIP).removeItem(toScroll.getPosition());
}
} else if (vegas == 0) {
c.getSession().write(InventoryPacket.scrolledItem(scroll, MapleInventoryType.EQUIP, scrolled, false, false, false));
}
chr.getMap().broadcastMessage(chr, CField.getScrollEffect(c.getPlayer().getId(), scrollSuccess, legendarySpirit, toScroll.getItemId(), scroll.getItemId()), vegas == 0);
//toscroll
//scroll
c.getSession().write(CField.enchantResult(scrollSuccess == ScrollResult.SUCCESS ? 1 : scrollSuccess == ScrollResult.CURSE ? 2 : 0));
//addToScrollLog(chr.getAccountID(), chr.getId(), scroll.getItemId(), itemID, oldSlots, (byte)(scrolled == null ? -1 : scrolled.getUpgradeSlots()), oldVH, scrollSuccess.name(), whiteScroll, legendarySpirit, vegas);
// equipped item was scrolled and changed
if (dst < 0 && (scrollSuccess == Equip.ScrollResult.SUCCESS || scrollSuccess == Equip.ScrollResult.CURSE) && vegas == 0) {
chr.equipChanged();
}
return true;
}