コード例 #1
0
        protected override async ETTask Run(MapUnit mapUnit, C2M_TeamDeliveryLeader message, Action <M2C_TeamDeliveryLeader> reply)
        {
            await ETTask.CompletedTask;

            M2C_TeamDeliveryLeader response = new M2C_TeamDeliveryLeader();

            try
            {
                if (mapUnit.Room == null)
                {
                    response.Error = ErrorCode.ERR_RoomIdNotFound;
                    reply(response);
                    return;
                }

                if (mapUnit.Room.Type != RoomType.Team)
                {
                    response.Error = ErrorCode.ERR_RoonTypeError;
                    reply(response);
                    return;
                }

                var roomTeamComponent = mapUnit.Room.GetComponent <RoomTeamComponent>();
                if (roomTeamComponent == null)
                {
                    response.Error = ErrorCode.ERR_RoomTeamComponentNull;
                    reply(response);
                    return;
                }

                if (roomTeamComponent.Data?.LeaderUid != mapUnit.Uid)
                {
                    response.Error = ErrorCode.ERR_RoomTeamIsNotLeader;
                    reply(response);
                    return;
                }

                roomTeamComponent.Data.LeaderUid = message.Uid;
                response.Error = 0;
                reply(response);

                M2C_TeamModifyData m2c_TeamModifyData = new M2C_TeamModifyData();
                m2c_TeamModifyData.Data = roomTeamComponent.Data;
                MapMessageHelper.BroadcastRoom(mapUnit.RoomId, m2c_TeamModifyData);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
コード例 #2
0
        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);
        }
コード例 #4
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);
            }
        }