private static void GetReward(GameSession session, string type, string id, string value, string count)
    {
        switch (type)
        {
        case "item":
            Item item = new(int.Parse(id), int.Parse(count), int.Parse(value));
            session.Player.Inventory.AddItem(session, item, true);
            break;

        case "genderItem":
            List <int> ids    = id.Split(",").Select(int.Parse).ToList();
            List <int> values = value.Split(",").Select(int.Parse).ToList();
            List <int> counts = count.Split(",").Select(int.Parse).ToList();
            for (int i = 0; i < ids.Count; i++)
            {
                Gender gender = ItemMetadataStorage.GetLimitMetadata(ids[i]).Gender;
                if (gender != session.Player.Gender)
                {
                    continue;
                }

                Item genderItem = new(ids[i], counts[i], values[i]);
                session.Player.Inventory.AddItem(session, genderItem, true);
            }
            break;

        case "additionalEffect":
            // TODO: Handle giving player buff
            break;

        default:
            return;
        }
    }
    private static GachaContent HandleSmartGender(GachaMetadata gacha, Gender playerGender)
    {
        Random random = Random.Shared;
        int    index  = random.Next(gacha.Contents.Count);

        GachaContent contents = gacha.Contents[index];

        if (!contents.SmartGender)
        {
            return(contents);
        }

        Gender itemGender = ItemMetadataStorage.GetLimitMetadata(contents.ItemId).Gender;

        if (playerGender != itemGender || itemGender != Gender.Neutral) // if it's not the same gender or unisex, roll again
        {
            bool sameGender = false;
            do
            {
                int indexReroll = random.Next(gacha.Contents.Count);

                GachaContent rerollContents       = gacha.Contents[indexReroll];
                Gender       rerollContentsGender = ItemMetadataStorage.GetLimitMetadata(rerollContents.ItemId).Gender;

                if (rerollContentsGender == playerGender || rerollContentsGender == Gender.Neutral)
                {
                    return(rerollContents);
                }
            } while (!sameGender);
        }

        return(contents);
    }
Exemplo n.º 3
0
    public static List <Item> GetItemsFromDropGroup(DropGroupContent dropContent, Player player, Item sourceItem)
    {
        List <Item> items  = new();
        Random      rng    = Random.Shared;
        int         amount = rng.Next((int)dropContent.MinAmount, (int)dropContent.MaxAmount);

        foreach (int id in dropContent.ItemIds)
        {
            if (dropContent.SmartDropRate == 100)
            {
                List <Job> recommendJobs = ItemMetadataStorage.GetRecommendJobs(id);
                if (!recommendJobs.Contains(player.Job) && !recommendJobs.Contains(Job.None))
                {
                    continue;
                }
            }

            if (dropContent.SmartGender)
            {
                Gender itemGender = ItemMetadataStorage.GetLimitMetadata(id).Gender;
                if (itemGender != player.Gender && itemGender is not Gender.Neutral)
                {
                    continue;
                }
            }


            int rarity   = dropContent.Rarity;
            int constant = ItemMetadataStorage.GetOptionMetadata(sourceItem.Id).Constant;
            if (rarity == 0 && constant is > 0 and < 7)
            {
                rarity = constant;
            }

            Item newItem = new(id, amount, rarity, saveToDatabase : false)
            {
                EnchantLevel = dropContent.EnchantLevel
            };
            newItem.Stats = new(newItem);
            items.Add(newItem);
        }

        return(items);
    }
Exemplo n.º 4
0
    private static void HandleListItem(GameSession session, PacketReader packet)
    {
        long          itemUid     = packet.ReadLong();
        long          salePrice   = packet.ReadLong();
        bool          promote     = packet.ReadBool();
        List <string> tags        = packet.ReadUnicodeString().Split(",").ToList();
        string        description = packet.ReadUnicodeString();
        long          listingFee  = packet.ReadLong();

        Item item = null;

        if (session.Player.Inventory.HasItem(itemUid))
        {
            item = session.Player.Inventory.GetByUid(itemUid);
        }
        else if (session.Player.Account.Home.WarehouseInventory.ContainsKey(itemUid))
        {
            item = session.Player.Account.Home.WarehouseInventory[itemUid];
        }

        if (item is null)
        {
            return;
        }

        if (item.Ugc is null || item.Ugc.CharacterId != session.Player.CharacterId || ItemMetadataStorage.GetLimitMetadata(item.Id).MeretMarketListable)
        {
            return;
        }

        if (salePrice < item.Ugc.SalePrice || salePrice > long.Parse(ConstantsMetadataStorage.GetConstant("UGCShopSellMaxPrice")))
        {
            return;
        }

        long totalFee = GetListingFee(session.Player.CharacterId, promote);

        if (!HandleMarketItemPay(session, totalFee, MeretMarketCurrencyType.Meret))
        {
            return;
        }

        UgcMarketItem marketItem = new(item, salePrice, session.Player, tags, description, promote);

        session.Send(MeretMarketPacket.ListItem(marketItem));
        session.Send(MeretMarketPacket.UpdateExpiration(marketItem));
    }