diff --git a/src/backend/backend.cpp b/src/backend/backend.cpp index f5c94a7b..a62a10bf 100644 --- a/src/backend/backend.cpp +++ b/src/backend/backend.cpp @@ -72,6 +72,7 @@ namespace big looped::weapons_steal_vehicle_gun(); looped::weapons_vehicle_gun(); looped::weapons_c4_limit(); + looped::weapons_do_persist_weapons(); script::get_current()->yield(); } diff --git a/src/backend/looped/looped.hpp b/src/backend/looped/looped.hpp index 7b192074..be9a50d7 100644 --- a/src/backend/looped/looped.hpp +++ b/src/backend/looped/looped.hpp @@ -54,6 +54,7 @@ namespace big static void weapons_steal_vehicle_gun(); static void weapons_vehicle_gun(); static void weapons_c4_limit(); + static void weapons_do_persist_weapons(); static void drive_train(); static void derail_train(); diff --git a/src/backend/looped/weapons/do_persist_weapons.cpp b/src/backend/looped/weapons/do_persist_weapons.cpp new file mode 100644 index 00000000..4657b3bf --- /dev/null +++ b/src/backend/looped/weapons/do_persist_weapons.cpp @@ -0,0 +1,21 @@ +#include "backend/looped/looped.hpp" +#include "services/persist_weapons/persist_weapons.hpp" + +namespace big +{ + static auto last_time = std::chrono::steady_clock::now(); + + void looped::weapons_do_persist_weapons() + { + const auto time_now = std::chrono::steady_clock::now(); + + const auto elapsed_time_in_ms = std::chrono::duration_cast(time_now - last_time).count(); + + if (elapsed_time_in_ms >= 500) + { + last_time = time_now; + + persist_weapons::check_player_has_weapons(); + } + } +} diff --git a/src/core/settings.hpp b/src/core/settings.hpp index 951c7170..e5328d85 100644 --- a/src/core/settings.hpp +++ b/src/core/settings.hpp @@ -917,7 +917,15 @@ namespace big NLOHMANN_DEFINE_TYPE_INTRUSIVE(lua, enable_auto_reload_changed_scripts) } lua{}; - NLOHMANN_DEFINE_TYPE_INTRUSIVE(menu_settings, debug, tunables, notifications, player, player_db, protections, self, session, settings, spawn_vehicle, clone_pv, spoofing, vehicle, weapons, window, context_menu, esp, session_browser, ugc, reactions, world, stat_editor, lua) + struct persist_weapons + { + bool enabled = false; + std::string weapon_loadout_file; + + NLOHMANN_DEFINE_TYPE_INTRUSIVE(persist_weapons, enabled, weapon_loadout_file) + } persist_weapons{}; + + NLOHMANN_DEFINE_TYPE_INTRUSIVE(menu_settings, debug, tunables, notifications, player, player_db, protections, self, session, settings, spawn_vehicle, clone_pv, spoofing, vehicle, weapons, window, context_menu, esp, session_browser, ugc, reactions, world, stat_editor, lua, persist_weapons) }; inline auto g = menu_settings(); diff --git a/src/gta/vehicle_values.hpp b/src/gta/vehicle_values.hpp index 5f27df1f..3ba418a2 100644 --- a/src/gta/vehicle_values.hpp +++ b/src/gta/vehicle_values.hpp @@ -849,7 +849,7 @@ static bool GetVehicleInfoForClanLogo(Hash vehicleModel, rage::fvector3& x, rage z = {-1.0f, 0.0f, 0.0f}; scale = 0.2f; return true; - case VEHICLE_BULLETGT: + case VEHICLE_BULLET: x = {-1.57f, 0.07f, 0.16f}; y = {1.0f, 0.0f, 0.0f}; z = {0.0f, -1.0f, 0.0f}; @@ -1195,7 +1195,7 @@ static bool GetVehicleInfoForClanLogo(Hash vehicleModel, rage::fvector3& x, rage x = {0.0f, 1.43f, 1.0f}; y = {0.0f, 0.0f, -1.0f}; z = {-1.0f, 0.0f, 0.0f}; - scale = 0.515f; + scale = 0.425f; return true; case VEHICLE_PRAIRIE: x = {0.0f, 1.41f, 1.0f}; @@ -1330,7 +1330,7 @@ static bool GetVehicleInfoForClanLogo(Hash vehicleModel, rage::fvector3& x, rage scale = 0.5f; return true; case VEHICLE_SENTINEL: - x = {0.0f, 1.52f, 1.0f}; + x = {0.0f, 1.18f, 1.0f}; y = {0.0f, 0.0f, -1.0f}; z = {-1.0f, 0.0f, 0.0f}; scale = 0.5f; @@ -1516,9 +1516,9 @@ static bool GetVehicleInfoForClanLogo(Hash vehicleModel, rage::fvector3& x, rage scale = 0.4f; return true; case VEHICLE_ZENTORNO: - x = {-1.24f, 0.42f, -0.14f}; + x = {-1.24f, 0.3f, -0.07f}; y = {1.0f, 0.0f, 0.0f}; - z = {0.0f, -1.0f, 0.035f}; + z = {0.0f, -1.0f, 0.0f}; scale = 0.3f; return true; case VEHICLE_JESTER: @@ -1691,10 +1691,10 @@ static bool GetVehicleInfoForClanLogo(Hash vehicleModel, rage::fvector3& x, rage scale = 0.09f; return true; case VEHICLE_FELTZER3: - x = {0.0f, 1.4f, 1.0f}; - y = {0.0f, 0.0f, -1.0f}; - z = {-1.0f, 0.0f, 0.0f}; - scale = 0.5f; + x = {0.0f, 1.597f, 1.0f}; + y = {0.0f, 0.0f, -1.0f}; + z = {-1.0f, 0.0f, 0.0f}; + scale = 0.45f; return true; case VEHICLE_OSIRIS: x = {-1.0f, 0.27f, -0.03f}; @@ -2375,6 +2375,7 @@ static bool GetVehicleInfoForClanLogo(Hash vehicleModel, rage::fvector3& x, rage scale = 0.18f; return true; case VEHICLE_AVENGER: + case VEHICLE_AVENGER3: x = {-2.02f, 6.45f, -0.716f}; y = {1.0f, 0.0f, 0.0f}; z = {0.0f, -1.0f, 0.0f}; @@ -3028,112 +3029,532 @@ static bool GetVehicleInfoForClanLogo(Hash vehicleModel, rage::fvector3& x, rage return true; case VEHICLE_GAUNTLET5: x = {-1.5f, 0.379f, 0.297f}; - y = {1.f, 0.f, 0.f}; - z = {0.f, -1.f, 0.f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; scale = 0.24f; return true; case VEHICLE_DUKES3: - x = {-1.f, 0.f, 0.f}; - y = {1.f, 0.f, 0.f}; - z = {0.f, -1.f, 0.f}; + x = {-1.0f, 0.0f, 0.0f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; scale = 0.375f; return true; case VEHICLE_MANANA2: x = {-1.76f, 0.105f, 0.009f}; - y = {1.f, 0.f, 0.f}; - z = {0.f, -1.f, 0.f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; scale = 0.22f; return true; case VEHICLE_CLUB: - x = {0.f, 1.252f, 1.f}; - y = {0.f, 0.f, -1.f}; - z = {-1.f, 0.f, 0.f}; + x = {0.0f, 1.252f, 1.0f}; + y = {0.0f, 0.0f, -1.0f}; + z = {-1.0f, 0.0f, 0.0f}; scale = 0.31f; return true; case VEHICLE_GLENDALE2: - x = {0.f, 2.135f, 1.f}; - y = {0.f, 0.f, -1.f}; - z = {-1.f, 0.f, 0.f}; + x = {0.0f, 2.135f, 1.0f}; + y = {0.0f, 0.0f, -1.0f}; + z = {-1.0f, 0.0f, 0.0f}; scale = 0.205f; return true; case VEHICLE_YOUGA3: - x = {0.f, 2.352f, 0.3f}; - y = {0.f, -1.f, -0.256f}; - z = {-1.f, 0.f, 0.f}; + x = {0.0f, 2.352f, 0.3f}; + y = {0.0f, -1.0f, -0.256f}; + z = {-1.0f, 0.0f, 0.0f}; scale = 0.135f; return true; case VEHICLE_YOSEMITE3: - x = {-1.f, 0.252f, 0.203f}; - y = {1.f, 0.f, 0.f}; - z = {0.f, -1.f, 0.f}; + x = {-1.0f, 0.252f, 0.203f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; scale = 0.21f; return true; case VEHICLE_SEMINOLE2: - x = {0.f, 1.654f, 1.f}; - y = {0.f, 0.f, -1.f}; - z = {-1.f, 0.f, 0.f}; + x = {0.0f, 1.654f, 1.0f}; + y = {0.0f, 0.0f, -1.0f}; + z = {-1.0f, 0.0f, 0.0f}; scale = 0.25f; return true; case VEHICLE_PENUMBRA2: x = {-1.08f, 0.28f, -0.093f}; - y = {1.f, 0.f, 0.f}; - z = {0.f, -1.f, 0.f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; scale = 0.4f; return true; case VEHICLE_LANDSTALKER2: - x = {-1.64f, 0.7f, 0.f}; - y = {1.f, 0.f, 0.f}; - z = {0.f, -1.f, 0.f}; + x = {-1.64f, 0.7f, 0.0f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; scale = 0.35f; return true; case VEHICLE_COQUETTE4: - x = {-1.f, -0.021f, 0.273f}; - y = {1.f, 0.f, 0.f}; - z = {0.f, -1.f, 0.f}; + x = {-1.0f, -0.021f, 0.273f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; scale = 0.25f; return true; case VEHICLE_TIGON: - x = {-1.f, 0.156f, 0.099f}; - y = {1.f, 0.f, 0.f}; - z = {0.f, -1.f, 0.f}; + x = {-1.0f, 0.156f, 0.099f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; scale = 0.3f; return true; case VEHICLE_PEYOTE3: x = {-1.5f, -0.36f, 0.2125f}; - y = {1.f, 0.f, 0.f}; - z = {0.f, -1.f, 0.f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; scale = 0.35f; return true; case VEHICLE_BRIOSO2: - x = {-1.f, 0.275f, 0.215f}; - y = {1.f, 0.f, 0.f}; - z = {0.f, -1.f, 0.f}; + x = {-1.0f, 0.275f, 0.215f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; scale = 0.3f; return true; case VEHICLE_SLAMTRUCK: - x = {-1.f, 1.454f, 0.485f}; - y = {1.f, 0.f, 0.f}; - z = {0.f, -1.f, 0.f}; + x = {-1.0f, 1.454f, 0.485f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; scale = 0.3f; return true; case VEHICLE_ITALIRSX: - x = {-1.f, 0.109f, 0.129f}; - y = {1.f, 0.f, 0.f}; - z = {0.f, -1.f, 0.f}; + x = {-1.0f, 0.109f, 0.129f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; scale = 0.3f; return true; case VEHICLE_TOREADOR: - x = {-1.f, 0.194f, 0.342f}; - y = {1.f, 0.f, 0.f}; - z = {0.f, -1.f, 0.f}; + x = {-1.0f, 0.194f, 0.342f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; scale = 0.15f; return true; case VEHICLE_WEEVIL: - x = {-1.f, 0.111f, 0.168f}; - y = {1.f, 0.f, 0.f}; - z = {0.f, -1.f, 0.f}; + x = {-1.0f, 0.111f, 0.168f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; scale = 0.3f; return true; + case VEHICLE_ZR350: + x = {0.0f, 1.632f, 1.0f}; + y = {0.0f, 0.0f, -1.0f}; + z = {-1.0f, 0.0f, 0.0f}; + scale = 0.19f; + return true; + case VEHICLE_CALICO: + x = {-1.0f, 0.497f, 0.212f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.3f; + return true; + case VEHICLE_JESTER4: + x = {-1.0f, 0.0f, 0.181f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_COMET6: + x = {-1.0f, 0.205f, 0.074f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_WARRENER2: + x = {-1.0f, 0.408f, 0.295f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_REMUS: + x = {-1.0f, 0.204f, 0.357f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_VECTRE: + x = {-1.0f, 0.249f, 0.164f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_DOMINATOR7: + x = {-1.0f, 0.253f, 0.142f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.3f; + return true; + case VEHICLE_CYPHER: + x = {-1.0f, 0.223f, 0.185f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.4f; + return true; + case VEHICLE_RT3000: + x = {-1.0f, 0.0f, 0.189f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_SULTAN3: + x = {-1.0f, 0.42f, 0.309f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.23f; + return true; + case VEHICLE_TAILGATER2: + x = {-1.0f, 0.337f, 0.283f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_PREVION: + x = {-1.0f, 0.14f, -0.155f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_DOMINATOR8: + x = {-1.0f, 0.153f, -0.006f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_FUTO2: + x = {-1.0f, 0.318f, -0.013f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_EUROS: + x = {-1.0f, 0.101f, 0.187f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_GROWLER: + x = {-1.0f, 0.151f, 0.149f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_CINQUEMILA: + x = {-1.0f, 0.533f, 0.197f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.4f; + return true; + case VEHICLE_CHAMPION: + x = {-1.0f, 0.076f, 0.122f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.4f; + return true; + case VEHICLE_GRANGER2: + x = {-1.0f, 0.461f, 0.264f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_DEITY: + x = {-1.0f, 0.279f, 0.235f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_BUFFALO4: + x = {-1.0f, 0.251f, 0.149f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_BALLER7: + x = {-1.194f, 0.182f, 0.0f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_ZENO: + x = {-1.194f, 0.409f, 0.199f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.22f; + return true; + case VEHICLE_COMET7: + x = {-1.0f, 0.05f, 0.187f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_ASTRON: + x = {-1.0f, 0.249f, 0.39f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_PATRIOT3: + x = {-1.2f, 0.474f, 0.335f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.23f; + return true; + case VEHICLE_JUBILEE: + x = {-1.037f, 0.438f, 0.31f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.3f; + return true; + case VEHICLE_SHINOBI: + x = {0.0f, 0.306f, 1.0f}; + y = {0.0f, 0.0f, -1.0f}; + z = {-1.0f, 0.0f, 0.0f}; + scale = 0.045f; + return true; + case VEHICLE_REEVER: + x = {-1.0f, 0.292f, 0.29f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.1f; + return true; + case VEHICLE_IWAGEN: + x = {-1.0f, 0.387f, 0.209f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.3f; + return true; + case VEHICLE_BRIOSO3: + x = {-1.0f, 0.15f, 0.2f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.4f; + return true; + case VEHICLE_CORSITA: + x = {-1.0f, 0.1f, 0.22f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.3f; + return true; + case VEHICLE_GREENWOOD: + x = {-1.0f, 0.2f, 0.138f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.3f; + return true; + case VEHICLE_KANJOSJ: + x = {-1.0f, 0.1f, 0.26f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.4f; + return true; + case VEHICLE_POSTLUDE: + x = {-1.0f, 0.0f, 0.28f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.3f; + return true; + case VEHICLE_RHINEHART: + x = {0.0f, 1.317f, 1.0f}; + y = {0.0f, 0.0f, -1.0f}; + z = {-1.0f, 0.0f, 0.0f}; + scale = 0.33f; + return true; + case VEHICLE_TENF: + x = {-1.0f, 0.74f, 0.19f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.28f; + return true; + case VEHICLE_TENF2: + x = {-1.0f, 0.74f, 0.19f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.28f; + return true; + case VEHICLE_TORERO2: + x = {-1.0f, 0.0f, 0.22f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.3f; + return true; + case VEHICLE_VIGERO2: + x = {-1.0f, -0.07f, 0.3f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.4f; + return true; + case VEHICLE_WEEVIL2: + x = {-1.0f, 0.07f, 0.13f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.45f; + return true; + case VEHICLE_DRAUGUR: + x = {-1.0f, 0.5f, 0.48f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_RUINER4: + x = {-1.0f, 0.5f, 0.182f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.28f; + return true; + case VEHICLE_SENTINEL4: + x = {-1.0f, 0.147f, 0.239f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.4f; + return true; + case VEHICLE_SM722: + x = {-1.0f, -0.4f, 0.18f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_OMNISEGT: + x = {0.0f, 1.462f, 1.0f}; + y = {0.0f, 0.0f, -1.0f}; + z = {-1.0f, 0.0f, 0.0f}; + scale = 0.29f; + return true; + case VEHICLE_POWERSURGE: + x = {-1.0f, 0.3f, 0.37f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.1f; + return true; + case VEHICLE_ENTITY3: + x = {-1.0f, 0.5f, 0.225f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.25f; + return true; + case VEHICLE_MANCHEZ3: + x = {-1.0f, 0.066f, 0.329f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.1f; + return true; + case VEHICLE_SURFER3: + x = {-1.0f, 1.19f, 0.18f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.4f; + return true; + case VEHICLE_BOOR: + x = {-1.0f, 0.25f, 0.4f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.4f; + return true; + case VEHICLE_ENDORA: + x = {0.0f, 1.623f, 1.0f}; + y = {0.0f, 0.0f, -1.0f}; + z = {-1.0f, 0.0f, 0.0f}; + scale = 0.7f; + return true; + case VEHICLE_TULIP2: + x = {-1.0f, 0.0f, 0.22f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_R300: + x = {-1.0f, 0.0f, 0.22f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_VIRTUE: + x = {-1.0f, 0.0f, 0.22f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_ISSI8: + x = {-1.0f, 0.3f, 0.0f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_BROADWAY: + x = {-1.0f, -0.4f, 0.375f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_PANTHERE: + x = {-1.0f, 0.069f, 0.13f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.3f; + return true; + case VEHICLE_TAHOMA: + x = {-1.0f, -0.253f, 0.39f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_EVERON2: + x = {-1.0f, 0.101f, 0.227f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.6f; + return true; + case VEHICLE_L35: + x = {-1.0f, 0.2f, 0.43f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.3f; + return true; + case VEHICLE_BRIGHAM: + x = {-0.003f, 2.764f, 1.0f}; + y = {0.0f, 0.0f, -1.0f}; + z = {-1.0f, 0.0f, 0.0f}; + scale = 0.25f; + return true; + case VEHICLE_GAUNTLET6: + x = {-1.5f, 0.4f, 0.1f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.24f; + return true; + case VEHICLE_STINGERTT: + x = {0.0f, 1.623f, 1.0f}; + y = {0.0f, 0.0f, -1.0f}; + z = {-1.0f, 0.0f, 0.0f}; + scale = 0.25f; + return true; + case VEHICLE_BUFFALO5: + x = {0.0f, 1.5f, 1.0f}; + y = {0.0f, 0.0f, -1.0f}; + z = {-1.0f, 0.0f, 0.0f}; + scale = 0.3f; + return true; + case VEHICLE_RATEL: + x = {-1.0f, 0.128f, 0.212f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.42f; + return true; + case VEHICLE_CLIQUE2: + x = {-1.0f, 0.088f, 0.438f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.28f; + return true; + case VEHICLE_COUREUR: + x = {-1.0f, 0.0f, 0.295f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.35f; + return true; + case VEHICLE_MONSTROCITI: + x = {-1.0f, 0.0f, 0.295f}; + y = {1.0f, 0.0f, 0.0f}; + z = {0.0f, -1.0f, 0.0f}; + scale = 0.5f; + return true; default: return false; } } \ No newline at end of file diff --git a/src/gta/vehicles.hpp b/src/gta/vehicles.hpp index b6167de8..309c4d01 100644 --- a/src/gta/vehicles.hpp +++ b/src/gta/vehicles.hpp @@ -550,7 +550,7 @@ enum Super : Hash VEHICLE_ADDER = RAGE_JOAAT("ADDER"), VEHICLE_AUTARCH = RAGE_JOAAT("AUTARCH"), VEHICLE_BANSHEE2 = RAGE_JOAAT("BANSHEE2"), - VEHICLE_BULLETGT = RAGE_JOAAT("BULLET"), + VEHICLE_BULLET = RAGE_JOAAT("BULLET"), VEHICLE_CHEETAH = RAGE_JOAAT("CHEETAH"), VEHICLE_CYCLONE = RAGE_JOAAT("CYCLONE"), VEHICLE_ENTITYXF = RAGE_JOAAT("ENTITYXF"), @@ -678,7 +678,6 @@ enum Vans : Hash VEHICLE_RUMPO3 = RAGE_JOAAT("RUMPO3"), VEHICLE_SPEEDO = RAGE_JOAAT("SPEEDO"), VEHICLE_SPEEDO2 = RAGE_JOAAT("SPEEDO2"), - VEHICLE_SPEEDO4 = RAGE_JOAAT("SPEEDO4"), VEHICLE_SURFER = RAGE_JOAAT("SURFER"), VEHICLE_SURFER2 = RAGE_JOAAT("SURFER2"), VEHICLE_TACO = RAGE_JOAAT("TACO"), @@ -901,7 +900,7 @@ enum DrugWars : Hash VEHICLE_CARGOPLANE2 = RAGE_JOAAT("cargoplane2"), VEHICLE_ENTITY3 = RAGE_JOAAT("entity3"), VEHICLE_ENDORA = RAGE_JOAAT("eudora"), - VEHICLE_EVERSON2 = RAGE_JOAAT("everon2"), + VEHICLE_EVERON2 = RAGE_JOAAT("everon2"), VEHICLE_ISSI8 = RAGE_JOAAT("issi8"), VEHICLE_JOURNEY2 = RAGE_JOAAT("journey2"), VEHICLE_MANCHEZ3 = RAGE_JOAAT("manchez3"), @@ -913,3 +912,24 @@ enum DrugWars : Hash VEHICLE_TULIP2 = RAGE_JOAAT("tulip2"), VEHICLE_VIRTUE = RAGE_JOAAT("virtue") }; + +enum SanAndreasMercenaries : Hash +{ + VEHICLE_AVENGER3 = RAGE_JOAAT("avenger3"), + VEHICLE_AVENGER4 = RAGE_JOAAT("avenger4"), + VEHICLE_BRIGHAM = RAGE_JOAAT("brigham"), + VEHICLE_BUFFALO5 = RAGE_JOAAT("buffalo5"), + VEHICLE_CLIQUE2 = RAGE_JOAAT("clique2"), + VEHICLE_CONADA2 = RAGE_JOAAT("conada2"), + VEHICLE_COUREUR = RAGE_JOAAT("coureur"), + VEHICLE_GAUNTLET6 = RAGE_JOAAT("gauntlet6"), + VEHICLE_INDUCTOR = RAGE_JOAAT("inductor"), + VEHICLE_INDUCTOR2 = RAGE_JOAAT("inductor2"), + VEHICLE_L35 = RAGE_JOAAT("l35"), + VEHICLE_MONSTROCITI = RAGE_JOAAT("monstrociti"), + VEHICLE_RAIJU = RAGE_JOAAT("raiju"), + VEHICLE_RATEL = RAGE_JOAAT("ratel"), + VEHICLE_SPEEDO4 = RAGE_JOAAT("speedo4"), + VEHICLE_STINGERTT = RAGE_JOAAT("stingertt"), + VEHICLE_STREAMER216 = RAGE_JOAAT("streamer216") +}; \ No newline at end of file diff --git a/src/gta/weapons.hpp b/src/gta/weapons.hpp index 964916e9..7c5cffe7 100644 --- a/src/gta/weapons.hpp +++ b/src/gta/weapons.hpp @@ -3,203 +3,9 @@ #include "gta/joaat.hpp" #include "natives.hpp" -enum WeaponHashes : Hash +enum Weapons : Hash { - WEAPON_ADVANCEDRIFLE = RAGE_JOAAT("WEAPON_ADVANCEDRIFLE"), - WEAPON_APPISTOL = RAGE_JOAAT("WEAPON_APPISTOL"), - WEAPON_ASSAULTRIFLE = RAGE_JOAAT("WEAPON_ASSAULTRIFLE"), - WEAPON_ASSAULTRIFLE_MK2 = RAGE_JOAAT("WEAPON_ASSAULTRIFLE_MK2"), - WEAPON_ASSAULTSHOTGUN = RAGE_JOAAT("WEAPON_ASSAULTSHOTGUN"), - WEAPON_ASSAULTSMG = RAGE_JOAAT("WEAPON_ASSAULTSMG"), - WEAPON_BALL = RAGE_JOAAT("WEAPON_BALL"), - WEAPON_BAT = RAGE_JOAAT("WEAPON_BAT"), - WEAPON_BATTLEAXE = RAGE_JOAAT("WEAPON_BATTLEAXE"), - WEAPON_BOTTLE = RAGE_JOAAT("WEAPON_BOTTLE"), - WEAPON_BULLPUPRIFLE = RAGE_JOAAT("WEAPON_BULLPUPRIFLE"), - WEAPON_BULLPUPRIFLE_MK2 = RAGE_JOAAT("WEAPON_BULLPUPRIFLE_MK2"), - WEAPON_BULLPUPSHOTGUN = RAGE_JOAAT("WEAPON_BULLPUPSHOTGUN"), - WEAPON_BZGAS = RAGE_JOAAT("WEAPON_BZGAS"), - WEAPON_CARBINERIFLE = RAGE_JOAAT("WEAPON_CARBINERIFLE"), - WEAPON_CARBINERIFLE_MK2 = RAGE_JOAAT("WEAPON_CARBINERIFLE_MK2"), - WEAPON_COMBATMG = RAGE_JOAAT("WEAPON_COMBATMG"), - WEAPON_COMBATMG_MK2 = RAGE_JOAAT("WEAPON_COMBATMG_MK2"), - WEAPON_COMBATPDW = RAGE_JOAAT("WEAPON_COMBATPDW"), - WEAPON_COMBATPISTOL = RAGE_JOAAT("WEAPON_COMBATPISTOL"), - WEAPON_COMPACTLAUNCHER = RAGE_JOAAT("WEAPON_COMPACTLAUNCHER"), - WEAPON_COMPACTRIFLE = RAGE_JOAAT("WEAPON_COMPACTRIFLE"), - WEAPON_CROWBAR = RAGE_JOAAT("WEAPON_CROWBAR"), - WEAPON_DAGGER = RAGE_JOAAT("WEAPON_DAGGER"), - WEAPON_DOUBLEACTION = RAGE_JOAAT("WEAPON_DOUBLEACTION"), - WEAPON_EMPLAUNCHER = RAGE_JOAAT("WEAPON_EMPLAUNCHER"), - WEAPON_FERTILIZERCAN = RAGE_JOAAT("WEAPON_FERTILIZERCAN"), - WEAPON_FIREEXTINGUISHER = RAGE_JOAAT("WEAPON_FIREEXTINGUISHER"), - WEAPON_FIREWORK = RAGE_JOAAT("WEAPON_FIREWORK"), - WEAPON_FLARE = RAGE_JOAAT("WEAPON_FLARE"), - WEAPON_FLAREGUN = RAGE_JOAAT("WEAPON_FLAREGUN"), - WEAPON_FLASHLIGHT = RAGE_JOAAT("WEAPON_FLASHLIGHT"), - WEAPON_GOLFCLUB = RAGE_JOAAT("WEAPON_GOLFCLUB"), - WEAPON_GRENADE = RAGE_JOAAT("WEAPON_GRENADE"), - WEAPON_GRENADELAUNCHER = RAGE_JOAAT("WEAPON_GRENADELAUNCHER"), - WEAPON_GRENADELAUNCHER_SMOKE = RAGE_JOAAT("WEAPON_GRENADELAUNCHER_SMOKE"), - WEAPON_GUSENBERG = RAGE_JOAAT("WEAPON_GUSENBERG"), - WEAPON_HAMMER = RAGE_JOAAT("WEAPON_HAMMER"), - WEAPON_HATCHET = RAGE_JOAAT("WEAPON_HATCHET"), - WEAPON_HAZARDCAN = RAGE_JOAAT("WEAPON_HAZARDCAN"), - WEAPON_HEAVYPISTOL = RAGE_JOAAT("WEAPON_HEAVYPISTOL"), - WEAPON_HEAVYRIFLE = RAGE_JOAAT("WEAPON_HEAVYRIFLE"), - WEAPON_HEAVYSHOTGUN = RAGE_JOAAT("WEAPON_HEAVYSHOTGUN"), - WEAPON_HEAVYSNIPER = RAGE_JOAAT("WEAPON_HEAVYSNIPER"), - WEAPON_HEAVYSNIPER_MK2 = RAGE_JOAAT("WEAPON_HEAVYSNIPER_MK2"), - WEAPON_HOMINGLAUNCHER = RAGE_JOAAT("WEAPON_HOMINGLAUNCHER"), - WEAPON_KNIFE = RAGE_JOAAT("WEAPON_KNIFE"), - WEAPON_KNUCKLE = RAGE_JOAAT("WEAPON_KNUCKLE"), - WEAPON_MACHETE = RAGE_JOAAT("WEAPON_MACHETE"), - WEAPON_MACHINEPISTOL = RAGE_JOAAT("WEAPON_MACHINEPISTOL"), - WEAPON_MARKSMANPISTOL = RAGE_JOAAT("WEAPON_MARKSMANPISTOL"), - WEAPON_MARKSMANRIFLE = RAGE_JOAAT("WEAPON_MARKSMANRIFLE"), - WEAPON_MARKSMANRIFLE_MK2 = RAGE_JOAAT("WEAPON_MARKSMANRIFLE_MK2"), - WEAPON_MG = RAGE_JOAAT("WEAPON_MG"), - WEAPON_MICROSMG = RAGE_JOAAT("WEAPON_MICROSMG"), - WEAPON_MILITARYRIFLE = RAGE_JOAAT("WEAPON_MILITARYRIFLE"), - WEAPON_MINIGUN = RAGE_JOAAT("WEAPON_MINIGUN"), - WEAPON_MINISMG = RAGE_JOAAT("WEAPON_MINISMG"), - WEAPON_MOLOTOV = RAGE_JOAAT("WEAPON_MOLOTOV"), - WEAPON_MUSKET = RAGE_JOAAT("WEAPON_MUSKET"), - WEAPON_NIGHTSTICK = RAGE_JOAAT("WEAPON_NIGHTSTICK"), - WEAPON_PETROLCAN = RAGE_JOAAT("WEAPON_PETROLCAN"), - WEAPON_PIPEBOMB = RAGE_JOAAT("WEAPON_PIPEBOMB"), - WEAPON_PISTOL50 = RAGE_JOAAT("WEAPON_PISTOL50"), - WEAPON_PISTOL = RAGE_JOAAT("WEAPON_PISTOL"), - WEAPON_PISTOL_MK2 = RAGE_JOAAT("WEAPON_PISTOL_MK2"), - WEAPON_POOLCUE = RAGE_JOAAT("WEAPON_POOLCUE"), - WEAPON_PROXMINE = RAGE_JOAAT("WEAPON_PROXMINE"), - WEAPON_PUMPSHOTGUN = RAGE_JOAAT("WEAPON_PUMPSHOTGUN"), - WEAPON_PUMPSHOTGUN_MK2 = RAGE_JOAAT("WEAPON_PUMPSHOTGUN_MK2"), - WEAPON_RAILGUN = RAGE_JOAAT("WEAPON_RAILGUN"), - WEAPON_RAYCARBINE = RAGE_JOAAT("WEAPON_RAYCARBINE"), - WEAPON_RAYPISTOL = RAGE_JOAAT("WEAPON_RAYPISTOL"), - WEAPON_RAYMINIGUN = RAGE_JOAAT("WEAPON_RAYMINIGUN"), - WEAPON_REVOLVER = RAGE_JOAAT("WEAPON_REVOLVER"), - WEAPON_REVOLVER_MK2 = RAGE_JOAAT("WEAPON_REVOLVER_MK2"), - WEAPON_RPG = RAGE_JOAAT("WEAPON_RPG"), - WEAPON_SAWNOFFSHOTGUN = RAGE_JOAAT("WEAPON_SAWNOFFSHOTGUN"), - WEAPON_SMG = RAGE_JOAAT("WEAPON_SMG"), - WEAPON_SMG_MK2 = RAGE_JOAAT("WEAPON_SMG_MK2"), - WEAPON_SMOKEGRENADE = RAGE_JOAAT("WEAPON_SMOKEGRENADE"), - WEAPON_SNIPERRIFLE = RAGE_JOAAT("WEAPON_SNIPERRIFLE"), - WEAPON_SNOWBALL = RAGE_JOAAT("WEAPON_SNOWBALL"), - WEAPON_SNSPISTOL = RAGE_JOAAT("WEAPON_SNSPISTOL"), - WEAPON_SNSPISTOL_MK2 = RAGE_JOAAT("WEAPON_SNSPISTOL_MK2"), - WEAPON_SPECIALCARBINE = RAGE_JOAAT("WEAPON_SPECIALCARBINE"), - WEAPON_SPECIALCARBINE_MK2 = RAGE_JOAAT("WEAPON_SPECIALCARBINE_MK2"), - WEAPON_STICKYBOMB = RAGE_JOAAT("WEAPON_STICKYBOMB"), - WEAPON_STINGER = RAGE_JOAAT("WEAPON_STINGER"), - WEAPON_STONE_HATCHET = RAGE_JOAAT("WEAPON_STONE_HATCHET"), - WEAPON_STUNGUN = RAGE_JOAAT("WEAPON_STUNGUN"), - WEAPON_STUNGUN_MP = RAGE_JOAAT("WEAPON_STUNGUN_MP"), - WEAPON_SWITCHBLADE = RAGE_JOAAT("WEAPON_SWITCHBLADE"), - WEAPON_UNARMED = RAGE_JOAAT("WEAPON_UNARMED"), - WEAPON_VINTAGEPISTOL = RAGE_JOAAT("WEAPON_VINTAGEPISTOL"), - WEAPON_WRENCH = RAGE_JOAAT("WEAPON_WRENCH"), -}; - -constexpr uint32_t weapon_list[]{ - WEAPON_ADVANCEDRIFLE, - WEAPON_APPISTOL, - WEAPON_ASSAULTRIFLE, - WEAPON_ASSAULTRIFLE_MK2, - WEAPON_ASSAULTSHOTGUN, - WEAPON_ASSAULTSMG, - WEAPON_BALL, - WEAPON_BAT, - WEAPON_BATTLEAXE, - WEAPON_BOTTLE, - WEAPON_BULLPUPRIFLE, - WEAPON_BULLPUPRIFLE_MK2, - WEAPON_BULLPUPSHOTGUN, - WEAPON_BZGAS, - WEAPON_CARBINERIFLE, - WEAPON_CARBINERIFLE_MK2, - WEAPON_COMBATMG, - WEAPON_COMBATMG_MK2, - WEAPON_COMBATPDW, - WEAPON_COMBATPISTOL, - WEAPON_COMPACTLAUNCHER, - WEAPON_COMPACTRIFLE, - WEAPON_CROWBAR, - WEAPON_DAGGER, - WEAPON_DOUBLEACTION, - WEAPON_EMPLAUNCHER, - WEAPON_FERTILIZERCAN, - WEAPON_FIREEXTINGUISHER, - WEAPON_FIREWORK, - WEAPON_FLARE, - WEAPON_FLAREGUN, - WEAPON_FLASHLIGHT, - WEAPON_GOLFCLUB, - WEAPON_GRENADE, - WEAPON_GRENADELAUNCHER, - WEAPON_GRENADELAUNCHER_SMOKE, - WEAPON_GUSENBERG, - WEAPON_HAMMER, - WEAPON_HATCHET, - WEAPON_HAZARDCAN, - WEAPON_HEAVYPISTOL, - WEAPON_HEAVYRIFLE, - WEAPON_HEAVYSHOTGUN, - WEAPON_HEAVYSNIPER, - WEAPON_HEAVYSNIPER_MK2, - WEAPON_HOMINGLAUNCHER, - WEAPON_KNIFE, - WEAPON_KNUCKLE, - WEAPON_MACHETE, - WEAPON_MACHINEPISTOL, - WEAPON_MARKSMANPISTOL, - WEAPON_MARKSMANRIFLE, - WEAPON_MARKSMANRIFLE_MK2, - WEAPON_MG, - WEAPON_MICROSMG, - WEAPON_MILITARYRIFLE, - WEAPON_MINIGUN, - WEAPON_MINISMG, - WEAPON_MOLOTOV, - WEAPON_MUSKET, - WEAPON_NIGHTSTICK, - WEAPON_PETROLCAN, - WEAPON_PIPEBOMB, - WEAPON_PISTOL, - WEAPON_PISTOL50, - WEAPON_PISTOL_MK2, - WEAPON_POOLCUE, - WEAPON_PROXMINE, - WEAPON_PUMPSHOTGUN, - WEAPON_PUMPSHOTGUN_MK2, - WEAPON_RAILGUN, - WEAPON_RAYCARBINE, - WEAPON_RAYMINIGUN, - WEAPON_RAYPISTOL, - WEAPON_REVOLVER, - WEAPON_REVOLVER_MK2, - WEAPON_RPG, - WEAPON_SAWNOFFSHOTGUN, - WEAPON_SMG, - WEAPON_SMG_MK2, - WEAPON_SMOKEGRENADE, - WEAPON_SNIPERRIFLE, - WEAPON_SNOWBALL, - WEAPON_SNSPISTOL, - WEAPON_SNSPISTOL_MK2, - WEAPON_SPECIALCARBINE, - WEAPON_SPECIALCARBINE_MK2, - WEAPON_STICKYBOMB, - WEAPON_STINGER, - WEAPON_STONE_HATCHET, - WEAPON_STUNGUN, - WEAPON_STUNGUN_MP, - WEAPON_SWITCHBLADE, - WEAPON_UNARMED, - WEAPON_VINTAGEPISTOL, - WEAPON_WRENCH, + WEAPON_UNARMED = RAGE_JOAAT("WEAPON_UNARMED") }; enum Gadgets : Hash @@ -208,426 +14,6 @@ enum Gadgets : Hash GADGET_PARACHUTE = RAGE_JOAAT("GADGET_PARACHUTE") }; -enum WeaponComponents : Hash -{ - COMPONENT_ADVANCEDRIFLE_CLIP_01 = RAGE_JOAAT("COMPONENT_ADVANCEDRIFLE_CLIP_01"), - COMPONENT_ADVANCEDRIFLE_CLIP_02 = RAGE_JOAAT("COMPONENT_ADVANCEDRIFLE_CLIP_02"), - COMPONENT_ADVANCEDRIFLE_VARMOD_LUXE = RAGE_JOAAT("COMPONENT_ADVANCEDRIFLE_VARMOD_LUXE"), - COMPONENT_APPISTOL_CLIP_01 = RAGE_JOAAT("COMPONENT_APPISTOL_CLIP_01"), - COMPONENT_APPISTOL_CLIP_02 = RAGE_JOAAT("COMPONENT_APPISTOL_CLIP_02"), - COMPONENT_APPISTOL_VARMOD_LUXE = RAGE_JOAAT("COMPONENT_APPISTOL_VARMOD_LUXE"), - COMPONENT_ASSAULTRIFLE_CLIP_01 = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_CLIP_01"), - COMPONENT_ASSAULTRIFLE_CLIP_02 = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_CLIP_02"), - COMPONENT_ASSAULTRIFLE_CLIP_03 = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_CLIP_03"), - COMPONENT_ASSAULTRIFLE_MK2_CAMO = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_MK2_CAMO"), - COMPONENT_ASSAULTRIFLE_MK2_CAMO_02 = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_MK2_CAMO_02"), - COMPONENT_ASSAULTRIFLE_MK2_CAMO_03 = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_MK2_CAMO_03"), - COMPONENT_ASSAULTRIFLE_MK2_CAMO_04 = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_MK2_CAMO_04"), - COMPONENT_ASSAULTRIFLE_MK2_CAMO_05 = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_MK2_CAMO_05"), - COMPONENT_ASSAULTRIFLE_MK2_CAMO_06 = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_MK2_CAMO_06"), - COMPONENT_ASSAULTRIFLE_MK2_CAMO_07 = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_MK2_CAMO_07"), - COMPONENT_ASSAULTRIFLE_MK2_CAMO_08 = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_MK2_CAMO_08"), - COMPONENT_ASSAULTRIFLE_MK2_CAMO_09 = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_MK2_CAMO_09"), - COMPONENT_ASSAULTRIFLE_MK2_CAMO_10 = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_MK2_CAMO_10"), - COMPONENT_ASSAULTRIFLE_MK2_CAMO_IND_01 = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_MK2_CAMO_IND_01"), - COMPONENT_ASSAULTRIFLE_MK2_CLIP_01 = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_MK2_CLIP_01"), - COMPONENT_ASSAULTRIFLE_MK2_CLIP_02 = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_MK2_CLIP_02"), - COMPONENT_ASSAULTRIFLE_MK2_CLIP_ARMORPIERCING = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_MK2_CLIP_ARMORPIERCING"), - COMPONENT_ASSAULTRIFLE_MK2_CLIP_FMJ = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_MK2_CLIP_FMJ"), - COMPONENT_ASSAULTRIFLE_MK2_CLIP_INCENDIARY = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_MK2_CLIP_INCENDIARY"), - COMPONENT_ASSAULTRIFLE_MK2_CLIP_TRACER = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_MK2_CLIP_TRACER"), - COMPONENT_ASSAULTRIFLE_VARMOD_LUXE = RAGE_JOAAT("COMPONENT_ASSAULTRIFLE_VARMOD_LUXE"), - COMPONENT_ASSAULTSHOTGUN_CLIP_01 = RAGE_JOAAT("COMPONENT_ASSAULTSHOTGUN_CLIP_01"), - COMPONENT_ASSAULTSHOTGUN_CLIP_02 = RAGE_JOAAT("COMPONENT_ASSAULTSHOTGUN_CLIP_02"), - COMPONENT_ASSAULTSMG_CLIP_01 = RAGE_JOAAT("COMPONENT_ASSAULTSMG_CLIP_01"), - COMPONENT_ASSAULTSMG_CLIP_02 = RAGE_JOAAT("COMPONENT_ASSAULTSMG_CLIP_02"), - COMPONENT_ASSAULTSMG_VARMOD_LOWRIDER = RAGE_JOAAT("COMPONENT_ASSAULTSMG_VARMOD_LOWRIDER"), - COMPONENT_AT_AR_AFGRIP = RAGE_JOAAT("COMPONENT_AT_AR_AFGRIP"), - COMPONENT_AT_AR_AFGRIP_02 = RAGE_JOAAT("COMPONENT_AT_AR_AFGRIP_02"), - COMPONENT_AT_AR_BARREL_01 = RAGE_JOAAT("COMPONENT_AT_AR_BARREL_01"), - COMPONENT_AT_AR_BARREL_02 = RAGE_JOAAT("COMPONENT_AT_AR_BARREL_02"), - COMPONENT_AT_AR_FLSH = RAGE_JOAAT("COMPONENT_AT_AR_FLSH"), - COMPONENT_AT_AR_SUPP = RAGE_JOAAT("COMPONENT_AT_AR_SUPP"), - COMPONENT_AT_AR_SUPP_02 = RAGE_JOAAT("COMPONENT_AT_AR_SUPP_02"), - COMPONENT_AT_BP_BARREL_01 = RAGE_JOAAT("COMPONENT_AT_BP_BARREL_01"), - COMPONENT_AT_BP_BARREL_02 = RAGE_JOAAT("COMPONENT_AT_BP_BARREL_02"), - COMPONENT_AT_CR_BARREL_01 = RAGE_JOAAT("COMPONENT_AT_CR_BARREL_01"), - COMPONENT_AT_CR_BARREL_02 = RAGE_JOAAT("COMPONENT_AT_CR_BARREL_02"), - COMPONENT_AT_MG_BARREL_01 = RAGE_JOAAT("COMPONENT_AT_MG_BARREL_01"), - COMPONENT_AT_MG_BARREL_02 = RAGE_JOAAT("COMPONENT_AT_MG_BARREL_02"), - COMPONENT_AT_MRFL_BARREL_01 = RAGE_JOAAT("COMPONENT_AT_MRFL_BARREL_01"), - COMPONENT_AT_MRFL_BARREL_02 = RAGE_JOAAT("COMPONENT_AT_MRFL_BARREL_02"), - COMPONENT_AT_MUZZLE_01 = RAGE_JOAAT("COMPONENT_AT_MUZZLE_01"), - COMPONENT_AT_MUZZLE_02 = RAGE_JOAAT("COMPONENT_AT_MUZZLE_02"), - COMPONENT_AT_MUZZLE_03 = RAGE_JOAAT("COMPONENT_AT_MUZZLE_03"), - COMPONENT_AT_MUZZLE_04 = RAGE_JOAAT("COMPONENT_AT_MUZZLE_04"), - COMPONENT_AT_MUZZLE_05 = RAGE_JOAAT("COMPONENT_AT_MUZZLE_05"), - COMPONENT_AT_MUZZLE_06 = RAGE_JOAAT("COMPONENT_AT_MUZZLE_06"), - COMPONENT_AT_MUZZLE_07 = RAGE_JOAAT("COMPONENT_AT_MUZZLE_07"), - COMPONENT_AT_MUZZLE_08 = RAGE_JOAAT("COMPONENT_AT_MUZZLE_08"), - COMPONENT_AT_MUZZLE_09 = RAGE_JOAAT("COMPONENT_AT_MUZZLE_09"), - COMPONENT_AT_PI_COMP = RAGE_JOAAT("COMPONENT_AT_PI_COMP"), - COMPONENT_AT_PI_COMP_02 = RAGE_JOAAT("COMPONENT_AT_PI_COMP_02"), - COMPONENT_AT_PI_COMP_03 = RAGE_JOAAT("COMPONENT_AT_PI_COMP_03"), - COMPONENT_AT_PI_FLSH = RAGE_JOAAT("COMPONENT_AT_PI_FLSH"), - COMPONENT_AT_PI_FLSH_02 = RAGE_JOAAT("COMPONENT_AT_PI_FLSH_02"), - COMPONENT_AT_PI_FLSH_03 = RAGE_JOAAT("COMPONENT_AT_PI_FLSH_03"), - COMPONENT_AT_PI_RAIL = RAGE_JOAAT("COMPONENT_AT_PI_RAIL"), - COMPONENT_AT_PI_RAIL_02 = RAGE_JOAAT("COMPONENT_AT_PI_RAIL_02"), - COMPONENT_AT_PI_SUPP = RAGE_JOAAT("COMPONENT_AT_PI_SUPP"), - COMPONENT_AT_PI_SUPP_02 = RAGE_JOAAT("COMPONENT_AT_PI_SUPP_02"), - COMPONENT_AT_SB_BARREL_01 = RAGE_JOAAT("COMPONENT_AT_SB_BARREL_01"), - COMPONENT_AT_SB_BARREL_02 = RAGE_JOAAT("COMPONENT_AT_SB_BARREL_02"), - COMPONENT_AT_SCOPE_LARGE = RAGE_JOAAT("COMPONENT_AT_SCOPE_LARGE"), - COMPONENT_AT_SCOPE_LARGE_FIXED_ZOOM = RAGE_JOAAT("COMPONENT_AT_SCOPE_LARGE_FIXED_ZOOM"), - COMPONENT_AT_SCOPE_LARGE_FIXED_ZOOM_MK2 = RAGE_JOAAT("COMPONENT_AT_SCOPE_LARGE_FIXED_ZOOM_MK2"), - COMPONENT_AT_SCOPE_LARGE_MK2 = RAGE_JOAAT("COMPONENT_AT_SCOPE_LARGE_MK2"), - COMPONENT_AT_SCOPE_MACRO = RAGE_JOAAT("COMPONENT_AT_SCOPE_MACRO"), - COMPONENT_AT_SCOPE_MACRO_02 = RAGE_JOAAT("COMPONENT_AT_SCOPE_MACRO_02"), - COMPONENT_AT_SCOPE_MACRO_02_MK2 = RAGE_JOAAT("COMPONENT_AT_SCOPE_MACRO_02_MK2"), - COMPONENT_AT_SCOPE_MACRO_02_SMG_MK2 = RAGE_JOAAT("COMPONENT_AT_SCOPE_MACRO_02_SMG_MK2"), - COMPONENT_AT_SCOPE_MACRO_MK2 = RAGE_JOAAT("COMPONENT_AT_SCOPE_MACRO_MK2"), - COMPONENT_AT_SCOPE_MAX = RAGE_JOAAT("COMPONENT_AT_SCOPE_MAX"), - COMPONENT_AT_SCOPE_MEDIUM = RAGE_JOAAT("COMPONENT_AT_SCOPE_MEDIUM"), - COMPONENT_AT_SCOPE_MEDIUM_MK2 = RAGE_JOAAT("COMPONENT_AT_SCOPE_MEDIUM_MK2"), - COMPONENT_AT_SCOPE_NV = RAGE_JOAAT("COMPONENT_AT_SCOPE_NV"), - COMPONENT_AT_SCOPE_SMALL = RAGE_JOAAT("COMPONENT_AT_SCOPE_SMALL"), - COMPONENT_AT_SCOPE_SMALL_02 = RAGE_JOAAT("COMPONENT_AT_SCOPE_SMALL_02"), - COMPONENT_AT_SCOPE_SMALL_MK2 = RAGE_JOAAT("COMPONENT_AT_SCOPE_SMALL_MK2"), - COMPONENT_AT_SCOPE_SMALL_SMG_MK2 = RAGE_JOAAT("COMPONENT_AT_SCOPE_SMALL_SMG_MK2"), - COMPONENT_AT_SCOPE_THERMAL = RAGE_JOAAT("COMPONENT_AT_SCOPE_THERMAL"), - COMPONENT_AT_SC_BARREL_01 = RAGE_JOAAT("COMPONENT_AT_SC_BARREL_01"), - COMPONENT_AT_SC_BARREL_02 = RAGE_JOAAT("COMPONENT_AT_SC_BARREL_02"), - COMPONENT_AT_SIGHTS = RAGE_JOAAT("COMPONENT_AT_SIGHTS"), - COMPONENT_AT_SIGHTS_SMG = RAGE_JOAAT("COMPONENT_AT_SIGHTS_SMG"), - COMPONENT_AT_SR_BARREL_01 = RAGE_JOAAT("COMPONENT_AT_SR_BARREL_01"), - COMPONENT_AT_SR_BARREL_02 = RAGE_JOAAT("COMPONENT_AT_SR_BARREL_02"), - COMPONENT_AT_SR_SUPP = RAGE_JOAAT("COMPONENT_AT_SR_SUPP"), - COMPONENT_AT_SR_SUPP_03 = RAGE_JOAAT("COMPONENT_AT_SR_SUPP_03"), - COMPONENT_BULLPUPRIFLE_CLIP_01 = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_CLIP_01"), - COMPONENT_BULLPUPRIFLE_CLIP_02 = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_CLIP_02"), - COMPONENT_BULLPUPRIFLE_MK2_CAMO = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_MK2_CAMO"), - COMPONENT_BULLPUPRIFLE_MK2_CAMO_02 = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_MK2_CAMO_02"), - COMPONENT_BULLPUPRIFLE_MK2_CAMO_03 = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_MK2_CAMO_03"), - COMPONENT_BULLPUPRIFLE_MK2_CAMO_04 = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_MK2_CAMO_04"), - COMPONENT_BULLPUPRIFLE_MK2_CAMO_05 = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_MK2_CAMO_05"), - COMPONENT_BULLPUPRIFLE_MK2_CAMO_06 = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_MK2_CAMO_06"), - COMPONENT_BULLPUPRIFLE_MK2_CAMO_07 = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_MK2_CAMO_07"), - COMPONENT_BULLPUPRIFLE_MK2_CAMO_08 = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_MK2_CAMO_08"), - COMPONENT_BULLPUPRIFLE_MK2_CAMO_09 = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_MK2_CAMO_09"), - COMPONENT_BULLPUPRIFLE_MK2_CAMO_10 = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_MK2_CAMO_10"), - COMPONENT_BULLPUPRIFLE_MK2_CAMO_IND_01 = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_MK2_CAMO_IND_01"), - COMPONENT_BULLPUPRIFLE_MK2_CLIP_01 = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_MK2_CLIP_01"), - COMPONENT_BULLPUPRIFLE_MK2_CLIP_02 = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_MK2_CLIP_02"), - COMPONENT_BULLPUPRIFLE_MK2_CLIP_ARMORPIERCING = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_MK2_CLIP_ARMORPIERCING"), - COMPONENT_BULLPUPRIFLE_MK2_CLIP_FMJ = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_MK2_CLIP_FMJ"), - COMPONENT_BULLPUPRIFLE_MK2_CLIP_INCENDIARY = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_MK2_CLIP_INCENDIARY"), - COMPONENT_BULLPUPRIFLE_MK2_CLIP_TRACER = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_MK2_CLIP_TRACER"), - COMPONENT_BULLPUPRIFLE_VARMOD_LOW = RAGE_JOAAT("COMPONENT_BULLPUPRIFLE_VARMOD_LOW"), - COMPONENT_CARBINERIFLE_CLIP_01 = RAGE_JOAAT("COMPONENT_CARBINERIFLE_CLIP_01"), - COMPONENT_CARBINERIFLE_CLIP_02 = RAGE_JOAAT("COMPONENT_CARBINERIFLE_CLIP_02"), - COMPONENT_CARBINERIFLE_CLIP_03 = RAGE_JOAAT("COMPONENT_CARBINERIFLE_CLIP_03"), - COMPONENT_CARBINERIFLE_MK2_CAMO = RAGE_JOAAT("COMPONENT_CARBINERIFLE_MK2_CAMO"), - COMPONENT_CARBINERIFLE_MK2_CAMO_02 = RAGE_JOAAT("COMPONENT_CARBINERIFLE_MK2_CAMO_02"), - COMPONENT_CARBINERIFLE_MK2_CAMO_03 = RAGE_JOAAT("COMPONENT_CARBINERIFLE_MK2_CAMO_03"), - COMPONENT_CARBINERIFLE_MK2_CAMO_04 = RAGE_JOAAT("COMPONENT_CARBINERIFLE_MK2_CAMO_04"), - COMPONENT_CARBINERIFLE_MK2_CAMO_05 = RAGE_JOAAT("COMPONENT_CARBINERIFLE_MK2_CAMO_05"), - COMPONENT_CARBINERIFLE_MK2_CAMO_06 = RAGE_JOAAT("COMPONENT_CARBINERIFLE_MK2_CAMO_06"), - COMPONENT_CARBINERIFLE_MK2_CAMO_07 = RAGE_JOAAT("COMPONENT_CARBINERIFLE_MK2_CAMO_07"), - COMPONENT_CARBINERIFLE_MK2_CAMO_08 = RAGE_JOAAT("COMPONENT_CARBINERIFLE_MK2_CAMO_08"), - COMPONENT_CARBINERIFLE_MK2_CAMO_09 = RAGE_JOAAT("COMPONENT_CARBINERIFLE_MK2_CAMO_09"), - COMPONENT_CARBINERIFLE_MK2_CAMO_10 = RAGE_JOAAT("COMPONENT_CARBINERIFLE_MK2_CAMO_10"), - COMPONENT_CARBINERIFLE_MK2_CAMO_IND_01 = RAGE_JOAAT("COMPONENT_CARBINERIFLE_MK2_CAMO_IND_01"), - COMPONENT_CARBINERIFLE_MK2_CLIP_01 = RAGE_JOAAT("COMPONENT_CARBINERIFLE_MK2_CLIP_01"), - COMPONENT_CARBINERIFLE_MK2_CLIP_02 = RAGE_JOAAT("COMPONENT_CARBINERIFLE_MK2_CLIP_02"), - COMPONENT_CARBINERIFLE_MK2_CLIP_ARMORPIERCING = RAGE_JOAAT("COMPONENT_CARBINERIFLE_MK2_CLIP_ARMORPIERCING"), - COMPONENT_CARBINERIFLE_MK2_CLIP_FMJ = RAGE_JOAAT("COMPONENT_CARBINERIFLE_MK2_CLIP_FMJ"), - COMPONENT_CARBINERIFLE_MK2_CLIP_INCENDIARY = RAGE_JOAAT("COMPONENT_CARBINERIFLE_MK2_CLIP_INCENDIARY"), - COMPONENT_CARBINERIFLE_MK2_CLIP_TRACER = RAGE_JOAAT("COMPONENT_CARBINERIFLE_MK2_CLIP_TRACER"), - COMPONENT_CARBINERIFLE_VARMOD_LUXE = RAGE_JOAAT("COMPONENT_CARBINERIFLE_VARMOD_LUXE"), - COMPONENT_COMBATMG_CLIP_01 = RAGE_JOAAT("COMPONENT_COMBATMG_CLIP_01"), - COMPONENT_COMBATMG_CLIP_02 = RAGE_JOAAT("COMPONENT_COMBATMG_CLIP_02"), - COMPONENT_COMBATMG_MK2_CAMO = RAGE_JOAAT("COMPONENT_COMBATMG_MK2_CAMO"), - COMPONENT_COMBATMG_MK2_CAMO_02 = RAGE_JOAAT("COMPONENT_COMBATMG_MK2_CAMO_02"), - COMPONENT_COMBATMG_MK2_CAMO_03 = RAGE_JOAAT("COMPONENT_COMBATMG_MK2_CAMO_03"), - COMPONENT_COMBATMG_MK2_CAMO_04 = RAGE_JOAAT("COMPONENT_COMBATMG_MK2_CAMO_04"), - COMPONENT_COMBATMG_MK2_CAMO_05 = RAGE_JOAAT("COMPONENT_COMBATMG_MK2_CAMO_05"), - COMPONENT_COMBATMG_MK2_CAMO_06 = RAGE_JOAAT("COMPONENT_COMBATMG_MK2_CAMO_06"), - COMPONENT_COMBATMG_MK2_CAMO_07 = RAGE_JOAAT("COMPONENT_COMBATMG_MK2_CAMO_07"), - COMPONENT_COMBATMG_MK2_CAMO_08 = RAGE_JOAAT("COMPONENT_COMBATMG_MK2_CAMO_08"), - COMPONENT_COMBATMG_MK2_CAMO_09 = RAGE_JOAAT("COMPONENT_COMBATMG_MK2_CAMO_09"), - COMPONENT_COMBATMG_MK2_CAMO_10 = RAGE_JOAAT("COMPONENT_COMBATMG_MK2_CAMO_10"), - COMPONENT_COMBATMG_MK2_CAMO_IND_01 = RAGE_JOAAT("COMPONENT_COMBATMG_MK2_CAMO_IND_01"), - COMPONENT_COMBATMG_MK2_CLIP_01 = RAGE_JOAAT("COMPONENT_COMBATMG_MK2_CLIP_01"), - COMPONENT_COMBATMG_MK2_CLIP_02 = RAGE_JOAAT("COMPONENT_COMBATMG_MK2_CLIP_02"), - COMPONENT_COMBATMG_MK2_CLIP_ARMORPIERCING = RAGE_JOAAT("COMPONENT_COMBATMG_MK2_CLIP_ARMORPIERCING"), - COMPONENT_COMBATMG_MK2_CLIP_FMJ = RAGE_JOAAT("COMPONENT_COMBATMG_MK2_CLIP_FMJ"), - COMPONENT_COMBATMG_MK2_CLIP_INCENDIARY = RAGE_JOAAT("COMPONENT_COMBATMG_MK2_CLIP_INCENDIARY"), - COMPONENT_COMBATMG_MK2_CLIP_TRACER = RAGE_JOAAT("COMPONENT_COMBATMG_MK2_CLIP_TRACER"), - COMPONENT_COMBATMG_VARMOD_LOWRIDER = RAGE_JOAAT("COMPONENT_COMBATMG_VARMOD_LOWRIDER"), - COMPONENT_COMBATPDW_CLIP_01 = RAGE_JOAAT("COMPONENT_COMBATPDW_CLIP_01"), - COMPONENT_COMBATPDW_CLIP_02 = RAGE_JOAAT("COMPONENT_COMBATPDW_CLIP_02"), - COMPONENT_COMBATPDW_CLIP_03 = RAGE_JOAAT("COMPONENT_COMBATPDW_CLIP_03"), - COMPONENT_COMBATPISTOL_CLIP_01 = RAGE_JOAAT("COMPONENT_COMBATPISTOL_CLIP_01"), - COMPONENT_COMBATPISTOL_CLIP_02 = RAGE_JOAAT("COMPONENT_COMBATPISTOL_CLIP_02"), - COMPONENT_COMBATPISTOL_VARMOD_LOWRIDER = RAGE_JOAAT("COMPONENT_COMBATPISTOL_VARMOD_LOWRIDER"), - COMPONENT_COMPACTRIFLE_CLIP_01 = RAGE_JOAAT("COMPONENT_COMPACTRIFLE_CLIP_01"), - COMPONENT_COMPACTRIFLE_CLIP_02 = RAGE_JOAAT("COMPONENT_COMPACTRIFLE_CLIP_02"), - COMPONENT_COMPACTRIFLE_CLIP_03 = RAGE_JOAAT("COMPONENT_COMPACTRIFLE_CLIP_03"), - COMPONENT_GRENADELAUNCHER_CLIP_01 = RAGE_JOAAT("COMPONENT_GRENADELAUNCHER_CLIP_01"), - COMPONENT_GUSENBERG_CLIP_01 = RAGE_JOAAT("COMPONENT_GUSENBERG_CLIP_01"), - COMPONENT_GUSENBERG_CLIP_02 = RAGE_JOAAT("COMPONENT_GUSENBERG_CLIP_02"), - COMPONENT_HEAVYPISTOL_CLIP_01 = RAGE_JOAAT("COMPONENT_HEAVYPISTOL_CLIP_01"), - COMPONENT_HEAVYPISTOL_CLIP_02 = RAGE_JOAAT("COMPONENT_HEAVYPISTOL_CLIP_02"), - COMPONENT_HEAVYPISTOL_VARMOD_LUXE = RAGE_JOAAT("COMPONENT_HEAVYPISTOL_VARMOD_LUXE"), - COMPONENT_HEAVYSHOTGUN_CLIP_01 = RAGE_JOAAT("COMPONENT_HEAVYSHOTGUN_CLIP_01"), - COMPONENT_HEAVYSHOTGUN_CLIP_02 = RAGE_JOAAT("COMPONENT_HEAVYSHOTGUN_CLIP_02"), - COMPONENT_HEAVYSHOTGUN_CLIP_03 = RAGE_JOAAT("COMPONENT_HEAVYSHOTGUN_CLIP_03"), - COMPONENT_HEAVYSNIPER_CLIP_01 = RAGE_JOAAT("COMPONENT_HEAVYSNIPER_CLIP_01"), - COMPONENT_HEAVYSNIPER_MK2_CAMO = RAGE_JOAAT("COMPONENT_HEAVYSNIPER_MK2_CAMO"), - COMPONENT_HEAVYSNIPER_MK2_CAMO_02 = RAGE_JOAAT("COMPONENT_HEAVYSNIPER_MK2_CAMO_02"), - COMPONENT_HEAVYSNIPER_MK2_CAMO_03 = RAGE_JOAAT("COMPONENT_HEAVYSNIPER_MK2_CAMO_03"), - COMPONENT_HEAVYSNIPER_MK2_CAMO_04 = RAGE_JOAAT("COMPONENT_HEAVYSNIPER_MK2_CAMO_04"), - COMPONENT_HEAVYSNIPER_MK2_CAMO_05 = RAGE_JOAAT("COMPONENT_HEAVYSNIPER_MK2_CAMO_05"), - COMPONENT_HEAVYSNIPER_MK2_CAMO_06 = RAGE_JOAAT("COMPONENT_HEAVYSNIPER_MK2_CAMO_06"), - COMPONENT_HEAVYSNIPER_MK2_CAMO_07 = RAGE_JOAAT("COMPONENT_HEAVYSNIPER_MK2_CAMO_07"), - COMPONENT_HEAVYSNIPER_MK2_CAMO_08 = RAGE_JOAAT("COMPONENT_HEAVYSNIPER_MK2_CAMO_08"), - COMPONENT_HEAVYSNIPER_MK2_CAMO_09 = RAGE_JOAAT("COMPONENT_HEAVYSNIPER_MK2_CAMO_09"), - COMPONENT_HEAVYSNIPER_MK2_CAMO_10 = RAGE_JOAAT("COMPONENT_HEAVYSNIPER_MK2_CAMO_10"), - COMPONENT_HEAVYSNIPER_MK2_CAMO_IND_01 = RAGE_JOAAT("COMPONENT_HEAVYSNIPER_MK2_CAMO_IND_01"), - COMPONENT_HEAVYSNIPER_MK2_CLIP_01 = RAGE_JOAAT("COMPONENT_HEAVYSNIPER_MK2_CLIP_01"), - COMPONENT_HEAVYSNIPER_MK2_CLIP_02 = RAGE_JOAAT("COMPONENT_HEAVYSNIPER_MK2_CLIP_02"), - COMPONENT_HEAVYSNIPER_MK2_CLIP_ARMORPIERCING = RAGE_JOAAT("COMPONENT_HEAVYSNIPER_MK2_CLIP_ARMORPIERCING"), - COMPONENT_HEAVYSNIPER_MK2_CLIP_EXPLOSIVE = RAGE_JOAAT("COMPONENT_HEAVYSNIPER_MK2_CLIP_EXPLOSIVE"), - COMPONENT_HEAVYSNIPER_MK2_CLIP_FMJ = RAGE_JOAAT("COMPONENT_HEAVYSNIPER_MK2_CLIP_FMJ"), - COMPONENT_HEAVYSNIPER_MK2_CLIP_INCENDIARY = RAGE_JOAAT("COMPONENT_HEAVYSNIPER_MK2_CLIP_INCENDIARY"), - COMPONENT_KNUCKLE_VARMOD_BALLAS = RAGE_JOAAT("COMPONENT_KNUCKLE_VARMOD_BALLAS"), - COMPONENT_KNUCKLE_VARMOD_BASE = RAGE_JOAAT("COMPONENT_KNUCKLE_VARMOD_BASE"), - COMPONENT_KNUCKLE_VARMOD_DIAMOND = RAGE_JOAAT("COMPONENT_KNUCKLE_VARMOD_DIAMOND"), - COMPONENT_KNUCKLE_VARMOD_DOLLAR = RAGE_JOAAT("COMPONENT_KNUCKLE_VARMOD_DOLLAR"), - COMPONENT_KNUCKLE_VARMOD_HATE = RAGE_JOAAT("COMPONENT_KNUCKLE_VARMOD_HATE"), - COMPONENT_KNUCKLE_VARMOD_KING = RAGE_JOAAT("COMPONENT_KNUCKLE_VARMOD_KING"), - COMPONENT_KNUCKLE_VARMOD_LOVE = RAGE_JOAAT("COMPONENT_KNUCKLE_VARMOD_LOVE"), - COMPONENT_KNUCKLE_VARMOD_PIMP = RAGE_JOAAT("COMPONENT_KNUCKLE_VARMOD_PIMP"), - COMPONENT_KNUCKLE_VARMOD_PLAYER = RAGE_JOAAT("COMPONENT_KNUCKLE_VARMOD_PLAYER"), - COMPONENT_KNUCKLE_VARMOD_VAGOS = RAGE_JOAAT("COMPONENT_KNUCKLE_VARMOD_VAGOS"), - COMPONENT_MACHINEPISTOL_CLIP_01 = RAGE_JOAAT("COMPONENT_MACHINEPISTOL_CLIP_01"), - COMPONENT_MACHINEPISTOL_CLIP_02 = RAGE_JOAAT("COMPONENT_MACHINEPISTOL_CLIP_02"), - COMPONENT_MACHINEPISTOL_CLIP_03 = RAGE_JOAAT("COMPONENT_MACHINEPISTOL_CLIP_03"), - COMPONENT_MARKSMANRIFLE_CLIP_01 = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_CLIP_01"), - COMPONENT_MARKSMANRIFLE_CLIP_02 = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_CLIP_02"), - COMPONENT_MARKSMANRIFLE_MK2_CAMO = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_MK2_CAMO"), - COMPONENT_MARKSMANRIFLE_MK2_CAMO_02 = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_MK2_CAMO_02"), - COMPONENT_MARKSMANRIFLE_MK2_CAMO_03 = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_MK2_CAMO_03"), - COMPONENT_MARKSMANRIFLE_MK2_CAMO_04 = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_MK2_CAMO_04"), - COMPONENT_MARKSMANRIFLE_MK2_CAMO_05 = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_MK2_CAMO_05"), - COMPONENT_MARKSMANRIFLE_MK2_CAMO_06 = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_MK2_CAMO_06"), - COMPONENT_MARKSMANRIFLE_MK2_CAMO_07 = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_MK2_CAMO_07"), - COMPONENT_MARKSMANRIFLE_MK2_CAMO_08 = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_MK2_CAMO_08"), - COMPONENT_MARKSMANRIFLE_MK2_CAMO_09 = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_MK2_CAMO_09"), - COMPONENT_MARKSMANRIFLE_MK2_CAMO_10 = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_MK2_CAMO_10"), - COMPONENT_MARKSMANRIFLE_MK2_CAMO_IND_01 = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_MK2_CAMO_IND_01"), - COMPONENT_MARKSMANRIFLE_MK2_CLIP_01 = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_MK2_CLIP_01"), - COMPONENT_MARKSMANRIFLE_MK2_CLIP_02 = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_MK2_CLIP_02"), - COMPONENT_MARKSMANRIFLE_MK2_CLIP_ARMORPIERCING = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_MK2_CLIP_ARMORPIERCING"), - COMPONENT_MARKSMANRIFLE_MK2_CLIP_FMJ = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_MK2_CLIP_FMJ"), - COMPONENT_MARKSMANRIFLE_MK2_CLIP_INCENDIARY = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_MK2_CLIP_INCENDIARY"), - COMPONENT_MARKSMANRIFLE_MK2_CLIP_TRACER = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_MK2_CLIP_TRACER"), - COMPONENT_MARKSMANRIFLE_VARMOD_LUXE = RAGE_JOAAT("COMPONENT_MARKSMANRIFLE_VARMOD_LUXE"), - COMPONENT_MG_CLIP_01 = RAGE_JOAAT("COMPONENT_MG_CLIP_01"), - COMPONENT_MG_CLIP_02 = RAGE_JOAAT("COMPONENT_MG_CLIP_02"), - COMPONENT_MG_VARMOD_LOWRIDER = RAGE_JOAAT("COMPONENT_MG_VARMOD_LOWRIDER"), - COMPONENT_MICROSMG_CLIP_01 = RAGE_JOAAT("COMPONENT_MICROSMG_CLIP_01"), - COMPONENT_MICROSMG_CLIP_02 = RAGE_JOAAT("COMPONENT_MICROSMG_CLIP_02"), - COMPONENT_MICROSMG_VARMOD_LUXE = RAGE_JOAAT("COMPONENT_MICROSMG_VARMOD_LUXE"), - COMPONENT_MINISMG_CLIP_01 = RAGE_JOAAT("COMPONENT_MINISMG_CLIP_01"), - COMPONENT_MINISMG_CLIP_02 = RAGE_JOAAT("COMPONENT_MINISMG_CLIP_02"), - COMPONENT_PISTOL50_CLIP_01 = RAGE_JOAAT("COMPONENT_PISTOL50_CLIP_01"), - COMPONENT_PISTOL50_CLIP_02 = RAGE_JOAAT("COMPONENT_PISTOL50_CLIP_02"), - COMPONENT_PISTOL50_VARMOD_LUXE = RAGE_JOAAT("COMPONENT_PISTOL50_VARMOD_LUXE"), - COMPONENT_PISTOL_CLIP_01 = RAGE_JOAAT("COMPONENT_PISTOL_CLIP_01"), - COMPONENT_PISTOL_CLIP_02 = RAGE_JOAAT("COMPONENT_PISTOL_CLIP_02"), - COMPONENT_PISTOL_MK2_CAMO = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO"), - COMPONENT_PISTOL_MK2_CAMO_02 = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_02"), - COMPONENT_PISTOL_MK2_CAMO_02_SLIDE = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_02_SLIDE"), - COMPONENT_PISTOL_MK2_CAMO_03 = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_03"), - COMPONENT_PISTOL_MK2_CAMO_03_SLIDE = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_03_SLIDE"), - COMPONENT_PISTOL_MK2_CAMO_04 = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_04"), - COMPONENT_PISTOL_MK2_CAMO_04_SLIDE = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_04_SLIDE"), - COMPONENT_PISTOL_MK2_CAMO_05 = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_05"), - COMPONENT_PISTOL_MK2_CAMO_05_SLIDE = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_05_SLIDE"), - COMPONENT_PISTOL_MK2_CAMO_06 = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_06"), - COMPONENT_PISTOL_MK2_CAMO_06_SLIDE = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_06_SLIDE"), - COMPONENT_PISTOL_MK2_CAMO_07 = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_07"), - COMPONENT_PISTOL_MK2_CAMO_07_SLIDE = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_07_SLIDE"), - COMPONENT_PISTOL_MK2_CAMO_08 = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_08"), - COMPONENT_PISTOL_MK2_CAMO_08_SLIDE = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_08_SLIDE"), - COMPONENT_PISTOL_MK2_CAMO_09 = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_09"), - COMPONENT_PISTOL_MK2_CAMO_09_SLIDE = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_09_SLIDE"), - COMPONENT_PISTOL_MK2_CAMO_10 = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_10"), - COMPONENT_PISTOL_MK2_CAMO_10_SLIDE = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_10_SLIDE"), - COMPONENT_PISTOL_MK2_CAMO_IND_01 = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_IND_01"), - COMPONENT_PISTOL_MK2_CAMO_IND_01_SLIDE = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_IND_01_SLIDE"), - COMPONENT_PISTOL_MK2_CAMO_SLIDE = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CAMO_SLIDE"), - COMPONENT_PISTOL_MK2_CLIP_01 = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CLIP_01"), - COMPONENT_PISTOL_MK2_CLIP_02 = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CLIP_02"), - COMPONENT_PISTOL_MK2_CLIP_FMJ = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CLIP_FMJ"), - COMPONENT_PISTOL_MK2_CLIP_HOLLOWPOINT = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CLIP_HOLLOWPOINT"), - COMPONENT_PISTOL_MK2_CLIP_INCENDIARY = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CLIP_INCENDIARY"), - COMPONENT_PISTOL_MK2_CLIP_TRACER = RAGE_JOAAT("COMPONENT_PISTOL_MK2_CLIP_TRACER"), - COMPONENT_PISTOL_VARMOD_LUXE = RAGE_JOAAT("COMPONENT_PISTOL_VARMOD_LUXE"), - COMPONENT_PUMPSHOTGUN_MK2_CAMO = RAGE_JOAAT("COMPONENT_PUMPSHOTGUN_MK2_CAMO"), - COMPONENT_PUMPSHOTGUN_MK2_CAMO_02 = RAGE_JOAAT("COMPONENT_PUMPSHOTGUN_MK2_CAMO_02"), - COMPONENT_PUMPSHOTGUN_MK2_CAMO_03 = RAGE_JOAAT("COMPONENT_PUMPSHOTGUN_MK2_CAMO_03"), - COMPONENT_PUMPSHOTGUN_MK2_CAMO_04 = RAGE_JOAAT("COMPONENT_PUMPSHOTGUN_MK2_CAMO_04"), - COMPONENT_PUMPSHOTGUN_MK2_CAMO_05 = RAGE_JOAAT("COMPONENT_PUMPSHOTGUN_MK2_CAMO_05"), - COMPONENT_PUMPSHOTGUN_MK2_CAMO_06 = RAGE_JOAAT("COMPONENT_PUMPSHOTGUN_MK2_CAMO_06"), - COMPONENT_PUMPSHOTGUN_MK2_CAMO_07 = RAGE_JOAAT("COMPONENT_PUMPSHOTGUN_MK2_CAMO_07"), - COMPONENT_PUMPSHOTGUN_MK2_CAMO_08 = RAGE_JOAAT("COMPONENT_PUMPSHOTGUN_MK2_CAMO_08"), - COMPONENT_PUMPSHOTGUN_MK2_CAMO_09 = RAGE_JOAAT("COMPONENT_PUMPSHOTGUN_MK2_CAMO_09"), - COMPONENT_PUMPSHOTGUN_MK2_CAMO_10 = RAGE_JOAAT("COMPONENT_PUMPSHOTGUN_MK2_CAMO_10"), - COMPONENT_PUMPSHOTGUN_MK2_CAMO_IND_01 = RAGE_JOAAT("COMPONENT_PUMPSHOTGUN_MK2_CAMO_IND_01"), - COMPONENT_PUMPSHOTGUN_MK2_CLIP_01 = RAGE_JOAAT("COMPONENT_PUMPSHOTGUN_MK2_CLIP_01"), - COMPONENT_PUMPSHOTGUN_MK2_CLIP_ARMORPIERCING = RAGE_JOAAT("COMPONENT_PUMPSHOTGUN_MK2_CLIP_ARMORPIERCING"), - COMPONENT_PUMPSHOTGUN_MK2_CLIP_EXPLOSIVE = RAGE_JOAAT("COMPONENT_PUMPSHOTGUN_MK2_CLIP_EXPLOSIVE"), - COMPONENT_PUMPSHOTGUN_MK2_CLIP_HOLLOWPOINT = RAGE_JOAAT("COMPONENT_PUMPSHOTGUN_MK2_CLIP_HOLLOWPOINT"), - COMPONENT_PUMPSHOTGUN_MK2_CLIP_INCENDIARY = RAGE_JOAAT("COMPONENT_PUMPSHOTGUN_MK2_CLIP_INCENDIARY"), - COMPONENT_PUMPSHOTGUN_VARMOD_LOWRIDER = RAGE_JOAAT("COMPONENT_PUMPSHOTGUN_VARMOD_LOWRIDER"), - COMPONENT_REVOLVER_CLIP_01 = RAGE_JOAAT("COMPONENT_REVOLVER_CLIP_01"), - COMPONENT_REVOLVER_MK2_CAMO = RAGE_JOAAT("COMPONENT_REVOLVER_MK2_CAMO"), - COMPONENT_REVOLVER_MK2_CAMO_02 = RAGE_JOAAT("COMPONENT_REVOLVER_MK2_CAMO_02"), - COMPONENT_REVOLVER_MK2_CAMO_03 = RAGE_JOAAT("COMPONENT_REVOLVER_MK2_CAMO_03"), - COMPONENT_REVOLVER_MK2_CAMO_04 = RAGE_JOAAT("COMPONENT_REVOLVER_MK2_CAMO_04"), - COMPONENT_REVOLVER_MK2_CAMO_05 = RAGE_JOAAT("COMPONENT_REVOLVER_MK2_CAMO_05"), - COMPONENT_REVOLVER_MK2_CAMO_06 = RAGE_JOAAT("COMPONENT_REVOLVER_MK2_CAMO_06"), - COMPONENT_REVOLVER_MK2_CAMO_07 = RAGE_JOAAT("COMPONENT_REVOLVER_MK2_CAMO_07"), - COMPONENT_REVOLVER_MK2_CAMO_08 = RAGE_JOAAT("COMPONENT_REVOLVER_MK2_CAMO_08"), - COMPONENT_REVOLVER_MK2_CAMO_09 = RAGE_JOAAT("COMPONENT_REVOLVER_MK2_CAMO_09"), - COMPONENT_REVOLVER_MK2_CAMO_10 = RAGE_JOAAT("COMPONENT_REVOLVER_MK2_CAMO_10"), - COMPONENT_REVOLVER_MK2_CAMO_IND_01 = RAGE_JOAAT("COMPONENT_REVOLVER_MK2_CAMO_IND_01"), - COMPONENT_REVOLVER_MK2_CLIP_01 = RAGE_JOAAT("COMPONENT_REVOLVER_MK2_CLIP_01"), - COMPONENT_REVOLVER_MK2_CLIP_FMJ = RAGE_JOAAT("COMPONENT_REVOLVER_MK2_CLIP_FMJ"), - COMPONENT_REVOLVER_MK2_CLIP_HOLLOWPOINT = RAGE_JOAAT("COMPONENT_REVOLVER_MK2_CLIP_HOLLOWPOINT"), - COMPONENT_REVOLVER_MK2_CLIP_INCENDIARY = RAGE_JOAAT("COMPONENT_REVOLVER_MK2_CLIP_INCENDIARY"), - COMPONENT_REVOLVER_MK2_CLIP_TRACER = RAGE_JOAAT("COMPONENT_REVOLVER_MK2_CLIP_TRACER"), - COMPONENT_REVOLVER_VARMOD_BOSS = RAGE_JOAAT("COMPONENT_REVOLVER_VARMOD_BOSS"), - COMPONENT_REVOLVER_VARMOD_GOON = RAGE_JOAAT("COMPONENT_REVOLVER_VARMOD_GOON"), - COMPONENT_SAWNOFFSHOTGUN_VARMOD_LUXE = RAGE_JOAAT("COMPONENT_SAWNOFFSHOTGUN_VARMOD_LUXE"), - COMPONENT_SMG_CLIP_01 = RAGE_JOAAT("COMPONENT_SMG_CLIP_01"), - COMPONENT_SMG_CLIP_02 = RAGE_JOAAT("COMPONENT_SMG_CLIP_02"), - COMPONENT_SMG_CLIP_03 = RAGE_JOAAT("COMPONENT_SMG_CLIP_03"), - COMPONENT_SMG_MK2_CAMO = RAGE_JOAAT("COMPONENT_SMG_MK2_CAMO"), - COMPONENT_SMG_MK2_CAMO_02 = RAGE_JOAAT("COMPONENT_SMG_MK2_CAMO_02"), - COMPONENT_SMG_MK2_CAMO_03 = RAGE_JOAAT("COMPONENT_SMG_MK2_CAMO_03"), - COMPONENT_SMG_MK2_CAMO_04 = RAGE_JOAAT("COMPONENT_SMG_MK2_CAMO_04"), - COMPONENT_SMG_MK2_CAMO_05 = RAGE_JOAAT("COMPONENT_SMG_MK2_CAMO_05"), - COMPONENT_SMG_MK2_CAMO_06 = RAGE_JOAAT("COMPONENT_SMG_MK2_CAMO_06"), - COMPONENT_SMG_MK2_CAMO_07 = RAGE_JOAAT("COMPONENT_SMG_MK2_CAMO_07"), - COMPONENT_SMG_MK2_CAMO_08 = RAGE_JOAAT("COMPONENT_SMG_MK2_CAMO_08"), - COMPONENT_SMG_MK2_CAMO_09 = RAGE_JOAAT("COMPONENT_SMG_MK2_CAMO_09"), - COMPONENT_SMG_MK2_CAMO_10 = RAGE_JOAAT("COMPONENT_SMG_MK2_CAMO_10"), - COMPONENT_SMG_MK2_CAMO_IND_01 = RAGE_JOAAT("COMPONENT_SMG_MK2_CAMO_IND_01"), - COMPONENT_SMG_MK2_CLIP_01 = RAGE_JOAAT("COMPONENT_SMG_MK2_CLIP_01"), - COMPONENT_SMG_MK2_CLIP_02 = RAGE_JOAAT("COMPONENT_SMG_MK2_CLIP_02"), - COMPONENT_SMG_MK2_CLIP_FMJ = RAGE_JOAAT("COMPONENT_SMG_MK2_CLIP_FMJ"), - COMPONENT_SMG_MK2_CLIP_HOLLOWPOINT = RAGE_JOAAT("COMPONENT_SMG_MK2_CLIP_HOLLOWPOINT"), - COMPONENT_SMG_MK2_CLIP_INCENDIARY = RAGE_JOAAT("COMPONENT_SMG_MK2_CLIP_INCENDIARY"), - COMPONENT_SMG_MK2_CLIP_TRACER = RAGE_JOAAT("COMPONENT_SMG_MK2_CLIP_TRACER"), - COMPONENT_SMG_VARMOD_LUXE = RAGE_JOAAT("COMPONENT_SMG_VARMOD_LUXE"), - COMPONENT_SNIPERRIFLE_CLIP_01 = RAGE_JOAAT("COMPONENT_SNIPERRIFLE_CLIP_01"), - COMPONENT_SNIPERRIFLE_VARMOD_LUXE = RAGE_JOAAT("COMPONENT_SNIPERRIFLE_VARMOD_LUXE"), - COMPONENT_SNSPISTOL_CLIP_01 = RAGE_JOAAT("COMPONENT_SNSPISTOL_CLIP_01"), - COMPONENT_SNSPISTOL_CLIP_02 = RAGE_JOAAT("COMPONENT_SNSPISTOL_CLIP_02"), - COMPONENT_SNSPISTOL_MK2_CAMO = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO"), - COMPONENT_SNSPISTOL_MK2_CAMO_02 = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_02"), - COMPONENT_SNSPISTOL_MK2_CAMO_02_SLIDE = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_02_SLIDE"), - COMPONENT_SNSPISTOL_MK2_CAMO_03 = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_03"), - COMPONENT_SNSPISTOL_MK2_CAMO_03_SLIDE = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_03_SLIDE"), - COMPONENT_SNSPISTOL_MK2_CAMO_04 = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_04"), - COMPONENT_SNSPISTOL_MK2_CAMO_04_SLIDE = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_04_SLIDE"), - COMPONENT_SNSPISTOL_MK2_CAMO_05 = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_05"), - COMPONENT_SNSPISTOL_MK2_CAMO_05_SLIDE = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_05_SLIDE"), - COMPONENT_SNSPISTOL_MK2_CAMO_06 = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_06"), - COMPONENT_SNSPISTOL_MK2_CAMO_06_SLIDE = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_06_SLIDE"), - COMPONENT_SNSPISTOL_MK2_CAMO_07 = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_07"), - COMPONENT_SNSPISTOL_MK2_CAMO_07_SLIDE = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_07_SLIDE"), - COMPONENT_SNSPISTOL_MK2_CAMO_08 = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_08"), - COMPONENT_SNSPISTOL_MK2_CAMO_08_SLIDE = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_08_SLIDE"), - COMPONENT_SNSPISTOL_MK2_CAMO_09 = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_09"), - COMPONENT_SNSPISTOL_MK2_CAMO_09_SLIDE = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_09_SLIDE"), - COMPONENT_SNSPISTOL_MK2_CAMO_10 = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_10"), - COMPONENT_SNSPISTOL_MK2_CAMO_10_SLIDE = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_10_SLIDE"), - COMPONENT_SNSPISTOL_MK2_CAMO_IND_01 = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_IND_01"), - COMPONENT_SNSPISTOL_MK2_CAMO_IND_01_SLIDE = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_IND_01_SLIDE"), - COMPONENT_SNSPISTOL_MK2_CAMO_SLIDE = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CAMO_SLIDE"), - COMPONENT_SNSPISTOL_MK2_CLIP_01 = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CLIP_01"), - COMPONENT_SNSPISTOL_MK2_CLIP_02 = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CLIP_02"), - COMPONENT_SNSPISTOL_MK2_CLIP_FMJ = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CLIP_FMJ"), - COMPONENT_SNSPISTOL_MK2_CLIP_HOLLOWPOINT = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CLIP_HOLLOWPOINT"), - COMPONENT_SNSPISTOL_MK2_CLIP_INCENDIARY = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CLIP_INCENDIARY"), - COMPONENT_SNSPISTOL_MK2_CLIP_TRACER = RAGE_JOAAT("COMPONENT_SNSPISTOL_MK2_CLIP_TRACER"), - COMPONENT_SNSPISTOL_VARMOD_LOWRIDER = RAGE_JOAAT("COMPONENT_SNSPISTOL_VARMOD_LOWRIDER"), - COMPONENT_SPECIALCARBINE_CLIP_01 = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_CLIP_01"), - COMPONENT_SPECIALCARBINE_CLIP_02 = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_CLIP_02"), - COMPONENT_SPECIALCARBINE_CLIP_03 = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_CLIP_03"), - COMPONENT_SPECIALCARBINE_MK2_CAMO = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_MK2_CAMO"), - COMPONENT_SPECIALCARBINE_MK2_CAMO_02 = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_MK2_CAMO_02"), - COMPONENT_SPECIALCARBINE_MK2_CAMO_03 = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_MK2_CAMO_03"), - COMPONENT_SPECIALCARBINE_MK2_CAMO_04 = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_MK2_CAMO_04"), - COMPONENT_SPECIALCARBINE_MK2_CAMO_05 = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_MK2_CAMO_05"), - COMPONENT_SPECIALCARBINE_MK2_CAMO_06 = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_MK2_CAMO_06"), - COMPONENT_SPECIALCARBINE_MK2_CAMO_07 = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_MK2_CAMO_07"), - COMPONENT_SPECIALCARBINE_MK2_CAMO_08 = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_MK2_CAMO_08"), - COMPONENT_SPECIALCARBINE_MK2_CAMO_09 = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_MK2_CAMO_09"), - COMPONENT_SPECIALCARBINE_MK2_CAMO_10 = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_MK2_CAMO_10"), - COMPONENT_SPECIALCARBINE_MK2_CAMO_IND_01 = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_MK2_CAMO_IND_01"), - COMPONENT_SPECIALCARBINE_MK2_CLIP_01 = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_MK2_CLIP_01"), - COMPONENT_SPECIALCARBINE_MK2_CLIP_02 = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_MK2_CLIP_02"), - COMPONENT_SPECIALCARBINE_MK2_CLIP_ARMORPIERCING = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_MK2_CLIP_ARMORPIERCING"), - COMPONENT_SPECIALCARBINE_MK2_CLIP_FMJ = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_MK2_CLIP_FMJ"), - COMPONENT_SPECIALCARBINE_MK2_CLIP_INCENDIARY = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_MK2_CLIP_INCENDIARY"), - COMPONENT_SPECIALCARBINE_MK2_CLIP_TRACER = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_MK2_CLIP_TRACER"), - COMPONENT_SPECIALCARBINE_VARMOD_LOWRIDER = RAGE_JOAAT("COMPONENT_SPECIALCARBINE_VARMOD_LOWRIDER"), - COMPONENT_SWITCHBLADE_VARMOD_BASE = RAGE_JOAAT("COMPONENT_SWITCHBLADE_VARMOD_BASE"), - COMPONENT_SWITCHBLADE_VARMOD_VAR1 = RAGE_JOAAT("COMPONENT_SWITCHBLADE_VARMOD_VAR1"), - COMPONENT_SWITCHBLADE_VARMOD_VAR2 = RAGE_JOAAT("COMPONENT_SWITCHBLADE_VARMOD_VAR2"), - COMPONENT_VINTAGEPISTOL_CLIP_01 = RAGE_JOAAT("COMPONENT_VINTAGEPISTOL_CLIP_01"), - COMPONENT_VINTAGEPISTOL_CLIP_02 = RAGE_JOAAT("COMPONENT_VINTAGEPISTOL_CLIP_02") -}; - -enum AmmoTypeHashes : Hash -{ - AMMO_NULL = 0x0,//Melee - AMMO_PISTOL = RAGE_JOAAT("AMMO_PISTOL"), - AMMO_SMG = RAGE_JOAAT("AMMO_SMG"), - AMMO_RIFLE = RAGE_JOAAT("AMMO_RIFLE"), - AMMO_MG = RAGE_JOAAT("AMMO_MG"), - AMMO_SHOTGUN = RAGE_JOAAT("AMMO_SHOTGUN"), - AMMO_STUNGUN = RAGE_JOAAT("AMMO_STUNGUN"), - AMMO_SNIPER = RAGE_JOAAT("AMMO_SNIPER"), - AMMO_SNIPER_REMOTE = RAGE_JOAAT("AMMO_SNIPER_REMOTE"), - AMMO_GRENADELAUNCHER = RAGE_JOAAT("AMMO_GRENADELAUNCHER"), - AMMO_GRENADELAUNCHER_SMOKE = RAGE_JOAAT("AMMO_GRENADELAUNCHER_SMOKE"), - AMMO_RPG = RAGE_JOAAT("AMMO_RPG"), - AMMO_STINGER = RAGE_JOAAT("AMMO_STINGER"), - AMMO_MINIGUN = RAGE_JOAAT("AMMO_MINIGUN"), - AMMO_GRENADE = RAGE_JOAAT("AMMO_GRENADE"), - AMMO_STICKYBOMB = RAGE_JOAAT("AMMO_STICKYBOMB"), - AMMO_SMOKEGRENADE = RAGE_JOAAT("AMMO_SMOKEGRENADE"), - AMMO_BZGAS = RAGE_JOAAT("AMMO_BZGAS"), - AMMO_MOLOTOV = RAGE_JOAAT("AMMO_MOLOTOV"), - AMMO_FIREEXTINGUISHER = RAGE_JOAAT("AMMO_FIREEXTINGUISHER"), - AMMO_PETROLCAN = RAGE_JOAAT("AMMO_PETROLCAN"), - AMMO_BALL = RAGE_JOAAT("AMMO_BALL"), - AMMO_FLARE = RAGE_JOAAT("AMMO_FLARE"), - AMMO_TANK = RAGE_JOAAT("AMMO_TANK"), - AMMO_SPACE_ROCKET = RAGE_JOAAT("AMMO_SPACE_ROCKET"), - AMMO_PLANE_ROCKET = RAGE_JOAAT("AMMO_PLANE_ROCKET"), - AMMO_PLAYER_LASER = RAGE_JOAAT("AMMO_PLAYER_LASER"), - AMMO_ENEMY_LASER = RAGE_JOAAT("AMMO_ENEMY_LASER"), - AMMO_BIRD_CRAP = RAGE_JOAAT("AMMO_BIRD_CRAP") -}; - enum WeaponGroup : Hash { GROUP_MELEE = RAGE_JOAAT("GROUP_MELEE"), diff --git a/src/hooks/misc/allow_weapons_in_vehicle.cpp b/src/hooks/misc/allow_weapons_in_vehicle.cpp index 35412ccb..e7811778 100644 --- a/src/hooks/misc/allow_weapons_in_vehicle.cpp +++ b/src/hooks/misc/allow_weapons_in_vehicle.cpp @@ -1,4 +1,5 @@ #include "hooking.hpp" +#include "gta/weapons.hpp" namespace big { @@ -6,7 +7,7 @@ namespace big { if (g.vehicle.unlimited_weapons) { - if (weaponinfo_group == RAGE_JOAAT("GROUP_THROWN")) // Because the thrower can be used without bypassing, we let the game decide the return value, since this function has multiple xrefs, it may be necessary to return 0 at some point + if (weaponinfo_group == GROUP_THROWN) // Because the thrower can be used without bypassing, we let the game decide the return value, since this function has multiple xrefs, it may be necessary to return 0 at some point return g_hooking->get_original()(unk, weaponinfo_group); return true; } diff --git a/src/services/gta_data/gta_data_service.cpp b/src/services/gta_data/gta_data_service.cpp index e685d1d0..f3177133 100644 --- a/src/services/gta_data/gta_data_service.cpp +++ b/src/services/gta_data/gta_data_service.cpp @@ -127,17 +127,17 @@ namespace big const weapon_component& gta_data_service::weapon_component_by_hash(std::uint32_t hash) { - for (const auto& component : m_weapons_cache.weapon_components) - if (component.second.m_hash == hash) - return component.second; + for (const auto& [name, component] : m_weapons_cache.weapon_components) + if (component.m_hash == hash) + return component; return gta_data_service::empty_component; } const weapon_component& gta_data_service::weapon_component_by_name(std::string name) { - for (const auto& component : m_weapons_cache.weapon_components) - if (component.first == name) - return component.second; + for (const auto& [name_key, component] : m_weapons_cache.weapon_components) + if (name_key == name) + return component; return gta_data_service::empty_component; } diff --git a/src/services/persist_weapons/persist_weapons.cpp b/src/services/persist_weapons/persist_weapons.cpp new file mode 100644 index 00000000..f3954374 --- /dev/null +++ b/src/services/persist_weapons/persist_weapons.cpp @@ -0,0 +1,196 @@ +#include "persist_weapons.hpp" +#include "services/gta_data/gta_data_service.hpp" +#include "gta/weapons.hpp" +#include "natives.hpp" + +namespace big +{ + static weaponloadout_json persist_weapon_loadout; + + void persist_weapons::save_weapons(std::string loadout_name) + { + Player player = self::id; + Ped player_ped = self::ped; + weaponloadout_json weapon_json{}; + for (const auto& [name, weapon] : g_gta_data_service->weapons()) + { + Hash weapon_hash = weapon.m_hash; + if (weapon_hash != WEAPON_UNARMED && WEAPON::HAS_PED_GOT_WEAPON(player_ped, weapon_hash, FALSE)) + { + weaponloadout_weapon_json weapon_loadout; + weapon_loadout.weapon = weapon_hash; + weapon_loadout.group = rage::joaat("GROUP_" + weapon.m_weapon_type); + weapon_loadout.tint = WEAPON::GET_PED_WEAPON_TINT_INDEX(player_ped, weapon_hash); + for (auto component : weapon.m_attachments) + { + Hash component_hash = rage::joaat(component); + if (WEAPON::HAS_PED_GOT_WEAPON_COMPONENT(player_ped, weapon_hash, component_hash)) + weapon_loadout.component_array.push_back(component_hash); + } + weapon_json.weapons.push_back(weapon_loadout); + } + } + if (WEAPON::HAS_PED_GOT_WEAPON(player_ped, GADGET_PARACHUTE, FALSE)) + { + weapon_json.parachutes = 1; + int parachute_tint, parachute_pack_tint, reserve_pack_tint, smoke_trail[3]{}; + bool hasReserve = PLAYER::GET_PLAYER_HAS_RESERVE_PARACHUTE(player); + PLAYER::GET_PLAYER_PARACHUTE_TINT_INDEX(player, ¶chute_tint); + PLAYER::GET_PLAYER_PARACHUTE_PACK_TINT_INDEX(player, ¶chute_pack_tint); + weapon_json.parachute_tint = parachute_tint; + weapon_json.parachute_pack_tint = parachute_pack_tint; + if (hasReserve == true) + { + weapon_json.parachutes = 2; + PLAYER::GET_PLAYER_RESERVE_PARACHUTE_TINT_INDEX(player, &reserve_pack_tint); + weapon_json.reserve_pack_tint = reserve_pack_tint; + } + PLAYER::GET_PLAYER_PARACHUTE_SMOKE_TRAIL_COLOR(player, + &weapon_json.smoke_trail[0], + &weapon_json.smoke_trail[1], + &weapon_json.smoke_trail[2]); + } + + nlohmann::json json_output_file = weapon_json; + const auto file = get_weapon_config_folder().get_file(loadout_name + ".json"); + std::ofstream file_stream(file.get_path(), std::ios::out | std::ios::trunc); + file_stream << json_output_file.dump(4); + file_stream.close(); + } + + void persist_weapons::set_weapon_loadout(std::string loadout_name) + { + if (loadout_name.empty()) + return; + + g.persist_weapons.weapon_loadout_file = loadout_name; + persist_weapon_loadout = get_loadout(loadout_name); + } + + void persist_weapons::check_player_has_weapons() + { + if (!g.persist_weapons.enabled) + { + return; + } + + if (persist_weapon_loadout.weapons.empty()) + { + if (g.persist_weapons.weapon_loadout_file.empty()) + { + return; + } + persist_weapon_loadout = get_loadout(g.persist_weapons.weapon_loadout_file); + } + + if (g_local_player == nullptr || g_local_player->m_player_info == nullptr || g_local_player->m_player_info->m_game_state == eGameState::InMPCutscene || STREAMING::IS_PLAYER_SWITCH_IN_PROGRESS() || DLC::GET_IS_LOADING_SCREEN_ACTIVE()) + { + return; + } + + give_Loadout(persist_weapon_loadout); + } + + void persist_weapons::give_player_loadout(std::string loadout_name) + { + give_Loadout(get_loadout(loadout_name)); + } + + weaponloadout_json persist_weapons::get_loadout(std::string loadout_name) + { + auto file = get_weapon_config_folder().get_file(loadout_name); + + if (file.exists()) + { + std::ifstream file_stream(file.get_path()); + try + { + nlohmann::json json_input_file; + + file_stream >> json_input_file; + file_stream.close(); + + weaponloadout_json loadout = json_input_file; + return loadout; + } + catch (std::exception& e) + { + g_notification_service->push_warning("Persist Weapons", "Failed to load JSON file from disk."); + LOG(WARNING) << "Persist Weapons failed to load JSON file: " << g.persist_weapons.weapon_loadout_file << " because " << e.what(); + } + } + else + { + g.persist_weapons.weapon_loadout_file.clear(); + LOG(WARNING) << "persist_weapons cannot open file" << g.persist_weapons.weapon_loadout_file; + } + return {}; + } + + big::folder persist_weapons::get_weapon_config_folder() + { + const auto folder = g_file_manager.get_project_folder("./weapon_loadouts"); + + return folder; + } + + std::vector persist_weapons::list_weapon_loadouts() + { + std::vector file_paths; + + const auto file_path = get_weapon_config_folder(); + for (const auto& directory_entry : std::filesystem::directory_iterator(file_path.get_path())) + if (directory_entry.path().extension() == ".json") + file_paths.push_back(directory_entry.path().filename().generic_string()); + + return file_paths; + } + + void persist_weapons::give_Loadout(const weaponloadout_json& loadout) + { + Player player = self::id; + Ped player_ped = self::ped; + if (PED::IS_PED_DEAD_OR_DYING(player_ped, true)) + return; + + for (auto weapon : loadout.weapons) + { + Hash weapon_hash = weapon.weapon; + bool is_gun = (weapon.group != GROUP_MELEE); + if (WEAPON::HAS_PED_GOT_WEAPON(player_ped, weapon_hash, FALSE) == false + || (is_gun && (WEAPON::GET_PED_WEAPON_TINT_INDEX(player_ped, weapon_hash) != weapon.tint || (WEAPON::GET_AMMO_IN_PED_WEAPON(player_ped, weapon_hash) == 0)))) + { + int maxAmmo; + if (WEAPON::GET_MAX_AMMO(player_ped, weapon_hash, &maxAmmo) == FALSE) + maxAmmo = 9999; + WEAPON::GIVE_WEAPON_TO_PED(player_ped, weapon_hash, maxAmmo, FALSE, FALSE); + if (weapon.group != GROUP_MELEE) + { + WEAPON::SET_PED_WEAPON_TINT_INDEX(player_ped, weapon_hash, weapon.tint); + for (auto component : g_gta_data_service->weapon_by_hash(weapon_hash).m_attachments) + WEAPON::REMOVE_WEAPON_COMPONENT_FROM_PED(player_ped, weapon_hash, rage::joaat(component)); + for (auto component : weapon.component_array) + WEAPON::GIVE_WEAPON_COMPONENT_TO_PED(player_ped, weapon_hash, component); + WEAPON::GIVE_WEAPON_TO_PED(player_ped, weapon_hash, (WEAPON::GET_MAX_AMMO(player_ped, weapon_hash, &maxAmmo) == TRUE) ? maxAmmo : 9999, FALSE, FALSE); //Mk II weapons require giving the weapon to the player twice for them to work, because reasons. + } + } + } + if (loadout.parachutes != 0) + { + WEAPON::GIVE_WEAPON_TO_PED(player_ped, GADGET_PARACHUTE, 1, FALSE, FALSE); + PLAYER::SET_PLAYER_PARACHUTE_TINT_INDEX(player, loadout.parachute_tint); + PLAYER::SET_PLAYER_PARACHUTE_PACK_TINT_INDEX(player, loadout.parachute_pack_tint); + if (loadout.parachutes == 2) + { + PLAYER::SET_PLAYER_HAS_RESERVE_PARACHUTE(player); + PLAYER::SET_PLAYER_RESERVE_PARACHUTE_TINT_INDEX(player, loadout.reserve_pack_tint); + } + auto smoke_trail = loadout.smoke_trail; + if ((smoke_trail[0] + smoke_trail[1] + smoke_trail[2]) != 765) //255 + 255 + 255 + { + PLAYER::SET_PLAYER_CAN_LEAVE_PARACHUTE_SMOKE_TRAIL(player, TRUE); + PLAYER::SET_PLAYER_PARACHUTE_SMOKE_TRAIL_COLOR(player, smoke_trail[0], smoke_trail[1], smoke_trail[2]); + } + } + } +} \ No newline at end of file diff --git a/src/services/persist_weapons/persist_weapons.hpp b/src/services/persist_weapons/persist_weapons.hpp new file mode 100644 index 00000000..9e24f9bc --- /dev/null +++ b/src/services/persist_weapons/persist_weapons.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include "weaponloadout_json.hpp" + +namespace big +{ + class persist_weapons + { + public: + static void save_weapons(std::string loadout_name); + static void set_weapon_loadout(std::string loadout_name); + static std::vector list_weapon_loadouts(); + static void check_player_has_weapons(); + static void give_player_loadout(std::string loadout_name); + private: + static weaponloadout_json get_loadout(std::string loadout_name); + static big::folder get_weapon_config_folder(); + static void give_Loadout(const weaponloadout_json& loadout); + }; +} diff --git a/src/services/persist_weapons/weaponloadout_json.hpp b/src/services/persist_weapons/weaponloadout_json.hpp new file mode 100644 index 00000000..54ce31d5 --- /dev/null +++ b/src/services/persist_weapons/weaponloadout_json.hpp @@ -0,0 +1,27 @@ +#pragma once + +namespace big +{ + struct weaponloadout_weapon_json + { + Hash weapon; + Hash group; + std::vector component_array; + int tint; + + NLOHMANN_DEFINE_TYPE_INTRUSIVE(weaponloadout_weapon_json, weapon, group, component_array, tint) + }; + + + struct weaponloadout_json + { + std::vector weapons; + int parachutes; + int parachute_tint; + int parachute_pack_tint; + int reserve_pack_tint; + int smoke_trail[3]; + + NLOHMANN_DEFINE_TYPE_INTRUSIVE(weaponloadout_json, weapons, parachutes, parachute_tint, parachute_pack_tint, reserve_pack_tint, smoke_trail) + }; +} \ No newline at end of file diff --git a/src/views/self/view_weapons.cpp b/src/views/self/view_weapons.cpp index 2eb13ea2..3d1845d3 100644 --- a/src/views/self/view_weapons.cpp +++ b/src/views/self/view_weapons.cpp @@ -7,6 +7,7 @@ #include "pointers.hpp" #include "services/gta_data/gta_data_service.hpp" #include "views/view.hpp" +#include "services/persist_weapons/persist_weapons.hpp" namespace big { @@ -177,92 +178,131 @@ namespace big ImGui::PopItemWidth(); } - ImGui::SeparatorText("Ammunation"); - static Hash selected_weapon_hash, selected_weapon_attachment_hash{}; - static std::string selected_weapon, selected_weapon_attachment; - ImGui::PushItemWidth(300); - if (ImGui::BeginCombo("Weapons", selected_weapon.c_str())) + if (ImGui::CollapsingHeader("Ammunation")) { - for (auto& weapon : g_gta_data_service->weapons()) + static Hash selected_weapon_hash, selected_weapon_attachment_hash{}; + static std::string selected_weapon, selected_weapon_attachment; + ImGui::PushItemWidth(300); + if (ImGui::BeginCombo("Weapons", selected_weapon.c_str())) { - bool is_selected = weapon.second.m_hash == selected_weapon_hash; - if (weapon.second.m_display_name != "NULL" && ImGui::Selectable(weapon.second.m_display_name.c_str(), is_selected, ImGuiSelectableFlags_None)) + for (auto& weapon : g_gta_data_service->weapons()) { - selected_weapon = weapon.second.m_display_name; - selected_weapon_hash = weapon.second.m_hash; - selected_weapon_attachment_hash = {}; - selected_weapon_attachment.clear(); - } - if (is_selected) - ImGui::SetItemDefaultFocus(); - } - ImGui::EndCombo(); - } - ImGui::PopItemWidth(); - ImGui::SameLine(); - components::button("Give Weapon", [] { - WEAPON::GIVE_WEAPON_TO_PED(self::ped, selected_weapon_hash, 9999, false, true); - }); - ImGui::SameLine(); - components::button("Remove Weapon", [] { - WEAPON::REMOVE_WEAPON_FROM_PED(self::ped, selected_weapon_hash); - }); - - ImGui::PushItemWidth(250); - if (ImGui::BeginCombo("Attachments", selected_weapon_attachment.c_str())) - { - auto weapon = g_gta_data_service->weapon_by_hash(selected_weapon_hash); - if (!weapon.m_attachments.empty()) - { - for (std::string attachment : weapon.m_attachments) - { - auto attachment_component = g_gta_data_service->weapon_component_by_name(attachment); - std::string attachment_name = attachment_component.m_display_name; - Hash attachment_hash = attachment_component.m_hash; - if (attachment_hash == NULL) + bool is_selected = weapon.second.m_hash == selected_weapon_hash; + if (weapon.second.m_display_name != "NULL" && ImGui::Selectable(weapon.second.m_display_name.c_str(), is_selected, ImGuiSelectableFlags_None)) { - attachment_name = attachment; - attachment_hash = rage::joaat(attachment); - } - bool is_selected = attachment_hash == selected_weapon_attachment_hash; - std::string display_name = attachment_name.append("##").append(std::to_string(attachment_hash)); - if (ImGui::Selectable(display_name.c_str(), is_selected, ImGuiSelectableFlags_None)) - { - selected_weapon_attachment = attachment_name; - selected_weapon_attachment_hash = attachment_hash; + selected_weapon = weapon.second.m_display_name; + selected_weapon_hash = weapon.second.m_hash; + selected_weapon_attachment_hash = {}; + selected_weapon_attachment.clear(); } if (is_selected) ImGui::SetItemDefaultFocus(); } + ImGui::EndCombo(); } + ImGui::PopItemWidth(); + ImGui::SameLine(); + components::button("Give Weapon", [] { + WEAPON::GIVE_WEAPON_TO_PED(self::ped, selected_weapon_hash, 9999, false, true); + }); + ImGui::SameLine(); + components::button("Remove Weapon", [] { + WEAPON::REMOVE_WEAPON_FROM_PED(self::ped, selected_weapon_hash); + }); - ImGui::EndCombo(); + ImGui::PushItemWidth(250); + if (ImGui::BeginCombo("Attachments", selected_weapon_attachment.c_str())) + { + auto weapon = g_gta_data_service->weapon_by_hash(selected_weapon_hash); + if (!weapon.m_attachments.empty()) + { + for (std::string attachment : weapon.m_attachments) + { + auto attachment_component = g_gta_data_service->weapon_component_by_name(attachment); + std::string attachment_name = attachment_component.m_display_name; + Hash attachment_hash = attachment_component.m_hash; + if (attachment_hash == NULL) + { + attachment_name = attachment; + attachment_hash = rage::joaat(attachment); + } + bool is_selected = attachment_hash == selected_weapon_attachment_hash; + std::string display_name = attachment_name.append("##").append(std::to_string(attachment_hash)); + if (ImGui::Selectable(display_name.c_str(), is_selected, ImGuiSelectableFlags_None)) + { + selected_weapon_attachment = attachment_name; + selected_weapon_attachment_hash = attachment_hash; + } + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + } + + ImGui::EndCombo(); + } + ImGui::SameLine(); + components::button("Add to Weapon", [] { + WEAPON::GIVE_WEAPON_COMPONENT_TO_PED(self::ped, selected_weapon_hash, selected_weapon_attachment_hash); + }); + ImGui::SameLine(); + components::button("Remove from Weapon", [] { + WEAPON::REMOVE_WEAPON_COMPONENT_FROM_PED(self::ped, selected_weapon_hash, selected_weapon_attachment_hash); + }); + ImGui::PopItemWidth(); + + static const char* default_tints[]{"Black tint", "Green tint", "Gold tint", "Pink tint", "Army tint", "LSPD tint", "Orange tint", "Platinum tint"}; + static const char* mk2_tints[]{"Classic Black", "Classic Grey", "Classic Two - Tone", "Classic White", "Classic Beige", "Classic Green", "Classic Blue", "Classic Earth", "Classic Brown & Black", "Red Contrast", "Blue Contrast", "Yellow Contrast", "Orange Contrast", "Bold Pink", "Bold Purple & Yellow", "Bold Orange", "Bold Green & Purple", "Bold Red Features", "Bold Green Features", "Bold Cyan Features", "Bold Yellow Features", "Bold Red & White", "Bold Blue & White", "Metallic Gold", "Metallic Platinum", "Metallic Grey & Lilac", "Metallic Purple & Lime", "Metallic Red", "Metallic Green", "Metallic Blue", "Metallic White & Aqua", "Metallic Red & Yellow"}; + static int tint; + + if (selected_weapon.ends_with("Mk II")) + { + ImGui::Combo("Tints", &tint, mk2_tints, IM_ARRAYSIZE(mk2_tints)); + } + else + { + ImGui::Combo("Tints", &tint, default_tints, IM_ARRAYSIZE(default_tints)); + } + ImGui::SameLine(); + components::button("Apply", [] { + WEAPON::SET_PED_WEAPON_TINT_INDEX(self::ped, selected_weapon_hash, tint); + }); } - ImGui::SameLine(); - components::button("Add to Weapon", [] { - WEAPON::GIVE_WEAPON_COMPONENT_TO_PED(self::ped, selected_weapon_hash, selected_weapon_attachment_hash); - }); - ImGui::SameLine(); - components::button("Remove from Weapon", [] { - WEAPON::REMOVE_WEAPON_COMPONENT_FROM_PED(self::ped, selected_weapon_hash, selected_weapon_attachment_hash); - }); - ImGui::PopItemWidth(); - - static const char* default_tints[]{"Black tint", "Green tint", "Gold tint", "Pink tint", "Army tint", "LSPD tint", "Orange tint", "Platinum tint"}; - static const char* mk2_tints[]{"Classic Black", "Classic Grey", "Classic Two - Tone", "Classic White", "Classic Beige", "Classic Green", "Classic Blue", "Classic Earth", "Classic Brown & Black", "Red Contrast", "Blue Contrast", "Yellow Contrast", "Orange Contrast", "Bold Pink", "Bold Purple & Yellow", "Bold Orange", "Bold Green & Purple", "Bold Red Features", "Bold Green Features", "Bold Cyan Features", "Bold Yellow Features", "Bold Red & White", "Bold Blue & White", "Metallic Gold", "Metallic Platinum", "Metallic Grey & Lilac", "Metallic Purple & Lime", "Metallic Red", "Metallic Green", "Metallic Blue", "Metallic White & Aqua", "Metallic Red & Yellow"}; - static int tint; - - if (selected_weapon.ends_with("Mk II")) + if (ImGui::CollapsingHeader("Persist Weapons")) { - ImGui::Combo("Tints", &tint, mk2_tints, IM_ARRAYSIZE(mk2_tints)); + ImGui::Checkbox("Enabled", &g.persist_weapons.enabled); + + static std::string selected_loadout = g.persist_weapons.weapon_loadout_file; + ImGui::PushItemWidth(250); + if (ImGui::BeginListBox("Saved Loadouts", ImVec2(200, 200))) + { + for (auto filename : persist_weapons::list_weapon_loadouts()) + { + if (components::selectable(filename, filename == selected_loadout)) + { + selected_loadout = filename; + } + } + ImGui::EndListBox(); + } + ImGui::SameLine(); + ImGui::BeginGroup(); + static std::string 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(); + }); + ImGui::SameLine(); + components::button("Load Loadout", [] { + persist_weapons::give_player_loadout(selected_loadout); + }); + ImGui::SameLine(); + components::button("Set Loadout", [] { + persist_weapons::set_weapon_loadout(selected_loadout); + }); + ImGui::Text(std::format("Current Loadout: {}:", g.persist_weapons.weapon_loadout_file).data()); + ImGui::EndGroup(); + ImGui::PopItemWidth(); } - else - { - ImGui::Combo("Tints", &tint, default_tints, IM_ARRAYSIZE(default_tints)); - } - ImGui::SameLine(); - components::button("Apply", [] { - WEAPON::SET_PED_WEAPON_TINT_INDEX(self::ped, selected_weapon_hash, tint); - }); } }