From 4be3abc0721e9b9189a3c3c4af718786531692e0 Mon Sep 17 00:00:00 2001 From: Jack Bittner Date: Mon, 12 Jan 2026 16:15:28 -0600 Subject: [PATCH 1/7] feat: initial success --- CMakeLists.txt | 11 +-- src/mcc/mcc.cpp | 4 ++ src/mcc/mcc.zip | Bin 0 -> 60237 bytes src/mcc/settings/Settings.cpp | 106 ++++++++++++++++++++++++++++ src/mcc/settings/Settings.h | 26 +++++++ src/mcc/splitscreen/Splitscreen.cpp | 43 +++++++++-- 6 files changed, 180 insertions(+), 10 deletions(-) create mode 100644 src/mcc/mcc.zip create mode 100644 src/mcc/settings/Settings.cpp create mode 100644 src/mcc/settings/Settings.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f81a616..cc24ddc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,27 +22,28 @@ include_directories(${CMAKE_SOURCE_DIR}/lib/json/include) # imgui add_library(imgui SHARED IMPORTED) include_directories(${CMAKE_SOURCE_DIR}/lib/imgui/inc) -set_target_properties(imgui PROPERTIES IMPORTED_IMPLIB "${CMAKE_SOURCE_DIR}/lib/imgui/lib/${CMAKE_BUILD_TYPE}/imgui.lib") +set_target_properties(imgui PROPERTIES IMPORTED_IMPLIB "${CMAKE_SOURCE_DIR}/lib/imgui/lib/release/imgui.lib") # lua add_library(lua SHARED IMPORTED) include_directories(${CMAKE_SOURCE_DIR}/lib/lua/inc) -set_target_properties(lua PROPERTIES IMPORTED_IMPLIB "${CMAKE_SOURCE_DIR}/lib/lua/lib/${CMAKE_BUILD_TYPE}/lua.lib") +set_target_properties(lua PROPERTIES IMPORTED_IMPLIB "${CMAKE_SOURCE_DIR}/lib/lua/lib/release/lua.lib") # spdlog add_library(spdlog SHARED IMPORTED) include_directories(${CMAKE_SOURCE_DIR}/lib/spdlog/inc) -set_target_properties(spdlog PROPERTIES IMPORTED_IMPLIB "${CMAKE_SOURCE_DIR}/lib/spdlog/lib/${CMAKE_BUILD_TYPE}/spdlog.lib") +set_target_properties(spdlog PROPERTIES IMPORTED_IMPLIB "${CMAKE_SOURCE_DIR}/lib/spdlog/lib/release/spdlog.lib") # tinyxml2 add_library(tinyxml2 SHARED IMPORTED) include_directories(${CMAKE_SOURCE_DIR}/lib/tinyxml2/inc) -set_target_properties(tinyxml2 PROPERTIES IMPORTED_IMPLIB "${CMAKE_SOURCE_DIR}/lib/tinyxml2/lib/${CMAKE_BUILD_TYPE}/tinyxml2.lib") +set_target_properties(tinyxml2 PROPERTIES IMPORTED_IMPLIB "${CMAKE_SOURCE_DIR}/lib/tinyxml2/lib/release/tinyxml2.lib") # minhook add_library(minhook SHARED IMPORTED) include_directories(${CMAKE_SOURCE_DIR}/lib/minhook/inc) -set_target_properties(minhook PROPERTIES IMPORTED_IMPLIB "${CMAKE_SOURCE_DIR}/lib/minhook/lib/${CMAKE_BUILD_TYPE}/libMinhook.x64.lib") +# set_target_properties(minhook PROPERTIES IMPORTED_IMPLIB "${CMAKE_SOURCE_DIR}/lib/minhook/lib/${CMAKE_BUILD_TYPE}/libMinHook.x64.lib") +set_target_properties(minhook PROPERTIES IMPORTED_IMPLIB "${CMAKE_SOURCE_DIR}/lib/minhook/lib/release/libMinHook.x64.lib") # utils file(GLOB_RECURSE UTILS_SRC ${CMAKE_SOURCE_DIR}/lib/utils/src/*.cpp) diff --git a/src/mcc/mcc.cpp b/src/mcc/mcc.cpp index 079ae65..a5e695d 100644 --- a/src/mcc/mcc.cpp +++ b/src/mcc/mcc.cpp @@ -8,6 +8,7 @@ #include "mcc/module/Module.h" #include "mcc/network/Network.h" #include "mcc/splitscreen/Splitscreen.h" +#include "mcc/settings/Settings.h" namespace MCC { static bool* bIsInGame; @@ -66,6 +67,9 @@ namespace MCC { return false; } + MCC::Settings::Splitscreen::Load(); + MCC::Settings::Splitscreen::ApplyToRuntime(); + ////Ask user if they want to enable network // if (MessageBox(nullptr, "Would you like to enable network?", "Network", MB_YESNO) == IDYES) // { diff --git a/src/mcc/mcc.zip b/src/mcc/mcc.zip new file mode 100644 index 0000000000000000000000000000000000000000..afe99622936bb0d55fb8b4507452699f7d2fb2b5 GIT binary patch literal 60237 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 +#include +#include +#include + +using json = nlohmann::json; + +namespace fs = std::filesystem; + +namespace MCC::Settings { + static SplitscreenConfig g_Config; + + static fs::path GetConfigPath() { + char exePath[MAX_PATH] = {0}; + if (!GetModuleFileNameA(nullptr, exePath, MAX_PATH)) + return "settings.json"; + + fs::path dir = fs::path(exePath).parent_path(); + return dir / "settings.json"; + } + + + const SplitscreenConfig& Splitscreen::Get() { + return g_Config; + } + + bool Splitscreen::Load() { + fs::path path = GetConfigPath(); + + if (!fs::exists(path)) + return false; + + std::ifstream file(path); + if (!file.is_open()) + return false; + + json j; + file >> j; + + if (!j.contains("splitscreen")) + return false; + + auto& s = j["splitscreen"]; + + if (j.contains("version")) + g_Config.version = j["version"].get(); + + g_Config.b_override = s.value("b_override", false); + g_Config.player_count = s.value("player_count", 1); + g_Config.b_use_player0_profile = s.value("b_use_player0_profile", true); + g_Config.b_player0_use_km = s.value("b_player0_use_km", false); + g_Config.b_override_profile = s.value("b_override_profile", false); + + return true; + } + + bool Splitscreen::Save() { + fs::path path = GetConfigPath(); + + json j; + j["version"] = g_Config.version; + + j["splitscreen"] = { + {"b_override", g_Config.b_override}, + {"player_count", g_Config.player_count}, + {"b_use_player0_profile", g_Config.b_use_player0_profile}, + {"b_player0_use_km", g_Config.b_player0_use_km}, + {"b_override_profile", g_Config.b_override_profile} + }; + + std::ofstream file(path, std::ios::trunc); + if (!file.is_open()) + return false; + + file << j.dump(4); + return true; + } + + void Splitscreen::ApplyToRuntime() { + auto p = AlphaRing::Global::MCC::Splitscreen(); + if (!p) + return; + + p->b_override = g_Config.b_override; + p->player_count = g_Config.player_count; + p->b_use_player0_profile = g_Config.b_use_player0_profile; + p->b_player0_use_km = g_Config.b_player0_use_km; + p->b_override_profile = g_Config.b_override_profile; + } + + void Splitscreen::CaptureFromRuntime() { + auto p = AlphaRing::Global::MCC::Splitscreen(); + if (!p) + return; + + g_Config.b_override = p->b_override; + g_Config.player_count = p->player_count; + g_Config.b_use_player0_profile = p->b_use_player0_profile; + g_Config.b_player0_use_km = p->b_player0_use_km; + g_Config.b_override_profile = p->b_override_profile; + } +} \ No newline at end of file diff --git a/src/mcc/settings/Settings.h b/src/mcc/settings/Settings.h new file mode 100644 index 0000000..4578e0f --- /dev/null +++ b/src/mcc/settings/Settings.h @@ -0,0 +1,26 @@ +#pragma once + +#include + +namespace MCC::Settings { + + struct SplitscreenConfig { + std::string version = "1.3528.0.0"; + + bool b_override = false; + int player_count = 1; + bool b_use_player0_profile = true; + bool b_player0_use_km = false; + bool b_override_profile = false; + }; + + namespace Splitscreen { + bool Load(); + bool Save(); + + void ApplyToRuntime(); + void CaptureFromRuntime(); + + const SplitscreenConfig& Get(); + } +} diff --git a/src/mcc/splitscreen/Splitscreen.cpp b/src/mcc/splitscreen/Splitscreen.cpp index 54a0c6a..531e722 100644 --- a/src/mcc/splitscreen/Splitscreen.cpp +++ b/src/mcc/splitscreen/Splitscreen.cpp @@ -1,5 +1,7 @@ #include "Splitscreen.h" +#include "mcc/settings/Settings.h" + #include "common.h" #include "global/Global.h" @@ -107,22 +109,48 @@ namespace MCC::Splitscreen { } void RealContext() { + bool dirty = false; char buffer[10]; auto p_setting = AlphaRing::Global::MCC::Splitscreen(); if (ImGui::BeginMenuBar()) { - ImGui::MenuItem(p_setting->b_override ? "Disable" : "Enable", nullptr, &p_setting->b_override); + // ImGui::MenuItem(p_setting->b_override ? "Disable" : "Enable", nullptr, &p_setting->b_override); + dirty |= ImGui::MenuItem( + p_setting->b_override ? "Disable" : "Enable", + nullptr, + &p_setting->b_override + ); if (ImGui::BeginMenu("Options")) { - ImGui::MenuItem("Use player1's profile", nullptr, &p_setting->b_use_player0_profile); - ImGui::MenuItem("Enable K/M for player1", nullptr, &p_setting->b_player0_use_km); - ImGui::MenuItem("Override profile", nullptr, &p_setting->b_override_profile); + // ImGui::MenuItem("Use player1's profile", nullptr, &p_setting->b_use_player0_profile); + dirty |= ImGui::MenuItem( + "Use player1's profile", + nullptr, + &p_setting->b_use_player0_profile + ); + // ImGui::MenuItem("Enable K/M for player1", nullptr, &p_setting->b_player0_use_km); + dirty |= ImGui::MenuItem( + "Enable K/M for player1", + nullptr, + &p_setting->b_player0_use_km + ); + // ImGui::MenuItem("Override profile", nullptr, &p_setting->b_override_profile); + dirty |= ImGui::MenuItem( + "Override profile", + nullptr, + &p_setting->b_override_profile + ); ImGui::EndMenu(); } #pragma region player count ImGui::PushItemWidth(200); + // int count = p_setting->player_count; + // if (ImGui::InputInt("Players", &count) && count >= 1 && count <=4) { + // p_setting->player_count = count; + // } int count = p_setting->player_count; - if (ImGui::InputInt("Players", &count) && count >= 1 && count <=4) { + if (ImGui::InputInt("Players", &count) && count >= 1 && count <= 4) { p_setting->player_count = count; + dirty = true; } ImGui::PopItemWidth(); ImGui::EndMenuBar(); @@ -139,5 +167,10 @@ namespace MCC::Splitscreen { } ImGui::EndTabBar(); } + + if (dirty) { + MCC::Settings::Splitscreen::CaptureFromRuntime(); + MCC::Settings::Splitscreen::Save(); + } } } \ No newline at end of file From 10aadacd424a348cdddc9c09e0767481981cb157 Mon Sep 17 00:00:00 2001 From: Jack Bittner Date: Tue, 13 Jan 2026 07:37:05 -0600 Subject: [PATCH 2/7] feat: added working profile saving --- src/mcc/CGameManager.cpp | 2 +- src/mcc/mcc.zip | Bin 60237 -> 60245 bytes src/mcc/settings/Settings.cpp | 92 +++++++++++++++++++++++++--- src/mcc/settings/Settings.h | 11 +++- src/mcc/splitscreen/Splitscreen.cpp | 2 + 5 files changed, 96 insertions(+), 11 deletions(-) diff --git a/src/mcc/CGameManager.cpp b/src/mcc/CGameManager.cpp index 1de3c20..572c02e 100644 --- a/src/mcc/CGameManager.cpp +++ b/src/mcc/CGameManager.cpp @@ -12,7 +12,7 @@ CGameManager::Profile_t* CGameManager::get_profile(int index) {return container. ProfileContainer_t::ProfileContainer_t() { __int64 guid[2]; - const int controller_map[4] {3, 0, 1, 2}; + const int controller_map[4] {0, 1, 2, 3}; memset(this, 0, sizeof(ProfileContainer_t)); CoCreateGuid((GUID*)guid); diff --git a/src/mcc/mcc.zip b/src/mcc/mcc.zip index afe99622936bb0d55fb8b4507452699f7d2fb2b5..b331c92e59b43c5aae7f9f32cb02aaa02857c8ee 100644 GIT binary patch delta 2509 zcmYLLc|26@7oU5_zD-KVo{&PaW>m74rIEEs%p^>MvTsvpG}a`BOWD^-#u7$DL@A9W zi5WtnhRRxm%G;u!8NKiC-apPc-*e9MJ?Gr}`8?;vEBMeWIN2V0T*p`EQpClU_1t+} z;2MTn!0!sM>P7A2 zgoC!++#Chr2#5dc)IF)q#>)Ipf}jYN8hFYBV7o*wYC*Lw0#NOsbcQ1@_zOeTIi1a6 zg_y3{;2#Xt&&?75e`BbP7&(w_51;AfWU?6%5!)d@4?bw}tTg*@NaZ{N67#qO!mw1b zhcUpG3{TA8a5SeTGOh^ZC~e15X4fyUchg5@8v(m z$97mn(EpZ<0l7CixS02E9s*K~Oa^(e)S5_J0OY|^*Q2HZwmp6M#ecOH_-u#fW0XKX zELHT%)&Hl~kuHIPScvQ)PBn{F13>kK-wgEt4EVLdaPTiK$2e7fJ>)o4`H>9cab9$Z0miw=ccZq^f*3{08X>(kjxl5bD zuKAjqgUKjN*hCbH2RFHXm4yHOj2SpCD7#dRlli=~jE|#)R|;@WCso}=p%Vlcjqw<`=9tTQ2IV{ksG;7#ZKQ_%rT1Ia(~R~O%LkMEPk z`E_=TbJLhJ^t+$w{XC`-d=~ywG;u4LXMH1*zdwH;31W1F>(hm8n7M0TR+b~N1;=y? zo>`caBMP56ExFiQHn*l8~oseTY)mYa-ki55!;>3t^D86>Y^td80hyuv?S2cAOJ=yr!F%QYIAgZ69Bh4UNh59dC zWyZ%jZ^=EAdP8%qPvw)$M9U8o;L)7_ej-M z(NwyFOy*nfP#-)d^;s9KDF58LtQVmsFP5i3u!4g!!eUN@$rHPfUYAsBs!@#E?n{I9cajYX|*1tJ2v`z^_Lu_xLrYQ zJHQiO!HB$E;WD+5a@$SyD{V{smUr?;fY|dVav`cgLbD!NmG|->eZ_I=BHHK?GCJga z_34rdlW5na+d?!VLU*eT5pQsT5>mt1!)L6aI`u?z=ls3u$a+m?Rhm-Li`eV#Ik#MP zPFS5G1jL9pR5S&umR_jI`PN&!ALpvArhjLlXa9}rPje5Bqt8ZJA`4BgEFZ|!>HnzW z`}JNuO32Kck2T$)+{t6NnBt<1Yb%G5`5CqDCx4b#HT-70A(FLsv)V^T+mB2`#I&fd zHRu(pdi_cnjqd+EYao8hetiN_$8GmD{LRvjWOuK!)J1dUW4juv8;0V{za1|1NgIr{ z*t^}yN{VNkGSCB{pAu$nX$$RWp+?_m(jioTWiH~0{=Pg zmNG_fOGiuHoP=$YeO=m0vdHtx36)--=BXFp{yYZuv(jjP98nzk9reY^U70kF0wr5AtvNlc7%K7URRehM;`^> z@}x=AQ-i&%o8gq;FkhC+y|9pgx0Jf*UR}B}=D+sb=(XJXlSSbiM4CF$@bke!Wq7{`XLM~@|G)3K?EFphI4$Q(<*R;Y&be$%|wTscb!^{1eq6AWDr}to( z#Qsd@J!de@n2h(@N6MNAjU`nEEvo3ZQ}r30)$$Z4)l-*ldTv~UZ>5Uelb+?M1~2c$ zckeJhzU}AwMdp`~C=@^%ThncZI3DacI~q zQ2w+zn2muZr`3Tp2r+{N>>&RcG+eS725B@aLUs%Z2$+=uUP3anHUJLto^=9Lpw?Lj m;1slF&Ix!6;pQCRGISWEMc<5GnUezQA(43`&-s_Ijpu&^dZA+g delta 2519 zcmYLLc|4Tu8Xhx}2_I_AFeZk^hf&B*S;kUnBHKueC5&AOk#%IUrZ8`|`HZcPYAneh zONWZak}Zd}i3(+>wE46+-uIk3zvqwZcis1M-Pip-&-?p5_xKaU;1fiSJv_$hwqvCr z{HzssL$Dk|HquQ1;yXMbbQLA&fjr5)SqMY}>vqHz0KgBa%GEdb>(F={~l$sK^Wt0EZJb}a-gfkC$tkcLu^ zKpot1mxE+aJqP|P1MS44rGQXxVL;|7is`r=RN;fA0F-wusLb&;gOsB_?!OfFU_6sn z302x3PzmLq1s;M7@xj?(`gX866#g9I5245Dd0{Ya9nJgI?+K8H#r*X@nG~QHmkEaI z;%p(w&-hsgXA=j1Ib#8KpcJr}L;&|mUdZ?@y`2m;3*>mCxfTpHNEUYS1%$^^dww}; z07uhRKxt$;3zAA?LZ?%oNrvdpcr;9NDL7=cg4XpUE;wE$?Vbu}>@G2^hTmv2K zcuflUQ*f#EzL24)9T_2rf(dUeA%9@(Hij@Su3nMe6~bDnQVo~A-jv^MzoaR>7~R=3MBc@}aN8$e!sh#W%s(^@GZU2@fN2`GfKAZ#@5tOE~pz(Q3fYKu)fjzOf>Lwkl4?7Y)Vg(0VMZb> z^$|Ivbgq&K<5hTNlg;P?3 z$|~@sj%KBrS^(GftkZ9ayIPPKeXHHTBU`=nXQJkYkJd}9`wH#~FAb=D1G~?E71c8w zHO?Id}mYQBKE}mg!>t9d)>J35VxzcK9-@u4yMvBgxxZQME44ZvUQX zDI4_QKc{+;W-EvPVJ0BgS?#&vnU_~P2}vu+R8uBe z@IKvOHk*4@q;e8nAp!qBt?U)Hd?X?q-D7u$mvru1%;C61j`3>$tp4>gSBfdhI%;;W z(DAB_WrWzn(FvK$FBa&<)sbrnb|U>PVdP$+;Kh=qM>?{2r1v*3HJ7SD=k(}N%#du^ zw$LDTT&Bt;VpWM8sx8FAZ}3ooyDYDv$-QJSQi_*$by^0c5^Z6K2t8e4yGi7Ct0bjL z#M_31AA?o1kz~Jtb10Y=$rU{yyLmM)$}U#c;T^%i;J|_PS$h1&YHsypjF@ScqP8hE zc%Ydo>n<$d!}zG*Wz%5bry3-Vbk%eIz`ijPkkXvnETxc}knPlXc;P-iZwKdZ)>7nI#GBTqW{S|gc{#o%?yaFS)$$Cc{z3hOGj6o1@Mxec^9IYDmBhZA zR&s(gJD>k4oo*ABZ{OFC5;4}ijv?eQ%u>6`6qj=os1EF_md+n`4q&6mm3h^Zi4F1= zxUmnXTWBnNQF_Sc}g3S4FbD_&1euQAt5m(tIu z-$8pHtERu)MZ3&R>qxMuGtQ;KpY~CKuS$J_4!iv6INOdt4K9vE5ue$ov@7|r!ZFOo zJ1OVLwvUdoCq>!ID+Z%{#RE$B%-2jRt1@{8BO;dczV$$ulWC$JY&UM;`H1uv3szU? zDRH5fg+P?}swn2Gmg`GRyDxtLVIM|jt%Fy}OmiJc@9^@5hi`5?m(yRy7>P~nymBTk z)rkwIPgsk8JYQSb>hrXb>>q4wR8bef>f`I)xfmnf%xTE`O#7~Om@@FC>zU(~Nb6`b zN}b2PrJ2j8zbw1y>SaF;*vPk%h}f=U1xc< zZ+s&k#F_Of{*bGGtoy?x(pBHJs5GDS);@pQik@u$hxNc{e`#1b(cx4mLf<2vnAXd` zHU(>Hqgm<_IJ+MyEU##%I8Wc**QwVRoMcqR<1;`1l*8UC^;lYdakQ0cj7>Ui%&KWT z8tota^OkCF_B| zZl;T#^z7G=^m;I7_&x6NBJ9)p{-$J}c8mC>8?B5JYa<#8=aVaX0$xUAMy^s+Jw4k( znKPrN*Pfk^F0V1-N5XrmFGCANXHiVIA*An29tDW(T0CGQiCi-K|Gz>vd}Zfz{d#K3QIE)zCa6 z*1-m&rCn&?LC1A46Wpl@e1qy=G4+Dn#@mocZsBK%H27}pbtua{` J%x4&6{{dj4a6(); - g_Config.b_override = s.value("b_override", false); - g_Config.player_count = s.value("player_count", 1); + g_Config.player_count = s.value("player_count", 1); g_Config.b_use_player0_profile = s.value("b_use_player0_profile", true); g_Config.b_player0_use_km = s.value("b_player0_use_km", false); g_Config.b_override_profile = s.value("b_override_profile", false); @@ -58,11 +55,44 @@ namespace MCC::Settings { return true; } + bool Profile::Load() { + fs::path path = GetConfigPath(); + + if (!fs::exists(path)) + return false; + + std::ifstream file(path); + if (!file.is_open()) + return false; + + json j; + file >> j; + + if (!j.contains("profile")) + return false; + + auto& p = j["profile"]; + for (int i = 0; i < 4; ++i) { + if (!p.contains(std::to_string(i))) + continue; + + auto& entry = p[std::to_string(i)]; + g_Profiles[i].id = entry.value("id", g_Profiles[i].id); + g_Profiles[i].controller_index = entry.value("controller_index", g_Profiles[i].controller_index); + + auto name = entry.value("name", ""); + if (!name.empty()) + mbstowcs(g_Profiles[i].name, name.c_str(), 1024); + } + + return true; + + } + bool Splitscreen::Save() { fs::path path = GetConfigPath(); json j; - j["version"] = g_Config.version; j["splitscreen"] = { {"b_override", g_Config.b_override}, @@ -80,6 +110,38 @@ namespace MCC::Settings { return true; } + bool Profile::Save() { + fs::path path = GetConfigPath(); + + json j; + if (fs::exists(path)) { + std::ifstream file(path); + if (file.is_open()) { + file >> j; + } + } + + for (int i = 0; i < 4; ++i) { + std::string name; + size_t len = wcslen(g_Profiles[i].name); + name.resize(len); + wcstombs(name.data(), g_Profiles[i].name, len); + + j["profile"][std::to_string(i)] = { + {"id", g_Profiles[i].id}, + {"controller_index", g_Profiles[i].controller_index}, + {"name", name} + }; + } + + std::ofstream file(path, std::ios::trunc); + if (!file.is_open()) + return false; + + file << j.dump(4); + return true; + } + void Splitscreen::ApplyToRuntime() { auto p = AlphaRing::Global::MCC::Splitscreen(); if (!p) @@ -92,15 +154,29 @@ namespace MCC::Settings { p->b_override_profile = g_Config.b_override_profile; } + void Profile::ApplyToRuntime() { + for (int i = 0; i < 4; ++i) { + auto p = CGameManager::get_profile(i); + *p = g_Profiles[i]; + } + } + void Splitscreen::CaptureFromRuntime() { auto p = AlphaRing::Global::MCC::Splitscreen(); if (!p) return; g_Config.b_override = p->b_override; - g_Config.player_count = p->player_count; + g_Config.player_count = p->player_count; g_Config.b_use_player0_profile = p->b_use_player0_profile; g_Config.b_player0_use_km = p->b_player0_use_km; g_Config.b_override_profile = p->b_override_profile; } + + void Profile::CaptureFromRuntime() { + for (int i = 0; i < 4; ++i) { + auto p = CGameManager::get_profile(i); + g_Profiles[i] = *p; + } + } } \ No newline at end of file diff --git a/src/mcc/settings/Settings.h b/src/mcc/settings/Settings.h index 4578e0f..027b4f7 100644 --- a/src/mcc/settings/Settings.h +++ b/src/mcc/settings/Settings.h @@ -1,12 +1,11 @@ #pragma once #include +#include "../CGameManager.h" namespace MCC::Settings { struct SplitscreenConfig { - std::string version = "1.3528.0.0"; - bool b_override = false; int player_count = 1; bool b_use_player0_profile = true; @@ -23,4 +22,12 @@ namespace MCC::Settings { const SplitscreenConfig& Get(); } + + namespace Profile { + bool Load(); + bool Save(); + + void ApplyToRuntime(); + void CaptureFromRuntime(); + } } diff --git a/src/mcc/splitscreen/Splitscreen.cpp b/src/mcc/splitscreen/Splitscreen.cpp index 531e722..3940806 100644 --- a/src/mcc/splitscreen/Splitscreen.cpp +++ b/src/mcc/splitscreen/Splitscreen.cpp @@ -170,7 +170,9 @@ namespace MCC::Splitscreen { if (dirty) { MCC::Settings::Splitscreen::CaptureFromRuntime(); + MCC::Settings::Profile::CaptureFromRuntime(); MCC::Settings::Splitscreen::Save(); + MCC::Settings::Profile::Save(); } } } \ No newline at end of file From f03070a975bed94857ec0b62b2f563fc842a4136 Mon Sep 17 00:00:00 2001 From: Jack Bittner Date: Tue, 13 Jan 2026 07:47:09 -0600 Subject: [PATCH 3/7] fix: added load functionality to mcc.cpp --- src/mcc/mcc.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mcc/mcc.cpp b/src/mcc/mcc.cpp index a5e695d..9ecede1 100644 --- a/src/mcc/mcc.cpp +++ b/src/mcc/mcc.cpp @@ -68,7 +68,9 @@ namespace MCC { } MCC::Settings::Splitscreen::Load(); + MCC::Settings::Profile::Load(); MCC::Settings::Splitscreen::ApplyToRuntime(); + MCC::Settings::Profile::ApplyToRuntime(); ////Ask user if they want to enable network // if (MessageBox(nullptr, "Would you like to enable network?", "Network", MB_YESNO) == IDYES) From aed60015a05f5a11e7091dd6d137865e6bb47eae Mon Sep 17 00:00:00 2001 From: Jack Bittner Date: Tue, 13 Jan 2026 16:09:49 -0600 Subject: [PATCH 4/7] feat: full profile save/load functionality --- src/mcc/settings/Settings.cpp | 235 +++++++++++++++++++++++++++++++++- 1 file changed, 229 insertions(+), 6 deletions(-) diff --git a/src/mcc/settings/Settings.cpp b/src/mcc/settings/Settings.cpp index 35f6630..367c678 100644 --- a/src/mcc/settings/Settings.cpp +++ b/src/mcc/settings/Settings.cpp @@ -79,10 +79,117 @@ namespace MCC::Settings { auto& entry = p[std::to_string(i)]; g_Profiles[i].id = entry.value("id", g_Profiles[i].id); g_Profiles[i].controller_index = entry.value("controller_index", g_Profiles[i].controller_index); - auto name = entry.value("name", ""); if (!name.empty()) mbstowcs(g_Profiles[i].name, name.c_str(), 1024); + if (!entry.contains("profile")) + continue; + + auto& prof = entry["profile"]; + auto& dst = g_Profiles[i].profile; + + dst.SubtitleSetting = prof.value("SubtitleSetting", dst.SubtitleSetting); + dst.SubtitleSizeSetting = prof.value("SubtitleSizeSetting", dst.SubtitleSizeSetting); + dst.SubtitleBackgroundSetting = prof.value("SubtitleBackgroundSetting", dst.SubtitleBackgroundSetting); + dst.SubtitleShadowColorSetting = prof.value("SubtitleShadowColorSetting", dst.SubtitleShadowColorSetting); + dst.DialogueColorSetting = prof.value("DialogueColorSetting", dst.DialogueColorSetting); + dst.DialoguePaletteSetting = prof.value("DialoguePaletteSetting", dst.DialoguePaletteSetting); + dst.SpeakerSetting = prof.value("SpeakerSetting", dst.SpeakerSetting); + dst.SpeakerColorStyleSetting = prof.value("SpeakerColorStyleSetting", dst.SpeakerColorStyleSetting); + dst.SpeakerColorSetting = prof.value("SpeakerColorSetting", dst.SpeakerColorSetting); + dst.SpeakerPaletteSetting = prof.value("SpeakerPaletteSetting", dst.SpeakerPaletteSetting); + dst.SubtitleFontSetting = prof.value("SubtitleFontSetting", dst.SubtitleFontSetting); + dst.SubtitleBackgroundOpacitySetting = prof.value("SubtitleBackgroundOpacitySetting", dst.SubtitleBackgroundOpacitySetting); + dst.SubtitleShadowOpacitySetting = prof.value("SubtitleShadowOpacitySetting", dst.SubtitleShadowOpacitySetting); + dst.FOVSetting = prof.value("FOVSetting", dst.FOVSetting); + dst.VehicleFOVSetting = prof.value("VehicleFOVSetting", dst.VehicleFOVSetting); + dst.CrosshairLocation = prof.value("CrosshairLocation", dst.CrosshairLocation); + dst.LookControlsInverted = prof.value("LookControlsInverted", dst.LookControlsInverted); + dst.MouseLookControlsInverted = prof.value("MouseLookControlsInverted", dst.MouseLookControlsInverted); + dst.VibrationDisabled = prof.value("VibrationDisabled", dst.VibrationDisabled); + dst.ImpulseTriggersDisabled = prof.value("ImpulseTriggersDisabled", dst.ImpulseTriggersDisabled); + dst.AircraftControlsInverted = prof.value("AircraftControlsInverted", dst.AircraftControlsInverted); + dst.MouseAircraftControlsInverted = prof.value("MouseAircraftControlsInverted", dst.MouseAircraftControlsInverted); + dst.AutoCenterEnabled = prof.value("AutoCenterEnabled", dst.AutoCenterEnabled); + dst.CrouchLockEnabled = prof.value("CrouchLockEnabled", dst.CrouchLockEnabled); + dst.MKCrouchLockEnabled = prof.value("MKCrouchLockEnabled", dst.MKCrouchLockEnabled); + dst.ClenchProtectionEnabled = prof.value("ClenchProtectionEnabled", dst.ClenchProtectionEnabled); + dst.UseFemaleVoice = prof.value("UseFemaleVoice", dst.UseFemaleVoice); + dst.HoldToZoom = prof.value("HoldToZoom", dst.HoldToZoom); + dst.PlayerModelPrimaryColorIndex = prof.value("PlayerModelPrimaryColorIndex", dst.PlayerModelPrimaryColorIndex); + dst.PlayerModelSecondaryColorIndex = prof.value("PlayerModelSecondaryColorIndex", dst.PlayerModelSecondaryColorIndex); + dst.PlayerModelTertiaryColorIndex = prof.value("PlayerModelTertiaryColorIndex", dst.PlayerModelTertiaryColorIndex); + dst.UseEliteModel = prof.value("UseEliteModel", dst.UseEliteModel); + dst.LockMaxAspectRatio = prof.value("LockMaxAspectRatio", dst.LockMaxAspectRatio); + dst.un = prof.value("un", dst.un); + dst.UsersSkinsEnabled = prof.value("UsersSkinsEnabled", dst.UsersSkinsEnabled); + dst.PlayerModelPermutation = prof.value("PlayerModelPermutation", dst.PlayerModelPermutation); + dst.HelmetIndex = prof.value("HelmetIndex", dst.HelmetIndex); + dst.LeftShoulderIndex = prof.value("LeftShoulderIndex", dst.LeftShoulderIndex); + dst.RightShoulderIndex = prof.value("RightShoulderIndex", dst.RightShoulderIndex); + dst.ChestIndex = prof.value("ChestIndex", dst.ChestIndex); + dst.WristIndex = prof.value("WristIndex", dst.WristIndex); + dst.UtilityIndex = prof.value("UtilityIndex", dst.UtilityIndex); + dst.ArmsIndex = prof.value("ArmsIndex", dst.ArmsIndex); + dst.LegsIndex = prof.value("LegsIndex", dst.LegsIndex); + dst.BackpackIndex = prof.value("BackpackIndex", dst.BackpackIndex); + dst.SpartanBodyIndex = prof.value("SpartanBodyIndex", dst.SpartanBodyIndex); + dst.SpartanArmorEffectIndex = prof.value("SpartanArmorEffectIndex", dst.SpartanArmorEffectIndex); + dst.KneesIndex = prof.value("KneesIndex", dst.KneesIndex); + dst.VisorColorIndex = prof.value("VisorColorIndex", dst.VisorColorIndex); + dst.EliteHelmetIndex = prof.value("EliteHelmetIndex", dst.EliteHelmetIndex); + dst.EliteLeftShoulderIndex = prof.value("EliteLeftShoulderIndex", dst.EliteLeftShoulderIndex); + dst.EliteRightShoulderIndex = prof.value("EliteRightShoulderIndex", dst.EliteRightShoulderIndex); + dst.EliteChestIndex = prof.value("EliteChestIndex", dst.EliteChestIndex); + dst.EliteArmsIndex = prof.value("EliteArmsIndex", dst.EliteArmsIndex); + dst.EliteLegsIndex = prof.value("EliteLegsIndex", dst.EliteLegsIndex); + dst.EliteArmorIndex = prof.value("EliteArmorIndex", dst.EliteArmorIndex); + dst.EliteArmorEffectIndex = prof.value("EliteArmorEffectIndex", dst.EliteArmorEffectIndex); + dst.VoiceIndex = prof.value("VoiceIndex", dst.VoiceIndex); + dst.PlayerModelPrimaryColor = prof.value("PlayerModelPrimaryColor", dst.PlayerModelPrimaryColor); + dst.PlayerModelSecondaryColor = prof.value("PlayerModelSecondaryColor", dst.PlayerModelSecondaryColor); + dst.PlayerModelTertiaryColor = prof.value("PlayerModelTertiaryColor", dst.PlayerModelTertiaryColor); + dst.SpartanPose = prof.value("SpartanPose", dst.SpartanPose); + dst.ElitePose = prof.value("ElitePose", dst.ElitePose); + //TODO: implement Skin_t property + const std::string& s = prof["ServiceTag"].get(); + wmemset(dst.ServiceTag, 0, 4); + if (!s.empty()) { + mbstowcs(dst.ServiceTag, s.c_str(), 4); + } + dst.OnlineMedalFlasher = prof.value("OnlineMedalFlasher", dst.OnlineMedalFlasher); + dst.VerticalLookSensitivity = prof.value("VerticalLookSensitivity", dst.VerticalLookSensitivity); + dst.HorizontalLookSensitivity = prof.value("HorizontalLookSensitivity", dst.HorizontalLookSensitivity); + dst.LookAcceleration = prof.value("LookAcceleration", dst.LookAcceleration); + dst.LookAxialDeadZone = prof.value("LookAxialDeadZone", dst.LookAxialDeadZone); + dst.LookRadialDeadZone = prof.value("LookRadialDeadZone", dst.LookRadialDeadZone); + dst.ZoomLookSensitivityMultiplier = prof.value("ZoomLookSensitivityMultiplier", dst.ZoomLookSensitivityMultiplier); + dst.VehicleLookSensitivityMultiplier = prof.value("VehicleLookSensitivityMultiplier", dst.VehicleLookSensitivityMultiplier); + dst.ButtonPreset = prof.value("ButtonPreset", dst.ButtonPreset); + dst.StickPreset = prof.value("StickPreset", dst.StickPreset); + dst.LeftyToggle = prof.value("LeftyToggle", dst.LeftyToggle); + dst.FlyingCameraTurnSensitivity = prof.value("FlyingCameraTurnSensitivity", dst.FlyingCameraTurnSensitivity); + dst.FlyingCameraPanning = prof.value("FlyingCameraPanning", dst.FlyingCameraPanning); + dst.FlyingCameraSpeed = prof.value("FlyingCameraSpeed", dst.FlyingCameraSpeed); + dst.FlyingCameraThrust = prof.value("FlyingCameraThrust", dst.FlyingCameraThrust); + dst.TheaterTurnSensitivity = prof.value("TheaterTurnSensitivity", dst.TheaterTurnSensitivity); + dst.TheaterPanning = prof.value("TheaterPanning", dst.TheaterPanning); + dst.TheaterSpeed = prof.value("TheaterSpeed", dst.TheaterSpeed); + dst.TheaterThrust = prof.value("TheaterThrust", dst.TheaterThrust); + dst.MKTheaterTurnSensitivity = prof.value("MKTheaterTurnSensitivity", dst.MKTheaterTurnSensitivity); + dst.MKTheaterPanning = prof.value("MKTheaterPanning", dst.MKTheaterPanning); + dst.MKTheaterSpeed = prof.value("MKTheaterSpeed", dst.MKTheaterSpeed); + dst.MKTheaterThrust = prof.value("MKTheaterThrust", dst.MKTheaterThrust); + dst.SwapTriggersAndBumpers = prof.value("SwapTriggersAndBumpers", dst.SwapTriggersAndBumpers); + dst.UseModernAimControl = prof.value("UseModernAimControl", dst.UseModernAimControl); + dst.UseDoublePressJumpToJetpack = prof.value("UseDoublePressJumpToJetpack", dst.UseDoublePressJumpToJetpack); + dst.DualWieldInverted = prof.value("DualWieldInverted", dst.DualWieldInverted); + dst.ControllerDualWieldInverted = prof.value("ControllerDualWieldInverted", dst.ControllerDualWieldInverted); + dst.ControllerHornetControlJoystick = prof.value("ControllerHornetControlJoystick", dst.ControllerHornetControlJoystick); + dst.ControllerBansheeTrickButtonsSwapped = prof.value("ControllerBansheeTrickButtonsSwapped", dst.ControllerBansheeTrickButtonsSwapped); + dst.ColorCorrection = prof.value("ColorCorrection", dst.ColorCorrection); + dst.EnemyPlayerNameColor = prof.value("EnemyPlayerNameColor", dst.EnemyPlayerNameColor); + dst.GameEngineTimer = prof.value("GameEngineTimer", dst.GameEngineTimer); } return true; @@ -127,10 +234,116 @@ namespace MCC::Settings { name.resize(len); wcstombs(name.data(), g_Profiles[i].name, len); + json prof; + auto& src = g_Profiles[i].profile; + + prof["SubtitleSetting"] = src.SubtitleSetting; + prof["SubtitleSizeSetting"] = src.SubtitleSizeSetting; + prof["SubtitleBackgroundSetting"] = src.SubtitleBackgroundSetting; + prof["SubtitleShadowColorSetting"] = src.SubtitleShadowColorSetting; + prof["DialogueColorStyleSetting"] = src.DialogueColorStyleSetting; + prof["DialogueColorSetting"] = src.DialogueColorSetting; + prof["DialoguePaletteSetting"] = src.DialoguePaletteSetting; + prof["SpeakerSetting"] = src.SpeakerSetting; + prof["SpeakerColorStyleSetting"] = src.SpeakerColorStyleSetting; + prof["SpeakerColorSetting"] = src.SpeakerColorSetting; + prof["SpeakerPaletteSetting"] = src.SpeakerPaletteSetting; + prof["SubtitleFontSetting"] = src.SubtitleFontSetting; + prof["SubtitleBackgroundOpacitySetting"] = src.SubtitleBackgroundOpacitySetting; + prof["SubtitleShadowOpacitySetting"] = src.SubtitleShadowOpacitySetting; + prof["FOVSetting"] = src.FOVSetting; + prof["VehicleFOVSetting"] = src.VehicleFOVSetting; + prof["CrosshairLocation"] = src.CrosshairLocation; + prof["LookControlsInverted"] = src.LookControlsInverted; + prof["MouseLookControlsInverted"] = src.MouseLookControlsInverted; + prof["VibrationDisabled"] = src.VibrationDisabled; + prof["ImpulseTriggersDisabled"] = src.ImpulseTriggersDisabled; + prof["AircraftControlsInverted"] = src.AircraftControlsInverted; + prof["MouseAircraftControlsInverted"] = src.MouseAircraftControlsInverted; + prof["AutoCenterEnabled"] = src.AutoCenterEnabled; + prof["CrouchLockEnabled"] = src.CrouchLockEnabled; + prof["MKCrouchLockEnabled"] = src.MKCrouchLockEnabled; + prof["ClenchProtectionEnabled"] = src.ClenchProtectionEnabled; + prof["UseFemaleVoice"] = src.UseFemaleVoice; + prof["HoldToZoom"] = src.HoldToZoom; + prof["PlayerModelPrimaryColorIndex"] = src.PlayerModelPrimaryColorIndex; + prof["PlayerModelSecondaryColorIndex"] = src.PlayerModelSecondaryColorIndex; + prof["PlayerModelTertiaryColorIndex"] = src.PlayerModelTertiaryColorIndex; + prof["UseEliteModel"] = src.UseEliteModel; + prof["LockMaxAspectRatio"] = src.LockMaxAspectRatio; + prof["un"] = src.un; + prof["UsersSkinsEnabled"] = src.UsersSkinsEnabled; + prof["PlayerModelPermutation"] = src.PlayerModelPermutation; + prof["HelmetIndex"] = src.HelmetIndex; + prof["LeftShoulderIndex"] = src.LeftShoulderIndex; + prof["RightShoulderIndex"] = src.RightShoulderIndex; + prof["ChestIndex"] = src.ChestIndex; + prof["WristIndex"] = src.WristIndex; + prof["UtilityIndex"] = src.UtilityIndex; + prof["ArmsIndex"] = src.ArmsIndex; + prof["LegsIndex"] = src.LegsIndex; + prof["BackpackIndex"] = src.BackpackIndex; + prof["SpartanBodyIndex"] = src.SpartanBodyIndex; + prof["SpartanArmorEffectIndex"] = src.SpartanArmorEffectIndex; + prof["KneesIndex"] = src.KneesIndex; + prof["VisorColorIndex"] = src.VisorColorIndex; + prof["EliteHelmetIndex"] = src.EliteHelmetIndex; + prof["EliteLeftShoulderIndex"] = src.EliteLeftShoulderIndex; + prof["EliteRightShoulderIndex"] = src.EliteRightShoulderIndex; + prof["EliteChestIndex"] = src.EliteChestIndex; + prof["EliteArmsIndex"] = src.EliteArmsIndex; + prof["EliteLegsIndex"] = src.EliteLegsIndex; + prof["EliteArmorIndex"] = src.EliteArmorIndex; + prof["EliteArmorEffectIndex"] = src.EliteArmorEffectIndex; + prof["VoiceIndex"] = src.VoiceIndex; + prof["PlayerModelPrimaryColor"] = src.PlayerModelPrimaryColor; + prof["PlayerModelSecondaryColor"] = src.PlayerModelSecondaryColor; + prof["PlayerModelTertiaryColor"] = src.PlayerModelTertiaryColor; + prof["SpartanPose"] = src.SpartanPose; + prof["ElitePose"] = src.ElitePose; + //TODO: implement Skin_t parameter + char buf[5] = {}; + wcstombs(buf, src.ServiceTag, 4); + prof["ServiceTag"] = std::string(buf, strnlen(buf, 4)); + prof["OnlineMedalFlasher"] = src.OnlineMedalFlasher; + prof["VerticalLookSensitivity"] = src.VerticalLookSensitivity; + prof["HorizontalLookSensitivity"] = src.HorizontalLookSensitivity; + prof["LookAcceleration"] = src.LookAcceleration; + prof["LookAxialDeadZone"] = src.LookAxialDeadZone; + prof["LookRadialDeadZone"] = src.LookRadialDeadZone; + prof["ZoomLookSensitivityMultiplier"] = src.ZoomLookSensitivityMultiplier; + prof["VehicleLookSensitivityMultiplier"] = src.VehicleLookSensitivityMultiplier; + prof["ButtonPreset"] = src.ButtonPreset; + prof["StickPreset"] = src.StickPreset; + prof["LeftyToggle"] = src.LeftyToggle; + prof["FlyingCameraTurnSensitivity"] = src.FlyingCameraTurnSensitivity; + prof["FlyingCameraPanning"] = src.FlyingCameraPanning; + prof["FlyingCameraSpeed"] = src.FlyingCameraSpeed; + prof["FlyingCameraThrust"] = src.FlyingCameraThrust; + prof["TheaterTurnSensitivity"] = src.TheaterTurnSensitivity; + prof["TheaterPanning"] = src.TheaterPanning; + prof["TheaterSpeed"] = src.TheaterSpeed; + prof["TheaterThrust"] = src.TheaterThrust; + prof["MKTheaterTurnSensitivity"] = src.MKTheaterTurnSensitivity; + prof["MKTheaterPanning"] = src.MKTheaterPanning; + prof["MKTheaterSpeed"] = src.MKTheaterSpeed; + prof["MKTheaterThrust"] = src.MKTheaterThrust; + prof["SwapTriggersAndBumpers"] = src.SwapTriggersAndBumpers; + prof["UseModernAimControl"] = src.UseModernAimControl; + prof["UseDoublePressJumpToJetpack"] = src.UseDoublePressJumpToJetpack; + prof["DualWieldInverted"] = src.DualWieldInverted; + prof["ControllerDualWieldInverted"] = src.ControllerDualWieldInverted; + prof["ControllerHornetControlJoystick"] = src.ControllerHornetControlJoystick; + prof["ControllerBansheeTrickButtonsSwapped"] = src.ControllerBansheeTrickButtonsSwapped; + prof["ColorCorrection"] = src.ColorCorrection; + prof["EnemyPlayerNameColor"] = src.EnemyPlayerNameColor; + prof["GameEngineTimer"] = src.GameEngineTimer; + j["profile"][std::to_string(i)] = { {"id", g_Profiles[i].id}, {"controller_index", g_Profiles[i].controller_index}, - {"name", name} + {"name", name}, + {"profile", prof} }; } @@ -156,8 +369,13 @@ namespace MCC::Settings { void Profile::ApplyToRuntime() { for (int i = 0; i < 4; ++i) { - auto p = CGameManager::get_profile(i); - *p = g_Profiles[i]; + auto dst = CGameManager::get_profile(i); + auto& src = g_Profiles[i]; + + dst->controller_index = src.controller_index; + dst->id = src.id; + wcscpy_s(dst->name, src.name); + dst->profile = src.profile; } } @@ -175,8 +393,13 @@ namespace MCC::Settings { void Profile::CaptureFromRuntime() { for (int i = 0; i < 4; ++i) { - auto p = CGameManager::get_profile(i); - g_Profiles[i] = *p; + auto dst = CGameManager::get_profile(i); + auto& src = g_Profiles[i]; + + dst->controller_index = src.controller_index; + dst->id = src.id; + wcscpy_s(dst->name, _countof(dst->name), src.name); + dst->profile = src.profile; } } } \ No newline at end of file From afbd807e92bc142e3516e2aba2512e1df5355204 Mon Sep 17 00:00:00 2001 From: Jack Bittner Date: Wed, 14 Jan 2026 13:45:57 -0600 Subject: [PATCH 5/7] fix: fixed load issue and added save profile button --- src/mcc/mcc.zip | Bin 60245 -> 0 bytes src/mcc/settings/Settings.cpp | 12 ++++++------ src/mcc/splitscreen/Splitscreen.cpp | 10 +++++++--- 3 files changed, 13 insertions(+), 9 deletions(-) delete mode 100644 src/mcc/mcc.zip diff --git a/src/mcc/mcc.zip b/src/mcc/mcc.zip deleted file mode 100644 index b331c92e59b43c5aae7f9f32cb02aaa02857c8ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60245 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 diff --git a/src/mcc/settings/Settings.cpp b/src/mcc/settings/Settings.cpp index 367c678..938a0f5 100644 --- a/src/mcc/settings/Settings.cpp +++ b/src/mcc/settings/Settings.cpp @@ -393,13 +393,13 @@ namespace MCC::Settings { void Profile::CaptureFromRuntime() { for (int i = 0; i < 4; ++i) { - auto dst = CGameManager::get_profile(i); - auto& src = g_Profiles[i]; + auto src = CGameManager::get_profile(i); + auto& dst = g_Profiles[i]; - dst->controller_index = src.controller_index; - dst->id = src.id; - wcscpy_s(dst->name, _countof(dst->name), src.name); - dst->profile = src.profile; + dst.controller_index = src->controller_index; + dst.id = src->id; + wcscpy_s(dst.name, src->name); + dst.profile = src->profile; } } } \ No newline at end of file diff --git a/src/mcc/splitscreen/Splitscreen.cpp b/src/mcc/splitscreen/Splitscreen.cpp index 3940806..3632897 100644 --- a/src/mcc/splitscreen/Splitscreen.cpp +++ b/src/mcc/splitscreen/Splitscreen.cpp @@ -75,7 +75,7 @@ namespace MCC::Splitscreen { ImGui::PushItemWidth(200);ImGui::Combo("Input", &p_profile->controller_index, items, IM_ARRAYSIZE(items));ImGui::PopItemWidth(); ImGui::EndDisabled(); - if (ImGui::Button("Load Profile")) { + if (ImGui::Button("Apply Profile")) { __int64 xuid; auto p_mng = GameManager(); auto p_engine = GameEngine(); @@ -88,6 +88,10 @@ namespace MCC::Splitscreen { } if (ImGui::IsItemHovered()) ImGui::SetTooltip("Use this in game!!!"); + if (ImGui::Button("Save Profile")) { + MCC::Settings::Profile::CaptureFromRuntime(); + MCC::Settings::Profile::Save(); + } bool is_disabled = (!index && !p_setting->b_override_profile) || (index && p_setting->b_use_player0_profile); @@ -170,9 +174,9 @@ namespace MCC::Splitscreen { if (dirty) { MCC::Settings::Splitscreen::CaptureFromRuntime(); - MCC::Settings::Profile::CaptureFromRuntime(); + // MCC::Settings::Profile::CaptureFromRuntime(); MCC::Settings::Splitscreen::Save(); - MCC::Settings::Profile::Save(); + // MCC::Settings::Profile::Save(); } } } \ No newline at end of file From dbe400a3cc0e5da949ec89c897241cc71cb42f9b Mon Sep 17 00:00:00 2001 From: Jack Bittner Date: Sat, 17 Jan 2026 14:20:39 -0600 Subject: [PATCH 6/7] fix: overhauled load system --- src/mcc/mcc.cpp | 7 +- src/mcc/settings/Settings.cpp | 183 ++++++++++++++++++++++++++++++++-- src/mcc/settings/Settings.h | 1 + 3 files changed, 179 insertions(+), 12 deletions(-) diff --git a/src/mcc/mcc.cpp b/src/mcc/mcc.cpp index 9ecede1..b8dfc91 100644 --- a/src/mcc/mcc.cpp +++ b/src/mcc/mcc.cpp @@ -68,9 +68,12 @@ namespace MCC { } MCC::Settings::Splitscreen::Load(); - MCC::Settings::Profile::Load(); + bool profileLoad = MCC::Settings::Profile::Load(); + if(profileLoad) { + MCC::Settings::Profile::ApplyToRuntime(); + // MCC::Settings::Profile::Initialize(game_manager); + } MCC::Settings::Splitscreen::ApplyToRuntime(); - MCC::Settings::Profile::ApplyToRuntime(); ////Ask user if they want to enable network // if (MessageBox(nullptr, "Would you like to enable network?", "Network", MB_YESNO) == IDYES) diff --git a/src/mcc/settings/Settings.cpp b/src/mcc/settings/Settings.cpp index 938a0f5..4680723 100644 --- a/src/mcc/settings/Settings.cpp +++ b/src/mcc/settings/Settings.cpp @@ -68,10 +68,10 @@ namespace MCC::Settings { json j; file >> j; - if (!j.contains("profile")) + if (!j.contains("profile_t")) return false; - auto& p = j["profile"]; + auto& p = j["profile_t"]; for (int i = 0; i < 4; ++i) { if (!p.contains(std::to_string(i))) continue; @@ -87,6 +87,7 @@ namespace MCC::Settings { auto& prof = entry["profile"]; auto& dst = g_Profiles[i].profile; + auto& dst2 = g_Profiles[i].mapping; dst.SubtitleSetting = prof.value("SubtitleSetting", dst.SubtitleSetting); dst.SubtitleSizeSetting = prof.value("SubtitleSizeSetting", dst.SubtitleSizeSetting); @@ -151,11 +152,16 @@ namespace MCC::Settings { dst.PlayerModelTertiaryColor = prof.value("PlayerModelTertiaryColor", dst.PlayerModelTertiaryColor); dst.SpartanPose = prof.value("SpartanPose", dst.SpartanPose); dst.ElitePose = prof.value("ElitePose", dst.ElitePose); - //TODO: implement Skin_t property - const std::string& s = prof["ServiceTag"].get(); + auto& skinArray = prof["Skins"]; + for (size_t o = 0; o < skinArray.size() && o < 32; ++o) { + auto& s = skinArray[o]; + dst.Skins[o].object = s.value("object", dst.Skins[o].object); + dst.Skins[o].skin = s.value("skin", dst.Skins[o].skin); + } + const std::string s = prof.value("ServiceTag", ""); wmemset(dst.ServiceTag, 0, 4); if (!s.empty()) { - mbstowcs(dst.ServiceTag, s.c_str(), 4); + mbstowcs_s(nullptr, dst.ServiceTag, 4, s.c_str(), _TRUNCATE); } dst.OnlineMedalFlasher = prof.value("OnlineMedalFlasher", dst.OnlineMedalFlasher); dst.VerticalLookSensitivity = prof.value("VerticalLookSensitivity", dst.VerticalLookSensitivity); @@ -190,6 +196,67 @@ namespace MCC::Settings { dst.ColorCorrection = prof.value("ColorCorrection", dst.ColorCorrection); dst.EnemyPlayerNameColor = prof.value("EnemyPlayerNameColor", dst.EnemyPlayerNameColor); dst.GameEngineTimer = prof.value("GameEngineTimer", dst.GameEngineTimer); + auto& loadoutArray = prof["LoadoutSlots"]; + for (size_t o = 0; o < loadoutArray.size() && o < 5; ++o) { + auto& slot = loadoutArray[o]; + dst.LoadoutSlots[o].TacticalPackageIndex = slot.value("TacticalPackageIndex", dst.LoadoutSlots[o].TacticalPackageIndex); + dst.LoadoutSlots[o].SupportUpgradeIndex = slot.value("SupportUpgradeIndex", dst.LoadoutSlots[o].SupportUpgradeIndex); + dst.LoadoutSlots[o].PrimaryWeaponIndex = slot.value("PrimaryWeaponIndex", dst.LoadoutSlots[o].PrimaryWeaponIndex); + dst.LoadoutSlots[o].SecondaryWeaponIndex = slot.value("SecondaryWeaponIndex", dst.LoadoutSlots[o].SecondaryWeaponIndex); + dst.LoadoutSlots[o].PrimaryWeaponVariantIndex = slot.value("PrimaryWeaponVariantIndex", dst.LoadoutSlots[o].PrimaryWeaponVariantIndex); + dst.LoadoutSlots[o].SecondaryWeaponVariantIndex = slot.value("SecondaryWeaponVariantIndex", dst.LoadoutSlots[o].SecondaryWeaponVariantIndex); + dst.LoadoutSlots[o].EquipmentIndex = slot.value("EquipmentIndex", dst.LoadoutSlots[o].EquipmentIndex); + dst.LoadoutSlots[o].GrenadeIndex = slot.value("GrenadeIndex", dst.LoadoutSlots[o].GrenadeIndex); + std::string name = slot.value("Name", ""); + wmemset(dst.LoadoutSlots[o].Name, 0, 14); + mbstowcs(dst.LoadoutSlots[o].Name, name.c_str(), 14); + } + std::string gs = prof.value("GameSpecific", std::string{}); + std::memset(dst.GameSpecific, 0, sizeof(dst.GameSpecific)); + std::strncpy(dst.GameSpecific, gs.c_str(), sizeof(dst.GameSpecific) - 1); + dst.MouseSensitivity = prof.value("MouseSensitivity", dst.MouseSensitivity); + dst.MouseSmoothing = prof.value("MouseSmoothing", dst.MouseSmoothing); + dst.MouseAcceleration = prof.value("MouseAcceleration", dst.MouseAcceleration); + dst.PixelPerfectHudScale = prof.value("PixelPerfectHudScale", dst.PixelPerfectHudScale); + dst.MouseAccelerationMinRate = prof.value("MouseAccelerationMinRate", dst.MouseAccelerationMinRate); + dst.MouseAccelerationMaxAccel = prof.value("MouseAccelerationMaxAccel", dst.MouseAccelerationMaxAccel); + dst.MouseAccelerationScale = prof.value("MouseAccelerationScale", dst.MouseAccelerationScale); + dst.MouseAccelerationExp = prof.value("MouseAccelerationExp", dst.MouseAccelerationExp); + dst.KeyboardMouseButtonPreset = prof.value("KeyboardMouseButtonPreset", dst.KeyboardMouseButtonPreset); + auto& mappings = prof["CustomKeyboardMouseMappingV2"]; + for (size_t o = 0; o < mappings.size() && o < 66; ++o) { + auto& srcMap = mappings[o]; + auto& dstMap = dst.CustomKeyboardMouseMappingV2[o]; + dstMap.AbstractButton = srcMap.value("AbstractButton", dstMap.AbstractButton); + auto& keys = srcMap["VirtualKeyCodes"]; + for (size_t k = 0; k < keys.size() && k < 5; ++k) { + dstMap.VirtualKeyCodes[k] = keys[k].get(); + } + } + dst.MasterVolume = prof.value("MasterVolume", dst.MasterVolume); + dst.MusicVolume = prof.value("MusicVolume", dst.MusicVolume); + dst.SfxVolume = prof.value("SfxVolume", dst.SfxVolume); + std::string buf = prof.value("buffer4", std::string{}); + std::memset(dst.buffer4, 0, sizeof(dst.buffer4)); + std::strncpy(dst.buffer4, buf.c_str(), sizeof(dst.buffer4) - 1); + dst.Brightness = prof.value("Brightness", dst.Brightness); + auto& offsets = prof["WeaponDisplayOffset"]; + for (size_t o = 0; o < offsets.size() && o < 5; ++o) { + auto& off = offsets[o]; + dst.WeaponDisplayOffset[o].x = off.value("x", dst.WeaponDisplayOffset[o].x); + dst.WeaponDisplayOffset[o].y = off.value("y", dst.WeaponDisplayOffset[o].y); + dst.WeaponDisplayOffset[o].z = off.value("z", dst.WeaponDisplayOffset[o].z); + } + dst.ColorBlindMode = prof.value("ColorBlindMode", dst.ColorBlindMode); + dst.ColorBlindStrength = prof.value("ColorBlindStrength", dst.ColorBlindStrength); + dst.ColorBlindBrightness = prof.value("ColorBlindBrightness", dst.ColorBlindBrightness); + dst.ColorBlindContrast = prof.value("ColorBlindContrast", dst.ColorBlindContrast); + dst.RemasteredHUDSetting = prof.value("RemasteredHUDSetting", dst.RemasteredHUDSetting); + dst.HUDScale = prof.value("HUDScale", dst.HUDScale); + auto& actionsJson = entry["mapping"]["actions"]; + for (size_t a = 0; a < actionsJson.size() && a < 66; ++a) { + dst2.actions[a] = static_cast(actionsJson[a].get()); + } } return true; @@ -235,7 +302,9 @@ namespace MCC::Settings { wcstombs(name.data(), g_Profiles[i].name, len); json prof; + json mapp; auto& src = g_Profiles[i].profile; + auto& src2 = g_Profiles[i].mapping; prof["SubtitleSetting"] = src.SubtitleSetting; prof["SubtitleSizeSetting"] = src.SubtitleSizeSetting; @@ -301,7 +370,14 @@ namespace MCC::Settings { prof["PlayerModelTertiaryColor"] = src.PlayerModelTertiaryColor; prof["SpartanPose"] = src.SpartanPose; prof["ElitePose"] = src.ElitePose; - //TODO: implement Skin_t parameter + json skinArray = json::array(); + for (int o = 0; o < 32; ++o) { + json skin; + skin["object"] = src.Skins[o].object; + skin["skin"] = src.Skins[o].skin; + skinArray.push_back(skin); + } + prof["Skins"] = skinArray; char buf[5] = {}; wcstombs(buf, src.ServiceTag, 4); prof["ServiceTag"] = std::string(buf, strnlen(buf, 4)); @@ -338,12 +414,79 @@ namespace MCC::Settings { prof["ColorCorrection"] = src.ColorCorrection; prof["EnemyPlayerNameColor"] = src.EnemyPlayerNameColor; prof["GameEngineTimer"] = src.GameEngineTimer; + json loadoutArray = json::array(); + for (int o = 0; o < 5; ++o) { + json slot; + slot["TacticalPackageIndex"] = src.LoadoutSlots[o].TacticalPackageIndex; + slot["SupportUpgradeIndex"] = src.LoadoutSlots[o].SupportUpgradeIndex; + slot["PrimaryWeaponIndex"] = src.LoadoutSlots[o].PrimaryWeaponIndex; + slot["SecondaryWeaponIndex"] = src.LoadoutSlots[o].SecondaryWeaponIndex; + slot["PrimaryWeaponVariantIndex"] = src.LoadoutSlots[o].PrimaryWeaponVariantIndex; + slot["SecondaryWeaponVariantIndex"] = src.LoadoutSlots[o].SecondaryWeaponVariantIndex; + slot["EquipmentIndex"] = src.LoadoutSlots[o].EquipmentIndex; + slot["GrenadeIndex"] = src.LoadoutSlots[o].GrenadeIndex; + + char buf[15] = {}; + wcstombs(buf, src.LoadoutSlots[o].Name, 14); + slot["Name"] = std::string(buf); + + loadoutArray.push_back(slot); + } + prof["LoadoutSlots"] = loadoutArray; + prof["GameSpecific"] = std::string(src.GameSpecific, strnlen(src.GameSpecific, sizeof(src.GameSpecific))); + prof["MouseSensitivity"] = src.MouseSensitivity; + prof["MouseSmoothing"] = src.MouseSmoothing; + prof["MouseAcceleration"] = src.MouseAcceleration; + prof["PixelPerfectHudScale"] = src.PixelPerfectHudScale; + prof["MouseAccelerationMinRate"] = src.MouseAccelerationMinRate; + prof["MouseAccelerationMaxAccel"] = src.MouseAccelerationMaxAccel; + prof["MouseAccelerationScale"] = src.MouseAccelerationScale; + prof["MouseAccelerationExp"] = src.MouseAccelerationExp; + prof["KeyboardMouseButtonPreset"] = src.KeyboardMouseButtonPreset; + json customKeyboardMouseMappingArray = json::array(); + for (int o = 0; o < 66; ++o) { + json cKMMObj; + cKMMObj["AbstractButton"] = src.CustomKeyboardMouseMappingV2[o].AbstractButton; + json virtualKeyCodesArray = json::array(); + for (int k = 0; k < 5; ++k) { + virtualKeyCodesArray.push_back(src.CustomKeyboardMouseMappingV2[o].VirtualKeyCodes[k]); + } + cKMMObj["VirtualKeyCodes"] = virtualKeyCodesArray; + customKeyboardMouseMappingArray.push_back(cKMMObj); + } + prof["CustomKeyboardMouseMappingV2"] = customKeyboardMouseMappingArray; + prof["MasterVolume"] = src.MasterVolume; + prof["MusicVolume"] = src.MusicVolume; + prof["SfxVolume"] = src.SfxVolume; + prof["buffer4"] = std::string(src.buffer4, strnlen(src.buffer4, sizeof(src.buffer4))); + prof["Brightness"] = src.Brightness; + json weaponDisplayOffsetArray = json::array(); + for (int o = 0; o < 5; ++o) { + json offset; + offset["x"] = src.WeaponDisplayOffset[o].x; + offset["y"] = src.WeaponDisplayOffset[o].y; + offset["z"] = src.WeaponDisplayOffset[o].z; + weaponDisplayOffsetArray.push_back(offset); + } + prof["WeaponDisplayOffset"] = weaponDisplayOffsetArray; + prof["ColorBlindMode"] = src.ColorBlindMode; + prof["ColorBlindStrength"] = src.ColorBlindStrength; + prof["ColorBlindBrightness"] = src.ColorBlindBrightness; + prof["ColorBlindContrast"] = src.ColorBlindContrast; + prof["RemasteredHUDSetting"] = src.RemasteredHUDSetting; + prof["HUDScale"] = src.HUDScale; + json mappingJson = json::array(); + for (int a = 0; a < 66; ++a) { + mappingJson.push_back(static_cast(src2.actions[a])); + } + mapp["actions"] = mappingJson; - j["profile"][std::to_string(i)] = { + j["profile_t"][std::to_string(i)] = { {"id", g_Profiles[i].id}, {"controller_index", g_Profiles[i].controller_index}, {"name", name}, - {"profile", prof} + {"profile", prof}, + {"mapping", mapp} }; } @@ -374,8 +517,9 @@ namespace MCC::Settings { dst->controller_index = src.controller_index; dst->id = src.id; - wcscpy_s(dst->name, src.name); + wcscpy_s(dst->name, _countof(dst->name), src.name); dst->profile = src.profile; + dst->mapping = src.mapping; } } @@ -399,7 +543,26 @@ namespace MCC::Settings { dst.controller_index = src->controller_index; dst.id = src->id; wcscpy_s(dst.name, src->name); - dst.profile = src->profile; + memcpy(&dst.profile, &src->profile, sizeof(dst.profile)); + memcpy(&dst.mapping, &src->mapping, sizeof(dst.mapping)); + } + } + + void Profile::Initialize(CGameManager* mng) + { + pGameManager = mng; + + for (int i = 0; i < 4; ++i) + { + //sets up id, controller_index, name, profile and mapping + auto& dst = g_Profiles[i]; + auto runtime = CGameManager::get_profile(i); + + dst.controller_index = runtime->controller_index; + dst.id = runtime->id; + wcscpy_s(dst.name, _countof(dst.name), runtime-> name); + __int64 xuid = CGameManager::get_xuid(i); } } + } \ No newline at end of file diff --git a/src/mcc/settings/Settings.h b/src/mcc/settings/Settings.h index 027b4f7..72d9bf1 100644 --- a/src/mcc/settings/Settings.h +++ b/src/mcc/settings/Settings.h @@ -29,5 +29,6 @@ namespace MCC::Settings { void ApplyToRuntime(); void CaptureFromRuntime(); + void Initialize(CGameManager* mng); } } From bdad7eb33594a86066128b16df15430143a30b5e Mon Sep 17 00:00:00 2001 From: Jack Bittner Date: Tue, 27 Jan 2026 20:02:33 -0600 Subject: [PATCH 7/7] fix: changed serialization method for CaptureFromRuntime() --- src/mcc/settings/Settings.cpp | 122 +++++++++++++++++++++++++++++++++- 1 file changed, 121 insertions(+), 1 deletion(-) diff --git a/src/mcc/settings/Settings.cpp b/src/mcc/settings/Settings.cpp index 4680723..5dfc000 100644 --- a/src/mcc/settings/Settings.cpp +++ b/src/mcc/settings/Settings.cpp @@ -543,7 +543,127 @@ namespace MCC::Settings { dst.controller_index = src->controller_index; dst.id = src->id; wcscpy_s(dst.name, src->name); - memcpy(&dst.profile, &src->profile, sizeof(dst.profile)); + dst.profile.SubtitleSizeSetting = src->profile.SubtitleSizeSetting; + dst.profile.SubtitleBackgroundSetting = src->profile.SubtitleBackgroundSetting; + dst.profile.SubtitleShadowColorSetting = src->profile.SubtitleShadowColorSetting; + dst.profile.DialogueColorStyleSetting = src->profile.DialogueColorStyleSetting; + dst.profile.DialogueColorSetting = src->profile.DialogueColorSetting; + dst.profile.DialoguePaletteSetting = src->profile.DialoguePaletteSetting; + dst.profile.SpeakerSetting = src->profile.SpeakerSetting; + dst.profile.SpeakerColorStyleSetting = src->profile.SpeakerColorStyleSetting; + dst.profile.SpeakerColorSetting = src->profile.SpeakerColorSetting; + dst.profile.SpeakerPaletteSetting = src->profile.SpeakerPaletteSetting; + dst.profile.SubtitleFontSetting = src->profile.SubtitleFontSetting; + dst.profile.SubtitleBackgroundOpacitySetting = src->profile.SubtitleBackgroundOpacitySetting; + dst.profile.SubtitleShadowOpacitySetting = src->profile.SubtitleShadowOpacitySetting; + dst.profile.FOVSetting = src->profile.FOVSetting; + dst.profile.VehicleFOVSetting = src->profile.VehicleFOVSetting; + dst.profile.CrosshairLocation = src->profile.CrosshairLocation; + dst.profile.LookControlsInverted = src->profile.LookControlsInverted; + dst.profile.MouseLookControlsInverted = src->profile.MouseLookControlsInverted; + dst.profile.VibrationDisabled = src->profile.VibrationDisabled; + dst.profile.ImpulseTriggersDisabled = src->profile.ImpulseTriggersDisabled; + dst.profile.AircraftControlsInverted = src->profile.AircraftControlsInverted; + dst.profile.AutoCenterEnabled = src->profile.AutoCenterEnabled; + dst.profile.CrouchLockEnabled = src->profile.CrouchLockEnabled; + dst.profile.MKCrouchLockEnabled = src->profile.MKCrouchLockEnabled; + dst.profile.ClenchProtectionEnabled = src->profile.ClenchProtectionEnabled; + dst.profile.UseFemaleVoice = src->profile.UseFemaleVoice; + dst.profile.HoldToZoom = src->profile.HoldToZoom; + dst.profile.PlayerModelPrimaryColorIndex = src->profile.PlayerModelPrimaryColorIndex; + dst.profile.PlayerModelSecondaryColorIndex = src->profile.PlayerModelSecondaryColorIndex; + dst.profile.PlayerModelTertiaryColorIndex = src->profile.PlayerModelTertiaryColorIndex; + dst.profile.UseEliteModel = src->profile.UseEliteModel; + dst.profile.LockMaxAspectRatio = src->profile.LockMaxAspectRatio; + dst.profile.un = src->profile.un; + dst.profile.UsersSkinsEnabled = src->profile.UsersSkinsEnabled; + dst.profile.PlayerModelPermutation = src->profile.PlayerModelPermutation; + dst.profile.HelmetIndex = src->profile.HelmetIndex; + dst.profile.LeftShoulderIndex = src->profile.LeftShoulderIndex; + dst.profile.RightShoulderIndex = src->profile.RightShoulderIndex; + dst.profile.ChestIndex = src->profile.ChestIndex; + dst.profile.WristIndex = src->profile.WristIndex; + dst.profile.UtilityIndex = src->profile.UtilityIndex; + dst.profile.ArmsIndex = src->profile.ArmsIndex; + dst.profile.LegsIndex = src->profile.LegsIndex; + dst.profile.BackpackIndex = src->profile.BackpackIndex; + dst.profile.SpartanBodyIndex = src->profile.SpartanBodyIndex; + dst.profile.SpartanArmorEffectIndex = src->profile.SpartanArmorEffectIndex; + dst.profile.KneesIndex = src->profile.KneesIndex; + dst.profile.VisorColorIndex = src->profile.VisorColorIndex; + dst.profile.EliteHelmetIndex = src->profile.EliteHelmetIndex; + dst.profile.EliteLeftShoulderIndex = src->profile.EliteLeftShoulderIndex; + dst.profile.EliteRightShoulderIndex = src->profile.EliteRightShoulderIndex; + dst.profile.EliteChestIndex = src->profile.EliteChestIndex; + dst.profile.EliteArmsIndex = src->profile.EliteArmsIndex; + dst.profile.EliteLegsIndex = src->profile.EliteLegsIndex; + dst.profile.EliteArmorIndex = src->profile.EliteArmorIndex; + dst.profile.EliteArmorEffectIndex = src->profile.EliteArmorEffectIndex; + dst.profile.VoiceIndex = src->profile.VoiceIndex; + dst.profile.PlayerModelPrimaryColor = src->profile.PlayerModelPrimaryColor; + dst.profile.PlayerModelSecondaryColor = src->profile.PlayerModelSecondaryColor; + dst.profile.PlayerModelTertiaryColor = src->profile.PlayerModelTertiaryColor; + dst.profile.SpartanPose = src->profile.SpartanPose; + dst.profile.ElitePose = src->profile.ElitePose; + // dst.profile.Skins = src->profile.Skins; + // dst.profile.ServiceTag = src->profile.ServiceTag; + dst.profile.OnlineMedalFlasher = src->profile.OnlineMedalFlasher; + dst.profile.VerticalLookSensitivity = src->profile.VerticalLookSensitivity; + dst.profile.HorizontalLookSensitivity = src->profile.HorizontalLookSensitivity; + dst.profile.LookAcceleration = src->profile.LookAcceleration; + dst.profile.LookAxialDeadZone = src->profile.LookAxialDeadZone; + dst.profile.LookRadialDeadZone = src->profile.LookRadialDeadZone; + dst.profile.ZoomLookSensitivityMultiplier = src->profile.ZoomLookSensitivityMultiplier; + dst.profile.VehicleLookSensitivityMultiplier = src->profile.VehicleLookSensitivityMultiplier; + dst.profile.ButtonPreset = src->profile.ButtonPreset; + dst.profile.StickPreset = src->profile.StickPreset; + dst.profile.LeftyToggle = src->profile.LeftyToggle; + dst.profile.FlyingCameraTurnSensitivity = src->profile.FlyingCameraTurnSensitivity; + dst.profile.FlyingCameraPanning = src->profile.FlyingCameraPanning; + dst.profile.FlyingCameraSpeed = src->profile.FlyingCameraSpeed; + dst.profile.FlyingCameraThrust = src->profile.FlyingCameraThrust; + dst.profile.TheaterTurnSensitivity = src->profile.TheaterTurnSensitivity; + dst.profile.TheaterPanning = src->profile.TheaterPanning; + dst.profile.TheaterSpeed = src->profile.TheaterSpeed; + dst.profile.TheaterThrust = src->profile.TheaterThrust; + dst.profile.MKTheaterTurnSensitivity = src->profile.MKTheaterTurnSensitivity; + dst.profile.MKTheaterPanning = src->profile.MKTheaterPanning; + dst.profile.MKTheaterSpeed = src->profile.MKTheaterSpeed; + dst.profile.MKTheaterThrust = src->profile.MKTheaterThrust; + dst.profile.SwapTriggersAndBumpers = src->profile.SwapTriggersAndBumpers; + dst.profile.UseModernAimControl = src->profile.UseModernAimControl; + dst.profile.UseDoublePressJumpToJetpack = src->profile.UseDoublePressJumpToJetpack; + dst.profile.DualWieldInverted = src->profile.DualWieldInverted; + dst.profile.ControllerDualWieldInverted = src->profile.ControllerDualWieldInverted; + dst.profile.ControllerHornetControlJoystick = src->profile.ControllerHornetControlJoystick; + dst.profile.ControllerBansheeTrickButtonsSwapped = src->profile.ControllerBansheeTrickButtonsSwapped; + dst.profile.ColorCorrection = src->profile.ColorCorrection; + dst.profile.EnemyPlayerNameColor = src->profile.EnemyPlayerNameColor; + dst.profile.GameEngineTimer = src->profile.GameEngineTimer; + // dst.profile.LoadoutSlots = src->profile.LoadoutSlots; + // dst.profile.GameSpecific = src->profile.GameSpecific; + dst.profile.MouseSensitivity = src->profile.MouseSensitivity; + dst.profile.MouseSmoothing = src->profile.MouseSmoothing; + dst.profile.MouseAcceleration = src->profile.MouseAcceleration; + dst.profile.PixelPerfectHudScale = src->profile.PixelPerfectHudScale; + dst.profile.MouseAccelerationMinRate = src->profile.MouseAccelerationMinRate; + dst.profile.MouseAccelerationMaxAccel = src->profile.MouseAccelerationMaxAccel; + dst.profile.MouseAccelerationScale = src->profile.MouseAccelerationScale; + dst.profile.MouseAccelerationExp = src->profile.MouseAccelerationExp; + dst.profile.KeyboardMouseButtonPreset = src->profile.KeyboardMouseButtonPreset; + // dst.profile.CustomKeyboardMouseMappingV2 = src->profile.CustomKeyboardMouseMappingV2; + dst.profile.MasterVolume = src->profile.MasterVolume; + dst.profile.MusicVolume = src->profile.MusicVolume; + dst.profile.SfxVolume = src->profile.SfxVolume; + // dst.profile.buffer4 = src->profile.buffer4; + dst.profile.Brightness = src->profile.Brightness; + // dst.profile.WeaponDisplayOffset = src->profile.WeaponDisplayOffset; + dst.profile.ColorBlindMode = src->profile.ColorBlindMode; + dst.profile.ColorBlindStrength = src->profile.ColorBlindStrength; + dst.profile.ColorBlindBrightness = src->profile.ColorBlindBrightness; + dst.profile.ColorBlindContrast = src->profile.ColorBlindContrast; + dst.profile.RemasteredHUDSetting = src->profile.RemasteredHUDSetting; + dst.profile.HUDScale = src->profile.HUDScale; memcpy(&dst.mapping, &src->mapping, sizeof(dst.mapping)); } }