示例#1
0
        private void HandleCreateRoomRequest(NetworkEndpoint fromEndpoint, IncomingMessage receivedMessage)
        {
            var fromPlayer = this.FindPlayer(fromEndpoint);

            if (!fromPlayer.IsInLobby)
            {
                return;
            }

            var roomOptions = new RoomOptions();

            roomOptions.Read(receivedMessage);

            var createResponse = this.CreateServerMessage(ClientIncomingMessageTypes.CreateResponse);

            if (this.lobbyRooms.ContainsKey(roomOptions.RoomName))
            {
                createResponse.Write(EnterRoomResultCodes.RoomAlreadyExists);
            }
            else
            {
                this.CreateRoom(roomOptions, fromPlayer);
                createResponse.Write(EnterRoomResultCodes.Succeed);
            }

            this.SendToPlayer(createResponse, fromPlayer);
        }
示例#2
0
        private void HandleJoinRoomRequest(NetworkEndpoint fromEndpoint, IncomingMessage receivedMessage, bool createIfNotExists)
        {
            var fromPlayer = this.FindPlayer(fromEndpoint);

            if (!fromPlayer.IsInLobby)
            {
                return;
            }

            var roomOptions = new RoomOptions();

            roomOptions.Read(receivedMessage);

            OutgoingMessage joinResponse;

            ServerRoom existingRoom;

            if (this.lobbyRooms.TryGetValue(roomOptions.RoomName, out existingRoom))
            {
                joinResponse = this.CreateServerMessage(ClientIncomingMessageTypes.JoinResponse);

                if (existingRoom.IsFull)
                {
                    joinResponse.Write(EnterRoomResultCodes.RoomIsFull);
                }
                else
                {
                    var joinRejected   = false;
                    var joiningHandler = this.PlayerJoining;
                    if (joiningHandler != null)
                    {
                        var eventArgs = new PlayerJoiningEventArgs(existingRoom, fromPlayer);
                        joiningHandler(this, eventArgs);
                        joinRejected = eventArgs.IsRejected;
                    }

                    if (joinRejected)
                    {
                        joinResponse.Write(EnterRoomResultCodes.Rejected);
                    }
                    else
                    {
                        existingRoom.AddPlayer(fromPlayer);

                        joinResponse.Write(EnterRoomResultCodes.Succeed);
                        existingRoom.WriteJoinToMessage(joinResponse, fromPlayer);

                        // Send RefreshRoomInLobbyProperties to players in lobby
                        if (existingRoom.IsVisible &&
                            existingRoom.RoomInfo.NeedSync)
                        {
                            var othersRoomMsg = this.CreateServerMessage(ClientIncomingMessageTypes.RefreshRoomInLobbyProperties);
                            othersRoomMsg.Write(existingRoom.RoomInfo.Name);
                            existingRoom.RoomInfo.WriteSyncMessage(othersRoomMsg);

                            var lobbyPlayers = this.GetPlayersInLobby();
                            this.SendToPlayers(othersRoomMsg, lobbyPlayers);
                        }

                        // Send RefreshPlayersInRoom to players in the same room
                        var refreshPlayersInRoomMsg = this.CreateServerMessage(ClientIncomingMessageTypes.RefreshPlayersInRoom);
                        existingRoom.WriteSyncPlayersListToMessage(refreshPlayersInRoomMsg);
                        var otherPlayersInRoom = this.GetOtherPlayersInRoom(fromPlayer);
                        this.SendToPlayers(refreshPlayersInRoomMsg, otherPlayersInRoom);

                        this.PlayerJoined?.Invoke(this, fromPlayer);
                    }
                }
            }
            else if (createIfNotExists)
            {
                joinResponse = this.CreateServerMessage(ClientIncomingMessageTypes.CreateResponse);
                this.CreateRoom(roomOptions, fromPlayer);
                joinResponse.Write(EnterRoomResultCodes.Succeed);
            }
            else
            {
                joinResponse = this.CreateServerMessage(ClientIncomingMessageTypes.JoinResponse);
                joinResponse.Write(EnterRoomResultCodes.RoomNotExists);
            }

            this.SendToPlayer(joinResponse, fromPlayer);
        }