Working on joining and leaving.
First test of joining and leaving.
Joining and leaving are now working.
Implemented starting, stopping and pausing of game. Fixes #3 and #4.
Fixes #5. Fixes game state not being set to waiting when first player to join game.
Rewrote player registration.
Two joins at the same time for the same player ID are now properly handled.
Implemented player number selection using dice rolling.

When starting a fresh game (not resuming a paused one), all players choose a random number (in the integer range). They share their roll and sort all numbers to find the player numbers to identify their object.

Also fixed a lot of issues with joining and leaving.
Implemented object found broadcasting. Fixes #2.
Small method visibility fix.
Handle position updates. Fixes #7.
Keep track of missing players. Fixes #6.

Missing players are now shared with reconnecting clients to ensure all clients have a consistent view on the game. When a player reconnects, it is removed from the list of missing players.
Added getPlayers() to retrieve a set of connected players.
Fixed bug with joining.

Client identifier of own player was not sent to joining player.
Player numbers now range from 0 to 3 instead of from 1 to 4, as declared in the object barcode specifications.
Split rolling and starting. Rewrote joining/leaving procedures.

Successfully joined players now notify other players to let them track the correct player.

Player numbers are rolled as soon as all players are ready. Players can then start the game on-demand.
Split rolling and starting. Rewrote joining/leaving procedures.

Successfully joined players now notify other players to let them track the correct player. Channels are now opened and closes when joining and leaving.

Player numbers are rolled as soon as all players are ready. Players can then start the game on-demand.
Small fix for pause.
Each consumer now declares its own queue.
Renamed isRolled() to hasPlayerNumber().
Do not cancel consumer on after each request.