diff --git a/src/peds/peds.cc b/src/peds/peds.cc index c8df546..87f8121 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,12 @@ class PedRandomizer return model; // Forced Ped - if (!PR::Config ().ForcedPed.empty ()) + PR::Config ().ForcedPedHashes = PR::Config ().ForcedPed; + if (!PR::Config ().ForcedPedHashes.Get ().empty ()) { uint32_t id = CStreaming::GetModelIndex ( - rage::atStringHash (PR::Config ().ForcedPed)); + PR::Config ().ForcedPedHashes.Get ()[ 0, RandomInt(PR::Config() + .ForcedPedHashes.Get ().size () - 1) ]); if (CStreaming::HasModelLoaded (id)) return id; @@ -176,7 +179,6 @@ class PedRandomizer /*******************************************************/ PedRandomizer () { - std::string ForcedPed; #define OPTION(option) std::pair (#option, &PR::Config ().option) if (!ConfigManager::ReadConfig ( @@ -190,10 +192,6 @@ class PedRandomizer OPTION (OddsOfPlayerModels))) return; - if (PR::Config ().ForcedPed.size ()) - PR::Config ().ForcedPedHash - = rage::atStringHash (PR::Config ().ForcedPed); - InitialiseAllComponents (); // Hooks diff --git a/src/peds/peds.hh b/src/peds/peds.hh index a7cc2d2..42faae3 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" @@ -10,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: @@ -20,7 +88,7 @@ public: { std::string ForcedPed = ""; std::string ForcedClipset = ""; - uint32_t ForcedPedHash = -1; + PedRandomizer_PedHashes ForcedPedHashes; bool EnableNSFWModels = false; bool RandomizePlayer = true; bool RandomizePeds = true;