From 96493b5a22d9f57c884274797dcb2e23d338851c Mon Sep 17 00:00:00 2001 From: Andreas Maerten <24669514+Yimura@users.noreply.github.com> Date: Wed, 26 Jul 2023 22:22:40 +0200 Subject: [PATCH] refactor!: Modify command argument handling and move `on_` method to bool_command (#1826) --- src/backend/backend.cpp | 2 +- src/backend/bool_command.cpp | 56 ++++++++- src/backend/bool_command.hpp | 23 ++-- src/backend/command.cpp | 5 +- src/backend/command.hpp | 11 +- src/backend/command_arguments.hpp | 114 ++++++++++++++++++ src/backend/commands/misc/recovery.cpp | 2 +- .../commands/player/kick/bail_kick.cpp | 2 +- .../commands/player/kick/breakup_kick.cpp | 2 +- .../commands/player/kick/complaint_kick.cpp | 2 +- .../commands/player/kick/end_session_kick.cpp | 2 +- .../commands/player/kick/host_kick.cpp | 2 +- .../player/kick/null_function_kick.cpp | 2 +- src/backend/commands/player/kick/oom_kick.cpp | 2 +- .../commands/player/kick/script_host_kick.cpp | 2 +- .../player/misc/clear_wanted_level.cpp | 2 +- .../commands/player/misc/enter_interior.cpp | 2 +- .../commands/player/misc/give_ammo.cpp | 2 +- .../commands/player/misc/give_armor.cpp | 2 +- .../commands/player/misc/give_health.cpp | 2 +- src/backend/commands/player/misc/join_ceo.cpp | 2 +- .../commands/player/misc/steal_identity.cpp | 2 +- .../commands/player/misc/steal_outfit.cpp | 2 +- .../commands/player/toxic/ceo_kick.cpp | 2 +- .../commands/player/toxic/explode_player.cpp | 2 +- .../player/toxic/force_into_mission.cpp | 2 +- .../player/toxic/give_all_weapons.cpp | 4 +- .../player/toxic/kick_from_interior.cpp | 2 +- .../player/toxic/kick_from_vehicle.cpp | 2 +- .../commands/player/toxic/kill_player.cpp | 2 +- .../commands/player/toxic/ragdoll_player.cpp | 2 +- .../player/toxic/remove_all_weapons.cpp | 2 +- .../player/toxic/send_fake_ban_message.cpp | 2 +- .../commands/player/toxic/send_sext.cpp | 2 +- .../player/toxic/send_to_apartment.cpp | 9 +- .../player/toxic/send_to_interior.cpp | 9 +- .../player/toxic/send_to_warehouse.cpp | 9 +- .../player/toxic/set_wanted_level.cpp | 25 ++-- .../player/toxic/show_transaction_error.cpp | 2 +- .../commands/player/toxic/start_script.cpp | 2 +- .../player/toxic/trigger_ceo_raid.cpp | 2 +- .../commands/player/toxic/turn_into_beast.cpp | 4 +- src/backend/commands/player/troll/bring.cpp | 4 +- .../commands/player/troll/set_bounty.cpp | 2 +- .../commands/player/troll/teleport.cpp | 2 +- .../player/troll/teleport_into_vehicle.cpp | 2 +- .../commands/player/vehicle/boost_vehicle.cpp | 2 +- .../commands/player/vehicle/burst_tyres.cpp | 2 +- .../commands/player/vehicle/close_doors.cpp | 2 +- .../player/vehicle/downgrade_vehicle.cpp | 2 +- .../commands/player/vehicle/flip_180.cpp | 2 +- .../player/vehicle/flying_vehicle.cpp | 2 +- .../commands/player/vehicle/kill_engine.cpp | 2 +- .../commands/player/vehicle/lock_doors.cpp | 2 +- .../commands/player/vehicle/open_doors.cpp | 2 +- .../player/vehicle/remote_control_vehicle.cpp | 2 +- .../commands/player/vehicle/smash_windows.cpp | 2 +- .../commands/player/vehicle/stop_vehicle.cpp | 2 +- .../commands/player/vehicle/unlock_doors.cpp | 2 +- .../player/vehicle/upgrade_vehicle.cpp | 2 +- .../commands/player/vehicle/window_tint.cpp | 2 +- src/backend/commands/self/ammo.cpp | 2 +- src/backend/commands/self/clean_player.cpp | 2 +- src/backend/commands/self/clearwanted.cpp | 2 +- src/backend/commands/self/fill_inventory.cpp | 2 +- src/backend/commands/self/heal.cpp | 2 +- src/backend/commands/self/repair_vehicle.cpp | 2 +- .../commands/self/request_services.cpp | 18 +-- src/backend/commands/self/skip_cutscene.cpp | 2 +- src/backend/commands/self/suicide.cpp | 2 +- src/backend/commands/session/wipe_session.cpp | 2 +- src/backend/commands/spawn/spawn_vehicle.cpp | 97 +++++++-------- src/backend/commands/system/fast_quit.cpp | 2 +- .../teleport/bring_personal_vehicle.cpp | 2 +- .../teleport/teleport_to_highlighted_blip.cpp | 2 +- .../teleport/teleport_to_last_vehicle.cpp | 2 +- .../teleport/teleport_to_objective.cpp | 2 +- .../teleport/teleport_to_personal_vehicle.cpp | 2 +- .../teleport/teleport_to_waypoint.cpp | 2 +- src/backend/float_command.cpp | 32 +++++ src/backend/float_command.hpp | 31 +++++ src/backend/int_command.cpp | 10 +- src/backend/int_command.hpp | 4 +- src/backend/looped/hud/hud_color_override.cpp | 12 +- src/backend/looped/self/free_cam.cpp | 44 ++++--- src/backend/looped/self/noclip.cpp | 44 ++++--- src/backend/looped/vehicle/no_collision.cpp | 11 +- .../looped/vehicle/unlimited_weapons.cpp | 2 +- src/backend/looped/world/nearby/combative.cpp | 10 +- src/backend/looped_command.cpp | 44 ------- src/backend/looped_command.hpp | 8 -- src/backend/player_command.cpp | 39 +++--- src/backend/player_command.hpp | 16 +-- src/gui/components/components.hpp | 26 +++- src/gui/components/input_text_with_hint.cpp | 22 ++-- src/lua/bindings/command.cpp | 2 +- .../context_menu/context_menu_service.cpp | 2 +- src/services/hotkey/hotkey.cpp | 2 +- src/views/core/view_cmd_executor.cpp | 9 +- src/views/debug/view_debug_animations.cpp | 2 +- src/views/self/view_custom_teleport.cpp | 6 +- src/views/self/view_weapons.cpp | 2 +- src/views/view_vehicle_control.cpp | 35 ++---- src/views/world/view_squad_spawner.cpp | 10 +- 104 files changed, 562 insertions(+), 381 deletions(-) create mode 100644 src/backend/command_arguments.hpp create mode 100644 src/backend/float_command.cpp create mode 100644 src/backend/float_command.hpp diff --git a/src/backend/backend.cpp b/src/backend/backend.cpp index 57812bb5..c543a9a1 100644 --- a/src/backend/backend.cpp +++ b/src/backend/backend.cpp @@ -19,7 +19,7 @@ namespace big { void backend::loop() { - for (auto& command : g_looped_commands) + for (auto& command : g_bool_commands) command->refresh(); register_script_patches(); diff --git a/src/backend/bool_command.cpp b/src/backend/bool_command.cpp index b985eb48..e364f28e 100644 --- a/src/backend/bool_command.cpp +++ b/src/backend/bool_command.cpp @@ -1,4 +1,5 @@ #include "bool_command.hpp" +#include "fiber_pool.hpp" #include "services/translation_service/translation_service.hpp" namespace big @@ -8,9 +9,10 @@ namespace big m_toggle(toggle), m_show_notify(show_notify) { + g_bool_commands.push_back(this); } - void bool_command::execute(const std::vector& args, const std::shared_ptr ctx) + void bool_command::execute(const command_arguments& args, const std::shared_ptr ctx) { if (args.size() == 0) { @@ -31,15 +33,15 @@ namespace big } else { - m_toggle = args[0]; + m_toggle = args.get(0); } this->refresh(); } - std::optional> bool_command::parse_args(const std::vector& args, const std::shared_ptr ctx) + std::optional bool_command::parse_args(const std::vector& args, const std::shared_ptr ctx) { - std::vector result; + command_arguments result(1); if (args.size() == 0) return result; @@ -52,17 +54,59 @@ namespace big if (args[0] == "yes" || args[0] == "on" || args[0] == "enable" || args[0] == "true") { - result.push_back(1); + result.push(true); return result; } if (args[0] == "no" || args[0] == "off" || args[0] == "disable" || args[0] == "false") { - result.push_back(0); + result.push(false); return result; } ctx->report_error(std::format("Cannot convert\"{}\" into a boolean in command {}", args[0], m_name)); return std::nullopt; } + + void bool_command::enable() + { + if (!m_toggle) + { + m_toggle = true; + m_last_enabled = true; + g_fiber_pool->queue_job([this] { + on_enable(); + }); + } + } + + void bool_command::disable() + { + if (m_toggle) + { + m_toggle = false; + m_last_enabled = false; + g_fiber_pool->queue_job([this] { + on_disable(); + }); + } + } + + void bool_command::refresh() + { + if (m_toggle && !m_last_enabled) + { + m_last_enabled = true; + g_fiber_pool->queue_job([this] { + on_enable(); + }); + } + else if (!m_toggle && m_last_enabled) + { + m_last_enabled = false; + g_fiber_pool->queue_job([this] { + on_disable(); + }); + } + } } \ No newline at end of file diff --git a/src/backend/bool_command.hpp b/src/backend/bool_command.hpp index 3fbb7173..26f82bac 100644 --- a/src/backend/bool_command.hpp +++ b/src/backend/bool_command.hpp @@ -5,11 +5,13 @@ namespace big { class bool_command : public command { + bool m_last_enabled = false; + protected: bool& m_toggle; bool m_show_notify; - virtual void execute(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) override; - virtual std::optional> parse_args(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) override; + virtual void execute(const command_arguments& args, const std::shared_ptr ctx = std::make_shared()) override; + virtual std::optional parse_args(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) override; public: bool_command(const std::string& name, const std::string& label, const std::string& description, bool& toggle, bool show_notify = true); @@ -18,14 +20,13 @@ namespace big return m_toggle; } - virtual void refresh(){}; - virtual void enable() - { - m_toggle = true; - }; - virtual void disable() - { - m_toggle = false; - }; + virtual void on_enable(){}; + virtual void on_disable(){}; + virtual void refresh(); + + virtual void enable(); + virtual void disable(); }; + + inline std::vector g_bool_commands; } \ No newline at end of file diff --git a/src/backend/command.cpp b/src/backend/command.cpp index 504cdbe3..b83b0312 100644 --- a/src/backend/command.cpp +++ b/src/backend/command.cpp @@ -51,7 +51,7 @@ namespace big } } - void command::call(const std::vector& args, const std::shared_ptr ctx) + void command::call(command_arguments& args, const std::shared_ptr ctx) { if (m_num_args.has_value() && args.size() != m_num_args.value()) { @@ -68,6 +68,7 @@ namespace big return; } + args.reset_idx(); if (m_fiber_pool) g_fiber_pool->queue_job([this, args, ctx] { execute(args, ctx); @@ -103,7 +104,7 @@ namespace big return g_commands[command]; } - void command::call(rage::joaat_t command, const std::vector& args, const std::shared_ptr ctx) + void command::call(rage::joaat_t command, command_arguments& args, const std::shared_ptr ctx) { g_commands[command]->call(args, ctx); } diff --git a/src/backend/command.hpp b/src/backend/command.hpp index 14f58523..6f3df80c 100644 --- a/src/backend/command.hpp +++ b/src/backend/command.hpp @@ -1,4 +1,5 @@ #pragma once +#include "command_arguments.hpp" #include "context/command_context.hpp" #include "context/default_command_context.hpp" #include "core/enums.hpp" @@ -17,10 +18,10 @@ namespace big std::optional m_num_args; bool m_fiber_pool; - virtual void execute(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) = 0; - virtual std::optional> parse_args(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) + virtual void execute(const command_arguments& args, const std::shared_ptr ctx = std::make_shared()) = 0; + virtual std::optional parse_args(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) { - return std::vector(); + return {0}; }; virtual CommandAccessLevel get_access_level() { @@ -54,13 +55,13 @@ namespace big return m_num_args; } - void call(const std::vector& args, const std::shared_ptr ctx = std::make_shared()); + void call(command_arguments& args, const std::shared_ptr ctx = std::make_shared()); void call(const std::vector& args, const std::shared_ptr ctx = std::make_shared()); static std::vector get_suggestions(std::string, int limit = 7); static command* get(rage::joaat_t command); - static void call(rage::joaat_t command, const std::vector& args, const std::shared_ptr ctx = std::make_shared()); + static void call(rage::joaat_t command, command_arguments& args, const std::shared_ptr ctx = std::make_shared()); static void call(rage::joaat_t command, const std::vector& args, const std::shared_ptr ctx = std::make_shared()); static bool process(const std::string& text, const std::shared_ptr ctx = std::make_shared(), bool use_best_suggestion = false); diff --git a/src/backend/command_arguments.hpp b/src/backend/command_arguments.hpp new file mode 100644 index 00000000..56f974b2 --- /dev/null +++ b/src/backend/command_arguments.hpp @@ -0,0 +1,114 @@ +#pragma once +#include +#include +#include + +namespace big +{ + template + concept ArgumentLimit = sizeof(T) <= sizeof(uint64_t); + + class command_arguments + { + private: + const std::size_t m_argument_count; + std::vector m_argument_data; + mutable std::size_t m_idx; + + public: + command_arguments(std::size_t argument_count = 0) : + m_argument_count(argument_count), + m_argument_data(), + m_idx(0) + { + m_argument_data.reserve(argument_count); + } + + command_arguments(std::size_t argument_count, const command_arguments& other) : + command_arguments(argument_count) + { + std::copy_n(other.m_argument_data.begin(), std::min(argument_count, other.m_argument_data.size()), m_argument_data.begin()); + } + + command_arguments(const std::vector& vec) : + command_arguments(vec.size()) + { + m_argument_data = vec; + } + + template + requires ArgumentLimit + T get(std::size_t idx) const + { + return reinterpret_cast(m_argument_data[idx]); + } + + template + requires ArgumentLimit + std::enable_if_t, T> get(std::size_t idx) const + { + return static_cast(m_argument_data[idx]); + } + + template + requires ArgumentLimit + T shift() const + { + if (m_idx >= m_argument_count) + { + throw std::runtime_error("Attempted to shift argument beyond allocated argument size."); + } + + return reinterpret_cast(m_argument_data[m_idx++]); + } + + template + requires ArgumentLimit + std::enable_if_t, T> shift() const + { + if (m_idx >= m_argument_count) + { + throw std::runtime_error("Attempted to shift argument beyond allocated argument size."); + } + + return static_cast(m_argument_data[m_idx++]); + } + + template + requires ArgumentLimit + void push(T arg) + { + if (m_idx++ >= m_argument_count) + { + throw std::runtime_error("Attempted to push argument beyond allocated argument size."); + } + + m_argument_data.push_back(reinterpret_cast(arg)); + } + + template + requires ArgumentLimit + void set(std::size_t idx, T arg) + { + if (idx >= m_argument_count) + { + throw std::runtime_error("Attempted to set argument beyond allocated argument size."); + } + + m_argument_data[idx] = reinterpret_cast(arg); + } + + command_arguments& reset_idx() + { + m_idx = 0; + + return *this; + } + + std::size_t size() const + { + return m_argument_data.size(); + } + + }; +} \ No newline at end of file diff --git a/src/backend/commands/misc/recovery.cpp b/src/backend/commands/misc/recovery.cpp index c93c2c07..0e7b8534 100644 --- a/src/backend/commands/misc/recovery.cpp +++ b/src/backend/commands/misc/recovery.cpp @@ -12,7 +12,7 @@ namespace big return CommandAccessLevel::NONE; } - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { ctx->report_error("Money and recovery options are not supported in YimMenu to keep Rockstar/Take Two happy. You can try Kiddion's Modest Menu (free) instead, but make sure to only get it from UnknownCheats.me, the rest are scams and may contain malware"); } diff --git a/src/backend/commands/player/kick/bail_kick.cpp b/src/backend/commands/player/kick/bail_kick.cpp index 9853a6f6..3913968a 100644 --- a/src/backend/commands/player/kick/bail_kick.cpp +++ b/src/backend/commands/player/kick/bail_kick.cpp @@ -16,7 +16,7 @@ namespace big return CommandAccessLevel::TOXIC; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { const size_t arg_count = 3; int64_t args[arg_count] = {(int64_t)eRemoteEvent::NetworkBail, diff --git a/src/backend/commands/player/kick/breakup_kick.cpp b/src/backend/commands/player/kick/breakup_kick.cpp index 0eaa9c53..1cc43d32 100644 --- a/src/backend/commands/player/kick/breakup_kick.cpp +++ b/src/backend/commands/player/kick/breakup_kick.cpp @@ -18,7 +18,7 @@ namespace big return CommandAccessLevel::TOXIC; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { if (!g_player_service->get_self()->is_host() || !player->get_net_data()) return; diff --git a/src/backend/commands/player/kick/complaint_kick.cpp b/src/backend/commands/player/kick/complaint_kick.cpp index 7a2b996f..3829290f 100644 --- a/src/backend/commands/player/kick/complaint_kick.cpp +++ b/src/backend/commands/player/kick/complaint_kick.cpp @@ -17,7 +17,7 @@ namespace big return CommandAccessLevel::TOXIC; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { if (gta_util::get_network()->m_game_session_ptr->is_host()) { diff --git a/src/backend/commands/player/kick/end_session_kick.cpp b/src/backend/commands/player/kick/end_session_kick.cpp index 0d51ee03..b29a45b3 100644 --- a/src/backend/commands/player/kick/end_session_kick.cpp +++ b/src/backend/commands/player/kick/end_session_kick.cpp @@ -15,7 +15,7 @@ namespace big return CommandAccessLevel::TOXIC; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { if (!scripts::force_host(RAGE_JOAAT("freemode"))) { diff --git a/src/backend/commands/player/kick/host_kick.cpp b/src/backend/commands/player/kick/host_kick.cpp index 36cd31dc..7e4464fd 100644 --- a/src/backend/commands/player/kick/host_kick.cpp +++ b/src/backend/commands/player/kick/host_kick.cpp @@ -12,7 +12,7 @@ namespace big return CommandAccessLevel::TOXIC; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { if (!g_player_service->get_self()->is_host()) { diff --git a/src/backend/commands/player/kick/null_function_kick.cpp b/src/backend/commands/player/kick/null_function_kick.cpp index 5c8fc2fc..cd4fe88f 100644 --- a/src/backend/commands/player/kick/null_function_kick.cpp +++ b/src/backend/commands/player/kick/null_function_kick.cpp @@ -14,7 +14,7 @@ namespace big return CommandAccessLevel::TOXIC; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { const size_t arg_count = 15; int64_t args[arg_count] = {(int64_t)eRemoteEvent::InteriorControl, (int64_t)self::id, (int64_t)(int)-1}; diff --git a/src/backend/commands/player/kick/oom_kick.cpp b/src/backend/commands/player/kick/oom_kick.cpp index 56239542..fc464091 100644 --- a/src/backend/commands/player/kick/oom_kick.cpp +++ b/src/backend/commands/player/kick/oom_kick.cpp @@ -18,7 +18,7 @@ namespace big return CommandAccessLevel::TOXIC; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { packet msg{}; diff --git a/src/backend/commands/player/kick/script_host_kick.cpp b/src/backend/commands/player/kick/script_host_kick.cpp index 3eab9183..ca467048 100644 --- a/src/backend/commands/player/kick/script_host_kick.cpp +++ b/src/backend/commands/player/kick/script_host_kick.cpp @@ -15,7 +15,7 @@ namespace big return CommandAccessLevel::TOXIC; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { if (!scripts::force_host(RAGE_JOAAT("freemode"))) { diff --git a/src/backend/commands/player/misc/clear_wanted_level.cpp b/src/backend/commands/player/misc/clear_wanted_level.cpp index 647a2afb..99be0919 100644 --- a/src/backend/commands/player/misc/clear_wanted_level.cpp +++ b/src/backend/commands/player/misc/clear_wanted_level.cpp @@ -14,7 +14,7 @@ namespace big return CommandAccessLevel::FRIENDLY; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { globals::clear_wanted_player(player->id()); } diff --git a/src/backend/commands/player/misc/enter_interior.cpp b/src/backend/commands/player/misc/enter_interior.cpp index 5c91bb78..78481d94 100644 --- a/src/backend/commands/player/misc/enter_interior.cpp +++ b/src/backend/commands/player/misc/enter_interior.cpp @@ -13,7 +13,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { int id = player->id(); if (scr_globals::gpbd_fm_1.as()->Entries[id].PropertyData.Index != -1) diff --git a/src/backend/commands/player/misc/give_ammo.cpp b/src/backend/commands/player/misc/give_ammo.cpp index 2e3856f2..27861166 100644 --- a/src/backend/commands/player/misc/give_ammo.cpp +++ b/src/backend/commands/player/misc/give_ammo.cpp @@ -15,7 +15,7 @@ namespace big return CommandAccessLevel::FRIENDLY; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { g_pickup_service->give_player_health(player->id()); } diff --git a/src/backend/commands/player/misc/give_armor.cpp b/src/backend/commands/player/misc/give_armor.cpp index d473aa48..8b63b483 100644 --- a/src/backend/commands/player/misc/give_armor.cpp +++ b/src/backend/commands/player/misc/give_armor.cpp @@ -15,7 +15,7 @@ namespace big return CommandAccessLevel::FRIENDLY; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { g_pickup_service->give_armour(player->id()); } diff --git a/src/backend/commands/player/misc/give_health.cpp b/src/backend/commands/player/misc/give_health.cpp index 6bfe20cf..804276d1 100644 --- a/src/backend/commands/player/misc/give_health.cpp +++ b/src/backend/commands/player/misc/give_health.cpp @@ -15,7 +15,7 @@ namespace big return CommandAccessLevel::FRIENDLY; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { g_pickup_service->give_player_health(player->id()); } diff --git a/src/backend/commands/player/misc/join_ceo.cpp b/src/backend/commands/player/misc/join_ceo.cpp index a28d4b6e..080eb372 100644 --- a/src/backend/commands/player/misc/join_ceo.cpp +++ b/src/backend/commands/player/misc/join_ceo.cpp @@ -10,7 +10,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { scr_functions::join_ceo({player->id(), 0, false, false}); } diff --git a/src/backend/commands/player/misc/steal_identity.cpp b/src/backend/commands/player/misc/steal_identity.cpp index 60b02827..98e9e25b 100644 --- a/src/backend/commands/player/misc/steal_identity.cpp +++ b/src/backend/commands/player/misc/steal_identity.cpp @@ -9,7 +9,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { ped::steal_identity(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id())); } diff --git a/src/backend/commands/player/misc/steal_outfit.cpp b/src/backend/commands/player/misc/steal_outfit.cpp index e0db5f02..d673c942 100644 --- a/src/backend/commands/player/misc/steal_outfit.cpp +++ b/src/backend/commands/player/misc/steal_outfit.cpp @@ -9,7 +9,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { ped::steal_outfit(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id())); } diff --git a/src/backend/commands/player/toxic/ceo_kick.cpp b/src/backend/commands/player/toxic/ceo_kick.cpp index aea3c890..e5b56a24 100644 --- a/src/backend/commands/player/toxic/ceo_kick.cpp +++ b/src/backend/commands/player/toxic/ceo_kick.cpp @@ -16,7 +16,7 @@ namespace big return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { auto leader = scr_globals::gpbd_fm_3.as()->Entries[player->id()].BossGoon.Boss; diff --git a/src/backend/commands/player/toxic/explode_player.cpp b/src/backend/commands/player/toxic/explode_player.cpp index eacc5242..d1a83d6d 100644 --- a/src/backend/commands/player/toxic/explode_player.cpp +++ b/src/backend/commands/player/toxic/explode_player.cpp @@ -14,7 +14,7 @@ namespace big return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { toxic::blame_explode_player(player, player, EXP_TAG_SUBMARINE_BIG, 9999.0f, true, false, 9999.0f); } diff --git a/src/backend/commands/player/toxic/force_into_mission.cpp b/src/backend/commands/player/toxic/force_into_mission.cpp index 3f4368e1..4b70c38f 100644 --- a/src/backend/commands/player/toxic/force_into_mission.cpp +++ b/src/backend/commands/player/toxic/force_into_mission.cpp @@ -14,7 +14,7 @@ namespace big return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { const size_t arg_count = 3; int64_t args[arg_count] = {(int64_t)eRemoteEvent::ForceMission, (int64_t)self::id, 0}; diff --git a/src/backend/commands/player/toxic/give_all_weapons.cpp b/src/backend/commands/player/toxic/give_all_weapons.cpp index 77752eb0..cfa06781 100644 --- a/src/backend/commands/player/toxic/give_all_weapons.cpp +++ b/src/backend/commands/player/toxic/give_all_weapons.cpp @@ -15,7 +15,7 @@ namespace big return CommandAccessLevel::FRIENDLY; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { for (auto& weapon : g_gta_data_service->weapons()) WEAPON::GIVE_WEAPON_TO_PED(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()), weapon.second.m_hash, 9999, FALSE, FALSE); @@ -31,7 +31,7 @@ namespace big return CommandAccessLevel::FRIENDLY; } - virtual void execute(const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(const command_arguments& _args, const std::shared_ptr ctx) { g_player_service->iterate([](auto& plyr) { for (auto& weapon : g_gta_data_service->weapons()) diff --git a/src/backend/commands/player/toxic/kick_from_interior.cpp b/src/backend/commands/player/toxic/kick_from_interior.cpp index 8238adba..95f41947 100644 --- a/src/backend/commands/player/toxic/kick_from_interior.cpp +++ b/src/backend/commands/player/toxic/kick_from_interior.cpp @@ -23,7 +23,7 @@ namespace big return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { if (scr_globals::gpbd_fm_1.as()->Entries[player->id()].PropertyData.Index != -1) { diff --git a/src/backend/commands/player/toxic/kick_from_vehicle.cpp b/src/backend/commands/player/toxic/kick_from_vehicle.cpp index a1e02fd1..d99474b0 100644 --- a/src/backend/commands/player/toxic/kick_from_vehicle.cpp +++ b/src/backend/commands/player/toxic/kick_from_vehicle.cpp @@ -14,7 +14,7 @@ namespace big return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { auto vehicle = player->get_current_vehicle(); diff --git a/src/backend/commands/player/toxic/kill_player.cpp b/src/backend/commands/player/toxic/kill_player.cpp index 3d6f5e1f..b5c6d333 100644 --- a/src/backend/commands/player/toxic/kill_player.cpp +++ b/src/backend/commands/player/toxic/kill_player.cpp @@ -13,7 +13,7 @@ namespace big return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { if (!player->get_ped()) return; diff --git a/src/backend/commands/player/toxic/ragdoll_player.cpp b/src/backend/commands/player/toxic/ragdoll_player.cpp index 13ac4a53..bcb6988e 100644 --- a/src/backend/commands/player/toxic/ragdoll_player.cpp +++ b/src/backend/commands/player/toxic/ragdoll_player.cpp @@ -13,7 +13,7 @@ namespace big return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { if (auto ped = player->get_ped()) if (auto net_object = ped->m_net_object) diff --git a/src/backend/commands/player/toxic/remove_all_weapons.cpp b/src/backend/commands/player/toxic/remove_all_weapons.cpp index e6553c9f..eaca92b6 100644 --- a/src/backend/commands/player/toxic/remove_all_weapons.cpp +++ b/src/backend/commands/player/toxic/remove_all_weapons.cpp @@ -14,7 +14,7 @@ namespace big return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { 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/backend/commands/player/toxic/send_fake_ban_message.cpp b/src/backend/commands/player/toxic/send_fake_ban_message.cpp index 8d1edfec..692ece1b 100644 --- a/src/backend/commands/player/toxic/send_fake_ban_message.cpp +++ b/src/backend/commands/player/toxic/send_fake_ban_message.cpp @@ -16,7 +16,7 @@ namespace big return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { const size_t arg_count = 8; int64_t args[arg_count] = {(int64_t)eRemoteEvent::SendTextLabelSMS, self::id}; diff --git a/src/backend/commands/player/toxic/send_sext.cpp b/src/backend/commands/player/toxic/send_sext.cpp index c1599f9a..51c06740 100644 --- a/src/backend/commands/player/toxic/send_sext.cpp +++ b/src/backend/commands/player/toxic/send_sext.cpp @@ -20,7 +20,7 @@ namespace big return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { const size_t arg_count = 8; int64_t args[arg_count] = {(int64_t)eRemoteEvent::SendTextLabelSMS, self::id}; diff --git a/src/backend/commands/player/toxic/send_to_apartment.cpp b/src/backend/commands/player/toxic/send_to_apartment.cpp index 4455345d..47c250a9 100644 --- a/src/backend/commands/player/toxic/send_to_apartment.cpp +++ b/src/backend/commands/player/toxic/send_to_apartment.cpp @@ -9,20 +9,15 @@ namespace big { using player_command::player_command; - virtual std::optional> parse_args_p(const std::vector& args, const std::shared_ptr ctx) - { - return std::vector{(uint64_t)std::atoi(args[0].c_str())}; - } - virtual CommandAccessLevel get_access_level() { return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { const size_t arg_count = 9; - int64_t args[arg_count] = {(int64_t)eRemoteEvent::Teleport, self::id, (int64_t)player->id(), (int64_t)(int)-1, 1, (int64_t)_args[0], 1, 1, 1}; + int64_t args[arg_count] = {(int64_t)eRemoteEvent::Teleport, self::id, (int64_t)player->id(), (int64_t)(int)-1, 1, (int64_t)_args.get(0), 1, 1, 1}; g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << player->id()); } diff --git a/src/backend/commands/player/toxic/send_to_interior.cpp b/src/backend/commands/player/toxic/send_to_interior.cpp index 86844dee..89943cf8 100644 --- a/src/backend/commands/player/toxic/send_to_interior.cpp +++ b/src/backend/commands/player/toxic/send_to_interior.cpp @@ -8,24 +8,19 @@ namespace big { using player_command::player_command; - virtual std::optional> parse_args_p(const std::vector& args, const std::shared_ptr ctx) - { - return std::vector{(uint64_t)std::atoi(args[0].c_str())}; - } - virtual CommandAccessLevel get_access_level() { return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { float max = 1e+38f; auto coords = ENTITY::GET_ENTITY_COORDS(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()), FALSE); const size_t arg_count = 15; int64_t args[arg_count] = {(int64_t)eRemoteEvent::InteriorControl, (int64_t)self::id, - (int64_t)(int)_args[0], + (int64_t)_args.get(0), (int64_t)self::id, (int64_t) false, (int64_t) true, // true means enter sender interior diff --git a/src/backend/commands/player/toxic/send_to_warehouse.cpp b/src/backend/commands/player/toxic/send_to_warehouse.cpp index 1a1ba89c..3e360f6c 100644 --- a/src/backend/commands/player/toxic/send_to_warehouse.cpp +++ b/src/backend/commands/player/toxic/send_to_warehouse.cpp @@ -9,20 +9,15 @@ namespace big { using player_command::player_command; - virtual std::optional> parse_args_p(const std::vector& args, const std::shared_ptr ctx) - { - return std::vector{(uint64_t)std::atoi(args[0].c_str())}; - } - virtual CommandAccessLevel get_access_level() { return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { const size_t arg_count = 6; - int64_t args[arg_count] = {(int64_t)eRemoteEvent::TeleportToWarehouse, self::id, (int64_t)player->id(), 1, (int64_t)_args[0]}; + int64_t args[arg_count] = {(int64_t)eRemoteEvent::TeleportToWarehouse, self::id, (int64_t)player->id(), 1, (int64_t)_args.get(0)}; g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << player->id()); } diff --git a/src/backend/commands/player/toxic/set_wanted_level.cpp b/src/backend/commands/player/toxic/set_wanted_level.cpp index fad51757..34e39001 100644 --- a/src/backend/commands/player/toxic/set_wanted_level.cpp +++ b/src/backend/commands/player/toxic/set_wanted_level.cpp @@ -13,17 +13,19 @@ namespace big { using player_command::player_command; - virtual std::optional> parse_args_p(const std::vector& args, const std::shared_ptr ctx) + virtual std::optional parse_args_p(const std::vector& args, const std::shared_ptr ctx) { - uint64_t level = std::atoi(args[0].c_str()); + const auto level = std::atoi(args[0].c_str()); if (level < 0 || level > 5) { - ctx->report_error(std::format("Wanted level {} is invalid", level)); + ctx->report_error(std::format("Wanted level {} is invalid [0 - 5]", level)); return std::nullopt; } - return std::vector{level}; + command_arguments result(1); + result.push(level); + return result; } virtual CommandAccessLevel get_access_level() @@ -31,33 +33,34 @@ namespace big return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { + const auto wanted_level = _args.get(0); if (player->id() == self::id) { - PLAYER::SET_PLAYER_WANTED_LEVEL(self::id, _args[0], FALSE); + PLAYER::SET_PLAYER_WANTED_LEVEL(self::id, wanted_level, FALSE); } else { int id = player->id(); - if (PLAYER::GET_PLAYER_WANTED_LEVEL(id) > _args[0]) + if (PLAYER::GET_PLAYER_WANTED_LEVEL(id) > wanted_level) { // clear existing wanted globals::clear_wanted_player(id); - for (int i = 0; PLAYER::GET_PLAYER_WANTED_LEVEL(id) > _args[0] && i < 3600; i++) + for (int i = 0; PLAYER::GET_PLAYER_WANTED_LEVEL(id) > wanted_level && i < 3600; i++) script::get_current()->yield(1ms); } - if (_args[0] > 0) + if (wanted_level > 0) { auto& gpbd = scr_globals::globalplayer_bd.as()->Entries[self::id]; gpbd.RemoteWantedLevelPlayer = id; - gpbd.RemoteWantedLevelAmount = _args[0]; + gpbd.RemoteWantedLevelAmount = wanted_level; - for (int i = 0; PLAYER::GET_PLAYER_WANTED_LEVEL(id) < _args[0] && i < 3600; i++) + for (int i = 0; PLAYER::GET_PLAYER_WANTED_LEVEL(id) < wanted_level && i < 3600; i++) script::get_current()->yield(1ms); gpbd.RemoteWantedLevelPlayer = -1; diff --git a/src/backend/commands/player/toxic/show_transaction_error.cpp b/src/backend/commands/player/toxic/show_transaction_error.cpp index 19b862d4..d6c5fa2f 100644 --- a/src/backend/commands/player/toxic/show_transaction_error.cpp +++ b/src/backend/commands/player/toxic/show_transaction_error.cpp @@ -16,7 +16,7 @@ namespace big return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { const size_t arg_count = 8; int64_t args[arg_count] = {(int64_t)eRemoteEvent::TransactionError, diff --git a/src/backend/commands/player/toxic/start_script.cpp b/src/backend/commands/player/toxic/start_script.cpp index 28d954c5..0a22f712 100644 --- a/src/backend/commands/player/toxic/start_script.cpp +++ b/src/backend/commands/player/toxic/start_script.cpp @@ -18,7 +18,7 @@ namespace big return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { const size_t arg_count = 25; int64_t args[arg_count] = {(int64_t)eRemoteEvent::StartScriptBegin, (int64_t)self::id}; diff --git a/src/backend/commands/player/toxic/trigger_ceo_raid.cpp b/src/backend/commands/player/toxic/trigger_ceo_raid.cpp index e300da88..074e946b 100644 --- a/src/backend/commands/player/toxic/trigger_ceo_raid.cpp +++ b/src/backend/commands/player/toxic/trigger_ceo_raid.cpp @@ -13,7 +13,7 @@ namespace big return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { const size_t arg_count = 3; int64_t args[arg_count] = {(int64_t)eRemoteEvent::TriggerCEORaid, (int64_t)self::id, 0}; diff --git a/src/backend/commands/player/toxic/turn_into_beast.cpp b/src/backend/commands/player/toxic/turn_into_beast.cpp index 898a2553..eff8ff73 100644 --- a/src/backend/commands/player/toxic/turn_into_beast.cpp +++ b/src/backend/commands/player/toxic/turn_into_beast.cpp @@ -15,7 +15,7 @@ namespace big return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { auto id = player->id(); @@ -81,7 +81,7 @@ namespace big return CommandAccessLevel::AGGRESSIVE; } - virtual void execute(const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(const command_arguments& _args, const std::shared_ptr ctx) { scripts::start_launcher_script(47); diff --git a/src/backend/commands/player/troll/bring.cpp b/src/backend/commands/player/troll/bring.cpp index 8783bd71..5bbb990a 100644 --- a/src/backend/commands/player/troll/bring.cpp +++ b/src/backend/commands/player/troll/bring.cpp @@ -10,7 +10,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { teleport::bring_player(player); } @@ -20,7 +20,7 @@ namespace big { using command::command; - virtual void execute(const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(const command_arguments& _args, const std::shared_ptr ctx) { for (auto& player : g_player_service->players()) g_fiber_pool->queue_job([player]() { diff --git a/src/backend/commands/player/troll/set_bounty.cpp b/src/backend/commands/player/troll/set_bounty.cpp index e65ae82f..32977e29 100644 --- a/src/backend/commands/player/troll/set_bounty.cpp +++ b/src/backend/commands/player/troll/set_bounty.cpp @@ -10,7 +10,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { troll::set_bounty_on_player(player, 10000, g.session.anonymous_bounty); } diff --git a/src/backend/commands/player/troll/teleport.cpp b/src/backend/commands/player/troll/teleport.cpp index 9aba6a8d..8732063f 100644 --- a/src/backend/commands/player/troll/teleport.cpp +++ b/src/backend/commands/player/troll/teleport.cpp @@ -10,7 +10,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { teleport::to_player(player->id()); } diff --git a/src/backend/commands/player/troll/teleport_into_vehicle.cpp b/src/backend/commands/player/troll/teleport_into_vehicle.cpp index dc6d373d..e65b14c8 100644 --- a/src/backend/commands/player/troll/teleport_into_vehicle.cpp +++ b/src/backend/commands/player/troll/teleport_into_vehicle.cpp @@ -9,7 +9,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { Vehicle veh = PED::GET_VEHICLE_PED_IS_IN(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(g_player_service->get_selected()->id()), false); diff --git a/src/backend/commands/player/vehicle/boost_vehicle.cpp b/src/backend/commands/player/vehicle/boost_vehicle.cpp index 74607dd5..2cff6355 100644 --- a/src/backend/commands/player/vehicle/boost_vehicle.cpp +++ b/src/backend/commands/player/vehicle/boost_vehicle.cpp @@ -9,7 +9,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { Ped ped = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()); if (!PED::IS_PED_IN_ANY_VEHICLE(ped, true)) diff --git a/src/backend/commands/player/vehicle/burst_tyres.cpp b/src/backend/commands/player/vehicle/burst_tyres.cpp index 83cf5831..b7bc0dfb 100644 --- a/src/backend/commands/player/vehicle/burst_tyres.cpp +++ b/src/backend/commands/player/vehicle/burst_tyres.cpp @@ -9,7 +9,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { Ped ped = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()); diff --git a/src/backend/commands/player/vehicle/close_doors.cpp b/src/backend/commands/player/vehicle/close_doors.cpp index 01f70413..f33a2b92 100644 --- a/src/backend/commands/player/vehicle/close_doors.cpp +++ b/src/backend/commands/player/vehicle/close_doors.cpp @@ -8,7 +8,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { Ped ped = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()); diff --git a/src/backend/commands/player/vehicle/downgrade_vehicle.cpp b/src/backend/commands/player/vehicle/downgrade_vehicle.cpp index 1e6b6a02..e23cee8a 100644 --- a/src/backend/commands/player/vehicle/downgrade_vehicle.cpp +++ b/src/backend/commands/player/vehicle/downgrade_vehicle.cpp @@ -9,7 +9,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { Ped ped = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()); Vehicle vehicle = PED::GET_VEHICLE_PED_IS_IN(ped, false); diff --git a/src/backend/commands/player/vehicle/flip_180.cpp b/src/backend/commands/player/vehicle/flip_180.cpp index 1512fe5f..5f8126d0 100644 --- a/src/backend/commands/player/vehicle/flip_180.cpp +++ b/src/backend/commands/player/vehicle/flip_180.cpp @@ -9,7 +9,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { Ped player_ped = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()); Vehicle vehicle = PED::GET_VEHICLE_PED_IS_IN(player_ped, false); diff --git a/src/backend/commands/player/vehicle/flying_vehicle.cpp b/src/backend/commands/player/vehicle/flying_vehicle.cpp index 17f8c0d4..b0b181b9 100644 --- a/src/backend/commands/player/vehicle/flying_vehicle.cpp +++ b/src/backend/commands/player/vehicle/flying_vehicle.cpp @@ -9,7 +9,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { Entity ent = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()); diff --git a/src/backend/commands/player/vehicle/kill_engine.cpp b/src/backend/commands/player/vehicle/kill_engine.cpp index f799cda6..f6b11f83 100644 --- a/src/backend/commands/player/vehicle/kill_engine.cpp +++ b/src/backend/commands/player/vehicle/kill_engine.cpp @@ -8,7 +8,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { Ped ped = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()); if (!PED::IS_PED_IN_ANY_VEHICLE(ped, true)) diff --git a/src/backend/commands/player/vehicle/lock_doors.cpp b/src/backend/commands/player/vehicle/lock_doors.cpp index d8bcf70a..bc8e8539 100644 --- a/src/backend/commands/player/vehicle/lock_doors.cpp +++ b/src/backend/commands/player/vehicle/lock_doors.cpp @@ -9,7 +9,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { int lockStatus = VEHICLE::GET_VEHICLE_DOOR_LOCK_STATUS(player->id()); Ped ped = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()); diff --git a/src/backend/commands/player/vehicle/open_doors.cpp b/src/backend/commands/player/vehicle/open_doors.cpp index 8dc23379..adfad1be 100644 --- a/src/backend/commands/player/vehicle/open_doors.cpp +++ b/src/backend/commands/player/vehicle/open_doors.cpp @@ -9,7 +9,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { Ped ped = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()); if (!PED::IS_PED_IN_ANY_VEHICLE(ped, true)) diff --git a/src/backend/commands/player/vehicle/remote_control_vehicle.cpp b/src/backend/commands/player/vehicle/remote_control_vehicle.cpp index 11866aa6..636c704c 100644 --- a/src/backend/commands/player/vehicle/remote_control_vehicle.cpp +++ b/src/backend/commands/player/vehicle/remote_control_vehicle.cpp @@ -9,7 +9,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { Vehicle veh = PED::GET_VEHICLE_PED_IS_IN(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()), FALSE); if (veh == 0) diff --git a/src/backend/commands/player/vehicle/smash_windows.cpp b/src/backend/commands/player/vehicle/smash_windows.cpp index fa5a6864..cb9b87a9 100644 --- a/src/backend/commands/player/vehicle/smash_windows.cpp +++ b/src/backend/commands/player/vehicle/smash_windows.cpp @@ -9,7 +9,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { Ped ped = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()); if (PED::IS_PED_IN_ANY_VEHICLE(ped, false)) diff --git a/src/backend/commands/player/vehicle/stop_vehicle.cpp b/src/backend/commands/player/vehicle/stop_vehicle.cpp index 240707d4..26be0bc4 100644 --- a/src/backend/commands/player/vehicle/stop_vehicle.cpp +++ b/src/backend/commands/player/vehicle/stop_vehicle.cpp @@ -8,7 +8,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { Ped ped = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()); if (!PED::IS_PED_IN_ANY_VEHICLE(ped, true)) diff --git a/src/backend/commands/player/vehicle/unlock_doors.cpp b/src/backend/commands/player/vehicle/unlock_doors.cpp index 945e8d83..4b15b770 100644 --- a/src/backend/commands/player/vehicle/unlock_doors.cpp +++ b/src/backend/commands/player/vehicle/unlock_doors.cpp @@ -8,7 +8,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { if (PED::IS_PED_IN_ANY_VEHICLE(player->id(), false)) { diff --git a/src/backend/commands/player/vehicle/upgrade_vehicle.cpp b/src/backend/commands/player/vehicle/upgrade_vehicle.cpp index 09786b94..757224c4 100644 --- a/src/backend/commands/player/vehicle/upgrade_vehicle.cpp +++ b/src/backend/commands/player/vehicle/upgrade_vehicle.cpp @@ -10,7 +10,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { Ped ped = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()); Vehicle vehicle = PED::GET_VEHICLE_PED_IS_IN(ped, false); diff --git a/src/backend/commands/player/vehicle/window_tint.cpp b/src/backend/commands/player/vehicle/window_tint.cpp index 501aad84..d7d70ba7 100644 --- a/src/backend/commands/player/vehicle/window_tint.cpp +++ b/src/backend/commands/player/vehicle/window_tint.cpp @@ -10,7 +10,7 @@ namespace big { using player_command::player_command; - virtual void execute(player_ptr player, const std::vector& _args, const std::shared_ptr ctx) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) { Ped ped = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()); diff --git a/src/backend/commands/self/ammo.cpp b/src/backend/commands/self/ammo.cpp index a18d33e5..db167b83 100644 --- a/src/backend/commands/self/ammo.cpp +++ b/src/backend/commands/self/ammo.cpp @@ -8,7 +8,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { for (const auto& [_, weapon] : g_gta_data_service->weapons()) { diff --git a/src/backend/commands/self/clean_player.cpp b/src/backend/commands/self/clean_player.cpp index a32c0920..36e729c0 100644 --- a/src/backend/commands/self/clean_player.cpp +++ b/src/backend/commands/self/clean_player.cpp @@ -8,7 +8,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { entity::clean_ped(self::ped); } diff --git a/src/backend/commands/self/clearwanted.cpp b/src/backend/commands/self/clearwanted.cpp index 1d3e5c22..ef27af8f 100644 --- a/src/backend/commands/self/clearwanted.cpp +++ b/src/backend/commands/self/clearwanted.cpp @@ -7,7 +7,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { if(g_local_player && g_local_player !=nullptr && !g.self.force_wanted_level) { diff --git a/src/backend/commands/self/fill_inventory.cpp b/src/backend/commands/self/fill_inventory.cpp index 4e0299ae..15afad05 100644 --- a/src/backend/commands/self/fill_inventory.cpp +++ b/src/backend/commands/self/fill_inventory.cpp @@ -8,7 +8,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { std::string mpPrefix = local_player::get_mp_prefix(); STATS::STAT_SET_INT(rage::joaat(mpPrefix + "NO_BOUGHT_YUM_SNACKS"), 30, true); diff --git a/src/backend/commands/self/heal.cpp b/src/backend/commands/self/heal.cpp index 706bb8d4..674bc2e2 100644 --- a/src/backend/commands/self/heal.cpp +++ b/src/backend/commands/self/heal.cpp @@ -7,7 +7,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { ENTITY::SET_ENTITY_HEALTH(self::ped, PED::GET_PED_MAX_HEALTH(self::ped), 0); PED::SET_PED_ARMOUR(self::ped, PLAYER::GET_PLAYER_MAX_ARMOUR(self::id)); diff --git a/src/backend/commands/self/repair_vehicle.cpp b/src/backend/commands/self/repair_vehicle.cpp index 5c8e3e01..2e1dcb4b 100644 --- a/src/backend/commands/self/repair_vehicle.cpp +++ b/src/backend/commands/self/repair_vehicle.cpp @@ -7,7 +7,7 @@ namespace big class repairpv : command { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { vehicle::repair(self::veh); } diff --git a/src/backend/commands/self/request_services.cpp b/src/backend/commands/self/request_services.cpp index 0d97572a..35c0fdc3 100644 --- a/src/backend/commands/self/request_services.cpp +++ b/src/backend/commands/self/request_services.cpp @@ -8,7 +8,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { mobile::merry_weather::request_boat_pickup(); } @@ -18,7 +18,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { mobile::ceo_abilities::request_ballistic_armor(); } @@ -28,7 +28,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { mobile::services::request_avenger(); } @@ -38,7 +38,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { mobile::services::request_kosatka(); } @@ -48,7 +48,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { mobile::services::request_mobile_operations_center(); } @@ -58,7 +58,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { mobile::services::request_terrorbyte(); } @@ -68,7 +68,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { mobile::services::request_acidlab(); } @@ -78,7 +78,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { mobile::services::request_acidlab_bike(); } @@ -88,7 +88,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { mobile::mobile_misc::request_taxi(); } diff --git a/src/backend/commands/self/skip_cutscene.cpp b/src/backend/commands/self/skip_cutscene.cpp index f99585f1..05533bfb 100644 --- a/src/backend/commands/self/skip_cutscene.cpp +++ b/src/backend/commands/self/skip_cutscene.cpp @@ -7,7 +7,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { CUTSCENE::STOP_CUTSCENE_IMMEDIATELY(); } diff --git a/src/backend/commands/self/suicide.cpp b/src/backend/commands/self/suicide.cpp index 1da33024..fa05c109 100644 --- a/src/backend/commands/self/suicide.cpp +++ b/src/backend/commands/self/suicide.cpp @@ -7,7 +7,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { ENTITY::SET_ENTITY_HEALTH(self::ped, 0, 0); } diff --git a/src/backend/commands/session/wipe_session.cpp b/src/backend/commands/session/wipe_session.cpp index 7b5c2454..635c455b 100644 --- a/src/backend/commands/session/wipe_session.cpp +++ b/src/backend/commands/session/wipe_session.cpp @@ -8,7 +8,7 @@ namespace big class empty_session : command { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { g_player_service->iterate([](const player_entry& player) { auto mgr = *g_pointers->m_gta.m_network_player_mgr; diff --git a/src/backend/commands/spawn/spawn_vehicle.cpp b/src/backend/commands/spawn/spawn_vehicle.cpp index 99d5a6d1..28b0da76 100644 --- a/src/backend/commands/spawn/spawn_vehicle.cpp +++ b/src/backend/commands/spawn/spawn_vehicle.cpp @@ -6,59 +6,62 @@ namespace big { - class spawn_vehicle : command - { - using command::command; + class spawn_vehicle : command + { + using command::command; - virtual std::optional> parse_args(const std::vector& args, const std::shared_ptr ctx) - { - auto hash = rage::joaat(args[0]); - return std::vector{hash}; - } + virtual std::optional parse_args(const std::vector& args, const std::shared_ptr ctx) + { + command_arguments result(1); + result.push(rage::joaat(args[0])); - virtual CommandAccessLevel get_access_level() - { - return CommandAccessLevel::FRIENDLY; - } + return result; + } - virtual void execute(const std::vector& args, const std::shared_ptr ctx) - { - if (!STREAMING::IS_MODEL_IN_CDIMAGE(args[0]) || !STREAMING::IS_MODEL_A_VEHICLE(args[0])) - { - ctx->report_error("Specified model is invalid"); - return; - } + virtual CommandAccessLevel get_access_level() + { + return CommandAccessLevel::FRIENDLY; + } - const auto spawn_location = - vehicle::get_spawn_location(ctx->get_sender()->id() == self::id ? g.spawn_vehicle.spawn_inside : false, - args[0], - PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(ctx->get_sender()->id())); - const auto spawn_heading = ENTITY::GET_ENTITY_HEADING(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(ctx->get_sender()->id())); + virtual void execute(const command_arguments& args, const std::shared_ptr ctx) + { + const auto hash = args.get(0); + if (!STREAMING::IS_MODEL_IN_CDIMAGE(hash) || !STREAMING::IS_MODEL_A_VEHICLE(hash)) + { + ctx->report_error("Specified model is invalid"); + return; + } - const auto veh = vehicle::spawn(args[0], spawn_location, spawn_heading); + const auto spawn_location = + vehicle::get_spawn_location(ctx->get_sender()->id() == self::id ? g.spawn_vehicle.spawn_inside : false, + hash, + PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(ctx->get_sender()->id())); + const auto spawn_heading = ENTITY::GET_ENTITY_HEADING(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(ctx->get_sender()->id())); - if (veh == 0) - { - g_notification_service->push_error("Vehicle", "Unable to spawn vehicle"); - } - else - { - if (g.spawn_vehicle.spawn_maxed) - { - vehicle::max_vehicle(veh); - } + const auto veh = vehicle::spawn(hash, spawn_location, spawn_heading); - if (g.spawn_vehicle.spawn_inside && ctx->get_sender()->id() == self::id) - { - vehicle::teleport_into_vehicle(veh); - } - } - } - }; + if (veh == 0) + { + g_notification_service->push_error("Vehicle", "Unable to spawn vehicle"); + } + else + { + if (g.spawn_vehicle.spawn_maxed) + { + vehicle::max_vehicle(veh); + } - spawn_vehicle g_spawn_vehicle("spawn", "Spawn Vehicle", "Spawn a vehicle with the specified model", 1); - bool_command g_spawn_maxed("spawnmaxed", "Spawn Maxed", "Controls whether the vehicle spawned will have its mods maxed out", - g.spawn_vehicle.spawn_maxed); - bool_command g_spawn_inside("spawnin", "Spawn Inside", "Controls whether the player should be set inside the vehicle after it spawns", - g.spawn_vehicle.spawn_inside); + if (g.spawn_vehicle.spawn_inside && ctx->get_sender()->id() == self::id) + { + vehicle::teleport_into_vehicle(veh); + } + } + } + }; + + spawn_vehicle g_spawn_vehicle("spawn", "Spawn Vehicle", "Spawn a vehicle with the specified model", 1); + bool_command g_spawn_maxed("spawnmaxed", "Spawn Maxed", "Controls whether the vehicle spawned will have its mods maxed out", + g.spawn_vehicle.spawn_maxed); + bool_command g_spawn_inside("spawnin", "Spawn Inside", "Controls whether the player should be set inside the vehicle after it spawns", + g.spawn_vehicle.spawn_inside); } diff --git a/src/backend/commands/system/fast_quit.cpp b/src/backend/commands/system/fast_quit.cpp index cc43982d..411a3140 100644 --- a/src/backend/commands/system/fast_quit.cpp +++ b/src/backend/commands/system/fast_quit.cpp @@ -6,7 +6,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { exit(0); } diff --git a/src/backend/commands/teleport/bring_personal_vehicle.cpp b/src/backend/commands/teleport/bring_personal_vehicle.cpp index 45b53f1d..b601f2a3 100644 --- a/src/backend/commands/teleport/bring_personal_vehicle.cpp +++ b/src/backend/commands/teleport/bring_personal_vehicle.cpp @@ -9,7 +9,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { Vehicle veh = mobile::mechanic::get_personal_vehicle(); vehicle::bring(veh, self::pos); diff --git a/src/backend/commands/teleport/teleport_to_highlighted_blip.cpp b/src/backend/commands/teleport/teleport_to_highlighted_blip.cpp index 8f377f4e..b619b3c9 100644 --- a/src/backend/commands/teleport/teleport_to_highlighted_blip.cpp +++ b/src/backend/commands/teleport/teleport_to_highlighted_blip.cpp @@ -8,7 +8,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { teleport::to_highlighted_blip(); } diff --git a/src/backend/commands/teleport/teleport_to_last_vehicle.cpp b/src/backend/commands/teleport/teleport_to_last_vehicle.cpp index 7f717656..c0f80346 100644 --- a/src/backend/commands/teleport/teleport_to_last_vehicle.cpp +++ b/src/backend/commands/teleport/teleport_to_last_vehicle.cpp @@ -8,7 +8,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { if (g_local_player && g_local_player->m_vehicle) { diff --git a/src/backend/commands/teleport/teleport_to_objective.cpp b/src/backend/commands/teleport/teleport_to_objective.cpp index eabb1a98..6813c143 100644 --- a/src/backend/commands/teleport/teleport_to_objective.cpp +++ b/src/backend/commands/teleport/teleport_to_objective.cpp @@ -8,7 +8,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { teleport::to_objective(); } diff --git a/src/backend/commands/teleport/teleport_to_personal_vehicle.cpp b/src/backend/commands/teleport/teleport_to_personal_vehicle.cpp index 6a47d66b..5450301b 100644 --- a/src/backend/commands/teleport/teleport_to_personal_vehicle.cpp +++ b/src/backend/commands/teleport/teleport_to_personal_vehicle.cpp @@ -9,7 +9,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { Vehicle veh = mobile::mechanic::get_personal_vehicle(); teleport::into_vehicle(veh); diff --git a/src/backend/commands/teleport/teleport_to_waypoint.cpp b/src/backend/commands/teleport/teleport_to_waypoint.cpp index 5fd2cb22..4206e612 100644 --- a/src/backend/commands/teleport/teleport_to_waypoint.cpp +++ b/src/backend/commands/teleport/teleport_to_waypoint.cpp @@ -8,7 +8,7 @@ namespace big { using command::command; - virtual void execute(const std::vector&, const std::shared_ptr ctx) + virtual void execute(const command_arguments&, const std::shared_ptr ctx) { teleport::to_waypoint(); } diff --git a/src/backend/float_command.cpp b/src/backend/float_command.cpp new file mode 100644 index 00000000..c4a5786e --- /dev/null +++ b/src/backend/float_command.cpp @@ -0,0 +1,32 @@ +#include "float_command.hpp" + +namespace big +{ + float_command::float_command(const std::string& name, const std::string& label, const std::string& description, float& value, float lower_bound, float upper_bound) : + command(name, label, description, 1), + m_value(value), + m_lower_bound(lower_bound), + m_upper_bound(upper_bound) + { + } + + void float_command::execute(const command_arguments& args, const std::shared_ptr ctx) + { + m_value = args.get(0); + } + + std::optional float_command::parse_args(const std::vector& args, const std::shared_ptr ctx) + { + command_arguments result(1); + float value = std::atof(args[0].c_str()); + + if (value < m_lower_bound || value > m_upper_bound) + { + ctx->report_error(std::format("Value {} is not between {} and {} in command {}", value, m_lower_bound, m_upper_bound, m_name)); + return std::nullopt; + } + + result.push(value); + return result; + } +} \ No newline at end of file diff --git a/src/backend/float_command.hpp b/src/backend/float_command.hpp new file mode 100644 index 00000000..fc9f2f63 --- /dev/null +++ b/src/backend/float_command.hpp @@ -0,0 +1,31 @@ +#pragma once +#include "command.hpp" + +namespace big +{ + class float_command : public command + { + protected: + float& m_value; + const float m_lower_bound; + const float m_upper_bound; + + virtual void execute(const command_arguments& args, const std::shared_ptr ctx = std::make_shared()) override; + virtual std::optional parse_args(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) override; + + public: + float_command(const std::string& name, const std::string& label, const std::string& description, float& value, float lower_bound, float upper_bound); + inline float& get_value() + { + return m_value; + } + inline float get_lower_bound() + { + return m_lower_bound; + } + inline float get_upper_bound() + { + return m_upper_bound; + } + }; +} \ No newline at end of file diff --git a/src/backend/int_command.cpp b/src/backend/int_command.cpp index 55667d5b..4d0cc975 100644 --- a/src/backend/int_command.cpp +++ b/src/backend/int_command.cpp @@ -10,14 +10,14 @@ namespace big { } - void int_command::execute(const std::vector& args, const std::shared_ptr ctx) + void int_command::execute(const command_arguments& args, const std::shared_ptr ctx) { - m_value = args[0]; + m_value = args.get(0); } - std::optional> int_command::parse_args(const std::vector& args, const std::shared_ptr ctx) + std::optional int_command::parse_args(const std::vector& args, const std::shared_ptr ctx) { - std::vector result; + command_arguments result(1); int value = std::atoi(args[0].c_str()); if (value < m_lower_bound || value > m_upper_bound) @@ -26,7 +26,7 @@ namespace big return std::nullopt; } - result.push_back(value); + result.push(value); return result; } } \ No newline at end of file diff --git a/src/backend/int_command.hpp b/src/backend/int_command.hpp index 92ab4b91..5f6fe1c2 100644 --- a/src/backend/int_command.hpp +++ b/src/backend/int_command.hpp @@ -10,8 +10,8 @@ namespace big int m_lower_bound; int m_upper_bound; - virtual void execute(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) override; - virtual std::optional> parse_args(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) override; + virtual void execute(const command_arguments& args, const std::shared_ptr ctx = std::make_shared()) override; + virtual std::optional parse_args(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) override; public: int_command(const std::string& name, const std::string& label, const std::string& description, int& value, int lower_bound, int upper_bound); diff --git a/src/backend/looped/hud/hud_color_override.cpp b/src/backend/looped/hud/hud_color_override.cpp index 29aea4e9..b2f5137a 100644 --- a/src/backend/looped/hud/hud_color_override.cpp +++ b/src/backend/looped/hud/hud_color_override.cpp @@ -1,11 +1,11 @@ -#include "backend/looped_command.hpp" +#include "backend/bool_command.hpp" #include "natives.hpp" namespace big { - class hudcolor_looped : looped_command + class hudcolor : bool_command { - using looped_command::looped_command; + using bool_command::bool_command; virtual void on_enable() override { @@ -31,10 +31,6 @@ namespace big } } - virtual void on_tick() override - { - } - virtual void on_disable() override { for (int i = 0; i < hud_colors.size(); i++) @@ -45,5 +41,5 @@ namespace big } }; - hudcolor_looped g_hudcolor_looped("hudcolor", "Override HUD Color", "Override HUD colors", g.self.hud.color_override); + hudcolor g_hudcolor_looped("hudcolor", "Override HUD Color", "Override HUD colors", g.self.hud.color_override); } diff --git a/src/backend/looped/self/free_cam.cpp b/src/backend/looped/self/free_cam.cpp index 79775ae7..82a8d8e0 100644 --- a/src/backend/looped/self/free_cam.cpp +++ b/src/backend/looped/self/free_cam.cpp @@ -20,6 +20,11 @@ namespace big Vector3 position; Vector3 rotation; + inline bool can_update_location() + { + return !(g.cmd_executor.enabled || g.self.noclip); + } + virtual void on_enable() override { camera = CAM::CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", 0); @@ -44,24 +49,27 @@ namespace big Vector3 vecChange = {0.f, 0.f, 0.f}; - // Left Shift - if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_SPRINT)) - vecChange.z += speed / 2; - // Left Control - if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_DUCK)) - vecChange.z -= speed / 2; - // Forward - if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_MOVE_UP_ONLY)) - vecChange.y += speed; - // Backward - if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_MOVE_DOWN_ONLY)) - vecChange.y -= speed; - // Left - if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_MOVE_LEFT_ONLY)) - vecChange.x -= speed; - // Right - if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_MOVE_RIGHT_ONLY)) - vecChange.x += speed; + if (can_update_location()) + { + // Left Shift + if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_SPRINT)) + vecChange.z += speed / 2; + // Left Control + if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_DUCK)) + vecChange.z -= speed / 2; + // Forward + if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_MOVE_UP_ONLY)) + vecChange.y += speed; + // Backward + if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_MOVE_DOWN_ONLY)) + vecChange.y -= speed; + // Left + if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_MOVE_LEFT_ONLY)) + vecChange.x -= speed; + // Right + if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_MOVE_RIGHT_ONLY)) + vecChange.x += speed; + } if (vecChange.x == 0.f && vecChange.y == 0.f && vecChange.z == 0.f) mult = 0.f; diff --git a/src/backend/looped/self/noclip.cpp b/src/backend/looped/self/noclip.cpp index f9f59438..2fda4af1 100644 --- a/src/backend/looped/self/noclip.cpp +++ b/src/backend/looped/self/noclip.cpp @@ -19,6 +19,11 @@ namespace big Entity m_entity; float m_speed_multiplier; + inline bool can_update_location() + { + return !(g.cmd_executor.enabled || g.self.free_cam); + } + virtual void on_tick() override { if (g_orbital_drone_service.initialized()) @@ -41,24 +46,27 @@ namespace big Vector3 vel{}; - // Left Shift - if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_SPRINT)) - vel.z += speed / 2; - // Left Control - if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_DUCK)) - vel.z -= speed / 2; - // Forward - if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_MOVE_UP_ONLY)) - vel.y += speed; - // Backward - if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_MOVE_DOWN_ONLY)) - vel.y -= speed; - // Left - if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_MOVE_LEFT_ONLY)) - vel.x -= speed; - // Right - if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_MOVE_RIGHT_ONLY)) - vel.x += speed; + if (can_update_location()) + { + // Left Shift + if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_SPRINT)) + vel.z += speed / 2; + // Left Control + if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_DUCK)) + vel.z -= speed / 2; + // Forward + if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_MOVE_UP_ONLY)) + vel.y += speed; + // Backward + if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_MOVE_DOWN_ONLY)) + vel.y -= speed; + // Left + if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_MOVE_LEFT_ONLY)) + vel.x -= speed; + // Right + if (PAD::IS_DISABLED_CONTROL_PRESSED(0, (int)ControllerInputs::INPUT_MOVE_RIGHT_ONLY)) + vel.x += speed; + } auto rot = CAM::GET_GAMEPLAY_CAM_ROT(2); ENTITY::SET_ENTITY_ROTATION(ent, 0.f, rot.y, rot.z, 2, 0); diff --git a/src/backend/looped/vehicle/no_collision.cpp b/src/backend/looped/vehicle/no_collision.cpp index 9ce3260a..c052c440 100644 --- a/src/backend/looped/vehicle/no_collision.cpp +++ b/src/backend/looped/vehicle/no_collision.cpp @@ -1,23 +1,18 @@ -#include "backend/looped_command.hpp" +#include "backend/bool_command.hpp" #include "pointers.hpp" #include "util/vehicle.hpp" namespace big { - class veh_no_collision : looped_command + class veh_no_collision : bool_command { - using looped_command::looped_command; + using bool_command::bool_command; virtual void on_enable() override { vehicle::disable_collisions::m_patch->apply(); } - virtual void on_tick() override - { - - } - virtual void on_disable() override { vehicle::disable_collisions::m_patch->restore(); diff --git a/src/backend/looped/vehicle/unlimited_weapons.cpp b/src/backend/looped/vehicle/unlimited_weapons.cpp index 4c5cf5cd..8fbee0cf 100644 --- a/src/backend/looped/vehicle/unlimited_weapons.cpp +++ b/src/backend/looped/vehicle/unlimited_weapons.cpp @@ -1,4 +1,4 @@ -#include "backend/looped_command.hpp" +#include "backend/bool_command.hpp" #include "pointers.hpp" namespace big diff --git a/src/backend/looped/world/nearby/combative.cpp b/src/backend/looped/world/nearby/combative.cpp index 1659d024..e135066e 100644 --- a/src/backend/looped/world/nearby/combative.cpp +++ b/src/backend/looped/world/nearby/combative.cpp @@ -1,21 +1,17 @@ -#include "backend/looped_command.hpp" +#include "backend/bool_command.hpp" #include "natives.hpp" namespace big { - class combative : looped_command + class combative : bool_command { - using looped_command::looped_command; + using bool_command::bool_command; virtual void on_enable() override { MISC::SET_RIOT_MODE_ENABLED(true); } - virtual void on_tick() override - { - } - virtual void on_disable() override { MISC::SET_RIOT_MODE_ENABLED(false); diff --git a/src/backend/looped_command.cpp b/src/backend/looped_command.cpp index 845e18dd..dc1f5646 100644 --- a/src/backend/looped_command.cpp +++ b/src/backend/looped_command.cpp @@ -1,7 +1,5 @@ #include "looped_command.hpp" -#include "fiber_pool.hpp" - namespace big { looped_command::looped_command(const std::string& name, const std::string& label, const std::string& description, bool& toggle) : @@ -9,46 +7,4 @@ namespace big { g_looped_commands.push_back(this); } - - void looped_command::enable() - { - if (!m_toggle) - { - m_toggle = true; - m_last_enabled = true; - g_fiber_pool->queue_job([this] { - on_enable(); - }); - } - } - - void looped_command::disable() - { - if (m_toggle) - { - m_toggle = false; - m_last_enabled = false; - g_fiber_pool->queue_job([this] { - disable(); - }); - } - } - - void looped_command::refresh() - { - if (m_toggle && !m_last_enabled) - { - m_last_enabled = true; - g_fiber_pool->queue_job([this] { - on_enable(); - }); - } - else if (!m_toggle && m_last_enabled) - { - m_last_enabled = false; - g_fiber_pool->queue_job([this] { - on_disable(); - }); - } - } } \ No newline at end of file diff --git a/src/backend/looped_command.hpp b/src/backend/looped_command.hpp index e608471e..7f1ea739 100644 --- a/src/backend/looped_command.hpp +++ b/src/backend/looped_command.hpp @@ -5,18 +5,10 @@ namespace big { class looped_command : public bool_command { - bool m_last_enabled = false; - public: looped_command(const std::string& name, const std::string& label, const std::string& description, bool& toggle); - virtual void on_enable(){}; - virtual void on_disable(){}; virtual void on_tick() = 0; - - virtual void refresh() override; - virtual void enable() override; - virtual void disable() override; }; inline std::vector g_looped_commands; diff --git a/src/backend/player_command.cpp b/src/backend/player_command.cpp index ed11055a..76e58f2d 100644 --- a/src/backend/player_command.cpp +++ b/src/backend/player_command.cpp @@ -10,7 +10,7 @@ namespace big { } - void player_all_component::execute(const std::vector& args, const std::shared_ptr ctx) + void player_all_component::execute(const command_arguments& args, const std::shared_ptr ctx) { g_fiber_pool->queue_job([this, args, &ctx] { g_player_service->iterate([this, args, &ctx](const player_entry& player) { @@ -19,7 +19,7 @@ namespace big }); } - std::optional> player_all_component::parse_args(const std::vector& args, const std::shared_ptr ctx) + std::optional player_all_component::parse_args(const std::vector& args, const std::shared_ptr ctx) { return m_parent->parse_args_p(args, ctx); } @@ -31,16 +31,12 @@ namespace big m_all_component = std::make_unique(this, name, label, description, num_args); } - void player_command::execute(const std::vector& args, const std::shared_ptr ctx) + void player_command::execute(const command_arguments& args, const std::shared_ptr ctx) { g_fiber_pool->queue_job([this, args, ctx] { - std::vector new_args; + command_arguments new_args(m_num_args.value(), args); - // TODO: This looks ugly and inefficient - for (int i = 1; i < m_num_args; i++) - new_args.push_back(args[i]); - - if (g_player_service->get_self()->id() == args[0]) + if (g_player_service->get_self()->id() == args.get(0)) { execute(g_player_service->get_self(), new_args, ctx); return; @@ -48,25 +44,25 @@ namespace big for (auto& plyr : g_player_service->players()) { - if (plyr.second->id() == args[0]) + if (plyr.second->id() == args.get(0)) { execute(plyr.second, new_args, ctx); return; } } - ctx->report_error(std::format("Tried to execute command {}, but a player with index {} was not found", m_name, args[0])); + ctx->report_error(std::format("Tried to execute command {}, but a player with index {} was not found", m_name, args.get(0))); }); } - std::optional> player_command::parse_args(const std::vector& args, const std::shared_ptr ctx) + std::optional player_command::parse_args(const std::vector& args, const std::shared_ptr ctx) { std::vector new_args; - std::vector result; + command_arguments result(m_num_args.value()); if (args[0] == "me" || args[0] == "self") { - result.push_back(ctx->get_sender()->id()); + result.push(ctx->get_sender()->id()); } else { @@ -93,23 +89,26 @@ namespace big return std::nullopt; } - result.push_back(plyr_id); + result.push(plyr_id); } - for (int i = 1; i < args.size(); i++) - new_args.push_back(args[i]); + std::copy(++args.begin(), args.end(), new_args.begin()); + // for (int i = 1; i < args.size(); i++) + // new_args.push_back(args[i]); auto res = parse_args_p(new_args, ctx); + // no value indicates a failure if (!res.has_value()) return std::nullopt; - for (auto& p : res.value()) - result.push_back(p); + const auto alt_args = res.value(); + for (auto i = 0u; i < alt_args.size(); ++i) + result.push(alt_args.get(i)); return result; } - void player_command::call(player_ptr player, const std::vector& args, const std::shared_ptr ctx) + void player_command::call(player_ptr player, const command_arguments& args, const std::shared_ptr ctx) { // TODO: Code duplication if (m_num_args.has_value() && args.size() != (m_num_args.value() - 1)) diff --git a/src/backend/player_command.hpp b/src/backend/player_command.hpp index d066d3aa..ce3b2749 100644 --- a/src/backend/player_command.hpp +++ b/src/backend/player_command.hpp @@ -11,8 +11,8 @@ namespace big player_command* m_parent; protected: - virtual void execute(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) override; - virtual std::optional> parse_args(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) override; + virtual void execute(const command_arguments& args, const std::shared_ptr ctx = std::make_shared()) override; + virtual std::optional parse_args(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) override; public: player_all_component(player_command* parent, const std::string& name, const std::string& label, const std::string& description, std::optional num_args); @@ -24,16 +24,16 @@ namespace big std::unique_ptr m_all_component; protected: - virtual void execute(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) override; - virtual void execute(player_ptr player, const std::vector& args, const std::shared_ptr ctx = std::make_shared()) = 0; - virtual std::optional> parse_args(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) override; - virtual std::optional> parse_args_p(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) + virtual void execute(const command_arguments& args, const std::shared_ptr ctx = std::make_shared()) override; + virtual void execute(player_ptr player, const command_arguments& args, const std::shared_ptr ctx = std::make_shared()) = 0; + virtual std::optional parse_args(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) override; + virtual std::optional parse_args_p(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) { - return std::vector(); + return {0}; }; public: - void call(player_ptr player, const std::vector& args, const std::shared_ptr ctx = std::make_shared()); + void call(player_ptr player, const command_arguments& args, const std::shared_ptr ctx = std::make_shared()); player_command(const std::string& name, const std::string& label, const std::string& description, std::optional num_args, bool make_all_version = true); }; } \ No newline at end of file diff --git a/src/gui/components/components.hpp b/src/gui/components/components.hpp index 9a0c5eec..8bb1d604 100644 --- a/src/gui/components/components.hpp +++ b/src/gui/components/components.hpp @@ -1,5 +1,6 @@ #pragma once #include "backend/command.hpp" +#include "backend/float_command.hpp" #include "backend/int_command.hpp" #include "backend/looped_command.hpp" #include "backend/player_command.hpp" @@ -22,8 +23,8 @@ namespace big static void title(const std::string_view); static void nav_item(std::pair&, int); - static void input_text_with_hint(const std::string_view label, const std::string_view hint, char* buf, size_t buf_size, ImGuiInputTextFlags_ flag = ImGuiInputTextFlags_None, std::function cb = nullptr); - static void input_text_with_hint(const std::string_view label, const std::string_view hint, std::string* buf, ImGuiInputTextFlags_ flag = ImGuiInputTextFlags_None, std::function cb = nullptr); + static bool input_text_with_hint(const std::string_view label, const std::string_view hint, char* buf, size_t buf_size, ImGuiInputTextFlags_ flag = ImGuiInputTextFlags_None, std::function cb = nullptr); + static bool input_text_with_hint(const std::string_view label, const std::string_view hint, std::string& buf, ImGuiInputTextFlags_ flag = ImGuiInputTextFlags_None, std::function cb = nullptr); static void input_text(const std::string_view label, char* buf, size_t buf_size, ImGuiInputTextFlags_ flag = ImGuiInputTextFlags_None, std::function cb = nullptr); @@ -44,7 +45,10 @@ namespace big return ImGui::Text("INVALID COMMAND"); if (ImGui::Button(label_override.value_or(command->get_label()).data())) - command->call(args); + { + command_arguments _args(args); + command->call(_args); + } if (ImGui::IsItemHovered()) ImGui::SetTooltip(command->get_description().c_str()); } @@ -97,6 +101,22 @@ namespace big ImGui::SetTooltip(command->get_description().c_str()); } + template + static void command_float_slider(std::optional label_override = std::nullopt) + { + static float_command* command = (float_command*)command::get(rage::consteval_joaat(cmd_str.value)); + if (command == nullptr) + return ImGui::Text("INVALID COMMAND"); + + ImGui::SliderFloat(label_override.value_or(command->get_label()).data(), + &command->get_value(), + command->get_lower_bound(), + command->get_upper_bound()); + + if (ImGui::IsItemHovered()) + ImGui::SetTooltip(command->get_description().c_str()); + } + template static bool button(const std::string_view text) { diff --git a/src/gui/components/input_text_with_hint.cpp b/src/gui/components/input_text_with_hint.cpp index 985cfa84..d59eaece 100644 --- a/src/gui/components/input_text_with_hint.cpp +++ b/src/gui/components/input_text_with_hint.cpp @@ -5,27 +5,33 @@ namespace big { - void components::input_text_with_hint(const std::string_view label, const std::string_view hint, char* buf, size_t buf_size, ImGuiInputTextFlags_ flag, std::function cb) + bool components::input_text_with_hint(const std::string_view label, const std::string_view hint, char* buf, size_t buf_size, ImGuiInputTextFlags_ flag, std::function cb) { - if (ImGui::InputTextWithHint(label.data(), hint.data(), buf, buf_size, flag)) - if (cb) - g_fiber_pool->queue_job(std::move(cb)); + bool returned = false; + if (returned = ImGui::InputTextWithHint(label.data(), hint.data(), buf, buf_size, flag); returned && cb) + g_fiber_pool->queue_job(std::move(cb)); if (ImGui::IsItemActive()) + { g_fiber_pool->queue_job([] { PAD::DISABLE_ALL_CONTROL_ACTIONS(0); }); + } + return returned; } - void components::input_text_with_hint(const std::string_view label, const std::string_view hint, std::string* buf, ImGuiInputTextFlags_ flag, std::function cb) + bool components::input_text_with_hint(const std::string_view label, const std::string_view hint, std::string& buf, ImGuiInputTextFlags_ flag, std::function cb) { - if (ImGui::InputTextWithHint(label.data(), hint.data(), buf, flag)) - if (cb) - g_fiber_pool->queue_job(std::move(cb)); + bool returned = false; + if (returned = ImGui::InputTextWithHint(label.data(), hint.data(), &buf, flag); returned && cb) + g_fiber_pool->queue_job(std::move(cb)); if (ImGui::IsItemActive()) + { g_fiber_pool->queue_job([] { PAD::DISABLE_ALL_CONTROL_ACTIONS(0); }); + } + return returned; } } \ No newline at end of file diff --git a/src/lua/bindings/command.cpp b/src/lua/bindings/command.cpp index 34b67bff..0b611ff0 100644 --- a/src/lua/bindings/command.cpp +++ b/src/lua/bindings/command.cpp @@ -18,7 +18,7 @@ namespace lua::command // Call a menu command. static void call(const std::string& command_name, std::optional _args) { - const auto args = convert_sequence(_args.value_or(sol::table())); + big::command_arguments args = convert_sequence(_args.value_or(sol::table())); const auto command = big::command::get(rage::joaat(command_name)); diff --git a/src/services/context_menu/context_menu_service.cpp b/src/services/context_menu/context_menu_service.cpp index e771e004..71cbfe11 100644 --- a/src/services/context_menu/context_menu_service.cpp +++ b/src/services/context_menu/context_menu_service.cpp @@ -250,7 +250,7 @@ namespace big while (g_running) { if (g_gui->is_open() || HUD::IS_PAUSE_MENU_ACTIVE() - || (*g_pointers->m_gta.m_chat_data && (*g_pointers->m_gta.m_chat_data)->m_chat_open)) + || (*g_pointers->m_gta.m_chat_data && (*g_pointers->m_gta.m_chat_data)->m_chat_open) || g.cmd_executor.enabled) { script::get_current()->yield(); continue; diff --git a/src/services/hotkey/hotkey.cpp b/src/services/hotkey/hotkey.cpp index c6eb70d5..18da1227 100644 --- a/src/services/hotkey/hotkey.cpp +++ b/src/services/hotkey/hotkey.cpp @@ -21,7 +21,7 @@ namespace big if (m_cooldown.has_value()) m_wakeup = std::chrono::high_resolution_clock::now() + m_cooldown.value(); - command::get(m_command_hash)->call(std::vector()); + command::get(m_command_hash)->call({}); } rage::joaat_t hotkey::name_hash() const diff --git a/src/views/core/view_cmd_executor.cpp b/src/views/core/view_cmd_executor.cpp index 234ea27c..f297d9dc 100644 --- a/src/views/core/view_cmd_executor.cpp +++ b/src/views/core/view_cmd_executor.cpp @@ -20,7 +20,7 @@ namespace big if (ImGui::Begin("cmd_executor", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoMouseInputs)) { - static char command_buffer[255]; + static std::string command_buffer; ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, {10.f, 15.f}); components::sub_title("CMD_EXECUTOR_TITLE"_T); @@ -28,13 +28,14 @@ namespace big ImGui::SetKeyboardFocusHere(0); ImGui::SetNextItemWidth((screen_x * 0.5f) - 30.f); - components::input_text_with_hint("", "CMD_EXECUTOR_TYPE_CMD"_T, command_buffer, sizeof(command_buffer), ImGuiInputTextFlags_EnterReturnsTrue, [] { + if (components::input_text_with_hint("", "CMD_EXECUTOR_TYPE_CMD"_T, command_buffer, ImGuiInputTextFlags_EnterReturnsTrue)) + { if (command::process(command_buffer, std::make_shared(), true)) { g.cmd_executor.enabled = false; - command_buffer[0] = 0; + command_buffer = {}; } - }); + } components::small_text("CMD_EXECUTOR_MULTIPLE_CMDS"_T); ImGui::Spacing(); diff --git a/src/views/debug/view_debug_animations.cpp b/src/views/debug/view_debug_animations.cpp index 37d22cb5..74f221a3 100644 --- a/src/views/debug/view_debug_animations.cpp +++ b/src/views/debug/view_debug_animations.cpp @@ -28,7 +28,7 @@ namespace big }); ImGui::SetNextItemWidth(400); - components::input_text_with_hint("##dictionaryfilter", "Dictionary", ¤t_dict); + components::input_text_with_hint("##dictionaryfilter", "Dictionary", current_dict); if (animations::has_anim_list_been_populated() && ImGui::BeginListBox("##dictionaries", ImVec2(400, 200))) { diff --git a/src/views/self/view_custom_teleport.cpp b/src/views/self/view_custom_teleport.cpp index 52986246..4a658252 100644 --- a/src/views/self/view_custom_teleport.cpp +++ b/src/views/self/view_custom_teleport.cpp @@ -70,8 +70,8 @@ namespace big } ImGui::PushItemWidth(300); - components::input_text_with_hint("Category", "Category", &category); - components::input_text_with_hint("Location name", "New location", &new_location_name); + components::input_text_with_hint("Category", "Category", category); + components::input_text_with_hint("Location name", "New location", new_location_name); ImGui::PopItemWidth(); components::button("Save current location", [] { @@ -140,7 +140,7 @@ namespace big components::small_text("Double click to teleport\nShift click to delete"); ImGui::Spacing(); - components::input_text_with_hint("##filter", "Search", &filter); + components::input_text_with_hint("##filter", "Search", filter); ImGui::BeginGroup(); components::small_text("Categories"); diff --git a/src/views/self/view_weapons.cpp b/src/views/self/view_weapons.cpp index 2613c8ac..cc3e989e 100644 --- a/src/views/self/view_weapons.cpp +++ b/src/views/self/view_weapons.cpp @@ -296,7 +296,7 @@ namespace big ImGui::SameLine(); ImGui::BeginGroup(); static std::string input_file_name; - components::input_text_with_hint("Weapon Loadout Filename", "Loadout Name", &input_file_name); + components::input_text_with_hint("Weapon Loadout Filename", "Loadout Name", input_file_name); components::button("Save Loadout", [] { persist_weapons::save_weapons(input_file_name); input_file_name.clear(); diff --git a/src/views/view_vehicle_control.cpp b/src/views/view_vehicle_control.cpp index bb0c82fa..db264157 100644 --- a/src/views/view_vehicle_control.cpp +++ b/src/views/view_vehicle_control.cpp @@ -1,3 +1,5 @@ +#include "backend/bool_command.hpp" +#include "backend/float_command.hpp" #include "gta_util.hpp" #include "gui.hpp" #include "pointers.hpp" @@ -313,31 +315,18 @@ namespace big } } + bool_command use_animations("vehcontroluseanims", "Use animations", "Will use animations for several vehicle operations such as:\ntoggling lights, opening/closing doors and entering seats", + g.window.vehicle_control.operation_animation); + bool_command render_veh_dist("vehcontrolrendervehdist", "Render distance on vehicle", "Will display the distance on the controlled vehicle", + g.window.vehicle_control.render_distance_on_veh); + float_command max_summon_dist("vehcontrolmaxsummondist", "Max summon distance", "At what range the vehicle will drive towards the summoned location as oposed to being teleported", + g.window.vehicle_control.max_summon_range, 10.f, 250.f); + void render_settings_tab() { - ImGui::Checkbox("Use animations", &g.window.vehicle_control.operation_animation); - if (ImGui::IsItemHovered()) - { - ImGui::BeginTooltip(); - ImGui::Text("Will use animations for several vehicle operations such as:\ntoggling lights, opening/closing doors and entering seats"); - ImGui::EndTooltip(); - } - - ImGui::Checkbox("Render distance on vehicle", &g.window.vehicle_control.render_distance_on_veh); - if (ImGui::IsItemHovered()) - { - ImGui::BeginTooltip(); - ImGui::Text("Will display the distance on the controlled vehicle"); - ImGui::EndTooltip(); - } - - ImGui::SliderFloat("Max summon distance", &g.window.vehicle_control.max_summon_range, 10.f, 250.f); - if (ImGui::IsItemHovered()) - { - ImGui::BeginTooltip(); - ImGui::Text("At what range the vehicle will drive towards the summoned location as oposed to being teleported"); - ImGui::EndTooltip(); - } + components::command_checkbox<"vehcontroluseanims">(); + components::command_checkbox<"vehcontrolrendervehdist">(); + components::command_float_slider<"vehcontrolmaxsummondist">(); } void view::vehicle_control() diff --git a/src/views/world/view_squad_spawner.cpp b/src/views/world/view_squad_spawner.cpp index b5d471a3..b0b5b0bd 100644 --- a/src/views/world/view_squad_spawner.cpp +++ b/src/views/world/view_squad_spawner.cpp @@ -113,8 +113,8 @@ namespace big ImGui::PushItemWidth(250); - components::input_text_with_hint("##name", "Name", &new_template.m_name); - components::input_text_with_hint("##pedmodel", "Ped model", &new_template.m_ped_model); + components::input_text_with_hint("##name", "Name", new_template.m_name); + components::input_text_with_hint("##pedmodel", "Ped model", new_template.m_ped_model); auto ped_found = std::find_if(g_gta_data_service->peds().begin(), g_gta_data_service->peds().end(), [=](const auto& pair) { return pair.second.m_name == new_template.m_ped_model; @@ -140,7 +140,7 @@ namespace big } } - components::input_text_with_hint("##vehmodel", "Vehicle model", &new_template.m_vehicle_model); + components::input_text_with_hint("##vehmodel", "Vehicle model", new_template.m_vehicle_model); if (ImGui::IsItemHovered()) ImGui::SetTooltip("Leave empty to spawn on foot"); @@ -168,7 +168,7 @@ namespace big } } - components::input_text_with_hint("##weapmodel", "Weapon model", &new_template.m_weapon_model); + components::input_text_with_hint("##weapmodel", "Weapon model", new_template.m_weapon_model); if (ImGui::IsItemHovered()) ImGui::SetTooltip("Leave empty to spawn unarmed, beware that a player can only attain 3 melee attackers at a time"); @@ -325,7 +325,7 @@ namespace big ImGui::PopItemWidth(); ImGui::EndGroup(); - components::input_text_with_hint("##new_template.m_description", "Description", &new_template.m_description); + components::input_text_with_hint("##new_template.m_description", "Description", new_template.m_description); ImGui::TreePop(); }