private void MS_PkLoopStart_Update(DateTime now) { ZhengBaMatchConfig matchConfig = this._Config.MatchConfigList.Find((ZhengBaMatchConfig _m) => _m.Day == this.SyncData.RealActDay); if (this.StateMachine.ContinueTicks(now) >= (long)(matchConfig.FightSeconds + matchConfig.ClearSeconds) * 10000000L) { this.StateMachine.SetCurrState(ZhengBaStateMachine.StateType.PkLoopEnd, now); } }
/// <summary> /// PkLoopStart 状态机 --- update,检测战斗超时,切入PkLoopEnd /// </summary> /// <param name="now"></param> private void MS_PkLoopStart_Update(DateTime now) { ZhengBaMatchConfig matchConfig = _Config.MatchConfigList.Find(_m => _m.Day == SyncData.RealActDay); if (StateMachine.ContinueTicks(now) < (matchConfig.FightSeconds + matchConfig.ClearSeconds) * TimeSpan.TicksPerSecond) { return; } StateMachine.SetCurrState(ZhengBaStateMachine.StateType.PkLoopEnd, now); }
private void MS_NotifyEnter_Update(DateTime now) { ZhengBaMatchConfig matchConfig = this._Config.MatchConfigList.Find((ZhengBaMatchConfig _m) => _m.Day == this.SyncData.RealActDay); if (this.StateMachine.ContinueTicks(now) >= (long)matchConfig.WaitSeconds * 10000000L) { int i = 0; int currIdx = 0; while (i < this.TodayJoinRoleDatas.Count / 2) { ZhengBaManagerK.JoinRolePkData joinRole = this.TodayJoinRoleDatas[currIdx++]; if (joinRole.WaitReqEnter) { joinRole.WaitReqEnter = false; joinRole.WaitKuaFuLogin = false; ZhengBaPkLogData log = null; if (this.ThisLoopPkLogs.TryGetValue(joinRole.CurrGameID, out log)) { log.IsMirror1 = true; this.AsyncEvQ.Enqueue(new AsyncDataItem(KuaFuEventTypes.ZhengBaMirrorFight, new object[] { new ZhengBaMirrorFightData { GameId = joinRole.CurrGameID, RoleId = joinRole.RoleID, ToServerId = joinRole.ToServerID } })); } } ZhengBaManagerK.JoinRolePkData joinRole2 = this.TodayJoinRoleDatas[currIdx++]; if (joinRole2.WaitReqEnter) { joinRole2.WaitReqEnter = false; joinRole2.WaitKuaFuLogin = false; ZhengBaPkLogData log = null; if (this.ThisLoopPkLogs.TryGetValue(joinRole2.CurrGameID, out log)) { log.IsMirror2 = true; this.AsyncEvQ.Enqueue(new AsyncDataItem(KuaFuEventTypes.ZhengBaMirrorFight, new object[] { new ZhengBaMirrorFightData { GameId = joinRole2.CurrGameID, RoleId = joinRole2.RoleID, ToServerId = joinRole2.ToServerID } })); } } i++; } this.StateMachine.SetCurrState(ZhengBaStateMachine.StateType.PkLoopStart, now); } }
/// <summary> /// NotifyEnter状态机 --- update,超时检测未进入的玩家,中心发起镜像出战, 切入PkLoopStart /// </summary> /// <param name="now"></param> private void MS_NotifyEnter_Update(DateTime now) { ZhengBaMatchConfig matchConfig = _Config.MatchConfigList.Find(_m => _m.Day == SyncData.RealActDay); if (StateMachine.ContinueTicks(now) < matchConfig.WaitSeconds * TimeSpan.TicksPerSecond) { return; } // 等待进入超时后,对位未进入的玩家(例如不在线,或者未作出任何点击的在线玩家),中心发起镜像出战的通知 for (int i = 0, currIdx = 0; i < TodayJoinRoleDatas.Count / 2; i++) { var joinRole1 = TodayJoinRoleDatas[currIdx++]; if (joinRole1.WaitReqEnter) // 等待客户端点击进入或者镜像出战 { joinRole1.WaitReqEnter = false; joinRole1.WaitKuaFuLogin = false; ZhengBaPkLogData log = null; if (ThisLoopPkLogs.TryGetValue(joinRole1.CurrGameID, out log)) { log.IsMirror1 = true; AsyncEvQ.Enqueue(new AsyncDataItem(KuaFuEventTypes.ZhengBaMirrorFight, new ZhengBaMirrorFightData() { GameId = joinRole1.CurrGameID, RoleId = joinRole1.RoleID, ToServerId = joinRole1.ToServerID })); } } var joinRole2 = TodayJoinRoleDatas[currIdx++]; if (joinRole2.WaitReqEnter) // 等待客户端点击进入或者镜像出战 { joinRole2.WaitReqEnter = false; joinRole2.WaitKuaFuLogin = false; ZhengBaPkLogData log = null; if (ThisLoopPkLogs.TryGetValue(joinRole2.CurrGameID, out log)) { log.IsMirror2 = true; AsyncEvQ.Enqueue(new AsyncDataItem(KuaFuEventTypes.ZhengBaMirrorFight, new ZhengBaMirrorFightData() { GameId = joinRole2.CurrGameID, RoleId = joinRole2.RoleID, ToServerId = joinRole2.ToServerID })); } } } StateMachine.SetCurrState(ZhengBaStateMachine.StateType.PkLoopStart, now); }
/// <summary> /// Idle状态机 --- update,检测时间切入 TodayPkStart 或 TodayPkEnd /// </summary> /// <param name="now"></param> private void MS_Idle_Update(DateTime now) { if (SyncData.RealActDay >= 1 && SyncData.RealActDay <= ZhengBaConsts.ContinueDays) { ZhengBaMatchConfig matchConfig = _Config.MatchConfigList.Find(_m => _m.Day == SyncData.RealActDay); if (lastUpdateTime.TimeOfDay.Ticks < matchConfig.DayBeginTick && now.TimeOfDay.Ticks >= matchConfig.DayBeginTick) { StateMachine.SetCurrState(ZhengBaStateMachine.StateType.TodayPkStart, now); } else if (lastUpdateTime.TimeOfDay.Ticks < matchConfig.DayEndTick && now.TimeOfDay.Ticks >= matchConfig.DayEndTick) { StateMachine.SetCurrState(ZhengBaStateMachine.StateType.TodayPkEnd, now); } } }
private void MS_Idle_Update(DateTime now) { if (this.SyncData.RealActDay >= 1 && this.SyncData.RealActDay <= 7) { ZhengBaMatchConfig matchConfig = this._Config.MatchConfigList.Find((ZhengBaMatchConfig _m) => _m.Day == this.SyncData.RealActDay); if (this.lastUpdateTime.TimeOfDay.Ticks < matchConfig.DayBeginTick && now.TimeOfDay.Ticks >= matchConfig.DayBeginTick) { this.StateMachine.SetCurrState(ZhengBaStateMachine.StateType.TodayPkStart, now); } else if (this.lastUpdateTime.TimeOfDay.Ticks < matchConfig.DayEndTick && now.TimeOfDay.Ticks >= matchConfig.DayEndTick) { this.StateMachine.SetCurrState(ZhengBaStateMachine.StateType.TodayPkEnd, now); } } }
public void ReloadSyncData(DateTime now) { int selectRoleIfNewCreate = 100; ZhengBaMatchConfig matchConfig = this._Config.MatchConfigList.Find((ZhengBaMatchConfig _m) => _m.Day == 1); if (matchConfig.MinRank > 0) { selectRoleIfNewCreate = matchConfig.MinRank; } long dayBeginTicks = matchConfig.DayBeginTick; ZhengBaSyncData syncData = this.Persistence.LoadZhengBaSyncData(now, selectRoleIfNewCreate, dayBeginTicks); lock (this.Mutex) { this.SyncData = syncData; this.FixSyncData(now); } }
public void ReloadSyncData(DateTime now) { int selectRoleIfNewCreate = ZhengBaConsts.DefaultJoinRoleNum; long dayBeginTicks = 0; ZhengBaMatchConfig matchConfig = _Config.MatchConfigList.Find(_m => _m.Day == 1); if (matchConfig.MinRank > 0) { selectRoleIfNewCreate = matchConfig.MinRank; } dayBeginTicks = matchConfig.DayBeginTick; ZhengBaSyncData syncData = Persistence.LoadZhengBaSyncData(now, selectRoleIfNewCreate, dayBeginTicks); lock (Mutex) { SyncData = syncData; FixSyncData(now); } }
/// <summary> /// PkLoopEnd 状态机 ---update,根据时间检测切入TodayPkEnd还是InitPkLoop /// </summary> /// <param name="now"></param> private void MS_PkLoopEnd_Update(DateTime now) { ZhengBaMatchConfig matchConfig = _Config.MatchConfigList.Find(_m => _m.Day == SyncData.RealActDay); if (StateMachine.ContinueTicks(now) < matchConfig.IntervalSeconds * TimeSpan.TicksPerSecond) { return; } // 清空超时未上报结果的战斗 foreach (var kvp in ThisLoopPkLogs) { kvp.Value.PkResult = (int)EZhengBaPKResult.Invalid; kvp.Value.UpGrade = false; kvp.Value.EndTime = now; Persistence.SavePkLog(kvp.Value); AsyncEvQ.Enqueue(new AsyncDataItem(KuaFuEventTypes.ZhengBaPkLog, kvp.Value)); } ThisLoopPkLogs.Clear(); foreach (var role in TodayJoinRoleDatas) { if (role.CurrGameID > 0 || role.ToServerID > 0) { ClientAgentManager.Instance().RemoveKfFuben(TianTiService.Instance.GameType, role.ToServerID, role.CurrGameID); } role.ToServerID = 0; role.CurrGameID = 0; } if (now.TimeOfDay.Ticks >= matchConfig.DayEndTick) { StateMachine.SetCurrState(ZhengBaStateMachine.StateType.TodayPkEnd, now); } else { StateMachine.SetCurrState(ZhengBaStateMachine.StateType.InitPkLoop, now); } }
private void MS_PkLoopEnd_Update(DateTime now) { ZhengBaMatchConfig matchConfig = this._Config.MatchConfigList.Find((ZhengBaMatchConfig _m) => _m.Day == this.SyncData.RealActDay); if (this.StateMachine.ContinueTicks(now) >= (long)matchConfig.IntervalSeconds * 10000000L) { foreach (KeyValuePair <int, ZhengBaPkLogData> kvp in this.ThisLoopPkLogs) { kvp.Value.PkResult = 0; kvp.Value.UpGrade = false; kvp.Value.EndTime = now; this.Persistence.SavePkLog(kvp.Value); this.AsyncEvQ.Enqueue(new AsyncDataItem(KuaFuEventTypes.ZhengBaPkLog, new object[] { kvp.Value })); } this.ThisLoopPkLogs.Clear(); foreach (ZhengBaManagerK.JoinRolePkData role in this.TodayJoinRoleDatas) { if (role.CurrGameID > 0 || role.ToServerID > 0) { ClientAgentManager.Instance().RemoveKfFuben(TianTiService.Instance.GameType, role.ToServerID, (long)role.CurrGameID); } role.ToServerID = 0; role.CurrGameID = 0; } if (now.TimeOfDay.Ticks >= matchConfig.DayEndTick) { this.StateMachine.SetCurrState(ZhengBaStateMachine.StateType.TodayPkEnd, now); } else { this.StateMachine.SetCurrState(ZhengBaStateMachine.StateType.InitPkLoop, now); } } }
public List <ZhengBaNtfPkResultData> ZhengBaPkResult(int gameId, int winner1, int FirstLeaveRoleId) { lock (Mutex) { ZhengBaPkLogData log = null; if (!ThisLoopPkLogs.TryGetValue(gameId, out log)) { return(null); } // 一个人走,另一个人赢 if (FirstLeaveRoleId == log.RoleID1) { winner1 = log.RoleID2; } else if (FirstLeaveRoleId == log.RoleID2) { winner1 = log.RoleID1; } if (winner1 != log.RoleID1 && winner1 != log.RoleID2) { // what's the f**k. return(null); } JoinRolePkData joinRole1 = TodayJoinRoleDatas.Find(_r => _r.RoleID == log.RoleID1 && _r.CurrGameID == gameId); JoinRolePkData joinRole2 = TodayJoinRoleDatas.Find(_r => _r.RoleID == log.RoleID2 && _r.CurrGameID == gameId); if (joinRole1 == null || joinRole2 == null) { // what's the f**k return(null); } ZhengBaMatchConfig matchConfig = _Config.MatchConfigList.Find(_m => _m.Day == SyncData.RealActDay); ZhengBaNtfPkResultData ntf1 = new ZhengBaNtfPkResultData() { RoleID = joinRole1.RoleID }; ZhengBaNtfPkResultData ntf2 = new ZhengBaNtfPkResultData() { RoleID = joinRole2.RoleID }; JoinRolePkData winJoinRole = null; ZhengBaNtfPkResultData winNtf = null; if (winner1 > 0 && winner1 == joinRole1.RoleID) { winJoinRole = joinRole1; winNtf = ntf1; } else if (winner1 > 0 && winner1 == joinRole2.RoleID) { winJoinRole = joinRole2; winNtf = ntf2; } if (winJoinRole != null && winNtf != null) { winNtf.IsWin = true; winJoinRole.WinTimes++; if (winJoinRole.WinTimes >= matchConfig.NeedWinTimes && HadUpGradeRoleNum < matchConfig.MaxUpGradeNum) { int calcGroup = RandomGroup.Count > 0 ? RandomGroup.Last() : ZhengBaConsts.NoneGroup; bool bSaveUpdate = false; ZhengBaRoleInfoData roleData = SyncData.RoleList.Find(_r => _r.RoleId == winJoinRole.RoleID); if (roleData != null) { int newGrade = (int)matchConfig.WillUpGrade; int newState = (int)EZhengBaState.UpGrade; int newGroup = calcGroup != ZhengBaConsts.NoneGroup ? calcGroup : roleData.Group; if (Persistence.UpdateRole(SyncData.Month, roleData.RoleId, newGrade, newState, newGroup)) { // 必须保证把晋级情况落地到db之后,才能更新缓存 roleData.Grade = newGrade; roleData.State = newState; roleData.Group = newGroup; SyncData.RoleModTime = TimeUtil.NowDateTime(); bSaveUpdate = true; if (newGrade != (int)EZhengBaGrade.Grade1) { AsyncEvQ.Enqueue(new AsyncDataItem(KuaFuEventTypes.ZhengBaButtetinJoin, new ZhengBaBulletinJoinData() { NtfType = ZhengBaBulletinJoinData.ENtfType.MailUpgradeRole, Args1 = roleData.RoleId, })); } } } if (bSaveUpdate) { // 晋级已落地到db,修改缓存 winNtf.RandGroup = calcGroup; winNtf.IsUpGrade = true; log.UpGrade = true; HadUpGradeRoleNum++; RandomGroup.Remove(calcGroup); TodayJoinRoleDatas.RemoveAll(_r => _r.RoleID == winJoinRole.RoleID); } } } log.EndTime = TimeUtil.NowDateTime(); if (winner1 > 0 && winner1 == log.RoleID1) { log.PkResult = (int)EZhengBaPKResult.Win; } else if (winner1 > 0 && winner1 == log.RoleID2) { log.PkResult = (int)EZhengBaPKResult.Fail; } else { log.PkResult = (int)EZhengBaPKResult.Invalid; } ntf1.StillNeedWin = Math.Max(0, matchConfig.NeedWinTimes - joinRole1.WinTimes); ntf1.LeftUpGradeNum = matchConfig.MaxUpGradeNum - HadUpGradeRoleNum; ntf2.StillNeedWin = Math.Max(0, matchConfig.NeedWinTimes - joinRole2.WinTimes); ntf2.LeftUpGradeNum = matchConfig.MaxUpGradeNum - HadUpGradeRoleNum; Persistence.SavePkLog(log); ThisLoopPkLogs.Remove(gameId); AsyncEvQ.Enqueue(new AsyncDataItem(KuaFuEventTypes.ZhengBaPkLog, log)); return(new List <ZhengBaNtfPkResultData>() { ntf1, ntf2 }); } }
/// <summary> /// 修复日期 /// </summary> /// <param name="now"></param> /// <returns></returns> private bool FixSyncData_State(DateTime now) { bool bForceModify = false; int nowDay = now.Day - ZhengBaConsts.StartMonthDay + 1; lock (Mutex) { // 检测已有的排行数据应该是活动的第几天的战斗结果 int rankOfDay = ZhengBaConsts.ContinueDays; for (; rankOfDay >= 1; rankOfDay--) { EZhengBaGrade willUpGrade = ZhengBaUtils.GetDayUpGrade(rankOfDay); ZhengBaMatchConfig matchConfig = _Config.MatchConfigList.Find(_m => _m.Day == rankOfDay); List <ZhengBaRoleInfoData> roleList = SyncData.RoleList.FindAll(_r => _r.Grade == (int)willUpGrade); if (roleList.Count <= 0) { continue; } int needUpNum = matchConfig.MaxUpGradeNum - roleList.Count; if (needUpNum > 0) { List <ZhengBaRoleInfoData> upGradeList = new List <ZhengBaRoleInfoData>(); if (rankOfDay <= 3) { //补位选手 --- 被淘汰的角色按照晋级、段位进行排序 List <ZhengBaRoleInfoData> luckList = SyncData.RoleList.FindAll(_r => _r.Grade > (int)willUpGrade); luckList.Sort((_l, _r) => { if (_l.Grade < _r.Grade) { return(-1); } else if (_l.Grade > _r.Grade) { return(1); } else { return(_l.DuanWeiRank - _r.DuanWeiRank); } }); foreach (var luckRole in luckList.GetRange(0, Math.Min(needUpNum, luckList.Count))) { upGradeList.Add(luckRole); LogManager.WriteLog(LogTypes.Error, string.Format("晋级补位 [s{0}.{1}] {2}->{3}", luckRole.ZoneId, luckRole.RoleId, luckRole.Grade, (int)willUpGrade)); luckRole.Grade = (int)willUpGrade; bForceModify = true; } } else { // 第4天开始就是固定分组pk了,要防止同一个组的两个人都补位晋级的情况 foreach (var range in ZhengBaUtils.GetDayPkGroupRange(rankOfDay)) { // 找出这个group中,在rankOfDay-1天晋级的玩家列表,尝试选取一个晋级到rankOfDay中 var groupRoleList = SyncData.RoleList.FindAll(_r => _r.Group >= range.Left && _r.Group <= range.Right); if (groupRoleList.Exists(_r => _r.Grade <= (int)ZhengBaUtils.GetDayUpGrade(rankOfDay))) { continue; // 本分组已有人在本天已晋级 } // 只从rankOfDay-1天晋级的玩家中挑选 groupRoleList.RemoveAll(_r => _r.Grade != (int)ZhengBaUtils.GetDayUpGrade(rankOfDay - 1)); if (groupRoleList.Count <= 0) { continue; } // 段位高者晋级 groupRoleList.Sort((_l, _r) => { return(_l.DuanWeiRank - _r.DuanWeiRank); }); ZhengBaRoleInfoData selectRole = groupRoleList[0]; LogManager.WriteLog(LogTypes.Error, string.Format("晋级补位 [s{0}.{1}] {2}->{3}", selectRole.ZoneId, selectRole.RoleId, selectRole.Grade, (int)willUpGrade)); selectRole.Grade = (int)ZhengBaUtils.GetDayUpGrade(rankOfDay); bForceModify = true; upGradeList.Add(selectRole); } } foreach (var luckRole in upGradeList) { AsyncEvQ.Enqueue(new AsyncDataItem(KuaFuEventTypes.ZhengBaButtetinJoin, new ZhengBaBulletinJoinData() { NtfType = ZhengBaBulletinJoinData.ENtfType.MailUpgradeRole, Args1 = luckRole.RoleId, })); } } break; } // rankOfDay 表示当前是第几天结束时的结果 SyncData.RankResultOfDay = rankOfDay; SyncData.RealActDay = rankOfDay; foreach (var role in SyncData.RoleList) { if (rankOfDay <= 0) { if (role.Grade != (int)EZhengBaGrade.Grade100 || role.State != (int)EZhengBaState.None || role.Group != (int)ZhengBaConsts.NoneGroup) { role.Grade = (int)EZhengBaGrade.Grade100; role.State = (int)EZhengBaState.None; role.Group = (int)ZhengBaConsts.NoneGroup; bForceModify = true; } } else { EZhengBaGrade upGrade = _Config.MatchConfigList.Find(_m => _m.Day == rankOfDay).WillUpGrade; if (role.Grade <= (int)upGrade && role.State != (int)EZhengBaState.UpGrade) { role.State = (int)EZhengBaState.UpGrade; bForceModify = true; } if (role.Grade > (int)upGrade && role.State != (int)EZhengBaState.Failed) { role.State = (int)EZhengBaState.Failed; bForceModify = true; } } } // 检测是否推进到后一天,进入活动开始日期 , 并且当前的实际活动天数 小于 现实天数 if (nowDay > 0 && SyncData.RealActDay < nowDay) { // 不是活动的最后一天, 才能够尝试推进到下一天 if (SyncData.RealActDay < ZhengBaConsts.ContinueDays) { ZhengBaMatchConfig matchConfig = _Config.MatchConfigList.Find(_m => _m.Day == SyncData.RealActDay + 1); if (now.TimeOfDay.Ticks < matchConfig.DayBeginTick) { // 当前时间小于下一天活动的开始时间,ok,推进到下一天, 这里的时间按照相对于凌晨的Ticks而言 SyncData.RealActDay++; } } else { // 当前是第7天的数据,可以直接推进到下一天了 SyncData.RealActDay = ZhengBaConsts.ContinueDays + 1; } } } return(bForceModify); }
/// <summary> /// InitPkLoop 状态机 --- enter,初始化本轮pk信息,分组,切入 NotifyEnter /// </summary> /// <param name="now"></param> private void MS_InitPkLoop_Enter(DateTime now) { ThisLoopPkLogs.Clear(); CurrLoopIndex++; ZhengBaMatchConfig matchConfig = _Config.MatchConfigList.Find(_m => _m.Day == SyncData.RealActDay); if (this.HadUpGradeRoleNum >= (int)matchConfig.MaxUpGradeNum || TodayJoinRoleDatas.Count <= 1) { StateMachine.SetCurrState(ZhengBaStateMachine.StateType.TodayPkEnd, now); return; } if (matchConfig.Mathching == EZhengBaMatching.Random) // 随机分组 { Random r = new Random((int)now.Ticks); for (int i = 0; TodayJoinRoleDatas.Count > 0 && i < TodayJoinRoleDatas.Count * 2; i++) { int idx1 = r.Next(0, TodayJoinRoleDatas.Count), idx2 = r.Next(0, TodayJoinRoleDatas.Count); var tmp = TodayJoinRoleDatas[idx1]; TodayJoinRoleDatas[idx1] = TodayJoinRoleDatas[idx2]; TodayJoinRoleDatas[idx2] = tmp; } } else if (matchConfig.Mathching == EZhengBaMatching.Group) { List <JoinRolePkData> tmpRoleDatas = new List <JoinRolePkData>(); foreach (var range in ZhengBaUtils.GetDayPkGroupRange(SyncData.RealActDay)) { var groupRoles = TodayJoinRoleDatas.FindAll(_r => _r.Group >= range.Left && _r.Group <= range.Right); if (groupRoles != null && groupRoles.Count == 2) { tmpRoleDatas.AddRange(groupRoles); } } TodayJoinRoleDatas.Clear(); TodayJoinRoleDatas.AddRange(tmpRoleDatas); } else { Debug.Assert(false, "unknown pk match type"); } // 两两分组 int currIdx = 0; for (int i = 0; i < TodayJoinRoleDatas.Count / 2; i++) { var joinRole1 = TodayJoinRoleDatas[currIdx++]; var joinRole2 = TodayJoinRoleDatas[currIdx++]; int toServerId = 0, gameId = 0; gameId = TianTiPersistence.Instance.GetNextGameId(); if (ClientAgentManager.Instance().AssginKfFuben(TianTiService.Instance.GameType, gameId, 2, out toServerId)) { joinRole1.ToServerID = joinRole2.ToServerID = toServerId; joinRole1.CurrGameID = joinRole2.CurrGameID = gameId; joinRole1.WaitReqEnter = joinRole2.WaitReqEnter = true; joinRole1.WaitKuaFuLogin = joinRole2.WaitKuaFuLogin = false; ZhengBaNtfEnterData data = new ZhengBaNtfEnterData(); data.RoleId1 = joinRole1.RoleID; data.RoleId2 = joinRole2.RoleID; data.ToServerId = toServerId; data.GameId = gameId; data.Day = SyncData.RealActDay; data.Loop = CurrLoopIndex; AsyncEvQ.Enqueue(new AsyncDataItem(KuaFuEventTypes.ZhengBaNtfEnter, data)); ZhengBaPkLogData log = new ZhengBaPkLogData(); log.Month = SyncData.Month; log.Day = SyncData.RealActDay; log.RoleID1 = joinRole1.RoleID; log.ZoneID1 = joinRole1.ZoneId; log.RoleName1 = joinRole1.RoleName; log.RoleID2 = joinRole2.RoleID; log.ZoneID2 = joinRole2.ZoneId; log.RoleName2 = joinRole2.RoleName; log.StartTime = now; ThisLoopPkLogs[gameId] = log; } else { LogManager.WriteLog(LogTypes.Error, string.Format("众神争霸第{0}天第{1}轮分配游戏服务器失败,role1={2},role2={3}", SyncData.RealActDay, CurrLoopIndex, joinRole1.RoleID, joinRole2.RoleID)); } } // 匹配不到对手!!!,人数为奇数了 while (currIdx < TodayJoinRoleDatas.Count) { var joinRole = TodayJoinRoleDatas[currIdx++]; joinRole.ToServerID = 0; joinRole.CurrGameID = 0; joinRole.WaitReqEnter = false; joinRole.WaitKuaFuLogin = false; } StateMachine.SetCurrState(ZhengBaStateMachine.StateType.NotifyEnter, now); }
public List <ZhengBaNtfPkResultData> ZhengBaPkResult(int gameId, int winner1, int FirstLeaveRoleId) { List <ZhengBaNtfPkResultData> result; lock (this.Mutex) { ZhengBaPkLogData log = null; if (!this.ThisLoopPkLogs.TryGetValue(gameId, out log)) { result = null; } else { if (FirstLeaveRoleId == log.RoleID1) { winner1 = log.RoleID2; } else if (FirstLeaveRoleId == log.RoleID2) { winner1 = log.RoleID1; } if (winner1 != log.RoleID1 && winner1 != log.RoleID2) { result = null; } else { ZhengBaManagerK.JoinRolePkData joinRole = this.TodayJoinRoleDatas.Find((ZhengBaManagerK.JoinRolePkData _r) => _r.RoleID == log.RoleID1 && _r.CurrGameID == gameId); ZhengBaManagerK.JoinRolePkData joinRole2 = this.TodayJoinRoleDatas.Find((ZhengBaManagerK.JoinRolePkData _r) => _r.RoleID == log.RoleID2 && _r.CurrGameID == gameId); if (joinRole == null || joinRole2 == null) { result = null; } else { ZhengBaMatchConfig matchConfig = this._Config.MatchConfigList.Find((ZhengBaMatchConfig _m) => _m.Day == this.SyncData.RealActDay); ZhengBaNtfPkResultData ntf = new ZhengBaNtfPkResultData { RoleID = joinRole.RoleID }; ZhengBaNtfPkResultData ntf2 = new ZhengBaNtfPkResultData { RoleID = joinRole2.RoleID }; ZhengBaManagerK.JoinRolePkData winJoinRole = null; ZhengBaNtfPkResultData winNtf = null; if (winner1 > 0 && winner1 == joinRole.RoleID) { winJoinRole = joinRole; winNtf = ntf; } else if (winner1 > 0 && winner1 == joinRole2.RoleID) { winJoinRole = joinRole2; winNtf = ntf2; } if (winJoinRole != null && winNtf != null) { winNtf.IsWin = true; winJoinRole.WinTimes++; if (winJoinRole.WinTimes >= matchConfig.NeedWinTimes && this.HadUpGradeRoleNum < matchConfig.MaxUpGradeNum) { int calcGroup = (this.RandomGroup.Count > 0) ? this.RandomGroup.Last <int>() : 0; bool bSaveUpdate = false; ZhengBaRoleInfoData roleData = this.SyncData.RoleList.Find((ZhengBaRoleInfoData _r) => _r.RoleId == winJoinRole.RoleID); if (roleData != null) { int newGrade = (int)matchConfig.WillUpGrade; int newState = 1; int newGroup = (calcGroup != 0) ? calcGroup : roleData.Group; if (this.Persistence.UpdateRole(this.SyncData.Month, roleData.RoleId, newGrade, newState, newGroup)) { roleData.Grade = newGrade; roleData.State = newState; roleData.Group = newGroup; this.SyncData.RoleModTime = TimeUtil.NowDateTime(); bSaveUpdate = true; if (newGrade != 1) { this.AsyncEvQ.Enqueue(new AsyncDataItem(KuaFuEventTypes.ZhengBaButtetinJoin, new object[] { new ZhengBaBulletinJoinData { NtfType = ZhengBaBulletinJoinData.ENtfType.MailUpgradeRole, Args1 = roleData.RoleId } })); } } } if (bSaveUpdate) { winNtf.RandGroup = calcGroup; winNtf.IsUpGrade = true; winNtf.NewGrade = roleData.Grade; log.UpGrade = true; this.HadUpGradeRoleNum++; this.RandomGroup.Remove(calcGroup); this.TodayJoinRoleDatas.RemoveAll((ZhengBaManagerK.JoinRolePkData _r) => _r.RoleID == winJoinRole.RoleID); } } } log.EndTime = TimeUtil.NowDateTime(); if (winner1 > 0 && winner1 == log.RoleID1) { log.PkResult = 1; } else if (winner1 > 0 && winner1 == log.RoleID2) { log.PkResult = 2; } else { log.PkResult = 0; } ntf.StillNeedWin = Math.Max(0, matchConfig.NeedWinTimes - joinRole.WinTimes); ntf.LeftUpGradeNum = matchConfig.MaxUpGradeNum - this.HadUpGradeRoleNum; ntf2.StillNeedWin = Math.Max(0, matchConfig.NeedWinTimes - joinRole2.WinTimes); ntf2.LeftUpGradeNum = matchConfig.MaxUpGradeNum - this.HadUpGradeRoleNum; this.Persistence.SavePkLog(log); this.ThisLoopPkLogs.Remove(gameId); this.AsyncEvQ.Enqueue(new AsyncDataItem(KuaFuEventTypes.ZhengBaPkLog, new object[] { log })); result = new List <ZhengBaNtfPkResultData> { ntf, ntf2 }; } } } } return(result); }
private bool FixSyncData_State(DateTime now) { bool bForceModify = false; int nowDay = now.Day - ZhengBaConsts.StartMonthDay + 1; lock (this.Mutex) { int rankOfDay; for (rankOfDay = 7; rankOfDay >= 1; rankOfDay--) { EZhengBaGrade willUpGrade = ZhengBaUtils.GetDayUpGrade(rankOfDay); ZhengBaMatchConfig matchConfig = this._Config.MatchConfigList.Find((ZhengBaMatchConfig _m) => _m.Day == rankOfDay); List <ZhengBaRoleInfoData> roleList = this.SyncData.RoleList.FindAll((ZhengBaRoleInfoData _r) => _r.Grade == (int)willUpGrade); if (roleList.Count > 0) { int needUpNum = matchConfig.MaxUpGradeNum - roleList.Count; if (needUpNum > 0) { List <ZhengBaRoleInfoData> upGradeList = new List <ZhengBaRoleInfoData>(); if (rankOfDay <= 3) { List <ZhengBaRoleInfoData> luckList = this.SyncData.RoleList.FindAll((ZhengBaRoleInfoData _r) => _r.Grade > (int)willUpGrade); luckList.Sort(delegate(ZhengBaRoleInfoData _l, ZhengBaRoleInfoData _r) { int result; if (_l.Grade < _r.Grade) { result = -1; } else if (_l.Grade > _r.Grade) { result = 1; } else { result = _l.DuanWeiRank - _r.DuanWeiRank; } return(result); }); foreach (ZhengBaRoleInfoData luckRole in luckList.GetRange(0, Math.Min(needUpNum, luckList.Count))) { upGradeList.Add(luckRole); LogManager.WriteLog(LogTypes.Error, string.Format("晋级补位 [s{0}.{1}] {2}->{3}", new object[] { luckRole.ZoneId, luckRole.RoleId, luckRole.Grade, (int)willUpGrade }), null, true); luckRole.Grade = (int)willUpGrade; bForceModify = true; } } else { using (List <RangeKey> .Enumerator enumerator2 = ZhengBaUtils.GetDayPkGroupRange(rankOfDay).GetEnumerator()) { while (enumerator2.MoveNext()) { RangeKey range = enumerator2.Current; List <ZhengBaRoleInfoData> groupRoleList = this.SyncData.RoleList.FindAll((ZhengBaRoleInfoData _r) => _r.Group >= range.Left && _r.Group <= range.Right); if (!groupRoleList.Exists((ZhengBaRoleInfoData _r) => _r.Grade <= (int)ZhengBaUtils.GetDayUpGrade(rankOfDay))) { groupRoleList.RemoveAll((ZhengBaRoleInfoData _r) => _r.Grade != (int)ZhengBaUtils.GetDayUpGrade(rankOfDay - 1)); if (groupRoleList.Count > 0) { groupRoleList.Sort((ZhengBaRoleInfoData _l, ZhengBaRoleInfoData _r) => _l.DuanWeiRank - _r.DuanWeiRank); ZhengBaRoleInfoData selectRole = groupRoleList[0]; LogManager.WriteLog(LogTypes.Error, string.Format("晋级补位 [s{0}.{1}] {2}->{3}", new object[] { selectRole.ZoneId, selectRole.RoleId, selectRole.Grade, (int)willUpGrade }), null, true); selectRole.Grade = (int)ZhengBaUtils.GetDayUpGrade(rankOfDay); bForceModify = true; upGradeList.Add(selectRole); } } } } } foreach (ZhengBaRoleInfoData luckRole in upGradeList) { this.AsyncEvQ.Enqueue(new AsyncDataItem(KuaFuEventTypes.ZhengBaButtetinJoin, new object[] { new ZhengBaBulletinJoinData { NtfType = ZhengBaBulletinJoinData.ENtfType.MailUpgradeRole, Args1 = luckRole.RoleId } })); } } break; } } this.SyncData.RankResultOfDay = rankOfDay; this.SyncData.RealActDay = rankOfDay; foreach (ZhengBaRoleInfoData role in this.SyncData.RoleList) { if (rankOfDay <= 0) { if (role.Grade != 100 || role.State != 0 || role.Group != 0) { role.Grade = 100; role.State = 0; role.Group = 0; bForceModify = true; } } else { EZhengBaGrade upGrade = this._Config.MatchConfigList.Find((ZhengBaMatchConfig _m) => _m.Day == rankOfDay).WillUpGrade; if (role.Grade <= (int)upGrade && role.State != 1) { role.State = 1; bForceModify = true; } if (role.Grade > (int)upGrade && role.State != 2) { role.State = 2; bForceModify = true; } } if (role.Grade == 1 && this.SyncData.LastKingModTime != this.SyncData.Month) { this.SyncData.LastKingData = role; this.SyncData.LastKingModTime = this.SyncData.Month; } } if (nowDay > 0 && this.SyncData.RealActDay < nowDay) { if (this.SyncData.RealActDay < 7) { ZhengBaMatchConfig matchConfig = this._Config.MatchConfigList.Find((ZhengBaMatchConfig _m) => _m.Day == this.SyncData.RealActDay + 1); if (now.TimeOfDay.Ticks < matchConfig.DayBeginTick) { this.SyncData.RealActDay++; } } else { this.SyncData.RealActDay = 8; } } } return(bForceModify); }
private void MS_InitPkLoop_Enter(DateTime now) { this.ThisLoopPkLogs.Clear(); this.CurrLoopIndex++; ZhengBaMatchConfig matchConfig = this._Config.MatchConfigList.Find((ZhengBaMatchConfig _m) => _m.Day == this.SyncData.RealActDay); if (this.HadUpGradeRoleNum >= matchConfig.MaxUpGradeNum || this.TodayJoinRoleDatas.Count <= 1) { this.StateMachine.SetCurrState(ZhengBaStateMachine.StateType.TodayPkEnd, now); } else { if (matchConfig.Mathching == EZhengBaMatching.Random) { Random r = new Random((int)now.Ticks); int i = 0; while (this.TodayJoinRoleDatas.Count > 0 && i < this.TodayJoinRoleDatas.Count * 2) { int idx = r.Next(0, this.TodayJoinRoleDatas.Count); int idx2 = r.Next(0, this.TodayJoinRoleDatas.Count); ZhengBaManagerK.JoinRolePkData tmp = this.TodayJoinRoleDatas[idx]; this.TodayJoinRoleDatas[idx] = this.TodayJoinRoleDatas[idx2]; this.TodayJoinRoleDatas[idx2] = tmp; i++; } } else if (matchConfig.Mathching == EZhengBaMatching.Group) { List <ZhengBaManagerK.JoinRolePkData> tmpRoleDatas = new List <ZhengBaManagerK.JoinRolePkData>(); using (List <RangeKey> .Enumerator enumerator = ZhengBaUtils.GetDayPkGroupRange(this.SyncData.RealActDay).GetEnumerator()) { while (enumerator.MoveNext()) { RangeKey range = enumerator.Current; List <ZhengBaManagerK.JoinRolePkData> groupRoles = this.TodayJoinRoleDatas.FindAll((ZhengBaManagerK.JoinRolePkData _r) => _r.Group >= range.Left && _r.Group <= range.Right); if (groupRoles != null && groupRoles.Count == 2) { tmpRoleDatas.AddRange(groupRoles); } } } this.TodayJoinRoleDatas.Clear(); this.TodayJoinRoleDatas.AddRange(tmpRoleDatas); } else { Debug.Assert(false, "unknown pk match type"); } int currIdx = 0; for (int i = 0; i < this.TodayJoinRoleDatas.Count / 2; i++) { ZhengBaManagerK.JoinRolePkData joinRole = this.TodayJoinRoleDatas[currIdx++]; ZhengBaManagerK.JoinRolePkData joinRole2 = this.TodayJoinRoleDatas[currIdx++]; int toServerId = 0; int gameId = TianTiPersistence.Instance.GetNextGameId(); if (ClientAgentManager.Instance().AssginKfFuben(TianTiService.Instance.GameType, (long)gameId, 2, out toServerId)) { joinRole.ToServerID = (joinRole2.ToServerID = toServerId); joinRole.CurrGameID = (joinRole2.CurrGameID = gameId); joinRole.WaitReqEnter = (joinRole2.WaitReqEnter = true); joinRole.WaitKuaFuLogin = (joinRole2.WaitKuaFuLogin = false); ZhengBaNtfEnterData data = new ZhengBaNtfEnterData(); data.RoleId1 = joinRole.RoleID; data.RoleId2 = joinRole2.RoleID; data.ToServerId = toServerId; data.GameId = gameId; data.Day = this.SyncData.RealActDay; data.Loop = this.CurrLoopIndex; this.AsyncEvQ.Enqueue(new AsyncDataItem(KuaFuEventTypes.ZhengBaNtfEnter, new object[] { data })); ZhengBaPkLogData log = new ZhengBaPkLogData(); log.Month = this.SyncData.Month; log.Day = this.SyncData.RealActDay; log.RoleID1 = joinRole.RoleID; log.ZoneID1 = joinRole.ZoneId; log.RoleName1 = joinRole.RoleName; log.RoleID2 = joinRole2.RoleID; log.ZoneID2 = joinRole2.ZoneId; log.RoleName2 = joinRole2.RoleName; log.StartTime = now; this.ThisLoopPkLogs[gameId] = log; } else { LogManager.WriteLog(LogTypes.Error, string.Format("众神争霸第{0}天第{1}轮分配游戏服务器失败,role1={2},role2={3}", new object[] { this.SyncData.RealActDay, this.CurrLoopIndex, joinRole.RoleID, joinRole2.RoleID }), null, true); } } while (currIdx < this.TodayJoinRoleDatas.Count) { ZhengBaManagerK.JoinRolePkData joinRole3 = this.TodayJoinRoleDatas[currIdx++]; joinRole3.ToServerID = 0; joinRole3.CurrGameID = 0; joinRole3.WaitReqEnter = false; joinRole3.WaitKuaFuLogin = false; } this.StateMachine.SetCurrState(ZhengBaStateMachine.StateType.NotifyEnter, now); } }