using System; using System.Collections; using System.Collections.Generic; using System.Text.RegularExpressions; using LitJson; using TableConfig; using UnityEngine; using UnityEngine.UI; namespace Snxxz.UI { public class FairyLeagueModel : Model, IAfterPlayerDataInitialize, IBeforePlayerDataInitialize, IPlayerLoginOk { public event Action OnRefreshFairyLeagueEvent; private FairyLeagueStage m_FairyLeagueStage = FairyLeagueStage.Prepare; public FairyLeagueStage fairyLeagueStage { get { if (StepRing()) { return FairyLeagueStage.Over; } return m_FairyLeagueStage; } } public int fairyLeagueRing { get { if (IsNextWeek) { 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; } } 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 { return true; } } } public override void Init() { 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; fairyLeagueHelp = new FairyLeagueHelp(); } public override void UnInit() { DTCA003_tagUniversalGameRecInfo.onGetUniversalGameInfo -= OnGetUniversalGameInfo; } public void OnBeforePlayerDataInitialize() { ClearFairyWarHelp(); fairyLeagueFairyId = 0; fairyLeagueFairyName = string.Empty; } 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(); CheckFairyLeagueData(); UpdateRedpoint(); } private void OnServerOpenDayRefresh() { CheckFairyLeagueStage(); } private void PlayerDataRefreshInfoEvent(PlayerDataRefresh _type) { if (_type == PlayerDataRefresh.MapID) { UpdateRedpoint(); } } private void OnStageLoadFinish() { if (StageManager.Instance.CurrentStage is DungeonStage && PlayerDatas.Instance.baseData.MapID == FAIRY_LEAGUE_DUNGEON) { UpdateRedpoint(); } } 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 fairyLeagueWeekTimes = new List(); private string[] guideImgKeys; public string[] GuideImgKeys { get { return guideImgKeys; } } private readonly FairyLeagueStage[] fairyStages = new FairyLeagueStage[] { FairyLeagueStage.Grouping, FairyLeagueStage.Fight, FairyLeagueStage.Over }; public int fairyWarResUpperLimit { get; private set; } public readonly int buffTypeId = 22203; public Dictionary> integralRankAwardDict = new Dictionary>(); public int[] integralRankAwardPer { get; private set; } public int integralAddition { get; private set; } public Dictionary crystalSortDict { get; private set; } /// /// key----世界等级 /// public Dictionary> finalWarAwardDict = new Dictionary>(); public Dictionary> finalWarChampionAwardDict = new Dictionary>(); private Dictionary crystalRateDict = new Dictionary(); private void ParseConfig() { FuncConfigConfig cfg = Config.Instance.Get("FamilyMatchGuide"); if (cfg != null) { guideImgKeys = ConfigParse.GetMultipleStr(cfg.Numerical1); } ringCnt = groupRingStates.Length; groupTimes = new WeekTime[groupRingStates.Length]; DungeonStateTimeConfig stateCfg = null; for (int i = 0; i < groupRingStates.Length; i++) { stateCfg = DungeonStateTimeConfig.DungeonStateTime(FAIRY_LEAGUE_DUNGEON, groupRingStates[i]); if (stateCfg != null) { OpenServerWeek = stateCfg.OpenServerWeek; groupTimes[i] = new WeekTime(stateCfg.StartWeekday, stateCfg.StartHour, stateCfg.StartMinute, stateCfg.EndHour, stateCfg.EndMinute); fairyLeagueWeekTimes.Add(groupTimes[i]); } } fightTimes = new WeekTime[fightRingStates.Length]; resultTimes = new WeekTime[fightRingStates.Length]; for (int i = 0; i < fightRingStates.Length; i++) { stateCfg = DungeonStateTimeConfig.DungeonStateTime(FAIRY_LEAGUE_DUNGEON, fightRingStates[i]); if (stateCfg != null) { 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]); } } 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); cfg = Config.Instance.Get("FamilyMatchResourcePoint"); if (cfg != null) { crystalSortDict = new Dictionary(); var _sortArray = JsonMapper.ToObject(cfg.Numerical3); for (int i = 0; i < _sortArray.Length; i++) { crystalSortDict.Add(i + 1, _sortArray[i]); } fairyLeagueCrystals = JsonMapper.ToObject(cfg.Numerical2); fairyWarResUpperLimit = int.Parse(cfg.Numerical5); } cfg = Config.Instance.Get("FamilyMatchRandomBuff"); if (cfg != null) { if (RandomBuffPos_Regex.IsMatch(cfg.Numerical1)) { foreach (Match match in RandomBuffPos_Regex.Matches(cfg.Numerical1)) { crystalPosList.Add(new Vector2(float.Parse(match.Groups[1].Value) / 2, float.Parse(match.Groups[2].Value) / 2)); } } } Regex _regex = new Regex(@"([0-9]+):\[(.*?\])\]"); cfg = Config.Instance.Get("FamilyMatchRankReward"); if (_regex.IsMatch(cfg.Numerical1)) { foreach (Match match in _regex.Matches(cfg.Numerical1)) { var _rank = int.Parse(match.Groups[1].Value); var _value = StringUtility.Contact('[', match.Groups[2].Value, ']'); List _list = ParseAward(LitJson.JsonMapper.ToObject(_value)); integralRankAwardDict.Add(_rank, _list); } integralRankAwardPer = JsonMapper.ToObject(cfg.Numerical2); } cfg = Config.Instance.Get("FamilyMatchRankOneReward"); if (_regex.IsMatch(cfg.Numerical1)) { foreach (Match match in _regex.Matches(cfg.Numerical1)) { var _worldLv = int.Parse(match.Groups[1].Value); List _list = ParseAward(StringUtility.Contact('[', match.Groups[2].Value, ']')); finalWarAwardDict.Add(_worldLv, _list); } } cfg = Config.Instance.Get("FamilyMatchSRankOneReward"); if (_regex.IsMatch(cfg.Numerical1)) { foreach (Match match in _regex.Matches(cfg.Numerical1)) { var _worldLv = int.Parse(match.Groups[1].Value); List _list = ParseAward(StringUtility.Contact('[', match.Groups[2].Value, ']')); finalWarChampionAwardDict.Add(_worldLv, _list); } } cfg = Config.Instance.Get("FamilyMatchPersonalScore"); integralAddition = int.Parse(cfg.Numerical5); cfg = Config.Instance.Get("FamilyMatchResourcePoint1"); crystalRateDict = ConfigParse.GetDic(cfg.Numerical1); } private List ParseAward(string _config) { List _list = new List(); var _array = JsonMapper.ToObject(_config); if (_array != null) { for (int i = 0; i < _array.Length; i++) { AwardItem _item = new AwardItem(); _item.item.id = _array[i][0]; _item.item.count = _array[i][1]; _item.isBind = _array[i][2]; _list.Add(_item); } } return _list; } private List ParseAward(int[][] itemsArray) { List _list = new List(); if (itemsArray != null) { for (int i = 0; i < itemsArray.Length; i++) { IntegralRankItem _item = new IntegralRankItem(); _item.id = itemsArray[i][0]; _item.count = itemsArray[i][1]; _item.bind = itemsArray[i][2]; _item.isPer = itemsArray[i].Length > 3 ? itemsArray[i][3] : 1; _list.Add(_item); } } return _list; } public SkillConfig GetRandomAttrBuff(int _lv) { SkillConfig _buffTypeCfg = Config.Instance.Get(buffTypeId); _lv = Mathf.Min(_lv, _buffTypeCfg.SkillMaxLV); return Config.Instance.Get(buffTypeId + _lv - 1); } public bool TryGetCrystalRate(int _npcId, out float _rate) { 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 { get; private set; } public int fairyLeagueWinFaction { get; private set; } public int fairyLeagueTotalTime { get; private set; } public int fairyLeagueGroupId { get; private set; } public uint fairyLeagueFairyId { get; private set; }//仙盟联赛第一轮分配时玩家所在仙盟,默认0代表本仙盟 public string fairyLeagueFairyName { get; private set; } public event Action UpdateWarRankEvent; public bool IsAlreadyBattleGuide() { return QuickSetting.Instance.GetQuickSettingBool(QuickSetting.QuickSettingType.FairyLeagueGuide, 0); } public void SetBattleGuide() { QuickSetting.Instance.SetQuickSetting(QuickSetting.QuickSettingType.FairyLeagueGuide, true); QuickSetting.Instance.SendPackage(); } public List fairyLeagueResults = new List(); public void UpdateFairyResult(HB210_tagMCFamilyWarBillboard _package) { fairyLeagueResults.Clear(); fairyLeagueGroupId = _package.GroupID; for (int i = 0; i < _package.BillboardCount; i++) { var _sResult = _package.FBBillboardPlayer[i]; var _cResult = new FairyLeagueResultData( (int)_sResult.PlayerID, _sResult.PlayerName, (int)_sResult.CrystalCount, (int)_sResult.KillPlayerCount, (int)_sResult.RandBuffCount, (int)_sResult.FightTime, (int)_sResult.Point, _sResult.Faction == _package.WinFaction, _sResult.Faction ); fairyLeagueResults.Add(_cResult); } if (UpdateWarRankEvent != null) { UpdateWarRankEvent(); } if (_package.WinFaction != 0 && _package.TotalFightTime > 0) { fairyLeagueTotalTime = _package.TotalFightTime; fairyLeagueWinFaction = _package.WinFaction; WindowCenter.Instance.CloseAll(WindowCenter.CloseAllIgnoreType.BaseAndCustom); WindowCenter.Instance.Open(); WindowCenter.Instance.Open(); } } public void UpdateFairyLeagueFairy(HA40B_tagGCPlayerJoinFamilyWarInfo package) { fairyLeagueFairyId = package.JoinFamilyID; fairyLeagueFairyName = UIHelper.ServerStringTrim(package.JoinFamilyName); UpdateRedpoint(); } public int GetCrystalIndex(int _npcId) { var _array = crystalSortDict[1]; if (crystalSortDict.ContainsKey((int)PlayerDatas.Instance.baseData.faction)) { _array = crystalSortDict[(int)PlayerDatas.Instance.baseData.faction]; } for (int i = 0; i < _array.Length; i++) { if (fairyLeagueCrystals[_array[i] - 1] == _npcId) { return i; } } return -1; } public bool BattleChampion() { var _ring = fairyLeagueRing; if (_ring == 0 && fairyLeagueBattleDict.ContainsKey(_ring) && fairyLeagueBattleDict[_ring].ContainsKey(5)) { var _list = fairyLeagueBattleDict[_ring][5]; return _list.Count == 1; } return false; } public List crystalPosList = new List(); private readonly Regex RandomBuffPos_Regex = new Regex(@"\[([0-9]+),([0-9]+)\]"); #endregion #region 协议 public event Action onFairyLeagueBattleEvent; private Dictionary>> fairyLeagueBattleDict = new Dictionary>>(); private void OnGetUniversalGameInfo(HA003_tagUniversalGameRecInfo package) { if (package.Type == FAIRY_LEAGUE_BATTLE) { fairyLeagueBattleDict.Clear(); if (package.Count > 0) { for (int i = 0; i < package.Count; i++) { var _pakData = package.UniversalGameRec[i]; Dictionary> dic = null; fairyLeagueBattleDict.TryGetValue((int)_pakData.Value2 - 1, out dic); if (dic == null) { dic = new Dictionary>(); fairyLeagueBattleDict.Add((int)_pakData.Value2 - 1, dic); } List list = null; if (dic.TryGetValue((int)_pakData.Value1, out list) == false) { list = new List(); dic.Add((int)_pakData.Value1, list); } FairyLeagueBattleData battleData = new FairyLeagueBattleData() { grade = (int)_pakData.Value1, ring = (int)_pakData.Value2 - 1, fairyId1 = (int)_pakData.Value3, fairyId2 = (int)_pakData.Value4, winFairyId = (int)_pakData.Value5, fairyName1 = _pakData.StrValue1, fairyName2 = _pakData.StrValue2, dissolveFairys = JsonMapper.ToObject(_pakData.StrValue3), }; list.Add(battleData); } } if (onFairyLeagueBattleEvent != null) { 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 _fairyId = PlayerDatas.Instance.fairyData.fairy.FamilyID; if (!fairyLeagueBattleDict.ContainsKey(_ring)) { return false; } var _dict = fairyLeagueBattleDict[_ring]; foreach (var _grade in _dict.Keys) { if (_dict[_grade] == null) { continue; } foreach (var _fairyBattle in _dict[_grade]) { if (_fairyBattle.fairyId1 == _fairyId || _fairyBattle.fairyId2 == _fairyId) { var _battleFairyId = _fairyBattle.fairyId1 == _fairyId ? _fairyBattle.fairyId2 : _fairyBattle.fairyId1; if (_battleFairyId == 0 || _fairyBattle.IsFairyDissolve(_battleFairyId)) { _error = 4; return false; } if (_fairyBattle.winFairyId != 0) { _error = 5; } return _fairyBattle.winFairyId == 0; } } } return false; } public bool SatisfyEnterLeague(out int _error) { _error = 0; if (!PlayerDatas.Instance.fairyData.HasFairy) { _error = 1; return false; } if (fairyLeagueStage != FairyLeagueStage.Fight) { return false; } if (!SelfFairyInBattle(out _error)) { return false; } if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.FairyLeague)) { _error = 2; return false; } if (fairyLeagueFairyId != 0 && fairyLeagueFairyId != PlayerDatas.Instance.baseData.Family) { _error = 6; return false; } return true; } public void DisplayErrorTip(int _error) { switch (_error) { case 1: SysNotifyMgr.Instance.ShowTip("LeagueCannotGo5"); break; case 2: FuncOpen.Instance.ProcessorFuncErrorTip((int)FuncOpenEnum.FairyLeague); break; case 3: SysNotifyMgr.Instance.ShowTip("LeagueCannotGo3"); break; case 4: SysNotifyMgr.Instance.ShowTip("LeagueCannotGo4"); break; case 5: var _ring = fairyLeagueRing; _ring = fairyLeagueStage == FairyLeagueStage.Fight || fairyLeagueStage == FairyLeagueStage.Over ? 1 - _ring : _ring; if (_ring == 1) { var _param = StringUtility.Contact(Language.Get(StringUtility.Contact("Weekday", groupTimes[_ring].dayOfWeek)), fightTimes[1].startHour.ToString("D2"), ":", fightTimes[1].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")); SysNotifyMgr.Instance.ShowTip("LeagueCannotGo2", _param); } break; case 6: SysNotifyMgr.Instance.ShowTip("PlayerWarFamilyIDIsChange"); break; } } private Dictionary dataRequestDict = new Dictionary(); 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 GetFairyLeague(int _ring, int _grade) { Dictionary> dic = null; List list = null; fairyLeagueBattleDict.TryGetValue(_ring, out dic); if (dic != null) { dic.TryGetValue(_grade, out list); } return list; } public event Action UpdateFairyWarHelpEvent; public event Action UpdateWarBuffEvent; public event Action UpdateWarCrystalEvent; public event Action CrystalBelongChangeEvent; public FairyLeagueHelp fairyLeagueHelp { get; private set; } private const string FairyWarBuffHelpKey = "familyWar_Buff"; private const string FairyWarCrystalAtkHelpKey = "familyWar_CrystalAtk"; private const string FairyWarCrystalKey = "familyWar_Crystal"; private const string FairyWarHelpInfoKey = "familyWar_HelpInfo"; private const string FairyWarEnterHelpKey = "familyWar_Enter"; public void UpdateFairyWarHelp(string _mission) { var _jsonData = JsonMapper.ToObject(_mission); foreach (var _key in _jsonData.Keys) { switch (_key) { case FairyWarBuffHelpKey: fairyLeagueHelp.fairyWarBuffs = JsonMapper.ToObject(_jsonData[_key].ToJson()); if (UpdateWarBuffEvent != null) { UpdateWarBuffEvent(); } break; case FairyWarCrystalAtkHelpKey: fairyLeagueHelp.FairyWarCrystalAtks = JsonMapper.ToObject(_jsonData[_key].ToJson()); if (UpdateWarCrystalEvent != null) { UpdateWarCrystalEvent(); } break; case FairyWarCrystalKey: fairyLeagueHelp.fairyWarCrystalDict.Clear(); var json = _jsonData[_key]; foreach (var _camp in json.Keys) { fairyLeagueHelp.fairyWarCrystalDict.Add(int.Parse(_camp), JsonMapper.ToObject(json[_camp].ToJson())); } if (UpdateWarCrystalEvent != null) { UpdateWarCrystalEvent(); } if (CrystalBelongChangeEvent != null) { CrystalBelongChangeEvent(); } break; case FairyWarHelpInfoKey: fairyLeagueHelp.fairyWarHelpInfos = JsonMapper.ToObject(_jsonData[_key].ToJson()); break; case FairyWarEnterHelpKey: fairyLeagueHelp.fairyWarEnter = JsonMapper.ToObject(_jsonData[_key].ToJson()); break; } } if (UpdateFairyWarHelpEvent != null) { UpdateFairyWarHelpEvent(); } } private void ClearFairyWarHelp() { fairyLeagueGroupId = 0; fairyLeagueTotalTime = 0; fairyLeagueWinFaction = 0; fairyLeagueHelp.fairyWarBuffs = null; fairyLeagueHelp.FairyWarCrystalAtks = null; fairyLeagueHelp.fairyWarCrystalDict.Clear(); fairyLeagueHelp.fairyWarHelpInfos = null; fairyLeagueHelp.fairyWarEnter = default(FairyLeagueHelp.FairyWarEnter); } public FairyLeagueBattleData GetSelfBattleInfo() { var _ring = fairyLeagueRing; var _fairyId = PlayerDatas.Instance.fairyData.fairy.FamilyID; if (!fairyLeagueBattleDict.ContainsKey(_ring)) { return null; } var _dict = fairyLeagueBattleDict[_ring]; foreach (var _grade in _dict.Keys) { if (_dict[_grade] == null) { continue; } foreach (var _fairyBattle in _dict[_grade]) { if (_fairyBattle.fairyId1 == _fairyId || _fairyBattle.fairyId2 == _fairyId) { return _fairyBattle; } } } return null; } public bool StepRing(int _grade = 5) { if (fairyLeagueRing == 1) { if (!fairyLeagueBattleDict.ContainsKey(1)) { return true; } if (fairyLeagueBattleDict.ContainsKey(0) && fairyLeagueBattleDict[0].ContainsKey(_grade) && fairyLeagueBattleDict[0][_grade].Count == 1) { return true; } else if (!fairyLeagueBattleDict[0].ContainsKey(_grade)) { return true; } } return false; } public string GetBattleFairyName(int _playerId) { var _fairy = PlayerDatas.Instance.fairyData.fairy; if (PlayerDatas.Instance.PlayerId == _playerId) { return _fairy == null ? string.Empty : _fairy.FamilyName; } else if (PlayerDatas.Instance.fairyData.GetMember(_playerId) != null) { return _fairy == null ? string.Empty : _fairy.FamilyName; } else { FairyLeagueBattleData _battle = GetSelfBattleInfo(); return _battle.fairyId1 == _fairy.FamilyID ? _battle.fairyName2 : _battle.fairyName1; } } public FairyCampType GetBattleCampType(int _playerId) { if (_playerId == PlayerDatas.Instance.PlayerId || PlayerDatas.Instance.fairyData.GetMember(_playerId) != null) { return (FairyCampType)PlayerDatas.Instance.baseData.faction; } return PlayerDatas.Instance.baseData.faction == 1 ? (FairyCampType)2 : (FairyCampType)1; } public string GetFairyFlagKey(int _playerId) { var _camp = GetBattleCampType(_playerId); return _camp == FairyCampType.Blue ? "FlagBlue" : "FlagRed"; } public int GetBattleFirstPlayer() { if (fairyLeagueResults.Count == 0) { return -1; } for (int i = 0; i < fairyLeagueResults.Count; i++) { if (fairyLeagueResults[i].IsWin) { return i; } } return 0; } #endregion #region 红点 private Redpoint m_LeagueRedpoint = new Redpoint(107, 10704); public Redpoint m_JoinFairyLeagueRedpoint { get; private set; } public void UpdateRedpoint() { m_JoinFairyLeagueRedpoint.state = RedPointState.None; int _error = 0; if (!SatisfyEnterLeague(out _error)) { return; } if (PlayerDatas.Instance.baseData.MapID == FAIRY_LEAGUE_DUNGEON) { return; } m_JoinFairyLeagueRedpoint.state = RedPointState.Simple; } #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 FairyLeagueStage { Prepare, Grouping, Fight, Over, } public enum FairyCampType { None, Red = 1, Blue = 2 } public class FairyLeagueBattleData { public int grade; public int ring; public int fairyId1; public int fairyId2; public int winFairyId; public int[] dissolveFairys; public string fairyName1; public string fairyName2; public bool IsFairyDissolve(int _fairyId) { if (dissolveFairys == null || dissolveFairys.Length == 0) { return false; } for (int i = 0; i < dissolveFairys.Length; i++) { if (dissolveFairys[i] == _fairyId) { return true; } } return false; } public bool IsFairyWin(int _fairyId) { return _fairyId == winFairyId; } public string GetWinFairyName() { return fairyId1 == winFairyId ? fairyName1 : fairyId2 == winFairyId ? fairyName2 : string.Empty; } public int GetWinFairyId() { return fairyId1 == winFairyId ? fairyId1 : fairyId2 == winFairyId ? fairyId2 : 0; } public string GetLoserFairyName() { return fairyId1 == winFairyId ? fairyName2 : fairyName1; } public int GetLoserFairyId() { return fairyId1 == winFairyId ? fairyId2 : fairyId1; } } public struct FairyLeagueResultData { public int PlayerId { get; private set; } public string PlayerName { get; private set; } public int TakeCrystals { get; private set; } public int KillNums { get; private set; } public int TakeBuffs { get; private set; } public int FightTime { get; private set; } public int Integral { get; private set; } public bool IsWin { get; private set; } public int Faction { get; private set; } public FairyLeagueResultData(int _playerId, string _playerName, int _crystal, int _killNum, int _buffs, int _fightTime, int _integral, bool _isWin, int _faction) { PlayerId = _playerId; PlayerName = _playerName; TakeCrystals = _crystal; KillNums = _killNum; TakeBuffs = _buffs; FightTime = _fightTime; Integral = _integral; IsWin = _isWin; Faction = _faction; } } public class FairyLeagueHelp { public FairyWarBuff[] fairyWarBuffs; public int[] FairyWarCrystalAtks; public Dictionary fairyWarCrystalDict = new Dictionary(); public FairyWarHelpInfo[] fairyWarHelpInfos; public FairyWarEnter fairyWarEnter; public int GetCrystalBelongCamp(int _npcId) { foreach (var _camp in fairyWarCrystalDict.Keys) { if (fairyWarCrystalDict[_camp] == null) { continue; } for (int i = 0; i < fairyWarCrystalDict[_camp].Length; i++) { if (_npcId == fairyWarCrystalDict[_camp][i]) { return _camp; } } } return 0; } public struct FairyWarBuff { public int PosIndex; public int NPCID; public int Atk; } public struct FairyWarHelpInfo { public double ResPoint; public int MemCount; public int BuffResPoint; public int BuffResPointPer; public int BuffAttrLV; } public struct FairyWarEnter { public int[] WinCount; public int IsFinalMatch; } } public struct IntegralRankItem { public int id; public int count; public int bind; public int isPer; } [Serializable] public class AwardItemUI { [SerializeField] Image m_ItemIcon; [SerializeField] Image m_BindIcon; [SerializeField] Image m_ItemBg; [SerializeField] Text m_ItemCnt; public Text itemCnt { get { return m_ItemCnt; } } public void Init(int _itemId, int _itemCnt, int _isBind = 0) { ItemConfig _itemCfg = Config.Instance.Get(_itemId); m_ItemIcon.gameObject.SetActive(_itemCfg != null); if (_itemCfg != null) { m_ItemIcon.SetSprite(_itemCfg.IconKey); if (m_ItemBg != null) { m_ItemBg.SetItemBackGround(_itemCfg.ItemColor); } } m_ItemCnt.text = _itemCnt <= 1 ? string.Empty : _itemCnt.ToString(); if (m_BindIcon != null) { m_BindIcon.gameObject.SetActive(_isBind == 1); } } } }