From 41fdc316816ff7788053b751ad32a696a7080199 Mon Sep 17 00:00:00 2001 From: maybegreat48 <96936658+maybegreat48@users.noreply.github.com> Date: Mon, 23 Jun 2025 02:57:26 -0400 Subject: [PATCH] feat(world): improve ped spawner --- src/game/features/world/Spawn.cpp | 26 - src/game/frontend/submenus/World.cpp | 30 +- src/game/frontend/submenus/World/SpawnPed.cpp | 141 +++ src/game/frontend/submenus/World/SpawnPed.hpp | 8 + src/game/gta/Ped.cpp | 53 + src/game/gta/Ped.hpp | 15 + src/game/gta/Player.cpp | 5 + src/game/gta/Player.hpp | 2 + src/game/gta/data/PedModels.hpp | 1104 +++++++++++++++++ src/game/hooks/Info/AssignPhysicalIndex.cpp | 17 +- src/types/ped/PedCombatAttribute.hpp | 96 ++ 11 files changed, 1442 insertions(+), 55 deletions(-) create mode 100644 src/game/frontend/submenus/World/SpawnPed.cpp create mode 100644 src/game/frontend/submenus/World/SpawnPed.hpp create mode 100644 src/game/gta/data/PedModels.hpp create mode 100644 src/types/ped/PedCombatAttribute.hpp diff --git a/src/game/features/world/Spawn.cpp b/src/game/features/world/Spawn.cpp index c5d92ce..7c74b22 100644 --- a/src/game/features/world/Spawn.cpp +++ b/src/game/features/world/Spawn.cpp @@ -6,34 +6,9 @@ namespace YimMenu::Features { - static StringCommand _VehicleModelName{"vehmodelname", "Vehicle Model", "The model name of the vehicle you wish to spawn."}; static StringCommand _PedModelName{"pedmodelname", "Ped Model", "The model name of the ped you wish to spawn."}; static StringCommand _ObjectModelName{"objectmodelname", "Object Model", "The model name of the object you wish to spawn."}; - class SpawnVehicle : public Command - { - using Command::Command; - - virtual void OnCall() override - { - auto model = _VehicleModelName.GetString(); - if (!model.length()) - { - Notifications::Show("Spawn Vehicle", "No model name provided.", NotificationType::Error); - return; - } - - auto modelHash = Joaat(model); - if (STREAMING::IS_MODEL_IN_CDIMAGE(modelHash)) - { - Vehicle::Create(modelHash, Self::GetPed().GetPosition(), Self::GetPed().GetHeading()); - } - else - { - Notifications::Show("Spawn Vehicle", "Invalid model name provided.", NotificationType::Error); - } - } - }; class SpawnPed : public Command { @@ -85,7 +60,6 @@ namespace YimMenu::Features } }; - static SpawnVehicle _SpawnVehicle{"spawnvehicle", "Spawn Vehicle", "Spawns a vehicle at your current location."}; static SpawnPed _SpawnPed{"spawnped", "Spawn Ped", "Spawns a ped at your current location."}; static SpawnObject _SpawnObject{"spawnobject", "Spawn Object", "Spawns an object at your current location."}; } \ No newline at end of file diff --git a/src/game/frontend/submenus/World.cpp b/src/game/frontend/submenus/World.cpp index 1b957e1..e898b88 100644 --- a/src/game/frontend/submenus/World.cpp +++ b/src/game/frontend/submenus/World.cpp @@ -1,5 +1,6 @@ #include "World.hpp" #include "game/frontend/items/Items.hpp" +#include "World/SpawnPed.hpp" namespace YimMenu::Submenus { @@ -8,7 +9,6 @@ namespace YimMenu::Submenus Submenu::Submenu("World", ICON_FA_GLOBE) { auto main = std::make_shared("Main"); - auto spawnersGroup = std::make_shared("Spawners"); auto iplsGroup = std::make_shared("IPLs"); auto killPeds = std::make_shared("Kill", 1); @@ -29,11 +29,13 @@ namespace YimMenu::Submenus weatherOpts->AddItem(std::make_shared("forceweather"_J, std::make_shared("setweather"_J), true)); weatherOpts->AddItem(std::make_shared("forceweather"_J)); - auto timeGroup = std::make_shared("Time Control"); + auto timeGroup = std::make_shared("Time"); - timeGroup->AddItem(std::make_shared("networktimehour"_J, "Hour")); - timeGroup->AddItem(std::make_shared("networktimeminute"_J, "Minute")); - timeGroup->AddItem(std::make_shared("networktimesecond"_J, "Second")); + auto hms = std::make_shared("", 1); + hms->AddItem(std::make_shared("networktimehour"_J, "Hour")); + hms->AddItem(std::make_shared("networktimeminute"_J, "Minute")); + hms->AddItem(std::make_shared("networktimesecond"_J, "Second")); + timeGroup->AddItem(std::move(hms)); timeGroup->AddItem(std::make_shared("setnetworktime"_J, "Set")); timeGroup->AddItem(std::make_shared("freezenetworktime"_J, "Freeze")); @@ -51,29 +53,13 @@ namespace YimMenu::Submenus main->AddItem(std::move(otherOpts)); main->AddItem(timeGroup); - auto spawnVehicle = std::make_shared("Vehicle"); - spawnVehicle->AddItem(std::make_shared("vehmodelname"_J)); - spawnVehicle->AddItem(std::make_shared("spawnvehicle"_J)); - - auto spawnPed = std::make_shared("Ped"); - spawnPed->AddItem(std::make_shared("pedmodelname"_J)); - spawnPed->AddItem(std::make_shared("spawnped"_J)); - - auto spawnObject = std::make_shared("Object"); - spawnObject->AddItem(std::make_shared("objectmodelname"_J)); - spawnObject->AddItem(std::make_shared("spawnobject"_J)); - - spawnersGroup->AddItem(spawnVehicle); - spawnersGroup->AddItem(spawnPed); - spawnersGroup->AddItem(spawnObject); - iplsGroup->AddItem(std::make_shared("iplselector"_J)); iplsGroup->AddItem(std::make_shared("loadipl"_J)); iplsGroup->AddItem(std::make_shared("unloadipl"_J)); iplsGroup->AddItem(std::make_shared("ipltp"_J)); AddCategory(std::move(main)); - AddCategory(std::move(spawnersGroup)); + AddCategory(std::move(BuildSpawnPedMenu())); AddCategory(std::move(iplsGroup)); } }; \ No newline at end of file diff --git a/src/game/frontend/submenus/World/SpawnPed.cpp b/src/game/frontend/submenus/World/SpawnPed.cpp new file mode 100644 index 0000000..402e820 --- /dev/null +++ b/src/game/frontend/submenus/World/SpawnPed.cpp @@ -0,0 +1,141 @@ +#include "SpawnPed.hpp" +#include "core/backend/ScriptMgr.hpp" +#include "core/backend/FiberPool.hpp" +#include "game/backend/Self.hpp" +#include "game/gta/data/PedModels.hpp" +#include "game/gta/Ped.hpp" +#include "game/gta/Natives.hpp" +#include "types/ped/PedCombatAttribute.hpp" +#include "game/gta/data/Weapons.hpp" +#include "game/gta/Scripts.hpp" + +namespace YimMenu::Submenus +{ + std::shared_ptr BuildSpawnPedMenu() + { + auto menu = std::make_shared("Spawn Ped"); + + static bool invincible; + static bool spawnDead; + static bool spawnAsBodyguard; + static bool spawnAsCop; + static bool giveAllWeapons; + static bool spawnAsProstitute; + static std::vector spawnedPeds; + + menu->AddItem(std::make_unique([] { + static char search[64]; + ImGui::SetNextItemWidth(300.f); + ImGui::InputTextWithHint("Name", "Search", search, sizeof(search)); + + const int visible = std::min(20, static_cast(g_PedModels.size())); + const float height = visible * ImGui::GetTextLineHeightWithSpacing(); + if (ImGui::BeginListBox("##vehicles", {300.f, height})) + { + std::string lower = search; + std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower); + for (int veh = 0; veh < g_PedModels.size(); veh++) + { + auto name = g_PedModels[veh]; + auto lowerName = std::string(name); + std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), ::tolower); + + bool matchesSearch = lowerName.find(lower) != std::string::npos; + if (matchesSearch) + { + ImGui::PushID(name); + if (ImGui::Selectable(name)) + { + FiberPool::Push([name] { + auto hash = Joaat(name); + auto handle = Ped::Create(hash, Self::GetPed().GetPosition(), Self::GetPed().GetHeading()); + + handle.SetCombatAttribute(PedCombatAttribute::AlwaysFight, true); + handle.SetCombatAttribute(PedCombatAttribute::DisableAllRandomsFlee, true); + handle.SetCombatAttribute(PedCombatAttribute::DisableFleeFromCombat, true); + handle.SetCombatAttribute(PedCombatAttribute::CanUseVehicles, true); + handle.SetCombatAttribute(PedCombatAttribute::CanLeaveVehicle, true); + + if (invincible) + handle.SetInvincible(true); + + if (spawnDead) + handle.Kill(); + + if (spawnAsBodyguard) + { + handle.SetCombatAttribute(PedCombatAttribute::CanCharge, true); + handle.SetCombatAttribute(PedCombatAttribute::CanCommandeerVehicles, true); + handle.SetCombatAttribute(PedCombatAttribute::DisableInjuredOnGround, true); + handle.SetCombatAttribute(PedCombatAttribute::AllowDogFighting, true); + handle.SetCombatAttribute(PedCombatAttribute::PerfectAccuracy, true); + handle.SetCombatAttribute(PedCombatAttribute::UseVehicleAttack, true); + handle.SetCombatAttribute(PedCombatAttribute::CanDoDrivebys, true); + handle.SetCombatAttribute(PedCombatAttribute::FleesFromInvincibleOpponents, false); + handle.SetCombatAttribute(PedCombatAttribute::CanThrowSmokeGrenade, true); + handle.SetCombatAttribute(PedCombatAttribute::CanSeeUnderwaterPeds, true); + + auto group = Self::GetPlayer().GetGroup(); + handle.AddToGroup(group); + PED::SET_GROUP_SEPARATION_RANGE(group, 9999.9f); + PED::SET_PED_CAN_TELEPORT_TO_GROUP_LEADER(handle.GetHandle(), group, true); + PED::SET_GROUP_FORMATION_SPACING(group, 10.0f, 0.0f, 0.0f); + } + + if (spawnAsCop) + { + handle.SetAsCop(); + } + + if (giveAllWeapons) + { + for (auto hash : g_WeaponHashes) + handle.GiveWeapon(hash); + } + + if (spawnAsProstitute) + { + handle.StartScenario("WORLD_HUMAN_PROSTITUTE_HIGH_CLASS"); + handle.SetKeepTask(true); + + if (!*Pointers.IsSessionStarted) + { + PED_INDEX ped = handle.GetHandle(); + Scripts::StartScript("pb_prostitute"_J, eStackSizes::FRIEND, &ped, 1); + } + } + + spawnedPeds.push_back(handle); + }); + } + ImGui::PopID(); + } + } + + ImGui::EndListBox(); + } + + ImGui::SameLine(); + ImGui::BeginGroup(); + ImGui::Checkbox("Invincible", &invincible); + ImGui::Checkbox("Spawn Dead", &spawnDead); + ImGui::Checkbox("Spawn As Bodyguard", &spawnAsBodyguard); + ImGui::Checkbox("Spawn As Cop", &spawnAsCop); + ImGui::Checkbox("Give All Weapons", &giveAllWeapons); + ImGui::Checkbox("Spawn As Prostitute", &spawnAsProstitute); + if (ImGui::Button("Remove All")) + { + FiberPool::Push([] { + for (auto& ped : spawnedPeds) + if (ped) + ped.Delete(); + + spawnedPeds.clear(); + }); + } + ImGui::EndGroup(); + })); + + return menu; + } +} \ No newline at end of file diff --git a/src/game/frontend/submenus/World/SpawnPed.hpp b/src/game/frontend/submenus/World/SpawnPed.hpp new file mode 100644 index 0000000..857a380 --- /dev/null +++ b/src/game/frontend/submenus/World/SpawnPed.hpp @@ -0,0 +1,8 @@ +#pragma once +#include "core/frontend/manager/Category.hpp" +#include "game/frontend/items/Items.hpp" + +namespace YimMenu::Submenus +{ + std::shared_ptr BuildSpawnPedMenu(); +} \ No newline at end of file diff --git a/src/game/gta/Ped.cpp b/src/game/gta/Ped.cpp index 8814389..946c2c1 100644 --- a/src/game/gta/Ped.cpp +++ b/src/game/gta/Ped.cpp @@ -116,6 +116,13 @@ namespace YimMenu PED::SET_PED_CONFIG_FLAG(GetHandle(), (int)flag, value); } + void Ped::SetCombatAttribute(PedCombatAttribute attribute, bool value) + { + ENTITY_ASSERT_VALID(); + ENTITY_ASSERT_CONTROL(); + PED::SET_PED_COMBAT_ATTRIBUTES(GetHandle(), (int)attribute, value); + } + bool Ped::IsEnemy() { ENTITY_ASSERT_VALID(); @@ -224,12 +231,50 @@ namespace YimMenu void Ped::SetArmour(int amount) { ENTITY_ASSERT_VALID(); + ENTITY_ASSERT_CONTROL(); PED::SET_PED_ARMOUR(GetHandle(), amount); } + void Ped::SetLeaderOfGroup(int group) + { + ENTITY_ASSERT_VALID(); + PED::SET_PED_AS_GROUP_LEADER(GetHandle(), group); + } + + void Ped::AddToGroup(int group) + { + ENTITY_ASSERT_VALID(); + PED::SET_PED_AS_GROUP_MEMBER(GetHandle(), group); + } + + void Ped::RemoveFromGroup() + { + ENTITY_ASSERT_VALID(); + PED::REMOVE_PED_FROM_GROUP(GetHandle()); + } + + bool Ped::IsMemberOfGroup(int group) + { + ENTITY_ASSERT_VALID(); + return PED::IS_PED_GROUP_MEMBER(GetHandle(), group); + } + + void Ped::StartScenario(std::string_view name, int duration, bool entry_anim) + { + ENTITY_ASSERT_VALID(); + TASK::TASK_START_SCENARIO_IN_PLACE(GetHandle(), name.data(), duration, entry_anim); + } + + void Ped::SetKeepTask(bool keep) + { + ENTITY_ASSERT_VALID(); + PED::SET_PED_KEEP_TASK(GetHandle(), keep); + } + void Ped::ClearDamage() { ENTITY_ASSERT_VALID(); + ENTITY_ASSERT_CONTROL(); PED::CLEAR_PED_BLOOD_DAMAGE(GetHandle()); PED::CLEAR_PED_WETNESS(GetHandle()); PED::CLEAR_PED_ENV_DIRT(GetHandle()); @@ -239,9 +284,17 @@ namespace YimMenu void Ped::SetMaxTimeUnderwater(int time) { ENTITY_ASSERT_VALID(); + ENTITY_ASSERT_CONTROL(); PED::SET_PED_MAX_TIME_UNDERWATER(GetHandle(), time); } + void Ped::SetAsCop() + { + ENTITY_ASSERT_VALID(); + ENTITY_ASSERT_CONTROL(); + PED::SET_PED_AS_COP(GetHandle(), true); + } + void Ped::SetMaxAmmoForWeapon(std::uint32_t hash) { int maxAmmo; diff --git a/src/game/gta/Ped.hpp b/src/game/gta/Ped.hpp index 54c2603..f6808e4 100644 --- a/src/game/gta/Ped.hpp +++ b/src/game/gta/Ped.hpp @@ -3,6 +3,7 @@ #include "Vehicle.hpp" enum class PedConfigFlag : std::uint32_t; +enum class PedCombatAttribute : std::uint32_t; namespace YimMenu { @@ -30,6 +31,9 @@ namespace YimMenu bool GetConfigFlag(PedConfigFlag flag); void SetConfigFlag(PedConfigFlag flag, bool value); + // combat attributes + void SetCombatAttribute(PedCombatAttribute attribute, bool value); + // relationships bool IsEnemy(); @@ -57,8 +61,19 @@ namespace YimMenu int GetArmour(); void SetArmour(int amount); + // groups + void SetLeaderOfGroup(int group); + void AddToGroup(int group); + void RemoveFromGroup(); + bool IsMemberOfGroup(int group); + + // tasks + void StartScenario(std::string_view name, int duration = -1, bool entry_anim = true); + void SetKeepTask(bool keep); + // misc void ClearDamage(); void SetMaxTimeUnderwater(int time); + void SetAsCop(); }; } \ No newline at end of file diff --git a/src/game/gta/Player.cpp b/src/game/gta/Player.cpp index 951bfed..520d745 100644 --- a/src/game/gta/Player.cpp +++ b/src/game/gta/Player.cpp @@ -352,6 +352,11 @@ namespace YimMenu return PLAYER::GET_PLAYER_MAX_ARMOUR(GetId()); // Not checking IsValid to let GetId return 0 in SP } + int Player::GetGroup() + { + return PLAYER::GET_PLAYER_GROUP(GetId()); + } + bool Player::operator==(Player other) { return m_Handle == other.m_Handle; diff --git a/src/game/gta/Player.hpp b/src/game/gta/Player.hpp index 3925b69..fb7260c 100644 --- a/src/game/gta/Player.hpp +++ b/src/game/gta/Player.hpp @@ -83,6 +83,8 @@ namespace YimMenu int GetMaxArmour(); + int GetGroup(); + bool operator==(Player other); inline operator bool() diff --git a/src/game/gta/data/PedModels.hpp b/src/game/gta/data/PedModels.hpp new file mode 100644 index 0000000..11bdab8 --- /dev/null +++ b/src/game/gta/data/PedModels.hpp @@ -0,0 +1,1104 @@ +#pragma once + +namespace YimMenu +{ + constexpr auto g_PedModels = std::to_array({ + "a_c_boar", + "a_c_boar_02", + "a_c_cat_01", + "a_c_chickenhawk", + "a_c_chimp", + "a_c_chimp_02", + "a_c_chop", + "a_c_chop_02", + "a_c_cormorant", + "a_c_cow", + "a_c_coyote", + "a_c_coyote_02", + "a_c_crow", + "a_c_deer", + "a_c_deer_02", + "a_c_dolphin", + "a_c_fish", + "a_c_hen", + "a_c_humpback", + "a_c_husky", + "a_c_killerwhale", + "a_c_mtlion", + "a_c_mtlion_02", + "a_c_panther", + "a_c_pig", + "a_c_pigeon", + "a_c_poodle", + "a_c_pug", + "a_c_pug_02", + "a_c_rabbit_01", + "a_c_rabbit_02", + "a_c_rat", + "a_c_retriever", + "a_c_rhesus", + "a_c_rottweiler", + "a_c_rottweiler_02", + "a_c_seagull", + "a_c_sharkhammer", + "a_c_sharktiger", + "a_c_shepherd", + "a_c_stingray", + "a_c_westy", + "a_f_m_beach_01", + "a_f_m_bevhills_01", + "a_f_m_bevhills_02", + "a_f_m_bodybuild_01", + "a_f_m_business_02", + "a_f_m_downtown_01", + "a_f_m_eastsa_01", + "a_f_m_eastsa_02", + "a_f_m_fatbla_01", + "a_f_m_fatcult_01", + "a_f_m_fatwhite_01", + "a_f_m_genbiker_01", + "a_f_m_genstreet_01", + "a_f_m_ktown_01", + "a_f_m_ktown_02", + "a_f_m_prolhost_01", + "a_f_m_salton_01", + "a_f_m_skidrow_01", + "a_f_m_soucent_01", + "a_f_m_soucent_02", + "a_f_m_soucentmc_01", + "a_f_m_tourist_01", + "a_f_m_tramp_01", + "a_f_m_trampbeac_01", + "a_f_o_genstreet_01", + "a_f_o_indian_01", + "a_f_o_ktown_01", + "a_f_o_salton_01", + "a_f_o_soucent_01", + "a_f_o_soucent_02", + "a_f_y_beach_01", + "a_f_y_beach_02", + "a_f_y_bevhills_01", + "a_f_y_bevhills_02", + "a_f_y_bevhills_03", + "a_f_y_bevhills_04", + "a_f_y_bevhills_05", + "a_f_y_business_01", + "a_f_y_business_02", + "a_f_y_business_03", + "a_f_y_business_04", + "a_f_y_carclub_01", + "a_f_y_carclub_02", + "a_f_y_clubcust_01", + "a_f_y_clubcust_02", + "a_f_y_clubcust_03", + "a_f_y_clubcust_04", + "a_f_y_eastsa_01", + "a_f_y_eastsa_02", + "a_f_y_eastsa_03", + "a_f_y_epsilon_01", + "a_f_y_femaleagent", + "a_f_y_fitness_01", + "a_f_y_fitness_02", + "a_f_y_gencaspat_01", + "a_f_y_genhot_01", + "a_f_y_golfer_01", + "a_f_y_hiker_01", + "a_f_y_hippie_01", + "a_f_y_hipster_01", + "a_f_y_hipster_02", + "a_f_y_hipster_03", + "a_f_y_hipster_04", + "a_f_y_indian_01", + "a_f_y_juggalo_01", + "a_f_y_runner_01", + "a_f_y_rurmeth_01", + "a_f_y_scdressy_01", + "a_f_y_skater_01", + "a_f_y_smartcaspat_01", + "a_f_y_soucent_01", + "a_f_y_soucent_02", + "a_f_y_soucent_03", + "a_f_y_studioparty_01", + "a_f_y_studioparty_02", + "a_f_y_tennis_01", + "a_f_y_topless_01", + "a_f_y_tourist_01", + "a_f_y_tourist_02", + "a_f_y_vinewood_01", + "a_f_y_vinewood_02", + "a_f_y_vinewood_03", + "a_f_y_vinewood_04", + "a_f_y_yoga_01", + "a_m_m_acult_01", + "a_m_m_afriamer_01", + "a_m_m_bankrobber_01", + "a_m_m_beach_01", + "a_m_m_beach_02", + "a_m_m_bevhills_01", + "a_m_m_bevhills_02", + "a_m_m_business_01", + "a_m_m_eastsa_01", + "a_m_m_eastsa_02", + "a_m_m_farmer_01", + "a_m_m_fatlatin_01", + "a_m_m_genbiker_01", + "a_m_m_genfat_01", + "a_m_m_genfat_02", + "a_m_m_golfer_01", + "a_m_m_hasjew_01", + "a_m_m_hillbilly_01", + "a_m_m_hillbilly_02", + "a_m_m_indian_01", + "a_m_m_ktown_01", + "a_m_m_malibu_01", + "a_m_m_mexcntry_01", + "a_m_m_mexlabor_01", + "a_m_m_mlcrisis_01", + "a_m_m_og_boss_01", + "a_m_m_paparazzi_01", + "a_m_m_polynesian_01", + "a_m_m_prolhost_01", + "a_m_m_rurmeth_01", + "a_m_m_salton_01", + "a_m_m_salton_02", + "a_m_m_salton_03", + "a_m_m_salton_04", + "a_m_m_skater_01", + "a_m_m_skidrow_01", + "a_m_m_socenlat_01", + "a_m_m_soucent_01", + "a_m_m_soucent_02", + "a_m_m_soucent_03", + "a_m_m_soucent_04", + "a_m_m_stlat_02", + "a_m_m_studioparty_01", + "a_m_m_tennis_01", + "a_m_m_tourist_01", + "a_m_m_tramp_01", + "a_m_m_trampbeac_01", + "a_m_m_tranvest_01", + "a_m_m_tranvest_02", + "a_m_o_acult_01", + "a_m_o_acult_02", + "a_m_o_beach_01", + "a_m_o_beach_02", + "a_m_o_genstreet_01", + "a_m_o_ktown_01", + "a_m_o_salton_01", + "a_m_o_soucent_01", + "a_m_o_soucent_02", + "a_m_o_soucent_03", + "a_m_o_tramp_01", + "a_m_y_acult_01", + "a_m_y_acult_02", + "a_m_y_beach_01", + "a_m_y_beach_02", + "a_m_y_beach_03", + "a_m_y_beach_04", + "a_m_y_beachvesp_01", + "a_m_y_beachvesp_02", + "a_m_y_bevhills_01", + "a_m_y_bevhills_02", + "a_m_y_breakdance_01", + "a_m_y_busicas_01", + "a_m_y_business_01", + "a_m_y_business_02", + "a_m_y_business_03", + "a_m_y_carclub_01", + "a_m_y_carclub_02", + "a_m_y_clubcust_01", + "a_m_y_clubcust_02", + "a_m_y_clubcust_03", + "a_m_y_clubcust_04", + "a_m_y_cyclist_01", + "a_m_y_dhill_01", + "a_m_y_downtown_01", + "a_m_y_eastsa_01", + "a_m_y_eastsa_02", + "a_m_y_epsilon_01", + "a_m_y_epsilon_02", + "a_m_y_gay_01", + "a_m_y_gay_02", + "a_m_y_gencaspat_01", + "a_m_y_genstreet_01", + "a_m_y_genstreet_02", + "a_m_y_golfer_01", + "a_m_y_hasjew_01", + "a_m_y_hiker_01", + "a_m_y_hippy_01", + "a_m_y_hipster_01", + "a_m_y_hipster_02", + "a_m_y_hipster_03", + "a_m_y_indian_01", + "a_m_y_jetski_01", + "a_m_y_juggalo_01", + "a_m_y_ktown_01", + "a_m_y_ktown_02", + "a_m_y_latino_01", + "a_m_y_methhead_01", + "a_m_y_mexthug_01", + "a_m_y_motox_01", + "a_m_y_motox_02", + "a_m_y_musclbeac_01", + "a_m_y_musclbeac_02", + "a_m_y_polynesian_01", + "a_m_y_roadcyc_01", + "a_m_y_runner_01", + "a_m_y_runner_02", + "a_m_y_salton_01", + "a_m_y_skater_01", + "a_m_y_skater_02", + "a_m_y_smartcaspat_01", + "a_m_y_soucent_01", + "a_m_y_soucent_02", + "a_m_y_soucent_03", + "a_m_y_soucent_04", + "a_m_y_stbla_01", + "a_m_y_stbla_02", + "a_m_y_stlat_01", + "a_m_y_studioparty_01", + "a_m_y_stwhi_01", + "a_m_y_stwhi_02", + "a_m_y_sunbathe_01", + "a_m_y_surfer_01", + "a_m_y_tattoocust_01", + "a_m_y_vindouche_01", + "a_m_y_vinewood_01", + "a_m_y_vinewood_02", + "a_m_y_vinewood_03", + "a_m_y_vinewood_04", + "a_m_y_yoga_01", + "cs_amandatownley", + "cs_andreas", + "cs_ashley", + "cs_bankman", + "cs_barry", + "cs_beverly", + "cs_brad", + "cs_bradcadaver", + "cs_carbuyer", + "cs_casey", + "cs_chengsr", + "cs_chrisformage", + "cs_clay", + "cs_dale", + "cs_davenorton", + "cs_debra", + "cs_denise", + "cs_devin", + "cs_dom", + "cs_dreyfuss", + "cs_drfriedlander", + "cs_drfriedlander_02", + "cs_fabien", + "cs_fbisuit_01", + "cs_floyd", + "cs_guadalope", + "cs_gurk", + "cs_hunter", + "cs_janet", + "cs_jewelass", + "cs_jimmyboston", + "cs_jimmydisanto", + "cs_jimmydisanto2", + "cs_joeminuteman", + "cs_johnnyklebitz", + "cs_josef", + "cs_josh", + "cs_karen_daniels", + "cs_lamardavis", + "cs_lamardavis_02", + "cs_lazlow", + "cs_lazlow_2", + "cs_lestercrest", + "cs_lestercrest_2", + "cs_lestercrest_3", + "cs_lifeinvad_01", + "cs_magenta", + "cs_manuel", + "cs_marnie", + "cs_martinmadrazo", + "cs_martinmadrazo_02", + "cs_maryann", + "cs_michelle", + "cs_milton", + "cs_molly", + "cs_movpremf_01", + "cs_movpremmale", + "cs_mrk", + "cs_mrs_thornhill", + "cs_mrsphillips", + "cs_natalia", + "cs_nervousron", + "cs_nervousron_02", + "cs_nigel", + "cs_old_man1a", + "cs_old_man2", + "cs_omega", + "cs_orleans", + "cs_paper", + "cs_patricia", + "cs_patricia_02", + "cs_priest", + "cs_prolsec_02", + "cs_russiandrunk", + "cs_siemonyetarian", + "cs_solomon", + "cs_stevehains", + "cs_stretch", + "cs_tanisha", + "cs_taocheng", + "cs_taocheng2", + "cs_taostranslator", + "cs_taostranslator2", + "cs_tenniscoach", + "cs_terry", + "cs_tom", + "cs_tomepsilon", + "cs_tracydisanto", + "cs_wade", + "cs_zimbor", + "csb_abigail", + "csb_agatha", + "csb_agent", + "csb_agent14_02", + "csb_alan", + "csb_anita", + "csb_anton", + "csb_ary", + "csb_ary_02", + "csb_avery", + "csb_avischwartzman_02", + "csb_avischwartzman_03", + "csb_avon", + "csb_ballas_leader", + "csb_ballasog", + "csb_billionaire", + "csb_bogdan", + "csb_bride", + "csb_brucie2", + "csb_bryony", + "csb_burgerdrug", + "csb_callgirl_01", + "csb_callgirl_02", + "csb_car3guy1", + "csb_car3guy2", + "csb_celeb_01", + "csb_charlie_reed", + "csb_chef", + "csb_chef2", + "csb_chef_03", + "csb_chin_goon", + "csb_cletus", + "csb_cop", + "csb_customer", + "csb_dax", + "csb_denise_friend", + "csb_dix", + "csb_djblamadon", + "csb_drugdealer", + "csb_englishdave", + "csb_englishdave_02", + "csb_fos_rep", + "csb_g", + "csb_georginacheng", + "csb_golfer_a", + "csb_golfer_b", + "csb_groom", + "csb_grove_str_dlr", + "csb_gustavo", + "csb_hao", + "csb_hao_02", + "csb_helmsmanpavel", + "csb_helmsmanpavel_02", + "csb_huang", + "csb_hugh", + "csb_imani", + "csb_imran", + "csb_isldj_00", + "csb_isldj_01", + "csb_isldj_02", + "csb_isldj_03", + "csb_isldj_04", + "csb_jackhowitzer", + "csb_jamalamir", + "csb_janitor", + "csb_jenettee", + "csb_jio", + "csb_jio_02", + "csb_jodimarshall", + "csb_johnny_guns", + "csb_juanstrickler", + "csb_labrat", + "csb_luchadora", + "csb_maude", + "csb_maude_02", + "csb_miguelmadrazo", + "csb_mimi", + "csb_mjo", + "csb_mjo_02", + "csb_money", + "csb_moodyman_02", + "csb_mp_agent14", + "csb_mrs_r", + "csb_musician_00", + "csb_mweather", + "csb_ortega", + "csb_oscar", + "csb_oscar_02", + "csb_paige", + "csb_party_promo", + "csb_popov", + "csb_porndudes", + "csb_prologuedriver", + "csb_prolsec", + "csb_rafdeangelis", + "csb_ramp_gang", + "csb_ramp_hic", + "csb_ramp_hipster", + "csb_ramp_marine", + "csb_ramp_mex", + "csb_rashcosvki", + "csb_reporter", + "csb_req_officer", + "csb_roccopelosi", + "csb_screen_writer", + "csb_security_a", + "csb_sessanta", + "csb_sol", + "csb_soundeng_00", + "csb_sss", + "csb_stripper_01", + "csb_stripper_02", + "csb_talcc", + "csb_talmm", + "csb_thornton", + "csb_tomcasino", + "csb_tonya", + "csb_tonyprince", + "csb_trafficwarden", + "csb_undercover", + "csb_vagos_leader", + "csb_vagspeak", + "csb_valentina", + "csb_vernon", + "csb_vincent", + "csb_vincent_2", + "csb_vincent_4", + "csb_weiss", + "csb_wendy", + "csb_yusufamir", + "g_f_importexport_01", + "g_f_m_fooliganz_01", + "g_f_m_undeadmage", + "g_f_y_ballas_01", + "g_f_y_families_01", + "g_f_y_lost_01", + "g_f_y_vagos_01", + "g_m_importexport_01", + "g_m_m_armboss_01", + "g_m_m_armgoon_01", + "g_m_m_armlieut_01", + "g_m_m_cartelgoons_01", + "g_m_m_cartelguards_01", + "g_m_m_cartelguards_02", + "g_m_m_casrn_01", + "g_m_m_chemwork_01", + "g_m_m_chiboss_01", + "g_m_m_chicold_01", + "g_m_m_chigoon_01", + "g_m_m_chigoon_02", + "g_m_m_fooliganz_01", + "g_m_m_friedlandergoons_01", + "g_m_m_genthug_01", + "g_m_m_goons_01", + "g_m_m_korboss_01", + "g_m_m_maragrande_01", + "g_m_m_mexboss_01", + "g_m_m_mexboss_02", + "g_m_m_prisoners_01", + "g_m_m_slasher_01", + "g_m_m_zombie_01", + "g_m_m_zombie_02", + "g_m_m_zombie_03", + "g_m_m_zombie_04", + "g_m_m_zombie_05", + "g_m_y_armgoon_02", + "g_m_y_azteca_01", + "g_m_y_ballaeast_01", + "g_m_y_ballaorig_01", + "g_m_y_ballasout_01", + "g_m_y_famca_01", + "g_m_y_famdnf_01", + "g_m_y_famfor_01", + "g_m_y_korean_01", + "g_m_y_korean_02", + "g_m_y_korlieut_01", + "g_m_y_lost_01", + "g_m_y_lost_02", + "g_m_y_lost_03", + "g_m_y_mexgang_01", + "g_m_y_mexgoon_01", + "g_m_y_mexgoon_02", + "g_m_y_mexgoon_03", + "g_m_y_pologoon_01", + "g_m_y_pologoon_02", + "g_m_y_salvaboss_01", + "g_m_y_salvagoon_01", + "g_m_y_salvagoon_02", + "g_m_y_salvagoon_03", + "g_m_y_strpunk_01", + "g_m_y_strpunk_02", + "hc_driver", + "hc_gunman", + "hc_hacker", + "ig_abigail", + "ig_acidlabcook", + "ig_agatha", + "ig_agent", + "ig_agent14_02", + "ig_agent_02", + "ig_ahronward", + "ig_amandatownley", + "ig_andreas", + "ig_armsmanufac_01", + "ig_ary", + "ig_ary_02", + "ig_ashley", + "ig_avery", + "ig_avischwartzman_02", + "ig_avischwartzman_03", + "ig_avon", + "ig_ballas_leader", + "ig_ballasog", + "ig_bankman", + "ig_barry", + "ig_benny", + "ig_benny_02", + "ig_bestmen", + "ig_beverly", + "ig_billionaire", + "ig_bountytarget_01", + "ig_bountytarget_02", + "ig_bountytarget_03", + "ig_bountytarget_04", + "ig_bountytarget_05", + "ig_bountytarget_06", + "ig_brad", + "ig_bride", + "ig_brucie2", + "ig_callgirl_01", + "ig_callgirl_02", + "ig_car3guy1", + "ig_car3guy2", + "ig_casey", + "ig_celeb_01", + "ig_charlie_reed", + "ig_chef", + "ig_chef2", + "ig_chef_03", + "ig_chengsr", + "ig_chrisformage", + "ig_clay", + "ig_claypain", + "ig_cletus", + "ig_dale", + "ig_davenorton", + "ig_dax", + "ig_denise", + "ig_devin", + "ig_dix", + "ig_djblamadon", + "ig_djblamrupert", + "ig_djblamryanh", + "ig_djblamryans", + "ig_djdixmanager", + "ig_djgeneric_01", + "ig_djsolfotios", + "ig_djsoljakob", + "ig_djsolmanager", + "ig_djsolmike", + "ig_djsolrobt", + "ig_djtalaurelia", + "ig_djtalignazio", + "ig_dom", + "ig_dreyfuss", + "ig_drfriedlander", + "ig_drfriedlander_02", + "ig_drugdealer", + "ig_englishdave", + "ig_englishdave_02", + "ig_entourage_a", + "ig_entourage_b", + "ig_fabien", + "ig_fbisuit_01", + "ig_floyd", + "ig_fooliganz_01", + "ig_fooliganz_02", + "ig_furry", + "ig_g", + "ig_georginacheng", + "ig_golfer_a", + "ig_golfer_b", + "ig_groom", + "ig_guadalope", + "ig_gunvanseller", + "ig_gustavo", + "ig_gustavo_02", + "ig_hao", + "ig_hao_02", + "ig_helmsmanpavel", + "ig_helmsmanpavel_02", + "ig_hippyleader", + "ig_huang", + "ig_hunter", + "ig_imani", + "ig_isldj_00", + "ig_isldj_01", + "ig_isldj_02", + "ig_isldj_03", + "ig_isldj_04", + "ig_isldj_04_d_01", + "ig_isldj_04_d_02", + "ig_isldj_04_e_01", + "ig_jackie", + "ig_jamalamir", + "ig_janet", + "ig_jay_norris", + "ig_jaywalker", + "ig_jenettee", + "ig_jewelass", + "ig_jimmyboston", + "ig_jimmyboston_02", + "ig_jimmydisanto", + "ig_jimmydisanto2", + "ig_jio", + "ig_jio_02", + "ig_jodimarshall", + "ig_joeminuteman", + "ig_johnny_guns", + "ig_johnnyklebitz", + "ig_josef", + "ig_josh", + "ig_juanstrickler", + "ig_karen_daniels", + "ig_kaylee", + "ig_kerrymcintosh", + "ig_kerrymcintosh_02", + "ig_labrat", + "ig_lacey_jones_02", + "ig_lamardavis", + "ig_lamardavis_02", + "ig_lazlow", + "ig_lazlow_2", + "ig_lestercrest", + "ig_lestercrest_2", + "ig_lestercrest_3", + "ig_lifeinvad_01", + "ig_lifeinvad_02", + "ig_lildee", + "ig_luchadora", + "ig_madrazodriver_01", + "ig_magenta", + "ig_malc", + "ig_manuel", + "ig_marnie", + "ig_martinmadrazo_02", + "ig_maryann", + "ig_mason_duggan", + "ig_maude", + "ig_maudebf", + "ig_mechanic_01", + "ig_mechanic_02", + "ig_mechanic_03", + "ig_michelle", + "ig_miguelmadrazo", + "ig_milton", + "ig_mimi", + "ig_mjo", + "ig_mjo_02", + "ig_molly", + "ig_money", + "ig_moodyman_02", + "ig_mp_agent14", + "ig_mrk", + "ig_mrs_thornhill", + "ig_mrsphillips", + "ig_musician_00", + "ig_natalia", + "ig_nervousron", + "ig_nervousron_02", + "ig_nigel", + "ig_old_man1a", + "ig_old_man2", + "ig_oldrichguy", + "ig_omega", + "ig_oneil", + "ig_orleans", + "ig_ortega", + "ig_oscar_02", + "ig_paige", + "ig_paper", + "ig_party_promo", + "ig_patricia", + "ig_patricia_02", + "ig_pernell_moss", + "ig_pilot", + "ig_pilot_02", + "ig_popov", + "ig_priest", + "ig_prolsec_02", + "ig_rafdeangelis", + "ig_ramp_gang", + "ig_ramp_hic", + "ig_ramp_hipster", + "ig_ramp_mex", + "ig_rashcosvki", + "ig_req_officer", + "ig_roccopelosi", + "ig_roostermccraw", + "ig_russiandrunk", + "ig_sacha", + "ig_screen_writer", + "ig_security_a", + "ig_sessanta", + "ig_siemonyetarian", + "ig_skeleton_01", + "ig_sol", + "ig_solomon", + "ig_soundeng_00", + "ig_sss", + "ig_stevehains", + "ig_stretch", + "ig_subcrewhead", + "ig_talcc", + "ig_talina", + "ig_talmm", + "ig_tanisha", + "ig_taocheng", + "ig_taocheng2", + "ig_taostranslator", + "ig_taostranslator2", + "ig_tenniscoach", + "ig_terry", + "ig_thornton", + "ig_tomcasino", + "ig_tomepsilon", + "ig_tonya", + "ig_tonyprince", + "ig_tracydisanto", + "ig_trafficwarden", + "ig_tylerdix", + "ig_tylerdix_02", + "ig_vagos_leader", + "ig_vagspeak", + "ig_valentina", + "ig_vernon", + "ig_vincent", + "ig_vincent_2", + "ig_vincent_3", + "ig_vincent_4", + "ig_wade", + "ig_warehouseboss", + "ig_weiss", + "ig_wendy", + "ig_yusufamir", + "ig_zimbor", + "ig_zombie_dj_01", + "mp_f_bennymech_01", + "mp_f_boatstaff_01", + "mp_f_cardesign_01", + "mp_f_chbar_01", + "mp_f_cocaine_01", + "mp_f_counterfeit_01", + "mp_f_deadhooker", + "mp_f_execpa_01", + "mp_f_execpa_02", + "mp_f_forgery_01", + "mp_f_freemode_01", + "mp_f_helistaff_01", + "mp_f_meth_01", + "mp_f_misty_01", + "mp_f_stripperlite", + "mp_f_weed_01", + "mp_g_m_pros_01", + "mp_headtargets", + "mp_m_avongoon", + "mp_m_boatstaff_01", + "mp_m_bogdangoon", + "mp_m_claude_01", + "mp_m_cocaine_01", + "mp_m_counterfeit_01", + "mp_m_exarmy_01", + "mp_m_execpa_01", + "mp_m_famdd_01", + "mp_m_fibsec_01", + "mp_m_forgery_01", + "mp_m_freemode_01", + "mp_m_g_vagfun_01", + "mp_m_marston_01", + "mp_m_meth_01", + "mp_m_niko_01", + "mp_m_securoguard_01", + "mp_m_shopkeep_01", + "mp_m_waremech_01", + "mp_m_weapexp_01", + "mp_m_weapwork_01", + "mp_m_weed_01", + "mp_s_m_armoured_01", + "p_franklin_02", + "player_one", + "player_two", + "player_zero", + "s_f_m_autoshop_01", + "s_f_m_fembarber", + "s_f_m_maid_01", + "s_f_m_retailstaff_01", + "s_f_m_shop_high", + "s_f_m_studioassist_01", + "s_f_m_sweatshop_01", + "s_f_m_warehouse_01", + "s_f_y_airhostess_01", + "s_f_y_bartender_01", + "s_f_y_baywatch_01", + "s_f_y_beachbarstaff_01", + "s_f_y_casino_01", + "s_f_y_clubbar_01", + "s_f_y_clubbar_02", + "s_f_y_cop_01", + "s_f_y_factory_01", + "s_f_y_hooker_01", + "s_f_y_hooker_02", + "s_f_y_hooker_03", + "s_f_y_migrant_01", + "s_f_y_movprem_01", + "s_f_y_ranger_01", + "s_f_y_scrubs_01", + "s_f_y_sheriff_01", + "s_f_y_shop_low", + "s_f_y_shop_mid", + "s_f_y_stripper_01", + "s_f_y_stripper_02", + "s_f_y_stripperlite", + "s_f_y_sweatshop_01", + "s_m_m_ammucountry", + "s_m_m_armoured_01", + "s_m_m_armoured_02", + "s_m_m_autoshop_01", + "s_m_m_autoshop_02", + "s_m_m_autoshop_03", + "s_m_m_bailoffice_01", + "s_m_m_bouncer_01", + "s_m_m_bouncer_02", + "s_m_m_ccrew_01", + "s_m_m_ccrew_02", + "s_m_m_ccrew_03", + "s_m_m_chemsec_01", + "s_m_m_ciasec_01", + "s_m_m_cntrybar_01", + "s_m_m_cop_01", + "s_m_m_dockwork_01", + "s_m_m_doctor_01", + "s_m_m_drugprocess_01", + "s_m_m_fiboffice_01", + "s_m_m_fiboffice_02", + "s_m_m_fibsec_01", + "s_m_m_fieldworker_01", + "s_m_m_gaffer_01", + "s_m_m_gardener_01", + "s_m_m_gentransport", + "s_m_m_hairdress_01", + "s_m_m_hazmatworker_01", + "s_m_m_highsec_01", + "s_m_m_highsec_02", + "s_m_m_highsec_03", + "s_m_m_highsec_04", + "s_m_m_highsec_05", + "s_m_m_janitor", + "s_m_m_lathandy_01", + "s_m_m_lifeinvad_01", + "s_m_m_linecook", + "s_m_m_lsmetro_01", + "s_m_m_mariachi_01", + "s_m_m_marine_01", + "s_m_m_marine_02", + "s_m_m_migrant_01", + "s_m_m_movalien_01", + "s_m_m_movprem_01", + "s_m_m_movspace_01", + "s_m_m_paramedic_01", + "s_m_m_pilot_01", + "s_m_m_pilot_02", + "s_m_m_postal_01", + "s_m_m_postal_02", + "s_m_m_prisguard_01", + "s_m_m_raceorg_01", + "s_m_m_scientist_01", + "s_m_m_security_01", + "s_m_m_snowcop_01", + "s_m_m_strperf_01", + "s_m_m_strpreach_01", + "s_m_m_strvend_01", + "s_m_m_studioassist_02", + "s_m_m_studioprod_01", + "s_m_m_studiosoueng_02", + "s_m_m_subcrew_01", + "s_m_m_tattoo_01", + "s_m_m_trucker_01", + "s_m_m_ups_01", + "s_m_m_ups_02", + "s_m_m_warehouse_01", + "s_m_o_busker_01", + "s_m_y_airworker", + "s_m_y_ammucity_01", + "s_m_y_armymech_01", + "s_m_y_autopsy_01", + "s_m_y_barman_01", + "s_m_y_baywatch_01", + "s_m_y_blackops_01", + "s_m_y_blackops_02", + "s_m_y_blackops_03", + "s_m_y_busboy_01", + "s_m_y_casino_01", + "s_m_y_chef_01", + "s_m_y_clown_01", + "s_m_y_clubbar_01", + "s_m_y_construct_01", + "s_m_y_construct_02", + "s_m_y_cop_01", + "s_m_y_dealer_01", + "s_m_y_devinsec_01", + "s_m_y_dockwork_01", + "s_m_y_doorman_01", + "s_m_y_dwservice_01", + "s_m_y_dwservice_02", + "s_m_y_factory_01", + "s_m_y_fireman_01", + "s_m_y_garbage", + "s_m_y_grip_01", + "s_m_y_hwaycop_01", + "s_m_y_marine_01", + "s_m_y_marine_02", + "s_m_y_marine_03", + "s_m_y_mime", + "s_m_y_pestcont_01", + "s_m_y_pilot_01", + "s_m_y_prismuscl_01", + "s_m_y_prisoner_01", + "s_m_y_ranger_01", + "s_m_y_robber_01", + "s_m_y_sheriff_01", + "s_m_y_shop_mask", + "s_m_y_strvend_01", + "s_m_y_swat_01", + "s_m_y_uscg_01", + "s_m_y_valet_01", + "s_m_y_waiter_01", + "s_m_y_waretech_01", + "s_m_y_westsec_01", + "s_m_y_westsec_02", + "s_m_y_winclean_01", + "s_m_y_xmech_01", + "s_m_y_xmech_02", + "s_m_y_xmech_02_mp", + // "slod_human", you don't want to spawn these + // "slod_large_quadped", + // "slod_small_quadped", + "u_f_m_casinocash_01", + "u_f_m_casinoshop_01", + "u_f_m_corpse_01", + "u_f_m_debbie_01", + "u_f_m_drowned_01", + "u_f_m_miranda", + "u_f_m_miranda_02", + "u_f_m_promourn_01", + "u_f_o_carol", + "u_f_o_eileen", + "u_f_o_moviestar", + "u_f_o_prolhost_01", + "u_f_y_beth", + "u_f_y_bikerchic", + "u_f_y_comjane", + "u_f_y_corpse_01", + "u_f_y_corpse_02", + "u_f_y_danceburl_01", + "u_f_y_dancelthr_01", + "u_f_y_dancerave_01", + "u_f_y_hotposh_01", + "u_f_y_jewelass_01", + "u_f_y_lauren", + "u_f_y_mistress", + "u_f_y_poppymich", + "u_f_y_poppymich_02", + "u_f_y_princess", + "u_f_y_spyactress", + "u_f_y_taylor", + "u_m_m_aldinapoli", + "u_m_m_bankman", + "u_m_m_bikehire_01", + "u_m_m_blane", + "u_m_m_curtis", + "u_m_m_doa_01", + "u_m_m_edtoh", + "u_m_m_fibarchitect", + "u_m_m_filmdirector", + "u_m_m_glenstank_01", + "u_m_m_griff_01", + "u_m_m_jesus_01", + "u_m_m_jewelsec_01", + "u_m_m_jewelthief", + "u_m_m_juggernaut_03", + "u_m_m_markfost", + "u_m_m_partytarget", + "u_m_m_prolsec_01", + "u_m_m_promourn_01", + "u_m_m_rivalpap", + "u_m_m_spyactor", + "u_m_m_streetart_01", + "u_m_m_vince", + "u_m_m_willyfist", + "u_m_m_yeti", + "u_m_m_yulemonster", + "u_m_o_dean", + "u_m_o_filmnoir", + "u_m_o_finguru_01", + "u_m_o_taphillbilly", + "u_m_o_tramp_01", + "u_m_y_abner", + "u_m_y_antonb", + "u_m_y_babyd", + "u_m_y_baygor", + "u_m_y_burgerdrug_01", + "u_m_y_caleb", + "u_m_y_chip", + "u_m_y_corpse_01", + "u_m_y_croupthief_01", + "u_m_y_cyclist_01", + "u_m_y_danceburl_01", + "u_m_y_dancelthr_01", + "u_m_y_dancerave_01", + "u_m_y_fibmugger_01", + "u_m_y_gabriel", + "u_m_y_guido_01", + "u_m_y_gunvend_01", + "u_m_y_hippie_01", + "u_m_y_imporage", + "u_m_y_juggernaut_01", + "u_m_y_juggernaut_02", + "u_m_y_justin", + "u_m_y_mani", + "u_m_y_militarybum", + "u_m_y_paparazzi", + "u_m_y_party_01", + "u_m_y_pogo_01", + "u_m_y_prisoner_01", + "u_m_y_proldriver_01", + "u_m_y_rsranger_01", + "u_m_y_sbike", + "u_m_y_smugmech_01", + "u_m_y_staggrm_01", + "u_m_y_tattoo_01", + "u_m_y_ushi", + "u_m_y_zombie_01", + }); +} \ No newline at end of file diff --git a/src/game/hooks/Info/AssignPhysicalIndex.cpp b/src/game/hooks/Info/AssignPhysicalIndex.cpp index 0076150..62565e0 100644 --- a/src/game/hooks/Info/AssignPhysicalIndex.cpp +++ b/src/game/hooks/Info/AssignPhysicalIndex.cpp @@ -28,13 +28,16 @@ namespace YimMenu::Hooks LOGF(WARNING, "Player {} changed their player index from {} to {}", player->GetName(), player->m_PlayerIndex, index); BaseHook::Get>()->Original()(mgr, player, index); Players::OnPlayerJoin(player); - std::string name = player->GetName(); - FiberPool::Push([name] { - HUD::SET_TEXT_OUTLINE(); - HUD::BEGIN_TEXT_COMMAND_THEFEED_POST("STRING"); - HUD::ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(std::format("{} joined.", name).data()); - HUD::END_TEXT_COMMAND_THEFEED_POST_TICKER(false, false); - }); + if (Features::_NotifyOnPlayerJoin.GetState() && !player->IsLocal()) + { + std::string name = player->GetName(); + FiberPool::Push([name] { + HUD::SET_TEXT_OUTLINE(); + HUD::BEGIN_TEXT_COMMAND_THEFEED_POST("STRING"); + HUD::ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(std::format("{} joined.", name).data()); + HUD::END_TEXT_COMMAND_THEFEED_POST_TICKER(false, false); + }); + } } else { diff --git a/src/types/ped/PedCombatAttribute.hpp b/src/types/ped/PedCombatAttribute.hpp new file mode 100644 index 0000000..cd32185 --- /dev/null +++ b/src/types/ped/PedCombatAttribute.hpp @@ -0,0 +1,96 @@ +#pragma once + +enum class PedCombatAttribute : std::uint32_t +{ + CanUseCover, + CanUseVehicles, + CanDoDrivebys, + CanLeaveVehicle, + CanUseDynamicStrafeDecisions, + AlwaysFight, + FleeWhilstInVehicle, + JustFollowInVehicle, + Unused_3, + WillScanForDeadPeds, + Unused_1, + JustSeekCover, + BlindFireWhenInCover, + Aggressive, + CanInvestigate, + HasRadio, + Unused_2, + AlwaysFlee, + ForceInjuredOnGround, + DisableInjuredOnGround, + CanTauntInVehicle, + CanChaseTargetOnFoot, + WillDragInjuredPedsToSafety, + RequiresLosToShoot, + UseProximityFiringRate, + DisableSecondaryTarget, + DisableEntryReactions, + PerfectAccuracy, + CanUseFrustratedAdvance, + MoveToLocationBeforeCoverSearch, + CanShootWithoutLOS, + MaintainMinDistanceToTarget, + IgnoreHatedPedsInFastMovingVehicles, + UseProximityAccuracy, + CanUsePeekingVariations, + DisablePinnedDown, + DisablePinDownOthers, + ClearAreaSetDefensiveIfDefensiveAreaReached, + DisableBulletReactions, + CanBust, + IgnoredByOtherPedsWhenWanted, + CanCommandeerVehicles, + CanFlank, + SwitchToAdvanceIfCantFindCover, + SwitchToDefensiveIfInCover, + ClearPrimaryDefensiveAreaWhenReached, + CanFightArmedPedsWhenNotArmed, + EnableTacticalPointsWhenDefensive, + DisableCoverArcAdjustments, + UseEnemyAccuracyScaling, + CanCharge, + ClearAreaSetAdvanceIfDefensiveAreaReached, + UseVehicleAttack, + UseVehicleAttackIfVehicleHasMountedGuns, + AlwaysEquipBestWeapon, + CanSeeUnderwaterPeds, + DisableAimAtAITargetsInHelis, + DisableSeekDueToLineOfSight, + DisableFleeFromCombat, + DisableTargetChangesDuringVehiclePursuit, + CanThrowSmokeGrenade, + NonMissionPedsFleeFromThisPedUnlessArmed, + ClearAreaSetDefensiveIfDefensiveCannotBeReached, + FleesFromInvincibleOpponents, + DisableBlockFromPursueDuringVehicleChase, + DisableSpinOutDuringVehicleChase, + DisableCruiseInFrontDuringBlockDuringVehicleChase, + CanIgnoreBlockedLosWeighting, + DisableReactToBuddyShot, + PreferNavmeshDuringVehicleChase, + AllowedToAvoidOffroadDuringVehicleChase, + PermitChargeBeyondDefensiveArea, + UseRocketsAgainstVehiclesOnly, + DisableTacticalPointsWithoutClearLos, + DisablePullAlongsideDuringVehicleChase, + DisableShoutTargetPosition, + SetDisableShoutTargetPositionOnCombatStart, + DisableRespondedToThreatBroadcast, + DisableAllRandomsFlee, + WillGenerateDeadPedSeenScriptEvents, + UseMaxSenseRangeWhenReceivingEvents, + RestrictInVehicleAimingToCurrentSide, + UseDefaultBlockedLosPositionAndDirection, + RequiresLosToAim, + CruiseAndBlockInVehicle, + PreferAirCombatWhenInAircraft, + AllowDogFighting, + PreferNonAircraftTargets, + PreferKnownTargetsWhenCombatClosestTarget, + ForceCheckAttackAngleForMountedGuns, + BlockFireForVehiclePassengerMountedGuns, +}; \ No newline at end of file