aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/Windows64/Windows64_Minecraft.cpp
diff options
context:
space:
mode:
authorMatthew Toro <48634881+mattsumi@users.noreply.github.com>2026-03-08 04:10:15 -0400
committerGitHub <noreply@github.com>2026-03-08 03:10:15 -0500
commit3a5f1b617931d00145504d97ef4fbef4f3138b5b (patch)
tree925a71e25f2b9256f85c50833585a791e44771de /Minecraft.Client/Windows64/Windows64_Minecraft.cpp
parentd461012efb3855d1fbfe9dc3696562223f21334a (diff)
Add "Add Server" functionally to "Join Game" Menu + relocate servers.txt to servers.db. (#911)
* Add "Add Server" functionally to "Join Game" Menu + relocate servers.txt to servers.db * enchancement: add edit and delete server functionality, solves FriendSessionInfo corruption issues
Diffstat (limited to 'Minecraft.Client/Windows64/Windows64_Minecraft.cpp')
-rw-r--r--Minecraft.Client/Windows64/Windows64_Minecraft.cpp66
1 files changed, 66 insertions, 0 deletions
diff --git a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp
index 35afc694..678c8d62 100644
--- a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp
+++ b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp
@@ -1257,6 +1257,72 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
MultiByteToWideChar(CP_ACP, 0, g_Win64Username, -1, g_Win64UsernameW, 17);
+ // convert servers.txt to servers.db
+ if (GetFileAttributesA("servers.txt") != INVALID_FILE_ATTRIBUTES &&
+ GetFileAttributesA("servers.db") == INVALID_FILE_ATTRIBUTES)
+ {
+ FILE* txtFile = nullptr;
+ if (fopen_s(&txtFile, "servers.txt", "r") == 0 && txtFile)
+ {
+ struct MigEntry { std::string ip; uint16_t port; std::string name; };
+ std::vector<MigEntry> migEntries;
+ char line[512];
+
+ while (fgets(line, sizeof(line), txtFile))
+ {
+ int l = (int)strlen(line);
+ while (l > 0 && (line[l - 1] == '\n' || line[l - 1] == '\r' || line[l - 1] == ' '))
+ line[--l] = '\0';
+ if (l == 0) continue;
+
+ std::string srvIP = line;
+
+ if (!fgets(line, sizeof(line), txtFile)) break;
+ l = (int)strlen(line);
+ while (l > 0 && (line[l - 1] == '\n' || line[l - 1] == '\r' || line[l - 1] == ' '))
+ line[--l] = '\0';
+ uint16_t srvPort = (uint16_t)atoi(line);
+
+ std::string srvName;
+ if (fgets(line, sizeof(line), txtFile))
+ {
+ l = (int)strlen(line);
+ while (l > 0 && (line[l - 1] == '\n' || line[l - 1] == '\r' || line[l - 1] == ' '))
+ line[--l] = '\0';
+ srvName = line;
+ }
+
+ if (!srvIP.empty() && srvPort > 0)
+ migEntries.push_back({srvIP, srvPort, srvName});
+ }
+ fclose(txtFile);
+
+ if (!migEntries.empty())
+ {
+ FILE* dbFile = nullptr;
+ if (fopen_s(&dbFile, "servers.db", "wb") == 0 && dbFile)
+ {
+ fwrite("MCSV", 1, 4, dbFile);
+ uint32_t ver = 1;
+ uint32_t cnt = (uint32_t)migEntries.size();
+ fwrite(&ver, sizeof(uint32_t), 1, dbFile);
+ fwrite(&cnt, sizeof(uint32_t), 1, dbFile);
+ for (size_t i = 0; i < migEntries.size(); i++)
+ {
+ uint16_t ipLen = (uint16_t)migEntries[i].ip.length();
+ fwrite(&ipLen, sizeof(uint16_t), 1, dbFile);
+ fwrite(migEntries[i].ip.c_str(), 1, ipLen, dbFile);
+ fwrite(&migEntries[i].port, sizeof(uint16_t), 1, dbFile);
+ uint16_t nameLen = (uint16_t)migEntries[i].name.length();
+ fwrite(&nameLen, sizeof(uint16_t), 1, dbFile);
+ fwrite(migEntries[i].name.c_str(), 1, nameLen, dbFile);
+ }
+ fclose(dbFile);
+ }
+ }
+ }
+ }
+
// Initialize global strings
MyRegisterClass(hInstance);