49 lines
1.5 KiB
C++
49 lines
1.5 KiB
C++
#pragma once
|
|
|
|
#include "RE/B/BSTSingleton.h"
|
|
#include "RE/D/DEFAULT_OBJECT.h"
|
|
#include "RE/T/TESForm.h"
|
|
|
|
namespace RE
|
|
{
|
|
class __declspec(novtable) BGSDefaultObjectManager :
|
|
public TESForm, // 00
|
|
public BSTSingletonImplicit<BGSDefaultObjectManager> // 20
|
|
{
|
|
public:
|
|
static constexpr auto RTTI{ RTTI::BGSDefaultObjectManager };
|
|
static constexpr auto VTABLE{ VTABLE::BGSDefaultObjectManager };
|
|
static constexpr auto FORM_ID{ ENUM_FORM_ID::kDOBJ };
|
|
|
|
[[nodiscard]] static BGSDefaultObjectManager* GetSingleton()
|
|
{
|
|
using func_t = decltype(&BGSDefaultObjectManager::GetSingleton);
|
|
static REL::Relocation<func_t> func{ ID::BGSDefaultObjectManager::Singleton };
|
|
return func();
|
|
}
|
|
|
|
[[nodiscard]] TESForm* GetDefaultObject(DEFAULT_OBJECT a_obj) const noexcept
|
|
{
|
|
assert(a_obj < DEFAULT_OBJECT::kTotal);
|
|
return objectInitArray[std::to_underlying(a_obj)] ?
|
|
objectArray[std::to_underlying(a_obj)] :
|
|
nullptr;
|
|
}
|
|
|
|
template <class T>
|
|
[[nodiscard]] T* GetDefaultObject(DEFAULT_OBJECT a_obj) const //
|
|
requires(std::derived_from<T, TESForm> &&
|
|
!std::is_pointer_v<T> &&
|
|
!std::is_reference_v<T>)
|
|
{
|
|
const auto obj = GetDefaultObject(a_obj);
|
|
return obj ? obj->As<T>() : nullptr;
|
|
}
|
|
|
|
// members
|
|
TESForm* objectArray[std::to_underlying(DEFAULT_OBJECT::kTotal)]; // 020
|
|
bool objectInitArray[std::to_underlying(DEFAULT_OBJECT::kTotal)]; // C70
|
|
};
|
|
static_assert(sizeof(BGSDefaultObjectManager) == 0xE00);
|
|
}
|