hch
7 天以前 911a0b72e3415c9d3aba121bc532160da77c1afa
65 子 【公会】基础主体 / 【公会】基础主体-客户端
11个文件已修改
10个文件已添加
900 ■■■■■ 已修改文件
Main/Core/GameEngine/Player/PlayerDatas.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/GMCommand/GMInputWin.cs 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildBaseWin.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildChangeNameWin.cs 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildChangeNameWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildEmblemCell.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildHallWin.cs 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildHallWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildJoinWin.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildManager.cs 197 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildMemberCell.cs 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildMemberCell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildMemberOPCell.cs 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildMemberOPCell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildOPWin.cs 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildOPWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildPreviewWin.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/PlayerFairyData.cs 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Main/MainWin.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Scroll/ScrollerController.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
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);
    }
}
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>();
Main/System/Guild/GuildBaseWin.cs
@@ -22,7 +22,7 @@
    {
        guildBtn.AddListener(() =>
        {
            // UIManager.Instance.OpenWindow<GuildWin>();
            UIManager.Instance.OpenWindow<GuildHallWin>();
        });
        
        requestBtn.AddListener(() =>
Main/System/Guild/GuildChangeNameWin.cs
New file
@@ -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);
        }
    }
}
Main/System/Guild/GuildChangeNameWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 12ac059709b90bd45a721f0c723b9f5f
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
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;
        }
        // 徽章动态效果按帧处理,如果后续要改成spine特效,则再商议修改
        // 目前特效为附加表现
Main/System/Guild/GuildHallWin.cs
New file
@@ -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);
    }
}
Main/System/Guild/GuildHallWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7d99139cdabd05c4482476feab2dfab1
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
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()
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();
        //需要转到HomeWin界面 且关闭公会相关界面(父子继承关闭)
        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;   //打开界面情况下避免短时间多次立即请求,C/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,
}
Main/System/Guild/GuildMemberCell.cs
New file
@@ -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);
        }
    }
}
Main/System/Guild/GuildMemberCell.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: fea255f7bfd0f2448b0cc267b99cbd62
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Guild/GuildMemberOPCell.cs
New file
@@ -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;
                }
            });
    }
}
Main/System/Guild/GuildMemberOPCell.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ea4e05570ea5b704b86795af96542119
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Guild/GuildOPWin.cs
New file
@@ -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()
    {
    }
}
Main/System/Guild/GuildOPWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 464f807cfa1376b418207d585b714fca
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
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);
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);
    }
}
Main/System/Main/MainWin.cs
@@ -369,6 +369,7 @@
    //外部调用点击功能
    public void ClickFunc(int functionOrder)
    {
        tabButtons[functionOrder].SelectBtn();
        tabButtons[functionOrder].onClick.Invoke();
    }
Main/System/Scroll/ScrollerController.cs
@@ -13,8 +13,8 @@
    LockVerticalTop,
    LockVerticalBottom,
    KeepHorizon,
    KeepVertical,
    KeepVertical2,
    KeepVertical,   //在滚动视图内容更新或刷新时,保持当前位置不变 置顶显示
    KeepVertical2,  //在滚动视图内容更新或刷新时,保持当前位置不变 置底显示
}
public class ScrollerController : MonoBehaviour, IEnhancedScrollerDelegate {