public static void LeaveTeam(this RoomTeamComponent self, MapUnit leaveMapUnit) { // 把離開房間的MapUnit設為null for (int i = 0; i < RoomTeamComponent.MEMBER_MAX; i++) { if (self.MemberDatas[i] == null) { continue; } if (!self.MemberDatas[i].LoadingDone) { MapUnit kickMember = self.RoomEntity.GetMapUnitByUid(self.MemberDatas[i].Uid); if (leaveMapUnit?.Uid == kickMember?.Uid) { self.MemberDatas[i] = null; } } } // 判斷是否全部載入完畢 // 讓隊伍進入比賽 if (self.IsAllLoadingDone()) { RoomTeamHelper.LoadingFinish(self); } }
public static async void LoadingFinish(RoomTeamComponent roomTeamComponent) { if (roomTeamComponent.DataIsLoaded) { return; } roomTeamComponent.DataIsLoaded = true; //等3秒給Client Lerp await Game.Scene.GetComponent <TimerComponent>().WaitForSecondAsync(3.0f); //設定比賽開始結束時間 var roadSetting = Game.Scene.GetComponent <ConfigComponent>().Get (typeof(RoadSetting), roomTeamComponent.RoomEntity.info.RoadSettingId) as RoadSetting; if (roadSetting != null) { var timerComponent = Game.Scene.GetComponent <TimerComponent>(); roomTeamComponent.RoomRunStartTimeMs = TimeHelper.ClientNowMilliSeconds(); roomTeamComponent.RoadDistance_km = RoadHelper.GetDistance_km(roadSetting); roomTeamComponent.RoadDistance_m = RoadHelper.GetDistance_m(roadSetting); } else { Log.Error($"找不到該路徑資料, RoadSettingId:{roomTeamComponent.RoomEntity.info.RoadSettingId}"); } //設定所有Player StartRoom List <MapUnit> mapUnits = roomTeamComponent.RoomEntity.GetAll(); var proxy = Game.Scene.GetComponent <CacheProxyComponent>(); var playerSync = proxy.GetMemorySyncSolver <Player>(); for (int i = 0; i < mapUnits.Count; i++) { Player target = playerSync.Get <Player>(mapUnits[i].Uid); if (target != null) { target.StartRoom(); await playerSync.Update(target); } } //廣播給所有玩家 所有人載入完成 M2C_TeamGoBattleProgressAllDone m2c_TeamGoBattleProgressAllDone = new M2C_TeamGoBattleProgressAllDone() { StartUTCTick = DateTime.UtcNow.Ticks }; MapMessageHelper.BroadcastRoom(roomTeamComponent.RoomEntity.Id, m2c_TeamGoBattleProgressAllDone); }
public static async void KickMember(RoomTeamComponent roomTeamComponent, MapUnit kickMember, TeamLoseType loseType) { if (kickMember == null) { return; } //廣播給指定玩家失去房間 M2C_TeamLose m2c_TeamLose = new M2C_TeamLose(); m2c_TeamLose.LoseType = loseType; List <MapUnit> broadcastMapUnits = new List <MapUnit>(); broadcastMapUnits.Add(kickMember); MapMessageHelper.BroadcastTarget(m2c_TeamLose, broadcastMapUnits); //Player移除mapUnitId var proxy = Game.Scene.GetComponent <CacheProxyComponent>(); var playerSync = proxy.GetMemorySyncSolver <Player>(); var player = playerSync.Get <Player>(kickMember.Uid); player?.LeaveRoom(); await playerSync.Update(player); //中斷指定玩家與Map的連接 var mapUnitGateComponent = kickMember?.GetComponent <MapUnitGateComponent>(); if (mapUnitGateComponent != null) { mapUnitGateComponent.IsDisconnect = true; } Game.Scene.GetComponent <MapUnitComponent>().Remove(kickMember.Id); if (m2c_TeamLose.LoseType != TeamLoseType.LoadingTimeOut) { //廣播給離開玩家外的玩家 成員異動 M2C_TeamModifyMember m2c_TeamModifyMember = new M2C_TeamModifyMember(); m2c_TeamModifyMember.Uid = kickMember.Uid; MapMessageHelper.BroadcastRoom(roomTeamComponent.RoomEntity.Id, m2c_TeamModifyMember, kickMember.Uid); } }
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); }
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); } }