79 【常规】背包 - 随机宝箱界面,自选宝箱界面,获得物品奖励界面
24个文件已修改
1个文件已删除
7 文件已复制
8个文件已添加
1 文件已重命名
2108 ■■■■■ 已修改文件
Main/Component/UI/Common/ButtonClickInterval.cs 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Common/LongPressButton.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Common/SliderPanel.cs 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Common/SliderPanel.cs.meta 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Core/DelayButton.cs 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Config/ConfigParse.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Config/Configs/ChestsAwardConfig.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Config/Configs/ChestsConfig.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Config/PartialConfigs/ChestsAwardConfig.cs 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Config/PartialConfigs/ChestsAwardConfig.cs.meta 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ClientPack/CA3_Item/CA323_tagCMUseItems.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA801_tagMCGiveAwardInfo.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Main.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Manager/UIManager.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/CustomizedGift/CustomizedRechargeModel.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/GeneralConfig/GeneralDefine.cs 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/ItemTip/BoxGetItemModel.cs 538 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/ItemTip/BoxGetItemModel.cs.meta 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/ItemTip/BoxItemCell.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/ItemTip/BoxItemCell.cs.meta 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/ItemTip/BoxItemLineCell.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/ItemTip/BoxItemLineCell.cs.meta 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/ItemTip/BoxItemWin.cs 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/ItemTip/BoxItemWin.cs.meta 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/ItemTip/ChooseItemsCell.cs 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/ItemTip/ChooseItemsCell.cs.meta 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/ItemTip/ChooseItemsWin.cs 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/ItemTip/ChooseItemsWin.cs.meta 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/ItemTip/ItemTipUtility.cs 447 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/KnapSack/BackpackData.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/KnapSack/Logic/CommonGetItemCell.cs 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/KnapSack/Logic/CommonGetItemWin.cs 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/KnapSack/Logic/ItemLogicUtility.cs 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/KnapSack/Logic/PackGirdCell.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/KnapSack/New/CommonItemBaisc.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/KnapSack/PackManager.cs 135 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Recharge/DailySpecialsModel.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Recharge/RechargeManager.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Store/StoreModel.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Tip/ItemsConfirmCell.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Utility/MaterialUtility.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Common/ButtonClickInterval.cs
Main/Component/UI/Common/LongPressButton.cs
@@ -10,6 +10,7 @@
    {
        public class ButtonPressEvent : UnityEvent { }
    //长按监听
        [FormerlySerializedAs("onPress")]
        [SerializeField]
        private ButtonPressEvent m_OnPress = new ButtonPressEvent();
@@ -20,7 +21,7 @@
        }
        [SerializeField]
        float m_LongPressCheckTime = 0.5f;
    float m_LongPressCheckTime = 0.3f;
        public float longPressCheckTime
        {
            get { return m_LongPressCheckTime; }
@@ -79,6 +80,7 @@
                {
                    return;
                }
                if (m_PressIntervalTime >= m_LongPressIntervalTime)
                {
                    onPress.Invoke();
Main/Component/UI/Common/SliderPanel.cs
New file
@@ -0,0 +1,99 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
/// <summary>
/// 进度条功能,带有+-按钮控制,最大数量按钮
/// </summary>
public class SliderPanel : MonoBehaviour
{
    [SerializeField] Text countText;
    [SerializeField] Slider slider;
    [SerializeField] LongPressButton addBtn;
    [SerializeField] LongPressButton decBtn;
    [SerializeField] ButtonEx maxBtn;
    int count;
    int maxCount;
    Action<int> OnChangeEvent;
    void Start()
    {
        slider.AddListener((value) => { Refresh(); });
        addBtn.AddListener(() =>
        {
            slider.value += 1;
            Refresh();
        });
        addBtn.onPress.AddListener(() =>
        {
            slider.value += 1;
            Refresh();
        });
        decBtn.AddListener(() =>
        {
            slider.value -= 1;
            Refresh();
        });
        decBtn.onPress.AddListener(() =>
        {
            slider.value -= 1;
            Refresh();
        });
        maxBtn.AddListener(() =>
        {
            slider.value = slider.maxValue;
            Refresh();
        });
    }
    public void Init(Action<int> _OnChangeEvent, int _maxCount, int _count = 1)
    {
        count = _count;
        maxCount = _maxCount;
        slider.minValue = 1;
        slider.maxValue = _maxCount;
        slider.value = count;
        Refresh();
        OnChangeEvent = _OnChangeEvent;
    }
    void Refresh()
    {
        count = (int)slider.value;
        countText.text = count.ToString();
        if (count >= maxCount)
        {
            addBtn.interactable = false;
            addBtn.SetColorful(null, false);
            maxBtn.interactable = false;
            maxBtn.SetColorful(null, false);
        }
        else
        {
            addBtn.interactable = true;
            addBtn.SetColorful(null, true);
            maxBtn.interactable = true;
            maxBtn.SetColorful(null, true);
        }
        if (count <= 0)
        {
            decBtn.interactable = false;
            decBtn.SetColorful(null, false);
        }
        else
        {
            decBtn.interactable = true;
            decBtn.SetColorful(null, true);
        }
        OnChangeEvent?.Invoke(count);
    }
}
Main/Component/UI/Common/SliderPanel.cs.meta
copy from Main/Component/UI/Core/DelayButton.cs.meta copy to Main/Component/UI/Common/SliderPanel.cs.meta
File was copied from Main/Component/UI/Core/DelayButton.cs.meta
@@ -1,8 +1,7 @@
fileFormatVersion: 2
guid: f91c143a16d59de4b80b2b0ffbb455e4
timeCreated: 1501494723
licenseType: Free
guid: 3525ae0230fc77c439297c3fe45ed8d5
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
Main/Component/UI/Core/DelayButton.cs
File was deleted
Main/Config/ConfigParse.cs
@@ -105,6 +105,8 @@
        return msg.Split('_');
    }
    //一维数组:来源格式如 1_2|2_3|3_1|4_3;
    //返回一维数组结构如 1|2|3|4
    public static T[] GetKeyValueKeys<T>(string msg) where T : struct
    {
        string[] segs = GetMultipleStr(msg);
@@ -124,6 +126,8 @@
        return null;
    }
    //一维数组:来源格式如 1_2|2_3|3_1|4_3;
    //返回一维数组结构如 2|3|1|3
    public static T[] GetKeyValueValues<T>(string msg) where T : struct
    {
        string[] segs = GetMultipleStr(msg);
@@ -143,6 +147,31 @@
        return null;
    }
    //二维数组:来源格式如 1_2_1|2_3_4|3_1_2|4_3_4
    public static T[][] GetArray2<T>(string msg) where T : struct
    {
        string[] segs = GetMultipleStr(msg);
        if (segs != null && segs.Length > 0)
        {
            T[][] array = new T[segs.Length][];
            for (int i = 0; i < segs.Length; i++)
            {
                string[] pair = GetKeyValue(segs[i]);
                if (pair.Length > 1)
                {
                    array[i] = new T[pair.Length];
                    for (int j = 0; j < pair.Length; j++)
                    {
                        array[i][j] = (T)Convert.ChangeType(pair[j], typeof(T));
                    }
                }
            }
            return array;
        }
        return null;
    }
    //字典:来源格式如 1_2|2_3|3_1|4_3;
    public static Dictionary<T, P> GetDic<T, P>(string msg)
    {
        Dictionary<T, P> dic = null;
Main/Config/Configs/ChestsAwardConfig.cs
@@ -1,6 +1,6 @@
//--------------------------------------------------------
//    [Author]:           YYL
//    [  Date ]:           Monday, August 4, 2025
//    [  Date ]:           Tuesday, August 5, 2025
//--------------------------------------------------------
using System.Collections.Generic;
Main/Config/Configs/ChestsConfig.cs
@@ -1,6 +1,6 @@
//--------------------------------------------------------
//    [Author]:           YYL
//    [  Date ]:           Monday, August 4, 2025
//    [  Date ]:           2025年8月5日
//--------------------------------------------------------
using System.Collections.Generic;
Main/Config/PartialConfigs/ChestsAwardConfig.cs
New file
@@ -0,0 +1,78 @@
//--------------------------------------------------------
//    [Author]:            第二世界
//    [  Date ]:           Sunday, February 04, 2018
//--------------------------------------------------------
using System.Collections.Generic;
public partial class ChestsAwardConfig : ConfigBase<int, ChestsAwardConfig>
{
    private static Dictionary<string, ChestsAwardConfig> chestAwardDict = new Dictionary<string, ChestsAwardConfig>();
    private static Dictionary<int, List<int>> chestIdDict = new Dictionary<int, List<int>>();
    protected override void OnConfigParseCompleted()
    {
        string key = StringUtility.Contact(BoxID, BoxLV);
        if (!chestAwardDict.ContainsKey(key))
        {
            chestAwardDict.Add(key, this);
        }
        if (!chestIdDict.ContainsKey(BoxID))
        {
            List<int> boxLvlist = new List<int>();
            boxLvlist.Add(BoxLV);
            chestIdDict.Add(BoxID, boxLvlist);
        }
        else
        {
            chestIdDict[BoxID].Add(BoxLV);
        }
    }
    public static ChestsAwardConfig GetChestsAwardByID(int boxId)
    {
        int playerLv = PlayerDatas.Instance.baseData.LV;
        List<int> boxLvlist = null;
        int boxLv = 0;
        chestIdDict.TryGetValue(boxId, out boxLvlist);
        if (boxLvlist != null)
        {
            boxLvlist.Sort();
            for (int i = boxLvlist.Count - 1; i > -1; i--)
            {
                if (boxLvlist[i] <= playerLv)
                {
                    boxLv = boxLvlist[i];
                    break;
                }
            }
        }
        return GetChestsAwardByIDAndLv(boxId, boxLv);
    }
    private static ChestsAwardConfig GetChestsAwardByIDAndLv(int id, int lv)
    {
        ChestsAwardConfig chestsAwardConfig = null;
        string key = StringUtility.Contact(id, lv);
        chestAwardDict.TryGetValue(key, out chestsAwardConfig);
        return chestsAwardConfig;
    }
    //0:不是箱子,1:随机箱子 2:自选箱子
    public static int GetBoxType(int itemID)
    {
        if (!chestIdDict.ContainsKey(itemID))
        {
            return 0;
        }
        var config = GetChestsAwardByID(itemID);
        return string.IsNullOrEmpty(config.SelectList) ? 1 : 2;
    }
}
Main/Config/PartialConfigs/ChestsAwardConfig.cs.meta
copy from Main/Component/UI/Core/DelayButton.cs.meta copy to Main/Config/PartialConfigs/ChestsAwardConfig.cs.meta
File was copied from Main/Component/UI/Core/DelayButton.cs.meta
@@ -1,8 +1,7 @@
fileFormatVersion: 2
guid: f91c143a16d59de4b80b2b0ffbb455e4
timeCreated: 1501494723
licenseType: Free
guid: 5ce9e992608fd9f458c1b1a26a13d102
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
Main/Core/NetworkPackage/ClientPack/CA3_Item/CA323_tagCMUseItems.cs
@@ -5,7 +5,7 @@
public class CA323_tagCMUseItems : GameNetPackBasic {
    public byte ItemIndex;    //物品在背包中索引
    public ushort UseCnt;    //使用个数,0表示全部使用
    public uint UseCnt;    //使用个数,0表示全部使用
    public uint ExData;    //使用扩展值, 默认0, 选择物品宝箱时发送选择的物品ID
    public byte SelectCount;    //指定选择项,当批量使用单个箱子需要同时选中多种选项时使用该值
    public  tagCMUseItemsSelect[] SelectList;
@@ -17,7 +17,7 @@
    public override void WriteToBytes () {
        WriteBytes (ItemIndex, NetDataType.BYTE);
        WriteBytes (UseCnt, NetDataType.WORD);
        WriteBytes (UseCnt, NetDataType.DWORD);
        WriteBytes (ExData, NetDataType.DWORD);
        WriteBytes (SelectCount, NetDataType.BYTE);
        for (int i = 0; i < SelectCount; i ++) {
Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA801_tagMCGiveAwardInfo.cs
@@ -7,6 +7,6 @@
    {
        base.Done(vNetPack);
        HA801_tagMCGiveAwardInfo vNetData = vNetPack as HA801_tagMCGiveAwardInfo;
        PackManager.Instance.ReceiveAwardNotify(vNetData);
        BoxGetItemModel.Instance.ReceiveAwardNotify(vNetData);
    }
}
Main/Main.cs
@@ -32,6 +32,7 @@
        // UIManager.Instance.OpenWindow<LoginWin>();
        Debug.Log("切换到登录场景");
        ConfigManager.Instance.Init();
        GeneralDefine.Init();
        StageManager.Instance.ToLoginScene();
        DTC0403_tagPlayerLoginLoadOK.finishedLogin = false;
Main/Manager/UIManager.cs
@@ -691,6 +691,13 @@
        // 添加到UI列表
        uiDict[uiName].Add(returnValue);
        
#if UNITY_EDITOR
        if (uiDict[uiName].Count > 5)
        {
            Debug.LogError("已打开" + uiDict[uiName].Count + "个界面:" + uiName);
        }
#endif
        // 将UI添加到栈中
        uiStack.Push(returnValue);
        
Main/System/CustomizedGift/CustomizedRechargeModel.cs
@@ -52,7 +52,7 @@
            {
                int selectID = selectItemInfo[j][selectedItemIndexs[j] - 1];
                items.Add(new Item(CTGSelectItemConfig.Get(selectID).ItemID, CTGSelectItemConfig.Get(selectID).ItemCount));
                items.Add(new Item(CTGSelectItemConfig.Get(selectID).ItemID, (ulong)CTGSelectItemConfig.Get(selectID).ItemCount));
            }
        }
        else
@@ -143,7 +143,7 @@
                if (i < awards.Count)
                {
                    var award = awards[i];
                    var itemData = new ItemCellModel(award.id, false, (ulong)award.count);
                    var itemData = new ItemCellModel(award.id, false, (ulong)award.countEx);
                    itemCells[i].Init(itemData);
                    itemCells[i].button.SetListener(() =>
                    {
Main/System/GeneralConfig/GeneralDefine.cs
@@ -146,6 +146,7 @@
    public static Dictionary<int, List<int>> DropItemEffectMapID { get; private set; }
    public static Dictionary<int, List<int>> itemPutInPackDict { get; private set; }
    public static Dictionary<int, int> itemMoneyCountDict { get; private set; } //背包中用于展示货币数量的物品
    public static List<int> RebornAutoFightMapID { get; private set; }
    public static string teamWorldCall;
@@ -458,24 +459,26 @@
            //     checkShowSwitchAccount.Add(item.ToString());
            // }
            // var putInItemPack = FuncConfigConfig.Get("PutInItemPack");
            // LitJson.JsonData itemPutInData = LitJson.JsonMapper.ToObject(putInItemPack.Numerical1);
            // itemPutInPackDict = new Dictionary<int, List<int>>();
            // foreach (var _key in itemPutInData.Keys)
            // {
            //     var itemTypeData = itemPutInData[_key];
            //     int packType = int.Parse(_key);
            //     List<int> itemTypes = new List<int>();
            //     itemPutInPackDict.Add(packType, itemTypes);
            //     if (itemTypeData.IsArray)
            //     {
            //         for (i = 0; i < itemTypeData.Count; i++)
            //         {
            //             int itemType = int.Parse(itemTypeData[i].ToString());
            //             itemTypes.Add(itemType);
            //         }
            //     }
            // }
            var putInItemPack = FuncConfigConfig.Get("PutInItemPack");
            LitJson.JsonData itemPutInData = LitJson.JsonMapper.ToObject(putInItemPack.Numerical1);
            itemPutInPackDict = new Dictionary<int, List<int>>();
            foreach (var _key in itemPutInData.Keys)
            {
                var itemTypeData = itemPutInData[_key];
                int packType = int.Parse(_key);
                List<int> itemTypes = new List<int>();
                itemPutInPackDict.Add(packType, itemTypes);
                if (itemTypeData.IsArray)
                {
                    for (int i = 0; i < itemTypeData.Count; i++)
                    {
                        int itemType = int.Parse(itemTypeData[i].ToString());
                        itemTypes.Add(itemType);
                    }
                }
            }
            itemMoneyCountDict = ConfigParse.ParseIntDict(putInItemPack.Numerical2);
            // //拾取贵重物品
            // FuncConfigConfig importantItemType = FuncConfigConfig.Get("AutoBuyDrug");
Main/System/ItemTip/BoxGetItemModel.cs
New file
@@ -0,0 +1,538 @@
using System;
using LitJson;
using System.Collections.Generic;
/// <summary>
/// 宝箱功能 + 获取奖励界面
/// </summary>
public class BoxGetItemModel : GameSystemManager<BoxGetItemModel>
{
    List<string> commonShowAwardEvents = new List<string>();    //获取奖励的展示事件
    public override void Init()
    {
        var config = FuncConfigConfig.Get("CommonShowAwards");
        commonShowAwardEvents = JsonMapper.ToObject<List<string>>(config.Numerical1);
    }
    // void OnBeforePlayerDataInitialize()
    // {
    //     getItems = null;
    //     getCoinsType = 0;
    //     getCoinsCnt = 0;
    // }
    #region 处理服务器数据
    // public BoxGetItemInfo[] getItems { get; private set; }
    // public int getCoinsType { get; private set; }
    // public long getCoinsCnt { get; private set; }
    // public event Action<int, int, BoxGetItemInfo[]> RefreshGetItemAct;
    // public void SetGetBoxItemInfo(HA810_tagMCNotifyUseItemGetItem boxItemInfo)
    // {
    //     getItems = JsonMapper.ToObject<BoxGetItemInfo[]>(boxItemInfo.GetItemData);
    //     getCoinsType = boxItemInfo.MoneyType;
    //     getCoinsCnt = boxItemInfo.MoneyCount;
    //     if (!NewBieCenter.Instance.inGuiding)
    //     {
    //         List<Item> items = new List<Item>();
    //         for (int i = 0; i < getItems.Length; i++)
    //         {
    //             BoxGetItemInfo info = getItems[i];
    //             Dictionary<int, List<int>> useDataDic = ConfigParse.Analysis(info.UserData);
    //             if (useDataDic != null && useDataDic.TryGetValue((int)ItemUseDataKey.itemCount, out List<int> list) && list != null && list.Count > 0)
    //             {
    //                 int count = list[0];
    //                 items.Add(new Item(info.ItemID, count));
    //             }
    //             else
    //             {
    //                 items.Add(new Item(info.ItemID, info.Count));
    //             }
    //         }
    //         ItemLogicUtility.Instance.ShowGetItem(items, seconds: 0);
    //     }
    //     if (RefreshGetItemAct != null)
    //     {
    //         RefreshGetItemAct((int)boxItemInfo.UseItemID, (int)boxItemInfo.UseCount, getItems);
    //     }
    // }
    //获得奖励展示
    public void ReceiveAwardNotify(HA801_tagMCGiveAwardInfo netPack)
    {
        var eventName = UIHelper.ServerStringTrim(netPack.EventName);
        // 仙盟攻城战
        // if (eventName == "FamilyGCZSQGrid" || eventName == "FamilyGCZSQPass" || eventName == "FamilyGCZSQPassAll" ||
        //     eventName == "FamilyGCZContiribution" || eventName == "FamilyGCZAtk")
        // {
        //     ModelCenter.Instance.GetModel<FairySiegeActModel>()?.OnUpdateAwardInfoAction(netPack);
        //     return;
        // }
        if (!commonShowAwardEvents.Contains(eventName))
            return;
        List<Item> showItems = new List<Item>();
        if (netPack.Exp != 0 || netPack.ExpPoint != 0)
        {
            ulong expValue = netPack.Exp + netPack.ExpPoint * (ulong)Constants.ExpPointValue;
            showItems.Add(new Item(GeneralDefine.expDisplayId, expValue));
        }
        if (netPack.MoneyList.Length != 0)
        {
            for (int i = 0; i < netPack.MoneyLen; i++)
            {
                var moneyType = netPack.MoneyList[i].MoneyType;
                if (GeneralDefine.moneyDisplayIds.ContainsKey(moneyType) && netPack.MoneyList[i].MoneyValue != 0)
                {
                    showItems.Add(new Item(GeneralDefine.moneyDisplayIds[moneyType], netPack.MoneyList[i].MoneyValue));
                }
            }
        }
        if (netPack.ItemList.Length != 0)
        {
            for (int i = 0; i < netPack.ItemLen; i++)
            {
                showItems.Add(new Item((int)netPack.ItemList[i].ItemID, netPack.ItemList[i].Count, netPack.ItemList[i].IsBind));
            }
        }
        string info = string.Empty;
        if (LanguageConfig.HasKey("commonShowAwardEvents_" + eventName))
            info = Language.Get("commonShowAwardEvents_" + eventName);
        if (showItems.Count == 0)
            return;
        ItemLogicUtility.Instance.ShowGetItem(showItems, eventName);
    }
    // public int GetUseCntByID(int itemId)
    // {
    //     return PackManager.Instance.GetItemUsedTimesToday(itemId);
    // }
    #endregion
    // #region 消耗材料货币开启的宝箱
    // public void SetModel(string guid, int itemId)
    // {
    //     ChestsConfig chestsConfig = ChestsConfig.Get(itemId);
    //     this.guid = guid;
    //     this.itemId = itemId;
    //     if (guid == "" || chestsConfig == null) return;
    //     ItemConfig boxConfig = ItemConfig.Get(itemId);
    //     if (PlayerDatas.Instance.baseData.LV < boxConfig.UseLV)
    //     {
    //         ServerTipDetails.DisplayNormalTip(Language.Get("MakeUseItem101", boxConfig.UseLV));
    //         return;
    //     }
    //     CheckOpenBoxCondi(guid, itemId);
    // }
    // public void CheckOpenBoxCondi(string guid, int itemId, int useCnt = 1)
    // {
    //     ChestsConfig chestsConfig = ChestsConfig.Get(itemId);
    //     if (chestsConfig == null) return;
    //     ItemConfig boxConfig = ItemConfig.Get(itemId);
    //     if (chestsConfig.ExpendItemID != 0)
    //     {
    //         ItemConfig itemConfig = ItemConfig.Get(chestsConfig.ExpendItemID);
    //         ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("OpenBoxTool", itemConfig.ItemName), (bool isOk) =>
    //         {
    //             if (isOk)
    //             {
    //                 if (!IsEnoughTools(chestsConfig.ExpendItemID, chestsConfig.ExpendCount * useCnt))
    //                 {
    //                     SysNotifyMgr.Instance.ShowTip("OpenBoxToolNoEnough", itemConfig.ItemName);
    //                     return;
    //                 }
    //                 else
    //                 {
    //                     CheckOpenMoney(chestsConfig, boxConfig, useCnt);
    //                 }
    //             }
    //         });
    //     }
    //     else
    //     {
    //         CheckOpenMoney(chestsConfig, boxConfig, useCnt);
    //     }
    // }
    // public void CheckOpenMoney(ChestsConfig chestsConfig, ItemConfig boxConfig, int useCnt)
    // {
    //     if (!IsEnoughMoney(chestsConfig.OpenMoney * useCnt))
    //     {
    //         SysNotifyMgr.Instance.ShowTip("BoxOpenCostMoney", 1);
    //         return;
    //     }
    //     else
    //     {
    //         if (chestsConfig.OpenMoney > 0)
    //         {
    //             ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("OpenBoxGold", chestsConfig.OpenMoney * useCnt), (bool isOk) =>
    //                 {
    //                     if (isOk)
    //                     {
    //                         CheckOtherCondi(chestsConfig, boxConfig, useCnt);
    //                     }
    //                 });
    //         }
    //         else
    //         {
    //             CheckOtherCondi(chestsConfig, boxConfig, useCnt);
    //         }
    //     }
    // }
    // public void CheckOtherCondi(ChestsConfig chestsConfig, ItemConfig boxConfig, int useCnt)
    // {
    //     if (boxConfig.MaxSkillCnt > 0 && GetUseCntByID(itemId) >= boxConfig.MaxSkillCnt)
    //     {
    //         SysNotifyMgr.Instance.ShowTip("UseCntLimit");
    //         return;
    //     }
    //     if (IsSelectItemByID(itemId))
    //     {
    //         UIManager.Instance.OpenWindow<ChooseItemsWin>();
    //         return;
    //     }
    //     ItemLogicUtility.Instance.UseItem(guid, useCnt);
    // }
    // public bool CheckOpenBoxCondition(int itemId, out bool isBox)
    // {
    //     isBox = false;
    //     ChestsConfig chestsConfig = ChestsConfig.Get(itemId);
    //     if (chestsConfig == null) return false;
    //     isBox = true;
    //     bool isCanOpen = true;
    //     ItemConfig boxConfig = ItemConfig.Get(itemId);
    //     if (PlayerDatas.Instance.baseData.LV < boxConfig.UseLV)
    //     {
    //         isCanOpen = false;
    //         return isCanOpen;
    //     }
    //     if (chestsConfig.ExpendItemID != 0)
    //     {
    //         ItemConfig itemConfig = ItemConfig.Get(chestsConfig.ExpendItemID);
    //         if (!IsEnoughTools(chestsConfig.ExpendItemID, chestsConfig.ExpendCount))
    //         {
    //             isCanOpen = false;
    //             return isCanOpen;
    //         }
    //     }
    //     if (!IsEnoughMoney(chestsConfig.OpenMoney))
    //     {
    //         isCanOpen = false;
    //         return isCanOpen;
    //     }
    //     if (boxConfig.MaxSkillCnt > 0 && GetUseCntByID(itemId) >= boxConfig.MaxSkillCnt)
    //     {
    //         isCanOpen = false;
    //         return isCanOpen;
    //     }
    //     return isCanOpen;
    // }
    // private bool IsEnoughMoney(int moneyCnt)
    // {
    //     ulong haveMoney = UIHelper.GetMoneyCnt(1);
    //     if (haveMoney >= (ulong)moneyCnt)
    //     {
    //         return true;
    //     }
    //     else
    //     {
    //         return false;
    //     }
    // }
    // private bool IsEnoughTools(int itemId, int toolCnt)
    // {
    //     int count = PackManager.Instance.GetItemCountByID(PackType.Item, itemId);
    //     if (count >= toolCnt)
    //     {
    //         return true;
    //     }
    //     else
    //     {
    //         return false;
    //     }
    // }
    // #endregion
    //宝箱预览物品 (随机获得)
    public List<Item> GetBoxItems(int boxID)
    {
        List<Item> itemIDs = new List<Item>();
        if (ChestsAwardConfig.GetBoxType(boxID) == 0)
        {
            return itemIDs;
        }
        var config = ChestsAwardConfig.GetChestsAwardByID(boxID);
        if (!string.IsNullOrEmpty(config.SelectList))
        {
            var selectlistDict = ConfigParse.GetDic<int, int>(config.SelectList);
            foreach (var item in selectlistDict)
            {
                itemIDs.Add(new Item(item.Key, (ulong)item.Value));
            }
        }
        if (!string.IsNullOrEmpty(config.FixedItem))
        {
            var itemListDict = ConfigParse.GetDic<int, int>(config.FixedItem);
            foreach (var item in itemListDict)
            {
                itemIDs.Add(new Item(item.Key, (ulong)item.Value));
            }
        }
        if (!string.IsNullOrEmpty(config.Probability1))
        {
            var arr = JsonMapper.ToObject(config.Probability1);
            for (int i = 0; i < arr.Count; i++)
            {
                itemIDs.Add(new Item(int.Parse(arr[i][1][0].ToString()), ulong.Parse(arr[i][1][1].ToString())));
            }
        }
        if (!string.IsNullOrEmpty(config.Probability2))
        {
            var arr = JsonMapper.ToObject(config.Probability2);
            for (int i = 0; i < arr.Count; i++)
            {
                itemIDs.Add(new Item(int.Parse(arr[i][1][0].ToString()), ulong.Parse(arr[i][1][1].ToString())));
            }
        }
        return itemIDs;
    }
    #region 自选物品宝箱
    //<物品ID,数量>  用户选中物品字典
    public Dictionary<int, ChooseItems> userChooseItemDict = new Dictionary<int, ChooseItems>();
    public Action countChangeAction;    //数量发生变化
    public bool IsSelectItemByID(int boxId)
    {
        ChestsAwardConfig awardConfig = ChestsAwardConfig.GetChestsAwardByID(boxId);
        if (string.IsNullOrEmpty(awardConfig.SelectList))
        {
            return false;
        }
        return true;
    }
    public int[][] GetSelectItemsByID(int boxId)
    {
        ChestsAwardConfig awardConfig = ChestsAwardConfig.GetChestsAwardByID(boxId);
        if (string.IsNullOrEmpty(awardConfig.SelectList))
        {
            return null;
        }
        var arr = ConfigParse.GetArray2<int>(awardConfig.SelectList);
        Array.Sort(arr, SortShowItem);
        return arr;
    }
    int SortShowItem(int[] a, int[] b)
    {
        var itemConfig1 = ItemConfig.Get(a[0]);
        var itemConfig2 = ItemConfig.Get(b[0]);
        int quality1 = itemConfig1.ItemColor;
        int quality2 = itemConfig2.ItemColor;
        //品质高的排在前面
        if (quality1 != quality2)
            return quality2.CompareTo(quality1);
        return itemConfig1.ID - itemConfig2.ID;
    }
    /// <summary>
    /// 选择自选物品数量
    /// </summary>
    /// <param name="itemId">被选择物品的ID</param>
    /// <param name="guid">宝箱的GUID</param>
    /// <param name="extra"></param>
    /// <param name="changeCnt">加减数量</param>
    public void IncreaseUserChooseItemCount(int itemId, string guid, int extra, int changeCnt)
    {
        if (userChooseItemDict.ContainsKey(itemId))
        {
            userChooseItemDict[itemId].guid = guid;
            userChooseItemDict[itemId].useCnt = userChooseItemDict[itemId].useCnt + changeCnt;
            userChooseItemDict[itemId].extra = extra;
        }
        else
        {
            userChooseItemDict[itemId] = new ChooseItems() { guid = guid, useCnt = 1, extra = extra };
        }
        countChangeAction?.Invoke();
    }
    //当前选择材料总数量
    public int GetNowChooseItemCount()
    {
        int total = 0;
        if (userChooseItemDict == null && userChooseItemDict.Count == 0)
            return 0;
        List<int> list = new List<int>(userChooseItemDict.Keys);
        for (int i = 0; i < list.Count; i++)
            total += userChooseItemDict[list[i]].useCnt;
        return total;
    }
    public bool TrySendUse()
    {
        CA323_tagCMUseItems.tagCMUseItemsSelect[] chooseItemList = GetSendList(userChooseItemDict, out List<ChooseItems> resultChooseItemDict, out string guid, out int count);
        //一个材料也没选
        if (chooseItemList.Length < 1)
        {
            SysNotifyMgr.Instance.ShowTip("ChooseItems01");
            return false;
        }
        var itemModel = PackManager.Instance.GetItemByGuid(guid);
        if (itemModel == null)
            return false;
        for (int i = 0; i < resultChooseItemDict.Count; i++)
        {
            var item = PackManager.Instance.GetItemByGuid(resultChooseItemDict[i].guid);
            if (item == null)
                return false;
            var error = 0;
            if (!ItemLogicUtility.Instance.CanUseItem(resultChooseItemDict[i].guid, resultChooseItemDict[i].useCnt, out error))
            {
                switch (error)
                {
                    case 1:
                        SysNotifyMgr.Instance.ShowTip("EverydayUseLimit");
                        break;
                    case 2:
                        SysNotifyMgr.Instance.ShowTip("UseCntLimit");
                        break;
                    case 3:
                        SysNotifyMgr.Instance.ShowTip("GeRen_chenxin_749572");
                        break;
                    default:
                        break;
                }
                return false;
            }
        }
        var useItem = new CA323_tagCMUseItems();
        useItem.ItemIndex = (byte)itemModel.gridIndex;
        useItem.UseCnt = (ushort)count;
        useItem.ExData = (uint)0;
        useItem.SelectCount = (byte)chooseItemList.Length;
        useItem.SelectList = chooseItemList;
        GameNetSystem.Instance.SendInfo(useItem);
        return true;
    }
    CA323_tagCMUseItems.tagCMUseItemsSelect[] GetSendList(Dictionary<int, ChooseItems> userChooseItemDict, out List<ChooseItems> resultChooseItemDict, out string guid, out int count)
    {
        guid = string.Empty;
        count = 0;
        resultChooseItemDict = new List<ChooseItems> { };
        List<int> list = new List<int>(userChooseItemDict.Keys);
        List<ChooseItems> result = new List<ChooseItems>();
        for (int i = 0; i < list.Count; i++)
        {
            int itemId = list[i];
            ChooseItems chooseItems = userChooseItemDict[itemId];
            if (!ItemConfig.HasKey(itemId))
                continue;
            if (chooseItems == null || chooseItems.useCnt <= 0)
                continue;
            count += chooseItems.useCnt;
            result.Add(chooseItems);
        }
        resultChooseItemDict = result;
        if (!result.IsNullOrEmpty())
            guid = result[0].guid;
        List<CA323_tagCMUseItems.tagCMUseItemsSelect> tagCMUseItemsSelects = new List<CA323_tagCMUseItems.tagCMUseItemsSelect>();
        for (int i = 0; i < result.Count; i++)
        {
            CA323_tagCMUseItems.tagCMUseItemsSelect temp = new CA323_tagCMUseItems.tagCMUseItemsSelect();
            temp.SelectID = (uint)result[i].extra;
            temp.SelectCnt = (ushort)result[i].useCnt;
            tagCMUseItemsSelects.Add(temp);
        }
        return tagCMUseItemsSelects.ToArray();
    }
    public void ClearAll()
    {
        userChooseItemDict.Clear();
    }
    #endregion
}
public class BoxGetItemInfo
{
    public int ItemID;
    public int Count;
    public int IsBind;
    public int IsSuite;
    public string UserData;
}
public class ChooseItems
{
    public string guid;
    public int useCnt;
    public int extra;
}
Main/System/ItemTip/BoxGetItemModel.cs.meta
copy from Main/Component/UI/Core/DelayButton.cs.meta copy to Main/System/ItemTip/BoxGetItemModel.cs.meta
File was copied from Main/Component/UI/Core/DelayButton.cs.meta
@@ -1,8 +1,7 @@
fileFormatVersion: 2
guid: f91c143a16d59de4b80b2b0ffbb455e4
timeCreated: 1501494723
licenseType: Free
guid: 2eb8c13a1ade0ce458b63f0ca368758c
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
Main/System/ItemTip/BoxItemCell.cs
New file
@@ -0,0 +1,20 @@
using UnityEngine;
using UnityEngine.UI;
public class BoxItemCell : MonoBehaviour
{
    [SerializeField] ItemCell itemCell;
    [SerializeField] Text nameText;
    public void Display(Item item)
    {
        int itemID = item.id;
        itemCell.Init(new ItemCellModel(itemID, false, item.countEx));
        itemCell.button.AddListener(()=>
        {
            ItemTipUtility.Show(itemID);
        });
        nameText.text = ItemConfig.Get(itemID).ItemName;
    }
}
Main/System/ItemTip/BoxItemCell.cs.meta
copy from Main/Component/UI/Core/DelayButton.cs.meta copy to Main/System/ItemTip/BoxItemCell.cs.meta
File was copied from Main/Component/UI/Core/DelayButton.cs.meta
@@ -1,8 +1,7 @@
fileFormatVersion: 2
guid: f91c143a16d59de4b80b2b0ffbb455e4
timeCreated: 1501494723
licenseType: Free
guid: bb169f4e43327164c8aa0a1cfeecdad1
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
Main/System/ItemTip/BoxItemLineCell.cs
New file
@@ -0,0 +1,25 @@
using System.Collections.Generic;
using LitJson;
using UnityEngine;
public class BoxItemLineCell : CellView
{
    [SerializeField] BoxItemCell[] itemList;
    public void Display(List<Item> list)
    {
        for (int i = 0; i < itemList.Length; i++)
        {
            if (i < list.Count)
            {
                itemList[i].SetActive(true);
                itemList[i].Display(list[i]);
            }
            else
            {
                itemList[i].SetActive(false);
            }
        }
    }
}
Main/System/ItemTip/BoxItemLineCell.cs.meta
copy from Main/Component/UI/Core/DelayButton.cs.meta copy to Main/System/ItemTip/BoxItemLineCell.cs.meta
File was copied from Main/Component/UI/Core/DelayButton.cs.meta
@@ -1,8 +1,7 @@
fileFormatVersion: 2
guid: f91c143a16d59de4b80b2b0ffbb455e4
timeCreated: 1501494723
licenseType: Free
guid: a4e421d1b43c43741a77780e74104218
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
Main/System/ItemTip/BoxItemWin.cs
New file
@@ -0,0 +1,118 @@
using System;
using System.Collections.Generic;
using LitJson;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 随机宝箱:区分是真物品,还是预览
/// 支持同时打开多个界面
/// </summary>
public class BoxItemWin : UIBase
{
    [SerializeField] ItemCell itemCell;
    [SerializeField] Text nameText;
    [SerializeField] Text descText;
    [SerializeField] ScrollerController scroller;
    [SerializeField] SliderPanel sliderPanel;
    [SerializeField] Button openButton;
    [SerializeField] CellView _InitCell;
    string guid;
    int itemID;
    int itemCount;
    int useCnt;
    List<Item> items;
    protected override void InitComponent()
    {
        openButton.AddListener(() =>
        {
            ItemLogicUtility.Instance.UseItem(guid, useCnt);
        });
    }
    protected override void Start()
    {
        _InitCell.cellIdentifier = _InitCell.cellIdentifier + this.GetInstanceID().ToString();
    }
    protected override void OnPreOpen()
    {
        itemID = ItemTipUtility.mainTipData.baseInfo.itemId;
        itemCount = ItemTipUtility.mainTipData.baseInfo.count;
        guid = ItemTipUtility.mainTipData.guid;
        itemCell.Init(new ItemCellModel(itemID, false, (ulong)itemCount));
        var itemConfig = ItemConfig.Get(itemID);
        nameText.text = itemConfig.ItemName;
        descText.text = itemConfig.Description;
        if (string.IsNullOrEmpty(guid))
        {
            openButton.SetActive(false);
            sliderPanel.SetActive(false);
        }
        else
        {
            openButton.SetActive(true);
            sliderPanel.SetActive(true);
        }
        sliderPanel.Init((value) => { useCnt = value; }, itemCount);
        scroller.OnRefreshCell += OnRefreshCell;
        items = BoxGetItemModel.Instance.GetBoxItems(itemID);
        CreateScroller();
    }
    protected override void OnPreClose()
    {
        scroller.OnRefreshCell -= OnRefreshCell;
    }
    void CreateScroller()
    {
        scroller.Refresh();
        for (int i = 0; i < items.Count; i++)
        {
            if (i % 4 == 0)
            {
                List<Item> tmpIDs = new List<Item>();
                for (int j = 0; j < 4; j++)
                {
                    int index = i + j;
                    if (index >= items.Count)
                        break;
                    tmpIDs.Add(items[index]);
                }
                scroller.AddCell(ScrollerDataType.Header, i);
            }
        }
        scroller.Restart();
    }
    void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell as BoxItemLineCell;
        List<Item> tmpIDs = new List<Item>();
        for (int j = 0; j < 4; j++)
        {
            int index = cell.index + j;
            if (index >= items.Count)
                break;
            tmpIDs.Add(items[index]);
        }
        _cell.Display(tmpIDs);
    }
}
Main/System/ItemTip/BoxItemWin.cs.meta
copy from Main/Component/UI/Core/DelayButton.cs.meta copy to Main/System/ItemTip/BoxItemWin.cs.meta
File was copied from Main/Component/UI/Core/DelayButton.cs.meta
@@ -1,8 +1,7 @@
fileFormatVersion: 2
guid: f91c143a16d59de4b80b2b0ffbb455e4
timeCreated: 1501494723
licenseType: Free
guid: b86f5d8b940c1c34cabe4876cd7993be
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
Main/System/ItemTip/ChooseItemsCell.cs
New file
@@ -0,0 +1,79 @@
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class ChooseItemsCell : CellView
{
    [SerializeField] ItemCell itemCell;
    [SerializeField] TextEx txtItemName;
    [SerializeField] TextEx txtNumber;
    [SerializeField] LongPressButton btnReduce;
    [SerializeField] LongPressButton btnPlus;
    [SerializeField] Transform numForm;
    int itemId;
    string guid;
    public void Display(int[] itemArr, string _guid )
    {
        this.itemId = itemArr[0];
        this.guid = _guid;
        ItemConfig itemConfig = ItemConfig.Get(itemId);
        int count = itemArr[1];
        itemCell.Init(new ItemCellModel(itemId, false, (ulong)count));
        itemCell.button.SetListener(() =>
        {
            ItemTipUtility.Show(itemId);
        });
        txtItemName.text = itemConfig.ItemName;
        txtNumber.text = BoxGetItemModel.Instance.userChooseItemDict.ContainsKey(itemId) ? BoxGetItemModel.Instance.userChooseItemDict[itemId].useCnt.ToString() : "0";
        if (string.IsNullOrEmpty(guid))
        {
            numForm.SetActive(false);
        }
        else
        {
            numForm.SetActive(true);
            btnPlus.onPress.RemoveAllListeners();
            btnPlus.SetListener(OnClickPlus);
            btnPlus.onPress.AddListener(OnClickPlus);
            btnReduce.onPress.RemoveAllListeners();
            btnReduce.SetListener(OnClickReduce);
            btnReduce.onPress.AddListener(OnClickReduce);
        }
    }
    void OnClickPlus()
    {
        ItemModel itemModel = PackManager.Instance.GetItemByGuid(guid);
        if (itemModel == null)
            return;
        if (BoxGetItemModel.Instance.GetNowChooseItemCount() >= itemModel.count)
            return;
        BoxGetItemModel.Instance.IncreaseUserChooseItemCount(itemId, itemModel.guid, itemId, 1);
        txtNumber.text = BoxGetItemModel.Instance.userChooseItemDict.ContainsKey(itemId) ? BoxGetItemModel.Instance.userChooseItemDict[itemId].useCnt.ToString() : "0";
    }
    void OnClickReduce()
    {
        ItemModel itemModel = PackManager.Instance.GetItemByGuid(guid);
        if (itemModel == null)
            return;
        if (!BoxGetItemModel.Instance.userChooseItemDict.ContainsKey(itemId))
            return;
        if (BoxGetItemModel.Instance.userChooseItemDict[itemId].useCnt <= 0)
            return;
        BoxGetItemModel.Instance.IncreaseUserChooseItemCount(itemId, itemModel.guid, itemId, -1);
        txtNumber.text = BoxGetItemModel.Instance.userChooseItemDict.ContainsKey(itemId) ? BoxGetItemModel.Instance.userChooseItemDict[itemId].useCnt.ToString() : "0";
    }
}
Main/System/ItemTip/ChooseItemsCell.cs.meta
File was renamed from Main/Component/UI/Core/DelayButton.cs.meta
@@ -1,8 +1,7 @@
fileFormatVersion: 2
guid: f91c143a16d59de4b80b2b0ffbb455e4
timeCreated: 1501494723
licenseType: Free
guid: 7eacdda8b7c863e48b2ae4acd2027167
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
Main/System/ItemTip/ChooseItemsWin.cs
New file
@@ -0,0 +1,109 @@
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
public class ChooseItemsWin : UIBase
{
    [SerializeField] ItemCell itemCell;
    [SerializeField] Text nameText;
    [SerializeField] Text descText;
    [SerializeField] ScrollerController scroller;
    [SerializeField] Button openButton;
    [SerializeField] Text txtChooseNum;
    [SerializeField] CellView _InitCell;
    string guid;
    int itemID;
    int itemCount;
    int[][] selectArray;
    protected override void InitComponent()
    {
        openButton.AddListener(() =>
        {
            BoxGetItemModel.Instance.TrySendUse();
        });
    }
    protected override void Start()
    {
        _InitCell.cellIdentifier = _InitCell.cellIdentifier + this.GetInstanceID().ToString();
    }
    protected override void OnPreOpen()
    {
        BoxGetItemModel.Instance.countChangeAction += OnCountChangeAction;
        scroller.OnRefreshCell += OnRefreshCell;
        itemID = ItemTipUtility.mainTipData.baseInfo.itemId;
        itemCount = ItemTipUtility.mainTipData.baseInfo.count;
        guid = ItemTipUtility.mainTipData.guid;
        InitItemsData();
        itemCell.Init(new ItemCellModel(itemID, false, (ulong)itemCount));
        var itemConfig = ItemConfig.Get(itemID);
        nameText.text = itemConfig.ItemName;
        descText.text = itemConfig.Description;
        if (string.IsNullOrEmpty(guid))
        {
            //预览
            openButton.SetActive(false);
        }
        else
        {
            BoxGetItemModel.Instance.ClearAll();
            openButton.SetActive(true);
        }
        int nowChooseItemCount = BoxGetItemModel.Instance.GetNowChooseItemCount();
        txtChooseNum.text = Language.Get("L1100", Language.Get("L1107"),
        UIHelper.AppendColor(TextColType.DarkGreen, $"{nowChooseItemCount}/{itemCount}"));
        CreateScroller();
    }
    protected override void OnPreClose()
    {
        scroller.OnRefreshCell -= OnRefreshCell;
    }
    void CreateScroller()
    {
        scroller.Refresh();
        for (int i = 0; i < selectArray.Length; i++)
        {
            scroller.AddCell(ScrollerDataType.Header, i);
        }
        scroller.Restart();
    }
    void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell as ChooseItemsCell;
        _cell.Display(selectArray[cell.index], guid);
    }
    void InitItemsData()
    {
        selectArray = BoxGetItemModel.Instance.GetSelectItemsByID(itemID);
    }
    private void OnCountChangeAction()
    {
        int nowChooseItemCount = BoxGetItemModel.Instance.GetNowChooseItemCount();
        txtChooseNum.text = Language.Get("L1100", Language.Get("L1107"),
        UIHelper.AppendColor(TextColType.DarkGreen, $"{nowChooseItemCount}/{itemCount}"));
    }
}
Main/System/ItemTip/ChooseItemsWin.cs.meta
copy from Main/Component/UI/Core/DelayButton.cs.meta copy to Main/System/ItemTip/ChooseItemsWin.cs.meta
File was copied from Main/Component/UI/Core/DelayButton.cs.meta
@@ -1,8 +1,7 @@
fileFormatVersion: 2
guid: f91c143a16d59de4b80b2b0ffbb455e4
timeCreated: 1501494723
licenseType: Free
guid: 80c2b6d2ef0dcfb46b0971eddae69ab7
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
Main/System/ItemTip/ItemTipUtility.cs
@@ -7,6 +7,7 @@
using UnityEngine.UI;
using System.Collections.Generic;
using System.Linq;
using LitJson;
public class ItemTipUtility
{
@@ -14,14 +15,9 @@
    {
        Item,
        Equip,
        Dogz,
        GatherSoul, //废弃
        KingTreasure, //王者法宝tip
        PetMount,
        SpiritWeapon,
        PeerlessChest,
        TreasureShow, //其他法宝tip
        BoxItem,    //宝箱物品
        BoxItem,    //宝箱随机物品
        BoxChooseItem,    //宝箱自选物品
        TreasurePavilion, //古宝物品(碎片)
    }
@@ -30,7 +26,7 @@
        public string guid;
        public int itemId;
        public int goodId;
        public int exchangeItemId;
        public int exchangeItemId;  //部分界面要动态变化物品的情况
        public BaseInfo baseInfo;
        public BaseProperty baseProperty;
@@ -224,7 +220,7 @@
    // static ItemOverdueModel itemOverdueModel { get { return ModelCenter.Instance.GetModel<ItemOverdueModel>(); } }
    // static BoxGetItemModel boxGetItemModel { get { return ModelCenter.Instance.GetModel<BoxGetItemModel>(); } }
    public static TipData mainTipData { get; private set; }
    public static TipData mainTipData { get; private set; }     // 注意当递进点击打开多个tip界面会变更数据,不能依赖此值
    public static TipData secondaryData { get; private set; }
    public static void Show(int itemId)
@@ -252,13 +248,13 @@
        // secondaryData = null;
        // var config = ItemConfig.Get(itemId);
        // PrintItemBrief(itemId);
        var config = ItemConfig.Get(itemId);
        PrintItemBrief(itemId);
        // var tipType = GetTipType(itemId);
        // switch (tipType)
        // {
        //     case TipType.Equip:
        var tipType = GetTipType(itemId);
        switch (tipType)
        {
            case TipType.Equip:
        //         mainTipData = CreateNormalEquipData(itemId);
        //         if (item.isAuctionEquip && !item.legendProperty.Equals(default(LegendProperty)))
        //         {
@@ -278,73 +274,38 @@
        //                 }
        //             }
        //         }
        //         break;
        //     case TipType.Dogz:
        //         mainTipData = CreateDogzEquipData(itemId);
        //         break;
        //     case TipType.PeerlessChest:
        //         mainTipData = CreateItemData(itemId);
        //         mainTipData.getWay = default(GetWay);
        //         Dictionary<int, int> selectItems;
        //         if (boxGetItemModel.IsSelectItemByID(itemId, out selectItems))
        //         {
        //             secondaryData = CreateNormalEquipData(selectItems.Keys.First());
        //             secondaryData.getWay = default(GetWay);
        //         }
        //         break;
        //     default:
        //         mainTipData = CreateItemData(itemId);
        //         break;
        // }
                break;
            default:
                mainTipData = CreateItemData(itemId);
                break;
        }
        // mainTipData.getWay.defaultUnfold = item.unfoldGetWay;
        // switch (tipType)
        // {
        //     case TipType.Equip:
        mainTipData.getWay.defaultUnfold = item.unfoldGetWay;
        switch (tipType)
        {
            case TipType.Equip:
        //         WindowCenter.Instance.Open<EquipTipWin>();
        //         break;
        //     case TipType.Dogz:
        //         WindowCenter.Instance.Open<EquipTipWin>();
        //         break;
        //     case TipType.KingTreasure:
        //         var kingTreasureShow = ModelCenter.Instance.GetModel<KingTreasureShowModel>();
        //         kingTreasureShow.SetInitData(itemId);
        //         break;
                break;
        //     case TipType.PetMount:
        //         WindowCenter.Instance.Open<PetMountTipWin>();
        //         break;
        //     case TipType.SpiritWeapon:
        //         WindowCenter.Instance.Open<SpiritWeaponTipWin>();
        //         break;
        //     case TipType.PeerlessChest:
        //         WindowCenter.Instance.Open<PeerlessChestTipWin>();
        //         break;
        //     case TipType.TreasureShow:
        //         TreasureEffectModel effectModel = ModelCenter.Instance.GetModel<TreasureEffectModel>();
        //         if (config.Effect1 == 232)
        //         {
        //             effectModel.SetTreasureID(config.EffectValueA1, 0);
        //         }
        //         break;
        //     case TipType.BoxItem:
        //         if (WindowCenter.Instance.IsOpen<ItemBoxTipWin>())
        //         {
        //             WindowCenter.Instance.Open<ItemTipWin>();
        //         }
        //         else
        //         {
        //             WindowCenter.Instance.Open<ItemBoxTipWin>();
        //         }
        //         break;
        //     case TipType.TreasurePavilion:
            case TipType.BoxItem:
                UIManager.Instance.OpenWindow<BoxItemWin>();
                break;
            case TipType.BoxChooseItem:
                UIManager.Instance.OpenWindow<ChooseItemsWin>();
                break;
            case TipType.TreasurePavilion:
        //         TreasurePavilionModel.Instance.selectGubao = config.EffectValueA1;
        //         TreasurePavilionModel.Instance.showTipFromPiece = config.ID;
        //         WindowCenter.Instance.OpenIL<TreasurePavilionTipWin>();
        //         break;
        //     default:
        //         WindowCenter.Instance.Open<ItemTipWin>();
        //         break;
        // }
                break;
            default:
                UIManager.Instance.OpenWindow<ItemTipWin>();
                break;
        }
    }
    public static void Show(string guid, bool operatable = true)
@@ -407,16 +368,12 @@
            // case TipType.PetMount:
            //     WindowCenter.Instance.Open<PetMountTipWin>();
            //     break;
            // case TipType.BoxItem:
            //     if (WindowCenter.Instance.IsOpen<ItemBoxTipWin>())
            //     {
            //         WindowCenter.Instance.Open<ItemTipWin>();
            //     }
            //     else
            //     {
            //         WindowCenter.Instance.Open<ItemBoxTipWin>();
            //     }
            //     break;
            case TipType.BoxItem:
                UIManager.Instance.OpenWindow<BoxItemWin>();
                break;
            case TipType.BoxChooseItem:
                UIManager.Instance.OpenWindow<ChooseItemsWin>();
                break;
            // case TipType.TreasurePavilion:
            //     TreasurePavilionModel.Instance.selectGubao = item.config.EffectValueA1;
            //     TreasurePavilionModel.Instance.showTipFromPiece = item.itemId;
@@ -429,51 +386,6 @@
    }
    public static void ShowGood(int goodId, int itemId)
    {
        secondaryData = null;
        var isEquip = ItemLogicUtility.Instance.IsRealmEquip(itemId);
        if (isEquip)
        {
            mainTipData = CreateGoodEquipData(itemId, goodId);
        }
        else
        {
            mainTipData = CreateGoodItemData(itemId, goodId);
        }
        BuyItemController.Instance.SetGood(goodId);
        var itemConfig = ItemConfig.Get(itemId);
        if (isEquip)
        {
            // WindowCenter.Instance.Open<EquipTipWin>();
        }
        else
        {
            var tipType = GetTipType(itemId);
            // switch (tipType)
            // {
            //     case TipType.PetMount:
            //         WindowCenter.Instance.Open<PetMountTipWin>();
            //         break;
            //     case TipType.BoxItem:
            //         if (WindowCenter.Instance.IsOpen<ItemBoxTipWin>())
            //         {
            //             WindowCenter.Instance.Open<ItemTipWin>();
            //         }
            //         else
            //         {
            //             WindowCenter.Instance.Open<ItemBoxTipWin>();
            //         }
            //         break;
            //     default:
            //         WindowCenter.Instance.Open<ItemTipWin>();
            //         break;
            // }
        }
    }
    // public static void ShowCustomEquip(CustomEquipInfo info)
    // {
@@ -798,21 +710,21 @@
        };
    }
    // static TipData CreateItemData(int itemId)
    // {
    //     return new TipData()
    //     {
    //         itemId = itemId,
    //         baseInfo = GetBaseInfo(itemId),
    static TipData CreateItemData(int itemId)
    {
        return new TipData()
        {
            itemId = itemId,
            baseInfo = GetBaseInfo(itemId),
    //         baseProperty = GetBaseProperty(itemId),
    //         exchangeItemId = itemId,
            exchangeItemId = itemId,
    //         spiritWeaponProperty = GetSpiritWeaponProperty(itemId),
    //         legendProperty = GetLegendProperty(itemId),
    //         petMountBaseProperty = GetPetMountBaseProperty(itemId),
    //         getWay = GetGetWay(itemId),
    //         shenProperty = GetShenProperty(itemId)
    //     };
    // }
        };
    }
    static TipData CreateGoodItemData(int itemId, int goodId)
    {
@@ -1622,35 +1534,7 @@
    //     return skillInfo;
    // }
    // private static WingRefineMaterials GetWingRefineMaterials(string guid)
    // {
    //     var item = packModel.GetItemByGuid(guid);
    //     if (item == null)
    //     {
    //         return default(WingRefineMaterials);
    //     }
    //     if (item.config.Type != 113)
    //     {
    //         return default(WingRefineMaterials);
    //     }
    //     var refineMaterials = new WingRefineMaterials();
    //     refineMaterials.materials = new List<Int2>();
    //     var ids = item.GetUseData((int)ItemUseDataKey.wingMaterialItemID);
    //     var values = item.GetUseData((int)ItemUseDataKey.wingMaterialItemCount);
    //     if (!ids.IsNullOrEmpty() && !values.IsNullOrEmpty())
    //     {
    //         var min = Mathf.Min(ids.Count, values.Count);
    //         for (int i = 0; i < min; i++)
    //         {
    //             refineMaterials.materials.Add(new Int2(ids[i], values[i]));
    //         }
    //     }
    //     return refineMaterials;
    // }
    // private static GetWay GetGetWay(int itemId)
    // {
@@ -1687,211 +1571,6 @@
    //     return getWay;
    // }
    // private static List<ItemOperateType> GetOperates(int itemId, int itemCount = 0)
    // {
    //     var config = ItemConfig.Get(itemId);
    //     var operates = new List<ItemOperateType>();
    //     var lsItemID = 150;
    //     if (config.CanSell == 1 && itemId != lsItemID)
    //     {
    //         operates.Add(ItemOperateType.sell);
    //     }
    //     // if (itemCount > 1 && itemId != lsItemID)
    //     // {
    //     //     operates.Add(ItemOperateType.split);
    //     // }
    //     if (config.UseTag == 1)
    //     {
    //         if (itemId != lsItemID)
    //             operates.Add(ItemOperateType.makeUse);
    //         else
    //             operates.Add(ItemOperateType.lsExchange);
    //     }
    //     if (config.Type == 25 || config.Effect1 == 225)
    //     {
    //         operates.Add(ItemOperateType.inlay);
    //     }
    //     if (!config.JumpComposeCondi.IsNullOrEmpty())
    //     {
    //         var jumpId = 0;
    //         if (composeModel.CheckComposeItemById(itemId, out jumpId))
    //         {
    //             operates.Add(ItemOperateType.compose);
    //         }
    //     }
    //     return operates;
    // }
    // private static List<ItemOperateType> GetOperates(string guid)
    // {
    //     var item = packModel.GetItemByGuid(guid);
    //     if (item == null)
    //     {
    //         return null;
    //     }
    //     var operates = new List<ItemOperateType>();
    //     var packType = item.packType;
    //     if (WindowCenter.Instance.IsOpen("DepotWin"))
    //     {
    //         switch (packType)
    //         {
    //             case PackType.Warehouse:
    //                 operates.Add(ItemOperateType.putOut);
    //                 break;
    //             default:
    //                 operates.Add(ItemOperateType.putIn);
    //                 break;
    //         }
    //         return operates;
    //     }
    //     if (packType == PackType.Equip)
    //     {
    //         if (WindowCenter.Instance.IsOpen("RealmEquipWin"))
    //         {
    //             operates.Add(ItemOperateType.putOff);
    //             if (FuncOpen.Instance.IsFuncOpen(1))
    //             {
    //                 operates.Add(ItemOperateType.strength);
    //             }
    //             if (FuncOpen.Instance.IsFuncOpen(172))
    //             {
    //                 operates.Add(ItemOperateType.star);
    //             }
    //             if (FuncOpen.Instance.IsFuncOpen(2))
    //             {
    //                 operates.Add(ItemOperateType.inlay);
    //             }
    //             if (FuncOpen.Instance.IsFuncOpen(91))
    //             {
    //                 int limitLevel = 0;
    //                 if (equipModel.EquipLevelFuncID != null)
    //                     limitLevel = equipModel.EquipLevelFuncID[91];
    //                 if (item.config.LV >= limitLevel)
    //                     operates.Add(ItemOperateType.train);
    //             }
    //             if (EquipEvolveModel.Instance.IsShowEvolveBtn(item.itemId))
    //             {
    //                 operates.Add(ItemOperateType.default1);
    //             }
    //             return operates;
    //         }
    //         if (ItemLogicUtility.Instance.IsRealmEquip(item.itemId) && WindowCenter.Instance.IsOpen("RoleEquipWin"))
    //         {
    //             operates.Add(ItemOperateType.putOff);
    //             return operates;
    //         }
    //         if (ItemLogicUtility.Instance.IsSpiritWeapon(item.itemId) && WindowCenter.Instance.IsOpen("SpiritEquipBagWin"))
    //         {
    //             operates.Add(ItemOperateType.putOff);
    //             return operates;
    //         }
    //     }
    //     if (packType == PackType.Warehouse)
    //     {
    //         operates.Add(ItemOperateType.putOut);
    //         return operates;
    //     }
    //     if (item.isAuction)
    //     {
    //         operates.Add(ItemOperateType.putAway);
    //     }
    //     var isEquip = ItemLogicUtility.Instance.IsRealmEquip(item.itemId);
    //     var isSpiritWeapon = ItemLogicUtility.Instance.IsSpiritWeapon(item.itemId);
    //     if (isEquip || isSpiritWeapon)
    //     {
    //         var isOverdue = ItemLogicUtility.Instance.IsOverdue(guid);
    //         if (item.config.CanSell == 1)
    //         {
    //             operates.Add(ItemOperateType.sell);
    //         }
    //         if (item.config.ExpireTime > 0 && isOverdue && itemOverdueModel.CanRenewal(item.itemId))
    //         {
    //             operates.Add(ItemOperateType.renewal);
    //         }
    //         if (!isOverdue)
    //         {
    //             if (ItemLogicUtility.Instance.IsJobCompatibleItem(item.itemId))
    //             {
    //                 if (isEquip)
    //                 {
    //                     operates.Add(ItemOperateType.putOn);
    //                     if (!item.config.JumpComposeCondi.IsNullOrEmpty())
    //                     {
    //                         var jumpId = 0;
    //                         if (composeModel.CheckComposeItemById(item.itemId, out jumpId))
    //                         {
    //                             operates.Add(ItemOperateType.compose);
    //                         }
    //                     }
    //                 }
    //                 if (isSpiritWeapon)
    //                 {
    //                     if (WindowCenter.Instance.IsOpen<RoleEquipWin>())
    //                     {
    //                         operates.Add(ItemOperateType.putOn);
    //                     }
    //                     else if (WindowCenter.Instance.IsOpen<MainInterfaceWin>() || WindowCenter.Instance.IsOpen("SpiritEquipBagWin"))
    //                     {
    //                         operates.Add(ItemOperateType.putOn);
    //                     }
    //                 }
    //             }
    //             //else
    //             //{
    //             //    if (item.config.ItemColor > 3)
    //             //    {
    //             //        operates.Add(ItemOperateType.exchange);
    //             //    }
    //             //}
    //         }
    //         return operates;
    //     }
    //     if (ItemLogicUtility.Instance.IsDogzEquip(item.itemId))
    //     {
    //         if (packType == PackType.DogzItem)
    //         {
    //             if (item.config.ItemColor > 2 && item.config.ItemColor < 6)
    //             {
    //                 operates.Add(ItemOperateType.compose);
    //             }
    //             operates.Add(ItemOperateType.putOn);
    //         }
    //         else if (packType == PackType.DogzEquip)
    //         {
    //             operates.Add(ItemOperateType.putOff);
    //         }
    //         return operates;
    //     }
    //     operates.AddRange(GetOperates(item.itemId, item.count));
    //     return operates;
    // }
    
@@ -1939,15 +1618,16 @@
    private static TipType GetTipType(int itemId)
    {
        if (GeneralDefine.chestDisplayItems.Contains(itemId))
        var boxType = ChestsAwardConfig.GetBoxType(itemId);
        if (boxType == 1)
        {
            return TipType.PeerlessChest;
            return TipType.BoxItem;
        }
        else if (boxType == 2)
        {
            return TipType.BoxChooseItem;
        }
        // if (ChestsAwardConfig.IsBox(itemId))
        // {
        //     return TipType.BoxItem;
        // }
        var config = ItemConfig.Get(itemId);
        switch (config.Type)
@@ -1965,18 +1645,23 @@
            case 111:
            case 112:
                return TipType.Equip;
            case 26:
            case 41:
            case 42:
                return TipType.PetMount;
            // case 26:
            // case 41:
            // case 42:
            //     return TipType.PetMount;
            case 147:
                return TipType.TreasurePavilion;
            default:
                return TipType.Item;
        }
    }
    [System.Diagnostics.Conditional("UNITY_EDITOR")]
    private static void PrintItemBrief(int itemId)
    {
Main/System/KnapSack/BackpackData.cs
@@ -9,24 +9,22 @@
    public struct Item
    {
        public int id;
        public int count;       //兼容旧代码保留
        public ulong countEx;   //兼容旧代码count,当数量超过了32位无法表示时使用
    public ulong countEx;
        public int quality;
        public int bind;
    public int bind;    //绑定 或者 拍卖 交易
        public Item(int _id, ulong _count)
        {
            this.id = _id;
            this.count = (int)_count;
            this.quality = 0;
            this.bind = 0;
            this.countEx = _count;
        }
        public Item(int _id, ulong _count, int _quality)
        {
            this.id = _id;
            this.count = (int)_count;
            this.quality = _quality;
            this.bind = 0;
            this.countEx = _count;
@@ -35,40 +33,10 @@
        public Item(int _id, ulong _count, int _bind = 0, int _quality = 0)
        {
            this.id = _id;
            this.count = (int)_count;
            this.quality = _quality;
            this.bind = _bind;
            this.countEx = _count;
        }
        #region 旧代码兼容 显示无法超过32位
        public Item(int _id, int _count)
        {
            this.id = _id;
            this.count = _count;
            this.quality = 0;
            this.bind = 0;
            this.countEx = (ulong)_count;
        }
        public Item(int _id, int _count, int _quality)
        {
            this.id = _id;
            this.count = _count;
            this.quality = _quality;
            this.bind = 0;
            this.countEx = (ulong)_count;
        }
        public Item(int _id, int _count, int _bind = 0, int _quality = 0)
        {
            this.id = _id;
            this.count = _count;
            this.quality = _quality;
            this.bind = _bind;
            this.countEx = (ulong)_count;
        }
        #endregion
    }
Main/System/KnapSack/Logic/CommonGetItemCell.cs
@@ -1,25 +1,17 @@
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
    public class CommonGetItemCell : CellView
    {
        [SerializeField] List<CommonGetItem> commonGetItems = new List<CommonGetItem>();
        [SerializeField] HorizontalLayoutGroup horizontalLayout;
        public void Display(int rowIndex)
    public void Display(int index, List<Item> showItems)
        {
            var dict = ItemLogicUtility.Instance.totalShowItems;
            var list = dict.Keys.ToList();
            int rowCount = (int)Mathf.Ceil((float)list.Count / 5);
            horizontalLayout.childAlignment= rowCount > 1?TextAnchor.MiddleLeft: TextAnchor.MiddleCenter;
            for (int i = 0; i < commonGetItems.Count; i++)
            {
                int index = rowIndex * 5 + i;
                if (index < list.Count)
            if (index + i < showItems.Count)
                {
                    int itemId = list[index];
                int itemId = showItems[index + i].id;
                    commonGetItems[i].Display(itemId);
                    commonGetItems[i].SetActive(true);
                }
Main/System/KnapSack/Logic/CommonGetItemWin.cs
@@ -1,4 +1,5 @@
using System.Linq;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
@@ -6,38 +7,13 @@
    public class CommonGetItemWin : UIBase
    {
        [SerializeField] ScrollerController scroller;
        [SerializeField] RichText desc;
        [SerializeField] Button sureBtn;
        [SerializeField] Text sureText;
        [SerializeField] TextEx closeText;
        float openTime;
        protected override void InitComponent()
        {
            base.InitComponent();
            Debug.Log("初始化通用获得物品窗口");
            sureBtn.SetListener(() => UIManager.Instance.CloseWindow<CommonGetItemWin>());
        }
        public override void Refresh()
        {
            base.Refresh();
            Debug.Log("刷新通用获得物品窗口");
        }
        protected override void OnPreOpen()
        {
            Refresh();
            ItemLogicUtility.Instance.OnGetItemShowEvent += OnGetItemShowEvent;
            scroller.OnRefreshCell += OnRefreshCell;
            desc.SetActive(!string.IsNullOrEmpty(ItemLogicUtility.Instance.getItemInfo));
            desc.text = ItemLogicUtility.Instance.getItemInfo;
            sureText.text = ItemLogicUtility.Instance.getItemBtnText;
            CreateScroller();
            closeText.text = Language.Get("L2004");
            openTime = Time.time;
        }
@@ -45,21 +21,31 @@
        {
            ItemLogicUtility.Instance.OnGetItemShowEvent -= OnGetItemShowEvent;
            scroller.OnRefreshCell -= OnRefreshCell;
            ItemLogicUtility.Instance.OnGetItem?.Invoke();
            ItemLogicUtility.Instance.ClearGetItem();
        }
    List<Item> showItems = new List<Item>();
        void CreateScroller()
        {
            scroller.Refresh();
            var keys = ItemLogicUtility.Instance.totalShowItems.Keys.ToList();
            int rowCount = (int)Mathf.Ceil((float)keys.Count / 5);
            for (int i = 0; i < rowCount; i++)
        showItems = ItemLogicUtility.Instance.totalShowItems.Values.ToList();
        showItems.Sort(SortItem);
        for (int i = 0; i < showItems.Count; i++)
        {
            if (i % 5 == 0)
            {
                scroller.AddCell(ScrollerDataType.Header, i);
            }
        }
            scroller.Restart();
    }
    int SortItem(Item itemA, Item itemB)
    {
        var itemConfigA = ItemConfig.Get(itemA.id);
        var itemConfigB = ItemConfig.Get(itemB.id);
        return itemConfigB.ItemColor - itemConfigA.ItemColor;
        }
        float needRefreshTime;  //避免封包过多卡顿
@@ -91,21 +77,11 @@
        protected void LateUpdate()
        {
            RefreshScroller();
            if (ItemLogicUtility.Instance.closeSeconds == 0)
                return;
            float closeTime = ItemLogicUtility.Instance.closeSeconds - (Time.time - openTime);
            if (closeTime <= 0)
            {
                UIManager.Instance.CloseWindow<CommonGetItemWin>();
                return;
            }
            closeText.text = Language.Get("AutoCloseAfterSeconds", (int)closeTime);
        }
        void OnRefreshCell(ScrollerDataType type, CellView cell)
        {
            var _cell = cell as CommonGetItemCell;
            _cell?.Display(cell.index);
        _cell?.Display(cell.index, showItems);
        }
    }
Main/System/KnapSack/Logic/ItemLogicUtility.cs
@@ -1272,7 +1272,7 @@
    // 通用显示获得的物品
    public void ShowGetItem(List<Item> items, string info = "", int seconds = 3, string btnName = "", Action func = null, bool isNameShow = true, string eventName = "default")
    public void ShowGetItem(List<Item> items, string eventName = "default", bool isNameShow = true)
    {
        if (getItemEventName != eventName)
        {
@@ -1300,12 +1300,6 @@
        }
        getItemInfo = info;
        OnGetItem = func;
        if (btnName == "")
            btnName = Language.Get("PopConfirmWin_OK");
        getItemBtnText = btnName;
        closeSeconds = seconds;
        this.isNameShow = isNameShow;
        OnGetItemShowEvent?.Invoke();
        if (!UIManager.Instance.IsOpenedInList<CommonGetItemWin>())
@@ -1363,5 +1357,117 @@
        getItemEventName = "";
    }
    public void UseItem(string guid, int useCnt = 1, int extra = 0)
    {
        var item = packModel.GetItemByGuid(guid);
        if (item == null)
        {
            return;
        }
        var error = 0;
        if (CanUseItem(guid, useCnt, out error))
        {
            UseItemSendServer(guid, useCnt, extra);
        }
        else
        {
            switch (error)
            {
                case 1:
                    SysNotifyMgr.Instance.ShowTip("EverydayUseLimit");
                    break;
                case 2:
                    SysNotifyMgr.Instance.ShowTip("UseCntLimit");
                    break;
                case 3:
                    SysNotifyMgr.Instance.ShowTip("GeRen_chenxin_749572");
                    break;
                default:
                    break;
            }
        }
    }
    public bool CanUseItem(string guid, int useCnt, out int error)
    {
        var item = packModel.GetItemByGuid(guid);
        if (item == null)
        {
            error = 999;
            return false;
        }
        if (item.config.Type == 145 && item.config.CDTime > 0)
        {
            var createTime = item.GetUseDataFirstValue((int)ItemUseDataKey.createTime);
            if (createTime > 0)
            {
                DateTime useTime;
                if (item.config.CDTypeEx == 1)
                {
                    //itemConfig.CDTime 为天,过0点可用
                    useTime = TimeUtility.GetTime((uint)createTime).AddDays(item.config.CDTime);
                    useTime = TimeUtility.GetDayStartTime(useTime.Year, useTime.Month, useTime.Day);
                }
                else
                {
                    useTime = TimeUtility.GetTime((uint)createTime).AddSeconds(item.config.CDTime);
                }
                if (TimeUtility.ServerNow < useTime)
                {
                    error = 3;
                    return false;
                }
            }
        }
        var usedCountToday = packModel.GetItemUsedTimesToday(item.itemId);
        if (item.config.MaxSkillCnt > 0 && item.config.MaxSkillCnt <= usedCountToday)
        {
            error = 1;
            return false;
        }
        //var usedCountTotal = packModel.GetItemTotalUsedTimes(item.itemId);
        // var fruitConfig = AttrFruitConfig.Get(item.itemId);
        // if (fruitConfig != null)
        // {
        //     var limitTimes = 0;
        //     if (fruitConfig.FuncID == 2)
        //     {
        //         limitTimes = alchemyModel.GetAlchemyDrugUseLimit(item.itemId);
        //     }
        //     else
        //     {
        //         limitTimes = fruitConfig.basicUseLimit;
        //     }
        //     if (usedCountTotal >= limitTimes || useCnt > limitTimes)
        //     {
        //         error = 1;
        //         return false;
        //     }
        // }
        error = 0;
        return true;
    }
    void UseItemSendServer(string guid, int useCnt, int extra)
    {
        var itemModel = packModel.GetItemByGuid(guid);
        if (itemModel == null)
        {
            return;
        }
        var useItem = new CA323_tagCMUseItems();
        useItem.ItemIndex = (byte)itemModel.gridIndex;
        useItem.UseCnt = (ushort)useCnt;
        useItem.ExData = (uint)extra;
        GameNetSystem.Instance.SendInfo(useItem); //使用物品
    }
    
}
Main/System/KnapSack/Logic/PackGirdCell.cs
@@ -13,7 +13,19 @@
        var guid = PackManager.Instance.GetSinglePack(PackType.Item).itemGuidList[index];
        if (string.IsNullOrEmpty(guid))
            return;
        itemCell.Init(PackManager.Instance.GetItemByGuid(guid));
        var item = PackManager.Instance.GetItemByGuid(guid);
        ulong count = 0;
        if (GeneralDefine.itemMoneyCountDict.ContainsKey(item.itemId))
        {
            //展示货币数量的物品
            count = UIHelper.GetMoneyCnt(GeneralDefine.itemMoneyCountDict[item.itemId]);
        }
        else
        {
            count = (ulong)item.count;
        }
        itemCell.Init(new ItemCellModel(item.itemId, false, count));
        itemCell.button.AddListener(()=>
        {
            ItemTipUtility.Show(guid);
Main/System/KnapSack/New/CommonItemBaisc.cs
@@ -220,7 +220,7 @@
        if (packModel.textCountShow.ContainsKey(itemId))
        {
            countText.SetActive(true);
            countText.text = count > 1 ? packModel.textCountShow[itemId] + "x" + count : packModel.textCountShow[itemId];
            countText.text = count > 0 ? packModel.textCountShow[itemId] + "x" + count : packModel.textCountShow[itemId];
        }
        else if (packModel.gameCashShow.Contains(itemId))
        {
@@ -235,8 +235,8 @@
        }
        else
        {
            countText.SetActive(count > 1);
            if (count > 1)
            countText.SetActive(count > 0);
            if (count > 0)
            {
                countText.text = UIHelper.ReplaceLargeNum((double)count);
            }
Main/System/KnapSack/PackManager.cs
@@ -26,7 +26,7 @@
    //AlchemyModel alchemyModel { get { return ModelCenter.Instance.GetModel<AlchemyModel>(); } }
    //ItemTipsModel itemTipsModel { get { return ModelCenter.Instance.GetModel<ItemTipsModel>(); } }
    List<string> commonShowAwardEvents = new List<string>();
    public int[] autoUseItemIDs;
    public override void Init()
@@ -480,10 +480,9 @@
    #region 玩家装备特殊逻辑
    void ParseConfig()
    {
        var config = FuncConfigConfig.Get("CommonShowAwards");
        commonShowAwardEvents = JsonMapper.ToObject<List<string>>(config.Numerical1);
        config= FuncConfigConfig.Get("InitBagCellCount");
        var config= FuncConfigConfig.Get("InitBagCellCount");
        initBagGridCount = int.Parse(config.Numerical1);
        PackInitCountDict = ConfigParse.ParseIntDict(config.Numerical2);
@@ -786,17 +785,17 @@
    {
        int useCnt = 0;
        List<int> shareIdlist = null;
        bool isShare = TryGetShareNumItem(itemId, out shareIdlist);
        if (isShare)
        {
            foreach (var id in shareIdlist)
            {
                int singleUseCnt = 0;
                itemDayUseCntDict.TryGetValue(id, out singleUseCnt);
                useCnt += singleUseCnt;
            }
        }
        else
        // bool isShare = TryGetShareNumItem(itemId, out shareIdlist);
        // if (isShare)
        // {
        //     foreach (var id in shareIdlist)
        //     {
        //         int singleUseCnt = 0;
        //         itemDayUseCntDict.TryGetValue(id, out singleUseCnt);
        //         useCnt += singleUseCnt;
        //     }
        // }
        // else
        {
            itemDayUseCntDict.TryGetValue(itemId, out useCnt);
        }
@@ -972,28 +971,28 @@
    #endregion
    #region 判断物品是否达到使用上限
    // public bool IsReachUseLimit(string guid, out ulong count)
    // {
    //     count = 0;
    //     ItemModel itemModel = GetItemByGuid(guid);
    //     if (itemModel == null) return false;
    public bool IsReachUseLimit(string guid, out ulong count)
    {
        count = 0;
        ItemModel itemModel = GetItemByGuid(guid);
        if (itemModel == null) return false;
    //     AttrFruitConfig fruitConfig = AttrFruitConfig.Get(itemModel.itemId);
    //     int haveUseCnt = GetItemUsedTimesToday(itemModel.itemId);
    //     int sumHaveUseCnt = GetItemTotalUsedTimes(itemModel.itemId);
    //     count = (ulong)itemModel.count;
    //     bool isReach = false;
    //     int remainDayCnt = 0;
    //     if (itemModel.config.MaxSkillCnt > 0)
    //     {
    //         remainDayCnt = itemModel.config.MaxSkillCnt - haveUseCnt;
    //         if (itemModel.count > remainDayCnt)
    //         {
    //             count = (ulong)remainDayCnt;
    //         }
    //     }
        int haveUseCnt = GetItemUsedTimesToday(itemModel.itemId);
        int sumHaveUseCnt = GetItemTotalUsedTimes(itemModel.itemId);
        count = (ulong)itemModel.count;
        bool isReach = false;
        int remainDayCnt = 0;
        if (itemModel.config.MaxSkillCnt > 0)
        {
            remainDayCnt = itemModel.config.MaxSkillCnt - haveUseCnt;
            if (itemModel.count > remainDayCnt)
            {
                count = (ulong)remainDayCnt;
            }
        }
    //     int remainSumCnt = 0;
        int remainSumCnt = 0;
    //     if (fruitConfig != null)
    //     {
    //         remainSumCnt = fruitConfig.basicUseLimit - sumHaveUseCnt;
@@ -1003,13 +1002,13 @@
    //         }
    //     }
    //     if (count < (ulong)itemModel.count)
    //     {
    //         isReach = true;
    //     }
        if (count < (ulong)itemModel.count)
        {
            isReach = true;
        }
    //     return isReach;
    // }
        return isReach;
    }
    #endregion
    
@@ -1028,60 +1027,4 @@
    }
    public void ReceiveAwardNotify(HA801_tagMCGiveAwardInfo netPack)
    {
        var eventName = UIHelper.ServerStringTrim(netPack.EventName);
        if (eventName == "BuyItem")
            return;
        // 仙盟攻城战
        // if (eventName == "FamilyGCZSQGrid" || eventName == "FamilyGCZSQPass" || eventName == "FamilyGCZSQPassAll" ||
        //     eventName == "FamilyGCZContiribution" || eventName == "FamilyGCZAtk")
        // {
        //     ModelCenter.Instance.GetModel<FairySiegeActModel>()?.OnUpdateAwardInfoAction(netPack);
        //     return;
        // }
        if (!commonShowAwardEvents.Contains(eventName))
            return;
        List<Item> showItems = new List<Item>();
        if (netPack.Exp != 0 || netPack.ExpPoint != 0)
        {
            ulong expValue = netPack.Exp + netPack.ExpPoint * (ulong)Constants.ExpPointValue;
            showItems.Add(new Item(GeneralDefine.expDisplayId, expValue));
        }
        if (netPack.MoneyList.Length != 0)
        {
            for (int i = 0; i < netPack.MoneyLen; i++)
            {
                var moneyType = netPack.MoneyList[i].MoneyType;
                if (GeneralDefine.moneyDisplayIds.ContainsKey(moneyType) && netPack.MoneyList[i].MoneyValue != 0)
                {
                    showItems.Add(new Item(GeneralDefine.moneyDisplayIds[moneyType], netPack.MoneyList[i].MoneyValue));
                }
            }
        }
        if (netPack.ItemList.Length != 0)
        {
            for (int i = 0; i < netPack.ItemLen; i++)
            {
                showItems.Add(new Item((int)netPack.ItemList[i].ItemID, netPack.ItemList[i].Count, netPack.ItemList[i].IsBind));
            }
        }
        string info = string.Empty;
        if (LanguageConfig.HasKey("commonShowAwardEvents_" + eventName))
            info = Language.Get("commonShowAwardEvents_" + eventName);
        if (showItems.Count == 0)
            return;
        ItemLogicUtility.Instance.ShowGetItem(showItems, info, 0, eventName: eventName);
    }
}
Main/System/Recharge/DailySpecialsModel.cs
@@ -55,7 +55,7 @@
            List<Item> itemList = new List<Item>();
            for (int j = 0; j < giftInfoDict[giftInfokeyList[i]].Count; j++)
            {
                Item item = new Item(giftInfoDict[giftInfokeyList[i]][j][0], giftInfoDict[giftInfokeyList[i]][j][1]);
                Item item = new Item(giftInfoDict[giftInfokeyList[i]][j][0], (ulong)giftInfoDict[giftInfokeyList[i]][j][1]);
                itemList.Add(item);
            }
            itemAllList.Add(itemList);
Main/System/Recharge/RechargeManager.cs
@@ -204,7 +204,7 @@
                        m_RechargeGainItemDict.Add(configs[i].CTGID, _itemList);
                        for (int k = 0; k < _itemArray.Length; k++)
                        {
                            Item _item = new Item(_itemArray[k][0], _itemArray[k][1]);
                            Item _item = new Item(_itemArray[k][0], (ulong)_itemArray[k][1]);
                            _itemList.Add(_item);
                        }
                    }
@@ -262,7 +262,7 @@
                for (int i = 0; i < _itemJson[jobstr].Count; i++)
                {
                    m_FirstChargeItemDict[day][job].Add(new Item(int.Parse(_itemJson[jobstr][i][0].ToString()),
                        int.Parse(_itemJson[jobstr][i][1].ToString())));
                        ulong.Parse(_itemJson[jobstr][i][1].ToString())));
                }
            }
@@ -274,7 +274,7 @@
            var _itemCommon = JsonMapper.ToObject<int[][]>(config.CommItemList);
            for (int i = 0; i < _itemCommon.Length; i++)
            {
                m_FirstChargeCommonItemDict[day].Add(new Item(_itemCommon[i][0], _itemCommon[i][1]));
                m_FirstChargeCommonItemDict[day].Add(new Item(_itemCommon[i][0], (ulong)_itemCommon[i][1]));
            }
Main/System/Store/StoreModel.cs
@@ -911,7 +911,7 @@
    public void OnClickShopCell(StoreConfig shopInfo)
    {
        int itemId = GetReplaceId(shopInfo.ID, shopInfo.ItemID);
        ItemTipUtility.ShowGood(shopInfo.ID, itemId);
        ItemTipUtility.Show(itemId);
    }
    public int BuyCnt { get; private set; }
Main/System/Tip/ItemsConfirmCell.cs
@@ -9,7 +9,7 @@
    public void Display(int index)
    {
        int itemID = ConfirmCancel.getItems[index].id;
        itemCell.Init(new ItemCellModel(itemID, false, (ulong)ConfirmCancel.getItems[index].count));
        itemCell.Init(new ItemCellModel(itemID, false, (ulong)ConfirmCancel.getItems[index].countEx));
        itemCell.button.SetListener(() =>
        {
            ItemTipUtility.Show(itemID);
Main/Utility/MaterialUtility.cs
@@ -7,7 +7,7 @@
    public static Material GetDefaultSpriteGrayMaterial()
    {
        return ResManager.Instance.LoadAsset<Material>("Materials", "SpriteGray");
        return ResManager.Instance.LoadAsset<Material>("BuiltIn/Materials", "SpriteGray");
    }
    public static Material GetInstantiatedSpriteGrayMaterial()
@@ -18,12 +18,12 @@
    public static Material GetSmoothMaskGrayMaterial()
    {
        return ResManager.Instance.LoadAsset<Material>("Materials", "SmoothMaskGray");
        return ResManager.Instance.LoadAsset<Material>("BuiltIn/Materials", "SmoothMaskGray");
    }
    public static Material GetInstantiatedSpriteTwinkleMaterial()
    {
        var material = ResManager.Instance.LoadAsset<Material>("Materials", "Flash");
        var material = ResManager.Instance.LoadAsset<Material>("BuiltIn/Materials", "Flash");
        return new Material(material);
    }
@@ -34,7 +34,7 @@
    public static Material GetGUIRenderTextureMaterial()
    {
        return ResManager.Instance.LoadAsset<Material>("Materials", "UI_RenderTexture");
        return ResManager.Instance.LoadAsset<Material>("BuiltIn/Materials", "UI_RenderTexture");
    }
    public static void SetRenderSortingOrder(this GameObject root, int sortingOrder, bool includeChildren)