#pragma once #include "RE/B/BSSpinLock.h" #include "RE/B/BSTArray.h" #include "RE/B/BSTHashMap.h" #include "RE/B/BSTSingleton.h" #include "RE/B/BSTSmartPointer.h" namespace RE { class BGSCreatedObjectManager : public BSTSingletonSDM // 00 { public: template class BSTCreatedObjectSmartPointerPolicy { public: static void Acquire(T* a_ptr) { const auto manager = BGSCreatedObjectManager::GetSingleton(); if (manager && a_ptr->IsCreated() && a_ptr->IsAlchemyItem()) { manager->IncrementRef(static_cast(a_ptr)); } } static void Release(T* a_ptr) { const auto manager = BGSCreatedObjectManager::GetSingleton(); if (manager && a_ptr->IsCreated() && a_ptr->IsAlchemyItem()) { manager->DecrementRef(static_cast(a_ptr)); } } }; class CreatedMagicItemData { public: // members MagicItem* createdItem; // 00 std::uint32_t count; // 08 }; static_assert(sizeof(CreatedMagicItemData) == 0x10); [[nodiscard]] static BGSCreatedObjectManager* GetSingleton() { static REL::Relocation singleton{ ID::BGSCreatedObjectManager::Singleton }; return *singleton; } void DecrementRef(AlchemyItem* a_alchItem) { using func_t = decltype(&BGSCreatedObjectManager::DecrementRef); static REL::Relocation func{ ID::BGSCreatedObjectManager::DecrementRef }; return func(this, a_alchItem); } void IncrementRef(AlchemyItem* a_alchItem) { using func_t = decltype(&BGSCreatedObjectManager::IncrementRef); static REL::Relocation func{ ID::BGSCreatedObjectManager::IncrementRef }; return func(this, a_alchItem); } // members BSTArray weaponEnchantments; // 08 BSTArray armorEnchantments; // 20 BSTHashMap potions; // 38 BSTHashMap poisons; // 68 BSTSet queuedDeleteMagicItems; // 98 BSSpinLock dataLock; // C8 }; static_assert(sizeof(BGSCreatedObjectManager) == 0xD0); extern template class BGSCreatedObjectManager::BSTCreatedObjectSmartPointerPolicy; extern template class BGSCreatedObjectManager::BSTCreatedObjectSmartPointerPolicy; template using CreatedObjPtr = BSTSmartPointer; }