From cad87129e5ea2fd23cc195ed0444bd38f1117aa7 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期二, 05 八月 2025 15:51:54 +0800
Subject: [PATCH] 79 【常规】背包 - 随机宝箱界面,自选宝箱界面,获得物品奖励界面

---
 Main/System/KnapSack/Logic/CommonGetItemCell.cs                                    |   36 
 Main/Config/Configs/ChestsAwardConfig.cs                                           |    2 
 Main/Config/PartialConfigs/ChestsAwardConfig.cs                                    |   78 +
 Main/System/ItemTip/ChooseItemsWin.cs                                              |  109 ++
 Main/System/ItemTip/BoxItemCell.cs.meta                                            |    5 
 Main/System/ItemTip/BoxItemLineCell.cs.meta                                        |    5 
 Main/System/KnapSack/Logic/ItemLogicUtility.cs                                     |  122 ++
 Main/System/KnapSack/Logic/CommonGetItemWin.cs                                     |  174 +--
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA801_tagMCGiveAwardInfo.cs |    2 
 Main/System/ItemTip/ChooseItemsCell.cs                                             |   79 +
 Main/System/GeneralConfig/GeneralDefine.cs                                         |   39 
 Main/System/ItemTip/BoxItemLineCell.cs                                             |   25 
 Main/System/KnapSack/New/CommonItemBaisc.cs                                        |    6 
 Main/Component/UI/Common/ButtonClickInterval.cs                                    |   40 
 Main/Component/UI/Common/LongPressButton.cs                                        |  150 +-
 Main/Main.cs                                                                       |    1 
 Main/System/ItemTip/BoxItemCell.cs                                                 |   20 
 Main/System/ItemTip/BoxGetItemModel.cs.meta                                        |    5 
 Main/System/ItemTip/BoxItemWin.cs.meta                                             |    5 
 Main/System/Recharge/DailySpecialsModel.cs                                         |    2 
 Main/System/Store/StoreModel.cs                                                    |    2 
 Main/Config/ConfigParse.cs                                                         |   29 
 Main/System/KnapSack/Logic/PackGirdCell.cs                                         |   14 
 Main/Component/UI/Common/SliderPanel.cs                                            |   99 ++
 Main/System/KnapSack/PackManager.cs                                                |  153 +--
 Main/Utility/MaterialUtility.cs                                                    |    8 
 Main/Config/Configs/ChestsConfig.cs                                                |    2 
 Main/Manager/UIManager.cs                                                          |    9 
 Main/Core/NetworkPackage/ClientPack/CA3_Item/CA323_tagCMUseItems.cs                |    4 
 Main/System/KnapSack/BackpackData.cs                                               |   92 -
 Main/System/ItemTip/BoxGetItemModel.cs                                             |  538 ++++++++++++
 Main/System/ItemTip/ItemTipUtility.cs                                              |  511 ++---------
 Main/System/ItemTip/ChooseItemsWin.cs.meta                                         |    5 
 Main/System/Tip/ItemsConfirmCell.cs                                                |    2 
 /dev/null                                                                          |   56 -
 Main/System/Recharge/RechargeManager.cs                                            |    6 
 Main/System/ItemTip/ChooseItemsCell.cs.meta                                        |    5 
 Main/Config/PartialConfigs/ChestsAwardConfig.cs.meta                               |    5 
 Main/System/CustomizedGift/CustomizedRechargeModel.cs                              |    4 
 Main/System/ItemTip/BoxItemWin.cs                                                  |  118 ++
 Main/Component/UI/Common/SliderPanel.cs.meta                                       |    5 
 41 files changed, 1,649 insertions(+), 923 deletions(-)

diff --git a/Main/Component/UI/Common/ButtonClickInterval.cs b/Main/Component/UI/Common/ButtonClickInterval.cs
index f4eb65a..4b44d99 100644
--- a/Main/Component/UI/Common/ButtonClickInterval.cs
+++ b/Main/Component/UI/Common/ButtonClickInterval.cs
@@ -4,25 +4,25 @@
 using System.Collections;
 
     
-    public class ButtonClickInterval : MonoBehaviour
+public class ButtonClickInterval : MonoBehaviour
+{
+    [SerializeField] float interval = 1f;
+    [SerializeField] Button targetBtn;
+
+    private void Awake()
     {
-        [SerializeField] float interval = 1f;
-        [SerializeField] Button targetBtn;
-
-        private void Awake()
-        {
-            targetBtn.AddListener(OnClick);
-        }
-
-        private void OnClick()
-        {
-            targetBtn.enabled = false;
-            StartCoroutine(DelayClick());
-        }
-
-        IEnumerator DelayClick()
-        {
-            yield return new WaitForSeconds(interval);
-            targetBtn.enabled = true;
-        }
+        targetBtn.AddListener(OnClick);
     }
+
+    private void OnClick()
+    {
+        targetBtn.enabled = false;
+        StartCoroutine(DelayClick());
+    }
+
+    IEnumerator DelayClick()
+    {
+        yield return new WaitForSeconds(interval);
+        targetBtn.enabled = true;
+    }
+}
diff --git a/Main/Component/UI/Common/LongPressButton.cs b/Main/Component/UI/Common/LongPressButton.cs
index b84d4ce..3cb9cf1 100644
--- a/Main/Component/UI/Common/LongPressButton.cs
+++ b/Main/Component/UI/Common/LongPressButton.cs
@@ -6,93 +6,95 @@
 using UnityEngine.Serialization;
 using UnityEngine.UI;
 
-    public class LongPressButton : ButtonEx
+public class LongPressButton : ButtonEx
+{
+    public class ButtonPressEvent : UnityEvent { }
+
+    //闀挎寜鐩戝惉
+    [FormerlySerializedAs("onPress")]
+    [SerializeField]
+    private ButtonPressEvent m_OnPress = new ButtonPressEvent();
+    public ButtonPressEvent onPress
     {
-        public class ButtonPressEvent : UnityEvent { }
+        get { return m_OnPress; }
+        set { m_OnPress = value; }
+    }
 
-        [FormerlySerializedAs("onPress")]
-        [SerializeField]
-        private ButtonPressEvent m_OnPress = new ButtonPressEvent();
-        public ButtonPressEvent onPress
+    [SerializeField]
+    float m_LongPressCheckTime = 0.3f;
+    public float longPressCheckTime
+    {
+        get { return m_LongPressCheckTime; }
+        set { m_LongPressCheckTime = value; }
+    }
+    [SerializeField]
+    float m_LongPressIntervalTime = 0.1f;
+    public float longPressIntervalTime
+    {
+        get { return m_LongPressIntervalTime; }
+        set { m_LongPressIntervalTime = value; }
+    }
+
+    float m_PressTime = 0.0f;
+    float m_PressIntervalTime = 0.0f;
+    bool m_LongPress = false;
+    bool m_IsButtonDown = false;
+
+    public override void OnPointerClick(PointerEventData eventData)
+    {
+        if (m_LongPress)
         {
-            get { return m_OnPress; }
-            set { m_OnPress = value; }
+            m_LongPress = false;
+            return;
         }
+        base.OnPointerClick(eventData);
+    }
 
-        [SerializeField]
-        float m_LongPressCheckTime = 0.5f;
-        public float longPressCheckTime
-        {
-            get { return m_LongPressCheckTime; }
-            set { m_LongPressCheckTime = value; }
-        }
-        [SerializeField]
-        float m_LongPressIntervalTime = 0.1f;
-        public float longPressIntervalTime
-        {
-            get { return m_LongPressIntervalTime; }
-            set { m_LongPressIntervalTime = value; }
-        }
+    public override void OnPointerDown(PointerEventData eventData)
+    {
+        base.OnPointerDown(eventData);
+        m_PressTime = 0.0f;
+        m_PressIntervalTime = 0.0f;
+        m_IsButtonDown = true;
+    }
 
-        float m_PressTime = 0.0f;
-        float m_PressIntervalTime = 0.0f;
-        bool m_LongPress = false;
-        bool m_IsButtonDown = false;
+    public override void OnPointerUp(PointerEventData eventData)
+    {
+        base.OnPointerUp(eventData);
+        m_IsButtonDown = false;
+    }
 
-        public override void OnPointerClick(PointerEventData eventData)
+    public override void OnPointerExit(PointerEventData eventData)
+    {
+        base.OnPointerExit(eventData);
+        m_IsButtonDown = false;
+        m_LongPress = false;
+    }
+
+    private void Update()
+    {
+        if (m_IsButtonDown)
         {
-            if (m_LongPress)
+            m_PressTime += Time.deltaTime;
+            if (m_PressTime < m_LongPressCheckTime)
             {
-                m_LongPress = false;
                 return;
             }
-            base.OnPointerClick(eventData);
-        }
 
-        public override void OnPointerDown(PointerEventData eventData)
-        {
-            base.OnPointerDown(eventData);
-            m_PressTime = 0.0f;
-            m_PressIntervalTime = 0.0f;
-            m_IsButtonDown = true;
-        }
-
-        public override void OnPointerUp(PointerEventData eventData)
-        {
-            base.OnPointerUp(eventData);
-            m_IsButtonDown = false;
-        }
-
-        public override void OnPointerExit(PointerEventData eventData)
-        {
-            base.OnPointerExit(eventData);
-            m_IsButtonDown = false;
-            m_LongPress = false;
-        }
-
-        private void Update()
-        {
-            if (m_IsButtonDown)
+            if (m_PressIntervalTime >= m_LongPressIntervalTime)
             {
-                m_PressTime += Time.deltaTime;
-                if (m_PressTime < m_LongPressCheckTime)
-                {
-                    return;
-                }
-                if (m_PressIntervalTime >= m_LongPressIntervalTime)
-                {
-                    onPress.Invoke();
-                    m_PressIntervalTime = 0.0f;
-                }
-                m_PressIntervalTime += Time.deltaTime;
-                m_LongPress = true;
+                onPress.Invoke();
+                m_PressIntervalTime = 0.0f;
             }
+            m_PressIntervalTime += Time.deltaTime;
+            m_LongPress = true;
         }
+    }
 
-        protected override void OnEnable()
-        {
-            base.OnEnable();
-            m_LongPress = false;
-            m_IsButtonDown = false;
-        }
-    }
\ No newline at end of file
+    protected override void OnEnable()
+    {
+        base.OnEnable();
+        m_LongPress = false;
+        m_IsButtonDown = false;
+    }
+}
\ No newline at end of file
diff --git a/Main/Component/UI/Common/SliderPanel.cs b/Main/Component/UI/Common/SliderPanel.cs
new file mode 100644
index 0000000..761b58a
--- /dev/null
+++ b/Main/Component/UI/Common/SliderPanel.cs
@@ -0,0 +1,99 @@
+锘縰sing 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);
+    }
+
+}
diff --git a/Main/Component/UI/Core/DelayButton.cs.meta b/Main/Component/UI/Common/SliderPanel.cs.meta
similarity index 68%
copy from Main/Component/UI/Core/DelayButton.cs.meta
copy to Main/Component/UI/Common/SliderPanel.cs.meta
index 3596531..eab5a03 100644
--- a/Main/Component/UI/Core/DelayButton.cs.meta
+++ b/Main/Component/UI/Common/SliderPanel.cs.meta
@@ -1,8 +1,7 @@
 fileFormatVersion: 2
-guid: f91c143a16d59de4b80b2b0ffbb455e4
-timeCreated: 1501494723
-licenseType: Free
+guid: 3525ae0230fc77c439297c3fe45ed8d5
 MonoImporter:
+  externalObjects: {}
   serializedVersion: 2
   defaultReferences: []
   executionOrder: 0
diff --git a/Main/Component/UI/Core/DelayButton.cs b/Main/Component/UI/Core/DelayButton.cs
deleted file mode 100644
index 748b752..0000000
--- a/Main/Component/UI/Core/DelayButton.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-锘�//--------------------------------------------------------
-//    [Author]:           鐜╀釜娓告垙
-//    [  Date ]:           Monday, July 31, 2017
-//--------------------------------------------------------
-
-using UnityEngine;
-using System.Collections;
-using UnityEngine.EventSystems;
-using UnityEngine.UI;
-using System;
-
-    /// <summary>
-    /// 寤惰繜瑙﹀彂鐐瑰嚮浜嬩欢鐨勬寜閽紝鐢ㄤ簬闀挎寜浜嬩欢
-    /// </summary>
-    public class DelayButton:MonoBehaviour,IPointerDownHandler,IPointerUpHandler {
-
-        [SerializeField]
-        float m_Delay = 0.5f;
-        public float delay { get { return m_Delay; } }
-
-        [SerializeField]
-        Action m_OnClick;
-        public Action onClick { get { return m_OnClick; } }
-
-        float timer = 0f;
-        bool down = false;
-
-        public void OnPointerDown(PointerEventData eventData) {
-            timer = 0f;
-            down = true;
-        }
-
-        public void OnPointerUp(PointerEventData eventData) {
-            down = false;
-        }
-
-        private void OnEnable() {
-            timer = 0f;
-            down = false;
-        }
-
-        private void LateUpdate() {
-            if(down && timer < delay) {
-                timer += Time.deltaTime;
-                if(timer > delay) {
-                    if(onClick != null) {
-                        onClick?.Invoke();
-                    }
-                }
-            }
-        }
-
-    }
-
-
-
diff --git a/Main/Config/ConfigParse.cs b/Main/Config/ConfigParse.cs
index 355e980..8e2f2f8 100644
--- a/Main/Config/ConfigParse.cs
+++ b/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;
diff --git a/Main/Config/Configs/ChestsAwardConfig.cs b/Main/Config/Configs/ChestsAwardConfig.cs
index 7cd3637..e4d8118 100644
--- a/Main/Config/Configs/ChestsAwardConfig.cs
+++ b/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;
diff --git a/Main/Config/Configs/ChestsConfig.cs b/Main/Config/Configs/ChestsConfig.cs
index 82c7fad..a7d24d5 100644
--- a/Main/Config/Configs/ChestsConfig.cs
+++ b/Main/Config/Configs/ChestsConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           Monday, August 4, 2025
+//    [  Date ]:           2025骞�8鏈�5鏃�
 //--------------------------------------------------------
 
 using System.Collections.Generic;
diff --git a/Main/Config/PartialConfigs/ChestsAwardConfig.cs b/Main/Config/PartialConfigs/ChestsAwardConfig.cs
new file mode 100644
index 0000000..f9d7212
--- /dev/null
+++ b/Main/Config/PartialConfigs/ChestsAwardConfig.cs
@@ -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;
+    }
+}
+
+
+
+
+
diff --git a/Main/Component/UI/Core/DelayButton.cs.meta b/Main/Config/PartialConfigs/ChestsAwardConfig.cs.meta
similarity index 68%
copy from Main/Component/UI/Core/DelayButton.cs.meta
copy to Main/Config/PartialConfigs/ChestsAwardConfig.cs.meta
index 3596531..9d386de 100644
--- a/Main/Component/UI/Core/DelayButton.cs.meta
+++ b/Main/Config/PartialConfigs/ChestsAwardConfig.cs.meta
@@ -1,8 +1,7 @@
 fileFormatVersion: 2
-guid: f91c143a16d59de4b80b2b0ffbb455e4
-timeCreated: 1501494723
-licenseType: Free
+guid: 5ce9e992608fd9f458c1b1a26a13d102
 MonoImporter:
+  externalObjects: {}
   serializedVersion: 2
   defaultReferences: []
   executionOrder: 0
diff --git a/Main/Core/NetworkPackage/ClientPack/CA3_Item/CA323_tagCMUseItems.cs b/Main/Core/NetworkPackage/ClientPack/CA3_Item/CA323_tagCMUseItems.cs
index b39aa7e..0664dfb 100644
--- a/Main/Core/NetworkPackage/ClientPack/CA3_Item/CA323_tagCMUseItems.cs
+++ b/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, 閫夋嫨鐗╁搧瀹濈鏃跺彂閫侀�夋嫨鐨勭墿鍝両D
     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 ++) {
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA801_tagMCGiveAwardInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA801_tagMCGiveAwardInfo.cs
index f72ba4c..2dd50fe 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA801_tagMCGiveAwardInfo.cs
+++ b/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);
     }
 }
diff --git a/Main/Main.cs b/Main/Main.cs
index e9763c0..a8402d0 100644
--- a/Main/Main.cs
+++ b/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;
diff --git a/Main/Manager/UIManager.cs b/Main/Manager/UIManager.cs
index 82cc5eb..dec0ec4 100644
--- a/Main/Manager/UIManager.cs
+++ b/Main/Manager/UIManager.cs
@@ -690,7 +690,14 @@
         }
         // 娣诲姞鍒癠I鍒楄〃
         uiDict[uiName].Add(returnValue);
-        
+
+#if UNITY_EDITOR
+        if (uiDict[uiName].Count > 5)
+        { 
+            Debug.LogError("宸叉墦寮�" + uiDict[uiName].Count + "涓晫闈�:" + uiName);
+        }
+#endif
+
         // 灏哢I娣诲姞鍒版爤涓�
         uiStack.Push(returnValue);
         
diff --git a/Main/System/CustomizedGift/CustomizedRechargeModel.cs b/Main/System/CustomizedGift/CustomizedRechargeModel.cs
index 3aabd1a..ad70ee9 100644
--- a/Main/System/CustomizedGift/CustomizedRechargeModel.cs
+++ b/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(() =>
                     {
diff --git a/Main/System/GeneralConfig/GeneralDefine.cs b/Main/System/GeneralConfig/GeneralDefine.cs
index 302a4e9..39b5caf 100644
--- a/Main/System/GeneralConfig/GeneralDefine.cs
+++ b/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");
diff --git a/Main/System/ItemTip/BoxGetItemModel.cs b/Main/System/ItemTip/BoxGetItemModel.cs
new file mode 100644
index 0000000..2800b24
--- /dev/null
+++ b/Main/System/ItemTip/BoxGetItemModel.cs
@@ -0,0 +1,538 @@
+锘縰sing 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">琚�夋嫨鐗╁搧鐨処D</param>
+    /// <param name="guid">瀹濈鐨凣UID</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;
+}
\ No newline at end of file
diff --git a/Main/Component/UI/Core/DelayButton.cs.meta b/Main/System/ItemTip/BoxGetItemModel.cs.meta
similarity index 68%
copy from Main/Component/UI/Core/DelayButton.cs.meta
copy to Main/System/ItemTip/BoxGetItemModel.cs.meta
index 3596531..a968b07 100644
--- a/Main/Component/UI/Core/DelayButton.cs.meta
+++ b/Main/System/ItemTip/BoxGetItemModel.cs.meta
@@ -1,8 +1,7 @@
 fileFormatVersion: 2
-guid: f91c143a16d59de4b80b2b0ffbb455e4
-timeCreated: 1501494723
-licenseType: Free
+guid: 2eb8c13a1ade0ce458b63f0ca368758c
 MonoImporter:
+  externalObjects: {}
   serializedVersion: 2
   defaultReferences: []
   executionOrder: 0
diff --git a/Main/System/ItemTip/BoxItemCell.cs b/Main/System/ItemTip/BoxItemCell.cs
new file mode 100644
index 0000000..0ea87f4
--- /dev/null
+++ b/Main/System/ItemTip/BoxItemCell.cs
@@ -0,0 +1,20 @@
+锘縰sing 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;
+    }
+}
+
diff --git a/Main/Component/UI/Core/DelayButton.cs.meta b/Main/System/ItemTip/BoxItemCell.cs.meta
similarity index 68%
copy from Main/Component/UI/Core/DelayButton.cs.meta
copy to Main/System/ItemTip/BoxItemCell.cs.meta
index 3596531..d5ec9e6 100644
--- a/Main/Component/UI/Core/DelayButton.cs.meta
+++ b/Main/System/ItemTip/BoxItemCell.cs.meta
@@ -1,8 +1,7 @@
 fileFormatVersion: 2
-guid: f91c143a16d59de4b80b2b0ffbb455e4
-timeCreated: 1501494723
-licenseType: Free
+guid: bb169f4e43327164c8aa0a1cfeecdad1
 MonoImporter:
+  externalObjects: {}
   serializedVersion: 2
   defaultReferences: []
   executionOrder: 0
diff --git a/Main/System/ItemTip/BoxItemLineCell.cs b/Main/System/ItemTip/BoxItemLineCell.cs
new file mode 100644
index 0000000..8da4d91
--- /dev/null
+++ b/Main/System/ItemTip/BoxItemLineCell.cs
@@ -0,0 +1,25 @@
+锘縰sing 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);
+            }
+        }
+    }
+}
+
diff --git a/Main/Component/UI/Core/DelayButton.cs.meta b/Main/System/ItemTip/BoxItemLineCell.cs.meta
similarity index 68%
copy from Main/Component/UI/Core/DelayButton.cs.meta
copy to Main/System/ItemTip/BoxItemLineCell.cs.meta
index 3596531..e9e3d06 100644
--- a/Main/Component/UI/Core/DelayButton.cs.meta
+++ b/Main/System/ItemTip/BoxItemLineCell.cs.meta
@@ -1,8 +1,7 @@
 fileFormatVersion: 2
-guid: f91c143a16d59de4b80b2b0ffbb455e4
-timeCreated: 1501494723
-licenseType: Free
+guid: a4e421d1b43c43741a77780e74104218
 MonoImporter:
+  externalObjects: {}
   serializedVersion: 2
   defaultReferences: []
   executionOrder: 0
diff --git a/Main/System/ItemTip/BoxItemWin.cs b/Main/System/ItemTip/BoxItemWin.cs
new file mode 100644
index 0000000..f4a4c2f
--- /dev/null
+++ b/Main/System/ItemTip/BoxItemWin.cs
@@ -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);
+    }
+    
+
+    
+}
\ No newline at end of file
diff --git a/Main/Component/UI/Core/DelayButton.cs.meta b/Main/System/ItemTip/BoxItemWin.cs.meta
similarity index 68%
copy from Main/Component/UI/Core/DelayButton.cs.meta
copy to Main/System/ItemTip/BoxItemWin.cs.meta
index 3596531..7226575 100644
--- a/Main/Component/UI/Core/DelayButton.cs.meta
+++ b/Main/System/ItemTip/BoxItemWin.cs.meta
@@ -1,8 +1,7 @@
 fileFormatVersion: 2
-guid: f91c143a16d59de4b80b2b0ffbb455e4
-timeCreated: 1501494723
-licenseType: Free
+guid: b86f5d8b940c1c34cabe4876cd7993be
 MonoImporter:
+  externalObjects: {}
   serializedVersion: 2
   defaultReferences: []
   executionOrder: 0
diff --git a/Main/System/ItemTip/ChooseItemsCell.cs b/Main/System/ItemTip/ChooseItemsCell.cs
new file mode 100644
index 0000000..189b175
--- /dev/null
+++ b/Main/System/ItemTip/ChooseItemsCell.cs
@@ -0,0 +1,79 @@
+锘縰sing 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";
+        
+    }
+
+}
+
+
+
+
+
diff --git a/Main/Component/UI/Core/DelayButton.cs.meta b/Main/System/ItemTip/ChooseItemsCell.cs.meta
similarity index 68%
rename from Main/Component/UI/Core/DelayButton.cs.meta
rename to Main/System/ItemTip/ChooseItemsCell.cs.meta
index 3596531..a94d2b8 100644
--- a/Main/Component/UI/Core/DelayButton.cs.meta
+++ b/Main/System/ItemTip/ChooseItemsCell.cs.meta
@@ -1,8 +1,7 @@
 fileFormatVersion: 2
-guid: f91c143a16d59de4b80b2b0ffbb455e4
-timeCreated: 1501494723
-licenseType: Free
+guid: 7eacdda8b7c863e48b2ae4acd2027167
 MonoImporter:
+  externalObjects: {}
   serializedVersion: 2
   defaultReferences: []
   executionOrder: 0
diff --git a/Main/System/ItemTip/ChooseItemsWin.cs b/Main/System/ItemTip/ChooseItemsWin.cs
new file mode 100644
index 0000000..942ef49
--- /dev/null
+++ b/Main/System/ItemTip/ChooseItemsWin.cs
@@ -0,0 +1,109 @@
+锘縰sing 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}"));
+    }
+
+
+
+}
+
+
diff --git a/Main/Component/UI/Core/DelayButton.cs.meta b/Main/System/ItemTip/ChooseItemsWin.cs.meta
similarity index 68%
copy from Main/Component/UI/Core/DelayButton.cs.meta
copy to Main/System/ItemTip/ChooseItemsWin.cs.meta
index 3596531..fe1436b 100644
--- a/Main/Component/UI/Core/DelayButton.cs.meta
+++ b/Main/System/ItemTip/ChooseItemsWin.cs.meta
@@ -1,8 +1,7 @@
 fileFormatVersion: 2
-guid: f91c143a16d59de4b80b2b0ffbb455e4
-timeCreated: 1501494723
-licenseType: Free
+guid: 80c2b6d2ef0dcfb46b0971eddae69ab7
 MonoImporter:
+  externalObjects: {}
   serializedVersion: 2
   defaultReferences: []
   executionOrder: 0
diff --git a/Main/System/ItemTip/ItemTipUtility.cs b/Main/System/ItemTip/ItemTipUtility.cs
index f5a71c6..2fab85d 100644
--- a/Main/System/ItemTip/ItemTipUtility.cs
+++ b/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, //鐜嬭�呮硶瀹漷ip
         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,99 +248,64 @@
 
         // 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:
-        //         mainTipData = CreateNormalEquipData(itemId);
-        //         if (item.isAuctionEquip && !item.legendProperty.Equals(default(LegendProperty)))
-        //         {
-        //             mainTipData.legendProperty = item.legendProperty;
-        //             mainTipData.baseInfo.score = item.score;
-        //             mainTipData.baseInfo.isPreview = false;
-        //         }
+        var tipType = GetTipType(itemId);
+        switch (tipType)
+        {
+            case TipType.Equip:
+                // mainTipData = CreateNormalEquipData(itemId);
+                // if (item.isAuctionEquip && !item.legendProperty.Equals(default(LegendProperty)))
+                // {
+                //     mainTipData.legendProperty = item.legendProperty;
+                //     mainTipData.baseInfo.score = item.score;
+                //     mainTipData.baseInfo.isPreview = false;
+                // }
 
-        //         if (item.compare)
-        //         {
-        //             if (ItemLogicUtility.Instance.IsJobCompatibleItem(itemId))
-        //             {
-        //                 var equipedGuid = equipModel.GetEquip(new Int2(config.LV, config.EquipPlace));
-        //                 if (equipedGuid != string.Empty)
-        //                 {
-        //                     secondaryData = CreateNormalEquipData(equipedGuid, false);
-        //                 }
-        //             }
-        //         }
-        //         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;
-        // }
+                // if (item.compare)
+                // {
+                //     if (ItemLogicUtility.Instance.IsJobCompatibleItem(itemId))
+                //     {
+                //         var equipedGuid = equipModel.GetEquip(new Int2(config.LV, config.EquipPlace));
+                //         if (equipedGuid != string.Empty)
+                //         {
+                //             secondaryData = CreateNormalEquipData(equipedGuid, false);
+                //         }
+                //     }
+                // }
+                break;
+            default:
+                mainTipData = CreateItemData(itemId);
+                break;
+        }
 
-        // 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;
-        //     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:
-        //         TreasurePavilionModel.Instance.selectGubao = config.EffectValueA1;
-        //         TreasurePavilionModel.Instance.showTipFromPiece = config.ID;
-        //         WindowCenter.Instance.OpenIL<TreasurePavilionTipWin>();
-        //         break;
-        //     default:
-        //         WindowCenter.Instance.Open<ItemTipWin>();
-        //         break;
-        // }
+        mainTipData.getWay.defaultUnfold = item.unfoldGetWay;
+        switch (tipType)
+        {
+            case TipType.Equip:
+                // WindowCenter.Instance.Open<EquipTipWin>();
+                break;
+
+            // case TipType.PetMount:
+            //      WindowCenter.Instance.Open<PetMountTipWin>();
+            //     break;
+
+            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:
+                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),
-    //         baseProperty = GetBaseProperty(itemId),
-    //         exchangeItemId = itemId,
-    //         spiritWeaponProperty = GetSpiritWeaponProperty(itemId),
-    //         legendProperty = GetLegendProperty(itemId),
-    //         petMountBaseProperty = GetPetMountBaseProperty(itemId),
-    //         getWay = GetGetWay(itemId),
-    //         shenProperty = GetShenProperty(itemId)
-    //     };
-    // }
+    static TipData CreateItemData(int itemId)
+    {
+        return new TipData()
+        {
+            itemId = itemId,
+            baseInfo = GetBaseInfo(itemId),
+            // baseProperty = GetBaseProperty(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,212 +1571,7 @@
     //     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;
-    // }
-
     
 
     private static List<ItemOperateType> GetGoodOperates(int goodId)
@@ -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.BoxItem;
+        }
+        else if (boxType == 2)
         {
-            return TipType.PeerlessChest;
+            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)
     {
diff --git a/Main/System/KnapSack/BackpackData.cs b/Main/System/KnapSack/BackpackData.cs
index 20015b7..058bfab 100644
--- a/Main/System/KnapSack/BackpackData.cs
+++ b/Main/System/KnapSack/BackpackData.cs
@@ -6,69 +6,37 @@
 using System.Collections;
 
 
-    public struct Item
+public struct Item
+{
+    public int id;
+    public ulong countEx;   
+    public int quality;
+    public int bind;    //缁戝畾 鎴栬�� 鎷嶅崠 浜ゆ槗
+
+    public Item(int _id, ulong _count)
     {
-        public int id;
-        public int count;       //鍏煎鏃т唬鐮佷繚鐣�
-        public ulong countEx;   //鍏煎鏃т唬鐮乧ount锛屽綋鏁伴噺瓒呰繃浜�32浣嶆棤娉曡〃绀烘椂浣跨敤
-        public int quality;
-        public int bind;
+        this.id = _id;
+        this.quality = 0;
+        this.bind = 0;
+        this.countEx = _count;
+    }
+    
 
-        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.quality = _quality;
+        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;
-        }
+    public Item(int _id, ulong _count, int _bind = 0, int _quality = 0)
+    {
+        this.id = _id;
+        this.quality = _quality;
+        this.bind = _bind;
+        this.countEx = _count;
+    }
 
-        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
-    }
\ No newline at end of file
+    
+}
\ No newline at end of file
diff --git a/Main/System/KnapSack/Logic/CommonGetItemCell.cs b/Main/System/KnapSack/Logic/CommonGetItemCell.cs
index e067abe..d16ba2b 100644
--- a/Main/System/KnapSack/Logic/CommonGetItemCell.cs
+++ b/Main/System/KnapSack/Logic/CommonGetItemCell.cs
@@ -1,32 +1,24 @@
 锘縰sing System.Collections.Generic;
-using System.Linq;
 using UnityEngine;
 using UnityEngine.UI;
 
-    public class CommonGetItemCell : CellView
+public class CommonGetItemCell : CellView
+{
+    [SerializeField] List<CommonGetItem> commonGetItems = new List<CommonGetItem>();
+    public void Display(int index, List<Item> showItems)
     {
-        [SerializeField] List<CommonGetItem> commonGetItems = new List<CommonGetItem>();
-        [SerializeField] HorizontalLayoutGroup horizontalLayout;
-        public void Display(int rowIndex)
+        for (int i = 0; i < commonGetItems.Count; i++)
         {
-            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++)
+            if (index + i < showItems.Count)
             {
-                int index = rowIndex * 5 + i;
-                if (index < list.Count)
-                {
-                    int itemId = list[index];
-                    commonGetItems[i].Display(itemId);
-                    commonGetItems[i].SetActive(true);
-                }
-                else
-                {
-                    commonGetItems[i].SetActive(false);
-                }
+                int itemId = showItems[index + i].id;
+                commonGetItems[i].Display(itemId);
+                commonGetItems[i].SetActive(true);
+            }
+            else
+            {
+                commonGetItems[i].SetActive(false);
             }
         }
     }
+}
diff --git a/Main/System/KnapSack/Logic/CommonGetItemWin.cs b/Main/System/KnapSack/Logic/CommonGetItemWin.cs
index 7e7f3d6..a2ebe00 100644
--- a/Main/System/KnapSack/Logic/CommonGetItemWin.cs
+++ b/Main/System/KnapSack/Logic/CommonGetItemWin.cs
@@ -1,111 +1,87 @@
-锘縰sing System.Linq;
+锘縰sing System.Collections.Generic;
+using System.Linq;
 using UnityEngine;
 using UnityEngine.UI;
 
-    //鐢ㄤ簬鏄剧ず鑾峰緱鐗╁搧鐨勭獥鍙�
-    public class CommonGetItemWin : UIBase
+//鐢ㄤ簬鏄剧ず鑾峰緱鐗╁搧鐨勭獥鍙�
+public class CommonGetItemWin : UIBase
+{
+    [SerializeField] ScrollerController scroller;
+
+
+    protected override void OnPreOpen()
     {
-        [SerializeField] ScrollerController scroller;
-        [SerializeField] RichText desc;
-        [SerializeField] Button sureBtn;
-        [SerializeField] Text sureText;
-        [SerializeField] TextEx closeText;
+        ItemLogicUtility.Instance.OnGetItemShowEvent += OnGetItemShowEvent;
+        scroller.OnRefreshCell += OnRefreshCell;
+        CreateScroller();
+    }
 
 
-        float openTime;
+    protected override void OnPreClose()
+    {
+        ItemLogicUtility.Instance.OnGetItemShowEvent -= OnGetItemShowEvent;
+        scroller.OnRefreshCell -= OnRefreshCell;
+        ItemLogicUtility.Instance.ClearGetItem();
 
-        protected override void InitComponent()
+    }
+
+    List<Item> showItems = new List<Item>();
+    void CreateScroller()
+    {
+        scroller.Refresh();
+        showItems = ItemLogicUtility.Instance.totalShowItems.Values.ToList();
+        showItems.Sort(SortItem);
+        for (int i = 0; i < showItems.Count; i++)
         {
-            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;
-        }
-
-
-        protected override void OnPreClose()
-        {
-            ItemLogicUtility.Instance.OnGetItemShowEvent -= OnGetItemShowEvent;
-            scroller.OnRefreshCell -= OnRefreshCell;
-            ItemLogicUtility.Instance.OnGetItem?.Invoke();
-            ItemLogicUtility.Instance.ClearGetItem();
-
-        }
-
-        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++)
-            {
+            if (i % 5 == 0)
+            { 
                 scroller.AddCell(ScrollerDataType.Header, i);
             }
-            scroller.Restart();
         }
-
-        float needRefreshTime;  //閬垮厤灏佸寘杩囧鍗¢】
-        void OnGetItemShowEvent()
-        {
-            needRefreshTime = Time.time + 0.3f;
-
-        }
-
-        void RefreshScroller()
-        {
-            if (needRefreshTime <= 0)
-                return;
-
-            if (Time.time < needRefreshTime)
-                return;
-
-            if (scroller.GetNumberOfCells(scroller.m_Scorller) != ItemLogicUtility.Instance.totalShowItems.Count)
-            {
-                CreateScroller();
-            }
-            else
-            {
-                scroller.m_Scorller.RefreshActiveCellViews();
-            }
-            needRefreshTime = 0;
-        }
-
-        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);
-        }
+        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;  //閬垮厤灏佸寘杩囧鍗¢】
+    void OnGetItemShowEvent()
+    {
+        needRefreshTime = Time.time + 0.3f;
+
+    }
+
+    void RefreshScroller()
+    {
+        if (needRefreshTime <= 0)
+            return;
+
+        if (Time.time < needRefreshTime)
+            return;
+
+        if (scroller.GetNumberOfCells(scroller.m_Scorller) != ItemLogicUtility.Instance.totalShowItems.Count)
+        {
+            CreateScroller();
+        }
+        else
+        {
+            scroller.m_Scorller.RefreshActiveCellViews();
+        }
+        needRefreshTime = 0;
+    }
+
+    protected void LateUpdate()
+    {
+        RefreshScroller();
+    }
+
+    void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as CommonGetItemCell;
+        _cell?.Display(cell.index, showItems);
+    }
+}
diff --git a/Main/System/KnapSack/Logic/ItemLogicUtility.cs b/Main/System/KnapSack/Logic/ItemLogicUtility.cs
index 40bbc65..818c197 100644
--- a/Main/System/KnapSack/Logic/ItemLogicUtility.cs
+++ b/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); //浣跨敤鐗╁搧
+    }
+
 }
diff --git a/Main/System/KnapSack/Logic/PackGirdCell.cs b/Main/System/KnapSack/Logic/PackGirdCell.cs
index d61fc3e..0ceae9e 100644
--- a/Main/System/KnapSack/Logic/PackGirdCell.cs
+++ b/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);
diff --git a/Main/System/KnapSack/New/CommonItemBaisc.cs b/Main/System/KnapSack/New/CommonItemBaisc.cs
index 57644ef..cd349d3 100644
--- a/Main/System/KnapSack/New/CommonItemBaisc.cs
+++ b/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);
             }
diff --git a/Main/System/KnapSack/PackManager.cs b/Main/System/KnapSack/PackManager.cs
index ae9f4fb..b307a4e 100644
--- a/Main/System/KnapSack/PackManager.cs
+++ b/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,44 +971,44 @@
     #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;
-    //         }
-    //     }
+        // 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 remainSumCnt = 0;
-    //     if (fruitConfig != null)
-    //     {
-    //         remainSumCnt = fruitConfig.basicUseLimit - sumHaveUseCnt;
-    //         if (remainSumCnt <= remainDayCnt && itemModel.count > remainSumCnt)
-    //         {
-    //             count = (ulong)remainSumCnt;
-    //         }
-    //     }
+        int remainSumCnt = 0;
+        // if (fruitConfig != null)
+        // {
+        //     remainSumCnt = fruitConfig.basicUseLimit - sumHaveUseCnt;
+        //     if (remainSumCnt <= remainDayCnt && itemModel.count > remainSumCnt)
+        //     {
+        //         count = (ulong)remainSumCnt;
+        //     }
+        // }
 
-    //     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);
-    }
 }
diff --git a/Main/System/Recharge/DailySpecialsModel.cs b/Main/System/Recharge/DailySpecialsModel.cs
index 31dc062..27c7802 100644
--- a/Main/System/Recharge/DailySpecialsModel.cs
+++ b/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);
diff --git a/Main/System/Recharge/RechargeManager.cs b/Main/System/Recharge/RechargeManager.cs
index c3460bf..e15f1b3 100644
--- a/Main/System/Recharge/RechargeManager.cs
+++ b/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]));
             }
 
 
diff --git a/Main/System/Store/StoreModel.cs b/Main/System/Store/StoreModel.cs
index b072931..93d17e5 100644
--- a/Main/System/Store/StoreModel.cs
+++ b/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; }
diff --git a/Main/System/Tip/ItemsConfirmCell.cs b/Main/System/Tip/ItemsConfirmCell.cs
index 34b818d..3fd9d7c 100644
--- a/Main/System/Tip/ItemsConfirmCell.cs
+++ b/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);
diff --git a/Main/Utility/MaterialUtility.cs b/Main/Utility/MaterialUtility.cs
index 3044113..2249278 100644
--- a/Main/Utility/MaterialUtility.cs
+++ b/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)

--
Gitblit v1.8.0