diff --git a/include/votelogger.hpp b/include/votelogger.hpp index bf21d1cc..9f2d3587 100755 --- a/include/votelogger.hpp +++ b/include/votelogger.hpp @@ -13,4 +13,5 @@ namespace votelogger { void dispatchUserMessage(bf_read &buffer, int type); -} +void onShutdown(std::string message); +} // namespace votelogger diff --git a/src/hacks/Misc.cpp b/src/hacks/Misc.cpp index 5db5d9b2..57637b57 100644 --- a/src/hacks/Misc.cpp +++ b/src/hacks/Misc.cpp @@ -80,15 +80,18 @@ static void updateAntiAfk() } else { - if (anti_afk_timer.check(60000)) + static auto afk_timer = g_ICvar->FindVar("mp_idlemaxtime"); + if (!afk_timer) + afk_timer = g_ICvar->FindVar("mp_idlemaxtime"); + // Trigger 10 seconds before kick + else if (afk_timer->m_nValue != 0 && anti_afk_timer.check(afk_timer->m_nValue*60*1000-10000)) { - // Send random commands - current_user_cmd->sidemove = RandFloatRange(-450.0, 450.0); - current_user_cmd->forwardmove = RandFloatRange(-450.0, 450.0); - current_user_cmd->buttons = rand(); - // Prevent attack command - current_user_cmd->buttons &= ~(IN_ATTACK | IN_ATTACK2); - if (anti_afk_timer.check(61000)) + // Just duck tf + if (current_user_cmd->buttons & IN_DUCK) + current_user_cmd->buttons &= ~IN_DUCK; + else + current_user_cmd->buttons = IN_DUCK; + if (anti_afk_timer.check(afk_timer->m_nValue*60*1000+1000)) { anti_afk_timer.update(); } diff --git a/src/hooks/Shutdown.cpp b/src/hooks/Shutdown.cpp index 2d7b1b59..400f670e 100644 --- a/src/hooks/Shutdown.cpp +++ b/src/hooks/Shutdown.cpp @@ -44,6 +44,8 @@ DEFINE_HOOKED_METHOD(Shutdown, void, INetChannel *this_, const char *reason) if (autoabandon) tfmm::disconnectAndAbandon(); hacks::shared::autojoin::onShutdown(); + std::string message = reason; + votelogger::onShutdown(message); if (*random_name) { static TextFile file; diff --git a/src/votelogger.cpp b/src/votelogger.cpp index a94af1c1..fde7a509 100644 --- a/src/votelogger.cpp +++ b/src/votelogger.cpp @@ -13,11 +13,13 @@ static settings::Bool vote_kicky{ "votelogger.autovote.yes", "false" }; static settings::Bool vote_kickn{ "votelogger.autovote.no", "false" }; static settings::Bool vote_rage_vote{ "votelogger.autovote.no.rage", "false" }; static settings::Bool party_say{ "votelogger.partysay", "true" }; +static settings::Bool abandon_and_crash_on_kick{ "votelogger.restart-on-kick", "false" }; namespace votelogger { static bool was_local_player{ false }; +static Timer local_kick_timer{}; static void vote_rage_back() { @@ -79,7 +81,10 @@ void dispatchUserMessage(bf_read &buffer, int type) logging::Info("Vote called to kick %s [U:1:%u] for %s by %s [U:1:%u]", info.name, info.friendsID, reason, info2.name, info2.friendsID); if (eid == LOCAL_E->m_IDX) + { was_local_player = true; + local_kick_timer.update(); + } if (*vote_kickn || *vote_kicky) { @@ -108,10 +113,12 @@ void dispatchUserMessage(bf_read &buffer, int type) break; } case 47: + { logging::Info("Vote passed"); // if (was_local_player && requeue) // tfmm::startQueue(); break; + } case 48: logging::Info("Vote failed"); break; @@ -122,6 +129,43 @@ void dispatchUserMessage(bf_read &buffer, int type) break; } } +static bool found_message = false; +void onShutdown(std::string message) +{ + if (message.find("Generic_Kicked") == message.npos) + { + found_message = false; + return; + } + if (local_kick_timer.check(60000) || !was_local_player) + { + found_message = false; + return; + } + if (abandon_and_crash_on_kick) + { + found_message = true; + g_IEngine->ClientCmd_Unrestricted("tf_party_leave"); + local_kick_timer.update(); + } + else + found_message = false; +} + +static void setup_paint_abandon() +{ + EC::Register( + EC::Paint, + []() { + if (!found_message) + return; + if (local_kick_timer.check(60000) || !local_kick_timer.test_and_set(10000) || !was_local_player) + return; + if (abandon_and_crash_on_kick) + *(int *) 0 = 0; + }, + "vote_abandon_restart"); +} static void setup_vote_rage() { @@ -136,6 +180,7 @@ static void reset_vote_rage() static InitRoutine init([]() { if (*vote_rage_vote) setup_vote_rage(); + setup_paint_abandon(); vote_rage_vote.installChangeCallback([](settings::VariableBase &var, bool new_val) { if (new_val)