From 51bc0d439ff4d89c286cc05a59766b567f2fbad6 Mon Sep 17 00:00:00 2001 From: maybegreat48 <96936658+maybegreat48@users.noreply.github.com> Date: Mon, 24 Mar 2025 20:38:14 -0400 Subject: [PATCH] feat(toxic): add ceo kick --- src/core/commands/HotkeySystem.cpp | 54 ++++++++++++--------- src/game/features/players/toxic/CeoKick.cpp | 25 ++++++++++ src/game/frontend/submenus/Network.cpp | 1 + src/game/frontend/submenus/Player/Toxic.cpp | 14 ++++-- src/game/gta/Vehicle.cpp | 1 - src/game/gta/data/VehicleValues.hpp | 2 +- src/types/script/ScriptEvent.hpp | 9 +++- 7 files changed, 74 insertions(+), 32 deletions(-) create mode 100644 src/game/features/players/toxic/CeoKick.cpp diff --git a/src/core/commands/HotkeySystem.cpp b/src/core/commands/HotkeySystem.cpp index 40a9277..099b32f 100644 --- a/src/core/commands/HotkeySystem.cpp +++ b/src/core/commands/HotkeySystem.cpp @@ -7,6 +7,9 @@ // TODO: serialization isn't stable +#include "game/pointers/Pointers.hpp" // game import in core! +#include "game/gta/Natives.hpp" // game import in core! + namespace YimMenu { HotkeySystem::HotkeySystem() : @@ -94,37 +97,40 @@ namespace YimMenu { while (g_Running) { - for (auto& [hash, link] : m_CommandHotkeys) + if (GetForegroundWindow() == *Pointers.Hwnd && !HUD::IS_PAUSE_MENU_ACTIVE() && !HUD::IS_SOCIAL_CLUB_ACTIVE()) { - if (link.m_Chain.empty() || link.m_BeingModified) - continue; - - bool all_keys_pressed = true; - - for (auto modifier : link.m_Chain) + for (auto& [hash, link] : m_CommandHotkeys) { - if (!(GetAsyncKeyState(modifier) & 0x8000)) - { - all_keys_pressed = false; - } - } + if (link.m_Chain.empty() || link.m_BeingModified) + continue; - if (all_keys_pressed && std::chrono::system_clock::now() - m_LastHotkeyTriggerTime > 100ms) - { - auto command = Commands::GetCommand(hash); - if (command) + bool all_keys_pressed = true; + + for (auto modifier : link.m_Chain) { - // TODO: this is the only way I can prevent chat from blocking the main loop while keeping everything else fast - if (hash != "chathelper"_J) - command->Call(); - else + if (!(GetAsyncKeyState(modifier) & 0x8000)) { - FiberPool::Push([command] { - command->Call(); - }); + all_keys_pressed = false; } } - m_LastHotkeyTriggerTime = std::chrono::system_clock::now(); + + if (all_keys_pressed && std::chrono::system_clock::now() - m_LastHotkeyTriggerTime > 100ms) + { + auto command = Commands::GetCommand(hash); + if (command) + { + // TODO: this is the only way I can prevent chat from blocking the main loop while keeping everything else fast + if (hash != "chathelper"_J) + command->Call(); + else + { + FiberPool::Push([command] { + command->Call(); + }); + } + } + m_LastHotkeyTriggerTime = std::chrono::system_clock::now(); + } } } ScriptMgr::Yield(); diff --git a/src/game/features/players/toxic/CeoKick.cpp b/src/game/features/players/toxic/CeoKick.cpp new file mode 100644 index 0000000..b051bb1 --- /dev/null +++ b/src/game/features/players/toxic/CeoKick.cpp @@ -0,0 +1,25 @@ +#include "game/commands/PlayerCommand.hpp" +#include "types/script/ScriptEvent.hpp" + +namespace YimMenu::Features +{ + class CeoKick : public PlayerCommand + { + using PlayerCommand::PlayerCommand; + + virtual void OnCall(Player player) override + { + OnCall(std::vector{player}); + } + + virtual void OnCall(const std::vector& players) override + { + SCRIPT_EVENT_KICK_FROM_CEO message; + for (auto& player : players) + message.SetPlayer(player.GetId()); + message.Send(); + } + }; + + static CeoKick _CeoKick{"ceokick", "CEO Kick", "Kicks the player from their organization or motorcycle club"}; +} \ No newline at end of file diff --git a/src/game/frontend/submenus/Network.cpp b/src/game/frontend/submenus/Network.cpp index 2aa07ee..02ca053 100644 --- a/src/game/frontend/submenus/Network.cpp +++ b/src/game/frontend/submenus/Network.cpp @@ -32,6 +32,7 @@ namespace YimMenu::Submenus toxicGroup->AddItem(std::make_shared("killall"_J, "Kill All")); toxicGroup->AddItem(std::make_shared("killexploitall"_J, "Permadeath All")); toxicGroup->AddItem(std::make_shared("explodeall"_J, "Explode All")); + toxicGroup->AddItem(std::make_shared("ceokickall"_J, "CEO Kick All")); enhancements->AddItem(std::make_shared("fastjoin"_J)); diff --git a/src/game/frontend/submenus/Player/Toxic.cpp b/src/game/frontend/submenus/Player/Toxic.cpp index 67157a1..21709e4 100644 --- a/src/game/frontend/submenus/Player/Toxic.cpp +++ b/src/game/frontend/submenus/Player/Toxic.cpp @@ -6,12 +6,16 @@ namespace YimMenu::Submenus { auto menu = std::make_shared("Toxic"); - auto general = std::make_shared("Damage", 1); - general->AddItem(std::make_shared("kill"_J)); - general->AddItem(std::make_shared("killexploit"_J)); - general->AddItem(std::make_shared("explode"_J)); + auto damage = std::make_shared("Damage", 1); + damage->AddItem(std::make_shared("kill"_J)); + damage->AddItem(std::make_shared("killexploit"_J)); + damage->AddItem(std::make_shared("explode"_J)); - menu->AddItem(general); + auto griefing = std::make_shared("Griefing"); + griefing->AddItem(std::make_shared("ceokick"_J)); + + menu->AddItem(damage); + menu->AddItem(griefing); return menu; } diff --git a/src/game/gta/Vehicle.cpp b/src/game/gta/Vehicle.cpp index 8318171..b182f2d 100644 --- a/src/game/gta/Vehicle.cpp +++ b/src/game/gta/Vehicle.cpp @@ -45,7 +45,6 @@ namespace YimMenu DECORATOR::DECOR_SET_INT(veh.GetHandle(), "MPBitset", 0); NETWORK::SET_NETWORK_ID_EXISTS_ON_ALL_MACHINES(NETWORK::VEH_TO_NET(veh.GetHandle()), true); VEHICLE::SET_VEHICLE_ON_GROUND_PROPERLY(veh.GetHandle(), 0); - ENTITY::SET_ALLOW_MIGRATE_TO_SPECTATOR(veh.GetHandle(), true); STREAMING::SET_MODEL_AS_NO_LONGER_NEEDED(model); return veh; diff --git a/src/game/gta/data/VehicleValues.hpp b/src/game/gta/data/VehicleValues.hpp index de79f3c..9677756 100644 --- a/src/game/gta/data/VehicleValues.hpp +++ b/src/game/gta/data/VehicleValues.hpp @@ -25,7 +25,7 @@ enum class WheelTypes WHEEL_TYPE_TRACK }; -enum class VehicleWeapons +enum class VehicleWeapons : std::uint32_t { VEHICLE_WEAPON_AKULA_BARRAGE = 0x880D14F2, VEHICLE_WEAPON_AKULA_MINIGUN = 0x19B95679, diff --git a/src/types/script/ScriptEvent.hpp b/src/types/script/ScriptEvent.hpp index efa6908..0f38b46 100644 --- a/src/types/script/ScriptEvent.hpp +++ b/src/types/script/ScriptEvent.hpp @@ -48,7 +48,7 @@ enum class ScriptEventIndex Spectate = 1840946429, // SPEC_TCK1 Teleport = -1321657966, // Mission_Pass_Notify TeleportToWarehouse = -1253241415, // .f_4 == 50 - TransactionError = -830063381, // NETWORK_RECEIVE_PLAYER_JOBSHARE_CASH + // TransactionError = -830063381, // NETWORK_RECEIVE_PLAYER_JOBSHARE_CASH VehicleKick = -503325966, // PIM_RFMOC MCTeleport = 1103127469, // NETWORK::NETWORK_HASH_FROM_PLAYER_HANDLE(PLAYER::PLAYER_ID()) == (first one) StartActivity = 1450115979, // (Var0.f_2, -1); first match @@ -145,4 +145,11 @@ struct SCRIPT_EVENT_SEND_TEXT_LABEL_MESSAGE : public SCRIPT_EVENT }; static_assert(sizeof(SCRIPT_EVENT_SEND_TEXT_LABEL_MESSAGE) == 9 * 8); +struct SCRIPT_EVENT_KICK_FROM_CEO : public SCRIPT_EVENT +{ + REGISTER_SCRIPT_EVENT(SCRIPT_EVENT_KICK_FROM_CEO, CeoKick); +}; +static_assert(sizeof(SCRIPT_EVENT_KICK_FROM_CEO) == 3 * 8); + + #undef REGISTER_SCRIPT_EVENT \ No newline at end of file