From 911a0b72e3415c9d3aba121bc532160da77c1afa Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期三, 22 十月 2025 21:05:02 +0800
Subject: [PATCH] 65 子 【公会】基础主体 / 【公会】基础主体-客户端

---
 Main/System/Guild/GuildManager.cs                                                   |  197 ++++++++++--
 Main/Core/GameEngine/Player/PlayerDatas.cs                                          |   10 
 Main/System/Guild/GuildOPWin.cs                                                     |   84 +++++
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs |    7 
 Main/System/Guild/GuildChangeNameWin.cs                                             |   91 ++++++
 Main/System/Guild/GuildMemberOPCell.cs                                              |  125 ++++++++
 Main/System/Guild/GuildMemberOPCell.cs.meta                                         |   11 
 Main/System/GMCommand/GMInputWin.cs                                                 |   11 
 Main/System/Guild/GuildJoinWin.cs                                                   |   10 
 Main/System/Guild/GuildChangeNameWin.cs.meta                                        |   11 
 Main/System/Guild/GuildOPWin.cs.meta                                                |   11 
 Main/System/Guild/GuildHallWin.cs                                                   |  152 ++++++++++
 Main/System/Guild/GuildPreviewWin.cs                                                |    4 
 Main/System/Guild/GuildMemberCell.cs.meta                                           |   11 
 Main/System/Guild/GuildEmblemCell.cs                                                |    7 
 Main/System/Main/MainWin.cs                                                         |    1 
 Main/System/Guild/GuildHallWin.cs.meta                                              |   11 
 Main/System/Scroll/ScrollerController.cs                                            |    4 
 Main/System/Guild/GuildMemberCell.cs                                                |   96 ++++++
 Main/System/Guild/PlayerFairyData.cs                                                |   44 ++
 Main/System/Guild/GuildBaseWin.cs                                                   |    2 
 21 files changed, 824 insertions(+), 76 deletions(-)

diff --git a/Main/Core/GameEngine/Player/PlayerDatas.cs b/Main/Core/GameEngine/Player/PlayerDatas.cs
index 24fd57b..9302037 100644
--- a/Main/Core/GameEngine/Player/PlayerDatas.cs
+++ b/Main/Core/GameEngine/Player/PlayerDatas.cs
@@ -105,11 +105,15 @@
                 break;
             case PlayerDataType.Family:
                 baseData.FamilyId = value;
-                if (LocalSave.GetInt("FimilyReport" + PlayerDatas.Instance.baseData.PlayerID) == 0)
+                if (value == 0)
                 {
-                    SDKUtils.Instance.TraceEvent("joinalliance", "", false);
-                    LocalSave.SetInt("FimilyReport" + PlayerDatas.Instance.baseData.PlayerID, 1);
+                    GuildManager.Instance.ClearGuildWhenQuit();
                 }
+                // if (LocalSave.GetInt("FimilyReport" + PlayerDatas.Instance.baseData.PlayerID) == 0)
+                // {
+                //     SDKUtils.Instance.TraceEvent("joinalliance", "", false);
+                //     LocalSave.SetInt("FimilyReport" + PlayerDatas.Instance.baseData.PlayerID, 1);
+                // }
                 break;
             case PlayerDataType.Gold:
                 baseData.diamond = value;
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs
index d794690..22891b0 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs
@@ -1,11 +1,12 @@
-using UnityEngine;
-using System.Collections;
-
+using UnityEngine;
+using System.Collections;
+
 // A5 21 瀹舵棌鍙樻洿 #tagMCFamilyChange
 
 public class DTCA521_tagMCFamilyChange : DtcBasic {
     public override void Done(GameNetPackBasic vNetPack) {
         base.Done(vNetPack);
         HA521_tagMCFamilyChange vNetData = vNetPack as HA521_tagMCFamilyChange;
+        GuildManager.Instance.UpdateGuildDataChangeMark(vNetData);
     }
 }
diff --git a/Main/System/GMCommand/GMInputWin.cs b/Main/System/GMCommand/GMInputWin.cs
index c8dedc9..ac90a1e 100644
--- a/Main/System/GMCommand/GMInputWin.cs
+++ b/Main/System/GMCommand/GMInputWin.cs
@@ -121,11 +121,12 @@
         if (_inputCmd.text == null || _inputCmd.text == "" || _inputCmd.text == string.Empty)
             return;
 
-        // if (_inputCmd.text == "HappyXB")
-        // {
-        //     WindowCenter.Instance.Open<HappyXBWin>();
-        //     return;
-        // }
+        if (_inputCmd.text.StartsWith("GuildID"))
+        {
+            var id = GuildManager.Instance.DecryptGuildID(_inputCmd.text.Substring(8));
+            ServerTipDetails.ReceivePackage("鍏細ID锛�" + id);
+            return;
+        }
         // else if (_inputCmd.text == "TreasureFindHost")
         // {
         //     WindowCenter.Instance.Open<TreasureFindHostWin>();
diff --git a/Main/System/Guild/GuildBaseWin.cs b/Main/System/Guild/GuildBaseWin.cs
index 49eedc0..2d16c81 100644
--- a/Main/System/Guild/GuildBaseWin.cs
+++ b/Main/System/Guild/GuildBaseWin.cs
@@ -22,7 +22,7 @@
     {
         guildBtn.AddListener(() =>
         {
-            // UIManager.Instance.OpenWindow<GuildWin>();
+            UIManager.Instance.OpenWindow<GuildHallWin>();
         });
         
         requestBtn.AddListener(() =>
diff --git a/Main/System/Guild/GuildChangeNameWin.cs b/Main/System/Guild/GuildChangeNameWin.cs
new file mode 100644
index 0000000..d07da07
--- /dev/null
+++ b/Main/System/Guild/GuildChangeNameWin.cs
@@ -0,0 +1,91 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+/// <summary>
+/// 鍏細鏀瑰悕鐣岄潰
+/// </summary>
+public class GuildChangeNameWin : UIBase
+{
+    [SerializeField] InputField guildNameText;
+    [SerializeField] Text cdTimeText;
+    [SerializeField] Image moneyIcon;
+    [SerializeField] Text moneyText;
+    [SerializeField] Button changeNameBtn;
+
+
+
+    protected override void InitComponent()
+    {
+        changeNameBtn.AddListener(ChangeName);
+    }
+
+    protected override void OnPreOpen()
+    {
+        GlobalTimeEvent.Instance.secondEvent += ShowTime;
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        GlobalTimeEvent.Instance.secondEvent -= ShowTime;
+    }
+
+    void Display()
+    {
+        var guildInfo = PlayerDatas.Instance.fairyData.fairy;
+        if (guildInfo == null) return;
+
+        guildNameText.text = guildInfo.FamilyName;
+        moneyIcon.SetIconWithMoneyType(GuildManager.Instance.renameFairyNameMoneyType);
+        moneyText.text = UIHelper.ShowUseMoney(GuildManager.Instance.renameFairyNameMoneyType, GuildManager.Instance.renameFairyNameCost);
+        ShowTime();
+    }
+
+    void ShowTime()
+    {
+        if (GuildManager.Instance.TryGetFamilyActions(0, out var familyActions))
+        {
+            var lastTime = familyActions.IsNullOrEmpty() ? 0 : familyActions[0].Value1;
+            var cdTime = GuildManager.Instance.renameFairyNameCD * 3600 - (TimeUtility.AllSeconds - (int)lastTime);
+            if (cdTime <= 0)
+            {
+                cdTimeText.text = Language.Get("Guild_51", GuildManager.Instance.renameFairyNameCD);
+                changeNameBtn.SetInteractable(true);
+                GlobalTimeEvent.Instance.secondEvent -= ShowTime;
+            }
+            else
+            {
+                cdTimeText.text = Language.Get("Guild_49") + TimeUtility.SecondsToHMSEx(cdTime);
+                changeNameBtn.SetInteractable(false);
+            }
+        }
+        else
+        {
+            cdTimeText.text = Language.Get("Guild_51", GuildManager.Instance.renameFairyNameCD);
+            changeNameBtn.SetInteractable(true);
+            GlobalTimeEvent.Instance.secondEvent -= ShowTime;
+        }
+
+    }
+
+
+    void ChangeName()
+    {
+        if (!UIHelper.CheckMoneyCount(GuildManager.Instance.renameFairyNameMoneyType, GuildManager.Instance.renameFairyNameCost, 2))
+        {
+            return;
+        }
+
+        if (GuildManager.Instance.CheckName(guildNameText.text))
+        {
+            UIManager.Instance.CloseWindow<GuildOPWin>();
+            var pack = new CA611_tagCMRenameFamily();
+            pack.NewName = guildNameText.text;
+            pack.NewNameLen = (byte)pack.NewName.Length;
+            // GameNetSystem.Instance.SendInfo(pack);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/Main/System/Guild/GuildChangeNameWin.cs.meta b/Main/System/Guild/GuildChangeNameWin.cs.meta
new file mode 100644
index 0000000..8785542
--- /dev/null
+++ b/Main/System/Guild/GuildChangeNameWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 12ac059709b90bd45a721f0c723b9f5f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Guild/GuildEmblemCell.cs b/Main/System/Guild/GuildEmblemCell.cs
index 2f7690d..a12a4f4 100644
--- a/Main/System/Guild/GuildEmblemCell.cs
+++ b/Main/System/Guild/GuildEmblemCell.cs
@@ -8,7 +8,7 @@
 [RequireComponent(typeof(UIEffectPlayer))]
 public class GuildEmblemCell : MonoBehaviour
 {
-    [SerializeField] ImageEx emblemIcon;
+    [SerializeField] Image emblemIcon;
     [SerializeField] UIFrame frame;
     [SerializeField] UIEffectPlayer uiEffect;
     [Header("瀛� F9E29F 鍖呰竟 683C00 瀛楀彿36 Y:-9")]
@@ -21,6 +21,11 @@
         {
             return;
         }
+        if (emblemIcon == null)
+        {
+            Debug.LogError("鍏細寰界珷鏈缃�");
+            return;
+        }
 
         // 寰界珷鍔ㄦ�佹晥鏋滄寜甯у鐞嗭紝濡傛灉鍚庣画瑕佹敼鎴恠pine鐗规晥锛屽垯鍐嶅晢璁慨鏀�
         // 鐩墠鐗规晥涓洪檮鍔犺〃鐜�
diff --git a/Main/System/Guild/GuildHallWin.cs b/Main/System/Guild/GuildHallWin.cs
new file mode 100644
index 0000000..725789d
--- /dev/null
+++ b/Main/System/Guild/GuildHallWin.cs
@@ -0,0 +1,152 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+/// <summary>
+/// 鍏細澶у巺
+/// </summary>
+public class GuildHallWin : UIBase
+{
+    [SerializeField] GuildEmblemCell guildEmblem;
+    [SerializeField] Text guildMemberCountText;
+    [SerializeField] Text totalFightPowerText;
+    [SerializeField] Button opBtn;  //绠$悊鎸夐挳
+    [SerializeField] Text guildLevelText;
+    [SerializeField] Text guildNameText; //鍔犳湇鍔″櫒淇℃伅
+    [SerializeField] Button guildLVBtn;
+    [SerializeField] Image lvExpProcess;
+    [SerializeField] Text expText;
+    [SerializeField] Text guildNumText; //鍔犲叕浼氱紪鍙�
+    [SerializeField] Button copyBtn;
+    [SerializeField] Text noticeText; //鍏憡
+    [SerializeField] Button noticeBtn; //鍏憡
+    [SerializeField] ScrollerController memberScroller;
+    [SerializeField] Button donateBtn;
+
+
+
+    protected override void InitComponent()
+    {
+        copyBtn.AddListener(() =>
+        {
+            UIHelper.CopyToClipboard(guildNumText.text);
+            SysNotifyMgr.Instance.ShowTip("GuildSys8");
+        });
+
+
+        opBtn.AddListener(() =>
+        {
+            //绠$悊鎸夐挳
+            UIManager.Instance.OpenWindow<GuildOPWin>();
+        });
+        guildLVBtn.AddListener(() =>
+        {
+            // UIManager.Instance.OpenWindow<GuildLevelUpWin>();
+        });
+
+        noticeBtn.AddListener(() =>
+        {
+            var needLV = GuildManager.Instance.GetNeedGuildJobLV((int)GuildFuncType.PublishNotice);
+            if (PlayerDatas.Instance.fairyData.mine.FmLV >= needLV)
+            {
+                // UIManager.Instance.OpenWindow<GuildNoticeWin>();
+            }
+        });
+
+        donateBtn.AddListener(() =>
+        {
+            // UIManager.Instance.OpenWindow<GuildDonateWin>();
+        });
+    }
+
+    protected override void OnPreOpen()
+    {
+        GuildManager.Instance.RequestGuildData();
+
+        GuildManager.Instance.memberOPIndex = -1;
+        GuildManager.Instance.MemberOPIndexEvent += OnMemberOPIndexEvent;
+        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo;
+        memberScroller.OnRefreshCell += OnRefreshCell;
+        memberScroller.OnGetDynamicSize += OnGetDynamicSize;
+        memberScroller.lockType = EnhanceLockType.KeepVertical2;
+        Display();
+        memberScroller.JumpIndex(0);
+    }
+
+    protected override void OnPreClose()
+    {
+        memberScroller.OnRefreshCell -= OnRefreshCell;
+        GuildManager.Instance.MemberOPIndexEvent -= OnMemberOPIndexEvent;
+        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyInfo;
+        memberScroller.OnGetDynamicSize -= OnGetDynamicSize;
+
+    }
+
+    void Display()
+    {
+        var guildInfo = PlayerDatas.Instance.fairyData.fairy;
+        if (guildInfo == null) return;
+
+        CreateMemberScroller();
+
+        var config = FamilyConfig.Get(guildInfo.FamilyLV);
+        guildEmblem.Display(guildInfo.EmblemID, guildInfo.EmblemWord, 1.3f);
+        guildMemberCountText.text = guildInfo.MemberCount + "/" + config.MemberMax;
+        totalFightPowerText.text = UIHelper.ReplaceLargeArtNum(guildInfo.totalFightPower);
+        guildLevelText.text = Language.Get("L1094") + guildInfo.FamilyLV;
+        guildNameText.text = guildInfo.FamilyName + Language.Get("L1039", ServerListCenter.Instance.GetServerName(guildInfo.ServerID));
+        guildNumText.text = GuildManager.Instance.EncryptGuildID(guildInfo.FamilyID);
+        noticeText.text = string.IsNullOrEmpty(guildInfo.Broadcast) ? Language.Get("Guild_62") : guildInfo.Broadcast;
+        lvExpProcess.fillAmount = (float)guildInfo.FamilyLVExp / config.NeedExp;
+        expText.text = guildInfo.FamilyLVExp + "/" + config.NeedExp;
+
+    }
+
+    void OnRefreshFairyInfo()
+    {
+        Display();
+    }
+
+    bool OnGetDynamicSize(ScrollerDataType type, int index, out float height)
+    {
+        height = type == ScrollerDataType.Header ? 153 : 70;
+        return true;
+    }
+
+    void CreateMemberScroller()
+    {
+        memberScroller.Refresh();
+        for (int i = 0; i < PlayerDatas.Instance.fairyData.fairy.MemberCount; i++)
+        {
+            memberScroller.AddCell(ScrollerDataType.Header, i);
+            if (GuildManager.Instance.memberOPIndex == i)
+            {
+                memberScroller.AddCell(ScrollerDataType.Normal, i);
+            }
+        }
+        memberScroller.Restart();
+    }
+
+
+    void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        if (type == ScrollerDataType.Header)
+        {
+            var _cell = cell as GuildMemberCell;
+            _cell.Display(cell.index);
+        }
+        else if (type == ScrollerDataType.Normal)
+        {
+            var _cell = cell as GuildMemberOPCell;
+            _cell.Display(cell.index, false);
+        }
+    }
+
+    void OnMemberOPIndexEvent()
+    {
+        // var lastPosition = memberScroller.m_Scorller.ScrollPosition;
+        CreateMemberScroller();
+        // memberScroller.m_Scorller.ScrollPosition = lastPosition + (GuildManager.Instance.memberOPIndex != -1 ? 74 : 0);
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Guild/GuildHallWin.cs.meta b/Main/System/Guild/GuildHallWin.cs.meta
new file mode 100644
index 0000000..32bdff8
--- /dev/null
+++ b/Main/System/Guild/GuildHallWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 7d99139cdabd05c4482476feab2dfab1
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Guild/GuildJoinWin.cs b/Main/System/Guild/GuildJoinWin.cs
index 10aeb88..1d1be7d 100644
--- a/Main/System/Guild/GuildJoinWin.cs
+++ b/Main/System/Guild/GuildJoinWin.cs
@@ -42,19 +42,15 @@
         guildListScroller.OnRefreshCell -= RefreshCell;
         PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyInfo;
 
-        var win = UIManager.Instance.GetUI<MainWin>();
-        if (win)
-            win.RestoreFuncBtn();
-        
+        UIManager.Instance.GetUI<MainWin>()?.RestoreFuncBtn();
+
     }
 
     void OnRefreshFairyInfo()
     {
         //褰撳墠鐣岄潰涓嬫湁鍒锋柊鑷鐨勫叕浼氭暟鎹紝璇存槑涓�瀹氭槸鍔犲叆浜嗗叕浼氾紝闇�涓诲姩璺宠浆鍒板叕浼氱晫闈�
         CloseWindow();
-        var win = UIManager.Instance.GetUI<MainWin>();
-        if (win)
-            win.ClickFunc(4);
+        UIManager.Instance.GetUI<MainWin>()?.ClickFunc(4);
     }
 
     void Display()
diff --git a/Main/System/Guild/GuildManager.cs b/Main/System/Guild/GuildManager.cs
index 1bb39f7..f195061 100644
--- a/Main/System/Guild/GuildManager.cs
+++ b/Main/System/Guild/GuildManager.cs
@@ -15,20 +15,36 @@
     public Dictionary<int, Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction[]>> familyActions = new Dictionary<int, Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction[]>>();
     public event Action<int, int> FamilyActionInfoEvent;    //鍏細鑷畾涔夎褰�, 鍏朵粬鍔熻兘浠庤繖鑾峰彇
 
+    //瑕佹搷浣滃摢涓垚鍛樼殑绱㈠紩
+    int m_MemberOPIndex = -1;
+    public event Action MemberOPIndexEvent;
+    public int memberOPIndex
+    {
+        get { return m_MemberOPIndex; }
+        set
+        {
+            m_MemberOPIndex = value;
+            MemberOPIndexEvent?.Invoke();
+        }
+    }
+
     public override void Init()
     {
         ParseConfig();
-        // PlayerDatas.Instance.fairyData.OnRefreshFairyMine += OnRefreshFairyMine;
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
     }
     public override void Release()
     {
-        // PlayerDatas.Instance.fairyData.OnRefreshFairyMine -= OnRefreshFairyMine;
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
     }
 
 
     public void OnBeforePlayerDataInitialize()
+    {
+        ClearGuildData();
+    }
+
+    void ClearGuildData()
     {
         m_FairyRequesteds.Clear();
         familyActions.Clear();
@@ -36,16 +52,14 @@
         applyList.Clear();
         PlayerDatas.Instance.fairyData.ClearData();
     }
-
-
-
-    private void OnRefreshFairyMine()
+    
+    public void ClearGuildWhenQuit()
     {
-        if (!PlayerDatas.Instance.fairyData.HasFairy)
-        {
-            //閫�鍑哄叕浼�
-            familyActions.Clear();
-        }
+        //閫�鍑哄叕浼�
+        ClearGuildData();
+
+        //闇�瑕佽浆鍒癏omeWin鐣岄潰 涓斿叧闂叕浼氱浉鍏崇晫闈�(鐖跺瓙缁ф壙鍏抽棴)
+        UIManager.Instance.GetUI<MainWin>()?.ClickFunc(0);
     }
 
 
@@ -80,6 +94,9 @@
 
     void ParseConfig()
     {
+        DirtyWordConfig.DirtyWordInit();
+        DirtyNameConfig.DirtyNameInit();
+
         var config = FuncConfigConfig.Get("CreateFamily");
         createFairyCost = int.Parse(config.Numerical1);
         createMoneyType = int.Parse(config.Numerical2);
@@ -104,8 +121,8 @@
         config = FuncConfigConfig.Get("FamilyRename");
         renameFairyNameCD = int.Parse(config.Numerical2);
         var arr = ConfigParse.GetMultipleStr<int>(config.Numerical1);
-        renameFairyNameCost = arr[0];
-        renameFairyNameMoneyType = arr[1];
+        renameFairyNameMoneyType = arr[0];
+        renameFairyNameCost = arr[1];
 
     }
 
@@ -212,19 +229,21 @@
         if (quitType == 0)
         {
             //琚涪
-            quitCount = PlayerDatas.Instance.baseData.leaveGuildInfo / 10 % 10;
+            quitCount = PlayerDatas.Instance.baseData.leaveGuildInfo / 10 % 10 - 1;
+            if (quitCount < 0) return 0;
             if (beQuitGuildPunishTime.Length != 0)
                 punishTime = beQuitGuildPunishTime[Math.Min(quitCount, beQuitGuildPunishTime.Length - 1)];
         }
         else if (quitType == 1)
         {
             //涓诲姩閫�鍑�
-            quitCount = PlayerDatas.Instance.baseData.leaveGuildInfo / 100;
+            quitCount = PlayerDatas.Instance.baseData.leaveGuildInfo / 100 - 1;
+            if (quitCount < 0) return 0;
             if (quitGuildPunishTime.Length != 0)
                 punishTime = quitGuildPunishTime[Math.Min(quitCount, quitGuildPunishTime.Length - 1)];
         }
 
-        return TimeUtility.AllSeconds - PlayerDatas.Instance.baseData.leaveFamilyTime - punishTime * 60;
+        return punishTime * 60 - (TimeUtility.AllSeconds - PlayerDatas.Instance.baseData.leaveFamilyTime);
     }
 
 
@@ -249,27 +268,8 @@
             return;
         }
 
-        int error;
-
-        //鑾峰彇name鐨勫瓧鑺傞暱搴︼紝name鍙兘鏄腑鏂� 鎴栬�呭叾浠栧崰鐢�3涓瓧绗︾殑绗﹀彿
-        if (!UIHelper.SatisfyNameLength(name, out error))
+        if (!CheckName(name))
         {
-            // TODO 鏆傛椂鎸変腑鏂囬暱搴︽彁绀�, 涓嶅悓璇█鍙牴鎹儏鍐典慨鏀�
-            if (error == 1)
-            {
-                SysNotifyMgr.Instance.ShowTip("NameError2", 7);
-                return;
-            }
-            else if (error == 2)
-            {
-                SysNotifyMgr.Instance.ShowTip("NameError1", 2);
-                return;
-            }
-        }
-
-        if (!CheckFairyNameLimit(name, out error))
-        {
-            ShowFairyNameErrorTip(error);
             return;
         }
 
@@ -279,6 +279,35 @@
         pack.EmblemWord = emblemWord;
         GameNetSystem.Instance.SendInfo(pack);
 
+    }
+
+    public bool CheckName(string name)
+    {
+        int error;
+
+        //鑾峰彇name鐨勫瓧鑺傞暱搴︼紝name鍙兘鏄腑鏂� 鎴栬�呭叾浠栧崰鐢�3涓瓧绗︾殑绗﹀彿
+        if (!UIHelper.SatisfyNameLength(name, out error))
+        {
+            // TODO 鏆傛椂鎸変腑鏂囬暱搴︽彁绀�, 涓嶅悓璇█鍙牴鎹儏鍐典慨鏀�
+            if (error == 1)
+            {
+                SysNotifyMgr.Instance.ShowTip("NameError2", 7);
+                return false;
+            }
+            else if (error == 2)
+            {
+                SysNotifyMgr.Instance.ShowTip("NameError1", 2);
+                return false;
+            }
+        }
+
+        if (!CheckFairyNameLimit(name, out error))
+        {
+            ShowFairyNameErrorTip(error);
+            return false;
+        }
+
+        return true;
     }
 
     #endregion
@@ -320,7 +349,7 @@
 
 
 
-    // 鍏細鑷畾涔夎褰�
+    #region  鍏細鑷畾涔夎褰�
     public void UpdateFamilyAction(HA513_tagMCFamilyActionInfo _package)
     {
 
@@ -349,6 +378,16 @@
             return false;
         return true;
     }
+
+    public void QueryFamilyAction(int familyID, int actionType)
+    {
+        var pack = new CA617_tagCMQueryFamilyAction();
+        pack.FamilyID = (ushort)familyID;
+        pack.ActionType = (byte)actionType;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    #endregion
 
 
 
@@ -498,6 +537,12 @@
 
         if (type == 0)
         {
+            if (m_FairyRequesteds.Count >= requestGuildCount)
+            {
+                SysNotifyMgr.Instance.ShowTip("GuildSys9");
+                return;
+            }
+
             var cdSeconds = GetJoinCD();
             if (cdSeconds > 0)
             {
@@ -543,14 +588,22 @@
 
     #endregion
 
-
+    float lastChangeMarkTime = 0;   //鎵撳紑鐣岄潰鎯呭喌涓嬮伩鍏嶇煭鏃堕棿澶氭绔嬪嵆璇锋眰锛孋/S閫氫俊涔熸槸鏈夋椂闂撮棿闅�
     public bool guildChanged = false;
+    //Type锛�0-鏃狅紱1-鎴愬憳鍔犲叆锛�2-鎴愬憳閫�鍑猴紱3-鏀朵汉璁剧疆淇敼锛�4-鍏憡淇敼锛�5-寰界珷淇敼锛�6-鐩熶富鍙樻洿锛�7-鎴愬憳鑱屼綅鍙樻洿锛�8-鎴愬憳涓婄嚎锛�9-鎴愬憳绂荤嚎锛�
     //鍏細鏁版嵁鍙樺寲锛岃姹傛柊鐨勫叕浼氫俊鎭紝濡傚湪鎵撳紑鍏細鍒楄〃鏃惰姹傦紝鍏朵粬鍔熻兘鏍规嵁鑷韩鎯呭喌璇锋眰
     public void UpdateGuildDataChangeMark(HA521_tagMCFamilyChange netPack)
     {
-        if (netPack.Type > 0)
+        guildChanged = true;
+        if (Time.time - lastChangeMarkTime < 0.2f)
         {
-            guildChanged = true;
+            //灏忎紭鍖� 濡傛灉鏈夐棶棰樹篃鍙互鍘婚櫎
+            return;
+        }
+        lastChangeMarkTime = Time.time;
+        if (UIManager.Instance.IsOpened<GuildHallWin>())
+        {
+            RequestGuildData();
         }
     }
 
@@ -572,6 +625,54 @@
         GameNetSystem.Instance.SendInfo(pak);
     }
 
+
+    //鑾峰彇闇�瑕佸叕浼氳亴浣嶇瓑绾�
+    public int GetNeedGuildJobLV(int guildFuncID)
+    {
+        if (guildWorkToLevel.ContainsKey(guildFuncID))
+        {
+            return guildWorkToLevel[guildFuncID];
+        }
+        return 0;
+    }
+
+
+    public void SendChangeMemberLV(int playerID, int lv)
+    {
+        var pack = new CA625_tagCMChangeFamilyMemLV();
+        pack.PlayerID = (uint)playerID;
+        pack.FmLV = (byte)lv;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    public void KickMember(int playerID)
+    {
+        var pack = new CA605_tagCMDeleteFamilyMember();
+        pack.MemberID = (uint)playerID;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    public void QuitGuild()
+    {
+
+        ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"),
+        Language.Get("Guild_46"), (bool isOK) =>
+            {
+                if (isOK)
+                {
+                    if (PlayerDatas.Instance.fairyData.fairy.MemberCount > 1 &&
+                    PlayerDatas.Instance.fairyData.mine.FmLV == 3)
+                    {
+                        SysNotifyMgr.Instance.ShowTip("GuildSys15");
+                        return;
+                    }
+                    var pack = new CA603_tagCMLeaveFamily();
+                    GameNetSystem.Instance.SendInfo(pack);
+                }
+            });
+
+
+    }
 
     #region 鍔犲瘑鏁板瓧
 
@@ -611,7 +712,7 @@
             SysNotifyMgr.Instance.ShowTip("GuildSys6");
             return "";
         }
-        
+
         encryptedStr = encryptedStr.Substring(1);
 
         if (reverseMap.IsNullOrEmpty())
@@ -629,8 +730,8 @@
         }
         return originalStr.ToString().TrimStart('0'); // 鍘婚櫎鍓嶅闆�
     }
-    
-    
+
+
     int[] GenerateReverseMap(int[] map)
     {
         for (int i = 0; i < map.Length; i++)
@@ -643,4 +744,14 @@
 
     #endregion
 
+}
+
+// 鏉冮檺ID: 1-鏀朵汉锛�2-鍙樻洿鑱屼綅锛�3-鍙戝竷鍏憡锛�4-韪汉
+public enum GuildFuncType
+{
+    Accept = 1,
+    ChangeJob = 2,
+    PublishNotice = 3,
+    Kick = 4,
+
 }
\ No newline at end of file
diff --git a/Main/System/Guild/GuildMemberCell.cs b/Main/System/Guild/GuildMemberCell.cs
new file mode 100644
index 0000000..320cc00
--- /dev/null
+++ b/Main/System/Guild/GuildMemberCell.cs
@@ -0,0 +1,96 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+/// <summary>
+/// 鍏細澶у巺 鎴愬憳
+/// </summary>
+public class GuildMemberCell : CellView
+{
+    
+    [SerializeField] AvatarCell avatarCell;
+    [SerializeField] OfficialTitleCell titleCell;
+    [SerializeField] Text lvText;
+    [SerializeField] Text guildJobText;
+    [SerializeField] Image guildJobImg;
+    [SerializeField] Text nameText;
+    [SerializeField] Text fightPowerText;
+    [SerializeField] Button seePlayerBtn;
+    [SerializeField] Text contribText;
+    [SerializeField] Text loginTimeText;
+
+    [SerializeField] Button showOpBtn;
+    [SerializeField] Image showArrowImg;
+
+
+
+    public void Display(int index)
+    {
+        var playerID = PlayerDatas.Instance.fairyData.memberIDList[index];
+        var playerInfo = PlayerDatas.Instance.fairyData.GetMember(playerID);
+        nameText.text = playerInfo.Name;
+
+        avatarCell.InitUI(AvatarHelper.GetAvatarModel(0, playerInfo.Face, playerInfo.FacePic));
+        titleCell.InitUI(playerInfo.RealmLV, playerInfo.TitleID);
+        lvText.text = playerInfo.LV.ToString();
+        if (playerInfo.FmLV > 0)
+        {
+            guildJobImg.SetActive(true);
+            guildJobText.text = RichTextMsgReplaceConfig.GetRichReplace("FAMILY", playerInfo.FmLV);
+            guildJobImg.SetSprite("GuildJob" + playerInfo.FmLV);
+        }
+        else
+        {
+            guildJobImg.SetActive(false);
+        }
+
+        fightPowerText.text = UIHelper.ReplaceLargeArtNum(playerInfo.FightPower);
+
+        seePlayerBtn.AddListener(() =>
+        {
+            OtherPlayerDetailManager.Instance.ViewPlayerDetail(playerID);
+            GuildManager.Instance.memberOPIndex = -1;   //闄勫甫鍏抽棴鑱屼綅璋冩暣鎿嶄綔
+        });
+
+        contribText.text = playerInfo.ContribDay + "/" + playerInfo.ContribTotal;
+        int leftTime = TimeUtility.AllSeconds - playerInfo.OffTime;
+        if (playerInfo.OffTime == 0)
+        {
+            loginTimeText.text = UIHelper.AppendColor(TextColType.Green, Language.Get("L1025"));
+        }
+        else if (leftTime < 60)
+        {
+            loginTimeText.text = Language.Get("Guild_63");    //鍒氬垰鍦ㄧ嚎
+        }
+        else
+        {
+            loginTimeText.text = Language.Get("Guild_61", TimeUtility.SecondsToConsumeRebate(leftTime));
+        }        
+
+
+        showOpBtn.SetActive(PlayerDatas.Instance.fairyData.mine.FmLV >= GuildManager.Instance.GetNeedGuildJobLV((int)GuildFuncType.ChangeJob)
+        && PlayerDatas.Instance.fairyData.mine.FmLV > playerInfo.FmLV);
+
+        showOpBtn.AddListener(() =>
+        {
+            if (GuildManager.Instance.memberOPIndex == index)
+            {
+                GuildManager.Instance.memberOPIndex = -1;
+                return;
+            }
+            GuildManager.Instance.memberOPIndex = index;
+        });
+
+        if (GuildManager.Instance.memberOPIndex == index)
+        {
+            //灞曞紑
+            showArrowImg.transform.localScale = new Vector3(1, 1, 1);
+        }
+        else
+        {
+            showArrowImg.transform.localScale = new Vector3(1, -1, 1);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/Main/System/Guild/GuildMemberCell.cs.meta b/Main/System/Guild/GuildMemberCell.cs.meta
new file mode 100644
index 0000000..f4cffca
--- /dev/null
+++ b/Main/System/Guild/GuildMemberCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: fea255f7bfd0f2448b0cc267b99cbd62
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Guild/GuildMemberOPCell.cs b/Main/System/Guild/GuildMemberOPCell.cs
new file mode 100644
index 0000000..0ec4fcf
--- /dev/null
+++ b/Main/System/Guild/GuildMemberOPCell.cs
@@ -0,0 +1,125 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+/// <summary>
+/// 鍏細澶у巺 鎴愬憳璋冩暣锛岃涪鍑�
+/// </summary>
+public class GuildMemberOPCell : CellView
+{
+
+
+    [SerializeField] Button kickBtn;
+    [SerializeField] Button opearteJobBtn;
+
+    [SerializeField] Button normalJobBtn;
+    [SerializeField] Button leaderJobBtn;
+    [SerializeField] Button viceLeaderJobBtn;
+    [SerializeField] Button eliteJobBtn;
+
+    bool showBtn = false;
+    public void Display(int index, bool _showBtn)
+    {
+        var playerID = PlayerDatas.Instance.fairyData.memberIDList[index];
+        var playerInfo = PlayerDatas.Instance.fairyData.GetMember(playerID);
+        var config = FamilyConfig.Get(PlayerDatas.Instance.fairyData.fairy.FamilyLV);
+
+        showBtn = _showBtn;
+
+        opearteJobBtn.AddListener(() =>
+        {
+            showBtn = !showBtn;
+            UpdateBtn();
+        });
+
+        UpdateBtn();
+
+        normalJobBtn.AddListener(() =>
+        {
+            ChangeFMLV(playerInfo, 0);
+        });
+
+        eliteJobBtn.AddListener(() =>
+        {
+            ChangeFMLV(playerInfo, 1);
+        });
+
+
+        viceLeaderJobBtn.AddListener(() =>
+        {
+            if (PlayerDatas.Instance.fairyData.deputyLeaderPlayerIDList.Count >= config.DeputyLeaderMax)
+            {
+                SysNotifyMgr.Instance.ShowTip("GuildSys10");
+                return;
+            }
+            ChangeFMLV(playerInfo, 2);
+        });
+
+        leaderJobBtn.AddListener(() =>
+        {
+            if (PlayerDatas.Instance.fairyData.mine.FmLV != 3)
+                return;
+            if (playerInfo.FmLV != 2)
+            {
+                SysNotifyMgr.Instance.ShowTip("GuildSys12");
+                return;
+            }
+
+            ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"),
+            Language.Get("Guild_28", playerInfo.Name), (bool isOK) =>
+                {
+                    if (isOK)
+                    {
+                        GuildManager.Instance.SendChangeMemberLV(playerInfo.PlayerID, 3);
+                        SysNotifyMgr.Instance.ShowTip("GuildSys13");
+                        GuildManager.Instance.memberOPIndex = -1;
+                    }
+                });
+        });
+
+
+        kickBtn.AddListener(() =>
+        {
+            ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"),
+            Language.Get("Guild_33", playerInfo.Name), (bool isOK) =>
+                {
+                    if (isOK)
+                    {
+                        GuildManager.Instance.KickMember(playerID);
+                        GuildManager.Instance.memberOPIndex = -1;
+                    }
+                });
+
+        });
+
+    }
+
+    void UpdateBtn()
+    {
+        leaderJobBtn.SetActive(showBtn && PlayerDatas.Instance.fairyData.mine.FmLV == 3);
+        viceLeaderJobBtn.SetActive(showBtn && PlayerDatas.Instance.fairyData.mine.FmLV == 3);
+        eliteJobBtn.SetActive(showBtn && PlayerDatas.Instance.fairyData.mine.FmLV >= 2);
+        normalJobBtn.SetActive(showBtn && PlayerDatas.Instance.fairyData.mine.FmLV >= 2);
+    }
+
+
+    void ChangeFMLV(FairyMember playerInfo, int lv)
+    {
+        if (playerInfo.FmLV == lv)
+        {
+            SysNotifyMgr.Instance.ShowTip("GuildSys14");
+            return;
+        }
+        ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"),
+        Language.Get("Guild_31", playerInfo.Name, lv), (bool isOK) =>
+            {
+                if (isOK)
+                {
+                    GuildManager.Instance.SendChangeMemberLV(playerInfo.PlayerID, lv);
+                    GuildManager.Instance.memberOPIndex = -1;
+                }
+            });
+
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Guild/GuildMemberOPCell.cs.meta b/Main/System/Guild/GuildMemberOPCell.cs.meta
new file mode 100644
index 0000000..4519f81
--- /dev/null
+++ b/Main/System/Guild/GuildMemberOPCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ea4e05570ea5b704b86795af96542119
+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
new file mode 100644
index 0000000..4f8b758
--- /dev/null
+++ b/Main/System/Guild/GuildOPWin.cs
@@ -0,0 +1,84 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+/// <summary>
+/// 鍏細绠$悊鐣岄潰
+/// </summary>
+public class GuildOPWin : UIBase
+{
+    [SerializeField] Text guildNameText;
+    [SerializeField] Button changeNameBtn;
+    [SerializeField] GuildEmblemCell guildEmblem;
+    [SerializeField] Button changeEmblemBtn;
+    [SerializeField] Button quitBtn;
+    [SerializeField] Button noteBtn;    //鑱屼綅鍙樻洿鍜岀帺瀹惰繘鍑烘棩蹇�
+    
+
+
+
+    protected override void InitComponent()
+    {
+
+        changeEmblemBtn.AddListener(() =>
+        {
+            UIManager.Instance.OpenWindow<GuildEmblemWin>();
+        });
+
+        changeNameBtn.AddListener(() =>
+        {
+            if (PlayerDatas.Instance.fairyData.mine.FmLV != 3)
+            {
+                SysNotifyMgr.Instance.ShowTip("GuildSys16");
+                return;
+            }
+            UIManager.Instance.OpenWindow<GuildChangeNameWin>();
+        });
+
+        quitBtn.AddListener(() =>
+        {
+            GuildManager.Instance.QuitGuild();
+        });
+        
+        noteBtn.AddListener(() =>
+        {
+            // UIManager.Instance.OpenWindow<GuildNoteWin>();
+        });
+        
+    }
+
+    protected override void OnPreOpen()
+    {
+        GuildManager.Instance.RequestGuildData();
+
+        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo;
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyInfo;
+
+    }
+
+    void Display()
+    {
+        var guildInfo = PlayerDatas.Instance.fairyData.fairy;
+        if (guildInfo == null) return;
+
+
+        guildEmblem.Display(guildInfo.EmblemID, guildInfo.EmblemWord, 1.4f);
+
+        guildNameText.text = guildInfo.FamilyName;
+
+
+    }
+
+    void OnRefreshFairyInfo()
+    {
+    }
+
+
+
+}
\ No newline at end of file
diff --git a/Main/System/Guild/GuildOPWin.cs.meta b/Main/System/Guild/GuildOPWin.cs.meta
new file mode 100644
index 0000000..7ddce6a
--- /dev/null
+++ b/Main/System/Guild/GuildOPWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 464f807cfa1376b418207d585b714fca
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Guild/GuildPreviewWin.cs b/Main/System/Guild/GuildPreviewWin.cs
index eb15938..4bfd87f 100644
--- a/Main/System/Guild/GuildPreviewWin.cs
+++ b/Main/System/Guild/GuildPreviewWin.cs
@@ -42,8 +42,6 @@
 
         copyBtn.AddListener(() =>
         {
-            var guildInfo = GuildManager.Instance.guildsDict[guildID];
-            if (guildInfo == null) return;
             UIHelper.CopyToClipboard(guildNumText.text);
             SysNotifyMgr.Instance.ShowTip("GuildSys8");
         });
@@ -83,7 +81,7 @@
         guildNameText.text = guildInfo.FamilyName + Language.Get("L1039", ServerListCenter.Instance.GetServerName(guildInfo.ServerID));
         guildNumText.text = GuildManager.Instance.EncryptGuildID(guildInfo.FamilyID);
         leaderNameText.text = guildInfo.LeaderName;
-        noticeText.text = guildInfo.Broadcast;
+        noticeText.text = string.IsNullOrEmpty(guildInfo.Broadcast) ? Language.Get("Guild_62") : guildInfo.Broadcast;
 
 
         var state = GuildManager.Instance.GetRequestState(guildInfo);
diff --git a/Main/System/Guild/PlayerFairyData.cs b/Main/System/Guild/PlayerFairyData.cs
index d058ee8..7b21d7f 100644
--- a/Main/System/Guild/PlayerFairyData.cs
+++ b/Main/System/Guild/PlayerFairyData.cs
@@ -23,14 +23,15 @@
     public FairyMember mine = null;
     public event Action OnRefreshFairyInfo;
     public event Action OnRefreshFairyMine; //鐜╁鍦ㄥ叕浼氶噷鐨勬暟鎹�
-    private Dictionary<int, FairyMember> memberDic = new Dictionary<int, FairyMember>();
+    Dictionary<int, FairyMember> memberDic = new Dictionary<int, FairyMember>();
+    public List<int> memberIDList = new List<int>();
 
     // 0-鎴愬憳锛�1-绮捐嫳锛�2-鍓洘涓伙紝3-鐩熶富
     public int leaderID;
     // // 绮捐嫳
-    // public List<int> elitePlayerIDList = new List<int>();
+    public List<int> elitePlayerIDList = new List<int>();
     // // 鍓洘涓�
-    // public List<int> deputyLeaderPlayerIDList = new List<int>();
+    public List<int> deputyLeaderPlayerIDList = new List<int>();
 
     public void OnRefreshGuildInfo(HA520_tagMCRoleFamilyInfo vNetData)
     {
@@ -55,6 +56,8 @@
         mine = null;
 
         memberDic.Clear();
+        memberIDList.Clear();
+        deputyLeaderPlayerIDList.Clear();
         for (int i = 0; i < vNetData.MemberCount; i++)
         {
             FairyMember member = new FairyMember();
@@ -89,17 +92,20 @@
 
             // if (member.FmLV == 1)
             // {
-            //     eliteList.Add(member);
+            //     elitePlayerIDList.Add(member.PlayerID);
             // }
-            // else if (member.FamilyLV == 2)
-            // {
-            //     deputyLeaderList.Add(member);
-            // }
+            if (member.FmLV == 2)
+            {
+                deputyLeaderPlayerIDList.Add(member.PlayerID);
+            }
             if (member.FmLV == 3)
             {
                 leaderID = (int)member.PlayerID;
             }
         }
+
+        memberIDList.AddRange(memberDic.Keys);
+        memberIDList.Sort(SortMember);
 
         if (OnRefreshFairyInfo != null) OnRefreshFairyInfo();
     }
@@ -128,9 +134,31 @@
         fairy = null;
         mine = null;
         memberDic.Clear();
+        memberIDList.Clear();
         leaderID = 0;
     }
 
+    int SortMember(int id1, int id2)
+    {
+        var memberA = memberDic[id1];
+        var memberB = memberDic[id2];
+        if (memberA.FmLV != memberB.FmLV)
+        {
+            return memberB.FmLV.CompareTo(memberA.FmLV);
+        }
+
+        if (memberA.FightPower != memberB.FightPower)
+        {
+            return memberB.FightPower.CompareTo(memberA.FightPower);
+        }
+
+        if (memberA.JoinTime != memberB.JoinTime)
+        {
+            return memberA.JoinTime.CompareTo(memberB.JoinTime);
+        }
+        return memberA.PlayerID.CompareTo(memberB.PlayerID);
+    }
+
 }
 
 
diff --git a/Main/System/Main/MainWin.cs b/Main/System/Main/MainWin.cs
index 1bfb8f6..429a2d9 100644
--- a/Main/System/Main/MainWin.cs
+++ b/Main/System/Main/MainWin.cs
@@ -369,6 +369,7 @@
     //澶栭儴璋冪敤鐐瑰嚮鍔熻兘
     public void ClickFunc(int functionOrder)
     {
+        tabButtons[functionOrder].SelectBtn();
         tabButtons[functionOrder].onClick.Invoke();
     }
 
diff --git a/Main/System/Scroll/ScrollerController.cs b/Main/System/Scroll/ScrollerController.cs
index c9aab16..6449f17 100644
--- a/Main/System/Scroll/ScrollerController.cs
+++ b/Main/System/Scroll/ScrollerController.cs
@@ -13,8 +13,8 @@
     LockVerticalTop,
     LockVerticalBottom,
     KeepHorizon,
-    KeepVertical,
-    KeepVertical2,
+    KeepVertical,   //鍦ㄦ粴鍔ㄨ鍥惧唴瀹规洿鏂版垨鍒锋柊鏃�,淇濇寔褰撳墠浣嶇疆涓嶅彉 缃《鏄剧ず
+    KeepVertical2,  //鍦ㄦ粴鍔ㄨ鍥惧唴瀹规洿鏂版垨鍒锋柊鏃�,淇濇寔褰撳墠浣嶇疆涓嶅彉 缃簳鏄剧ず
 }
 public class ScrollerController : MonoBehaviour, IEnhancedScrollerDelegate {
 

--
Gitblit v1.8.0