LCEMP/Minecraft.Client/Windows64/KBMConfig.cpp
2026-03-15 22:21:24 -03:00

179 lines
5.7 KiB
C++

#include "stdafx.h"
#ifdef _WINDOWS64
#include "KBMConfig.h"
#include <cstdio>
#include <cstring>
#include <cctype>
static KBMConfig s_config;
static bool s_loaded = false;
static int ParseVK(const char* val)
{
if (!val || !val[0]) return 0;
while (*val == ' ' || *val == '\t') val++;
if (_stricmp(val, "SPACE") == 0) return VK_SPACE;
if (_stricmp(val, "LSHIFT") == 0) return VK_LSHIFT;
if (_stricmp(val, "RSHIFT") == 0) return VK_RSHIFT;
if (_stricmp(val, "LCONTROL") == 0 || _stricmp(val, "LCTRL") == 0) return VK_LCONTROL;
if (_stricmp(val, "RCONTROL") == 0 || _stricmp(val, "RCTRL") == 0) return VK_RCONTROL;
if (_stricmp(val, "TAB") == 0) return VK_TAB;
if (_stricmp(val, "RETURN") == 0 || _stricmp(val, "ENTER") == 0) return VK_RETURN;
if (_stricmp(val, "BACK") == 0 || _stricmp(val, "BACKSPACE") == 0) return VK_BACK;
if (_stricmp(val, "ESCAPE") == 0 || _stricmp(val, "ESC") == 0) return VK_ESCAPE;
if (_stricmp(val, "F1") == 0) return VK_F1;
if (_stricmp(val, "F2") == 0) return VK_F2;
if (_stricmp(val, "F3") == 0) return VK_F3;
if (_stricmp(val, "F4") == 0) return VK_F4;
if (_stricmp(val, "F5") == 0) return VK_F5;
if (_stricmp(val, "F6") == 0) return VK_F6;
if (_stricmp(val, "F7") == 0) return VK_F7;
if (_stricmp(val, "F8") == 0) return VK_F8;
if (_stricmp(val, "F9") == 0) return VK_F9;
if (_stricmp(val, "F10") == 0) return VK_F10;
if (_stricmp(val, "F11") == 0) return VK_F11;
if (_stricmp(val, "F12") == 0) return VK_F12;
if (_stricmp(val, "LALT") == 0) return VK_LMENU;
if (_stricmp(val, "RALT") == 0) return VK_RMENU;
if (_stricmp(val, "CAPSLOCK") == 0) return VK_CAPITAL;
if (_stricmp(val, "INSERT") == 0) return VK_INSERT;
if (_stricmp(val, "DELETE") == 0) return VK_DELETE;
if (_stricmp(val, "HOME") == 0) return VK_HOME;
if (_stricmp(val, "END") == 0) return VK_END;
if (_stricmp(val, "PAGEUP") == 0) return VK_PRIOR;
if (_stricmp(val, "PAGEDOWN") == 0) return VK_NEXT;
if (strlen(val) == 1 && isalpha((unsigned char)val[0]))
return toupper((unsigned char)val[0]);
if (strlen(val) == 1 && isdigit((unsigned char)val[0]))
return val[0];
return 0;
}
static void WriteDefaultINI(const char* path)
{
FILE* f = fopen(path, "w");
if (!f) return;
fprintf(f, "[Keybinds]\n");
fprintf(f, "forward=W\n");
fprintf(f, "backward=S\n");
fprintf(f, "left=A\n");
fprintf(f, "right=D\n");
fprintf(f, "jump=SPACE\n");
fprintf(f, "sneak=LSHIFT\n");
fprintf(f, "sprint=LCONTROL\n");
fprintf(f, "inventory=E\n");
fprintf(f, "drop=Q\n");
fprintf(f, "crafting=TAB\n");
fprintf(f, "confirm=RETURN\n");
fprintf(f, "pause=ESCAPE\n");
fprintf(f, "thirdperson=F5\n");
fprintf(f, "debuginfo=F3\n");
fprintf(f, "voice=V\n");
fprintf(f, "\n[Voice]\n");
fprintf(f, "; mode: pushtotalk or active\n");
fprintf(f, "mode=pushtotalk\n");
fclose(f);
}
KBMConfig& KBMConfig::Get()
{
if (!s_loaded)
s_config.Load();
return s_config;
}
void KBMConfig::Load()
{
keyForward = 'W';
keyBackward = 'S';
keyLeft = 'A';
keyRight = 'D';
keyJump = VK_SPACE;
keySneak = VK_LSHIFT;
keySprint = VK_LCONTROL;
keyInventory = 'E';
keyDrop = 'Q';
keyCrafting = VK_TAB;
keyConfirm = VK_RETURN;
keyPause = VK_ESCAPE;
keyThirdPerson = VK_F5;
keyDebugInfo = VK_F3;
keyVoice = 'V';
voiceMode = 0;
s_loaded = true;
char exePath[MAX_PATH];
if (!GetModuleFileNameA(NULL, exePath, MAX_PATH)) return;
char* slash = strrchr(exePath, '\\');
if (slash) *(slash + 1) = 0;
char iniPath[MAX_PATH];
_snprintf_s(iniPath, MAX_PATH, _TRUNCATE, "%skbm_config.ini", exePath);
FILE* f = fopen(iniPath, "r");
if (!f)
{
WriteDefaultINI(iniPath);
return;
}
char line[256];
while (fgets(line, sizeof(line), f))
{
char* nl = strchr(line, '\n');
if (nl) *nl = 0;
char* cr = strchr(line, '\r');
if (cr) *cr = 0;
if (line[0] == '[' || line[0] == ';' || line[0] == '#' || line[0] == 0)
continue;
char* eq = strchr(line, '=');
if (!eq) continue;
*eq = 0;
char* key = line;
char* val = eq + 1;
while (*key == ' ' || *key == '\t') key++;
char* kend = key + strlen(key) - 1;
while (kend > key && (*kend == ' ' || *kend == '\t')) { *kend = 0; kend--; }
while (*val == ' ' || *val == '\t') val++;
char* vend = val + strlen(val) - 1;
while (vend > val && (*vend == ' ' || *vend == '\t')) { *vend = 0; vend--; }
if (_stricmp(key, "forward") == 0) { int v = ParseVK(val); if (v) keyForward = v; }
else if (_stricmp(key, "backward") == 0) { int v = ParseVK(val); if (v) keyBackward = v; }
else if (_stricmp(key, "left") == 0) { int v = ParseVK(val); if (v) keyLeft = v; }
else if (_stricmp(key, "right") == 0) { int v = ParseVK(val); if (v) keyRight = v; }
else if (_stricmp(key, "jump") == 0) { int v = ParseVK(val); if (v) keyJump = v; }
else if (_stricmp(key, "sneak") == 0) { int v = ParseVK(val); if (v) keySneak = v; }
else if (_stricmp(key, "sprint") == 0) { int v = ParseVK(val); if (v) keySprint = v; }
else if (_stricmp(key, "inventory") == 0) { int v = ParseVK(val); if (v) keyInventory = v; }
else if (_stricmp(key, "drop") == 0) { int v = ParseVK(val); if (v) keyDrop = v; }
else if (_stricmp(key, "crafting") == 0) { int v = ParseVK(val); if (v) keyCrafting = v; }
else if (_stricmp(key, "confirm") == 0) { int v = ParseVK(val); if (v) keyConfirm = v; }
else if (_stricmp(key, "pause") == 0) { int v = ParseVK(val); if (v) keyPause = v; }
else if (_stricmp(key, "thirdperson") == 0) { int v = ParseVK(val); if (v) keyThirdPerson = v; }
else if (_stricmp(key, "debuginfo") == 0) { int v = ParseVK(val); if (v) keyDebugInfo = v; }
else if (_stricmp(key, "voice") == 0) { int v = ParseVK(val); if (v) keyVoice = v; }
else if (_stricmp(key, "mode") == 0)
{
if (_stricmp(val, "active") == 0) voiceMode = 1;
else voiceMode = 0;
}
}
fclose(f);
}
#endif