public bool ProcessKuaFuBossEnterCmd(GameClient client, int nID, byte[] bytes, string[] cmdParams) { try { KuaFuBossSceneInfo sceneItem = null; KuaFuBossGameStates state = KuaFuBossGameStates.None; int result = StdErrorCode.Error_Success_No_Info; if (!CheckMap(client)) { result = StdErrorCode.Error_Denied_In_Current_Map; } else { result = CheckCondition(client, ref sceneItem, ref state); } if (state == KuaFuBossGameStates.Start) { KuaFuServerLoginData kuaFuServerLoginData = null; lock (RuntimeData.Mutex) { if (RuntimeData.RoleIdKuaFuLoginDataDict.TryGetValue(client.ClientData.RoleID, out kuaFuServerLoginData)) { KuaFuServerLoginData clientKuaFuServerLoginData = Global.GetClientKuaFuServerLoginData(client); if (null != clientKuaFuServerLoginData) { clientKuaFuServerLoginData.RoleId = kuaFuServerLoginData.RoleId; clientKuaFuServerLoginData.GameId = kuaFuServerLoginData.GameId; clientKuaFuServerLoginData.GameType = kuaFuServerLoginData.GameType; clientKuaFuServerLoginData.EndTicks = kuaFuServerLoginData.EndTicks; clientKuaFuServerLoginData.ServerId = kuaFuServerLoginData.ServerId; clientKuaFuServerLoginData.ServerIp = kuaFuServerLoginData.ServerIp; clientKuaFuServerLoginData.ServerPort = kuaFuServerLoginData.ServerPort; clientKuaFuServerLoginData.FuBenSeqId = kuaFuServerLoginData.FuBenSeqId; } } else { result = StdErrorCode.Error_Server_Busy; } } if (result >= 0) { result = YongZheZhanChangClient.getInstance().ChangeRoleState(client.ClientData.RoleID, KuaFuRoleStates.EnterGame); if (result >= 0) { GlobalNew.RecordSwitchKuaFuServerLog(client); client.sendCmd((int)TCPGameServerCmds.CMD_SPR_KF_SWITCH_SERVER, Global.GetClientKuaFuServerLoginData(client)); } else { Global.GetClientKuaFuServerLoginData(client).RoleId = 0; } } } else { result = StdErrorCode.Error_Not_In_valid_Time; } client.sendCmd(nID, result); return(true); } catch (Exception ex) { DataHelper.WriteFormatExceptionLog(ex, Global.GetDebugHelperInfo(client.ClientSocket), false); } return(false); }
private void TimerProc(object sender, EventArgs e) { bool notifyPrepareGame = false; bool notifyEnterGame = false; DateTime now = TimeUtil.NowDateTime(); lock (RuntimeData.Mutex) { bool bInActiveTime = false; KuaFuBossSceneInfo sceneItem = RuntimeData.SceneDataDict.Values.FirstOrDefault(); for (int i = 0; i < sceneItem.TimePoints.Count - 1; i += 2) { if ((int)now.DayOfWeek == sceneItem.TimePoints[i].Days && now.TimeOfDay.TotalSeconds >= sceneItem.SecondsOfDay[i] - sceneItem.SignUpStartSecs && now.TimeOfDay.TotalSeconds <= sceneItem.SecondsOfDay[i + 1]) { double secs = sceneItem.SecondsOfDay[i] - now.TimeOfDay.TotalSeconds; bInActiveTime = true; if (!RuntimeData.PrepareGame) { if (secs > 0 && secs < sceneItem.SignUpEndSecs / 2) { LogManager.WriteLog(LogTypes.Error, "报名截止5分钟时间过半,通知跨服中心开始分配所有报名玩家的活动场次"); // 通知跨服中心开始准备副本 RuntimeData.PrepareGame = true; notifyPrepareGame = true; break; } } else { if (secs < 0) { LogManager.WriteLog(LogTypes.Error, "报名截止状态结束,可以通知已分配到场次的玩家进入游戏了"); // 首次到达进入时间,通知进入,并重置PrepareGame状态,然后以后的循环走上面的if // 但是上面的if在本次活动期间就相当于空转 notifyEnterGame = true; RuntimeData.PrepareGame = false; break; } } } } if (!bInActiveTime) { if (RuntimeData.RoleIdKuaFuLoginDataDict.Count > 0) { RuntimeData.RoleIdKuaFuLoginDataDict.Clear(); } if (RuntimeData.RoleId2JoinGroup.Count > 0) { RuntimeData.RoleId2JoinGroup.Clear(); } } } if (notifyPrepareGame) { LogManager.WriteLog(LogTypes.Error, "通知跨服中心开始分配所有报名玩家的活动场次"); // GameServer和KF-GameServer都会通知准备游戏,所以中心要防止状态回滚 string cmd = string.Format("{0} {1} {2}", GameStates.CommandName, GameStates.PrepareGame, (int)GameTypes.KuaFuBoss); YongZheZhanChangClient.getInstance().ExecuteCommand(cmd); } if (notifyEnterGame) { lock (RuntimeData.Mutex) { foreach (var kuaFuServerLoginData in RuntimeData.RoleIdKuaFuLoginDataDict.Values) { RuntimeData.NotifyRoleEnterDict.Add(kuaFuServerLoginData.RoleId, kuaFuServerLoginData); } } } //通知报名的玩家进入活动,每次只通知一部分(按RoleID除以15的余数),防止所有玩家一起进入给服务器造成压力. List <KuaFuServerLoginData> list = null; lock (RuntimeData.Mutex) { int count = RuntimeData.NotifyRoleEnterDict.Count; if (count > 0) { list = new List <KuaFuServerLoginData>(); KuaFuServerLoginData kuaFuServerLoginData = RuntimeData.NotifyRoleEnterDict.First().Value; foreach (var kv in RuntimeData.NotifyRoleEnterDict) { if ((kv.Key % 15) == (kuaFuServerLoginData.RoleId % 15)) { list.Add(kv.Value); } } foreach (var data in list) { RuntimeData.NotifyRoleEnterDict.Remove(data.RoleId); } } } if (null != list) { foreach (var kuaFuServerLoginData in list) { GameClient client = GameManager.ClientMgr.FindClient(kuaFuServerLoginData.RoleId); if (null != client) { client.sendCmd((int)TCPGameServerCmds.CMD_SPR_KUAFU_BOSS_ENTER, 1); } } } }
public bool ProcessKuaFuMapEnterCmd(GameClient client, int nID, byte[] bytes, string[] cmdParams) { try { int result = 0; int toMapCode = Global.SafeConvertToInt32(cmdParams[0]); int line = Global.SafeConvertToInt32(cmdParams[1]); int toBoss = 0; int teleportId = 0; if (cmdParams.Length >= 3) { toBoss = Global.SafeConvertToInt32(cmdParams[2]); } if (cmdParams.Length >= 4) { teleportId = Global.SafeConvertToInt32(cmdParams[3]); } KuaFuLineData kuaFuLineData; if (!KuaFuMapManager.getInstance().IsKuaFuMap(toMapCode)) { result = -12; } else if (!this.RuntimeData.LineMap2KuaFuLineDataDict.TryGetValue(new IntPairKey(line, toMapCode), out kuaFuLineData)) { result = -12; } else if (!Global.CanEnterMap(client, toMapCode) || (toMapCode == client.ClientData.MapCode && kuaFuLineData.MapType != 1)) { result = -12; } else { if (toMapCode == client.ClientData.MapCode && kuaFuLineData.MapType == 1) { List <KuaFuLineData> list = KuaFuWorldClient.getInstance().GetKuaFuLineDataList(toMapCode) as List <KuaFuLineData>; if (null == list) { result = -12; goto IL_67F; } KuaFuLineData currentLineData = list.Find((KuaFuLineData x) => x.ServerId == GameManager.KuaFuServerId); if (currentLineData != null && currentLineData.Line == kuaFuLineData.Line) { result = -4011; goto IL_67F; } } if (!KuaFuMapManager.getInstance().IsKuaFuMap(client.ClientData.MapCode) && !this.CheckMap(client)) { result = -21; } else if (!this.IsGongNengOpened(client, false)) { result = -12; } else if (kuaFuLineData.OnlineCount >= kuaFuLineData.MaxOnlineCount) { result = -100; } else { int fromMapCode = client.ClientData.MapCode; if (teleportId > 0) { GameMap fromGameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(fromMapCode, out fromGameMap)) { result = -3; goto IL_67F; } MapTeleport mapTeleport = null; if (!fromGameMap.MapTeleportDict.TryGetValue(teleportId, out mapTeleport) || mapTeleport.ToMapID != toMapCode) { result = -12; goto IL_67F; } if (Global.GetTwoPointDistance(client.CurrentPos, new Point((double)mapTeleport.X, (double)mapTeleport.Y)) > 800.0) { result = -301; goto IL_67F; } } KuaFuServerLoginData kuaFuServerLoginData = Global.GetClientKuaFuServerLoginData(client); int kuaFuServerId; if (kuaFuLineData.MapType == 1) { if (!GlobalNew.IsGongNengOpened(client, GongNengIDs.Reborn, true)) { result = -400; goto IL_67F; } string signToken; string signKey; int rt = KuaFuWorldClient.getInstance().EnterPTKuaFuMap(client.ServerId, client.ClientData.LocalRoleID, client.ClientData.ServerPTID, kuaFuLineData.MapCode, kuaFuLineData.Line, kuaFuServerLoginData, out signToken, out signKey); if (rt == -4010) { KuaFuWorldRoleData kuaFuWorldRoleData = new KuaFuWorldRoleData { LocalRoleID = client.ClientData.LocalRoleID, UserID = client.strUserID, WorldRoleID = client.ClientData.WorldRoleID, Channel = client.ClientData.Channel, PTID = client.ClientData.ServerPTID, ServerID = client.ServerId, ZoneID = client.ClientData.ZoneID }; rt = KuaFuWorldClient.getInstance().RegPTKuaFuRoleData(ref kuaFuWorldRoleData); rt = KuaFuWorldClient.getInstance().EnterPTKuaFuMap(client.ServerId, client.ClientData.LocalRoleID, client.ClientData.ServerPTID, kuaFuLineData.MapCode, kuaFuLineData.Line, kuaFuServerLoginData, out signToken, out signKey); } if (rt < 0) { result = rt; goto IL_67F; } KFRebornRoleData rebornRoleData = KuaFuWorldClient.getInstance().Reborn_GetRebornRoleData(client.ClientData.ServerPTID, client.ClientData.LocalRoleID); if (null == rebornRoleData) { result = KuaFuWorldClient.getInstance().Reborn_RoleReborn(client.ClientData.ServerPTID, client.ClientData.LocalRoleID, client.ClientData.RoleName, client.ClientData.RebornLevel); if (result < 0) { goto IL_67F; } LogManager.WriteLog(LogTypes.Analysis, string.Format("Reborn_RoleReborn ptId={0} roleId={1} roleName={2} rebornLevel={3}", new object[] { client.ClientData.ServerPTID, client.ClientData.LocalRoleID, client.ClientData.RoleName, client.ClientData.RebornLevel }), null, true); } kuaFuServerLoginData.PTID = client.ClientData.ServerPTID; kuaFuServerLoginData.RoleId = client.ClientData.LocalRoleID; kuaFuServerLoginData.SignToken = signToken; kuaFuServerLoginData.TempRoleID = rt; kuaFuServerLoginData.SignCode = MD5Helper.get_md5_string(kuaFuServerLoginData.SignDataString() + signKey).ToLower(); kuaFuServerId = kuaFuServerLoginData.TargetServerID; } else { kuaFuServerLoginData.SignCode = null; kuaFuServerId = YongZheZhanChangClient.getInstance().EnterKuaFuMap(client.ClientData.LocalRoleID, kuaFuLineData.MapCode, kuaFuLineData.Line, client.ServerId, Global.GetClientKuaFuServerLoginData(client)); } kuaFuServerLoginData.Line = line; if (kuaFuServerId > 0) { bool flag = 0 == 0; int needMoney = (teleportId > 0) ? 0 : Global.GetMapTransNeedMoney(toMapCode); if (Global.GetTotalBindTongQianAndTongQianVal(client) < needMoney) { GameManager.ClientMgr.NotifyImportantMsg(client, StringUtil.substitute(GLang.GetLang(171, new object[0]), new object[] { needMoney, Global.GetMapName(toMapCode) }), GameInfoTypeIndexes.Error, ShowGameInfoTypes.ErrAndBox, 27); result = -9; Global.GetClientKuaFuServerLoginData(client).RoleId = 0; } else { int[] enterFlags = new int[5]; enterFlags[0] = fromMapCode; enterFlags[1] = teleportId; enterFlags[2] = toBoss; Global.SaveRoleParamsIntListToDB(client, new List <int>(enterFlags), "EnterKuaFuMapFlag", true); GlobalNew.RecordSwitchKuaFuServerLog(client); client.sendCmd <KuaFuServerLoginData>(14000, Global.GetClientKuaFuServerLoginData(client), false); } } else { Global.GetClientKuaFuServerLoginData(client).RoleId = 0; result = kuaFuServerId; } } } IL_67F: client.sendCmd <int>(nID, result, false); return(true); } catch (Exception ex) { DataHelper.WriteFormatExceptionLog(ex, Global.GetDebugHelperInfo(client.ClientSocket), false, false); } return(false); }
/// <summary> /// 处理事件 /// </summary> public void processEvent(EventObjectEx eventObject) { int eventType = eventObject.EventType; switch (eventType) { case (int)GlobalEventTypes.KuaFuRoleCountChange: { KuaFuFuBenRoleCountEvent e = eventObject as KuaFuFuBenRoleCountEvent; if (null != e) { GameClient client = GameManager.ClientMgr.FindClient(e.RoleId); if (null != client) { client.sendCmd((int)TCPGameServerCmds.CMD_SPR_ELEMENT_WAR_PLAYER_NUM, e.RoleCount); } eventObject.Handled = true; } } break; case (int)GlobalEventTypes.KuaFuNotifyEnterGame: { KuaFuNotifyEnterGameEvent e = eventObject as KuaFuNotifyEnterGameEvent; if (null != e) { KuaFuServerLoginData kuaFuServerLoginData = e.Arg as KuaFuServerLoginData; if (null != kuaFuServerLoginData) { GameClient client = GameManager.ClientMgr.FindClient(kuaFuServerLoginData.RoleId); if (null != client) { KuaFuServerLoginData clientKuaFuServerLoginData = Global.GetClientKuaFuServerLoginData(client); if (null != clientKuaFuServerLoginData) { clientKuaFuServerLoginData.RoleId = kuaFuServerLoginData.RoleId; clientKuaFuServerLoginData.GameId = kuaFuServerLoginData.GameId; clientKuaFuServerLoginData.GameType = kuaFuServerLoginData.GameType; clientKuaFuServerLoginData.EndTicks = kuaFuServerLoginData.EndTicks; clientKuaFuServerLoginData.ServerId = kuaFuServerLoginData.ServerId; clientKuaFuServerLoginData.ServerIp = kuaFuServerLoginData.ServerIp; clientKuaFuServerLoginData.ServerPort = kuaFuServerLoginData.ServerPort; clientKuaFuServerLoginData.FuBenSeqId = kuaFuServerLoginData.FuBenSeqId; client.sendCmd((int)TCPGameServerCmds.CMD_SPR_ELEMENT_WAR_ENTER, string.Format("{0}:{1}", kuaFuServerLoginData.GameId, e.TeamCombatAvg)); //ProcessEnterCmd(client, (int)TCPGameServerCmds.CMD_SPR_ELEMENT_WAR_ENTER, null, new string[] { "", "1" }); } } } eventObject.Handled = true; } } break; case (int)GlobalEventTypes.KuaFuCopyCanceled: { KuaFuNotifyCopyCancelEvent e = eventObject as KuaFuNotifyCopyCancelEvent; GameClient client = GameManager.ClientMgr.FindClient(e.RoleId); if (client != null) { client.ClientData.SignUpGameType = (int)GameTypes.None; // ElementWarClient.getInstance().RoleChangeState(e.RoleId, KuaFuRoleStates.None); client.sendCmd((int)TCPGameServerCmds.CMD_SPR_ELEMENT_WAR_CANCEL, string.Format("{0}:{1}", e.GameId, e.Reason)); } eventObject.Handled = true; } break; case (int)GlobalEventTypes.KuaFuNotifyRealEnterGame: { KuaFuNotifyRealEnterGameEvent e = eventObject as KuaFuNotifyRealEnterGameEvent; if (e != null) { GameClient client = GameManager.ClientMgr.FindClient(e.RoleId); if (client != null) { client.ClientData.SignUpGameType = (int)GameTypes.None; GlobalNew.RecordSwitchKuaFuServerLog(client); client.sendCmd((int)TCPGameServerCmds.CMD_SPR_KF_SWITCH_SERVER, Global.GetClientKuaFuServerLoginData(client)); } } eventObject.Handled = true; } break; } }
public int EnterPTKuaFuMap(int roleSourceServerId, int roleId, int ptid, int mapCode, int kuaFuLine, KuaFuServerLoginData kuaFuServerLoginData, out string signToken, out string signKey) { signToken = null; signKey = null; int tempRoleID = -11000; int kuaFuServerID = 0; IKuaFuWorld kuaFuService = this.GetKuaFuService(false); if (null != kuaFuService) { try { string[] ips; int[] ports; tempRoleID = kuaFuService.EnterPTKuaFuMap(roleSourceServerId, roleId, ptid, mapCode, kuaFuLine, out signToken, out signKey, out kuaFuServerID, out ips, out ports); if (tempRoleID <= 0) { return(tempRoleID); } kuaFuServerLoginData.RoleId = roleId; kuaFuServerLoginData.ServerId = (KuaFuManager.KuaFuWorldKuaFuGameServer ? roleSourceServerId : GameManager.KuaFuServerId); kuaFuServerLoginData.GameType = 32; kuaFuServerLoginData.GameId = (long)mapCode; kuaFuServerLoginData.EndTicks = TimeUtil.UTCTicks(); kuaFuServerLoginData.TargetServerID = kuaFuServerID; KuaFuServerInfo kuaFuServerInfo; if (ips != null && ports != null) { kuaFuServerLoginData.ServerIp = ips[0]; kuaFuServerLoginData.ServerPort = ports[0]; } else if (KuaFuManager.getInstance().TryGetValue(kuaFuServerID, out kuaFuServerInfo)) { kuaFuServerLoginData.ServerIp = kuaFuServerInfo.Ip; kuaFuServerLoginData.ServerPort = kuaFuServerInfo.Port; } } catch (Exception ex) { this.ResetKuaFuService(); } } return(tempRoleID); }
public void EventCallBackHandler(int eventType, params object[] args) { try { switch (eventType) { case (int)KuaFuEventTypes.NotifyWaitingRoleCount: { if (args.Length == 2) { int rid = (int)args[0]; int count = (int)args[1]; CoreInterface.GetEventSourceInterface().fireEvent(new KuaFuFuBenRoleCountEvent(rid, count), SceneType); } } break; case (int)KuaFuEventTypes.RoleSignUp: case (int)KuaFuEventTypes.RoleStateChange: { if (args.Length == 1) { KuaFuRoleData kuaFuRoleData = args[0] as KuaFuRoleData; if (null != kuaFuRoleData) { UpdateRoleData(kuaFuRoleData, kuaFuRoleData.RoleId); } } } break; case (int)KuaFuEventTypes.UpdateAndNotifyEnterGame: { if (args.Length == 1) { KuaFuRoleData kuaFuRoleData = args[0] as KuaFuRoleData; if (null != kuaFuRoleData) { UpdateRoleData(kuaFuRoleData, kuaFuRoleData.RoleId); HuanYingSiYuanFuBenData huanYingSiYuanFuBenData = GetKuaFuFuBenData(kuaFuRoleData.GameId); if (null != huanYingSiYuanFuBenData && huanYingSiYuanFuBenData.State == GameFuBenState.Start) { KuaFuServerLoginData kuaFuServerLoginData = new KuaFuServerLoginData() { RoleId = kuaFuRoleData.RoleId, GameType = kuaFuRoleData.GameType, GameId = kuaFuRoleData.GameId, EndTicks = kuaFuRoleData.StateEndTicks, }; kuaFuServerLoginData.ServerId = ClientInfo.ServerId; lock (Mutex) { KuaFuServerInfo kuaFuServerInfo; if (ServerIdServerInfoDict.TryGetValue(huanYingSiYuanFuBenData.ServerId, out kuaFuServerInfo)) { kuaFuServerLoginData.ServerIp = kuaFuServerInfo.Ip; kuaFuServerLoginData.ServerPort = kuaFuServerInfo.Port; } } CoreInterface.GetEventSourceInterface().fireEvent(new KuaFuNotifyEnterGameEvent(kuaFuServerLoginData), SceneType); } } } } break; } } catch (Exception ex) { LogManager.WriteExceptionUseCache(ex.ToString()); } }