public static MapleItem CreateItem(int itemId, string source, short quantity = 1, bool randomStats = false) { MapleInventoryType type = ItemConstants.GetInventoryType(itemId); if (type == MapleInventoryType.Equip) { WzEquip wzInfo = DataBuffer.GetEquipById(itemId); if (wzInfo != null) { MapleEquip equip = new MapleEquip(itemId, source); equip.SetDefaultStats(wzInfo, randomStats); return(equip); } } else if (type != MapleInventoryType.Undefined) { WzItem wzInfo = DataBuffer.GetItemById(itemId); if (wzInfo != null) { if (wzInfo.SlotMax > 0 && quantity > wzInfo.SlotMax) { quantity = (short)wzInfo.SlotMax; } MapleItem item = new MapleItem(itemId, source, quantity); return(item); } } return(null); }
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); }