private static void HandleBeginEnchant(GameSession session, PacketReader packet) { EnchantType type = (EnchantType)packet.ReadByte(); long itemUid = packet.ReadLong(); IInventory inventory = session.Player.Inventory; Item item = inventory.GetFromInventoryOrEquipped(itemUid); if (item is null) { return; } if (item.DisableEnchant || EnchantLimitMetadataStorage.IsEnchantable(item.GetItemType(), item.Level, item.EnchantLevel)) { session.Send(ItemEnchantPacket.Notice((short)ItemEnchantError.ItemCannotBeEnchanted)); return; } if (item.Type is ItemType.Necklace or ItemType.Belt or ItemType.Earring or ItemType.Ring or ItemType.Shield or ItemType.Spellbook) { session.Send(ItemEnchantPacket.Notice((short)ItemEnchantError.ItemCannotBeEnchanted)); return; } session.Player.ItemEnchant = GetEnchantInfo(item, type); // Get stat difference between current and next enchant level Dictionary <StatAttribute, ItemStat> statDiff = GetEnchantStatDiff(item.Stats.Enchants, session.Player.ItemEnchant.Stats); session.Send(ItemEnchantPacket.BeginEnchant(type, item, session.Player.ItemEnchant, statDiff)); }
private static void HandleUpdateCatalysts(GameSession session, PacketReader packet) { long itemUid = packet.ReadLong(); bool addCatalyst = packet.ReadBool(); if (!session.Player.Inventory.HasItem(itemUid) && !session.Player.Inventory.ItemIsEquipped(itemUid)) { return; } ItemEnchant itemEnchant = session.Player.ItemEnchant; if (itemEnchant is null) { return; } if (!itemEnchant.UpdateAdditionalCatalysts(itemUid, addCatalyst)) { EnchantHelper.ExcessCatalystError(session, itemEnchant); return; } session.Send(ItemEnchantPacket.UpdateCharges(itemEnchant)); }
private static void SetEnchantStats(GameSession session, ItemEnchant itemEnchantStats, Item item) { Dictionary <StatAttribute, ItemStat> statDiff = GetEnchantStatDiff(item.Stats.Enchants, itemEnchantStats.Stats); foreach (ItemStat stat in itemEnchantStats.Stats.Values) { if (!item.Stats.Enchants.ContainsKey(stat.ItemAttribute)) { item.Stats.Enchants[stat.ItemAttribute] = new BasicStat(stat.ItemAttribute, stat.Rate, StatAttributeType.Rate); continue; } item.Stats.Enchants[stat.ItemAttribute].Flat = stat.Flat; item.Stats.Enchants[stat.ItemAttribute].Rate = stat.Rate; } item.EnchantLevel++; item.EnchantExp = 0; item.Charges -= itemEnchantStats.Rates.ChargesAdded; if (item.EnchantLevel > 11) { string message = $"3,{item.Uid},{ChatLinkType.Enchant},{session.Player.Name}"; //unk what 3 is MapleServer.BroadcastPacketAll(ItemLinkPacket.SendLinkItem(new() { item })); MapleServer.BroadcastPacketAll(ChatPacket.Send(session.Player, message, ChatType.ItemEnchant)); } session.Send(ItemEnchantPacket.EnchantSuccess(item, statDiff.Values.ToList())); //TODO: If item is equipped, update stats }
private static void HandleBeginEnchant(GameSession session, PacketReader packet) { byte type = packet.ReadByte(); long itemUid = packet.ReadLong(); if (session.Player.Inventory.Items.TryGetValue(itemUid, out Item item)) { session.Send(ItemEnchantPacket.BeginEnchant(type, item)); } }
private static void HandleOpheliaEnchant(GameSession session, PacketReader packet) { long itemUid = packet.ReadLong(); if (session.Player.Inventory.Items.TryGetValue(itemUid, out Item item)) { item.Enchants += 5; item.Charges += 10; session.Send(ItemEnchantPacket.EnchantResult(item)); } }
private static void HandlePeachyEnchant(GameSession session, PacketReader packet) { long itemUid = packet.ReadLong(); IInventory inventory = session.Player.Inventory; Item item = inventory.GetFromInventoryOrEquipped(itemUid); if (item is null) { return; } ItemEnchant itemEnchantStats = session.Player.ItemEnchant; if (itemEnchantStats.Level != item.EnchantLevel && itemEnchantStats.ItemUid != item.Uid) { itemEnchantStats = GetEnchantInfo(item, EnchantType.Peachy); } // Check if player has enough ingredients if (!EnchantHelper.PlayerHasIngredients(itemEnchantStats, inventory) || !EnchantHelper.PlayerHasRequiredCatalysts(itemEnchantStats)) { session.Send(ItemEnchantPacket.Notice((short)ItemEnchantError.NotEnoughMaterials)); EnchantHelper.TalkError(session, itemEnchantStats); return; } foreach (EnchantIngredient ingredient in itemEnchantStats.Ingredients) { inventory.ConsumeByTag(session, ingredient.Tag.ToString(), ingredient.Amount); } foreach (long catalystUids in itemEnchantStats.CatalystItemUids) { inventory.ConsumeItem(session, catalystUids, 1); } int neededEnchants = GetNeededEnchantExp(item.EnchantLevel); int expGained = (int)Math.Ceiling((double)(10000 / neededEnchants)); item.EnchantExp += expGained; if (item.EnchantExp >= 10000) { item.EnchantExp = 0; SetEnchantStats(session, itemEnchantStats, item); } itemEnchantStats.Success = true; itemEnchantStats.Level++; itemEnchantStats.CatalystItemUids.Clear(); session.Send(ItemEnchantPacket.UpdateExp(item)); }
private static void HandleOpheliaEnchant(GameSession session, PacketReader packet) { long itemUid = packet.ReadLong(); IInventory inventory = session.Player.Inventory; Item item = inventory.GetFromInventoryOrEquipped(itemUid); if (item is null) { return; } ItemEnchant itemEnchantStats = session.Player.ItemEnchant; if (itemEnchantStats.Level != item.EnchantLevel && itemEnchantStats.ItemUid != item.Uid) { itemEnchantStats = GetEnchantInfo(item, EnchantType.Ophelia); } // Check if player has enough ingredients if (!EnchantHelper.PlayerHasIngredients(itemEnchantStats, inventory) || !EnchantHelper.PlayerHasRequiredCatalysts(itemEnchantStats)) { session.Send(ItemEnchantPacket.Notice((short)ItemEnchantError.NotEnoughMaterials)); EnchantHelper.TalkError(session, itemEnchantStats); return; } foreach (EnchantIngredient ingredient in itemEnchantStats.Ingredients) { inventory.ConsumeByTag(session, ingredient.Tag.ToString(), ingredient.Amount); } foreach (long catalystUids in itemEnchantStats.CatalystItemUids) { inventory.ConsumeItem(session, catalystUids, 1); } Random random = Random.Shared; double randomResult = random.NextDouble(); if (itemEnchantStats.Rates.TotalSuccessRate() < (float)(randomResult * 100)) { FailEnchant(session, itemEnchantStats, item); itemEnchantStats.Success = false; return; } // Enchant success itemEnchantStats.Success = true; itemEnchantStats.Level++; SetEnchantStats(session, itemEnchantStats, item); }
private void HandlePeachyEnchant(GameSession session, PacketReader packet) { long itemUid = packet.ReadLong(); if (session.Player.Inventory.Items.TryGetValue(itemUid, out Item item)) { item.EnchantExp += 5000; if (item.EnchantExp >= 10000) { item.EnchantExp %= 10000; item.Enchants++; } session.Send(ItemEnchantPacket.EnchantResult(item)); session.Send(ItemEnchantPacket.UpdateCharges(item)); } }
private static void HandleUpdateCharges(GameSession session, PacketReader packet) { int chargeCount = packet.ReadInt(); ItemEnchant itemEnchant = session.Player.ItemEnchant; Player player = session.Player; Item item = player.Inventory.GetFromInventoryOrEquipped(itemEnchant.ItemUid); if (item == null || item.Charges < chargeCount) { return; } player.ItemEnchant.UpdateCharges(chargeCount); session.Send(ItemEnchantPacket.UpdateCharges(session.Player.ItemEnchant)); }
private static void FailEnchant(GameSession session, ItemEnchant itemEnchantStats, Item item) { item.Charges -= itemEnchantStats.Rates.ChargesAdded; item.Charges += itemEnchantStats.PityCharges; session.Send(ItemEnchantPacket.EnchantFail(item, itemEnchantStats)); }