public static void UseEquipEnhancementScroll(MapleEquip equip, MapleItem scroll, MapleCharacter chr) { if (equip == null || scroll == null) { return; } WzItemEnhancer wzScrollInfo = DataBuffer.GetItemById(scroll.ItemId) as WzItemEnhancer; WzEquip equipInfo = DataBuffer.GetEquipById(equip.ItemId); if (wzScrollInfo == null || equipInfo == null) { return; } int maxEnhancements; if (wzScrollInfo == null || equipInfo == null || (maxEnhancements = equipInfo.MaxStarEnhance) - equip.Enhancements < 1 || equip.RemainingUpgradeCount > 0) { chr.SendPopUpMessage("You cannot use that on this item."); chr.EnableActions(); return; } int chance; bool diminishChance = false; int enhancements; int curseChance = 100; switch (scroll.ItemId) { case 2049323: //advanced equip enhancement scroll curseChance = 0; goto case 2049300; case 2049300: case 2049303: case 2049306: case 2049325: { chance = 100; diminishChance = true; enhancements = 1; break; } case 2049301: //equip enhancement scroll case 2049307: { chance = 80; diminishChance = true; enhancements = 1; break; } default: { if (wzScrollInfo.StatEnhancements.TryGetValue("forceUpgrade", out enhancements) && //multiple star enhances wzScrollInfo.StatEnhancements.TryGetValue("success", out chance)) { if (!wzScrollInfo.StatEnhancements.TryGetValue("cursed", out curseChance)) { curseChance = 100; } break; } chr.SendPopUpMessage("This item is not coded, please report it on the forums. ItemId " + scroll.ItemId); ServerConsole.Debug("ItemID {0} is unhandled in UseEnhancementScroll", scroll.ItemId); return; } } bool scrollProtection = equip.CheckAndRemoveFlag(MapleItemFlags.ScrollProtection); bool curseProtection = equip.CheckAndRemoveFlag(MapleItemFlags.CurseProtection) && equip.Enhancements < 12; bool success = EnhanceEquip(equip, chance, diminishChance, enhancements, maxEnhancements); bool destroyed = false; byte scrollResult = 1; bool removeScroll = success || !scrollProtection; if (!success) { scrollResult = 0; if (!curseProtection && Functions.MakeChance(curseChance)) { scrollResult = 2; destroyed = true; } } if (removeScroll) { chr.Inventory.RemoveItemsFromSlot(scroll.InventoryType, scroll.Position, 1); } if (destroyed) { chr.Inventory.RemoveItem(equip.InventoryType, equip.Position); } else { chr.Client.SendPacket(MapleInventory.Packets.AddItem(equip, equip.InventoryType, equip.Position)); //Update item } chr.Map.BroadcastPacket(Packets.ShowScrollEffect(chr.Id, scrollResult, scroll.ItemId, equip.ItemId), chr, true); }
public static void UseRegularEquipScroll(MapleCharacter chr, MapleEquip equip, MapleItem scroll, bool whiteScroll) { WzItemEnhancer scrollInfo = DataBuffer.GetItemById(scroll.ItemId) as WzItemEnhancer; if (scrollInfo == null) { return; } WzEquip equipInfo = DataBuffer.GetEquipById(equip.ItemId); string reason = ""; if (equipInfo == null || !CanScroll(equip, equipInfo, scrollInfo, out reason)) { chr.SendPopUpMessage("You cannot use that scroll on this item. " + reason); chr.EnableActions(); return; } byte upgradeSlotsUsed = 1; int scrollBaseId = scroll.ItemId / 100; if (scrollBaseId == 20490 || //clean slate scroll scrollBaseId == 20493 || //equip enhancement scroll scrollBaseId == 20496) //innocence scroll { upgradeSlotsUsed = 0; } switch (scroll.ItemId) { case 2040727: //Scroll for Spikes on Shoes case 2041058: //Scroll for Cape for Cold Protection upgradeSlotsUsed = 0; break; } int value; if (scrollInfo.StatEnhancements.TryGetValue("tuc", out value)) //Uses multiple upgrade slots { upgradeSlotsUsed = (byte)value; } if (equip.RemainingUpgradeCount < upgradeSlotsUsed) { chr.SendPopUpMessage(string.Format("This item does not have enough upgrades available")); chr.EnableActions(); return; } byte scrollResult = 0; bool destroyed = false; bool removeScroll = true; int chance = scrollInfo.Chance; bool scrollProtection = equip.CheckAndRemoveFlag(MapleItemFlags.ScrollProtection); bool upgradeCountProtection = upgradeSlotsUsed > 0 && equip.CheckAndRemoveFlag(MapleItemFlags.UpgradeCountProtection); bool curseProtection = equip.CheckAndRemoveFlag(MapleItemFlags.CurseProtection); if (equip.CheckAndRemoveFlag(MapleItemFlags.LuckyDay)) { chance += 10; } if (Functions.MakeChance(chance)) { scrollResult = 1; equip.UpgradeCount += upgradeSlotsUsed; foreach (var kvp in scrollInfo.StatEnhancements) { switch (kvp.Key) { case "incPDD": equip.Pdd += (short)kvp.Value; break; case "incMDD": equip.Mdd += (short)kvp.Value; break; case "incACC": equip.Acc += (short)kvp.Value; break; case "incMHP": equip.IncMhp += (short)kvp.Value; break; case "incINT": equip.Int += (short)kvp.Value; break; case "incDEX": equip.Dex += (short)kvp.Value; break; case "incMAD": equip.Mad += (short)kvp.Value; break; case "incPAD": equip.Pad += (short)kvp.Value; break; case "incEVA": equip.Eva += (short)kvp.Value; break; case "incLUK": equip.Luk += (short)kvp.Value; break; case "incMMP": equip.IncMmp += (short)kvp.Value; break; case "incSTR": equip.Str += (short)kvp.Value; break; case "incSpeed": equip.Speed += (short)kvp.Value; break; case "incJump": equip.Jump += (short)kvp.Value; break; case "incCraft": equip.Diligence += (short)kvp.Value; break; case "preventslip": equip.Flags |= MapleItemFlags.NoSlip; break; case "warmsupport": equip.Flags |= MapleItemFlags.ColdResistance; break; case "recover": { int totalPossibleUpgrades = equipInfo.TotalUpgradeCount + equip.HammersApplied; int failedUpgrades = totalPossibleUpgrades - equip.UpgradeCount - equip.RemainingUpgradeCount; int toRestore = Math.Min(failedUpgrades, kvp.Value); if (toRestore > 0) { equip.RemainingUpgradeCount += (byte)toRestore; } break; } case "randstat": //chaos scroll { bool betterStats = scrollInfo.StatEnhancements.ContainsKey("incRandVol"); bool noNegative = scrollInfo.StatEnhancements.ContainsKey("noNegative"); if (equip.Str > 0) { equip.Str = GetNewChaosStat(equip.Str, betterStats, noNegative); } if (equip.Dex > 0) { equip.Dex = GetNewChaosStat(equip.Dex, betterStats, noNegative); } if (equip.Int > 0) { equip.Int = GetNewChaosStat(equip.Int, betterStats, noNegative); } if (equip.Luk > 0) { equip.Luk = GetNewChaosStat(equip.Luk, betterStats, noNegative); } if (equip.Pad > 0) { equip.Pad = GetNewChaosStat(equip.Pad, betterStats, noNegative); } if (equip.Mad > 0) { equip.Mad = GetNewChaosStat(equip.Mad, betterStats, noNegative); } if (equip.Pdd > 0) { equip.Pdd = GetNewChaosStat(equip.Pdd, betterStats, noNegative); } if (equip.Mdd > 0) { equip.Mdd = GetNewChaosStat(equip.Mdd, betterStats, noNegative); } if (equip.Acc > 0) { equip.Acc = GetNewChaosStat(equip.Acc, betterStats, noNegative); } if (equip.Eva > 0) { equip.Eva = GetNewChaosStat(equip.Eva, betterStats, noNegative); } if (equip.Speed > 0) { equip.Speed = GetNewChaosStat(equip.Speed, betterStats, noNegative); } if (equip.Jump > 0) { equip.Jump = GetNewChaosStat(equip.Jump, betterStats, noNegative); } if (equip.IncMhp > 0) { equip.IncMhp = GetNewChaosStat(equip.IncMhp, betterStats, noNegative); } if (equip.IncMmp > 0) { equip.IncMmp = GetNewChaosStat(equip.IncMmp, betterStats, noNegative); } break; } case "reset": { equip.SetDefaultStats(equipInfo, true); break; } case "perfectReset": { equip.SetDefaultStats(equipInfo); break; } } equip.SaveToDatabase(chr); } } else //Fail { int cursedChance; if (scrollInfo.StatEnhancements.TryGetValue("cursed", out cursedChance)) { destroyed = !curseProtection && Functions.MakeChance(cursedChance); } if (scrollProtection) { removeScroll = false; } if (upgradeCountProtection) { upgradeSlotsUsed = 0; } //todo: white scroll } equip.RemainingUpgradeCount -= upgradeSlotsUsed; if (removeScroll) { chr.Inventory.RemoveItemsFromSlot(scroll.InventoryType, scroll.Position, 1); } if (destroyed) { chr.Inventory.RemoveItem(equip.InventoryType, equip.Position); scrollResult = 2; } else { chr.Client.SendPacket(MapleInventory.Packets.AddItem(equip, equip.InventoryType, equip.Position)); //Update item stats } chr.Map.BroadcastPacket(Packets.ShowScrollEffect(chr.Id, scrollResult, scroll.ItemId, equip.ItemId), chr, true); }
private static bool CanScroll(MapleEquip equip, WzEquip equipInfo, WzItemEnhancer enhancerInfo, out string message) { message = ""; if (enhancerInfo.ItemId < 2046000) { if ((equip.ItemId - 1000000) / 10000 != (enhancerInfo.ItemId - 2040000) / 100) { return(false); } } else if (enhancerInfo.ItemId < 2047000) { int type = (enhancerInfo.ItemId - 2046000) / 100; switch (type) { case 0: if (!IsOneHandedWeaponScrollable(equip.ItemId)) { return(false); } break; case 1: if (!IsTwoHandedWeaponScrollable(equip.ItemId)) { return(false); } break; case 2: if (!IsArmorScrollable(equip.ItemId)) { return(false); } break; case 3: if (!IsAccessoryScrollable(equip.ItemId)) { return(false); } break; default: message = "Unhandled scroll, please report this on the forums. ItemId: " + enhancerInfo.ItemId; return(false); } } if (enhancerInfo.UseableOnIds.Count > 0 && !enhancerInfo.UseableOnIds.Contains(equip.ItemId)) { return(false); } int value; if (enhancerInfo.StatEnhancements.TryGetValue("reqCUC", out value) && equip.UpgradeCount < value) { message = "Item does not have the required upgrade count."; return(false); } if ((enhancerInfo.StatEnhancements.TryGetValue("reqRUC", out value) || enhancerInfo.StatEnhancements.TryGetValue("tuc", out value)) && equip.RemainingUpgradeCount < value) { message = "Item does not have the required remaining upgrade count."; return(false); } if (enhancerInfo.StatEnhancements.TryGetValue("reqEquipLevelMin", out value)) { if (equipInfo.ReqLevel < value) { message = "Item does not have the required level."; return(false); } } if (enhancerInfo.StatEnhancements.TryGetValue("reqEquipLevelMax", out value)) { if (equipInfo.ReqLevel > value) { message = "Item does not have the required level."; return(false); } } if (enhancerInfo.StatEnhancements.TryGetValue("recover", out value)) //clean slate { int totalPossibleUpgrades = equipInfo.TotalUpgradeCount + equip.HammersApplied; int failedUpgrades = totalPossibleUpgrades - equip.UpgradeCount - equip.RemainingUpgradeCount; if (failedUpgrades <= 0) { message = "There are no upgrades to recover."; return(false); } } return(true); }