From a568e253ebd9e44bb127c699b19c3e133a9ccfae Mon Sep 17 00:00:00 2001 From: momo5502 Date: Mon, 4 Jan 2016 15:43:09 +0100 Subject: [PATCH] Unlockstats command --- src/Components/Modules/QuickPatch.cpp | 40 +++++++++++++++++++++++++++ src/Components/Modules/QuickPatch.hpp | 2 ++ src/Game/Functions.cpp | 10 +++++++ src/Game/Functions.hpp | 1 + src/Game/Structs.hpp | 15 ++++++++++ 5 files changed, 68 insertions(+) diff --git a/src/Components/Modules/QuickPatch.cpp b/src/Components/Modules/QuickPatch.cpp index 4423d08f..392ba9e3 100644 --- a/src/Components/Modules/QuickPatch.cpp +++ b/src/Components/Modules/QuickPatch.cpp @@ -9,6 +9,41 @@ namespace Components return &id; } + void QuickPatch::UnlockStats() + { + Command::Execute("setPlayerData prestige 10"); + Command::Execute("setPlayerData experience 2516000"); + Command::Execute("setPlayerData iconUnlocked cardicon_prestige10_02 1"); + + // Unlock challenges + Game::StringTable* challengeTable = Game::DB_FindXAssetHeader(Game::XAssetType::ASSET_TYPE_STRINGTABLE, "mp/allchallengestable.csv").stringTable; + + if (challengeTable) + { + for (int i = 0; i < challengeTable->rowCount; i++) + { + // Find challenge + const char* challenge = Game::TabeLookup(challengeTable, i, 0); + + int maxState = 0; + int maxProgress = 0; + + // Find correct tier and progress + for (int j = 0; j < 10; j++) + { + int progress = atoi(Game::TabeLookup(challengeTable, i, 6 + j * 2)); + if (!progress )break; + + maxState = j + 2; + maxProgress = progress; + } + + Command::Execute(Utils::VA("setPlayerData challengeState %s %d", challenge, maxState)); + Command::Execute(Utils::VA("setPlayerData challengeProgress %s %d", challenge, maxProgress)); + } + } + } + QuickPatch::QuickPatch() { // protocol version (workaround for hacks) @@ -112,5 +147,10 @@ namespace Components Utils::Hook::Nop(0x6830B1, 20); Utils::Hook(0x682EBF, QuickPatch::GetStatsID, HOOK_CALL).Install()->Quick(); Utils::Hook(0x6830B1, QuickPatch::GetStatsID, HOOK_CALL).Install()->Quick(); + + Command::Add("unlockstats", [] (Command::Params params) + { + QuickPatch::UnlockStats(); + }); } } diff --git a/src/Components/Modules/QuickPatch.hpp b/src/Components/Modules/QuickPatch.hpp index 7054ce0b..98e44cad 100644 --- a/src/Components/Modules/QuickPatch.hpp +++ b/src/Components/Modules/QuickPatch.hpp @@ -6,6 +6,8 @@ namespace Components QuickPatch(); const char* GetName() { return "QuickPatch"; }; + static void UnlockStats(); + private: static _int64* GetStatsID(); }; diff --git a/src/Game/Functions.cpp b/src/Game/Functions.cpp index 4455cc58..c6af0a72 100644 --- a/src/Game/Functions.cpp +++ b/src/Game/Functions.cpp @@ -151,6 +151,16 @@ namespace Game } } + const char* TabeLookup(StringTable* stringtable, int row, int column) + { + if (!stringtable || !stringtable->values || row >= stringtable->rowCount || column >= stringtable->columnCount) return ""; + + const char* value = stringtable->values[row * stringtable->columnCount + column].string; + if (!value) value = ""; + + return value; + } + void OOBPrintT(int type, netadr_t netadr, const char* message) { int* adr = (int*)&netadr; diff --git a/src/Game/Functions.hpp b/src/Game/Functions.hpp index 701fb32a..ec8eb737 100644 --- a/src/Game/Functions.hpp +++ b/src/Game/Functions.hpp @@ -257,6 +257,7 @@ namespace Game void Menu_FreeItemMemory(Game::itemDef_t* item); void OOBPrintT(int type, netadr_t netadr, const char* message); void OOBPrintRaw(int type, netadr_t netadr, const char* message, size_t length); + const char* TabeLookup(StringTable* stringtable, int row, int column); const char* UI_LocalizeMapName(const char* mapName); const char* UI_LocalizeGameType(const char* gameType); } diff --git a/src/Game/Structs.hpp b/src/Game/Structs.hpp index 1affdd2f..469b56e3 100644 --- a/src/Game/Structs.hpp +++ b/src/Game/Structs.hpp @@ -878,6 +878,20 @@ namespace Game const char* entitystring; }; + struct StringTableCell + { + const char *string; + int hash; + }; + + struct StringTable + { + const char *name; + int columnCount; + int rowCount; + StringTableCell *values; + }; + union XAssetHeader { void *data; @@ -886,6 +900,7 @@ namespace Game Material *material; snd_alias_list_t *aliasList; localizedEntry_s *localize; + StringTable *stringTable; MapEnts* mapEnts; };