/// <summary> /// 跨服初始化游戏 /// </summary> /// <param name="client"></param> /// <returns></returns> public bool KuaFuInitGame(GameClient client) { long gameId = Global.GetClientKuaFuServerLoginData(client).GameId; lock (Mutex) { CoupleArenaFuBenData fubenData = null; if (!GameId2FuBenData.TryGetValue(gameId, out fubenData)) { fubenData = TianTiClient.getInstance().GetFuBenData(gameId); if (fubenData != null) { if (fubenData.FuBenSeq == 0) { fubenData.FuBenSeq = GameCoreInterface.getinstance().GetNewFuBenSeqId(); } GameId2FuBenData.Add(gameId, fubenData); } } if (fubenData == null) { return(false); } if (fubenData.KfServerId != GameCoreInterface.getinstance().GetLocalServerId()) { return(false); } KuaFuFuBenRoleData roleData = null; if (fubenData.RoleList == null || (roleData = fubenData.RoleList.Find(_r => _r.RoleId == client.ClientData.RoleID)) == null) { return(false); } client.ClientData.MapCode = WarCfg.MapCode; client.ClientData.BattleWhichSide = roleData.Side; int _posx = 0, _posy = 0; if (!GetBirthPoint(client.ClientData.MapCode, client.ClientData.BattleWhichSide, out _posx, out _posy)) { LogManager.WriteLog(LogTypes.Error, string.Format("找不到出生点mapcode={0},side={1}", client.ClientData.MapCode, client.ClientData.BattleWhichSide)); return(false); } client.ClientData.PosX = _posx; client.ClientData.PosY = _posy; Global.GetClientKuaFuServerLoginData(client).FuBenSeqId = fubenData.FuBenSeq; client.ClientData.FuBenSeqID = fubenData.FuBenSeq; } return(true); }
/// <summary> /// 夫妻匹配 /// </summary> /// <param name="now"></param> private void CheckRoleMatch(DateTime now) { lock (Mutex) { var joinDatas = JoinDataUtil.GetJoinList(); if (joinDatas == null || joinDatas.Count <= 0) { return; } CoupleArenaJoinMatcher joinMatcher = new CoupleArenaJoinMatcher(); foreach (var joinData in joinDatas) { if ((now - joinData.StartTime).TotalSeconds >= 60 || joinData.ToKfServerId > 0) { JoinDataUtil.DelJoinData(joinData); } else if ((now - joinData.StartTime).TotalSeconds >= 30) { joinMatcher.AddGlobalJoinData(joinData); } else { joinMatcher.AddJoinData(joinData.DuanWeiType, joinData.DuanWeiLevel, joinData); } } foreach (var list in joinMatcher.GetAllMatch()) { for (int i = 0; i < list.Count - 1;) { var one = list[i]; var two = list[i + 1]; if (MatchTimeLimiter.GetMatchTimes(one.RoleId1, one.RoleId2, two.RoleId1, two.RoleId2) >= TianTiPersistence.Instance.MaxRolePairFightCount) { // 次数先知 第i个元素,让第i+1个元素和第i+2个元素进行匹配 i += 1; continue; } CoupleArenaFuBenData fubenData = new CoupleArenaFuBenData(); fubenData.GameId = Persistence.GetNextGameId(); fubenData.StartTime = now; fubenData.RoleList = new List <KuaFuFuBenRoleData>(); fubenData.RoleList.Add(new KuaFuFuBenRoleData() { ServerId = one.ServerId, RoleId = one.RoleId1, Side = 1 }); fubenData.RoleList.Add(new KuaFuFuBenRoleData() { ServerId = one.ServerId, RoleId = one.RoleId2, Side = 1 }); fubenData.RoleList.Add(new KuaFuFuBenRoleData() { ServerId = two.ServerId, RoleId = two.RoleId1, Side = 2 }); fubenData.RoleList.Add(new KuaFuFuBenRoleData() { ServerId = two.ServerId, RoleId = two.RoleId2, Side = 2 }); if (ClientAgentManager.Instance().AssginKfFuben(GameType, fubenData.GameId, 4, out fubenData.KfServerId)) { MatchTimeLimiter.AddMatchTimes(one.RoleId1, one.RoleId2, two.RoleId1, two.RoleId2); GameFuBenDict[fubenData.GameId] = fubenData; i += 2; one.ToKfServerId = fubenData.KfServerId; two.ToKfServerId = fubenData.KfServerId; CoupleArenaCanEnterData enterData1 = new CoupleArenaCanEnterData() { GameId = fubenData.GameId, KfServerId = fubenData.KfServerId, RoleId1 = one.RoleId1, RoleId2 = one.RoleId2 }; ClientAgentManager.Instance().PostAsyncEvent(one.ServerId, EvItemGameType, new AsyncDataItem(KuaFuEventTypes.CoupleArenaCanEnter, enterData1)); CoupleArenaCanEnterData enterData2 = new CoupleArenaCanEnterData() { GameId = fubenData.GameId, KfServerId = fubenData.KfServerId, RoleId1 = two.RoleId1, RoleId2 = two.RoleId2 }; AsyncDataItem evItem2 = new AsyncDataItem(KuaFuEventTypes.CoupleArenaCanEnter, fubenData.GameId, fubenData.KfServerId, two.RoleId1, two.RoleId2); ClientAgentManager.Instance().PostAsyncEvent(two.ServerId, EvItemGameType, new AsyncDataItem(KuaFuEventTypes.CoupleArenaCanEnter, enterData2)); } else { LogManager.WriteLog(LogTypes.Error, "CoupleArena 没有跨服可以分配"); return; } } } } }
/// <summary> /// 副本结算 /// </summary> /// <param name="scene"></param> /// <param name="now"></param> /// <param name="nowTicks"></param> private void ProcessEnd(CoupleArenaCopyScene scene, DateTime now, long nowTicks) { GameManager.CopyMapMgr.KillAllMonster(scene.CopyMap); //结算奖励 scene.m_eStatus = GameSceneStatuses.STATUS_AWARD; scene.m_lEndTime = nowTicks; scene.m_lLeaveTime = scene.m_lEndTime + WarCfg.ClearSec * TimeUtil.SECOND; scene.StateTimeData.GameType = (int)GameTypes.CoupleArena; scene.StateTimeData.State = (int)GameSceneStatuses.STATUS_END; scene.StateTimeData.EndTicks = scene.m_lLeaveTime; GameManager.ClientMgr.BroadSpecialCopyMapMessage((int)TCPGameServerCmds.CMD_SPR_NOTIFY_TIME_STATE, scene.StateTimeData, scene.CopyMap); CoupleArenaFuBenData fubenData = null; if (!GameId2FuBenData.TryGetValue(scene.GameId, out fubenData)) { return; } List <RoleData4Selector> selectorList = new List <RoleData4Selector>(); foreach (var roledata in fubenData.RoleList) { RoleData4Selector _roleInfo = Global.sendToDB <RoleData4Selector, string>((int)TCPGameServerCmds.CMD_SPR_GETROLEUSINGGOODSDATALIST, string.Format("{0}", roledata.RoleId), roledata.ServerId); if (_roleInfo == null) { LogManager.WriteLog(LogTypes.Error, string.Format("加载RoleData4Selector失败, serverid={0}, roleid={1}", roledata.ServerId, roledata.RoleId)); return; } selectorList.Add(_roleInfo); } if (selectorList[0].RoleSex == (int)ERoleSex.Girl) { var tmp = selectorList[0]; selectorList[0] = selectorList[1]; selectorList[1] = tmp; } if (selectorList[2].RoleSex == (int)ERoleSex.Girl) { var tmp = selectorList[2]; selectorList[2] = selectorList[3]; selectorList[3] = tmp; } // selectorList 存储的分别为男1,女1,男2,女2 CoupleArenaPkResultReq req = new CoupleArenaPkResultReq(); req.GameId = scene.GameId; req.winSide = scene.WinSide; req.ManRole1 = selectorList[0].RoleID; req.ManZoneId1 = selectorList[0].ZoneId; req.ManSelector1 = DataHelper.ObjectToBytes <RoleData4Selector>(selectorList[0]); req.WifeRole1 = selectorList[1].RoleID; req.WifeZoneId1 = selectorList[1].ZoneId; req.WifeSelector1 = DataHelper.ObjectToBytes <RoleData4Selector>(selectorList[1]); req.ManRole2 = selectorList[2].RoleID; req.ManZoneId2 = selectorList[2].ZoneId; req.ManSelector2 = DataHelper.ObjectToBytes <RoleData4Selector>(selectorList[2]); req.WifeRole2 = selectorList[3].RoleID; req.WifeZoneId2 = selectorList[3].ZoneId; req.WifeSelector2 = DataHelper.ObjectToBytes <RoleData4Selector>(selectorList[3]); CoupleArenaPkResultRsp rsp = TianTiClient.getInstance().CoupleArenaPkResult(req); if (rsp == null) { return; } if (rsp.Couple1RetData != null) { if (rsp.Couple1RetData.Result != (int)ECoupleArenaPkResult.Invalid) { CoupleArenaZhanBaoSaveDbData saveData = new CoupleArenaZhanBaoSaveDbData(); saveData.FromMan = req.ManRole1; saveData.FromWife = req.WifeRole1; saveData.FirstWeekday = TimeUtil.MakeFirstWeekday(now); saveData.ZhanBao = new CoupleArenaZhanBaoItemData() { TargetManZoneId = req.ManZoneId2, TargetManRoleName = selectorList[2].RoleName, TargetWifeZoneId = req.WifeZoneId2, TargetWifeRoleName = selectorList[3].RoleName, IsWin = rsp.Couple1RetData.Result == (int)ECoupleArenaPkResult.Win, GetJiFen = rsp.Couple1RetData.GetJiFen }; Global.sendToDB <bool, CoupleArenaZhanBaoSaveDbData>((int)TCPGameServerCmds.CMD_COUPLE_ARENA_DB_SAVE_ZHAN_BAO, saveData, fubenData.RoleList[0].ServerId); } NtfAwardData(req.ManRole1, rsp.Couple1RetData); NtfAwardData(req.WifeRole1, rsp.Couple1RetData); } if (rsp.Couple2RetData != null) { if (rsp.Couple2RetData.Result != (int)ECoupleArenaPkResult.Invalid) { CoupleArenaZhanBaoSaveDbData saveData = new CoupleArenaZhanBaoSaveDbData(); saveData.FirstWeekday = TimeUtil.MakeFirstWeekday(now); saveData.FromMan = req.ManRole2; saveData.FromWife = req.WifeRole2; saveData.ZhanBao = new CoupleArenaZhanBaoItemData() { TargetManZoneId = req.ManZoneId1, TargetManRoleName = selectorList[0].RoleName, TargetWifeZoneId = req.WifeZoneId1, TargetWifeRoleName = selectorList[1].RoleName, IsWin = rsp.Couple2RetData.Result == (int)ECoupleArenaPkResult.Win, GetJiFen = rsp.Couple2RetData.GetJiFen }; Global.sendToDB <bool, CoupleArenaZhanBaoSaveDbData>((int)TCPGameServerCmds.CMD_COUPLE_ARENA_DB_SAVE_ZHAN_BAO, saveData, fubenData.RoleList[2].ServerId); } NtfAwardData(req.ManRole2, rsp.Couple2RetData); NtfAwardData(req.WifeRole2, rsp.Couple2RetData); } }
private void CheckRoleMatch(DateTime now) { lock (this.Mutex) { List <CoupleArenaJoinData> joinDatas = this.JoinDataUtil.GetJoinList(); if (joinDatas != null && joinDatas.Count > 0) { CoupleArenaJoinMatcher joinMatcher = new CoupleArenaJoinMatcher(); foreach (CoupleArenaJoinData joinData in joinDatas) { if ((now - joinData.StartTime).TotalSeconds >= 60.0 || joinData.ToKfServerId > 0) { this.JoinDataUtil.DelJoinData(joinData); } else if ((now - joinData.StartTime).TotalSeconds >= 30.0) { joinMatcher.AddGlobalJoinData(joinData); } else { joinMatcher.AddJoinData(joinData.DuanWeiType, joinData.DuanWeiLevel, joinData); } } foreach (List <CoupleArenaJoinData> list in joinMatcher.GetAllMatch()) { int i = 0; while (i < list.Count - 1) { CoupleArenaJoinData one = list[i]; CoupleArenaJoinData two = list[i + 1]; if (this.MatchTimeLimiter.GetMatchTimes(one.RoleId1, one.RoleId2, two.RoleId1, two.RoleId2) >= TianTiPersistence.Instance.MaxRolePairFightCount) { i++; } else { CoupleArenaFuBenData fubenData = new CoupleArenaFuBenData(); fubenData.GameId = this.Persistence.GetNextGameId(); fubenData.StartTime = now; fubenData.RoleList = new List <KuaFuFuBenRoleData>(); fubenData.RoleList.Add(new KuaFuFuBenRoleData { ServerId = one.ServerId, RoleId = one.RoleId1, Side = 1 }); fubenData.RoleList.Add(new KuaFuFuBenRoleData { ServerId = one.ServerId, RoleId = one.RoleId2, Side = 1 }); fubenData.RoleList.Add(new KuaFuFuBenRoleData { ServerId = two.ServerId, RoleId = two.RoleId1, Side = 2 }); fubenData.RoleList.Add(new KuaFuFuBenRoleData { ServerId = two.ServerId, RoleId = two.RoleId2, Side = 2 }); if (!ClientAgentManager.Instance().AssginKfFuben(this.GameType, fubenData.GameId, 4, out fubenData.KfServerId)) { LogManager.WriteLog(LogTypes.Error, "CoupleArena 没有跨服可以分配", null, true); return; } this.MatchTimeLimiter.AddMatchTimes(one.RoleId1, one.RoleId2, two.RoleId1, two.RoleId2, 1); this.GameFuBenDict[fubenData.GameId] = fubenData; i += 2; one.ToKfServerId = fubenData.KfServerId; two.ToKfServerId = fubenData.KfServerId; CoupleArenaCanEnterData enterData = new CoupleArenaCanEnterData { GameId = fubenData.GameId, KfServerId = fubenData.KfServerId, RoleId1 = one.RoleId1, RoleId2 = one.RoleId2 }; ClientAgentManager.Instance().PostAsyncEvent(one.ServerId, this.EvItemGameType, new AsyncDataItem(KuaFuEventTypes.CoupleArenaCanEnter, new object[] { enterData })); CoupleArenaCanEnterData enterData2 = new CoupleArenaCanEnterData { GameId = fubenData.GameId, KfServerId = fubenData.KfServerId, RoleId1 = two.RoleId1, RoleId2 = two.RoleId2 }; AsyncDataItem evItem2 = new AsyncDataItem(KuaFuEventTypes.CoupleArenaCanEnter, new object[] { fubenData.GameId, fubenData.KfServerId, two.RoleId1, two.RoleId2 }); ClientAgentManager.Instance().PostAsyncEvent(two.ServerId, this.EvItemGameType, new AsyncDataItem(KuaFuEventTypes.CoupleArenaCanEnter, new object[] { enterData2 })); } } } } } }