From 3e5a445f746f66ecb2a4729eec3cc0766523534e Mon Sep 17 00:00:00 2001 From: WantedDV <122710241+WantedDV@users.noreply.github.com> Date: Mon, 3 Apr 2023 21:50:21 -0230 Subject: [PATCH 01/29] Unlock all create class slots and sets --- data/ui_scripts/cac_options/__init__.lua | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 data/ui_scripts/cac_options/__init__.lua diff --git a/data/ui_scripts/cac_options/__init__.lua b/data/ui_scripts/cac_options/__init__.lua new file mode 100644 index 00000000..8079e04d --- /dev/null +++ b/data/ui_scripts/cac_options/__init__.lua @@ -0,0 +1,21 @@ +Dvar.purchasedClassSetCount:set( 10 ) + +Engine.GetCustomClassCount = function( arg0 ) + return 10 +end + +Engine.GetNumberOfClassSetsOwned = function( arg0 ) + return 10 +end + +Engine.IsClassSetsAvailableForCurrentGameMode = function() + return true +end + +function IsClassSetsAvailableForCurrentGameMode() + return Engine.IsClassSetsAvailableForCurrentGameMode() +end + +function DoesPlayerHaveExtraSlotsItem( arg0 ) + return true +end From 64b58e7ead844506187e2b533a51f6a06192d736 Mon Sep 17 00:00:00 2001 From: Diavolo Date: Tue, 11 Apr 2023 20:51:46 +0200 Subject: [PATCH 02/29] feat(patches): fix unknown password command --- src/client/component/patches.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/client/component/patches.cpp b/src/client/component/patches.cpp index bfec3e5c..0900b5a8 100644 --- a/src/client/component/patches.cpp +++ b/src/client/component/patches.cpp @@ -2,6 +2,10 @@ #include "loader/component_loader.hpp" #include +#include + +#include "scheduler.hpp" + #include namespace patches @@ -34,6 +38,11 @@ namespace patches utils::hook::set(game::select(0x14224DA53, 0x140531143), 3); utils::hook::set(game::select(0x14224DBB4, 0x1405312A8), 3); utils::hook::set(game::select(0x14224DF8C, 0x1405316DC), 3); + + scheduler::once([] + { + game::register_dvar_string("password", "", game::DVAR_USERINFO, "password"); + }, scheduler::pipeline::main); } }; } From c29d9e5806ad9db8e04484e2159358b63f5a0ba1 Mon Sep 17 00:00:00 2001 From: Maurice Heumann Date: Wed, 12 Apr 2023 18:43:16 +0200 Subject: [PATCH 03/29] Dispatch connect packet in the server thread --- src/client/component/auth.cpp | 5 ++++- src/client/component/scheduler.cpp | 11 ++++++----- src/client/game/symbols.hpp | 3 +++ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/client/component/auth.cpp b/src/client/component/auth.cpp index 57346b8f..ef9f773c 100644 --- a/src/client/component/auth.cpp +++ b/src/client/component/auth.cpp @@ -196,7 +196,10 @@ namespace auth std::string final_packet{}; if (game::fragment_handler::handle(target, buffer, final_packet)) { - dispatch_connect_packet(target, final_packet); + scheduler::once([t = target, p = std::move(final_packet)] + { + dispatch_connect_packet(t, p); + }); } } } diff --git a/src/client/component/scheduler.cpp b/src/client/component/scheduler.cpp index d4ac94b8..a115b1d9 100644 --- a/src/client/component/scheduler.cpp +++ b/src/client/component/scheduler.cpp @@ -88,7 +88,6 @@ namespace scheduler task_pipeline pipelines[pipeline::count]; utils::hook::detour r_end_frame_hook; - utils::hook::detour g_run_frame_hook; utils::hook::detour main_frame_hook; @@ -98,9 +97,9 @@ namespace scheduler r_end_frame_hook.invoke(); } - void server_frame_stub() + void g_clear_vehicle_inputs_stub() { - g_run_frame_hook.invoke(); + game::G_ClearVehicleInputs(); execute(pipeline::server); } @@ -168,12 +167,14 @@ namespace scheduler { if (!game::is_server()) { - r_end_frame_hook.create(0x142272B00_g, r_end_frame_stub); // some func called before R_EndFrame, maybe SND_EndFrame? + r_end_frame_hook.create(0x142272B00_g, r_end_frame_stub); } - main_frame_hook.create(game::select(0x1420F8E00, 0x1405020E0), main_frame_stub); // Com_Frame_Try_Block_Function + main_frame_hook.create(game::select(0x1420F8E00, 0x1405020E0), main_frame_stub); + + utils::hook::call(game::select(0x14225522E, 0x140538427), g_clear_vehicle_inputs_stub); } void pre_destroy() override diff --git a/src/client/game/symbols.hpp b/src/client/game/symbols.hpp index 8109ed95..3165a4b5 100644 --- a/src/client/game/symbols.hpp +++ b/src/client/game/symbols.hpp @@ -75,6 +75,9 @@ namespace game WEAK symbol DB_FileExists{0x141420B40}; WEAK symbol DB_ReleaseXAssets{0x1414247C0}; + // G + WEAK symbol G_ClearVehicleInputs{0x1423812E0, 0x1405C1200}; + // Live WEAK symbol Live_GetConnectivityInformation{0x141E0C380}; From e8dba61553f8dddef1773d920ff486fc43716718 Mon Sep 17 00:00:00 2001 From: Maurice Heumann Date: Wed, 12 Apr 2023 18:50:39 +0200 Subject: [PATCH 04/29] I'm fucking dumb --- src/client/component/auth.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/component/auth.cpp b/src/client/component/auth.cpp index ef9f773c..67a625d5 100644 --- a/src/client/component/auth.cpp +++ b/src/client/component/auth.cpp @@ -199,7 +199,7 @@ namespace auth scheduler::once([t = target, p = std::move(final_packet)] { dispatch_connect_packet(t, p); - }); + }, scheduler::server); } } } From 4dc7fcd95e1691945934249281ddf18244261dde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Apr 2023 18:00:38 +0000 Subject: [PATCH 05/29] Bump deps/curl from `dc18b40` to `ca05e1a` Bumps [deps/curl](https://github.com/curl/curl) from `dc18b40` to `ca05e1a`. - [Release notes](https://github.com/curl/curl/releases) - [Commits](https://github.com/curl/curl/compare/dc18b40b406e9946a2198d66b6edb62575660faf...ca05e1afba7088c2f7e96ce47d2d3a249ce7a903) --- updated-dependencies: - dependency-name: deps/curl dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- deps/curl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/curl b/deps/curl index dc18b40b..ca05e1af 160000 --- a/deps/curl +++ b/deps/curl @@ -1 +1 @@ -Subproject commit dc18b40b406e9946a2198d66b6edb62575660faf +Subproject commit ca05e1afba7088c2f7e96ce47d2d3a249ce7a903 From 8372d34c3dbd3b1e005472d2d7cc4337be36b497 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Thu, 13 Apr 2023 17:18:07 +0200 Subject: [PATCH 06/29] Don't throw exceptions in list files util --- src/common/utils/io.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/common/utils/io.cpp b/src/common/utils/io.cpp index e981315d..6efce973 100644 --- a/src/common/utils/io.cpp +++ b/src/common/utils/io.cpp @@ -194,18 +194,19 @@ namespace utils::io std::vector list_files(const std::filesystem::path& directory, const bool recursive) { + std::error_code code{}; std::vector files; if (recursive) { - for (auto& file : std::filesystem::recursive_directory_iterator(directory)) + for (auto& file : std::filesystem::recursive_directory_iterator(directory, code)) { files.push_back(file.path()); } } else { - for (auto& file : std::filesystem::directory_iterator(directory)) + for (auto& file : std::filesystem::directory_iterator(directory, code)) { files.push_back(file.path()); } From 62b14eb542dc9ac3d8f814dce9b7c38d1c724782 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Thu, 13 Apr 2023 17:36:59 +0200 Subject: [PATCH 07/29] Prevent the game from modifying the process priority --- src/client/component/client_patches.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/client/component/client_patches.cpp b/src/client/component/client_patches.cpp index 9d824961..f8a9a9b5 100644 --- a/src/client/component/client_patches.cpp +++ b/src/client/component/client_patches.cpp @@ -116,6 +116,9 @@ namespace client_patches { fix_amd_cpu_stuttering(); + // Don't modify process priority + utils::hook::nop(0x142334C98_g, 6); + // Kill microphones for now utils::hook::set(0x15AAE9254_g, mixer_open_stub); From accf537f50d6cda28c3cdbbef9ff114121f353f7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Apr 2023 18:01:06 +0000 Subject: [PATCH 08/29] Bump deps/curl from `ca05e1a` to `7e68133` Bumps [deps/curl](https://github.com/curl/curl) from `ca05e1a` to `7e68133`. - [Release notes](https://github.com/curl/curl/releases) - [Commits](https://github.com/curl/curl/compare/ca05e1afba7088c2f7e96ce47d2d3a249ce7a903...7e68133d041376c1012571e5a2386bb03a620a8e) --- updated-dependencies: - dependency-name: deps/curl dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- deps/curl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/curl b/deps/curl index ca05e1af..7e68133d 160000 --- a/deps/curl +++ b/deps/curl @@ -1 +1 @@ -Subproject commit ca05e1afba7088c2f7e96ce47d2d3a249ce7a903 +Subproject commit 7e68133d041376c1012571e5a2386bb03a620a8e From 788d7e72e27d902771105b13c5127588d5be3321 Mon Sep 17 00:00:00 2001 From: efinst0rm Date: Thu, 13 Apr 2023 18:18:07 -0500 Subject: [PATCH 09/29] Update serversettings. Set level.gameForfeited to false. --- data/scripts/mp/gametypes/_serversettings.gsc | Bin 4446 -> 4518 bytes .../mp/gametypes/_serversettings.gsc_raw | 28 ++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/data/scripts/mp/gametypes/_serversettings.gsc b/data/scripts/mp/gametypes/_serversettings.gsc index cd63bd0b2ebb53e9107b14ed65d7fff569375288..0105b093db16db0bee7ce860fc6f1d226bf54fea 100644 GIT binary patch literal 4518 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 lT8-xPn`hC??am2-b5co`v1o6m&5=7 literal 4446 zcmZ8l32@Zq6@R-MFb3GJcSO|x{`dIreP78QA&@2uCIm>x0fc0;S7J8VCA$ep2r)La zwHXwp*rGCk3ZeqSC^`jG)G@^?4rrO0SX)7XVGOZ$td@2t^t}y#Sa&Die((Bz?|tvP z-e$0@YT=wbn0Ksd;~QH90MGplV8^w7%`E^kX9EmiBbr)E9zZMV?}nLRhUt$8gpdq& zwkA?ZV=x{H^K>%R*%eG(S0!5lo#Bu%7>LE11HrarJXf%Y)K!gz@v8R%-gAw=Je?eSEIgy}xoi2ma1y5p%Z28_}hEYCEi z!h!Z+OQ0hfhDc{?xFZznjkI=#Q@x2WjmVTyw2ke7M6$In3=SJuEns$l3!;rtj43@L z)D9_Z!BhlV)@PSV(Nwo25()fsDak8X38QMSSwu8_XnfSsWZ(DT znsofp=ki;=`MhITdDct)ps{;^ z;uzQMut{LlOLV)TtB!PC=p&#^)DSIotY1c0ok}RP_C)&lIG(kMna5O|hiryi<-Q5D zNvOci>-QPOjGxse&Y&D~-NMIl%3-!_{C7>>6H*65y~NRDCExq42N($)l1(A~Uww=t z-76k3Gv!b<5+=YV6*lHf2LJ1c`q-p@fsTh#gExQNyPXT|za zkFl)g^E{J<26HHC`gl0>8_Lrjv};xRDrn3J8AR0Ge^ij1@Q2l)nfvj`---8gPgrK? zz0O~{&tH`=?gEn0XP+zQfm@^BpNGQvso#~^w!(6wc7arU4=kzcz5lhvDrgro6Z#E0 zI;)%lR`7AWA{UwB=IJwkPA@7od7o41;Lkcy%Lgtxy9PWT+Jdz!h~De1jLwHmvCz4}y&B`sO`R7ikIL3~>AZZ%LhFFzRaOUk&9Ks2M6!CE z=YCD9o9MW&NKWTzw*rzpF6WUj&Q%4=(OvrEP~}9|oj=|Uc&CRNh97|Dfy5g>)_wqZ znP0dpc^M*N2KT>8aX<4E4cKB8wh!5j>=vt_rro^LE?D%fRM^yJJ>ovjD24SJfxX`> z)GoCjmqNv$uHP)Gk~*p|h84_|#}BtzK=v*x^f>F)^&7T7shXq7he|6ft~1S%7sW}| z>j(wtepykp$9FsK{TeAO%X5GuXXB2p2Qf;LwAc$L+9K^s5DzbRydf z^Gd|Mi`!xI!#D$>5#>@#AvaMncJp@CX?s4L@Ig{9|46&qK(Zl2VGZHVwO{oRF3zU- zeS9Z)+#eKMv^j#8q#~!EU4yts-3NSr&>3O*D(O*q_kcO~lPh!BVp%@ykwModCVOFB zf@HW?*AuS8wJnX??SW;#l0q4en=k*yupiV4k#*1*K-{SM0ON;8JkYbrXD^KOb;TZ; zG1GjLD;+O)*z{YEr<`P?UZ0(CKQ+&jQM~KjpnX>f2_E+c#XAMn5H*QfCT$_a{SSBC zTtay;>zFc|rN7BjE1gnLd8q03fq^0mWFO}ssxXNeT+s*~yd}GO+h&o!E9Tt9 z!>S$ba+*`vYkg0?s;%~)e;t`^yVsge=SaWVn``SYB^lnkYMRrxg$I~?oKv>~nlV?N zAiga8yv**eY&LB3)KN^bA%h}Fek|T856x$f1I!E5V5f(N z_v7+?WelNiy-_5^dZ&{2v)DMl;;Md!+Yi5xLF-}DoT4_*-)2UXA=PW>2Xon_V?Oul zsz^5BbGpfo*JWeLPZPdH&nkePqek9OhXrqt4F}9$=?bq%nC0H;vKMi;1)h9IKkMvH z8y55senIrv1(Z>xnU*19XUW>P@=-@sBrltsx<&Qf3_OAO^6;{@?-o@I-UL9e7Re9> zo?2U33i#`RUMyb5W20Vr2*0R$9d^HPOaM8;_mSuQkp3cmQMIZ%^XBIQ5C|_JPq#f` z2|>WhF|M(h0Cdw%;|tjY$};(_$n#?mgWaE@$6qn*CFF0<0ho=k^W%glpCD5Q^?aRG98yXd%mqI=>o~_8=SU&-~3;7#sCtydA=hqyUf*s2mKQC)7RwJK@pUTo7Mm{q?@{Bd0 z{DzRHTWC5z!0tw#cJnn}F3w%Hnl5->}DJmv2P=5bn=R%r8)u=~Iq+I+6Su zg|hgutnvAH=VjX4kk7;)%+hbq(qAAwo*m3DjN%tnWw>o1h5_eez8LJO3dhvL7}Dd| zs?orMd!Ynr`ZY#lmm)oiJ$6us;~qzXDlx+P7t#roy@>t9HJd}o=cDq>HJg5<-$$7V zd%9Wh9|CX~>Dw`IsQ=3%Z<*v7E!!aU?+>pm7+b(P)*e+np!O5GjRbxwFQ=yE0J<#}VNS9-q zk39atX{4!=Ct8KJRIw9Xjx<%?L_dx+RZK*mMgLUg5beP^Qe{H)R-~z#Ao?QGQ~?lO Nf^(-=o9OLG{~zTmftmmS diff --git a/data/scripts/mp/gametypes/_serversettings.gsc_raw b/data/scripts/mp/gametypes/_serversettings.gsc_raw index 02669e86..580e2966 100644 --- a/data/scripts/mp/gametypes/_serversettings.gsc_raw +++ b/data/scripts/mp/gametypes/_serversettings.gsc_raw @@ -17,27 +17,33 @@ function __init__() function init() { level.hostname = GetDvarString( "sv_hostname"); - if(level.hostname == "") + if (level.hostname == "") + { level.hostname = "CoDHost"; + } + SetDvar("sv_hostname", level.hostname); SetDvar("ui_hostname", level.hostname); level.motd = GetDvarString( "scr_motd" ); if(level.motd == "") + { level.motd = ""; + } SetDvar("scr_motd", level.motd); SetDvar("ui_motd", level.motd); - level.allowvote = GetDvarString( "g_allowvote"); + level.allowvote = GetDvarString( "g_allowvote" ); if(level.allowvote == "") + { level.allowvote = "1"; + } SetDvar("g_allowvote", level.allowvote); SetDvar("ui_allowvote", level.allowvote); - + level.allow_teamchange = "1"; SetDvar("ui_allow_teamchange", level.allow_teamchange); - level.friendlyfire = GetGametypeSetting( "friendlyfiretype" ); SetDvar("ui_friendlyfire", level.friendlyfire); @@ -57,6 +63,8 @@ function init() constrain_gametype(GetDvarString( "g_gametype")); constrain_map_size(level.mapsize); + thread setup_callbacks(); + for(;;) { update(); @@ -193,4 +201,14 @@ function constrain_map_size(mapsize) } } } -} \ No newline at end of file +} + +function setup_callbacks() +{ + level.onForfeit = &default_onForfeit; +} + +function default_onForfeit() +{ + level.gameForfeited = false; +} From cfed6a5c83361195b89026fb779563497bbccf0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Apr 2023 18:01:31 +0000 Subject: [PATCH 10/29] Bump deps/curl from `7e68133` to `7ed010c` Bumps [deps/curl](https://github.com/curl/curl) from `7e68133` to `7ed010c`. - [Release notes](https://github.com/curl/curl/releases) - [Commits](https://github.com/curl/curl/compare/7e68133d041376c1012571e5a2386bb03a620a8e...7ed010ce2192ae3e4d9663eaaa3a460f316b708b) --- updated-dependencies: - dependency-name: deps/curl dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- deps/curl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/curl b/deps/curl index 7e68133d..7ed010ce 160000 --- a/deps/curl +++ b/deps/curl @@ -1 +1 @@ -Subproject commit 7e68133d041376c1012571e5a2386bb03a620a8e +Subproject commit 7ed010ce2192ae3e4d9663eaaa3a460f316b708b From b0a6523b6c1f9cc9c1329e0f1fbe419394bd403d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Apr 2023 18:01:34 +0000 Subject: [PATCH 11/29] Bump deps/zlib from `eb0e038` to `5799c14` Bumps [deps/zlib](https://github.com/madler/zlib) from `eb0e038` to `5799c14`. - [Release notes](https://github.com/madler/zlib/releases) - [Commits](https://github.com/madler/zlib/compare/eb0e038b297f2c9877ed8b3515c6718a4b65d485...5799c14c8526bf1aaa130c021982f831d155b46d) --- updated-dependencies: - dependency-name: deps/zlib dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- deps/zlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/zlib b/deps/zlib index eb0e038b..5799c14c 160000 --- a/deps/zlib +++ b/deps/zlib @@ -1 +1 @@ -Subproject commit eb0e038b297f2c9877ed8b3515c6718a4b65d485 +Subproject commit 5799c14c8526bf1aaa130c021982f831d155b46d From 230bd784f288850e2564f7455674797829a8616b Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sat, 15 Apr 2023 15:01:12 +0200 Subject: [PATCH 12/29] Remove unnecessary print --- src/client/component/auth.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/client/component/auth.cpp b/src/client/component/auth.cpp index 67a625d5..78a6b460 100644 --- a/src/client/component/auth.cpp +++ b/src/client/component/auth.cpp @@ -107,8 +107,6 @@ namespace auth buffer.write_string(data, static_cast(length)); - printf("Serialized with size: %llX\n", buffer.get_buffer().size()); - return buffer.move_buffer(); } From c5091bef79c7f5dc4fe2f5f0215cf12110f0356e Mon Sep 17 00:00:00 2001 From: efinst0rm Date: Sat, 15 Apr 2023 12:39:41 -0500 Subject: [PATCH 13/29] Use current production _serversettings.gsc --- data/scripts/mp/gametypes/_serversettings.gsc | Bin 4518 -> 4612 bytes .../mp/gametypes/_serversettings.gsc_raw | 25 +++++++----------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/data/scripts/mp/gametypes/_serversettings.gsc b/data/scripts/mp/gametypes/_serversettings.gsc index 0105b093db16db0bee7ce860fc6f1d226bf54fea..bf3985aab646d5b010b7fea76bcc9567366f1d51 100644 GIT binary patch literal 4612 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 A;Q#;t literal 4518 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 lT8-xPn`hC??am2-b5co`v1o6m&5=7 diff --git a/data/scripts/mp/gametypes/_serversettings.gsc_raw b/data/scripts/mp/gametypes/_serversettings.gsc_raw index 580e2966..e420ca3c 100644 --- a/data/scripts/mp/gametypes/_serversettings.gsc_raw +++ b/data/scripts/mp/gametypes/_serversettings.gsc_raw @@ -3,11 +3,9 @@ #using scripts\shared\callbacks_shared; #using scripts\shared\system_shared; -#insert scripts\shared\shared.gsh; - #namespace serversettings; -REGISTER_SYSTEM( "serversettings", &__init__, undefined ) +function autoexec __init__sytem__() { system::register("serversettings",&__init__,undefined,undefined); } function __init__() { @@ -17,36 +15,33 @@ function __init__() function init() { level.hostname = GetDvarString( "sv_hostname"); - if (level.hostname == "") - { + if(level.hostname == "") level.hostname = "CoDHost"; - } - SetDvar("sv_hostname", level.hostname); SetDvar("ui_hostname", level.hostname); + //makeDvarServerInfo("ui_hostname", "CoDHost"); level.motd = GetDvarString( "scr_motd" ); if(level.motd == "") - { level.motd = ""; - } SetDvar("scr_motd", level.motd); SetDvar("ui_motd", level.motd); + //makeDvarServerInfo("ui_motd", ""); level.allowvote = GetDvarString( "g_allowvote" ); if(level.allowvote == "") - { level.allowvote = "1"; - } SetDvar("g_allowvote", level.allowvote); SetDvar("ui_allowvote", level.allowvote); - + //makeDvarServerInfo("ui_allowvote", "1"); + level.allow_teamchange = "1"; SetDvar("ui_allow_teamchange", level.allow_teamchange); level.friendlyfire = GetGametypeSetting( "friendlyfiretype" ); SetDvar("ui_friendlyfire", level.friendlyfire); + //makeDvarServerInfo("ui_friendlyfire", "0"); if(GetDvarString( "scr_mapsize") == "") SetDvar("scr_mapsize", "64"); @@ -62,7 +57,7 @@ function init() constrain_gametype(GetDvarString( "g_gametype")); constrain_map_size(level.mapsize); - + thread setup_callbacks(); for(;;) @@ -88,7 +83,7 @@ function update() SetDvar("ui_motd", level.motd); } - g_allowvote = GetDvarString( "g_allowvote"); + g_allowvote = GetDvarString( "g_allowvote" ); if(level.allowvote != g_allowvote) { level.allowvote = g_allowvote; @@ -211,4 +206,4 @@ function setup_callbacks() function default_onForfeit() { level.gameForfeited = false; -} +} \ No newline at end of file From af76836254af81d0e0167fe46d80b7f009799759 Mon Sep 17 00:00:00 2001 From: WantedDV <122710241+WantedDV@users.noreply.github.com> Date: Sun, 16 Apr 2023 18:33:31 -0230 Subject: [PATCH 14/29] cg_unlockall_cac_slots dvar --- src/client/component/loot.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/client/component/loot.cpp b/src/client/component/loot.cpp index 291bcdd6..b95301dc 100644 --- a/src/client/component/loot.cpp +++ b/src/client/component/loot.cpp @@ -17,6 +17,7 @@ namespace loot const game::dvar_t* dvar_cg_unlockall_camos_and_reticles; const game::dvar_t* dvar_cg_unlockall_calling_cards; const game::dvar_t* dvar_cg_unlockall_specialists_outfits; + const game::dvar_t* dvar_cg_unlockall_cac_slots; utils::hook::detour loot_getitemquantity_hook; utils::hook::detour liveinventory_getitemquantity_hook; @@ -30,7 +31,8 @@ namespace loot utils::hook::detour bg_unlockablescharactercustomizationitemlocked_hook; utils::hook::detour bg_emblemisentitlementbackgroundgranted_hook; utils::hook::detour liveentitlements_isentitlementactiveforcontroller_hook; - + utils::hook::detour bg_unlockablesgetcustomclasscount_hook; + int loot_getitemquantity_stub(const game::ControllerIndex_t controller_index, const game::eModes mode, const int item_id) { if (!dvar_cg_unlockall_loot->current.value.enabled) @@ -60,7 +62,7 @@ namespace loot bool liveinventory_areextraslotspurchased_stub(const game::ControllerIndex_t controller_index) { - if (dvar_cg_unlockall_loot->current.value.enabled) + if (dvar_cg_unlockall_cac_slots->current.value.enabled) { return true; } @@ -160,9 +162,19 @@ namespace loot return liveentitlements_isentitlementactiveforcontroller_hook.invoke(controllerIndex, incentiveId); } + + int bg_unlockablesgetcustomclasscount_stub(game::eModes mode, const game::ControllerIndex_t controllerIndex) + { + if (dvar_cg_unlockall_cac_slots->current.value.enabled) + { + return 10; + } + + return bg_unlockablesgetcustomclasscount_hook.invoke(mode, controllerIndex); + } }; - struct component final : client_component + struct component final: client_component { void post_unpack() override { @@ -172,6 +184,7 @@ namespace loot dvar_cg_unlockall_camos_and_reticles = game::register_dvar_bool("cg_unlockall_camos_and_reticles", false, game::DVAR_ARCHIVE, "Unlocks all camos and reticles"); dvar_cg_unlockall_calling_cards = game::register_dvar_bool("cg_unlockall_calling_cards", false, game::DVAR_ARCHIVE, "Unlocks all calling cards"); dvar_cg_unlockall_specialists_outfits = game::register_dvar_bool("cg_unlockall_specialists_outfits", false, game::DVAR_ARCHIVE, "Unlocks all specialists outfits"); + dvar_cg_unlockall_cac_slots = game::register_dvar_bool("cg_unlockall_cac_slots", false, game::DVAR_ARCHIVE, "Unlocks all Create a Class Slots"); loot_getitemquantity_hook.create(0x141E82C00_g, loot_getitemquantity_stub); liveinventory_getitemquantity_hook.create(0x141E09030_g, liveinventory_getitemquantity_stub); @@ -185,6 +198,7 @@ namespace loot bg_unlockablescharactercustomizationitemlocked_hook.create(0x1426A2030_g, bg_unlockablescharactercustomizationitemlocked_stub); bg_emblemisentitlementbackgroundgranted_hook.create(0x142667520_g, bg_emblemisentitlementbackgroundgranted_stub); liveentitlements_isentitlementactiveforcontroller_hook.create(0x141E124E0_g, liveentitlements_isentitlementactiveforcontroller_stub); + bg_unlockablesgetcustomclasscount_hook.create(0x1426A5900_g, bg_unlockablesgetcustomclasscount_stub); scheduler::once([]() { if (dvar_cg_unlockall_loot->current.value.enabled) From b6bc9e6fa4563231cddaa8357e3f5216cef1ae09 Mon Sep 17 00:00:00 2001 From: WantedDV <122710241+WantedDV@users.noreply.github.com> Date: Sun, 16 Apr 2023 21:02:59 -0230 Subject: [PATCH 15/29] Add unlock class slots togle to stats menu --- data/ui_scripts/cac_options/__init__.lua | 21 --------------------- data/ui_scripts/stats/__init__.lua | 13 ++++++++++++- 2 files changed, 12 insertions(+), 22 deletions(-) delete mode 100644 data/ui_scripts/cac_options/__init__.lua diff --git a/data/ui_scripts/cac_options/__init__.lua b/data/ui_scripts/cac_options/__init__.lua deleted file mode 100644 index 8079e04d..00000000 --- a/data/ui_scripts/cac_options/__init__.lua +++ /dev/null @@ -1,21 +0,0 @@ -Dvar.purchasedClassSetCount:set( 10 ) - -Engine.GetCustomClassCount = function( arg0 ) - return 10 -end - -Engine.GetNumberOfClassSetsOwned = function( arg0 ) - return 10 -end - -Engine.IsClassSetsAvailableForCurrentGameMode = function() - return true -end - -function IsClassSetsAvailableForCurrentGameMode() - return Engine.IsClassSetsAvailableForCurrentGameMode() -end - -function DoesPlayerHaveExtraSlotsItem( arg0 ) - return true -end diff --git a/data/ui_scripts/stats/__init__.lua b/data/ui_scripts/stats/__init__.lua index a20f2ea3..b9b5a34b 100644 --- a/data/ui_scripts/stats/__init__.lua +++ b/data/ui_scripts/stats/__init__.lua @@ -42,7 +42,18 @@ DataSources.MPStatsSettings = DataSourceHelpers.ListSetup( "MPStatsSettings", fu }, }, nil, updateDvar )) end - table.insert( optionsTable, CoD.OptionsUtility.CreateDvarSettings( controller, "Unlock All Attachments", "All attachments on weapons are unlocked.", "MPStatsSettings_unlockall_attachments", "cg_unlockall_attachments", { + table.insert( optionsTable, CoD.OptionsUtility.CreateDvarSettings( controller, "Unlock All Class Slots", "Unlock all create-a-class slots and sets.", "MPStatsSettings_unlockall_cac_slots", "cg_unlockall_cac_slots", { + { + option = "MENU_DISABLED", + value = 0, + default = true + }, + { + option = "MENU_ENABLED", + value = 1 + }, + }, nil, updateDvar )) + table.insert( optionsTable, CoD.OptionsUtility.CreateDvarSettings( controller, "Unlock All Attachments", "All attachments on weapons are unlocked.", "MPStatsSettings_unlockall_attachments", "cg_unlockall_attachments", { { option = "MENU_DISABLED", value = 0, From d069df0c869758a8e40258af4c86c65eb154851c Mon Sep 17 00:00:00 2001 From: WantedDV <122710241+WantedDV@users.noreply.github.com> Date: Sun, 16 Apr 2023 21:04:30 -0230 Subject: [PATCH 16/29] associate cac item_id with cg_unlockall_cac_slots --- src/client/component/loot.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/client/component/loot.cpp b/src/client/component/loot.cpp index b95301dc..329439d4 100644 --- a/src/client/component/loot.cpp +++ b/src/client/component/loot.cpp @@ -50,13 +50,19 @@ namespace loot int liveinventory_getitemquantity_stub(const game::ControllerIndex_t controller_index, const int item_id) { - // Item id's for extra CaC slots, CWL camo's and paid specialist outfits + // Item id's for CWL camo's and paid specialist outfits if (dvar_cg_unlockall_loot->current.value.enabled && (item_id == 99003 || item_id >= 99018 && item_id <= 99021 || item_id == 99025 || item_id >= 90047 && item_id <= 90064)) { return 1; } + // Item id for extra CaC slots + if (dvar_cg_unlockall_cac_slots->current.value.enabled && (item_id == 99003)) + { + return 1; + } + return liveinventory_getitemquantity_hook.invoke(controller_index, item_id); } @@ -205,7 +211,7 @@ namespace loot { game::Dvar_SetFromStringByName("ui_enableAllHeroes", "1", true); } - }, scheduler::pipeline::dvars_loaded); + }, scheduler::pipeline::dvars_loaded); } }; }; From 6c07d84e23cfc097ba3acd70320d542027786c54 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Mon, 17 Apr 2023 18:42:52 +0200 Subject: [PATCH 17/29] Prepare colored name support --- src/client/component/auth.cpp | 80 ++++++++++++++++++++++++++++++++- src/client/component/auth.hpp | 1 + src/client/component/colors.cpp | 65 +++++++++++++++++++++------ src/client/component/party.hpp | 2 + src/client/game/utils.cpp | 34 ++++++++++++++ src/client/game/utils.hpp | 2 + src/client/std_include.hpp | 1 + 7 files changed, 170 insertions(+), 15 deletions(-) diff --git a/src/client/component/auth.cpp b/src/client/component/auth.cpp index 78a6b460..7c679aa8 100644 --- a/src/client/component/auth.cpp +++ b/src/client/component/auth.cpp @@ -2,6 +2,7 @@ #include "loader/component_loader.hpp" #include "auth.hpp" +#include "party.hpp" #include "command.hpp" #include "network.hpp" #include "scheduler.hpp" @@ -24,6 +25,8 @@ namespace auth { namespace { + std::array client_xuids{}; + std::string get_hdd_serial() { DWORD serial{}; @@ -151,6 +154,32 @@ namespace auth return 0; } + void distribute_player_xuid(const game::netadr_t& target, const size_t player_index, const uint64_t xuid) + { + if (player_index >= 18) + { + return; + } + + utils::byte_buffer buffer{}; + buffer.write(static_cast(player_index)); + buffer.write(xuid); + + game::foreach_connected_client([&](const game::client_s& client, size_t index) + { + network::send(client.address, "playerXuid", buffer.get_buffer()); + + if (index != player_index) + { + utils::byte_buffer current_buffer{}; + current_buffer.write(static_cast(index)); + current_buffer.write(client.xuid); + + network::send(target, "playerXuid", current_buffer.get_buffer()); + } + }); + } + void dispatch_connect_packet(const game::netadr_t& target, const std::string& data) { utils::byte_buffer buffer(data); @@ -173,13 +202,17 @@ namespace auth game::SV_DirectConnect(target); - game::foreach_connected_client([&](game::client_s& client) + size_t player_index = 18; + game::foreach_connected_client([&](game::client_s& client, size_t index) { if (client.address == target) { client.xuid = xuid; + player_index = index; } }); + + distribute_player_xuid(target, player_index, xuid); } void handle_connect_packet_fragment(const game::netadr_t& target, const network::data_view& data) @@ -200,6 +233,24 @@ namespace auth }, scheduler::server); } } + + void handle_player_xuid_packet(const game::netadr_t& target, const network::data_view& data) + { + if (game::is_server_running() || !party::is_host(target)) + { + return; + } + + utils::byte_buffer buffer(data); + + const auto player_id = buffer.read(); + const auto xuid = buffer.read(); + + if (player_id < client_xuids.size()) + { + client_xuids[player_id] = xuid; + } + } } uint64_t get_guid() @@ -217,6 +268,32 @@ namespace auth return guid; } + uint64_t get_guid(const size_t client_num) + { + if (client_num >= 18) + { + return 0; + } + + if (!game::is_server_running()) + { + return client_xuids[client_num]; + } + + uint64_t xuid = 0; + const auto callback = [&xuid](const game::client_s& client) + { + xuid = client.xuid; + }; + + if (!game::access_connected_client(client_num, callback)) + { + return 0; + } + + return xuid; + } + struct component final : generic_component { void post_unpack() override @@ -224,6 +301,7 @@ namespace auth // Skip connect handler utils::hook::set(game::select(0x142253EFA, 0x14053714A), 0xEB); network::on("connect", handle_connect_packet_fragment); + network::on("playerXuid", handle_player_xuid_packet); // Patch steam id bit check std::vector> patches{}; diff --git a/src/client/component/auth.hpp b/src/client/component/auth.hpp index 3ee0c53a..87c07f5e 100644 --- a/src/client/component/auth.hpp +++ b/src/client/component/auth.hpp @@ -3,4 +3,5 @@ namespace auth { uint64_t get_guid(); + uint64_t get_guid(size_t client_num); } diff --git a/src/client/component/colors.cpp b/src/client/component/colors.cpp index 306c44b6..5c7f7b4e 100644 --- a/src/client/component/colors.cpp +++ b/src/client/component/colors.cpp @@ -3,6 +3,10 @@ #include "game/game.hpp" +#include "auth.hpp" + +#include "steam/steam.hpp" + #include #include @@ -10,8 +14,25 @@ namespace colors { namespace { - utils::hook::detour get_player_name_hook; - utils::hook::detour get_gamer_tag_hook; + utils::hook::detour cl_get_client_name_hook; + + std::optional get_color_for_xuid(const uint64_t xuid) + { + if (xuid == 0xCD02AF6448291209 + || xuid == 0x10F0C433E08E1357 + || xuid == 0x60E0FEFE42341715) + { + return 2; + } + + return {}; + } + + std::optional get_color_for_client(const int client_num) + { + const auto xuid = auth::get_guid(static_cast(client_num)); + return get_color_for_xuid(xuid); + } template void patch_color(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t a = 255) @@ -36,23 +57,39 @@ namespace colors utils::hook::copy(g_color_table + index * 4, color_float, sizeof(color_float)); } - /*uint64_t get_player_name_stub(const uint64_t client, int client_num, char* buffer, const int size, - const bool has_clan_tag) + bool cl_get_client_name_stub(const int local_client_num, const int index, char* buf, const int size, + const bool add_clan_name) { - const auto res = get_player_name_hook.invoke(client, client_num, buffer, size, has_clan_tag); + const auto res = cl_get_client_name_hook.invoke(local_client_num, index, buf, size, add_clan_name); - if (_ReturnAddress() != reinterpret_cast(0x1406A7B56_g)) + if (_ReturnAddress() == reinterpret_cast(0x1406A7B56_g)) { - const auto val = utils::string::va("^%d%s", rand() % 7, buffer); - strncpy_s(buffer, size, val, size); + return res; } - return res; - }*/ + const auto color = get_color_for_client(index); + if (!color) + { + return res; + } - /*const char* get_gamer_tag_stub(const uint64_t num) + const auto val = utils::string::va("^%d%s", *color, buf); + utils::string::copy(buf, size, val); + + return res; + } + + /*const char* get_gamer_tag_stub(const uint32_t num) { - return utils::string::va("^3%s", get_gamer_tag_hook.invoke(num)); + const auto color = get_color_for_xuid(steam::SteamUser()->GetSteamID().bits); + const auto name = reinterpret_cast(0x141EC6E80)(num) + 8; + + if (!color || num) + { + return name; + } + + return utils::string::va("^1%s", *color, name); }*/ } @@ -68,8 +105,8 @@ namespace colors patch_color<6>(151, 80, 221); // 6 - Pink // Old addresses - //get_player_name_hook.create(0x1413E3140_g, get_player_name_stub); - //get_gamer_tag_hook.create(0x141EC7370_g, get_gamer_tag_stub); + cl_get_client_name_hook.create(game::CL_GetClientName, cl_get_client_name_stub); + //utils::hook::jump(0x141EC72E0_g, get_gamer_tag_stub); } }; } diff --git a/src/client/component/party.hpp b/src/client/component/party.hpp index f682a14e..b10ee95c 100644 --- a/src/client/component/party.hpp +++ b/src/client/component/party.hpp @@ -1,6 +1,8 @@ #pragma once #include +#include "game/game.hpp" + namespace party { using query_callback_func = void(bool success, const game::netadr_t& host, const ::utils::info_string& info, uint32_t ping); diff --git a/src/client/game/utils.cpp b/src/client/game/utils.cpp index e374a73a..c61a4350 100644 --- a/src/client/game/utils.cpp +++ b/src/client/game/utils.cpp @@ -176,6 +176,30 @@ namespace game } } + + template + static bool access_client(T* client_states, const size_t index, const std::function& callback) + { + if (!client_states || !callback) + { + return false; + } + + if (index >= get_max_client_count()) + { + return false; + } + + auto& client = client_states[index]; + if (client.client_state <= 0) + { + return false; + } + + callback(client); + return true; + } + void foreach_client(const std::function& callback) { if (is_server()) @@ -214,4 +238,14 @@ namespace game callback(client); }); } + + bool access_connected_client(const size_t index, const std::function& callback) + { + if (is_server()) + { + return access_client(*svs_clients, index, callback); + } + + return access_client(*svs_clients_cl, index, callback); + } } diff --git a/src/client/game/utils.hpp b/src/client/game/utils.hpp index 09abd8e7..5bbc78c0 100644 --- a/src/client/game/utils.hpp +++ b/src/client/game/utils.hpp @@ -24,4 +24,6 @@ namespace game void foreach_connected_client(const std::function& callback); void foreach_connected_client(const std::function& callback); + + bool access_connected_client(size_t index, const std::function& callback); } diff --git a/src/client/std_include.hpp b/src/client/std_include.hpp index 59b83a41..422c5ed9 100644 --- a/src/client/std_include.hpp +++ b/src/client/std_include.hpp @@ -65,6 +65,7 @@ #endif #include +#include #include #include #include From 4be9292c3b01eef66f08e5ebaa9925b8968d2d64 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Apr 2023 18:03:50 +0000 Subject: [PATCH 18/29] Bump deps/curl from `7ed010c` to `1c5ed24` Bumps [deps/curl](https://github.com/curl/curl) from `7ed010c` to `1c5ed24`. - [Release notes](https://github.com/curl/curl/releases) - [Commits](https://github.com/curl/curl/compare/7ed010ce2192ae3e4d9663eaaa3a460f316b708b...1c5ed24ee0e929a6f410fcc3729becfd2ee71211) --- updated-dependencies: - dependency-name: deps/curl dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- deps/curl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/curl b/deps/curl index 7ed010ce..1c5ed24e 160000 --- a/deps/curl +++ b/deps/curl @@ -1 +1 @@ -Subproject commit 7ed010ce2192ae3e4d9663eaaa3a460f316b708b +Subproject commit 1c5ed24ee0e929a6f410fcc3729becfd2ee71211 From d7b835d0ebc5e853714d4e5c990ca78c35def41a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Apr 2023 18:03:53 +0000 Subject: [PATCH 19/29] Bump deps/zlib from `5799c14` to `6658868` Bumps [deps/zlib](https://github.com/madler/zlib) from `5799c14` to `6658868`. - [Release notes](https://github.com/madler/zlib/releases) - [Commits](https://github.com/madler/zlib/compare/5799c14c8526bf1aaa130c021982f831d155b46d...66588683b36042154ad35140bf9fcbb60c5d573c) --- updated-dependencies: - dependency-name: deps/zlib dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- deps/zlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/zlib b/deps/zlib index 5799c14c..66588683 160000 --- a/deps/zlib +++ b/deps/zlib @@ -1 +1 @@ -Subproject commit 5799c14c8526bf1aaa130c021982f831d155b46d +Subproject commit 66588683b36042154ad35140bf9fcbb60c5d573c From fa144b7dd65cffb030a2192d13efaeb422046ec7 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Mon, 17 Apr 2023 20:08:49 +0200 Subject: [PATCH 20/29] Clear xuids before connecting --- src/client/component/auth.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/client/component/auth.cpp b/src/client/component/auth.cpp index 7c679aa8..3b56585e 100644 --- a/src/client/component/auth.cpp +++ b/src/client/component/auth.cpp @@ -135,6 +135,11 @@ namespace auth int send_connect_data_stub(const game::netsrc_t sock, game::netadr_t* adr, const char* data, const int len) { + for (auto& xuid : client_xuids) + { + xuid = 0; + } + try { const auto is_connect_sequence = len >= 7 && strncmp("connect", data, 7) == 0; From e6e2805466d1d85b460b5675e8612eff7f8239f2 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Mon, 17 Apr 2023 20:33:41 +0200 Subject: [PATCH 21/29] Fix guid distribution for bots --- src/client/component/auth.cpp | 53 ++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/src/client/component/auth.cpp b/src/client/component/auth.cpp index 3b56585e..8a750cde 100644 --- a/src/client/component/auth.cpp +++ b/src/client/component/auth.cpp @@ -172,9 +172,12 @@ namespace auth game::foreach_connected_client([&](const game::client_s& client, size_t index) { - network::send(client.address, "playerXuid", buffer.get_buffer()); + if (client.address.type != game::NA_BOT) + { + network::send(client.address, "playerXuid", buffer.get_buffer()); + } - if (index != player_index) + if (index != player_index && target.type != game::NA_BOT) { utils::byte_buffer current_buffer{}; current_buffer.write(static_cast(index)); @@ -185,6 +188,30 @@ namespace auth }); } + void handle_new_player(const game::netadr_t& target) + { + const command::params_sv params{}; + if (params.size() < 2) + { + return; + } + + const utils::info_string info_string(params[1]); + const auto xuid = strtoull(info_string.get("xuid").data(), nullptr, 16); + + size_t player_index = 18; + game::foreach_connected_client([&](game::client_s& client, size_t index) + { + if (client.address == target) + { + client.xuid = xuid; + player_index = index; + } + }); + + distribute_player_xuid(target, player_index, xuid); + } + void dispatch_connect_packet(const game::netadr_t& target, const std::string& data) { utils::byte_buffer buffer(data); @@ -206,18 +233,7 @@ namespace auth profile_infos::add_and_distribute_profile_info(target, xuid, info); game::SV_DirectConnect(target); - - size_t player_index = 18; - game::foreach_connected_client([&](game::client_s& client, size_t index) - { - if (client.address == target) - { - client.xuid = xuid; - player_index = index; - } - }); - - distribute_player_xuid(target, player_index, xuid); + handle_new_player(target); } void handle_connect_packet_fragment(const game::netadr_t& target, const network::data_view& data) @@ -256,6 +272,12 @@ namespace auth client_xuids[player_id] = xuid; } } + + void direct_connect_bots_stub(const game::netadr_t address) + { + game::SV_DirectConnect(address); + handle_new_player(address); + } } uint64_t get_guid() @@ -308,6 +330,9 @@ namespace auth network::on("connect", handle_connect_packet_fragment); network::on("playerXuid", handle_player_xuid_packet); + // Intercept SV_DirectConnect in SV_AddTestClient + utils::hook::call(game::select(0x1422490DC, 0x14052E582), direct_connect_bots_stub); + // Patch steam id bit check std::vector> patches{}; const auto p = [&patches](const size_t a, const size_t b) From 4cab2a73bde904a9079f45ca24c0a0e7d9e41920 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Mon, 17 Apr 2023 21:13:18 +0200 Subject: [PATCH 22/29] Better fix for clearing stored guids --- src/client/component/auth.cpp | 13 ++++++++----- src/client/component/auth.hpp | 1 + src/client/component/party.cpp | 8 ++++++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/client/component/auth.cpp b/src/client/component/auth.cpp index 8a750cde..59228b5d 100644 --- a/src/client/component/auth.cpp +++ b/src/client/component/auth.cpp @@ -135,11 +135,6 @@ namespace auth int send_connect_data_stub(const game::netsrc_t sock, game::netadr_t* adr, const char* data, const int len) { - for (auto& xuid : client_xuids) - { - xuid = 0; - } - try { const auto is_connect_sequence = len >= 7 && strncmp("connect", data, 7) == 0; @@ -321,6 +316,14 @@ namespace auth return xuid; } + void clear_stored_guids() + { + for (auto& xuid : client_xuids) + { + xuid = 0; + } + } + struct component final : generic_component { void post_unpack() override diff --git a/src/client/component/auth.hpp b/src/client/component/auth.hpp index 87c07f5e..30341c98 100644 --- a/src/client/component/auth.hpp +++ b/src/client/component/auth.hpp @@ -4,4 +4,5 @@ namespace auth { uint64_t get_guid(); uint64_t get_guid(size_t client_num); + void clear_stored_guids(); } diff --git a/src/client/component/party.cpp b/src/client/component/party.cpp index 837a97f9..403c0c3a 100644 --- a/src/client/component/party.cpp +++ b/src/client/component/party.cpp @@ -3,6 +3,7 @@ #include "game/game.hpp" #include "party.hpp" +#include "auth.hpp" #include "network.hpp" #include "scheduler.hpp" #include "workshop.hpp" @@ -39,6 +40,8 @@ namespace party void connect_to_lobby(const game::netadr_t& addr, const std::string& mapname, const std::string& gamemode, const std::string& usermap_id, const std::string& mod_id) { + auth::clear_stored_guids(); + workshop::load_mod_if_needed(usermap_id, mod_id); game::XSESSION_INFO info{}; @@ -56,7 +59,8 @@ namespace party } void connect_to_lobby_with_mode(const game::netadr_t& addr, const game::eModes mode, const std::string& mapname, - const std::string& gametype, const std::string& usermap_id, const std::string& mod_id, + const std::string& gametype, const std::string& usermap_id, + const std::string& mod_id, const bool was_retried = false) { if (game::Com_SessionMode_IsMode(mode)) @@ -189,7 +193,7 @@ namespace party const auto usermap_id = workshop::get_usermap_publisher_id(mapname); if (workshop::check_valid_usermap_id(mapname, usermap_id) && - workshop::check_valid_mod_id(mod_id)) + workshop::check_valid_mod_id(mod_id)) { if (is_connecting_to_dedi) { From 7f908163cadc1ef9ab2547c2cdcbff0ef1b7aff3 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Mon, 17 Apr 2023 21:17:58 +0200 Subject: [PATCH 23/29] Small cleanup --- src/client/component/auth.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/component/auth.cpp b/src/client/component/auth.cpp index 59228b5d..1457ee8e 100644 --- a/src/client/component/auth.cpp +++ b/src/client/component/auth.cpp @@ -165,7 +165,7 @@ namespace auth buffer.write(static_cast(player_index)); buffer.write(xuid); - game::foreach_connected_client([&](const game::client_s& client, size_t index) + game::foreach_connected_client([&](const game::client_s& client, const size_t index) { if (client.address.type != game::NA_BOT) { @@ -195,7 +195,7 @@ namespace auth const auto xuid = strtoull(info_string.get("xuid").data(), nullptr, 16); size_t player_index = 18; - game::foreach_connected_client([&](game::client_s& client, size_t index) + game::foreach_connected_client([&](game::client_s& client, const size_t index) { if (client.address == target) { From ddb63bc5d29d97bebb96edf5226a4a66b528c42f Mon Sep 17 00:00:00 2001 From: ineed bots Date: Mon, 17 Apr 2023 19:56:32 -0600 Subject: [PATCH 24/29] Fix negativeAck exploit (crash DOS) --- src/client/component/patches.cpp | 20 ++++++++++++++++++-- src/client/game/structs.hpp | 12 ++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/client/component/patches.cpp b/src/client/component/patches.cpp index 0900b5a8..6a2b59e5 100644 --- a/src/client/component/patches.cpp +++ b/src/client/component/patches.cpp @@ -11,7 +11,20 @@ namespace patches { namespace - { + { + utils::hook::detour sv_executeclientmessages_hook; + + void sv_executeclientmessages_stub(game::client_s* cl, game::msg_t* msg) + { + if (cl->reliableAcknowledge < 0) + { + cl->reliableAcknowledge = cl->reliableSequence; + return; + } + + sv_executeclientmessages_hook.invoke(cl, msg); + } + void script_errors_stub(const char* file, int line, unsigned int code, const char* fmt, ...) { char buffer[0x1000]; @@ -37,7 +50,10 @@ namespace patches // Change 4 character name limit to 3 characters utils::hook::set(game::select(0x14224DA53, 0x140531143), 3); utils::hook::set(game::select(0x14224DBB4, 0x1405312A8), 3); - utils::hook::set(game::select(0x14224DF8C, 0x1405316DC), 3); + utils::hook::set(game::select(0x14224DF8C, 0x1405316DC), 3); + + // make sure client's reliableAck are not negative + sv_executeclientmessages_hook.create(game::select(0x14224A460, 0x14052F840), sv_executeclientmessages_stub); scheduler::once([] { diff --git a/src/client/game/structs.hpp b/src/client/game/structs.hpp index 424c59ac..696a33c5 100644 --- a/src/client/game/structs.hpp +++ b/src/client/game/structs.hpp @@ -1583,15 +1583,23 @@ namespace game int client_state; char __pad0[0x28]; netadr_t address; - char __pad1[0x5588]; + char gap_3C[20468]; + int reliableSequence; + int reliableAcknowledge; + char gap_5038[4]; + int messageAcknowledge; + char gap_5040[1416]; uint64_t xuid; char __pad2[0xB5D84]; int guid; char __pad3[0x8]; bool bIsTestClient; - char __pad4[0x29DAC]; + char gap_BB361[3]; + int serverId; + char gap_BB368[171432]; }; + #ifdef __cplusplus static_assert(sizeof(client_s) == 0xE5110); From b891d25b8729967b9072df5c06a1de6a10259cf5 Mon Sep 17 00:00:00 2001 From: ineed bots Date: Mon, 17 Apr 2023 22:04:57 -0600 Subject: [PATCH 25/29] Fix `cl` warning --- src/client/component/patches.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/client/component/patches.cpp b/src/client/component/patches.cpp index 6a2b59e5..ea4812a9 100644 --- a/src/client/component/patches.cpp +++ b/src/client/component/patches.cpp @@ -14,15 +14,15 @@ namespace patches { utils::hook::detour sv_executeclientmessages_hook; - void sv_executeclientmessages_stub(game::client_s* cl, game::msg_t* msg) + void sv_executeclientmessages_stub(game::client_s* client, game::msg_t* msg) { - if (cl->reliableAcknowledge < 0) + if (client->reliableAcknowledge < 0) { - cl->reliableAcknowledge = cl->reliableSequence; + client->reliableAcknowledge = client->reliableSequence; return; } - sv_executeclientmessages_hook.invoke(cl, msg); + sv_executeclientmessages_hook.invoke(client, msg); } void script_errors_stub(const char* file, int line, unsigned int code, const char* fmt, ...) From f27a1b97e70356cd7001ea47b97675a285fd08f3 Mon Sep 17 00:00:00 2001 From: Diavolo Date: Tue, 18 Apr 2023 10:49:02 +0200 Subject: [PATCH 26/29] network: improve a patch --- src/client/component/network.cpp | 22 +++++- src/client/component/patches.cpp | 112 ++++++++++++++++--------------- src/client/game/structs.hpp | 12 ++-- src/client/game/symbols.hpp | 2 + 4 files changed, 85 insertions(+), 63 deletions(-) diff --git a/src/client/component/network.cpp b/src/client/component/network.cpp index 546d5a1f..04b5c1a6 100644 --- a/src/client/component/network.cpp +++ b/src/client/component/network.cpp @@ -163,7 +163,6 @@ namespace network : 0; } - uint64_t ret2() { return 2; @@ -173,6 +172,15 @@ namespace network { return 0; } + + void com_error_oob_stub(const char* file, int line, int code, [[maybe_unused]] const char* fmt, const char* error) + { + char buffer[1024]{}; + + strncpy_s(buffer, error, _TRUNCATE); + + game::Com_Error_(file, line, code, "%s", buffer); + } } void on(const std::string& command, const callback& callback) @@ -321,10 +329,20 @@ namespace network // NA_IP -> NA_RAWIP in NetAdr_ToString utils::hook::set(game::select(0x142172ED4, 0x140515864), game::NA_RAWIP); + // Kill 'echo' OOB handler + utils::hook::set(game::select(0x14134D0FB, 0x14018EE82), 0xEB); + if (game::is_server()) { // Remove restrictions for rcon commands - utils::hook::call(0x140538D5C_g, &con_restricted_execute_buf_stub); // SVC_RemoteCommand + utils::hook::call(0x140538D5C_g, con_restricted_execute_buf_stub); // SVC_RemoteCommand + + // Kill 'error' OOB handler on the dedi + utils::hook::nop(0x14018EF8B_g, 5); + } + else + { + utils::hook::call(0x14134D206_g, com_error_oob_stub); } // TODO: Fix that diff --git a/src/client/component/patches.cpp b/src/client/component/patches.cpp index ea4812a9..b7a2824f 100644 --- a/src/client/component/patches.cpp +++ b/src/client/component/patches.cpp @@ -1,66 +1,68 @@ -#include -#include "loader/component_loader.hpp" - -#include -#include - -#include "scheduler.hpp" - -#include - -namespace patches -{ - namespace - { - utils::hook::detour sv_executeclientmessages_hook; +#include +#include "loader/component_loader.hpp" - void sv_executeclientmessages_stub(game::client_s* client, game::msg_t* msg) - { +#include +#include + +#include "network.hpp" +#include "scheduler.hpp" + +#include + +namespace patches +{ + namespace + { + utils::hook::detour sv_execute_client_messages_hook; + + void sv_execute_client_messages_stub(game::client_s* client, game::msg_t* msg) + { if (client->reliableAcknowledge < 0) { client->reliableAcknowledge = client->reliableSequence; + network::send(client->address, "error", "EXE_LOSTRELIABLECOMMANDS"); return; } - sv_executeclientmessages_hook.invoke(client, msg); + sv_execute_client_messages_hook.invoke(client, msg); } - - void script_errors_stub(const char* file, int line, unsigned int code, const char* fmt, ...) - { - char buffer[0x1000]; - - { - va_list ap; - va_start(ap, fmt); - vsnprintf_s(buffer, sizeof(buffer), _TRUNCATE, fmt, ap); - va_end(ap); - } - - game::Com_Error(game::ERROR_SCRIPT_DROP, "%s", buffer); - } - } - - struct component final : generic_component - { - void post_unpack() override - { - // don't make script errors fatal error - utils::hook::call(game::select(0x1412CAC4D, 0x140158EB2), script_errors_stub); - - // Change 4 character name limit to 3 characters - utils::hook::set(game::select(0x14224DA53, 0x140531143), 3); - utils::hook::set(game::select(0x14224DBB4, 0x1405312A8), 3); + + void script_errors_stub(const char* file, int line, unsigned int code, const char* fmt, ...) + { + char buffer[0x1000]; + + { + va_list ap; + va_start(ap, fmt); + vsnprintf_s(buffer, sizeof(buffer), _TRUNCATE, fmt, ap); + va_end(ap); + } + + game::Com_Error(game::ERROR_SCRIPT_DROP, "%s", buffer); + } + } + + struct component final : generic_component + { + void post_unpack() override + { + // don't make script errors fatal error + utils::hook::call(game::select(0x1412CAC4D, 0x140158EB2), script_errors_stub); + + // Change 4 character name limit to 3 characters + utils::hook::set(game::select(0x14224DA53, 0x140531143), 3); + utils::hook::set(game::select(0x14224DBB4, 0x1405312A8), 3); utils::hook::set(game::select(0x14224DF8C, 0x1405316DC), 3); // make sure client's reliableAck are not negative - sv_executeclientmessages_hook.create(game::select(0x14224A460, 0x14052F840), sv_executeclientmessages_stub); - - scheduler::once([] - { - game::register_dvar_string("password", "", game::DVAR_USERINFO, "password"); - }, scheduler::pipeline::main); - } - }; -} - -REGISTER_COMPONENT(patches::component) + sv_execute_client_messages_hook.create(game::select(0x14224A460, 0x14052F840), sv_execute_client_messages_stub); + + scheduler::once([] + { + game::register_dvar_string("password", "", game::DVAR_USERINFO, "password"); + }, scheduler::pipeline::main); + } + }; +} + +REGISTER_COMPONENT(patches::component) diff --git a/src/client/game/structs.hpp b/src/client/game/structs.hpp index 696a33c5..9876f2c4 100644 --- a/src/client/game/structs.hpp +++ b/src/client/game/structs.hpp @@ -1583,20 +1583,20 @@ namespace game int client_state; char __pad0[0x28]; netadr_t address; - char gap_3C[20468]; + char __pad1[20468]; int reliableSequence; int reliableAcknowledge; - char gap_5038[4]; + char __pad2[4]; int messageAcknowledge; char gap_5040[1416]; uint64_t xuid; - char __pad2[0xB5D84]; + char __pad3[0xB5D84]; int guid; - char __pad3[0x8]; + char __pad4[0x8]; bool bIsTestClient; - char gap_BB361[3]; + char __pad5[3]; int serverId; - char gap_BB368[171432]; + char __pad6[171432]; }; diff --git a/src/client/game/symbols.hpp b/src/client/game/symbols.hpp index 36a82681..fbb93ad9 100644 --- a/src/client/game/symbols.hpp +++ b/src/client/game/symbols.hpp @@ -78,6 +78,8 @@ namespace game // G WEAK symbol G_ClearVehicleInputs{0x1423812E0, 0x1405C1200}; + WEAK symbol StuckInClient{0x1415A8360, 0x14023BFE0}; + // Live WEAK symbol Live_GetConnectivityInformation{0x141E0C380}; From 93bb54c6a40a0e93c9e52e66dd35d84b131bfdc6 Mon Sep 17 00:00:00 2001 From: Diavolo Date: Tue, 18 Apr 2023 12:17:41 +0200 Subject: [PATCH 27/29] network: add comment --- src/client/component/network.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client/component/network.cpp b/src/client/component/network.cpp index 04b5c1a6..4371a17a 100644 --- a/src/client/component/network.cpp +++ b/src/client/component/network.cpp @@ -342,6 +342,7 @@ namespace network } else { + // Truncate error string to make sure there are no buffer overruns later utils::hook::call(0x14134D206_g, com_error_oob_stub); } From 420b89451293369e3c15394ad118062224a6bbcf Mon Sep 17 00:00:00 2001 From: WantedDV <122710241+WantedDV@users.noreply.github.com> Date: Tue, 18 Apr 2023 08:12:59 -0230 Subject: [PATCH 28/29] You had one job auto-formatter --- src/client/component/loot.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/component/loot.cpp b/src/client/component/loot.cpp index 329439d4..39a54490 100644 --- a/src/client/component/loot.cpp +++ b/src/client/component/loot.cpp @@ -58,7 +58,7 @@ namespace loot } // Item id for extra CaC slots - if (dvar_cg_unlockall_cac_slots->current.value.enabled && (item_id == 99003)) + if (dvar_cg_unlockall_cac_slots->current.value.enabled && item_id == 99003) { return 1; } @@ -211,7 +211,7 @@ namespace loot { game::Dvar_SetFromStringByName("ui_enableAllHeroes", "1", true); } - }, scheduler::pipeline::dvars_loaded); + }, scheduler::pipeline::dvars_loaded); } }; }; From ecf5d601c73f2d70987ba4b34fbda3070bdff1a6 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Tue, 18 Apr 2023 18:43:57 +0200 Subject: [PATCH 29/29] Add -norelaunch flag --- src/client/updater/file_updater.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/client/updater/file_updater.cpp b/src/client/updater/file_updater.cpp index bee3cf86..f68b6d2d 100644 --- a/src/client/updater/file_updater.cpp +++ b/src/client/updater/file_updater.cpp @@ -200,7 +200,11 @@ namespace updater throw; } - utils::nt::relaunch_self(); + if (!utils::flags::has_flag("norelaunch")) + { + utils::nt::relaunch_self(); + } + throw update_cancelled(); }