diff --git a/.clang-format b/.clang-format index 001b0221..3f0b4e7b 100644 --- a/.clang-format +++ b/.clang-format @@ -10,7 +10,7 @@ AllowAllConstructorInitializersOnNextLine: 'false' AllowAllParametersOfDeclarationOnNextLine: 'false' AllowShortBlocksOnASingleLine: 'true' AllowShortCaseLabelsOnASingleLine: 'true' -AllowShortFunctionsOnASingleLine: 'true' +AllowShortFunctionsOnASingleLine: 'false' AllowShortIfStatementsOnASingleLine: Never AllowShortLambdasOnASingleLine: None AlwaysBreakAfterReturnType: None diff --git a/src/core/backend/PatternCache.cpp b/src/core/backend/PatternCache.cpp new file mode 100644 index 00000000..40ad037b --- /dev/null +++ b/src/core/backend/PatternCache.cpp @@ -0,0 +1,52 @@ +#include "PatternCache.hpp" +#include "core/filemgr/FileMgr.hpp" + +namespace YimMenu +{ + std::optional PatternCache::GetCachedOffsetImpl(PatternHash hash) + { + if (auto it = m_Data.find(hash.GetHash()); it != m_Data.end()) + return it->second; + + return std::nullopt; + } + + void PatternCache::UpdateCachedOffsetImpl(PatternHash hash, int offset) + { + m_Data[hash.GetHash()] = offset; + } + + void PatternCache::InitImpl() + { + auto file = FileMgr::GetProjectFile("./pattern_cache.bin"); + if (file.Exists()) + { + std::ifstream stream(file.Path(), std::ios_base::binary); + while (!stream.eof()) + { + std::uint64_t hash; + int offset; + + stream.read(reinterpret_cast(&hash), sizeof(hash)); + stream.read(reinterpret_cast(&offset), sizeof(offset)); + + m_Data.emplace(hash, offset); + } + } + + m_Initialized = true; + } + + void PatternCache::UpdateImpl() + { + auto file = FileMgr::GetProjectFile("./pattern_cache.bin"); + std::ofstream stream(file.Path(), std::ios_base::binary); + + for (auto& [h, offset] : m_Data) + { + auto hash = h; + stream.write(reinterpret_cast(&hash), sizeof(hash)); + stream.write(reinterpret_cast(&offset), sizeof(offset)); + } + } +} \ No newline at end of file diff --git a/src/core/backend/PatternCache.hpp b/src/core/backend/PatternCache.hpp new file mode 100644 index 00000000..7e899f78 --- /dev/null +++ b/src/core/backend/PatternCache.hpp @@ -0,0 +1,54 @@ +#pragma once +#include "core/memory/PatternHash.hpp" + +namespace YimMenu +{ + class PatternCache + { + bool m_Initialized; + std::unordered_map m_Data; + public: + + PatternCache() : + m_Initialized(false) + { + } + + static void Init() + { + GetInstance().InitImpl(); + } + + static void Update() + { + GetInstance().UpdateImpl(); + } + + static std::optional GetCachedOffset(PatternHash hash) + { + return GetInstance().GetCachedOffsetImpl(hash); + } + + static void UpdateCachedOffset(PatternHash hash, int offset) + { + GetInstance().UpdateCachedOffsetImpl(hash, offset); + } + + static bool IsInitialized() + { + return GetInstance().m_Initialized; + } + + private: + static PatternCache& GetInstance() + { + static PatternCache Instance; + return Instance; + } + + void InitImpl(); + void UpdateImpl(); + std::optional GetCachedOffsetImpl(PatternHash hash); + void UpdateCachedOffsetImpl(PatternHash hash, int offset); + }; +} \ No newline at end of file diff --git a/src/core/commands/ColorCommand.cpp b/src/core/commands/ColorCommand.cpp index e537b780..cedb6bc2 100644 --- a/src/core/commands/ColorCommand.cpp +++ b/src/core/commands/ColorCommand.cpp @@ -9,38 +9,52 @@ namespace YimMenu void ColorCommand::SaveState(nlohmann::json& value) { - value = {m_ColorState.x, m_ColorState.y, m_ColorState.z, m_ColorState.w}; + value = nlohmann::json::object(); + value["r"] = m_State.x; + value["g"] = m_State.y; + value["b"] = m_State.z; + value["a"] = m_State.w; } void ColorCommand::LoadState(nlohmann::json& value) { - if (value.is_array() && value.size() == 4) + if (value.is_object()) { - m_ColorState = ImVec4(value[0], value[1], value[2], value[3]); + m_State.x = value["r"]; + m_State.y = value["g"]; + m_State.z = value["b"]; + m_State.w = value["a"]; } - else + else if (value.is_array()) { - m_ColorState = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); + auto arr = value.get>(); + m_State.x = arr[0]; + m_State.y = arr[1]; + m_State.z = arr[2]; + m_State.w = arr[3]; } } ColorCommand::ColorCommand(std::string name, std::string label, std::string description, ImVec4 color) : Command(name, label, description, 0), - m_ColorState(color) + m_State(color) { } ImVec4 ColorCommand::GetState() { - return m_ColorState; + return m_State; } - void ColorCommand::SetColorState(ImVec4 state) + void ColorCommand::SetState(ImVec4 state) { - FiberPool::Push([this] { - OnChange(); - }); - m_ColorState = state; - MarkDirty(); + if (m_State != state) + { + FiberPool::Push([this] { + OnChange(); + }); + m_State = state; + MarkDirty(); + } } } \ No newline at end of file diff --git a/src/core/commands/ColorCommand.hpp b/src/core/commands/ColorCommand.hpp index cbd3af39..0e30086f 100644 --- a/src/core/commands/ColorCommand.hpp +++ b/src/core/commands/ColorCommand.hpp @@ -12,11 +12,11 @@ namespace YimMenu virtual void SaveState(nlohmann::json& value) override; virtual void LoadState(nlohmann::json& value) override; - ImVec4 m_ColorState = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); + ImVec4 m_State = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); public: ColorCommand(std::string name, std::string label, std::string description, ImVec4 color = ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); ImVec4 GetState(); - void SetColorState(ImVec4 state); + void SetState(ImVec4 state); }; } \ No newline at end of file diff --git a/src/core/hooking/BaseHook.cpp b/src/core/hooking/BaseHook.cpp index 6ea9c6a7..e81e8e90 100644 --- a/src/core/hooking/BaseHook.cpp +++ b/src/core/hooking/BaseHook.cpp @@ -16,19 +16,23 @@ namespace YimMenu return m_Hooks; } - void BaseHook::EnableAll() + bool BaseHook::EnableAll() { + bool status = true; for (auto hook : m_Hooks) { - hook->Enable(); + status = hook->Enable() && status; } + return status; } - void BaseHook::DisableAll() + bool BaseHook::DisableAll() { + bool status = true; for (auto hook : m_Hooks) { - hook->Disable(); + status = hook->Disable() && status; } + return status; } } \ No newline at end of file diff --git a/src/core/hooking/BaseHook.hpp b/src/core/hooking/BaseHook.hpp index e37ac5a3..0643a299 100644 --- a/src/core/hooking/BaseHook.hpp +++ b/src/core/hooking/BaseHook.hpp @@ -41,8 +41,8 @@ namespace YimMenu static std::vector& Hooks(); - static void EnableAll(); - static void DisableAll(); + static bool EnableAll(); + static bool DisableAll(); private: inline static std::vector m_Hooks; diff --git a/src/core/hooking/CallHook.hpp b/src/core/hooking/CallHook.hpp index 5db99cf7..4629949a 100644 --- a/src/core/hooking/CallHook.hpp +++ b/src/core/hooking/CallHook.hpp @@ -83,7 +83,7 @@ namespace YimMenu inline bool CallHook::Enable() { if (m_Enabled) - return false; + return true; memcpy(m_TargetFunc, m_PatchedBytes, 5); m_Enabled = true; @@ -94,7 +94,7 @@ namespace YimMenu inline bool CallHook::Disable() { if (!m_Enabled) - return false; + return true; memcpy(m_TargetFunc, m_OriginalBytes, 5); m_Enabled = false; diff --git a/src/core/hooking/DetourHook.hpp b/src/core/hooking/DetourHook.hpp index acce89cc..7e83227c 100644 --- a/src/core/hooking/DetourHook.hpp +++ b/src/core/hooking/DetourHook.hpp @@ -56,7 +56,7 @@ namespace YimMenu inline bool DetourHook::Enable() { if (m_Enabled) - return false; + return true; if (const auto result = MH_QueueEnableHook(m_TargetFunc); result != MH_OK) { @@ -71,7 +71,7 @@ namespace YimMenu inline bool DetourHook::Disable() { if (!m_Enabled) - return false; + return true; if (const auto result = MH_QueueDisableHook(m_TargetFunc); result != MH_OK) { @@ -86,7 +86,7 @@ namespace YimMenu inline bool DetourHook::EnableNow() { if (m_Enabled) - return false; + return true; if (const auto result = MH_EnableHook(m_TargetFunc); result != MH_OK) { @@ -101,7 +101,7 @@ namespace YimMenu inline bool DetourHook::DisableNow() { if (!m_Enabled) - return false; + return true; if (const auto result = MH_DisableHook(m_TargetFunc); result != MH_OK) { diff --git a/src/core/hooking/Hooking.cpp b/src/core/hooking/Hooking.cpp index 2c0a2015..c29bc790 100644 --- a/src/core/hooking/Hooking.cpp +++ b/src/core/hooking/Hooking.cpp @@ -11,35 +11,48 @@ #include "game/backend/Self.hpp" +#include + namespace YimMenu { Hooking::Hooking() { - BaseHook::Add(new DetourHook("WndProc", Pointers.WndProc, Hooks::Window::WndProc)); - BaseHook::Add(new DetourHook("SetCursorPos", ModuleMgr.Get("user32.dll")->GetExport("SetCursorPos"), Hooks::Window::SetCursorPos)); + } - if (Pointers.IsVulkan) - { - BaseHook::Add(new DetourHook("Vulkan::QueuePresentKHR", Pointers.QueuePresentKHR, Hooks::Vulkan::QueuePresentKHR)); - BaseHook::Add(new DetourHook("Vulkan::CreateSwapchainKHR", Pointers.CreateSwapchainKHR, Hooks::Vulkan::CreateSwapchainKHR)); - BaseHook::Add(new DetourHook("Vulkan::AcquireNextImage2KHR", Pointers.AcquireNextImage2KHR, Hooks::Vulkan::AcquireNextImage2KHR)); - BaseHook::Add(new DetourHook("Vulkan::AcquireNextImageKHR", Pointers.AcquireNextImageKHR, Hooks::Vulkan::AcquireNextImageKHR)); - } - else if (!Pointers.IsVulkan) - { - //RDR2 would typically crash or do nothing when using VMT hooks, something to look into in the future. - BaseHook::Add(new DetourHook("SwapChain::Present", GetVF(*Pointers.SwapChain, Hooks::SwapChain::VMTPresentIdx), Hooks::SwapChain::Present)); - BaseHook::Add(new DetourHook("SwapChain::ResizeBuffers", GetVF(*Pointers.SwapChain, Hooks::SwapChain::VMTResizeBuffersIdx), Hooks::SwapChain::ResizeBuffers)); - } + Hooking::~Hooking() + { + DestroyImpl(); + } - BaseHook::Add(new DetourHook("RunScriptThreads", Pointers.RunScriptThreads, Hooks::Script::RunScriptThreads)); - BaseHook::Add(new DetourHook("InitNativeTables", Pointers.InitNativeTables, Hooks::Script::InitNativeTables)); - BaseHook::Add(new DetourHook("ScriptVM", Pointers.ScriptVM, Hooks::Script::ScriptVM)); + bool Hooking::Init() + { + return GetInstance().InitImpl(); + } + + bool Hooking::LateInit() + { + return GetInstance().LateInitImpl(); + } + + void Hooking::Destroy() + { + GetInstance().DestroyImpl(); + } + + bool Hooking::InitImpl() + { + BaseHook::Add(new DetourHook("ShowWindow", ModuleMgr.Get("user32.dll")->GetExport("ShowWindow"), Hooks::Window::ShowWindow)); BaseHook::Add(new DetourHook("SendMetric", Pointers.SendMetric, Hooks::Anticheat::SendMetric)); BaseHook::Add(new DetourHook("QueueDependency", Pointers.QueueDependency, Hooks::Anticheat::QueueDependency)); BaseHook::Add(new DetourHook("UnkFunction", Pointers.UnkFunction, Hooks::Anticheat::UnkFunction)); + BaseHook::Add(new DetourHook("GetPoolSize", Pointers.GetPoolSize, Hooks::Misc::GetPoolSize)); + + BaseHook::Add(new DetourHook("RunScriptThreads", Pointers.RunScriptThreads, Hooks::Script::RunScriptThreads)); + BaseHook::Add(new DetourHook("InitNativeTables", Pointers.InitNativeTables, Hooks::Script::InitNativeTables)); + BaseHook::Add(new DetourHook("ScriptVM", Pointers.ScriptVM, Hooks::Script::ScriptVM)); + BaseHook::Add(new DetourHook("HandleNetGameEvent", Pointers.HandleNetGameEvent, Hooks::Protections::HandleNetGameEvent)); BaseHook::Add(new DetourHook("HandleCloneCreate", Pointers.HandleCloneCreate, Hooks::Protections::HandleCloneCreate)); BaseHook::Add(new DetourHook("HandleCloneSync", Pointers.HandleCloneSync, Hooks::Protections::HandleCloneSync)); @@ -64,6 +77,7 @@ namespace YimMenu BaseHook::Add(new DetourHook("HandlePeerRelayPacket", Pointers.HandlePeerRelayPacket, Hooks::Protections::HandlePeerRelayPacket)); BaseHook::Add(new DetourHook("UnpackPacket", Pointers.UnpackPacket, Hooks::Protections::UnpackPacket)); BaseHook::Add(new DetourHook("UpdateEndpointAddress", Pointers.UpdateEndpointAddress, Hooks::Protections::UpdateEndpointAddress)); + BaseHook::Add(new DetourHook("CanCreateNetworkObject", Pointers.CanCreateNetworkObject, Hooks::Protections::CanCreateNetworkObject)); BaseHook::Add(new DetourHook("EnumerateAudioDevices", Pointers.EnumerateAudioDevices, Hooks::Voice::EnumerateAudioDevices)); BaseHook::Add(new DetourHook("DirectSoundCaptureCreate", Pointers.DirectSoundCaptureCreate, Hooks::Voice::DirectSoundCaptureCreate)); @@ -91,26 +105,47 @@ namespace YimMenu BaseHook::Add(new DetourHook("IsNodeInScope", Pointers.IsNodeInScope, Hooks::Toxic::IsNodeInScope)); BaseHook::Add(new DetourHook("SetTreeTargetObject", Pointers.SetTreeTargetObject, Hooks::Toxic::SetTreeTargetObject)); + BaseHook::Add(new DetourHook("SerializeIceSessionOfferRequest", Pointers.SerializeIceSessionOfferRequest, Hooks::Toxic::SerializeIceSessionOfferRequest)); - } - Hooking::~Hooking() - { - DestroyImpl(); - } + if (!BaseHook::EnableAll()) + { + LOG(FATAL) << "Failed to apply initial hooks"; + return false; + } - bool Hooking::Init() - { - return GetInstance().InitImpl(); - } + auto code = m_MinHook.ApplyQueued(); - void Hooking::Destroy() - { - GetInstance().DestroyImpl(); + if (code == MH_OK) + { + LOG(INFO) << "Initial hooks applied"; + return true; + } + else + { + LOG(FATAL) << "Failed to apply initial hooks: " << MH_StatusToString(code); + return false; + } } - bool Hooking::InitImpl() + bool Hooking::LateInitImpl() { + BaseHook::Add(new DetourHook("WndProc", Pointers.WndProc, Hooks::Window::WndProc)); + BaseHook::Add(new DetourHook("SetCursorPos", ModuleMgr.Get("user32.dll")->GetExport("SetCursorPos"), Hooks::Window::SetCursorPos)); + + if (Pointers.IsVulkan) + { + BaseHook::Add(new DetourHook("Vulkan::QueuePresentKHR", Pointers.QueuePresentKHR, Hooks::Vulkan::QueuePresentKHR)); + BaseHook::Add(new DetourHook("Vulkan::CreateSwapchainKHR", Pointers.CreateSwapchainKHR, Hooks::Vulkan::CreateSwapchainKHR)); + BaseHook::Add(new DetourHook("Vulkan::AcquireNextImage2KHR", Pointers.AcquireNextImage2KHR, Hooks::Vulkan::AcquireNextImage2KHR)); + BaseHook::Add(new DetourHook("Vulkan::AcquireNextImageKHR", Pointers.AcquireNextImageKHR, Hooks::Vulkan::AcquireNextImageKHR)); + } + else if (!Pointers.IsVulkan) + { + BaseHook::Add(new DetourHook("SwapChain::Present", GetVF(*Pointers.SwapChain, Hooks::SwapChain::VMTPresentIdx), Hooks::SwapChain::Present)); + BaseHook::Add(new DetourHook("SwapChain::ResizeBuffers", GetVF(*Pointers.SwapChain, Hooks::SwapChain::VMTResizeBuffersIdx), Hooks::SwapChain::ResizeBuffers)); + } + BaseHook::EnableAll(); m_MinHook.ApplyQueued(); diff --git a/src/core/hooking/Hooking.hpp b/src/core/hooking/Hooking.hpp index 334f717b..2d918870 100644 --- a/src/core/hooking/Hooking.hpp +++ b/src/core/hooking/Hooking.hpp @@ -25,10 +25,12 @@ namespace YimMenu Hooking& operator=(Hooking&&) noexcept = delete; static bool Init(); + static bool LateInit(); static void Destroy(); private: bool InitImpl(); + bool LateInitImpl(); void DestroyImpl(); private: diff --git a/src/core/logger/ExceptionHandler.cpp b/src/core/logger/ExceptionHandler.cpp index e79ea1b8..a578dbf9 100644 --- a/src/core/logger/ExceptionHandler.cpp +++ b/src/core/logger/ExceptionHandler.cpp @@ -48,16 +48,17 @@ namespace YimMenu logged_exceptions.insert(trace_hash); } - if (IsBadReadPtr(reinterpret_cast(exception_info->ContextRecord->Rip), 8)) + if (exception_info->ExceptionRecord->ExceptionInformation[0] == EXCEPTION_EXECUTE_FAULT) { auto return_address_ptr = (uint64_t*)exception_info->ContextRecord->Rsp; if (IsBadReadPtr(reinterpret_cast(return_address_ptr), 8)) { - LOG(FATAL) << "Cannot resume execution, crashing"; + LOG(FATAL) << "Cannot resume execution, crashing (failed to find valid return address)"; return EXCEPTION_CONTINUE_SEARCH; } else { + LOG(FATAL) << "Force returning from function"; exception_info->ContextRecord->Rip = *return_address_ptr; exception_info->ContextRecord->Rsp += 8; } @@ -68,7 +69,7 @@ namespace YimMenu hde64_disasm(reinterpret_cast(exception_info->ContextRecord->Rip), &opcode); if (opcode.flags & F_ERROR) { - LOG(FATAL) << "Cannot resume execution, crashing"; + LOG(FATAL) << "Cannot resume execution, crashing (failed to decode insn)"; return EXCEPTION_CONTINUE_SEARCH; } diff --git a/src/core/logger/StackTrace.cpp b/src/core/logger/StackTrace.cpp index 39dd90b1..ce676707 100644 --- a/src/core/logger/StackTrace.cpp +++ b/src/core/logger/StackTrace.cpp @@ -185,7 +185,7 @@ namespace YimMenu { case EXCEPTION_READ_FAULT: m_Dump << '\n' << "Attempted to read from " << HEX(addr) << '\n'; break; case EXCEPTION_WRITE_FAULT: m_Dump << '\n' << "Attempted to write to " << HEX(addr) << '\n'; break; - case EXCEPTION_EXECUTE_FAULT: m_Dump << '\n' << "DEP at " << HEX(addr) << '\n'; break; + case EXCEPTION_EXECUTE_FAULT: m_Dump << '\n' << "Attempted to execute at " << HEX(addr) << '\n'; break; default: m_Dump << '\n' << "Inaccessible data at " << HEX(addr) << '\n'; } diff --git a/src/core/memory/ModuleMgr.cpp b/src/core/memory/ModuleMgr.cpp index 012f805e..79ef93fb 100644 --- a/src/core/memory/ModuleMgr.cpp +++ b/src/core/memory/ModuleMgr.cpp @@ -20,6 +20,8 @@ namespace YimMenu bool ModuleMgr::LoadModules() { + m_CachedModules.clear(); + const auto peb = reinterpret_cast(NtCurrentTeb()->ProcessEnvironmentBlock); if (!peb) return false; diff --git a/src/core/memory/Pattern.hpp b/src/core/memory/Pattern.hpp index 64e88135..b1b929f7 100644 --- a/src/core/memory/Pattern.hpp +++ b/src/core/memory/Pattern.hpp @@ -1,5 +1,6 @@ #pragma once #include "util/StrToHex.hpp" +#include "PatternHash.hpp" #include #include @@ -11,6 +12,7 @@ namespace YimMenu { char m_Signature[N]{}; std::size_t m_SignatureByteLength; + PatternHash m_Hash; constexpr Signature(char const (&signature)[N]) : m_SignatureByteLength(0) @@ -19,9 +21,12 @@ namespace YimMenu for (std::size_t i = 0; i < N; i++) { + m_Hash = m_Hash.Update(m_Signature[i]); if (m_Signature[i] == ' ' || m_Signature[i] == '\0') m_SignatureByteLength++; } + + m_Hash = m_Hash.Update(m_SignatureByteLength); } /** @@ -51,6 +56,11 @@ namespace YimMenu { return m_SignatureByteLength; } + + constexpr PatternHash Hash() const + { + return m_Hash; + } }; class IPattern @@ -61,6 +71,7 @@ namespace YimMenu virtual const std::string_view Name() const = 0; virtual constexpr std::span> Signature() const = 0; + virtual const PatternHash Hash() const = 0; }; template @@ -69,6 +80,7 @@ namespace YimMenu private: const std::string_view m_Name; std::array, S.ByteLength()> m_Signature; + PatternHash m_Hash; public: constexpr Pattern(const std::string_view name); @@ -81,6 +93,10 @@ namespace YimMenu { return m_Signature; } + inline virtual const PatternHash Hash() const override + { + return m_Hash; + } friend std::ostream& operator<< <>(std::ostream& os, const Pattern& signature); }; @@ -90,6 +106,8 @@ namespace YimMenu IPattern(), m_Name(name) { + m_Hash = S.Hash(); + for (size_t i = 0, pos = 0; i < S.Length(); i++) { const auto c = S.Get()[i]; diff --git a/src/core/memory/PatternHash.hpp b/src/core/memory/PatternHash.hpp new file mode 100644 index 00000000..d78ffdb5 --- /dev/null +++ b/src/core/memory/PatternHash.hpp @@ -0,0 +1,68 @@ +#pragma once + +// TODO: use an actual hash function +namespace YimMenu +{ + class PatternHash + { + public: + std::uint64_t m_Hash; + + constexpr PatternHash() : + m_Hash(0xD84A917A64D4D016ULL) + { + } + + constexpr PatternHash(std::uint64_t hash) : + m_Hash(hash) + { + } + + constexpr PatternHash(const PatternHash& other) : + m_Hash(other.m_Hash) + { + } + + constexpr PatternHash(PatternHash&& other) : + m_Hash(other.m_Hash) + { + } + + constexpr void operator=(const PatternHash& other) + { + m_Hash = other.m_Hash; + } + + constexpr PatternHash Update(char data) const + { + auto hash = m_Hash; + hash += (static_cast(data)); + hash += hash << 10; + hash ^= (hash >> 6); + return PatternHash(hash); + } + + constexpr PatternHash Update(int data) const + { + auto hash = m_Hash; + hash ^= (data >> 8); + hash += hash << 10; + hash ^= (hash >> 7); + return PatternHash(hash); + } + + constexpr PatternHash Update(std::uint64_t data) const + { + auto hash = m_Hash; + hash ^= (data * 0xA5C38736C426FCB8ULL); + hash += hash << 15; + hash ^= (hash >> 5); + return PatternHash(hash); + } + + constexpr std::uint64_t GetHash() const + { + return m_Hash; + } + }; +} \ No newline at end of file diff --git a/src/core/memory/PatternScanner.cpp b/src/core/memory/PatternScanner.cpp index 02550251..16cb73d6 100644 --- a/src/core/memory/PatternScanner.cpp +++ b/src/core/memory/PatternScanner.cpp @@ -1,7 +1,8 @@ #include "PatternScanner.hpp" - #include "Module.hpp" +#include "core/backend/PatternCache.hpp" + #include namespace YimMenu @@ -42,6 +43,17 @@ namespace YimMenu { const auto signature = pattern->Signature(); + if (PatternCache::IsInitialized()) + { + auto offset = PatternCache::GetCachedOffset(pattern->Hash().Update(m_Module->Size())); + if (offset.has_value()) + { + LOG(INFO) << "Using cached pattern [" << pattern->Name() << "] : [" << HEX(m_Module->Base() + offset.value()) << "]"; + std::invoke(func, m_Module->Base() + offset.value()); + return true; + } + } + for (auto i = m_Module->Base(); i < m_Module->End(); ++i) { if (signature.size() + i > m_Module->End()) @@ -63,6 +75,11 @@ namespace YimMenu std::invoke(func, i); + if (PatternCache::IsInitialized()) + { + PatternCache::UpdateCachedOffset(pattern->Hash().Update(m_Module->Size()), i - m_Module->Base()); + } + return true; } } diff --git a/src/core/renderer/Renderer.cpp b/src/core/renderer/Renderer.cpp index 653bd629..9c3630f8 100644 --- a/src/core/renderer/Renderer.cpp +++ b/src/core/renderer/Renderer.cpp @@ -646,8 +646,8 @@ namespace YimMenu info.framebuffer = fd->Framebuffer; if (m_VkImageExtent.width == 0 || m_VkImageExtent.height == 0) { - info.renderArea.extent.width = Pointers.ScreenResX; - info.renderArea.extent.height = Pointers.ScreenResY; + info.renderArea.extent.width = *Pointers.ScreenResX; + info.renderArea.extent.height = *Pointers.ScreenResY; } else { @@ -759,7 +759,7 @@ namespace YimMenu bool Renderer::InitImpl() { - while (!*Pointers.Hwnd) + while (!*Pointers.Hwnd || !*Pointers.ScreenResX) { std::this_thread::sleep_for(1s); } diff --git a/src/game/backend/PlayerData.hpp b/src/game/backend/PlayerData.hpp index 33abade7..b6be7d50 100644 --- a/src/game/backend/PlayerData.hpp +++ b/src/game/backend/PlayerData.hpp @@ -19,6 +19,7 @@ namespace YimMenu RateLimiter m_VehicleFloodLimit{10s, 10}; RateLimiter m_LargeVehicleFloodLimit{15s, 5}; + RateLimiter m_TickerMessageRateLimit{5s, 3}; std::optional m_PeerIdToSpoofTo{}; }; diff --git a/src/game/backend/Voice.cpp b/src/game/backend/Voice.cpp index 4ca24199..047ffe6c 100644 --- a/src/game/backend/Voice.cpp +++ b/src/game/backend/Voice.cpp @@ -14,12 +14,22 @@ namespace YimMenu std::lock_guard lock(m_BufferModifyMutex); m_Running = false; if (m_AudioBuffer) + { delete[] m_AudioBuffer; + m_AudioBuffer = nullptr; + } } void Voice::LoadFileImpl() { std::lock_guard lock(m_BufferModifyMutex); + + if (m_AudioBuffer) + { + delete[] m_AudioBuffer; + m_AudioBuffer = nullptr; + } + if (std::filesystem::exists(m_AudioDirectory.Path() / m_AudioFile)) { std::ifstream waveStream(m_AudioDirectory.Path() / m_AudioFile, std::ios::in | std::ios::binary); @@ -41,6 +51,8 @@ namespace YimMenu m_AudioSize = dataSize; waveStream.read(m_AudioBuffer, m_AudioSize); waveStream.close(); + + LOGF(VERBOSE, __FUNCTION__ ": audio file loaded"); } m_AudioPage = 0; diff --git a/src/game/frontend/ChatDisplay.cpp b/src/game/frontend/ChatDisplay.cpp index 12665d51..dee45d59 100644 --- a/src/game/frontend/ChatDisplay.cpp +++ b/src/game/frontend/ChatDisplay.cpp @@ -19,7 +19,7 @@ namespace YimMenu notification.m_Message = message; notification.m_Color = color; - static const bool isBigScreen = Pointers.ScreenResX > 1600 && Pointers.ScreenResY > 900; + static const bool isBigScreen = *Pointers.ScreenResX > 1600 && *Pointers.ScreenResY > 900; static const int maxMessages = isBigScreen ? 17 : 7; std::lock_guard lock(m_Mutex); @@ -38,14 +38,14 @@ namespace YimMenu int position = 0; static const float y_pos = position * 100 + 200; - static const float x_pos = Pointers.ScreenResX - 470; + static const float x_pos = *Pointers.ScreenResX - 470; - ImGui::SetNextWindowSize(ImVec2(Pointers.ScreenResX - x_pos - 10, Pointers.ScreenResY - y_pos), ImGuiCond_Always); + ImGui::SetNextWindowSize(ImVec2(*Pointers.ScreenResX - x_pos - 10, *Pointers.ScreenResY - y_pos), ImGuiCond_Always); ImGui::SetNextWindowPos(ImVec2(x_pos, y_pos), ImGuiCond_Always); ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.0f, 0.0f, 0.0f, 0.0f)); ImGui::PushFont(Menu::Font::g_ChatFont); - ImGui::Begin("##chatwin", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoBackground); + ImGui::Begin("##chatwin", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoInputs); for (auto& message : m_Messages) { diff --git a/src/game/frontend/ContextMenu.cpp b/src/game/frontend/ContextMenu.cpp index fcddc76c..2a1ea1dd 100644 --- a/src/game/frontend/ContextMenu.cpp +++ b/src/game/frontend/ContextMenu.cpp @@ -129,8 +129,8 @@ namespace YimMenu auto entPos = m_Entity.GetPosition(); float worldCoords_[3] = {entPos.x, entPos.y, entPos.z}; Pointers.WorldToScreen(worldCoords_, &m_ScreenPos.x, &m_ScreenPos.y); - m_ScreenPos.x *= Pointers.ScreenResX; - m_ScreenPos.y *= Pointers.ScreenResY; + m_ScreenPos.x *= *Pointers.ScreenResX; + m_ScreenPos.y *= *Pointers.ScreenResY; PAD::DISABLE_CONTROL_ACTION(0, (int)NativeInputs::INPUT_NEXT_WEAPON, true); PAD::DISABLE_CONTROL_ACTION(0, (int)NativeInputs::INPUT_PREV_WEAPON, true); diff --git a/src/game/frontend/ESP.cpp b/src/game/frontend/ESP.cpp index 5215b080..cf52f016 100644 --- a/src/game/frontend/ESP.cpp +++ b/src/game/frontend/ESP.cpp @@ -7,8 +7,13 @@ #include "game/backend/Self.hpp" #include "game/pointers/Pointers.hpp" #include "game/rdr/Pools.hpp" +#include "game/rdr/Scripts.hpp" #include "util/Math.hpp" +#include "game/rdr/data/PedModels.hpp" + +#include "game/rdr/invoker/Invoker.hpp" + namespace { // Human @@ -85,7 +90,9 @@ namespace YimMenu::Features BoolCommand _ESPDrawPeds("espdrawpeds", "Draw Peds", "Should the ESP draw peds?"); BoolCommand _ESPDrawDeadPeds("espdrawdeadpeds", "Draw Dead Peds", "Should the ESP draw dead peds?"); - BoolCommand _ESPModelPeds("espmodelspeds", "Show Ped Model", "Should the ESP draw ped model hashes?"); + BoolCommand _ESPModelPeds("espmodelspeds", "Show Ped Model", "Should the ESP draw ped models?"); + BoolCommand _ESPNetworkInfoPeds("espnetinfopeds", "Show Ped Network Info", "Should the ESP draw network info?"); + BoolCommand _ESPScriptInfoPeds("espscriptinfopeds", "Show Ped Script Info", "Should the ESP draw script info?"); BoolCommand _ESPDistancePeds("espdistancepeds", "Show Ped Distance", "Should the ESP draw distance?"); BoolCommand _ESPSkeletonPeds("espskeletonpeds", "Show Ped Skeleton", "Should the ESP draw the skeleton?"); BoolCommand _ESPSkeletonHorse("espskeletonhorse", "Show Horse Skeleton", "Should the ESP draw horse skeletons?"); @@ -119,7 +126,7 @@ namespace YimMenu Pointers.WorldToScreen(boneCoords, &screen_x, &screen_y); - return ImVec2(screen_x * Pointers.ScreenResX, screen_y * Pointers.ScreenResY); + return ImVec2(screen_x * (*Pointers.ScreenResX), screen_y * (*Pointers.ScreenResY)); }; void DrawSkeleton(Ped ped, ImDrawList* drawList, ImColor color) @@ -237,11 +244,14 @@ namespace YimMenu void ESP::DrawPeds(Ped ped, ImDrawList* drawList) { - if (!ped.IsValid() || ped.IsPlayer() || ped == Self::GetPlayer().GetPed() - || boneToScreen(ped.GetBonePosition(torsoBone)).x == 0 || (ped.IsDead() && !Features::_ESPDrawDeadPeds.GetState())) + if (!ped.IsValid() || ped.IsPlayer() || ped == Self::GetPlayer().GetPed() || boneToScreen(ped.GetBonePosition(torsoBone)).x == 0 || (ped.IsDead() && !Features::_ESPDrawDeadPeds.GetState())) return; - float distanceToPed = Self::GetPed().GetPosition().GetDistance(ped.GetBonePosition(torsoBone)); + float distanceToPed = 0.0f; + + if (auto local = Self::GetPed()) + distanceToPed = local.GetPosition().GetDistance(ped.GetBonePosition(torsoBone)); + int alphaBasedOnDistance = 255; ImColor colorBasedOnDistance = Red; @@ -257,16 +267,43 @@ namespace YimMenu currentFont->Scale *= 1.2; ImGui::PushFont(ImGui::GetFont()); + std::string info = ""; + if (Features::_ESPModelPeds.GetState()) { - std::string model = std::format("0x{:08X}", (joaat_t)ped.GetModel()); - drawList->AddText(boneToScreen(ped.GetBonePosition(headBone)), ImGui::ColorConvertFloat4ToU32(Features::_HashColorPeds.GetState()), - model.c_str()); + if (auto it = Data::g_PedModels.find(ped.GetModel()); it != Data::g_PedModels.end()) + info += std::format("{} ", it->second); + else + info += std::format("0x{:08X} ", (joaat_t)ped.GetModel()); } + if (Features::_ESPNetworkInfoPeds.GetState() && ped.IsNetworked()) + { + auto owner = Player(ped.GetOwner()); + auto id = ped.GetNetworkObjectId(); + + info += std::format("{} {} ", id, owner.GetName()); + } + + if (Features::_ESPScriptInfoPeds.GetState()) + { + if (auto script = ENTITY::_GET_ENTITY_SCRIPT(ped.GetHandle(), nullptr)) + { + if (auto name = Scripts::GetScriptName(script)) + { + info += std::format("{} ", name); + } + } + } + + if (!info.empty()) + drawList->AddText(boneToScreen(ped.GetBonePosition(headBone)), + ImGui::ColorConvertFloat4ToU32(Features::_HashColorPeds.GetState()), + info.c_str()); + if (Features::_ESPDistancePeds.GetState()) { - std::string distanceStr = std::to_string((int)Self::GetPed().GetPosition().GetDistance(ped.GetBonePosition(torsoBone))) + "m"; + std::string distanceStr = std::to_string((int)distanceToPed) + "m"; drawList->AddText( {boneToScreen(ped.GetBonePosition(headBone)).x, boneToScreen(ped.GetBonePosition(headBone)).y + 20}, colorBasedOnDistance, @@ -297,6 +334,9 @@ namespace YimMenu void ESP::Draw() { + if (!NativeInvoker::AreHandlersCached() || CAM::IS_SCREEN_FADED_OUT()) + return; + if (const auto drawList = ImGui::GetBackgroundDrawList()) { if (Features::_ESPDrawPlayers.GetState()) @@ -306,7 +346,7 @@ namespace YimMenu DrawPlayer(player, drawList); } } - if (Features::_ESPDrawPeds.GetState()) + if (Features::_ESPDrawPeds.GetState() && GetPedPool()) { for (Ped ped : Pools::GetPeds()) { diff --git a/src/game/frontend/GUI.cpp b/src/game/frontend/GUI.cpp index 34d15356..02bf87f6 100644 --- a/src/game/frontend/GUI.cpp +++ b/src/game/frontend/GUI.cpp @@ -2,6 +2,7 @@ #include "Menu.hpp" #include "ESP.hpp" #include "ContextMenu.hpp" +#include "Overlay.hpp" #include "core/renderer/Renderer.hpp" #include "core/frontend/Notifications.hpp" #include "game/frontend/ChatDisplay.hpp" @@ -40,6 +41,11 @@ namespace YimMenu ChatDisplay::Draw(); }, -5); + Renderer::AddRendererCallBack( + [&] { + Overlay::Draw(); + }, + -6); } GUI::~GUI() diff --git a/src/game/frontend/Menu.cpp b/src/game/frontend/Menu.cpp index 4943425c..e691ace0 100644 --- a/src/game/frontend/Menu.cpp +++ b/src/game/frontend/Menu.cpp @@ -39,7 +39,7 @@ namespace YimMenu ImGui::PushStyleColor(ImGuiCol_WindowBg, ImU32(ImColor(15, 15, 15))); // Think this add HTML&PHP with no CSS. Lol just for testing. - ImGui::SetNextWindowSize(ImVec2((Pointers.ScreenResX / 2.5), (Pointers.ScreenResY / 2.5)), ImGuiCond_Once); + ImGui::SetNextWindowSize(ImVec2((*Pointers.ScreenResX / 2.5), (*Pointers.ScreenResY / 2.5)), ImGuiCond_Once); if (ImGui::Begin("HorseMenu", nullptr, ImGuiWindowFlags_NoDecoration)) { //ImGui::BeginDisabled(*Pointers.IsSessionStarted); @@ -134,6 +134,7 @@ namespace YimMenu Menu::Font::g_OptionsFont = IO.Fonts->AddFontFromMemoryTTF(const_cast(Fonts::MainFont), sizeof(Fonts::MainFont), Menu::Font::g_OptionsFontSize, &FontCfg); Menu::Font::g_ChildTitleFont = IO.Fonts->AddFontFromMemoryTTF(const_cast(Fonts::MainFont), sizeof(Fonts::MainFont), Menu::Font::g_ChildTitleFontSize, &FontCfg); Menu::Font::g_ChatFont = IO.Fonts->AddFontFromMemoryTTF(const_cast(Fonts::MainFont), sizeof(Fonts::MainFont), Menu::Font::g_ChatFontSize, &FontCfg); + Menu::Font::g_OverlayFont = IO.Fonts->AddFontFromMemoryTTF(const_cast(Fonts::MainFont), sizeof(Fonts::MainFont), Menu::Font::g_OverlayFontSize, &FontCfg); UIManager::SetOptionsFont(Menu::Font::g_OptionsFont); } } diff --git a/src/game/frontend/Menu.hpp b/src/game/frontend/Menu.hpp index 607f0b60..2e59b4ae 100644 --- a/src/game/frontend/Menu.hpp +++ b/src/game/frontend/Menu.hpp @@ -20,5 +20,8 @@ namespace YimMenu::Menu inline ImFont* g_ChatFont = nullptr; inline float g_ChatFontSize = 24.0f; + + inline ImFont* g_OverlayFont = nullptr; + inline float g_OverlayFontSize = 30.0f; } } \ No newline at end of file diff --git a/src/game/frontend/Overlay.cpp b/src/game/frontend/Overlay.cpp new file mode 100644 index 00000000..562b20e5 --- /dev/null +++ b/src/game/frontend/Overlay.cpp @@ -0,0 +1,36 @@ +#pragma once +#include "Overlay.hpp" +#include "Menu.hpp" +#include "core/commands/BoolCommand.hpp" +#include "game/pointers/Pointers.hpp" +#include "game/rdr/Natives.hpp" +#include "game/rdr/invoker/Invoker.hpp" + +namespace YimMenu::Features +{ + BoolCommand _OverlayEnabled("overlay", "Overlay Enabled", "Show an info overlay at the top left corner of the screen"); + BoolCommand _OverlayShowFPS("overlayfps", "Overlay Show FPS", "Show frame rate in the info overlay"); +} + +namespace YimMenu +{ + void Overlay::Draw() + { + if (!Features::_OverlayEnabled.GetState() || !NativeInvoker::AreHandlersCached()) + return; + + ImGui::SetNextWindowSize(ImVec2(*Pointers.ScreenResX - 10.0f, *Pointers.ScreenResY - 10.0f), ImGuiCond_Always); + ImGui::SetNextWindowPos(ImVec2(10.0f, 10.0f), ImGuiCond_Always); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.0f, 0.0f, 0.0f, 0.0f)); + ImGui::PushFont(Menu::Font::g_OverlayFont); + + ImGui::Begin("##overlay", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoInputs); + + if (Features::_OverlayShowFPS.GetState()) + ImGui::Text("FPS: %d", (int)(1 / MISC::GET_SYSTEM_TIME_STEP())); + + ImGui::PopFont(); + ImGui::PopStyleColor(); + ImGui::End(); + } +} \ No newline at end of file diff --git a/src/game/frontend/Overlay.hpp b/src/game/frontend/Overlay.hpp new file mode 100644 index 00000000..c618e91f --- /dev/null +++ b/src/game/frontend/Overlay.hpp @@ -0,0 +1,10 @@ +#pragma once + +namespace YimMenu +{ + class Overlay + { + public: + static void Draw(); + }; +} \ No newline at end of file diff --git a/src/game/frontend/items/ColorCommandItem.cpp b/src/game/frontend/items/ColorCommandItem.cpp index d64e4a1d..6ade8449 100644 --- a/src/game/frontend/items/ColorCommandItem.cpp +++ b/src/game/frontend/items/ColorCommandItem.cpp @@ -35,7 +35,7 @@ namespace YimMenu { if (ImGui::ColorPicker4("##picker", (float*)&color)) { - m_Command->SetColorState(color); + m_Command->SetState(color); } ImGui::EndPopup(); } diff --git a/src/game/frontend/items/Vector3CommandItem.cpp b/src/game/frontend/items/Vector3CommandItem.cpp index 69abaa83..882ebbb8 100644 --- a/src/game/frontend/items/Vector3CommandItem.cpp +++ b/src/game/frontend/items/Vector3CommandItem.cpp @@ -41,7 +41,7 @@ namespace YimMenu ImGui::Text("Click on a location to select it. Add more at Teleport > Saved"); InputTextWithHint("##filter", "Search", &m_CurrentFilter).Draw(); - const float max_length = Pointers.ScreenResY / 3.2; + const float max_length = *Pointers.ScreenResY / 3.2; // TODO: duplicated code ImGui::BeginGroup(); diff --git a/src/game/frontend/submenus/Network.cpp b/src/game/frontend/submenus/Network.cpp index 9525dc2e..e97791a3 100644 --- a/src/game/frontend/submenus/Network.cpp +++ b/src/game/frontend/submenus/Network.cpp @@ -134,7 +134,7 @@ namespace YimMenu::Submenus ImGui::InputText("Player Name", search, sizeof(search)); ImGui::PopID(); - if (ImGui::BeginListBox("###players", {180, static_cast(Pointers.ScreenResY - 400 - 38 * 4)})) + if (ImGui::BeginListBox("###players", {180, static_cast(*Pointers.ScreenResY - 400 - 38 * 4)})) { auto& item_arr = g_PlayerDatabase->GetAllPlayers(); if (item_arr.size() > 0) @@ -158,7 +158,7 @@ namespace YimMenu::Submenus { ImGui::PushID(1); ImGui::SameLine(); - if (ImGui::BeginChild("###selected_player", {500, static_cast(Pointers.ScreenResY - 388 - 38 * 4)}, false, ImGuiWindowFlags_NoBackground)) + if (ImGui::BeginChild("###selected_player", {500, static_cast(*Pointers.ScreenResY - 388 - 38 * 4)}, false, ImGuiWindowFlags_NoBackground)) { if (ImGui::InputText("Name", name_buf, sizeof(name_buf))) { diff --git a/src/game/frontend/submenus/Player/Info.cpp b/src/game/frontend/submenus/Player/Info.cpp index e4b0acb9..789baaae 100644 --- a/src/game/frontend/submenus/Player/Info.cpp +++ b/src/game/frontend/submenus/Player/Info.cpp @@ -95,9 +95,22 @@ namespace YimMenu::Submenus } auto ip = Players::GetSelected().GetExternalAddress(); + auto ip2 = Players::GetSelected().GetAddress()->m_external_ip; auto ip1 = Players::GetSelected().GetGamerInfo()->m_ExternalAddress; bool spoofedIp = (ip.m_packed != ip1.m_packed); + auto addr2 = std::string(std::to_string(ip2.m_field1)) + .append("." + std::to_string(ip2.m_field2)) + .append("." + std::to_string(ip2.m_field3)) + .append("." + std::to_string(ip2.m_field4)); + + ImGui::Text("Endpoint IP Address:"); + ImGui::SameLine(); + if (ImGui::Button(addr2.c_str())) + { + ImGui::SetClipboardText(addr2.c_str()); + } + if (!spoofedIp) { auto ipStr = std::string(std::to_string(ip.m_field1)) diff --git a/src/game/frontend/submenus/Settings.cpp b/src/game/frontend/submenus/Settings.cpp index c739a14a..114eafeb 100644 --- a/src/game/frontend/submenus/Settings.cpp +++ b/src/game/frontend/submenus/Settings.cpp @@ -43,6 +43,7 @@ namespace YimMenu::Submenus auto scriptEventGroup = std::make_shared("Script Events"); auto playerEsp = std::make_shared("Player ESP", 10); auto pedEsp = std::make_shared("Ped ESP", 10); + auto overlay = std::make_shared("Overlay"); auto context = std::make_shared("Context Menu"); auto misc = std::make_shared("Misc"); @@ -68,6 +69,9 @@ namespace YimMenu::Submenus pedEsp->AddItem(std::make_shared("espdrawpeds"_J, std::make_shared("espmodelspeds"_J, "Ped Hashes"))); pedEsp->AddItem(std::make_shared("espdrawpeds"_J, std::make_shared("hashcolorpeds"_J))); + pedEsp->AddItem(std::make_shared("espdrawpeds"_J, std::make_shared("espnetinfopeds"_J, "Ped Net Info"))); + pedEsp->AddItem(std::make_shared("espdrawpeds"_J, std::make_shared("espscriptinfopeds"_J, "Ped Script Info"))); + pedEsp->AddItem(std::make_shared("espdrawpeds"_J, std::make_shared("espdistancepeds"_J, "Ped Distance"))); //pedEsp->AddItem(std::make_shared("espdrawpeds"_J, std::make_shared("distancecolorpeds"_J))); // TO DO @@ -77,6 +81,9 @@ namespace YimMenu::Submenus pedEsp->AddItem(std::make_shared("espdrawpeds"_J, std::make_shared("espskeletonhorse"_J, "Horse Skeleton"))); pedEsp->AddItem(std::make_shared("espdrawpeds"_J, std::make_shared("skeletoncolorhorse"_J))); + overlay->AddItem(std::make_shared("overlay"_J)); + overlay->AddItem(std::make_shared("overlay"_J, std::make_shared("overlayfps"_J))); + context->AddItem(std::make_shared("ctxmenu"_J)); context->AddItem(std::make_shared("ctxmenu"_J, std::make_shared("ctxmenuplayers"_J, "Players"))); context->AddItem(std::make_shared("ctxmenu"_J, std::make_shared("ctxmenupeds"_J, "Peds"))); @@ -106,6 +113,7 @@ namespace YimMenu::Submenus gui->AddItem(playerEsp); gui->AddItem(pedEsp); + gui->AddItem(overlay); gui->AddItem(context); gui->AddItem(misc); diff --git a/src/game/frontend/submenus/World/PedSpawner.cpp b/src/game/frontend/submenus/World/PedSpawner.cpp index b6efdc60..27f59be0 100644 --- a/src/game/frontend/submenus/World/PedSpawner.cpp +++ b/src/game/frontend/submenus/World/PedSpawner.cpp @@ -31,15 +31,9 @@ namespace YimMenu::Submenus ctx->SetReturnValue(4); } - static bool IsPedModelInList(std::string model) + static bool IsPedModelInList(const std::string& model) { - for (const auto& pedModel : Data::g_PedModels) - { - if (pedModel.model == model) - return true; - } - - return false; + return Data::g_PedModels.contains(Joaat(model)); } static int PedSpawnerInputCallback(ImGuiInputTextCallbackData* data) @@ -49,13 +43,13 @@ namespace YimMenu::Submenus std::string newText{}; std::string inputLower = data->Buf; std::transform(inputLower.begin(), inputLower.end(), inputLower.begin(), ::tolower); - for (const auto& pedModel : Data::g_PedModels) + for (const auto& [key, model] : Data::g_PedModels) { - std::string modelLower = pedModel.model; + std::string modelLower = model; std::transform(modelLower.begin(), modelLower.end(), modelLower.begin(), ::tolower); if (modelLower.find(inputLower) != std::string::npos) { - newText = pedModel.model; + newText = model; } } @@ -85,8 +79,7 @@ namespace YimMenu::Submenus static bool dead, invis, godmode, freeze, companion, sedated; static int formation; static std::vector spawnedPeds; - InputTextWithHint("##pedmodel", "Ped Model", &pedModelBuffer, ImGuiInputTextFlags_CallbackCompletion, nullptr, PedSpawnerInputCallback) - .Draw(); + InputTextWithHint("##pedmodel", "Ped Model", &pedModelBuffer, ImGuiInputTextFlags_CallbackCompletion, nullptr, PedSpawnerInputCallback).Draw(); if (ImGui::IsItemHovered()) ImGui::SetTooltip("Press Tab to auto fill"); if (!pedModelBuffer.empty() && !IsPedModelInList(pedModelBuffer)) @@ -95,13 +88,13 @@ namespace YimMenu::Submenus std::string bufferLower = pedModelBuffer; std::transform(bufferLower.begin(), bufferLower.end(), bufferLower.begin(), ::tolower); - for (const auto& pedModel : Data::g_PedModels) + for (const auto& [hash, model] : Data::g_PedModels) { - std::string pedModelLower = pedModel.model; + std::string pedModelLower = model; std::transform(pedModelLower.begin(), pedModelLower.end(), pedModelLower.begin(), ::tolower); - if (pedModelLower.find(bufferLower) != std::string::npos && ImGui::Selectable(pedModel.model.data())) + if (pedModelLower.find(bufferLower) != std::string::npos && ImGui::Selectable(model)) { - pedModelBuffer = pedModel.model; + pedModelBuffer = model; } } diff --git a/src/game/hooks/GUI/Window.cpp b/src/game/hooks/GUI/Window.cpp index c618913e..892edd11 100644 --- a/src/game/hooks/GUI/Window.cpp +++ b/src/game/hooks/GUI/Window.cpp @@ -22,4 +22,16 @@ namespace YimMenu::Hooks return BaseHook::Get>()->Original()(x, y); } + + BOOL Window::ShowWindow(HWND hWnd, int nCmdShow) + { + LOG(INFO) << hWnd << " " << nCmdShow; + // prevent game from hiding console window + if (hWnd == GetConsoleWindow() && nCmdShow == 0) + { + return false; + } + + return BaseHook::Get>()->Original()(hWnd, nCmdShow); + } } \ No newline at end of file diff --git a/src/game/hooks/Hooks.hpp b/src/game/hooks/Hooks.hpp index 2e12fd10..9941ea4b 100644 --- a/src/game/hooks/Hooks.hpp +++ b/src/game/hooks/Hooks.hpp @@ -25,6 +25,7 @@ namespace rage class netRpcBuilder; class netRpcReaderContext; class netRpcReader; + class rlGamerHandle; } class CNetGamePlayer; @@ -70,6 +71,7 @@ namespace YimMenu::Hooks { extern LRESULT WndProc(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam); extern BOOL SetCursorPos(int x, int y); + extern BOOL ShowWindow(HWND hWnd, int nCmdShow); } namespace Script @@ -99,10 +101,10 @@ namespace YimMenu::Hooks extern bool CanApplyData(rage::netSyncTree* tree, rage::netObject* object); extern void ResetSyncNodes(); extern bool HandleScriptedGameEvent(CScriptedGameEvent* event, CNetGamePlayer* src, CNetGamePlayer* dst); - extern int AddObjectToCreationQueue(void* mgr, NetObjType objectType, CNetGamePlayer* src, CNetGamePlayer* dst); + extern int AddObjectToCreationQueue(void* mgr, CNetGamePlayer* src, CNetGamePlayer* dst, NetObjType type, std::uint16_t net_id, int flags, void* a7, void* guid, int a9); extern bool ReceiveNetMessage(void* a1, rage::netConnectionManager* ncm, rage::netConnection::InFrame* frame); - extern bool HandlePresenceEvent(uint64_t a1, rage::rlGamerInfo* gamerInfo, unsigned int sender, const char** payload, const char* channel); - extern bool PPostMessage(int localGamerIndex, rage::rlGamerInfo* recipients, int numRecipients, const char* msg, unsigned int ttlSeconds); + extern void HandlePresenceEvent(int localGamerIndex, __int64 data, __int64 source); + extern bool PPostMessage(int localGamerIndex, rage::rlGamerHandle* recipients, int numRecipients, const char* msg, unsigned int ttlSeconds); extern bool SerializeServerRPC(rage::netRpcBuilder* builder, void* a2, const char* message, void* def, void* structure, const char* RPCGuid, void* a7); extern void DeserializeServerMessage(rage::netRpcReaderContext* ctx, void* def, void* structure); extern bool ReceiveServerMessage(void* a1, rage::netRpcReader* message); // doesn't receive all messages @@ -115,6 +117,7 @@ namespace YimMenu::Hooks extern bool HandlePeerRelayPacket(__int64 _this, __int64 netSockFrom, void* buffer, unsigned int sizeOfBuffer); extern void UnpackPacket(__int64 _this, netAddress* sender, void* buffer, unsigned int sizeOfBuffer, bool allowRelayOverride); extern void UpdateEndpointAddress(__int64 _this, void* peerID, netAddress* addrOrig, netAddress* relayAddrOrig); + extern bool CanCreateNetworkObject(NetObjType type, int count, bool mission, bool a4, bool a5); } namespace Voice @@ -132,6 +135,7 @@ namespace YimMenu::Hooks { extern void ThrowFatalError(int code, int fileHash, int fileLine); extern bool IsAnimSceneInScope(rage::netObject* scene, CNetGamePlayer* player, int* reason); + extern int GetPoolSize(void* config, std::uint32_t hash, int def); } namespace Info diff --git a/src/game/hooks/Misc/GetPoolSize.cpp b/src/game/hooks/Misc/GetPoolSize.cpp new file mode 100644 index 00000000..8e556ce9 --- /dev/null +++ b/src/game/hooks/Misc/GetPoolSize.cpp @@ -0,0 +1,42 @@ +#include "core/hooking/DetourHook.hpp" +#include "game/hooks/Hooks.hpp" +#include "game/pointers/Pointers.hpp" +#include "util/Joaat.hpp" + +#include + +namespace YimMenu::Hooks +{ + const std::unordered_set g_NetPedPools = {"CAnimalSyncData"_J, "CNetObjPedBase"_J, "CPedSyncData"_J}; + const std::unordered_set g_NetPedPlusPlayerPools = {"CNetBlenderPed"_J, "CNetworkDamageTracker"_J}; + + static int g_PedPoolsPatched = 0; + static int g_PedPlusPlayerPoolsPatched = 0; + + int Misc::GetPoolSize(void* config, std::uint32_t hash, int def) + { + int value = BaseHook::Get>()->Original()(config, hash, def); + + if (g_NetPedPools.contains(hash)) + { + g_PedPoolsPatched++; + value = 150; + } + else if (g_NetPedPlusPlayerPools.contains(hash)) + { + g_PedPlusPlayerPoolsPatched++; + value = 150 + 32; + } + + if (g_NetPedPools.size() == g_PedPoolsPatched && g_NetPedPlusPlayerPools.size() == g_PedPlusPlayerPoolsPatched) + { + static bool once = [] { + *Pointers.MaxNetworkPeds = 150; + LOG(INFO) << "Network ped pools patched successfully"; + return true; + }(); + } + + return value; + } +} \ No newline at end of file diff --git a/src/game/hooks/Protections/AddObjectToCreationQueue.cpp b/src/game/hooks/Protections/AddObjectToCreationQueue.cpp index 2f576da2..59b1ea36 100644 --- a/src/game/hooks/Protections/AddObjectToCreationQueue.cpp +++ b/src/game/hooks/Protections/AddObjectToCreationQueue.cpp @@ -9,16 +9,15 @@ namespace YimMenu::Hooks { - int Protections::AddObjectToCreationQueue(void* mgr, NetObjType type, CNetGamePlayer* src, CNetGamePlayer* dst) + int Protections::AddObjectToCreationQueue(void* mgr, CNetGamePlayer* src, CNetGamePlayer* dst, NetObjType type, std::uint16_t net_id, int flags, void* a7, void* guid, int a9) { YimMenu::Protections::SetSyncingPlayer(src); if (ShouldBlockSync(Pointers.GetSyncTreeForType(nullptr, (uint16_t)type), type, nullptr)) - return -1; + return 0; YimMenu::Protections::SetSyncingPlayer(nullptr); - return BaseHook::Get>() - ->Original()(mgr, type, src, dst); + return BaseHook::Get>()->Original()(mgr, src, dst, type, net_id, flags, a7, guid, a9); } } \ No newline at end of file diff --git a/src/game/hooks/Protections/CanCreateNetworkObject.cpp b/src/game/hooks/Protections/CanCreateNetworkObject.cpp new file mode 100644 index 00000000..8a30823f --- /dev/null +++ b/src/game/hooks/Protections/CanCreateNetworkObject.cpp @@ -0,0 +1,84 @@ +#include "core/commands/BoolCommand.hpp" +#include "core/hooking/DetourHook.hpp" +#include "game/backend/Self.hpp" +#include "game/hooks/Hooks.hpp" +#include "game/pointers/Pointers.hpp" +#include "game/rdr/Pools.hpp" +#include "util/Joaat.hpp" + +#include +#include + +namespace YimMenu::Features +{ + BoolCommand _BetterEntityCheck("betterentitycheck", "Better Entity Check (BETA)", "Attempts to fix several entity spawning bugs. This is still experimental, use with caution", true); +} + +namespace YimMenu::Hooks +{ + static void DeleteAmbientObjects(rage::fwBasePool* pool, int to_delete) + { + for (auto entity : PoolUtils(pool)) + { + if (entity.IsNetworked() && !entity.IsPlayer() && !entity.IsMissionEntity()) + { + entity.Delete(); + to_delete--; + } + + if (to_delete == 0) + break; + } + } + + bool Protections::CanCreateNetworkObject(NetObjType type, int count, bool mission, bool a4, bool a5) + { + if (Features::_BetterEntityCheck.GetState()) + { + bool is_ped = type == NetObjType::Ped || type == NetObjType::Horse || type == NetObjType::Animal; + bool is_veh = type == NetObjType::Boat || type == NetObjType::DraftVeh || type == NetObjType::Automobile || type == NetObjType::Heli || type == NetObjType::Submarine; + bool is_obj = type == NetObjType::Object; // TODO: add more object types + + rage::fwBasePool* pool = nullptr; + + if (is_ped) + pool = GetPedPool(); + else if (is_veh) + pool = GetVehiclePool(); + else if (is_obj) + pool = GetObjectPool(); + + if (pool) + { + auto can_create_object = BaseHook::Get>()->Original()(type, count, mission, a4, a5) && pool->GetNumFreeSlots() >= count; + + if (can_create_object) + return true; + + // our pools are full + + if (!mission) + return false; // we're trying to create an ambient ped, and failures are totally OK + + LOGF(GAME, INFO, "CanCreateNetworkObject: Freeing objects for mission entity"); + + // try deleting some objects + DeleteAmbientObjects(pool, count); + + // recalculate + can_create_object = BaseHook::Get>()->Original()(type, count, mission, a4, a5) && pool->GetNumFreeSlots() >= count; + + if (!can_create_object) + { + LOGF(GAME, WARNING, "CanCreateNetworkObject: Failed to clear space for mission entity"); + return false; // don't call original here since it might return true and crash the game + } + } + } + + if (!BaseHook::Get>()->Original()(type, count, mission, a4, a5)) + return false; + + return true; + } +} \ No newline at end of file diff --git a/src/game/hooks/Protections/HandlePresenceEvent.cpp b/src/game/hooks/Protections/HandlePresenceEvent.cpp index e2aed899..19e51f59 100644 --- a/src/game/hooks/Protections/HandlePresenceEvent.cpp +++ b/src/game/hooks/Protections/HandlePresenceEvent.cpp @@ -17,11 +17,18 @@ namespace YimMenu::Features namespace YimMenu::Hooks { - bool Protections::HandlePresenceEvent(uint64_t a1, rage::rlGamerInfo* gamerInfo, unsigned int sender, const char** payload, const char* channel) + void Protections::HandlePresenceEvent(int localGamerIndex, __int64 data, __int64 source) { - bool ret = - BaseHook::Get>()->Original()(a1, gamerInfo, sender, payload, channel); + const auto payload = *(char**)(data + 8); + if (Features::_LogPresenceEvents.GetState()) + { + LOG(VERBOSE) << "HandlePresenceEvent :: " << payload; + } + + BaseHook::Get>()->Original()(localGamerIndex, data, source); + + #if 0 const char* key = "gm.evt"; std::string p(*payload); @@ -82,5 +89,6 @@ namespace YimMenu::Hooks } return ret; + #endif } } \ No newline at end of file diff --git a/src/game/hooks/Protections/HandleScriptedGameEvent.cpp b/src/game/hooks/Protections/HandleScriptedGameEvent.cpp index fe6ede83..c96b815e 100644 --- a/src/game/hooks/Protections/HandleScriptedGameEvent.cpp +++ b/src/game/hooks/Protections/HandleScriptedGameEvent.cpp @@ -5,6 +5,7 @@ #include "game/backend/Players.hpp" #include "game/backend/Protections.hpp" #include "game/backend/Self.hpp" +#include "game/backend/PlayerData.hpp" #include "game/hooks/Hooks.hpp" #include "game/rdr/data/StableEvents.hpp" #include "game/rdr/data/TickerEvents.hpp" @@ -28,8 +29,6 @@ namespace YimMenu::Features namespace YimMenu::Hooks { - RateLimiter m_TickerMessageRateLimit{5s, 3}; - bool Protections::HandleScriptedGameEvent(CScriptedGameEvent* event, CNetGamePlayer* src, CNetGamePlayer* dst) { if (Features::_LogScriptEvents.GetState()) @@ -106,15 +105,11 @@ namespace YimMenu::Hooks } case ScriptEvent::SCRIPT_EVENT_TICKER_MESSAGE: { - if (m_TickerMessageRateLimit.Process() && Features::_BlockTickerSpam.GetState()) + if (Player(src).GetData().m_TickerMessageRateLimit.Process() && Features::_BlockTickerSpam.GetState()) { - if (m_TickerMessageRateLimit.ExceededLastProcess()) + if (Player(src).GetData().m_TickerMessageRateLimit.ExceededLastProcess()) { - Notifications::Show("Protections", - std::format("Blocked ticker spam from {} ({})", - src->GetName(), - Data::g_TickerEvents[event->m_Data[4]].second), - NotificationType::Warning); + LOGF(NET_EVENT, WARNING, "Blocked ticker spam ({}) from {}", event->m_Data[4], src->GetName()); } return true; } diff --git a/src/game/hooks/Protections/LogSyncNode.cpp b/src/game/hooks/Protections/LogSyncNode.cpp index ad8ef27e..2f6ebaaa 100644 --- a/src/game/hooks/Protections/LogSyncNode.cpp +++ b/src/game/hooks/Protections/LogSyncNode.cpp @@ -56,13 +56,15 @@ namespace YimMenu::Hooks { void Protections::LogSyncNode(CProjectBaseSyncDataNode* node, SyncNodeId& id, NetObjType type, rage::netObject* object, Player& player) { - if (!object) - return; // TODO: log creation queue syncs + int object_id = -1; + + if (object) + object_id = object->m_ObjectId; if (player.IsValid()) - LOG(INFO) << player.GetName() << ": " << id.name << ", " << object->m_ObjectId; + LOG(INFO) << player.GetName() << ": " << id.name << ", " << object_id; else - LOG(INFO) << "UNKNOWN: " << id.name << object->m_ObjectId; + LOG(INFO) << "UNKNOWN: " << id.name << " " << object_id; switch (id) { diff --git a/src/game/hooks/Protections/PostMessage.cpp b/src/game/hooks/Protections/PostMessage.cpp index bdfbdef2..c1791bba 100644 --- a/src/game/hooks/Protections/PostMessage.cpp +++ b/src/game/hooks/Protections/PostMessage.cpp @@ -12,17 +12,11 @@ namespace YimMenu::Features namespace YimMenu::Hooks { - bool Protections::PPostMessage(int localGamerIndex, rage::rlGamerInfo* recipients, int numRecipients, const char* msg, unsigned int ttlSeconds) + bool Protections::PPostMessage(int localGamerIndex, rage::rlGamerHandle* recipients, int numRecipients, const char* msg, unsigned int ttlSeconds) { if (Features::_LogPostMessage.GetState()) { - LOG(VERBOSE) << "Local Gamer Index: " << localGamerIndex; - LOG(VERBOSE) << "Recipients name and rid: " << std::string(recipients->m_Name).c_str() << " " - << recipients->m_GamerHandle.m_RockstarId; - - LOG(VERBOSE) << "Num recipients: " << numRecipients; - LOG(VERBOSE) << "Message: " << msg; - LOG(VERBOSE) << "TTL: " << ttlSeconds; + LOG(VERBOSE) << "PostMessage :: " << msg; } return BaseHook::Get>()->Original()(localGamerIndex, recipients, numRecipients, msg, ttlSeconds); diff --git a/src/game/hooks/Protections/ShouldBlockSync.cpp b/src/game/hooks/Protections/ShouldBlockSync.cpp index 70ce1cb0..b1b73327 100644 --- a/src/game/hooks/Protections/ShouldBlockSync.cpp +++ b/src/game/hooks/Protections/ShouldBlockSync.cpp @@ -42,6 +42,7 @@ #include #include +#define BLOCK_CRASHES 1 namespace YimMenu::Features { @@ -52,6 +53,8 @@ namespace YimMenu::Features BoolCommand _BlockSpectateSession("blockspectatesession", "Block Spectate for Session", "Attempts to prevent modders from spectating anyone", false); BoolCommand _BlockAttachments("blockattach", "Block Attachments", "Prevents modders from attaching objects and peds to you", true); BoolCommand _BlockVehicleFlooding("blockvehflood", "Block Vehicle Flooding", "Prevents modders from creating too many vehicles", true); + + BoolCommand _BlockGhostPeds("blockghostpeds", "Block Ghost Peds", "Blocks creation of ghost peds that are seemingly created due to a game bug", true); } namespace @@ -157,6 +160,9 @@ namespace inline YimMenu::Player GetObjectCreator(rage::netObject* object) { + if (!object) + return nullptr; + for (auto& [idx, player] : Players::GetPlayers()) { if ((*Pointers.ScSession)->m_SessionMultiplayer->GetPlayerByIndex(idx)->m_SessionPeer->m_Identifier.m_AccountId == object->m_Guid.GetAccountId()) @@ -208,7 +214,28 @@ namespace { LOGF(SYNC, WARNING, "Blocking invalid ped creation model 0x{:X} from {}", data.m_ModelHash, Protections::GetSyncingPlayer().GetName()); SyncBlocked("mismatched ped model crash"); - Protections::GetSyncingPlayer().AddDetection(Detection::TRIED_CRASH_PLAYER); + data.m_ModelHash = "MP_MALE"_J; + data.m_BannedPed = true; // blocking this seems difficult + return true; + } + break; + } + case "CAnimalCreationNode"_J: + { + auto& data = node->GetData(); + if (data.m_ModelHash && !STREAMING::IS_MODEL_A_PED(data.m_ModelHash)) + { + LOGF(SYNC, WARNING, "Blocking invalid animal creation model 0x{:X} from {}", data.m_ModelHash, Protections::GetSyncingPlayer().GetName()); + SyncBlocked("mismatched animal model crash"); + data.m_ModelHash = "MP_MALE"_J; + data.m_BannedPed = true; // blocking this seems difficult + return true; + } + if (data.m_PopulationType == 10 && Features::_BlockGhostPeds.GetState()) + { + // block ghost peds + if (object) + DeleteSyncObject(object->m_ObjectId); return true; } break; @@ -220,19 +247,18 @@ namespace { LOGF(SYNC, WARNING, "Blocking crash object creation model 0x{:X} from {}", data.m_ModelHash, Protections::GetSyncingPlayer().GetName()); SyncBlocked("invalid object crash"); - Protections::GetSyncingPlayer().AddDetection(Detection::TRIED_CRASH_PLAYER); return true; } if (data.m_ModelHash && !STREAMING::_IS_MODEL_AN_OBJECT(data.m_ModelHash)) { LOGF(SYNC, WARNING, "Blocking invalid object creation model 0x{:X} from {}", data.m_ModelHash, Protections::GetSyncingPlayer().GetName()); SyncBlocked("mismatched object model crash"); - Protections::GetSyncingPlayer().AddDetection(Detection::TRIED_CRASH_PLAYER); return true; } if (g_CageModels.count(data.m_ModelHash)) { - DeleteSyncObject(object->m_ObjectId); + if (object) + DeleteSyncObject(object->m_ObjectId); SyncBlocked("cage spawn", GetObjectCreator(object)); return true; } @@ -254,7 +280,7 @@ namespace { // TODO LOGF(SYNC, WARNING, "Prevented {} from using animal model 0x{:X} to prevent potential task crashes", Protections::GetSyncingPlayer().GetName(), data.m_ModelHash); - data.m_ModelHash = "MP_MALE"_J; + // data.m_ModelHash = "MP_MALE"_J; } CheckPlayerModel(Protections::GetSyncingPlayer().GetHandle(), data.m_ModelHash); @@ -489,7 +515,7 @@ namespace case "CPickupCreationNode"_J: { auto& data = node->GetData(); - if (!OBJECT::_IS_PICKUP_TYPE_VALID(data.m_PickupHash) && !(data.m_PickupHash == 0xFFFFFFFF && data.m_ModelHash == 0)) + if (!OBJECT::_IS_PICKUP_TYPE_VALID(data.m_PickupHash) && !(data.m_PickupHash == 0xFFFFFFFF && data.m_ModelHash == 0) && (data.m_ModelHash != 0 && STREAMING::_IS_MODEL_AN_OBJECT(data.m_ModelHash))) { LOGF(SYNC, WARNING, "Blocking pickup with invalid hashes (m_PickupHash = 0x{}, m_ModelHash = 0x{}) from {}", data.m_PickupHash, data.m_ModelHash, Protections::GetSyncingPlayer().GetName()); SyncBlocked("invalid pickup type crash"); @@ -571,7 +597,7 @@ namespace YimMenu::Hooks::Protections { Nodes::Init(); - if (g_Running /*something getting nulled before last iteration*/ && tree->m_NodeCount && tree->m_NextSyncNode && SyncNodeVisitor(reinterpret_cast(tree->m_NextSyncNode), type, object)) + if (g_Running && SyncNodeVisitor(reinterpret_cast(tree->m_NextSyncNode), type, object)) { return true; } diff --git a/src/game/pointers/Pointers.cpp b/src/game/pointers/Pointers.cpp index c1a17b24..c483ee79 100644 --- a/src/game/pointers/Pointers.cpp +++ b/src/game/pointers/Pointers.cpp @@ -1,5 +1,6 @@ #include "Pointers.hpp" +#include "core/backend/PatternCache.hpp" #include "core/memory/BytePatch.hpp" #include "core/memory/ModuleMgr.hpp" #include "core/memory/PatternScanner.hpp" @@ -12,6 +13,8 @@ namespace YimMenu { bool Pointers::Init() { + PatternCache::Init(); + const auto rdr2 = ModuleMgr.Get("RDR2.exe"_J); if (!rdr2) { @@ -38,26 +41,22 @@ namespace YimMenu constexpr auto gfxInformationPtrn = Pattern<"48 8D 0D ? ? ? ? 48 8B F8 E8 ? ? ? ? 45 33 ED 45 84 FF">("GFXInformation"); scanner.Add(gfxInformationPtrn, [this](PointerCalculator ptr) { - auto gfx = ptr.Add(3).Rip().As(); + GraphicsOptions_ = ptr.Add(3).Rip().As(); - if (gfx->m_hdr) + if (GraphicsOptions_->m_hdr) { LOG(WARNING) << "Turn HDR off if you're using DX12!"; } - //LOG(INFO) << GetGraphicsValue(gfx->m_gfx_lightingQuality); example - - if (gfx->m_unk) - { - ScreenResX = gfx->m_screen_resolution_x; - ScreenResY = gfx->m_screen_resolution_y; - LOG(INFO) << "Screen Resolution: " << ScreenResX << "x" << ScreenResY; - } + ScreenResX = &GraphicsOptions_->m_screen_resolution_x; + ScreenResY = &GraphicsOptions_->m_screen_resolution_y; }); - constexpr auto keyboardHookPtrn = Pattern<"41 83 E9 5B 44 3B C8 76 15">("KeyboardHook"); + constexpr auto keyboardHookPtrn = Pattern<"41 8D 49 0D">("KeyboardHook"); scanner.Add(keyboardHookPtrn, [this](PointerCalculator ptr) { - UnhookWindowsHookEx(*ptr.Add(0xC).Rip().As()); // weird hook that gets set by an encrypted function + UnhookWindowsHookEx(*ptr.Add(0x14).Rip().As()); // remove hook if it already exists + memset(ptr.Add(4).As(), 0x90, 6); // prevent it from being created if we load early + memset(ptr.Sub(0x1B).As(), 0x90, 6); // ...and prevent the game from destroying our console window }); constexpr auto wndProcPtrn = Pattern<"48 89 5C 24 ? 4C 89 4C 24 ? 48 89 4C 24 ? 55 56 57 41 54 41 55 41 56 41 57 48 8B EC 48 83 EC 60">("WndProc"); @@ -230,9 +229,9 @@ namespace YimMenu HandleScriptedGameEvent = ptr.As(); }); - constexpr auto addObjectToCreationQueuePtrn = Pattern<"48 8B C4 48 89 58 08 48 89 70 10 48 89 78 18 55 41 54 41 55 41 56 41 57 48 8D 68 98 48 81 EC 50">("AddObjectToCreationQueue"); + constexpr auto addObjectToCreationQueuePtrn = Pattern<"0F 83 00 01 00 00 4D 8B C8">("AddObjectToCreationQueue"); scanner.Add(addObjectToCreationQueuePtrn, [this](PointerCalculator ptr) { - AddObjectToCreationQueue = ptr.As(); + AddObjectToCreationQueue = ptr.Sub(0x2C).As(); }); constexpr auto playerHasJoinedPtrn = Pattern<"E8 ? ? ? ? 8A 4B 19 48 8B 45 38">("PlayerHasJoined"); @@ -305,9 +304,9 @@ namespace YimMenu ReceiveNetMessage = ptr.Add(1).Rip().As(); }); - constexpr auto handlePresenceEventPtrn = Pattern<"E8 ?? ?? ?? ?? 4C 8D 9C 24 B0 10 00 00 49 8B 5B 10">("HandlePresenceEvent"); + constexpr auto handlePresenceEventPtrn = Pattern<"0F 84 00 03 00 00 85 C9">("HandlePresenceEvent"); scanner.Add(handlePresenceEventPtrn, [this](PointerCalculator ptr) { - HandlePresenceEvent = ptr.Add(1).Rip().As(); + HandlePresenceEvent = ptr.Sub(0x34).As(); }); constexpr auto postMessagePtrn = Pattern<"E8 ?? ?? ?? ?? EB 35 C7 44 24 20 D9 7A 70 E1">("PostPresenceMessage"); @@ -525,7 +524,7 @@ namespace YimMenu constexpr auto serializeIceSessionOfferRequestPtrn = Pattern<"80 3F 03 0F 85 9C 01 00 00">("SerializeIceSessionOfferRequest"); scanner.Add(serializeIceSessionOfferRequestPtrn, [this](PointerCalculator ptr) { - SerializeIceSessionOfferRequest = ptr.Sub(0x2F).As(); + SerializeIceSessionOfferRequest = ptr.Sub(0x2F).As(); }); constexpr auto openIceTunnelPtrn = Pattern<"66 44 39 6D 58 0F 84 1D 01 00 00">("OpenIceTunnel"); @@ -533,12 +532,42 @@ namespace YimMenu OpenIceTunnel = ptr.Sub(0x5F).As(); }); + constexpr auto canCreateNetworkObjectPtrn = Pattern<"B8 81 00 20 00 85 FF">("CanCreateNetworkObject"); + scanner.Add(canCreateNetworkObjectPtrn, [this](PointerCalculator ptr) { + CanCreateNetworkObject = ptr.Sub(0x26).As(); + MaxNetworkPeds = ptr.Add(0x60).As(); + }); + + // fixes crash at CNetObjPed::SetPedWeaponComponentData + constexpr auto weaponComponentPatchPtrn = Pattern<"0F 85 9E 00 00 00 45 39 19">("WeaponComponentPatch"); + scanner.Add(weaponComponentPatchPtrn, [this](PointerCalculator ptr) { + // TODO: disable on unload + *ptr.Add(9).As() = 0x377C; + *ptr.Add(0x15).As() = 0x2B7D; + }); + + constexpr auto getPoolSizePtrn = Pattern<"BA F7 01 22 5F">("GetPoolSize"); + scanner.Add(getPoolSizePtrn, [this](PointerCalculator ptr) { + GetPoolSize = ptr.Add(0xC).Rip().As(); + }); + if (!scanner.Scan()) { LOG(FATAL) << "Some game patterns could not be found, unloading."; return false; } + else + { + LOG(INFO) << "Initial pointer scan complete"; + } + + return true; + } + + bool Pointers::LateInit() + { + PatternCache::Update(); // update late to store all patterns return true; } diff --git a/src/game/pointers/Pointers.hpp b/src/game/pointers/Pointers.hpp index 107dddce..a9193eb1 100644 --- a/src/game/pointers/Pointers.hpp +++ b/src/game/pointers/Pointers.hpp @@ -10,7 +10,7 @@ #include #include - +class GraphicsOptions; class CNetGamePlayer; class CVehicle; class CPed; @@ -87,6 +87,7 @@ namespace YimMenu struct PointerData { // RDR + GraphicsOptions* GraphicsOptions_; bool* IsSessionStarted; std::int64_t** ScriptGlobals; Functions::GetNativeHandler GetNativeHandler; @@ -133,6 +134,9 @@ namespace YimMenu CTrainConfigs* TrainConfigs; Functions::OpenIceTunnel OpenIceTunnel; PVOID SerializeIceSessionOfferRequest; + PVOID CanCreateNetworkObject; + int* MaxNetworkPeds; + PVOID GetPoolSize; PoolEncryption* PedPool; PoolEncryption* ObjectPool; @@ -216,8 +220,8 @@ namespace YimMenu PVOID WndProc; BOOL IsVulkan; - uint32_t ScreenResX; - uint32_t ScreenResY; + uint32_t* ScreenResX; + uint32_t* ScreenResY; PVOID NetworkRequest; @@ -233,6 +237,7 @@ namespace YimMenu struct Pointers : PointerData { bool Init(); + bool LateInit(); void Restore(); }; diff --git a/src/game/rdr/Entity.cpp b/src/game/rdr/Entity.cpp index c755572d..36679aac 100644 --- a/src/game/rdr/Entity.cpp +++ b/src/game/rdr/Entity.cpp @@ -96,6 +96,12 @@ namespace YimMenu return ENTITY::GET_IS_ANIMAL(GetHandle()); } + bool Entity::IsMissionEntity() + { + ENTITY_ASSERT_VALID(); + return ENTITY::IS_ENTITY_A_MISSION_ENTITY(GetHandle()); // TODO: detect more mission states + } + int Entity::GetModel() { ENTITY_ASSERT_VALID(); @@ -170,6 +176,7 @@ namespace YimMenu } else { + // TODO: call delete functions directly if (!ENTITY::IS_ENTITY_A_MISSION_ENTITY(GetHandle())) ENTITY::SET_ENTITY_AS_MISSION_ENTITY(GetHandle(), true, true); auto hnd = GetHandle(); @@ -198,6 +205,14 @@ namespace YimMenu return !GetNetworkObject()->m_IsRemotelyControlled; } + int Entity::GetOwner() + { + if (!IsNetworked()) + return -1; + + return GetNetworkObject()->m_OwnerId; + } + std::uint16_t Entity::GetNetworkObjectId() { ENTITY_ASSERT_VALID(); diff --git a/src/game/rdr/Entity.hpp b/src/game/rdr/Entity.hpp index ef66821f..988796ca 100644 --- a/src/game/rdr/Entity.hpp +++ b/src/game/rdr/Entity.hpp @@ -88,6 +88,7 @@ namespace YimMenu bool IsObject(); bool IsPlayer(); bool IsAnimal(); + bool IsMissionEntity(); // info int GetModel(); @@ -109,6 +110,7 @@ namespace YimMenu bool IsNetworked(); rage::netObject* GetNetworkObject(); bool HasControl(); + int GetOwner(); // index because we want to avoid cyclic imports std::uint16_t GetNetworkObjectId(); /// /// WARNING: This function is potentially unstable when used on vehicles and horses. Use RequestControl instead diff --git a/src/game/rdr/Ped.cpp b/src/game/rdr/Ped.cpp index d9e16eb9..7d35245e 100644 --- a/src/game/rdr/Ped.cpp +++ b/src/game/rdr/Ped.cpp @@ -41,6 +41,8 @@ namespace YimMenu return nullptr; } + ped.SetPosition(coords); + ped.SetVelocity({}); PED::_SET_RANDOM_OUTFIT_VARIATION(ped.GetHandle(), true); ENTITY::PLACE_ENTITY_ON_GROUND_PROPERLY(ped.GetHandle(), true); STREAMING::SET_MODEL_AS_NO_LONGER_NEEDED(model); diff --git a/src/game/rdr/Player.cpp b/src/game/rdr/Player.cpp index 262fecf9..a61c7d0c 100644 --- a/src/game/rdr/Player.cpp +++ b/src/game/rdr/Player.cpp @@ -44,7 +44,7 @@ namespace YimMenu { if (!IsValid()) { - return "Null Player!"; + return "Invalid"; } return m_Handle->GetName(); diff --git a/src/game/rdr/data/PedModels.hpp b/src/game/rdr/data/PedModels.hpp index 95f545e0..57662bb7 100644 --- a/src/game/rdr/data/PedModels.hpp +++ b/src/game/rdr/data/PedModels.hpp @@ -1,14 +1,1460 @@ #pragma once #include - +#include "util/Joaat.hpp" namespace YimMenu::Data { - struct PedModelInfo + const std::unordered_map g_PedModels = { - std::string model; - std::string gender; + {"A_C_Cougar_03"_J, "A_C_Cougar_03"}, + {"A_C_Horse_Gang_Lenny"_J, "A_C_Horse_Gang_Lenny"}, + {"A_C_Horse_Gang_Sadie_EndlessSummer"_J, "A_C_Horse_Gang_Sadie_EndlessSummer"}, + {"A_F_M_ARMCHOLERACORPSE_01"_J, "A_F_M_ARMCHOLERACORPSE_01"}, + {"A_F_M_ARMTOWNFOLK_01"_J, "A_F_M_ARMTOWNFOLK_01"}, + {"A_F_M_ArmTownfolk_02"_J, "A_F_M_ArmTownfolk_02"}, + {"A_F_M_AsbTownfolk_01"_J, "A_F_M_AsbTownfolk_01"}, + {"A_F_M_BiVFancyTravellers_01"_J, "A_F_M_BiVFancyTravellers_01"}, + {"A_F_M_BlWTownfolk_01"_J, "A_F_M_BlWTownfolk_01"}, + {"A_F_M_BlWTownfolk_02"_J, "A_F_M_BlWTownfolk_02"}, + {"A_F_M_BlWUpperClass_01"_J, "A_F_M_BlWUpperClass_01"}, + {"A_F_M_BtcHillbilly_01"_J, "A_F_M_BtcHillbilly_01"}, + {"A_F_M_BTCObeseWomen_01"_J, "A_F_M_BTCObeseWomen_01"}, + {"A_F_M_BynFancyTravellers_01"_J, "A_F_M_BynFancyTravellers_01"}, + {"A_F_M_FAMILYTRAVELERS_COOL_01"_J, "A_F_M_FAMILYTRAVELERS_COOL_01"}, + {"A_F_M_FAMILYTRAVELERS_WARM_01"_J, "A_F_M_FAMILYTRAVELERS_WARM_01"}, + {"A_F_M_GaMHighSociety_01"_J, "A_F_M_GaMHighSociety_01"}, + {"A_F_M_GriFancyTravellers_01"_J, "A_F_M_GriFancyTravellers_01"}, + {"A_F_M_GuaTownfolk_01"_J, "A_F_M_GuaTownfolk_01"}, + {"A_F_M_HtlFancyTravellers_01"_J, "A_F_M_HtlFancyTravellers_01"}, + {"A_F_M_LagTownfolk_01"_J, "A_F_M_LagTownfolk_01"}, + {"A_F_M_LowerSDTownfolk_01"_J, "A_F_M_LowerSDTownfolk_01"}, + {"A_F_M_LowerSDTownfolk_02"_J, "A_F_M_LowerSDTownfolk_02"}, + {"A_F_M_LowerSDTownfolk_03"_J, "A_F_M_LowerSDTownfolk_03"}, + {"A_F_M_LOWERTRAINPASSENGERS_01"_J, "A_F_M_LOWERTRAINPASSENGERS_01"}, + {"A_F_M_MiddleSDTownfolk_01"_J, "A_F_M_MiddleSDTownfolk_01"}, + {"A_F_M_MiddleSDTownfolk_02"_J, "A_F_M_MiddleSDTownfolk_02"}, + {"A_F_M_MiddleSDTownfolk_03"_J, "A_F_M_MiddleSDTownfolk_03"}, + {"A_F_M_MIDDLETRAINPASSENGERS_01"_J, "A_F_M_MIDDLETRAINPASSENGERS_01"}, + {"A_F_M_NbxSlums_01"_J, "A_F_M_NbxSlums_01"}, + {"A_F_M_NbxUpperClass_01"_J, "A_F_M_NbxUpperClass_01"}, + {"A_F_M_NbxWhore_01"_J, "A_F_M_NbxWhore_01"}, + {"A_F_M_RhdProstitute_01"_J, "A_F_M_RhdProstitute_01"}, + {"A_F_M_RhdTownfolk_01"_J, "A_F_M_RhdTownfolk_01"}, + {"A_F_M_RhdTownfolk_02"_J, "A_F_M_RhdTownfolk_02"}, + {"A_F_M_RhdUpperClass_01"_J, "A_F_M_RhdUpperClass_01"}, + {"A_F_M_RkrFancyTravellers_01"_J, "A_F_M_RkrFancyTravellers_01"}, + {"A_F_M_ROUGHTRAVELLERS_01"_J, "A_F_M_ROUGHTRAVELLERS_01"}, + {"A_F_M_SclFancyTravellers_01"_J, "A_F_M_SclFancyTravellers_01"}, + {"A_F_M_SDChinatown_01"_J, "A_F_M_SDChinatown_01"}, + {"A_F_M_SDFancyWhore_01"_J, "A_F_M_SDFancyWhore_01"}, + {"A_F_M_SDObeseWomen_01"_J, "A_F_M_SDObeseWomen_01"}, + {"A_F_M_SDSERVERSFORMAL_01"_J, "A_F_M_SDSERVERSFORMAL_01"}, + {"A_F_M_SDSlums_02"_J, "A_F_M_SDSlums_02"}, + {"A_F_M_SKPPRISONONLINE_01"_J, "A_F_M_SKPPRISONONLINE_01"}, + {"A_F_M_StrTownfolk_01"_J, "A_F_M_StrTownfolk_01"}, + {"A_F_M_TumTownfolk_01"_J, "A_F_M_TumTownfolk_01"}, + {"A_F_M_TumTownfolk_02"_J, "A_F_M_TumTownfolk_02"}, + {"A_F_M_UniCorpse_01"_J, "A_F_M_UniCorpse_01"}, + {"A_F_M_UPPERTRAINPASSENGERS_01"_J, "A_F_M_UPPERTRAINPASSENGERS_01"}, + {"A_F_M_ValProstitute_01"_J, "A_F_M_ValProstitute_01"}, + {"A_F_M_ValTownfolk_01"_J, "A_F_M_ValTownfolk_01"}, + {"A_F_M_VhtProstitute_01"_J, "A_F_M_VhtProstitute_01"}, + {"A_F_M_VhtTownfolk_01"_J, "A_F_M_VhtTownfolk_01"}, + {"A_F_M_WapTownfolk_01"_J, "A_F_M_WapTownfolk_01"}, + {"A_F_O_BlWUpperClass_01"_J, "A_F_O_BlWUpperClass_01"}, + {"A_F_O_BtcHillbilly_01"_J, "A_F_O_BtcHillbilly_01"}, + {"A_F_O_GuaTownfolk_01"_J, "A_F_O_GuaTownfolk_01"}, + {"A_F_O_LagTownfolk_01"_J, "A_F_O_LagTownfolk_01"}, + {"A_F_O_SDChinatown_01"_J, "A_F_O_SDChinatown_01"}, + {"A_F_O_SDUpperClass_01"_J, "A_F_O_SDUpperClass_01"}, + {"A_F_O_WAPTOWNFOLK_01"_J, "A_F_O_WAPTOWNFOLK_01"}, + {"A_M_M_ARMCHOLERACORPSE_01"_J, "A_M_M_ARMCHOLERACORPSE_01"}, + {"A_M_M_ARMDEPUTYRESIDENT_01"_J, "A_M_M_ARMDEPUTYRESIDENT_01"}, + {"A_M_M_ARMTOWNFOLK_01"_J, "A_M_M_ARMTOWNFOLK_01"}, + {"A_M_M_armTOWNFOLK_02"_J, "A_M_M_armTOWNFOLK_02"}, + {"A_M_M_ASBBOATCREW_01"_J, "A_M_M_ASBBOATCREW_01"}, + {"A_M_M_ASBDEPUTYRESIDENT_01"_J, "A_M_M_ASBDEPUTYRESIDENT_01"}, + {"A_M_M_AsbMiner_01"_J, "A_M_M_AsbMiner_01"}, + {"A_M_M_ASBMINER_02"_J, "A_M_M_ASBMINER_02"}, + {"A_M_M_ASBMINER_03"_J, "A_M_M_ASBMINER_03"}, + {"A_M_M_asbminer_04"_J, "A_M_M_asbminer_04"}, + {"A_M_M_AsbTownfolk_01"_J, "A_M_M_AsbTownfolk_01"}, + {"A_M_M_ASBTOWNFOLK_01_LABORER"_J, "A_M_M_ASBTOWNFOLK_01_LABORER"}, + {"A_M_M_BiVFancyDRIVERS_01"_J, "A_M_M_BiVFancyDRIVERS_01"}, + {"A_M_M_BiVFancyTravellers_01"_J, "A_M_M_BiVFancyTravellers_01"}, + {"A_M_M_BiVRoughTravellers_01"_J, "A_M_M_BiVRoughTravellers_01"}, + {"A_M_M_BiVWorker_01"_J, "A_M_M_BiVWorker_01"}, + {"A_M_M_BlWForeman_01"_J, "A_M_M_BlWForeman_01"}, + {"A_M_M_BlWLaborer_01"_J, "A_M_M_BlWLaborer_01"}, + {"A_M_M_BlWLaborer_02"_J, "A_M_M_BlWLaborer_02"}, + {"A_M_M_BLWObeseMen_01"_J, "A_M_M_BLWObeseMen_01"}, + {"A_M_M_BlWTownfolk_01"_J, "A_M_M_BlWTownfolk_01"}, + {"A_M_M_BlWUpperClass_01"_J, "A_M_M_BlWUpperClass_01"}, + {"A_M_M_BtcHillbilly_01"_J, "A_M_M_BtcHillbilly_01"}, + {"A_M_M_BTCObeseMen_01"_J, "A_M_M_BTCObeseMen_01"}, + {"A_M_M_BynFancyDRIVERS_01"_J, "A_M_M_BynFancyDRIVERS_01"}, + {"A_M_M_BynFancyTravellers_01"_J, "A_M_M_BynFancyTravellers_01"}, + {"A_M_M_BynRoughTravellers_01"_J, "A_M_M_BynRoughTravellers_01"}, + {"A_M_M_BynSurvivalist_01"_J, "A_M_M_BynSurvivalist_01"}, + {"A_M_M_CARDGAMEPLAYERS_01"_J, "A_M_M_CARDGAMEPLAYERS_01"}, + {"A_M_M_CHELONIAN_01"_J, "A_M_M_CHELONIAN_01"}, + {"A_M_M_DELIVERYTRAVELERS_COOL_01"_J, "A_M_M_DELIVERYTRAVELERS_COOL_01"}, + {"A_M_M_deliverytravelers_warm_01"_J, "A_M_M_deliverytravelers_warm_01"}, + {"A_M_M_DOMINOESPLAYERS_01"_J, "A_M_M_DOMINOESPLAYERS_01"}, + {"A_M_M_EmRFarmHand_01"_J, "A_M_M_EmRFarmHand_01"}, + {"A_M_M_FAMILYTRAVELERS_COOL_01"_J, "A_M_M_FAMILYTRAVELERS_COOL_01"}, + {"A_M_M_FAMILYTRAVELERS_WARM_01"_J, "A_M_M_FAMILYTRAVELERS_WARM_01"}, + {"A_M_M_FARMTRAVELERS_COOL_01"_J, "A_M_M_FARMTRAVELERS_COOL_01"}, + {"A_M_M_FARMTRAVELERS_WARM_01"_J, "A_M_M_FARMTRAVELERS_WARM_01"}, + {"A_M_M_FiveFingerFilletPlayers_01"_J, "A_M_M_FiveFingerFilletPlayers_01"}, + {"A_M_M_FOREMAN"_J, "A_M_M_FOREMAN"}, + {"A_M_M_GaMHighSociety_01"_J, "A_M_M_GaMHighSociety_01"}, + {"A_M_M_GRIFANCYDRIVERS_01"_J, "A_M_M_GRIFANCYDRIVERS_01"}, + {"A_M_M_GriFancyTravellers_01"_J, "A_M_M_GriFancyTravellers_01"}, + {"A_M_M_GriRoughTravellers_01"_J, "A_M_M_GriRoughTravellers_01"}, + {"A_M_M_GriSurvivalist_01"_J, "A_M_M_GriSurvivalist_01"}, + {"A_M_M_GuaTownfolk_01"_J, "A_M_M_GuaTownfolk_01"}, + {"A_M_M_HtlFancyDRIVERS_01"_J, "A_M_M_HtlFancyDRIVERS_01"}, + {"A_M_M_HtlFancyTravellers_01"_J, "A_M_M_HtlFancyTravellers_01"}, + {"A_M_M_HtlRoughTravellers_01"_J, "A_M_M_HtlRoughTravellers_01"}, + {"A_M_M_HtlSurvivalist_01"_J, "A_M_M_HtlSurvivalist_01"}, + {"A_M_M_huntertravelers_cool_01"_J, "A_M_M_huntertravelers_cool_01"}, + {"A_M_M_HUNTERTRAVELERS_WARM_01"_J, "A_M_M_HUNTERTRAVELERS_WARM_01"}, + {"A_M_M_JamesonGuard_01"_J, "A_M_M_JamesonGuard_01"}, + {"A_M_M_LagTownfolk_01"_J, "A_M_M_LagTownfolk_01"}, + {"A_M_M_LowerSDTownfolk_01"_J, "A_M_M_LowerSDTownfolk_01"}, + {"A_M_M_LowerSDTownfolk_02"_J, "A_M_M_LowerSDTownfolk_02"}, + {"A_M_M_LOWERTRAINPASSENGERS_01"_J, "A_M_M_LOWERTRAINPASSENGERS_01"}, + {"A_M_M_MiddleSDTownfolk_01"_J, "A_M_M_MiddleSDTownfolk_01"}, + {"A_M_M_MiddleSDTownfolk_02"_J, "A_M_M_MiddleSDTownfolk_02"}, + {"A_M_M_MiddleSDTownfolk_03"_J, "A_M_M_MiddleSDTownfolk_03"}, + {"A_M_M_MIDDLETRAINPASSENGERS_01"_J, "A_M_M_MIDDLETRAINPASSENGERS_01"}, + {"A_M_M_MOONSHINERS_01"_J, "A_M_M_MOONSHINERS_01"}, + {"A_M_M_NbxDockWorkers_01"_J, "A_M_M_NbxDockWorkers_01"}, + {"A_M_M_NbxLaborers_01"_J, "A_M_M_NbxLaborers_01"}, + {"A_M_M_NbxSlums_01"_J, "A_M_M_NbxSlums_01"}, + {"A_M_M_NbxUpperClass_01"_J, "A_M_M_NbxUpperClass_01"}, + {"A_M_M_NEAROUGHTRAVELLERS_01"_J, "A_M_M_NEAROUGHTRAVELLERS_01"}, + {"A_M_M_RANCHER_01"_J, "A_M_M_RANCHER_01"}, + {"A_M_M_RANCHERTRAVELERS_COOL_01"_J, "A_M_M_RANCHERTRAVELERS_COOL_01"}, + {"A_M_M_RANCHERTRAVELERS_WARM_01"_J, "A_M_M_RANCHERTRAVELERS_WARM_01"}, + {"A_M_M_RHDDEPUTYRESIDENT_01"_J, "A_M_M_RHDDEPUTYRESIDENT_01"}, + {"A_M_M_RhdForeman_01"_J, "A_M_M_RhdForeman_01"}, + {"A_M_M_RHDObeseMen_01"_J, "A_M_M_RHDObeseMen_01"}, + {"A_M_M_RhdTownfolk_01"_J, "A_M_M_RhdTownfolk_01"}, + {"A_M_M_RHDTOWNFOLK_01_LABORER"_J, "A_M_M_RHDTOWNFOLK_01_LABORER"}, + {"A_M_M_RhdTownfolk_02"_J, "A_M_M_RhdTownfolk_02"}, + {"A_M_M_RhdUpperClass_01"_J, "A_M_M_RhdUpperClass_01"}, + {"A_M_M_RkrFancyDRIVERS_01"_J, "A_M_M_RkrFancyDRIVERS_01"}, + {"A_M_M_RkrFancyTravellers_01"_J, "A_M_M_RkrFancyTravellers_01"}, + {"A_M_M_RkrRoughTravellers_01"_J, "A_M_M_RkrRoughTravellers_01"}, + {"A_M_M_RkrSurvivalist_01"_J, "A_M_M_RkrSurvivalist_01"}, + {"A_M_M_SclFancyDRIVERS_01"_J, "A_M_M_SclFancyDRIVERS_01"}, + {"A_M_M_SclFancyTravellers_01"_J, "A_M_M_SclFancyTravellers_01"}, + {"A_M_M_SclRoughTravellers_01"_J, "A_M_M_SclRoughTravellers_01"}, + {"A_M_M_SDChinatown_01"_J, "A_M_M_SDChinatown_01"}, + {"A_M_M_SDDockForeman_01"_J, "A_M_M_SDDockForeman_01"}, + {"A_M_M_SDDockWorkers_02"_J, "A_M_M_SDDockWorkers_02"}, + {"A_M_M_SDFANCYTRAVELLERS_01"_J, "A_M_M_SDFANCYTRAVELLERS_01"}, + {"A_M_M_SDLaborers_02"_J, "A_M_M_SDLaborers_02"}, + {"A_M_M_SDObesemen_01"_J, "A_M_M_SDObesemen_01"}, + {"A_M_M_SDROUGHTRAVELLERS_01"_J, "A_M_M_SDROUGHTRAVELLERS_01"}, + {"A_M_M_SDSERVERSFORMAL_01"_J, "A_M_M_SDSERVERSFORMAL_01"}, + {"A_M_M_SDSlums_02"_J, "A_M_M_SDSlums_02"}, + {"A_M_M_SkpPrisoner_01"_J, "A_M_M_SkpPrisoner_01"}, + {"A_M_M_SkpPrisonLine_01"_J, "A_M_M_SkpPrisonLine_01"}, + {"A_M_M_SmHThug_01"_J, "A_M_M_SmHThug_01"}, + {"A_M_M_STRDEPUTYRESIDENT_01"_J, "A_M_M_STRDEPUTYRESIDENT_01"}, + {"A_M_M_STRFANCYTOURIST_01"_J, "A_M_M_STRFANCYTOURIST_01"}, + {"A_M_M_StrLaborer_01"_J, "A_M_M_StrLaborer_01"}, + {"A_M_M_StrTownfolk_01"_J, "A_M_M_StrTownfolk_01"}, + {"A_M_M_TumTownfolk_01"_J, "A_M_M_TumTownfolk_01"}, + {"A_M_M_TumTownfolk_02"_J, "A_M_M_TumTownfolk_02"}, + {"A_M_M_UniBoatCrew_01"_J, "A_M_M_UniBoatCrew_01"}, + {"A_M_M_UniCoachGuards_01"_J, "A_M_M_UniCoachGuards_01"}, + {"A_M_M_UniCorpse_01"_J, "A_M_M_UniCorpse_01"}, + {"A_M_M_UniGunslinger_01"_J, "A_M_M_UniGunslinger_01"}, + {"A_M_M_UPPERTRAINPASSENGERS_01"_J, "A_M_M_UPPERTRAINPASSENGERS_01"}, + {"A_M_M_VALCRIMINALS_01"_J, "A_M_M_VALCRIMINALS_01"}, + {"A_M_M_VALDEPUTYRESIDENT_01"_J, "A_M_M_VALDEPUTYRESIDENT_01"}, + {"A_M_M_ValFarmer_01"_J, "A_M_M_ValFarmer_01"}, + {"A_M_M_ValLaborer_01"_J, "A_M_M_ValLaborer_01"}, + {"A_M_M_ValTownfolk_01"_J, "A_M_M_ValTownfolk_01"}, + {"A_M_M_ValTownfolk_02"_J, "A_M_M_ValTownfolk_02"}, + {"A_M_M_VHTBOATCREW_01"_J, "A_M_M_VHTBOATCREW_01"}, + {"A_M_M_VhtThug_01"_J, "A_M_M_VhtThug_01"}, + {"A_M_M_VhtTownfolk_01"_J, "A_M_M_VhtTownfolk_01"}, + {"A_M_M_WapWarriors_01"_J, "A_M_M_WapWarriors_01"}, + {"A_M_O_BlWUpperClass_01"_J, "A_M_O_BlWUpperClass_01"}, + {"A_M_O_BtcHillbilly_01"_J, "A_M_O_BtcHillbilly_01"}, + {"A_M_O_GuaTownfolk_01"_J, "A_M_O_GuaTownfolk_01"}, + {"A_M_O_LagTownfolk_01"_J, "A_M_O_LagTownfolk_01"}, + {"A_M_O_SDChinatown_01"_J, "A_M_O_SDChinatown_01"}, + {"A_M_O_SDUpperClass_01"_J, "A_M_O_SDUpperClass_01"}, + {"A_M_O_WAPTOWNFOLK_01"_J, "A_M_O_WAPTOWNFOLK_01"}, + {"A_M_Y_AsbMiner_01"_J, "A_M_Y_AsbMiner_01"}, + {"A_M_Y_AsbMiner_02"_J, "A_M_Y_AsbMiner_02"}, + {"A_M_Y_ASBMINER_03"_J, "A_M_Y_ASBMINER_03"}, + {"A_M_Y_ASBMINER_04"_J, "A_M_Y_ASBMINER_04"}, + {"A_M_Y_NbxStreetKids_01"_J, "A_M_Y_NbxStreetKids_01"}, + {"A_M_Y_NbxStreetKids_Slums_01"_J, "A_M_Y_NbxStreetKids_Slums_01"}, + {"A_M_Y_SDStreetKids_Slums_02"_J, "A_M_Y_SDStreetKids_Slums_02"}, + {"A_M_Y_UniCorpse_01"_J, "A_M_Y_UniCorpse_01"}, + {"CS_abe"_J, "CS_abe"}, + {"CS_AberdeenPigFarmer"_J, "CS_AberdeenPigFarmer"}, + {"CS_AberdeenSister"_J, "CS_AberdeenSister"}, + {"CS_abigailroberts"_J, "CS_abigailroberts"}, + {"CS_Acrobat"_J, "CS_Acrobat"}, + {"CS_adamgray"_J, "CS_adamgray"}, + {"CS_AgnesDowd"_J, "CS_AgnesDowd"}, + {"CS_albertcakeesquire"_J, "CS_albertcakeesquire"}, + {"CS_albertmason"_J, "CS_albertmason"}, + {"CS_AndersHelgerson"_J, "CS_AndersHelgerson"}, + {"CS_ANGEL"_J, "CS_ANGEL"}, + {"CS_angryhusband"_J, "CS_angryhusband"}, + {"CS_angusgeddes"_J, "CS_angusgeddes"}, + {"CS_ansel_atherton"_J, "CS_ansel_atherton"}, + {"CS_ANTONYFOREMEN"_J, "CS_ANTONYFOREMEN"}, + {"CS_archerfordham"_J, "CS_archerfordham"}, + {"CS_archibaldjameson"_J, "CS_archibaldjameson"}, + {"CS_ArchieDown"_J, "CS_ArchieDown"}, + {"CS_ARTAPPRAISER"_J, "CS_ARTAPPRAISER"}, + {"CS_ASBDEPUTY_01"_J, "CS_ASBDEPUTY_01"}, + {"CS_ASHTON"_J, "CS_ASHTON"}, + {"CS_balloonoperator"_J, "CS_balloonoperator"}, + {"CS_bandbassist"_J, "CS_bandbassist"}, + {"CS_banddrummer"_J, "CS_banddrummer"}, + {"CS_bandpianist"_J, "CS_bandpianist"}, + {"CS_bandsinger"_J, "CS_bandsinger"}, + {"CS_baptiste"_J, "CS_baptiste"}, + {"CS_bartholomewbraithwaite"_J, "CS_bartholomewbraithwaite"}, + {"CS_BATHINGLADIES_01"_J, "CS_BATHINGLADIES_01"}, + {"CS_BeatenUpCaptain"_J, "CS_BeatenUpCaptain"}, + {"CS_beaugray"_J, "CS_beaugray"}, + {"CS_billwilliamson"_J, "CS_billwilliamson"}, + {"CS_BivCoachDriver"_J, "CS_BivCoachDriver"}, + {"CS_BLWPHOTOGRAPHER"_J, "CS_BLWPHOTOGRAPHER"}, + {"CS_BLWWITNESS"_J, "CS_BLWWITNESS"}, + {"CS_braithwaitebutler"_J, "CS_braithwaitebutler"}, + {"CS_braithwaitemaid"_J, "CS_braithwaitemaid"}, + {"CS_braithwaiteservant"_J, "CS_braithwaiteservant"}, + {"CS_brendacrawley"_J, "CS_brendacrawley"}, + {"CS_bronte"_J, "CS_bronte"}, + {"CS_BrontesButler"_J, "CS_BrontesButler"}, + {"CS_brotherdorkins"_J, "CS_brotherdorkins"}, + {"CS_brynntildon"_J, "CS_brynntildon"}, + {"CS_Bubba"_J, "CS_Bubba"}, + {"CS_CABARETMC"_J, "CS_CABARETMC"}, + {"CS_CAJUN"_J, "CS_CAJUN"}, + {"CS_cancan_01"_J, "CS_cancan_01"}, + {"CS_cancan_02"_J, "CS_cancan_02"}, + {"CS_cancan_03"_J, "CS_cancan_03"}, + {"CS_cancan_04"_J, "CS_cancan_04"}, + {"CS_CanCanMan_01"_J, "CS_CanCanMan_01"}, + {"CS_captainmonroe"_J, "CS_captainmonroe"}, + {"CS_Cassidy"_J, "CS_Cassidy"}, + {"CS_catherinebraithwaite"_J, "CS_catherinebraithwaite"}, + {"CS_cattlerustler"_J, "CS_cattlerustler"}, + {"CS_CAVEHERMIT"_J, "CS_CAVEHERMIT"}, + {"CS_chainprisoner_01"_J, "CS_chainprisoner_01"}, + {"CS_chainprisoner_02"_J, "CS_chainprisoner_02"}, + {"CS_charlessmith"_J, "CS_charlessmith"}, + {"CS_ChelonianMaster"_J, "CS_ChelonianMaster"}, + {"CS_CIGCARDGUY"_J, "CS_CIGCARDGUY"}, + {"CS_clay"_J, "CS_clay"}, + {"CS_CLEET"_J, "CS_CLEET"}, + {"CS_clive"_J, "CS_clive"}, + {"CS_colfavours"_J, "CS_colfavours"}, + {"CS_ColmODriscoll"_J, "CS_ColmODriscoll"}, + {"CS_COOPER"_J, "CS_COOPER"}, + {"CS_CornwallTrainConductor"_J, "CS_CornwallTrainConductor"}, + {"CS_crackpotinventor"_J, "CS_crackpotinventor"}, + {"CS_crackpotRobot"_J, "CS_crackpotRobot"}, + {"CS_creepyoldlady"_J, "CS_creepyoldlady"}, + {"CS_creolecaptain"_J, "CS_creolecaptain"}, + {"CS_creoledoctor"_J, "CS_creoledoctor"}, + {"CS_creoleguy"_J, "CS_creoleguy"}, + {"CS_dalemaroney"_J, "CS_dalemaroney"}, + {"CS_DaveyCallender"_J, "CS_DaveyCallender"}, + {"CS_davidgeddes"_J, "CS_davidgeddes"}, + {"CS_DESMOND"_J, "CS_DESMOND"}, + {"CS_DIDSBURY"_J, "CS_DIDSBURY"}, + {"CS_DinoBonesLady"_J, "CS_DinoBonesLady"}, + {"CS_DisguisedDuster_01"_J, "CS_DisguisedDuster_01"}, + {"CS_DisguisedDuster_02"_J, "CS_DisguisedDuster_02"}, + {"CS_DisguisedDuster_03"_J, "CS_DisguisedDuster_03"}, + {"CS_DOROETHEAWICKLOW"_J, "CS_DOROETHEAWICKLOW"}, + {"CS_DrHiggins"_J, "CS_DrHiggins"}, + {"CS_DrMalcolmMacIntosh"_J, "CS_DrMalcolmMacIntosh"}, + {"CS_duncangeddes"_J, "CS_duncangeddes"}, + {"CS_DusterInformant_01"_J, "CS_DusterInformant_01"}, + {"CS_dutch"_J, "CS_dutch"}, + {"CS_EagleFlies"_J, "CS_EagleFlies"}, + {"CS_edgarross"_J, "CS_edgarross"}, + {"CS_EDITH_JOHN"_J, "CS_EDITH_JOHN"}, + {"CS_EdithDown"_J, "CS_EdithDown"}, + {"CS_edmundlowry"_J, "CS_edmundlowry"}, + {"CS_EscapeArtist"_J, "CS_EscapeArtist"}, + {"CS_EscapeArtistAssistant"_J, "CS_EscapeArtistAssistant"}, + {"CS_evelynmiller"_J, "CS_evelynmiller"}, + {"CS_EXCONFEDINFORMANT"_J, "CS_EXCONFEDINFORMANT"}, + {"CS_exconfedsleader_01"_J, "CS_exconfedsleader_01"}, + {"CS_EXOTICCOLLECTOR"_J, "CS_EXOTICCOLLECTOR"}, + {"CS_famousgunslinger_01"_J, "CS_famousgunslinger_01"}, + {"CS_famousgunslinger_02"_J, "CS_famousgunslinger_02"}, + {"CS_famousgunslinger_03"_J, "CS_famousgunslinger_03"}, + {"CS_famousgunslinger_04"_J, "CS_famousgunslinger_04"}, + {"CS_FamousGunslinger_05"_J, "CS_FamousGunslinger_05"}, + {"CS_FamousGunslinger_06"_J, "CS_FamousGunslinger_06"}, + {"CS_FEATHERSTONCHAMBERS"_J, "CS_FEATHERSTONCHAMBERS"}, + {"CS_FeatsOfStrength"_J, "CS_FeatsOfStrength"}, + {"CS_FIGHTREF"_J, "CS_FIGHTREF"}, + {"CS_Fire_Breather"_J, "CS_Fire_Breather"}, + {"CS_FISHCOLLECTOR"_J, "CS_FISHCOLLECTOR"}, + {"CS_forgivenhusband_01"_J, "CS_forgivenhusband_01"}, + {"CS_forgivenwife_01"_J, "CS_forgivenwife_01"}, + {"CS_FORMYARTBIGWOMAN"_J, "CS_FORMYARTBIGWOMAN"}, + {"CS_FRANCIS_SINCLAIR"_J, "CS_FRANCIS_SINCLAIR"}, + {"CS_frenchartist"_J, "CS_frenchartist"}, + {"CS_FRENCHMAN_01"_J, "CS_FRENCHMAN_01"}, + {"CS_fussar"_J, "CS_fussar"}, + {"CS_garethbraithwaite"_J, "CS_garethbraithwaite"}, + {"CS_GAVIN"_J, "CS_GAVIN"}, + {"CS_genstoryfemale"_J, "CS_genstoryfemale"}, + {"CS_genstorymale"_J, "CS_genstorymale"}, + {"CS_geraldbraithwaite"_J, "CS_geraldbraithwaite"}, + {"CS_GermanDaughter"_J, "CS_GermanDaughter"}, + {"CS_GermanFather"_J, "CS_GermanFather"}, + {"CS_GermanMother"_J, "CS_GermanMother"}, + {"CS_GermanSon"_J, "CS_GermanSon"}, + {"CS_GILBERTKNIGHTLY"_J, "CS_GILBERTKNIGHTLY"}, + {"CS_GLORIA"_J, "CS_GLORIA"}, + {"CS_GrizzledJon"_J, "CS_GrizzledJon"}, + {"CS_GuidoMartelli"_J, "CS_GuidoMartelli"}, + {"CS_HAMISH"_J, "CS_HAMISH"}, + {"CS_hectorfellowes"_J, "CS_hectorfellowes"}, + {"CS_henrilemiux"_J, "CS_henrilemiux"}, + {"CS_HERBALIST"_J, "CS_HERBALIST"}, + {"CS_hercule"_J, "CS_hercule"}, + {"CS_HestonJameson"_J, "CS_HestonJameson"}, + {"CS_hobartcrawley"_J, "CS_hobartcrawley"}, + {"CS_hoseamatthews"_J, "CS_hoseamatthews"}, + {"CS_IANGRAY"_J, "CS_IANGRAY"}, + {"CS_jackmarston"_J, "CS_jackmarston"}, + {"CS_jackmarston_teen"_J, "CS_jackmarston_teen"}, + {"CS_JAMIE"_J, "CS_JAMIE"}, + {"CS_JANSON"_J, "CS_JANSON"}, + {"CS_javierescuella"_J, "CS_javierescuella"}, + {"CS_Jeb"_J, "CS_Jeb"}, + {"CS_jimcalloway"_J, "CS_jimcalloway"}, + {"CS_jockgray"_J, "CS_jockgray"}, + {"CS_JOE"_J, "CS_JOE"}, + {"CS_JoeButler"_J, "CS_JoeButler"}, + {"CS_johnmarston"_J, "CS_johnmarston"}, + {"CS_JOHNTHEBAPTISINGMADMAN"_J, "CS_JOHNTHEBAPTISINGMADMAN"}, + {"CS_JohnWeathers"_J, "CS_JohnWeathers"}, + {"CS_josiahtrelawny"_J, "CS_josiahtrelawny"}, + {"CS_Jules"_J, "CS_Jules"}, + {"CS_karen"_J, "CS_karen"}, + {"CS_KarensJohn_01"_J, "CS_KarensJohn_01"}, + {"CS_kieran"_J, "CS_kieran"}, + {"CS_LARAMIE"_J, "CS_LARAMIE"}, + {"CS_leighgray"_J, "CS_leighgray"}, + {"CS_LemiuxAssistant"_J, "CS_LemiuxAssistant"}, + {"CS_lenny"_J, "CS_lenny"}, + {"CS_leon"_J, "CS_leon"}, + {"CS_leostrauss"_J, "CS_leostrauss"}, + {"CS_LeviSimon"_J, "CS_LeviSimon"}, + {"CS_leviticuscornwall"_J, "CS_leviticuscornwall"}, + {"CS_LillianPowell"_J, "CS_LillianPowell"}, + {"CS_lillymillet"_J, "CS_lillymillet"}, + {"CS_LondonderrySon"_J, "CS_LondonderrySon"}, + {"CS_LUCANAPOLI"_J, "CS_LUCANAPOLI"}, + {"CS_Magnifico"_J, "CS_Magnifico"}, + {"CS_MAMAWATSON"_J, "CS_MAMAWATSON"}, + {"CS_MARSHALL_THURWELL"_J, "CS_MARSHALL_THURWELL"}, + {"CS_marybeth"_J, "CS_marybeth"}, + {"CS_marylinton"_J, "CS_marylinton"}, + {"CS_MEDITATINGMONK"_J, "CS_MEDITATINGMONK"}, + {"CS_Meredith"_J, "CS_Meredith"}, + {"CS_MeredithsMother"_J, "CS_MeredithsMother"}, + {"CS_MicahBell"_J, "CS_MicahBell"}, + {"CS_MicahsNemesis"_J, "CS_MicahsNemesis"}, + {"CS_Mickey"_J, "CS_Mickey"}, + {"CS_miltonandrews"_J, "CS_miltonandrews"}, + {"CS_missMarjorie"_J, "CS_missMarjorie"}, + {"CS_MIXEDRACEKID"_J, "CS_MIXEDRACEKID"}, + {"CS_MOIRA"_J, "CS_MOIRA"}, + {"CS_mollyoshea"_J, "CS_mollyoshea"}, + {"CS_MP_AGENT_HIXON"_J, "CS_MP_AGENT_HIXON"}, + {"CS_MP_ALFREDO_MONTEZ"_J, "CS_MP_ALFREDO_MONTEZ"}, + {"CS_MP_AMOS_LANSING"_J, "CS_MP_AMOS_LANSING"}, + {"cs_mp_bonnie"_J, "cs_mp_bonnie"}, + {"CS_MP_BOUNTYHUNTER"_J, "CS_MP_BOUNTYHUNTER"}, + {"CS_MP_CLIFF"_J, "CS_MP_CLIFF"}, + {"CS_MP_CRIPPS"_J, "CS_MP_CRIPPS"}, + {"CS_MP_DANNYLEE"_J, "CS_MP_DANNYLEE"}, + {"CS_MP_GRACE_LANCING"_J, "CS_MP_GRACE_LANCING"}, + {"CS_MP_GUS_MACMILLAN"_J, "CS_MP_GUS_MACMILLAN"}, + {"CS_MP_HANS"_J, "CS_MP_HANS"}, + {"CS_MP_HARRIET_DAVENPORT"_J, "CS_MP_HARRIET_DAVENPORT"}, + {"CS_MP_HORLEY"_J, "CS_MP_HORLEY"}, + {"CS_MP_JEREMIAH_SHAW"_J, "CS_MP_JEREMIAH_SHAW"}, + {"CS_MP_JESSICA"_J, "CS_MP_JESSICA"}, + {"CS_MP_JORGE_MONTEZ"_J, "CS_MP_JORGE_MONTEZ"}, + {"CS_MP_LANGSTON"_J, "CS_MP_LANGSTON"}, + {"CS_MP_LEE"_J, "CS_MP_LEE"}, + {"CS_MP_LEM"_J, "CS_MP_LEM"}, + {"CS_MP_LEM"_J, "CS_MP_LEM"}, + {"CS_MP_MABEL"_J, "CS_MP_MABEL"}, + {"CS_MP_MAGGIE"_J, "CS_MP_MAGGIE"}, + {"CS_MP_MARSHALL_DAVIES"_J, "CS_MP_MARSHALL_DAVIES"}, + {"CS_MP_MOONSHINER"_J, "CS_MP_MOONSHINER"}, + {"CS_MP_MRADLER"_J, "CS_MP_MRADLER"}, + {"CS_MP_OLDMAN_JONES"_J, "CS_MP_OLDMAN_JONES"}, + {"CS_MP_REVENGE_MARSHALL"_J, "CS_MP_REVENGE_MARSHALL"}, + {"CS_MP_SAMSON_FINCH"_J, "CS_MP_SAMSON_FINCH"}, + {"CS_MP_SETH"_J, "CS_MP_SETH"}, + {"CS_MP_SHAKY"_J, "CS_MP_SHAKY"}, + {"CS_MP_SHERIFFFREEMAN"_J, "CS_MP_SHERIFFFREEMAN"}, + {"CS_MP_TEDDYBROWN"_J, "CS_MP_TEDDYBROWN"}, + {"CS_MP_TERRANCE"_J, "CS_MP_TERRANCE"}, + {"CS_MP_THE_BOY"_J, "CS_MP_THE_BOY"}, + {"CS_MP_TRAVELLINGSALESWOMAN"_J, "CS_MP_TRAVELLINGSALESWOMAN"}, + {"CS_MP_WENT"_J, "CS_MP_WENT"}, + {"CS_mradler"_J, "CS_mradler"}, + {"CS_MRDEVON"_J, "CS_MRDEVON"}, + {"CS_MRLINTON"_J, "CS_MRLINTON"}, + {"CS_mrpearson"_J, "CS_mrpearson"}, + {"CS_Mrs_Calhoun"_J, "CS_Mrs_Calhoun"}, + {"CS_MRS_SINCLAIR"_J, "CS_MRS_SINCLAIR"}, + {"CS_mrsadler"_J, "CS_mrsadler"}, + {"CS_MrsFellows"_J, "CS_MrsFellows"}, + {"CS_mrsgeddes"_J, "CS_mrsgeddes"}, + {"CS_MrsLondonderry"_J, "CS_MrsLondonderry"}, + {"CS_MrsWeathers"_J, "CS_MrsWeathers"}, + {"CS_MRSWEATHERS"_J, "CS_MRSWEATHERS"}, + {"CS_MRWAYNE"_J, "CS_MRWAYNE"}, + {"CS_mud2bigguy"_J, "CS_mud2bigguy"}, + {"CS_MysteriousStranger"_J, "CS_MysteriousStranger"}, + {"CS_NbxDrunk"_J, "CS_NbxDrunk"}, + {"CS_NbxExecuted"_J, "CS_NbxExecuted"}, + {"CS_NbxPoliceChiefFormal"_J, "CS_NbxPoliceChiefFormal"}, + {"CS_nbxreceptionist_01"_J, "CS_nbxreceptionist_01"}, + {"CS_NIAL_WHELAN"_J, "CS_NIAL_WHELAN"}, + {"CS_NicholasTimmins"_J, "CS_NicholasTimmins"}, + {"CS_NILS"_J, "CS_NILS"}, + {"CS_NorrisForsythe"_J, "CS_NorrisForsythe"}, + {"CS_obediahhinton"_J, "CS_obediahhinton"}, + {"CS_oddfellowspinhead"_J, "CS_oddfellowspinhead"}, + {"CS_ODProstitute"_J, "CS_ODProstitute"}, + {"CS_OPERASINGER"_J, "CS_OPERASINGER"}, + {"CS_PAYTAH"_J, "CS_PAYTAH"}, + {"CS_penelopebraithwaite"_J, "CS_penelopebraithwaite"}, + {"CS_PinkertonGoon"_J, "CS_PinkertonGoon"}, + {"CS_PoisonWellShaman"_J, "CS_PoisonWellShaman"}, + {"CS_POORJOE"_J, "CS_POORJOE"}, + {"CS_PRIEST_WEDDING"_J, "CS_PRIEST_WEDDING"}, + {"CS_PrincessIsabeau"_J, "CS_PrincessIsabeau"}, + {"CS_professorbell"_J, "CS_professorbell"}, + {"CS_rainsfall"_J, "CS_rainsfall"}, + {"CS_RAMON_CORTEZ"_J, "CS_RAMON_CORTEZ"}, + {"CS_ReverendFortheringham"_J, "CS_ReverendFortheringham"}, + {"CS_revswanson"_J, "CS_revswanson"}, + {"CS_rhodeputy_01"_J, "CS_rhodeputy_01"}, + {"CS_RhoDeputy_02"_J, "CS_RhoDeputy_02"}, + {"CS_RhodesAssistant"_J, "CS_RhodesAssistant"}, + {"CS_rhodeskidnapvictim"_J, "CS_rhodeskidnapvictim"}, + {"CS_rhodessaloonbouncer"_J, "CS_rhodessaloonbouncer"}, + {"CS_ringmaster"_J, "CS_ringmaster"}, + {"CS_ROCKYSEVEN_WIDOW"_J, "CS_ROCKYSEVEN_WIDOW"}, + {"CS_samaritan"_J, "CS_samaritan"}, + {"CS_SCOTTGRAY"_J, "CS_SCOTTGRAY"}, + {"CS_SD_STREETKID_01"_J, "CS_SD_STREETKID_01"}, + {"CS_SD_STREETKID_01A"_J, "CS_SD_STREETKID_01A"}, + {"CS_SD_STREETKID_01B"_J, "CS_SD_STREETKID_01B"}, + {"CS_SD_STREETKID_02"_J, "CS_SD_STREETKID_02"}, + {"CS_SDDoctor_01"_J, "CS_SDDoctor_01"}, + {"CS_SDPRIEST"_J, "CS_SDPRIEST"}, + {"CS_SDSALOONDRUNK_01"_J, "CS_SDSALOONDRUNK_01"}, + {"CS_SDStreetKidThief"_J, "CS_SDStreetKidThief"}, + {"CS_SDStreetKidThief"_J, "CS_SDStreetKidThief"}, + {"CS_sean"_J, "CS_sean"}, + {"CS_SHERIFFFREEMAN"_J, "CS_SHERIFFFREEMAN"}, + {"CS_SheriffOwens"_J, "CS_SheriffOwens"}, + {"CS_sistercalderon"_J, "CS_sistercalderon"}, + {"CS_slavecatcher"_J, "CS_slavecatcher"}, + {"CS_SOOTHSAYER"_J, "CS_SOOTHSAYER"}, + {"CS_strawberryoutlaw_01"_J, "CS_strawberryoutlaw_01"}, + {"CS_strawberryoutlaw_02"_J, "CS_strawberryoutlaw_02"}, + {"CS_strdeputy_01"_J, "CS_strdeputy_01"}, + {"CS_strdeputy_02"_J, "CS_strdeputy_02"}, + {"CS_strsheriff_01"_J, "CS_strsheriff_01"}, + {"CS_SUNWORSHIPPER"_J, "CS_SUNWORSHIPPER"}, + {"CS_susangrimshaw"_J, "CS_susangrimshaw"}, + {"CS_SwampFreak"_J, "CS_SwampFreak"}, + {"CS_SWAMPWEIRDOSONNY"_J, "CS_SWAMPWEIRDOSONNY"}, + {"CS_SwordDancer"_J, "CS_SwordDancer"}, + {"CS_tavishgray"_J, "CS_tavishgray"}, + {"CS_TAXIDERMIST"_J, "CS_TAXIDERMIST"}, + {"CS_theodorelevin"_J, "CS_theodorelevin"}, + {"CS_thomasdown"_J, "CS_thomasdown"}, + {"CS_TigerHandler"_J, "CS_TigerHandler"}, + {"CS_tilly"_J, "CS_tilly"}, + {"CS_TimothyDonahue"_J, "CS_TimothyDonahue"}, + {"CS_TINYHERMIT"_J, "CS_TINYHERMIT"}, + {"CS_tomdickens"_J, "CS_tomdickens"}, + {"CS_TownCrier"_J, "CS_TownCrier"}, + {"CS_TREASUREHUNTER"_J, "CS_TREASUREHUNTER"}, + {"CS_twinbrother_01"_J, "CS_twinbrother_01"}, + {"CS_twinbrother_02"_J, "CS_twinbrother_02"}, + {"CS_twingroupie_01"_J, "CS_twingroupie_01"}, + {"CS_twingroupie_02"_J, "CS_twingroupie_02"}, + {"CS_uncle"_J, "CS_uncle"}, + {"CS_UNIDUSTERJAIL_01"_J, "CS_UNIDUSTERJAIL_01"}, + {"CS_valauctionboss_01"_J, "CS_valauctionboss_01"}, + {"CS_VALDEPUTY_01"_J, "CS_VALDEPUTY_01"}, + {"CS_ValPrayingMan"_J, "CS_ValPrayingMan"}, + {"CS_ValProstitute_01"_J, "CS_ValProstitute_01"}, + {"CS_ValProstitute_02"_J, "CS_ValProstitute_02"}, + {"CS_VALSHERIFF"_J, "CS_VALSHERIFF"}, + {"CS_Vampire"_J, "CS_Vampire"}, + {"CS_VHT_BATHGIRL"_J, "CS_VHT_BATHGIRL"}, + {"CS_WapitiBoy"_J, "CS_WapitiBoy"}, + {"CS_warvet"_J, "CS_warvet"}, + {"CS_WATSON_01"_J, "CS_WATSON_01"}, + {"CS_WATSON_02"_J, "CS_WATSON_02"}, + {"CS_WATSON_03"_J, "CS_WATSON_03"}, + {"CS_WELSHFIGHTER"_J, "CS_WELSHFIGHTER"}, + {"CS_WintonHolmes"_J, "CS_WintonHolmes"}, + {"CS_Wrobel"_J, "CS_Wrobel"}, + {"G_F_M_UNIDUSTER_01"_J, "G_F_M_UNIDUSTER_01"}, + {"G_M_M_BountyHunters_01"_J, "G_M_M_BountyHunters_01"}, + {"G_M_M_UniAfricanAmericanGang_01"_J, "G_M_M_UniAfricanAmericanGang_01"}, + {"G_M_M_UniBanditos_01"_J, "G_M_M_UniBanditos_01"}, + {"G_M_M_UniBraithwaites_01"_J, "G_M_M_UniBraithwaites_01"}, + {"G_M_M_UniBronteGoons_01"_J, "G_M_M_UniBronteGoons_01"}, + {"G_M_M_UniCornwallGoons_01"_J, "G_M_M_UniCornwallGoons_01"}, + {"G_M_M_UniCriminals_01"_J, "G_M_M_UniCriminals_01"}, + {"G_M_M_UniCriminals_02"_J, "G_M_M_UniCriminals_02"}, + {"G_M_M_UniDuster_01"_J, "G_M_M_UniDuster_01"}, + {"G_M_M_UniDuster_02"_J, "G_M_M_UniDuster_02"}, + {"G_M_M_UniDuster_03"_J, "G_M_M_UniDuster_03"}, + {"G_M_M_UniDuster_04"_J, "G_M_M_UniDuster_04"}, + {"G_M_M_UNIDUSTER_05"_J, "G_M_M_UNIDUSTER_05"}, + {"G_M_M_UniGrays_01"_J, "G_M_M_UniGrays_01"}, + {"G_M_M_UniGrays_02"_J, "G_M_M_UniGrays_02"}, + {"G_M_M_UniInbred_01"_J, "G_M_M_UniInbred_01"}, + {"G_M_M_UNILANGSTONBOYS_01"_J, "G_M_M_UNILANGSTONBOYS_01"}, + {"G_M_M_UNIMICAHGOONS_01"_J, "G_M_M_UNIMICAHGOONS_01"}, + {"G_M_M_UniMountainMen_01"_J, "G_M_M_UniMountainMen_01"}, + {"G_M_M_UniRanchers_01"_J, "G_M_M_UniRanchers_01"}, + {"G_M_M_UNISWAMP_01"_J, "G_M_M_UNISWAMP_01"}, + {"G_M_O_UniExConfeds_01"_J, "G_M_O_UniExConfeds_01"}, + {"G_M_Y_UniExConfeds_01"_J, "G_M_Y_UniExConfeds_01"}, + {"G_M_Y_UNIEXCONFEDS_02"_J, "G_M_Y_UNIEXCONFEDS_02"}, + {"Immortality"_J, "Immortality"}, + {"MBH_RHODESRANCHER_FEMALES_01"_J, "MBH_RHODESRANCHER_FEMALES_01"}, + {"MBH_RHODESRANCHER_TEENS_01"_J, "MBH_RHODESRANCHER_TEENS_01"}, + {"MBH_SKINNERSEARCH_MALES_01"_J, "MBH_SKINNERSEARCH_MALES_01"}, + {"MCCLELLAN_SADDLE_01"_J, "MCCLELLAN_SADDLE_01"}, + {"MES_ABIGAIL2_MALES_01"_J, "MES_ABIGAIL2_MALES_01"}, + {"MES_FINALE2_FEMALES_01"_J, "MES_FINALE2_FEMALES_01"}, + {"MES_FINALE2_MALES_01"_J, "MES_FINALE2_MALES_01"}, + {"MES_FINALE3_MALES_01"_J, "MES_FINALE3_MALES_01"}, + {"MES_MARSTON1_MALES_01"_J, "MES_MARSTON1_MALES_01"}, + {"MES_MARSTON2_MALES_01"_J, "MES_MARSTON2_MALES_01"}, + {"MES_MARSTON5_2_MALES_01"_J, "MES_MARSTON5_2_MALES_01"}, + {"MES_MARSTON6_FEMALES_01"_J, "MES_MARSTON6_FEMALES_01"}, + {"MES_MARSTON6_MALES_01"_J, "MES_MARSTON6_MALES_01"}, + {"MES_MARSTON6_TEENS_01"_J, "MES_MARSTON6_TEENS_01"}, + {"MES_SADIE4_MALES_01"_J, "MES_SADIE4_MALES_01"}, + {"MES_SADIE5_MALES_01"_J, "MES_SADIE5_MALES_01"}, + {"MOTHERHUBBARD_SADDLE_01"_J, "MOTHERHUBBARD_SADDLE_01"}, + {"MP_A_F_M_CARDGAMEPLAYERS_01"_J, "MP_A_F_M_CARDGAMEPLAYERS_01"}, + {"MP_A_F_M_SALOONBAND_FEMALES_01"_J, "MP_A_F_M_SALOONBAND_FEMALES_01"}, + {"MP_A_M_M_MOONSHINEMAKERS_01"_J, "MP_A_M_M_MOONSHINEMAKERS_01"}, + {"MP_ASN_BENEDICTPOINT_FEMALES_01"_J, "MP_ASN_BENEDICTPOINT_FEMALES_01"}, + {"MP_ASN_BENEDICTPOINT_MALES_01"_J, "MP_ASN_BENEDICTPOINT_MALES_01"}, + {"MP_ASN_BLACKWATER_MALES_01"_J, "MP_ASN_BLACKWATER_MALES_01"}, + {"MP_ASN_BRAITHWAITEMANOR_MALES_01"_J, "MP_ASN_BRAITHWAITEMANOR_MALES_01"}, + {"MP_ASN_BRAITHWAITEMANOR_MALES_02"_J, "MP_ASN_BRAITHWAITEMANOR_MALES_02"}, + {"MP_ASN_BRAITHWAITEMANOR_MALES_03"_J, "MP_ASN_BRAITHWAITEMANOR_MALES_03"}, + {"MP_ASN_CIVILWARFORT_MALES_01"_J, "MP_ASN_CIVILWARFORT_MALES_01"}, + {"MP_ASN_GAPTOOTHBREACH_MALES_01"_J, "MP_ASN_GAPTOOTHBREACH_MALES_01"}, + {"MP_ASN_PikesBasin_Males_01"_J, "MP_ASN_PikesBasin_Males_01"}, + {"MP_ASN_SDPOLICESTATION_MALES_01"_J, "MP_ASN_SDPOLICESTATION_MALES_01"}, + {"MP_ASN_SDWEDDING_FEMALES_01"_J, "MP_ASN_SDWEDDING_FEMALES_01"}, + {"MP_ASN_SHADYBELLE_FEMALES_01"_J, "MP_ASN_SHADYBELLE_FEMALES_01"}, + {"MP_ASN_STILLWATER_MALES_01"_J, "MP_ASN_STILLWATER_MALES_01"}, + {"MP_ASNTRK_TALLTREES_MALES_01"_J, "MP_ASNTRK_TALLTREES_MALES_01"}, + {"MP_CAMPDEF_BLUEWATER_MALES_01"_J, "MP_CAMPDEF_BLUEWATER_MALES_01"}, + {"MP_CAMPDEF_CHOLLASPRINGS_MALES_01"_J, "MP_CAMPDEF_CHOLLASPRINGS_MALES_01"}, + {"MP_CAMPDEF_EASTNEWHANOVER_FEMALES_01"_J, "MP_CAMPDEF_EASTNEWHANOVER_FEMALES_01"}, + {"mp_female"_J, "mp_female"}, + {"MP_FM_BOUNTYTARGET_FEMALES_DLC008_01"_J, "MP_FM_BOUNTYTARGET_FEMALES_DLC008_01"}, + {"MP_FM_BOUNTYTARGET_MALES_DLC008_01"_J, "MP_FM_BOUNTYTARGET_MALES_DLC008_01"}, + {"MP_G_F_M_ARMYOFFEAR_01"_J, "MP_G_F_M_ARMYOFFEAR_01"}, + {"MP_G_F_M_CULTGUARDS_01"_J, "MP_G_F_M_CULTGUARDS_01"}, + {"MP_G_F_M_CULTMEMBERS_01"_J, "MP_G_F_M_CULTMEMBERS_01"}, + {"MP_G_M_M_ARMYOFFEAR_01"_J, "MP_G_M_M_ARMYOFFEAR_01"}, + {"MP_G_M_M_ArmyOfFear_01"_J, "MP_G_M_M_ArmyOfFear_01"}, + {"MP_G_M_M_CULTGUARDS_01"_J, "MP_G_M_M_CULTGUARDS_01"}, + {"MP_G_M_M_CULTMEMBERS_01"_J, "MP_G_M_M_CULTMEMBERS_01"}, + {"MP_G_M_M_UNICRIMINALS_03"_J, "MP_G_M_M_UNICRIMINALS_03"}, + {"MP_G_M_M_UNICRIMINALS_04"_J, "MP_G_M_M_UNICRIMINALS_04"}, + {"MP_G_M_M_UNICRIMINALS_05"_J, "MP_G_M_M_UNICRIMINALS_05"}, + {"MP_G_M_M_UNICRIMINALS_06"_J, "MP_G_M_M_UNICRIMINALS_06"}, + {"MP_G_M_M_UNICRIMINALS_07"_J, "MP_G_M_M_UNICRIMINALS_07"}, + {"MP_G_M_M_UNICRIMINALS_08"_J, "MP_G_M_M_UNICRIMINALS_08"}, + {"MP_G_M_M_UNICRIMINALS_09"_J, "MP_G_M_M_UNICRIMINALS_09"}, + {"mp_male"_J, "mp_male"}, + {"MP_PREDATOR"_J, "MP_PREDATOR"}, + {"MP_S_M_M_REVENUEAGENTS_01"_J, "MP_S_M_M_REVENUEAGENTS_01"}, + {"MP_U_F_M_CULTPRIEST_01"_J, "MP_U_F_M_CULTPRIEST_01"}, + {"MP_U_F_M_LEGENDARYBOUNTY_03"_J, "MP_U_F_M_LEGENDARYBOUNTY_03"}, + {"MP_U_M_M_ANIMALPOACHER_01"_J, "MP_U_M_M_ANIMALPOACHER_01"}, + {"MP_U_M_M_ANIMALPOACHER_02"_J, "MP_U_M_M_ANIMALPOACHER_02"}, + {"MP_U_M_M_ANIMALPOACHER_06"_J, "MP_U_M_M_ANIMALPOACHER_06"}, + {"MP_U_M_M_CULTPRIEST_01"_J, "MP_U_M_M_CULTPRIEST_01"}, + {"MP_U_M_M_LBT_Owlhootvictim_01"_J, "MP_U_M_M_LBT_Owlhootvictim_01"}, + {"MP_U_M_M_LBT_Philipsvictim_01"_J, "MP_U_M_M_LBT_Philipsvictim_01"}, + {"MP_U_M_M_LEGENDARYBOUNTY_08"_J, "MP_U_M_M_LEGENDARYBOUNTY_08"}, + {"MP_U_M_M_SALOONBRAWLERS_01"_J, "MP_U_M_M_SALOONBRAWLERS_01"}, + {"MP_U_M_M_SALOONBRAWLERS_02"_J, "MP_U_M_M_SALOONBRAWLERS_02"}, + {"MP_U_M_M_SALOONBRAWLERS_03"_J, "MP_U_M_M_SALOONBRAWLERS_03"}, + {"MP_U_M_M_SALOONBRAWLERS_04"_J, "MP_U_M_M_SALOONBRAWLERS_04"}, + {"MP_U_M_M_SALOONBRAWLERS_05"_J, "MP_U_M_M_SALOONBRAWLERS_05"}, + {"MP_U_M_M_SALOONBRAWLERS_06"_J, "MP_U_M_M_SALOONBRAWLERS_06"}, + {"MP_U_M_M_SALOONBRAWLERS_07"_J, "MP_U_M_M_SALOONBRAWLERS_07"}, + {"MP_U_M_M_SALOONBRAWLERS_08"_J, "MP_U_M_M_SALOONBRAWLERS_08"}, + {"MP_U_M_M_SALOONBRAWLERS_09"_J, "MP_U_M_M_SALOONBRAWLERS_09"}, + {"MP_U_M_M_SALOONBRAWLERS_10"_J, "MP_U_M_M_SALOONBRAWLERS_10"}, + {"MP_U_M_M_SALOONBRAWLERS_11"_J, "MP_U_M_M_SALOONBRAWLERS_11"}, + {"MP_U_M_M_SALOONBRAWLERS_12"_J, "MP_U_M_M_SALOONBRAWLERS_12"}, + {"MP_U_M_M_SALOONBRAWLERS_13"_J, "MP_U_M_M_SALOONBRAWLERS_13"}, + {"MP_U_M_M_SALOONBRAWLERS_14"_J, "MP_U_M_M_SALOONBRAWLERS_14"}, + {"MSP_BOUNTYHUNTER1_FEMALES_01"_J, "MSP_BOUNTYHUNTER1_FEMALES_01"}, + {"MSP_BRAITHWAITES1_MALES_01"_J, "MSP_BRAITHWAITES1_MALES_01"}, + {"MSP_FEUD1_MALES_01"_J, "MSP_FEUD1_MALES_01"}, + {"MSP_FUSSAR2_MALES_01"_J, "MSP_FUSSAR2_MALES_01"}, + {"MSP_GANG2_MALES_01"_J, "MSP_GANG2_MALES_01"}, + {"MSP_GANG3_MALES_01"_J, "MSP_GANG3_MALES_01"}, + {"MSP_GRAYS1_MALES_01"_J, "MSP_GRAYS1_MALES_01"}, + {"MSP_GRAYS2_MALES_01"_J, "MSP_GRAYS2_MALES_01"}, + {"MSP_GUARMA2_MALES_01"_J, "MSP_GUARMA2_MALES_01"}, + {"MSP_INDUSTRY1_FEMALES_01"_J, "MSP_INDUSTRY1_FEMALES_01"}, + {"MSP_INDUSTRY1_MALES_01"_J, "MSP_INDUSTRY1_MALES_01"}, + {"MSP_INDUSTRY3_FEMALES_01"_J, "MSP_INDUSTRY3_FEMALES_01"}, + {"MSP_INDUSTRY3_MALES_01"_J, "MSP_INDUSTRY3_MALES_01"}, + {"MSP_MARY1_FEMALES_01"_J, "MSP_MARY1_FEMALES_01"}, + {"MSP_MARY1_MALES_01"_J, "MSP_MARY1_MALES_01"}, + {"MSP_MARY3_MALES_01"_J, "MSP_MARY3_MALES_01"}, + {"MSP_MOB0_MALES_01"_J, "MSP_MOB0_MALES_01"}, + {"MSP_MOB1_FEMALES_01"_J, "MSP_MOB1_FEMALES_01"}, + {"MSP_MOB1_MALES_01"_J, "MSP_MOB1_MALES_01"}, + {"MSP_MOB1_TEENS_01"_J, "MSP_MOB1_TEENS_01"}, + {"msp_mob3_FEMALES_01"_J, "msp_mob3_FEMALES_01"}, + {"msp_mob3_MALES_01"_J, "msp_mob3_MALES_01"}, + {"MSP_MUDTOWN3_MALES_01"_J, "MSP_MUDTOWN3_MALES_01"}, + {"MSP_Mudtown3B_Females_01"_J, "MSP_Mudtown3B_Females_01"}, + {"MSP_Mudtown3B_Males_01"_J, "MSP_Mudtown3B_Males_01"}, + {"MSP_MUDTOWN5_MALES_01"_J, "MSP_MUDTOWN5_MALES_01"}, + {"MSP_NATIVE1_MALES_01"_J, "MSP_NATIVE1_MALES_01"}, + {"MSP_REVEREND1_MALES_01"_J, "MSP_REVEREND1_MALES_01"}, + {"MSP_SAINTDENIS1_FEMALES_01"_J, "MSP_SAINTDENIS1_FEMALES_01"}, + {"MSP_SAINTDENIS1_MALES_01"_J, "MSP_SAINTDENIS1_MALES_01"}, + {"MSP_SALOON1_FEMALES_01"_J, "MSP_SALOON1_FEMALES_01"}, + {"MSP_SALOON1_MALES_01"_J, "MSP_SALOON1_MALES_01"}, + {"MSP_SMUGGLER2_MALES_01"_J, "MSP_SMUGGLER2_MALES_01"}, + {"MSP_TRAINROBBERY2_MALES_01"_J, "MSP_TRAINROBBERY2_MALES_01"}, + {"MSP_TRELAWNY1_MALES_01"_J, "MSP_TRELAWNY1_MALES_01"}, + {"MSP_UTOPIA1_MALES_01"_J, "MSP_UTOPIA1_MALES_01"}, + {"MSP_WINTER4_MALES_01"_J, "MSP_WINTER4_MALES_01"}, + {"P_U_M_M_ANIMALPOACHER_03"_J, "P_U_M_M_ANIMALPOACHER_03"}, + {"Player_Three"_J, "Player_Three"}, + {"Player_Zero"_J, "Player_Zero"}, + {"Ps4"_J, "Ps4"}, + {"RCES_ABIGAIL3_FEMALES_01"_J, "RCES_ABIGAIL3_FEMALES_01"}, + {"RCES_ABIGAIL3_MALES_01"_J, "RCES_ABIGAIL3_MALES_01"}, + {"RCES_BEECHERS1_MALES_01"_J, "RCES_BEECHERS1_MALES_01"}, + {"RCES_EVELYNMILLER_MALES_01"_J, "RCES_EVELYNMILLER_MALES_01"}, + {"RCSP_BEAUANDPENELOPE_MALES_01"_J, "RCSP_BEAUANDPENELOPE_MALES_01"}, + {"RCSP_BEAUANDPENELOPE1_FEMALES_01"_J, "RCSP_BEAUANDPENELOPE1_FEMALES_01"}, + {"RCSP_CALDERON_MALES_01"_J, "RCSP_CALDERON_MALES_01"}, + {"RCSP_CALDERONSTAGE2_MALES_01"_J, "RCSP_CALDERONSTAGE2_MALES_01"}, + {"RCSP_CALDERONSTAGE2_TEENS_01"_J, "RCSP_CALDERONSTAGE2_TEENS_01"}, + {"RCSP_CALLOWAY_MALES_01"_J, "RCSP_CALLOWAY_MALES_01"}, + {"RCSP_COACHROBBERY_MALES_01"_J, "RCSP_COACHROBBERY_MALES_01"}, + {"RCSP_CRACKPOT_FEMALES_01"_J, "RCSP_CRACKPOT_FEMALES_01"}, + {"RCSP_CRACKPOT_MALES_01"_J, "RCSP_CRACKPOT_MALES_01"}, + {"RCSP_CREOLE_MALES_01"_J, "RCSP_CREOLE_MALES_01"}, + {"RCSP_DUTCH1_MALES_01"_J, "RCSP_DUTCH1_MALES_01"}, + {"RCSP_DUTCH3_MALES_01"_J, "RCSP_DUTCH3_MALES_01"}, + {"RCSP_EDITHDOWNES2_MALES_01"_J, "RCSP_EDITHDOWNES2_MALES_01"}, + {"RCSP_FORMYART_FEMALES_01"_J, "RCSP_FORMYART_FEMALES_01"}, + {"RCSP_FORMYART_MALES_01"_J, "RCSP_FORMYART_MALES_01"}, + {"RCSP_GUNSLINGERDUEL4_MALES_01"_J, "RCSP_GUNSLINGERDUEL4_MALES_01"}, + {"RCSP_HEREKITTYKITTY_MALES_0"_J, "RCSP_HEREKITTYKITTY_MALES_0"}, + {"RCSP_HUNTING1_MALES_01"_J, "RCSP_HUNTING1_MALES_01"}, + {"RCSP_MRMAYOR_MALES_01"_J, "RCSP_MRMAYOR_MALES_01"}, + {"RCSP_NATIVE_AMERICANFATHERS_MALES_01"_J, "RCSP_NATIVE_AMERICANFATHERS_MALES_01"}, + {"RCSP_NATIVE1S2_MALES_01"_J, "RCSP_NATIVE1S2_MALES_01"}, + {"RCSP_ODDFELLOWS_MALES_01"_J, "RCSP_ODDFELLOWS_MALES_01"}, + {"RCSP_ODRISCOLLS2_FEMALES_01"_J, "RCSP_ODRISCOLLS2_FEMALES_01"}, + {"RCSP_POISONEDWELL_FEMALES_01"_J, "RCSP_POISONEDWELL_FEMALES_01"}, + {"RCSP_POISONEDWELL_MALES_01"_J, "RCSP_POISONEDWELL_MALES_01"}, + {"RCSP_POISONEDWELL_TEENS_01"_J, "RCSP_POISONEDWELL_TEENS_01"}, + {"RCSP_RIDETHELIGHTNING_FEMALES_01"_J, "RCSP_RIDETHELIGHTNING_FEMALES_01"}, + {"RCSP_RIDETHELIGHTNING_MALES_01"_J, "RCSP_RIDETHELIGHTNING_MALES_01"}, + {"RCSP_SADIE1_MALES_01"_J, "RCSP_SADIE1_MALES_01"}, + {"RCSP_SLAVECATCHER_MALES_01"_J, "RCSP_SLAVECATCHER_MALES_01"}, + {"RE_ANIMALATTACK_FEMALES_01"_J, "RE_ANIMALATTACK_FEMALES_01"}, + {"RE_ANIMALATTACK_MALES_01"_J, "RE_ANIMALATTACK_MALES_01"}, + {"RE_ANIMALMAULING_MALES_01"_J, "RE_ANIMALMAULING_MALES_01"}, + {"RE_APPROACH_MALES_01"_J, "RE_APPROACH_MALES_01"}, + {"RE_BEARTRAP_MALES_01"_J, "RE_BEARTRAP_MALES_01"}, + {"RE_BOATATTACK_MALES_01"_J, "RE_BOATATTACK_MALES_01"}, + {"RE_BURNINGBODIES_MALES_01"_J, "RE_BURNINGBODIES_MALES_01"}, + {"RE_CHECKPOINT_MALES_01"_J, "RE_CHECKPOINT_MALES_01"}, + {"RE_COACHROBBERY_FEMALES_01"_J, "RE_COACHROBBERY_FEMALES_01"}, + {"RE_COACHROBBERY_MALES_01"_J, "RE_COACHROBBERY_MALES_01"}, + {"RE_CONSEQUENCE_MALES_01"_J, "RE_CONSEQUENCE_MALES_01"}, + {"RE_CORPSECART_FEMALES_01"_J, "RE_CORPSECART_FEMALES_01"}, + {"RE_CORPSECART_MALES_01"_J, "RE_CORPSECART_MALES_01"}, + {"RE_CRASHEDWAGON_MALES_01"_J, "RE_CRASHEDWAGON_MALES_01"}, + {"RE_DARKALLEYAMBUSH_MALES_01"_J, "RE_DARKALLEYAMBUSH_MALES_01"}, + {"RE_DARKALLEYBUM_MALES_01"_J, "RE_DARKALLEYBUM_MALES_01"}, + {"RE_DARKALLEYSTABBING_MALES_01"_J, "RE_DARKALLEYSTABBING_MALES_01"}, + {"RE_DEADBODIES_MALES_01"_J, "RE_DEADBODIES_MALES_01"}, + {"RE_DEADJOHN_FEMALES_01"_J, "RE_DEADJOHN_FEMALES_01"}, + {"RE_DEADJOHN_MALES_01"_J, "RE_DEADJOHN_MALES_01"}, + {"RE_DISABLEDBEGGAR_MALES_01"_J, "RE_DISABLEDBEGGAR_MALES_01"}, + {"RE_DOMESTICDISPUTE_FEMALES_01"_J, "RE_DOMESTICDISPUTE_FEMALES_01"}, + {"RE_DOMESTICDISPUTE_MALES_01"_J, "RE_DOMESTICDISPUTE_MALES_01"}, + {"RE_DROWNMURDER_FEMALES_01"_J, "RE_DROWNMURDER_FEMALES_01"}, + {"RE_DROWNMURDER_MALES_01"_J, "RE_DROWNMURDER_MALES_01"}, + {"RE_DRUNKCAMP_MALES_01"_J, "RE_DRUNKCAMP_MALES_01"}, + {"RE_DRUNKDUELER_MALES_01"_J, "RE_DRUNKDUELER_MALES_01"}, + {"RE_DUELBOASTER_MALES_01"_J, "RE_DUELBOASTER_MALES_01"}, + {"RE_DUELWINNER_FEMALES_01"_J, "RE_DUELWINNER_FEMALES_01"}, + {"RE_DUELWINNER_MALES_01"_J, "RE_DUELWINNER_MALES_01"}, + {"RE_ESCORT_FEMALES_01"_J, "RE_ESCORT_FEMALES_01"}, + {"RE_EXECUTIONS_MALES_01"_J, "RE_EXECUTIONS_MALES_01"}, + {"RE_FLEEINGFAMILY_FEMALES_01"_J, "RE_FLEEINGFAMILY_FEMALES_01"}, + {"RE_FLEEINGFAMILY_MALES_01"_J, "RE_FLEEINGFAMILY_MALES_01"}, + {"RE_FOOTROBBERY_MALES_01"_J, "RE_FOOTROBBERY_MALES_01"}, + {"RE_FRIENDLYOUTDOORSMAN_MALES_01"_J, "RE_FRIENDLYOUTDOORSMAN_MALES_01"}, + {"RE_FROZENTODEATH_FEMALES_01"_J, "RE_FROZENTODEATH_FEMALES_01"}, + {"RE_FROZENTODEATH_MALES_01"_J, "RE_FROZENTODEATH_MALES_01"}, + {"RE_FUNDRAISER_FEMALES_01"_J, "RE_FUNDRAISER_FEMALES_01"}, + {"RE_FUSSARCHASE_MALES_01"_J, "RE_FUSSARCHASE_MALES_01"}, + {"RE_GOLDPANNER_MALES_01"_J, "RE_GOLDPANNER_MALES_01"}, + {"RE_HORSERACE_FEMALES_01"_J, "RE_HORSERACE_FEMALES_01"}, + {"RE_HORSERACE_MALES_01"_J, "RE_HORSERACE_MALES_01"}, + {"RE_HOSTAGERESCUE_FEMALES_01"_J, "RE_HOSTAGERESCUE_FEMALES_01"}, + {"RE_HOSTAGERESCUE_MALES_01"_J, "RE_HOSTAGERESCUE_MALES_01"}, + {"RE_INBREDKIDNAP_FEMALES_01"_J, "RE_INBREDKIDNAP_FEMALES_01"}, + {"RE_INBREDKIDNAP_MALES_01"_J, "RE_INBREDKIDNAP_MALES_01"}, + {"RE_INJUREDRIDER_MALES_01"_J, "RE_INJUREDRIDER_MALES_01"}, + {"RE_KIDNAPPEDVICTIM_FEMALES_01"_J, "RE_KIDNAPPEDVICTIM_FEMALES_01"}, + {"RE_LARAMIEGANGRUSTLING_MALES_01"_J, "RE_LARAMIEGANGRUSTLING_MALES_01"}, + {"RE_LONEPRISONER_MALES_01"_J, "RE_LONEPRISONER_MALES_01"}, + {"RE_LOSTDOG_DOGS_01"_J, "RE_LOSTDOG_DOGS_01"}, + {"RE_LOSTDOG_TEENS_01"_J, "RE_LOSTDOG_TEENS_01"}, + {"RE_LOSTDRUNK_FEMALES_01"_J, "RE_LOSTDRUNK_FEMALES_01"}, + {"RE_LOSTDRUNK_MALES_01"_J, "RE_LOSTDRUNK_MALES_01"}, + {"RE_LOSTFRIEND_MALES_01"_J, "RE_LOSTFRIEND_MALES_01"}, + {"RE_LOSTMAN_MALES_01"_J, "RE_LOSTMAN_MALES_01"}, + {"RE_MOONSHINECAMP_MALES_01"_J, "RE_MOONSHINECAMP_MALES_01"}, + {"RE_MURDERCAMP_MALES_01"_J, "RE_MURDERCAMP_MALES_01"}, + {"RE_MURDERSUICIDE_FEMALES_01"_J, "RE_MURDERSUICIDE_FEMALES_01"}, + {"RE_MURDERSUICIDE_MALES_01"_J, "RE_MURDERSUICIDE_MALES_01"}, + {"RE_NAKEDSWIMMER_MALES_01"_J, "RE_NAKEDSWIMMER_MALES_01"}, + {"RE_ONTHERUN_MALES_01"_J, "RE_ONTHERUN_MALES_01"}, + {"RE_OUTLAWLOOTER_MALES_01"_J, "RE_OUTLAWLOOTER_MALES_01"}, + {"RE_PARLORAMBUSH_MALES_01"_J, "RE_PARLORAMBUSH_MALES_01"}, + {"RE_PEEPINGTOM_FEMALES_01"_J, "RE_PEEPINGTOM_FEMALES_01"}, + {"RE_PEEPINGTOM_MALES_01"_J, "RE_PEEPINGTOM_MALES_01"}, + {"RE_PICKPOCKET_MALES_01"_J, "RE_PICKPOCKET_MALES_01"}, + {"RE_PISSPOT_FEMALES_01"_J, "RE_PISSPOT_FEMALES_01"}, + {"RE_PISSPOT_MALES_01"_J, "RE_PISSPOT_MALES_01"}, + {"RE_PLAYERCAMPSTRANGERS_FEMALES_01"_J, "RE_PLAYERCAMPSTRANGERS_FEMALES_01"}, + {"RE_PLAYERCAMPSTRANGERS_MALES_01"_J, "RE_PLAYERCAMPSTRANGERS_MALES_01"}, + {"RE_POISONED_MALES_01"_J, "RE_POISONED_MALES_01"}, + {"RE_POLICECHASE_MALES_01"_J, "RE_POLICECHASE_MALES_01"}, + {"RE_PRISONWAGON_FEMALES_01"_J, "RE_PRISONWAGON_FEMALES_01"}, + {"RE_PRISONWAGON_MALES_01"_J, "RE_PRISONWAGON_MALES_01"}, + {"RE_PUBLICHANGING_FEMALES_01"_J, "RE_PUBLICHANGING_FEMALES_01"}, + {"RE_PUBLICHANGING_MALES_01"_J, "RE_PUBLICHANGING_MALES_01"}, + {"RE_PUBLICHANGING_TEENS_01"_J, "RE_PUBLICHANGING_TEENS_01"}, + {"RE_RALLY_MALES_01"_J, "RE_RALLY_MALES_01"}, + {"RE_RALLYDISPUTE_MALES_01"_J, "RE_RALLYDISPUTE_MALES_01"}, + {"RE_RALLYSETUP_MALES_01"_J, "RE_RALLYSETUP_MALES_01"}, + {"RE_RATINFESTATION_MALES_01"_J, "RE_RATINFESTATION_MALES_01"}, + {"RE_ROWDYDRUNKS_MALES_01"_J, "RE_ROWDYDRUNKS_MALES_01"}, + {"RE_SAVAGEAFTERMATH_FEMALES_01"_J, "RE_SAVAGEAFTERMATH_FEMALES_01"}, + {"RE_SAVAGEAFTERMATH_MALES_01"_J, "RE_SAVAGEAFTERMATH_MALES_01"}, + {"RE_SAVAGEFIGHT_FEMALES_01"_J, "RE_SAVAGEFIGHT_FEMALES_01"}, + {"RE_SAVAGEFIGHT_MALES_01"_J, "RE_SAVAGEFIGHT_MALES_01"}, + {"RE_SAVAGEWAGON_FEMALES_01"_J, "RE_SAVAGEWAGON_FEMALES_01"}, + {"RE_SAVAGEWAGON_MALES_01"_J, "RE_SAVAGEWAGON_MALES_01"}, + {"RE_SAVAGEWARNING_MALES_01"_J, "RE_SAVAGEWARNING_MALES_01"}, + {"RE_SHARPSHOOTER_MALES_01"_J, "RE_SHARPSHOOTER_MALES_01"}, + {"RE_SHOWOFF_MALES_01"_J, "RE_SHOWOFF_MALES_01"}, + {"RE_SKIPPINGSTONES_MALES_01"_J, "RE_SKIPPINGSTONES_MALES_01"}, + {"RE_SKIPPINGSTONES_TEENS_01"_J, "RE_SKIPPINGSTONES_TEENS_01"}, + {"RE_SLUMAMBUSH_FEMALES_01"_J, "RE_SLUMAMBUSH_FEMALES_01"}, + {"RE_SNAKEBITE_MALES_01"_J, "RE_SNAKEBITE_MALES_01"}, + {"RE_STALKINGHUNTER_MALES_01"_J, "RE_STALKINGHUNTER_MALES_01"}, + {"RE_STRANDEDRIDER_MALES_01"_J, "RE_STRANDEDRIDER_MALES_01"}, + {"RE_STREET_FIGHT_MALES_01"_J, "RE_STREET_FIGHT_MALES_01"}, + {"RE_TAUNTING_01"_J, "RE_TAUNTING_01"}, + {"RE_TAUNTING_MALES_01"_J, "RE_TAUNTING_MALES_01"}, + {"RE_TORTURINGCAPTIVE_MALES_01"_J, "RE_TORTURINGCAPTIVE_MALES_01"}, + {"RE_TOWNBURIAL_MALES_01"_J, "RE_TOWNBURIAL_MALES_01"}, + {"RE_TOWNCONFRONTATION_FEMALES_01"_J, "RE_TOWNCONFRONTATION_FEMALES_01"}, + {"RE_TOWNCONFRONTATION_MALES_01"_J, "RE_TOWNCONFRONTATION_MALES_01"}, + {"RE_TOWNROBBERY_MALES_01"_J, "RE_TOWNROBBERY_MALES_01"}, + {"RE_TOWNWIDOW_FEMALES_01"_J, "RE_TOWNWIDOW_FEMALES_01"}, + {"RE_TRAINHOLDUP_FEMALES_01"_J, "RE_TRAINHOLDUP_FEMALES_01"}, + {"RE_TRAINHOLDUP_MALES_01"_J, "RE_TRAINHOLDUP_MALES_01"}, + {"RE_TRAPPEDWOMAN_FEMALES_01"_J, "RE_TRAPPEDWOMAN_FEMALES_01"}, + {"RE_TREASUREHUNTER_MALES_01"_J, "RE_TREASUREHUNTER_MALES_01"}, + {"RE_VOICE_FEMALES_01"_J, "RE_VOICE_FEMALES_01"}, + {"RE_WAGONTHREAT_FEMALES_01"_J, "RE_WAGONTHREAT_FEMALES_01"}, + {"RE_WAGONTHREAT_MALES_01"_J, "RE_WAGONTHREAT_MALES_01"}, + {"RE_WASHEDASHORE_MALES_01"_J, "RE_WASHEDASHORE_MALES_01"}, + {"RE_WEALTHYCOUPLE_FEMALES_01"_J, "RE_WEALTHYCOUPLE_FEMALES_01"}, + {"RE_WEALTHYCOUPLE_MALES_01"_J, "RE_WEALTHYCOUPLE_MALES_01"}, + {"RE_WILDMAN_01"_J, "RE_WILDMAN_01"}, + {"S_F_M_BwmWorker_01"_J, "S_F_M_BwmWorker_01"}, + {"S_F_M_CghWorker_01"_J, "S_F_M_CghWorker_01"}, + {"S_F_M_MaPWorker_01"_J, "S_F_M_MaPWorker_01"}, + {"S_M_M_AmbientBlWPolice_01"_J, "S_M_M_AmbientBlWPolice_01"}, + {"S_M_M_AmbientLawRural_01"_J, "S_M_M_AmbientLawRural_01"}, + {"S_M_M_AmbientSDPolice_01"_J, "S_M_M_AmbientSDPolice_01"}, + {"S_M_M_Army_01"_J, "S_M_M_Army_01"}, + {"S_M_M_ASBCowpoke_01"_J, "S_M_M_ASBCowpoke_01"}, + {"S_M_M_ASBDEALER_01"_J, "S_M_M_ASBDEALER_01"}, + {"S_M_M_BankClerk_01"_J, "S_M_M_BankClerk_01"}, + {"S_M_M_Barber_01"_J, "S_M_M_Barber_01"}, + {"S_M_M_BLWCOWPOKE_01"_J, "S_M_M_BLWCOWPOKE_01"}, + {"S_M_M_BLWDEALER_01"_J, "S_M_M_BLWDEALER_01"}, + {"S_M_M_BwmWorker_01"_J, "S_M_M_BwmWorker_01"}, + {"S_M_M_CghWorker_01"_J, "S_M_M_CghWorker_01"}, + {"S_M_M_CKTWorker_01"_J, "S_M_M_CKTWorker_01"}, + {"S_M_M_COACHTAXIDRIVER_01"_J, "S_M_M_COACHTAXIDRIVER_01"}, + {"S_M_M_CornwallGuard_01"_J, "S_M_M_CornwallGuard_01"}, + {"S_M_M_DispatchLawRural_01"_J, "S_M_M_DispatchLawRural_01"}, + {"S_M_M_DispatchLeaderPolice_01"_J, "S_M_M_DispatchLeaderPolice_01"}, + {"S_M_M_DispatchLeaderRural_01"_J, "S_M_M_DispatchLeaderRural_01"}, + {"S_M_M_DispatchPolice_01"_J, "S_M_M_DispatchPolice_01"}, + {"S_M_M_FussarHenchman_01"_J, "S_M_M_FussarHenchman_01"}, + {"S_M_M_GENCONDUCTOR_01"_J, "S_M_M_GENCONDUCTOR_01"}, + {"S_M_M_HOFGuard_01"_J, "S_M_M_HOFGuard_01"}, + {"S_M_M_LiveryWorker_01"_J, "S_M_M_LiveryWorker_01"}, + {"S_M_M_MAGICLANTERN_01"_J, "S_M_M_MAGICLANTERN_01"}, + {"S_M_M_MaPWorker_01"_J, "S_M_M_MaPWorker_01"}, + {"S_M_M_MarketVendor_01"_J, "S_M_M_MarketVendor_01"}, + {"S_M_M_MARSHALLSRURAL_01"_J, "S_M_M_MARSHALLSRURAL_01"}, + {"S_M_M_MicGuard_01"_J, "S_M_M_MicGuard_01"}, + {"S_M_M_NBXRIVERBOATDEALERS_01"_J, "S_M_M_NBXRIVERBOATDEALERS_01"}, + {"S_M_M_NbxRiverBoatGuards_01"_J, "S_M_M_NbxRiverBoatGuards_01"}, + {"S_M_M_ORPGUARD_01"_J, "S_M_M_ORPGUARD_01"}, + {"S_M_M_PinLaw_01"_J, "S_M_M_PinLaw_01"}, + {"S_M_M_RACRAILGUARDS_01"_J, "S_M_M_RACRAILGUARDS_01"}, + {"S_M_M_RaCRailWorker_01"_J, "S_M_M_RaCRailWorker_01"}, + {"S_M_M_RHDCOWPOKE_01"_J, "S_M_M_RHDCOWPOKE_01"}, + {"S_M_M_RHDDEALER_01"_J, "S_M_M_RHDDEALER_01"}, + {"S_M_M_SDCOWPOKE_01"_J, "S_M_M_SDCOWPOKE_01"}, + {"S_M_M_SDDEALER_01"_J, "S_M_M_SDDEALER_01"}, + {"S_M_M_SDTICKETSELLER_01"_J, "S_M_M_SDTICKETSELLER_01"}, + {"S_M_M_SkpGuard_01"_J, "S_M_M_SkpGuard_01"}, + {"S_M_M_StGSailor_01"_J, "S_M_M_StGSailor_01"}, + {"S_M_M_STRCOWPOKE_01"_J, "S_M_M_STRCOWPOKE_01"}, + {"S_M_M_STRDEALER_01"_J, "S_M_M_STRDEALER_01"}, + {"S_M_M_StrLumberjack_01"_J, "S_M_M_StrLumberjack_01"}, + {"S_M_M_Tailor_01"_J, "S_M_M_Tailor_01"}, + {"S_M_M_TrainStationWorker_01"_J, "S_M_M_TrainStationWorker_01"}, + {"S_M_M_TumDeputies_01"_J, "S_M_M_TumDeputies_01"}, + {"S_M_M_UNIBUTCHERS_01"_J, "S_M_M_UNIBUTCHERS_01"}, + {"S_M_M_UniTrainEngineer_01"_J, "S_M_M_UniTrainEngineer_01"}, + {"S_M_M_UniTrainGuards_01"_J, "S_M_M_UniTrainGuards_01"}, + {"S_M_M_ValBankGuards_01"_J, "S_M_M_ValBankGuards_01"}, + {"S_M_M_ValCowpoke_01"_J, "S_M_M_ValCowpoke_01"}, + {"S_M_M_VALDEALER_01"_J, "S_M_M_VALDEALER_01"}, + {"S_M_M_VALDEPUTY_01"_J, "S_M_M_VALDEPUTY_01"}, + {"S_M_M_VHTDEALER_01"_J, "S_M_M_VHTDEALER_01"}, + {"S_M_O_CKTWorker_01"_J, "S_M_O_CKTWorker_01"}, + {"S_M_Y_Army_01"_J, "S_M_Y_Army_01"}, + {"S_M_Y_NewspaperBoy_01"_J, "S_M_Y_NewspaperBoy_01"}, + {"S_M_Y_RaCRailWorker_01"_J, "S_M_Y_RaCRailWorker_01"}, + {"SALOONBRAWLERS_02"_J, "SALOONBRAWLERS_02"}, + {"SALOONBRAWLERS_03"_J, "SALOONBRAWLERS_03"}, + {"SALOONBRAWLERS_04"_J, "SALOONBRAWLERS_04"}, + {"SALOONBRAWLERS_05"_J, "SALOONBRAWLERS_05"}, + {"SALOONBRAWLERS_06"_J, "SALOONBRAWLERS_06"}, + {"SALOONBRAWLERS_07"_J, "SALOONBRAWLERS_07"}, + {"SALOONBRAWLERS_08"_J, "SALOONBRAWLERS_08"}, + {"SALOONBRAWLERS_09"_J, "SALOONBRAWLERS_09"}, + {"SALOONBRAWLERS_10"_J, "SALOONBRAWLERS_10"}, + {"SALOONBRAWLERS_11"_J, "SALOONBRAWLERS_11"}, + {"SALOONBRAWLERS_12"_J, "SALOONBRAWLERS_12"}, + {"SALOONBRAWLERS_13"_J, "SALOONBRAWLERS_13"}, + {"SALOONBRAWLERS_14"_J, "SALOONBRAWLERS_14"}, + {"U_F_M_BHT_WIFE"_J, "U_F_M_BHT_WIFE"}, + {"U_F_M_CIRCUSWAGON_01"_J, "U_F_M_CIRCUSWAGON_01"}, + {"U_F_M_EMRDAUGHTER_01"_J, "U_F_M_EMRDAUGHTER_01"}, + {"U_F_M_FUSSAR1LADY_01"_J, "U_F_M_FUSSAR1LADY_01"}, + {"U_F_M_HTLWIFE_01"_J, "U_F_M_HTLWIFE_01"}, + {"U_F_M_LagMother_01"_J, "U_F_M_LagMother_01"}, + {"U_F_M_NbxResident_01"_J, "U_F_M_NbxResident_01"}, + {"U_F_M_RhdNudeWoman_01"_J, "U_F_M_RhdNudeWoman_01"}, + {"U_F_M_RkSHomesteadTenant_01"_J, "U_F_M_RkSHomesteadTenant_01"}, + {"U_F_M_STORY_BLACKBELLE_01"_J, "U_F_M_STORY_BLACKBELLE_01"}, + {"U_F_M_STORY_NIGHTFOLK_01"_J, "U_F_M_STORY_NIGHTFOLK_01"}, + {"U_F_M_TljBartender_01"_J, "U_F_M_TljBartender_01"}, + {"U_F_M_TumGeneralStoreOwner_01"_J, "U_F_M_TumGeneralStoreOwner_01"}, + {"U_F_M_ValTownfolk_01"_J, "U_F_M_ValTownfolk_01"}, + {"U_F_M_ValTownfolk_02"_J, "U_F_M_ValTownfolk_02"}, + {"U_F_M_VHTBARTENDER_01"_J, "U_F_M_VHTBARTENDER_01"}, + {"U_F_O_Hermit_woman_01"_J, "U_F_O_Hermit_woman_01"}, + {"U_F_O_WtCTownfolk_01"_J, "U_F_O_WtCTownfolk_01"}, + {"U_F_Y_BRAITHWAITESSECRET_01"_J, "U_F_Y_BRAITHWAITESSECRET_01"}, + {"U_F_Y_CzPHomesteadDaughter_01"_J, "U_F_Y_CzPHomesteadDaughter_01"}, + {"U_M_M_ANNOUNCER_01"_J, "U_M_M_ANNOUNCER_01"}, + {"U_M_M_APFDeadMan_01"_J, "U_M_M_APFDeadMan_01"}, + {"U_M_M_ARMGENERALSTOREOWNER_01"_J, "U_M_M_ARMGENERALSTOREOWNER_01"}, + {"U_M_M_ARMTRAINSTATIONWORKER_01"_J, "U_M_M_ARMTRAINSTATIONWORKER_01"}, + {"U_M_M_ARMUNDERTAKER_01"_J, "U_M_M_ARMUNDERTAKER_01"}, + {"U_M_M_ARMYTRN4_01"_J, "U_M_M_ARMYTRN4_01"}, + {"U_M_M_AsbGunsmith_01"_J, "U_M_M_AsbGunsmith_01"}, + {"U_M_M_AsbPrisoner_01"_J, "U_M_M_AsbPrisoner_01"}, + {"U_M_M_AsbPrisoner_02"_J, "U_M_M_AsbPrisoner_02"}, + {"U_M_M_BHT_BANDITOMINE"_J, "U_M_M_BHT_BANDITOMINE"}, + {"U_M_M_BHT_BANDITOSHACK"_J, "U_M_M_BHT_BANDITOSHACK"}, + {"U_M_M_BHT_BENEDICTALLBRIGHT"_J, "U_M_M_BHT_BENEDICTALLBRIGHT"}, + {"U_M_M_BHT_BLACKWATERHUNT"_J, "U_M_M_BHT_BLACKWATERHUNT"}, + {"U_M_M_BHT_LOVER"_J, "U_M_M_BHT_LOVER"}, + {"U_M_M_BHT_MINEFOREMAN"_J, "U_M_M_BHT_MINEFOREMAN"}, + {"U_M_M_BHT_NATHANKIRK"_J, "U_M_M_BHT_NATHANKIRK"}, + {"U_M_M_BHT_ODRISCOLLDRUNK"_J, "U_M_M_BHT_ODRISCOLLDRUNK"}, + {"U_M_M_BHT_ODRISCOLLMAULED"_J, "U_M_M_BHT_ODRISCOLLMAULED"}, + {"U_M_M_BHT_ODRISCOLLSLEEPING"_J, "U_M_M_BHT_ODRISCOLLSLEEPING"}, + {"U_M_M_BHT_OLDMAN"_J, "U_M_M_BHT_OLDMAN"}, + {"U_M_M_BHT_OUTLAWMAULED"_J, "U_M_M_BHT_OUTLAWMAULED"}, + {"U_M_M_BHT_SAINTDENISSALOON"_J, "U_M_M_BHT_SAINTDENISSALOON"}, + {"U_M_M_BHT_SHACKESCAPE"_J, "U_M_M_BHT_SHACKESCAPE"}, + {"U_M_M_BHT_SKINNERBROTHER"_J, "U_M_M_BHT_SKINNERBROTHER"}, + {"U_M_M_BHT_SKINNERSEARCH"_J, "U_M_M_BHT_SKINNERSEARCH"}, + {"U_M_M_BHT_STRAWBERRYDUEL"_J, "U_M_M_BHT_STRAWBERRYDUEL"}, + {"U_M_M_BiVForeman_01"_J, "U_M_M_BiVForeman_01"}, + {"U_M_M_BlWTrainStationWorker_01"_J, "U_M_M_BlWTrainStationWorker_01"}, + {"U_M_M_BULLETCATCHVOLUNTEER_01"_J, "U_M_M_BULLETCATCHVOLUNTEER_01"}, + {"U_M_M_BwmStablehand_01"_J, "U_M_M_BwmStablehand_01"}, + {"U_M_M_CAJHOMESTEAD_01"_J, "U_M_M_CAJHOMESTEAD_01"}, + {"U_M_M_CHELONIANJUMPER_01"_J, "U_M_M_CHELONIANJUMPER_01"}, + {"U_M_M_CHELONIANJUMPER_02"_J, "U_M_M_CHELONIANJUMPER_02"}, + {"U_M_M_CHELONIANJUMPER_03"_J, "U_M_M_CHELONIANJUMPER_03"}, + {"U_M_M_CHELONIANJUMPER_04"_J, "U_M_M_CHELONIANJUMPER_04"}, + {"U_M_M_CircusWagon_01"_J, "U_M_M_CircusWagon_01"}, + {"U_M_M_CKTManager_01"_J, "U_M_M_CKTManager_01"}, + {"U_M_M_CORNWALLDRIVER_01"_J, "U_M_M_CORNWALLDRIVER_01"}, + {"U_M_M_CrDHomesteadTenant_01"_J, "U_M_M_CrDHomesteadTenant_01"}, + {"U_M_M_CRDHOMESTEADTENANT_02"_J, "U_M_M_CRDHOMESTEADTENANT_02"}, + {"U_M_M_CRDWITNESS_01"_J, "U_M_M_CRDWITNESS_01"}, + {"U_M_M_CreoleCaptain_01"_J, "U_M_M_CreoleCaptain_01"}, + {"U_M_M_CzPHomesteadFather_01"_J, "U_M_M_CzPHomesteadFather_01"}, + {"U_M_M_DorHomesteadHusband_01"_J, "U_M_M_DorHomesteadHusband_01"}, + {"U_M_M_EmRFarmHand_03"_J, "U_M_M_EmRFarmHand_03"}, + {"U_M_M_EmRFather_01"_J, "U_M_M_EmRFather_01"}, + {"U_M_M_EXECUTIONER_01"_J, "U_M_M_EXECUTIONER_01"}, + {"U_M_M_FATDUSTER_01"_J, "U_M_M_FATDUSTER_01"}, + {"U_M_M_FINALE2_AA_UPPERCLASS_01"_J, "U_M_M_FINALE2_AA_UPPERCLASS_01"}, + {"U_M_M_GalaStringQuartet_01"_J, "U_M_M_GalaStringQuartet_01"}, + {"U_M_M_GalaStringQuartet_02"_J, "U_M_M_GalaStringQuartet_02"}, + {"U_M_M_GalaStringQuartet_03"_J, "U_M_M_GalaStringQuartet_03"}, + {"U_M_M_GalaStringQuartet_04"_J, "U_M_M_GalaStringQuartet_04"}, + {"U_M_M_GAMDoorman_01"_J, "U_M_M_GAMDoorman_01"}, + {"U_M_M_HHRRANCHER_01"_J, "U_M_M_HHRRANCHER_01"}, + {"U_M_M_HtlForeman_01"_J, "U_M_M_HtlForeman_01"}, + {"U_M_M_HTLHUSBAND_01"_J, "U_M_M_HTLHUSBAND_01"}, + {"U_M_M_HtlRancherBounty_01"_J, "U_M_M_HtlRancherBounty_01"}, + {"U_M_M_ISLBUM_01"_J, "U_M_M_ISLBUM_01"}, + {"U_M_M_LNSOUTLAW_01"_J, "U_M_M_LNSOUTLAW_01"}, + {"U_M_M_LNSOUTLAW_02"_J, "U_M_M_LNSOUTLAW_02"}, + {"U_M_M_lnsoutlaw_03"_J, "U_M_M_lnsoutlaw_03"}, + {"U_M_M_LNSOUTLAW_04"_J, "U_M_M_LNSOUTLAW_04"}, + {"U_M_M_LnSWorker_01"_J, "U_M_M_LnSWorker_01"}, + {"U_M_M_LnSWorker_02"_J, "U_M_M_LnSWorker_02"}, + {"U_M_M_LnSWorker_03"_J, "U_M_M_LnSWorker_03"}, + {"U_M_M_LnSWorker_04"_J, "U_M_M_LnSWorker_04"}, + {"U_M_M_LrsHomesteadTenant_01"_J, "U_M_M_LrsHomesteadTenant_01"}, + {"U_M_M_MFRRANCHER_01"_J, "U_M_M_MFRRANCHER_01"}, + {"U_M_M_MUD3PIMP_01"_J, "U_M_M_MUD3PIMP_01"}, + {"U_M_M_NbxBankerBounty_01"_J, "U_M_M_NbxBankerBounty_01"}, + {"U_M_M_NbxBartender_01"_J, "U_M_M_NbxBartender_01"}, + {"U_M_M_NbxBartender_02"_J, "U_M_M_NbxBartender_02"}, + {"U_M_M_NbxBoatTicketSeller_01"_J, "U_M_M_NbxBoatTicketSeller_01"}, + {"U_M_M_NbxBronteAsc_01"_J, "U_M_M_NbxBronteAsc_01"}, + {"U_M_M_NbxBronteGoon_01"_J, "U_M_M_NbxBronteGoon_01"}, + {"U_M_M_NbxBronteSecForm_01"_J, "U_M_M_NbxBronteSecForm_01"}, + {"U_M_M_NbxGeneralStoreOwner_01"_J, "U_M_M_NbxGeneralStoreOwner_01"}, + {"U_M_M_NBXGraverobber_01"_J, "U_M_M_NBXGraverobber_01"}, + {"U_M_M_NBXGraverobber_02"_J, "U_M_M_NBXGraverobber_02"}, + {"U_M_M_NBXGraverobber_03"_J, "U_M_M_NBXGraverobber_03"}, + {"U_M_M_NBXGraverobber_04"_J, "U_M_M_NBXGraverobber_04"}, + {"U_M_M_NBXGraverobber_05"_J, "U_M_M_NBXGraverobber_05"}, + {"U_M_M_NbxGunsmith_01"_J, "U_M_M_NbxGunsmith_01"}, + {"U_M_M_NBXLiveryWorker_01"_J, "U_M_M_NBXLiveryWorker_01"}, + {"U_M_M_NbxMusician_01"_J, "U_M_M_NbxMusician_01"}, + {"U_M_M_NbxPriest_01"_J, "U_M_M_NbxPriest_01"}, + {"U_M_M_NbxResident_01"_J, "U_M_M_NbxResident_01"}, + {"U_M_M_NbxResident_02"_J, "U_M_M_NbxResident_02"}, + {"U_M_M_NbxResident_03"_J, "U_M_M_NbxResident_03"}, + {"U_M_M_NbxResident_04"_J, "U_M_M_NbxResident_04"}, + {"U_M_M_NBXRIVERBOATPITBOSS_01"_J, "U_M_M_NBXRIVERBOATPITBOSS_01"}, + {"U_M_M_NBXRIVERBOATTARGET_01"_J, "U_M_M_NBXRIVERBOATTARGET_01"}, + {"U_M_M_NBXShadyDealer_01"_J, "U_M_M_NBXShadyDealer_01"}, + {"U_M_M_NbxSkiffDriver_01"_J, "U_M_M_NbxSkiffDriver_01"}, + {"U_M_M_ODDFELLOWPARTICIPANT_01"_J, "U_M_M_ODDFELLOWPARTICIPANT_01"}, + {"U_M_M_ODriscollBrawler_01"_J, "U_M_M_ODriscollBrawler_01"}, + {"U_M_M_ORPGUARD_01"_J, "U_M_M_ORPGUARD_01"}, + {"U_M_M_RaCForeman_01"_J, "U_M_M_RaCForeman_01"}, + {"U_M_M_RaCQuarterMaster_01"_J, "U_M_M_RaCQuarterMaster_01"}, + {"U_M_M_RhdBackupDeputy_01"_J, "U_M_M_RhdBackupDeputy_01"}, + {"U_M_M_RhdBackupDeputy_02"_J, "U_M_M_RhdBackupDeputy_02"}, + {"U_M_M_RhdBartender_01"_J, "U_M_M_RhdBartender_01"}, + {"U_M_M_RHDDOCTOR_01"_J, "U_M_M_RHDDOCTOR_01"}, + {"U_M_M_RhdFiddlePlayer_01"_J, "U_M_M_RhdFiddlePlayer_01"}, + {"U_M_M_RhdGenStoreOwner_01"_J, "U_M_M_RhdGenStoreOwner_01"}, + {"U_M_M_RhdGenStoreOwner_02"_J, "U_M_M_RhdGenStoreOwner_02"}, + {"U_M_M_RhdGunsmith_01"_J, "U_M_M_RhdGunsmith_01"}, + {"U_M_M_RhdPreacher_01"_J, "U_M_M_RhdPreacher_01"}, + {"U_M_M_RhdSheriff_01"_J, "U_M_M_RhdSheriff_01"}, + {"U_M_M_RhdTrainStationWorker_01"_J, "U_M_M_RhdTrainStationWorker_01"}, + {"U_M_M_RhdUndertaker_01"_J, "U_M_M_RhdUndertaker_01"}, + {"U_M_M_RIODONKEYRIDER_01"_J, "U_M_M_RIODONKEYRIDER_01"}, + {"U_M_M_RKFRANCHER_01"_J, "U_M_M_RKFRANCHER_01"}, + {"U_M_M_RKRDONKEYRIDER_01"_J, "U_M_M_RKRDONKEYRIDER_01"}, + {"U_M_M_RWFRANCHER_01"_J, "U_M_M_RWFRANCHER_01"}, + {"U_M_M_SDBANKGUARD_01"_J, "U_M_M_SDBANKGUARD_01"}, + {"U_M_M_SDCUSTOMVENDOR_01"_J, "U_M_M_SDCUSTOMVENDOR_01"}, + {"U_M_M_SDEXOTICSSHOPKEEPER_01"_J, "U_M_M_SDEXOTICSSHOPKEEPER_01"}, + {"U_M_M_SDPHOTOGRAPHER_01"_J, "U_M_M_SDPHOTOGRAPHER_01"}, + {"U_M_M_SDPoliceChief_01"_J, "U_M_M_SDPoliceChief_01"}, + {"U_M_M_SDSTRONGWOMANASSISTANT_01"_J, "U_M_M_SDSTRONGWOMANASSISTANT_01"}, + {"U_M_M_SDTRAPPER_01"_J, "U_M_M_SDTRAPPER_01"}, + {"U_M_M_SDWEALTHYTRAVELLER_01"_J, "U_M_M_SDWEALTHYTRAVELLER_01"}, + {"U_M_M_SHACKSERIALKILLER_01"_J, "U_M_M_SHACKSERIALKILLER_01"}, + {"U_M_M_SHACKTWIN_01"_J, "U_M_M_SHACKTWIN_01"}, + {"U_M_M_SHACKTWIN_02"_J, "U_M_M_SHACKTWIN_02"}, + {"U_M_M_SKINNYOLDGUY_01"_J, "U_M_M_SKINNYOLDGUY_01"}, + {"U_M_M_STORY_ARMADILLO_01"_J, "U_M_M_STORY_ARMADILLO_01"}, + {"U_M_M_story_CANNIBAL_01"_J, "U_M_M_story_CANNIBAL_01"}, + {"U_M_M_STORY_CHELONIAN_01"_J, "U_M_M_STORY_CHELONIAN_01"}, + {"U_M_M_story_COPPERHEAD_01"_J, "U_M_M_story_COPPERHEAD_01"}, + {"U_M_M_story_CREEPER_01"_J, "U_M_M_story_CREEPER_01"}, + {"U_M_M_STORY_EMERALDRANCH_01"_J, "U_M_M_STORY_EMERALDRANCH_01"}, + {"U_M_M_story_HUNTER_01"_J, "U_M_M_story_HUNTER_01"}, + {"U_M_M_story_MANZANITA_01"_J, "U_M_M_story_MANZANITA_01"}, + {"U_M_M_story_MURFEE_01"_J, "U_M_M_story_MURFEE_01"}, + {"U_M_M_story_PIGFARM_01"_J, "U_M_M_story_PIGFARM_01"}, + {"U_M_M_story_PRINCESS_01"_J, "U_M_M_story_PRINCESS_01"}, + {"U_M_M_story_REDHARLOW_01"_J, "U_M_M_story_REDHARLOW_01"}, + {"U_M_M_story_RHODES_01"_J, "U_M_M_story_RHODES_01"}, + {"U_M_M_STORY_SDSTATUE_01"_J, "U_M_M_STORY_SDSTATUE_01"}, + {"U_M_M_story_SPECTRE_01"_J, "U_M_M_story_SPECTRE_01"}, + {"U_M_M_story_TREASURE_01"_J, "U_M_M_story_TREASURE_01"}, + {"U_M_M_STORY_TUMBLEWEED_01"_J, "U_M_M_STORY_TUMBLEWEED_01"}, + {"U_M_M_story_VALENTINE_01"_J, "U_M_M_story_VALENTINE_01"}, + {"U_M_M_StrFreightStationOwner_01"_J, "U_M_M_StrFreightStationOwner_01"}, + {"U_M_M_StrGenStoreOwner_01"_J, "U_M_M_StrGenStoreOwner_01"}, + {"U_M_M_StrSherriff_01"_J, "U_M_M_StrSherriff_01"}, + {"U_M_M_STRWELCOMECENTER_01"_J, "U_M_M_STRWELCOMECENTER_01"}, + {"U_M_M_TumBartender_01"_J, "U_M_M_TumBartender_01"}, + {"U_M_M_TumButcher_01"_J, "U_M_M_TumButcher_01"}, + {"U_M_M_TumGunsmith_01"_J, "U_M_M_TumGunsmith_01"}, + {"U_M_M_TUMTRAINSTATIONWORKER_01"_J, "U_M_M_TUMTRAINSTATIONWORKER_01"}, + {"U_M_M_UniBountyHunter_01"_J, "U_M_M_UniBountyHunter_01"}, + {"U_M_M_UniBountyHunter_02"_J, "U_M_M_UniBountyHunter_02"}, + {"U_M_M_UNIDUSTERHENCHMAN_01"_J, "U_M_M_UNIDUSTERHENCHMAN_01"}, + {"U_M_M_UNIDUSTERHENCHMAN_02"_J, "U_M_M_UNIDUSTERHENCHMAN_02"}, + {"U_M_M_UNIDUSTERHENCHMAN_03"_J, "U_M_M_UNIDUSTERHENCHMAN_03"}, + {"U_M_M_UniDusterLeader_01"_J, "U_M_M_UniDusterLeader_01"}, + {"U_M_M_UniExConfedsBounty_01"_J, "U_M_M_UniExConfedsBounty_01"}, + {"U_M_M_UNIONLEADER_01"_J, "U_M_M_UNIONLEADER_01"}, + {"U_M_M_UNIONLEADER_02"_J, "U_M_M_UNIONLEADER_02"}, + {"U_M_M_UniPeepingTom_01"_J, "U_M_M_UniPeepingTom_01"}, + {"U_M_M_ValAuctionForman_01"_J, "U_M_M_ValAuctionForman_01"}, + {"U_M_M_ValAuctionForman_02"_J, "U_M_M_ValAuctionForman_02"}, + {"U_M_M_ValBarber_01"_J, "U_M_M_ValBarber_01"}, + {"U_M_M_ValBartender_01"_J, "U_M_M_ValBartender_01"}, + {"U_M_M_ValBearTrap_01"_J, "U_M_M_ValBearTrap_01"}, + {"U_M_M_VALBUTCHER_01"_J, "U_M_M_VALBUTCHER_01"}, + {"U_M_M_ValDoctor_01"_J, "U_M_M_ValDoctor_01"}, + {"U_M_M_ValGenStoreOwner_01"_J, "U_M_M_ValGenStoreOwner_01"}, + {"U_M_M_ValGunsmith_01"_J, "U_M_M_ValGunsmith_01"}, + {"U_M_M_ValHotelOwner_01"_J, "U_M_M_ValHotelOwner_01"}, + {"U_M_M_ValPokerPlayer_01"_J, "U_M_M_ValPokerPlayer_01"}, + {"U_M_M_ValPokerPlayer_02"_J, "U_M_M_ValPokerPlayer_02"}, + {"U_M_M_ValPoopingMan_01"_J, "U_M_M_ValPoopingMan_01"}, + {"U_M_M_ValSheriff_01"_J, "U_M_M_ValSheriff_01"}, + {"U_M_M_VALTHEMAN_01"_J, "U_M_M_VALTHEMAN_01"}, + {"U_M_M_ValTownfolk_01"_J, "U_M_M_ValTownfolk_01"}, + {"U_M_M_ValTownfolk_02"_J, "U_M_M_ValTownfolk_02"}, + {"U_M_M_VhtStationClerk_01"_J, "U_M_M_VhtStationClerk_01"}, + {"U_M_M_WaLGENERALSTOREOWNER_01"_J, "U_M_M_WaLGENERALSTOREOWNER_01"}, + {"U_M_M_WAPOFFICIAL_01"_J, "U_M_M_WAPOFFICIAL_01"}, + {"U_M_M_WtCCowboy_04"_J, "U_M_M_WtCCowboy_04"}, + {"U_M_O_ARMBARTENDER_01"_J, "U_M_O_ARMBARTENDER_01"}, + {"U_M_O_AsbSheriff_01"_J, "U_M_O_AsbSheriff_01"}, + {"U_M_O_BHT_DOCWORMWOOD"_J, "U_M_O_BHT_DOCWORMWOOD"}, + {"U_M_O_BlWBartender_01"_J, "U_M_O_BlWBartender_01"}, + {"U_M_O_BlWGeneralStoreOwner_01"_J, "U_M_O_BlWGeneralStoreOwner_01"}, + {"U_M_O_BLWPHOTOGRAPHER_01"_J, "U_M_O_BLWPHOTOGRAPHER_01"}, + {"U_M_O_BlWPoliceChief_01"_J, "U_M_O_BlWPoliceChief_01"}, + {"U_M_O_CaJHomestead_01"_J, "U_M_O_CaJHomestead_01"}, + {"U_M_O_CMRCIVILWARCOMMANDO_01"_J, "U_M_O_CMRCIVILWARCOMMANDO_01"}, + {"U_M_O_MaPWiseOldMan_01"_J, "U_M_O_MaPWiseOldMan_01"}, + {"U_M_O_OLDCAJUN_01"_J, "U_M_O_OLDCAJUN_01"}, + {"U_M_O_PSHRancher_01"_J, "U_M_O_PSHRancher_01"}, + {"U_M_O_RigTrainStationWorker_01"_J, "U_M_O_RigTrainStationWorker_01"}, + {"U_M_O_ValBartender_01"_J, "U_M_O_ValBartender_01"}, + {"U_M_O_VhTExoticShopkeeper_01"_J, "U_M_O_VhTExoticShopkeeper_01"}, + {"U_M_Y_CajHomeStead_01"_J, "U_M_Y_CajHomeStead_01"}, + {"U_M_Y_CzPHomesteadSon_01"_J, "U_M_Y_CzPHomesteadSon_01"}, + {"U_M_Y_CzPHomesteadSon_02"_J, "U_M_Y_CzPHomesteadSon_02"}, + {"U_M_Y_CzPHomesteadSon_03"_J, "U_M_Y_CzPHomesteadSon_03"}, + {"U_M_Y_CZPHOMESTEADSON_04"_J, "U_M_Y_CZPHOMESTEADSON_04"}, + {"U_M_Y_CZPHOMESTEADSON_05"_J, "U_M_Y_CZPHOMESTEADSON_05"}, + {"U_M_Y_DuelListBounty_01"_J, "U_M_Y_DuelListBounty_01"}, + {"U_M_Y_EmRSon_01"_J, "U_M_Y_EmRSon_01"}, + {"U_M_Y_HtlWorker_01"_J, "U_M_Y_HtlWorker_01"}, + {"U_M_Y_HtlWorker_02"_J, "U_M_Y_HtlWorker_02"}, + {"U_M_Y_ShackStarvingKid_01"_J, "U_M_Y_ShackStarvingKid_01"}, + {"A_C_Alligator_01"_J, "A_C_Alligator_01"}, + {"A_C_Alligator_02"_J, "A_C_Alligator_02"}, + {"A_C_Alligator_03"_J, "A_C_Alligator_03"}, + {"A_C_Armadillo_01"_J, "A_C_Armadillo_01"}, + {"A_C_Badger_01"_J, "A_C_Badger_01"}, + {"A_C_Bat_01"_J, "A_C_Bat_01"}, + {"A_C_Bear_01"_J, "A_C_Bear_01"}, + {"A_C_BearBlack_01"_J, "A_C_BearBlack_01"}, + {"A_C_Beaver_01"_J, "A_C_Beaver_01"}, + {"A_C_BigHornRam_01"_J, "A_C_BigHornRam_01"}, + {"A_C_BlueJay_01"_J, "A_C_BlueJay_01"}, + {"A_C_Boar_01"_J, "A_C_Boar_01"}, + {"A_C_BoarLegendary_01"_J, "A_C_BoarLegendary_01"}, + {"A_C_Buck_01"_J, "A_C_Buck_01"}, + {"A_C_Buffalo_01"_J, "A_C_Buffalo_01"}, + {"A_C_Buffalo_Tatanka_01"_J, "A_C_Buffalo_Tatanka_01"}, + {"A_C_Bull_01"_J, "A_C_Bull_01"}, + {"A_C_CaliforniaCondor_01"_J, "A_C_CaliforniaCondor_01"}, + {"A_C_Cardinal_01"_J, "A_C_Cardinal_01"}, + {"A_C_CarolinaParakeet_01"_J, "A_C_CarolinaParakeet_01"}, + {"A_C_Cat_01"_J, "A_C_Cat_01"}, + {"A_C_CedarWaxwing_01"_J, "A_C_CedarWaxwing_01"}, + {"A_C_Chicken_01"_J, "A_C_Chicken_01"}, + {"A_C_Chipmunk_01"_J, "A_C_Chipmunk_01"}, + {"A_C_Cormorant_01"_J, "A_C_Cormorant_01"}, + {"A_C_Cougar_01"_J, "A_C_Cougar_01"}, + {"A_C_Cow"_J, "A_C_Cow"}, + {"A_C_Coyote_01"_J, "A_C_Coyote_01"}, + {"A_C_Crab_01"_J, "A_C_Crab_01"}, + {"A_C_CraneWhooping_01"_J, "A_C_CraneWhooping_01"}, + {"A_C_Crawfish_01"_J, "A_C_Crawfish_01"}, + {"A_C_Crow_01"_J, "A_C_Crow_01"}, + {"A_C_Deer_01"_J, "A_C_Deer_01"}, + {"A_C_DogAmericanFoxhound_01"_J, "A_C_DogAmericanFoxhound_01"}, + {"A_C_DogAustralianSheperd_01"_J, "A_C_DogAustralianSheperd_01"}, + {"A_C_DogBluetickCoonhound_01"_J, "A_C_DogBluetickCoonhound_01"}, + {"A_C_DogCatahoulaCur_01"_J, "A_C_DogCatahoulaCur_01"}, + {"A_C_DogChesBayRetriever_01"_J, "A_C_DogChesBayRetriever_01"}, + {"A_C_DogCollie_01"_J, "A_C_DogCollie_01"}, + {"A_C_DogHobo_01"_J, "A_C_DogHobo_01"}, + {"A_C_DogHound_01"_J, "A_C_DogHound_01"}, + {"A_C_DogHusky_01"_J, "A_C_DogHusky_01"}, + {"A_C_DogLab_01"_J, "A_C_DogLab_01"}, + {"A_C_DogLion_01"_J, "A_C_DogLion_01"}, + {"A_C_DogPoodle_01"_J, "A_C_DogPoodle_01"}, + {"A_C_DogRufus_01"_J, "A_C_DogRufus_01"}, + {"A_C_DogStreet_01"_J, "A_C_DogStreet_01"}, + {"A_C_Donkey_01"_J, "A_C_Donkey_01"}, + {"A_C_Duck_01"_J, "A_C_Duck_01"}, + {"A_C_EAGLE_01"_J, "A_C_EAGLE_01"}, + {"A_C_Eagle_01"_J, "A_C_Eagle_01"}, + {"A_C_Egret_01"_J, "A_C_Egret_01"}, + {"A_C_Elk_01"_J, "A_C_Elk_01"}, + {"A_C_FishBluegil_01_ms"_J, "A_C_FishBluegil_01_ms"}, + {"A_C_FishBluegil_01_sm"_J, "A_C_FishBluegil_01_sm"}, + {"A_C_FishBullHeadCat_01_ms"_J, "A_C_FishBullHeadCat_01_ms"}, + {"A_C_FishBullHeadCat_01_sm"_J, "A_C_FishBullHeadCat_01_sm"}, + {"A_C_FishChainPickerel_01_ms"_J, "A_C_FishChainPickerel_01_ms"}, + {"A_C_FishChainPickerel_01_sm"_J, "A_C_FishChainPickerel_01_sm"}, + {"A_C_FishChannelCatfish_01_lg"_J, "A_C_FishChannelCatfish_01_lg"}, + {"A_C_FishChannelCatfish_01_XL"_J, "A_C_FishChannelCatfish_01_XL"}, + {"A_C_FishLakeSturgeon_01_lg"_J, "A_C_FishLakeSturgeon_01_lg"}, + {"A_C_FishLargeMouthBass_01_lg"_J, "A_C_FishLargeMouthBass_01_lg"}, + {"A_C_FishLargeMouthBass_01_ms"_J, "A_C_FishLargeMouthBass_01_ms"}, + {"A_C_FishLongNoseGar_01_lg"_J, "A_C_FishLongNoseGar_01_lg"}, + {"A_C_FishMuskie_01_lg"_J, "A_C_FishMuskie_01_lg"}, + {"A_C_FishNorthernPike_01_lg"_J, "A_C_FishNorthernPike_01_lg"}, + {"A_C_FishPerch_01_ms"_J, "A_C_FishPerch_01_ms"}, + {"A_C_FishPerch_01_sm"_J, "A_C_FishPerch_01_sm"}, + {"A_C_FishRainbowTrout_01_lg"_J, "A_C_FishRainbowTrout_01_lg"}, + {"A_C_FishRainbowTrout_01_ms"_J, "A_C_FishRainbowTrout_01_ms"}, + {"A_C_FishRedfinPickerel_01_ms"_J, "A_C_FishRedfinPickerel_01_ms"}, + {"A_C_FishRedfinPickerel_01_sm"_J, "A_C_FishRedfinPickerel_01_sm"}, + {"A_C_FishRockBass_01_ms"_J, "A_C_FishRockBass_01_ms"}, + {"A_C_FishRockBass_01_sm"_J, "A_C_FishRockBass_01_sm"}, + {"A_C_FishSalmonSockeye_01_lg"_J, "A_C_FishSalmonSockeye_01_lg"}, + {"A_C_FishSalmonSockeye_01_ml"_J, "A_C_FishSalmonSockeye_01_ml"}, + {"A_C_FishSalmonSockeye_01_ms"_J, "A_C_FishSalmonSockeye_01_ms"}, + {"A_C_FishSmallMouthBass_01_lg"_J, "A_C_FishSmallMouthBass_01_lg"}, + {"A_C_FishSmallMouthBass_01_ms"_J, "A_C_FishSmallMouthBass_01_ms"}, + {"A_C_Fox_01"_J, "A_C_Fox_01"}, + {"A_C_FrogBull_01"_J, "A_C_FrogBull_01"}, + {"A_C_GilaMonster_01"_J, "A_C_GilaMonster_01"}, + {"A_C_Goat_01"_J, "A_C_Goat_01"}, + {"A_C_GooseCanada_01"_J, "A_C_GooseCanada_01"}, + {"A_C_Hawk_01"_J, "A_C_Hawk_01"}, + {"A_C_Heron_01"_J, "A_C_Heron_01"}, + {"A_C_Horse_AmericanPaint_Greyovero"_J, "A_C_Horse_AmericanPaint_Greyovero"}, + {"A_C_Horse_AmericanPaint_Overo"_J, "A_C_Horse_AmericanPaint_Overo"}, + {"A_C_Horse_AmericanPaint_SplashedWhite"_J, "A_C_Horse_AmericanPaint_SplashedWhite"}, + {"A_C_Horse_AmericanPaint_Tobiano"_J, "A_C_Horse_AmericanPaint_Tobiano"}, + {"A_C_Horse_AmericanStandardbred_Black"_J, "A_C_Horse_AmericanStandardbred_Black"}, + {"A_C_Horse_AmericanStandardbred_Buckskin"_J, "A_C_Horse_AmericanStandardbred_Buckskin"}, + {"A_C_Horse_AmericanStandardbred_Lightbuckskin"_J, "A_C_Horse_AmericanStandardbred_Lightbuckskin"}, + {"A_C_Horse_AmericanStandardbred_PalominoDapple"_J, "A_C_Horse_AmericanStandardbred_PalominoDapple"}, + {"A_C_Horse_AmericanStandardbred_SilverTailBuckskin"_J, "A_C_Horse_AmericanStandardbred_SilverTailBuckskin"}, + {"A_C_Horse_Andalusian_DarkBay"_J, "A_C_Horse_Andalusian_DarkBay"}, + {"A_C_Horse_Andalusian_Perlino"_J, "A_C_Horse_Andalusian_Perlino"}, + {"A_C_Horse_Andalusian_Perlino"_J, "A_C_Horse_Andalusian_Perlino"}, + {"A_C_Horse_Andalusian_RoseGray"_J, "A_C_Horse_Andalusian_RoseGray"}, + {"A_C_Horse_Appaloosa_BlackSnowflake"_J, "A_C_Horse_Appaloosa_BlackSnowflake"}, + {"A_C_Horse_Appaloosa_Blanket"_J, "A_C_Horse_Appaloosa_Blanket"}, + {"A_C_Horse_Appaloosa_BrownLeopard"_J, "A_C_Horse_Appaloosa_BrownLeopard"}, + {"A_C_Horse_Appaloosa_FewSpotted_PC"_J, "A_C_Horse_Appaloosa_FewSpotted_PC"}, + {"A_C_Horse_Appaloosa_Leopard"_J, "A_C_Horse_Appaloosa_Leopard"}, + {"A_C_Horse_Appaloosa_LeopardBlanket"_J, "A_C_Horse_Appaloosa_LeopardBlanket"}, + {"A_C_Horse_Arabian_Black"_J, "A_C_Horse_Arabian_Black"}, + {"A_C_Horse_Arabian_Grey"_J, "A_C_Horse_Arabian_Grey"}, + {"A_C_Horse_Arabian_RedChestnut"_J, "A_C_Horse_Arabian_RedChestnut"}, + {"A_C_Horse_Arabian_RedChestnut_PC"_J, "A_C_Horse_Arabian_RedChestnut_PC"}, + {"A_C_Horse_Arabian_RoseGreyBay"_J, "A_C_Horse_Arabian_RoseGreyBay"}, + {"A_C_Horse_Arabian_WarpedBrindle_PC"_J, "A_C_Horse_Arabian_WarpedBrindle_PC"}, + {"A_C_Horse_Arabian_White"_J, "A_C_Horse_Arabian_White"}, + {"A_C_Horse_Ardennes_BayRoan"_J, "A_C_Horse_Ardennes_BayRoan"}, + {"A_C_Horse_Ardennes_IronGreyRoan"_J, "A_C_Horse_Ardennes_IronGreyRoan"}, + {"A_C_Horse_Ardennes_StrawberryRoan"_J, "A_C_Horse_Ardennes_StrawberryRoan"}, + {"A_C_Horse_Belgian_BlondChestnut"_J, "A_C_Horse_Belgian_BlondChestnut"}, + {"A_C_Horse_Belgian_MealyChestnut"_J, "A_C_Horse_Belgian_MealyChestnut"}, + {"A_C_Horse_Breton_GrulloDun"_J, "A_C_Horse_Breton_GrulloDun"}, + {"A_C_Horse_Breton_MealyDappleBay"_J, "A_C_Horse_Breton_MealyDappleBay"}, + {"A_C_Horse_Breton_RedRoan"_J, "A_C_Horse_Breton_RedRoan"}, + {"A_C_Horse_Breton_Sealbrown"_J, "A_C_Horse_Breton_Sealbrown"}, + {"A_C_Horse_Breton_Sorrel"_J, "A_C_Horse_Breton_Sorrel"}, + {"A_C_Horse_Breton_SteelGrey"_J, "A_C_Horse_Breton_SteelGrey"}, + {"A_C_Horse_Buell_WarVets"_J, "A_C_Horse_Buell_WarVets"}, + {"A_C_Horse_Criollo_Baybrindle"_J, "A_C_Horse_Criollo_Baybrindle"}, + {"A_C_Horse_Criollo_Bayframeovero"_J, "A_C_Horse_Criollo_Bayframeovero"}, + {"A_C_Horse_Criollo_Blueroanovero"_J, "A_C_Horse_Criollo_Blueroanovero"}, + {"A_C_Horse_Criollo_Dun"_J, "A_C_Horse_Criollo_Dun"}, + {"A_C_Horse_Criollo_Marblesabino"_J, "A_C_Horse_Criollo_Marblesabino"}, + {"A_C_Horse_Criollo_Sorrelovero"_J, "A_C_Horse_Criollo_Sorrelovero"}, + {"A_C_Horse_DutchWarmblood_ChocolateRoan"_J, "A_C_Horse_DutchWarmblood_ChocolateRoan"}, + {"A_C_Horse_DutchWarmblood_SealBrown"_J, "A_C_Horse_DutchWarmblood_SealBrown"}, + {"A_C_Horse_DutchWarmblood_SootyBuckskin"_J, "A_C_Horse_DutchWarmblood_SootyBuckskin"}, + {"A_C_Horse_EagleFlies"_J, "A_C_Horse_EagleFlies"}, + {"A_C_Horse_Gang_arthur"_J, "A_C_Horse_Gang_arthur"}, + {"A_C_Horse_Gang_Bill"_J, "A_C_Horse_Gang_Bill"}, + {"A_C_Horse_Gang_Charles"_J, "A_C_Horse_Gang_Charles"}, + {"A_C_Horse_Gang_Charles_EndlessSummer"_J, "A_C_Horse_Gang_Charles_EndlessSummer"}, + {"A_C_Horse_Gang_Hosea"_J, "A_C_Horse_Gang_Hosea"}, + {"A_C_Horse_Gang_Javier"_J, "A_C_Horse_Gang_Javier"}, + {"A_C_Horse_Gang_John"_J, "A_C_Horse_Gang_John"}, + {"A_C_Horse_Gang_Karen"_J, "A_C_Horse_Gang_Karen"}, + {"A_C_Horse_Gang_Kieran"_J, "A_C_Horse_Gang_Kieran"}, + {"A_C_Horse_Gang_Micah"_J, "A_C_Horse_Gang_Micah"}, + {"A_C_Horse_Gang_Sadie"_J, "A_C_Horse_Gang_Sadie"}, + {"A_C_Horse_Gang_Sean"_J, "A_C_Horse_Gang_Sean"}, + {"A_C_Horse_Gang_Trelawney"_J, "A_C_Horse_Gang_Trelawney"}, + {"A_C_Horse_Gang_Uncle"_J, "A_C_Horse_Gang_Uncle"}, + {"A_C_Horse_Gang_Uncle_EndlessSummer"_J, "A_C_Horse_Gang_Uncle_EndlessSummer"}, + {"A_C_Horse_GypsyCob_PalominoBlagdon"_J, "A_C_Horse_GypsyCob_PalominoBlagdon"}, + {"A_C_Horse_GypsyCob_Piebald"_J, "A_C_Horse_GypsyCob_Piebald"}, + {"A_C_Horse_GypsyCob_Skewbald"_J, "A_C_Horse_GypsyCob_Skewbald"}, + {"A_C_Horse_GypsyCob_SplashedBay"_J, "A_C_Horse_GypsyCob_SplashedBay"}, + {"A_C_Horse_GypsyCob_SplashedPiebald"_J, "A_C_Horse_GypsyCob_SplashedPiebald"}, + {"A_C_Horse_GypsyCob_WhiteBlagdon"_J, "A_C_Horse_GypsyCob_WhiteBlagdon"}, + {"A_C_Horse_HungarianHalfbred_DarkDappleGrey"_J, "A_C_Horse_HungarianHalfbred_DarkDappleGrey"}, + {"A_C_Horse_HungarianHalfbred_FlaxenChestnut"_J, "A_C_Horse_HungarianHalfbred_FlaxenChestnut"}, + {"A_C_Horse_HungarianHalfbred_LiverChestnut"_J, "A_C_Horse_HungarianHalfbred_LiverChestnut"}, + {"A_C_Horse_HungarianHalfbred_PiebaldTobiano"_J, "A_C_Horse_HungarianHalfbred_PiebaldTobiano"}, + {"A_C_Horse_John_EndlessSummer"_J, "A_C_Horse_John_EndlessSummer"}, + {"A_C_Horse_KentuckySaddle_Black"_J, "A_C_Horse_KentuckySaddle_Black"}, + {"A_C_Horse_KentuckySaddle_ButterMilkBuckskin_PC"_J, "A_C_Horse_KentuckySaddle_ButterMilkBuckskin_PC"}, + {"A_C_Horse_KentuckySaddle_ChestnutPinto"_J, "A_C_Horse_KentuckySaddle_ChestnutPinto"}, + {"A_C_Horse_KentuckySaddle_Grey"_J, "A_C_Horse_KentuckySaddle_Grey"}, + {"A_C_Horse_KentuckySaddle_SilverBay"_J, "A_C_Horse_KentuckySaddle_SilverBay"}, + {"A_C_Horse_Kladruber_Black"_J, "A_C_Horse_Kladruber_Black"}, + {"A_C_Horse_Kladruber_Cremello"_J, "A_C_Horse_Kladruber_Cremello"}, + {"A_C_Horse_Kladruber_Dapplerosegrey"_J, "A_C_Horse_Kladruber_Dapplerosegrey"}, + {"A_C_Horse_Kladruber_Grey"_J, "A_C_Horse_Kladruber_Grey"}, + {"A_C_Horse_Kladruber_Silver"_J, "A_C_Horse_Kladruber_Silver"}, + {"A_C_Horse_Kladruber_White"_J, "A_C_Horse_Kladruber_White"}, + {"A_C_Horse_MissouriFoxTrotter_AmberChampagne"_J, "A_C_Horse_MissouriFoxTrotter_AmberChampagne"}, + {"A_C_Horse_MissouriFoxTrotter_Blacktovero"_J, "A_C_Horse_MissouriFoxTrotter_Blacktovero"}, + {"A_C_HORSE_MISSOURIFOXTROTTER_BLUEROAN"_J, "A_C_HORSE_MISSOURIFOXTROTTER_BLUEROAN"}, + {"A_C_Horse_MissouriFoxTrotter_Buckskinbrindle"_J, "A_C_Horse_MissouriFoxTrotter_Buckskinbrindle"}, + {"A_C_HORSE_MISSOURIFOXTROTTER_DAPPLEGREY"_J, "A_C_HORSE_MISSOURIFOXTROTTER_DAPPLEGREY"}, + {"A_C_Horse_MissouriFoxTrotter_SableChampagne"_J, "A_C_Horse_MissouriFoxTrotter_SableChampagne"}, + {"A_C_Horse_MissouriFoxTrotter_SilverDapplePinto"_J, "A_C_Horse_MissouriFoxTrotter_SilverDapplePinto"}, + {"A_C_Horse_Morgan_Bay"_J, "A_C_Horse_Morgan_Bay"}, + {"A_C_Horse_Morgan_BayRoan"_J, "A_C_Horse_Morgan_BayRoan"}, + {"A_C_Horse_Morgan_FlaxenChestnut"_J, "A_C_Horse_Morgan_FlaxenChestnut"}, + {"A_C_Horse_Morgan_LiverChestnut_PC"_J, "A_C_Horse_Morgan_LiverChestnut_PC"}, + {"A_C_Horse_Morgan_Palomino"_J, "A_C_Horse_Morgan_Palomino"}, + {"A_C_Horse_MP_Mangy_Backup"_J, "A_C_Horse_MP_Mangy_Backup"}, + {"A_C_Horse_MurfreeBrood_Mange_01"_J, "A_C_Horse_MurfreeBrood_Mange_01"}, + {"A_C_Horse_MurfreeBrood_Mange_02"_J, "A_C_Horse_MurfreeBrood_Mange_02"}, + {"A_C_Horse_MurfreeBrood_Mange_03"_J, "A_C_Horse_MurfreeBrood_Mange_03"}, + {"A_C_HORSE_MUSTANG_BLACKOVERO"_J, "A_C_HORSE_MUSTANG_BLACKOVERO"}, + {"A_C_HORSE_MUSTANG_BUCKSKIN"_J, "A_C_HORSE_MUSTANG_BUCKSKIN"}, + {"A_C_HORSE_MUSTANG_CHESTNUTTOVERO"_J, "A_C_HORSE_MUSTANG_CHESTNUTTOVERO"}, + {"A_C_Horse_Mustang_GoldenDun"_J, "A_C_Horse_Mustang_GoldenDun"}, + {"A_C_Horse_Mustang_GrulloDun"_J, "A_C_Horse_Mustang_GrulloDun"}, + {"A_C_HORSE_MUSTANG_REDDUNOVERO"_J, "A_C_HORSE_MUSTANG_REDDUNOVERO"}, + {"A_C_Horse_Mustang_TigerStripedBay"_J, "A_C_Horse_Mustang_TigerStripedBay"}, + {"A_C_Horse_Mustang_WildBay"_J, "A_C_Horse_Mustang_WildBay"}, + {"A_C_Horse_Nokota_BlueRoan"_J, "A_C_Horse_Nokota_BlueRoan"}, + {"A_C_Horse_Nokota_ReverseDappleRoan"_J, "A_C_Horse_Nokota_ReverseDappleRoan"}, + {"A_C_Horse_Nokota_WhiteRoan"_J, "A_C_Horse_Nokota_WhiteRoan"}, + {"A_C_Horse_NorfolkRoadster_Black"_J, "A_C_Horse_NorfolkRoadster_Black"}, + {"A_C_Horse_NorfolkRoadster_DappledBuckskin"_J, "A_C_Horse_NorfolkRoadster_DappledBuckskin"}, + {"A_C_Horse_NorfolkRoadster_PiebaldRoan"_J, "A_C_Horse_NorfolkRoadster_PiebaldRoan"}, + {"A_C_Horse_NorfolkRoadster_RoseGrey"_J, "A_C_Horse_NorfolkRoadster_RoseGrey"}, + {"A_C_Horse_NorfolkRoadster_SpeckledGrey"_J, "A_C_Horse_NorfolkRoadster_SpeckledGrey"}, + {"A_C_Horse_NorfolkRoadster_SpottedTricolor"_J, "A_C_Horse_NorfolkRoadster_SpottedTricolor"}, + {"A_C_Horse_Shire_DarkBay"_J, "A_C_Horse_Shire_DarkBay"}, + {"A_C_Horse_Shire_LightGrey"_J, "A_C_Horse_Shire_LightGrey"}, + {"A_C_Horse_Shire_RavenBlack"_J, "A_C_Horse_Shire_RavenBlack"}, + {"A_C_Horse_SuffolkPunch_RedChestnut"_J, "A_C_Horse_SuffolkPunch_RedChestnut"}, + {"A_C_Horse_SuffolkPunch_Sorrel"_J, "A_C_Horse_SuffolkPunch_Sorrel"}, + {"A_C_Horse_TennesseeWalker_BlackRabicano"_J, "A_C_Horse_TennesseeWalker_BlackRabicano"}, + {"A_C_Horse_TennesseeWalker_Chestnut"_J, "A_C_Horse_TennesseeWalker_Chestnut"}, + {"A_C_Horse_TennesseeWalker_DappleBay"_J, "A_C_Horse_TennesseeWalker_DappleBay"}, + {"A_C_Horse_TennesseeWalker_FlaxenRoan"_J, "A_C_Horse_TennesseeWalker_FlaxenRoan"}, + {"A_C_Horse_TennesseeWalker_GoldPalomino_PC"_J, "A_C_Horse_TennesseeWalker_GoldPalomino_PC"}, + {"A_C_Horse_TennesseeWalker_MahoganyBay"_J, "A_C_Horse_TennesseeWalker_MahoganyBay"}, + {"A_C_Horse_TennesseeWalker_RedRoan"_J, "A_C_Horse_TennesseeWalker_RedRoan"}, + {"A_C_Horse_Thoroughbred_BlackChestnut"_J, "A_C_Horse_Thoroughbred_BlackChestnut"}, + {"A_C_Horse_Thoroughbred_BloodBay"_J, "A_C_Horse_Thoroughbred_BloodBay"}, + {"A_C_Horse_Thoroughbred_Brindle"_J, "A_C_Horse_Thoroughbred_Brindle"}, + {"A_C_Horse_Thoroughbred_DappleGrey"_J, "A_C_Horse_Thoroughbred_DappleGrey"}, + {"A_C_Horse_Thoroughbred_ReverseDappleBlack"_J, "A_C_Horse_Thoroughbred_ReverseDappleBlack"}, + {"A_C_HORSE_TURKOMAN_BLACK"_J, "A_C_HORSE_TURKOMAN_BLACK"}, + {"A_C_HORSE_TURKOMAN_CHESTNUT"_J, "A_C_HORSE_TURKOMAN_CHESTNUT"}, + {"A_C_Horse_Turkoman_DarkBay"_J, "A_C_Horse_Turkoman_DarkBay"}, + {"A_C_Horse_Turkoman_Gold"_J, "A_C_Horse_Turkoman_Gold"}, + {"A_C_HORSE_TURKOMAN_GREY"_J, "A_C_HORSE_TURKOMAN_GREY"}, + {"A_C_HORSE_TURKOMAN_PERLINO"_J, "A_C_HORSE_TURKOMAN_PERLINO"}, + {"A_C_Horse_Turkoman_Silver"_J, "A_C_Horse_Turkoman_Silver"}, + {"A_C_Horse_Winter02_01"_J, "A_C_Horse_Winter02_01"}, + {"A_C_HorseMule_01"_J, "A_C_HorseMule_01"}, + {"A_C_HorseMulePainted_01"_J, "A_C_HorseMulePainted_01"}, + {"A_C_Iguana_01"_J, "A_C_Iguana_01"}, + {"A_C_IguanaDesert_01"_J, "A_C_IguanaDesert_01"}, + {"A_C_Javelina_01"_J, "A_C_Javelina_01"}, + {"A_C_LionMangy_01"_J, "A_C_LionMangy_01"}, + {"A_C_Loon_01"_J, "A_C_Loon_01"}, + {"A_C_Moose_01"_J, "A_C_Moose_01"}, + {"A_C_Muskrat_01"_J, "A_C_Muskrat_01"}, + {"A_C_Oriole_01"_J, "A_C_Oriole_01"}, + {"A_C_Owl_01"_J, "A_C_Owl_01"}, + {"A_C_Ox_01"_J, "A_C_Ox_01"}, + {"A_C_Panther_01"_J, "A_C_Panther_01"}, + {"A_C_PantherLegendaryr_01"_J, "A_C_PantherLegendaryr_01"}, + {"A_C_Parrot_01"_J, "A_C_Parrot_01"}, + {"A_C_Pelican_01"_J, "A_C_Pelican_01"}, + {"A_C_Pheasant_01"_J, "A_C_Pheasant_01"}, + {"A_C_Pig_01"_J, "A_C_Pig_01"}, + {"A_C_Pigeon"_J, "A_C_Pigeon"}, + {"A_C_Possum_01"_J, "A_C_Possum_01"}, + {"A_C_PrairieChicken_01"_J, "A_C_PrairieChicken_01"}, + {"A_C_Pronghorn_01"_J, "A_C_Pronghorn_01"}, + {"A_C_Quail_01"_J, "A_C_Quail_01"}, + {"A_C_Rabbit_01"_J, "A_C_Rabbit_01"}, + {"A_C_Raccoon_01"_J, "A_C_Raccoon_01"}, + {"A_C_Rat_01"_J, "A_C_Rat_01"}, + {"A_C_Raven_01"_J, "A_C_Raven_01"}, + {"A_C_RedFootedBooby_01"_J, "A_C_RedFootedBooby_01"}, + {"A_C_Robin_01"_J, "A_C_Robin_01"}, + {"A_C_Rooster_01"_J, "A_C_Rooster_01"}, + {"A_C_RoseateSpoonbill_01"_J, "A_C_RoseateSpoonbill_01"}, + {"A_C_Seagull_01"_J, "A_C_Seagull_01"}, + {"A_C_SharkHammerhead_01"_J, "A_C_SharkHammerhead_01"}, + {"A_C_SharkTiger"_J, "A_C_SharkTiger"}, + {"A_C_Sheep_01"_J, "A_C_Sheep_01"}, + {"A_C_Skunk_01"_J, "A_C_Skunk_01"}, + {"A_C_Snake_01"_J, "A_C_Snake_01"}, + {"A_C_Snake_Pelt_01"_J, "A_C_Snake_Pelt_01"}, + {"A_C_SnakeBlackTailRattle_01"_J, "A_C_SnakeBlackTailRattle_01"}, + {"A_C_SnakeBlackTailRattle_Pelt_01"_J, "A_C_SnakeBlackTailRattle_Pelt_01"}, + {"A_C_SnakeFerDeLance_01"_J, "A_C_SnakeFerDeLance_01"}, + {"A_C_SnakeFerDeLance_Pelt_01"_J, "A_C_SnakeFerDeLance_Pelt_01"}, + {"A_C_SnakeRedBoa_01"_J, "A_C_SnakeRedBoa_01"}, + {"A_C_SnakeRedBoa_Pelt_01"_J, "A_C_SnakeRedBoa_Pelt_01"}, + {"A_C_SnakeRedBoa10ft_01"_J, "A_C_SnakeRedBoa10ft_01"}, + {"A_C_SnakeWater_01"_J, "A_C_SnakeWater_01"}, + {"A_C_SnakeWater_Pelt_01"_J, "A_C_SnakeWater_Pelt_01"}, + {"A_C_SongBird_01"_J, "A_C_SongBird_01"}, + {"A_C_Sparrow_01"_J, "A_C_Sparrow_01"}, + {"A_C_Spot_Gang_Charles"_J, "A_C_Spot_Gang_Charles"}, + {"A_C_Squirrel_01"_J, "A_C_Squirrel_01"}, + {"A_C_Toad_01"_J, "A_C_Toad_01"}, + {"A_C_Turkey_01"_J, "A_C_Turkey_01"}, + {"A_C_Turkey_02"_J, "A_C_Turkey_02"}, + {"A_C_TurkeyWild_01"_J, "A_C_TurkeyWild_01"}, + {"A_C_TurtleSea_01"_J, "A_C_TurtleSea_01"}, + {"A_C_TurtleSnapping_01"_J, "A_C_TurtleSnapping_01"}, + {"A_C_Vulture_01"_J, "A_C_Vulture_01"}, + {"A_C_Wolf"_J, "A_C_Wolf"}, + {"A_C_Wolf_Medium"_J, "A_C_Wolf_Medium"}, + {"A_C_Wolf_Small"_J, "A_C_Wolf_Small"}, + {"A_C_Woodpecker_01"_J, "A_C_Woodpecker_01"}, + {"A_C_Woodpecker_02"_J, "A_C_Woodpecker_02"}, + {"armadillo"_J, "armadillo"}, + {"ggrcez"_J, "ggrcez"}, + {"LegendaryPanther"_J, "LegendaryPanther"}, + {"MP_A_C_Alligator_01"_J, "MP_A_C_Alligator_01"}, + {"MP_A_C_Beaver_01"_J, "MP_A_C_Beaver_01"}, + {"MP_A_C_BIGHORNRAM_01"_J, "MP_A_C_BIGHORNRAM_01"}, + {"MP_A_C_Boar_01"_J, "MP_A_C_Boar_01"}, + {"MP_A_C_BUCK_01"_J, "MP_A_C_BUCK_01"}, + {"MP_A_C_BUFFALO_01"_J, "MP_A_C_BUFFALO_01"}, + {"MP_A_C_Cougar_01"_J, "MP_A_C_Cougar_01"}, + {"MP_A_C_Coyote_01"_J, "MP_A_C_Coyote_01"}, + {"MP_A_C_DEER"_J, "MP_A_C_DEER"}, + {"MP_A_C_DOGAMERICANFOXHOUND_01"_J, "MP_A_C_DOGAMERICANFOXHOUND_01"}, + {"MP_A_C_ELK_01"_J, "MP_A_C_ELK_01"}, + {"MP_A_C_FOX_01"_J, "MP_A_C_FOX_01"}, + {"MP_A_C_HORSECORPSE_01"_J, "MP_A_C_HORSECORPSE_01"}, + {"MP_A_C_MOOSE_01"_J, "MP_A_C_MOOSE_01"}, + {"MP_A_C_OWL_01"_J, "MP_A_C_OWL_01"}, + {"MP_A_C_Panther_01"_J, "MP_A_C_Panther_01"}, + {"MP_A_C_POSSUM_01"_J, "MP_A_C_POSSUM_01"}, + {"MP_A_C_PRONGHORN_01"_J, "MP_A_C_PRONGHORN_01"}, + {"MP_A_C_RABBIT_01"_J, "MP_A_C_RABBIT_01"}, + {"MP_A_C_RAM_01"_J, "MP_A_C_RAM_01"}, + {"MP_A_C_SHEEP_01"_J, "MP_A_C_SHEEP_01"}, + {"MP_A_C_Wolf_01"_J, "MP_A_C_Wolf_01"}, + {"MP_Horse_Owlhootvictim_01"_J, "MP_Horse_Owlhootvictim_01"}, + {"MP_U_M_M_LEGENDARYBOUNTY_09"_J, "MP_U_M_M_LEGENDARYBOUNTY_09"}, + {"P_C_Horse_01"_J, "P_C_Horse_01"}, + {"U_F_M_RhdNudeWoman_01"_J, "U_F_M_RhdNudeWoman_01"}, }; - - const PedModelInfo g_PedModels[]{{"A_C_Cougar_03", "unknown"}, {"A_C_Horse_Gang_Lenny", "unknown"}, {"A_C_Horse_Gang_Sadie_EndlessSummer", "Female"}, {"A_F_M_ARMCHOLERACORPSE_01", "Female"}, {"A_F_M_ARMTOWNFOLK_01", "Female"}, {"A_F_M_ArmTownfolk_02", "Female"}, {"A_F_M_AsbTownfolk_01", "Female"}, {"A_F_M_BiVFancyTravellers_01", "Female"}, {"A_F_M_BlWTownfolk_01", "Female"}, {"A_F_M_BlWTownfolk_02", "Female"}, {"A_F_M_BlWUpperClass_01", "Female"}, {"A_F_M_BtcHillbilly_01", "Female"}, {"A_F_M_BTCObeseWomen_01", "Female"}, {"A_F_M_BynFancyTravellers_01", "Female"}, {"A_F_M_FAMILYTRAVELERS_COOL_01", "Female"}, {"A_F_M_FAMILYTRAVELERS_WARM_01", "Female"}, {"A_F_M_GaMHighSociety_01", "Female"}, {"A_F_M_GriFancyTravellers_01", "Female"}, {"A_F_M_GuaTownfolk_01", "Female"}, {"A_F_M_HtlFancyTravellers_01", "Female"}, {"A_F_M_LagTownfolk_01", "Female"}, {"A_F_M_LowerSDTownfolk_01", "Female"}, {"A_F_M_LowerSDTownfolk_02", "Female"}, {"A_F_M_LowerSDTownfolk_03", "Female"}, {"A_F_M_LOWERTRAINPASSENGERS_01", "Female"}, {"A_F_M_MiddleSDTownfolk_01", "Female"}, {"A_F_M_MiddleSDTownfolk_02", "Female"}, {"A_F_M_MiddleSDTownfolk_03", "Female"}, {"A_F_M_MIDDLETRAINPASSENGERS_01", "Female"}, {"A_F_M_NbxSlums_01", "Female"}, {"A_F_M_NbxUpperClass_01", "Female"}, {"A_F_M_NbxWhore_01", "Female"}, {"A_F_M_RhdProstitute_01", "Female"}, {"A_F_M_RhdTownfolk_01", "Female"}, {"A_F_M_RhdTownfolk_02", "Female"}, {"A_F_M_RhdUpperClass_01", "Female"}, {"A_F_M_RkrFancyTravellers_01", "Female"}, {"A_F_M_ROUGHTRAVELLERS_01", "Female"}, {"A_F_M_SclFancyTravellers_01", "Female"}, {"A_F_M_SDChinatown_01", "Female"}, {"A_F_M_SDFancyWhore_01", "Female"}, {"A_F_M_SDObeseWomen_01", "Female"}, {"A_F_M_SDSERVERSFORMAL_01", "Female"}, {"A_F_M_SDSlums_02", "Female"}, {"A_F_M_SKPPRISONONLINE_01", "Female"}, {"A_F_M_StrTownfolk_01", "Female"}, {"A_F_M_TumTownfolk_01", "Female"}, {"A_F_M_TumTownfolk_02", "Female"}, {"A_F_M_UniCorpse_01", "Female"}, {"A_F_M_UPPERTRAINPASSENGERS_01", "Female"}, {"A_F_M_ValProstitute_01", "Female"}, {"A_F_M_ValTownfolk_01", "Female"}, {"A_F_M_VhtProstitute_01", "Female"}, {"A_F_M_VhtTownfolk_01", "Female"}, {"A_F_M_WapTownfolk_01", "Female"}, {"A_F_O_BlWUpperClass_01", "Female"}, {"A_F_O_BtcHillbilly_01", "Female"}, {"A_F_O_GuaTownfolk_01", "Female"}, {"A_F_O_LagTownfolk_01", "Female"}, {"A_F_O_SDChinatown_01", "Female"}, {"A_F_O_SDUpperClass_01", "Female"}, {"A_F_O_WAPTOWNFOLK_01", "Female"}, {"A_M_M_ARMCHOLERACORPSE_01", "Male"}, {"A_M_M_ARMDEPUTYRESIDENT_01", "Male"}, {"A_M_M_ARMTOWNFOLK_01", "Male"}, {"A_M_M_armTOWNFOLK_02", "Male"}, {"A_M_M_ASBBOATCREW_01", "Male"}, {"A_M_M_ASBDEPUTYRESIDENT_01", "Male"}, {"A_M_M_AsbMiner_01", "Male"}, {"A_M_M_ASBMINER_02", "Male"}, {"A_M_M_ASBMINER_03", "Male"}, {"A_M_M_asbminer_04", "Male"}, {"A_M_M_AsbTownfolk_01", "Male"}, {"A_M_M_ASBTOWNFOLK_01_LABORER", "Male"}, {"A_M_M_BiVFancyDRIVERS_01", "Male"}, {"A_M_M_BiVFancyTravellers_01", "Male"}, {"A_M_M_BiVRoughTravellers_01", "Male"}, {"A_M_M_BiVWorker_01", "Male"}, {"A_M_M_BlWForeman_01", "Male"}, {"A_M_M_BlWLaborer_01", "Male"}, {"A_M_M_BlWLaborer_02", "Male"}, {"A_M_M_BLWObeseMen_01", "Male"}, {"A_M_M_BlWTownfolk_01", "Male"}, {"A_M_M_BlWUpperClass_01", "Male"}, {"A_M_M_BtcHillbilly_01", "Male"}, {"A_M_M_BTCObeseMen_01", "Male"}, {"A_M_M_BynFancyDRIVERS_01", "Male"}, {"A_M_M_BynFancyTravellers_01", "Male"}, {"A_M_M_BynRoughTravellers_01", "Male"}, {"A_M_M_BynSurvivalist_01", "Male"}, {"A_M_M_CARDGAMEPLAYERS_01", "Male"}, {"A_M_M_CHELONIAN_01", "Male"}, {"A_M_M_DELIVERYTRAVELERS_COOL_01", "Male"}, {"A_M_M_deliverytravelers_warm_01", "Male"}, {"A_M_M_DOMINOESPLAYERS_01", "Male"}, {"A_M_M_EmRFarmHand_01", "Male"}, {"A_M_M_FAMILYTRAVELERS_COOL_01", "Male"}, {"A_M_M_FAMILYTRAVELERS_WARM_01", "Male"}, {"A_M_M_FARMTRAVELERS_COOL_01", "Male"}, {"A_M_M_FARMTRAVELERS_WARM_01", "Male"}, {"A_M_M_FiveFingerFilletPlayers_01", "Male"}, {"A_M_M_FOREMAN", "Male"}, {"A_M_M_GaMHighSociety_01", "Male"}, {"A_M_M_GRIFANCYDRIVERS_01", "Male"}, {"A_M_M_GriFancyTravellers_01", "Male"}, {"A_M_M_GriRoughTravellers_01", "Male"}, {"A_M_M_GriSurvivalist_01", "Male"}, {"A_M_M_GuaTownfolk_01", "Male"}, {"A_M_M_HtlFancyDRIVERS_01", "Male"}, {"A_M_M_HtlFancyTravellers_01", "Male"}, {"A_M_M_HtlRoughTravellers_01", "Male"}, {"A_M_M_HtlSurvivalist_01", "Male"}, {"A_M_M_huntertravelers_cool_01", "Male"}, {"A_M_M_HUNTERTRAVELERS_WARM_01", "Male"}, {"A_M_M_JamesonGuard_01", "Male"}, {"A_M_M_LagTownfolk_01", "Male"}, {"A_M_M_LowerSDTownfolk_01", "Male"}, {"A_M_M_LowerSDTownfolk_02", "Male"}, {"A_M_M_LOWERTRAINPASSENGERS_01", "Male"}, {"A_M_M_MiddleSDTownfolk_01", "Male"}, {"A_M_M_MiddleSDTownfolk_02", "Male"}, {"A_M_M_MiddleSDTownfolk_03", "Male"}, {"A_M_M_MIDDLETRAINPASSENGERS_01", "Male"}, {"A_M_M_MOONSHINERS_01", "Male"}, {"A_M_M_NbxDockWorkers_01", "Male"}, {"A_M_M_NbxLaborers_01", "Male"}, {"A_M_M_NbxSlums_01", "Male"}, {"A_M_M_NbxUpperClass_01", "Male"}, {"A_M_M_NEAROUGHTRAVELLERS_01", "Male"}, {"A_M_M_RANCHER_01", "Male"}, {"A_M_M_RANCHERTRAVELERS_COOL_01", "Male"}, {"A_M_M_RANCHERTRAVELERS_WARM_01", "Male"}, {"A_M_M_RHDDEPUTYRESIDENT_01", "Male"}, {"A_M_M_RhdForeman_01", "Male"}, {"A_M_M_RHDObeseMen_01", "Male"}, {"A_M_M_RhdTownfolk_01", "Male"}, {"A_M_M_RHDTOWNFOLK_01_LABORER", "Male"}, {"A_M_M_RhdTownfolk_02", "Male"}, {"A_M_M_RhdUpperClass_01", "Male"}, {"A_M_M_RkrFancyDRIVERS_01", "Male"}, {"A_M_M_RkrFancyTravellers_01", "Male"}, {"A_M_M_RkrRoughTravellers_01", "Male"}, {"A_M_M_RkrSurvivalist_01", "Male"}, {"A_M_M_SclFancyDRIVERS_01", "Male"}, {"A_M_M_SclFancyTravellers_01", "Male"}, {"A_M_M_SclRoughTravellers_01", "Male"}, {"A_M_M_SDChinatown_01", "Male"}, {"A_M_M_SDDockForeman_01", "Male"}, {"A_M_M_SDDockWorkers_02", "Male"}, {"A_M_M_SDFANCYTRAVELLERS_01", "Male"}, {"A_M_M_SDLaborers_02", "Male"}, {"A_M_M_SDObesemen_01", "Male"}, {"A_M_M_SDROUGHTRAVELLERS_01", "Male"}, {"A_M_M_SDSERVERSFORMAL_01", "Male"}, {"A_M_M_SDSlums_02", "Male"}, {"A_M_M_SkpPrisoner_01", "Male"}, {"A_M_M_SkpPrisonLine_01", "Male"}, {"A_M_M_SmHThug_01", "Male"}, {"A_M_M_STRDEPUTYRESIDENT_01", "Male"}, {"A_M_M_STRFANCYTOURIST_01", "Male"}, {"A_M_M_StrLaborer_01", "Male"}, {"A_M_M_StrTownfolk_01", "Male"}, {"A_M_M_TumTownfolk_01", "Male"}, {"A_M_M_TumTownfolk_02", "Male"}, {"A_M_M_UniBoatCrew_01", "Male"}, {"A_M_M_UniCoachGuards_01", "Male"}, {"A_M_M_UniCorpse_01", "Male"}, {"A_M_M_UniGunslinger_01", "Male"}, {"A_M_M_UPPERTRAINPASSENGERS_01", "Male"}, {"A_M_M_VALCRIMINALS_01", "Male"}, {"A_M_M_VALDEPUTYRESIDENT_01", "Male"}, {"A_M_M_ValFarmer_01", "Male"}, {"A_M_M_ValLaborer_01", "Male"}, {"A_M_M_ValTownfolk_01", "Male"}, {"A_M_M_ValTownfolk_02", "Male"}, {"A_M_M_VHTBOATCREW_01", "Male"}, {"A_M_M_VhtThug_01", "Male"}, {"A_M_M_VhtTownfolk_01", "Male"}, {"A_M_M_WapWarriors_01", "Male"}, {"A_M_O_BlWUpperClass_01", "Male"}, {"A_M_O_BtcHillbilly_01", "Male"}, {"A_M_O_GuaTownfolk_01", "Male"}, {"A_M_O_LagTownfolk_01", "Male"}, {"A_M_O_SDChinatown_01", "Male"}, {"A_M_O_SDUpperClass_01", "Male"}, {"A_M_O_WAPTOWNFOLK_01", "Male"}, {"A_M_Y_AsbMiner_01", "Male"}, {"A_M_Y_AsbMiner_02", "Male"}, {"A_M_Y_ASBMINER_03", "Male"}, {"A_M_Y_ASBMINER_04", "Male"}, {"A_M_Y_NbxStreetKids_01", "Male"}, {"A_M_Y_NbxStreetKids_Slums_01", "Male"}, {"A_M_Y_SDStreetKids_Slums_02", "Male"}, {"A_M_Y_UniCorpse_01", "Male"}, {"CS_abe", "Male"}, {"CS_AberdeenPigFarmer", "Male"}, {"CS_AberdeenSister", "Female"}, {"CS_abigailroberts", "Female"}, {"CS_Acrobat", "Female"}, {"CS_adamgray", "Male"}, {"CS_AgnesDowd", "Female"}, {"CS_albertcakeesquire", "Male"}, {"CS_albertmason", "Male"}, {"CS_AndersHelgerson", "Male"}, {"CS_ANGEL", "Male"}, {"CS_angryhusband", "Male"}, {"CS_angusgeddes", "Male"}, {"CS_ansel_atherton", "Male"}, {"CS_ANTONYFOREMEN", "Male"}, {"CS_archerfordham", "Male"}, {"CS_archibaldjameson", "Male"}, {"CS_ArchieDown", "Male"}, {"CS_ARTAPPRAISER", "Male"}, {"CS_ASBDEPUTY_01", "Male"}, {"CS_ASHTON", "Male"}, {"CS_balloonoperator", "Male"}, {"CS_bandbassist", "Male"}, {"CS_banddrummer", "Male"}, {"CS_bandpianist", "Male"}, {"CS_bandsinger", "Female"}, {"CS_baptiste", "Male"}, {"CS_bartholomewbraithwaite", "Male"}, {"CS_BATHINGLADIES_01", "Female"}, {"CS_BeatenUpCaptain", "Male"}, {"CS_beaugray", "Male"}, {"CS_billwilliamson", "Male"}, {"CS_BivCoachDriver", "Male"}, {"CS_BLWPHOTOGRAPHER", "Male"}, {"CS_BLWWITNESS", "Male"}, {"CS_braithwaitebutler", "Male"}, {"CS_braithwaitemaid", "Female"}, {"CS_braithwaiteservant", "Male"}, {"CS_brendacrawley", "Female"}, {"CS_bronte", "Male"}, {"CS_BrontesButler", "Male"}, {"CS_brotherdorkins", "Male"}, {"CS_brynntildon", "Male"}, {"CS_Bubba", "Male"}, {"CS_CABARETMC", "Male"}, {"CS_CAJUN", "Male"}, {"CS_cancan_01", "Female"}, {"CS_cancan_02", "Female"}, {"CS_cancan_03", "Female"}, {"CS_cancan_04", "Female"}, {"CS_CanCanMan_01", "Male"}, {"CS_captainmonroe", "Male"}, {"CS_Cassidy", "Male"}, {"CS_catherinebraithwaite", "Female"}, {"CS_cattlerustler", "Male"}, {"CS_CAVEHERMIT", "Male"}, {"CS_chainprisoner_01", "Male"}, {"CS_chainprisoner_02", "Male"}, {"CS_charlessmith", "Male"}, {"CS_ChelonianMaster", "Male"}, {"CS_CIGCARDGUY", "Male"}, {"CS_clay", "Male"}, {"CS_CLEET", "Male"}, {"CS_clive", "Male"}, {"CS_colfavours", "Male"}, {"CS_ColmODriscoll", "Male"}, {"CS_COOPER", "Male"}, {"CS_CornwallTrainConductor", "Male"}, {"CS_crackpotinventor", "Male"}, {"CS_crackpotRobot", "Male"}, {"CS_creepyoldlady", "Female"}, {"CS_creolecaptain", "Male"}, {"CS_creoledoctor", "Male"}, {"CS_creoleguy", "Male"}, {"CS_dalemaroney", "Male"}, {"CS_DaveyCallender", "Male"}, {"CS_davidgeddes", "Male"}, {"CS_DESMOND", "Male"}, {"CS_DIDSBURY", "Male"}, {"CS_DinoBonesLady", "Female"}, {"CS_DisguisedDuster_01", "Male"}, {"CS_DisguisedDuster_02", "Male"}, {"CS_DisguisedDuster_03", "Male"}, {"CS_DOROETHEAWICKLOW", "Female"}, {"CS_DrHiggins", "Male"}, {"CS_DrMalcolmMacIntosh", "Male"}, {"CS_duncangeddes", "Male"}, {"CS_DusterInformant_01", "Male"}, {"CS_dutch", "Male"}, {"CS_EagleFlies", "Male"}, {"CS_edgarross", "Male"}, {"CS_EDITH_JOHN", "Male"}, {"CS_EdithDown", "Female"}, {"CS_edmundlowry", "Male"}, {"CS_EscapeArtist", "Male"}, {"CS_EscapeArtistAssistant", "Female"}, {"CS_evelynmiller", "Male"}, {"CS_EXCONFEDINFORMANT", "Male"}, {"CS_exconfedsleader_01", "Male"}, {"CS_EXOTICCOLLECTOR", "Male"}, {"CS_famousgunslinger_01", "Male"}, {"CS_famousgunslinger_02", "Male"}, {"CS_famousgunslinger_03", "Male"}, {"CS_famousgunslinger_04", "Male"}, {"CS_FamousGunslinger_05", "Female"}, {"CS_FamousGunslinger_06", "Male"}, {"CS_FEATHERSTONCHAMBERS", "Male"}, {"CS_FeatsOfStrength", "Male"}, {"CS_FIGHTREF", "Male"}, {"CS_Fire_Breather", "Female"}, {"CS_FISHCOLLECTOR", "Male"}, {"CS_forgivenhusband_01", "Male"}, {"CS_forgivenwife_01", "Female"}, {"CS_FORMYARTBIGWOMAN", "Female"}, {"CS_FRANCIS_SINCLAIR", "Male"}, {"CS_frenchartist", "Male"}, {"CS_FRENCHMAN_01", "Male"}, {"CS_fussar", "Male"}, {"CS_garethbraithwaite", "Male"}, {"CS_GAVIN", "Male"}, {"CS_genstoryfemale", "Female"}, {"CS_genstorymale", "Male"}, {"CS_geraldbraithwaite", "Male"}, {"CS_GermanDaughter", "Female"}, {"CS_GermanFather", "Male"}, {"CS_GermanMother", "Female"}, {"CS_GermanSon", "Male"}, {"CS_GILBERTKNIGHTLY", "Male"}, {"CS_GLORIA", "Female"}, {"CS_GrizzledJon", "Male"}, {"CS_GuidoMartelli", "Male"}, {"CS_HAMISH", "Male"}, {"CS_hectorfellowes", "Male"}, {"CS_henrilemiux", "Male"}, {"CS_HERBALIST", "Male"}, {"CS_hercule", "Male"}, {"CS_HestonJameson", "Male"}, {"CS_hobartcrawley", "Male"}, {"CS_hoseamatthews", "Male"}, {"CS_IANGRAY", "Male"}, {"CS_jackmarston", "Male"}, {"CS_jackmarston_teen", "Male"}, {"CS_JAMIE", "Male"}, {"CS_JANSON", "Male"}, {"CS_javierescuella", "Male"}, {"CS_Jeb", "Male"}, {"CS_jimcalloway", "Male"}, {"CS_jockgray", "Male"}, {"CS_JOE", "Male"}, {"CS_JoeButler", "Male"}, {"CS_johnmarston", "Male"}, {"CS_JOHNTHEBAPTISINGMADMAN", "Male"}, {"CS_JohnWeathers", "Male"}, {"CS_josiahtrelawny", "Male"}, {"CS_Jules", "Male"}, {"CS_karen", "Female"}, {"CS_KarensJohn_01", "Male"}, {"CS_kieran", "Male"}, {"CS_LARAMIE", "Male"}, {"CS_leighgray", "Male"}, {"CS_LemiuxAssistant", "Male"}, {"CS_lenny", "Male"}, {"CS_leon", "Male"}, {"CS_leostrauss", "Male"}, {"CS_LeviSimon", "Male"}, {"CS_leviticuscornwall", "Male"}, {"CS_LillianPowell", "Female"}, {"CS_lillymillet", "Female"}, {"CS_LondonderrySon", "Male"}, {"CS_LUCANAPOLI", "Male"}, {"CS_Magnifico", "Male"}, {"CS_MAMAWATSON", "Female"}, {"CS_MARSHALL_THURWELL", "Male"}, {"CS_marybeth", "Female"}, {"CS_marylinton", "Female"}, {"CS_MEDITATINGMONK", "Male"}, {"CS_Meredith", "Female"}, {"CS_MeredithsMother", "Female"}, {"CS_MicahBell", "Male"}, {"CS_MicahsNemesis", "Male"}, {"CS_Mickey", "Male"}, {"CS_miltonandrews", "Male"}, {"CS_missMarjorie", "Female"}, {"CS_MIXEDRACEKID", "Male"}, {"CS_MOIRA", "Female"}, {"CS_mollyoshea", "Female"}, {"CS_MP_AGENT_HIXON", "Male"}, {"CS_MP_ALFREDO_MONTEZ", "Male"}, {"CS_MP_AMOS_LANSING", "Male"}, {"cs_mp_bonnie", "Female"}, {"CS_MP_BOUNTYHUNTER", "Female"}, {"CS_MP_CLIFF", "Male"}, {"CS_MP_CRIPPS", "Male"}, {"CS_MP_DANNYLEE", "Male"}, {"CS_MP_GRACE_LANCING", "Female"}, {"CS_MP_GUS_MACMILLAN", "Male"}, {"CS_MP_HANS", "Male"}, {"CS_MP_HARRIET_DAVENPORT", "Female"}, {"CS_MP_HORLEY", "Male"}, {"CS_MP_JEREMIAH_SHAW", "Male"}, {"CS_MP_JESSICA", "Female"}, {"CS_MP_JORGE_MONTEZ", "Male"}, {"CS_MP_LANGSTON", "Male"}, {"CS_MP_LEE", "Male"}, {"CS_MP_LEM", "Male"}, {"CS_MP_LEM", "Male"}, {"CS_MP_MABEL", "Female"}, {"CS_MP_MAGGIE", "Female"}, {"CS_MP_MARSHALL_DAVIES", "Male"}, {"CS_MP_MOONSHINER", "Male"}, {"CS_MP_MRADLER", "Male"}, {"CS_MP_OLDMAN_JONES", "Male"}, {"CS_MP_REVENGE_MARSHALL", "Male"}, {"CS_MP_SAMSON_FINCH", "Male"}, {"CS_MP_SETH", "Male"}, {"CS_MP_SHAKY", "Male"}, {"CS_MP_SHERIFFFREEMAN", "Male"}, {"CS_MP_TEDDYBROWN", "Male"}, {"CS_MP_TERRANCE", "Male"}, {"CS_MP_THE_BOY", "Male"}, {"CS_MP_TRAVELLINGSALESWOMAN", "Female"}, {"CS_MP_WENT", "Male"}, {"CS_mradler", "Male"}, {"CS_MRDEVON", "Male"}, {"CS_MRLINTON", "Male"}, {"CS_mrpearson", "Male"}, {"CS_Mrs_Calhoun", "Female"}, {"CS_MRS_SINCLAIR", "Female"}, {"CS_mrsadler", "Female"}, {"CS_MrsFellows", "Female"}, {"CS_mrsgeddes", "Female"}, {"CS_MrsLondonderry", "Female"}, {"CS_MrsWeathers", "Female"}, {"CS_MRSWEATHERS", "Female"}, {"CS_MRWAYNE", "Male"}, {"CS_mud2bigguy", "Male"}, {"CS_MysteriousStranger", "Male"}, {"CS_NbxDrunk", "Male"}, {"CS_NbxExecuted", "Male"}, {"CS_NbxPoliceChiefFormal", "Male"}, {"CS_nbxreceptionist_01", "Female"}, {"CS_NIAL_WHELAN", "Male"}, {"CS_NicholasTimmins", "Male"}, {"CS_NILS", "Male"}, {"CS_NorrisForsythe", "Male"}, {"CS_obediahhinton", "Male"}, {"CS_oddfellowspinhead", "Male"}, {"CS_ODProstitute", "Female"}, {"CS_OPERASINGER", "Female"}, {"CS_PAYTAH", "Male"}, {"CS_penelopebraithwaite", "Female"}, {"CS_PinkertonGoon", "Male"}, {"CS_PoisonWellShaman", "Male"}, {"CS_POORJOE", "Male"}, {"CS_PRIEST_WEDDING", "Male"}, {"CS_PrincessIsabeau", "Female"}, {"CS_professorbell", "Male"}, {"CS_rainsfall", "Male"}, {"CS_RAMON_CORTEZ", "Male"}, {"CS_ReverendFortheringham", "Male"}, {"CS_revswanson", "Male"}, {"CS_rhodeputy_01", "Male"}, {"CS_RhoDeputy_02", "Male"}, {"CS_RhodesAssistant", "Male"}, {"CS_rhodeskidnapvictim", "Male"}, {"CS_rhodessaloonbouncer", "Male"}, {"CS_ringmaster", "Male"}, {"CS_ROCKYSEVEN_WIDOW", "Female"}, {"CS_samaritan", "Male"}, {"CS_SCOTTGRAY", "Male"}, {"CS_SD_STREETKID_01", "Male"}, {"CS_SD_STREETKID_01A", "Male"}, {"CS_SD_STREETKID_01B", "Male"}, {"CS_SD_STREETKID_02", "Male"}, {"CS_SDDoctor_01", "Male"}, {"CS_SDPRIEST", "Male"}, {"CS_SDSALOONDRUNK_01", "Male"}, {"CS_SDStreetKidThief", "Male"}, {"CS_SDStreetKidThief", "Male"}, {"CS_sean", "Male"}, {"CS_SHERIFFFREEMAN", "Male"}, {"CS_SheriffOwens", "Male"}, {"CS_sistercalderon", "Female"}, {"CS_slavecatcher", "Male"}, {"CS_SOOTHSAYER", "Female"}, {"CS_strawberryoutlaw_01", "Male"}, {"CS_strawberryoutlaw_02", "Male"}, {"CS_strdeputy_01", "Male"}, {"CS_strdeputy_02", "Male"}, {"CS_strsheriff_01", "Male"}, {"CS_SUNWORSHIPPER", "Male"}, {"CS_susangrimshaw", "Female"}, {"CS_SwampFreak", "Male"}, {"CS_SWAMPWEIRDOSONNY", "Male"}, {"CS_SwordDancer", "Female"}, {"CS_tavishgray", "Male"}, {"CS_TAXIDERMIST", "Male"}, {"CS_theodorelevin", "Male"}, {"CS_thomasdown", "Male"}, {"CS_TigerHandler", "Female"}, {"CS_tilly", "Female"}, {"CS_TimothyDonahue", "Male"}, {"CS_TINYHERMIT", "Male"}, {"CS_tomdickens", "Male"}, {"CS_TownCrier", "Male"}, {"CS_TREASUREHUNTER", "Male"}, {"CS_twinbrother_01", "Male"}, {"CS_twinbrother_02", "Male"}, {"CS_twingroupie_01", "Female"}, {"CS_twingroupie_02", "Female"}, {"CS_uncle", "Male"}, {"CS_UNIDUSTERJAIL_01", "Male"}, {"CS_valauctionboss_01", "Male"}, {"CS_VALDEPUTY_01", "Male"}, {"CS_ValPrayingMan", "Male"}, {"CS_ValProstitute_01", "Female"}, {"CS_ValProstitute_02", "Female"}, {"CS_VALSHERIFF", "Male"}, {"CS_Vampire", "Male"}, {"CS_VHT_BATHGIRL", "Female"}, {"CS_WapitiBoy", "Male"}, {"CS_warvet", "Male"}, {"CS_WATSON_01", "Male"}, {"CS_WATSON_02", "Male"}, {"CS_WATSON_03", "Male"}, {"CS_WELSHFIGHTER", "Male"}, {"CS_WintonHolmes", "Male"}, {"CS_Wrobel", "Male"}, {"G_F_M_UNIDUSTER_01", "Female"}, {"G_M_M_BountyHunters_01", "Male"}, {"G_M_M_UniAfricanAmericanGang_01", "Male"}, {"G_M_M_UniBanditos_01", "Male"}, {"G_M_M_UniBraithwaites_01", "Male"}, {"G_M_M_UniBronteGoons_01", "Male"}, {"G_M_M_UniCornwallGoons_01", "Male"}, {"G_M_M_UniCriminals_01", "Male"}, {"G_M_M_UniCriminals_02", "Male"}, {"G_M_M_UniDuster_01", "Male"}, {"G_M_M_UniDuster_02", "Male"}, {"G_M_M_UniDuster_03", "Male"}, {"G_M_M_UniDuster_04", "Male"}, {"G_M_M_UNIDUSTER_05", "Male"}, {"G_M_M_UniGrays_01", "Male"}, {"G_M_M_UniGrays_02", "Male"}, {"G_M_M_UniInbred_01", "Male"}, {"G_M_M_UNILANGSTONBOYS_01", "Male"}, {"G_M_M_UNIMICAHGOONS_01", "Male"}, {"G_M_M_UniMountainMen_01", "Male"}, {"G_M_M_UniRanchers_01", "Male"}, {"G_M_M_UNISWAMP_01", "Male"}, {"G_M_O_UniExConfeds_01", "Male"}, {"G_M_Y_UniExConfeds_01", "Male"}, {"G_M_Y_UNIEXCONFEDS_02", "Male"}, {"Immortality", "Male"}, {"MBH_RHODESRANCHER_FEMALES_01", "Female"}, {"MBH_RHODESRANCHER_TEENS_01", "Male"}, {"MBH_SKINNERSEARCH_MALES_01", "Male"}, {"MCCLELLAN_SADDLE_01", "unknown"}, {"MES_ABIGAIL2_MALES_01", "Male"}, {"MES_FINALE2_FEMALES_01", "Female"}, {"MES_FINALE2_MALES_01", "Male"}, {"MES_FINALE3_MALES_01", "Male"}, {"MES_MARSTON1_MALES_01", "Male"}, {"MES_MARSTON2_MALES_01", "Male"}, {"MES_MARSTON5_2_MALES_01", "Male"}, {"MES_MARSTON6_FEMALES_01", "Female"}, {"MES_MARSTON6_MALES_01", "Male"}, {"MES_MARSTON6_TEENS_01", "Male"}, {"MES_SADIE4_MALES_01", "Male"}, {"MES_SADIE5_MALES_01", "Male"}, {"MOTHERHUBBARD_SADDLE_01", "unknown"}, {"MP_A_F_M_CARDGAMEPLAYERS_01", "unknown"}, {"MP_A_F_M_SALOONBAND_FEMALES_01", "Female"}, {"MP_A_M_M_MOONSHINEMAKERS_01", "unknown"}, {"MP_ASN_BENEDICTPOINT_FEMALES_01", "Female"}, {"MP_ASN_BENEDICTPOINT_MALES_01", "Male"}, {"MP_ASN_BLACKWATER_MALES_01", "Male"}, {"MP_ASN_BRAITHWAITEMANOR_MALES_01", "Male"}, {"MP_ASN_BRAITHWAITEMANOR_MALES_02", "Male"}, {"MP_ASN_BRAITHWAITEMANOR_MALES_03", "Male"}, {"MP_ASN_CIVILWARFORT_MALES_01", "Male"}, {"MP_ASN_GAPTOOTHBREACH_MALES_01", "Male"}, {"MP_ASN_PikesBasin_Males_01", "Male"}, {"MP_ASN_SDPOLICESTATION_MALES_01", "Male"}, {"MP_ASN_SDWEDDING_FEMALES_01", "Female"}, {"MP_ASN_SHADYBELLE_FEMALES_01", "Female"}, {"MP_ASN_STILLWATER_MALES_01", "Male"}, {"MP_ASNTRK_TALLTREES_MALES_01", "Male"}, {"MP_CAMPDEF_BLUEWATER_MALES_01", "Male"}, {"MP_CAMPDEF_CHOLLASPRINGS_MALES_01", "Male"}, {"MP_CAMPDEF_EASTNEWHANOVER_FEMALES_01", "Female"}, {"mp_female", "Female"}, {"MP_FM_BOUNTYTARGET_FEMALES_DLC008_01", "Female"}, {"MP_FM_BOUNTYTARGET_MALES_DLC008_01", "Male"}, {"MP_G_F_M_ARMYOFFEAR_01", "Female"}, {"MP_G_F_M_CULTGUARDS_01", "Female"}, {"MP_G_F_M_CULTMEMBERS_01", "Female"}, {"MP_G_M_M_ARMYOFFEAR_01", "Male"}, {"MP_G_M_M_ArmyOfFear_01", "Male"}, {"MP_G_M_M_CULTGUARDS_01", "Male"}, {"MP_G_M_M_CULTMEMBERS_01", "Male"}, {"MP_G_M_M_UNICRIMINALS_03", "Male"}, {"MP_G_M_M_UNICRIMINALS_04", "Male"}, {"MP_G_M_M_UNICRIMINALS_05", "Male"}, {"MP_G_M_M_UNICRIMINALS_06", "Male"}, {"MP_G_M_M_UNICRIMINALS_07", "Male"}, {"MP_G_M_M_UNICRIMINALS_08", "Male"}, {"MP_G_M_M_UNICRIMINALS_09", "Male"}, {"mp_male", "Male"}, {"MP_PREDATOR", "Male"}, {"MP_S_M_M_REVENUEAGENTS_01", "Male"}, {"MP_U_F_M_CULTPRIEST_01", "Female"}, {"MP_U_F_M_LEGENDARYBOUNTY_03", "Male"}, {"MP_U_M_M_ANIMALPOACHER_01", "unknown"}, {"MP_U_M_M_ANIMALPOACHER_02", "unknown"}, {"MP_U_M_M_ANIMALPOACHER_06", "unknown"}, {"MP_U_M_M_CULTPRIEST_01", "Male"}, {"MP_U_M_M_LBT_Owlhootvictim_01", "unknown"}, {"MP_U_M_M_LBT_Philipsvictim_01", "unknown"}, {"MP_U_M_M_LEGENDARYBOUNTY_08", "Male"}, {"MP_U_M_M_SALOONBRAWLERS_01", "Male"}, {"MP_U_M_M_SALOONBRAWLERS_02", "Male"}, {"MP_U_M_M_SALOONBRAWLERS_03", "Male"}, {"MP_U_M_M_SALOONBRAWLERS_04", "Male"}, {"MP_U_M_M_SALOONBRAWLERS_05", "Male"}, {"MP_U_M_M_SALOONBRAWLERS_06", "Male"}, {"MP_U_M_M_SALOONBRAWLERS_07", "Male"}, {"MP_U_M_M_SALOONBRAWLERS_08", "Male"}, {"MP_U_M_M_SALOONBRAWLERS_09", "Male"}, {"MP_U_M_M_SALOONBRAWLERS_10", "Male"}, {"MP_U_M_M_SALOONBRAWLERS_11", "Male"}, {"MP_U_M_M_SALOONBRAWLERS_12", "Male"}, {"MP_U_M_M_SALOONBRAWLERS_13", "Male"}, {"MP_U_M_M_SALOONBRAWLERS_14", "Male"}, {"MSP_BOUNTYHUNTER1_FEMALES_01", "Female"}, {"MSP_BRAITHWAITES1_MALES_01", "Male"}, {"MSP_FEUD1_MALES_01", "Male"}, {"MSP_FUSSAR2_MALES_01", "Male"}, {"MSP_GANG2_MALES_01", "Male"}, {"MSP_GANG3_MALES_01", "Male"}, {"MSP_GRAYS1_MALES_01", "Male"}, {"MSP_GRAYS2_MALES_01", "Male"}, {"MSP_GUARMA2_MALES_01", "Male"}, {"MSP_INDUSTRY1_FEMALES_01", "Female"}, {"MSP_INDUSTRY1_MALES_01", "Male"}, {"MSP_INDUSTRY3_FEMALES_01", "Female"}, {"MSP_INDUSTRY3_MALES_01", "Male"}, {"MSP_MARY1_FEMALES_01", "Female"}, {"MSP_MARY1_MALES_01", "Male"}, {"MSP_MARY3_MALES_01", "Male"}, {"MSP_MOB0_MALES_01", "Male"}, {"MSP_MOB1_FEMALES_01", "Female"}, {"MSP_MOB1_MALES_01", "Male"}, {"MSP_MOB1_TEENS_01", "Male"}, {"msp_mob3_FEMALES_01", "Female"}, {"msp_mob3_MALES_01", "Male"}, {"MSP_MUDTOWN3_MALES_01", "Male"}, {"MSP_Mudtown3B_Females_01", "Female"}, {"MSP_Mudtown3B_Males_01", "Male"}, {"MSP_MUDTOWN5_MALES_01", "Male"}, {"MSP_NATIVE1_MALES_01", "Male"}, {"MSP_REVEREND1_MALES_01", "Male"}, {"MSP_SAINTDENIS1_FEMALES_01", "Female"}, {"MSP_SAINTDENIS1_MALES_01", "Male"}, {"MSP_SALOON1_FEMALES_01", "Female"}, {"MSP_SALOON1_MALES_01", "Male"}, {"MSP_SMUGGLER2_MALES_01", "Male"}, {"MSP_TRAINROBBERY2_MALES_01", "Male"}, {"MSP_TRELAWNY1_MALES_01", "Male"}, {"MSP_UTOPIA1_MALES_01", "Male"}, {"MSP_WINTER4_MALES_01", "Male"}, {"P_U_M_M_ANIMALPOACHER_03", "unknown"}, {"Player_Three", "Male"}, {"Player_Zero", "Male"}, {"Ps4", "Male"}, {"RCES_ABIGAIL3_FEMALES_01", "Female"}, {"RCES_ABIGAIL3_MALES_01", "Male"}, {"RCES_BEECHERS1_MALES_01", "Male"}, {"RCES_EVELYNMILLER_MALES_01", "Male"}, {"RCSP_BEAUANDPENELOPE_MALES_01", "Male"}, {"RCSP_BEAUANDPENELOPE1_FEMALES_01", "Female"}, {"RCSP_CALDERON_MALES_01", "Male"}, {"RCSP_CALDERONSTAGE2_MALES_01", "Male"}, {"RCSP_CALDERONSTAGE2_TEENS_01", "Male"}, {"RCSP_CALLOWAY_MALES_01", "Male"}, {"RCSP_COACHROBBERY_MALES_01", "Male"}, {"RCSP_CRACKPOT_FEMALES_01", "Female"}, {"RCSP_CRACKPOT_MALES_01", "Male"}, {"RCSP_CREOLE_MALES_01", "Male"}, {"RCSP_DUTCH1_MALES_01", "Male"}, {"RCSP_DUTCH3_MALES_01", "Male"}, {"RCSP_EDITHDOWNES2_MALES_01", "Male"}, {"RCSP_FORMYART_FEMALES_01", "Female"}, {"RCSP_FORMYART_MALES_01", "Male"}, {"RCSP_GUNSLINGERDUEL4_MALES_01", "Male"}, {"RCSP_HEREKITTYKITTY_MALES_0", "Male"}, {"RCSP_HUNTING1_MALES_01", "Male"}, {"RCSP_MRMAYOR_MALES_01", "Male"}, {"RCSP_NATIVE_AMERICANFATHERS_MALES_01", "Male"}, {"RCSP_NATIVE1S2_MALES_01", "Male"}, {"RCSP_ODDFELLOWS_MALES_01", "Male"}, {"RCSP_ODRISCOLLS2_FEMALES_01", "Female"}, {"RCSP_POISONEDWELL_FEMALES_01", "Female"}, {"RCSP_POISONEDWELL_MALES_01", "Male"}, {"RCSP_POISONEDWELL_TEENS_01", "Male"}, {"RCSP_RIDETHELIGHTNING_FEMALES_01", "unknown"}, {"RCSP_RIDETHELIGHTNING_MALES_01", "Male"}, {"RCSP_SADIE1_MALES_01", "Male"}, {"RCSP_SLAVECATCHER_MALES_01", "Male"}, {"RE_ANIMALATTACK_FEMALES_01", "Female"}, {"RE_ANIMALATTACK_MALES_01", "Male"}, {"RE_ANIMALMAULING_MALES_01", "Male"}, {"RE_APPROACH_MALES_01", "Male"}, {"RE_BEARTRAP_MALES_01", "Male"}, {"RE_BOATATTACK_MALES_01", "Male"}, {"RE_BURNINGBODIES_MALES_01", "Male"}, {"RE_CHECKPOINT_MALES_01", "Male"}, {"RE_COACHROBBERY_FEMALES_01", "Female"}, {"RE_COACHROBBERY_MALES_01", "Male"}, {"RE_CONSEQUENCE_MALES_01", "Male"}, {"RE_CORPSECART_FEMALES_01", "Female"}, {"RE_CORPSECART_MALES_01", "Male"}, {"RE_CRASHEDWAGON_MALES_01", "Male"}, {"RE_DARKALLEYAMBUSH_MALES_01", "Male"}, {"RE_DARKALLEYBUM_MALES_01", "Male"}, {"RE_DARKALLEYSTABBING_MALES_01", "Male"}, {"RE_DEADBODIES_MALES_01", "Male"}, {"RE_DEADJOHN_FEMALES_01", "Female"}, {"RE_DEADJOHN_MALES_01", "Male"}, {"RE_DISABLEDBEGGAR_MALES_01", "Male"}, {"RE_DOMESTICDISPUTE_FEMALES_01", "Female"}, {"RE_DOMESTICDISPUTE_MALES_01", "Male"}, {"RE_DROWNMURDER_FEMALES_01", "Female"}, {"RE_DROWNMURDER_MALES_01", "Male"}, {"RE_DRUNKCAMP_MALES_01", "Male"}, {"RE_DRUNKDUELER_MALES_01", "Male"}, {"RE_DUELBOASTER_MALES_01", "Male"}, {"RE_DUELWINNER_FEMALES_01", "Female"}, {"RE_DUELWINNER_MALES_01", "Male"}, {"RE_ESCORT_FEMALES_01", "Female"}, {"RE_EXECUTIONS_MALES_01", "Male"}, {"RE_FLEEINGFAMILY_FEMALES_01", "Female"}, {"RE_FLEEINGFAMILY_MALES_01", "Male"}, {"RE_FOOTROBBERY_MALES_01", "Male"}, {"RE_FRIENDLYOUTDOORSMAN_MALES_01", "Male"}, {"RE_FROZENTODEATH_FEMALES_01", "Female"}, {"RE_FROZENTODEATH_MALES_01", "Male"}, {"RE_FUNDRAISER_FEMALES_01", "Female"}, {"RE_FUSSARCHASE_MALES_01", "Male"}, {"RE_GOLDPANNER_MALES_01", "Male"}, {"RE_HORSERACE_FEMALES_01", "Female"}, {"RE_HORSERACE_MALES_01", "Male"}, {"RE_HOSTAGERESCUE_FEMALES_01", "Female"}, {"RE_HOSTAGERESCUE_MALES_01", "Male"}, {"RE_INBREDKIDNAP_FEMALES_01", "Female"}, {"RE_INBREDKIDNAP_MALES_01", "Male"}, {"RE_INJUREDRIDER_MALES_01", "Male"}, {"RE_KIDNAPPEDVICTIM_FEMALES_01", "Female"}, {"RE_LARAMIEGANGRUSTLING_MALES_01", "unknown"}, {"RE_LONEPRISONER_MALES_01", "Male"}, {"RE_LOSTDOG_DOGS_01", "unknown"}, {"RE_LOSTDOG_TEENS_01", "Male"}, {"RE_LOSTDRUNK_FEMALES_01", "Female"}, {"RE_LOSTDRUNK_MALES_01", "Male"}, {"RE_LOSTFRIEND_MALES_01", "Male"}, {"RE_LOSTMAN_MALES_01", "Male"}, {"RE_MOONSHINECAMP_MALES_01", "Male"}, {"RE_MURDERCAMP_MALES_01", "Male"}, {"RE_MURDERSUICIDE_FEMALES_01", "Female"}, {"RE_MURDERSUICIDE_MALES_01", "Male"}, {"RE_NAKEDSWIMMER_MALES_01", "Female"}, {"RE_ONTHERUN_MALES_01", "Male"}, {"RE_OUTLAWLOOTER_MALES_01", "Male"}, {"RE_PARLORAMBUSH_MALES_01", "Male"}, {"RE_PEEPINGTOM_FEMALES_01", "Female"}, {"RE_PEEPINGTOM_MALES_01", "Male"}, {"RE_PICKPOCKET_MALES_01", "Male"}, {"RE_PISSPOT_FEMALES_01", "Female"}, {"RE_PISSPOT_MALES_01", "Male"}, {"RE_PLAYERCAMPSTRANGERS_FEMALES_01", "Female"}, {"RE_PLAYERCAMPSTRANGERS_MALES_01", "Male"}, {"RE_POISONED_MALES_01", "Male"}, {"RE_POLICECHASE_MALES_01", "Male"}, {"RE_PRISONWAGON_FEMALES_01", "Female"}, {"RE_PRISONWAGON_MALES_01", "Male"}, {"RE_PUBLICHANGING_FEMALES_01", "Female"}, {"RE_PUBLICHANGING_MALES_01", "Male"}, {"RE_PUBLICHANGING_TEENS_01", "Male"}, {"RE_RALLY_MALES_01", "Male"}, {"RE_RALLYDISPUTE_MALES_01", "Male"}, {"RE_RALLYSETUP_MALES_01", "Male"}, {"RE_RATINFESTATION_MALES_01", "Male"}, {"RE_ROWDYDRUNKS_MALES_01", "Male"}, {"RE_SAVAGEAFTERMATH_FEMALES_01", "Female"}, {"RE_SAVAGEAFTERMATH_MALES_01", "Male"}, {"RE_SAVAGEFIGHT_FEMALES_01", "Female"}, {"RE_SAVAGEFIGHT_MALES_01", "Male"}, {"RE_SAVAGEWAGON_FEMALES_01", "Female"}, {"RE_SAVAGEWAGON_MALES_01", "Male"}, {"RE_SAVAGEWARNING_MALES_01", "Male"}, {"RE_SHARPSHOOTER_MALES_01", "Male"}, {"RE_SHOWOFF_MALES_01", "Male"}, {"RE_SKIPPINGSTONES_MALES_01", "Male"}, {"RE_SKIPPINGSTONES_TEENS_01", "Male"}, {"RE_SLUMAMBUSH_FEMALES_01", "Female"}, {"RE_SNAKEBITE_MALES_01", "Male"}, {"RE_STALKINGHUNTER_MALES_01", "Male"}, {"RE_STRANDEDRIDER_MALES_01", "Male"}, {"RE_STREET_FIGHT_MALES_01", "Male"}, {"RE_TAUNTING_01", "Male"}, {"RE_TAUNTING_MALES_01", "Male"}, {"RE_TORTURINGCAPTIVE_MALES_01", "Male"}, {"RE_TOWNBURIAL_MALES_01", "Male"}, {"RE_TOWNCONFRONTATION_FEMALES_01", "Female"}, {"RE_TOWNCONFRONTATION_MALES_01", "Male"}, {"RE_TOWNROBBERY_MALES_01", "Male"}, {"RE_TOWNWIDOW_FEMALES_01", "Female"}, {"RE_TRAINHOLDUP_FEMALES_01", "Female"}, {"RE_TRAINHOLDUP_MALES_01", "Male"}, {"RE_TRAPPEDWOMAN_FEMALES_01", "Female"}, {"RE_TREASUREHUNTER_MALES_01", "Male"}, {"RE_VOICE_FEMALES_01", "Female"}, {"RE_WAGONTHREAT_FEMALES_01", "Female"}, {"RE_WAGONTHREAT_MALES_01", "Male"}, {"RE_WASHEDASHORE_MALES_01", "Male"}, {"RE_WEALTHYCOUPLE_FEMALES_01", "Female"}, {"RE_WEALTHYCOUPLE_MALES_01", "Male"}, {"RE_WILDMAN_01", "Male"}, {"S_F_M_BwmWorker_01", "Female"}, {"S_F_M_CghWorker_01", "Female"}, {"S_F_M_MaPWorker_01", "Female"}, {"S_M_M_AmbientBlWPolice_01", "Male"}, {"S_M_M_AmbientLawRural_01", "Male"}, {"S_M_M_AmbientSDPolice_01", "Male"}, {"S_M_M_Army_01", "Male"}, {"S_M_M_ASBCowpoke_01", "Male"}, {"S_M_M_ASBDEALER_01", "Male"}, {"S_M_M_BankClerk_01", "Male"}, {"S_M_M_Barber_01", "Male"}, {"S_M_M_BLWCOWPOKE_01", "Male"}, {"S_M_M_BLWDEALER_01", "Male"}, {"S_M_M_BwmWorker_01", "Male"}, {"S_M_M_CghWorker_01", "Male"}, {"S_M_M_CKTWorker_01", "Male"}, {"S_M_M_COACHTAXIDRIVER_01", "Male"}, {"S_M_M_CornwallGuard_01", "Male"}, {"S_M_M_DispatchLawRural_01", "Male"}, {"S_M_M_DispatchLeaderPolice_01", "Male"}, {"S_M_M_DispatchLeaderRural_01", "Male"}, {"S_M_M_DispatchPolice_01", "Male"}, {"S_M_M_FussarHenchman_01", "Male"}, {"S_M_M_GENCONDUCTOR_01", "Male"}, {"S_M_M_HOFGuard_01", "Male"}, {"S_M_M_LiveryWorker_01", "Male"}, {"S_M_M_MAGICLANTERN_01", "Male"}, {"S_M_M_MaPWorker_01", "Male"}, {"S_M_M_MarketVendor_01", "Male"}, {"S_M_M_MARSHALLSRURAL_01", "Male"}, {"S_M_M_MicGuard_01", "Male"}, {"S_M_M_NBXRIVERBOATDEALERS_01", "Male"}, {"S_M_M_NbxRiverBoatGuards_01", "Male"}, {"S_M_M_ORPGUARD_01", "Male"}, {"S_M_M_PinLaw_01", "Male"}, {"S_M_M_RACRAILGUARDS_01", "Male"}, {"S_M_M_RaCRailWorker_01", "Male"}, {"S_M_M_RHDCOWPOKE_01", "Male"}, {"S_M_M_RHDDEALER_01", "Male"}, {"S_M_M_SDCOWPOKE_01", "Male"}, {"S_M_M_SDDEALER_01", "Male"}, {"S_M_M_SDTICKETSELLER_01", "Male"}, {"S_M_M_SkpGuard_01", "Male"}, {"S_M_M_StGSailor_01", "Male"}, {"S_M_M_STRCOWPOKE_01", "Male"}, {"S_M_M_STRDEALER_01", "Male"}, {"S_M_M_StrLumberjack_01", "Male"}, {"S_M_M_Tailor_01", "Male"}, {"S_M_M_TrainStationWorker_01", "Male"}, {"S_M_M_TumDeputies_01", "Male"}, {"S_M_M_UNIBUTCHERS_01", "Male"}, {"S_M_M_UniTrainEngineer_01", "Male"}, {"S_M_M_UniTrainGuards_01", "Male"}, {"S_M_M_ValBankGuards_01", "Male"}, {"S_M_M_ValCowpoke_01", "Male"}, {"S_M_M_VALDEALER_01", "Male"}, {"S_M_M_VALDEPUTY_01", "Male"}, {"S_M_M_VHTDEALER_01", "Male"}, {"S_M_O_CKTWorker_01", "Male"}, {"S_M_Y_Army_01", "Male"}, {"S_M_Y_NewspaperBoy_01", "Female"}, {"S_M_Y_RaCRailWorker_01", "Male"}, {"SALOONBRAWLERS_02", "Male"}, {"SALOONBRAWLERS_03", "Male"}, {"SALOONBRAWLERS_04", "Male"}, {"SALOONBRAWLERS_05", "Male"}, {"SALOONBRAWLERS_06", "Male"}, {"SALOONBRAWLERS_07", "Male"}, {"SALOONBRAWLERS_08", "Male"}, {"SALOONBRAWLERS_09", "Male"}, {"SALOONBRAWLERS_10", "Male"}, {"SALOONBRAWLERS_11", "Male"}, {"SALOONBRAWLERS_12", "Male"}, {"SALOONBRAWLERS_13", "Male"}, {"SALOONBRAWLERS_14", "Male"}, {"U_F_M_BHT_WIFE", "Female"}, {"U_F_M_CIRCUSWAGON_01", "Female"}, {"U_F_M_EMRDAUGHTER_01", "Female"}, {"U_F_M_FUSSAR1LADY_01", "Female"}, {"U_F_M_HTLWIFE_01", "Female"}, {"U_F_M_LagMother_01", "Female"}, {"U_F_M_NbxResident_01", "Female"}, {"U_F_M_RhdNudeWoman_01", "Female"}, {"U_F_M_RkSHomesteadTenant_01", "Female"}, {"U_F_M_STORY_BLACKBELLE_01", "Female"}, {"U_F_M_STORY_NIGHTFOLK_01", "Female"}, {"U_F_M_TljBartender_01", "Female"}, {"U_F_M_TumGeneralStoreOwner_01", "Female"}, {"U_F_M_ValTownfolk_01", "Female"}, {"U_F_M_ValTownfolk_02", "Female"}, {"U_F_M_VHTBARTENDER_01", "Female"}, {"U_F_O_Hermit_woman_01", "Female"}, {"U_F_O_WtCTownfolk_01", "Female"}, {"U_F_Y_BRAITHWAITESSECRET_01", "Female"}, {"U_F_Y_CzPHomesteadDaughter_01", "Female"}, {"U_M_M_ANNOUNCER_01", "Male"}, {"U_M_M_APFDeadMan_01", "Male"}, {"U_M_M_ARMGENERALSTOREOWNER_01", "Male"}, {"U_M_M_ARMTRAINSTATIONWORKER_01", "Male"}, {"U_M_M_ARMUNDERTAKER_01", "Male"}, {"U_M_M_ARMYTRN4_01", "Male"}, {"U_M_M_AsbGunsmith_01", "Male"}, {"U_M_M_AsbPrisoner_01", "Male"}, {"U_M_M_AsbPrisoner_02", "Male"}, {"U_M_M_BHT_BANDITOMINE", "Male"}, {"U_M_M_BHT_BANDITOSHACK", "Male"}, {"U_M_M_BHT_BENEDICTALLBRIGHT", "Male"}, {"U_M_M_BHT_BLACKWATERHUNT", "Male"}, {"U_M_M_BHT_LOVER", "Male"}, {"U_M_M_BHT_MINEFOREMAN", "Male"}, {"U_M_M_BHT_NATHANKIRK", "Male"}, {"U_M_M_BHT_ODRISCOLLDRUNK", "Male"}, {"U_M_M_BHT_ODRISCOLLMAULED", "Male"}, {"U_M_M_BHT_ODRISCOLLSLEEPING", "Male"}, {"U_M_M_BHT_OLDMAN", "Male"}, {"U_M_M_BHT_OUTLAWMAULED", "Male"}, {"U_M_M_BHT_SAINTDENISSALOON", "Male"}, {"U_M_M_BHT_SHACKESCAPE", "Male"}, {"U_M_M_BHT_SKINNERBROTHER", "Male"}, {"U_M_M_BHT_SKINNERSEARCH", "Male"}, {"U_M_M_BHT_STRAWBERRYDUEL", "Male"}, {"U_M_M_BiVForeman_01", "Male"}, {"U_M_M_BlWTrainStationWorker_01", "Male"}, {"U_M_M_BULLETCATCHVOLUNTEER_01", "Male"}, {"U_M_M_BwmStablehand_01", "Male"}, {"U_M_M_CAJHOMESTEAD_01", "Male"}, {"U_M_M_CHELONIANJUMPER_01", "Male"}, {"U_M_M_CHELONIANJUMPER_02", "Male"}, {"U_M_M_CHELONIANJUMPER_03", "Male"}, {"U_M_M_CHELONIANJUMPER_04", "Male"}, {"U_M_M_CircusWagon_01", "Male"}, {"U_M_M_CKTManager_01", "Male"}, {"U_M_M_CORNWALLDRIVER_01", "Male"}, {"U_M_M_CrDHomesteadTenant_01", "Male"}, {"U_M_M_CRDHOMESTEADTENANT_02", "Male"}, {"U_M_M_CRDWITNESS_01", "Male"}, {"U_M_M_CreoleCaptain_01", "Male"}, {"U_M_M_CzPHomesteadFather_01", "Male"}, {"U_M_M_DorHomesteadHusband_01", "Male"}, {"U_M_M_EmRFarmHand_03", "Male"}, {"U_M_M_EmRFather_01", "Male"}, {"U_M_M_EXECUTIONER_01", "Male"}, {"U_M_M_FATDUSTER_01", "Male"}, {"U_M_M_FINALE2_AA_UPPERCLASS_01", "Male"}, {"U_M_M_GalaStringQuartet_01", "Male"}, {"U_M_M_GalaStringQuartet_02", "Male"}, {"U_M_M_GalaStringQuartet_03", "Male"}, {"U_M_M_GalaStringQuartet_04", "Male"}, {"U_M_M_GAMDoorman_01", "Male"}, {"U_M_M_HHRRANCHER_01", "Male"}, {"U_M_M_HtlForeman_01", "Male"}, {"U_M_M_HTLHUSBAND_01", "Male"}, {"U_M_M_HtlRancherBounty_01", "Male"}, {"U_M_M_ISLBUM_01", "Male"}, {"U_M_M_LNSOUTLAW_01", "Male"}, {"U_M_M_LNSOUTLAW_02", "Male"}, {"U_M_M_lnsoutlaw_03", "Male"}, {"U_M_M_LNSOUTLAW_04", "Male"}, {"U_M_M_LnSWorker_01", "Male"}, {"U_M_M_LnSWorker_02", "Male"}, {"U_M_M_LnSWorker_03", "Male"}, {"U_M_M_LnSWorker_04", "Male"}, {"U_M_M_LrsHomesteadTenant_01", "Male"}, {"U_M_M_MFRRANCHER_01", "Male"}, {"U_M_M_MUD3PIMP_01", "Male"}, {"U_M_M_NbxBankerBounty_01", "Male"}, {"U_M_M_NbxBartender_01", "Male"}, {"U_M_M_NbxBartender_02", "Male"}, {"U_M_M_NbxBoatTicketSeller_01", "Male"}, {"U_M_M_NbxBronteAsc_01", "Male"}, {"U_M_M_NbxBronteGoon_01", "Male"}, {"U_M_M_NbxBronteSecForm_01", "Male"}, {"U_M_M_NbxGeneralStoreOwner_01", "Male"}, {"U_M_M_NBXGraverobber_01", "Male"}, {"U_M_M_NBXGraverobber_02", "Male"}, {"U_M_M_NBXGraverobber_03", "Male"}, {"U_M_M_NBXGraverobber_04", "Male"}, {"U_M_M_NBXGraverobber_05", "Male"}, {"U_M_M_NbxGunsmith_01", "Male"}, {"U_M_M_NBXLiveryWorker_01", "Male"}, {"U_M_M_NbxMusician_01", "Male"}, {"U_M_M_NbxPriest_01", "Male"}, {"U_M_M_NbxResident_01", "Male"}, {"U_M_M_NbxResident_02", "Male"}, {"U_M_M_NbxResident_03", "Male"}, {"U_M_M_NbxResident_04", "Male"}, {"U_M_M_NBXRIVERBOATPITBOSS_01", "Male"}, {"U_M_M_NBXRIVERBOATTARGET_01", "Male"}, {"U_M_M_NBXShadyDealer_01", "Male"}, {"U_M_M_NbxSkiffDriver_01", "Male"}, {"U_M_M_ODDFELLOWPARTICIPANT_01", "Male"}, {"U_M_M_ODriscollBrawler_01", "Male"}, {"U_M_M_ORPGUARD_01", "Male"}, {"U_M_M_RaCForeman_01", "Male"}, {"U_M_M_RaCQuarterMaster_01", "Male"}, {"U_M_M_RhdBackupDeputy_01", "Male"}, {"U_M_M_RhdBackupDeputy_02", "Male"}, {"U_M_M_RhdBartender_01", "Male"}, {"U_M_M_RHDDOCTOR_01", "Male"}, {"U_M_M_RhdFiddlePlayer_01", "Male"}, {"U_M_M_RhdGenStoreOwner_01", "Male"}, {"U_M_M_RhdGenStoreOwner_02", "Male"}, {"U_M_M_RhdGunsmith_01", "Male"}, {"U_M_M_RhdPreacher_01", "Male"}, {"U_M_M_RhdSheriff_01", "Male"}, {"U_M_M_RhdTrainStationWorker_01", "Male"}, {"U_M_M_RhdUndertaker_01", "Male"}, {"U_M_M_RIODONKEYRIDER_01", "Male"}, {"U_M_M_RKFRANCHER_01", "Male"}, {"U_M_M_RKRDONKEYRIDER_01", "Male"}, {"U_M_M_RWFRANCHER_01", "Male"}, {"U_M_M_SDBANKGUARD_01", "Male"}, {"U_M_M_SDCUSTOMVENDOR_01", "Male"}, {"U_M_M_SDEXOTICSSHOPKEEPER_01", "Male"}, {"U_M_M_SDPHOTOGRAPHER_01", "Male"}, {"U_M_M_SDPoliceChief_01", "Male"}, {"U_M_M_SDSTRONGWOMANASSISTANT_01", "Male"}, {"U_M_M_SDTRAPPER_01", "Male"}, {"U_M_M_SDWEALTHYTRAVELLER_01", "Male"}, {"U_M_M_SHACKSERIALKILLER_01", "Male"}, {"U_M_M_SHACKTWIN_01", "Male"}, {"U_M_M_SHACKTWIN_02", "Male"}, {"U_M_M_SKINNYOLDGUY_01", "Male"}, {"U_M_M_STORY_ARMADILLO_01", "Male"}, {"U_M_M_story_CANNIBAL_01", "Male"}, {"U_M_M_STORY_CHELONIAN_01", "Male"}, {"U_M_M_story_COPPERHEAD_01", "Male"}, {"U_M_M_story_CREEPER_01", "Male"}, {"U_M_M_STORY_EMERALDRANCH_01", "Male"}, {"U_M_M_story_HUNTER_01", "Male"}, {"U_M_M_story_MANZANITA_01", "Male"}, {"U_M_M_story_MURFEE_01", "Male"}, {"U_M_M_story_PIGFARM_01", "Male"}, {"U_M_M_story_PRINCESS_01", "Male"}, {"U_M_M_story_REDHARLOW_01", "Male"}, {"U_M_M_story_RHODES_01", "Male"}, {"U_M_M_STORY_SDSTATUE_01", "Male"}, {"U_M_M_story_SPECTRE_01", "Male"}, {"U_M_M_story_TREASURE_01", "Male"}, {"U_M_M_STORY_TUMBLEWEED_01", "Male"}, {"U_M_M_story_VALENTINE_01", "Male"}, {"U_M_M_StrFreightStationOwner_01", "Male"}, {"U_M_M_StrGenStoreOwner_01", "Male"}, {"U_M_M_StrSherriff_01", "Male"}, {"U_M_M_STRWELCOMECENTER_01", "Male"}, {"U_M_M_TumBartender_01", "Male"}, {"U_M_M_TumButcher_01", "Male"}, {"U_M_M_TumGunsmith_01", "Male"}, {"U_M_M_TUMTRAINSTATIONWORKER_01", "Male"}, {"U_M_M_UniBountyHunter_01", "Male"}, {"U_M_M_UniBountyHunter_02", "Male"}, {"U_M_M_UNIDUSTERHENCHMAN_01", "Male"}, {"U_M_M_UNIDUSTERHENCHMAN_02", "Male"}, {"U_M_M_UNIDUSTERHENCHMAN_03", "Male"}, {"U_M_M_UniDusterLeader_01", "Male"}, {"U_M_M_UniExConfedsBounty_01", "Male"}, {"U_M_M_UNIONLEADER_01", "Male"}, {"U_M_M_UNIONLEADER_02", "Male"}, {"U_M_M_UniPeepingTom_01", "Male"}, {"U_M_M_ValAuctionForman_01", "Male"}, {"U_M_M_ValAuctionForman_02", "Male"}, {"U_M_M_ValBarber_01", "Male"}, {"U_M_M_ValBartender_01", "Male"}, {"U_M_M_ValBearTrap_01", "Male"}, {"U_M_M_VALBUTCHER_01", "Male"}, {"U_M_M_ValDoctor_01", "Male"}, {"U_M_M_ValGenStoreOwner_01", "Male"}, {"U_M_M_ValGunsmith_01", "Male"}, {"U_M_M_ValHotelOwner_01", "Male"}, {"U_M_M_ValPokerPlayer_01", "Male"}, {"U_M_M_ValPokerPlayer_02", "Male"}, {"U_M_M_ValPoopingMan_01", "Female"}, {"U_M_M_ValSheriff_01", "Male"}, {"U_M_M_VALTHEMAN_01", "Male"}, {"U_M_M_ValTownfolk_01", "Male"}, {"U_M_M_ValTownfolk_02", "Male"}, {"U_M_M_VhtStationClerk_01", "Male"}, {"U_M_M_WaLGENERALSTOREOWNER_01", "Male"}, {"U_M_M_WAPOFFICIAL_01", "Male"}, {"U_M_M_WtCCowboy_04", "Male"}, {"U_M_O_ARMBARTENDER_01", "Male"}, {"U_M_O_AsbSheriff_01", "Male"}, {"U_M_O_BHT_DOCWORMWOOD", "Male"}, {"U_M_O_BlWBartender_01", "Male"}, {"U_M_O_BlWGeneralStoreOwner_01", "Male"}, {"U_M_O_BLWPHOTOGRAPHER_01", "Male"}, {"U_M_O_BlWPoliceChief_01", "Male"}, {"U_M_O_CaJHomestead_01", "Male"}, {"U_M_O_CMRCIVILWARCOMMANDO_01", "Male"}, {"U_M_O_MaPWiseOldMan_01", "Male"}, {"U_M_O_OLDCAJUN_01", "Male"}, {"U_M_O_PSHRancher_01", "Male"}, {"U_M_O_RigTrainStationWorker_01", "Male"}, {"U_M_O_ValBartender_01", "Male"}, {"U_M_O_VhTExoticShopkeeper_01", "Male"}, {"U_M_Y_CajHomeStead_01", "Male"}, {"U_M_Y_CzPHomesteadSon_01", "Male"}, {"U_M_Y_CzPHomesteadSon_02", "Male"}, {"U_M_Y_CzPHomesteadSon_03", "Male"}, {"U_M_Y_CZPHOMESTEADSON_04", "Male"}, {"U_M_Y_CZPHOMESTEADSON_05", "Male"}, {"U_M_Y_DuelListBounty_01", "Male"}, {"U_M_Y_EmRSon_01", "Male"}, {"U_M_Y_HtlWorker_01", "Male"}, {"U_M_Y_HtlWorker_02", "Male"}, {"U_M_Y_ShackStarvingKid_01", "Male"}, {"A_C_Alligator_01", "Male"}, {"A_C_Alligator_02", "Male"}, {"A_C_Alligator_03", "unknown"}, {"A_C_Armadillo_01", "unknown"}, {"A_C_Badger_01", "unknown"}, {"A_C_Bat_01", "Male"}, {"A_C_Bear_01", "Male"}, {"A_C_BearBlack_01", "Male"}, {"A_C_Beaver_01", "unknown"}, {"A_C_BigHornRam_01", "Female"}, {"A_C_BlueJay_01", "unknown"}, {"A_C_Boar_01", "Male"}, {"A_C_BoarLegendary_01", "Male"}, {"A_C_Buck_01", "Male"}, {"A_C_Buffalo_01", "Male"}, {"A_C_Buffalo_Tatanka_01", "unknown"}, {"A_C_Bull_01", "Male"}, {"A_C_CaliforniaCondor_01", "unknown"}, {"A_C_Cardinal_01", "unknown"}, {"A_C_CarolinaParakeet_01", "Male"}, {"A_C_Cat_01", "unknown"}, {"A_C_CedarWaxwing_01", "unknown"}, {"A_C_Chicken_01", "unknown"}, {"A_C_Chipmunk_01", "unknown"}, {"A_C_Cormorant_01", "unknown"}, {"A_C_Cougar_01", "Male"}, {"A_C_Cow", "unknown"}, {"A_C_Coyote_01", "unknown"}, {"A_C_Crab_01", "unknown"}, {"A_C_CraneWhooping_01", "unknown"}, {"A_C_Crawfish_01", "unknown"}, {"A_C_Crow_01", "unknown"}, {"A_C_Deer_01", "Female"}, {"A_C_DogAmericanFoxhound_01", "unknown"}, {"A_C_DogAustralianSheperd_01", "unknown"}, {"A_C_DogBluetickCoonhound_01", "unknown"}, {"A_C_DogCatahoulaCur_01", "unknown"}, {"A_C_DogChesBayRetriever_01", "unknown"}, {"A_C_DogCollie_01", "unknown"}, {"A_C_DogHobo_01", "unknown"}, {"A_C_DogHound_01", "unknown"}, {"A_C_DogHusky_01", "unknown"}, {"A_C_DogLab_01", "unknown"}, {"A_C_DogLion_01", "unknown"}, {"A_C_DogPoodle_01", "unknown"}, {"A_C_DogRufus_01", "unknown"}, {"A_C_DogStreet_01", "unknown"}, {"A_C_Donkey_01", "unknown"}, {"A_C_Duck_01", "unknown"}, {"A_C_EAGLE_01", "unknown"}, {"A_C_Eagle_01", "unknown"}, {"A_C_Egret_01", "unknown"}, {"A_C_Elk_01", "unknown"}, {"A_C_FishBluegil_01_ms", "unknown"}, {"A_C_FishBluegil_01_sm", "unknown"}, {"A_C_FishBullHeadCat_01_ms", "unknown"}, {"A_C_FishBullHeadCat_01_sm", "unknown"}, {"A_C_FishChainPickerel_01_ms", "unknown"}, {"A_C_FishChainPickerel_01_sm", "unknown"}, {"A_C_FishChannelCatfish_01_lg", "unknown"}, {"A_C_FishChannelCatfish_01_XL", "unknown"}, {"A_C_FishLakeSturgeon_01_lg", "unknown"}, {"A_C_FishLargeMouthBass_01_lg", "unknown"}, {"A_C_FishLargeMouthBass_01_ms", "unknown"}, {"A_C_FishLongNoseGar_01_lg", "unknown"}, {"A_C_FishMuskie_01_lg", "unknown"}, {"A_C_FishNorthernPike_01_lg", "unknown"}, {"A_C_FishPerch_01_ms", "unknown"}, {"A_C_FishPerch_01_sm", "unknown"}, {"A_C_FishRainbowTrout_01_lg", "unknown"}, {"A_C_FishRainbowTrout_01_ms", "unknown"}, {"A_C_FishRedfinPickerel_01_ms", "unknown"}, {"A_C_FishRedfinPickerel_01_sm", "unknown"}, {"A_C_FishRockBass_01_ms", "unknown"}, {"A_C_FishRockBass_01_sm", "unknown"}, {"A_C_FishSalmonSockeye_01_lg", "unknown"}, {"A_C_FishSalmonSockeye_01_ml", "unknown"}, {"A_C_FishSalmonSockeye_01_ms", "unknown"}, {"A_C_FishSmallMouthBass_01_lg", "unknown"}, {"A_C_FishSmallMouthBass_01_ms", "unknown"}, {"A_C_Fox_01", "unknown"}, {"A_C_FrogBull_01", "unknown"}, {"A_C_GilaMonster_01", "unknown"}, {"A_C_Goat_01", "unknown"}, {"A_C_GooseCanada_01", "unknown"}, {"A_C_Hawk_01", "unknown"}, {"A_C_Heron_01", "unknown"}, {"A_C_Horse_AmericanPaint_Greyovero", "unknown"}, {"A_C_Horse_AmericanPaint_Overo", "unknown"}, {"A_C_Horse_AmericanPaint_SplashedWhite", "unknown"}, {"A_C_Horse_AmericanPaint_Tobiano", "unknown"}, {"A_C_Horse_AmericanStandardbred_Black", "unknown"}, {"A_C_Horse_AmericanStandardbred_Buckskin", "unknown"}, {"A_C_Horse_AmericanStandardbred_Lightbuckskin", "unknown"}, {"A_C_Horse_AmericanStandardbred_PalominoDapple", "unknown"}, {"A_C_Horse_AmericanStandardbred_SilverTailBuckskin", "unknown"}, {"A_C_Horse_Andalusian_DarkBay", "unknown"}, {"A_C_Horse_Andalusian_Perlino", "unknown"}, {"A_C_Horse_Andalusian_Perlino", "Female"}, {"A_C_Horse_Andalusian_RoseGray", "unknown"}, {"A_C_Horse_Appaloosa_BlackSnowflake", "unknown"}, {"A_C_Horse_Appaloosa_Blanket", "unknown"}, {"A_C_Horse_Appaloosa_BrownLeopard", "unknown"}, {"A_C_Horse_Appaloosa_FewSpotted_PC", "unknown"}, {"A_C_Horse_Appaloosa_Leopard", "unknown"}, {"A_C_Horse_Appaloosa_LeopardBlanket", "unknown"}, {"A_C_Horse_Arabian_Black", "unknown"}, {"A_C_Horse_Arabian_Grey", "unknown"}, {"A_C_Horse_Arabian_RedChestnut", "unknown"}, {"A_C_Horse_Arabian_RedChestnut_PC", "unknown"}, {"A_C_Horse_Arabian_RoseGreyBay", "unknown"}, {"A_C_Horse_Arabian_WarpedBrindle_PC", "unknown"}, {"A_C_Horse_Arabian_White", "Female"}, {"A_C_Horse_Ardennes_BayRoan", "unknown"}, {"A_C_Horse_Ardennes_IronGreyRoan", "Male"}, {"A_C_Horse_Ardennes_StrawberryRoan", "unknown"}, {"A_C_Horse_Belgian_BlondChestnut", "unknown"}, {"A_C_Horse_Belgian_MealyChestnut", "unknown"}, {"A_C_Horse_Breton_GrulloDun", "Male"}, {"A_C_Horse_Breton_MealyDappleBay", "Male"}, {"A_C_Horse_Breton_RedRoan", "Male"}, {"A_C_Horse_Breton_Sealbrown", "Female"}, {"A_C_Horse_Breton_Sorrel", "unknown"}, {"A_C_Horse_Breton_SteelGrey", "Male"}, {"A_C_Horse_Buell_WarVets", "Male"}, {"A_C_Horse_Criollo_Baybrindle", "unknown"}, {"A_C_Horse_Criollo_Bayframeovero", "unknown"}, {"A_C_Horse_Criollo_Blueroanovero", "unknown"}, {"A_C_Horse_Criollo_Dun", "unknown"}, {"A_C_Horse_Criollo_Marblesabino", "unknown"}, {"A_C_Horse_Criollo_Sorrelovero", "unknown"}, {"A_C_Horse_DutchWarmblood_ChocolateRoan", "unknown"}, {"A_C_Horse_DutchWarmblood_SealBrown", "unknown"}, {"A_C_Horse_DutchWarmblood_SootyBuckskin", "unknown"}, {"A_C_Horse_EagleFlies", "Male"}, {"A_C_Horse_Gang_arthur", "Male"}, {"A_C_Horse_Gang_Bill", "Male"}, {"A_C_Horse_Gang_Charles", "unknown"}, {"A_C_Horse_Gang_Charles_EndlessSummer", "Male"}, {"A_C_Horse_Gang_Hosea", "Male"}, {"A_C_Horse_Gang_Javier", "unknown"}, {"A_C_Horse_Gang_John", "Male"}, {"A_C_Horse_Gang_Karen", "Female"}, {"A_C_Horse_Gang_Kieran", "unknown"}, {"A_C_Horse_Gang_Micah", "Male"}, {"A_C_Horse_Gang_Sadie", "Male"}, {"A_C_Horse_Gang_Sean", "unknown"}, {"A_C_Horse_Gang_Trelawney", "unknown"}, {"A_C_Horse_Gang_Uncle", "Female"}, {"A_C_Horse_Gang_Uncle_EndlessSummer", "Female"}, {"A_C_Horse_GypsyCob_PalominoBlagdon", "unknown"}, {"A_C_Horse_GypsyCob_Piebald", "unknown"}, {"A_C_Horse_GypsyCob_Skewbald", "unknown"}, {"A_C_Horse_GypsyCob_SplashedBay", "Male"}, {"A_C_Horse_GypsyCob_SplashedPiebald", "unknown"}, {"A_C_Horse_GypsyCob_WhiteBlagdon", "unknown"}, {"A_C_Horse_HungarianHalfbred_DarkDappleGrey", "unknown"}, {"A_C_Horse_HungarianHalfbred_FlaxenChestnut", "unknown"}, {"A_C_Horse_HungarianHalfbred_LiverChestnut", "Female"}, {"A_C_Horse_HungarianHalfbred_PiebaldTobiano", "unknown"}, {"A_C_Horse_John_EndlessSummer", "Female"}, {"A_C_Horse_KentuckySaddle_Black", "unknown"}, {"A_C_Horse_KentuckySaddle_ButterMilkBuckskin_PC", "unknown"}, {"A_C_Horse_KentuckySaddle_ChestnutPinto", "unknown"}, {"A_C_Horse_KentuckySaddle_Grey", "unknown"}, {"A_C_Horse_KentuckySaddle_SilverBay", "unknown"}, {"A_C_Horse_Kladruber_Black", "unknown"}, {"A_C_Horse_Kladruber_Cremello", "unknown"}, {"A_C_Horse_Kladruber_Dapplerosegrey", "unknown"}, {"A_C_Horse_Kladruber_Grey", "unknown"}, {"A_C_Horse_Kladruber_Silver", "unknown"}, {"A_C_Horse_Kladruber_White", "unknown"}, {"A_C_Horse_MissouriFoxTrotter_AmberChampagne", "unknown"}, {"A_C_Horse_MissouriFoxTrotter_Blacktovero", "unknown"}, {"A_C_HORSE_MISSOURIFOXTROTTER_BLUEROAN", "Male"}, {"A_C_Horse_MissouriFoxTrotter_Buckskinbrindle", "unknown"}, {"A_C_HORSE_MISSOURIFOXTROTTER_DAPPLEGREY", "unknown"}, {"A_C_Horse_MissouriFoxTrotter_SableChampagne", "unknown"}, {"A_C_Horse_MissouriFoxTrotter_SilverDapplePinto", "Male"}, {"A_C_Horse_Morgan_Bay", "unknown"}, {"A_C_Horse_Morgan_BayRoan", "unknown"}, {"A_C_Horse_Morgan_FlaxenChestnut", "unknown"}, {"A_C_Horse_Morgan_LiverChestnut_PC", "unknown"}, {"A_C_Horse_Morgan_Palomino", "unknown"}, {"A_C_Horse_MP_Mangy_Backup", "unknown"}, {"A_C_Horse_MurfreeBrood_Mange_01", "unknown"}, {"A_C_Horse_MurfreeBrood_Mange_02", "unknown"}, {"A_C_Horse_MurfreeBrood_Mange_03", "unknown"}, {"A_C_HORSE_MUSTANG_BLACKOVERO", "Male"}, {"A_C_HORSE_MUSTANG_BUCKSKIN", "Male"}, {"A_C_HORSE_MUSTANG_CHESTNUTTOVERO", "unknown"}, {"A_C_Horse_Mustang_GoldenDun", "Female"}, {"A_C_Horse_Mustang_GrulloDun", "unknown"}, {"A_C_HORSE_MUSTANG_REDDUNOVERO", "unknown"}, {"A_C_Horse_Mustang_TigerStripedBay", "Female"}, {"A_C_Horse_Mustang_WildBay", "unknown"}, {"A_C_Horse_Nokota_BlueRoan", "unknown"}, {"A_C_Horse_Nokota_ReverseDappleRoan", "unknown"}, {"A_C_Horse_Nokota_WhiteRoan", "unknown"}, {"A_C_Horse_NorfolkRoadster_Black", "unknown"}, {"A_C_Horse_NorfolkRoadster_DappledBuckskin", "unknown"}, {"A_C_Horse_NorfolkRoadster_PiebaldRoan", "unknown"}, {"A_C_Horse_NorfolkRoadster_RoseGrey", "unknown"}, {"A_C_Horse_NorfolkRoadster_SpeckledGrey", "unknown"}, {"A_C_Horse_NorfolkRoadster_SpottedTricolor", "Male"}, {"A_C_Horse_Shire_DarkBay", "unknown"}, {"A_C_Horse_Shire_LightGrey", "unknown"}, {"A_C_Horse_Shire_RavenBlack", "Male"}, {"A_C_Horse_SuffolkPunch_RedChestnut", "unknown"}, {"A_C_Horse_SuffolkPunch_Sorrel", "unknown"}, {"A_C_Horse_TennesseeWalker_BlackRabicano", "unknown"}, {"A_C_Horse_TennesseeWalker_Chestnut", "unknown"}, {"A_C_Horse_TennesseeWalker_DappleBay", "unknown"}, {"A_C_Horse_TennesseeWalker_FlaxenRoan", "unknown"}, {"A_C_Horse_TennesseeWalker_GoldPalomino_PC", "unknown"}, {"A_C_Horse_TennesseeWalker_MahoganyBay", "unknown"}, {"A_C_Horse_TennesseeWalker_RedRoan", "unknown"}, {"A_C_Horse_Thoroughbred_BlackChestnut", "unknown"}, {"A_C_Horse_Thoroughbred_BloodBay", "unknown"}, {"A_C_Horse_Thoroughbred_Brindle", "Male"}, {"A_C_Horse_Thoroughbred_DappleGrey", "unknown"}, {"A_C_Horse_Thoroughbred_ReverseDappleBlack", "unknown"}, {"A_C_HORSE_TURKOMAN_BLACK", "unknown"}, {"A_C_HORSE_TURKOMAN_CHESTNUT", "Male"}, {"A_C_Horse_Turkoman_DarkBay", "unknown"}, {"A_C_Horse_Turkoman_Gold", "unknown"}, {"A_C_HORSE_TURKOMAN_GREY", "unknown"}, {"A_C_HORSE_TURKOMAN_PERLINO", "unknown"}, {"A_C_Horse_Turkoman_Silver", "unknown"}, {"A_C_Horse_Winter02_01", "unknown"}, {"A_C_HorseMule_01", "unknown"}, {"A_C_HorseMulePainted_01", "unknown"}, {"A_C_Iguana_01", "unknown"}, {"A_C_IguanaDesert_01", "unknown"}, {"A_C_Javelina_01", "unknown"}, {"A_C_LionMangy_01", "unknown"}, {"A_C_Loon_01", "unknown"}, {"A_C_Moose_01", "Male"}, {"A_C_Muskrat_01", "unknown"}, {"A_C_Oriole_01", "unknown"}, {"A_C_Owl_01", "unknown"}, {"A_C_Ox_01", "unknown"}, {"A_C_Panther_01", "unknown"}, {"A_C_PantherLegendaryr_01", "unknown"}, {"A_C_Parrot_01", "unknown"}, {"A_C_Pelican_01", "unknown"}, {"A_C_Pheasant_01", "unknown"}, {"A_C_Pig_01", "Male"}, {"A_C_Pigeon", "unknown"}, {"A_C_Possum_01", "unknown"}, {"A_C_PrairieChicken_01", "unknown"}, {"A_C_Pronghorn_01", "unknown"}, {"A_C_Quail_01", "unknown"}, {"A_C_Rabbit_01", "unknown"}, {"A_C_Raccoon_01", "unknown"}, {"A_C_Rat_01", "unknown"}, {"A_C_Raven_01", "unknown"}, {"A_C_RedFootedBooby_01", "unknown"}, {"A_C_Robin_01", "unknown"}, {"A_C_Rooster_01", "unknown"}, {"A_C_RoseateSpoonbill_01", "unknown"}, {"A_C_Seagull_01", "unknown"}, {"A_C_SharkHammerhead_01", "unknown"}, {"A_C_SharkTiger", "unknown"}, {"A_C_Sheep_01", "Male"}, {"A_C_Skunk_01", "unknown"}, {"A_C_Snake_01", "unknown"}, {"A_C_Snake_Pelt_01", "unknown"}, {"A_C_SnakeBlackTailRattle_01", "unknown"}, {"A_C_SnakeBlackTailRattle_Pelt_01", "unknown"}, {"A_C_SnakeFerDeLance_01", "unknown"}, {"A_C_SnakeFerDeLance_Pelt_01", "unknown"}, {"A_C_SnakeRedBoa_01", "unknown"}, {"A_C_SnakeRedBoa_Pelt_01", "unknown"}, {"A_C_SnakeRedBoa10ft_01", "unknown"}, {"A_C_SnakeWater_01", "unknown"}, {"A_C_SnakeWater_Pelt_01", "unknown"}, {"A_C_SongBird_01", "unknown"}, {"A_C_Sparrow_01", "unknown"}, {"A_C_Spot_Gang_Charles", "Male"}, {"A_C_Squirrel_01", "unknown"}, {"A_C_Toad_01", "unknown"}, {"A_C_Turkey_01", "unknown"}, {"A_C_Turkey_02", "unknown"}, {"A_C_TurkeyWild_01", "unknown"}, {"A_C_TurtleSea_01", "unknown"}, {"A_C_TurtleSnapping_01", "unknown"}, {"A_C_Vulture_01", "unknown"}, {"A_C_Wolf", "Male"}, {"A_C_Wolf_Medium", "unknown"}, {"A_C_Wolf_Small", "unknown"}, {"A_C_Woodpecker_01", "unknown"}, {"A_C_Woodpecker_02", "unknown"}, {"armadillo", "Female"}, {"ggrcez", "Male"}, {"LegendaryPanther", "unknown"}, {"MP_A_C_Alligator_01", "unknown"}, {"MP_A_C_Beaver_01", "Male"}, {"MP_A_C_BIGHORNRAM_01", "unknown"}, {"MP_A_C_Boar_01", "unknown"}, {"MP_A_C_BUCK_01", "unknown"}, {"MP_A_C_BUFFALO_01", "unknown"}, {"MP_A_C_Cougar_01", "unknown"}, {"MP_A_C_Coyote_01", "Male"}, {"MP_A_C_DEER", "unknown"}, {"MP_A_C_DOGAMERICANFOXHOUND_01", "unknown"}, {"MP_A_C_ELK_01", "unknown"}, {"MP_A_C_FOX_01", "unknown"}, {"MP_A_C_HORSECORPSE_01", "unknown"}, {"MP_A_C_MOOSE_01", "Male"}, {"MP_A_C_OWL_01", "unknown"}, {"MP_A_C_Panther_01", "Male"}, {"MP_A_C_POSSUM_01", "unknown"}, {"MP_A_C_PRONGHORN_01", "unknown"}, {"MP_A_C_RABBIT_01", "unknown"}, {"MP_A_C_RAM_01", "unknown"}, {"MP_A_C_SHEEP_01", "unknown"}, {"MP_A_C_Wolf_01", "unknown"}, {"MP_Horse_Owlhootvictim_01", "unknown"}, {"MP_U_M_M_LEGENDARYBOUNTY_09", "Female"}, {"P_C_Horse_01", "unknown"}, {"U_F_M_RhdNudeWoman_01", "female"}}; } \ No newline at end of file diff --git a/src/game/rdr/invoker/Invoker.hpp b/src/game/rdr/invoker/Invoker.hpp index 751cf9a7..01c3c70d 100644 --- a/src/game/rdr/invoker/Invoker.hpp +++ b/src/game/rdr/invoker/Invoker.hpp @@ -85,6 +85,11 @@ namespace YimMenu return m_Handlers[(int)index]; } + static constexpr bool AreHandlersCached() + { + return m_AreHandlersCached; + } + CustomCallContext m_CallContext{}; }; } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 530be95a..afd9f466 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,7 +18,7 @@ namespace YimMenu { - DWORD Main(void*) + static DWORD Main(void*) { const auto documents = std::filesystem::path(std::getenv("appdata")) / "HorseMenu"; FileMgr::Init(documents); @@ -35,10 +35,15 @@ namespace YimMenu goto unload; if (!Pointers.Init()) goto unload; + + Hooking::Init(); + if (!Renderer::Init()) goto unload; - Hooking::Init(); + if (!Pointers.LateInit()) + LOG(WARNING) << "Failed to find some pointers"; + Hooking::LateInit(); ScriptMgr::Init(); LOG(INFO) << "ScriptMgr initialized";