mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Multiplayer: Send an error message when connecting to a full room
This commit is contained in:
		
							parent
							
								
									a9c9ffd32c
								
							
						
					
					
						commit
						e040bc9355
					
				
					 7 changed files with 42 additions and 7 deletions
				
			
		|  | @ -68,6 +68,11 @@ public: | |||
|      */ | ||||
|     bool IsValidMacAddress(const MacAddress& address) const; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Sends a ID_ROOM_IS_FULL message telling the client that the room is full. | ||||
|      */ | ||||
|     void SendRoomIsFull(ENetPeer* client); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Sends a ID_ROOM_NAME_COLLISION message telling the client that the name is invalid. | ||||
|      */ | ||||
|  | @ -193,6 +198,13 @@ void Room::RoomImpl::StartLoop() { | |||
| } | ||||
| 
 | ||||
| void Room::RoomImpl::HandleJoinRequest(const ENetEvent* event) { | ||||
|     { | ||||
|         std::lock_guard<std::mutex> lock(member_mutex); | ||||
|         if (members.size() >= room_information.member_slots) { | ||||
|             SendRoomIsFull(event->peer); | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
|     Packet packet; | ||||
|     packet.Append(event->packet->data, event->packet->dataLength); | ||||
|     packet.IgnoreBytes(sizeof(u8)); // Ignore the message type
 | ||||
|  | @ -295,6 +307,16 @@ void Room::RoomImpl::SendWrongPassword(ENetPeer* client) { | |||
|     enet_host_flush(server); | ||||
| } | ||||
| 
 | ||||
| void Room::RoomImpl::SendRoomIsFull(ENetPeer* client) { | ||||
|     Packet packet; | ||||
|     packet << static_cast<u8>(IdRoomIsFull); | ||||
| 
 | ||||
|     ENetPacket* enet_packet = | ||||
|         enet_packet_create(packet.GetData(), packet.GetDataSize(), ENET_PACKET_FLAG_RELIABLE); | ||||
|     enet_peer_send(client, 0, enet_packet); | ||||
|     enet_host_flush(server); | ||||
| } | ||||
| 
 | ||||
| void Room::RoomImpl::SendVersionMismatch(ENetPeer* client) { | ||||
|     Packet packet; | ||||
|     packet << static_cast<u8>(IdVersionMismatch); | ||||
|  | @ -527,7 +549,9 @@ bool Room::Create(const std::string& name, const std::string& server_address, u1 | |||
|     } | ||||
|     address.port = server_port; | ||||
| 
 | ||||
|     room_impl->server = enet_host_create(&address, max_connections, NumChannels, 0, 0); | ||||
|     // In order to send the room is full message to the connecting client, we need to leave one slot
 | ||||
|     // open so enet won't reject the incoming connection without telling us
 | ||||
|     room_impl->server = enet_host_create(&address, max_connections + 1, NumChannels, 0, 0); | ||||
|     if (!room_impl->server) { | ||||
|         return false; | ||||
|     } | ||||
|  |  | |||
|  | @ -57,7 +57,8 @@ enum RoomMessageTypes : u8 { | |||
|     IdMacCollision, | ||||
|     IdVersionMismatch, | ||||
|     IdWrongPassword, | ||||
|     IdCloseRoom | ||||
|     IdCloseRoom, | ||||
|     IdRoomIsFull, | ||||
| }; | ||||
| 
 | ||||
| /// This is what a server [person creating a server] would use.
 | ||||
|  |  | |||
|  | @ -154,6 +154,9 @@ void RoomMember::RoomMemberImpl::MemberLoop() { | |||
|                     HandleJoinPacket(&event); // Get the MAC Address for the client
 | ||||
|                     SetState(State::Joined); | ||||
|                     break; | ||||
|                 case IdRoomIsFull: | ||||
|                     SetState(State::RoomIsFull); | ||||
|                     break; | ||||
|                 case IdNameCollision: | ||||
|                     SetState(State::NameCollision); | ||||
|                     break; | ||||
|  |  | |||
|  | @ -54,11 +54,12 @@ public: | |||
|         LostConnection, ///< Connection closed
 | ||||
| 
 | ||||
|         // Reasons why connection was rejected
 | ||||
|         NameCollision,  ///< Somebody is already using this name
 | ||||
|         MacCollision,   ///< Somebody is already using that mac-address
 | ||||
|         WrongVersion,   ///< The room version is not the same as for this RoomMember
 | ||||
|         WrongPassword,  ///< The password doesn't match the one from the Room
 | ||||
|         CouldNotConnect ///< The room is not responding to a connection attempt
 | ||||
|         NameCollision,   ///< Somebody is already using this name
 | ||||
|         MacCollision,    ///< Somebody is already using that mac-address
 | ||||
|         WrongVersion,    ///< The room version is not the same as for this RoomMember
 | ||||
|         WrongPassword,   ///< The password doesn't match the one from the Room
 | ||||
|         CouldNotConnect, ///< The room is not responding to a connection attempt
 | ||||
|         RoomIsFull       ///< Room is already at the maximum number of players
 | ||||
|     }; | ||||
| 
 | ||||
|     struct MemberInformation { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue