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