From 8589ec3bb98ff6c0207d0783838454204956418e Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期四, 29 一月 2026 15:43:52 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts

---
 Main/System/Guild/GuildNoteNormalCell.cs                |   30 +
 Main/System/BoneField/AdsManager.cs                     |    2 
 Main/System/HeroUI/HeroGiftLineCell.cs                  |    4 
 Main/System/Guild/GuildNoteNormalCell.cs.meta           |   11 
 Main/System/PhantasmPavilion/PhantasmPavilionManager.cs |    2 
 Main/System/FuncPreset/FuncPresetChooseCells.cs         |    5 
 Main/System/Guild/GuildNoteHeaderCell.cs                |   14 
 Main/System/Mingge/MinggeEquipWin.cs                    |   14 
 Main/System/Mingge/MinggeManager.cs                     |  617 ++++++++++++++++++++
 Main/Config/Configs/FBDJGEffectConfig.cs                |    5 
 Main/System/Guild/PlayerFairyData.cs                    |    3 
 Main/System/Message/GMNotify.cs                         |    4 
 Main/System/Guild/GuildManager.cs                       |    7 
 Main/System/Mingge/MinggeAutoSetCell.cs                 |   58 +
 Main/Config/Configs/HeroTalentConfig.cs                 |   11 
 Main/System/KnapSack/PackManager.cs                     |    2 
 Main/System/InternalAffairs/AffairBaseWin.cs            |   25 
 Main/System/Mingge/MinggeWin.cs                         |   84 ++
 Main/System/Mingge/MinggePrayWin.cs                     |   49 -
 Main/System/Guild/GuildNoteHeaderCell.cs.meta           |   11 
 Main/System/Guild/GuildOPWin.cs                         |    2 
 Main/System/Guild/GuildNoteWin.cs.meta                  |   11 
 Main/System/Mingge/MinggeAutoSetWin.cs                  |  530 +++++++++++++++++
 Main/System/BeautyMM/BeautyMMTravelWin.cs               |   11 
 Main/System/Guild/GuildNoteWin.cs                       |  227 +++++++
 Main/System/HeroUI/HeroGiftWin.cs                       |   16 
 Main/System/Main/MainWin.cs                             |    8 
 Main/System/Mingge/MinggeAutoSetWin.cs.meta             |   11 
 Main/System/WarlordPavilion/WarlordPavilionManager.cs   |    2 
 Main/System/Mingge/MinggeAutoSetCell.cs.meta            |   11 
 30 files changed, 1,711 insertions(+), 76 deletions(-)

diff --git a/Main/Config/Configs/FBDJGEffectConfig.cs b/Main/Config/Configs/FBDJGEffectConfig.cs
index b06b61c..8e2d17a 100644
--- a/Main/Config/Configs/FBDJGEffectConfig.cs
+++ b/Main/Config/Configs/FBDJGEffectConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           Thursday, January 8, 2026
+//    [  Date ]:           2026骞�1鏈�28鏃�
 //--------------------------------------------------------
 
 using System.Collections.Generic;
@@ -21,6 +21,7 @@
 	public int EffQuality;
 	public int AttrID;
 	public int AttrValue;
+	public int RandWeight;
 
     public override int LoadKey(string _key)
     {
@@ -41,6 +42,8 @@
 			int.TryParse(tables[3],out AttrID); 
 
 			int.TryParse(tables[4],out AttrValue); 
+
+			int.TryParse(tables[5],out RandWeight); 
         }
         catch (Exception exception)
         {
diff --git a/Main/Config/Configs/HeroTalentConfig.cs b/Main/Config/Configs/HeroTalentConfig.cs
index 0462a49..459636a 100644
--- a/Main/Config/Configs/HeroTalentConfig.cs
+++ b/Main/Config/Configs/HeroTalentConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           2025骞�8鏈�5鏃�
+//    [  Date ]:           Wednesday, January 28, 2026
 //--------------------------------------------------------
 
 using System.Collections.Generic;
@@ -21,6 +21,9 @@
 	public int Quality;
 	public int AttrID;
 	public int AttrValue;
+	public int InitWeight;
+	public int WashWeight;
+	public int AweakWeight;
 
     public override int LoadKey(string _key)
     {
@@ -41,6 +44,12 @@
 			int.TryParse(tables[3],out AttrID); 
 
 			int.TryParse(tables[4],out AttrValue); 
+
+			int.TryParse(tables[5],out InitWeight); 
+
+			int.TryParse(tables[6],out WashWeight); 
+
+			int.TryParse(tables[7],out AweakWeight); 
         }
         catch (Exception exception)
         {
diff --git a/Main/System/BeautyMM/BeautyMMTravelWin.cs b/Main/System/BeautyMM/BeautyMMTravelWin.cs
index aaf6dab..d7b6fb3 100644
--- a/Main/System/BeautyMM/BeautyMMTravelWin.cs
+++ b/Main/System/BeautyMM/BeautyMMTravelWin.cs
@@ -172,10 +172,21 @@
             {
                 continue;
             }
+            if (index >= rateNameText.Length)
+            {
+                break;
+            }
             rateNameText[index].text = ItemConfig.Get(config.AwardItemID).ItemName + "x" + config.AwardItemCnt;
             rateText[index].text = config.ShowRate;
             index++;
         }
+
+        for (int i = index; i < rateNameText.Length; i++)
+        {
+            rateNameText[i].text = "";
+            rateText[i].text = "";
+        }
+
         horseRateText.text = TravelEventConfig.Get(101).ShowRate;
     }
 
diff --git a/Main/System/BoneField/AdsManager.cs b/Main/System/BoneField/AdsManager.cs
index cdeecb9..1219506 100644
--- a/Main/System/BoneField/AdsManager.cs
+++ b/Main/System/BoneField/AdsManager.cs
@@ -29,7 +29,7 @@
     {
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEvent;
         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= UpdateRedpoint;
-        DungeonManager.Instance.UpdateFBInfoListEvent += OnUpdateFBInfoChangeEvent;
+        DungeonManager.Instance.UpdateFBInfoListEvent -= OnUpdateFBInfoChangeEvent;
         FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
     }
 
diff --git a/Main/System/FuncPreset/FuncPresetChooseCells.cs b/Main/System/FuncPreset/FuncPresetChooseCells.cs
index 23f94a1..bc2cfbc 100644
--- a/Main/System/FuncPreset/FuncPresetChooseCells.cs
+++ b/Main/System/FuncPreset/FuncPresetChooseCells.cs
@@ -44,6 +44,11 @@
         curFuncType = funcType;
 
         var selectID = FuncPresetManager.Instance.GetFuncPresetIDByBattleType(battleType, funcType);
+        if (unFoldID != 0 && selectID != unFoldID)
+        {
+            //鍏朵粬鍦版柟鍒囨崲浜嗘柟妗堬紝闇�瑕侀獙璇佸綋鍓嶅睍寮�鏄笉鏄悓涓�涓�
+            unFoldID = 0;
+        }
         var showCount = FuncPresetManager.Instance.GetShowFuncPresetCount(funcType);
         unFoldBtn.SetActive(showCount > 4);
         unFoldBtn.AddListener(() =>
diff --git a/Main/System/Guild/GuildManager.cs b/Main/System/Guild/GuildManager.cs
index f6e8e11..c3141b7 100644
--- a/Main/System/Guild/GuildManager.cs
+++ b/Main/System/Guild/GuildManager.cs
@@ -180,7 +180,7 @@
     public int zbgOrgPriceValue;
     public int zbgChangFamilyCD;
     public List<int> cutCntListForTalk = new List<int>();
-
+    public int familyRecordMaxCount;
 
     void ParseConfig()
     {
@@ -219,6 +219,9 @@
         zbgOrgPriceValue = int.Parse(config.Numerical2);
         zbgChangFamilyCD = int.Parse(config.Numerical3);
         cutCntListForTalk = JsonMapper.ToObject<List<int>>(config.Numerical4);
+
+        config = FuncConfigConfig.Get("FamilyNote");
+        familyRecordMaxCount = int.Parse(config.Numerical1);
     }
 
 
@@ -865,7 +868,7 @@
             return false;
         }
         bool restart = false;
-        
+
         for (int i = 0; i < vNetData.FamilyActionList.Length; i++)
         {
             int playerID = (int)vNetData.FamilyActionList[i].Value1;
diff --git a/Main/System/Guild/GuildNoteHeaderCell.cs b/Main/System/Guild/GuildNoteHeaderCell.cs
new file mode 100644
index 0000000..650ae82
--- /dev/null
+++ b/Main/System/Guild/GuildNoteHeaderCell.cs
@@ -0,0 +1,14 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+public class GuildNoteHeaderCell : MonoBehaviour
+{
+    [SerializeField] TextEx date;
+    public void Display(int index, List<GuildNoteData> datas)
+    {
+        if (datas.IsNullOrEmpty() || index < 0 || index >= datas.Count)
+            return;
+        date.text = datas[index].Info;
+    }
+
+}
\ No newline at end of file
diff --git a/Main/System/Guild/GuildNoteHeaderCell.cs.meta b/Main/System/Guild/GuildNoteHeaderCell.cs.meta
new file mode 100644
index 0000000..086a892
--- /dev/null
+++ b/Main/System/Guild/GuildNoteHeaderCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c3a277ed730042a4987a4cc292e794a5
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Guild/GuildNoteNormalCell.cs b/Main/System/Guild/GuildNoteNormalCell.cs
new file mode 100644
index 0000000..124ec3c
--- /dev/null
+++ b/Main/System/Guild/GuildNoteNormalCell.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class GuildNoteNormalCell : MonoBehaviour
+{
+    [SerializeField] TextEx time;
+    [SerializeField] TextEx content;
+
+    public void Display(int index, List<GuildNoteData> datas)
+    {
+        if (datas.IsNullOrEmpty() || index < 0 || index >= datas.Count)
+            return;
+
+        DateTime currentTime = TimeUtility.GetTime(datas[index].Time);
+        time.text = currentTime.ToString("HH:mm");
+        content.text = datas[index].Info;
+    }
+
+    public float GetHeight(string info)
+    {
+        float height = 0f;
+        if (string.IsNullOrEmpty(info))
+            return height;
+
+        content.text = info;
+        height = content.preferredHeight;
+        return height;
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Guild/GuildNoteNormalCell.cs.meta b/Main/System/Guild/GuildNoteNormalCell.cs.meta
new file mode 100644
index 0000000..32b7684
--- /dev/null
+++ b/Main/System/Guild/GuildNoteNormalCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e8536aad1963a3244986aedefefbcd5c
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Guild/GuildNoteWin.cs b/Main/System/Guild/GuildNoteWin.cs
new file mode 100644
index 0000000..73bcaac
--- /dev/null
+++ b/Main/System/Guild/GuildNoteWin.cs
@@ -0,0 +1,227 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Cysharp.Threading.Tasks;
+using UnityEngine;
+
+/// <summary>
+/// 鍏細鏃ュ織鐣岄潰
+/// </summary>
+public class GuildNoteWin : UIBase
+{
+    [SerializeField] Color32 nameColor;
+    [SerializeField] Transform noNote;
+    [SerializeField] Transform hasNote;
+    [SerializeField] GuildNoteNormalCell guildNoteNormalCell;
+    [SerializeField] ScrollerController scroller;
+    [SerializeField] TextEx maxCount;
+    protected override void OnPreOpen()
+    {
+        GuildManager.Instance.EnterOrQuitGuildEvent += OnEnterOrQuitGuildEvent;
+        GuildManager.Instance.FamilyActionInfoEvent += OnFamilyActionInfoEvent;
+        scroller.OnGetDynamicSize += OnGetChatDynamicSize;
+        scroller.OnRefreshCell += OnRefreshCell;
+
+        maxCount.text = Language.Get("Guild_82", GuildManager.Instance.familyRecordMaxCount);
+
+        GuildManager.Instance.QueryFamilyAction(PlayerDatas.Instance.fairyData.fairy.FamilyID, GuildManager.MemberChangeActionType);
+    }
+
+
+    protected override void OnPreClose()
+    {
+        GuildManager.Instance.EnterOrQuitGuildEvent -= OnEnterOrQuitGuildEvent;  
+        GuildManager.Instance.FamilyActionInfoEvent -= OnFamilyActionInfoEvent;
+        scroller.OnGetDynamicSize -= OnGetChatDynamicSize;
+        scroller.OnRefreshCell -= OnRefreshCell;
+    }
+
+    private void OnEnterOrQuitGuildEvent(bool isEnter)
+    {
+        DelayCloseWindow().Forget();
+    }
+
+    private bool OnGetChatDynamicSize(ScrollerDataType type, int index, out float height)
+    {
+        height = 0;
+        if (list.IsNullOrEmpty() || index < 0 || index >= list.Count)
+            return false;
+        var data = list[index];
+        switch (type)
+        {
+            case ScrollerDataType.Header:
+                height = 19;
+                return true;
+            case ScrollerDataType.Normal:
+                height = guildNoteNormalCell.GetHeight(data.Info);
+                return true;
+        }
+        return true;
+    }
+
+    private void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        if (type == ScrollerDataType.Header)
+        {
+            var _cell = cell.GetComponent<GuildNoteHeaderCell>();
+            _cell?.Display(cell.index, list);
+        }
+        else
+        {
+            var _cell = cell.GetComponent<GuildNoteNormalCell>();
+            _cell?.Display(cell.index, list);
+        }
+    }
+
+    private void OnFamilyActionInfoEvent(int familyID, int actionType)
+    {
+        if (familyID != PlayerDatas.Instance.fairyData.fairy.FamilyID)
+            return;
+        if (actionType != GuildManager.MemberChangeActionType)
+            return;
+        Display();
+    }
+
+    List<GuildNoteData> list;
+    private void Display()
+    {
+        if (!GuildManager.Instance.TryGetFamilyActions(GuildManager.MemberChangeActionType, out var actions))
+        {
+            hasNote.SetActive(false);
+            noNote.SetActive(true);
+            return;
+        }
+
+        list = GetShowGuildNoteDataList(actions);
+        bool isNullOrEmpty = list.IsNullOrEmpty();
+        if (isNullOrEmpty)
+        {
+            hasNote.SetActive(false);
+            noNote.SetActive(true);
+            return;
+        }
+
+        scroller.Refresh();
+        if (!isNullOrEmpty)
+        {
+            for (int i = 0; i < list.Count; i++)
+            {
+                if (list[i].ShowType == 0)
+                {
+                    scroller.AddCell(ScrollerDataType.Header, i);
+                }
+                else
+                {
+                    scroller.AddCell(ScrollerDataType.Normal, i);
+                }
+            }
+        }
+        scroller.Restart();
+
+        noNote.SetActive(isNullOrEmpty);
+        hasNote.SetActive(!isNullOrEmpty);
+
+    }
+
+
+    private List<GuildNoteData> GetShowGuildNoteDataList(HA513_tagMCFamilyActionInfo.tagMCFamilyAction[] actions)
+    {
+        List<GuildNoteData> list = GetGuildNoteDataList(actions);
+        if (list.IsNullOrEmpty())
+            return null;
+
+        var result = new List<GuildNoteData>();
+
+        int lastDay = -1;
+
+        foreach (var noteData in list)
+        {
+            // 鑾峰彇褰撳墠鏉$洰鎵�灞炴棩鏈�
+            DateTime currentTime = TimeUtility.GetTime(noteData.Time);
+            int currentDay = TimeUtility.GetPassDays((int)noteData.Time);
+
+            // 妫�鏌ユ槸鍚﹂渶瑕佹彃鍏ユ棩鏈熸爣棰�
+            if (lastDay == -1 || currentDay != lastDay)
+            {
+                // 鑾峰彇鐩爣澶╃殑鍑屾櫒鏃堕棿鎴�
+                DateTime dayStartTime = TimeUtility.GetDayStartTime(currentTime.Year, currentTime.Month, currentTime.Day);
+                int dayStartSeconds = (int)(dayStartTime - TimeUtility.OriginalTime).TotalSeconds;
+
+                result.Add(new GuildNoteData
+                {
+                    ShowType = 0, // 鏍囬绫诲瀷
+                    Time = (uint)dayStartSeconds,
+                    Info = currentTime.ToString("yyyy-MM-dd"),
+                });
+            }
+
+            result.Add(noteData);
+            lastDay = currentDay;
+        }
+
+        return result;
+    }
+
+    private List<GuildNoteData> GetGuildNoteDataList(HA513_tagMCFamilyActionInfo.tagMCFamilyAction[] actions)
+    {
+        if (actions.IsNullOrEmpty())
+            return null;
+
+        var result = new List<GuildNoteData>();
+        int maxCount = GuildManager.Instance.familyRecordMaxCount;
+        // 鍊掑簭閬嶅巻actions锛屽苟闄愬埗鏁伴噺
+        int count = 0;
+        for (int i = actions.Length - 1; i >= 0 && count < maxCount; i--)
+        {
+            var action = actions[i];
+            string info = GetInfo(action);
+            result.Add(new GuildNoteData
+            {
+                ShowType = 1, // 鍐呭绫诲瀷
+                Time = action.Time,
+                Info = info,
+            });
+            count++;
+        }
+        return result.OrderBy(a => a.Time).ToList();
+    }
+
+    private string GetInfo(HA513_tagMCFamilyActionInfo.tagMCFamilyAction data)
+    {
+        if (data == null || data.Value1 != 2)
+            return string.Empty;
+        switch (data.Value2)
+        {
+            case 0:
+                return Language.Get("Guild_52", GetColorStr(data.Name));
+            case 1:
+                return Language.Get("Guild_53", GetColorStr(data.Name));
+            case 2:
+                return Language.Get("Guild_55", GetColorStr(data.Name));
+            case 4:
+                if (data.Value3 > data.Value4)
+                {
+                    return Language.Get("Guild_54", GetColorStr(data.Name), GetColorStr(RichTextMsgReplaceConfig.GetRichReplace("FAMILY", (int)data.Value3)));
+                }
+                else
+                {
+                    return Language.Get("Guild_83", GetColorStr(data.Name), GetColorStr(RichTextMsgReplaceConfig.GetRichReplace("FAMILY", (int)data.Value3)));
+                }
+            case 3:
+            default:
+                return string.Empty;
+        }
+    }
+
+    private string GetColorStr(string name)
+    {
+        return UIHelper.AppendColor(nameColor, name);
+    }
+}
+
+public class GuildNoteData
+{
+    public uint Time;          //鏃堕棿鎴�
+    public int ShowType;       //鏄剧ず鐢ㄩ�旂被鍨� 0-鏍囬锛堝勾-鏈�-鏃ワ級 1-鍐呭
+    public string Info;        //淇℃伅
+}
\ No newline at end of file
diff --git a/Main/System/Guild/GuildNoteWin.cs.meta b/Main/System/Guild/GuildNoteWin.cs.meta
new file mode 100644
index 0000000..7c4bfd2
--- /dev/null
+++ b/Main/System/Guild/GuildNoteWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f0e090843a250514f8fabb9b8713e625
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Guild/GuildOPWin.cs b/Main/System/Guild/GuildOPWin.cs
index 2298c04..aecd11e 100644
--- a/Main/System/Guild/GuildOPWin.cs
+++ b/Main/System/Guild/GuildOPWin.cs
@@ -43,7 +43,7 @@
         
         noteBtn.AddListener(() =>
         {
-            // UIManager.Instance.OpenWindow<GuildNoteWin>();
+            UIManager.Instance.OpenWindow<GuildNoteWin>();
         });
         
     }
diff --git a/Main/System/Guild/PlayerFairyData.cs b/Main/System/Guild/PlayerFairyData.cs
index d27d51d..29e2508 100644
--- a/Main/System/Guild/PlayerFairyData.cs
+++ b/Main/System/Guild/PlayerFairyData.cs
@@ -29,6 +29,7 @@
 
     // 0-鎴愬憳锛�1-绮捐嫳锛�2-鍓洘涓伙紝3-鐩熶富
     public int leaderID;
+    public string leaderName;
     // // 绮捐嫳
     public List<int> elitePlayerIDList = new List<int>();
     // // 鍓洘涓�
@@ -102,6 +103,7 @@
             if (member.FmLV == 3)
             {
                 leaderID = (int)member.PlayerID;
+                leaderName = member.Name;
             }
         }
 
@@ -142,6 +144,7 @@
         memberDic.Clear();
         memberIDList.Clear();
         leaderID = 0;
+        leaderName = string.Empty;
     }
 
     int SortMember(int id1, int id2)
diff --git a/Main/System/HeroUI/HeroGiftLineCell.cs b/Main/System/HeroUI/HeroGiftLineCell.cs
index ce685b9..c86faa0 100644
--- a/Main/System/HeroUI/HeroGiftLineCell.cs
+++ b/Main/System/HeroUI/HeroGiftLineCell.cs
@@ -6,10 +6,10 @@
     [SerializeField] GiftBaseCell[] cardList;
 
     public void Display(int index, List<int> configList)
-    { 
+    {
         for (int i = 0; i < cardList.Length; i++)
         {
-            if (index < configList.Count)
+            if (index + i < configList.Count)
             {
                 var giftID = configList[index + i];
                 var giftLV = HeroUIManager.Instance.maxGiftLevel;
diff --git a/Main/System/HeroUI/HeroGiftWin.cs b/Main/System/HeroUI/HeroGiftWin.cs
index e5b2c2c..74dc167 100644
--- a/Main/System/HeroUI/HeroGiftWin.cs
+++ b/Main/System/HeroUI/HeroGiftWin.cs
@@ -17,7 +17,7 @@
     protected override void OnPreOpen()
     {
         scroller.OnRefreshCell += OnRefreshCell;
-        
+
         CreateScroller();
     }
 
@@ -27,10 +27,22 @@
 
     }
 
+    private List<int> GetKeys()
+    {
+        List<int> res = new List<int>();
+        foreach (var config in HeroTalentConfig.GetValues())
+        {
+            if (config.InitWeight == 0 || config.WashWeight == 0 || config.AweakWeight == 0)
+                continue;
+            res.Add(config.TalentID);
+        }
+        return res;
+    }
+
     List<int> configList = new List<int>();
     void CreateScroller()
     {
-        configList = HeroTalentConfig.GetKeys().ToList();
+        configList = GetKeys();
         var totalCount = configList.Count;
 
         scroller.Refresh();
diff --git a/Main/System/InternalAffairs/AffairBaseWin.cs b/Main/System/InternalAffairs/AffairBaseWin.cs
index 70f9f57..e9d19ed 100644
--- a/Main/System/InternalAffairs/AffairBaseWin.cs
+++ b/Main/System/InternalAffairs/AffairBaseWin.cs
@@ -26,6 +26,7 @@
     [SerializeField] HeroSkinModel[] funcNPCs;
     [SerializeField] Transform[] talkRects;
     [SerializeField] Text[] talkTexts;
+    [SerializeField] UIEffectPlayer autoMGEffect;
 
     protected override void InitComponent()
     {
@@ -58,12 +59,14 @@
         GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
         PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefreshEvent;
         GlobalTimeEvent.Instance.fiveSecondEvent += OnFiveSecondEvent;
+        MinggeManager.Instance.ChangeAutoEvent += ChangeAutoEvent;
         
         Display();
         if (GoldRushManager.Instance.openAutoGoldRush)
-        { 
+        {
             GoldRushManager.Instance.GetAllAward();
         }
+        ChangeAutoEvent();
     }
 
     protected override void OnPreClose()
@@ -73,8 +76,28 @@
         GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
         PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefreshEvent;
         GlobalTimeEvent.Instance.fiveSecondEvent -= OnFiveSecondEvent;
+        MinggeManager.Instance.ChangeAutoEvent -= ChangeAutoEvent;
     }
 
+    void ChangeAutoEvent()
+    {
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Mingge))
+        {
+            return;
+        }
+        if (MinggeManager.Instance.isStartAuto)
+        {
+            autoMGEffect.Play();
+            funcNPCs[5].GetModel().PlayAnimation("suanming", true);
+        }
+        else
+        {
+            autoMGEffect.Stop();
+            funcNPCs[5].GetModel().PlayAnimation("idle", true);
+        }
+    }
+
+
     protected override void OnOpen()
     {
         GoldRushManager.Instance.ResumeAutoWorking();
diff --git a/Main/System/KnapSack/PackManager.cs b/Main/System/KnapSack/PackManager.cs
index f9dc130..f7af21d 100644
--- a/Main/System/KnapSack/PackManager.cs
+++ b/Main/System/KnapSack/PackManager.cs
@@ -182,6 +182,8 @@
         {
             refrechPackEvent(packType);
         }
+
+        RefreshItemEvent?.Invoke(packType, -1, -1); //鍙仛涓�娆¢�氱煡鐢�
         
         DelayNotifyPackChange(packType);
     }
diff --git a/Main/System/Main/MainWin.cs b/Main/System/Main/MainWin.cs
index 27c94bb..130b27a 100644
--- a/Main/System/Main/MainWin.cs
+++ b/Main/System/Main/MainWin.cs
@@ -32,6 +32,7 @@
     [SerializeField] Text multiFightText;
 
     [SerializeField] Transform gameTip; //10杩�
+    [SerializeField] Transform mgTip;
 
     bool isForcePlayFightUIAnim = true; //寮哄埗鎾斁鎴樻枟閿ゅ瓙妗嗗姩鐢�
 
@@ -69,6 +70,7 @@
         EventBroadcast.Instance.AddListener<string>(EventName.BATTLE_START, OnBattleStart);
         base.OnPreOpen();
 
+        mgTip.SetActive(false);
         // 鍒锋柊UI
         Display();
     }
@@ -107,6 +109,8 @@
                 GlobalTimeEvent.Instance.fiveSecondEvent -= OnFiveSecondEvent;
             }
         }
+        
+        mgTip.SetActive(MinggeManager.Instance.isPauseAuto);
     }
 
     void DisplayTopBar()
@@ -120,6 +124,10 @@
         {
             multiFightText.text = Language.Get("MultiFight", AutoFightModel.Instance.fightCost);
         }
+        if (_ui.name == "MinggeWin")
+        {
+            mgTip.SetActive(false);
+        }
     }
 
     //鎴樻枟鎸夐挳鍔ㄧ敾
diff --git a/Main/System/Message/GMNotify.cs b/Main/System/Message/GMNotify.cs
index e541c2e..05d82d6 100644
--- a/Main/System/Message/GMNotify.cs
+++ b/Main/System/Message/GMNotify.cs
@@ -15,8 +15,8 @@
     public override void Release()
     {
         GlobalTimeEvent.Instance.secondEvent -= SecondEvent;
-        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin;
-        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin;
+        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk;
     }
 
     public void OnBeforePlayerDataInitializeEventOnRelogin()
diff --git a/Main/System/Mingge/MinggeAutoSetCell.cs b/Main/System/Mingge/MinggeAutoSetCell.cs
new file mode 100644
index 0000000..2e2d3d9
--- /dev/null
+++ b/Main/System/Mingge/MinggeAutoSetCell.cs
@@ -0,0 +1,58 @@
+锘縰sing UnityEngine;
+using UnityEngine.UI;
+using System;
+
+
+//鍛芥牸鑷姩鐨勫悇涓�夐」鍐呭锛岀粺涓�鐢ㄤ竴涓寜绫诲瀷鍖哄垎
+public class MinggeAutoSetCell : CellView
+{
+    [SerializeField] Text contentText;
+    [SerializeField] Image selectImg;
+    [SerializeField] Button selectBtn;
+
+    //type 婊氬姩鏉$敤閫旂被鍨�
+    //index 鏍规嵁绫诲瀷鑷畾涔�
+    public void Display(int type, int index, MinggeAutoSet autoSet, Action<int> onSelect)
+    {
+        if (type == 1)
+        {
+            //鍝佽川
+            string qualityName = Language.Get("L1039", MGGuayuQualityConfig.Get(index).ColorName);
+            contentText.text = Language.Get("Mingge30", UIHelper.AppendColor(index, qualityName, true, 2));
+            selectImg.SetActive(autoSet.quanlity == index);
+        }
+        else if (type == 2)
+        {
+            //鎴樻枟灞炴��
+            contentText.text = index == 0 ? Language.Get("Mingge33") : PlayerPropertyConfig.Get(index).Name;
+            selectImg.SetActive(autoSet.fightAttrID == index);
+        }
+        else if (type == 3)
+        {
+            //鎶楁�у睘鎬�
+            contentText.text = index == 0 ? Language.Get("Mingge33") : PlayerPropertyConfig.Get(index).Name;
+            selectImg.SetActive(autoSet.deFightAttrID == index);
+        }
+        else if (type == 4)
+        {
+            //鍛芥牸鎶�鑳�
+            contentText.text = index == 0 ? Language.Get("Mingge33") : Language.Get($"MinggeSkillType_{index}");
+            selectImg.SetActive(autoSet.skillID == index);
+        }
+        else if (type == 5)
+        {
+            //娑堣�楁暟閲�
+            contentText.text = index.ToString();
+            selectImg.SetActive(MinggeManager.Instance.autoCostCount == index);
+        }
+
+        selectBtn.AddListener(() =>
+        {
+            onSelect?.Invoke(index);
+        });
+    }
+
+
+
+}
+
diff --git a/Main/System/Mingge/MinggeAutoSetCell.cs.meta b/Main/System/Mingge/MinggeAutoSetCell.cs.meta
new file mode 100644
index 0000000..fe6b193
--- /dev/null
+++ b/Main/System/Mingge/MinggeAutoSetCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 77c0bb1754a43d14985f5b7a2942530e
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Mingge/MinggeAutoSetWin.cs b/Main/System/Mingge/MinggeAutoSetWin.cs
new file mode 100644
index 0000000..5c23717
--- /dev/null
+++ b/Main/System/Mingge/MinggeAutoSetWin.cs
@@ -0,0 +1,530 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+using UnityEngine.UI;
+
+
+public class MinggeAutoSetWin : UIBase
+{
+    [SerializeField] ScrollRect scrollRect;
+    [SerializeField] GroupButtonEx[] presetBtns;
+    List<Text> presetNameTexts = new List<Text>();
+    [SerializeField] Button selectQualityBtn;   //鍝佽川閫夋嫨
+    [SerializeField] Text qualityText;
+    [SerializeField] ScrollerController qualityScroller;
+    [SerializeField] Toggle startToggle;
+    [SerializeField] Toggle fightPowerToggle;   //鎴樻枟鍔�
+    [SerializeField] Toggle andFPToggle;
+    [SerializeField] Toggle orFPToggle;
+    [SerializeField] Toggle attrToggle;  //灞炴��
+    [SerializeField] Button fightAttrBtn;   //鍏ぇ鎴樻枟灞炴�� + 鍏堟墜
+    [SerializeField] Text fightAttrText;
+    [SerializeField] ScrollerController fightAttrScroller;
+    [SerializeField] Button deFightAttrBtn;   //鍏ぇ鎴樻枟鎶楁�у睘鎬�
+    [SerializeField] Text deFightAttrText;
+    [SerializeField] ScrollerController deFightAttrScroller;
+    [SerializeField] Toggle skillToggle;   //鎶�鑳�
+    [SerializeField] Button skillBtn;
+    [SerializeField] Text skillText;
+    [SerializeField] ScrollerController skillScroller;
+    [SerializeField] Toggle andSkillToggle;
+    [SerializeField] Toggle orSkillToggle;
+    [SerializeField] Toggle useMoreItemToggle;   //浣跨敤鏇村鐗╁搧 涓嶅嬀閫夐粯璁ゆ秷鑰�1涓�
+    [SerializeField] Button useMoreItemBtn;
+    [SerializeField] Text useMoreItemText;
+    [SerializeField] ScrollerController useMoreItemScroller;
+    [SerializeField] Text itemNameText;
+    [SerializeField] Toggle speedUPToggle;   //鍔犻�� 鐗规晥鎾斁鍔犻��
+    [SerializeField] Button startBtn;
+    [SerializeField] Button cancelBtn;
+
+    MinggeAutoSet autoSetData;
+    int selectPresetID = 0;
+
+    protected override void InitComponent()
+    {
+        presetNameTexts.Clear();
+        for (int i = 0; i < presetBtns.Length; i++)
+        {
+            int index = i + 1;
+            presetBtns[i].AddListener(() =>
+            {
+                selectPresetID = index;
+                Display();
+            });
+            presetNameTexts.Add(presetBtns[i].GetComponentInChildren<Text>());
+        }
+        selectQualityBtn.AddListener(() =>
+        {
+            qualityScroller.SetActive(true);
+        });
+        startToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            ClickStartToggle(isOn);
+        });
+        fightPowerToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            autoSetData.fightPowerToggle = isOn;
+            FixAndOrFBToggle();
+            FixAndOrSkillToggle();
+        });
+
+        andFPToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            ClickAndOrFPToggle(isOn);
+        });
+        orFPToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            ClickAndOrFPToggle(isOn);
+        });
+
+        attrToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            autoSetData.fightAttrToggle = isOn;
+            FixAndOrFBToggle();
+            FixAndOrSkillToggle();
+        });
+
+        fightAttrBtn.AddListener(() =>
+        {
+            fightAttrScroller.SetActive(true);
+        });
+        deFightAttrBtn.AddListener(() =>
+        {
+            deFightAttrScroller.SetActive(true);
+        });
+
+        skillToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            autoSetData.skillToggle = isOn;
+            FixAndOrFBToggle();
+            FixAndOrSkillToggle();
+        });
+
+        skillBtn.AddListener(() =>
+        {
+            skillScroller.SetActive(true);
+        });
+        andSkillToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            ClickAndOrSkillToggle(isOn);
+        });
+        orSkillToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            ClickAndOrSkillToggle(isOn);
+        });
+        useMoreItemToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            MinggeManager.Instance.autoCostToggle = isOn;
+        });
+        useMoreItemBtn.AddListener(() =>
+        {
+            useMoreItemScroller.SetActive(true);
+        });
+        speedUPToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            if (!InvestModel.Instance.IsInvested(InvestModel.monthCardType))
+            {
+                speedUPToggle.SetIsOnWithoutNotify(false);
+                SysNotifyMgr.Instance.ShowTip("MinggeAuto5");
+                UIManager.Instance.OpenWindow<PrivilegeCardWin>();
+                return;
+            }
+            MinggeManager.Instance.autoSpeedUP = isOn;
+        });
+        startBtn.AddListener(() =>
+        {
+            if (!MinggeManager.Instance.qlNotNotify && PackManager.Instance.GetItemCountByID(PackType.Item, MinggeManager.Instance.qlItemID) > 0)
+            {
+                ConfirmCancel.ToggleConfirmCancel(
+                    Language.Get("L1003"),
+                    Language.Get("Mingge31"),
+                    Language.Get("TianziBillborad08"),
+                    Language.Get("Mingge35"),
+                    Language.Get("Mingge34"),
+                    (bool isOK, bool isToggle) =>
+                    {
+                        if (isOK)
+                        {
+                            CloseWindow();
+                            UIManager.Instance.OpenWindow<MinggePrayWin>();
+                        }
+                        else
+                        {
+                            MinggeManager.Instance.StartAuto(true);
+                        }
+
+                        MinggeManager.Instance.qlNotNotify = isToggle;
+                    },
+                    false
+                );
+                return;
+            }
+
+            MinggeManager.Instance.StartAuto(true);
+        });
+        cancelBtn.AddListener(() =>
+        {
+            MinggeManager.Instance.StartAuto(false);
+            cancelBtn.SetActive(false);
+            startBtn.SetActive(true);
+        });
+    }
+
+    protected override void OnPreOpen()
+    {
+        selectPresetID = FuncPresetManager.Instance.GetFuncPresetID((int)FuncPresetType.Mingge);
+        if (MinggeManager.Instance.isStartAuto)
+        {
+            MinggeManager.Instance.isPauseAuto = true;
+            SysNotifyMgr.Instance.ShowTip("MinggeAuto4");
+        }
+
+        qualityScroller.OnRefreshCell += OnRefreshQualityCell;
+        fightAttrScroller.OnRefreshCell += OnRefreshFightAttrCell;
+        deFightAttrScroller.OnRefreshCell += OnRefreshDeFightAttrCell;
+        skillScroller.OnRefreshCell += OnRefreshSkillCell;
+        useMoreItemScroller.OnRefreshCell += OnRefreshUseMoreItemCell;
+
+
+        CreateScroller();
+        DisplayPresetBtns();
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        MinggeManager.Instance.isPauseAuto = false;
+        if (MinggeManager.Instance.isStartAuto)
+        {
+            SysNotifyMgr.Instance.ShowTip("MinggeAuto3");
+            MinggeManager.Instance.CalcEquip();
+        }
+
+        qualityScroller.OnRefreshCell -= OnRefreshQualityCell;
+        fightAttrScroller.OnRefreshCell -= OnRefreshFightAttrCell;
+        deFightAttrScroller.OnRefreshCell -= OnRefreshDeFightAttrCell;
+        skillScroller.OnRefreshCell -= OnRefreshSkillCell;
+        useMoreItemScroller.OnRefreshCell -= OnRefreshUseMoreItemCell;
+    }
+
+    public void Display()
+    {
+        autoSetData = MinggeManager.Instance.GetMGAutoSet(selectPresetID);
+        if (autoSetData == null)
+        {
+            return;
+        }
+        string qualityName = Language.Get("L1039", MGGuayuQualityConfig.Get(autoSetData.quanlity).ColorName);
+        qualityText.text = Language.Get("Mingge30", UIHelper.AppendColor(autoSetData.quanlity, qualityName, true, 2));
+
+        startToggle.SetIsOnWithoutNotify(autoSetData.startToggle);
+        fightPowerToggle.SetIsOnWithoutNotify(autoSetData.fightPowerToggle);
+        andFPToggle.SetIsOnWithoutNotify(autoSetData.andOrFPToggle == 1);
+        orFPToggle.SetIsOnWithoutNotify(autoSetData.andOrFPToggle == 2);
+        attrToggle.SetIsOnWithoutNotify(autoSetData.fightAttrToggle);
+
+        fightAttrText.text = autoSetData.fightAttrID == 0 ? Language.Get("Mingge33") : PlayerPropertyConfig.Get(autoSetData.fightAttrID).Name;
+        deFightAttrText.text = autoSetData.deFightAttrID == 0 ? Language.Get("Mingge33") : PlayerPropertyConfig.Get(autoSetData.deFightAttrID).Name;
+
+        skillToggle.SetIsOnWithoutNotify(autoSetData.skillToggle);
+        skillText.text = autoSetData.skillID == 0 ? Language.Get("Mingge33") : Language.Get($"MinggeSkillType_{autoSetData.skillID}");
+        andSkillToggle.SetIsOnWithoutNotify(autoSetData.andOrSkillToggle == 1);
+        orSkillToggle.SetIsOnWithoutNotify(autoSetData.andOrSkillToggle == 2);
+
+        useMoreItemToggle.SetIsOnWithoutNotify(MinggeManager.Instance.autoCostToggle);
+        useMoreItemText.text = MinggeManager.Instance.autoCostCount.ToString();
+
+        itemNameText.text = ItemConfig.Get(MinggeManager.Instance.tyItemID).ItemName;
+        cancelBtn.SetActive(MinggeManager.Instance.isStartAuto);
+        startBtn.SetActive(!MinggeManager.Instance.isStartAuto);
+    }
+
+    public void DisplayPresetBtns()
+    {
+        var cnt = FuncPresetManager.Instance.GetUnlockCnt((int)FuncPresetType.Mingge);
+        if (cnt == 1)
+        {
+            cnt = 0;
+        }
+        if (cnt > 0)
+        {
+            scrollRect.SetActive(true);
+            for (int i = 0; i < presetBtns.Length; i++)
+            {
+                if (i < cnt)
+                {
+                    presetBtns[i].SetActive(true);
+                    presetNameTexts[i].text = FuncPresetManager.Instance.GetFuncPreset((int)FuncPresetType.Mingge, i + 1).PresetName;
+                }
+                else
+                {
+                    presetBtns[i].SetActive(false);
+                }
+            }
+            presetBtns[selectPresetID - 1].SelectBtn();
+            //婊氬姩鍒� selectPresetID 浣嶇疆
+            scrollRect.horizontalNormalizedPosition = selectPresetID < 4 ? 0 : selectPresetID * 1f / cnt;
+        }
+        else
+        {
+            scrollRect.SetActive(false);
+        }
+    }
+
+
+    void ClickStartToggle(bool isOn)
+    {
+        autoSetData.startToggle = isOn;
+        if (!isOn)
+        {
+            //妫�鏌ュ鏂规涓嚦灏戜竴涓嬀閫�
+            if (!MinggeManager.Instance.CanChangeStartToFalse(selectPresetID))
+            {
+                startToggle.SetIsOnWithoutNotify(true);
+                autoSetData.startToggle = true;
+                SysNotifyMgr.Instance.ShowTip("MinggeAuto2");
+            }
+        }
+
+    }
+
+    void ClickAndOrFPToggle(bool isOn)
+    {
+        //鍙湁鎴樻枟鍜屽叾浠栫殑婵�娲诲悗鎵嶈兘 鍕鹃��
+        FixAndOrFBToggle();
+
+        
+    }
+
+    void ClickAndOrSkillToggle(bool isOn)
+    {
+        //鎶�鑳藉拰鍏朵粬浠讳竴婵�娲诲悗鎵嶈兘 鍕鹃��
+        FixAndOrSkillToggle();
+
+        
+    }
+
+    void FixAndOrFBToggle()
+    {
+        //鍙湁鎴樻枟鍜屽睘鎬ф縺娲诲悗鎵嶈兘 鍕鹃��
+
+        //甯彇娑堢殑鎯呭喌
+        if (!fightPowerToggle.isOn || !attrToggle.isOn)
+        {
+            if (andFPToggle.isOn)
+            {
+                andFPToggle.SetIsOnWithoutNotify(false);
+                
+            }
+
+            if (orFPToggle.isOn)
+            {
+                orFPToggle.SetIsOnWithoutNotify(false);
+            }
+        }
+
+        //甯嬀閫夌殑鎯呭喌锛岄粯璁ゅ嬀鍚屾椂
+        if (fightPowerToggle.isOn && attrToggle.isOn)
+        {
+            if (!andFPToggle.isOn && !orFPToggle.isOn)
+            {
+                andFPToggle.SetIsOnWithoutNotify(true);
+            }
+        }
+
+        RefreshAndOrFBToggleValue();
+    }
+
+    void FixAndOrSkillToggle()
+    {
+        //鎶�鑳藉拰鍏朵粬浠讳竴婵�娲诲悗鎵嶈兘 鍕鹃��
+
+        //甯彇娑堢殑鎯呭喌
+        if (!skillToggle.isOn || (!attrToggle.isOn && !fightPowerToggle.isOn))
+        {
+            if (andSkillToggle.isOn)
+            {
+                andSkillToggle.SetIsOnWithoutNotify(false);
+            }
+
+            if (orSkillToggle.isOn)
+            {
+                orSkillToggle.SetIsOnWithoutNotify(false);
+            }
+        }
+
+        //甯嬀閫夌殑鎯呭喌锛岄粯璁ゅ嬀鍚屾椂
+        if (skillToggle.isOn && (attrToggle.isOn || fightPowerToggle.isOn))
+        {
+            if (!andSkillToggle.isOn && !orSkillToggle.isOn)
+            {
+                orSkillToggle.SetIsOnWithoutNotify(true);
+            }
+        }
+
+        RefreshAndOrSkillToggleValue();
+    }
+
+
+    void RefreshAndOrFBToggleValue()
+    {
+        if (andFPToggle.isOn)
+        {
+            autoSetData.andOrFPToggle = 1;
+        }
+        else if (orFPToggle.isOn)
+        {
+            autoSetData.andOrFPToggle = 2;
+        }
+        else
+        {
+            autoSetData.andOrFPToggle = 0;
+        }
+    }
+    
+    void RefreshAndOrSkillToggleValue()
+    {
+        if (andSkillToggle.isOn)
+        {
+            autoSetData.andOrSkillToggle = 1;
+        }
+        else if (orSkillToggle.isOn)
+        {
+            autoSetData.andOrSkillToggle = 2;
+        }
+        else
+        {
+            autoSetData.andOrSkillToggle = 0;
+        }
+    }
+
+
+    void CreateScroller()
+    {
+        var rateList = MinggeManager.Instance.GetQLRate(MinggeManager.Instance.m_Lingying);
+        //鍊掑簭鍒犻櫎 姒傜巼涓�0鐨� 鐩村埌鏈夋鐜囧ぇ浜�0鐨�
+        for (int i = rateList.Count - 1; i >= 0; i--)
+        {
+            if (rateList[i] == 0)
+            {
+                rateList.RemoveAt(i);
+            }
+            else
+            {
+                break;
+            }
+        }
+        var rect = qualityScroller.GetComponent<RectTransform>();
+        rect.sizeDelta = new Vector2(rect.sizeDelta.x, rateList.Count * 50);
+        qualityScroller.Refresh();
+        for (int i = 1; i <= rateList.Count; i++)
+        {
+            qualityScroller.AddCell(ScrollerDataType.Header, i);
+        }
+        qualityScroller.Restart();
+
+        fightAttrScroller.Refresh();
+        for (int i = 0; i < MinggeManager.Instance.fightAttrIDList.Length; i++)
+        {
+            fightAttrScroller.AddCell(ScrollerDataType.Header, MinggeManager.Instance.fightAttrIDList[i]);
+        }
+        fightAttrScroller.Restart();
+
+        deFightAttrScroller.Refresh();
+        for (int i = 0; i < MinggeManager.Instance.deFightAttrIDList.Length; i++)
+        {
+            deFightAttrScroller.AddCell(ScrollerDataType.Header, MinggeManager.Instance.deFightAttrIDList[i]);
+        }
+        deFightAttrScroller.Restart();
+
+        skillScroller.Refresh();
+        //鐗规畩澶勭悊 闇�瑕佸姞涓婄涓�涓换鎰�
+        for (int i = 0; i <= MinggeManager.Instance.minggeSkillTypeIDList.Length; i++)
+        {
+            if (i == 0)
+            {
+                skillScroller.AddCell(ScrollerDataType.Header, 0);
+            }
+            else
+            {
+                skillScroller.AddCell(ScrollerDataType.Header, MinggeManager.Instance.minggeSkillTypeIDList[i - 1]);
+            }
+        }
+        skillScroller.Restart();
+
+        useMoreItemScroller.Refresh();
+        for (int i = 0; i < MinggeManager.Instance.autoCostCntList.Length; i++)
+        {
+            useMoreItemScroller.AddCell(ScrollerDataType.Header, MinggeManager.Instance.autoCostCntList[i]);
+        }
+        useMoreItemScroller.Restart();
+    }
+
+
+    void OnRefreshQualityCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as MinggeAutoSetCell;
+        _cell.Display(1, cell.index, autoSetData, (value) =>
+        {
+            qualityScroller.SetActive(false);
+            autoSetData.quanlity = value;
+            string qualityName = Language.Get("L1039", MGGuayuQualityConfig.Get(autoSetData.quanlity).ColorName);
+            qualityText.text = Language.Get("Mingge30", UIHelper.AppendColor(autoSetData.quanlity, qualityName, true, 2));
+        });
+    }
+
+
+    void OnRefreshFightAttrCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as MinggeAutoSetCell;
+        _cell.Display(2, cell.index, autoSetData, (value) =>
+        {
+            fightAttrScroller.SetActive(false);
+            autoSetData.fightAttrID = value;
+            fightAttrText.text = autoSetData.fightAttrID == 0 ? Language.Get("Mingge33") : PlayerPropertyConfig.Get(autoSetData.fightAttrID).Name;
+
+        });
+    }
+
+
+    void OnRefreshDeFightAttrCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as MinggeAutoSetCell;
+        _cell.Display(3, cell.index, autoSetData, (value) =>
+        {
+            deFightAttrScroller.SetActive(false);
+            autoSetData.deFightAttrID = value;
+            deFightAttrText.text = autoSetData.deFightAttrID == 0 ? Language.Get("Mingge33") : PlayerPropertyConfig.Get(autoSetData.deFightAttrID).Name;
+
+        });
+    }
+
+    void OnRefreshSkillCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as MinggeAutoSetCell;
+        _cell.Display(4, cell.index, autoSetData, (value) =>
+        {
+            skillScroller.SetActive(false);
+            autoSetData.skillID = value;
+            skillText.text = autoSetData.skillID == 0 ? Language.Get("Mingge33") : Language.Get($"MinggeSkillType_{autoSetData.skillID}");
+
+        });
+    }
+
+    void OnRefreshUseMoreItemCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as MinggeAutoSetCell;
+        _cell.Display(5, cell.index, autoSetData, (value) =>
+        {
+            useMoreItemScroller.SetActive(false);
+            MinggeManager.Instance.autoCostCount = value;
+            useMoreItemText.text = MinggeManager.Instance.autoCostCount.ToString();
+        });
+    }
+
+
+
+}
+
diff --git a/Main/System/Mingge/MinggeAutoSetWin.cs.meta b/Main/System/Mingge/MinggeAutoSetWin.cs.meta
new file mode 100644
index 0000000..2b6b90a
--- /dev/null
+++ b/Main/System/Mingge/MinggeAutoSetWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: cb3d1b698a5646743b6cab34a223e267
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Mingge/MinggeEquipWin.cs b/Main/System/Mingge/MinggeEquipWin.cs
index efd76e7..f6b84f4 100644
--- a/Main/System/Mingge/MinggeEquipWin.cs
+++ b/Main/System/Mingge/MinggeEquipWin.cs
@@ -7,7 +7,6 @@
 {
     [SerializeField] MinggeEquipChangeCell oldEquipCell;
     [SerializeField] MinggeEquipChangeCell newEquipCell;
-    [SerializeField] Transform presetObj;
     [SerializeField] ScrollRect scrollRect;
     [SerializeField] GroupButtonEx[] presetBtns;
     List<Text> presetNameTexts = new List<Text>();
@@ -41,6 +40,15 @@
     protected override void OnPreClose()
     {
         PackManager.Instance.RefreshItemEvent -= RefreshItemEvent;
+        MinggeManager.Instance.equipShowPresetID = 0;
+        MinggeManager.Instance.selectFloorEquip = null;
+
+        if (!UIManager.Instance.IsOpened<MinggeAutoSetWin>())
+        {
+            MinggeManager.Instance.isPauseAuto = false;
+        }
+        MinggeManager.Instance.redpointAuto.state = RedPointState.None;
+
     }
 
     void RefreshItemEvent(PackType packType, int index, int itemID)
@@ -61,7 +69,7 @@
         }
         if (cnt > 0)
         {
-            presetObj.SetActive(true);
+            scrollRect.SetActive(true);
             for (int i = 0; i < presetBtns.Length; i++)
             {
                 if (i < cnt)
@@ -80,7 +88,7 @@
         }
         else
         {
-            presetObj.SetActive(false);
+            scrollRect.SetActive(false);
         }
         if (MinggeManager.Instance.selectFloorEquip == null || MinggeManager.Instance.selectFloorEquip.config == null)
         {
diff --git a/Main/System/Mingge/MinggeManager.cs b/Main/System/Mingge/MinggeManager.cs
index 3cc689d..293ab54 100644
--- a/Main/System/Mingge/MinggeManager.cs
+++ b/Main/System/Mingge/MinggeManager.cs
@@ -2,6 +2,7 @@
 using UnityEngine;
 using LitJson;
 using System;
+using System.Linq;
 
 
 public class MinggeManager : GameSystemManager<MinggeManager>
@@ -20,11 +21,8 @@
     public Dictionary<int, long> minggeAttrDict = new Dictionary<int, long>();
 
 
-    //鑷姩璁剧疆
-    public int autoCostCnt; //鑷姩鎺ㄦ紨娑堣�椾釜鏁�
-    public bool isOpenAuto;
-    
 
+    public bool qlNotNotify;
 
     //閰嶇疆
     public const int TotleEquip = 12; //涓�濂楄澶囩殑鎬绘暟
@@ -39,21 +37,25 @@
 
     public override void Init()
     {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeRelogin;
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
         PackManager.Instance.RefreshItemEvent += RefreshItemEvent;
         DTCA814_tagMCMakeItemAnswer.MakeItemAnswerEvent += OnEquipResult;
         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOK;
         FuncPresetManager.Instance.OnFuncPresetUseDataEvent += OnFuncPresetUseDataEvent;
+        GlobalTimeEvent.Instance.MSEvent += OnMSEvent;
         ParseConfig();
     }
 
     public override void Release()
     {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeRelogin;
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
         PackManager.Instance.RefreshItemEvent -= RefreshItemEvent;
         DTCA814_tagMCMakeItemAnswer.MakeItemAnswerEvent -= OnEquipResult;
         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOK;
         FuncPresetManager.Instance.OnFuncPresetUseDataEvent -= OnFuncPresetUseDataEvent;
+        GlobalTimeEvent.Instance.MSEvent -= OnMSEvent;
     }
 
 
@@ -69,6 +71,13 @@
         minggeItemTypeList = JsonMapper.ToObject<int[]>(config.Numerical4);
         minggeSkillTypeIDList = JsonMapper.ToObject<int[]>(config.Numerical5);
 
+        config = FuncConfigConfig.Get("MinggeTY2");
+        fightAttrIDList = JsonMapper.ToObject<int[]>(config.Numerical1);
+        deFightAttrIDList = JsonMapper.ToObject<int[]>(config.Numerical2);
+        autoCostCntList = JsonMapper.ToObject<int[]>(config.Numerical3);
+        autoTYCDs = JsonMapper.ToObject<float[]>(config.Numerical4);
+        needOfficialRank = int.Parse(config.Numerical5);
+
         for (int i = 0; i < minggeItemTypeList.Length; i++)
         {
             minggeSkillEquipPlaceList.Add(MGGuayuTypeConfig.Get(minggeItemTypeList[i]).EquipPlace);
@@ -77,17 +86,26 @@
 
     }
 
-    private void OnBeforePlayerDataInitialize()
+    private void OnBeforePlayerDataInitializeRelogin()
     {
         m_GanwuLV = 1;
         m_GanwuExp = 0;
         m_Lingying = 0;
+        isStartAuto = false;
+        isPauseAuto = false;
+        qlNotNotify = false;
+    }
+
+    private void OnBeforePlayerDataInitialize()
+    {
         waitTYOPPack = false;
     }
 
     void OnPlayerLoginOK()
     {
+        InitAutoSet();
         UpdateRedPoint();
+        redpointAuto.state = RedPointState.None; 
     }
 
     private void OnEquipResult(HA814_tagMCMakeItemAnswer info)
@@ -96,7 +114,7 @@
             return;
 
         OnOPCallbackEvent?.Invoke(0);
-        
+
     }
 
     void RefreshItemEvent(PackType type, int index, int itemID)
@@ -141,7 +159,7 @@
 
     public void UpdateMinggeInfo(HB132_tagSCMinggeInfo netPack)
     {
-        var beforeLV= m_GanwuLV;
+        var beforeLV = m_GanwuLV;
         m_GanwuLV = netPack.GanwuLV;
         m_GanwuExp = (int)netPack.GanwuExp;
         m_Lingying = (int)netPack.Lingying;
@@ -220,10 +238,23 @@
         }
 
         //鑷姩澶勭悊锛� 鍒ゆ柇鍒嗚В 鍜屾垬鍔涢珮浣� 鍜屽喅瀹氭槸鍝釜鏂规涓嬬殑瑁呭瀵规瘮
+        int autoPreseetID;
+        if (!AutoCalcMG(equip, out autoPreseetID))
+        {
+            return false;
+        }
 
+        
 
         //闈炶嚜鍔ㄦ儏鍐典笅锛岄粯璁ゅ綋鍓嶆柟妗�
-        equipShowPresetID = FuncPresetManager.Instance.GetFuncPresetIDByBattleType((int)BattlePreSetType.Story, (int)FuncPresetType.Mingge);
+        if (autoPreseetID == 0)
+        {
+            equipShowPresetID = FuncPresetManager.Instance.GetFuncPresetIDByBattleType((int)BattlePreSetType.Story, (int)FuncPresetType.Mingge);
+        }
+        else
+        {
+            equipShowPresetID = autoPreseetID;
+        }
         selectFloorEquip = equip;
         if (UIManager.Instance.IsOpened<MinggeWin>())
         {
@@ -236,6 +267,12 @@
             {
                 UIManager.Instance.OpenWindow<MinggeEquipWin>();
             }
+        }
+        else
+        {
+            //鎵撳紑鐣岄潰 涓斿閮ㄦ彁閱掓湁闇�瑕佸鐞嗙殑瑁呭锛屽湪鍏抽棴鐣岄潰鐨勬椂鍊欏垽鏂噸缃爣璇�
+            isPauseAuto = true;
+            redpointAuto.state = RedPointState.Simple;
         }
         return true;
 
@@ -270,6 +307,22 @@
         var pack = new CB250_tagCSMinggeTuiyan();
         pack.Count = (byte)count;
         GameNetSystem.Instance.SendInfo(pack);
+        if (isStartAuto && UIManager.Instance.IsOpened<MinggeWin>())
+        {
+            //鏄剧ず鐗规晥
+            var ui = UIManager.Instance.GetUI<MinggeWin>();
+            ui.tyEffect.onComplete = null;
+            ui.tyEffect.Play();
+            if (autoSpeedUP)
+            {
+                ui.tyEffect.speedRate = autoTYCDs[0] / autoTYCDs[1];
+            }
+            else
+            {
+                ui.tyEffect.speedRate = 1;
+            }
+
+        }
     }
 
     public void SendChangeMingge(int selectMinggePresetID, int dropIndex, bool autodec)
@@ -325,7 +378,50 @@
 
     }
 
+    public List<int> GetQLRate(int value)
+    {
+        var keys = MGLingyingQualityConfig.GetKeys();
+        keys.Sort();
 
+        int littleValue = 0;
+        int bigValue = 0;
+        for (int i = 0; i < keys.Count; i++)
+        {
+            var key = keys[i];
+            if (value < key)
+            {
+                bigValue = key;
+                littleValue = keys[i - 1];
+                break;
+            }
+            else if (i == keys.Count - 1 && value >= key)
+            {
+                bigValue = key;
+                littleValue = key;
+            }
+        }
+
+        var littleRateList = MGLingyingQualityConfig.Get(littleValue).ItemColorWeightList;
+        if (littleValue == bigValue)
+        {
+            return littleRateList.ToList();
+        }
+        var bigRateList = MGLingyingQualityConfig.Get(bigValue).ItemColorWeightList;
+
+        //瀵规瘮涓嬩竴闃舵鐨勭伒搴斿�奸厤缃紝姣旇緝鍚屽搧璐ㄧ殑鏉冮噸宸�间笌涓や釜闃舵鐨勭伒搴斿樊鍊兼眰鍑烘瘡澧炲姞1鐐圭伒搴斿鏌愪釜鍝佽川鐨勬潈閲嶅彉鍖栧�硷紝鍙樺寲鍊煎彲鑳芥彁鍗囨垨鑰呴檷浣�
+
+        var rateList = new List<int>();
+
+        for (int i = 0; i < littleRateList.Length; i++)
+        {
+            var littleRateValue = littleRateList[i];
+            var bigRateValue = bigRateList[i];
+            var diffRate = littleRateValue + (bigRateValue - littleRateValue) / (float)(bigValue - littleValue) * (value - littleValue);
+            rateList.Add((int)diffRate);
+        }
+        
+        return rateList;
+    }
 
 
     #region 绾㈢偣
@@ -333,7 +429,7 @@
     Redpoint redpointMG = new Redpoint(MainRedDot.RedPoint_Mingge, MainRedDot.RedPoint_Mingge * 10 + 1);
     Redpoint redpointPray = new Redpoint(MainRedDot.RedPoint_Mingge, MainRedDot.RedPoint_Mingge * 10 + 2);
     Redpoint redpointPreset = new Redpoint(MainRedDot.RedPoint_Mingge, MainRedDot.RedPoint_Mingge * 10 + 3);
-    
+    public Redpoint redpointAuto = new Redpoint(MainRedDot.RedPoint_Mingge, MainRedDot.RedPoint_Mingge * 10 + 4);
     void UpdateRedPoint()
     {
 
@@ -344,7 +440,7 @@
         {
             return;
         }
-        if (PackManager.Instance.GetItemCountByID(PackType.Item, tyItemID) > 0)
+        if (PackManager.Instance.GetItemCountByID(PackType.Item, tyItemID) > 0 && !isStartAuto)
         {
             redpointMG.state = RedPointState.Simple;
         }
@@ -360,4 +456,505 @@
     }
 
     #endregion
+
+
+    #region 鑷姩璁剧疆
+
+    public int[] fightAttrIDList;
+    public int[] deFightAttrIDList;
+    public int[] autoCostCntList;
+    public float[] autoTYCDs;    //绉�
+    public float autoTYTime;
+    public int needOfficialRank;
+
+    //鍏叡閮ㄥ垎
+    public bool autoCostToggle
+    {
+        get
+        {
+            return LocalSave.GetBool($"MGCost_{PlayerDatas.Instance.baseData.PlayerID}", false);
+        }
+        set
+        {
+            LocalSave.SetBool($"MGCost_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    public int autoCostCount
+    {
+        get
+        {
+            return LocalSave.GetInt($"MGCostCnt_{PlayerDatas.Instance.baseData.PlayerID}", 1);
+        }
+        set
+        {
+            LocalSave.SetInt($"MGCostCnt_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    public bool autoSpeedUP
+    {
+        get
+        {
+            return LocalSave.GetBool($"MGSpeedUP_{PlayerDatas.Instance.baseData.PlayerID}", false);
+        }
+        set
+        {
+            LocalSave.SetBool($"MGSpeedUP_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+
+
+    public event Action ChangeAutoEvent;
+
+    bool m_IsStartAuto;
+    //鏄惁寮�鍚嚜鍔�
+    public bool isStartAuto
+    {
+        get
+        {
+            return m_IsStartAuto;
+        }
+        private set
+        {
+            m_IsStartAuto = value;
+            isPauseAuto = false;
+            UpdateRedPoint();
+            ChangeAutoEvent?.Invoke();
+        }
+    }
+    public bool isPauseAuto;    //寮�鍚殑鎯呭喌涓嬶紝鍥犱负鏌愪簺鍘熷洜鏆傚仠鑷姩
+
+
+    //姣忓鏂规鍚勮嚜鐨勪俊鎭�
+    public List<MinggeAutoSet> autoSetList = new List<MinggeAutoSet>();
+
+    public void InitAutoSet()
+    {
+        autoSetList.Clear();
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Mingge))
+        {
+            return;
+        }
+        var maxCnt = PresetUnlockConfig.GetFuncPresetMaxCount((int)FuncPresetType.Mingge);
+        for (int i = 1; i <= maxCnt; i++)
+        {
+            var autoSet = new MinggeAutoSet();
+            autoSet.presetID = i;
+            autoSetList.Add(autoSet);
+        }
+    }
+
+    public MinggeAutoSet GetMGAutoSet(int presetID)
+    {
+        for (int i = 0; i < autoSetList.Count; i++)
+        {
+            if (autoSetList[i].presetID == presetID)
+            {
+                return autoSetList[i];
+            }
+        }
+        return null;
+    }
+
+    //妫�鏌ヨ嚦灏戣鏈変竴涓惎鍔ㄤ腑
+    public bool CanChangeStartToFalse(int presetID)
+    {
+        for (int i = 0; i < autoSetList.Count; i++)
+        {
+            if (autoSetList[i].presetID != presetID && autoSetList[i].startToggle)
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public void StartAuto(bool isStart)
+    {
+        if (isStart)
+        {
+            bool canStart = false;
+            for (int i = 0; i < autoSetList.Count; i++)
+            {
+                if (autoSetList[i].startToggle)
+                {
+                    canStart = true;
+                }
+            }
+
+            if (!canStart)
+            {
+                SysNotifyMgr.Instance.ShowTip("MinggeAuto2");
+                isStartAuto = false;
+                return;
+            }
+
+
+            if (!ItemLogicUtility.CheckItemCount(PackType.Item, tyItemID, autoCostCount, 2))
+            {
+                isStartAuto = false;
+                return;
+            }
+        }
+        UIManager.Instance.CloseWindow<MinggeAutoSetWin>();
+        isStartAuto = isStart;
+        if (isStartAuto)
+        {
+            //鍏堝鐞嗚澶囦竴娆★紝鍚庣画閫氳繃鐗╁搧鍖呰嚜鍔ㄥ鐞�
+            CalcEquip();
+        }
+        else
+        {
+            SysNotifyMgr.Instance.ShowTip("MinggeAuto1");
+        }
+    }
+
+    //鑷姩澶勭悊瑁呭锛岃繑鍥炴垚鍔熶唬琛ㄩ渶瑕佹墜鍔ㄥ鐞嗚澶囷紝鍏朵粬鎯呭喌涓�寰嬭繑鍥瀎alse濡傚垎瑙� 鎴栭槻鑼�
+    bool AutoCalcMG(ItemModel mgEquip, out int autoPreseetID)
+    {
+        autoPreseetID = 0;
+        if (mgEquip == null)
+        {
+            return false;
+        }
+
+        if (!isStartAuto)
+            return true;
+
+        //浼樺厛鍒ゆ柇褰撳墠鏂规鍛芥牸
+        var curPresetID = FuncPresetManager.Instance.GetFuncPresetID((int)FuncPresetType.Mingge);
+        var autoSet = GetMGAutoSet(curPresetID);
+
+
+        if (!CanDecomposeMG(mgEquip, autoSet))
+        {
+            autoPreseetID = curPresetID;
+            return true;
+        }
+        //鍒ゆ柇鍏朵粬鏂规
+        for (int i = 0; i < autoSetList.Count; i++)
+        {
+            if (autoSetList[i].presetID == curPresetID)
+            {
+                continue;
+            }
+            if (!CanDecomposeMG(mgEquip, autoSetList[i]))
+            {
+                autoPreseetID = autoSetList[i].presetID;
+                return true;
+            }
+        }
+
+        SendDecompose(new byte[] { (byte)mgEquip.gridIndex });
+        return false;
+    }
+
+    //鍗曟柟妗堝垽鏂紝鏈紑鍚殑涔熷綋浣滃彲鍒嗚В锛屽灞傚濂楀垽鏂湁涓�濂楅渶瑕佸氨鏄渶瑕佺┛鎴�
+    bool CanDecomposeMG(ItemModel mgEquip, MinggeAutoSet autoSet)
+    {
+        if (!autoSet.startToggle)
+        {
+            return true;
+        }
+        if (mgEquip.config.ItemColor < autoSet.quanlity)
+        {
+            //鍝佽川涓嶆弧瓒�
+            return true;
+        }
+        if (!autoSet.fightPowerToggle && !autoSet.fightAttrToggle && !autoSet.skillToggle)
+        {
+            //閮戒笉鍕鹃��
+            return true;
+        }
+
+
+        //鍏堝垽鏂妧鑳斤紝鍐嶅垽鏂睘鎬� 鏈�鍚庢垬鍔涳紙姣旇緝娑堣�楋級
+
+        //鎶�鑳藉嬀閫夌殑鎯呭喌
+        if (autoSet.skillToggle && !autoSet.fightPowerToggle && !autoSet.fightAttrToggle)
+        {
+            return !IsSkillOK(mgEquip, autoSet);
+        }
+
+        if (autoSet.skillToggle && autoSet.fightAttrToggle && !autoSet.fightPowerToggle)
+        {
+            if (autoSet.andOrSkillToggle == 1)
+            {
+                return !(IsSkillOK(mgEquip, autoSet) && IsFightAttrOK(mgEquip, autoSet));
+            }
+            else
+            {
+                return !(IsSkillOK(mgEquip, autoSet) || IsFightAttrOK(mgEquip, autoSet));
+            }
+        }
+
+        if (autoSet.skillToggle && autoSet.fightPowerToggle && !autoSet.fightAttrToggle)
+        {
+            if (autoSet.andOrSkillToggle == 1)
+            {
+                return !(IsSkillOK(mgEquip, autoSet) && IsFightPowerOK(mgEquip, autoSet));
+            }
+            else
+            {
+                return !(IsSkillOK(mgEquip, autoSet) || IsFightPowerOK(mgEquip, autoSet));
+            }
+        }
+
+        if (autoSet.skillToggle && autoSet.fightPowerToggle && autoSet.fightAttrToggle)
+        {
+            if (autoSet.andOrSkillToggle == 1 && autoSet.andOrFPToggle == 1)
+            {
+                return !(IsSkillOK(mgEquip, autoSet) && IsFightAttrOK(mgEquip, autoSet) && IsFightPowerOK(mgEquip, autoSet));
+            }
+            else if (autoSet.andOrSkillToggle == 1 && autoSet.andOrFPToggle == 2)
+            {
+                return !((IsSkillOK(mgEquip, autoSet) && IsFightAttrOK(mgEquip, autoSet)) || IsFightPowerOK(mgEquip, autoSet));
+            }
+            else if (autoSet.andOrSkillToggle == 2 && autoSet.andOrFPToggle == 1)
+            {
+                return !((IsFightAttrOK(mgEquip, autoSet) && IsFightPowerOK(mgEquip, autoSet)) || IsSkillOK(mgEquip, autoSet));
+            }
+            else
+            {
+                return !(IsSkillOK(mgEquip, autoSet) || IsFightAttrOK(mgEquip, autoSet) || IsFightPowerOK(mgEquip, autoSet));
+            }
+        }
+
+        //灞炴�у嬀閫夌殑鎯呭喌
+        if (autoSet.fightAttrToggle && !autoSet.fightPowerToggle)
+        {
+            return !IsFightAttrOK(mgEquip, autoSet);
+        }
+        if (autoSet.fightAttrToggle && autoSet.fightPowerToggle)
+        {
+            if (autoSet.andOrFPToggle == 1)
+            {
+                return !(IsFightAttrOK(mgEquip, autoSet) && IsFightPowerOK(mgEquip, autoSet));
+            }
+            else
+            {
+                return !(IsFightAttrOK(mgEquip, autoSet) || IsFightPowerOK(mgEquip, autoSet));
+            }
+        }
+
+        //鎴樺姏鍕鹃�夌殑鎯呭喌
+        if (autoSet.fightPowerToggle)
+        {
+            return !IsFightPowerOK(mgEquip, autoSet);
+        }
+
+        return false;
+    }
+
+    //鎶�鑳芥槸鍚︽弧瓒虫潯浠�
+    bool IsSkillOK(ItemModel mgEquip, MinggeAutoSet autoSet)
+    {
+        var skillID = EquipModel.Instance.GetEquipSkillID(mgEquip);
+        if (skillID == 0)
+        {
+            return false;
+        }
+        if (autoSet.skillID == 0)
+        {
+            //浠绘剰
+            return true;
+        }
+        if (skillID != autoSet.skillID)
+        {
+            return false;
+        }
+
+        return true;
+    }
+
+    //灞炴�ф槸鍚︽弧瓒虫潯浠�
+    bool IsFightAttrOK(ItemModel mgEquip, MinggeAutoSet autoSet)
+    {
+        var fightAttrs = EquipModel.Instance.GetEquipFightAttrs(mgEquip);
+
+        // 濡傛灉鎸囧畾浜嗗睘鎬э紝鍒欐鏌ヨ澶囨槸鍚﹀寘鍚灞炴��
+        bool deFightAttrOK = autoSet.deFightAttrID == 0 || fightAttrs.Contains(autoSet.deFightAttrID);
+        bool fightAttrOK = autoSet.fightAttrID == 0 || fightAttrs.Contains(autoSet.fightAttrID);
+
+        return deFightAttrOK && fightAttrOK;
+    }
+    
+    bool IsFightPowerOK(ItemModel mgEquip, MinggeAutoSet autoSet)
+    {
+        long showFightPower = FightPowerManager.Instance.GetFightPowerMinggeChange(mgEquip, autoSet.presetID);
+        if (showFightPower >= 0)
+        {
+            return true;
+        }
+        return false;
+    }
+
+
+    public void AutoTY()
+    {
+        //鍏堝鐞嗚澶囷紝鍐嶆帹婕�
+        // 姣忎竴濂楁柟妗堥兘瑕佺患鍚堝垽鏂�
+        // if (CalcEquip())
+        // {
+        //     return;
+        // }
+        if (UIManager.Instance.IsOpened<MinggeEquipWin>())
+        {
+            return;
+        }
+
+        if (!PackManager.Instance.GetItems(PackType.MinggeDrop).IsNullOrEmpty())
+        {
+            return;
+        }
+
+        if (!ItemLogicUtility.CheckItemCount(PackType.Item, tyItemID, autoCostCount, 1))
+        {
+            isStartAuto = false;
+            SysNotifyMgr.Instance.ShowTip("MinggeAuto1");
+            return;
+        }
+        SendTY(autoCostCount);
+        autoTYTime = Time.time;
+    }
+
+    void OnMSEvent()
+    {
+        if (isPauseAuto)
+        {
+            return;
+        }
+        if (!isStartAuto)
+        {
+            return;
+        }
+        if (Time.time - autoTYTime < autoTYCDs[autoSpeedUP ? 1 : 0])
+        {
+            return;
+        }
+
+        AutoTY();
+    }
+
+    #endregion
+}
+
+public class MinggeAutoSet
+{
+    public int presetID;
+    public bool startToggle
+    {
+        get
+        {
+            return LocalSave.GetBool($"MGStart{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", false);
+        }
+        set
+        {
+            LocalSave.SetBool($"MGStart{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    public int quanlity
+    {
+        get
+        {
+            return LocalSave.GetInt($"MGQuanlity{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", 1);
+        }
+        set
+        {
+            LocalSave.SetInt($"MGQuanlity{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    public bool fightPowerToggle
+    {
+        get
+        {
+            return LocalSave.GetBool($"MGFightPower{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", false);
+        }
+        set
+        {
+            LocalSave.SetBool($"MGFightPower{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    //0 閮戒笉鍕鹃�� 1鍚屾椂 2 鎴栬��
+    public int andOrFPToggle
+    {
+        get
+        {
+            return LocalSave.GetInt($"MGAndOrFP{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", 0);
+        }
+        set
+        {
+            LocalSave.SetInt($"MGAndOrFP{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+
+    public bool fightAttrToggle
+    {
+        get
+        {
+            return LocalSave.GetBool($"MGFightAttr{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", false);
+        }
+        set
+        {
+            LocalSave.SetBool($"MGFightAttr{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    public int fightAttrID
+    {
+        get
+        {
+            return LocalSave.GetInt($"MGFightAttrID{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", 0);
+        }
+        set
+        {
+            LocalSave.SetInt($"MGFightAttrID{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    public int deFightAttrID
+    {
+        get
+        {
+            return LocalSave.GetInt($"MGDeFightAttrID{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", 0);
+        }
+        set
+        {
+            LocalSave.SetInt($"MGDeFightAttrID{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    public bool skillToggle
+    {
+        get
+        {
+            return LocalSave.GetBool($"MGSkill{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", false);
+        }
+        set
+        {
+            LocalSave.SetBool($"MGSkill{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    public int skillID
+    {
+        get
+        {
+            return LocalSave.GetInt($"MGSkillID{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", 0);
+        }
+        set
+        {
+            LocalSave.SetInt($"MGSkillID{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    //0 閮戒笉鍕鹃�� 1鍚屾椂 2 鎴栬��
+    public int andOrSkillToggle
+    {
+        get
+        {
+            return LocalSave.GetInt($"MGAndOrSkill{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", 0);
+        }
+        set
+        {
+            LocalSave.SetInt($"MGAndOrSkill{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+
+
+    
 }
\ No newline at end of file
diff --git a/Main/System/Mingge/MinggePrayWin.cs b/Main/System/Mingge/MinggePrayWin.cs
index cb54675..e91f3f9 100644
--- a/Main/System/Mingge/MinggePrayWin.cs
+++ b/Main/System/Mingge/MinggePrayWin.cs
@@ -60,8 +60,8 @@
     void DisplayPrayRate()
     {
         qlValueText.text = MinggeManager.Instance.m_Lingying.ToString();
-        var littleRateList = GetRate(MinggeManager.Instance.m_Lingying);
-        var bigRateList = GetRate(MinggeManager.Instance.m_Lingying + useCnt);
+        var littleRateList = MinggeManager.Instance.GetQLRate(MinggeManager.Instance.m_Lingying);
+        var bigRateList = MinggeManager.Instance.GetQLRate(MinggeManager.Instance.m_Lingying + useCnt);
 
         for (int i = 0; i < prayRateCells.Length; i++)
         {
@@ -109,49 +109,6 @@
     }
 
 
-    public List<int> GetRate(int value)
-    {
-        var keys = MGLingyingQualityConfig.GetKeys();
-        keys.Sort();
-
-        int littleValue = 0;
-        int bigValue = 0;
-        for (int i = 0; i < keys.Count; i++)
-        {
-            var key = keys[i];
-            if (value < key)
-            {
-                bigValue = key;
-                littleValue = keys[i - 1];
-                break;
-            }
-            else if (i == keys.Count - 1 && value >= key)
-            {
-                bigValue = key;
-                littleValue = key;
-            }
-        }
-
-        var littleRateList = MGLingyingQualityConfig.Get(littleValue).ItemColorWeightList;
-        if (littleValue == bigValue)
-        {
-            return littleRateList.ToList();
-        }
-        var bigRateList = MGLingyingQualityConfig.Get(bigValue).ItemColorWeightList;
-
-        //瀵规瘮涓嬩竴闃舵鐨勭伒搴斿�奸厤缃紝姣旇緝鍚屽搧璐ㄧ殑鏉冮噸宸�间笌涓や釜闃舵鐨勭伒搴斿樊鍊兼眰鍑烘瘡澧炲姞1鐐圭伒搴斿鏌愪釜鍝佽川鐨勬潈閲嶅彉鍖栧�硷紝鍙樺寲鍊煎彲鑳芥彁鍗囨垨鑰呴檷浣�
-
-        var rateList = new List<int>();
-
-        for (int i = 0; i < littleRateList.Length; i++)
-        {
-            var littleRateValue = littleRateList[i];
-            var bigRateValue = bigRateList[i];
-            var diffRate = littleRateValue + (bigRateValue - littleRateValue) / (float)(bigValue - littleValue) * (value - littleValue);
-            rateList.Add((int)diffRate);
-        }
-        
-        return rateList;
-    }
+    
 }
 
diff --git a/Main/System/Mingge/MinggeWin.cs b/Main/System/Mingge/MinggeWin.cs
index 9c3d6a6..8700eba 100644
--- a/Main/System/Mingge/MinggeWin.cs
+++ b/Main/System/Mingge/MinggeWin.cs
@@ -7,7 +7,7 @@
 {
     [SerializeField] Button seeAttrBtn;
     [SerializeField] MinggeEquipCell[] equipCells;
-    [SerializeField] UIEffectPlayer tyEffect;   //鎺ㄦ紨鐗规晥
+    [SerializeField] public UIEffectPlayer tyEffect;   //鎺ㄦ紨鐗规晥
     [SerializeField] Image dropIcon;
     [SerializeField] Image dropSkillIcon;
     [SerializeField] MoneyMoveByPath moneyMoveByPathCell;     //鎺夎惤鐗╅噾閽�
@@ -49,7 +49,7 @@
             }
             AttributeManager.Instance.OpenMinggeSimpleAttributeWin(MinggeManager.Instance.minggeAttrDict, skillDict);
         });
-        tyBtn.AddListener(SendTuiyan);
+        tyBtn.AddListener(CheckTuiyan);
         for (int i = 0; i < suiteNameTexts.Length; i++)
         {
             int index = i;
@@ -78,6 +78,7 @@
         MinggeManager.Instance.OnMinggeInfoUpdate += OnMinggeInfoUpdate;
         UIManager.Instance.OnCloseWindow += OnCloseWindow;
         FuncPresetManager.Instance.OnFuncPresetUseDataEvent += OnFuncPresetUseDataEvent;
+        MinggeManager.Instance.ChangeAutoEvent += ChangeAutoEvent;
         lastLV = MinggeManager.Instance.m_GanwuLV;
         lastExp = MinggeManager.Instance.m_GanwuExp;
         Display();
@@ -92,7 +93,17 @@
         MinggeManager.Instance.OnMinggeInfoUpdate -= OnMinggeInfoUpdate;
         UIManager.Instance.OnCloseWindow -= OnCloseWindow;
         FuncPresetManager.Instance.OnFuncPresetUseDataEvent -= OnFuncPresetUseDataEvent;
+        MinggeManager.Instance.ChangeAutoEvent -= ChangeAutoEvent;
     }
+
+    protected override void NextFrameAfterOpen()
+    {
+        if (MinggeManager.Instance.isPauseAuto)
+        {
+            MinggeManager.Instance.CalcEquip();
+        }
+    }
+
 
     void OnCloseWindow(UIBase win)
     {
@@ -112,6 +123,20 @@
         Display();
     }
 
+    void ChangeAutoEvent()
+    {
+        if (MinggeManager.Instance.isStartAuto)
+        {
+            autoImg.SetActive(false);
+            autoEffect.Play();
+        }
+        else
+        {
+            autoImg.SetActive(true);
+            autoEffect.Stop();
+        }
+    }
+
     void Display()
     {
         DisplayMGGanwu();
@@ -123,6 +148,8 @@
         presetChooseCells.Display((int)BattlePreSetType.Story, (int)FuncPresetType.Mingge);
 
         funPresetBtn.SetActive(FuncPresetManager.Instance.IsPreShow());
+        ChangeAutoEvent();
+        
     }
     void RefreshItemEvent(PackType type, int index, int itemID)
     {
@@ -214,8 +241,43 @@
         moneyMoveByPathCell.PlayAnimation(MinggeManager.Instance.deitemID, 8, 2);
     }
 
+
+    void CheckTuiyan()
+    {
+        if (!MinggeManager.Instance.qlNotNotify && PackManager.Instance.GetItemCountByID(PackType.Item, MinggeManager.Instance.qlItemID) > 0)
+        {
+            ConfirmCancel.ToggleConfirmCancel(
+                Language.Get("L1003"),
+                Language.Get("Mingge31"),
+                Language.Get("TianziBillborad08"),
+                Language.Get("Mingge35"),
+                Language.Get("Mingge34"),
+                (bool isOK, bool isToggle) =>
+                {
+                    if (isOK)
+                    {
+                        UIManager.Instance.OpenWindow<MinggePrayWin>();
+                    }
+                    else
+                    {
+                        SendTuiyan();
+                    }
+
+                    MinggeManager.Instance.qlNotNotify = isToggle;
+                },
+                false
+            );
+            return;
+        }
+        SendTuiyan();
+    }
+
     void SendTuiyan()
     {
+        if (MinggeManager.Instance.isStartAuto)
+        {
+            MinggeManager.Instance.StartAuto(false);
+        }
         if (MinggeManager.Instance.CalcEquip())
         {
             return;
@@ -231,7 +293,12 @@
             return;
         }
 
-        tyEffect.onComplete += () =>
+        if (MinggeManager.Instance.isStartAuto)
+        {
+            MinggeManager.Instance.StartAuto(false);
+        }
+        tyEffect.speedRate = 1;
+        tyEffect.onComplete = () =>
         {
             MinggeManager.Instance.SendTY(1);
         };
@@ -295,7 +362,16 @@
 
     void AutoTY()
     {
-        
+        if (InvestModel.Instance.IsInvested(InvestModel.monthCardType) ||
+        PlayerDatas.Instance.baseData.realmLevel >= MinggeManager.Instance.needOfficialRank)
+        {
+            UIManager.Instance.OpenWindow<MinggeAutoSetWin>();
+        }
+        else
+        {
+            SysNotifyMgr.Instance.ShowTip("MinggeAuto6", RealmConfig.Get(PlayerDatas.Instance.baseData.realmLevel).Name);
+            UIManager.Instance.OpenWindow<PrivilegeCardWin>();
+        }
     }
 }
 
diff --git a/Main/System/PhantasmPavilion/PhantasmPavilionManager.cs b/Main/System/PhantasmPavilion/PhantasmPavilionManager.cs
index b373111..52ce53f 100644
--- a/Main/System/PhantasmPavilion/PhantasmPavilionManager.cs
+++ b/Main/System/PhantasmPavilion/PhantasmPavilionManager.cs
@@ -84,6 +84,8 @@
     {
         if (type != PackType.Item)
             return;
+        if (itemID <= 0)
+            return;
         if (ItemConfig.Get(itemID).Type != 146)
             return;
         UpdateRedPoint();
diff --git a/Main/System/WarlordPavilion/WarlordPavilionManager.cs b/Main/System/WarlordPavilion/WarlordPavilionManager.cs
index 71df39e..582461b 100644
--- a/Main/System/WarlordPavilion/WarlordPavilionManager.cs
+++ b/Main/System/WarlordPavilion/WarlordPavilionManager.cs
@@ -346,6 +346,8 @@
             foreach (var config in FBDJGEffectConfig.GetValues())
             {
                 int attrId = config.AttrID;
+                if (config.RandWeight == 0)
+                    continue;
                 if (!attrIds.Contains(attrId))
                 {
                     attrIds.Add(attrId);

--
Gitblit v1.8.0