少年修仙传客户端代码仓库
client_Hale
2018-09-10 fb0345c8f9815f1b9f655d6363da3a9cedd3944f
Merge branch 'master' of http://192.168.0.87:10010/r/snxxz_scripts
29个文件已修改
8个文件已添加
2111 ■■■■ 已修改文件
Core/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/DailyQuestSpecialOpenTimeConfig.cs 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/DailyQuestSpecialOpenTimeConfig.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/DungeonSpecialStateTimeConfig.cs 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/DungeonSpecialStateTimeConfig.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/ConfigManager.cs 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Player/Fairy/PlayerFairyData.cs 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/TelPartialConfig/DailyQuestSpecialOpenTimeConfig.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/TelPartialConfig/DailyQuestSpecialOpenTimeConfig.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/TelPartialConfig/DungeonSpecialStateTimeConfig.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/TelPartialConfig/DungeonSpecialStateTimeConfig.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HA0_Sys/HA005_tagOpenServerDay.cs 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Stage/Dungeon/DungeonStage.cs 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/DailyQuest/DailyQuestBehaviour.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/DailyQuest/DailyQuestCalendarColumn.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/DailyQuest/DailyQuestData.cs 231 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/DailyQuest/DailyQuestModel.cs 94 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Dungeon/DungeonBreifInfo.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Dungeon/DungeonModel.cs 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Dungeon/FairyLeagueDungeonResourceBehaviour.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FairyLeagueModel.cs 858 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FairyLeagueRankCell.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FairyLeagueWin.cs 126 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FairyAu/FairyRequestWin.cs 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/HeavenBattle/HeavenBattleModel.cs 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/KnapSack/New/ChooseItemWin.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/MainInterfacePanel/InGamePushContainer.cs 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/SystemSetting/SetPrivateModel.cs 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Team/MyTeamWin.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Team/TeamData.cs 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Team/TeamMissionGroup.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Team/TeamModel.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Team/TeamPrepareSettingWin.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Team/TeamPrepareWin.cs 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Team/TeamTargetJoinLimitWin.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI/Effect/TimeMgr.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Utility/TimeUtility.cs 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs
@@ -20,10 +20,8 @@
        //private string m_OutputPath = string.Empty;
        //[SerializeField]
        //private bool m_UseDefaultPath = true;
        private string m_streamingPath
        {
            get
            {
        private string m_streamingPath {
            get {
                switch (m_UserData.m_BuildTarget)
                {
                    case ValidBuildTarget.Android:
@@ -73,14 +71,12 @@
        [SerializeField] int m_Version;
        public string ApkOutputPath
        {
        public string ApkOutputPath {
            get { return LocalSave.GetString("APKOutPutPath"); }
            set { LocalSave.SetString("APKOutPutPath", value); }
        }
        public string publishers
        {
        public string publishers {
            get { return LocalSave.GetString("APKPublishers"); }
            set { LocalSave.SetString("APKPublishers", value); }
        }
@@ -622,32 +618,35 @@
            AssetsVersionMaker.WriteAssetsVersionFile(Path.Combine(Directory.GetParent(Application.dataPath).FullName, m_UserData.m_OutputPath), fileInfos);
        }
        static int packageIndex
        {
        static int packageIndex {
            get { return LocalSave.GetInt("ClientPackageIndex", 1); }
            set { LocalSave.SetInt("ClientPackageIndex", value); }
        }
        private void ExecuteBuildClientPackageIpaAppend()
        {
            packageIndex++;
            var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
            ClientPackage.BuildPublishers(ClientPackage.SDK_PLUGIN_PROJECT, outputPath, ApkOutputPath, publishers, packageIndex, false, false);
        }
        private void ExecuteBuildClientPackageIpaReplace()
        {
            packageIndex++;
            var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
            ClientPackage.BuildPublishers(ClientPackage.SDK_PLUGIN_PROJECT, outputPath, ApkOutputPath, publishers, packageIndex, false, true);
        }
        private void ExecuteBuildClientPackageApk()
        {
            packageIndex++;
            var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
            ClientPackage.BuildPublishers(ClientPackage.SDK_PLUGIN_PROJECT, outputPath, ApkOutputPath, publishers, packageIndex, false, false);
        }
        private void ExecuteBuildClientPackageDevelopApk()
        {
            packageIndex++;
            var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
            ClientPackage.BuildPublishers(ClientPackage.SDK_PLUGIN_PROJECT, outputPath, ApkOutputPath, publishers, packageIndex, true, false);
        }
Core/GameEngine/Model/Config/DailyQuestSpecialOpenTimeConfig.cs
New file
@@ -0,0 +1,53 @@
//--------------------------------------------------------
//    [Author]:            第二世界
//    [  Date ]:           Friday, September 07, 2018
//--------------------------------------------------------
using UnityEngine;
using System;
namespace TableConfig {
    public partial class DailyQuestSpecialOpenTimeConfig : ConfigBase {
        public int ID { get ; private set ; }
        public int OpenServerWeek { get ; private set ; }
        public int OpenServerDay { get ; private set ; }
        public int DailyQuestID { get ; private set ; }
        public string TimeList { get ; private set; }
        public int Duration { get ; private set ; }
        public override string getKey()
        {
            return ID.ToString();
        }
        public override void Parse() {
            try
            {
                ID=IsNumeric(rawContents[0]) ? int.Parse(rawContents[0]):0;
                OpenServerWeek=IsNumeric(rawContents[1]) ? int.Parse(rawContents[1]):0;
                OpenServerDay=IsNumeric(rawContents[2]) ? int.Parse(rawContents[2]):0;
                DailyQuestID=IsNumeric(rawContents[3]) ? int.Parse(rawContents[3]):0;
                TimeList = rawContents[4].Trim();
                Duration=IsNumeric(rawContents[5]) ? int.Parse(rawContents[5]):0;
            }
            catch (Exception ex)
            {
                DebugEx.Log(ex);
            }
        }
    }
}
Core/GameEngine/Model/Config/DailyQuestSpecialOpenTimeConfig.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: f9b9b217bedba6a4ba3131db2858da0d
timeCreated: 1536327254
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Core/GameEngine/Model/Config/DungeonSpecialStateTimeConfig.cs
New file
@@ -0,0 +1,65 @@
//--------------------------------------------------------
//    [Author]:            第二世界
//    [  Date ]:           Friday, September 07, 2018
//--------------------------------------------------------
using UnityEngine;
using System;
namespace TableConfig {
    public partial class DungeonSpecialStateTimeConfig : ConfigBase {
        public int ID { get ; private set ; }
        public int OpenServerWeek { get ; private set ; }
        public int OpenServerDay { get ; private set ; }
        public int DataMapID { get ; private set ; }
        public int StartHour { get ; private set ; }
        public int StartMinute { get ; private set ; }
        public int EndHour { get ; private set ; }
        public int EndMinute { get ; private set ; }
        public int CanEnter { get ; private set ; }
        public int StateValue { get ; private set ; }
        public override string getKey()
        {
            return ID.ToString();
        }
        public override void Parse() {
            try
            {
                ID=IsNumeric(rawContents[0]) ? int.Parse(rawContents[0]):0;
                OpenServerWeek=IsNumeric(rawContents[1]) ? int.Parse(rawContents[1]):0;
                OpenServerDay=IsNumeric(rawContents[2]) ? int.Parse(rawContents[2]):0;
                DataMapID=IsNumeric(rawContents[3]) ? int.Parse(rawContents[3]):0;
                StartHour=IsNumeric(rawContents[4]) ? int.Parse(rawContents[4]):0;
                StartMinute=IsNumeric(rawContents[5]) ? int.Parse(rawContents[5]):0;
                EndHour=IsNumeric(rawContents[6]) ? int.Parse(rawContents[6]):0;
                EndMinute=IsNumeric(rawContents[7]) ? int.Parse(rawContents[7]):0;
                CanEnter=IsNumeric(rawContents[8]) ? int.Parse(rawContents[8]):0;
                StateValue=IsNumeric(rawContents[9]) ? int.Parse(rawContents[9]):0;
            }
            catch (Exception ex)
            {
                DebugEx.Log(ex);
            }
        }
    }
}
Core/GameEngine/Model/Config/DungeonSpecialStateTimeConfig.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: ecb895ff4d37765409261b28c3fb5009
timeCreated: 1536327385
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Core/GameEngine/Model/ConfigManager.cs
@@ -41,6 +41,7 @@
        AddAsyncTask<IconConfig>();
        AddAsyncTask<ItemConfig>();
        AddAsyncTask<SkillConfig>();
        AddAsyncTask<DirtyNameConfig>();
        AddAsyncTask<TASKINFOConfig>();
        AddAsyncTask<mapnpcConfig>();
        AddAsyncTask<LoginSeverListConfig>();
@@ -190,7 +191,9 @@
        AddAsyncTask<TrialRewardsConfig>();
        AddAsyncTask<DogzEquipPlusConfig>();
        AddAsyncTask<FairyGrabBossConfig>();
        AddAsyncTask<DirtyNameConfig>();
        AddAsyncTask<DungeonSpecialStateTimeConfig>();
        AddAsyncTask<DailyQuestSpecialOpenTimeConfig>();
        while (!AllCompleted())
        {
            var completedCount = 0;
Core/GameEngine/Model/Player/Fairy/PlayerFairyData.cs
@@ -284,7 +284,11 @@
            //Z-xw写
            playerFairyAuTreasureData._DicfamilyStoreItem.Clear();
        }
        if (OnRefreshFairyMine != null) OnRefreshFairyMine();
        if (OnRefreshFairyMine != null)
        {
            OnRefreshFairyMine();
        }
        UpdateRequestRedpoint();
        fairyBossModel.UpdateRedPoint();
    }
@@ -310,8 +314,8 @@
        hasFairy = false;
        fairy = null;
        mine = null;
        applyList.Clear();
        ChatCtrl.Inst.ClearChatInfo(ChatInfoType.Fairy);
    }
    #endregion
@@ -335,8 +339,16 @@
            apply.IsOnLine = vNetData.MemberInfo[i].IsOnLine;
            applyList.Add(apply);
        }
        if (OnRefreshApplyList != null) OnRefreshApplyList();
        if (IsCanFunc(LimitFunc.CanKick))
        if (OnRefreshApplyList != null)
        {
            OnRefreshApplyList();
        }
        UpdateRequestRedpoint();
    }
    void UpdateRequestRedpoint()
    {
        if (HasFairy && IsCanFunc(LimitFunc.CanKick))
        {
            applyRedpoint.state = applyList.Count > 0 ? RedPointState.Simple : RedPointState.None;
        }
Core/GameEngine/Model/TelPartialConfig/DailyQuestSpecialOpenTimeConfig.cs
New file
@@ -0,0 +1,38 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace TableConfig
{
    public partial class DailyQuestSpecialOpenTimeConfig : ConfigBase, IConfigPostProcess
    {
        static Dictionary<int, List<DailyQuestSpecialOpenTimeConfig>> dailyQuestTimes = new Dictionary<int, List<DailyQuestSpecialOpenTimeConfig>>();
        public void OnConfigParseCompleted()
        {
            if (!dailyQuestTimes.ContainsKey(DailyQuestID))
            {
                dailyQuestTimes[DailyQuestID] = new List<DailyQuestSpecialOpenTimeConfig>();
            }
            dailyQuestTimes[DailyQuestID].Add(this);
        }
        public static List<DailyQuestSpecialOpenTimeConfig> GetDailyQuestTimes(int dailyQuestId)
        {
            if (dailyQuestTimes.ContainsKey(dailyQuestId))
            {
                return dailyQuestTimes[dailyQuestId];
            }
            else
            {
                return null;
            }
        }
    }
}
Core/GameEngine/Model/TelPartialConfig/DailyQuestSpecialOpenTimeConfig.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 1cfbe263bb01efc489f714f48a565cd1
timeCreated: 1536327708
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Core/GameEngine/Model/TelPartialConfig/DungeonSpecialStateTimeConfig.cs
New file
@@ -0,0 +1,36 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace TableConfig
{
    public partial class DungeonSpecialStateTimeConfig : ConfigBase, IConfigPostProcess
    {
        static Dictionary<int, List<DungeonSpecialStateTimeConfig>> dungeonTimes = new Dictionary<int, List<DungeonSpecialStateTimeConfig>>();
        public void OnConfigParseCompleted()
        {
            if (!dungeonTimes.ContainsKey(DataMapID))
            {
                dungeonTimes[DataMapID] = new List<DungeonSpecialStateTimeConfig>();
            }
            dungeonTimes[DataMapID].Add(this);
        }
        public static List<DungeonSpecialStateTimeConfig> GetDungeonTimes(int dataMapId)
        {
            if (dungeonTimes.ContainsKey(dataMapId))
            {
                return dungeonTimes[dataMapId];
            }
            else
            {
                return null;
            }
        }
    }
}
Core/GameEngine/Model/TelPartialConfig/DungeonSpecialStateTimeConfig.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 6127c3f2b622e014186a9df283c45e49
timeCreated: 1536326200
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Core/NetworkPackage/ServerPack/HA0_Sys/HA005_tagOpenServerDay.cs
@@ -1,21 +1,26 @@
using UnityEngine;
using System.Collections;
//A0 05 同步开服天数 #tagOpenServerDay
public class HA005_tagOpenServerDay : GameNetPackBasic {
    public ushort Day;    // 已开服天数,从0开始
    public byte IsMixServer;    //是否是合服服务器
    public ushort MixDay;    // 已合服天数,从0开始
    public HA005_tagOpenServerDay () {
        _cmd = (ushort)0xA005;
    }
    public override void ReadFromBytes (byte[] vBytes) {
        TransBytes (out Day, vBytes, NetDataType.WORD);
        TransBytes (out IsMixServer, vBytes, NetDataType.BYTE);
        TransBytes (out MixDay, vBytes, NetDataType.WORD);
    }
}
//A0 05 同步开服天数 #tagOpenServerDay
public class HA005_tagOpenServerDay : GameNetPackBasic
{
    public ushort Day;    // 已开服天数,从0开始
    public byte IsMixServer;    //是否是合服服务器
    public ushort MixDay;    // 已合服天数,从0开始
    public string OpenServerTime;    //开服时间yyyy-MM-dd HH:mm:ss
    public HA005_tagOpenServerDay()
    {
        _cmd = (ushort)0xA005;
    }
    public override void ReadFromBytes(byte[] vBytes)
    {
        TransBytes(out Day, vBytes, NetDataType.WORD);
        TransBytes(out IsMixServer, vBytes, NetDataType.BYTE);
        TransBytes(out MixDay, vBytes, NetDataType.WORD);
        TransBytes(out OpenServerTime, vBytes, NetDataType.Chars, 19);
    }
}
Fight/Stage/Dungeon/DungeonStage.cs
@@ -3,6 +3,7 @@
using System.Collections.Generic;
using TableConfig;
using System.Collections;
using System;
public class DungeonStage : Stage
{
@@ -10,8 +11,7 @@
    public static MapType CurrentMapType;
    HeavenBattleModel _heavenModel;
    HeavenBattleModel heavenModel
    {
    HeavenBattleModel heavenModel {
        get { return _heavenModel ?? (_heavenModel = ModelCenter.Instance.GetModel<HeavenBattleModel>()); }
    }
@@ -85,6 +85,7 @@
        switch (CurrentMapType)
        {
            case MapType.OpenCountry:
                OnEnterOpenCountry();
                break;
            default:
                OnEnterNormalDungeon();
@@ -158,6 +159,17 @@
        GAMgr.Instance.DoLateUpdate();
    }
    private void OnEnterOpenCountry()
    {
        var teamModel = ModelCenter.Instance.GetModel<TeamModel>();
        var isPreparing = !teamModel.teamPrepare.IsAllOk() && !teamModel.teamPrepare.isError && !teamModel.teamPrepare.IsReject();
        var prepareEndTime = teamModel.prepareBeginTime + new TimeSpan(GeneralConfig.Instance.teamReadyTime * TimeSpan.TicksPerSecond);
        if (prepareEndTime > DateTime.Now)
        {
            WindowCenter.Instance.Open<TeamPrepareWin>();
        }
    }
    private void OnEnterNormalDungeon()
    {
        WindowCenter.Instance.Open<DungeonFightWin>();
System/DailyQuest/DailyQuestBehaviour.cs
@@ -197,8 +197,7 @@
            m_Locked.gameObject.SetActive(state == DailyQuestModel.DailyQuestState.Locked);
            m_UnLockCondition.gameObject.SetActive(state == DailyQuestModel.DailyQuestState.Locked);
            m_Supplementary.gameObject.SetActive(state == DailyQuestModel.DailyQuestState.ServerForbid
                || state == DailyQuestModel.DailyQuestState.OutTime);
            m_Supplementary.gameObject.SetActive(state == DailyQuestModel.DailyQuestState.OutTime);
            m_PracticePoint.gameObject.SetActive(state == DailyQuestModel.DailyQuestState.Normal || state == DailyQuestModel.DailyQuestState.CanBuyTimes);
            m_AssistPoint.gameObject.SetActive(state == DailyQuestModel.DailyQuestState.Completed);
@@ -209,24 +208,6 @@
            {
                case DailyQuestModel.DailyQuestState.Locked:
                    m_UnLockCondition.text = DailyQuestModel.GetDailyQuestUnLockDescription(data.id);
                    break;
                case DailyQuestModel.DailyQuestState.ServerForbid:
                    DailyQuestOpenTime openTime1;
                    if (model.TryGetOpenTime(data.id, out openTime1))
                    {
                        if (openTime1.openServerWeek > 0)
                        {
                            m_Supplementary.text = Language.Get("DailyQuest_ThatWeek", openTime1.openServerWeek);
                        }
                        else
                        {
                            m_Supplementary.text = Language.Get("DailyQuest_Day", openTime1.openServerDay);
                        }
                    }
                    else
                    {
                        m_Supplementary.text = "";
                    }
                    break;
                case DailyQuestModel.DailyQuestState.OutTime:
                    DailyQuestOpenTime openTime2;
System/DailyQuest/DailyQuestCalendarColumn.cs
@@ -17,10 +17,7 @@
        [SerializeField] Image m_Sign;
        [SerializeField] Text[] m_Quests;
        DailyQuestModel m_Model;
        DailyQuestModel model {
            get { return m_Model ?? (m_Model = ModelCenter.Instance.GetModel<DailyQuestModel>()); }
        }
        DailyQuestModel model { get { return ModelCenter.Instance.GetModel<DailyQuestModel>(); } }
        public void Display()
        {
@@ -39,7 +36,7 @@
                        questNameArray[j] = config.Title;
                    }
                    var content = string.Join(",\r\n", questNameArray);
                    var content = string.Join("\r\n", questNameArray);
                    m_Quests[i].text = content;
                }
                else
System/DailyQuest/DailyQuestData.cs
@@ -5,6 +5,7 @@
using System.Text.RegularExpressions;
using Snxxz.UI;
using TableConfig;
using LitJson;
public class DailyQuestData
{
@@ -37,7 +38,8 @@
    public int id { get; private set; }
    bool m_Got = false;
    public bool got {
    public bool got
    {
        get { return this.m_Got; }
        set { this.m_Got = value; }
    }
@@ -48,23 +50,25 @@
    }
}
public struct DailyQuestOpenTime
public class DailyQuestOpenTime
{
    public int id;
    public bool always;
    public int openServerWeek;
    public int openServerDay;
    public Dictionary<int, List<HourMinute>> openTimes;
    //常规的活动时间,key是星期x
    Dictionary<int, List<HourMinute>> openTimes = new Dictionary<int, List<HourMinute>>();
    //开服前2周的活动时间,key1是开服日的星期,key2是开服第几天
    Dictionary<int, Dictionary<int, List<HourMinute>>> specificOpenTimes = new Dictionary<int, Dictionary<int, List<HourMinute>>>();
    public DailyQuestOpenTime(int _id, string _timeString, int _duration)
    public DailyQuestOpenTime(int _id)
    {
        this.id = _id;
        this.openServerWeek = 0;
        this.openServerDay = 0;
        var matches = Regex.Matches(_timeString, "\\\"[0-9]\\\":\\[[0-9|,|\\[|\\]]+");
    }
    public void ParseQuestNormalOpenTime(string timeString, int duration)
    {
        var matches = Regex.Matches(timeString, "\\\"[0-9]\\\":\\[[0-9|,|\\[|\\]]+");
        always = matches.Count == 0;
        openTimes = new Dictionary<int, List<HourMinute>>();
        for (int i = 0; i < matches.Count; i++)
        {
@@ -82,7 +86,7 @@
                for (int j = 0; j < subMatches.Count; j++)
                {
                    tempHourMinutes.Add(new HourMinute(subMatches[j].Value, _duration));
                    tempHourMinutes.Add(new HourMinute(subMatches[j].Value, duration));
                }
                tempHourMinutes.Sort((HourMinute a, HourMinute b) => { return HourMinute.Compare(a, b); });
@@ -99,35 +103,56 @@
                for (int j = 0; j < subMatches.Count; j++)
                {
                    hourMinutes.Add(new HourMinute(subMatches[j].Value, _duration));
                    hourMinutes.Add(new HourMinute(subMatches[j].Value, duration));
                }
                hourMinutes.Sort((HourMinute a, HourMinute b) => { return HourMinute.Compare(a, b); });
            }
        }
    }
    public DailyQuestOpenTime(int _id, List<DungeonStateTimeConfig> _configs)
    public void ParseQuestSpecificOpenTimes(List<DailyQuestSpecialOpenTimeConfig> configs)
    {
        id = _id;
        always = _configs == null || _configs.Count == 0;
        openTimes = new Dictionary<int, List<HourMinute>>();
        if (configs == null)
        {
            return;
        }
        this.openServerWeek = 0;
        this.openServerDay = 0;
        foreach (var config in configs)
        {
            var openDayWeek = config.OpenServerWeek % 7;
            if (!specificOpenTimes.ContainsKey(openDayWeek))
            {
                specificOpenTimes[openDayWeek] = new Dictionary<int, List<HourMinute>>();
            }
            var dayIndexOpenTimes = specificOpenTimes[openDayWeek];
            var dayIndex = config.OpenServerDay;
            if (!dayIndexOpenTimes.ContainsKey(dayIndex))
            {
                dayIndexOpenTimes[dayIndex] = new List<HourMinute>();
            }
            var matches = Regex.Matches(config.TimeList, "\\[[0-9]{1,2},[0-9]{1,2}\\]");
            var hourMinutes = dayIndexOpenTimes[dayIndex];
            for (int i = 0; i < matches.Count; i++)
            {
                var temp = matches[i].Value;
                hourMinutes.Add(new HourMinute(temp, config.Duration));
            }
        }
    }
    public void ParseDungeonNormalOpenTimes(List<DungeonStateTimeConfig> configs)
    {
        always = configs == null || configs.Count == 0;
        if (!always)
        {
            if (_configs.Count > 0)
            for (int i = 0; i < configs.Count; i++)
            {
                this.openServerWeek = _configs[0].OpenServerWeek;
                this.openServerDay = _configs[0].OpenServerDay;
            }
            for (int i = 0; i < _configs.Count; i++)
            {
                var config = _configs[i];
                var config = configs[i];
                if (config.StartWeekday == 0 && config.EndWeekday == 0)
                {
                    for (int j = 0; j < 7; j++)
@@ -155,16 +180,37 @@
        }
    }
    public void ParseDungeonSpecificOpenTimes(List<DungeonSpecialStateTimeConfig> configs)
    {
        if (configs == null)
        {
            return;
        }
        foreach (var config in configs)
        {
            var openDayWeek = config.OpenServerWeek % 7;
            if (!specificOpenTimes.ContainsKey(openDayWeek))
            {
                specificOpenTimes[openDayWeek] = new Dictionary<int, List<HourMinute>>();
            }
            var dayIndexOpenTimes = specificOpenTimes[openDayWeek];
            var dayIndex = config.OpenServerDay;
            if (!dayIndexOpenTimes.ContainsKey(dayIndex))
            {
                dayIndexOpenTimes[dayIndex] = new List<HourMinute>();
            }
            var hourMinutes = dayIndexOpenTimes[dayIndex];
            hourMinutes.Add(new HourMinute(config.StartHour, config.StartMinute, config.EndHour, config.EndMinute));
        }
    }
    public bool IsValidServerOpenTime()
    {
        if (TimeUtility.OpenDay >= this.openServerDay && TimeUtility.OpenWeekCnt >= this.openServerWeek)
        {
            return true;
        }
        else
        {
            return false;
        }
        return true;
    }
    public bool InOpenTime()
@@ -174,14 +220,12 @@
            return true;
        }
        var dayOfWeek = (int)TimeUtility.ServerNow.DayOfWeek;
        if (!openTimes.ContainsKey(dayOfWeek))
        var isSpecificDay = TimeUtility.OpenWeekCnt <= 1;
        var openDayWeek = (int)TimeUtility.openServerTime.DayOfWeek;
        var dayIndex = TimeUtility.OpenDay + 1;
        if (isSpecificDay && specificOpenTimes.ContainsKey(openDayWeek) && specificOpenTimes[openDayWeek].ContainsKey(dayIndex))
        {
            return false;
        }
        else
        {
            var hourMinutes = openTimes[dayOfWeek];
            var hourMinutes = specificOpenTimes[openDayWeek][dayIndex];
            for (int i = 0; i < hourMinutes.Count; i++)
            {
                if (hourMinutes[i].InOpenTime())
@@ -192,32 +236,96 @@
            return false;
        }
        else
        {
            var dayOfWeek = (int)TimeUtility.ServerNow.DayOfWeek;
            if (!openTimes.ContainsKey(dayOfWeek))
            {
                return false;
            }
            else
            {
                var hourMinutes = openTimes[dayOfWeek];
                for (int i = 0; i < hourMinutes.Count; i++)
                {
                    if (hourMinutes[i].InOpenTime())
                    {
                        return true;
                    }
                }
                return false;
            }
        }
    }
    public bool TryGetTodayNearestOpenTime(out HourMinute _hourMinute)
    {
        var dayOfWeek = (int) TimeUtility.ServerNow.DayOfWeek;
        if (!openTimes.ContainsKey(dayOfWeek))
        var isSpecificDay = TimeUtility.OpenWeekCnt <= 1;
        var openDayWeek = (int)TimeUtility.openServerTime.DayOfWeek;
        var dayIndex = TimeUtility.OpenDay + 1;
        if (isSpecificDay && specificOpenTimes.ContainsKey(openDayWeek) && specificOpenTimes[openDayWeek].ContainsKey(dayIndex))
        {
            _hourMinute = default(HourMinute);
            return false;
            var hour = TimeUtility.ServerNow.Hour;
            var minute = TimeUtility.ServerNow.Minute;
            var hourMinutes = specificOpenTimes[openDayWeek][dayIndex];
            _hourMinute = hourMinutes[hourMinutes.Count - 1];
            for (int i = 0; i < hourMinutes.Count; i++)
            {
                var hourMinute = hourMinutes[i];
                if (hour <= hourMinute.hourEnd && minute <= hourMinute.minuteEnd)
                {
                    _hourMinute = hourMinute;
                    break;
                }
            }
            return true;
        }
        else
        {
            var dayOfWeek = (int)TimeUtility.ServerNow.DayOfWeek;
            if (!openTimes.ContainsKey(dayOfWeek))
            {
                _hourMinute = default(HourMinute);
                return false;
            }
            var hour = TimeUtility.ServerNow.Hour;
            var minute = TimeUtility.ServerNow.Minute;
            var hourMinutes = openTimes[dayOfWeek];
            _hourMinute = hourMinutes[hourMinutes.Count - 1];
            for (int i = 0; i < hourMinutes.Count; i++)
            {
                var hourMinute = hourMinutes[i];
                if (hour <= hourMinute.hourEnd && minute <= hourMinute.minuteEnd)
                {
                    _hourMinute = hourMinute;
                    break;
                }
            }
            return true;
        }
        var hour = TimeUtility.ServerNow.Hour;
        var minute = TimeUtility.ServerNow.Minute;
        var hourMinutes = openTimes[dayOfWeek];
        _hourMinute = hourMinutes[hourMinutes.Count - 1];
        for (int i = 0; i < hourMinutes.Count; i++)
    }
    public bool ContainTimeNode(int week, int timeNode)
    {
        var hourMinutes = GetHourMinuteByWeek(week);
        if (hourMinutes != null)
        {
            var hourMinute = hourMinutes[i];
            if (hour <= hourMinute.hourEnd && minute <= hourMinute.minuteEnd)
            foreach (var item in hourMinutes)
            {
                _hourMinute = hourMinute;
                break;
                if (item.hourBegin * 60 + item.minuteBegin == timeNode)
                {
                    return true;
                }
            }
        }
        return true;
        return false;
    }
    public string ToOpenTimeString()
@@ -267,10 +375,18 @@
    public List<HourMinute> GetHourMinuteByWeek(int week)
    {
        if(openTimes.ContainsKey(week))
        var isSpecificDay = TimeUtility.OpenWeekCnt <= 1;
        var openDayWeek = (int)TimeUtility.openServerTime.DayOfWeek;
        var dayIndex = TimeUtility.OpenDay + 1;
        if (isSpecificDay && specificOpenTimes.ContainsKey(openDayWeek) && specificOpenTimes[openDayWeek].ContainsKey(dayIndex))
        {
            return specificOpenTimes[openDayWeek][dayIndex];
        }
        else if (openTimes.ContainsKey(week))
        {
            return openTimes[week];
        }
        return null;
    }
}
@@ -359,7 +475,6 @@
        {
            return StringUtility.Contact(hourBegin, ":", minuteBegin);
        }
    }
    public static int Compare(HourMinute _lhs, HourMinute _rhs)
System/DailyQuest/DailyQuestModel.cs
@@ -451,22 +451,16 @@
        public List<int> GetQuestByWeekTimeNode(int _week, int _timeNode)
        {
            if (questCalendar.ContainsKey(_week))
            var quests = new List<int>();
            foreach (var item in dailyQuestOpenTimes.Values)
            {
                var timeNodeToQuests = questCalendar[_week];
                if (timeNodeToQuests.ContainsKey(_timeNode))
                if (item.ContainTimeNode(_week, _timeNode))
                {
                    return questCalendar[_week][_timeNode];
                }
                else
                {
                    return null;
                    quests.Add(item.id);
                }
            }
            else
            {
                return null;
            }
            return quests;
        }
        /// <summary>
@@ -476,14 +470,13 @@
        /// <returns></returns>
        public Dictionary<int, List<int>> GetQuestByWeekTime(int _week)
        {
            if (questCalendar.ContainsKey(_week))
            var timeNodes = new Dictionary<int, List<int>>();
            foreach (var item in GeneralConfig.Instance.dailyQuestOpenTime)
            {
                return questCalendar[_week];
                timeNodes[item] = GetQuestByWeekTimeNode(_week, item);
            }
            else
            {
                return null;
            }
            return timeNodes;
        }
        private void OnFunctionStateChange(int _functionId)
@@ -731,22 +724,9 @@
                DailyQuestOpenTime openTime2;
                TryGetOpenTime(_rhs, out openTime2);
                var isValidServerTime1 = openTime1.IsValidServerOpenTime();
                var isValidServerTime2 = openTime2.IsValidServerOpenTime();
                if (isValidServerTime1 && !isValidServerTime2)
                {
                    return -1;
                }
                if (!isValidServerTime1 && isValidServerTime2)
                {
                    return 1;
                }
                var dayOfWeek = (int)DateTime.Now.DayOfWeek;
                var isActiveDay1 = openTime1.always || openTime1.openTimes.ContainsKey(dayOfWeek);
                var isActiveDay2 = openTime2.always || openTime2.openTimes.ContainsKey(dayOfWeek);
                var dayOfWeek = (int)TimeUtility.ServerNow.DayOfWeek;
                var isActiveDay1 = openTime1.always || openTime1.GetHourMinuteByWeek(dayOfWeek) != null;
                var isActiveDay2 = openTime2.always || openTime2.GetHourMinuteByWeek(dayOfWeek) != null;
                if (isActiveDay1 && !isActiveDay2)
                {
@@ -823,12 +803,6 @@
            DailyQuestOpenTime openTime;
            if (TryGetOpenTime(_dailyQuestId, out openTime))
            {
                var validServerTime = openTime.IsValidServerOpenTime();
                if (!validServerTime)
                {
                    return DailyQuestState.ServerForbid;
                }
                var inOpenTime = openTime.InOpenTime();
                if (!inOpenTime)
                {
@@ -1000,12 +974,16 @@
                {
                    case 1:
                        var activityOpenTime = Config.Instance.Get<DailyQuestOpenTimeConfig>(config.RelatedID);
                        openTime = dailyQuestOpenTimes[config.ID] = new DailyQuestOpenTime(config.ID, activityOpenTime.OpenTime, activityOpenTime.Duration);
                        openTime = dailyQuestOpenTimes[config.ID] = new DailyQuestOpenTime(config.ID);
                        openTime.ParseQuestNormalOpenTime(activityOpenTime.OpenTime, activityOpenTime.Duration);
                        openTime.ParseQuestSpecificOpenTimes(DailyQuestSpecialOpenTimeConfig.GetDailyQuestTimes(config.RelatedID));
                        dailyActionToDailyQuestTable[config.RelatedID] = config.ID;
                        break;
                    case 2:
                        var dungeonOpenTimes = DungeonStateTimeConfig.DungeonStateCanEnterFB(config.RelatedID);
                        openTime = dailyQuestOpenTimes[config.ID] = new DailyQuestOpenTime(config.ID, dungeonOpenTimes);
                        openTime = dailyQuestOpenTimes[config.ID] = new DailyQuestOpenTime(config.ID);
                        openTime.ParseDungeonNormalOpenTimes(dungeonOpenTimes);
                        openTime.ParseDungeonSpecificOpenTimes(DungeonSpecialStateTimeConfig.GetDungeonTimes(config.RelatedID));
                        dungeonToDailyQuestTable[config.RelatedID] = config.ID;
                        break;
                }
@@ -1014,37 +992,6 @@
                dailyQuests[config.ID] = new DailyQuestData(config.ID, DAILYQUEST_REDPOINTIDBASE + redpointIndex++, redpointParent);
            }
            for (int i = 0; i < 7; i++)
            {
                questCalendar[i] = new Dictionary<int, List<int>>();
            }
            foreach (var key in dailyQuestOpenTimes.Keys)
            {
                var dailyQuestOpenTime = dailyQuestOpenTimes[key];
                foreach (var week in dailyQuestOpenTime.openTimes.Keys)
                {
                    var hourMinutes = dailyQuestOpenTime.openTimes[week];
                    var timeNodeToQuests = questCalendar[week];
                    for (int i = 0; i < hourMinutes.Count; i++)
                    {
                        var hourMinute = hourMinutes[i];
                        var timeNode = hourMinute.hourBegin * 60 + hourMinute.minuteBegin;
                        List<int> quests;
                        if (timeNodeToQuests.ContainsKey(timeNode))
                        {
                            quests = timeNodeToQuests[timeNode];
                        }
                        else
                        {
                            timeNodeToQuests[timeNode] = quests = new List<int>();
                        }
                        quests.Add(key);
                    }
                }
            }
        }
        public enum DailyQuestCategory
@@ -1056,7 +1003,6 @@
        public enum DailyQuestState
        {
            Locked = 0,
            ServerForbid = 1,
            OutTime = 2,
            Normal = 3,
            CanBuyTimes = 5,
System/Dungeon/DungeonBreifInfo.cs
@@ -79,14 +79,14 @@
                }
                else
                {
                    var week = TimeUtility.ServerNow.DayOfWeek;
                    if (dungeonOpenTime.openTimes.ContainsKey((int)week))
                    var week = (int)TimeUtility.ServerNow.DayOfWeek;
                    var openTimes = dungeonOpenTime.GetHourMinuteByWeek(week);
                    if (openTimes != null)
                    {
                        var durations = dungeonOpenTime.openTimes[(int)week];
                        var stringArray = new string[durations.Count];
                        for (int i = 0; i < durations.Count; i++)
                        var stringArray = new string[openTimes.Count];
                        for (int i = 0; i < openTimes.Count; i++)
                        {
                            stringArray[i] = durations[i].ToString();
                            stringArray[i] = openTimes[i].ToString();
                        }
                        m_OpenTime.text = string.Join(",", stringArray);
                    }
System/Dungeon/DungeonModel.cs
@@ -41,54 +41,65 @@
        List<Item> sweepResultItems = new List<Item>();
        int m_SweepDungeonTypeBuf = 0;
        public int sweepDungeonTypeBuf {
        public int sweepDungeonTypeBuf
        {
            get { return m_SweepDungeonTypeBuf; }
        }
        Dungeon m_SelectedTrialDungeon;
        public Dungeon selectedTrialDungeon {
        public Dungeon selectedTrialDungeon
        {
            get { return m_SelectedTrialDungeon; }
            set { m_SelectedTrialDungeon = value; }
        }
        Dungeon m_CurrentDungeon;
        public Dungeon currentDungeon {
        public Dungeon currentDungeon
        {
            get { return m_CurrentDungeon; }
            set { m_CurrentDungeon = value; }
        }
        int m_DungeonGrade = 0;
        public int dungeonGrade {
        public int dungeonGrade
        {
            get { return m_DungeonGrade; }
        }
        DungeonMissionData m_Mission;
        public DungeonMissionData mission {
        public DungeonMissionData mission
        {
            get { return m_Mission; }
        }
        DungeonResult m_DungeonResult;
        public DungeonResult dungeonResult {
        public DungeonResult dungeonResult
        {
            get { return m_DungeonResult; }
            set { m_DungeonResult = value; }
        }
        public int dungeonCoinInspireCount {
        public int dungeonCoinInspireCount
        {
            get; private set;
        }
        public int dungeonJadeInspireCount {
        public int dungeonJadeInspireCount
        {
            get; private set;
        }
        public int dungeonInspireUper {
        public int dungeonInspireUper
        {
            get; private set;
        }
        Dungeon m_SelectedKylinDungeon;
        public Dungeon selectedKylinDungeon {
        public Dungeon selectedKylinDungeon
        {
            get { return m_SelectedKylinDungeon; }
            set {
            set
            {
                if (m_SelectedKylinDungeon != value)
                {
                    m_SelectedKylinDungeon = value;
@@ -109,9 +120,11 @@
        public bool gradeTween = true;
        DungeonFightStage m_DungeonFightStage = DungeonFightStage.None;
        public DungeonFightStage dungeonFightStage {
        public DungeonFightStage dungeonFightStage
        {
            get { return m_DungeonFightStage; }
            set {
            set
            {
                if (m_DungeonFightStage != value)
                {
                    m_DungeonFightStage = value;
@@ -1334,7 +1347,9 @@
                if (!dungeonOpenTimes.ContainsKey(config.DataMapID))
                {
                    dungeonOpenTimes[config.DataMapID] = new DailyQuestOpenTime(config.DataMapID, DungeonStateTimeConfig.DungeonStateCanEnterFB(config.DataMapID));
                    var openTime = dungeonOpenTimes[config.DataMapID] = new DailyQuestOpenTime(config.DataMapID);
                    openTime.ParseDungeonNormalOpenTimes(DungeonStateTimeConfig.DungeonStateCanEnterFB(config.DataMapID));
                    openTime.ParseDungeonSpecificOpenTimes(DungeonSpecialStateTimeConfig.GetDungeonTimes(config.DataMapID));
                }
            }
System/Dungeon/FairyLeagueDungeonResourceBehaviour.cs
@@ -61,7 +61,7 @@
                    _crystalDict.ContainsKey(i + 1) ? _crystalDict[i + 1].Length : 0);
                float _propertyUpper = 0;
                if (_help.fairyWarEnter.WinCount != null && _help.fairyWarEnter.WinCount[1 - i] != 0
                    && (model.fairyLeagueRing == 1 || model.BattleChampion()))
                    && (model.fairyLeagueSession == 1 || model.BattleChampion()))
                {
                    var _buffLv = kingFairyModel.GetWinStreakBuffLv(_help.fairyWarEnter.WinCount[1 - i]);
                    SkillConfig _multipleWinBuff = Config.Instance.Get<SkillConfig>(kingFairyModel.multipleWinBuffTypeId +
System/FairyAu/FairyLeagueModel.cs
@@ -12,75 +12,106 @@
    public class FairyLeagueModel : Model, IAfterPlayerDataInitialize, IBeforePlayerDataInitialize, IPlayerLoginOk
    {
        public event Action OnRefreshFairyLeagueEvent;
        private FairyLeagueStage m_FairyLeagueStage = FairyLeagueStage.Prepare;
        public FairyLeagueWeekTime currentWeekTime
        {
            get
            {
                var openServerTime = TimeUtility.openServerTime;
                var openServerWeekDay = openServerTime.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)openServerTime.DayOfWeek;
                if (specialLeagueTimes.ContainsKey(openServerWeekDay))
                {
                    var dict = specialLeagueTimes[openServerWeekDay];
                    var weekCount = TimeUtility.OpenWeekCnt;
                    if (dict.ContainsKey(weekCount))
                    {
                        return dict[weekCount];
                    }
                }
                if (TimeUtility.OpenWeekCnt <= 1)
                {
                    return null;
                }
                return fairyLeagueWeekTime;
            }
        }
        public FairyLeagueWeekTime nextWeekTime
        {
            get
            {
                var openServerTime = TimeUtility.openServerTime;
                var openServerWeekDay = openServerTime.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)openServerTime.DayOfWeek;
                if (specialLeagueTimes.ContainsKey(openServerWeekDay))
                {
                    var dict = specialLeagueTimes[openServerWeekDay];
                    var weekCount = TimeUtility.OpenWeekCnt + 1;
                    if (dict.ContainsKey(weekCount))
                    {
                        return dict[weekCount];
                    }
                }
                return fairyLeagueWeekTime;
            }
        }
        FairyLeagueStage cacheLeagueStage = FairyLeagueStage.Prepare;
        public FairyLeagueStage fairyLeagueStage
        {
            get
            {
                if (StepRing())
                if (currentWeekTime == null)
                {
                    return FairyLeagueStage.Over;
                    return FairyLeagueStage.Prepare;
                }
                return m_FairyLeagueStage;
                return currentWeekTime.fairyLeagueStage;
            }
        }
        public int fairyLeagueSession
        {
            get
            {
                if (currentWeekTime == null)
                {
                    return 0;
                }
                return currentWeekTime.currentSession;
            }
        }
        public int fairyLeagueRing
        {
            get
            {
                if (IsNextWeek)
                if (currentWeekTime == null)
                {
                    return 0;
                }
                var _dayOfWeek = TimeUtility.ServerNow.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)TimeUtility.ServerNow.DayOfWeek;
                if (_dayOfWeek < groupTimes[1].dayOfWeek || _dayOfWeek > resultTimes[1].dayOfWeek)
                {
                    return 0;
                }
                else if (_dayOfWeek == groupTimes[1].dayOfWeek)
                {
                    if (TimeUtility.ServerNow.Hour < groupTimes[1].startHour)
                    {
                        return 0;
                    }
                    else if (TimeUtility.ServerNow.Hour == groupTimes[1].startHour &&
                        TimeUtility.ServerNow.Minute < groupTimes[1].startMinute)
                    {
                        return 0;
                    }
                }
                return 1;
                return currentWeekTime.currentRing;
            }
        }
        public int OpenServerWeek
        {
            get;
            private set;
        }
        public int ringCnt
        {
            get;
            private set;
        }
        public bool IsNextWeek
        {
            get
            {
                if (TimeUtility.OpenWeekCnt >= OpenServerWeek)
                {
                    var _dayOfWeek = TimeUtility.ServerNow.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)TimeUtility.ServerNow.DayOfWeek;
                    if (_dayOfWeek > resultTimes[1].dayOfWeek && _dayOfWeek <= 7)
                    {
                        return true;
                    }
                    return false;
                }
                else
                if (currentWeekTime == null)
                {
                    return true;
                }
                return currentWeekTime.IsNextWeek;
            }
        }
        bool serverInited = false;
        FairyModel fairyModel { get { return ModelCenter.Instance.GetModel<FairyModel>(); } }
@@ -88,45 +119,81 @@
        {
            ParseConfig();
            m_JoinFairyLeagueRedpoint = new Redpoint(10704, 1070401);
            dataRequestDict.Add(FairyLeagueStage.Grouping, false);
            dataRequestDict.Add(FairyLeagueStage.Fight, false);
            dataRequestDict.Add(FairyLeagueStage.Over, false);
            TimeUtility.OnServerOpenDayRefresh += OnServerOpenDayRefresh;
            DTCA003_tagUniversalGameRecInfo.onGetUniversalGameInfo += OnGetUniversalGameInfo;
            PlayerDatas.Instance.PlayerDataRefreshInfoEvent += PlayerDataRefreshInfoEvent;
            StageManager.Instance.onStageLoadFinish += OnStageLoadFinish;
            TimeMgr.Instance.OnMinuteEvent += MinuteEvent;
            TimeMgr.Instance.OnDayEvent += DayEvent;
            fairyLeagueHelp = new FairyLeagueHelp();
        }
        public override void UnInit()
        {
            DTCA003_tagUniversalGameRecInfo.onGetUniversalGameInfo -= OnGetUniversalGameInfo;
            TimeMgr.Instance.OnMinuteEvent -= MinuteEvent;
            TimeMgr.Instance.OnDayEvent -= DayEvent;
        }
        public void OnBeforePlayerDataInitialize()
        {
            ClearFairyWarHelp();
            frontFairyList.Clear();
            fairyLeagueFairyId = 0;
            fairyLeagueFairyName = string.Empty;
            serverInited = false;
        }
        public void OnAfterPlayerDataInitialize()
        {
            for (int i = 0; i < fairyStages.Length; i++)
            {
                dataRequestDict[fairyStages[i]] = false;
            }
            TimeMgr.Instance.OnSyntonyEvent -= OnSyntonyEvent;
            TimeMgr.Instance.OnSyntonyEvent += OnSyntonyEvent;
        }
        public void OnPlayerLoginOk()
        {
            CheckFairyLeagueStage();
            ResetFairyLeagueTime();
            cacheLeagueStage = fairyLeagueStage;
            CheckFairyLeagueData();
            UpdateRedpoint();
            serverInited = true;
        }
        private void OnServerOpenDayRefresh()
        {
            CheckFairyLeagueStage();
            ResetFairyLeagueTime();
        }
        private void DayEvent()
        {
            ResetFairyLeagueTime();
        }
        private void MinuteEvent()
        {
            if (!(StageManager.Instance.CurrentStage is DungeonStage) || !serverInited)
            {
                return;
            }
            if (cacheLeagueStage != fairyLeagueStage)
            {
                cacheLeagueStage = fairyLeagueStage;
                if (cacheLeagueStage != FairyLeagueStage.Prepare)
                {
                    CheckFairyLeagueData();
                }
                if (OnRefreshFairyLeagueEvent != null)
                {
                    OnRefreshFairyLeagueEvent();
                }
                DebugEx.LogFormat("进入{0}阶段", fairyLeagueStage);
            }
        }
        void ResetFairyLeagueTime()
        {
            if (OnRefreshFairyLeagueEvent != null)
            {
                OnRefreshFairyLeagueEvent();
            }
        }
        private void PlayerDataRefreshInfoEvent(PlayerDataRefresh _type)
@@ -146,31 +213,9 @@
            }
        }
        private void OnSyntonyEvent(TimeMgr.SyntonyType type)
        {
            if (type == TimeMgr.SyntonyType.FairyLeaugeStage)
            {
                CheckFairyLeagueStage();
                CheckFairyLeagueData();
                if (OnRefreshFairyLeagueEvent != null)
                {
                    OnRefreshFairyLeagueEvent();
                }
                UpdateRedpoint();
            }
        }
        #region 配置
        public const int FAIRY_LEAGUE_DUNGEON = 31220;
        public const int FAIRY_LEAGUE_BATTLE = 68;
        public readonly int[] groupRingStates = new int[] { 11, 21 };
        public readonly int[] fightRingStates = new int[] { 12, 22 };
        public readonly int overRingStates = 99;
        public WeekTime[] groupTimes { get; private set; }
        public WeekTime[] fightTimes { get; private set; }
        public WeekTime[] resultTimes { get; private set; }
        public WeekTime overTime { get; private set; }
        public readonly WeekTime skipWeekTime = new WeekTime(1, 0, 0, 0, 0);
        public List<WeekTime> fairyLeagueWeekTimes = new List<WeekTime>();
        private string[] guideImgKeys;
        public string[] GuideImgKeys
        {
@@ -179,11 +224,7 @@
                return guideImgKeys;
            }
        }
        private readonly FairyLeagueStage[] fairyStages = new FairyLeagueStage[]
        {
            FairyLeagueStage.Grouping,
            FairyLeagueStage.Fight, FairyLeagueStage.Over
        };
        public int fairyWarResUpperLimit
        {
            get;
@@ -200,6 +241,9 @@
        public Dictionary<int, List<AwardItem>> finalWarAwardDict = new Dictionary<int, List<AwardItem>>();
        public Dictionary<int, List<AwardItem>> finalWarChampionAwardDict = new Dictionary<int, List<AwardItem>>();
        private Dictionary<int, float> crystalRateDict = new Dictionary<int, float>();
        readonly List<int> fairyLeagueStateValues = new List<int>() { 11, 12, 13, 21, 22, 23 };
        FairyLeagueWeekTime fairyLeagueWeekTime = new FairyLeagueWeekTime();
        Dictionary<int, Dictionary<int, FairyLeagueWeekTime>> specialLeagueTimes = new Dictionary<int, Dictionary<int, FairyLeagueWeekTime>>();
        private void ParseConfig()
        {
            FuncConfigConfig cfg = Config.Instance.Get<FuncConfigConfig>("FamilyMatchGuide");
@@ -207,40 +251,45 @@
            {
                guideImgKeys = ConfigParse.GetMultipleStr(cfg.Numerical1);
            }
            ringCnt = groupRingStates.Length;
            groupTimes = new WeekTime[groupRingStates.Length];
            DungeonStateTimeConfig stateCfg = null;
            for (int i = 0; i < groupRingStates.Length; i++)
            var configs = Config.Instance.GetAllValues<DungeonStateTimeConfig>();
            for (int i = 0; i < configs.Count; i++)
            {
                stateCfg = DungeonStateTimeConfig.DungeonStateTime(FAIRY_LEAGUE_DUNGEON, groupRingStates[i]);
                if (stateCfg != null)
                if (configs[i].DataMapID == FAIRY_LEAGUE_DUNGEON && fairyLeagueStateValues.Contains(configs[i].StateValue))
                {
                    OpenServerWeek = stateCfg.OpenServerWeek;
                    groupTimes[i] = new WeekTime(stateCfg.StartWeekday, stateCfg.StartHour,
                        stateCfg.StartMinute, stateCfg.EndHour, stateCfg.EndMinute);
                    fairyLeagueWeekTimes.Add(groupTimes[i]);
                    fairyLeagueWeekTime.AddStage(configs[i]);
                }
            }
            fightTimes = new WeekTime[fightRingStates.Length];
            resultTimes = new WeekTime[fightRingStates.Length];
            for (int i = 0; i < fightRingStates.Length; i++)
            fairyLeagueWeekTime.Sort();
            var specialStateTimes = DungeonSpecialStateTimeConfig.GetDungeonTimes(FAIRY_LEAGUE_DUNGEON);
            for (int i = 0; i < specialStateTimes.Count; i++)
            {
                stateCfg = DungeonStateTimeConfig.DungeonStateTime(FAIRY_LEAGUE_DUNGEON, fightRingStates[i]);
                if (stateCfg != null)
                var specialConfig = specialStateTimes[i];
                if (fairyLeagueStateValues.Contains(specialConfig.StateValue))
                {
                    fightTimes[i] = new WeekTime(stateCfg.StartWeekday, stateCfg.StartHour,
                        stateCfg.StartMinute, stateCfg.EndHour, stateCfg.EndMinute);
                    fairyLeagueWeekTimes.Add(fightTimes[i]);
                    resultTimes[i] = new WeekTime(stateCfg.StartWeekday, stateCfg.EndHour, stateCfg.EndMinute, 0, 0);
                    fairyLeagueWeekTimes.Add(resultTimes[i]);
                    Dictionary<int, FairyLeagueWeekTime> dict;
                    if (!specialLeagueTimes.TryGetValue(specialConfig.OpenServerWeek, out dict))
                    {
                        dict = new Dictionary<int, FairyLeagueWeekTime>();
                        specialLeagueTimes.Add(specialConfig.OpenServerWeek, dict);
                    }
                    var dayOfWeek = 0;
                    var index = GetIndexOfWeek(specialConfig.OpenServerWeek, specialConfig.OpenServerDay, out dayOfWeek);
                    FairyLeagueWeekTime leagueTime;
                    if (!dict.TryGetValue(index, out leagueTime))
                    {
                        leagueTime = new FairyLeagueWeekTime();
                        dict.Add(index, leagueTime);
                    }
                    leagueTime.AddStage(specialConfig, dayOfWeek);
                }
            }
            stateCfg = DungeonStateTimeConfig.DungeonStateTime(FAIRY_LEAGUE_DUNGEON, overRingStates);
            overTime = new WeekTime(stateCfg.StartWeekday, stateCfg.StartHour,
                stateCfg.StartMinute, stateCfg.EndHour, stateCfg.EndMinute);
            fairyLeagueWeekTimes.Add(overTime);
            fairyLeagueWeekTimes.Sort(CompareTime);
            foreach (var dict in specialLeagueTimes.Values)
            {
                foreach (var leagueTime in dict.Values)
                {
                    leagueTime.Sort();
                }
            }
            cfg = Config.Instance.Get<FuncConfigConfig>("FamilyMatchResourcePoint");
            if (cfg != null)
            {
@@ -303,6 +352,14 @@
            cfg = Config.Instance.Get<FuncConfigConfig>("FamilyMatchResourcePoint1");
            crystalRateDict = ConfigParse.GetDic<int, float>(cfg.Numerical1);
        }
        int GetIndexOfWeek(int _openWeekDay, int _openDays, out int dayOfWeek)
        {
            var index = (_openWeekDay + _openDays - 1) / 7;
            dayOfWeek = (_openWeekDay + _openDays - 1) % 7;
            return index;
        }
        private List<AwardItem> ParseAward(string _config)
        {
            List<AwardItem> _list = new List<AwardItem>();
@@ -350,76 +407,7 @@
            return crystalRateDict.TryGetValue(_npcId, out _rate);
        }
        #endregion
        public void CheckFairyLeagueStage()
        {
            var _dayOfWeek = TimeUtility.ServerNow.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)TimeUtility.ServerNow.DayOfWeek;
            if (IsNextWeek)
            {
                m_FairyLeagueStage = FairyLeagueStage.Prepare;
                return;
            }
            for (int i = 0; i < fairyLeagueWeekTimes.Count; i++)
            {
                var _weekTime = fairyLeagueWeekTimes[i];
                if (_dayOfWeek < _weekTime.dayOfWeek)
                {
                    m_FairyLeagueStage = GetFairyLeagueStage(i);
                    return;
                }
                if (_dayOfWeek == _weekTime.dayOfWeek)
                {
                    if (TimeUtility.Hour < _weekTime.startHour)
                    {
                        m_FairyLeagueStage = GetFairyLeagueStage(i);
                        return;
                    }
                    if (TimeUtility.Hour == _weekTime.startHour &&
                        TimeUtility.Minute < _weekTime.startMinute)
                    {
                        m_FairyLeagueStage = GetFairyLeagueStage(i);
                        return;
                    }
                }
            }
            var _nowTime = new WeekTime(_dayOfWeek, TimeUtility.Hour, TimeUtility.Minute, 0, 0, TimeUtility.Second);
            TimeMgr.Instance.Register(TimeMgr.SyntonyType.FairyLeaugeStage,
                (float)(skipWeekTime - _nowTime).TotalSeconds);
            m_FairyLeagueStage = FairyLeagueStage.Prepare;
        }
        private FairyLeagueStage GetFairyLeagueStage(int _index)
        {
            var _dayOfWeek = TimeUtility.ServerNow.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)TimeUtility.ServerNow.DayOfWeek;
            var _nowTime = new WeekTime(_dayOfWeek, TimeUtility.Hour, TimeUtility.Minute, 0, 0, TimeUtility.Second);
            TimeMgr.Instance.Register(TimeMgr.SyntonyType.FairyLeaugeStage,
                (float)(fairyLeagueWeekTimes[_index] - _nowTime).TotalSeconds);
            switch (_index)
            {
                case 0:
                    return FairyLeagueStage.Prepare;
                case 1:
                case 4:
                    return FairyLeagueStage.Grouping;
                case 2:
                case 5:
                    return FairyLeagueStage.Fight;
                case 3:
                case 6:
                    return FairyLeagueStage.Over;
            }
            return FairyLeagueStage.Prepare;
        }
        private int CompareTime(WeekTime x, WeekTime y)
        {
            if (x.dayOfWeek.CompareTo(y.dayOfWeek) != 0)
            {
                return x.dayOfWeek.CompareTo(y.dayOfWeek);
            }
            if (x.startHour.CompareTo(y.startHour) != 0)
            {
                return x.startHour.CompareTo(y.startHour);
            }
            return x.startMinute.CompareTo(y.startMinute);
        }
        #region 仙盟联赛副本
        public int[] fairyLeagueCrystals
        {
@@ -512,12 +500,12 @@
        public bool BattleChampion()
        {
            var _ring = fairyLeagueRing;
            if (_ring == 0 &&
                fairyLeagueBattleDict.ContainsKey(_ring)
                && fairyLeagueBattleDict[_ring].ContainsKey(5))
            var _session = fairyLeagueSession;
            if (_session == 0 &&
                fairyLeagueBattleDict.ContainsKey(_session)
                && fairyLeagueBattleDict[_session].ContainsKey(5))
            {
                var _list = fairyLeagueBattleDict[_ring][5];
                var _list = fairyLeagueBattleDict[_session][5];
                return _list.Count == 1;
            }
            return false;
@@ -570,22 +558,18 @@
                    onFairyLeagueBattleEvent();
                }
                UpdateRedpoint();
                for (int i = 0; i < fairyStages.Length; i++)
                {
                    dataRequestDict[fairyStages[i]] = fairyStages[i] == fairyLeagueStage ? true : false;
                }
            }
        }
        public bool SelfFairyInBattle(out int _error)
        {
            _error = 3;
            var _ring = fairyLeagueRing;
            var _session = fairyLeagueSession;
            var _fairyId = PlayerDatas.Instance.fairyData.fairy.FamilyID;
            if (!fairyLeagueBattleDict.ContainsKey(_ring))
            if (!fairyLeagueBattleDict.ContainsKey(_session))
            {
                return false;
            }
            var _dict = fairyLeagueBattleDict[_ring];
            var _dict = fairyLeagueBattleDict[_session];
            foreach (var _grade in _dict.Keys)
            {
                if (_dict[_grade] == null)
@@ -659,18 +643,26 @@
                    SysNotifyMgr.Instance.ShowTip("LeagueCannotGo4");
                    break;
                case 5:
                    var _ring = fairyLeagueRing;
                    _ring = fairyLeagueStage == FairyLeagueStage.Fight || fairyLeagueStage == FairyLeagueStage.Over ? 1 - _ring : _ring;
                    if (_ring == 1)
                    var _session = fairyLeagueSession;
                    var isNextWeek = IsNextWeek;
                    FairyLeagueWeekTime.Session session;
                    var weekTime = isNextWeek ? nextWeekTime : currentWeekTime;
                    weekTime.TryGetSession(fairyLeagueRing, 1 - _session, out session);
                    var fightStage = session.stages.Find((x) =>
                    {
                        var _param = StringUtility.Contact(Language.Get(StringUtility.Contact("Weekday", groupTimes[_ring].dayOfWeek)),
                            fightTimes[1].startHour.ToString("D2"), ":", fightTimes[1].startMinute.ToString("D2"));
                        return x.stage == FairyLeagueStage.Fight;
                    });
                    if (_session == 0)
                    {
                        var _param = StringUtility.Contact(Language.Get(StringUtility.Contact("Weekday", weekTime.GetDayOfWeek(fairyLeagueRing))),
                            fightStage.startHour.ToString("D2"), ":", fightStage.startMinute.ToString("D2"));
                        SysNotifyMgr.Instance.ShowTip("LeagueCannotGo1", _param);
                    }
                    else
                    {
                        var _param = StringUtility.Contact(Language.Get("Next"), Language.Get(StringUtility.Contact("Weekday", groupTimes[_ring].dayOfWeek)),
                            fightTimes[0].startHour.ToString("D2"), ":", fightTimes[0].startMinute.ToString("D2"));
                        var _param = StringUtility.Contact(isNextWeek ? Language.Get("Next") : Language.Get("ThisTime"),
                            Language.Get(StringUtility.Contact("Weekday", weekTime.GetDayOfWeek(fairyLeagueRing))),
                            fightStage.startHour.ToString("D2"), ":", fightStage.startMinute.ToString("D2"));
                        SysNotifyMgr.Instance.ShowTip("LeagueCannotGo2", _param);
                    }
                    break;
@@ -680,16 +672,13 @@
            }
        }
        private Dictionary<FairyLeagueStage, bool> dataRequestDict = new Dictionary<FairyLeagueStage, bool>();
        public void CheckFairyLeagueData()
        {
            //if (dataRequestDict.ContainsKey(fairyLeagueStage) && !dataRequestDict[fairyLeagueStage])
            //{
            CA001_tagViewUniversalGameRec _pak = new CA001_tagViewUniversalGameRec();
            _pak.ViewType = (byte)FAIRY_LEAGUE_BATTLE;
            GameNetSystem.Instance.SendInfo(_pak);
            //}
        }
        public List<FairyLeagueBattleData> GetFairyLeague(int _ring, int _grade)
        {
            Dictionary<int, List<FairyLeagueBattleData>> dic = null;
@@ -780,13 +769,13 @@
        public FairyLeagueBattleData GetSelfBattleInfo()
        {
            var _ring = fairyLeagueRing;
            var _session = fairyLeagueSession;
            var _fairyId = PlayerDatas.Instance.fairyData.fairy.FamilyID;
            if (!fairyLeagueBattleDict.ContainsKey(_ring))
            if (!fairyLeagueBattleDict.ContainsKey(_session))
            {
                return null;
            }
            var _dict = fairyLeagueBattleDict[_ring];
            var _dict = fairyLeagueBattleDict[_session];
            foreach (var _grade in _dict.Keys)
            {
                if (_dict[_grade] == null)
@@ -804,9 +793,9 @@
            return null;
        }
        public bool StepRing(int _grade = 5)
        public bool StepSession(int _grade = 5)
        {
            if (fairyLeagueRing == 1)
            if (fairyLeagueSession == 1)
            {
                if (!fairyLeagueBattleDict.ContainsKey(1))
                {
@@ -932,69 +921,428 @@
        }
        #endregion
    }
    public struct WeekTime
    public class FairyLeagueWeekTime
    {
        public int dayOfWeek { get; private set; }
        public int startHour { get; private set; }
        public int startMinute { get; private set; }
        public int startSeconds { get; private set; }
        public int endHour { get; private set; }
        public int endMinute { get; private set; }
        public List<Ring> rings = new List<Ring>();
        public WeekTime(int _weekDay, int _startHour, int _startMinute, int _endHour, int _endMinute, int _startSeconds = 0)
        {
            dayOfWeek = _weekDay;
            startHour = _startHour;
            startMinute = _startMinute;
            startSeconds = _startSeconds;
            endHour = _endHour;
            endMinute = _endMinute;
        }
        public static TimeSpan operator -(WeekTime y, WeekTime x)
        {
            var _totalSeconds = 0;
            int i = x.dayOfWeek;
            for (i = x.dayOfWeek; i != y.dayOfWeek; i = i == 7 ? 1 : i + 1)
            {
                if (i == x.dayOfWeek)
                {
                    _totalSeconds += (23 - x.startHour) * 3600 + (59 - x.startMinute) * 60 + 60 - x.startSeconds;
                }
                else
                {
                    _totalSeconds += 24 * 3600;
                }
            }
            if (i == y.dayOfWeek)
            {
                if (x.dayOfWeek == i)
                {
                    var _timeSpany = new TimeSpan(y.startHour, y.startMinute, y.startSeconds);
                    var _timeSpanx = new TimeSpan(x.startHour, x.startMinute, x.startSeconds);
                    _totalSeconds += (int)(_timeSpany.TotalSeconds - _timeSpanx.TotalSeconds);
                }
                else
                {
                    _totalSeconds += y.startHour * 3600;
                }
            }
            return new TimeSpan(_totalSeconds * TimeSpan.TicksPerSecond);
        }
        private static WeekTime s_Now = new WeekTime();
        public static WeekTime Now
        public bool IsNextWeek
        {
            get
            {
                var _dayOfWeek = TimeUtility.ServerNow.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)TimeUtility.ServerNow.DayOfWeek;
                s_Now.dayOfWeek = _dayOfWeek;
                s_Now.startHour = TimeUtility.Hour;
                s_Now.startMinute = TimeUtility.Minute;
                s_Now.startSeconds = TimeUtility.Second;
                return s_Now;
                return rings.Count == 0 || rings[rings.Count - 1].IsOver(TimeUtility.ServerNow);
            }
        }
        public FairyLeagueStage fairyLeagueStage
        {
            get
            {
                if (IsNextWeek)
                {
                    return FairyLeagueStage.Prepare;
                }
                Ring ring;
                if (TryGetCurrentRing(out ring))
                {
                    Session session;
                    if (ring.TryGetSession(TimeUtility.ServerNow, out session))
                    {
                        Stage stage;
                        if (session.TryGetStage(TimeUtility.ServerNow, out stage))
                        {
                            return stage.stage;
                        }
                    }
                }
                return FairyLeagueStage.Prepare;
            }
        }
        public int currentRing
        {
            get
            {
                var ring = 0;
                for (int i = 0; i < rings.Count; i++)
                {
                    if (rings[i].InRing(TimeUtility.ServerNow))
                    {
                        return i;
                    }
                    if (rings[i].IsOver(TimeUtility.ServerNow))
                    {
                        ring++;
                    }
                }
                return Mathf.Min(ring, rings.Count - 1);
            }
        }
        public int GetDayOfWeek(int _index)
        {
            if (_index >= 0 && _index < rings.Count)
            {
                return rings[_index].dayOfWeek;
            }
            return 0;
        }
        public int currentSession
        {
            get
            {
                Ring ring;
                if (TryGetCurrentRing(out ring))
                {
                    return ring.currentSession;
                }
                return 0;
            }
        }
        public void AddStage(DungeonStateTimeConfig config)
        {
            var ring = rings.Find((x) =>
            {
                return x.dayOfWeek == config.StartWeekday;
            });
            if (ring == null)
            {
                ring = new Ring();
                rings.Add(ring);
                ring.dayOfWeek = config.StartWeekday;
            }
            ring.ParseConfig(config);
        }
        public void AddStage(DungeonSpecialStateTimeConfig config, int dayOfWeek)
        {
            var ring = rings.Find((x) =>
            {
                return x.dayOfWeek == dayOfWeek;
            });
            if (ring == null)
            {
                ring = new Ring();
                rings.Add(ring);
                ring.dayOfWeek = dayOfWeek;
            }
            ring.ParseConfig(config, dayOfWeek);
        }
        public void Sort()
        {
            rings.Sort((Ring x, Ring y) =>
            {
                return x.dayOfWeek.CompareTo(y.dayOfWeek);
            });
            for (int i = 0; i < rings.Count; i++)
            {
                rings[i].Sort();
            }
        }
        public bool TryGetCurrentRing(out Ring ring)
        {
            ring = null;
            for (int i = 0; i < rings.Count; i++)
            {
                if (rings[i].InRing(TimeUtility.ServerNow))
                {
                    ring = rings[i];
                    return true;
                }
            }
            return false;
        }
        public bool TryGetSession(int _ring, int _session, out Session session)
        {
            session = null;
            if (_ring >= 0 && _ring < rings.Count)
            {
                if (_session >= 0 && _session < rings[_ring].sessions.Count)
                {
                    session = rings[_ring].sessions[_session];
                    return true;
                }
            }
            return false;
        }
        public class Ring
        {
            public List<Session> sessions = new List<Session>();
            public int currentSession
            {
                get
                {
                    for (int i = 0; i < sessions.Count; i++)
                    {
                        if (sessions[i].InSession(TimeUtility.ServerNow))
                        {
                            return i;
                        }
                    }
                    return 0;
                }
            }
            public int dayOfWeek { get; set; }
            public void Sort()
            {
                sessions.Sort((Session x, Session y) =>
                {
                    return x.session.CompareTo(y.session);
                });
                for (int i = 0; i < sessions.Count; i++)
                {
                    sessions[i].Sort();
                }
            }
            public void ParseConfig(DungeonStateTimeConfig config)
            {
                var session = sessions.Find((x) =>
                {
                    return x.session == (config.StateValue < 20 ? 0 : 1);
                });
                if (session == null)
                {
                    session = new Session();
                    session.session = config.StateValue < 20 ? 0 : 1;
                    sessions.Add(session);
                }
                session.ParseConfig(config);
            }
            public void ParseConfig(DungeonSpecialStateTimeConfig config, int dayOfWeek)
            {
                var session = sessions.Find((x) =>
                {
                    return x.session == (config.StateValue < 20 ? 0 : 1);
                });
                if (session == null)
                {
                    session = new Session();
                    session.session = config.StateValue < 20 ? 0 : 1;
                    sessions.Add(session);
                }
                session.ParseConfig(config, dayOfWeek);
            }
            public bool InRing(DateTime time)
            {
                for (int i = 0; i < sessions.Count; i++)
                {
                    if (sessions[i].InSession(time))
                    {
                        return true;
                    }
                }
                return false;
            }
            public bool TryGetSession(DateTime time, out Session session)
            {
                session = null;
                for (int i = 0; i < sessions.Count; i++)
                {
                    if (sessions[i].InSession(time))
                    {
                        session = sessions[i];
                        return true;
                    }
                }
                return false;
            }
            public bool IsOver(DateTime time)
            {
                bool allOver = true;
                for (int i = 0; i < sessions.Count; i++)
                {
                    if (!sessions[i].IsOver(time))
                    {
                        allOver = false;
                        break;
                    }
                }
                return allOver;
            }
        }
        public class Session
        {
            public List<Stage> stages = new List<Stage>();
            public int session { get; set; }
            public void Sort()
            {
                var fightStage = stages.Find((x) =>
                {
                    return x.stage == FairyLeagueStage.Fight;
                });
                var overStage = stages.Find((x) =>
                {
                    return x.stage == FairyLeagueStage.Over;
                });
                overStage.startHour = fightStage.endHour;
                overStage.startMinute = fightStage.endMinute;
                stages.Sort(Compare);
            }
            public void ParseConfig(DungeonStateTimeConfig config)
            {
                var state = config.StateValue % 10;
                var stage = new Stage()
                {
                    stage = state == 1 ? FairyLeagueStage.Grouping : (state == 2 ? FairyLeagueStage.Fight : FairyLeagueStage.Over),
                    dayOfWeek = config.StartWeekday,
                    startHour = config.StartHour,
                    endHour = config.EndHour,
                    startMinute = config.StartMinute,
                    endMinute = config.EndMinute
                };
                stages.Add(stage);
            }
            public void ParseConfig(DungeonSpecialStateTimeConfig config, int dayOfWeek)
            {
                var state = config.StateValue % 10;
                var stage = new Stage()
                {
                    stage = state == 1 ? FairyLeagueStage.Grouping : (state == 2 ? FairyLeagueStage.Fight : FairyLeagueStage.Over),
                    dayOfWeek = dayOfWeek,
                    startHour = config.StartHour,
                    endHour = config.EndHour,
                    startMinute = config.StartMinute,
                    endMinute = config.EndMinute
                };
                stages.Add(stage);
            }
            public bool InSession(DateTime time)
            {
                var groupStage = stages.Find((x) =>
                {
                    return x.stage == FairyLeagueStage.Grouping;
                });
                var overStage = stages.Find((x) =>
                {
                    return x.stage == FairyLeagueStage.Over;
                });
                var _dayOfWeek = time.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)time.DayOfWeek;
                if (_dayOfWeek != groupStage.dayOfWeek)
                {
                    return false;
                }
                if (time.Hour < groupStage.startHour || time.Hour > overStage.endHour)
                {
                    return false;
                }
                if (time.Hour == groupStage.startHour && time.Minute < groupStage.startMinute)
                {
                    return false;
                }
                if (time.Hour == overStage.endHour && time.Minute > overStage.endMinute)
                {
                    return false;
                }
                return true;
            }
            public bool TryGetStage(DateTime time, out Stage stage)
            {
                stage = default(Stage);
                for (int i = 0; i < stages.Count; i++)
                {
                    if (stages[i].InStage(time))
                    {
                        stage = stages[i];
                        return true;
                    }
                    if (stages[i].IsOver(time))
                    {
                        stage = stages[i];
                    }
                }
                return !stage.Equals(default(Stage));
            }
            public bool IsOver(DateTime time)
            {
                var stage = stages.Find((x) =>
                {
                    return x.stage == FairyLeagueStage.Over;
                });
                return stage.IsOver(time);
            }
            int Compare(Stage x, Stage y)
            {
                return x.stage.CompareTo(y.stage);
            }
        }
        public class Stage
        {
            public FairyLeagueStage stage;
            public int dayOfWeek;
            public int startHour;
            public int endHour;
            public int startMinute;
            public int endMinute;
            public bool InStage(DateTime time)
            {
                var _dayOfWeek = time.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)time.DayOfWeek;
                if (dayOfWeek != _dayOfWeek)
                {
                    return false;
                }
                if (time.Hour < startHour || time.Hour > endHour)
                {
                    return false;
                }
                if (time.Hour == startHour && time.Minute < startMinute)
                {
                    return false;
                }
                if (time.Hour == endHour && time.Minute >= endMinute)
                {
                    return false;
                }
                return true;
            }
            public bool IsOver(DateTime time)
            {
                var _dayOfWeek = time.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)time.DayOfWeek;
                if (_dayOfWeek > dayOfWeek)
                {
                    return true;
                }
                if (dayOfWeek == _dayOfWeek)
                {
                    if (time.Hour > endHour)
                    {
                        return true;
                    }
                    if (time.Hour == endHour && time.Minute >= endMinute)
                    {
                        return true;
                    }
                }
                return false;
            }
        }
    }
    public enum FairyLeagueStage
    {
        Prepare,
System/FairyAu/FairyLeagueRankCell.cs
@@ -70,7 +70,7 @@
            m_ChampionAwardBtn.onClick.RemoveAllListeners();
            if (model.fairyLeagueGroupId == 5 && _index == model.GetBattleFirstPlayer())
            {
                var _dict = (model.fairyLeagueRing == 1 && model.fairyLeagueHelp.fairyWarEnter.IsFinalMatch == 1) ?
                var _dict = (model.fairyLeagueSession == 1 && model.fairyLeagueHelp.fairyWarEnter.IsFinalMatch == 1) ?
                    model.finalWarChampionAwardDict : model.finalWarAwardDict;
                if (_dict != null)
                {
System/FairyAu/FairyLeagueWin.cs
@@ -128,7 +128,7 @@
        private void UpdateKingFairyEvent()
        {
            if (model.fairyLeagueRing == 1 && model.fairyLeagueStage == FairyLeagueStage.Over)
            if (model.fairyLeagueSession == 1 && model.fairyLeagueStage == FairyLeagueStage.Over)
            {
                m_RewardTxt.text = Language.Get("CongratulationWangZheMeng", kingFairyModel.kingFairyData.fairyName);
            }
@@ -153,19 +153,20 @@
        private void RefreshPrepare()
        {
            var _ring = model.fairyLeagueRing;
            if (TimeUtility.OpenWeekCnt > model.OpenServerWeek)
            var isNextWeek = model.IsNextWeek;
            var weekTime = isNextWeek ? model.nextWeekTime : model.currentWeekTime;
            var ring = isNextWeek ? 0 : weekTime.currentRing;
            FairyLeagueWeekTime.Session session;
            if (weekTime.TryGetSession(ring, 0, out session))
            {
                m_PrepareTitleTxt.text = Language.Get("FamilyMatchQualification");
                var stage = session.stages.Find((x) =>
                {
                    return x.stage == FairyLeagueStage.Grouping;
                });
                m_CutOffTimeTxt.text = Language.Get("FamilyMatchBlockingTime", isNextWeek ? Language.Get("Next") : Language.Get("ThisTime"),
                         Language.Get(StringUtility.Contact("Weekday", weekTime.GetDayOfWeek(ring))), stage.startHour,
                         stage.startMinute.ToString("D2"));
            }
            else
            {
                m_PrepareTitleTxt.text = Language.Get("FamilyMatchQualification2");
            }
            m_CutOffTimeTxt.text = Language.Get("FamilyMatchBlockingTime", model.IsNextWeek ? Language.Get("Next") : Language.Get("ThisTime"),
                Language.Get(StringUtility.Contact("Weekday", model.groupTimes[_ring].dayOfWeek)), model.groupTimes[_ring].startHour,
                model.groupTimes[_ring].startMinute.ToString("D2"));
            UpdateFairyLeagueGroup();
            UpdateStageTime();
@@ -176,14 +177,14 @@
            switch (model.fairyLeagueStage)
            {
                case FairyLeagueStage.Grouping:
                    m_BattleTitleTxt.text = Language.Get("FamilyMatchAboutToStart", Language.Get(StringUtility.Contact("Num_CHS_", model.fairyLeagueRing + 1)));
                    m_BattleTitleTxt.text = Language.Get("FamilyMatchAboutToStart", Language.Get(StringUtility.Contact("Num_CHS_", model.fairyLeagueSession + 1)));
                    break;
                case FairyLeagueStage.Fight:
                    m_BattleTitleTxt.text = Language.Get("FamilyMatchDoing", Language.Get(StringUtility.Contact("Num_CHS_", model.fairyLeagueRing + 1)));
                    m_BattleTitleTxt.text = Language.Get("FamilyMatchDoing", Language.Get(StringUtility.Contact("Num_CHS_", model.fairyLeagueSession + 1)));
                    break;
                case FairyLeagueStage.Over:
                    UpdateKingFairyEvent();
                    m_BattleTitleTxt.text = Language.Get("FamilyMatchEnd", Language.Get(StringUtility.Contact("Num_CHS_", model.fairyLeagueRing + 1)));
                    m_BattleTitleTxt.text = Language.Get("FamilyMatchEnd", Language.Get(StringUtility.Contact("Num_CHS_", model.fairyLeagueSession + 1)));
                    break;
            }
            UpdateStageTime();
@@ -191,49 +192,89 @@
        }
        private void UpdateStageTime()
        {
            var _ring = model.fairyLeagueRing;
            var _session = model.fairyLeagueSession;
            bool _stage1Over = false;
            bool _stage2Over = false;
            m_LeagueStartTime.text = Language.Get("FamilyMatchWeekTime", model.IsNextWeek ? Language.Get("Next") : Language.Get("ThisTime"), Language.Get(StringUtility.Contact("Weekday", model.groupTimes[_ring].dayOfWeek)));
            if (_ring > 0 || model.fairyLeagueStage == FairyLeagueStage.Over)
            var isNextWeek = model.IsNextWeek;
            var weekTime = isNextWeek ? model.nextWeekTime : model.currentWeekTime;
            var ring = isNextWeek ? 0 : weekTime.currentRing;
            var fairyLeagueStage = model.fairyLeagueStage;
            FairyLeagueWeekTime.Session session1;
            weekTime.TryGetSession(ring, 0, out session1);
            FairyLeagueWeekTime.Session session2;
            weekTime.TryGetSession(ring, 1, out session2);
            m_LeagueStartTime.text = Language.Get("FamilyMatchWeekTime", model.IsNextWeek ? Language.Get("Next") : Language.Get("ThisTime"), Language.Get(StringUtility.Contact("Weekday", weekTime.GetDayOfWeek(ring))));
            if (_session > 0 || fairyLeagueStage == FairyLeagueStage.Over)
            {
                _stage1Over = true;
                m_StageTime1.text = StringUtility.Contact(Language.Get("FamilyMatchWhichTurn", Language.Get("Num_CHS_1")), ":   ", Language.Get("FamilyMatchAlreadyEnd"));
            }
            if (_ring > 0 && model.fairyLeagueStage == FairyLeagueStage.Over)
            if (_session > 0 && fairyLeagueStage == FairyLeagueStage.Over)
            {
                _stage2Over = true;
                m_StageTime2.text = StringUtility.Contact(Language.Get("FamilyMatchWhichTurn", Language.Get("Num_CHS_2")), ":   ", Language.Get("FamilyMatchAlreadyEnd"));
            }
            if (!_stage1Over)
            {
                m_StageTime1.text = StringUtility.Contact(Language.Get("FamilyMatchWhichTurn", Language.Get("Num_CHS_1")), ":   ",
                    Language.Get(StringUtility.Contact("Weekday", model.groupTimes[0].dayOfWeek)), " ", model.fightTimes[0].startHour, ":",
                    model.fightTimes[0].startMinute.ToString("D2"), "-", model.fightTimes[0].endHour, ":",
                    model.fightTimes[0].endMinute.ToString("D2"));
                if (session1 != null)
                {
                    var groupStage = session1.stages.Find((x) => { return x.stage == FairyLeagueStage.Grouping; });
                    var fightStage = session1.stages.Find((x) => { return x.stage == FairyLeagueStage.Fight; });
                    m_StageTime1.text = StringUtility.Contact(Language.Get("FamilyMatchWhichTurn", Language.Get("Num_CHS_1")), ":   ",
                        Language.Get(StringUtility.Contact("Weekday", groupStage.dayOfWeek)), " ", fightStage.startHour, ":",
                        fightStage.startMinute.ToString("D2"), "-", fightStage.endHour, ":",
                        fightStage.endMinute.ToString("D2"));
                }
            }
            if (!_stage2Over)
            {
                m_StageTime2.text = StringUtility.Contact(Language.Get("FamilyMatchWhichTurn", Language.Get("Num_CHS_2")), ":   ",
                    Language.Get(StringUtility.Contact("Weekday", model.groupTimes[1].dayOfWeek)), " ", model.fightTimes[1].startHour, ":",
                    model.fightTimes[1].startMinute.ToString("D2"), "-", model.fightTimes[1].endHour, ":",
                    model.fightTimes[1].endMinute.ToString("D2"));
                if (session2 != null)
                {
                    var groupStage = session2.stages.Find((x) => { return x.stage == FairyLeagueStage.Grouping; });
                    var fightStage = session2.stages.Find((x) => { return x.stage == FairyLeagueStage.Fight; });
                    m_StageTime2.text = StringUtility.Contact(Language.Get("FamilyMatchWhichTurn", Language.Get("Num_CHS_2")), ":   ",
                        Language.Get(StringUtility.Contact("Weekday", groupStage.dayOfWeek)), " ", fightStage.startHour, ":",
                        fightStage.startMinute.ToString("D2"), "-", fightStage.endHour, ":",
                        fightStage.endMinute.ToString("D2"));
                }
            }
            if (_ring == 0 && model.fairyLeagueStage == FairyLeagueStage.Over)
            if (_session == 0 && fairyLeagueStage == FairyLeagueStage.Over)
            {
                m_LeagueStartTime.text = Language.Get("FamilyMatchWeekTime", model.IsNextWeek ? Language.Get("Next") : Language.Get("ThisTime"), Language.Get(StringUtility.Contact("Weekday", model.groupTimes[1].dayOfWeek)));
                if (session1 != null)
                {
                    var groupStage = session1.stages.Find((x) => { return x.stage == FairyLeagueStage.Grouping; });
                    var fightStage = session1.stages.Find((x) => { return x.stage == FairyLeagueStage.Fight; });
                    m_LeagueStartTime.text = Language.Get("FamilyMatchWeekTime", model.IsNextWeek ? Language.Get("Next") : Language.Get("ThisTime"), Language.Get(StringUtility.Contact("Weekday", groupStage.dayOfWeek)));
                }
            }
            else
            {
                m_LeagueStartTime.text = Language.Get("FamilyMatchWeekTime", model.IsNextWeek ? Language.Get("Next") : Language.Get("ThisTime"), Language.Get(StringUtility.Contact("Weekday", model.groupTimes[_ring].dayOfWeek)));
                if (session2 != null)
                {
                    var groupStage = session2.stages.Find((x) => { return x.stage == FairyLeagueStage.Grouping; });
                    var fightStage = session2.stages.Find((x) => { return x.stage == FairyLeagueStage.Fight; });
                    m_LeagueStartTime.text = Language.Get("FamilyMatchWeekTime", model.IsNextWeek ? Language.Get("Next") : Language.Get("ThisTime"), Language.Get(StringUtility.Contact("Weekday", groupStage.dayOfWeek)));
                }
            }
        }
        private void UpdateFairyLeagueGroup()
        {
            if (model.fairyLeagueStage != FairyLeagueStage.Prepare)
            {
                return;
            }
            if (HasGradeFairy())
            {
                m_PrepareTitleTxt.text = Language.Get("FamilyMatchQualification");
            }
            else
            {
                m_PrepareTitleTxt.text = Language.Get("FamilyMatchQualification2");
            }
            for (int i = 0; i < m_FairyNameList.Count; i++)
            {
                List<PlayerFairyData.FairyData> list = model.frontLeagueFairy;
@@ -254,16 +295,31 @@
                }
            }
        }
        bool HasGradeFairy()
        {
            List<PlayerFairyData.FairyData> list = model.frontLeagueFairy;
            for (int i = 0; i < list.Count; i++)
            {
                if (list[i].WarRank != 0)
                {
                    return true;
                }
            }
            return false;
        }
        private void UpdateFairyLeagueBattle()
        {
            var _ring = model.fairyLeagueRing;
            var _session = model.fairyLeagueSession;
            var fairyLeagueStage = model.fairyLeagueStage;
            for (int i = 0; i < m_FairyClashList.Count; i++)
            {
                var fairyClash = m_FairyClashList[i];
                List<FairyLeagueBattleData> list = model.GetFairyLeague(model.StepRing(fairyClash.grade) ? 0 : model.fairyLeagueRing, fairyClash.grade);
                fairyClash.SetActive((model.fairyLeagueStage == FairyLeagueStage.Over && _ring == 1)
                    || model.StepRing(fairyClash.grade));
                if ((model.fairyLeagueStage == FairyLeagueStage.Over && _ring == 1) || model.StepRing(fairyClash.grade))
                List<FairyLeagueBattleData> list = model.GetFairyLeague(model.StepSession(fairyClash.grade) ? 0 : model.fairyLeagueSession, fairyClash.grade);
                fairyClash.SetActive((fairyLeagueStage == FairyLeagueStage.Over && _session == 1)
                    || model.StepSession(fairyClash.grade));
                if ((fairyLeagueStage == FairyLeagueStage.Over && _session == 1) || model.StepSession(fairyClash.grade))
                {
                    if (list == null || list.Count == 0)
                    {
System/FairyAu/FairyRequestWin.cs
@@ -38,6 +38,7 @@
        protected override void OnPreOpen()
        {
            PlayerDatas.Instance.fairyData.OnRefreshApplyList += OnRefreshApplyList;
            PlayerDatas.Instance.fairyData.OnRefreshFairyMine += OnRefreshFairyMine;
            OnRefreshApplyList();
        }
@@ -51,9 +52,20 @@
        protected override void OnAfterClose()
        {
            PlayerDatas.Instance.fairyData.OnRefreshApplyList -= OnRefreshApplyList;
        }
            PlayerDatas.Instance.fairyData.OnRefreshApplyList -= OnRefreshApplyList;
            PlayerDatas.Instance.fairyData.OnRefreshFairyMine -= OnRefreshFairyMine;
        }
        #endregion
        private void OnRefreshFairyMine()
        {
            if (!PlayerDatas.Instance.fairyData.HasFairy
                || !PlayerDatas.Instance.fairyData.IsCanFunc(PlayerFairyData.LimitFunc.CanKick))
            {
                CloseImmediately();
            }
        }
        private void OnRefreshFairyInfo()
        {
            PlayerFairyData.FairyData fairy = PlayerDatas.Instance.fairyData.fairy;
System/HeavenBattle/HeavenBattleModel.cs
@@ -553,6 +553,70 @@
    #endregion
}
public struct WeekTime
{
    public int dayOfWeek { get; private set; }
    public int startHour { get; private set; }
    public int startMinute { get; private set; }
    public int startSeconds { get; private set; }
    public int endHour { get; private set; }
    public int endMinute { get; private set; }
    public WeekTime(int _weekDay, int _startHour, int _startMinute, int _endHour, int _endMinute, int _startSeconds = 0)
    {
        dayOfWeek = _weekDay;
        startHour = _startHour;
        startMinute = _startMinute;
        startSeconds = _startSeconds;
        endHour = _endHour;
        endMinute = _endMinute;
    }
    public static TimeSpan operator -(WeekTime y, WeekTime x)
    {
        var _totalSeconds = 0;
        int i = x.dayOfWeek;
        for (i = x.dayOfWeek; i != y.dayOfWeek; i = i == 7 ? 1 : i + 1)
        {
            if (i == x.dayOfWeek)
            {
                _totalSeconds += (23 - x.startHour) * 3600 + (59 - x.startMinute) * 60 + 60 - x.startSeconds;
            }
            else
            {
                _totalSeconds += 24 * 3600;
            }
        }
        if (i == y.dayOfWeek)
        {
            if (x.dayOfWeek == i)
            {
                var _timeSpany = new TimeSpan(y.startHour, y.startMinute, y.startSeconds);
                var _timeSpanx = new TimeSpan(x.startHour, x.startMinute, x.startSeconds);
                _totalSeconds += (int)(_timeSpany.TotalSeconds - _timeSpanx.TotalSeconds);
            }
            else
            {
                _totalSeconds += y.startHour * 3600;
            }
        }
        return new TimeSpan(_totalSeconds * TimeSpan.TicksPerSecond);
    }
    private static WeekTime s_Now = new WeekTime();
    public static WeekTime Now
    {
        get
        {
            var _dayOfWeek = TimeUtility.ServerNow.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)TimeUtility.ServerNow.DayOfWeek;
            s_Now.dayOfWeek = _dayOfWeek;
            s_Now.startHour = TimeUtility.Hour;
            s_Now.startMinute = TimeUtility.Minute;
            s_Now.startSeconds = TimeUtility.Second;
            return s_Now;
        }
    }
}
public enum HeavenBattleState
{
    None,
System/KnapSack/New/ChooseItemWin.cs
@@ -62,6 +62,7 @@
        protected override void OnPreOpen()
        {
            useNum = 1;
            numKeyboard.gameObject.SetActive(false);
            chooseCell.gameObject.SetActive(false);
            chooseBtn.AddListener(ClickChooseBtn);
            closeBtn.AddListener(CloseWin);
System/MainInterfacePanel/InGamePushContainer.cs
@@ -25,6 +25,14 @@
        [SerializeField] DungeonGuardCheckBehaviour m_DungeonGuardBehaviour;
        [SerializeField] FirstChargeTrialBehaviour m_FirstChargeTrialBehaviour;
        WorldBossModel worldBossModel { get { return ModelCenter.Instance.GetModel<WorldBossModel>(); } }
        BossHomeModel bossHomeModel { get { return ModelCenter.Instance.GetModel<BossHomeModel>(); } }
        ElderGodAreaModel elderGodAreaModel { get { return ModelCenter.Instance.GetModel<ElderGodAreaModel>(); } }
        DemonJarModel demonJarModel { get { return ModelCenter.Instance.GetModel<DemonJarModel>(); } }
        DogzDungeonModel dogzDungeonModel { get { return ModelCenter.Instance.GetModel<DogzDungeonModel>(); } }
        VipModel vipModel { get { return ModelCenter.Instance.GetModel<VipModel>(); } }
        DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
        FindPreciousModel findPreciousModel { get { return ModelCenter.Instance.GetModel<FindPreciousModel>(); } }
        BetterEquipGetModel betterEquipGetModel { get { return ModelCenter.Instance.GetModel<BetterEquipGetModel>(); } }
        RealmBetterEquipModel realmEquipModel { get { return ModelCenter.Instance.GetModel<RealmBetterEquipModel>(); } }
@@ -202,30 +210,48 @@
                {
                    var findPreciousType = findPreciousModel.GetBossFindPreciousType(findPreciousModel.currentBossNotify);
                    var killable = false;
                    var show = true;
                    var mapId = PlayerDatas.Instance.baseData.MapID;
                    switch (findPreciousType)
                    {
                        case FindPreciousType.WorldBoss:
                            killable = worldBossModel.wearyValue < GeneralConfig.Instance.bossWearyValues[0] + worldBossModel.extraBossWearyValue;
                            show = !GeneralConfig.Instance.worldBossNoRebornRemindMaps.Contains(mapId);
                            break;
                        case FindPreciousType.BossHome:
                            killable = bossHomeModel.wearyValue < vipModel.GetVipPrivilegeCnt(VipPrivilegeType.BossHomeAwardLimit);
                            show = !GeneralConfig.Instance.bossHomeNoRebornRemindMaps.Contains(mapId);
                            break;
                        case FindPreciousType.ElderGodArea:
                            var elderGodEnterTimes = dungeonModel.GetDungeonEnterTimes(ElderGodAreaModel.ELDERGODAREA_MAPID);
                            var elderGodTotalTimes = dungeonModel.GetDungeonTotalTimes(ElderGodAreaModel.ELDERGODAREA_MAPID);
                            killable = elderGodTotalTimes > elderGodEnterTimes;
                            show = !GeneralConfig.Instance.elderGodNoRebornRemindMaps.Contains(mapId);
                            break;
                        case FindPreciousType.DemonJar:
                            var totalTimes = dungeonModel.GetDungeonTotalTimes(DemonJarModel.DEMONJAR_MAPID);
                            var enterTimes = dungeonModel.GetDungeonEnterTimes(DemonJarModel.DEMONJAR_MAPID);
                            killable = totalTimes > enterTimes;
                            show = !GeneralConfig.Instance.demonJarNoRebornRemindMaps.Contains(mapId);
                            break;
                        case FindPreciousType.DogzDungeon:
                            killable = dogzDungeonModel.wearyValue < GeneralConfig.Instance.bossWearyValues[2];
                            show = !GeneralConfig.Instance.dogzNoRebornRemindMaps.Contains(mapId);
                            break;
                    }
                    if (show)
                    if (killable)
                    {
                        m_BossRebornPusher.DisplayRebornBoss();
                        m_BossRebornPusher.gameObject.SetActive(true);
                        if (show)
                        {
                            m_BossRebornPusher.DisplayRebornBoss();
                            m_BossRebornPusher.gameObject.SetActive(true);
                        }
                    }
                    else
                    {
                        findPreciousModel.ReportConfirmBossRebornNotify(findPreciousModel.currentBossNotify);
                    }
                }
                else
System/SystemSetting/SetPrivateModel.cs
@@ -28,7 +28,7 @@
            hangUpPushlist.Add((int)PushNotifyType.PrivateChat);
            hangUpPushlist.Add((int)PushNotifyType.TJDead);
            hangUpPushlist.Add((int)PushNotifyType.TJWGTimeNoEnough);
        }
        public void OnBeforePlayerDataInitialize()
@@ -54,7 +54,7 @@
        public override void UnInit()
        {
        }
        public void SetActivityPushKey()
@@ -73,13 +73,17 @@
        {
            DailyQuestOpenTime dailyQuestOpenTime;
            dailyModel.TryGetOpenTime(dailyId, out dailyQuestOpenTime);
            foreach (var weekday in dailyQuestOpenTime.openTimes.Keys)
            for (int weekDay = 0; weekDay < 7; weekDay++)
            {
                List<HourMinute> hourMinutelist = dailyQuestOpenTime.openTimes[weekday];
                for (int i = 0; i < hourMinutelist.Count; i++)
                var hourMinutelist = dailyQuestOpenTime.GetHourMinuteByWeek(weekDay);
                if (hourMinutelist != null)
                {
                    string key = StringUtility.Contact(dailyId,weekday,hourMinutelist[i].hourBegin);
                    keylist.Add(key);
                    for (int j = 0; j < hourMinutelist.Count; j++)
                    {
                        var key = StringUtility.Contact(dailyId, weekDay, hourMinutelist[j].hourBegin);
                        keylist.Add(key);
                    }
                }
            }
        }
@@ -165,7 +169,7 @@
        public void RemoveActivityPushByKey(int dailyId, string pushKey)
        {
            if(pushAtcivityKeyDict[dailyId].Contains(pushKey))
            if (pushAtcivityKeyDict[dailyId].Contains(pushKey))
            {
                SDKUtility.Instance.GeTui_RemoveLocalMessage(pushKey);
            }
@@ -190,10 +194,10 @@
            string content = Language.Get("SetUpPrivate102", UIHelper.ServerStringTrim(PlayerDatas.Instance.baseData.PlayerName).TrimEnd(), config.Title);
            List<JsonData> pushNotifylist = new List<JsonData>();
            List<string> pushKeylist = null;
            List<int> pushNotifyTimelist = GetPushNotifyTime(dailyId,out pushKeylist);
            List<int> pushNotifyTimelist = GetPushNotifyTime(dailyId, out pushKeylist);
            for (int i = 0; i < pushNotifyTimelist.Count; i++)
            {
                if(i < pushKeylist.Count)
                if (i < pushKeylist.Count)
                {
                    JsonData _params = new JsonData();
                    _params["code"] = 2005;
@@ -213,46 +217,52 @@
            return pushNotifylist;
        }
        private List<int> GetPushNotifyTime(int dailyId,out List<string> pushKey)
        private List<int> GetPushNotifyTime(int dailyId, out List<string> pushKey)
        {
            List<int> pushDelaySecond = new List<int>();
            pushKey = new List<string>();
            DailyQuestOpenTime dailyQuestOpenTime;
            dailyModel.TryGetOpenTime(dailyId, out dailyQuestOpenTime);
            foreach (var weekday in dailyQuestOpenTime.openTimes.Keys)
            for (int weekDay = 0; weekDay < 7; weekDay++)
            {
                int day = weekday > 0 ? weekday : 7;
                int curDay = (int)TimeUtility.ServerNow.DayOfWeek > 0 ? (int)TimeUtility.ServerNow.DayOfWeek : 7;
                List <HourMinute> hourMinutelist = dailyQuestOpenTime.openTimes[weekday];
                int remainDay = day - curDay;
                if (remainDay < 0)
                var hourMinutelist = dailyQuestOpenTime.GetHourMinuteByWeek(weekDay);
                if (hourMinutelist != null)
                {
                    remainDay = 7 + remainDay;
                }
                for (int i = 0; i < hourMinutelist.Count; i++)
                {
                    int remainHour = hourMinutelist[i].hourBegin - TimeUtility.ServerNow.Hour;
                    int remainMinute = hourMinutelist[i].minuteBegin - TimeUtility.ServerNow.Minute;
                    if(remainDay <= 0)
                    int day = weekDay > 0 ? weekDay : 7;
                    int curDay = (int)TimeUtility.ServerNow.DayOfWeek > 0 ? (int)TimeUtility.ServerNow.DayOfWeek : 7;
                    int remainDay = day - curDay;
                    if (remainDay < 0)
                    {
                        if (remainHour < 0)
                        remainDay = 7 + remainDay;
                    }
                    for (int i = 0; i < hourMinutelist.Count; i++)
                    {
                        int remainHour = hourMinutelist[i].hourBegin - TimeUtility.ServerNow.Hour;
                        int remainMinute = hourMinutelist[i].minuteBegin - TimeUtility.ServerNow.Minute;
                        if (remainDay <= 0)
                        {
                            remainDay = 7;
                            if (remainHour < 0)
                            {
                                remainDay = 7;
                            }
                            else if (remainHour == 0 && remainMinute < 0)
                            {
                                remainDay = 7;
                            }
                        }
                        else if (remainHour == 0 && remainMinute < 0)
                        int remainSecond = remainDay * 24 * 60 * 60 + remainHour * 60 * 60 + remainMinute * 60;
                        if (remainSecond > 120)
                        {
                            remainDay = 7;
                            string key = StringUtility.Contact(dailyId, weekDay, hourMinutelist[i].hourBegin);
                            pushKey.Add(key);
                            pushDelaySecond.Add(remainSecond);
                        }
                    }
                    int remainSecond = remainDay * 24 * 60 * 60 + remainHour * 60 * 60 + remainMinute * 60;
                    if (remainSecond > 120)
                    {
                        string key = StringUtility.Contact(dailyId,weekday,hourMinutelist[i].hourBegin);
                        pushKey.Add(key);
                        pushDelaySecond.Add(remainSecond);
                    }
                }
            }
            return pushDelaySecond;
        }
@@ -295,7 +305,7 @@
                }
            }
            int pushSet = Convert.ToInt32(pushSB.ToString(),2);
            int pushSet = Convert.ToInt32(pushSB.ToString(), 2);
            SendPushNotifyQuest(pushSet);
        }
@@ -307,12 +317,12 @@
            {
                if (i < hangUpPushlist.Count)
                {
                    if (vipLv > 0
                    if (vipLv > 0
                        && !vipModel.IsVipExperience())
                    {
                        pushSetDict[indexlist[i]] = true;
                    }
                    else if(vipLv < 1
                    else if (vipLv < 1
                        && !vipModel.IsVipExperience())
                    {
                        pushSetDict[indexlist[i]] = false;
@@ -347,7 +357,7 @@
                    {
                        pushSetDict[indexlist[i]] = true;
                    }
                    else if(!vipModel.IsVipExperience()
                    else if (!vipModel.IsVipExperience()
                        && PlayerDatas.Instance.baseData.VIPLv < 1)
                    {
                        pushSetDict[indexlist[i]] = false;
@@ -365,7 +375,7 @@
            }
            int pushSet = Convert.ToInt32(pushSB.ToString(), 2);
            SendPushNotifyQuest(pushSet);
            LocalSave.SetBool(VIPEXPERIENCERECORD,vipModel.IsVipExperience());
            LocalSave.SetBool(VIPEXPERIENCERECORD, vipModel.IsVipExperience());
        }
        public void RefreshPushSet(int switchIndex, bool isOpen)
@@ -401,7 +411,7 @@
                DailyQuestOpenTime dailyQuestOpenTime;
                dailyModel.TryGetOpenTime(quests[i], out dailyQuestOpenTime);
                var config = Config.Instance.Get<DailyQuestConfig>(quests[i]);
                if(isFunclimit)
                if (isFunclimit)
                {
                    if (dailyQuestOpenTime.IsValidServerOpenTime() && FuncOpen.Instance.IsFuncOpen(config.UnLockFuncID))
                    {
@@ -437,11 +447,15 @@
            week = dailyQuestOpenTime.ToOpenTimeString();
            title = config.Title;
            time = "";
            foreach (var weekday in dailyQuestOpenTime.openTimes.Keys)
            for (int i = 0; i < 7; i++)
            {
                List<HourMinute> hourMinutelist = dailyQuestOpenTime.openTimes[weekday];
                time = StringUtility.Contact(hourMinutelist[0].hourBegin > 9 ? hourMinutelist[0].hourBegin.ToString() : "0" + hourMinutelist[0].hourBegin, ":", hourMinutelist[0].minuteBegin > 9 ? hourMinutelist[0].minuteBegin.ToString() : "0" + hourMinutelist[0].minuteBegin);
                break;
                var hourMinutelist = dailyQuestOpenTime.GetHourMinuteByWeek(i);
                if (hourMinutelist != null)
                {
                    time = StringUtility.Contact(hourMinutelist[0].hourBegin > 9 ? hourMinutelist[0].hourBegin.ToString() : "0" + hourMinutelist[0].hourBegin, ":", hourMinutelist[0].minuteBegin > 9 ? hourMinutelist[0].minuteBegin.ToString() : "0" + hourMinutelist[0].minuteBegin);
                    break;
                }
            }
        }
@@ -477,7 +491,7 @@
            }
            pushSB.Length = 0;
            List<int> indexlist = pushSetDict.Keys.ToList();
            for(int i = indexlist.Count - 1; i > -1; i--)
            for (int i = indexlist.Count - 1; i > -1; i--)
            {
                if (pushSetDict[indexlist[i]])
                {
@@ -536,9 +550,9 @@
            DailyQuestOpenTime openTime;
            dailyModel.TryGetOpenTime(dailyId, out openTime);
            var dayOfWeek = (int)TimeUtility.ServerNow.DayOfWeek;
            if (openTime.openTimes.ContainsKey(dayOfWeek))
            var hourMinutes = openTime.GetHourMinuteByWeek(dayOfWeek);
            if (hourMinutes != null)
            {
                var hourMinutes = openTime.openTimes[dayOfWeek];
                for (int i = 0; i < hourMinutes.Count; i++)
                {
                    var minutes = TimeUtility.ServerNow.Hour * 60 + TimeUtility.ServerNow.Minute;
@@ -546,7 +560,7 @@
                    if (minuteOffset <= 2 && minuteOffset > 0)
                    {
                        string key = StringUtility.Contact(dailyId, dayOfWeek, hourMinutes[i].hourBegin);
                        RemoveActivityPushByKey(dailyId,key);
                        RemoveActivityPushByKey(dailyId, key);
                    }
                }
            }
System/Team/MyTeamWin.cs
@@ -200,7 +200,7 @@
        private void CancelAutoPrepare()
        {
            model.myTeam.autoPrepare.Reset();
            model.myTeam.autoPrepare.CancelAutoPrepare();
        }
        private void OnAutoAcceptInvitationValueChange(bool _value)
System/Team/TeamData.cs
@@ -71,7 +71,7 @@
                    m_Mission = value;
                    if (autoPrepare.auto && autoPrepare.cancelWhenTargetChange)
                    {
                        autoPrepare.Reset();
                        autoPrepare.CancelAutoPrepare();
                    }
                }
            }
@@ -197,7 +197,7 @@
            if (!oldInTeam && inTeam)
            {
                autoPrepare.Reset();
                autoPrepare.CancelAutoPrepare();
            }
            var newCaptainer = memberCount > 0 ? members[0].id : 0;
@@ -205,7 +205,7 @@
            {
                if (autoPrepare.auto && autoPrepare.cancelWhenCaptainerChange)
                {
                    autoPrepare.Reset();
                    autoPrepare.CancelAutoPrepare();
                }
            }
        }
@@ -487,18 +487,17 @@
            return false;
        }
        public bool IsAllOk(int _expectCount)
        public bool IsAllOk()
        {
            var okCount = 0;
            foreach (var key in playerStates.Keys)
            {
                if (playerStates[key] == TeammatePrepareState.Prepared)
                if (playerStates[key] != TeammatePrepareState.Prepared)
                {
                    okCount++;
                    return false;
                }
            }
            return okCount >= _expectCount;
            return true;
        }
    }
@@ -521,7 +520,7 @@
        bool m_Auto = false;
        public bool auto {
            get { return m_Auto; }
            set {
            private set {
                if (m_Auto != value)
                {
                    m_Auto = value;
@@ -533,16 +532,37 @@
            }
        }
        public bool cancelWhenTargetChange = true;
        public bool cancelWhenCaptainerChange = false;
        public int mapId { get; private set; }
        public int mapEx { get; private set; }
        bool m_CancelWhenTargetChange = true;
        public bool cancelWhenTargetChange {
            get { return m_CancelWhenTargetChange; }
        }
        bool m_CancelWhenCaptainerChange = false;
        public bool cancelWhenCaptainerChange {
            get { return m_CancelWhenCaptainerChange; }
        }
        public event Action autoPrepareChangeEvent;
        public void Reset()
        public void CancelAutoPrepare()
        {
            auto = false;
            cancelWhenCaptainerChange = false;
            cancelWhenTargetChange = true;
            this.mapId = 0;
            this.mapEx = 0;
            this.m_CancelWhenCaptainerChange = false;
            this.m_CancelWhenTargetChange = true;
            this.auto = false;
        }
        public void SetAutoPreapare(int mapId, int mapEx, bool cancelWhenTargetChange, bool cancelWhenCaptainerChange)
        {
            this.mapId = mapId;
            this.mapEx = mapEx;
            this.m_CancelWhenTargetChange = cancelWhenTargetChange;
            this.m_CancelWhenCaptainerChange = cancelWhenCaptainerChange;
            this.auto = true;
        }
    }
System/Team/TeamMissionGroup.cs
@@ -21,7 +21,8 @@
        [SerializeField] ScrollRect m_ScrollRect;
        [SerializeField] ToggleButtonGroup m_ToggleButtonGroup;
        public ToggleButtonGroup toggleButtonGroup {
        public ToggleButtonGroup toggleButtonGroup
        {
            get { return m_ToggleButtonGroup; }
        }
@@ -119,7 +120,7 @@
            DailyQuestOpenTime openTime;
            if (dailyQuestModel.TryGetOpenTime(dailyQuestId, out openTime))
            {
                return openTime.IsValidServerOpenTime() && openTime.InOpenTime();
                return openTime.InOpenTime();
            }
            else
            {
System/Team/TeamModel.cs
@@ -1017,6 +1017,7 @@
            teamPrepare.UpdatePrepareState(_serverInfo);
            if (teamPrepare.isError)
            {
                prepareBeginTime = DateTime.MinValue;
                WindowCenter.Instance.Close<TeamPrepareWin>();
            }
            else
@@ -1028,6 +1029,7 @@
                if (teamPrepare.IsReject())
                {
                    prepareBeginTime = DateTime.MinValue;
                    WindowCenter.Instance.Close<TeamPrepareWin>();
                }
                else
System/Team/TeamPrepareSettingWin.cs
@@ -73,10 +73,10 @@
        private void Confirm()
        {
            model.myTeam.autoPrepare.auto = true;
            model.myTeam.autoPrepare.cancelWhenCaptainerChange = m_CaptainerSettingBuf;
            model.myTeam.autoPrepare.cancelWhenTargetChange = m_TargetSettingBuf;
            var mapId = model.myTeam.mission.mapId;
            var mapEx = model.myTeam.mission.mapEx;
            model.myTeam.autoPrepare.SetAutoPreapare(mapId,mapEx, m_TargetSettingBuf,m_CaptainerSettingBuf);
            CloseClick();
        }
System/Team/TeamPrepareWin.cs
@@ -27,9 +27,8 @@
        [SerializeField] Button m_CaptainerCancel;
        float prepareTotalTime = 30f;
        float timeOut = 0f;
        float timer = 0f;
        bool alreadyAutoPrepare = false;
        bool rejectManual = false;
@@ -54,6 +53,8 @@
                NewBieCenter.Instance.FinishNewBieGuide(NewBieCenter.Instance.currentGuide);
            }
            timeOut = Time.time + GeneralConfig.Instance.teamReadyTime + 10f;
            rejectManual = false;
            if (!model.myTeam.iamCaptainer)
            {
@@ -77,7 +78,18 @@
            if (model.myTeam.autoPrepare.auto)
            {
                Prepare();
                if (model.myTeam.autoPrepare.cancelWhenTargetChange)
                {
                    if (model.myTeam.autoPrepare.mapId == model.teamPrepare.mapId
                     && model.myTeam.autoPrepare.mapEx == model.teamPrepare.mapEx)
                    {
                        Prepare();
                    }
                }
                else
                {
                    Prepare();
                }
            }
        }
@@ -144,8 +156,9 @@
            {
                rejectManual = true;
                model.RequestPrepareEnterDungeon(false);
                StartCoroutine(Co_DelayCloseWin());
            }
            StartCoroutine(Co_DelayCloseWin());
        }
        private void Prepare()
@@ -188,6 +201,11 @@
                alreadyAutoPrepare = true;
                Reject();
            }
            if (Time.time > timeOut)
            {
                WindowCenter.Instance.Close<TeamPrepareWin>();
            }
        }
        IEnumerator Co_DelayCloseWin()
System/Team/TeamTargetJoinLimitWin.cs
@@ -278,10 +278,10 @@
                }
                else
                {
                    var week = DateTime.Now.DayOfWeek;
                    if (openTime.openTimes.ContainsKey((int)week))
                    var week = (int)TimeUtility.ServerNow.DayOfWeek;
                    var durations = openTime.GetHourMinuteByWeek(week);
                    if (durations != null)
                    {
                        var durations = openTime.openTimes[(int)week];
                        var stringArray = new string[durations.Count];
                        for (int i = 0; i < durations.Count; i++)
                        {
UI/Effect/TimeMgr.cs
@@ -45,7 +45,7 @@
        }
        catch (Exception e)
        {
            DebugEx.Log(e.Message);
            DebugEx.Log(e.StackTrace);
        }
        for (int i = 0; i < syntonyList.Count; i++)
        {
Utility/TimeUtility.cs
@@ -10,8 +10,10 @@
    /// <summary>
    /// 当前服务器时间
    /// </summary>
    public static DateTime ServerNow {
        get {
    public static DateTime ServerNow
    {
        get
        {
            float tick = Time.realtimeSinceStartup - _checkTime;
            DateTime real = _serverTime.AddSeconds(tick);
            return real;
@@ -22,37 +24,43 @@
    /// <summary>
    /// 年份
    /// </summary>
    public static int Year {
    public static int Year
    {
        get { return ServerNow.Year; }
    }
    /// <summary>
    /// 月份
    /// </summary>
    public static int Month {
    public static int Month
    {
        get { return ServerNow.Month; }
    }
    /// <summary>
    /// 天
    /// </summary>
    public static int Day {
    public static int Day
    {
        get { return ServerNow.Day; }
    }
    /// <summary>
    /// 小时
    /// </summary>
    public static int Hour {
    public static int Hour
    {
        get { return ServerNow.Hour; }
    }
    /// <summary>
    /// 分钟
    /// </summary>
    public static int Minute {
    public static int Minute
    {
        get { return ServerNow.Minute; }
    }
    /// <summary>
    /// 秒
    /// </summary>
    public static int Second {
    public static int Second
    {
        get { return ServerNow.Second; }
    }
    /// <summary>
@@ -63,24 +71,31 @@
    /// <summary>
    /// 服务器时间相比起始时间的秒数(主要方便比较)
    /// </summary>
    public static int AllSeconds {
        get {
    public static int AllSeconds
    {
        get
        {
            TimeSpan t = ServerNow - OriginalTime;
            return t.Seconds;
        }
    }
    public static int OpenDay {
    public static int OpenDay
    {
        get; private set;
    }
    public static bool IsMixServer {
    public static bool IsMixServer
    {
        get; private set;
    }
    public static int MixOpenDay {
    public static int MixOpenDay
    {
        get; private set;
    }
    public static DateTime openServerTime;
    public static int OpenWeekCnt
    {
@@ -124,10 +139,11 @@
    {
        DateTime n = new DateTime(vNetData.Year, vNetData.Month, vNetData.Day, vNetData.Hour, vNetData.Minute, vNetData.Second);
        _serverTime = n;
        DebugEx.Log("OnRefreshServerTime月份:"+_serverTime.Month);
        DebugEx.Log("OnRefreshServerTime月份:" + _serverTime.Month);
        _checkTime = Time.realtimeSinceStartup;
        if (OnServerTimeRefresh != null) OnServerTimeRefresh();
        TimeDownMgr.Instance.Begin(TimeDownMgr.CoolTimeType.SyncServerTime, 60, (float tick) => {
        TimeDownMgr.Instance.Begin(TimeDownMgr.CoolTimeType.SyncServerTime, 60, (float tick) =>
        {
            SyncServerTime();
        }, 60);
    }
@@ -137,7 +153,9 @@
        OpenDay = package.Day;
        IsMixServer = package.IsMixServer == 1;
        MixOpenDay = package.MixDay;
        if (OnServerOpenDayRefresh != null) {
        DateTime.TryParse(package.OpenServerTime, out openServerTime);
        if (OnServerOpenDayRefresh != null)
        {
            OnServerOpenDayRefresh();
        }
    }