using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Snxxz.UI { [XLua.Hotfix] public class CrossServerOneVsOnePKSeason : Singleton { public int ZoneCount { get; private set; } // 所有赛区个数 public List ZoneIDList { get; private set; } // 所有赛区列表 public int ZoneID { get; private set; } // 所属赛区ID public int SeasonID { get; private set; } // 当前赛季ID public int SeasonState { get; private set; } // 赛季状态;0-未开启,1-开启中,2-已结束 public int MatchState { get; private set; } // 匹配状态;0-未开启;1-开启中 public string CrossZoneName { get; private set; } // 跨服分区名 public bool isSatisfyMatch { get { return FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.CrossServer) && TimeUtility.OpenDay >= crossServerModel.afterOpenDayOpenCross && InPkSeason(TimeUtility.ServerNow) && InOpenTime(); } } public class PkZoneInfo { public int ZoneID { get; private set; } // 赛区ID public string ZoneName { get; private set; } // 赛区名 public int SeasonCount { get; private set; } public List SeasonList { get; private set; } // 赛季列表 public void SetZoneInfo(HC004_tagGCCrossRealmPKSeasonInfo.tagGCCrossRealmPKZone pKZone) { this.ZoneID = pKZone.ZoneID; this.ZoneName = pKZone.ZoneName; this.SeasonCount = pKZone.SeasonCount; SeasonList = new List(); for (int i = 0; i < pKZone.SeasonCount; i++) { var pkSeason = pKZone.SeasonList[i]; PkSeasonInfo seasonInfo = new PkSeasonInfo(); seasonInfo.SetPkSeasonInfo(pkSeason); SeasonList.Add(seasonInfo); } } } public class PkSeasonInfo { public int SeasonID { get; private set; } // 当前赛季ID public OperationDate StartDate { get; private set; } // 开始日期 yyyy-MM-dd public OperationDate EndDate { get; private set; } // 结束日期 yyyy-MM-dd public string EndTime { get; private set; } // 赛季结算时间,赛季奖励该时间后才可领取 hh:mm public void SetPkSeasonInfo(HC004_tagGCCrossRealmPKSeasonInfo.tagGCCrossRealmPKSeason seasonInfo) { this.SeasonID = seasonInfo.SeasonID; this.StartDate = ParseOperationDate(seasonInfo.StartDate); this.EndDate = ParseOperationDate(seasonInfo.EndDate); this.EndTime = seasonInfo.EndTime; } private OperationDate ParseOperationDate(string date) { string[] dateArray = date.Split('-'); if (dateArray != null && dateArray.Length == 3) { return new OperationDate() { year = int.Parse(dateArray[0].Trim()), month = int.Parse(dateArray[1].Trim()), day = int.Parse(dateArray[2].Trim()) }; } return default(OperationDate); } } public event Action activityStartEvent; public event Action activityEndEvent; public event Action updateSelfSeasonEvent; private bool inDateNotify = false; private bool stepDateNotify = false; DailyQuestModel dailyQuestModel { get { return ModelCenter.Instance.GetModel(); } } CrossServerOneVsOneModel crossServerModel { get { return ModelCenter.Instance.GetModel(); } } public CrossServerOneVsOnePKSeason() { GlobalTimeEvent.Instance.secondEvent += SecondEvent; } public void InitData() { ZoneCount = 0; ZoneIDList = null; ZoneID = 0; SeasonID = 0; SeasonState = 0; MatchState = 0; CrossZoneName = string.Empty; } private void SecondEvent() { if (!inDateNotify && InPkSeason(TimeUtility.ServerNow)) { inDateNotify = true; stepDateNotify = false; if (activityStartEvent != null) { activityStartEvent(); } } else if (!stepDateNotify && !InPkSeason(TimeUtility.ServerNow)) { inDateNotify = false; stepDateNotify = true; if (activityEndEvent != null) { activityEndEvent(); } } } public bool IsEnterCrossServer(bool isTip = false) { bool isFuncOpen = FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.CrossServer); bool isOpenDay = TimeUtility.OpenDay >= crossServerModel.afterOpenDayOpenCross; if (!isFuncOpen) { if (isTip) { SysNotifyMgr.Instance.ShowTip("FuncLimit_Level"); } return false; } if (!isOpenDay) { if (isTip) { SysNotifyMgr.Instance.ShowTip("CrossMatching15", crossServerModel.afterOpenDayOpenCross); } return false; } return true; } public void UpdatePkSeason(HC004_tagGCCrossRealmPKSeasonInfo pkSeason) { inDateNotify = false; stepDateNotify = false; this.ZoneCount = pkSeason.ZoneCount; var zoneIDs = pkSeason.ZoneList; this.ZoneIDList = new List(); for (int i = 0; i < pkSeason.ZoneCount; i++) { var pkZone = pkSeason.ZoneList[i]; PkZoneInfo zoneInfo = new PkZoneInfo(); zoneInfo.SetZoneInfo(pkZone); ZoneIDList.Add(zoneInfo); } } public void UpdateSelfSeason(HC006_tagGCCrossRealmPKSeasonState pKSeasonState) { this.ZoneID = pKSeasonState.ZoneID; this.SeasonID = pKSeasonState.SeasonID; this.SeasonState = pKSeasonState.SeasonState; this.MatchState = pKSeasonState.MatchState; this.CrossZoneName = pKSeasonState.CrossZoneName; if (this.SeasonState != 1 || this.MatchState != 1) { if (crossServerModel.IsMatching) { crossServerModel.IsMatching = false; } } if (updateSelfSeasonEvent != null) { updateSelfSeasonEvent(); } } public bool TryGetZoneInfo(out PkZoneInfo zoneInfo) { zoneInfo = null; if (ZoneIDList == null) return false; for (int i = 0; i < ZoneIDList.Count; i++) { var info = ZoneIDList[i]; if (this.ZoneID == info.ZoneID) { zoneInfo = info; return true; } } return false; } public bool TryGetSeasonInfo(out PkSeasonInfo seasonInfo) { seasonInfo = null; PkZoneInfo zoneInfo = null; bool isZone = TryGetZoneInfo(out zoneInfo); if (!isZone) return false; for (int i = 0; i < zoneInfo.SeasonList.Count; i++) { var info = zoneInfo.SeasonList[i]; if (this.SeasonID == info.SeasonID) { seasonInfo = info; return true; } } return false; } public bool TryGetNextSeasonInfo(out PkSeasonInfo seasonInfo) { seasonInfo = null; PkZoneInfo zoneInfo = null; bool isZone = TryGetZoneInfo(out zoneInfo); if (!isZone) return false; for (int i = 0; i < zoneInfo.SeasonList.Count; i++) { var info = zoneInfo.SeasonList[i]; if (info.SeasonID > this.SeasonID) { seasonInfo = info; return true; } } return false; } public bool InPkSeason(DateTime time) { OperationDate date = new OperationDate() { year = time.Year, month = time.Month, day = time.Day, }; PkSeasonInfo seasonInfo = null; bool isSeason = TryGetSeasonInfo(out seasonInfo); if (isSeason && SeasonState == 1) { return date >= seasonInfo.StartDate && date <= seasonInfo.EndDate; } return false; } public bool InOpenTime() { List hourMinutes = GetActivityTimes(); if (hourMinutes != null && MatchState == 1) { for (int i = 0; i < hourMinutes.Count; i++) { if (hourMinutes[i].InOpenTime()) { return true; } } } return false; } public List GetActivityTimes() { DailyQuestOpenTime _openTime = null; dailyQuestModel.TryGetOpenTime((int)DailyQuestType.CrossServerPk, out _openTime); var dayOfWeek = (int)TimeUtility.ServerNow.DayOfWeek; Dictionary> keyValues = null; if (_openTime != null) { keyValues = _openTime.NormalOpenTimes; if (keyValues.ContainsKey(dayOfWeek)) { return keyValues[dayOfWeek]; } } return null; } public int IndexOfDays(DateTime time) { if (!InPkSeason(time)) { return -1; } PkSeasonInfo seasonInfo = null; bool isSeason = TryGetSeasonInfo(out seasonInfo); if (isSeason) { DateTime s = new DateTime(seasonInfo.StartDate.year, seasonInfo.StartDate.month, seasonInfo.StartDate.day); return (time - s).Days; } return 0; } public string ToDisplaySeasonTime() { PkSeasonInfo seasonInfo = null; bool isSeason = TryGetSeasonInfo(out seasonInfo); if (isSeason) { if (!seasonInfo.StartDate.Equals(default(OperationDate)) && InPkSeason(TimeUtility.ServerNow)) { return Language.Get("CrossServer106", ToDisplayTime(seasonInfo.StartDate, seasonInfo.EndDate)); } } PkSeasonInfo nextSeasonInfo = null; bool isNextSeason = TryGetNextSeasonInfo(out nextSeasonInfo); if (isNextSeason && !nextSeasonInfo.StartDate.Equals(default(OperationDate))) { return Language.Get("CrossServer107", ToDisplayTime(nextSeasonInfo.StartDate, nextSeasonInfo.EndDate)); } return Language.Get("CrossServer107", Language.Get("CrossServer108")); } private string ToDisplayTime(OperationDate start, OperationDate end) { if (start != end) { return StringUtility.Contact(start.ToDisplay(), "-", end.ToDisplay()); } return start.ToDisplay(); } } }