Пример #1
0
    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));
    }
Пример #2
0
    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));
    }
Пример #3
0
    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
    }
Пример #4
0
    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));
        }
    }
Пример #5
0
    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));
        }
    }
Пример #6
0
    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));
    }
Пример #7
0
    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);
    }
Пример #8
0
        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));
            }
        }
Пример #9
0
    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));
    }
Пример #10
0
 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));
 }