From 4de42356ff71d295be7d3bf2e0b7d218b719ad9c Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期一, 08 十二月 2025 16:47:06 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts

---
 Main/Config/Configs/HeroQualityConfig.cs                                                      |   17 +
 Main/Core/NetworkPackage/ServerPack/HB1_Role/HB129_tagSCLineupRecommendInfo.cs                |   29 +
 Main/System/LineupRecommend/LineupRecommendCell.cs                                            |  100 ++++++
 Main/System/LineupRecommend/LineupRecommendBaseWin.cs.meta                                    |   11 
 Main/Config/Configs/LineupRecommendConfig.cs                                                  |   77 ++++
 Main/System/HeroUI/HeroCollectionLvUpWin.cs                                                   |   29 +
 Main/Config/ConfigManager.cs                                                                  |    3 
 Main/System/LineupRecommend/LineupRecommendManager.cs.meta                                    |   11 
 Main/System/Redpoint/MainRedDot.cs                                                            |    1 
 Main/Core/NetworkPackage/ServerPack/HB1_Role/HB129_tagSCLineupRecommendInfo.cs.meta           |   11 
 Main/System/LineupRecommend/LineupRecommendBaseWin.cs                                         |   20 +
 Main/System/LineupRecommend/LineupRecommendWin.cs.meta                                        |   11 
 Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs                                          |    1 
 Main/System/LineupRecommend/LineupRecommendWin.cs                                             |  136 ++++++++
 Main/System/LineupRecommend/LineupRecommendManager.cs                                         |  328 ++++++++++++++++++++
 Main/Config/Configs/LineupRecommendConfig.cs.meta                                             |   11 
 Main/System/LineupRecommend/LineupRecommendCell.cs.meta                                       |   11 
 Main/Main.cs                                                                                  |    1 
 Main/System/LineupRecommend.meta                                                              |    8 
 Main/System/LineupRecommend/LineupRecommendItem.cs                                            |   74 ++++
 Main/System/HeroUI/HeroListWin.cs                                                             |   12 
 Main/System/LineupRecommend/LineupRecommendItem.cs.meta                                       |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB129_tagSCLineupRecommendInfo.cs      |   12 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB129_tagSCLineupRecommendInfo.cs.meta |   11 
 24 files changed, 920 insertions(+), 16 deletions(-)

diff --git a/Main/Config/ConfigManager.cs b/Main/Config/ConfigManager.cs
index c6aa9df..97d68ae 100644
--- a/Main/Config/ConfigManager.cs
+++ b/Main/Config/ConfigManager.cs
@@ -60,6 +60,7 @@
             typeof(HorseSkinConfig),
             typeof(ItemCompoundConfig),
             typeof(ItemConfig),
+            typeof(LineupRecommendConfig),
             typeof(LLMJConfig),
             typeof(MainChapterConfig),
             typeof(MainLevelConfig),
@@ -277,6 +278,8 @@
         ClearConfigDictionary<ItemCompoundConfig>();
         // 娓呯┖ ItemConfig 瀛楀吀
         ClearConfigDictionary<ItemConfig>();
+        // 娓呯┖ LineupRecommendConfig 瀛楀吀
+        ClearConfigDictionary<LineupRecommendConfig>();
         // 娓呯┖ LLMJConfig 瀛楀吀
         ClearConfigDictionary<LLMJConfig>();
         // 娓呯┖ MainChapterConfig 瀛楀吀
diff --git a/Main/Config/Configs/HeroQualityConfig.cs b/Main/Config/Configs/HeroQualityConfig.cs
index 95be87d..4bae93b 100644
--- a/Main/Config/Configs/HeroQualityConfig.cs
+++ b/Main/Config/Configs/HeroQualityConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           2025骞�12鏈�5鏃�
+//    [  Date ]:           Monday, December 8, 2025
 //--------------------------------------------------------
 
 using System.Collections.Generic;
@@ -24,6 +24,7 @@
 	public int StarAddPer;
 	public int[] BookActAwardMoney;
 	public int[][] DismissReturnItems;
+	public int[] RecommendAwardMoney;
 
     public override int LoadKey(string _key)
     {
@@ -62,6 +63,20 @@
 			}
 
 			DismissReturnItems = JsonMapper.ToObject<int[][]>(tables[7].Replace("(", "[").Replace(")", "]")); 
+
+			if (tables[8].Contains("["))
+			{
+				RecommendAwardMoney = JsonMapper.ToObject<int[]>(tables[8]);
+			}
+			else
+			{
+				string[] RecommendAwardMoneyStringArray = tables[8].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				RecommendAwardMoney = new int[RecommendAwardMoneyStringArray.Length];
+				for (int i=0;i<RecommendAwardMoneyStringArray.Length;i++)
+				{
+					 int.TryParse(RecommendAwardMoneyStringArray[i],out RecommendAwardMoney[i]);
+				}
+			}
         }
         catch (Exception exception)
         {
diff --git a/Main/Config/Configs/LineupRecommendConfig.cs b/Main/Config/Configs/LineupRecommendConfig.cs
new file mode 100644
index 0000000..7578b1a
--- /dev/null
+++ b/Main/Config/Configs/LineupRecommendConfig.cs
@@ -0,0 +1,77 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2025骞�12鏈�5鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class LineupRecommendConfig : ConfigBase<int, LineupRecommendConfig>
+{
+    static LineupRecommendConfig()
+    {
+        // 璁块棶杩囬潤鎬佹瀯閫犲嚱鏁�
+        visit = true; 
+    }
+
+    public int RecommendID;
+	public int[] HeroIDList;
+	public int[] PosIndexList;
+	public string Name;
+	public string Feature;
+	public string Desc;
+
+    public override int LoadKey(string _key)
+    {
+        int key = GetKey(_key);
+        return key;
+    }
+
+    public override void LoadConfig(string input)
+    {
+        try {
+        string[] tables = input.Split('\t');
+        int.TryParse(tables[0],out RecommendID); 
+
+			if (tables[1].Contains("["))
+			{
+				HeroIDList = JsonMapper.ToObject<int[]>(tables[1]);
+			}
+			else
+			{
+				string[] HeroIDListStringArray = tables[1].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				HeroIDList = new int[HeroIDListStringArray.Length];
+				for (int i=0;i<HeroIDListStringArray.Length;i++)
+				{
+					 int.TryParse(HeroIDListStringArray[i],out HeroIDList[i]);
+				}
+			}
+
+			if (tables[2].Contains("["))
+			{
+				PosIndexList = JsonMapper.ToObject<int[]>(tables[2]);
+			}
+			else
+			{
+				string[] PosIndexListStringArray = tables[2].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				PosIndexList = new int[PosIndexListStringArray.Length];
+				for (int i=0;i<PosIndexListStringArray.Length;i++)
+				{
+					 int.TryParse(PosIndexListStringArray[i],out PosIndexList[i]);
+				}
+			}
+
+			Name = tables[3];
+
+			Feature = tables[4];
+
+			Desc = tables[5];
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/LineupRecommendConfig.cs.meta b/Main/Config/Configs/LineupRecommendConfig.cs.meta
new file mode 100644
index 0000000..c5400d0
--- /dev/null
+++ b/Main/Config/Configs/LineupRecommendConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1dba5f6e898ed7a41b2ef35456c8d731
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB129_tagSCLineupRecommendInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB129_tagSCLineupRecommendInfo.cs
new file mode 100644
index 0000000..1ecc684
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB129_tagSCLineupRecommendInfo.cs
@@ -0,0 +1,12 @@
+using UnityEngine;
+using System.Collections;
+
+// B1 29 闃靛鎺ㄨ崘淇℃伅 #tagSCLineupRecommendInfo
+
+public class DTCB129_tagSCLineupRecommendInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
+        base.Done(vNetPack);
+        HB129_tagSCLineupRecommendInfo vNetData = vNetPack as HB129_tagSCLineupRecommendInfo;
+        LineupRecommendManager.Instance.UpdateLineupRecommendInfo(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB129_tagSCLineupRecommendInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB129_tagSCLineupRecommendInfo.cs.meta
new file mode 100644
index 0000000..7c3b843
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB129_tagSCLineupRecommendInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c9d2c83b99b093c4f990e8ebb1bc14f2
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
index e145559..1c12966 100644
--- a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
+++ b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
@@ -133,6 +133,7 @@
         Register(typeof(HB310_tagMCTalk), typeof(DTCB310_tagMCTalk));
         Register(typeof(HB311_tagMCTalkCacheList), typeof(DTCB311_tagMCTalkCacheList));
         Register(typeof(HA319_tagMCPackDownloadRecord), typeof(DTCA319_tagMCPackDownloadRecord));
+        Register(typeof(HB129_tagSCLineupRecommendInfo), typeof(DTCB129_tagSCLineupRecommendInfo));
     }
 
     //涓诲伐绋嬫敞鍐屽皝鍖�
diff --git a/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB129_tagSCLineupRecommendInfo.cs b/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB129_tagSCLineupRecommendInfo.cs
new file mode 100644
index 0000000..2edf619
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB129_tagSCLineupRecommendInfo.cs
@@ -0,0 +1,29 @@
+using UnityEngine;
+using System.Collections;
+
+// B1 29 闃靛鎺ㄨ崘淇℃伅 #tagSCLineupRecommendInfo
+
+public class HB129_tagSCLineupRecommendInfo : GameNetPackBasic {
+    public byte Count;
+    public  tagSCLineupRecommend[] RecommendList;
+
+    public HB129_tagSCLineupRecommendInfo () {
+        _cmd = (ushort)0xB129;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out Count, vBytes, NetDataType.BYTE);
+        RecommendList = new tagSCLineupRecommend[Count];
+        for (int i = 0; i < Count; i ++) {
+            RecommendList[i] = new tagSCLineupRecommend();
+            TransBytes (out RecommendList[i].RecommendID, vBytes, NetDataType.BYTE);
+            TransBytes (out RecommendList[i].AwardState, vBytes, NetDataType.DWORD);
+        }
+    }
+
+    public class tagSCLineupRecommend {
+        public byte RecommendID;        //鎺ㄨ崘闃靛琛↖D
+        public uint AwardState;        //鎺ㄨ崘姝﹀皢棰嗗鐘舵�侊紝鎸夋灏嗛厤缃殑椤哄簭浣嶅瓨鍌ㄦ槸鍚﹀凡棰嗗彇
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB129_tagSCLineupRecommendInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB129_tagSCLineupRecommendInfo.cs.meta
new file mode 100644
index 0000000..5c03f93
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB129_tagSCLineupRecommendInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 438f34b9f832ae1458a219768ac86057
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Main.cs b/Main/Main.cs
index 9d6c377..c01f11b 100644
--- a/Main/Main.cs
+++ b/Main/Main.cs
@@ -92,6 +92,7 @@
         managers.Add(AttributeManager.Instance);
         managers.Add(FuncNPCManager.Instance);
         managers.Add(GuildBossManager.Instance);
+        managers.Add(LineupRecommendManager.Instance);
 
         foreach (var manager in managers)
         {
diff --git a/Main/System/HeroUI/HeroCollectionLvUpWin.cs b/Main/System/HeroUI/HeroCollectionLvUpWin.cs
index b4aa863..cf71fb2 100644
--- a/Main/System/HeroUI/HeroCollectionLvUpWin.cs
+++ b/Main/System/HeroUI/HeroCollectionLvUpWin.cs
@@ -32,7 +32,7 @@
     
     [SerializeField] GameObject fullImg;
 
-    [SerializeField] Text titleText;
+    // [SerializeField] Text titleText;
 
 
     protected override void InitComponent()
@@ -93,29 +93,34 @@
         // }
         // else
         {
-            fullPanel.SetActive(false);
-            lvupPanel.SetActive(true);
+            // fullPanel.SetActive(true);
+            lvupPanel.SetActive(state == 1);
+            fullHeadCell.Init(HeroUIManager.Instance.selectCollectHeroID, config.SkinIDList[0], colData.BookStarLV);
+            name3.text = colData.BookBreakLV == 0 ? config.Name : Language.Get("herocardbreaklv", config.Name, colData.BookBreakLV);
+
+
             btn.SetActive(true);
 
-            beforeHeadCell.Init(HeroUIManager.Instance.selectCollectHeroID, config.SkinIDList[0], colData.BookStarLV);
-            name1.text = colData.BookBreakLV == 0 ? config.Name : Language.Get("herocardbreaklv", config.Name, colData.BookBreakLV);
+            // beforeHeadCell.Init(HeroUIManager.Instance.selectCollectHeroID, config.SkinIDList[0], colData.BookStarLV);
+            // name1.text = colData.BookBreakLV == 0 ? config.Name : Language.Get("herocardbreaklv", config.Name, colData.BookBreakLV);
 
             // int addPer = 0;
             var qualityConfig = HeroQualityConfig.Get(config.Quality);
             awardInfo.text = string.Empty;
             unActiveGo.SetActive(false);
-            titleText.text = Language.Get("HeroAwake12");
+            // titleText.text = Language.Get("HeroAwake12");
             int afterBreakLV = colData.BookBreakLV;
             int afterStarLV = colData.BookStarLV;
             if (state == 1)
             {
+                lvupPanel.SetActive(true);
                 //婵�娲�
                 // addPer = qualityConfig.BookInitAddPer;
                 btnText.text = Language.Get("L1131");   //L1131	婵�娲�
                 awardInfo.text = Language.Get("HeroAwake10", UIHelper.GetIconNameWithMoneyType(qualityConfig.BookActAwardMoney[0]),
                     qualityConfig.BookActAwardMoney[1]);
                 unActiveGo.SetActive(true);
-                titleText.text = Language.Get("HeroAwake11");
+                // titleText.text = Language.Get("HeroAwake11");
             }
             // else if (state == 3)
             // {
@@ -144,16 +149,16 @@
                     btnText.text = Language.Get("L1001");
                 }
 
-                fullPanel.SetActive(true);
+                // fullPanel.SetActive(true);
                 lvupPanel.SetActive(false);
 
-                fullHeadCell.Init(HeroUIManager.Instance.selectCollectHeroID, config.SkinIDList[0], colData.BookStarLV);
-                name3.text = colData.BookBreakLV == 0 ? config.Name : Language.Get("herocardbreaklv", config.Name, colData.BookBreakLV);
+                // fullHeadCell.Init(HeroUIManager.Instance.selectCollectHeroID, config.SkinIDList[0], colData.BookStarLV);
+                // name3.text = colData.BookBreakLV == 0 ? config.Name : Language.Get("herocardbreaklv", config.Name, colData.BookBreakLV);
 
             }
 
-            afterHeadCell.Init(HeroUIManager.Instance.selectCollectHeroID, config.SkinIDList[0], afterStarLV);
-            name2.text = afterBreakLV == 0 ? config.Name :Language.Get("herocardbreaklv", config.Name, afterBreakLV);
+            // afterHeadCell.Init(HeroUIManager.Instance.selectCollectHeroID, config.SkinIDList[0], afterStarLV);
+            // name2.text = afterBreakLV == 0 ? config.Name :Language.Get("herocardbreaklv", config.Name, afterBreakLV);
 
 
             // for (int i = 0; i < beforeAttrValues.Length; i++)
diff --git a/Main/System/HeroUI/HeroListWin.cs b/Main/System/HeroUI/HeroListWin.cs
index 9b6bf0c..b010d65 100644
--- a/Main/System/HeroUI/HeroListWin.cs
+++ b/Main/System/HeroUI/HeroListWin.cs
@@ -19,6 +19,8 @@
     [SerializeField] Button changeHeroPosBtn; //甯冮樀鎸夐挳
     [SerializeField] Transform heroSelectBehaviour;
     HeroSelectBehaviour fiterManager;  //姝﹀皢绛涢��
+    [SerializeField] ButtonEx lineupRecommendBtn;
+
 
     SinglePack singlePack;
 
@@ -40,6 +42,10 @@
         });
 
         fiterManager = HeroSelectBehaviour.Create(heroSelectBehaviour);
+        lineupRecommendBtn.AddListener(() =>
+        {
+            UIManager.Instance.OpenWindow<LineupRecommendBaseWin>();
+        });
     }
 
 
@@ -106,7 +112,7 @@
                 continue;
             if (hero.heroId == heroID)
             {
-                return index/4 - 1;
+                return index / 4 - 1;
             }
         }
         return -1;
@@ -120,7 +126,7 @@
 
         RefreshPackCount();
 
-        
+
 
     }
 
@@ -263,7 +269,7 @@
     }
 
     void GridRefreshEvent(PackType type)
-    { 
+    {
         if (type != PackType.Hero)
             return;
 
diff --git a/Main/System/LineupRecommend.meta b/Main/System/LineupRecommend.meta
new file mode 100644
index 0000000..730601f
--- /dev/null
+++ b/Main/System/LineupRecommend.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 51bbd3838772ee843ac23ef8ff48b89c
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/LineupRecommend/LineupRecommendBaseWin.cs b/Main/System/LineupRecommend/LineupRecommendBaseWin.cs
new file mode 100644
index 0000000..a921412
--- /dev/null
+++ b/Main/System/LineupRecommend/LineupRecommendBaseWin.cs
@@ -0,0 +1,20 @@
+
+using UnityEngine;
+
+public class LineupRecommendBaseWin : OneLevelWin
+{
+    protected override void OpenSubUIByTabIndex()
+    {
+        switch (functionOrder)
+        {
+            case 0:
+                currentSubUI = UIManager.Instance.OpenWindow<LineupRecommendWin>();
+                break;
+
+            default:
+                Debug.LogWarning("鏈煡鐨勬爣绛剧储寮�: " + functionOrder);
+                break;
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/Main/System/LineupRecommend/LineupRecommendBaseWin.cs.meta b/Main/System/LineupRecommend/LineupRecommendBaseWin.cs.meta
new file mode 100644
index 0000000..93d5fb5
--- /dev/null
+++ b/Main/System/LineupRecommend/LineupRecommendBaseWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9441087b3e26ee84aa8e21ea77bd78e1
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/LineupRecommend/LineupRecommendCell.cs b/Main/System/LineupRecommend/LineupRecommendCell.cs
new file mode 100644
index 0000000..7d5bf70
--- /dev/null
+++ b/Main/System/LineupRecommend/LineupRecommendCell.cs
@@ -0,0 +1,100 @@
+using System.Collections.Generic;
+using System.Text;
+using UnityEngine;
+
+public class LineupRecommendCell : MonoBehaviour
+{
+    [SerializeField] List<LineupRecommendItem> lineupRecommendItems = new List<LineupRecommendItem>();
+    [SerializeField] TextEx txtLineupName;
+    [SerializeField] TextEx txtHeroCount;
+    [SerializeField] ButtonEx btnUse;
+    [SerializeField] Transform transOn;
+    [SerializeField] ButtonEx btnOff;
+    [SerializeField] RichText txtLineupDesc;
+    [SerializeField] Transform transOff;
+    [SerializeField] ButtonEx btnOn;
+
+    LineupRecommendManager manager { get { return LineupRecommendManager.Instance; } }
+    public void Display(int index)
+    {
+        var list = manager.GetSortShowList();
+        if (index < 0 || index >= list.Count)
+            return;
+        var recommendID = list[index];
+
+        if (!LineupRecommendConfig.HasKey(recommendID))
+            return;
+        var config = LineupRecommendConfig.Get(recommendID);
+
+        if (!manager.TryGetHeroIDListByRecommendID(recommendID, out int[] heroIDArr) || heroIDArr.IsNullOrEmpty())
+            return;
+        if (!TryGetHasLineupHeroCount(recommendID, out int hasCout, out int totalCount))
+            return;
+
+        bool isOn = manager.IsOn(recommendID);
+        transOn.SetActive(isOn);
+        transOff.SetActive(!isOn);
+
+
+        for (int i = 0; i < lineupRecommendItems.Count; i++)
+        {
+            if (i < heroIDArr.Length)
+            {
+                lineupRecommendItems[i].SetActive(true);
+                lineupRecommendItems[i].Display(recommendID, i);
+            }
+            else
+            {
+                lineupRecommendItems[i].SetActive(false);
+            }
+        }
+        txtLineupName.text = config.Name;
+        txtHeroCount.text = Language.Get("LineupRecommend02", hasCout, totalCount);
+        txtLineupDesc.text = GetDesc(recommendID);
+        btnUse.SetListener(() =>
+        {
+            manager.UseTeam(recommendID);
+        });
+        btnOff.SetListener(() =>
+        {
+            manager.SetOn(recommendID, false);
+        });
+        btnOn.SetListener(() =>
+        {
+            manager.SetOn(recommendID, true);
+        });
+    }
+
+    public bool TryGetHasLineupHeroCount(int recommendID, out int hasCout, out int totalCount)
+    {
+        hasCout = 0;
+        totalCount = 0;
+        if (!manager.TryGetHeroIDListByRecommendID(recommendID, out int[] heroIDArr) || heroIDArr.IsNullOrEmpty())
+            return false;
+        totalCount = heroIDArr.Length;
+        foreach (var heroID in heroIDArr)
+        {
+            bool isHasHero = HeroManager.Instance.HasHero(heroID);
+            if (isHasHero)
+            {
+                hasCout += 1;
+            }
+        }
+        return true;
+    }
+
+    public string GetDesc(int recommendID)
+    {
+        if (!LineupRecommendConfig.HasKey(recommendID))
+            return string.Empty;
+        var config = LineupRecommendConfig.Get(recommendID);
+
+        StringBuilder stringBuilder = new StringBuilder();
+        stringBuilder.Append(Language.Get("LineupRecommend04"));
+        stringBuilder.Append(config.Feature);
+        stringBuilder.AppendLine();
+        stringBuilder.Append(Language.Get("LineupRecommend05"));
+        stringBuilder.Append(config.Desc);
+        return stringBuilder.ToString();
+    }
+}
\ No newline at end of file
diff --git a/Main/System/LineupRecommend/LineupRecommendCell.cs.meta b/Main/System/LineupRecommend/LineupRecommendCell.cs.meta
new file mode 100644
index 0000000..62e48ae
--- /dev/null
+++ b/Main/System/LineupRecommend/LineupRecommendCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2057b29ec4ef80b41a56fca1d621c514
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/LineupRecommend/LineupRecommendItem.cs b/Main/System/LineupRecommend/LineupRecommendItem.cs
new file mode 100644
index 0000000..8bd4c3d
--- /dev/null
+++ b/Main/System/LineupRecommend/LineupRecommendItem.cs
@@ -0,0 +1,74 @@
+using UnityEngine;
+
+public class LineupRecommendItem : MonoBehaviour
+{
+    [SerializeField] ButtonEx btnClick;
+    [SerializeField] ImageEx imgSquareIcon;
+    [SerializeField] ImageEx imgHeroHead;
+    [SerializeField] ImageEx imgCountry;
+    [SerializeField] TextEx txtName;
+    [SerializeField] ImageEx imgMask;
+    [SerializeField] TextEx txtNoHave;
+    [SerializeField] ImageEx imgMoney;
+    [SerializeField] TextEx txtMoney;
+    [SerializeField] Color32 colMoneyNoActivate;
+    [SerializeField] Color32 colMoneyCanActivate;
+    [SerializeField] TextEx txtDesc;
+    [SerializeField] ImageEx imgRed;
+    LineupRecommendManager manager { get { return LineupRecommendManager.Instance; } }
+    public void Display(int recommendID, int index)
+    {
+        if (!manager.TryGetHeroConfigByIndex(recommendID, index, out HeroConfig heroConfig))
+            return;
+
+        if (!manager.TryGetMoneyInfo(recommendID, index, out int moneyType, out int moneyNeedCnt))
+            return;
+
+        int heroID = heroConfig.HeroID;
+        if (!manager.TryGetHeroSkinConfig(heroID, out HeroSkinConfig heroSkinConfig))
+            return;
+
+        var sprite = UILoader.LoadSprite("HeroHead", heroSkinConfig.SquareIcon);
+        if (sprite == null)
+        {
+            imgHeroHead.SetSprite("herohead_default");
+        }
+        else
+        {
+            imgHeroHead.overrideSprite = sprite;
+        }
+
+        imgSquareIcon.SetSprite("heroheadBG" + heroConfig.Quality);
+        imgCountry.SetSprite(HeroUIManager.Instance.GetCountryIconName(heroConfig.Country));
+        txtName.text = heroConfig.Name;
+        txtDesc.text = heroConfig.Desc;
+
+        LineupRecommendHeroState heroState = manager.GetHeroState(recommendID, index);
+        imgMask.SetActive(heroState != LineupRecommendHeroState.ActivateAndHave);
+        txtNoHave.SetActive(heroState == LineupRecommendHeroState.ActivateButNoHave);
+        imgMoney.SetActive(heroState == LineupRecommendHeroState.NoActivate || heroState == LineupRecommendHeroState.CanActivate);
+        txtMoney.SetActive(heroState == LineupRecommendHeroState.NoActivate || heroState == LineupRecommendHeroState.CanActivate);
+        imgRed.SetActive(heroState == LineupRecommendHeroState.CanActivate);
+
+        imgMoney.SetIconWithMoneyType(moneyType);
+        imgMoney.gray = heroState == LineupRecommendHeroState.NoActivate;
+        txtMoney.text = moneyNeedCnt.ToString();
+        txtMoney.color = heroState == LineupRecommendHeroState.NoActivate ? colMoneyNoActivate : colMoneyCanActivate;
+
+        btnClick.SetListener(() =>
+        {
+            if (heroState == LineupRecommendHeroState.CanActivate)
+            {
+                manager.SendGetReward(recommendID, index);
+            }
+            else
+            {
+                HeroUIManager.Instance.selectForPreviewHeroID = heroConfig.HeroID;
+                UIManager.Instance.OpenWindow<HeroBestWin>();
+            }
+        });
+
+    }
+
+
+}
\ No newline at end of file
diff --git a/Main/System/LineupRecommend/LineupRecommendItem.cs.meta b/Main/System/LineupRecommend/LineupRecommendItem.cs.meta
new file mode 100644
index 0000000..5a637e7
--- /dev/null
+++ b/Main/System/LineupRecommend/LineupRecommendItem.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e23320880bdf6fd40a654bf05ee2a9c6
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/LineupRecommend/LineupRecommendManager.cs b/Main/System/LineupRecommend/LineupRecommendManager.cs
new file mode 100644
index 0000000..aeff54d
--- /dev/null
+++ b/Main/System/LineupRecommend/LineupRecommendManager.cs
@@ -0,0 +1,328 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using UnityEngine;
+
+
+public enum LineupRecommendHeroState
+{
+    NoActivate = 0,             //0 - 鏈縺娲�
+    CanActivate = 1,            // 1 - 鍙縺娲�
+    ActivateAndHave = 2,        // 2 - 宸茶幏寰�
+    ActivateButNoHave = 3,      // 3 - 鏈幏寰�
+}
+public class LineupRecommendManager : GameSystemManager<LineupRecommendManager>
+{
+    Dictionary<int, uint> haveDict = new Dictionary<int, uint>();
+
+    public event Action OnUpdateLineupRecommendInfoEvent;
+
+    public override void Init()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent;
+        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
+        HeroManager.Instance.onHeroChangeEvent += OnHeroChangeEvent;
+        HeroManager.Instance.onHeroDeleteEvent += OnHeroDeleteEvent;
+        HeroUIManager.Instance.OnHeroCollectEvent += OnHeroCollectEvent;
+        FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
+    }
+
+    public override void Release()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitializeEvent;
+        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk;
+        HeroManager.Instance.onHeroChangeEvent -= OnHeroChangeEvent;
+        HeroManager.Instance.onHeroDeleteEvent -= OnHeroDeleteEvent;
+        HeroUIManager.Instance.OnHeroCollectEvent -= OnHeroCollectEvent;
+        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
+    }
+
+    private void OnFuncStateChangeEvent(int obj)
+    {
+        if (obj != funcId)
+            return;
+        UpdateRedPoint();
+    }
+
+    private void OnPlayerLoginOk()
+    {
+        UpdateRedPoint();
+    }
+    private void OnHeroCollectEvent()
+    {
+        UpdateRedPoint();
+    }
+
+    private void OnHeroDeleteEvent(int obj)
+    {
+        UpdateRedPoint();
+    }
+
+    private void OnHeroChangeEvent(HeroInfo heroInfo)
+    {
+        UpdateRedPoint();
+    }
+
+    private void OnBeforePlayerDataInitializeEvent()
+    {
+        haveDict.Clear();
+    }
+
+    // 鍝簺id鏄睍寮�鐨�
+    List<int> onList = new List<int>();
+    public event Action OnUpdateSwitchOnOrOffEvent;
+
+    public void ClearOnList()
+    {
+        onList.Clear();
+    }
+
+    public bool IsOn(int id)
+    {
+        return onList.Contains(id);
+    }
+
+    public void SetOn(int id, bool isOn)
+    {
+        if (isOn)
+        {
+            if (!onList.Contains(id))
+            {
+                onList.Add(id);
+                OnUpdateSwitchOnOrOffEvent?.Invoke();
+            }
+        }
+        else
+        {
+            onList.Remove(id);
+            OnUpdateSwitchOnOrOffEvent?.Invoke();
+        }
+    }
+
+    List<int> sortShowList = null;
+    public List<int> GetSortShowList()
+    {
+        if (sortShowList.IsNullOrEmpty())
+        {
+            sortShowList = LineupRecommendConfig.GetKeys();
+            sortShowList.Sort();
+        }
+        return sortShowList;
+    }
+
+    public bool TryGetMoneyInfo(int RecommendID, int index, out int moneyType, out int moneyNeedCnt)
+    {
+        moneyType = 0;
+        moneyNeedCnt = 0;
+        if (!TryGetHeroConfigByIndex(RecommendID, index, out HeroConfig config))
+            return false;
+        int quality = config.Quality;
+        if (!HeroQualityConfig.HasKey(quality))
+            return false;
+        HeroQualityConfig heroQualityConfig = HeroQualityConfig.Get(quality);
+        int[] recommendAwardMoney = heroQualityConfig.RecommendAwardMoney;
+        if (recommendAwardMoney.IsNullOrEmpty() || recommendAwardMoney.Length < 2)
+            return false;
+        moneyType = recommendAwardMoney[0];
+        moneyNeedCnt = recommendAwardMoney[1];
+        return true;
+    }
+
+    public bool TryGetHeroSkinConfig(int heroID, out HeroSkinConfig skinConfig)
+    {
+        skinConfig = null;
+        if (!HeroConfig.HasKey(heroID))
+            return false;
+        HeroConfig heroConfig = HeroConfig.Get(heroID);
+        int[] skinIDList = heroConfig.SkinIDList;
+        if (skinIDList.IsNullOrEmpty())
+            return false;
+        int skinID = skinIDList[0];
+        if (!HeroSkinConfig.HasKey(skinID))
+            return false;
+        skinConfig = HeroSkinConfig.Get(skinID);
+        return true;
+    }
+
+    public bool TryGetHaveDictValue(int recommendID, out uint awardState)
+    {
+        return haveDict.TryGetValue(recommendID, out awardState);
+    }
+
+    public bool TryGetHeroIDListByRecommendID(int recommendID, out int[] heroIDArr)
+    {
+        heroIDArr = null;
+        if (!LineupRecommendConfig.HasKey(recommendID))
+            return false;
+        LineupRecommendConfig config = LineupRecommendConfig.Get(recommendID);
+        heroIDArr = config.HeroIDList;
+        return true;
+    }
+
+    // 鎺ㄨ崘姝﹀皢鏄惁涓�涓篃娌℃湁
+    public bool HasHeroMin(int recommendID)
+    {
+
+        if (!TryGetHeroIDListByRecommendID(recommendID, out int[] heroIDArr) || heroIDArr.IsNullOrEmpty())
+            return false;
+        foreach (var heroID in heroIDArr)
+        {
+            if (HeroManager.Instance.HasHero(heroID))
+                return true;
+        }
+        return false;
+    }
+
+    public void UseTeam(int recommendID)
+    {
+        if (!LineupRecommendConfig.HasKey(recommendID))
+            return;
+        LineupRecommendConfig config = LineupRecommendConfig.Get(recommendID);
+        int[] heroIDList = config.HeroIDList;
+        int[] posIndexList = config.PosIndexList;
+        if (heroIDList.IsNullOrEmpty() || posIndexList.IsNullOrEmpty() || heroIDList.Length != posIndexList.Length)
+            return;
+
+        bool hasHeroMin = HasHeroMin(recommendID);
+        if (!hasHeroMin)
+        {
+            SysNotifyMgr.Instance.ShowTip("LineupRecommendErr01");
+            return;
+        }
+
+        TeamBase storyTeam = TeamManager.Instance.GetTeam(TeamType.Story);
+        storyTeam.RemoveAllHeroes();
+
+        int currentMaxLineupCount = TeamConst.MaxTeamHeroCount - HeroUIManager.Instance.lockIndexList.Count;
+        for (int i = 0; i < heroIDList.Length; i++)
+        {
+            if (currentMaxLineupCount - storyTeam.GetTeamHeroCount() > 0)
+            {
+                int heroID = heroIDList[i];
+                var hero = HeroManager.Instance.GetHeroByID(heroID);
+                if (hero == null)
+                    continue;
+                storyTeam.AddHero(hero, Mathf.Max(0, posIndexList[i] - 1), true);
+            }
+        }
+
+        storyTeam.SaveTeam();
+    }
+
+    public bool TryGetHeroConfigByIndex(int recommendID, int index, out HeroConfig config)
+    {
+        config = null;
+        if (!TryGetHeroIDListByRecommendID(recommendID, out int[] heroIDArr) || heroIDArr.IsNullOrEmpty())
+            return false;
+        if (index < 0 || index >= heroIDArr.Length)
+            return false;
+        int heroID = heroIDArr[index];
+        if (!HeroConfig.HasKey(heroID))
+            return false;
+        config = HeroConfig.Get(heroID);
+        return true;
+    }
+
+    public LineupRecommendHeroState GetHeroState(int recommendID, int index)
+    {
+        if (!TryGetHeroConfigByIndex(recommendID, index, out HeroConfig config))
+            return LineupRecommendHeroState.NoActivate;
+
+        // heroBookState: 0鏈幏寰椼��1鍙縺娲汇��2甯歌銆�3绐佺牬鍗囩骇銆�4鏄熷崌绾с��5宸叉弧绾�
+        int heroID = config.HeroID;
+        int heroBookState = HeroUIManager.Instance.GetHeroBookState(heroID, config.Quality);
+        bool isHaveAward = IsHaveAward(recommendID, index);
+        bool isHasHero = HeroManager.Instance.HasHero(heroID);
+
+        // 宸茶幏寰楋細鎺ㄨ崘姝﹀皢宸查濂� && 浠嶆嫢鏈夎姝﹀皢
+        // 鏈幏寰楋細鎺ㄨ崘姝﹀皢宸查濂� && 褰撳墠娌℃湁璇ユ灏� (宸茶娑堣��)
+        if (isHaveAward)
+            return isHasHero ? LineupRecommendHeroState.ActivateAndHave : LineupRecommendHeroState.ActivateButNoHave;
+        // 鍙縺娲伙細娌¢鍙� && 鍥鹃壌鐘舵�佸彲婵�娲�/宸叉縺娲�
+        // 鏈縺娲伙細娌¢鍙� && 鍥鹃壌鐘舵�佹湭婵�娲�/鏈幏寰�
+        return heroBookState > 0 ? LineupRecommendHeroState.CanActivate : LineupRecommendHeroState.NoActivate;
+    }
+
+    public bool IsHaveAward(int recommendID, int index)
+    {
+        if (TryGetHaveDictValue(recommendID, out uint awardState))
+        {
+            if (index >= 0 && index < 6)
+            {
+                uint mask = (uint)(1 << index);
+                return (awardState & mask) != 0;
+            }
+        }
+        return false;
+    }
+    readonly int funcId = 1;//姝﹀皢
+    Redpoint redpoint = new Redpoint(MainRedDot.HeroCardRedpoint, MainRedDot.LineupRecommendRepoint);
+    public void UpdateRedPoint()
+    {
+        redpoint.state = RedPointState.None;
+        //姝﹀皢娌″紑涓嶅埛绾㈢偣
+        if (!FuncOpen.Instance.IsFuncOpen(funcId))
+            return;
+
+        if (TryGetJumpIndex(out int index))
+        {
+            redpoint.state = RedPointState.Simple;
+        }
+    }
+
+    //绗竴涓彲棰嗗彇鐨勬灏嗘墍鍦ㄨ绱㈠紩
+    public bool TryGetJumpIndex(out int index)
+    {
+        index = 0;
+        List<int> sortShowList = GetSortShowList();
+        if (sortShowList.IsNullOrEmpty())
+            return false;
+
+        for (int i = 0; i < sortShowList.Count; i++)
+        {
+            int recommendID = sortShowList[i];
+            if (!TryGetHeroIDListByRecommendID(recommendID, out int[] heroIDArr) || heroIDArr.IsNullOrEmpty())
+                continue;
+
+            for (int j = 0; j < heroIDArr.Length; j++)
+            {
+                LineupRecommendHeroState heroState = GetHeroState(recommendID, j);
+                if (heroState == LineupRecommendHeroState.CanActivate)
+                {
+                    index = i;
+                    return true;
+                }
+
+            }
+        }
+        return false;
+    }
+
+
+
+    public void SendGetReward(int recommendID, int index)
+    {
+        var pack = new CA504_tagCMPlayerGetReward();
+        pack.RewardType = 4;
+        pack.DataEx = (uint)recommendID;
+        string indexStr = index.ToString();
+        pack.DataExStr = indexStr;
+        pack.DataExStrLen = (byte)indexStr.Length;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    public void UpdateLineupRecommendInfo(HB129_tagSCLineupRecommendInfo vNetData)
+    {
+        if (vNetData == null || vNetData.RecommendList.IsNullOrEmpty())
+            return;
+
+        foreach (var v in vNetData.RecommendList)
+        {
+            haveDict[v.RecommendID] = v.AwardState;
+        }
+        UpdateRedPoint();
+        OnUpdateLineupRecommendInfoEvent?.Invoke();
+    }
+}
+
diff --git a/Main/System/LineupRecommend/LineupRecommendManager.cs.meta b/Main/System/LineupRecommend/LineupRecommendManager.cs.meta
new file mode 100644
index 0000000..26d5b35
--- /dev/null
+++ b/Main/System/LineupRecommend/LineupRecommendManager.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 662b0c20ef6428948bb5984735291ebb
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/LineupRecommend/LineupRecommendWin.cs b/Main/System/LineupRecommend/LineupRecommendWin.cs
new file mode 100644
index 0000000..ce762ac
--- /dev/null
+++ b/Main/System/LineupRecommend/LineupRecommendWin.cs
@@ -0,0 +1,136 @@
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class LineupRecommendWin : UIBase
+{
+    [SerializeField] AvatarCell avatarCell;
+    [SerializeField] Text txtPlayerName;
+    [SerializeField] Text txtFightPoint;
+    [SerializeField] OfficialTitleCell officialRankText;
+
+    [SerializeField] ScrollerController scroller;
+    LineupRecommendManager manager { get { return LineupRecommendManager.Instance; } }
+    protected override void InitComponent()
+    {
+        base.InitComponent();
+        avatarCell.redpoint.redpointId = MainRedDot.PhantasmPavilionRepoint;
+        avatarCell.button.SetListener(() =>
+        {
+            UIManager.Instance.OpenWindow<PlayerProfileWin>();
+        });
+    }
+
+    protected override void OnPreOpen()
+    {
+        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
+        scroller.OnRefreshCell += OnRefreshCell;
+        scroller.OnGetDynamicSize += OnGetDynamicSize;
+        manager.OnUpdateLineupRecommendInfoEvent += OnUpdateLineupRecommendInfoEvent;
+        manager.OnUpdateSwitchOnOrOffEvent += OnUpdateSwitchOnOrOffEvent;
+
+        manager.ClearOnList();
+        UpdatePlayerInfo();
+        scroller.lockType = EnhanceLockType.KeepVertical;
+        CreateScoller();
+        int index = 0;
+        manager.TryGetJumpIndex(out index);
+        scroller.JumpIndex(index);
+    }
+
+
+    protected override void OnPreClose()
+    {
+        PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh;
+        scroller.OnRefreshCell -= OnRefreshCell;
+        scroller.OnGetDynamicSize -= OnGetDynamicSize;
+        manager.OnUpdateLineupRecommendInfoEvent -= OnUpdateLineupRecommendInfoEvent;
+        manager.OnUpdateSwitchOnOrOffEvent -= OnUpdateSwitchOnOrOffEvent;
+
+    }
+
+    private void OnUpdateSwitchOnOrOffEvent()
+    {
+        CreateScoller();
+    }
+
+    private void OnUpdateLineupRecommendInfoEvent()
+    {
+        RefreshScoller();
+    }
+
+    private void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell.GetComponent<LineupRecommendCell>();
+        _cell?.Display(cell.index);
+    }
+
+    private bool OnGetDynamicSize(ScrollerDataType type, int index, out float height)
+    {
+        height = 0;
+        List<int> sortShowList = manager.GetSortShowList();
+        if (index < 0 || index >= sortShowList.Count)
+            return false;
+        var id = sortShowList[index];
+        bool isOn = manager.IsOn(id);
+        height = isOn ? 432 : 252;
+        return true;
+    }
+
+    void PlayerDataRefresh(PlayerDataType type)
+    {
+        switch (type)
+        {
+            case PlayerDataType.FightPower:
+                txtFightPoint.text = UIHelper.ReplaceLargeArtNum(PlayerDatas.Instance.baseData.FightPower);
+                break;
+            case PlayerDataType.RealmLevel:
+                officialRankText.InitUI(PlayerDatas.Instance.baseData.realmLevel, PlayerDatas.Instance.baseData.TitleID);
+                break;
+            case PlayerDataType.Face:
+            case PlayerDataType.FacePic:
+                avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
+                                                                PlayerDatas.Instance.baseData.face,
+                                                                PlayerDatas.Instance.baseData.facePic));
+                break;
+            case PlayerDataType.ExAttr3:
+                officialRankText.InitUI(PlayerDatas.Instance.baseData.realmLevel, PlayerDatas.Instance.baseData.TitleID);
+                break;
+        }
+
+    }
+
+    void RefreshScoller()
+    {
+        scroller.m_Scorller.RefreshActiveCellViews();
+    }
+
+    void CreateScoller()
+    {
+        scroller.Refresh();
+        var list = manager.GetSortShowList();
+        if (!list.IsNullOrEmpty())
+        {
+            for (int i = 0; i < list.Count; i++)
+            {
+                scroller.AddCell(ScrollerDataType.Header, i);
+            }
+        }
+        scroller.Restart();
+    }
+
+    private void UpdatePlayerInfo()
+    {
+        // 浠庣帺瀹舵暟鎹腑鑾峰彇淇℃伅骞舵洿鏂癠I
+        avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
+                                                        PlayerDatas.Instance.baseData.face,
+                                                        PlayerDatas.Instance.baseData.facePic));
+
+        txtPlayerName.text = PlayerDatas.Instance.baseData.PlayerName;
+        txtFightPoint.text = UIHelper.ReplaceLargeArtNum(PlayerDatas.Instance.baseData.FightPower);
+
+        officialRankText.InitUI(PlayerDatas.Instance.baseData.realmLevel, PlayerDatas.Instance.baseData.TitleID);
+    }
+
+
+}
\ No newline at end of file
diff --git a/Main/System/LineupRecommend/LineupRecommendWin.cs.meta b/Main/System/LineupRecommend/LineupRecommendWin.cs.meta
new file mode 100644
index 0000000..e10dd19
--- /dev/null
+++ b/Main/System/LineupRecommend/LineupRecommendWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: def9cd8112cd17a48b0d023c0eb20781
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Redpoint/MainRedDot.cs b/Main/System/Redpoint/MainRedDot.cs
index ec63ea3..13ef6ee 100644
--- a/Main/System/Redpoint/MainRedDot.cs
+++ b/Main/System/Redpoint/MainRedDot.cs
@@ -130,6 +130,7 @@
     public const int ArenaRepoint = 470; //婕旀鍦�
     public const int TianziBillboradRepoint = 471; //澶╁瓙鐨勮�冮獙
     public const int PhantasmPavilionRepoint = 472; //骞诲闃�
+    public const int LineupRecommendRepoint = 473; //闃靛鎺ㄨ崘
     public void Register()
     {
 

--
Gitblit v1.8.0