Exemple #1
0
        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);
        }
Exemple #5
0
        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);
            }
        }