From d2cb3afab5a0c37c991581163d6ae3e9ab12605f Mon Sep 17 00:00:00 2001 From: TotallyNotElite <1yourexperiment@protonmail.com> Date: Mon, 19 Oct 2020 13:43:13 +0200 Subject: [PATCH] Fix: Autoitem: Use maps instead of looping thru achivement items Remove achievement ident too --- include/MiscTemporary.hpp | 3 +- src/hacks/AutoItem.cpp | 114 ++++++++++++++++++++------------------ src/hooks/CreateMove.cpp | 4 +- src/hooks/SendNetMsg.cpp | 64 +++------------------ 4 files changed, 70 insertions(+), 115 deletions(-) diff --git a/include/MiscTemporary.hpp b/include/MiscTemporary.hpp index a27497ad..a0c05535 100755 --- a/include/MiscTemporary.hpp +++ b/include/MiscTemporary.hpp @@ -50,7 +50,6 @@ extern DetourHook cl_warp_sendmovedetour; extern DetourHook cl_nospread_sendmovedetour; namespace hooked_methods { -void sendAchievementKv(int value); -void sendIdentifyMessage(bool reply, bool achievement_based); +void sendIdentifyMessage(bool reply); extern settings::Boolean identify; } // namespace hooked_methods diff --git a/src/hacks/AutoItem.cpp b/src/hacks/AutoItem.cpp index a8e2a7b5..b7c36d3b 100644 --- a/src/hacks/AutoItem.cpp +++ b/src/hacks/AutoItem.cpp @@ -55,7 +55,15 @@ static settings::Boolean autoNoisemaker{ "misc.auto-noisemaker", "false" }; // 673 is Christmas noisemaker static int noisemaker_id = 536; -std::vector> ach_items; +struct AchivementItem +{ + int achievement_id; + std::string name; +}; + +// A map that allows us to map item ids to achievement names and achievement ids +std::unordered_map ach_items; + std::vector> craft_groups; bool checkAchMgr() @@ -103,23 +111,19 @@ void unlockSingle(int achID) } } -std::pair isAchItem(int id) +AchivementItem *isAchItem(int id) { - for (auto &i : ach_items) - { - if (std::get<0>(i) == id) - return std::make_pair(std::get<1>(i), std::get<2>(i)); - } - return std::make_pair(0, ""); + auto val = ach_items.find(id); + return val != ach_items.end() ? &val->second : nullptr; } void getItem(int id, bool rent = true) { Debug("Trying to get item, %i", id); auto index = isAchItem(id); - if (index.first != 0) + if (index) { - unlockSingle(index.first); + unlockSingle(index->achievement_id); g_IEngine->ClientCmd_Unrestricted("cl_trigger_first_notification"); } else if (rent) @@ -303,11 +307,11 @@ void getAndEquipWeapon(std::string str, int clazz, int slot) else { auto index = isAchItem(id); - if (index.first != 0) + if (index) { if (!checkAchMgr()) return; - if (g_IAchievementMgr->HasAchieved(index.second.c_str())) + if (g_IAchievementMgr->HasAchieved(index->name.c_str())) { Debug("Cant get specified ach item %i because it has already been unlocked! moving to next item.", id); // User's fault if they put a ach item they unlocked and have used for crafting already/deleted. @@ -476,48 +480,48 @@ static InitRoutine init([]() { if ((month == 12 && day >= 12) || (month == 1 && day <= 12)) noisemaker_id = 673; - /* haha emplace_back go brrrrrr */ - ach_items.emplace_back(45, 1036, "TF_SCOUT_ACHIEVE_PROGRESS1"); // Force-A-Nature - Scout Milestone 1 - ach_items.emplace_back(44, 1037, "TF_SCOUT_ACHIEVE_PROGRESS2"); // Sandman - Scout Milestone 2 - ach_items.emplace_back(46, 1038, "TF_SCOUT_ACHIEVE_PROGRESS3"); // Bonk! Atomic Punch - Scout Milestone 3 - ach_items.emplace_back(128, 1236, "TF_SOLDIER_ACHIEVE_PROGRESS1"); // Equalizer - Soldier Milestone 1 - ach_items.emplace_back(127, 1237, "TF_SOLDIER_ACHIEVE_PROGRESS2"); // Direct Hit - Soldier Milestone 2 - ach_items.emplace_back(129, 1238, "TF_SOLDIER_ACHIEVE_PROGRESS3"); // Buff Banner - Soldier Milestone 3 - ach_items.emplace_back(39, 1637, "TF_PYRO_ACHIEVE_PROGRESS1"); // Flare Gun - Pyro Milestone 1 - ach_items.emplace_back(40, 1638, "TF_PYRO_ACHIEVE_PROGRESS2"); // Backburner - Pyro Milestone 2 - ach_items.emplace_back(38, 1639, "TF_PYRO_ACHIEVE_PROGRESS3"); // Axtinguisher - Pyro Milestone 3 - ach_items.emplace_back(131, 1336, "TF_DEMOMAN_ACHIEVE_PROGRESS1"); // Chargin' Targe - Demoman Milestone 1 - ach_items.emplace_back(132, 1337, "TF_DEMOMAN_ACHIEVE_PROGRESS2"); // Eyelander - Demoman Milestone 2 - ach_items.emplace_back(130, 1338, "TF_DEMOMAN_ACHIEVE_PROGRESS3"); // Scottish Resistance - Demoman Milestone 3 - ach_items.emplace_back(42, 1537, "TF_HEAVY_ACHIEVE_PROGRESS1"); // Sandvich - Heavy Milestone 1 - ach_items.emplace_back(41, 1538, "TF_HEAVY_ACHIEVE_PROGRESS2"); // Natascha - Heavy Milestone 2 - ach_items.emplace_back(43, 1539, "TF_HEAVY_ACHIEVE_PROGRESS3"); // Killing Gloves of Boxing - Heavy Milestone 3 - ach_items.emplace_back(141, 1801, "TF_ENGINEER_ACHIEVE_PROGRESS1"); // Frontier Justice - Engineer Milestone 1 - ach_items.emplace_back(142, 1802, "TF_ENGINEER_ACHIEVE_PROGRESS2"); // Gunslinger - Engineer Milestone 2 - ach_items.emplace_back(140, 1803, "TF_ENGINEER_ACHIEVE_PROGRESS3"); // Wrangler - Engineer Milestone 3 - ach_items.emplace_back(36, 1437, "TF_MEDIC_ACHIEVE_PROGRESS1"); // Blutsauger - Medic Milestone 1 - ach_items.emplace_back(35, 1438, "TF_MEDIC_ACHIEVE_PROGRESS2"); // Kritzkrieg - Medic Milestone 2 - ach_items.emplace_back(37, 1439, "TF_MEDIC_ACHIEVE_PROGRESS3"); // Ubersaw - Medic Milestone 3 - ach_items.emplace_back(56, 1136, "TF_SNIPER_ACHIEVE_PROGRESS1"); // Huntsman - Sniper Milestone 1 - ach_items.emplace_back(58, 1137, "TF_SNIPER_ACHIEVE_PROGRESS2"); // Jarate - Sniper Milestone 2 - ach_items.emplace_back(57, 1138, "TF_SNIPER_ACHIEVE_PROGRESS3"); // Razorback - Sniper Milestone 3 - ach_items.emplace_back(61, 1735, "TF_SPY_ACHIEVE_PROGRESS1"); // Ambassador - Spy Milestone 1 - ach_items.emplace_back(60, 1736, "TF_SPY_ACHIEVE_PROGRESS2"); // Cloak and Dagger - Spy Milestone 2 - ach_items.emplace_back(59, 1737, "TF_SPY_ACHIEVE_PROGRESS3"); // Dead Ringer - Spy Milestone 3 - ach_items.emplace_back(1123, 1928, "TF_HALLOWEEN_DOOMSDAY_MILESTONE"); // Necro Smasher - Carnival of Carnage: Step Right Up - ach_items.emplace_back(940, 1902, "TF_HALLOWEEN_DOMINATE_FOR_HAT"); // Ghostly Gibus - Ghastly Gibus Grab - ach_items.emplace_back(115, 1901, "TF_HALLOWEEN_COLLECT_PUMPKINS"); // Mildly Disturbing Halloween Mask - Candy Coroner - ach_items.emplace_back(278, 1906, "TF_HALLOWEEN_BOSS_KILL"); // Horseless Headless Horsemann's Head - Sleepy Holl0WND - ach_items.emplace_back(302, 2006, "TF_REPLAY_YOUTUBE_VIEWS_TIER2"); // Frontline Field Recorder - Local Cinema Star - ach_items.emplace_back(581, 1910, "TF_HALLOWEEN_EYEBOSS_KILL"); // MONOCULUS! - Optical Defusion - ach_items.emplace_back(668, 2212, "TF_MAPS_FOUNDRY_ACHIEVE_PROGRESS1"); // Full Head Of Steam - Foundry Milestone - ach_items.emplace_back(756, 2412, "TF_MAPS_DOOMSDAY_ACHIEVE_PROGRESS1"); // Gentle Munitionne of Leisure - Doomsday Milestone - ach_items.emplace_back(941, 1912, "TF_HALLOWEEN_MERASMUS_COLLECT_LOOT"); // Skull Island Topper - A Lovely Vacation Spot - ach_items.emplace_back(581, 1911, "TF_HALLOWEEN_LOOT_ISLAND"); // Bombinomicon - Dive Into a Good Book - ach_items.emplace_back(744, 156, "TF_DOMINATE_FOR_GOGGLES"); // Pyrovision Goggles - A Fresh Pair of Eyes - ach_items.emplace_back(1164, 167, "TF_PASS_TIME_GRIND"); // Civilian Grade JACK Hat - Jackpot! - ach_items.emplace_back(1169, 166, "TF_PASS_TIME_HAT"); // Military Grade JACK Hat - Tune Merasmus's Multi-Dimensional Television - ach_items.emplace_back(1170, 166, "TF_PASS_TIME_HAT"); // PASS Time Miniature Half JACK - Tune Merasmus's Multi-Dimensional Television - ach_items.emplace_back(267, 1909, "TF_HALLOWEEN_BOSS_KILL_MELEE"); // Haunted Metal Scrap - Gored! + /* haha operator[] go brrrrrr */ + ach_items[45] = { 1036, "TF_SCOUT_ACHIEVE_PROGRESS1" }; // Force-A-Nature - Scout Milestone 1 + ach_items[44] = { 1037, "TF_SCOUT_ACHIEVE_PROGRESS2" }; // Sandman - Scout Milestone 2 + ach_items[46] = { 1038, "TF_SCOUT_ACHIEVE_PROGRESS3" }; // Bonk! Atomic Punch - Scout Milestone 3 + ach_items[128] = { 1236, "TF_SOLDIER_ACHIEVE_PROGRESS1" }; // Equalizer - Soldier Milestone 1 + ach_items[127] = { 1237, "TF_SOLDIER_ACHIEVE_PROGRESS2" }; // Direct Hit - Soldier Milestone 2 + ach_items[129] = { 1238, "TF_SOLDIER_ACHIEVE_PROGRESS3" }; // Buff Banner - Soldier Milestone 3 + ach_items[39] = { 1637, "TF_PYRO_ACHIEVE_PROGRESS1" }; // Flare Gun - Pyro Milestone 1 + ach_items[40] = { 1638, "TF_PYRO_ACHIEVE_PROGRESS2" }; // Backburner - Pyro Milestone 2 + ach_items[38] = { 1639, "TF_PYRO_ACHIEVE_PROGRESS3" }; // Axtinguisher - Pyro Milestone 3 + ach_items[131] = { 1336, "TF_DEMOMAN_ACHIEVE_PROGRESS1" }; // Chargin' Targe - Demoman Milestone 1 + ach_items[132] = { 1337, "TF_DEMOMAN_ACHIEVE_PROGRESS2" }; // Eyelander - Demoman Milestone 2 + ach_items[130] = { 1338, "TF_DEMOMAN_ACHIEVE_PROGRESS3" }; // Scottish Resistance - Demoman Milestone 3 + ach_items[42] = { 1537, "TF_HEAVY_ACHIEVE_PROGRESS1" }; // Sandvich - Heavy Milestone 1 + ach_items[41] = { 1538, "TF_HEAVY_ACHIEVE_PROGRESS2" }; // Natascha - Heavy Milestone 2 + ach_items[43] = { 1539, "TF_HEAVY_ACHIEVE_PROGRESS3" }; // Killing Gloves of Boxing - Heavy Milestone 3 + ach_items[141] = { 1801, "TF_ENGINEER_ACHIEVE_PROGRESS1" }; // Frontier Justice - Engineer Milestone 1 + ach_items[142] = { 1802, "TF_ENGINEER_ACHIEVE_PROGRESS2" }; // Gunslinger - Engineer Milestone 2 + ach_items[140] = { 1803, "TF_ENGINEER_ACHIEVE_PROGRESS3" }; // Wrangler - Engineer Milestone 3 + ach_items[36] = { 1437, "TF_MEDIC_ACHIEVE_PROGRESS1" }; // Blutsauger - Medic Milestone 1 + ach_items[35] = { 1438, "TF_MEDIC_ACHIEVE_PROGRESS2" }; // Kritzkrieg - Medic Milestone 2 + ach_items[37] = { 1439, "TF_MEDIC_ACHIEVE_PROGRESS3" }; // Ubersaw - Medic Milestone 3 + ach_items[56] = { 1136, "TF_SNIPER_ACHIEVE_PROGRESS1" }; // Huntsman - Sniper Milestone 1 + ach_items[58] = { 1137, "TF_SNIPER_ACHIEVE_PROGRESS2" }; // Jarate - Sniper Milestone 2 + ach_items[57] = { 1138, "TF_SNIPER_ACHIEVE_PROGRESS3" }; // Razorback - Sniper Milestone 3 + ach_items[61] = { 1735, "TF_SPY_ACHIEVE_PROGRESS1" }; // Ambassador - Spy Milestone 1 + ach_items[60] = { 1736, "TF_SPY_ACHIEVE_PROGRESS2" }; // Cloak and Dagger - Spy Milestone 2 + ach_items[59] = { 1737, "TF_SPY_ACHIEVE_PROGRESS3" }; // Dead Ringer - Spy Milestone 3 + ach_items[1123] = { 1928, "TF_HALLOWEEN_DOOMSDAY_MILESTONE" }; // Necro Smasher - Carnival of Carnage: Step Right Up + ach_items[940] = { 1902, "TF_HALLOWEEN_DOMINATE_FOR_HAT" }; // Ghostly Gibus - Ghastly Gibus Grab + ach_items[115] = { 1901, "TF_HALLOWEEN_COLLECT_PUMPKINS" }; // Mildly Disturbing Halloween Mask - Candy Coroner + ach_items[278] = { 1906, "TF_HALLOWEEN_BOSS_KILL" }; // Horseless Headless Horsemann's Head - Sleepy Holl0WND + ach_items[302] = { 2006, "TF_REPLAY_YOUTUBE_VIEWS_TIER2" }; // Frontline Field Recorder - Local Cinema Star + ach_items[581] = { 1910, "TF_HALLOWEEN_EYEBOSS_KILL" }; // MONOCULUS! - Optical Defusion + ach_items[668] = { 2212, "TF_MAPS_FOUNDRY_ACHIEVE_PROGRESS1" }; // Full Head Of Steam - Foundry Milestone + ach_items[756] = { 2412, "TF_MAPS_DOOMSDAY_ACHIEVE_PROGRESS1" }; // Gentle Munitionne of Leisure - Doomsday Milestone + ach_items[941] = { 1912, "TF_HALLOWEEN_MERASMUS_COLLECT_LOOT" }; // Skull Island Topper - A Lovely Vacation Spot + ach_items[581] = { 1911, "TF_HALLOWEEN_LOOT_ISLAND" }; // Bombinomicon - Dive Into a Good Book + ach_items[744] = { 156, "TF_DOMINATE_FOR_GOGGLES" }; // Pyrovision Goggles - A Fresh Pair of Eyes + ach_items[1164] = { 167, "TF_PASS_TIME_GRIND" }; // Civilian Grade JACK Hat - Jackpot! + ach_items[1169] = { 166, "TF_PASS_TIME_HAT" }; // Military Grade JACK Hat - Tune Merasmus's Multi-Dimensional Television + ach_items[1170] = { 166, "TF_PASS_TIME_HAT" }; // PASS Time Miniature Half JACK - Tune Merasmus's Multi-Dimensional Television + ach_items[267] = { 1909, "TF_HALLOWEEN_BOSS_KILL_MELEE" }; // Haunted Metal Scrap - Gored! }); } // namespace hacks::tf2::autoitem diff --git a/src/hooks/CreateMove.cpp b/src/hooks/CreateMove.cpp index 56f49f25..9ae1a9bf 100644 --- a/src/hooks/CreateMove.cpp +++ b/src/hooks/CreateMove.cpp @@ -243,9 +243,7 @@ DEFINE_HOOKED_METHOD(CreateMove, bool, void *this_, float input_sample_time, CUs hacks::tf2::NavBot::init(true); if (identify) { - sendIdentifyMessage(false, false); - // Remove this in a month or two - sendIdentifyMessage(false, true); + sendIdentifyMessage(false); } EC::run(EC::FirstCM); firstcm = false; diff --git a/src/hooks/SendNetMsg.cpp b/src/hooks/SendNetMsg.cpp index 0e0680b6..fb200697 100644 --- a/src/hooks/SendNetMsg.cpp +++ b/src/hooks/SendNetMsg.cpp @@ -27,18 +27,9 @@ void SendNetMsg(INetMessage &msg); namespace hooked_methods { -static bool send_achievement_reply{}; static bool send_drawline_reply{}; -static Timer send_achievement_reply_timer{}; static Timer reply_timer{}; -void sendAchievementKv(int value) -{ - KeyValues *kv = new KeyValues("AchievementEarned"); - kv->SetInt("achievementID", value); - g_IEngine->ServerCmdKeyValues(kv); -} - void sendDrawlineKv(float x_value, float y_value) { KeyValues *kv = new KeyValues("cl_drawline"); @@ -49,13 +40,9 @@ void sendDrawlineKv(float x_value, float y_value) g_IEngine->ServerCmdKeyValues(kv); } -void sendIdentifyMessage(bool reply, bool achievement_based) +void sendIdentifyMessage(bool reply) { - // Old method - if (achievement_based) - reply ? sendAchievementKv(CAT_REPLY) : sendAchievementKv(CAT_IDENTIFY); - else - reply ? sendDrawlineKv(CAT_REPLY, AUTH_MESSAGE) : sendDrawlineKv(CAT_IDENTIFY, AUTH_MESSAGE); + reply ? sendDrawlineKv(CAT_REPLY, AUTH_MESSAGE) : sendDrawlineKv(CAT_IDENTIFY, AUTH_MESSAGE); } static CatCommand debug_drawpanel("debug_drawline", "debug", []() { @@ -113,27 +100,6 @@ std::vector Iterate(KeyValues *event, int depth) return peer_list; } -void ProcessAchievement(IGameEvent *ach) -{ - int player_idx = ach->GetInt("player", 0xDEAD); - int achievement = ach->GetInt("achievement", 0xDEAD); - if (player_idx != 0xDEAD && (achievement == CAT_IDENTIFY || achievement == CAT_REPLY)) - { - // Always reply and set on CA7 and only set on CA8 - bool reply = achievement == CAT_IDENTIFY; - player_info_s info; - if (!g_IEngine->GetPlayerInfo(player_idx, &info)) - return; - if (reply && *answerIdentify && player_idx != g_pLocalPlayer->entity_idx) - { - send_achievement_reply_timer.update(); - send_achievement_reply = true; - } - if (playerlist::ChangeState(info.friendsID, playerlist::k_EState::CAT)) - PrintChat("\x07%06X%s\x01 Marked as CAT (Cathook user)", 0xe05938, info.name); - } -} - void ParseKeyValue(KeyValues *event) { std::string event_name = event->GetName(); @@ -202,46 +168,34 @@ void ParseKeyValue(KeyValues *event) } } -class AchievementListener : public IGameEventListener2 +class IdentifyListener : public IGameEventListener2 { virtual void FireGameEvent(IGameEvent *event) { if (*identify) - { - if (!strcmp(event->GetName(), "cl_drawline")) - ProcessSendline(event); - else - ProcessAchievement(event); - } + ProcessSendline(event); } -}; +}; // namespace hooked_methods -static CatCommand send_identify("debug_send_identify", "debug", []() { sendIdentifyMessage(false, true); }); +static CatCommand send_identify("debug_send_identify", "debug", []() { sendIdentifyMessage(false); }); -static AchievementListener event_listener{}; +static IdentifyListener event_listener{}; static InitRoutine run_identify([]() { EC::Register( EC::CreateMove, []() { - // Legacy support - if (send_achievement_reply && send_achievement_reply_timer.check(10000)) - { - sendIdentifyMessage(true, true); - send_achievement_reply = false; - } if (send_drawline_reply && reply_timer.test_and_set(1000)) { - sendIdentifyMessage(true, false); + sendIdentifyMessage(true); send_drawline_reply = false; } // It is safe to send every 15ish seconds, small packet if (!*identify || CE_BAD(LOCAL_E) || !identify_timer.test_and_set(15000)) return; - sendIdentifyMessage(false, false); + sendIdentifyMessage(false); }, "sendnetmsg_createmove"); - g_IEventManager2->AddListener(&event_listener, "achievement_earned", false); g_IEventManager2->AddListener(&event_listener, "cl_drawline", false); EC::Register( EC::Shutdown, []() { g_IEventManager2->RemoveListener(&event_listener); }, "shutdown_event");