Ejemplo n.º 1
0
    private void GetGemSockets(Item item, float optionLevelFactor)
    {
        // Check for predefined sockets
        int socketId = ItemMetadataStorage.GetPropertyMetadata(item.Id).SocketDataId;

        if (socketId != 0)
        {
            ItemSocketRarityData socketData = ItemSocketMetadataStorage.GetMetadata(socketId, item.Rarity);
            if (socketData is not null)
            {
                for (int i = 0; i < socketData.MaxCount; i++)
                {
                    GemSockets.Add(new());
                }

                for (int j = 0; j < socketData.FixedOpenCount; j++)
                {
                    GemSockets[j].IsUnlocked = true;
                }
                return;
            }
        }

        Script   script     = ScriptLoader.GetScript("Functions/calcItemSocketMaxCount");
        DynValue dynValue   = script.RunFunction("calcItemSocketMaxCount", (int)item.Type, item.Rarity, optionLevelFactor, (int)item.InventoryTab);
        int      slotAmount = (int)dynValue.Number;

        if (slotAmount <= 0)
        {
            return;
        }

        // add sockets
        for (int i = 0; i < slotAmount; i++)
        {
            GemSocket socket = new();
            GemSockets.Add(socket);
        }

        // roll to unlock sockets
        for (int i = 0; i < GemSockets.Count; i++)
        {
            int successNumber = Random.Shared.Next(0, 100);

            // 5% success rate to unlock a gemsocket
            if (successNumber < 95)
            {
                break;
            }
            GemSockets[i].IsUnlocked = true;
        }
    }
Ejemplo n.º 2
0
    private static void HandleRepackage(GameSession session, PacketReader packet)
    {
        long ribbonUid        = packet.ReadLong();
        long repackingItemUid = packet.ReadLong();

        Item ribbon        = session.Player.Inventory.GetByUid(ribbonUid);
        Item repackingItem = session.Player.Inventory.GetByUid(repackingItemUid);

        if (repackingItem == null || ribbon == null)
        {
            session.Send(ItemRepackagePacket.Notice((int)ItemRepackageNotice.ItemInvalid));
            return;
        }

        if (repackingItem.RemainingTrades != 0 || repackingItem.IsBound())
        {
            session.Send(ItemRepackagePacket.Notice((int)ItemRepackageNotice.CannotBePackaged));
        }

        int ribbonRequirementAmount = ItemMetadataStorage.GetPropertyMetadata(ribbon.Id).RepackageItemConsumeCount;

        if (ribbonRequirementAmount > ribbon.Amount)
        {
            session.Send(ItemRepackagePacket.Notice((int)ItemRepackageNotice.CannotBePackaged));
            return;
        }

        if (!ItemRepackageMetadataStorage.ItemCanRepackage(ribbon.Function.Id, repackingItem.Level, repackingItem.Rarity))
        {
            session.Send(ItemRepackagePacket.Notice((int)ItemRepackageNotice.ItemInvalid));
            return;
        }

        repackingItem.RemainingRepackageCount -= 1;
        repackingItem.RemainingTrades++;

        session.Player.Inventory.ConsumeItem(session, ribbon.Uid, ribbonRequirementAmount);

        session.Send(ItemRepackagePacket.Repackage(repackingItem));
    }