From b7234ab31eb975ca2e81402440536c39103079db Mon Sep 17 00:00:00 2001 From: p2r3 Date: Wed, 27 Aug 2025 15:31:09 +0300 Subject: [PATCH] explicitly handle running out of player slots --- include/globals.h | 1 + src/globals.c | 1 + src/main.c | 5 ++++- src/procedures.c | 8 ++++++++ 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/include/globals.h b/include/globals.h index 69a951b..c45295b 100644 --- a/include/globals.h +++ b/include/globals.h @@ -131,6 +131,7 @@ extern BlockChange block_changes[20000]; extern int block_changes_count; extern PlayerData player_data[MAX_PLAYERS]; +extern int player_data_count; extern MobData mob_data[MAX_MOBS]; diff --git a/src/globals.c b/src/globals.c index e1ca985..e3825d7 100644 --- a/src/globals.c +++ b/src/globals.c @@ -40,5 +40,6 @@ BlockChange block_changes[20000]; int block_changes_count = 0; PlayerData player_data[MAX_PLAYERS]; +int player_data_count = 0; MobData mob_data[MAX_MOBS]; diff --git a/src/main.c b/src/main.c index 1510577..879eca6 100644 --- a/src/main.c +++ b/src/main.c @@ -47,7 +47,10 @@ void handlePacket (int client_fd, int length, int packet_id, int state) { uint8_t uuid[16]; char name[16]; if (cs_loginStart(client_fd, uuid, name)) break; - if (reservePlayerData(client_fd, uuid, name)) break; + if (reservePlayerData(client_fd, uuid, name)) { + recv_count = 0; + return; + } if (sc_loginSuccess(client_fd, uuid, name)) break; } else if (state == STATE_CONFIGURATION) { if (cs_clientInformation(client_fd)) break; diff --git a/src/procedures.c b/src/procedures.c index b7aad05..0f7d08f 100644 --- a/src/procedures.c +++ b/src/procedures.c @@ -79,10 +79,12 @@ int reservePlayerData (int client_fd, uint8_t *uuid, char *name) { } } if (empty) { + if (player_data_count >= MAX_PLAYERS) return 1; player_data[i].client_fd = client_fd; memcpy(player_data[i].uuid, uuid, 16); memcpy(player_data[i].name, name, 16); resetPlayerData(&player_data[i]); + player_data_count ++; return 0; } } @@ -105,6 +107,12 @@ void clearPlayerFD (int client_fd) { for (int i = 0; i < MAX_PLAYERS; i ++) { if (player_data[i].client_fd == client_fd) { player_data[i].client_fd = -1; + break; + } + } + for (int i = 0; i < MAX_PLAYERS * 2; i += 2) { + if (client_states[i] == client_fd) { + client_states[i] = -1; return; } }