/// <summary> /// 队伍玩家掉线,剔除 /// </summary> /// <param name="request"></param> /// <param name="response"></param> /// <param name="peer"></param> /// <param name="sendParameters"></param> public void RemoveTeamRole(ClientPeer peer) { if (null == peer.m_myTeam) { return; } List <ClientPeer> pTeam = peer.m_myTeam.m_pTeam; if (null == pTeam) { return; } for (int k = 0; k < pTeam.Count; ++k) { ClientPeer curPeer = pTeam[k]; if (curPeer != peer) { EventData eventData = new EventData(); Dictionary <byte, object> dic = new Dictionary <byte, object>(); string strID = peer.m_curRole.Id.ToString(); dic.Add((byte)ParameterCode.SyncInfo, strID); eventData.Parameters = dic; // 返回操作码 eventData.Code = (byte)OperationCode.RemoveTeamRole; curPeer.SendEvent(eventData, new SendParameters()); Helper.Log(curPeer.m_curRole.Name + "--移除玩家:" + peer.m_curRole.Name); // 队伍中的其他Peer移除当前peer curPeer.m_myTeam.m_pTeam.Remove(peer); } } peer.m_myTeam.m_pTeam = null; }
// void SendMoveAnimationEvent(ClientPeer peer, OperationCode opCode, SubCode subCode, int roleid, Dictionary <byte, object> parameters) { EventData data = new EventData(); data.Parameters = parameters; ParameterTool.AddOperationcodeSubcodeRoleId(parameters, opCode, roleid); peer.SendEvent(data, new SendParameters()); }
//发送团队角色动画进行同步 public void SendMoveAnimationToPeer(ClientPeer peer, OperationCode opCode, SubCode subCode, int roleId, Dictionary <byte, object> parameters) { EventData data = new EventData(); data.Parameters = parameters; ParameterTool.AddEventToPeer(data.Parameters, opCode, subCode, roleId); peer.SendEvent(data, new SendParameters()); }
//发送团队角色位置和旋转进行同步 public void SendPositionAndRotationToPeer(ClientPeer peer, OperationCode opCode, SubCode subCode, int roleId, object position, object eulerAngles) { EventData data = new EventData(); data.Parameters = new Dictionary <byte, object>(); ParameterTool.AddEventToPeer(data.Parameters, opCode, subCode, roleId); ParameterTool.AddParameter(data.Parameters, ParameterCode.Position, position.ToString(), false); ParameterTool.AddParameter(data.Parameters, ParameterCode.EulerAngles, eulerAngles.ToString(), false); peer.SendEvent(data, new SendParameters()); }
//发送给客户端masterId public void SendMasterIdToPeer(ClientPeer peer, OperationCode opCode, SubCode subCode, int masterRoleId, List <Role> roleList) { EventData data = new EventData(); data.Parameters = new Dictionary <byte, object>(); ParameterTool.AddOperationCode(data.Parameters, opCode); ParameterTool.AddSubCode(data.Parameters, subCode); ParameterTool.AddParameter(data.Parameters, ParameterCode.MasterRoleId, masterRoleId, false); ParameterTool.AddParameter(data.Parameters, ParameterCode.RoleList, roleList); peer.SendEvent(data, new SendParameters()); }
//发起组队 void SendEventByPeer(ClientPeer peer, OperationCode opCode, SubCode subcode, List <Role> rolelist, int masterRoleID) { EventData eventData = new EventData(); eventData.Parameters = new Dictionary <byte, object>(); ParameterTool.AddParameter(eventData.Parameters, ParameterCode.OperationCode, opCode, false); ParameterTool.AddParameter(eventData.Parameters, ParameterCode.MasterRoleID, masterRoleID, false); ParameterTool.AddParameter(eventData.Parameters, ParameterCode.RoleList, rolelist); ParameterTool.AddSubCode(eventData.Parameters, subcode); peer.SendEvent(eventData, new SendParameters()); }
//向客户端发送同步的位置和旋转进行同步 void SendPositionAndRotation(ClientPeer peer, OperationCode opcode, SubCode subcode, int roleid, object objPos, object objEulerAngles) { EventData eventData = new EventData(); eventData.Parameters = new Dictionary <byte, object>(); ParameterTool.AddParameter(eventData.Parameters, ParameterCode.OperationCode, opcode, false); ParameterTool.AddParameter(eventData.Parameters, ParameterCode.SubCode, subcode, false); eventData.Parameters.Add((byte)ParameterCode.RoleID, roleid); eventData.Parameters.Add((byte)ParameterCode.Position, objPos.ToString()); eventData.Parameters.Add((byte)ParameterCode.EulerAngles, objEulerAngles.ToString()); peer.SendEvent(eventData, new SendParameters()); }
//向客户端发送 位置和旋转的数据 进行同步 void SendEventByPeer(ClientPeer peer, OperationCode opCode, SubCode subCode, int roleid, object posObj, object eulerAmglesObj) { EventData data = new EventData(); data.Parameters = new Dictionary <byte, object>(); ParameterTool.AddParmeter(data.Parameters, ParameterCode.OperationCode, opCode, false); ParameterTool.AddParmeter(data.Parameters, ParameterCode.SubCode, subCode, false); data.Parameters.Add((byte)ParameterCode.RoleId, roleid); data.Parameters.Add((byte)ParameterCode.Position, posObj.ToString()); data.Parameters.Add((byte)ParameterCode.EulerAngles, eulerAmglesObj); peer.SendEvent(data, new SendParameters()); }
/// <summary> /// 通知队伍中的角色创建怪物 /// </summary> public void SendCreateMonsterEvent(Dictionary <byte, object> _dic) { List <ClientPeer> pTeam = m_pTeamPeer; for (int k = 0; k < pTeam.Count; ++k) { ClientPeer curPeer = pTeam[k]; EventData eventData = new EventData(); eventData.Parameters = _dic; // 返回操作码 eventData.Code = (byte)OperationCode.CreateMonster; curPeer.SendEvent(eventData, new SendParameters()); Helper.Log(curPeer.m_curRole.Name + "--:创建怪物"); } }
/// <summary> /// 同步角色移动方向 /// </summary> /// <param name="request"></param> /// <param name="response"></param> /// <param name="peer"></param> /// <param name="sendParameters"></param> void SyncRoleMoveDir(OperationRequest request, OperationResponse response, ClientPeer peer, SendParameters sendParameters) { Dictionary <byte, object> m_dic = request.Parameters; object value; // 客户端传递过来的参数信息:角色ID,坐标:X,Y,Z if (m_dic.TryGetValue((byte)ParameterCode.SyncInfo, out value)) { string strValue = value.ToString(); //Helper.Log("同步角色移动方向:" + strValue); string[] pStr1 = strValue.Split(','); if (pStr1.Length == 4) { if (null == peer.m_myTeam) { return; } List <ClientPeer> pTeam = peer.m_myTeam.m_pTeam; if (pTeam == null) { return; } // 通知队伍中的其他Peer返回队伍角色信息给客户端 for (int k = 0; k < pTeam.Count; ++k) { ClientPeer curPeer = pTeam[k]; // 九宫格同步 bool bSync = Helper.IsSudoKu(peer.m_vCurPos, curPeer.m_vCurPos); if (curPeer != peer && bSync) { EventData eventData = new EventData(); eventData.Parameters = m_dic; // 返回操作码 eventData.Code = (byte)OperationCode.SyncMoveDir; curPeer.SendEvent(eventData, new SendParameters()); //Helper.Log(curPeer.m_curRole.Name + "--:同步:" + peer.m_curRole.Name + "-移动方向:" + strValue); } } } } }
void SendEventByPeer(ClientPeer peer, OperationCode opCode, SubCode subCode, List <Role> rolelList, int masterRoleId) { //OperationResponse response=new OperationResponse(); //response.Parameters=new Dictionary<byte, object>(); //ParameterTool.AddSubcode(response.Parameters,subCode); //ParameterTool.AddParmeter(response.Parameters,ParameterCode.RoleList,rolelList); //response.ReturnCode = (short) ReturnCode.GetTeam; //peer.SendOperationResponse(response, sendParameters); EventData eventData = new EventData(); eventData.Parameters = new Dictionary <byte, object>(); ParameterTool.AddParmeter(eventData.Parameters, ParameterCode.OperationCode, opCode, false); ParameterTool.AddSubcode(eventData.Parameters, subCode); ParameterTool.AddParmeter(eventData.Parameters, ParameterCode.RoleList, rolelList); ParameterTool.AddParmeter(eventData.Parameters, ParameterCode.MasterRoleId, masterRoleId, false); peer.SendEvent(eventData, new SendParameters()); }
public static void OnUpdateResource(ClientPeer peer) { TheLordServer.Log.InfoFormat("[OnUpdateResource] - {0}", peer.RemoteIPAddress); if (peer.userAgent.UserData == null || peer.userAgent.UserAssetData == null) { // 로그인 씬으로 return; } EventData data = new EventData((byte)EventCode.UpdateResource); var packet = new ProtoData.ResourceData( ); packet.gold = peer.userAgent.UserAssetData.Gold; packet.cash = peer.userAgent.UserAssetData.Cash; packet.index = peer.userAgent.UserAssetData.Index; packet.tier = peer.userAgent.UserAssetData.Tier; data.Parameters = BinSerializer.ConvertPacket(packet); peer.SendEvent(data, new SendParameters( )); }
public static void OnUpdateRaidBoss(ClientPeer peer, int index) { EventData eventData = new EventData((byte)EventCode.UpdateRaidBoss); var bossData = TheLordServer.Instance.bossDataList[0]; if (bossData == null) { TheLordServer.Log.Info("보스가 없습니다."); return; } var packet = new ProtoData.RaidBossData( ); packet.index = bossData.Index; packet.hp = (int)bossData.HP; eventData.Parameters = BinSerializer.ConvertPacket(packet); peer.SendEvent(eventData, new SendParameters( )); }
/// <summary> /// Monster巡航 /// </summary> /// <param name="_monster"></param> void MonsterBeginCruise(Monster _monster) { Monster curMonster = _monster; string strModelID = curMonster.m_strModelId; string strGuid = curMonster.m_strGuid; Dictionary <byte, object> dic = new Dictionary <byte, object>(); List <Vector3> pCruise = new List <Vector3>(); if (pCruise != null) { pCruise.Clear(); } dic.Clear(); if (m_dicCruiseGroup.TryGetValue(strModelID, out pCruise)) { List <ClientPeer> pTeam = m_pTeamPeer; string strRes; strRes = ""; int n = Helper.Random(0, pCruise.Count); Vector3 vTarget = pCruise[n]; curMonster.m_targetPos = vTarget; curMonster.m_ActionType = 2; // 返回信息:GUID,X,Y,Z strRes = strGuid + "," + vTarget.x.ToString() + "," + vTarget.y.ToString() + "," + vTarget.z.ToString(); dic.Add((byte)ParameterCode.monsterInfo, strRes); Helper.Log("随机数:" + n + "--巡航点类型:" + strModelID + "--随机坐标:" + Vector3.GetVector(vTarget)); for (int k = 0; k < pTeam.Count; ++k) { ClientPeer curPeer = pTeam[k]; EventData eventData = new EventData(); eventData.Parameters = dic; // 返回操作码 eventData.Code = (byte)OperationCode.MonsterCruise; curPeer.SendEvent(eventData, new SendParameters()); //Helper.Log(curPeer.m_curRole.Name + "--:"+m_pMonsterInfo[i].m_strModelId+"--:怪物移动:" + strRes); } } }
public static void OnUpdateRaidRanking(ClientPeer peer, RaidRankingData myRankingData, RaidRankingData lastHitRankingData, List <RaidRankingData> raidRankingDataList) { var packet = new ProtoData.RaidRankingData( ); if (myRankingData != null) { int ranking = raidRankingDataList.FindIndex(x => x.Equals(myRankingData)); packet.myRankingData = RaidRankingData2Proto(myRankingData); packet.myRankingData.ranking = ranking + 1; } if (lastHitRankingData != null) { int ranking = raidRankingDataList.FindIndex(x => x.Equals(lastHitRankingData)); packet.lastHitRankingData = RaidRankingData2Proto(lastHitRankingData); packet.lastHitRankingData.ranking = ranking + 1; } int cnt = 0; foreach (var rankingData in raidRankingDataList) { if (++cnt > 10) { break; } var data = RaidRankingData2Proto(rankingData); data.ranking = cnt; packet.rankingDataList.Add(data); } var current = GameUtility.Now( ) - TheLordServer.Instance.bossDataList[0].CreateTime; var total = GameThread.ThreadRaidBoss.bossRemainTime - current; packet.tick = total.Ticks; EventData eventData = new EventData((byte)EventCode.UpdateRaidRanking); eventData.Parameters = BinSerializer.ConvertPacket(packet); peer.SendEvent(eventData, new SendParameters( )); }
/// <summary> /// 通知队伍客户端,Monster位置信息 /// </summary> public void SyncMonsterPos(string _strGuid, Vector3 _v, byte _operationCode) { List <ClientPeer> pTeam = m_pTeamPeer; Dictionary <byte, object> dic = new Dictionary <byte, object>(); string strRes; strRes = ""; // 返回信息:GUID,X,Y,Z strRes = _strGuid + "," + _v.x.ToString() + "," + _v.y.ToString() + "," + _v.z.ToString(); dic.Add((byte)ParameterCode.monsterInfo, strRes); for (int k = 0; k < pTeam.Count; ++k) { ClientPeer curPeer = pTeam[k]; EventData eventData = new EventData(); eventData.Parameters = dic; // 返回操作码 eventData.Code = _operationCode; curPeer.SendEvent(eventData, new SendParameters()); Helper.Log("达到巡航目标点,同步坐标位置:" + strRes); } }
/// <summary> /// 同步角色移动位置 /// </summary> /// <param name="request"></param> /// <param name="response"></param> /// <param name="peer"></param> /// <param name="sendParameters"></param> void SyncRoleMove(OperationRequest request, OperationResponse response, ClientPeer peer, SendParameters sendParameters) { Dictionary <byte, object> m_dic = request.Parameters; object value; // 客户端传递过来的参数信息:角色ID,坐标:X,Y,Z Y轴旋转:_rY if (m_dic.TryGetValue((byte)ParameterCode.SyncInfo, out value)) { string strValue = value.ToString(); //Helper.Log("SyncRoleMove:" + strValue); string[] pStr1 = strValue.Split(','); if (pStr1.Length == 5) { // 保存角色位置信息 float x = float.Parse(pStr1[1]); float y = float.Parse(pStr1[2]); float z = float.Parse(pStr1[3]); peer.m_vCurPos.x = x; peer.m_vCurPos.y = y; peer.m_vCurPos.z = z; string strRes = pStr1[0]; for (int i = 1; i < 5; ++i) { strRes += "," + pStr1[i]; } m_dic.Clear(); m_dic.Add((byte)ParameterCode.SyncInfo, strRes); if (null == peer.m_myTeam) { return; } List <ClientPeer> pTeam = peer.m_myTeam.m_pTeam; if (pTeam == null) { return; } // 通知队伍中的其他Peer返回队伍角色信息给客户端 for (int k = 0; k < pTeam.Count; ++k) { ClientPeer curPeer = pTeam[k]; // 九宫格同步 bool bSync = Helper.IsSudoKu(peer.m_vCurPos, curPeer.m_vCurPos); if (curPeer != peer && bSync) { EventData eventData = new EventData(); eventData.Parameters = m_dic; // 返回操作码 eventData.Code = (byte)OperationCode.SyncMove; curPeer.SendEvent(eventData, new SendParameters()); float dis = Vector3.Distance(peer.m_vCurPos, curPeer.m_vCurPos); Helper.Log("角色1位置:" + peer.m_vCurPos.ToString() + "--角色2位置:" + curPeer.m_vCurPos.ToString() + "--:当前角色之间的距离:" + dis); //Helper.Log(curPeer.m_curRole.Name + "--:同步:" + peer.m_curRole.Name + "-移动位置信息:" + strRes); } } } } }
private void SendMoveAnimationEvent(ClientPeer peer,OperationCode opCode,SubCode subCode,int roleID,Dictionary<byte,object> parameters ) { EventData data = new EventData(); data.Parameters = parameters; ParameterTool.AddOperationcodeSubcodeRoleID(parameters,opCode,roleID); peer.SendEvent(data, new SendParameters()); }
private void SentEventByPeer(ClientPeer peer,OperationCode opCode, SubCode subcode,List<Role> rolelist,int masterRoleID) { //OperationResponse response = new OperationResponse(); //response.Parameters = new Dictionary<byte, object>(); //ParameterTool.AddSubCode(response.Parameters,subcode); //ParameterTool.AddParameter(response.Parameters,ParameterCode.RoleList, rolelist); //response.ReturnCode = (short) ReturnCode.GetTeam; //peer.SendOperationResponse(response, sendParameters); EventData eventData = new EventData(); eventData.Parameters = new Dictionary<byte, object>(); ParameterTool.AddParameter(eventData.Parameters,ParameterCode.OperationCode,opCode,false); ParameterTool.AddSubCode(eventData.Parameters,subcode); ParameterTool.AddParameter(eventData.Parameters,ParameterCode.RoleList,rolelist); ParameterTool.AddParameter(eventData.Parameters,ParameterCode.MasterRoleID, masterRoleID,false); peer.SendEvent(eventData,new SendParameters()); }
/// <summary> /// 申请组队,返回队伍信息 /// </summary> /// <param name="request"></param> /// <param name="response"></param> /// <param name="peer"></param> /// <param name="sendParameters"></param> void OnBattleTeam(OperationRequest request, OperationResponse response, ClientPeer peer, SendParameters sendParameters) { Dictionary <byte, object> dicPara = request.Parameters; object value; if (dicPara.TryGetValue((byte)ParameterCode.BattleInfo, out value)) { // 申请进入的副本ID peer.m_strRoomID = value.ToString(); } if (DataManager.Instance != null) { // 获取副本中角色出生点位置 peer.m_pRoleSpawn = DataManager.Instance.GetRoomSpawn(peer.m_strRoomID); } List <ClientPeer> pAllPeer = MyGameApplication.MyInstance.GetTeam(peer.m_strRoomID); if (pAllPeer != null) { // 满足队伍请求:创建一个Team,把队伍中角色信息返回给客户端 int nLenth = pAllPeer.Count; // 队伍中只能取两个 if (nLenth > 2) { nLenth = 2; } List <ClientPeer> pTeam = new List <ClientPeer>(); for (int i = 0; i < nLenth; ++i) { pTeam.Add(pAllPeer[i]); // 组队成功,移除Peer MyGameApplication.MyInstance.RemovePeer(pAllPeer[i].m_strRoomID, pAllPeer[i]); } // 把当前的Peer加入进去 pTeam.Add(peer); m_Team = new BattleTeam(pTeam); //排序 pTeam.Sort(SortTeamRole); // 返回队伍中角色信息:所有peer都应该返回角色信息 // 当前Peer返回给对应客户端角色信息 string strRes = ""; for (int j = 0; j < pTeam.Count; ++j) { Role curRole = pTeam[j].m_curRole; strRes += curRole.Id + "," + curRole.Name + "," + curRole.Lv + "," + curRole.IsMan + "," + curRole.Occup + "," + curRole.User.Id + "," + curRole.Server.ID + "," + (j + 1).ToString() + "|"; // 初始化角色出生点位置 if (peer.m_pRoleSpawn != null && 3 == peer.m_pRoleSpawn.Count) { RoleSpawn curSpawn = peer.m_pRoleSpawn[j]; Vector3 curPos = new Vector3(curSpawn.m_fX, curSpawn.m_fY, curSpawn.m_fZ); pTeam[j].m_vCurPos = curPos; } } Dictionary <byte, object> dic = new Dictionary <byte, object>(); dic.Add((byte)ParameterCode.BattleInfo, strRes); response.ReturnCode = (short)ReturnCode.GotTeam; response.Parameters = dic; // 通知队伍中的其他Peer返回队伍角色信息给客户端 for (int k = 0; k < pTeam.Count; ++k) { ClientPeer curPeer = pTeam[k]; if (curPeer != peer) { // 不能用这个方法:这个方法只有是在客户端往服务器发送请求的时候一对一的匹配返回,不能服务器自动发起 //curPeer.SendOperationResponse(response, sendParameters); // 可以用EventData代替,这个方法回调客户端的:OnEvent()方法 EventData eventData = new EventData(); eventData.Parameters = dic; // 返回操作码 eventData.Code = (byte)OperationCode.ForTeam; curPeer.SendEvent(eventData, new SendParameters()); Helper.Log(curPeer.m_curRole.Name + ":返回队伍信息:" + strRes); } } } else // 找不到组队队友,等待 { // 加入副本对应的队伍申请列表 MyGameApplication.MyInstance.AddTeam(peer.m_strRoomID, peer); response.ReturnCode = (short)ReturnCode.Waitting; Helper.Log(peer.m_curRole.Name + ":等待队伍信息......"); } }
//向客户端发送位置和旋转的数据 进行同步 private void SendEventByPeer(ClientPeer peer,OperationCode opCode,SubCode subCode,int roleId,object posObj,object eulerAnglesObj) { EventData data = new EventData(); data.Parameters = new Dictionary<byte, object>(); ParameterTool.AddParameter(data.Parameters,ParameterCode.OperationCode, opCode,false); ParameterTool.AddParameter(data.Parameters,ParameterCode.SubCode, subCode,false); data.Parameters.Add((byte) ParameterCode.RoleID,roleId); data.Parameters.Add((byte) ParameterCode.Position,posObj.ToString()); data.Parameters.Add((byte) ParameterCode.EulerAngle,eulerAnglesObj.ToString()); peer.SendEvent(data, new SendParameters()); }