protected override async ETTask Run(MapUnit mapUnit, C2M_TeamLeave message, Action <M2C_TeamLeave> reply) { await ETTask.CompletedTask; M2C_TeamLeave response = new M2C_TeamLeave(); try { //判斷房間是否合法 Room room = mapUnit.Room; if (room == null) { response.Error = ErrorCode.ERR_RoomIdNotFound; reply(response); return; } if (room.Type != RoomType.Team) { response.Error = ErrorCode.ERR_RoonTypeError; reply(response); return; } var roomTeamComponent = room.GetComponent <RoomTeamComponent>(); if (roomTeamComponent == null) { response.Error = ErrorCode.ERR_RoomTeamComponentNull; reply(response); return; } //刪除MapUnit訊息 M2C_MapUnitDestroy m2C_MapUnitDestroy = new M2C_MapUnitDestroy(); m2C_MapUnitDestroy.MapUnitId = mapUnit.Id; //廣播刪除MapUnit訊息(不包含自己) List <MapUnit> broadcastMapUnits = new List <MapUnit>(); broadcastMapUnits.AddRange(room.GetAll()); for (int i = 0; i < broadcastMapUnits.Count; i++) { //過濾自己 if (broadcastMapUnits[i].Uid == mapUnit.Uid) { broadcastMapUnits.RemoveAt(i); break; } } MapMessageHelper.BroadcastTarget(m2C_MapUnitDestroy, broadcastMapUnits); //對全體廣播離開組隊訊息(不包含自己) M2C_TeamModifyMember m2c_TeamModifyMember = new M2C_TeamModifyMember(); m2c_TeamModifyMember.Uid = mapUnit.Uid; MapMessageHelper.BroadcastTarget(m2c_TeamModifyMember, broadcastMapUnits); //廣播給自己失去房間 M2C_TeamLose m2c_TeamLose = new M2C_TeamLose(); m2c_TeamLose.LoseType = TeamLoseType.Other; MapMessageHelper.BroadcastTarget(m2c_TeamLose, mapUnit); bool isLeader = mapUnit.Uid == roomTeamComponent.Data.LeaderUid; //對全體廣播更換隊長(不包含自己) if (isLeader) { M2C_TeamModifyData m2c_TeamModifyData = new M2C_TeamModifyData(); m2c_TeamModifyData.Data = roomTeamComponent.Data; MapMessageHelper.BroadcastTarget(m2c_TeamModifyData, broadcastMapUnits); } //Player移除mapUnitId var proxy = Game.Scene.GetComponent <CacheProxyComponent>(); var playerSync = proxy.GetMemorySyncSolver <Player>(); var player = playerSync.Get <Player>(mapUnit.Uid); player?.LeaveRoom(); await playerSync.Update(player); //先Response才釋放mapUnit reply(response); //中斷指定玩家與Map的連接 mapUnit.GetComponent <MapUnitGateComponent>().IsDisconnect = true; Game.Scene.GetComponent <MapUnitComponent>().Remove(mapUnit.Id); } catch (Exception e) { ReplyError(response, e, reply); } }
protected override void Run(MapUnit mapUnit, G2M_SessionDisconnect message) { //先Player離開地圖再移除mapUnit var proxy = Game.Scene.GetComponent <CacheProxyComponent>(); var playerSync = proxy.GetMemorySyncSolver <Player>(); var player = playerSync.Get <Player>(mapUnit.Uid); player?.LeaveRoom(); Room room = mapUnit.Room; if (room != null) { RoomTeamComponent roomTeamComponent = room.GetComponent <RoomTeamComponent>(); //刪除MapUnit M2C_MapUnitDestroy m2C_MapUnitDestroy = new M2C_MapUnitDestroy(); m2C_MapUnitDestroy.MapUnitId = mapUnit.Id; //製作廣播列表 List <MapUnit> broadcastMapUnits = new List <MapUnit>(); broadcastMapUnits.AddRange(room.GetAll()); for (int i = 0; i < broadcastMapUnits.Count; i++) { //過濾自己 if (broadcastMapUnits[i].Uid == mapUnit.Uid) { broadcastMapUnits.RemoveAt(i); break; } } MapMessageHelper.BroadcastTarget(m2C_MapUnitDestroy, broadcastMapUnits); switch (room.Type) { case RoomType.Roaming: { } break; case RoomType.Team: { //廣播成員異動訊息 M2C_TeamModifyMember m2c_TeamModifyMember = new M2C_TeamModifyMember(); m2c_TeamModifyMember.Uid = mapUnit.Uid; MapMessageHelper.BroadcastTarget(m2c_TeamModifyMember, broadcastMapUnits); //判斷自身是否為隊長 bool isLeader = mapUnit.Uid == roomTeamComponent.Data.LeaderUid; //廣播替換隊長訊息 if (isLeader) { M2C_TeamModifyData m2c_TeamModifyData = new M2C_TeamModifyData(); m2c_TeamModifyData.Data = roomTeamComponent.Data; MapMessageHelper.BroadcastTarget(m2c_TeamModifyData, broadcastMapUnits); } } break; } } //中斷指定玩家與Map的連接 mapUnit.GetComponent <MapUnitGateComponent>().IsDisconnect = true; Game.Scene.GetComponent <MapUnitComponent>().Remove(mapUnit.Id); }
protected override async void Run(Session session, L2M_RoamingLeave message, Action <M2L_RoamingLeave> reply) { M2L_RoamingLeave response = new M2L_RoamingLeave(); try { var mapUnitComponent = Game.Scene.GetComponent <MapUnitComponent>(); MapUnit mapUnit = mapUnitComponent.GetByUid(message.Uid); // 判斷MapUnit是否存在在該Map上 if (mapUnit == null) { response.Error = ErrorCode.ERR_MapUnitMissing; reply(response); return; } //判斷房間是否合法 Room room = mapUnit.Room; if (room == null) { response.Error = ErrorCode.ERR_RoomIdNotFound; reply(response); return; } if (room.Type != RoomType.Roaming) { response.Error = ErrorCode.ERR_RoonTypeError; reply(response); return; } //刪除MapUnit訊息 M2C_MapUnitDestroy m2C_MapUnitDestroy = new M2C_MapUnitDestroy(); m2C_MapUnitDestroy.MapUnitId = mapUnit.Id; //廣播刪除MapUnit訊息(不包含自己) List <MapUnit> broadcastMapUnits = new List <MapUnit>(); broadcastMapUnits.AddRange(room.GetAll()); for (int i = 0; i < broadcastMapUnits.Count; i++) { //過濾自己 if (broadcastMapUnits[i].Uid == mapUnit.Uid) { broadcastMapUnits.RemoveAt(i); break; } } MapMessageHelper.BroadcastTarget(m2C_MapUnitDestroy, broadcastMapUnits); //Player移除mapUnitId var proxy = Game.Scene.GetComponent <CacheProxyComponent>(); var playerSync = proxy.GetMemorySyncSolver <Player>(); var player = playerSync.Get <Player>(mapUnit.Uid); player?.LeaveRoom(); await playerSync.Update(player); //先Response才釋放mapUnit reply(response); //中斷指定玩家與Map的連接 mapUnit.GetComponent <MapUnitGateComponent>().IsDisconnect = true; Game.Scene.GetComponent <MapUnitComponent>().Remove(mapUnit.Id); } catch (Exception e) { ReplyError(response, e, reply); } }
private void RunAsync(MapUnit mapUnit, L2M_SessionDisconnect message) { try { Room room = mapUnit.Room; if (room != null) { RoomTeamComponent roomTeamComponent = room.GetComponent <RoomTeamComponent>(); // 刪除MapUnit M2C_MapUnitDestroy m2C_MapUnitDestroy = new M2C_MapUnitDestroy(); m2C_MapUnitDestroy.MapUnitId = mapUnit.Id; // 製作廣播列表 List <MapUnit> broadcastMapUnits = new List <MapUnit>(); broadcastMapUnits.AddRange(room.GetAll()); for (int i = 0; i < broadcastMapUnits.Count; i++) { // 過濾自己 if (broadcastMapUnits[i].Uid == mapUnit.Uid) { broadcastMapUnits.RemoveAt(i); break; } } MapMessageHelper.BroadcastTarget(m2C_MapUnitDestroy, broadcastMapUnits); switch (room.Type) { case RoomType.Roaming: { } break; case RoomType.Team: { // 廣播成員異動訊息 M2C_TeamModifyMember m2c_TeamModifyMember = new M2C_TeamModifyMember(); m2c_TeamModifyMember.Uid = mapUnit.Uid; MapMessageHelper.BroadcastTarget(m2c_TeamModifyMember, broadcastMapUnits); // 判斷自身是否為隊長 bool isLeader = mapUnit.Uid == roomTeamComponent.Data.LeaderUid; // 廣播替換隊長訊息 if (isLeader) { M2C_TeamModifyData m2c_TeamModifyData = new M2C_TeamModifyData(); m2c_TeamModifyData.Data = roomTeamComponent.Data; MapMessageHelper.BroadcastTarget(m2c_TeamModifyData, broadcastMapUnits); } } break; } } // 中斷指定玩家與Map的連接 mapUnit.GetComponent <MapUnitGateComponent>().IsDisconnect = true; Game.Scene.GetComponent <MapUnitComponent>().Remove(mapUnit.Id); } catch (Exception e) { Log.Error(e); } }