using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
|
|
namespace vnxbqy.UI
|
{
|
|
public class CrossServerOneVsOnePKSeason : Singleton<CrossServerOneVsOnePKSeason>
|
{
|
public int ZoneCount { get; private set; } // 所有赛区个数
|
|
public List<PkZoneInfo> 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<PkSeasonInfo> 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<PkSeasonInfo>();
|
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<DailyQuestModel>(); } }
|
CrossServerOneVsOneModel crossServerModel { get { return ModelCenter.Instance.GetModel<CrossServerOneVsOneModel>(); } }
|
|
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<PkZoneInfo>();
|
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<HourMinute> 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<HourMinute> GetActivityTimes()
|
{
|
DailyQuestOpenTime _openTime = null;
|
dailyQuestModel.TryGetOpenTime((int)DailyQuestType.CrossServerPk, out _openTime);
|
var dayOfWeek = (int)TimeUtility.ServerNow.DayOfWeek;
|
Dictionary<int, List<HourMinute>> 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();
|
}
|
}
|
}
|