Ejemplo n.º 1
0
        private async void RunAsync(Session session, L2M_RunRoomOnTeam message, Action <M2L_RunRoomOnTeam> reply)
        {
            M2L_RunRoomOnTeam response = new M2L_RunRoomOnTeam();

            try
            {
                var roomComponent = Game.Scene.GetComponent <RoomComponent>();
                var room          = roomComponent.Get(message.RoomId);
                if (room == null)
                {
                    response.Error = ErrorCode.ERR_RoomIdNotFound;
                    reply(response);
                    return;
                }
                var roomTeamComponent = room.GetComponent <RoomTeamComponent>();
                if (roomTeamComponent == null)
                {
                    response.Error = ErrorCode.ERR_RoomTeamComponentNull;
                    reply(response);
                    return;
                }
                roomTeamComponent.TeamLeaderRun();
                await roomComponent.Update(room);

                RepeatedField <MapUnitInfo> mapUnitInfos = new RepeatedField <MapUnitInfo>();
                List <MapUnit> mapUnits = room.GetAll();
                for (int i = 0; i < mapUnits.Count; i++)
                {
                    mapUnits[i].Info.PathId = i % 4;
                    mapUnitInfos.Add(mapUnits[i].Info);
                }

                ActorMessageSenderComponent actorLocationSenderComponent = Game.Scene.GetComponent <ActorMessageSenderComponent>();
                for (int i = 0; i < mapUnits.Count; i++)
                {
                    if (mapUnits[i].MapUnitType == MapUnitType.Npc)
                    {
                        continue;
                    }

                    if (mapUnits[i].GetComponent <MapUnitGateComponent>().IsDisconnect)
                    {
                        continue;
                    }

                    M2C_TeamGoBattle m2c_TeamGoBattle = new M2C_TeamGoBattle();
                    m2c_TeamGoBattle.MapUnitInfos = mapUnitInfos;
                    m2c_TeamGoBattle.MapUnitId    = mapUnits[i].Id;

                    ActorMessageSender actorMessageSender = actorLocationSenderComponent.Get(mapUnits[i].GetComponent <MapUnitGateComponent>().GateSessionActorId);
                    actorMessageSender.Send(m2c_TeamGoBattle);
                }

                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        protected override async ETTask Run(MapUnit mapUnit, C2M_TeamRun message, Action <M2C_TeamRun> reply)
        {
            await ETTask.CompletedTask;

            M2C_TeamRun response = new M2C_TeamRun();

            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;
                }

                if (mapUnit.Room.State != RoomState.Start)
                {
                    response.Error = ErrorCode.ERR_RoomTeamStateCanNotToRun;
                    reply(response);
                    return;
                }

                // 判斷是否所有成員都已準備
                bool haveNotReady = false;
                for (int i = 0; i < roomTeamComponent.MemberDatas.Length; i++)
                {
                    if (roomTeamComponent.MemberDatas[i] != null &&
                        roomTeamComponent.MemberDatas[i].Uid != mapUnit.Uid &&
                        !roomTeamComponent.MemberDatas[i].IsReady)
                    {
                        haveNotReady = true;
                        break;
                    }
                }
                if (haveNotReady)
                {
                    response.Error = ErrorCode.ERR_RoomTeamHaveNotReady;
                    reply(response);
                    return;
                }

                // 開始比賽
                roomTeamComponent.TeamLeaderRun();
                await Game.Scene.GetComponent <RoomComponent>().Update(mapUnit.Room);

                response.Error = ErrorCode.ERR_Success;
                reply(response);

                // 紀錄所有MapUnit
                RepeatedField <MapUnitInfo> mapUnitInfos = new RepeatedField <MapUnitInfo>();
                List <MapUnit> mapUnits = mapUnit.Room.GetAll();
                for (int i = 0; i < mapUnits.Count; i++)
                {
                    // PathId 入場時決定
                    mapUnits[i].Info.PathId            = i % 4;
                    mapUnits[i].Info.DistanceTravelled = 0;
                    mapUnitInfos.Add(mapUnits[i].Info);
                }

                // 廣播給本隊全體
                ActorMessageSenderComponent actorLocationSenderComponent = Game.Scene.GetComponent <ActorMessageSenderComponent>();
                for (int i = 0; i < mapUnits.Count; i++)
                {
                    if (mapUnits[i].MapUnitType == MapUnitType.Npc)
                    {
                        continue;
                    }

                    if (mapUnits[i].GetComponent <MapUnitGateComponent>().IsDisconnect)
                    {
                        continue;
                    }

                    M2C_TeamGoBattle m2c_TeamGoBattle = new M2C_TeamGoBattle();
                    m2c_TeamGoBattle.MapUnitInfos = mapUnitInfos;
                    m2c_TeamGoBattle.MapUnitId    = mapUnits[i].Id;

                    ActorMessageSender actorMessageSender = actorLocationSenderComponent.Get(mapUnits[i].GetComponent <MapUnitGateComponent>().GateSessionActorId);
                    actorMessageSender.Send(m2c_TeamGoBattle);
                }
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }