Ejemplo n.º 1
0
        public async Task JoinOrCreateRoom(string roomName, string playerName)
        {
            #region 因为Context的不一样,导致广播调用不到函数,所以其他hub必须加入Context才行,所以先只是创建而已,等作者添加支持

            var result = RoomManager.GetRoom(roomName, out _room);

            if (result)
            {
                await RoomManager.JoinRoom(_room, Context);
            }
            else
            {
                _room = await Group.AddAsync(roomName);

                RoomManager.AddRoom(_room);
            }

            _playerName = playerName;

            #endregion

            Broadcast(_room).OnJoinRoom(playerName);

            Console.WriteLine($"{playerName} Join {roomName} Room.");
        }
Ejemplo n.º 2
0
        public async Task <JoinResult> JoinAsync(string roomName, string playerName, string userId)
        {
            Guid connectionId = this.Context.ContextId;

            GrpcEnvironment.Logger.Debug("VoiceChatHub - ConnectionId: " + connectionId);

            self = RoomManager.Instance.JoinOrCreateRoom(roomName, playerName, userId);
            Player[] roomPlayers = RoomManager.Instance.GetRoom(roomName).GetPlayers();

            GrpcEnvironment.Logger.Debug("VoiceChatHub - PlayerCount: " + roomPlayers.Length);
            currentRoom = roomName;

            if (self.ActorNumber >= 0)
            {
                this.group = await Group.AddAsync(roomName);

                BroadcastExceptSelf(group).OnJoin(self);
                // Broadcast(group).OnJoin(self);
            }

            return(new JoinResult()
            {
                LocalPlayer = self
            });
        }
Ejemplo n.º 3
0
        public async Task JoinAsync(ChatJoinRequest request)
        {
            room = await Group.AddAsync(request.RoomName);

            myName = request.UserName;

            Broadcast(room).OnJoin(request.UserName);
        }
Ejemplo n.º 4
0
        public async Task JoinAsync(string roomName, PlayerIdentifier playerIdentifier)
        {
            (room, storage) = await Group.AddAsync(roomName, playerIdentifier);

            self = playerIdentifier;
            BroadcastExceptSelf(room).Join(playerIdentifier);
            Players = storage.AllValues;
            join.OnNext(roomName);
        }
    public async Task <Player[]> JoinAsync(string roomName, string playerId, string playerName)
    {
        self = new Player(playerId, playerName);

        (room, storage) = await Group.AddAsync(roomName, self);

        BroadcastExceptSelf(room).OnJoin(self);

        return(storage.AllValues.ToArray());
    }
Ejemplo n.º 6
0
        public async Task JoinAsync(string name, string room)
        {
            _player = new Player {
                Name = name, Room = room
            };
            await Console.Out.WriteLineAsync($"Join {_player.Name} to the {_player.Room}");

            (_room, _) = await Group.AddAsync(_player.Room, _player);

            Broadcast(_room).OnJoin(_player);
        }
Ejemplo n.º 7
0
        protected override ValueTask OnConnecting()
        {
            AccessControlHub
            .JoinAsObservable
            .Subscribe(async groupName => room = await Group.AddAsync(groupName));

            AccessControlHub
            .LeaveAsObservable
            .Subscribe(async _ => await room.RemoveAsync(Context));

            return(CompletedTask);
        }
Ejemplo n.º 8
0
        public async Task <Player[]> JoinAsync(string roomName, string userName)
        {
            _player = new Player()
            {
                Name = userName
            };
            (_room, _storage) = await Group.AddAsync(roomName, _player);

            Console.WriteLine($"player [{userName}] joined to room [{roomName}].");

            Broadcast(_room).OnJoin(_player);
            return(_storage.AllValues.ToArray());
        }
Ejemplo n.º 9
0
        protected override async ValueTask OnConnecting()
        {
            nodeId = Guid.Parse(Context.CallContext.RequestHeaders.GetValue("node-id"));

            // TODO:use specified id???
            var group = await Group.AddAsync("global-masterhub-group");

            var broadcaster = group.CreateBroadcaster <IWorkerReceiver>();

            workerConnectionContext.Broadcaster = broadcaster;

            workerConnectionContext.AddConnection(nodeId);
        }
Ejemplo n.º 10
0
        public async Task <Player[]> JoinAsync(string roomName, string userName, Vector3 position, Quaternion rotation)
        {
            self = new Player()
            {
                Name = userName, Position = position, Rotation = rotation
            };

            (room, storage) = await Group.AddAsync(roomName, self);

            Broadcast(room).OnJoin(self);

            return(storage.AllValues.ToArray());
        }
Ejemplo n.º 11
0
        public async Task <Player[]> JoinAsync(string roomName, string userName, double position, double rotation)
        {
            self = new Player()
            {
                Name = userName, Position = position, Rotation = rotation
            };

            // Group can bundle many connections and it has inmemory-storage so add any type per group.
            (room, storage) = await Group.AddAsync(roomName, self);

            // Typed Server->Client broadcast.
            Broadcast(room).OnJoin(self);

            return(storage.AllValues.ToArray());
        }
Ejemplo n.º 12
0
        public async Task <PlayerMPO[]> JoinAsync(string roomName, PlayerMPO player)
        {
            Console.Out.WriteLine($"JoinAsync:{roomName},{player.Name}");

            //自分の情報を保持
            self = player;

            //ルームに参加&ルームを保持
            (room, storage) = await Group.AddAsync(roomName, self);

            //参加したことをルームに参加している全メンバーに通知
            this.Broadcast(room).OnJoin(self);

            return(storage.AllValues.ToArray());
        }
Ejemplo n.º 13
0
        public async Task <Player[]> JoinAsync(string roomName, string userName, Vector3 position, Quaternion rotation)
        {
            player = new Player()
            {
                Name = userName, Position = position, Rotation = rotation
            };
            (room, storage) = await Group.AddAsync(roomName, player);

            Broadcast(room).OnJoin(player);

            // ReSharper disable once HeapView.BoxingAllocation
            Console.WriteLine($"JoinAsync - {storage.AllValues.Count}");

            return(storage.AllValues.ToArray());
        }
Ejemplo n.º 14
0
        public async Task <Player[]> JoinAsync(string roomName, string userName, Vector3 position, Quaternion rotation)
        {
            Console.WriteLine("JoinAsync " + userName);

            self = new Player()
            {
                Name = userName, Position = position, Rotation = rotation
            };

            // Group은 많은 연결들을 묶을 수 있고, 이것은 메모리 저장소를 가지므로 그룹마다 어떠한 타입도 추가할 수 있다.
            (room, storage) = await Group.AddAsync(roomName, self);

            // 서버->클라이언트로 브로드캐스팅 한다.
            Broadcast(room).OnJoin(self);

            return(storage.AllValues.ToArray());
        }
Ejemplo n.º 15
0
        private async Task When(JoinCommand cmd)
        {
            _group = await Group.AddAsync(cmd.RoomName);

            var application = _applications.GetOrAdd(cmd.RoomName,
                                                     newRoomName => new ARWorldApplication(newRoomName, new EventStore(), new DomainEventPublisher()));

            _roomName = cmd.RoomName;

            application.DomainEventPublisher.EventStream
            .Subscribe(e =>
            {
                switch (e)
                {
                case PlayerJoined joined:
                    BroadcastToSelf(_group).OnEvent(joined);
                    Console.WriteLine($"joined: {joined.PlayerId} as {joined.PlayerName} to {joined.RoomName}");
                    break;

                case PlayerLeft left:
                    BroadcastToSelf(_group).OnEvent(left);
                    Console.WriteLine($"left: {left.PlayerId}");
                    break;

                case PlayerSpoke playerSpoke:
                    BroadcastToSelf(_group).OnEvent(playerSpoke);
                    Console.WriteLine($"spoke: {playerSpoke.PlayerId} like {playerSpoke.Message}");
                    break;

                case PlayerMoved playerMoved:
                    BroadcastToSelf(_group).OnEvent(playerMoved);
                    // Console.WriteLine($"spoke: {playerSpoke.PlayerId} like {playerSpoke.Message}");
                    break;
                }
            }).AddTo(_disposables);

            application.Execute(cmd);

            BroadcastToSelf(_group).OnEvent(
                new ARWorldEventStream()
            {
                RoomName    = _roomName,
                EventStream = application.EventStore.LoadEventStream()
            });
        }
Ejemplo n.º 16
0
        /// <summary>
        /// >マッチング時に与えられたルーム名をもとにゲーム準備を宣言
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task GameReadyAsync(GameReadyRequest request)
        {
            IsConnected = true;
            MineId      = request.MineId;
            EnemyId     = request.EnemyId;
            WithOther   = request.WithOther;

            // ゲームループ作成
            ServerMainGameLoop.LoopData data = new ServerMainGameLoop.LoopData(MineId, EnemyId, this, NetworkInput);
            ServerMainGameLoop.CreateNew(looperPool, logger, data);

            // ゲーム部屋に放り込む
            gameRoom = await Group.AddAsync(request.RoomName);

            if (WithOther)
            {   // 2P
                var memberNum = await gameRoom.GetMemberCountAsync();

                if (memberNum == 2)
                {   // 2人揃ったらゲームを開始してよい
                    logger.LogInformation($"GameReady at {MineId}");
                    var param = new Dictionary <string, IReadOnlyList <short> >();
                    // 互いの情報取得
                    var mineLoop = ServerMainGameLoop.TryTakeGame(MineId);
                    var enemLoop = ServerMainGameLoop.TryTakeGame(EnemyId);
                    param[MineId]  = mineLoop.PlayingState.Board;
                    param[EnemyId] = enemLoop.PlayingState.Board;

                    var res = new GameReadyResponse {
                        RoomName = request.RoomName, PlayerBoards = param
                    };
                    Broadcast(gameRoom).OnGameReady(res);
                }
            }
            else
            {   // 1P / 速攻でスタート
                logger.LogInformation($"GameReady at {MineId}");
                var loop  = ServerMainGameLoop.TryTakeGame(request.MineId);
                var param = new Dictionary <string, IReadOnlyList <short> >();
                param[MineId] = loop.PlayingState.Board;
                BroadcastToSelf(gameRoom).OnGameReady(new GameReadyResponse {
                    RoomName = request.RoomName, PlayerBoards = param
                });
            }
        }
Ejemplo n.º 17
0
        public async Task <Player[]> JoinAsync()
        {
            const string roomName = "SampleRoom";

            room = await Group.AddAsync(roomName);

            int _idPlayer = (await room.GetMemberCountAsync() > 1) ? 2 : 1;
            await room.RemoveAsync(Context);

            self = new Player()
            {
                IdPlayer = _idPlayer, IdFill = _idPlayer
            };
            Console.Write("\nPlayer " + self.IdPlayer);
            (room, playerStorage) = await Group.AddAsync(roomName, self);

            Broadcast(room).OnJoin(self);
            return(playerStorage.AllValues.ToArray());
        }
Ejemplo n.º 18
0
        public async Task <JoinResult> JoinAsync(string name)
        {
            _self = new ChatRoomMember()
            {
                Name = name
            };

            (_room, _members) = await Group.AddAsync(GroupIdentifier, _self);

            _self.Id = _members.AllValues.Count;

            Broadcast(_room).OnJoin(_self);

            return(new JoinResult()
            {
                You = _self,
                OtherMembers = _members.AllValues.Where(mem => mem.Id != _self.Id).ToArray()
            });
        }
Ejemplo n.º 19
0
        /// <summary>
        /// マッチング参加(マッチングはでき次第通知)
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task JoinAsync(MatchingJoinRequest request)
        {
            // 待合室に放り込む
            matchingRoom = await Group.AddAsync("MatchingRoom");

            if (request.withOther)
            {   // 誰かとマッチングして対戦
                // マッチング処理(今は単純にアクセスしてきた順にマッチングさせる)
                MatchingRoomManager.Data data = new MatchingRoomManager.Data(ConnectionId, Context);
                (string, MatchingRoomManager.Data)addResult = roomManager.TryMatching(data);
                if (!string.IsNullOrEmpty(addResult.Item1))
                {
                    // マッチング対象から外す
                    roomManager.RemoveFromMatchingRoom(data.Id);
                    roomManager.RemoveFromMatchingRoom(addResult.Item2.Id);

                    // マッチングした者同士、部屋番号だけ教えるのであとは対戦サーバーにて再集結させる
                    var mineId  = ConnectionId.ToString();
                    var enemyId = addResult.Item2.Guid.ToString();
                    BroadcastToSelf(matchingRoom).OnMatchingSuccess(new MatchingRequestSuccessResponse {
                        MineId = mineId, EnemeyId = enemyId, RoomName = addResult.Item1
                    });
                    BroadcastTo(matchingRoom, addResult.Item2.Guid).OnMatchingSuccess(new MatchingRequestSuccessResponse {
                        MineId = enemyId, EnemeyId = mineId, RoomName = addResult.Item1
                    });

                    // マッチングルーム本体から退出させる
                    await matchingRoom.RemoveAsync(addResult.Item2.Context);

                    await matchingRoom.RemoveAsync(Context);
                }
            }
            else
            {   // 1人でネットワーク(スコア更新用) / 特にすることもないので専用の部屋を作ってプレイしてもらう
                BroadcastToSelf(matchingRoom).OnMatchingSuccess(new MatchingRequestSuccessResponse {
                    MineId = ConnectionId.ToString(), EnemeyId = "", RoomName = roomManager.GenerateRoomId()
                });

                // マッチングルーム本体から退出させる
                await matchingRoom.RemoveAsync(Context);
            }
        }
Ejemplo n.º 20
0
    public async Task <PlayerData[]> JoinAsync(string roomName, string userName)
    {
        self = new PlayerData()
        {
            Name = userName,
            Uuid = Context.ContextId
        };

        (room, storage) = await Group.AddAsync(roomName, self);

        PlayerData[] connectedPlayers = storage.AllValues.ToArray();

        bool isUserHost = (connectedPlayers.Length == 1);

        self.IsHost = isUserHost;
        Console.WriteLine(userName + " / " + self.Uuid + " connected to + " + roomName + "! isHost = " + isUserHost);

        BroadcastToSelf(room).OnReceiveLobbyInfo(connectedPlayers);
        Broadcast(room).OnJoin(self);

        return(connectedPlayers);
    }
Ejemplo n.º 21
0
        public async Task <PlayerNetworkObject> MatchMake(string pass)
        {
            self = new PlayerNetworkObject {
                Id        = storage == null ? 0 : storage.AllValues.Count,
                Position  = new float[] { 0, 0, 0 },
                Rotation  = new float[] { 0, 0, 0, 0 },
                Character = storage == null ? Character.BG72 : Character.SG27,
                Velocity  = new float[] { 0, 0, 0 }
            };
            if (storage != null)
            {
                if (storage.AllValues.Count > 1)
                {
                    return(null);
                }
            }
            (room, storage) = await Group.AddAsync(pass, self);

            if (storage.AllValues.Count == 2)
            {
                Broadcast(room).MatchMade(storage.AllValues.ToArray());
            }
            return(self);
        }
Ejemplo n.º 22
0
 public async Task JoinRoom()
 {
     room = await Group.AddAsync("test_group");
 }
Ejemplo n.º 23
0
        protected override async ValueTask OnConnecting()
        {
            var group = await Group.AddAsync("global-masterhub-group");

            _broadcaster = group.CreateBroadcaster <IEchoHubReceiver>();
        }
Ejemplo n.º 24
0
 async Task IUnityChanController.RegisterAsync()
 {
     _group = await Group.AddAsync("UnityLibrary");
 }
 public async Task JoinAsync(string addressHex)
 {
     _addressGroup = await Group.AddAsync(addressHex);
 }
 public async Task JoinAsync()
 {
     group = await Group.AddAsync(string.Empty);
 }
Ejemplo n.º 27
0
 public async Task JoinAsync(string userName, string roomName)
 {
     this.userName = userName;
     this.room     = await Group.AddAsync("InMemoryRoom:" + roomName);
 }
Ejemplo n.º 28
0
 protected override async ValueTask OnConnecting()
 {
     group = await Group.AddAsync("global");
 }
        public async Task <SyncObjectTransform> RegisterAsync(string name)
        {
            room = await Group.AddAsync(name);

            return(currentSyncObjectTransform);
        }