yyl
2025-06-09 b9751b2f076ee050fe5b685e91ae4fc4469b1015
Main/System/KnapSack/Logic/SinglePack.cs
@@ -2,384 +2,383 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using vnxbqy.UI;
    public class SinglePack
public class SinglePack
{
    public readonly PackType type;
    public int unlockedGridCount { get; private set; }
    private Dictionary<int, ItemModel> items = new Dictionary<int, ItemModel>(); //key 物品位置索引
    private Dictionary<int, List<int>> itemIDs = new Dictionary<int, List<int>>(); //key 物品ID:物品位置索引
    public SinglePack(PackType type)
    {
        public readonly PackType type;
        public int unlockedGridCount { get; private set; }
        private Dictionary<int, ItemModel> items = new Dictionary<int, ItemModel>(); //key 物品位置索引
        private Dictionary<int, List<int>> itemIDs = new Dictionary<int, List<int>>(); //key 物品ID:物品位置索引
        public SinglePack(PackType type)
        {
            this.type = type;
        }
        this.type = type;
    }
        public bool HasItem(int itemID)
        {
            return itemIDs.ContainsKey(itemID);
        }
    public bool HasItem(int itemID)
    {
        return itemIDs.ContainsKey(itemID);
    }
        public ItemModel UpdateItem(ItemInfo itemInfo)
    public ItemModel UpdateItem(ItemInfo itemInfo)
    {
        //字典索引为物品位置索引
        var index = itemInfo.index;
        if (!items.ContainsKey(index))
        {
            //字典索引为物品位置索引
            var index = itemInfo.index;
            if (!items.ContainsKey(index))
            items.Add(index, new ItemModel(type, itemInfo));
        }
        else
        {
            //位置上的物品变化,先移除原来的
            var itemID = items[index].itemId;
            if (itemIDs.ContainsKey(itemID))
            {
                items.Add(index, new ItemModel(type, itemInfo));
            }
            else
            {
                //位置上的物品变化,先移除原来的
                var itemID = items[index].itemId;
                if (itemIDs.ContainsKey(itemID))
                if (itemIDs[itemID].Contains(index))
                {
                    if (itemIDs[itemID].Contains(index))
                    if (itemIDs[itemID].Count == 1)
                    {
                        if (itemIDs[itemID].Count == 1)
                        {
                            itemIDs.Remove(itemID);
                        }
                        else
                        {
                            itemIDs[itemID].Remove(index);
                        }
                    }
                }
                items[index].SetItemInfo(itemInfo);
            }
            //字典索引为物品ID
            if (!itemIDs.ContainsKey(itemInfo.itemId))
            {
                itemIDs.Add(itemInfo.itemId, new List<int>());
            }
            if (!itemIDs[itemInfo.itemId].Contains(itemInfo.index))
            {
                itemIDs[itemInfo.itemId].Add(itemInfo.index);
            }
            return items[index];
        }
        public void RemoveItem(int index)
        {
            if (items.ContainsKey(index))
            {
                //字典索引为物品ID
                var itemID = items[index].itemId;
                if (itemIDs.ContainsKey(itemID))
                {
                    if (itemIDs[itemID].Contains(index))
                    {
                        if (itemIDs[itemID].Count == 1)
                        {
                            itemIDs.Remove(itemID);
                        }
                        else
                        {
                            itemIDs[itemID].Remove(index);
                        }
                    }
                }
                items.Remove(index);
            }
        }
        public void SetOpenGridCount(int count)
        {
            unlockedGridCount = count;
        }
        public ItemModel GetItemByIndex(int index)
        {
            ItemModel item = null;
            items.TryGetValue(index, out item);
            return item;
        }
        public Dictionary<int, ItemModel> GetAllItems()
        {
            return items;
        }
        /// <summary>
        /// 获取指定ID的一个物品
        /// </summary>
        /// <param name="itemId"></param>
        /// <param name="includeAuction"></param>
        /// <returns></returns>
        public ItemModel GetItemByID(int itemId, bool includeAuction = true)
        {
            //foreach (var item in items.Values)
            //{
            //    if (!includeAuction && item.isAuction)
            //    {
            //        continue;
            //    }
            //    if (item.itemId == itemId)
            //    {
            //        return item;
            //    }
            //}
            //return null;
            if (itemIDs.ContainsKey(itemId))
            {
                foreach (var index in itemIDs[itemId])
                {
                    var item = items[index];
                    if (!includeAuction && item.isAuction)
                    {
                        continue;
                    }
                    return item;
                }
            }
            return null;
        }
        /// <summary>
        /// 获取包内的指定ID的所有物品
        /// </summary>
        /// <param name="itemId"></param>
        /// <param name="includeAuction"></param>
        /// <returns></returns>
        public List<ItemModel> GetItemsById(int itemId, bool includeAuction = true)
        {
            var list = new List<ItemModel>();
            //foreach (var item in items.Values)
            //{
            //    if (!includeAuction && item.isAuction)
            //    {
            //        continue;
            //    }
            //    if (item.itemId == itemId)
            //    {
            //        list.Add(item);
            //    }
            //}
            if (itemIDs.ContainsKey(itemId))
            {
                foreach (var index in itemIDs[itemId])
                {
                    var item = items[index];
                    if (!includeAuction && item.isAuction)
                    {
                        continue;
                    }
                    list.Add(item);
                }
            }
            return list;
        }
        public int GetCountById(int itemId, bool includeAuction = true)
        {
            var count = 0;
            //foreach (var item in items.Values)
            //{
            //    if (!includeAuction && item.isAuction)
            //    {
            //        continue;
            //    }
            //    if (item.itemId == itemId)
            //    {
            //        count += item.count;
            //    }
            //}
            if (itemIDs.ContainsKey(itemId))
            {
                foreach (var index in itemIDs[itemId])
                {
                    var item = items[index];
                    if (!includeAuction && item.isAuction)
                    {
                        continue;
                    }
                    count += item.count;
                }
            }
            return count;
        }
        public List<ItemModel> GetItems(FilterParams filterParams)
        {
            var list = new List<ItemModel>();
            foreach (var item in items.Values)
            {
                var levelValid = filterParams.levels == null || filterParams.levels.Contains(item.config.LV);
                if (!levelValid)
                {
                    continue;
                }
                var qualityValid = filterParams.qualitys == null || filterParams.qualitys.Contains(item.config.ItemColor);
                if (!qualityValid)
                {
                    continue;
                }
                var typeValid = filterParams.itemTypes == null || filterParams.itemTypes.Contains(item.config.Type);
                if (!typeValid)
                {
                    continue;
                }
                var equipTypeValid = filterParams.equipTypes == null || filterParams.equipTypes.Contains(item.config.EquipPlace);
                if (!equipTypeValid)
                {
                    continue;
                }
                var jobValid = filterParams.jobs == null || filterParams.jobs.Contains(item.config.JobLimit);
                if (!jobValid)
                {
                    continue;
                }
                //var auctionValid = filterParams.isAuction == item.isAuction;
                //if (!auctionValid)
                //{
                //    continue;
                //}
                var realmValid = filterParams.realmLimit == 0 || filterParams.realmLimit == item.config.RealmLimit;
                if (!realmValid)
                {
                    continue;
                }
                list.Add(item);
            }
            return list;
        }
        public int GetCountByType(int type)
        {
            var count = 0;
            foreach (var item in items.Values)
            {
                if (item.config.Type == type)
                {
                    count += item.count;
                }
            }
            return count;
        }
        /// <summary>
        ///  得到同一个id指定数量的物品格子序号
        /// </summary>
        /// <param name="itemId"></param>
        /// <param name="needCount"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        public List<int> GetItemIndexsAppointedCount(int itemId, int needCount, bool includeAuction = true)
        {
            //var goalItems = new List<ItemModel>();
            //foreach (var item in this.items.Values)
            //{
            //    if (!includeAuction && item.isAuction)
            //    {
            //        continue;
            //    }
            //    if (item.itemId == itemId)
            //    {
            //        goalItems.Add(item);
            //    }
            //}
            var itemIndexs = new List<int>();
            var count = 0;
            //for (var i = 0; i < goalItems.Count; i++)
            //{
            //    if (count < needCount)
            //    {
            //        itemIndexs.Add(goalItems[i].gridIndex);
            //        count += goalItems[i].count;
            //    }
            //    else
            //    {
            //        break;
            //    }
            //}
            if (itemIDs.ContainsKey(itemId))
            {
                foreach (var index in itemIDs[itemId])
                {
                    var item = items[index];
                    if (!includeAuction && item.isAuction)
                    {
                        continue;
                    }
                    if (count < needCount)
                    {
                        itemIndexs.Add(index);
                        count += item.count;
                        itemIDs.Remove(itemID);
                    }
                    else
                    {
                        break;
                        itemIDs[itemID].Remove(index);
                    }
                }
            }
            return itemIndexs;
            items[index].SetItemInfo(itemInfo);
        }
        /// <summary>
        /// 得到第一个空格位置索引
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public int GetFirstEmptyGridIndex()
        //字典索引为物品ID
        if (!itemIDs.ContainsKey(itemInfo.itemId))
        {
            for (var index = 0; index < unlockedGridCount; index++)
            itemIDs.Add(itemInfo.itemId, new List<int>());
        }
        if (!itemIDs[itemInfo.itemId].Contains(itemInfo.index))
        {
            itemIDs[itemInfo.itemId].Add(itemInfo.index);
        }
        return items[index];
    }
    public void RemoveItem(int index)
    {
        if (items.ContainsKey(index))
        {
            //字典索引为物品ID
            var itemID = items[index].itemId;
            if (itemIDs.ContainsKey(itemID))
            {
                if (!items.ContainsKey(index))
                if (itemIDs[itemID].Contains(index))
                {
                    return index;
                    if (itemIDs[itemID].Count == 1)
                    {
                        itemIDs.Remove(itemID);
                    }
                    else
                    {
                        itemIDs[itemID].Remove(index);
                    }
                }
            }
            return -1;
            items.Remove(index);
        }
        public int GetEmptyGridCount()
    }
    public void SetOpenGridCount(int count)
    {
        unlockedGridCount = count;
    }
    public ItemModel GetItemByIndex(int index)
    {
        ItemModel item = null;
        items.TryGetValue(index, out item);
        return item;
    }
    public Dictionary<int, ItemModel> GetAllItems()
    {
        return items;
    }
    /// <summary>
    /// 获取指定ID的一个物品
    /// </summary>
    /// <param name="itemId"></param>
    /// <param name="includeAuction"></param>
    /// <returns></returns>
    public ItemModel GetItemByID(int itemId, bool includeAuction = true)
    {
        //foreach (var item in items.Values)
        //{
        //    if (!includeAuction && item.isAuction)
        //    {
        //        continue;
        //    }
        //    if (item.itemId == itemId)
        //    {
        //        return item;
        //    }
        //}
        //return null;
        if (itemIDs.ContainsKey(itemId))
        {
            return unlockedGridCount - items.Count;
            foreach (var index in itemIDs[itemId])
            {
                var item = items[index];
                if (!includeAuction && item.isAuction)
                {
                    continue;
                }
                return item;
            }
        }
        return null;
    }
        public void Clear()
    /// <summary>
    /// 获取包内的指定ID的所有物品
    /// </summary>
    /// <param name="itemId"></param>
    /// <param name="includeAuction"></param>
    /// <returns></returns>
    public List<ItemModel> GetItemsById(int itemId, bool includeAuction = true)
    {
        var list = new List<ItemModel>();
        //foreach (var item in items.Values)
        //{
        //    if (!includeAuction && item.isAuction)
        //    {
        //        continue;
        //    }
        //    if (item.itemId == itemId)
        //    {
        //        list.Add(item);
        //    }
        //}
        if (itemIDs.ContainsKey(itemId))
        {
            items.Clear();
            itemIDs.Clear();
            foreach (var index in itemIDs[itemId])
            {
                var item = items[index];
                if (!includeAuction && item.isAuction)
                {
                    continue;
                }
                list.Add(item);
            }
        }
        return list;
    }
        public struct FilterParams
    public int GetCountById(int itemId, bool includeAuction = true)
    {
        var count = 0;
        //foreach (var item in items.Values)
        //{
        //    if (!includeAuction && item.isAuction)
        //    {
        //        continue;
        //    }
        //    if (item.itemId == itemId)
        //    {
        //        count += item.count;
        //    }
        //}
        if (itemIDs.ContainsKey(itemId))
        {
            public List<int> levels;
            public List<int> qualitys;
            public List<int> itemTypes;
            public List<int> equipTypes;
            public int realmLimit;
            public bool isAuction;
            public List<int> jobs;
            foreach (var index in itemIDs[itemId])
            {
                var item = items[index];
                if (!includeAuction && item.isAuction)
                {
                    continue;
                }
                count += item.count;
            }
        }
        return count;
    }
    public List<ItemModel> GetItems(FilterParams filterParams)
    {
        var list = new List<ItemModel>();
        foreach (var item in items.Values)
        {
            var levelValid = filterParams.levels == null || filterParams.levels.Contains(item.config.LV);
            if (!levelValid)
            {
                continue;
            }
            var qualityValid = filterParams.qualitys == null || filterParams.qualitys.Contains(item.config.ItemColor);
            if (!qualityValid)
            {
                continue;
            }
            var typeValid = filterParams.itemTypes == null || filterParams.itemTypes.Contains(item.config.Type);
            if (!typeValid)
            {
                continue;
            }
            var equipTypeValid = filterParams.equipTypes == null || filterParams.equipTypes.Contains(item.config.EquipPlace);
            if (!equipTypeValid)
            {
                continue;
            }
            var jobValid = filterParams.jobs == null || filterParams.jobs.Contains(item.config.JobLimit);
            if (!jobValid)
            {
                continue;
            }
            //var auctionValid = filterParams.isAuction == item.isAuction;
            //if (!auctionValid)
            //{
            //    continue;
            //}
            var realmValid = filterParams.realmLimit == 0 || filterParams.realmLimit == item.config.RealmLimit;
            if (!realmValid)
            {
                continue;
            }
            list.Add(item);
        }
    }
        return list;
    }
    public int GetCountByType(int type)
    {
        var count = 0;
        foreach (var item in items.Values)
        {
            if (item.config.Type == type)
            {
                count += item.count;
            }
        }
        return count;
    }
    /// <summary>
    ///  得到同一个id指定数量的物品格子序号
    /// </summary>
    /// <param name="itemId"></param>
    /// <param name="needCount"></param>
    /// <param name="type"></param>
    /// <returns></returns>
    public List<int> GetItemIndexsAppointedCount(int itemId, int needCount, bool includeAuction = true)
    {
        //var goalItems = new List<ItemModel>();
        //foreach (var item in this.items.Values)
        //{
        //    if (!includeAuction && item.isAuction)
        //    {
        //        continue;
        //    }
        //    if (item.itemId == itemId)
        //    {
        //        goalItems.Add(item);
        //    }
        //}
        var itemIndexs = new List<int>();
        var count = 0;
        //for (var i = 0; i < goalItems.Count; i++)
        //{
        //    if (count < needCount)
        //    {
        //        itemIndexs.Add(goalItems[i].gridIndex);
        //        count += goalItems[i].count;
        //    }
        //    else
        //    {
        //        break;
        //    }
        //}
        if (itemIDs.ContainsKey(itemId))
        {
            foreach (var index in itemIDs[itemId])
            {
                var item = items[index];
                if (!includeAuction && item.isAuction)
                {
                    continue;
                }
                if (count < needCount)
                {
                    itemIndexs.Add(index);
                    count += item.count;
                }
                else
                {
                    break;
                }
            }
        }
        return itemIndexs;
    }
    /// <summary>
    /// 得到第一个空格位置索引
    /// </summary>
    /// <param name="type"></param>
    /// <returns></returns>
    public int GetFirstEmptyGridIndex()
    {
        for (var index = 0; index < unlockedGridCount; index++)
        {
            if (!items.ContainsKey(index))
            {
                return index;
            }
        }
        return -1;
    }
    public int GetEmptyGridCount()
    {
        return unlockedGridCount - items.Count;
    }
    public void Clear()
    {
        items.Clear();
        itemIDs.Clear();
    }
    public struct FilterParams
    {
        public List<int> levels;
        public List<int> qualitys;
        public List<int> itemTypes;
        public List<int> equipTypes;
        public int realmLimit;
        public bool isAuction;
        public List<int> jobs;
    }
}