少年修仙传客户端代码仓库
9945 子 【BT0.1】【主干】仙盟BOSS修改 / 【BT0.1】【主干】仙盟BOSS修改

# Conflicts:
# Core/GameEngine/DataToCtl/PackageRegedit.cs
16个文件已添加
11个文件已修改
1585 ■■■■■ 已修改文件
Core/GameEngine/Model/Config/FamilyBossHurtAwardConfig.cs 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/FamilyBossHurtAwardConfig.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Player/Fairy/PlayerFairyData.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/TelPartialConfig/FamilyBossHurtAwardConfig.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/TelPartialConfig/FamilyBossHurtAwardConfig.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA402_tagGCFamilyBossFBInfo.cs 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA40E_tagGCFamilyBosFBInfo.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA40E_tagGCFamilyBosFBInfo.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA507_tagMCFamilyBosFBPlayerInfo.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA507_tagMCFamilyBosFBPlayerInfo.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HA4_Family/HA40E_tagGCFamilyBosFBInfo.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HA4_Family/HA40E_tagGCFamilyBosFBInfo.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HA5_Family/HA507_tagMCFamilyBosFBPlayerInfo.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HA5_Family/HA507_tagMCFamilyBosFBPlayerInfo.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Stage/Dungeon/DungeonStage.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Activity/ActivityModel.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Dungeon/DungeonModel.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FairyBoss.cs 441 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FairyBossDungeonWin.cs 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FairyBossDungeonWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FairyBossHurtCell.cs 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FairyBossHurtCell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FairyBossModel.cs 501 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FairyModel.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Message/RichNormalEvent.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Role/RoleModel.cs 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Utility/ConfigInitiator.cs 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/FamilyBossHurtAwardConfig.cs
New file
@@ -0,0 +1,211 @@
//--------------------------------------------------------
//    [Author]:           Fish
//    [  Date ]:           2023年10月9日
//--------------------------------------------------------
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System;
using UnityEngine;
public partial class FamilyBossHurtAwardConfig
{
    public readonly int id;
    public readonly int AwardType;
    public readonly int RecordIndex;
    public readonly long NeedHurtTotal;
    public readonly string AwardItemList;
    public FamilyBossHurtAwardConfig()
    {
    }
    public FamilyBossHurtAwardConfig(string input)
    {
        try
        {
            var tables = input.Split('\t');
            int.TryParse(tables[0],out id);
            int.TryParse(tables[1],out AwardType);
            int.TryParse(tables[2],out RecordIndex);
            long.TryParse(tables[3],out NeedHurtTotal);
            AwardItemList = tables[4];
        }
        catch (Exception ex)
        {
            DebugEx.Log(ex);
        }
    }
    static Dictionary<string, FamilyBossHurtAwardConfig> configs = new Dictionary<string, FamilyBossHurtAwardConfig>();
    public static FamilyBossHurtAwardConfig Get(string id)
    {
        if (!inited)
        {
            Debug.Log("FamilyBossHurtAwardConfig 还未完成初始化。");
            return null;
        }
        if (configs.ContainsKey(id))
        {
            return configs[id];
        }
        FamilyBossHurtAwardConfig config = null;
        if (rawDatas.ContainsKey(id))
        {
            config = configs[id] = new FamilyBossHurtAwardConfig(rawDatas[id]);
            rawDatas.Remove(id);
        }
        return config;
    }
    public static FamilyBossHurtAwardConfig Get(int id)
    {
        return Get(id.ToString());
    }
    public static List<string> GetKeys()
    {
        var keys = new List<string>();
        keys.AddRange(configs.Keys);
        keys.AddRange(rawDatas.Keys);
        return keys;
    }
    public static List<FamilyBossHurtAwardConfig> GetValues()
    {
        var values = new List<FamilyBossHurtAwardConfig>();
        values.AddRange(configs.Values);
        var keys = new List<string>(rawDatas.Keys);
        for (int i = 0; i < keys.Count; i++)
        {
            values.Add(Get(keys[i]));
        }
        return values;
    }
    public static bool Has(string id)
    {
        return configs.ContainsKey(id) || rawDatas.ContainsKey(id);
    }
    public static bool Has(int id)
    {
        return Has(id.ToString());
    }
    public static bool inited { get; private set; }
    protected static Dictionary<string, string> rawDatas = new Dictionary<string, string>();
    public static void Init(bool sync=false)
    {
        inited = false;
        var path = string.Empty;
        if (AssetSource.refdataFromEditor)
        {
            path = ResourcesPath.CONFIG_FODLER +"/FamilyBossHurtAward.txt";
        }
        else
        {
            path = AssetVersionUtility.GetAssetFilePath("config/FamilyBossHurtAward.txt");
        }
        configs.Clear();
        var tempConfig = new FamilyBossHurtAwardConfig();
        var preParse = tempConfig is IConfigPostProcess;
        if (sync)
        {
            var lines = File.ReadAllLines(path);
            if (!preParse)
            {
                rawDatas = new Dictionary<string, string>(lines.Length - 3);
            }
            for (int i = 3; i < lines.Length; i++)
            {
                try
                {
                    var line = lines[i];
                    var index = line.IndexOf("\t");
                    if (index == -1)
                    {
                        continue;
                    }
                    var id = line.Substring(0, index);
                    if (preParse)
                    {
                        var config = new FamilyBossHurtAwardConfig(line);
                        configs[id] = config;
                        (config as IConfigPostProcess).OnConfigParseCompleted();
                    }
                    else
                    {
                        rawDatas[id] = line;
                    }
                }
                catch (System.Exception ex)
                {
                    Debug.LogError(ex);
                }
            }
            inited = true;
        }
        else
        {
            ThreadPool.QueueUserWorkItem((object _object) =>
            {
                var lines = File.ReadAllLines(path);
                if (!preParse)
                {
                    rawDatas = new Dictionary<string, string>(lines.Length - 3);
                }
                for (int i = 3; i < lines.Length; i++)
                {
                    try
                    {
                       var line = lines[i];
                        var index = line.IndexOf("\t");
                        if (index == -1)
                        {
                            continue;
                        }
                        var id = line.Substring(0, index);
                        if (preParse)
                        {
                            var config = new FamilyBossHurtAwardConfig(line);
                            configs[id] = config;
                            (config as IConfigPostProcess).OnConfigParseCompleted();
                        }
                        else
                        {
                            rawDatas[id] = line;
                        }
                    }
                    catch (System.Exception ex)
                    {
                        Debug.LogError(ex);
                    }
                }
                inited = true;
            });
        }
    }
}
Core/GameEngine/Model/Config/FamilyBossHurtAwardConfig.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b3eeed3676204e64c975fcbfa39967d4
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Core/GameEngine/Model/Player/Fairy/PlayerFairyData.cs
@@ -135,7 +135,6 @@
            member = null;
        }
        fairyBossModel.UpdateRedPoint();
        if (OnRefreshFairyInfo != null) OnRefreshFairyInfo();
    }
@@ -175,7 +174,6 @@
    public event Action OnRefreshFairyList;
    public event Action OnRefreshFairySearch;
    public event Action OnRefreshFairyBoss;
    private Dictionary<int, List<FairyData>> fairyList = new Dictionary<int, List<FairyData>>();
@@ -281,7 +279,6 @@
            OnRefreshFairyMine();
        }
        UpdateRequestRedpoint();
        fairyBossModel.UpdateRedPoint();
    }
    public void OnRefreshFairy(H0F05_tagFamilyChange vNetData)
@@ -365,20 +362,7 @@
            return m_FairyBossModel ?? (m_FairyBossModel = ModelCenter.Instance.GetModel<FairyBossModel>());
        }
    }
    public uint IsBossOpen { get; private set; }
    public int weekBossOpenCnt { get; private set; }
    public DateTime bossOpenTime { get; private set; }
    public void OnRefreshFairy(HA402_tagGCFamilyBossFBInfo vNetData)
    {
        IsBossOpen = vNetData.IsOpen;
        weekBossOpenCnt = vNetData.OpenCnt;
        bossOpenTime = TimeUtility.GetTime(vNetData.IsOpen);
        if (OnRefreshFairyBoss != null)
        {
            OnRefreshFairyBoss();
        }
        fairyBossModel.UpdateRedPoint();
    }
    #endregion
    #region 仙盟权力开启条件
Core/GameEngine/Model/TelPartialConfig/FamilyBossHurtAwardConfig.cs
New file
@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
public partial class FamilyBossHurtAwardConfig : IConfigPostProcess
{
    public static Dictionary<int, FamilyBossHurtAwardConfig> personalHurtAwards = new Dictionary<int, FamilyBossHurtAwardConfig>();
    public static Dictionary<int, FamilyBossHurtAwardConfig> familyHurtAwards = new Dictionary<int, FamilyBossHurtAwardConfig>();
    public void OnConfigParseCompleted()
    {
        if (AwardType == 1)
        {
            personalHurtAwards[AwardType * 1000 + RecordIndex] = this;
        }
        else if (AwardType == 2)
        {
            familyHurtAwards[AwardType * 1000 + RecordIndex] = this;
        }
    }
}
Core/GameEngine/Model/TelPartialConfig/FamilyBossHurtAwardConfig.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4cd1365fe3ed5484ca0c6d2a1311847c
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA402_tagGCFamilyBossFBInfo.cs
@@ -1,23 +1,19 @@
using UnityEngine;
using System.Collections;
// A4 02 家族boss副本开启及击杀信息 #tagGCFamilyBossFBInfo
public class DTCA402_tagGCFamilyBossFBInfo : DtcBasic {
    public override void Done(GameNetPackBasic vNetPack) {
        base.Done(vNetPack);
        HA402_tagGCFamilyBossFBInfo vNetData = vNetPack as HA402_tagGCFamilyBossFBInfo;
        if (vNetData != null) {
            PlayerDatas.Instance.fairyData.OnRefreshFairy(vNetData);
        }
    }
}
using UnityEngine;
using System.Collections;
// A4 02 家族boss副本开启及击杀信息 #tagGCFamilyBossFBInfo
public class DTCA402_tagGCFamilyBossFBInfo : DtcBasic {
    public override void Done(GameNetPackBasic vNetPack) {
        base.Done(vNetPack);
        HA402_tagGCFamilyBossFBInfo vNetData = vNetPack as HA402_tagGCFamilyBossFBInfo;
    }
}
Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA40E_tagGCFamilyBosFBInfo.cs
New file
@@ -0,0 +1,20 @@
using UnityEngine;
using System.Collections;
using Snxxz.UI;
// A4 0E 家族boss副本信息 #tagGCFamilyBosFBInfo
public class DTCA40E_tagGCFamilyBosFBInfo : DtcBasic {
    FairyBossModel fairyBossModel
    {
        get
        {
            return  ModelCenter.Instance.GetModel<FairyBossModel>();
        }
    }
    public override void Done(GameNetPackBasic vNetPack) {
        base.Done(vNetPack);
        HA40E_tagGCFamilyBosFBInfo vNetData = vNetPack as HA40E_tagGCFamilyBosFBInfo;
        fairyBossModel.UpdateHFamilyBosFBInfo(vNetData);
    }
}
Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA40E_tagGCFamilyBosFBInfo.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5e62567c4ccd5a841a1f6fcb793e9d88
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA507_tagMCFamilyBosFBPlayerInfo.cs
New file
@@ -0,0 +1,21 @@
using UnityEngine;
using System.Collections;
using Snxxz.UI;
// A5 07 家族boss副本玩家信息 #tagMCFamilyBosFBPlayerInfo
public class DTCA507_tagMCFamilyBosFBPlayerInfo : DtcBasic {
    FairyBossModel fairyBossModel
    {
        get
        {
            return ModelCenter.Instance.GetModel<FairyBossModel>();
        }
    }
    public override void Done(GameNetPackBasic vNetPack) {
        base.Done(vNetPack);
        HA507_tagMCFamilyBosFBPlayerInfo vNetData = vNetPack as HA507_tagMCFamilyBosFBPlayerInfo;
        fairyBossModel.UpdateFamilyBossFBPlayerInfo(vNetData);
    }
}
Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA507_tagMCFamilyBosFBPlayerInfo.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c1874c69c192e3741800d5bedecc7955
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Core/NetworkPackage/ServerPack/HA4_Family/HA40E_tagGCFamilyBosFBInfo.cs
New file
@@ -0,0 +1,21 @@
using UnityEngine;
using System.Collections;
// A4 0E 家族boss副本信息 #tagGCFamilyBosFBInfo
public class HA40E_tagGCFamilyBosFBInfo : GameNetPackBasic {
    public uint HurtTotal;    // 仙盟累计伤血,亿求余部分
    public uint HurtTotalPoint;    // 仙盟累计伤血,亿整除部分
    public byte FightMemCount;    // 目前正在仙盟boss副本中的成员数
    public HA40E_tagGCFamilyBosFBInfo () {
        _cmd = (ushort)0xA40E;
    }
    public override void ReadFromBytes (byte[] vBytes) {
        TransBytes (out HurtTotal, vBytes, NetDataType.DWORD);
        TransBytes (out HurtTotalPoint, vBytes, NetDataType.DWORD);
        TransBytes (out FightMemCount, vBytes, NetDataType.BYTE);
    }
}
Core/NetworkPackage/ServerPack/HA4_Family/HA40E_tagGCFamilyBosFBInfo.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 758e6f2334f9e8d47ba9905c69049ada
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Core/NetworkPackage/ServerPack/HA5_Family/HA507_tagMCFamilyBosFBPlayerInfo.cs
New file
@@ -0,0 +1,25 @@
using UnityEngine;
using System.Collections;
// A5 07 家族boss副本玩家信息 #tagMCFamilyBosFBPlayerInfo
public class HA507_tagMCFamilyBosFBPlayerInfo : GameNetPackBasic {
    public uint HurtTotal;    // 累计伤血,亿求余部分
    public uint HurtTotalPoint;    // 累计伤血,亿整除部分
    public uint FightSeconds;    // 已累计战斗时长,秒
    public uint HurtAwardState;    // 个人总伤血领奖记录,按奖励位二进制位运算表示是否已领取
    public uint HurtAwardStateFamily;    // 仙盟总伤血领奖记录,按奖励位二进制位运算表示是否已领取
    public HA507_tagMCFamilyBosFBPlayerInfo () {
        _cmd = (ushort)0xA507;
    }
    public override void ReadFromBytes (byte[] vBytes) {
        TransBytes (out HurtTotal, vBytes, NetDataType.DWORD);
        TransBytes (out HurtTotalPoint, vBytes, NetDataType.DWORD);
        TransBytes (out FightSeconds, vBytes, NetDataType.DWORD);
        TransBytes (out HurtAwardState, vBytes, NetDataType.DWORD);
        TransBytes (out HurtAwardStateFamily, vBytes, NetDataType.DWORD);
    }
}
Core/NetworkPackage/ServerPack/HA5_Family/HA507_tagMCFamilyBosFBPlayerInfo.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1f7b129ee1567e44b82316bb212f7a30
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Fight/Stage/Dungeon/DungeonStage.cs
@@ -289,6 +289,9 @@
            case RidingPetBossModel.RIDINGPETBOSS_MAP:
                WindowCenter.Instance.Open<RidingPetBossHintWin>();
                break;
            case FairyBossModel.MapId:
                WindowCenter.Instance.Open<FairyBossDungeonWin>();
                break;
            case HazyGrassModel.REIKI_CLIENTDATAMAP:
            case HazyGrassModel.FAIRY_CLIENTDATAMAP:
            case HazyGrassModel.FAIRY_DATAMAP:
System/Activity/ActivityModel.cs
@@ -34,7 +34,6 @@
            fairyLeagueModel.OnRefreshFairyLeagueEvent += CheckActivity;
            fairyLeagueModel.onFairyLeagueBattleEvent += CheckActivity;
            PlayerDatas.Instance.fairyData.OnRefreshFairyBoss += CheckActivity;
            StageLoad.Instance.onStageLoadFinish += OnStageLoadFinish;
            NewBieCenter.Instance.guideCompletedEvent += GuideCompletedEvent;
            AdventureStage.Instance.onLoadAdventureStage += OnLoadAdventureStageFinish;
@@ -59,7 +58,6 @@
        {
            fairyLeagueModel.onFairyLeagueBattleEvent -= CheckActivity;
            fairyLeagueModel.OnRefreshFairyLeagueEvent -= CheckActivity;
            PlayerDatas.Instance.fairyData.OnRefreshFairyBoss -= CheckActivity;
            AdventureStage.Instance.onLoadAdventureStage -= OnLoadAdventureStageFinish;
        }
System/Dungeon/DungeonModel.cs
@@ -969,6 +969,13 @@
                        WindowCenter.Instance.Open<PersonalDropRateWin>();
                    }
                    break;
                case FairyBossModel.MapId:
                    ModelCenter.Instance.GetModel<FairyBossModel>().OnReceiveHelpMessage(_mission);
                    if (!WindowCenter.Instance.IsOpen<FairyBossDungeonWin>())
                    {
                        WindowCenter.Instance.Open<FairyBossDungeonWin>();
                    }
                    break;
                default:
                    if (GetDungeonHintId(mapId, lineId) != 0)
                    {
System/FairyAu/FairyBoss.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
@@ -8,23 +9,15 @@
{
    public class FairyBoss : Window, SecondWindowInterface
    {
        [SerializeField] Text textAtkCnt;
        [SerializeField] Text textFairyFoodNum;
        [SerializeField] Text textBossName;
        [SerializeField] Text textChallengeTime;
        [SerializeField] Text textBossState;
        [SerializeField] Text textFoodChallengeCnt;
        [SerializeField] Text m_TimeTip;
        [SerializeField] Text m_TimeCoolDown;
        [SerializeField] Button beginBtn;
        [SerializeField] Button previewBtn;
        [SerializeField] Button m_GetWayBtn;
        [SerializeField] RawImage model;
        [SerializeField] GameObject enterText;
        [SerializeField] GameObject openText;
        [SerializeField] ItemCell m_FairyFood;
        [SerializeField] Button m_HandIn;
        [SerializeField] Text m_WeekCntRemind;
        [SerializeField] FunctionButton personalHurtBtn;
        [SerializeField] FunctionButton familyHurtBtn;
        [SerializeField] FunctionButtonGroup fbGroup;
        [SerializeField] ScrollerController scroller;
        FairyBossModel m_Model;
        FairyBossModel fairyBossModel {
@@ -33,250 +26,16 @@
            }
        }
        PackModel packModel { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
        FairyBossTime m_TimeStage;
        DateTime m_StartTime;
        private void OnClose()
        {
            Close();
        }
        private void OnPreviewAward()
        {
            WindowCenter.Instance.Open<FairyBossAwardWin>();
        }
        private void OnBeginBtn()
        {
            if (PlayerDatas.Instance.fairyData.IsBossOpen == 0)
            {
                PlayerFairyData fairyData = PlayerDatas.Instance.fairyData;
                if (fairyData.mine != null)
                {
                    if (!PlayerDatas.Instance.fairyData.IsCanFunc(PlayerFairyData.LimitFunc.CanOpenBoss))
                    {
                        ServerTipDetails.DisplayNormalTip(Language.Get("L1019"));
                        return;
                    }
                }
                if (TimeUtility.Hour < fairyBossModel.FairyBossStartHour || TimeUtility.Hour >= fairyBossModel.FairyBossEndHour)
                {
                    ServerTipDetails.DisplayNormalTip(Language.Get("L1020"));
                    return;
                }
                if (PlayerDatas.Instance.fairyData.weekBossOpenCnt >= fairyBossModel.GetFairyBossWeekCount())
                {
                    SysNotifyMgr.Instance.ShowTip("FairyBossOpenCntError");
                    return;
                }
                if (PlayerDatas.Instance.fairyData.fairy.FamilyHornor < fairyBossModel.OpenFairyBossNeed)
                {
                    ServerTipDetails.DisplayNormalTip(Language.Get("L1124"));
                    OnFoodGetWay();
                    return;
                }
                ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("L1125", fairyBossModel.OpenFairyBossNeed), (bool isOk) =>
                {
                    if (isOk)
                    {
                        CA405_tagCGOpenFamilyBossFB openPack = new CA405_tagCGOpenFamilyBossFB();
                        GameNetSystem.Instance.SendInfo(openPack);
                    }
                });
            }
            else
            {
                if (TimeUtility.Hour < fairyBossModel.FairyBossStartHour || TimeUtility.Hour >= fairyBossModel.FairyBossEndHour)
                {
                    ServerTipDetails.DisplayNormalTip(Language.Get("L1020"));
                    return;
                }
                ModelCenter.Instance.GetModel<DungeonModel>().SingleChallenge(fairyBossModel.MapId);
            }
        }
        private void OnRefreshFairyBoss()
        {
            m_StartTime = new DateTime(TimeUtility.Year, TimeUtility.Month, TimeUtility.Day,
                fairyBossModel.FairyBossStartHour, 0, 0);
            UpdateInfo();
            CheckFairyBossTime();
            UpdateTimeTip();
            UpdateCoolDown();
        }
        private void OnRefreshFairyMine()
        {
            if (!PlayerDatas.Instance.fairyData.HasFairy)
            {
                CloseImmediately();
            }
        }
        private void UpdateInfo()
        {
            beginBtn.interactable = true;
            if (PlayerDatas.Instance.fairyData.IsBossOpen > 0)
            {
                openText.SetActive(false);
                enterText.SetActive(true);
                if (PlayerDatas.Instance.baseData.MapID == fairyBossModel.MapId)
                {
                    beginBtn.interactable = false;
                }
            }
            else
            {
                openText.SetActive(true);
                enterText.SetActive(false);
                if (!PlayerDatas.Instance.fairyData.IsCanFunc(PlayerFairyData.LimitFunc.CanOpenBoss))
                {
                    beginBtn.interactable = false;
                }
            }
            textFairyFoodNum.text = UIHelper.ReplaceLargeNum(PlayerDatas.Instance.fairyData.fairy.FamilyHornor);
            textAtkCnt.text = string.Format("{0}/{1}", Mathf.Max(0, fairyBossModel.GetFairyBossWeekCount() - PlayerDatas.Instance.fairyData.weekBossOpenCnt), fairyBossModel.GetFairyBossWeekCount());
            var nextWeekCnt = 0;
            var familyLv = PlayerDatas.Instance.fairyData.fairy.FamilyLV;
            m_WeekCntRemind.SetActive(fairyBossModel.TryGetWeekCnt(familyLv + 1, out nextWeekCnt));
            if (nextWeekCnt != 0)
            {
                m_WeekCntRemind.text = Language.Get("FairyBossCountRemind", familyLv + 1, nextWeekCnt);
            }
        }
        void InitData()
        {
            textBossName.text = fairyBossModel.fairyBossInfo;
            textChallengeTime.text = Language.Get("L1105", fairyBossModel.FairyBossStartHour, fairyBossModel.FairyBossEndHour);
            textFoodChallengeCnt.text = fairyBossModel.OpenFairyBossNeed.ToString();
        }
        void OnShowFairyBossModel()
        {
            UI3DModelExhibition.Instance.ShowNPC(fairyBossModel.fairyBossNpcId, Vector3.zero, model);
        }
        private void OnFoodGetWay()
        {
            ItemTipUtility.Show(fairyBossModel.fairyBossFood);
        }
        void UpdateTimeTip()
        {
            m_TimeTip.SetActive(true);
            switch (m_TimeStage)
            {
                case FairyBossTime.None:
                case FairyBossTime.PrepareClose:
                    m_TimeTip.SetActive(false);
                    break;
                case FairyBossTime.BeforeOpen:
                    m_TimeTip.text = Language.Get("FairyBossOpenCoolDown");
                    break;
                case FairyBossTime.PrepareOpen:
                case FairyBossTime.Open:
                    m_TimeTip.text = Language.Get("FairyBossEndCoolDown");
                    break;
            }
        }
        void UpdateCoolDown()
        {
            if (!m_TimeCoolDown.gameObject.activeSelf)
            {
                m_TimeCoolDown.SetActive(true);
            }
            switch (m_TimeStage)
            {
                case FairyBossTime.None:
                case FairyBossTime.PrepareClose:
                    m_TimeCoolDown.SetActive(false);
                    break;
                case FairyBossTime.BeforeOpen:
                    {
                        var _surplusTime = (m_StartTime - TimeUtility.ServerNow).TotalSeconds;
                        m_TimeCoolDown.text = TimeUtility.SecondsToDHMSCHS((int)_surplusTime);
                    }
                    break;
                case FairyBossTime.PrepareOpen:
                    m_TimeCoolDown.SetActive(true);
                    m_TimeCoolDown.text = TimeUtility.SecondsToDHMSCHS(fairyBossModel.fairyBossContinueTime);
                    break;
                case FairyBossTime.Open:
                    {
                        var _overTime = PlayerDatas.Instance.fairyData.bossOpenTime.AddSeconds(
                            fairyBossModel.fairyBossContinueTime+fairyBossModel.fairyBossPrepareTime);
                        var _surplusTime = (_overTime - TimeUtility.ServerNow).TotalSeconds;
                        m_TimeCoolDown.text = TimeUtility.SecondsToDHMSCHS((int)_surplusTime);
                    }
                    break;
            }
        }
        void CheckFairyBossTime()
        {
            m_TimeStage = FairyBossTime.None;
            var _fairyData = PlayerDatas.Instance.fairyData;
            if (_fairyData == null)
            {
                return;
            }
            if (PlayerDatas.Instance.fairyData.weekBossOpenCnt >= fairyBossModel.GetFairyBossWeekCount()
                && _fairyData.IsBossOpen == 0)
            {
                return;
            }
            if (TimeUtility.Hour < fairyBossModel.FairyBossStartHour)
            {
                m_TimeStage = FairyBossTime.BeforeOpen;
            }
            else if (_fairyData.IsBossOpen == 2)
            {
                m_TimeStage = FairyBossTime.PrepareClose;
            }
            else if (_fairyData.IsBossOpen > 1)
            {
                m_TimeStage = FairyBossTime.Open;
            }
            else if (_fairyData.IsBossOpen == 1 && TimeUtility.Hour < fairyBossModel.FairyBossEndHour)
            {
                m_TimeStage = FairyBossTime.PrepareOpen;
            }
            else if (TimeUtility.Hour >= fairyBossModel.FairyBossEndHour)
            {
                m_TimeStage = FairyBossTime.None;
            }
        }
        private void RefreshItemCountAct(PackType packType, int arg2, int id)
        {
            if (packType == PackType.Item && id == fairyBossModel.fairyBossFood)
            {
                DisplayFairyFood();
            }
        }
        void DisplayFairyFood()
        {
            var count = packModel.GetItemCountByID(PackType.Item, fairyBossModel.fairyBossFood);
            var itemData = new ItemCellModel(fairyBossModel.fairyBossFood, true, (ulong)count);
            m_FairyFood.Init(itemData);
            m_FairyFood.countText.text = count.ToString();
            m_FairyFood.countText.color = UIHelper.GetUIColor(count > 0 ? TextColType.Green : TextColType.Red);
            m_FairyFood.countText.SetActive(true);
        }
        private void HandIn()
        {
            fairyBossModel.HandInFairyFood();
        }
        public Button close { get; set; }
        protected override void OnActived()
        {
            if (fairyBossModel.redpoint2.state == RedPointState.Simple)
            {
                functionOrder = 1;
            }
            fbGroup.TriggerByOrder(functionOrder);
        }
        protected override void BindController()
        {
@@ -291,24 +50,19 @@
        protected override void AddListeners()
        {
            close.onClick.AddListener(OnClose);
            previewBtn.onClick.AddListener(OnPreviewAward);
            beginBtn.onClick.AddListener(OnBeginBtn);
            m_GetWayBtn.onClick.AddListener(OnFoodGetWay);
            m_HandIn.onClick.AddListener(HandIn);
            m_FairyFood.button.AddListener(OnFoodGetWay);
            personalHurtBtn.AddListener(ShowPersonnalHurt);
            familyHurtBtn.AddListener(ShowFamilyHurt);
        }
        protected override void OnPreOpen()
        {
            PlayerDatas.Instance.fairyData.OnRefreshFairyBoss += OnRefreshFairyBoss;
            PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyBoss;
            PlayerDatas.Instance.fairyData.OnRefreshFairyMine += OnRefreshFairyMine;
            TimeMgr.Instance.OnHourEvent += OnRefreshFairyBoss;
            packModel.refreshItemCountEvent += RefreshItemCountAct;
            InitData();
            OnRefreshFairyBoss();
            OnShowFairyBossModel();
            DisplayFairyFood();
            fairyBossModel.OnUpdateFamilyBossFBInfoEvent += OnUpdateFamilyBossFBInfoEvent;
            fairyBossModel.OnUpdateFamilyBossFBPlayerInfoEvent += OnUpdateFamilyBossFBPlayerInfoEvent;
            scroller.OnRefreshCell += OnRefreshCell;
            Display();
        }
@@ -326,40 +80,149 @@
        protected override void OnAfterClose()
        {
            UI3DModelExhibition.Instance.StopShow();
            PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyBoss;
            PlayerDatas.Instance.fairyData.OnRefreshFairyBoss -= OnRefreshFairyBoss;
            TimeMgr.Instance.OnHourEvent -= OnRefreshFairyBoss;
            packModel.refreshItemCountEvent -= RefreshItemCountAct;
            PlayerDatas.Instance.fairyData.OnRefreshFairyMine -= OnRefreshFairyMine;
            fairyBossModel.OnUpdateFamilyBossFBInfoEvent -= OnUpdateFamilyBossFBInfoEvent;
            fairyBossModel.OnUpdateFamilyBossFBPlayerInfoEvent -= OnUpdateFamilyBossFBPlayerInfoEvent;
            scroller.OnRefreshCell -= OnRefreshCell;
        }
        float m_Time = 0;
        float m_DelayTime = 0.5f;
        protected override void LateUpdate()
        void OnRefreshCell(ScrollerDataType type, CellView cell)
        {
            base.LateUpdate();
            m_Time += Time.deltaTime;
            if (m_Time < m_DelayTime)
            var sortCell = cell as FairyBossHurtCell;
            sortCell.Display(cell.index);
        }
        private void OnClose()
        {
            Close();
        }
        private void OnBeginBtn()
        {
            if (fairyBossModel.IsFairyBossOpen())
            {
                return;
                ModelCenter.Instance.GetModel<DungeonModel>().SingleChallenge(FairyBossModel.MapId);
            }
            m_Time = 0;
            switch (m_TimeStage)
            else
            {
                case FairyBossTime.BeforeOpen:
                case FairyBossTime.Open:
                    UpdateCoolDown();
                    break;
                SysNotifyMgr.Instance.ShowTip("FamilyBoss1");
            }
        }
        private void Display()
        {
            textBossState.text = Language.Get("UnionLiven114", fairyBossModel.hurtBuffInfo[0], fairyBossModel.m_FightMemCount);
            textChallengeTime.text = Language.Get("UnionLiven115", TimeUtility.SecondsToMS(fairyBossModel.challengeTimes - fairyBossModel.m_FightTimes));
            OnShowFairyBossModel();
            OnCreateScroller();
        }
        private void OnRefreshFairyMine()
        {
            if (!PlayerDatas.Instance.fairyData.HasFairy)
            {
                CloseImmediately();
            }
        }
        enum FairyBossTime
        void OnShowFairyBossModel()
        {
            None,
            BeforeOpen,
            PrepareOpen,
            Open,
            PrepareClose,
            textBossName.text = fairyBossModel.fairyBossInfo;
            UI3DModelExhibition.Instance.ShowNPC(fairyBossModel.fairyBossNpcId, Vector3.zero, model);
        }
        void OnUpdateFamilyBossFBInfoEvent()
        {
            textBossState.text = Language.Get("UnionLiven114", fairyBossModel.hurtBuffInfo[0], fairyBossModel.m_FightMemCount);
            if (functionOrder == 1)
            {
                List<int> keys = new List<int>();
                keys = FamilyBossHurtAwardConfig.familyHurtAwards.Keys.ToList();
                for (int i = 0; i < keys.Count; i++)
                {
                    if (fairyBossModel.GetAwardState(keys[i]) == 1 || fairyBossModel.GetAwardState(keys[i]) == 0)
                    {
                        scroller.JumpIndex(i);
                        break;
                    }
                }
                scroller.m_Scorller.RefreshActiveCellViews();
            }
        }
        void OnUpdateFamilyBossFBPlayerInfoEvent()
        {
            textChallengeTime.text = Language.Get("UnionLiven115", TimeUtility.SecondsToMS(fairyBossModel.challengeTimes - fairyBossModel.m_FightTimes));
            if (functionOrder == 0)
            {
                List<int> keys = new List<int>();
                keys = FamilyBossHurtAwardConfig.personalHurtAwards.Keys.ToList();
                for (int i = 0; i < keys.Count; i++)
                {
                    if (fairyBossModel.GetAwardState(keys[i]) == 1 || fairyBossModel.GetAwardState(keys[i]) == 0)
                    {
                        scroller.JumpIndex(i);
                        break;
                    }
                }
                scroller.m_Scorller.RefreshActiveCellViews();
            }
            else
            {
                List<int> keys = new List<int>();
                keys = FamilyBossHurtAwardConfig.familyHurtAwards.Keys.ToList();
                for (int i = 0; i < keys.Count; i++)
                {
                    if (fairyBossModel.GetAwardState(keys[i]) == 1 || fairyBossModel.GetAwardState(keys[i]) == 0)
                    {
                        scroller.JumpIndex(i);
                        break;
                    }
                }
                scroller.m_Scorller.RefreshActiveCellViews();
            }
        }
        void OnCreateScroller()
        {
            List<int> keys = new List<int>();
            if (functionOrder == 0)
            {
                keys = FamilyBossHurtAwardConfig.personalHurtAwards.Keys.ToList();
            }
            else
            {
                keys = FamilyBossHurtAwardConfig.familyHurtAwards.Keys.ToList();
            }
            scroller.Refresh();
            int jumpIndex = -1;
            for (int i = 0; i < keys.Count; i++)
            {
                scroller.AddCell(ScrollerDataType.Header, keys[i]);
                if (jumpIndex == -1 && (fairyBossModel.GetAwardState(keys[i]) == 1 || fairyBossModel.GetAwardState(keys[i]) == 0))
                {
                    jumpIndex = i;
                }
            }
            scroller.Restart();
            scroller.JumpIndex(jumpIndex);
            scroller.m_Scorller.RefreshActiveCellViews();
        }
        void ShowPersonnalHurt()
        {
            functionOrder = personalHurtBtn.order;
            OnCreateScroller();
        }
        void ShowFamilyHurt()
        {
            functionOrder = familyHurtBtn.order;
            OnCreateScroller();
        }
    }
}
System/FairyAu/FairyBossDungeonWin.cs
New file
@@ -0,0 +1,72 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace Snxxz.UI
{
    public class FairyBossDungeonWin : Window
    {
        [SerializeField] Text m_Time;
        [SerializeField] Text m_MyHurt;
        [SerializeField] Text m_PlayerCount;
        FairyBossModel m_Model;
        FairyBossModel fairyBossModel
        {
            get
            {
                return m_Model ?? (m_Model = ModelCenter.Instance.GetModel<FairyBossModel>());
            }
        }
        DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
        protected override void BindController()
        {
        }
        protected override void AddListeners()
        {
        }
        protected override void OnPreOpen()
        {
            Display();
        }
        protected override void OnAfterOpen()
        {
        }
        protected override void OnPreClose()
        {
        }
        protected override void OnAfterClose()
        {
        }
        protected override void LateUpdate()
        {
            Display();
        }
        void Display()
        {
            m_MyHurt.text = Language.Get("FairyBoss3") + Language.Get("L5000") + UIHelper.ReplaceLargeNum( fairyBossModel.m_PlayerHurt);
            m_Time.text = Language.Get("UnionLiven115", TimeUtility.SecondsToMS(fairyBossModel.challengeTimes - fairyBossModel.m_FightTimes- (int)(Time.time - fairyBossModel.receiveTime)));
            m_PlayerCount.text = Language.Get("FamilyMatchNumOfPeople") + fairyBossModel.m_FightMemCount;
        }
    }
}
System/FairyAu/FairyBossDungeonWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7c01620d94d23c3418cb34a06b31420e
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/FairyAu/FairyBossHurtCell.cs
New file
@@ -0,0 +1,70 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Snxxz.UI;
using System;
using UnityEngine.UI;
using LitJson;
using static UnityEditor.Experimental.AssetDatabaseExperimental.AssetDatabaseCounters;
namespace Snxxz.UI
{
    public class FairyBossHurtCell : CellView
    {
        [SerializeField] List<ItemCell> m_Items;
        [SerializeField] IntensifySmoothSlider m_Slider;
        [SerializeField] Text m_SliderTxt;
        [SerializeField] ButtonEx m_GetBtn;
        [SerializeField] Image m_State;
        FairyBossModel m_Model;
        FairyBossModel fairyBossModel
        {
            get
            {
                return m_Model ?? (m_Model = ModelCenter.Instance.GetModel<FairyBossModel>());
            }
        }
        public void Display(int index)
        {
            var awardType = index / 1000;
            var awardIndex = index % 1000;
            var awardConfig = awardType == 1 ? FamilyBossHurtAwardConfig.personalHurtAwards[index] : FamilyBossHurtAwardConfig.familyHurtAwards[index];
            var awards = JsonMapper.ToObject<int[][]>(awardConfig.AwardItemList);
            for(int i = 0;i< m_Items.Count;i++)
            {
                if (i < awards.Length)
                {
                    m_Items[i].SetActive(true);
                    int itemID = awards[i][0];
                    m_Items[i].Init(new ItemCellModel(awards[i][0], false, (ulong)awards[i][1]));
                    m_Items[i].button.AddListener(() => {
                        ItemTipUtility.Show(itemID);
                    });
                }
                else
                {
                    m_Items[i].SetActive(false);
                }
            }
            long curValue = awardType == 1 ? fairyBossModel.m_PlayerHurt : fairyBossModel.m_FamilyHurt;
            m_Slider.value = (float)Math.Round((double)curValue / awardConfig.NeedHurtTotal, 2, MidpointRounding.AwayFromZero);
            m_SliderTxt.text = UIHelper.ReplaceLargeNum(curValue) + "/" + UIHelper.ReplaceLargeNum(awardConfig.NeedHurtTotal);
            var state = fairyBossModel.GetAwardState(index);
            m_GetBtn.SetActive(state != 2);
            m_State.SetActive(state == 2);
            m_GetBtn.interactable = state == 1;
            m_GetBtn.AddListener(() => {
                var send = new CA504_tagCMPlayerGetReward();
                send.RewardType = 63;
                send.DataEx = (byte)awardType;
                send.DataExStr = awardIndex.ToString();
                send.DataExStrLen = (byte)awardIndex.ToString().Length;
                GameNetSystem.Instance.SendInfo(send);
            });
        }
    }
}
System/FairyAu/FairyBossHurtCell.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8bc3df547c746ef40a2e6e2d4e6f69b6
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/FairyAu/FairyBossModel.cs
@@ -1,216 +1,285 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Snxxz.UI
{
    public class FairyBossModel : Model
    {
        public override void Init()
        {
            ParseConfig();
            TimeMgr.Instance.OnHourEvent += UpdateRedPoint;
            StageLoad.Instance.onStageLoadFinish+= OnStageLoadFinish;
            PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo;
            PlayerDatas.Instance.fairyData.OnRefreshFairyMine += OnRefreshFairyInfo;
        }
        public override void UnInit()
        {
            TimeMgr.Instance.OnHourEvent -= UpdateRedPoint;
            StageLoad.Instance.onStageLoadFinish -= OnStageLoadFinish;
            PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyInfo;
            PlayerDatas.Instance.fairyData.OnRefreshFairyMine -= OnRefreshFairyInfo;
        }
        DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
        PackModel packModel { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
        FairyModel fairyModel { get { return ModelCenter.Instance.GetModel<FairyModel>(); } }
        public int MapId { get; private set; }
        public int OpenFairyBossNeed { get; private set; }
        public int FairyBossStartHour { get; private set; }
        public int FairyBossEndHour { get; private set; }
        public string fairyBossInfo { get; private set; }
        public int fairyBossNpcId { get; private set; }
        public int fairyBossFood { get; private set; }
        public int fairyBossContinueTime { get; private set; }
        public int fairyBossPrepareTime { get; private set; }
        public int fairyLevelLimit { get; private set; }
        /// <summary>
        /// key---世界等级上限 value---预览物品id
        /// </summary>
        public Dictionary<int, int[]> fairyBossAwardDict { get; private set; }
        public List<int> m_LeagueTableHides { get; private set; }
        public string leagueTableName { get; private set; }
        Dictionary<int, int> fairyBossWeekCntDict = new Dictionary<int, int>();
        private void ParseConfig()
        {
            FuncConfigConfig cfg = FuncConfigConfig.Get("FamilyBossOpen");
            MapId = int.Parse(cfg.Numerical1);
            OpenFairyBossNeed = int.Parse(cfg.Numerical2);
            FairyBossStartHour = ConfigParse.GetMultipleStr<int>(cfg.Numerical3)[0];
            FairyBossEndHour = ConfigParse.GetMultipleStr<int>(cfg.Numerical3)[1];
            cfg = FuncConfigConfig.Get("FamilyBossInfo");
            fairyBossInfo = cfg.Numerical1;
            fairyBossNpcId = int.Parse(cfg.Numerical2);
            fairyBossFood = int.Parse(cfg.Numerical3);
            fairyBossAwardDict = new Dictionary<int, int[]>();
            cfg = FuncConfigConfig.Get("FamilyBossDrop");
            var _json = LitJson.JsonMapper.ToObject(cfg.Numerical1);
            foreach (var _key in _json.Keys)
            {
                var _worldLv = int.Parse(_key);
                fairyBossAwardDict.Add(_worldLv, LitJson.JsonMapper.ToObject<int[]>(_json[_key].ToJson()));
            }
            cfg = FuncConfigConfig.Get("LeagueTable");
            m_LeagueTableHides = new List<int>();
            m_LeagueTableHides.AddRange(ConfigParse.GetMultipleStr<int>(cfg.Numerical1));
            leagueTableName = cfg.Numerical2;
            var configs = FamilyConfig.GetValues();
            for (int i = 0; i < configs.Count; i++)
            {
                fairyBossWeekCntDict.Add(configs[i].familyLV, configs[i].bossFBCnt);
                if (fairyLevelLimit == 0 && configs[i].bossFBCnt > 0)
                {
                    fairyLevelLimit = configs[i].familyLV;
                }
            }
            GetDungeonContinueTime();
        }
        Redpoint redpoint = new Redpoint(10701, 1070102);
        private void OnStageLoadFinish()
        {
            UpdateRedPoint();
            GameObject _go = GameObject.Find(leagueTableName);
            if (_go != null)
            {
                if (m_LeagueTableHides.Contains(PlayerDatas.Instance.baseData.MapID))
                {
                    _go.SetActive(false);
                }
                else
                {
                    _go.SetActive(true);
                }
            }
        }
        public int GetFairyBossWeekCount()
        {
            var lv = 1;
            var fairyData = PlayerDatas.Instance.fairyData;
            if (!fairyData.HasFairy)
            {
                return 0;
            }
            lv = fairyData.fairy.FamilyLV;
            if (fairyBossWeekCntDict.ContainsKey(lv))
            {
                return fairyBossWeekCntDict[lv];
            }
            return 0;
        }
        public bool TryGetWeekCnt(int _fairyLv, out int cnt)
        {
            return fairyBossWeekCntDict.TryGetValue(_fairyLv, out cnt);
        }
        private void OnRefreshFairyInfo()
        {
            UpdateRedPoint();
        }
        public void UpdateRedPoint()
        {
            redpoint.state = RedPointState.None;
            PlayerFairyData fairyData = PlayerDatas.Instance.fairyData;
            if (!fairyModel.fairyBossFuncOpen)
            {
                return;
            }
            if (fairyData.weekBossOpenCnt >= GetFairyBossWeekCount())
            {
                return;
            }
            if (PlayerDatas.Instance.baseData.MapID == MapId)
            {
                return;
            }
            if (TimeUtility.Hour < FairyBossStartHour || TimeUtility.Hour >= FairyBossEndHour)
            {
                return;
            }
            if (fairyData.IsBossOpen == 0)
            {
                if (fairyData.fairy.FamilyHornor < OpenFairyBossNeed)
                {
                    return;
                }
                if (fairyData.IsCanFunc(PlayerFairyData.LimitFunc.CanOpenBoss))
                {
                    redpoint.state = RedPointState.Simple;
                }
            }
            else
            {
                redpoint.state = RedPointState.Simple;
            }
        }
        public bool IsFairyBossOpen()
        {
            PlayerFairyData fairyData = PlayerDatas.Instance.fairyData;
            if (!fairyModel.fairyBossFuncOpen)
            {
                return false;
            }
            if (TimeUtility.Hour < FairyBossStartHour || TimeUtility.Hour >= FairyBossEndHour)
            {
                return false;
            }
            return fairyData.IsBossOpen > 0;
        }
        private void GetDungeonContinueTime()
        {
            var _list = dungeonModel.GetDungeonIds(MapId);
            var _dungeonCfg = DungeonConfig.Get(_list[0]);
            var _stepTime = _dungeonCfg.StepTime;
            _stepTime = _stepTime.Replace("[", string.Empty);
            _stepTime = _stepTime.Replace("]", string.Empty);
            fairyBossContinueTime = int.Parse(_stepTime.Split(',')[1]);
            fairyBossPrepareTime = int.Parse(_stepTime.Split(',')[0]);
        }
        public void HandInFairyFood()
        {
            var singlepack = packModel.GetSinglePack(PackType.Item);
            var count = 0;
            if (singlepack != null)
            {
                count = singlepack.GetCountById(fairyBossFood);
            }
            if (count > 0)
            {
                CA605_tagCMFamilyDonate pak = new CA605_tagCMFamilyDonate();
                GameNetSystem.Instance.SendInfo(pak);
            }
            else
            {
                SysNotifyMgr.Instance.ShowTip("FairyFoodHandError");
            }
        }
    }
}
using LitJson;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Snxxz.UI
{
    public class FairyBossModel : Model
    {
        public override void Init()
        {
            ParseConfig();
            StageLoad.Instance.onStageLoadFinish+= OnStageLoadFinish;
            PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo;
            PlayerDatas.Instance.fairyData.OnRefreshFairyMine += OnRefreshFairyInfo;
        }
        public override void UnInit()
        {
            StageLoad.Instance.onStageLoadFinish -= OnStageLoadFinish;
            PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyInfo;
            PlayerDatas.Instance.fairyData.OnRefreshFairyMine -= OnRefreshFairyInfo;
        }
        DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
        PackModel packModel { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
        FairyModel fairyModel { get { return ModelCenter.Instance.GetModel<FairyModel>(); } }
        public const int MapId = 31210;
        public int challengeTimes;
        public int[] hurtBuffInfo;
        public string fairyBossInfo { get; private set; }
        public int fairyBossNpcId { get; private set; }
        public int fairyBossFood { get; private set; }
        public int fairyBossContinueTime { get; private set; }
        public int fairyBossPrepareTime { get; private set; }
        public int fairyLevelLimit { get; private set; }
        /// <summary>
        /// key---世界等级上限 value---预览物品id
        /// </summary>
        public Dictionary<int, int[]> fairyBossAwardDict { get; private set; }
        public List<int> m_LeagueTableHides { get; private set; }
        public string leagueTableName { get; private set; }
        Dictionary<int, int> fairyBossWeekCntDict = new Dictionary<int, int>();
        private void ParseConfig()
        {
            var cfg = FuncConfigConfig.Get("FamilyBossFB");
            challengeTimes = int.Parse(cfg.Numerical1);
            hurtBuffInfo = JsonMapper.ToObject<int[]>(cfg.Numerical2);
            cfg = FuncConfigConfig.Get("FamilyBossInfo");
            fairyBossInfo = cfg.Numerical1;
            fairyBossNpcId = int.Parse(cfg.Numerical2);
            fairyBossFood = int.Parse(cfg.Numerical3);
            fairyBossAwardDict = new Dictionary<int, int[]>();
            cfg = FuncConfigConfig.Get("FamilyBossDrop");
            var _json = LitJson.JsonMapper.ToObject(cfg.Numerical1);
            foreach (var _key in _json.Keys)
            {
                var _worldLv = int.Parse(_key);
                fairyBossAwardDict.Add(_worldLv, LitJson.JsonMapper.ToObject<int[]>(_json[_key].ToJson()));
            }
            cfg = FuncConfigConfig.Get("LeagueTable");
            m_LeagueTableHides = new List<int>();
            m_LeagueTableHides.AddRange(ConfigParse.GetMultipleStr<int>(cfg.Numerical1));
            leagueTableName = cfg.Numerical2;
            var configs = FamilyConfig.GetValues();
            for (int i = 0; i < configs.Count; i++)
            {
                fairyBossWeekCntDict.Add(configs[i].familyLV, configs[i].bossFBCnt);
                if (fairyLevelLimit == 0 && configs[i].bossFBCnt > 0)
                {
                    fairyLevelLimit = configs[i].familyLV;
                }
            }
            GetDungeonContinueTime();
        }
        Redpoint redpoint = new Redpoint(10701, 1070102);
        public Redpoint redpoint1 = new Redpoint(1070102, 10701020);
        public Redpoint redpoint2 = new Redpoint(1070102, 10701021);
        private void OnStageLoadFinish()
        {
            GameObject _go = GameObject.Find(leagueTableName);
            if (_go != null)
            {
                if (m_LeagueTableHides.Contains(PlayerDatas.Instance.baseData.MapID))
                {
                    _go.SetActive(false);
                }
                else
                {
                    _go.SetActive(true);
                }
            }
        }
        public int GetFairyBossWeekCount()
        {
            var lv = 1;
            var fairyData = PlayerDatas.Instance.fairyData;
            if (!fairyData.HasFairy)
            {
                return 0;
            }
            lv = fairyData.fairy.FamilyLV;
            if (fairyBossWeekCntDict.ContainsKey(lv))
            {
                return fairyBossWeekCntDict[lv];
            }
            return 0;
        }
        public bool TryGetWeekCnt(int _fairyLv, out int cnt)
        {
            return fairyBossWeekCntDict.TryGetValue(_fairyLv, out cnt);
        }
        private void OnRefreshFairyInfo()
        {
            UpdateRedPoint();
        }
        public void UpdateRedPoint()
        {
            redpoint.state = RedPointState.None;
            redpoint1.state = RedPointState.None;
            redpoint2.state = RedPointState.None;
            if (PlayerDatas.Instance.baseData.MapID != MapId)
            {
                if (challengeTimes > 0)
                {
                    redpoint.state = RedPointState.Simple;
                }
            }
            foreach (var key in FamilyBossHurtAwardConfig.personalHurtAwards.Keys)
            {
                if (GetAwardState(key) == 1)
                {
                    redpoint1.state = RedPointState.Simple;
                    break;
                }
            }
            foreach (var key in FamilyBossHurtAwardConfig.familyHurtAwards.Keys)
            {
                if (GetAwardState(key) == 1)
                {
                    redpoint2.state = RedPointState.Simple;
                    break;
                }
            }
        }
        public bool IsFairyBossOpen()
        {
            PlayerFairyData fairyData = PlayerDatas.Instance.fairyData;
            if (!fairyModel.fairyBossFuncOpen)
            {
                return false;
            }
            return true;
        }
        private void GetDungeonContinueTime()
        {
            //var _list = dungeonModel.GetDungeonIds(MapId);
            //var _dungeonCfg = DungeonConfig.Get(_list[0]);
            //var _stepTime = _dungeonCfg.StepTime;
            //_stepTime = _stepTime.Replace("[", string.Empty);
            //_stepTime = _stepTime.Replace("]", string.Empty);
            fairyBossContinueTime = 1;// int.Parse(_stepTime.Split(',')[1]);
            fairyBossPrepareTime = 0;// int.Parse(_stepTime.Split(',')[0]);
        }
        public void HandInFairyFood()
        {
            var singlepack = packModel.GetSinglePack(PackType.Item);
            var count = 0;
            if (singlepack != null)
            {
                count = singlepack.GetCountById(fairyBossFood);
            }
            if (count > 0)
            {
                CA605_tagCMFamilyDonate pak = new CA605_tagCMFamilyDonate();
                GameNetSystem.Instance.SendInfo(pak);
            }
            else
            {
                SysNotifyMgr.Instance.ShowTip("FairyFoodHandError");
            }
        }
        public int m_FightMemCount;
        public long m_FamilyHurt;
        public event Action OnUpdateFamilyBossFBInfoEvent;
        public void UpdateHFamilyBosFBInfo(HA40E_tagGCFamilyBosFBInfo netPack)
        {
            m_FightMemCount = netPack.FightMemCount;
            m_FamilyHurt = netPack.HurtTotal +  netPack.HurtTotalPoint * 100000000;
            OnUpdateFamilyBossFBInfoEvent?.Invoke();
        }
        public event Action OnUpdateFamilyBossFBPlayerInfoEvent;
        public long m_PlayerHurt;
        public int m_FightTimes;
        public int m_PersonalHurtAward;
        public int m_FamilyHurtAward;
        public void UpdateFamilyBossFBPlayerInfo(HA507_tagMCFamilyBosFBPlayerInfo netPack)
        {
            m_PlayerHurt = netPack.HurtTotal + netPack.HurtTotalPoint * 100000000;
            m_FightTimes = (int)netPack.FightSeconds;
            m_PersonalHurtAward = (int)netPack.HurtAwardState;
            m_FamilyHurtAward = (int)netPack.HurtAwardStateFamily;
            OnUpdateFamilyBossFBPlayerInfoEvent?.Invoke();
            UpdateRedPoint();
        }
        //0 伤害未达到 1 未领取 2 已领取
        public int GetAwardState(int key)
        {
            var awardType = key / 1000;
            var awardIndex = key % 1000;
            if (awardType == 1)
            {
                var config = FamilyBossHurtAwardConfig.personalHurtAwards[key];
                if (m_PlayerHurt < config.NeedHurtTotal)
                {
                    return 0;
                }
                if (((int)Math.Pow(2, awardIndex) & m_PersonalHurtAward) == 0)
                {
                    return 1;
                }
                return 2;
            }
            else
            {
                var config = FamilyBossHurtAwardConfig.familyHurtAwards[key];
                if (m_FamilyHurt < config.NeedHurtTotal)
                {
                    return 0;
                }
                if (((int)Math.Pow(2, awardIndex) & m_FamilyHurtAward) == 0)
                {
                    return 1;
                }
                return 2;
            }
        }
        public float receiveTime;
        public void OnReceiveHelpMessage(string _mission)
        {
            var json = JsonMapper.ToObject(_mission);
            if (json != null && json.Keys.Contains("fightMemCount"))
            {
                m_FightMemCount = int.Parse(json["fightMemCount"].ToJson());
            }
            if (json != null && json.Keys.Contains("hurtValue"))
            {
                m_PlayerHurt = long.Parse(json["hurtValue"].ToJson());
            }
            if (json != null && json.Keys.Contains("fightSeconds"))
            {
                m_FightTimes = int.Parse(json["fightSeconds"].ToJson());
                receiveTime = Time.time;
            }
        }
    }
}
System/FairyAu/FairyModel.cs
@@ -799,11 +799,13 @@
            {
                if (PlayerDatas.Instance.fairyData.HasFairy)
                {
                    var fairy = PlayerDatas.Instance.fairyData.fairy;
                    if (fairy != null && fairy.FamilyLV >= fairyBossModel.fairyLevelLimit)
                    if (TimeUtility.Hour == 4 || TimeUtility.Hour == 5)
                    {
                        return true;
                        return false;
                    }
                    //var fairy = PlayerDatas.Instance.fairyData.fairy;
                    //if (fairy != null && fairy.FamilyLV >= fairyBossModel.fairyLevelLimit)
                    return true;
                }
                return false;
            }
System/Message/RichNormalEvent.cs
@@ -96,6 +96,20 @@
                    {
                        WindowJumpMgr.Instance.WindowJumpTo((JumpUIType)id);
                    }
                    else
                    {
                        var list = href.mSplits["openui"].Split('_');
                        int funcOrder = 0;
                        if (list.Length != 1)
                        {
                            funcOrder = int.Parse(list[1]);
                        }
                        WindowJumpMgr.Instance.WindowJumpToEx(list[0], 1, 0, funcOrder);
                        if (list.Length > 2)
                        {
                            ModelCenter.Instance.GetModel<RoleModel>().openUIMark = int.Parse(list[2]);
                        }
                    }
                }
                break;
            case RichTextEventEnum.OPENURL:
System/Role/RoleModel.cs
@@ -11,6 +11,7 @@
    
    public class RoleModel : Model,IBeforePlayerDataInitialize,IAfterPlayerDataInitialize,IPlayerLoginOk
    {
        public int openUIMark = 0;  //自定义openui带的数字含义,规律其一为功能ID*10000 + 数字
        Dictionary<int,Int2> customAwardsDict = new Dictionary<int, Int2>();
        public event Action OnCustomAwardsEvent;
Utility/ConfigInitiator.cs
@@ -325,6 +325,7 @@
        normalTasks.Add(new ConfigInitTask("ActFeastTravelTaskConfig", () => { ActFeastTravelTaskConfig.Init(); }, () => { return ActFeastTravelTaskConfig.inited; }));
        normalTasks.Add(new ConfigInitTask("NPCExConfig", () => { NPCExConfig.Init(); }, () => { return NPCExConfig.inited; }));
        normalTasks.Add(new ConfigInitTask("CustomAward", () => { CustomAwardConfig.Init(); }, () => { return CustomAwardConfig.inited; }));
        normalTasks.Add(new ConfigInitTask("FamilyBossHurtAward", () => { FamilyBossHurtAwardConfig.Init(); }, () => { return FamilyBossHurtAwardConfig.inited; }));
    }
    static List<ConfigInitTask> doingTasks = new List<ConfigInitTask>();