From 67b18ca5eb2339d9cef8209f784c328f962b4fad Mon Sep 17 00:00:00 2001 From: DayibBaba <79384354+DayibBaba@users.noreply.github.com> Date: Tue, 28 Mar 2023 23:28:25 +0200 Subject: [PATCH] More context menu operations (#1154) Vehicle table: -Copy vehicle -Boost -Launch -Eject Ped table: -Disarm -Ragdoll -Dance Player table: -Breakup kick -Kick -Disarm -Ragdoll Shared table: -Enflame These additions required some other tools and fixes such as: -Remove weapons command fix. -Ped animation player tool in ped.hpp -get player from ped tool in ped.hpp. -A fiber pool queue on execution of Context menu operations. --- .../player/toxic/remove_all_weapons.cpp | 5 +- .../context_menu/context_menu_service.cpp | 6 +- .../context_menu/context_menu_service.hpp | 89 ++++++++++++++++++- src/util/ped.hpp | 35 ++++++++ 4 files changed, 128 insertions(+), 7 deletions(-) diff --git a/src/backend/commands/player/toxic/remove_all_weapons.cpp b/src/backend/commands/player/toxic/remove_all_weapons.cpp index 726b2eea..f8227587 100644 --- a/src/backend/commands/player/toxic/remove_all_weapons.cpp +++ b/src/backend/commands/player/toxic/remove_all_weapons.cpp @@ -1,6 +1,7 @@ #include "backend/player_command.hpp" #include "natives.hpp" #include "pointers.hpp" +#include "services/gta_data/gta_data_service.hpp" namespace big { @@ -15,8 +16,8 @@ namespace big virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) { - // TODO: Doesn't actually do anything - WEAPON::REMOVE_ALL_PED_WEAPONS(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()), FALSE); + for (auto& [_, weapon] : g_gta_data_service->weapons()) + WEAPON::REMOVE_WEAPON_FROM_PED(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()), weapon.m_hash); } }; diff --git a/src/services/context_menu/context_menu_service.cpp b/src/services/context_menu/context_menu_service.cpp index fe56b5b3..365b26d6 100644 --- a/src/services/context_menu/context_menu_service.cpp +++ b/src/services/context_menu/context_menu_service.cpp @@ -5,6 +5,7 @@ #include "natives.hpp" #include "pointers.hpp" #include "util/misc.hpp" +#include "fiber_pool.hpp" namespace big { @@ -339,7 +340,10 @@ namespace big continue; } - cm->options.at(cm->current_option).command(); + g_fiber_pool->queue_job([cm] { + cm->options.at(cm->current_option).command(); + }); + } } } diff --git a/src/services/context_menu/context_menu_service.hpp b/src/services/context_menu/context_menu_service.hpp index b7e781d4..33ed49e9 100644 --- a/src/services/context_menu/context_menu_service.hpp +++ b/src/services/context_menu/context_menu_service.hpp @@ -3,6 +3,10 @@ #include "util/entity.hpp" #include "util/ped.hpp" #include "util/teleport.hpp" +#include "services/vehicle/persist_car_service.hpp" +#include "backend/command.hpp" +#include "backend/player_command.hpp" +#include "services/gta_data/gta_data_service.hpp" namespace big { @@ -63,7 +67,42 @@ namespace big VEHICLE::SET_VEHICLE_ENGINE_HEALTH(m_handle, 0.f); VEHICLE::SET_VEHICLE_ENGINE_ON(m_handle, false, true, false); } + else + g_notification_service->push_warning("Toxic", "Failed to take control of vehicle."); }}, + {"COPY VEHICLE", + [this] { + Vehicle v = persist_car_service::clone_ped_car(PLAYER::PLAYER_PED_ID(), m_handle); + script::get_current()->yield(); + PED::SET_PED_INTO_VEHICLE(PLAYER::PLAYER_PED_ID(), v, -1); + }}, + {"BOOST", + [this] { + if (entity::take_control_of(m_handle)) + VEHICLE::SET_VEHICLE_FORWARD_SPEED(m_handle, 79); + else + g_notification_service->push_warning("Toxic", "Failed to take control of vehicle."); + + }}, + {"LAUNCH", + [this] { + if (entity::take_control_of(m_handle)) + ENTITY::APPLY_FORCE_TO_ENTITY(m_handle, 1, 0.f, 0.f, 50000.f, 0.f, 0.f, 0.f, 0, 0, 1, 1, 0, 1); + else + g_notification_service->push_warning("Toxic", "Failed to take control of vehicle."); + }}, + {"EJECT", + [this] { + if (ped::get_player_from_ped(VEHICLE::GET_PED_IN_VEHICLE_SEAT(m_handle, -1, 0)) != NULL) + { + static player_command* command = (player_command*)command::get(rage::consteval_joaat("vehkick")); + command->call(ped::get_player_from_ped(VEHICLE::GET_PED_IN_VEHICLE_SEAT(m_handle, -1, 0)), {}); + } + + TASK::CLEAR_PED_TASKS_IMMEDIATELY(VEHICLE::GET_PED_IN_VEHICLE_SEAT(m_handle, -1, 0)); + TASK::CLEAR_PED_TASKS_IMMEDIATELY(m_handle); + + }}, {"DELETE", [this] { if (entity::take_control_of(m_handle)) @@ -75,13 +114,48 @@ namespace big teleport::into_vehicle(m_handle); }}}}; - s_context_menu ped_menu{ContextEntityType::PED, 0, {}, {}}; + s_context_menu ped_menu{ContextEntityType::PED, 0, {}, { + {"DISARM", + [this] { + for (auto& [_, weapon] : g_gta_data_service->weapons()) + WEAPON::REMOVE_WEAPON_FROM_PED(m_handle, weapon.m_hash); + }}, + {"RAGDOLL", + [this] { + PED::SET_PED_TO_RAGDOLL(m_handle, 2000, 2000, 0, 0, 0, 0); + }}, + {"DANCE", [this] { + ped::ped_play_animation(m_handle, "mini@strip_club@private_dance@part1", "priv_dance_p1"); + }} + }}; s_context_menu object_menu{ContextEntityType::OBJECT, 0, {}, {}}; - s_context_menu player_menu{ContextEntityType::PLAYER, 0, {}, {{"STEAL IDENTITY", [this] { - ped::steal_identity(m_handle); - }}}}; + s_context_menu player_menu{ContextEntityType::PLAYER, 0, {}, { + {"STEAL IDENTITY", [this] { + ped::steal_identity(m_handle); + }}, + {"BREAKUP KICK", [this] { + static player_command* command = (player_command*)command::get(rage::consteval_joaat("breakup")); + command->call(ped::get_player_from_ped(m_handle), {}); + }}, + {"KICK", [this] { + static player_command* command = (player_command*)command::get(rage::consteval_joaat("nfkick")); + static player_command* command1 = (player_command*)command::get(rage::consteval_joaat("shkick")); + static player_command* command2 = (player_command*)command::get(rage::consteval_joaat("endkick")); + command->call(ped::get_player_from_ped(m_handle), {}); + command1->call(ped::get_player_from_ped(m_handle), {}); + command2->call(ped::get_player_from_ped(m_handle), {}); + }}, + {"DISARM", [this] { + static player_command* command = (player_command*)command::get(rage::consteval_joaat("remweaps")); + command->call(ped::get_player_from_ped(m_handle), {}); + }}, + {"RAGDOLL", [this] { + static player_command* command = (player_command*)command::get(rage::consteval_joaat("ragdoll")); + command->call(ped::get_player_from_ped(m_handle), {}); + }} + }}; s_context_menu shared_menu{ContextEntityType::SHARED, 0, @@ -96,6 +170,13 @@ namespace big rage::fvector3 pos = *m_pointer->m_navigation->get_position(); teleport::to_coords({pos.x, pos.y, pos.z}); }}, + {"ENFLAME", + [this] { + Vector3 pos = ENTITY::GET_ENTITY_COORDS(m_handle, TRUE); + FIRE::START_ENTITY_FIRE(m_handle); + FIRE::START_SCRIPT_FIRE(pos.x, pos.y, pos.z, 25, TRUE); + MISC::SHOOT_SINGLE_BULLET_BETWEEN_COORDS(pos.x, pos.y, pos.z, pos.x, pos.y, pos.z, 1.f, 0, 615608432, PLAYER::PLAYER_PED_ID(), TRUE, TRUE, 1.f); + }}, {"COPY HASH", [this] { ImGui::SetClipboardText(std::format("0x{:08X}", (rage::joaat_t)m_pointer->m_model_info->m_hash).c_str()); g_notification_service->push("Context Menu", diff --git a/src/util/ped.hpp b/src/util/ped.hpp index 16c6b637..4ec7aaf4 100644 --- a/src/util/ped.hpp +++ b/src/util/ped.hpp @@ -3,6 +3,7 @@ #include "natives.hpp" #include "pointers.hpp" #include "outfit.hpp" +#include "services/players/player_service.hpp" namespace big::ped { @@ -110,4 +111,38 @@ namespace big::ped PED::SET_PED_COMPONENT_VARIATION(ped, item.id, drawable_id, texture_id, PED::GET_PED_PALETTE_VARIATION(ped, item.id)); } } + + inline player_ptr get_player_from_ped(Ped ped) + { + for (auto& p : g_player_service->players()) + { + if (p.second->get_ped()) + { + if (p.second->get_ped() == g_pointers->m_handle_to_ptr(ped)) + return p.second; + } + } + return nullptr; + } + + inline bool load_animation_dict (const char* dict) + { + if (STREAMING::HAS_ANIM_DICT_LOADED(dict)) + return true; + + for (uint8_t i = 0; !STREAMING::HAS_ANIM_DICT_LOADED(dict) && i < 35; i++) + { + STREAMING::REQUEST_ANIM_DICT(dict); + script::get_current()->yield(); + } + + return STREAMING::HAS_ANIM_DICT_LOADED(dict); + } + + inline void ped_play_animation(Ped ped, const std::string_view& animDict, const std::string_view& animName, float speed = 4.f, float speedMultiplier = -4.f, int duration = -1, int flag = 1, float playbackRate = 0, bool lockPos = false) + { + if (load_animation_dict(animDict.data())) + TASK::TASK_PLAY_ANIM(ped, animDict.data(), animName.data(), speed, speedMultiplier, duration, flag, playbackRate, lockPos, lockPos, lockPos); + } + }