少年修仙传客户端代码仓库
hch
2024-11-12 1fa7a1b54585fbf9eb70e9635b7159315d1d2627
10273 【越南】【英语】【砍树】仙盟珍宝阁
12个文件已修改
14个文件已添加
746 ■■■■■ 已修改文件
Core/GameEngine/DataToCtl/PackageRegedit.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Player/Character/PlayerBaseData.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Player/Fairy/PlayerFairyData.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Player/PlayerDatas.cs 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ClientPack/ClientToMapServer/CA6_Family/CA616_tagCMZhenbaogeOP.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ClientPack/ClientToMapServer/CA6_Family/CA616_tagCMZhenbaogeOP.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA403_tagGCFamilyActionInfo.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA512_tagMCFamilyZhenbaogeInfo.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA512_tagMCFamilyZhenbaogeInfo.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HA5_Family/HA512_tagMCFamilyZhenbaogeInfo.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HA5_Family/HA512_tagMCFamilyZhenbaogeInfo.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FairyBasicFunctionWin.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FairyModel.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FairyNewModel.cs 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FamilyZBGCell.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FamilyZBGCell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FamilyZBGNoCutCell.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FamilyZBGNoCutCell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FamilyZBGNoCutWin.cs 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FamilyZBGNoCutWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FamilyZBGWin.cs 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FamilyZBGWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyEmblem/FairyEmblemModel.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Utility/EnumHelper.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Utility/TimeUtility.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Utility/UIHelper.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/DataToCtl/PackageRegedit.cs
@@ -599,7 +599,7 @@
        Register(typeof(HB117_tagMCFaceInfo), typeof(DTCB117_tagMCFaceInfo));
        Register(typeof(HB118_tagMCFacePicInfo), typeof(DTCB118_tagMCFacePicInfo));
        Register(typeof(HA721_tagMCEmojiPackInfo), typeof(DTCA721_tagMCEmojiPackInfo));
        Register(typeof(HA512_tagMCFamilyZhenbaogeInfo), typeof(DTCA512_tagMCFamilyZhenbaogeInfo));
    }
Core/GameEngine/Model/Player/Character/PlayerBaseData.cs
@@ -102,6 +102,7 @@
    public int skillReducePerG; //射日神弓技能减伤百分比
    public int mapRealmSelect;  //地图境界难度
    public int leaveFamilyTime; //离开家族时间
    public long treasurePotentialSp
    {
@@ -175,6 +176,7 @@
            coinPointTotal = _serverInfo.ChangeCoinPointTotal;
            equipShowSwitch = _serverInfo.EquipShowSwitch;
            mapRealmSelect = (int)_serverInfo.ExAttr18;
            leaveFamilyTime = (int)_serverInfo.ExAttr19;
            face = (int)_serverInfo.Face;
            facePic = (int)_serverInfo.FacePic;    
}
@@ -220,6 +222,7 @@
    }
    // 比如跨服数据更新后,玩家回到本服会同步新数据,需更新
    public void UpdateData(HA112_tagMCDBPlayer serverInfo)
    {
        AccID = serverInfo.AccID;
@@ -271,7 +274,11 @@
        {
            PlayerDatas.Instance.hero.ActorInfo.ResetHp((long)HP);
        }
        equipShowSwitch = serverInfo.EquipShowSwitch;
        mapRealmSelect = (int)serverInfo.ExAttr18;
        leaveFamilyTime = (int)serverInfo.ExAttr19;
        face = (int)serverInfo.Face;
        facePic = (int)serverInfo.FacePic;
    }
Core/GameEngine/Model/Player/Fairy/PlayerFairyData.cs
@@ -276,7 +276,8 @@
        else
        {
            ClearFairyData();
            LocalChatHistory.Clear(ChatInfoType.Fairy);
            LocalChatHistory.Clear(ChatInfoType.Fairy);
            WindowCenter.Instance.Close<UnionPanel>();
        }
        if (OnRefreshFairyMine != null)
        {
Core/GameEngine/Model/Player/PlayerDatas.cs
@@ -913,6 +913,10 @@
            case PlayerDataType.default9:
                baseData.mapRealmSelect = (int)value;
                break;
            case PlayerDataType.default10:
                baseData.leaveFamilyTime = (int)value;
                break;
        }
    }
Core/NetworkPackage/ClientPack/ClientToMapServer/CA6_Family/CA616_tagCMZhenbaogeOP.cs
New file
@@ -0,0 +1,18 @@
using UnityEngine;
using System.Collections;
// A6 16 珍宝阁操作 #tagCMZhenbaogeOP
public class CA616_tagCMZhenbaogeOP : GameNetPackBasic {
    public byte OpType;    // 操作:0-砍价;1-购买
    public CA616_tagCMZhenbaogeOP () {
        combineCmd = (ushort)0x03FE;
        _cmd = (ushort)0xA616;
    }
    public override void WriteToBytes () {
        WriteBytes (OpType, NetDataType.BYTE);
    }
}
Core/NetworkPackage/ClientPack/ClientToMapServer/CA6_Family/CA616_tagCMZhenbaogeOP.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 77c3940cecd59b3419236172bae11c14
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA403_tagGCFamilyActionInfo.cs
@@ -11,8 +11,10 @@
    FairyModel fairyModel { get { return ModelCenter.Instance.GetModel<FairyModel>(); } }
    public override void Done(GameNetPackBasic vNetPack) {
        base.Done(vNetPack);
        ////家族行为数据 因type不同而逻辑不同,使用请根据功能需求各自接收处理
        HA403_tagGCFamilyActionInfo vNetData = vNetPack as HA403_tagGCFamilyActionInfo;
        fairyModel.UpdateFamilyAction(vNetData);
        ModelCenter.Instance.GetModel<FairyEmblemModel>().UpdateFamilyAction(vNetData);
        ModelCenter.Instance.GetModel<FairyNewModel>().UpdateFamilyAction(vNetData);
    }
}
Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA512_tagMCFamilyZhenbaogeInfo.cs
New file
@@ -0,0 +1,15 @@
using UnityEngine;
using System.Collections;
using vnxbqy.UI;
// A5 12 珍宝阁信息 #tagMCFamilyZhenbaogeInfo
public class DTCA512_tagMCFamilyZhenbaogeInfo : DtcBasic {
    FairyNewModel model { get { return ModelCenter.Instance.GetModel<FairyNewModel>(); } }
    public override void Done(GameNetPackBasic vNetPack) {
        base.Done(vNetPack);
        HA512_tagMCFamilyZhenbaogeInfo vNetData = vNetPack as HA512_tagMCFamilyZhenbaogeInfo;
        model.UpdateZhenbaogeInfo(vNetData);
    }
}
Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA512_tagMCFamilyZhenbaogeInfo.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ea678a8bb0059b24f818f2e2a657a6f8
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Core/NetworkPackage/ServerPack/HA5_Family/HA512_tagMCFamilyZhenbaogeInfo.cs
New file
@@ -0,0 +1,19 @@
using UnityEngine;
using System.Collections;
// A5 12 珍宝阁信息 #tagMCFamilyZhenbaogeInfo
public class HA512_tagMCFamilyZhenbaogeInfo : GameNetPackBasic {
    public byte CutState;    // 今日是否已砍价,此状态为全局状态,与盟Action砍价状态不同
    public byte BuyState;    // 今日是否已购买,此状态为全局状态,与盟Action购买状态不同
    public HA512_tagMCFamilyZhenbaogeInfo () {
        _cmd = (ushort)0xA512;
    }
    public override void ReadFromBytes (byte[] vBytes) {
        TransBytes (out CutState, vBytes, NetDataType.BYTE);
        TransBytes (out BuyState, vBytes, NetDataType.BYTE);
    }
}
Core/NetworkPackage/ServerPack/HA5_Family/HA512_tagMCFamilyZhenbaogeInfo.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: dafcfb3685a14d34cb4036da68f87bb1
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/FairyAu/FairyBasicFunctionWin.cs
@@ -28,6 +28,9 @@
        [SerializeField] Button lilianBtn;
        [SerializeField] Button cgBtn;
        [SerializeField] Button fudiBtn;
        [SerializeField] Button zbgBtn;
        [SerializeField] Text zbgTime;
        StoreModel _storeModel;
        StoreModel m_storeModel
        {
@@ -83,6 +86,10 @@
            {
                WindowCenter.Instance.Open<BlessedLandWin>();
            });
            zbgBtn.AddListener(() =>
            {
                WindowCenter.Instance.Open<FamilyZBGWin>();
            });
        }
@@ -96,6 +103,7 @@
            familyModel.UpdateZhenfaRedpoint();
            cgBtn.SetActive(fairyFeastModel.activeOpenday > TimeUtility.OpenDay);
            fudiBtn.SetActive(FuncOpen.Instance.IsFuncOpen(227));
            familyModel.QueryZBGFamilyInfo();
        }
        protected override void OnAfterOpen()
@@ -111,6 +119,28 @@
        protected override void OnAfterClose()
        {
        }
        float m_Time;
        //间隔1秒刷新一次
        protected override void LateUpdate()
        {
            m_Time += Time.deltaTime;
            if (m_Time < 1)
            {
                return;
            }
            m_Time = 0;
            if (familyModel.familyZBGActions.ContainsKey(1))
            {
                zbgBtn.SetActive(true);
                zbgTime.text = TimeUtility.SecondsToHMS((int)(TimeUtility.GetNext5Time() - TimeUtility.ServerNow).TotalSeconds);
            }
            else
            {
                zbgBtn.SetActive(false);
            }
        }
        #endregion
System/FairyAu/FairyModel.cs
@@ -933,8 +933,11 @@
            }
        }
        //家族行为数据 因type不同而逻辑不同,使用请根据功能需求各自接收处理
        public void UpdateFamilyAction(HA403_tagGCFamilyActionInfo _package)
        {
            if (_package.ActionType != 13 && _package.ActionType != 14)
                return;
            if (!familyActions.ContainsKey((int)_package.FamilyID))
            {
System/FairyAu/FairyNewModel.cs
@@ -51,18 +51,38 @@
        public bool showSitFinishTip = false;
        public Dictionary<string, int> sitDungeonInfo = new Dictionary<string, int>();
        private Redpoint affairRedpoint = new Redpoint(10701, 1070112);
        private Redpoint zhenfaRedpoint = new Redpoint(10701, 1070113);
        public Redpoint sitRedpoint = new Redpoint(10701, 1070114);
        private Redpoint affairRedpoint = new Redpoint(10701, 1070112); //历练
        private Redpoint zhenfaRedpoint = new Redpoint(10701, 1070113); //阵法
        public Redpoint sitRedpoint = new Redpoint(10701, 1070114); //打坐
        private List<Redpoint> zhanfaredpoints = new List<Redpoint>();
        Redpoint zbgRedpoint = new Redpoint(10701, 1070115); //珍宝阁
        //珍宝阁
        public int zhenbaogeCutState = 0;
        public int zhenbaogeBuyState = 0;
        public event Action UpdateZhenbaogeEvent;
        public bool isQueryZBGYet = false;
        public float lastZBGStartTime = 0; //过天刷新用
        public const int ZBGFamilyActionType = 16;
        //{id:数据} 砍价行为,value1为玩家ID,特殊约定为1时为家族的数据
        public Dictionary<int, HA403_tagGCFamilyActionInfo.tagGCFamilyAction> familyZBGActions = new Dictionary<int, HA403_tagGCFamilyActionInfo.tagGCFamilyAction>();
        public List<int> sortPlayerCut = new List<int>();
        public event Action<bool> UpdateFamilyActionEvent;
        public int zbgPriceType;
        public int zbgOrgPriceValue;
        public int zbgChangFamilyCD;
        public List<int> cutCntListForTalk = new List<int>();
        PackModel packModel { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
        DailyQuestModel dailyQuestModel { get { return ModelCenter.Instance.GetModel<DailyQuestModel>(); } }
        public override void Init()
        {
            ParseConfig();
            PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo;
            PlayerDatas.Instance.fairyData.OnRefreshFairyMine += OnRefreshFairyMine;//退出仙盟
            GlobalTimeEvent.Instance.minuteEvent += UpdateRedpoint;
            foreach (int type in useItemsDict.Keys)
            {
@@ -75,6 +95,7 @@
        {
            GlobalTimeEvent.Instance.minuteEvent -= UpdateRedpoint;
            PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyInfo;
            PlayerDatas.Instance.fairyData.OnRefreshFairyMine -= OnRefreshFairyMine;//退出仙盟
        }
@@ -102,6 +123,12 @@
            roundSeconds = sitInfo[0];
            sitMaxRound = sitInfo[1];
            addExpRateInfo = ConfigParse.GetMultipleStr<int>(config.Numerical3);
            config = FuncConfigConfig.Get("Zhenbaoge");
            zbgPriceType = int.Parse(config.Numerical1);
            zbgOrgPriceValue = int.Parse(config.Numerical2);
            zbgChangFamilyCD = int.Parse(config.Numerical3);
            cutCntListForTalk = JsonMapper.ToObject<List<int>>(config.Numerical4);
        }
        public void OnBeforePlayerDataInitialize()
@@ -114,6 +141,9 @@
            sitRound = 0;
            showSitFinishTip = false;
            sitDungeonInfo.Clear();
            isQueryZBGYet = false;
            familyZBGActions.Clear();
            sortPlayerCut.Clear();
        }
        private void OnRefreshFairyInfo()
@@ -329,6 +359,7 @@
        {
            UpdateZhenfaRedpoint();
            UpdateSitRedpoint();
            UpdateZBGRedpoint();
        }
        #endregion
@@ -376,5 +407,152 @@
            }
        }
        #endregion
        #region 珍宝阁
        public void UpdateZhenbaogeInfo(HA512_tagMCFamilyZhenbaogeInfo netPack)
        {
            zhenbaogeCutState = netPack.CutState;
            zhenbaogeBuyState = netPack.BuyState;
            UpdateZhenbaogeEvent?.Invoke();
            UpdateZBGRedpoint();
        }
        //登录后首次打开查询,退出仙盟重打开查询
        public void QueryZBGFamilyInfo()
        {
            if (isQueryZBGYet)
                return;
            var pack = new CA408_tagCGQueryFamilyAction();
            pack.ActionType = 16;
            pack.FamilyID = PlayerDatas.Instance.baseData.FamilyId;
            GameNetSystem.Instance.SendInfo(pack);
            isQueryZBGYet = true;
        }
        private void OnRefreshFairyMine()//退出仙盟
        {
            if (!PlayerDatas.Instance.fairyData.HasFairy)
            {
                isQueryZBGYet = false;
                familyZBGActions.Clear();
                sortPlayerCut.Clear();
                WindowCenter.Instance.Close<FamilyZBGWin>();
            }
            UpdateZBGRedpoint();
        }
        public void UpdateZBGRedpoint()
        {
            zbgRedpoint.state = RedPointState.None;
            if (!PlayerDatas.Instance.fairyData.HasFairy)
            {
                return;
            }
            if (zhenbaogeCutState == 0)
            {
                zbgRedpoint.state = RedPointState.Simple;
            }
        }
        public void UpdateFamilyAction(HA403_tagGCFamilyActionInfo vNetData)
        {
            if (vNetData.ActionType != ZBGFamilyActionType)
            {
                return;
            }
            if (vNetData.FamilyID != PlayerDatas.Instance.baseData.FamilyId)
            {
                return;
            }
            bool restart = false;
            if (vNetData.FamilyActionList.Length == 1 && vNetData.FamilyActionList[0].Value1 == 1)
            {
                if (familyZBGActions.ContainsKey(1) && familyZBGActions[1].Time != vNetData.FamilyActionList[0].Time)
                {
                    familyZBGActions.Clear();
                    sortPlayerCut.Clear();
                    restart = true;
                }
            }
            for (int i = 0; i < vNetData.FamilyActionList.Length; i++)
            {
                familyZBGActions[(int)vNetData.FamilyActionList[i].Value1] = vNetData.FamilyActionList[i];
            }
            sortPlayerCut = familyZBGActions.Keys.ToList();
            if (sortPlayerCut.Contains(1))
                sortPlayerCut.Remove(1);
            sortPlayerCut.Sort((a, b) => { return familyZBGActions[a].Time.CompareTo(familyZBGActions[b].Time); });
            UpdateFamilyActionEvent?.Invoke(restart);
        }
        //砍价人数
        public int GetZBGFamilyActionCount()
        {
            return Math.Max(0, familyZBGActions.Count - 1);
        }
        public int GetTalkState()
        {
            int cnt = GetZBGFamilyActionCount();
            for (int i = 0; i < cutCntListForTalk.Count; i++)
            {
                if (cnt < cutCntListForTalk[i])
                {
                    return i;
                }
            }
            return 0;
        }
        public int[][] GetZBGItems()
        {
            if (!familyZBGActions.ContainsKey(1))
                return null;
            return JsonMapper.ToObject<int[][]>(familyZBGActions[1].UseData);
        }
        public void OnZhenbaogeOP(byte type)
        {
            var pack = new CA616_tagCMZhenbaogeOP();
            pack.OpType = type;
            GameNetSystem.Instance.SendInfo(pack);
        }
        public Dictionary <int , PlayerFairyData.FairyMember> tmpNoCutMembers = new Dictionary<int, PlayerFairyData.FairyMember>();
        //未议价成员
        public void CalcNoCutMembers()
        {
            tmpNoCutMembers.Clear();
            var fairy = PlayerDatas.Instance.fairyData.fairy;
            if (fairy == null)
            {
                return;
            }
            foreach(var member in fairy.Member)
            {
                if (!familyZBGActions.ContainsKey((int)member.PlayerID))
                {
                    tmpNoCutMembers[(int)member.PlayerID] = member;
                }
            }
        }
        #endregion
    }
}
System/FairyAu/FamilyZBGCell.cs
New file
@@ -0,0 +1,28 @@
using vnxbqy.UI;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace vnxbqy.UI
{
    public class FamilyZBGCell : CellView
    {
        [SerializeField] Text nameText;
        [SerializeField] Image moneyIcon;
        [SerializeField] Text cutText;
        [SerializeField] Image buyState;
        FairyNewModel familyModel { get { return ModelCenter.Instance.GetModel<FairyNewModel>(); } }
        public void Display(int index)
        {
            var info = familyModel.familyZBGActions[familyModel.sortPlayerCut[index]];
            nameText.text = string.Format("{0}.{1}", index + 1, info.Name);
            moneyIcon.SetSmallIconWithMoneyType(familyModel.zbgPriceType);
            cutText.text = info.Value2.ToString();
            buyState.SetActive(info.Value3 == 1);
        }
    }
}
System/FairyAu/FamilyZBGCell.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6fd893b835f753542b24dd44fecd31fa
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/FairyAu/FamilyZBGNoCutCell.cs
New file
@@ -0,0 +1,26 @@
using vnxbqy.UI;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace vnxbqy.UI
{
    public class FamilyZBGNoCutCell : CellView
    {
        [SerializeField] Text nameText;
        [SerializeField] Text timeText;
        FairyNewModel familyModel { get { return ModelCenter.Instance.GetModel<FairyNewModel>(); } }
        public void Display(int id)
        {
            var fairyMember = familyModel.tmpNoCutMembers[id];
            nameText.text = fairyMember.Name;
            timeText.text = fairyMember.Exattr2 != 0 ? UIHelper.GetFadeTime(fairyMember.Exattr2) + Language.Get("L1026") : string.Empty;
        }
    }
}
System/FairyAu/FamilyZBGNoCutCell.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ac0471c1f8fb97240b0c36588457c7ce
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/FairyAu/FamilyZBGNoCutWin.cs
New file
@@ -0,0 +1,68 @@
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
namespace vnxbqy.UI
{
    public class FamilyZBGNoCutWin : Window
    {
        [SerializeField] Button close;
        [SerializeField] ScrollerController scroller;
        FairyNewModel familyModel { get { return ModelCenter.Instance.GetModel<FairyNewModel>(); } }
        protected override void BindController()
        {
        }
        protected override void AddListeners()
        {
            close.AddListener(CloseClick);
        }
        protected override void OnPreOpen()
        {
            scroller.OnRefreshCell += OnRefreshCell;
            familyModel.CalcNoCutMembers();
            CreateScroller();
        }
        protected override void OnAfterOpen()
        {
        }
        protected override void OnPreClose()
        {
            scroller.OnRefreshCell -= OnRefreshCell;
        }
        protected override void OnAfterClose()
        {
        }
        void OnRefreshCell(ScrollerDataType type, CellView cell)
        {
            var _cell = cell as FamilyZBGNoCutCell;
            _cell.Display(cell.index);
        }
        void CreateScroller()
        {
            scroller.Refresh();
            var keys = familyModel.tmpNoCutMembers.Keys.ToList();
            for (int i = 0; i < keys.Count; i++)
            {
                scroller.AddCell(ScrollerDataType.Header, keys[i]);
            }
            scroller.Restart();
        }
    }
}
System/FairyAu/FamilyZBGNoCutWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3fb604c38ec9e144e975172ed800bbc1
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/FairyAu/FamilyZBGWin.cs
New file
@@ -0,0 +1,234 @@
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
namespace vnxbqy.UI
{
    public class FamilyZBGWin : Window
    {
        [SerializeField] Button close;
        [SerializeField] Text talkText;
        [SerializeField] ScaleTween talkTween;
        [SerializeField] List<ItemCell> items = new List<ItemCell>();
        [SerializeField] Text orgPrice;
        [SerializeField] Image orgIcon;
        [SerializeField] Transform cutObj;
        [SerializeField] Text price;
        [SerializeField] Text totalInfo;
        [SerializeField] Button memberOnlineBtn;
        [SerializeField] ScrollerController scroller;
        [SerializeField] Button cutBtn;
        [SerializeField] Text cutText;
        [SerializeField] Image cutState;
        FairyNewModel familyModel { get { return ModelCenter.Instance.GetModel<FairyNewModel>(); } }
        PackModel packModel { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
        protected override void BindController()
        {
        }
        protected override void AddListeners()
        {
            close.AddListener(CloseClick);
            memberOnlineBtn.AddListener(() =>
            {
                WindowCenter.Instance.Open<FamilyZBGNoCutWin>();
            });
            cutBtn.AddListener(OnCut);
        }
        protected override void OnPreOpen()
        {
            talkTween.Stop();
            familyModel.UpdateFamilyActionEvent += OnFamilyActionInfoEvent;
            scroller.OnRefreshCell += OnRefreshCell;
            familyModel.UpdateZhenbaogeEvent += OnPlayerZBGEvent;
            Display();
            CreateScroller();
        }
        protected override void OnAfterOpen()
        {
            DisplayTalk();
        }
        protected override void OnPreClose()
        {
            familyModel.UpdateFamilyActionEvent -= OnFamilyActionInfoEvent;
            scroller.OnRefreshCell -= OnRefreshCell;
            familyModel.UpdateZhenbaogeEvent -= OnPlayerZBGEvent;
        }
        protected override void OnAfterClose()
        {
        }
        void OnRefreshCell(ScrollerDataType type, CellView cell)
        {
            var _cell = cell as FamilyZBGCell;
            _cell.Display(cell.index);
        }
        void CreateScroller()
        {
            scroller.Refresh();
            var keys = familyModel.sortPlayerCut;
            for (int i = 0; i < keys.Count; i++)
            {
                scroller.AddCell(ScrollerDataType.Header, i);
            }
            scroller.Restart();
        }
        void Display()
        {
            var awards = familyModel.GetZBGItems();
            for (int i = 0; i < items.Count; i++)
            {
                if (i < awards.Length)
                {
                    items[i].SetActive(true);
                    int itemID = awards[i][0];
                    items[i].Init(new ItemCellModel(itemID, false, (ulong)awards[i][1]));
                    items[i].button.AddListener(() => {
                        ItemTipUtility.Show(itemID);
                    });
                }
                else
                {
                    items[i].SetActive(false);
                }
            }
            orgPrice.text = familyModel.zbgOrgPriceValue.ToString();
            orgIcon.SetSmallIconWithMoneyType(familyModel.zbgPriceType);
            DisplayFamilyCutInfo();
            DisplayBtnState();
        }
        void DisplayFamilyCutInfo()
        {
            if (familyModel.familyZBGActions[1].Value3 > 0)
            {
                price.text = "-" + familyModel.familyZBGActions[1].Value2;
            }
            else
            {
                price.text = familyModel.familyZBGActions[1].Value2.ToString();
            }
            totalInfo.text = Language.Get("FairyZBG2", familyModel.familyZBGActions.Count - 1, PlayerDatas.Instance.fairyData.fairy.Member.Count,
                "SmallMoney" + familyModel.zbgPriceType, familyModel.zbgOrgPriceValue - familyModel.familyZBGActions[1].Value2);
            cutObj.SetActive(familyModel.familyZBGActions.Count > 1);
        }
        void DisplayBtnState()
        {
            if (familyModel.zhenbaogeCutState == 0)
            {
                cutText.text = Language.Get("FairyZBG3");
                cutBtn.SetActive(true);
                cutState.SetActive(false);
            }
            else if (familyModel.zhenbaogeBuyState == 0)
            {
                cutText.text = Language.Get("FairyZBG4");
                cutBtn.SetActive(true);
                cutState.SetActive(false);
            }
            else
            {
                cutBtn.SetActive(false);
                cutState.SetActive(true);
            }
        }
        void DisplayTalk()
        {
            talkTween.SetStartState();
            talkTween.Play();
            talkText.text = Language.Get("FairyZBGTalk" + familyModel.GetTalkState());
        }
        private void OnDisable()
        {
        }
        private void OnFamilyActionInfoEvent(bool restart)
        {
            if (restart)
            {
                Display();
            }
            else
            {
                DisplayFamilyCutInfo();
            }
            DisplayTalk();
            if (familyModel.sortPlayerCut.Count != scroller.GetNumberOfCells(scroller.m_Scorller))
            {
                CreateScroller();
            }
            else
            {
                scroller.m_Scorller.RefreshActiveCellViews();
            }
        }
        void OnCut()
        {
            //退盟的cd限制
            if ((TimeUtility.AllSeconds - PlayerDatas.Instance.baseData.mapRealmSelect) / 60 < familyModel.zbgChangFamilyCD )
            {
                SysNotifyMgr.Instance.ShowTip("ZhenbaogeCut1", familyModel.zbgChangFamilyCD - (TimeUtility.AllSeconds - PlayerDatas.Instance.baseData.mapRealmSelect) / 60);
                return;
            }
            if (familyModel.zhenbaogeCutState == 0)
            {
                familyModel.OnZhenbaogeOP(0);
            }
            else if (familyModel.zhenbaogeBuyState == 0)
            {
                if (packModel.GetEmptyGridCount(PackType.Item) < items.Count)
                {
                    SysNotifyMgr.Instance.ShowTip("GeRen_lhs_202580");
                    return;
                }
                if (UIHelper.GetMoneyCnt(familyModel.zbgPriceType) < familyModel.familyZBGActions[1].Value2)
                {
                    SysNotifyMgr.Instance.ShowTip("LackMoney", familyModel.zbgPriceType);
                    return;
                }
                familyModel.OnZhenbaogeOP(1);
            }
        }
        void OnPlayerZBGEvent()
        {
            DisplayBtnState();
        }
    }
}
System/FairyAu/FamilyZBGWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 25b9bf2aa18ba7f4c8c78b684c5d2916
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/FairyEmblem/FairyEmblemModel.cs
@@ -158,6 +158,8 @@
        public FairyEmblemUnlockMethodType GetFairyEmblemUnlockType(int emblemID)
        {
            FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemID);
            if (config == null)
                return FairyEmblemUnlockMethodType.LV;
            if (config.CustomFamilyID > 0)
                return FairyEmblemUnlockMethodType.Custom;
            return config.UnlockFamilyLV > 0 ? FairyEmblemUnlockMethodType.LV : FairyEmblemUnlockMethodType.Active;
Utility/EnumHelper.cs
@@ -687,7 +687,7 @@
    default7,   
    default8,
    default9,   // 237 地图境界难度
    default10,
    default10,  // 238 离开仙盟时间戳(包含主动退出或被踢
    default11,  // 239 代表魅力等级
    default12,
    default13,  // 241 古神货币
Utility/TimeUtility.cs
@@ -405,6 +405,21 @@
        return new DateTime(now.Year, now.Month, now.Day);
    }
    /// <summary>
    /// 获取下一个凌晨5点的时间
    /// </summary>
    /// <returns></returns>
    public static DateTime GetNext5Time()
    {
        var now = ServerNow;
        if (now.Hour < 5)
        {
            return new DateTime(now.Year, now.Month, now.Day, 5, 0, 0);
        }
        return new DateTime(now.Year, now.Month, now.Day, 5, 0, 0).AddDays(1);
    }
    //开服天结束倒计时;单位秒
    public static int GetRemindTimeByOpenDay(int days)
    {
Utility/UIHelper.cs
@@ -29,6 +29,13 @@
        _image.SetSprite(iconKey);
    }
    public static void SetSmallIconWithMoneyType(this Image _image, int moneyType)
    {
        if (_image == null) return;
        string iconKey = StringUtility.Contact("SmallMoney", moneyType);
        _image.SetSprite(iconKey);
    }
    /// <summary>
    /// 分离字符串插入空格
    /// </summary>