using vnxbqy.UI; using System; using System.Collections.Generic; using LitJson; using UnityEngine; using System.Collections; using System.Linq; public class HeavenBattleModel : Model,IBeforePlayerDataInitialize,IAfterPlayerDataInitialize,IPlayerLoginOk { public const int HEAVEBATTLE_MAPID = 31010; public const int HEAVEBATTLE_TargetID = 38; public const int HeavenBattleDailyId = 14; DailyQuestConfig dailyConfig; public Dictionary> heavenAwardDict { get; private set; } public Dictionary campVicRewardDict { get; private set; } public Dictionary campFailRewardDict { get; private set; } public event Action RefreshGameRecInfoAct; DungeonModel m_DungeonModel; DungeonModel dungeonModel { get { return m_DungeonModel ?? (m_DungeonModel = ModelCenter.Instance.GetModel()); } } DailyQuestModel dailyQuestModel { get { return ModelCenter.Instance.GetModel(); } } public float battlePrepareTime { get; private set; } public string[] heavenBattleTargets; public bool IsBattlePrepare { get;set;} private List achieveConfiglist; AchievementModel _achieveModel; public AchievementModel AchieveModel { get { return _achieveModel ?? (_achieveModel = ModelCenter.Instance.GetModel()); } } public override void Init() { FuncConfigConfig heavenAwardConfig = FuncConfigConfig.Get("XMZZAward"); JsonData xmzzVicRewardData = JsonMapper.ToObject(heavenAwardConfig.Numerical1); heavenAwardDict = new Dictionary>(); foreach(var key in xmzzVicRewardData.Keys) { List infolist = new List(); heavenAwardDict.Add(int.Parse(key),infolist); if (xmzzVicRewardData[key].IsArray) { for(int i = 0; i < xmzzVicRewardData[key].Count; i++) { JsonData rewardInfo = xmzzVicRewardData[key][i]; if(rewardInfo.IsArray) { for(int j = 0; j < rewardInfo.Count;j++) { XMZZVictoryRewardInfo info = new XMZZVictoryRewardInfo(int.Parse(rewardInfo[0].ToString()), int.Parse(rewardInfo[1].ToString()),int.Parse(rewardInfo[2].ToString())); infolist.Add(info); } } } } } JsonData campAwardData = JsonMapper.ToObject(heavenAwardConfig.Numerical3); campVicRewardDict = new Dictionary(); if(campAwardData.IsArray) { for (int i = 0;i < campAwardData.Count;i++) { if (campAwardData[i].IsArray) { JsonData campData = campAwardData[i]; int itemId = int.Parse(campAwardData[i][0].ToString()); int itemCnt = int.Parse(campAwardData[i][1].ToString()); int isBind = int.Parse(campAwardData[i][2].ToString()); ItemCellModel cellModel = new ItemCellModel(itemId, true, (ulong)itemCnt); campVicRewardDict.Add(itemId,cellModel); } } } JsonData campfailAwardData = JsonMapper.ToObject(heavenAwardConfig.Numerical4); campFailRewardDict = new Dictionary(); if (campfailAwardData.IsArray) { for (int i = 0; i < campfailAwardData.Count; i++) { if (campfailAwardData[i].IsArray) { JsonData campData = campfailAwardData[i]; int itemId = int.Parse(campfailAwardData[i][0].ToString()); int itemCnt = int.Parse(campfailAwardData[i][1].ToString()); int isBind = int.Parse(campfailAwardData[i][2].ToString()); ItemCellModel cellModel = new ItemCellModel(itemId, true, (ulong)itemCnt); campFailRewardDict.Add(itemId, cellModel); } } } dailyConfig = DailyQuestConfig.Get("14"); DungeonHintConfig hintConfig = DungeonHintConfig.Get(HEAVEBATTLE_TargetID); heavenBattleTargets = hintConfig.targetDescription1; achieveConfiglist = XMZZAchievementConfig.GetValues(); SetAchieveRedPoint(); WindowCenter.Instance.windowAfterCloseEvent += ClosePrepareCool; } private void SetBetTime(string betTime,List timelist) { string[] betTimeArray = betTime.Split(':'); for(int i = 0; i < betTimeArray.Length; i++) { timelist.Add(int.Parse(betTimeArray[i])); } } public void OnBeforePlayerDataInitialize() { PlayerPrefs.DeleteKey(DTCA127_tagMCStartChangeMap.RECORDPREMAPID_KEY); IsBattlePrepare = false; HeavenBattleInfo.Instance.ResetModel(); GameRecInfoDict.Clear(); AchieveModel.achievementAwardableEvent -= RefreshAchieveState; AchieveModel.achievementCompletedEvent -= RefreshAchieveState; StageLoad.Instance.onStageLoadFinish -= OnLoadMapFinish; } public void OnAfterPlayerDataInitialize() { } public void OnPlayerLoginOk() { AchieveModel.achievementProgressUpdateEvent += RefreshAchieveState; AchieveModel.achievementCompletedEvent += RefreshAchieveState; StageLoad.Instance.onStageLoadFinish += OnLoadMapFinish; AchieveRedPointCtrl(); } public override void UnInit() { WindowCenter.Instance.windowAfterCloseEvent -= ClosePrepareCool; } private void OnLoadMapFinish() { bool isHasKey = PlayerPrefs.HasKey(DTCA127_tagMCStartChangeMap.RECORDPREMAPID_KEY); if (!isHasKey) return; if(LocalSave.GetInt(DTCA127_tagMCStartChangeMap.RECORDPREMAPID_KEY) == HEAVEBATTLE_MAPID) { if(dailyQuestModel.GetQuestState(dailyConfig.ID) != DailyQuestModel.DailyQuestState.OutTime) { if (!WindowCenter.Instance.IsOpen() && GetActivityRemainTime() > 0) { var config = DailyQuestConfig.Get(dailyConfig.ID); dungeonModel.currentDungeon = new Dungeon(config.RelatedID, 0); WindowCenter.Instance.Open(); } } PlayerPrefs.DeleteKey(DTCA127_tagMCStartChangeMap.RECORDPREMAPID_KEY); } } #region 处理服务端数据 public event Action RefreshBattleInfoAct; public event Action RefreshPlayerBattleInfoAct; public void SetHeavenBattleModel(HAC02_tagGCXMZZInfo info) { HeavenBattleInfo.Instance.SetHeavenBattleInfo(info); if(RefreshBattleInfoAct != null) { RefreshBattleInfoAct(); } } public void SetHeavenBattlePlayerModel(HAC03_tagGCXMZZSelfInfo info) { HeavenBattleInfo.Instance.SetHeavenBattlePlayerInfo(info); if (RefreshPlayerBattleInfoAct != null) { RefreshPlayerBattleInfoAct(); } } public void SetBattleStart() { battlePrepareTime = 3; IsBattlePrepare = true; } public event Action RefreshBattlePrepareTimeAct; private void ClosePrepareCool(Window win) { if (win.name != "BattlePrepareCoolDownWin") return; IsBattlePrepare = false; } /// /// 发送报名请求 /// public void SendSignQuest() { CAC01_tagCGJoinXMZZ join = new CAC01_tagCGJoinXMZZ(); GameNetSystem.Instance.SendInfo(join); } /// /// 发送押注请求 /// public void SendBettingQuest(int betIndex,int camp) { CAB03_tagCMXMZZBet bet = new CAB03_tagCMXMZZBet(); bet.BetIndex = (byte)betIndex; bet.BetResult = (byte)camp; GameNetSystem.Instance.SendInfo(bet); } public void SendGetAwardQuest(int victoryCnt) { CA504_tagCMPlayerGetReward getReward = new CA504_tagCMPlayerGetReward(); getReward.RewardType = (byte)GotServerRewardType.Def_RewardType_XMZZWinCnt; getReward.DataEx = (uint)victoryCnt; getReward.DataExStrLen = 0; getReward.DataExStr = string.Empty; GameNetSystem.Instance.SendInfo(getReward); } /// /// 获取仙魔之争阵营积分 /// public void SendCampSoreQuest() { CAC03_tagCGXMZZInfoQuery infoQuery = new CAC03_tagCGXMZZInfoQuery(); GameNetSystem.Instance.SendInfo(infoQuery); } public void SendBattleInfoQuest() { CA001_tagViewUniversalGameRec gameRec = new CA001_tagViewUniversalGameRec(); gameRec.ViewType = 0; GameNetSystem.Instance.SendInfo(gameRec); } public void RefreshBattleInfo(HA003_tagUniversalGameRecInfo info) { SetBatterInfoList(info); if(RefreshGameRecInfoAct != null) { RefreshGameRecInfoAct(info.Type); } } private Dictionary> GameRecInfoDict = new Dictionary>(); private void SetBatterInfoList(HA003_tagUniversalGameRecInfo info) { GameRecInfoDict.Clear(); if (!GameRecInfoDict.ContainsKey(info.Type)) { List list = new List(); GameRecInfoDict.Add(info.Type, list); } for (int i = 0; i < info.Count; i++) { GameRecInfo recInfo = new GameRecInfo((int)info.UniversalGameRec[i].Time, info.UniversalGameRec[i].StrValue1, info.UniversalGameRec[i].StrValue2, info.UniversalGameRec[i].StrValue3, (int)info.UniversalGameRec[i].Value1, (int)info.UniversalGameRec[i].Value2, (int)info.UniversalGameRec[i].Value3, (int)info.UniversalGameRec[i].Value4, (int)info.UniversalGameRec[i].Value5); GameRecInfoDict[info.Type].Add(recInfo); } } public List GetBatterInfoListByType(int type) { List recInfo = null; GameRecInfoDict.TryGetValue(type,out recInfo); return recInfo; } #endregion public int GetActivityRemainTime() { DailyQuestOpenTime openTime = null; bool isActivity = dailyQuestModel.TryGetOpenTime(HeavenBattleDailyId,out openTime); if(isActivity) { List hourMinutes = openTime.GetHourMinuteByWeek((int)TimeUtility.ServerNow.DayOfWeek); if(hourMinutes != null && hourMinutes.Count > 0) { HourMinute hourMinute = hourMinutes[0]; DateTime endTime = new DateTime(TimeUtility.ServerNow.Year,TimeUtility.ServerNow.Month, TimeUtility.ServerNow.Day, hourMinute.hourEnd,hourMinute.minuteEnd,0); DateTime startTime = new DateTime(TimeUtility.ServerNow.Year, TimeUtility.ServerNow.Month, TimeUtility.ServerNow.Day, hourMinute.hourBegin, hourMinute.minuteBegin, 0); int advanceSec = Mathf.CeilToInt((float)(startTime - TimeUtility.ServerNow).TotalSeconds); int endSec = Mathf.CeilToInt((float)(endTime - TimeUtility.ServerNow).TotalSeconds); if(advanceSec > 0) { return 0; } else if(endSec <= 0) { return 0; } else { return endSec; } } } return 0; } #region 仙魔之争成就 private List orderlist = new List(); public List GetAchievelist() { orderlist.Clear(); orderlist.AddRange(achieveConfiglist); orderlist.Sort(CompareTaskState); return orderlist; } private int CompareTaskState(XMZZAchievementConfig start, XMZZAchievementConfig next) { Achievement startAchieve = null; SetAchievement(start.AchieveID, out startAchieve); Achievement nextAchieve = null; SetAchievement(next.AchieveID, out nextAchieve); bool x = IsReachAchieve(startAchieve); bool y = IsReachAchieve(nextAchieve); if (x.CompareTo(y) != 0) return -x.CompareTo(y); x = startAchieve.completed ? true:false; y = nextAchieve.completed ? true: false; if (x.CompareTo(y) != 0) return x.CompareTo(y); int orderx = achieveConfiglist.IndexOf(start); int ordery = achieveConfiglist.IndexOf(next); if (orderx.CompareTo(ordery) != 0) return orderx.CompareTo(ordery); return 0; } public int SetAchievement(int[] idlist, out Achievement achieve) { achieve = null; int k = 0; for (k = 0; k < idlist.Length; k++) { if (AchieveModel.TryGetAchievement(idlist[k], out achieve)) { if (!achieve.completed) { return k; } else { if (idlist[idlist.Length - 1] == achieve.id) { return idlist.Length; } } } } return -1; } public bool IsReachAchieve(Achievement achieve) { if (achieve == null) return false; bool isReach = false; if (!achieve.completed) { if (Achievement.IsReach(achieve.id, achieve.progress)) { isReach = true; } } return isReach; } #region 红点逻辑 public const int RedPoint_XMZZAchieve_Key = 500001; public Redpoint XMZZAchieveRed = new Redpoint(RedPoint_XMZZAchieve_Key); private Dictionary achieveRedPointDict = new Dictionary(); //id 流水号 private void SetAchieveRedPoint() { achieveRedPointDict.Clear(); if (achieveConfiglist == null) return; for (int i = 0; i < achieveConfiglist.Count; i++) { int id = RedPoint_XMZZAchieve_Key * 1000 + i; Redpoint redpoint = new Redpoint(RedPoint_XMZZAchieve_Key, id); achieveRedPointDict.Add(achieveConfiglist[i].ID, redpoint); } } private void SetAchieveRedParent() { if (dailyQuestModel.GetQuestState(dailyConfig.ID) != DailyQuestModel.DailyQuestState.Normal) return; } public void AchieveRedPointCtrl() { if (achieveConfiglist == null || !FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.TouchSky)) return; if (dailyQuestModel.GetQuestState(dailyConfig.ID) != DailyQuestModel.DailyQuestState.Normal) return; for (int i = 0; i < achieveConfiglist.Count; i++) { Achievement achieve = null; SetAchievement(achieveConfiglist[i].AchieveID, out achieve); if (IsReachAchieve(achieve)) { achieveRedPointDict[achieveConfiglist[i].ID].state = RedPointState.Simple; } else { achieveRedPointDict[achieveConfiglist[i].ID].state = RedPointState.None; } } SetHeavenBattleDailyRed(); } public void RefreshAchieveState(int id) { if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.TouchSky)) return; if (dailyQuestModel.GetQuestState(dailyConfig.ID) != DailyQuestModel.DailyQuestState.Normal) return; if (achieveConfiglist != null) { for (int i = 0; i < achieveConfiglist.Count; i++) { if (achieveConfiglist[i].AchieveID.Contains(id)) { Achievement achieve = null; SetAchievement(achieveConfiglist[i].AchieveID, out achieve); if (IsReachAchieve(achieve)) { achieveRedPointDict[achieveConfiglist[i].ID].state = RedPointState.Simple; } else { achieveRedPointDict[achieveConfiglist[i].ID].state = RedPointState.None; } SetHeavenBattleDailyRed(); } } } } public void SetHeavenBattleDailyRed() { DailyQuestData questData = null; dailyQuestModel.TryGetDailyQuest(dailyConfig.ID, out questData); var completedTimes = dailyQuestModel.GetDailyQuestCompletedTimes(questData.id); var totalTimes = dailyQuestModel.GetDailyQuestTotalTimes(questData.id); if (completedTimes >= totalTimes) { questData.redpoint.state = XMZZAchieveRed.state; } } #endregion #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, BettingStart, //前往投注 BattleStart, //活动开始 BattleEnd, //活动结束 } public class GameRecInfo { public int Time { get; private set; } //时间 public string StrValue1 { get; private set; } public string StrValue2 { get; private set; } public string StrValue3 { get; private set; } public int Value1 { get; private set; } //数值1 public int Value2 { get; private set; } //数值1 public int Value3 { get; private set; } //数值1 public int Value4 { get; private set; } //数值1 public int Value5 { get; private set; } //数值1 public ArrayList value3list; public GameRecInfo(int time,string str1,string str2,string str3,int value1,int value2,int value3,int value4,int value5) { this.Time = time; this.StrValue1 = str1; this.StrValue2 = str2; this.StrValue3 = str3; this.Value1 = value1; this.Value2 = value2; this.Value3 = value3; this.Value4 = value4; this.Value5 = value5; value3list = SetArrayList(str3); } private ArrayList SetArrayList(string s) { string[] array = ConfigParse.GetMultipleStr(s); ArrayList arrayList = new ArrayList(); if(array != null) { for (int i = 0; i < array.Length; i++) { arrayList.Add(array[i]); } } return arrayList; } } public struct XMZZVictoryRewardInfo { public int itemId { get; private set;} public int itemCnt { get; private set; } public int isBind { get; private set; } public XMZZVictoryRewardInfo(int id,int count,int isBind) { this.itemId = id; this.itemCnt = count; this.isBind = isBind; } }