diff --git a/MultiServer.py b/MultiServer.py index 4eadbb79..9a91b50c 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -781,7 +781,8 @@ async def on_client_disconnected(ctx: Context, client: Client): async def on_client_joined(ctx: Context, client: Client): - update_client_status(ctx, client, ClientStatus.CLIENT_CONNECTED) + if ctx.client_game_state[client.team, client.slot] == ClientStatus.CLIENT_UNKNOWN: + update_client_status(ctx, client, ClientStatus.CLIENT_CONNECTED) version_str = '.'.join(str(x) for x in client.version) verb = "tracking" if "Tracker" in client.tags else "playing" ctx.broadcast_text_all( @@ -798,11 +799,12 @@ async def on_client_joined(ctx: Context, client: Client): async def on_client_left(ctx: Context, client: Client): - update_client_status(ctx, client, ClientStatus.CLIENT_UNKNOWN) + if len(ctx.clients[client.team][client.slot]) < 1: + update_client_status(ctx, client, ClientStatus.CLIENT_UNKNOWN) + ctx.client_connection_timers[client.team, client.slot] = datetime.datetime.now(datetime.timezone.utc) ctx.broadcast_text_all( "%s (Team #%d) has left the game" % (ctx.get_aliased_name(client.team, client.slot), client.team + 1), {"type": "Part", "team": client.team, "slot": client.slot}) - ctx.client_connection_timers[client.team, client.slot] = datetime.datetime.now(datetime.timezone.utc) async def countdown(ctx: Context, timer: int): diff --git a/docs/network protocol.md b/docs/network protocol.md index c320934b..f4e261dc 100644 --- a/docs/network protocol.md +++ b/docs/network protocol.md @@ -70,7 +70,7 @@ Sent to clients when they connect to an Archipelago server. | tags | list\[str\] | Denotes special features or capabilities that the sender is capable of. Example: `WebHost` | | password | bool | Denoted whether a password is required to join this room. | | permissions | dict\[str, [Permission](#Permission)\[int\]\] | Mapping of permission name to [Permission](#Permission), keys are: "release", "collect" and "remaining". | -| hint_cost | int | The amount of points it costs to receive a hint from the server. | +| hint_cost | int | The percentage of total locations that need to be checked to receive a hint from the server. | | location_check_points | int | The amount of hint points you receive per item/location check completed. | | games | list\[str\] | List of games present in this multiworld. | | datapackage_versions | dict\[str, int\] | Data versions of the individual games' data packages the server will send. Used to decide which games' caches are outdated. See [Data Package Contents](#Data-Package-Contents). **Deprecated. Use `datapackage_checksums` instead.** | @@ -555,12 +555,16 @@ Color options: `flags` contains the [NetworkItem](#NetworkItem) flags that belong to the item ### Client States -An enumeration containing the possible client states that may be used to inform the server in [StatusUpdate](#StatusUpdate). +An enumeration containing the possible client states that may be used to inform +the server in [StatusUpdate](#StatusUpdate). The MultiServer automatically sets +the client state to `ClientStatus.CLIENT_CONNECTED` on the first active connection +to a slot. ```python import enum class ClientStatus(enum.IntEnum): CLIENT_UNKNOWN = 0 + CLIENT_CONNECTED = 5 CLIENT_READY = 10 CLIENT_PLAYING = 20 CLIENT_GOAL = 30