Пример #1
0
        public void BeginBattle(BattleUser[] users, BattleUser[][] tUsers)
        {
            BSInfo appropriateBSInfo = CS.instance.appropriateBSInfo;

            //没有找到合适的bs,通知客户端匹配失败
            if (appropriateBSInfo == null)
            {
                this.NotifyGCEnterBattleFailed(users, Protos.CS2GC_EnterBattle.Types.Result.BsnotFound);
                return;
            }

            //todo 现在先随机一张地图
            Random rnd      = new Random();
            int    mapCount = Defs.GetMapCount();
            int    mapID    = rnd.Next(0, mapCount);

            Protos.CS2BS_BattleInfo battleInfo = ProtoCreator.Q_CS2BS_BattleInfo();
            battleInfo.MapID       = mapID;
            battleInfo.ConnTimeout = ( int )Consts.WAITING_ROOM_TIME_OUT;
            int c1 = tUsers.Length;

            for (int i = 0; i < c1; i++)
            {
                Protos.CS2BS_TeamInfo ti = new Protos.CS2BS_TeamInfo();
                battleInfo.TeamInfos.Add(ti);
                BattleUser[] roomUsers = tUsers[i];
                int          c2        = roomUsers.Length;
                for (int j = 0; j < c2; j++)
                {
                    BattleUser roomUser        = roomUsers[j];
                    CSUser     user            = CS.instance.userMgr.GetUser(roomUser.id);
                    Protos.CS2BS_PlayerInfo pi = new Protos.CS2BS_PlayerInfo
                    {
                        GcNID        = user.ukey | ( ulong )appropriateBSInfo.lid << 32,
                            ActorID  = user.actorID,
                            Avatar   = user.avatar,
                            Nickname = user.nickname,
                            Gender   = user.gender,
                            Money    = user.money,
                            Diamoned = user.diamoned,
                            Rank     = user.rank,
                            Exp      = user.exp
                    };
                    ti.PlayerInfos.Add(pi);
                }
            }
            CS.instance.netSessionMgr.Send(appropriateBSInfo.sessionID, battleInfo, RPCEntry.Pop(this.OnBattleInfoRet, users, tUsers,
                                                                                                 appropriateBSInfo.ip, appropriateBSInfo.port,
                                                                                                 appropriateBSInfo.sessionID, appropriateBSInfo.lid));
        }
Пример #2
0
        /// <summary>
        /// 处理cs通知开始战斗
        /// </summary>
        public ErrorCode OnCs2BsBattleInfo(NetSessionBase session, Google.Protobuf.IMessage message)
        {
            Protos.CS2BS_BattleInfo battleInfo = (Protos.CS2BS_BattleInfo)message;

            BS.instance.battleMgr.CreateBattle(battleInfo, (bid, success) =>
            {
                Protos.BS2CS_BattleInfoRet battleInfoRet = ProtoCreator.R_CS2BS_BattleInfo(battleInfo.Opts.Pid);
                battleInfoRet.Bid    = bid;
                battleInfoRet.Result = success
                                                                                   ? Protos.Global.Types.ECommon.Success
                                                                                   : Protos.Global.Types.ECommon.Failed;
                session.Send(battleInfoRet);
            });

            return(ErrorCode.Success);
        }
Пример #3
0
        /// <summary>
        /// 创建战场
        /// </summary>
        internal void CreateBattle(Protos.CS2BS_BattleInfo battleInfo, Action <uint, bool> callback)
        {
            //创建战场
            Battle battle = POOL.Pop();

            //创建战场描述
            BattleEntry battleEntry;

            battleEntry.rndSeed = this._random.Next();
            battleEntry.mapID   = battleInfo.MapID;
            int c1 = battleInfo.TeamInfos.Count;

            battleEntry.users = new BSUser[c1][];
            for (int i = 0; i < c1; i++)
            {
                Protos.CS2BS_TeamInfo teamInfo = battleInfo.TeamInfos[i];
                int c2 = teamInfo.PlayerInfos.Count;
                battleEntry.users[i] = new BSUser[c2];
                for (int j = 0; j < c2; j++)
                {
                    Protos.CS2BS_PlayerInfo playerInfo = teamInfo.PlayerInfos[j];
                    //检查玩家是否在别的战场
                    if (BS.instance.userMgr.HasUser(playerInfo.GcNID))
                    {
                        callback(0, false);
                        return;
                    }
                    //创建玩家
                    battleEntry.users[i][j] = BS.instance.userMgr.CreateUser(playerInfo, battle);
                }
            }

            //初始化战场
            battle.Init(battleEntry);

            //回调函数,通知GC创建战场成功
            callback(battle.id, true);

            //把战场加入工作列表
            this._workingBattles.Add(battle);
            //战场开始
            battle.Start();

            Logger.Log($"battle:{battle.id} created");
        }