コード例 #1
0
        public override void OnOperationRequest(OperationRequest request, SendParameters sendParameters, MobaPeer peer)
        {
            MobaServer.LogInfo("处理技能升级的请求");

            int        playerId = UserManager.GetPlayer(peer.Username).Identification;
            BattleRoom room     = Caches.Battle.GetRoomByPlayerId(playerId);

            // 获取英雄数据
            DtoHero hero = room.GetDtoHero(playerId);

            if (hero == null || hero.SP < 1)
            {
                return;
            }

            // 获取技能id
            int skillId = (int)request[(byte)ParameterCode.SkillId];

            // 技能升级
            DtoSkill skill = hero.UpgradeSkill(skillId);

            if (skill == null)
            {
                return;
            }

            // 发送升级的技能数据和英雄id
            Dictionary <byte, object> data = new Dictionary <byte, object>();

            data.Add((byte)ParameterCode.DtoSkill, JsonMapper.ToJson(skill));
            data.Add((byte)ParameterCode.PlayerId, playerId);
            SendResponse(peer, request.OperationCode, data);
        }
コード例 #2
0
        private void OnC2S_MATCH(GameSession session, EMessage msg, Stream buff)
        {
            if (!session.isMatching)
            {
                _waitList.Add(session);
            }

            NetManager.I.SendMessage(session, EMessage.C2S_MATCH, (ushort)0);

            if (_waitList.Count > 2)
            {
                S2C_MatchSuccess rlt  = new S2C_MatchSuccess();
                BattleRoom       room = Battle.BattleRoomManager.I.CreateRoom();

                for (int i = 0; i < _waitCount; ++i)
                {
                    rlt.players.Add(session.playerBase);
                    room.AddPlayer(session);
                }

                for (int i = 0; i < _waitCount; ++i)
                {
                    NetManager.I.SendMessage <S2C_MatchSuccess>(session, EMessage.C2S_MATCH, rlt, 0);
                }

                _waitList.RemoveRange(0, _waitCount);
            }
        }
コード例 #3
0
 public void Initialize()
 {
     _battleRoom       = new BattleRoom("rock-paper-scissors");
     _battleRoomInvers = new BattleRoom("rock-paper-scissors-inverse");
     _playerRock       = new Player
     {
         Weapon = new Weapon
         {
             Type   = WeaponType.Rock,
             Damage = 1
         },
         Name     = "Visitor",
         Strength = 1
     };
     _playerPaper = new Player
     {
         Weapon = new Weapon
         {
             Type   = WeaponType.Paper,
             Damage = 1
         },
         Name     = "Visitor",
         Strength = 1
     };
 }
コード例 #4
0
        public override void OnOperationRequest(OperationRequest request, SendParameters sendParameters, MobaPeer peer)
        {
            MobaServer.LogInfo("处理进入战斗房间的请求");

            int        plyaerId = (int)UserManager.GetPlayer(peer.Username).Identification;
            BattleRoom room     = Caches.Battle.Enter(plyaerId, peer);

            // 判断是否全部进入
            if (!room.IsAllEnter)
            {
                return;
            }

            // 发送给所有客户端 英雄,建筑,装备的数据
            Dictionary <byte, object> data = new Dictionary <byte, object>();

            data.Add((byte)ParameterCode.HerosArray, JsonMapper.ToJson(room.HerosArray));
            data.Add((byte)ParameterCode.BuildsArray, JsonMapper.ToJson(room.BuildsArray));
            data.Add((byte)ParameterCode.ItemArray, JsonMapper.ToJson(ItemData.GetArray()));

            // 发送当前游戏内用到的技能数据
            data.Add((byte)ParameterCode.SkillArray, JsonMapper.ToJson(SkillData.GetSkillByHeros(room.HerosArray)));

            room.Brocast(OperationCode.EnterBattle, data);
        }
コード例 #5
0
        public override void OnOperationRequest(OperationRequest request, SendParameters sendParameters, MobaPeer peer)
        {
            //MobaServer.LogInfo("处理使用技能的请求");

            // 获取房间
            int        playerId = UserManager.GetPlayer(peer.Username).Identification;
            BattleRoom room     = Caches.Battle.GetRoomByPlayerId(playerId);

            // 获取使用者数据
            int       fromId = (int)request[(byte)ParameterCode.FromId];
            DtoMinion from   = room.GetDto(fromId);

            // 获取目标数据
            DtoMinion[] to = null;
            if (request.Parameters.ContainsKey((byte)ParameterCode.TargetArray))
            {
                int[] toIds = JsonMapper.ToObject <int[]>(request[(byte)ParameterCode.TargetArray] as string);
                to = room.GetDtos(toIds);
            }

            // 获取技能id和等级
            int skillId = (int)request[(byte)ParameterCode.SkillId];
            int level   = (int)request[(byte)ParameterCode.SkillLevel];

            // 使用技能
            SkillManager.Instance.UseSkill(skillId, level, from, to, room);
            // 广播谁使用了技能
            room.Brocast(OpCode, request.Parameters);
        }
コード例 #6
0
ファイル: DamageHandler.cs プロジェクト: mengtest/MOBAGame
        public override void OnOperationRequest(OperationRequest request, SendParameters sendParameters, MobaPeer peer)
        {
            //MobaServer.LogInfo("处理计算伤害的请求");

            // 获取房间
            int        playerId = UserManager.GetPlayer(peer.Username).Identification;
            BattleRoom room     = Caches.Battle.GetRoomByPlayerId(playerId);

            // 获取技能id
            int skillId = (int)request[(byte)ParameterCode.SkillId];

            // 获取攻击者数据
            int       fromId = (int)request[(byte)ParameterCode.FromId];
            DtoMinion from   = room.GetDto(fromId);

            if (from == null)
            {
                return;
            }

            // 获取被攻击者的数据
            int[]       toIds = JsonMapper.ToObject <int[]>(request[(byte)ParameterCode.TargetArray] as string);
            DtoMinion[] to    = room.GetDtos(toIds);

            // 使用技能 获取伤害数据
            DtoDamage[] damages = null;
            damages = SkillManager.Instance.Damage(room, skillId, 1, from, to);

            // 广播伤害数据传输对象
            Dictionary <byte, object> data = new Dictionary <byte, object>();

            data.Add((byte)ParameterCode.DtoDamages, JsonMapper.ToJson(damages));
            room.Brocast(OperationCode.Damage, data);
        }
コード例 #7
0
    /// <summary>
    /// 开始战斗
    /// </summary>
    public void StartFight(BattleRoom data)
    {
        this.battleRoom = data;

        InitBattleRoom();

        MoveNext();
    }
コード例 #8
0
    public void CreateBattle(List <MatchUserInfo> group)
    {
        BattleRoom room = new BattleRoom(battleID, group);

        battles[battleID] = room;
        room.CreateBattle();
        battleID++;
        Debug.Log("准备战斗:");
    }
コード例 #9
0
        public void RecoveryRoom(BattleRoom room)
        {
            if (room == null)
            {
                return;
            }

            room.Clear();
            rooms.Remove(room.uid);
            roomPool.Enqueue(room);
        }
コード例 #10
0
ファイル: BattleHandler.cs プロジェクト: syuukouha/MOBAServer
        /// <summary>
        /// 玩家移动
        /// </summary>
        /// <param name="client"></param>
        /// <param name="v1"></param>
        /// <param name="v2"></param>
        /// <param name="v3"></param>
        private void OnWalk(MOBAClient client, float x, float y, float z)
        {
            int        playerID   = playerCache.GetID(client);
            BattleRoom battleRoom = battleCache.GetRoom(playerID);

            if (battleRoom == null)
            {
                return;
            }
            //给每一个客户端发送谁移动到哪的信息
            battleRoom.Broadcast(OperationCode.BattleCode, OpBattle.Walk, 0, "有玩家移动", null, playerID, x, y, z);
        }
コード例 #11
0
        public override void OnOperationRequest(OperationRequest request, SendParameters sendParameters, MobaPeer peer)
        {
            // 获取房间
            int        playerId = UserManager.GetPlayer(peer.Username).Identification;
            BattleRoom room     = Caches.Battle.GetRoomByPlayerId(playerId);
            // 获取结束效果的键值
            string effectKey = request[(byte)ParameterCode.EffectKey] as string;

            // 调用结束效果的处理
            SkillManager.Instance.EffectEnd(room, effectKey);

            // 这里应该还有个广播。。
        }
コード例 #12
0
        public async Task StartBattleAsync(BattleRoom battleRoom)
        {
            foreach (var playerId in battleRoom.PlayerIDs)
            {
                await _hubContext.Groups.AddToGroupAsync(playerId, battleRoom.RoomID);
            }

            await _hubContext.Clients
            .Group(battleRoom.RoomID)
            .SendAsync(WSMethods.BATTLE_START, battleRoom.RoomID);

            _activeBattles.Add(battleRoom.RoomID, battleRoom);
        }
コード例 #13
0
        public override void OnOperationRequest(OperationRequest request, SendParameters sendParameters, MobaPeer peer)
        {
            MobaServer.LogInfo(peer.Username + ":初始化完成");

            BattleRoom room = Caches.Battle.GetRoomByPlayerId(UserManager.GetPlayer(peer.Username).Identification);

            room.InitCount++;
            // 所有客户端初始化完成
            if (room.IsAllInit)
            {
                // 开始生产小兵
                room.SpawnMinion();
            }
        }
コード例 #14
0
        public async Task DissolveRoomAsync(BattleRoom room)
        {
            await _hubContext.Clients
            .Group(room.RoomID)
            .SendAsync(WSMethods.USER_DISCONNECT);

            foreach (var playerId in room.PlayerIDs)
            {
                await _hubContext.Groups
                .RemoveFromGroupAsync(playerId, room.RoomID);
            }

            _activeBattles.Remove(room.RoomID);
        }
コード例 #15
0
        private async Task ExecuteRoundAsync(BattleRoom room)
        {
            var(isTied, winner, loser) = DetermineWinner(room.GestureQueue.First(), room.GestureQueue.Last());
            var roundRecord = new RoundRecord(room.Scores, room.GestureQueue);

            if (isTied)
            {
                await _hubContext.Clients
                .Group(room.RoomID)
                .SendAsync(WSMethods.ROUND_TIE);

                await _hubContext.Clients
                .Group(room.RoomID)
                .SendAsync(WSMethods.NEW_ROUND, roundRecord);

                room.GestureQueue.Clear();
                return;
            }

            var winnerId = winner.PlayerID;

            room.Scores[winner.PlayerID]++;

            // If game is won
            if (room.Scores.Values.Any(score => score == _winAmount))
            {
                await _hubContext.Clients
                .Group(room.RoomID)
                .SendAsync(WSMethods.GAME_END, roundRecord);

                await DissolveRoomAsync(room);

                return;
            }

            await _hubContext.Clients
            .Client(winnerId)
            .SendAsync(WSMethods.ROUND_WON);

            await _hubContext.Clients
            .Client(loser.PlayerID)
            .SendAsync(WSMethods.ROUND_LOST);

            await _hubContext.Clients
            .Group(room.RoomID)
            .SendAsync(WSMethods.NEW_ROUND, roundRecord);

            room.GestureQueue.Clear();
        }
コード例 #16
0
        public BattleRoom CreateRoom()
        {
            BattleRoom room = null;

            if (roomPool.Count > 0)
            {
                room = roomPool.Dequeue();
            }
            else
            {
                room = new BattleRoom();
            }
            rooms.Add(room.uid, room);
            return(room);
        }
コード例 #17
0
ファイル: BuyItemHandler.cs プロジェクト: mengtest/MOBAGame
        public override void OnOperationRequest(OperationRequest request, SendParameters sendParameters, MobaPeer peer)
        {
            MobaServer.LogInfo("处理购买道具的请求");

            // 获取道具
            int       itemId = (int)request[(byte)ParameterCode.ItemId];
            ItemModel item   = ItemData.GetItem(itemId);

            if (item == null)
            {
                return;
            }

            // 获取房间
            int        playerId = UserManager.GetPlayer(peer.Username).Identification;
            BattleRoom room     = Caches.Battle.GetRoomByPlayerId(playerId);

            if (room == null)
            {
                return;
            }

            // 获取英雄
            DtoHero hero = room.GetDtoHero(playerId);

            // 金币不足
            if (hero.Money < item.Price)
            {
                SendResponse(peer, request.OperationCode, null, ReturnCode.Falied, "金币不足");
                return;
            }

            // 开始购买
            if (hero.BuyItem(item))
            {
                // 给所有客户端发送消息 谁买了什么装备
                Dictionary <byte, object> data = new Dictionary <byte, object>();
                data.Add((byte)ParameterCode.DtoHero, JsonMapper.ToJson(hero));
                room.Brocast(OpCode, data);
            }
            else
            {
                SendResponse(peer, request.OperationCode, null, ReturnCode.Falied, "装备已满");
            }
        }
コード例 #18
0
ファイル: BattleHandler.cs プロジェクト: syuukouha/MOBAServer
        /// <summary>
        /// 进入战斗
        /// </summary>
        /// <param name="client"></param>
        /// <param name="playerID"></param>
        private void OnEnter(MOBAClient client, int playerID)
        {
            BattleRoom battleRoom = battleCache.Enter(client, playerID);

            if (battleRoom == null)
            {
                return;
            }
            //首先要判断是否全部进入了
            if (!battleRoom.IsAllEnter)
            {
                return;
            }
            //给每一个客户端发送战斗房间的信息
            battleRoom.Broadcast(OperationCode.BattleCode, OpBattle.GetInfo, 0, "加载战斗场景数据", null,
                                 JsonMapper.ToJson(battleRoom.HeroModels),
                                 JsonMapper.ToJson(battleRoom.BuildModels));
        }
コード例 #19
0
ファイル: HeroMoveHandler.cs プロジェクト: mengtest/MOBAGame
        public override void OnOperationRequest(OperationRequest request, SendParameters sendParameters, MobaPeer peer)
        {
            //MobaServer.LogInfo("处理移动的请求");

            // 获取玩家id
            int playerId = UserManager.GetPlayer(peer.Username).Identification;

            // 获取战斗的房间
            BattleRoom room = Caches.Battle.GetRoomByPlayerId(playerId);

            if (room == null)
            {
                return;
            }

            // 添加玩家的id 玩家id就是英雄的唯一标识id
            request.Parameters[(byte)ParameterCode.PlayerId] = playerId;
            // 告诉其他客户端:谁移动到哪
            room.Brocast(OpCode, request.Parameters);
        }
コード例 #20
0
    void TestFight()
    {
        PlayerFighter player0 = new PlayerFighter();

        player0.ID    = 10000;
        player0.maxHp = player0.HP = 10000;
        PlayerFighter player1 = new PlayerFighter();

        player1.ID    = 10001;
        player1.maxHp = player1.HP = 10000;
        BattleRoom room = new BattleRoom();

        for (int i = 1; i <= 2; i++)
        {
            CardData cardData = new CardData();
            cardData.cardTemplateID = i;
            cardData.cardLevel      = 10;
            cardData.ID             = i;
            CardFighter card = CardFighter.NewCard(cardData);

            if (i < 2)
            {
                card.owner = player0;
                player0.allCard.Add(card);
            }
            else
            {
                card.owner = player1;
                player1.allCard.Add(card);
            }
        }

        room.SetFighters(player0, player1);
        room.StartFight();

        gameObject.GetComponentInChildren <BattleRoomUI>().gameObject.AddComponent <BattleControl>().StartFight(room);
    }
コード例 #21
0
ファイル: Program.cs プロジェクト: JoshMcGill/Monsters
        public static void Main(string[] args)
        {
            // Create the battle room
            BattleRoom battleRoom = new BattleRoom();

            // Create Messenger and subscribe to the attack
            AttackMessenger attackMessenger = new AttackMessenger();

            battleRoom.AttackCompleted += attackMessenger.OnAttackCompleted;

            // Create enemy
            Monster enemy = new Monster("Ratata");

            // Create players monster
            Console.WriteLine("Choose a name for your Monster!");
            string  input  = Console.ReadLine();
            Monster player = new Monster(input);

            // Register monsters to battleRoom
            battleRoom.Register(enemy);
            battleRoom.Register(player);

            // Start game
            Console.WriteLine("Name: " + player.name);
            Console.WriteLine("Health: " + player.health);

            Console.WriteLine(" ");
            Console.WriteLine("Time for battle! Meet your opponent!");
            Console.WriteLine(" ");

            Console.WriteLine("Name: " + enemy.name);
            Console.WriteLine("Health: " + enemy.health);

            Console.WriteLine(" ");
            Console.WriteLine("------BATTLE------");
            Console.WriteLine(" ");

            // Start Battle
            Random  roll        = new Random();
            int     starterRoll = roll.Next(0, 2);
            Monster attacker;
            Monster reciever;
            string  deadMonsterName;


            // Randomly Decide who attacks first
            if (starterRoll == 0)
            {
                attacker = player;
                reciever = enemy;
            }
            else
            {
                attacker = enemy;
                reciever = player;
            }

            // Keep battle going until one of the players reaches 0 health
            while (enemy.health > 0 && player.health > 0)
            {
                WriteStatus(player, enemy, attacker);

                if (attacker == player)
                {
                    // Pick Ability
                    Console.WriteLine("What ability would you like to use?");
                    PrintAbilities(attacker);
                    string userInput = Console.ReadLine();

                    Ability chosenAbility = PickAbility(attacker, userInput);

                    while (chosenAbility == null)
                    {
                        Console.WriteLine("The ability you chose is not valid, please try again.");
                        userInput = Console.ReadLine();

                        chosenAbility = PickAbility(attacker, userInput);
                    }

                    // Attack
                    battleRoom.Attack(attacker, reciever, chosenAbility);

                    // Change turn
                    attacker = enemy;
                    reciever = player;

                    // Allow player to acknowledge what happened
                    Console.WriteLine("");
                    Console.WriteLine("Press anything to continue");
                    Console.ReadLine();
                }
                else
                {
                    // Randomly pick ability
                    int abilityRoll = roll.Next(0, attacker.abilities.Count);
                    battleRoom.Attack(attacker, reciever, attacker.abilities.ElementAt(abilityRoll).Value);

                    // Change Turn
                    attacker = player;
                    reciever = enemy;
                }

                Console.WriteLine("");
                Console.WriteLine("--------END TURN--------");
                Console.WriteLine("");
            }

            // Battle is finished
            if (attacker.health == 0)
            {
                deadMonsterName = attacker.name;
            }
            else
            {
                deadMonsterName = reciever.name;
            }

            Console.WriteLine("");
            Console.WriteLine("{0} has fainted!", deadMonsterName);
            Console.WriteLine("");
            Console.WriteLine("GAME OVER!");
        }
コード例 #22
0
ファイル: BattleRoomUI.cs プロジェクト: leeckey/Card
 //
 public void Init(BattleRoom data)
 {
     playerground0.InitPlayerInfo(data.fighter0);
     playerground1.InitPlayerInfo(data.fighter1);
 }
コード例 #23
0
 public void RegisterBattleMessageHandlers(IBattlemessageProvider bmp)
 {
     BattleRoom.RegisterBattleMessageHandlers(bmp);
 }
コード例 #24
0
 public BattleRoomClient(BattleRoom room)
 {
     BattleRoom = room;
 }