From 5c5c0aebc17138f84f0eb51b81e3f4fa9b2c5e5d Mon Sep 17 00:00:00 2001 From: pongo1231 Date: Thu, 17 Feb 2022 16:34:26 +0100 Subject: [PATCH 1/2] Ped Randomizer: Allow specifying multiple models in ForcePed --- src/peds/peds.cc | 36 +++++++++++++++++++++++++++++++----- src/peds/peds.hh | 3 ++- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/peds/peds.cc b/src/peds/peds.cc index c8df546..ef1b2e1 100644 --- a/src/peds/peds.cc +++ b/src/peds/peds.cc @@ -10,6 +10,7 @@ #include #include +#include #include "CModelInfo.hh" #include "Utils.hh" @@ -80,10 +81,11 @@ class PedRandomizer return model; // Forced Ped - if (!PR::Config ().ForcedPed.empty ()) + if (!PR::Config ().ForcedPedHashes.empty ()) { uint32_t id = CStreaming::GetModelIndex ( - rage::atStringHash (PR::Config ().ForcedPed)); + PR::Config ().ForcedPedHashes [ 0, RandomInt(PR::Config() + .ForcedPedHashes.size() - 1) ]); if (CStreaming::HasModelLoaded (id)) return id; @@ -176,7 +178,6 @@ class PedRandomizer /*******************************************************/ PedRandomizer () { - std::string ForcedPed; #define OPTION(option) std::pair (#option, &PR::Config ().option) if (!ConfigManager::ReadConfig ( @@ -191,8 +192,33 @@ class PedRandomizer return; if (PR::Config ().ForcedPed.size ()) - PR::Config ().ForcedPedHash - = rage::atStringHash (PR::Config ().ForcedPed); + { + std::string forcedPeds = PR::Config ().ForcedPed; + + while (true) + { + size_t splitPos = forcedPeds.find (','); + + std::string forcedPed = forcedPeds.substr (0, splitPos); + + // trimming + forcedPed.erase (0, forcedPed.find_first_not_of (' ')); + if (forcedPed.find_last_not_of (' ') != forcedPed.npos) + forcedPed.erase (forcedPed.find_last_not_of (' ') + 1); + + // just in case it was just whitespace + if (forcedPed.size ()) + PR::Config ().ForcedPedHashes + .push_back (rage::atStringHash (forcedPed)); + + if (splitPos == forcedPeds.npos) + { + break; + } + + forcedPeds.erase (0, splitPos + 1); + } + } InitialiseAllComponents (); diff --git a/src/peds/peds.hh b/src/peds/peds.hh index a7cc2d2..f8d4316 100644 --- a/src/peds/peds.hh +++ b/src/peds/peds.hh @@ -1,6 +1,7 @@ #pragma once #include +#include #include "peds_Compatibility.hh" #include "peds_Streaming.hh" @@ -20,7 +21,7 @@ public: { std::string ForcedPed = ""; std::string ForcedClipset = ""; - uint32_t ForcedPedHash = -1; + std::vector ForcedPedHashes; bool EnableNSFWModels = false; bool RandomizePlayer = true; bool RandomizePeds = true; From 4cdfe0e1b56b32130eef99bf3f765a209ddfc431 Mon Sep 17 00:00:00 2001 From: pongo1231 Date: Tue, 12 Apr 2022 02:50:35 +0200 Subject: [PATCH 2/2] Ped Randomizer: Add compatibility for changing ForcePed in debug menu --- src/peds/peds.cc | 36 +++---------------------- src/peds/peds.hh | 69 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 33 deletions(-) diff --git a/src/peds/peds.cc b/src/peds/peds.cc index ef1b2e1..87f8121 100644 --- a/src/peds/peds.cc +++ b/src/peds/peds.cc @@ -81,11 +81,12 @@ class PedRandomizer return model; // Forced Ped - if (!PR::Config ().ForcedPedHashes.empty ()) + PR::Config ().ForcedPedHashes = PR::Config ().ForcedPed; + if (!PR::Config ().ForcedPedHashes.Get ().empty ()) { uint32_t id = CStreaming::GetModelIndex ( - PR::Config ().ForcedPedHashes [ 0, RandomInt(PR::Config() - .ForcedPedHashes.size() - 1) ]); + PR::Config ().ForcedPedHashes.Get ()[ 0, RandomInt(PR::Config() + .ForcedPedHashes.Get ().size () - 1) ]); if (CStreaming::HasModelLoaded (id)) return id; @@ -191,35 +192,6 @@ class PedRandomizer OPTION (OddsOfPlayerModels))) return; - if (PR::Config ().ForcedPed.size ()) - { - std::string forcedPeds = PR::Config ().ForcedPed; - - while (true) - { - size_t splitPos = forcedPeds.find (','); - - std::string forcedPed = forcedPeds.substr (0, splitPos); - - // trimming - forcedPed.erase (0, forcedPed.find_first_not_of (' ')); - if (forcedPed.find_last_not_of (' ') != forcedPed.npos) - forcedPed.erase (forcedPed.find_last_not_of (' ') + 1); - - // just in case it was just whitespace - if (forcedPed.size ()) - PR::Config ().ForcedPedHashes - .push_back (rage::atStringHash (forcedPed)); - - if (splitPos == forcedPeds.npos) - { - break; - } - - forcedPeds.erase (0, splitPos + 1); - } - } - InitialiseAllComponents (); // Hooks diff --git a/src/peds/peds.hh b/src/peds/peds.hh index f8d4316..42faae3 100644 --- a/src/peds/peds.hh +++ b/src/peds/peds.hh @@ -11,6 +11,73 @@ #include "peds_AnimalFixes.hh" #include "peds_MainFixes.hh" +class PedRandomizer_PedHashes +{ + std::string m_ForcedPedStr; + std::vector m_ForcedPedHashes; + +public: + /*******************************************************/ + PedRandomizer_PedHashes () = default; + + /*******************************************************/ + PedRandomizer_PedHashes (const std::string &forcedPedStr) + : m_ForcedPedStr (forcedPedStr) + { + UpdateHashes (forcedPedStr); + } + + /*******************************************************/ + void + operator= (const std::string &forcedPedStr) + { + if (m_ForcedPedStr != forcedPedStr) + { + m_ForcedPedStr = forcedPedStr; + UpdateHashes (forcedPedStr); + } + } + + /*******************************************************/ + void + UpdateHashes (std::string forcedPedStr) + { + m_ForcedPedHashes.clear (); + + if (forcedPedStr.size ()) + { + while (true) + { + auto splitPos = forcedPedStr.find (','); + auto forcedPed = std::string (forcedPedStr.substr (0, splitPos)); + + // trimming + forcedPed.erase (0, forcedPed.find_first_not_of (' ')); + if (forcedPed.find_last_not_of (' ') != forcedPed.npos) + forcedPed.erase (forcedPed.find_last_not_of (' ') + 1); + + if (forcedPed.size ()) + m_ForcedPedHashes + .push_back (rage::atStringHash (forcedPed)); + + if (splitPos == forcedPedStr.npos) + { + break; + } + + forcedPedStr.erase (0, splitPos + 1); + } + } + } + + /*******************************************************/ + const std::vector & + Get () const + { + return m_ForcedPedHashes; + } +}; + class PedRandomizer_Components { public: @@ -21,7 +88,7 @@ public: { std::string ForcedPed = ""; std::string ForcedClipset = ""; - std::vector ForcedPedHashes; + PedRandomizer_PedHashes ForcedPedHashes; bool EnableNSFWModels = false; bool RandomizePlayer = true; bool RandomizePeds = true;