#pragma once #include "RE/B/BSFixedString.h" #include "RE/B/BSSpinLock.h" #include "RE/B/BSTArray.h" #include "RE/B/BSTEvent.h" #include "RE/B/BSTSingleton.h" #include "RE/B/BSTSmartPointer.h" #include "RE/O/OtherInputEvents.h" #include "RE/U/UserEvents.h" namespace RE { class BSInputEnableLayer; class InputEnableLayerDestroyedEvent; class OtherEventEnabledEvent; class UserEventEnabledEvent; class BSInputEnableManager : public BSTEventSource, // 000 public BSTEventSource, // 058 public BSTEventSource, // 0B0 public BSTSingletonSDM // 108 { public: class EnableLayer { public: // members REX::TEnumSet inputUserEvents; // 00 REX::TEnumSet otherInputEvents; // 04 }; static_assert(sizeof(EnableLayer) == 0x08); [[nodiscard]] static BSInputEnableManager* GetSingleton() { static REL::Relocation singleton{ ID::BSInputEnableManager::Singleton }; return *singleton; } bool AllocateNewLayer(BSTSmartPointer& a_layer, const char* a_debugName) { using func_t = decltype(&BSInputEnableManager::AllocateNewLayer); static REL::Relocation func{ ID::BSInputEnableManager::AllocateNewLayer }; return func(this, a_layer, a_debugName); } void ClearForcedState() { BSAutoLock locker(cacheLock); forceEnableInputUserEventsFlags.reset(); forceOtherInputEventsFlags.reset(); } bool EnableUserEvent(std::uint32_t a_layerID, UserEvents::USER_EVENT_FLAG a_userEventFlags, bool a_enable, UserEvents::SENDER_ID a_senderID) { using func_t = decltype(&BSInputEnableManager::EnableUserEvent); static REL::Relocation func{ ID::BSInputEnableManager::EnableUserEvent }; return func(this, a_layerID, a_userEventFlags, a_enable, a_senderID); } bool EnableOtherEvent(std::uint32_t a_layerID, OtherInputEvents::OTHER_EVENT_FLAG a_otherEventFlags, bool a_enable, UserEvents::SENDER_ID a_senderID) { using func_t = decltype(&BSInputEnableManager::EnableOtherEvent); static REL::Relocation func{ ID::BSInputEnableManager::EnableOtherEvent }; return func(this, a_layerID, a_otherEventFlags, a_enable, a_senderID); } void ForceUserEventEnabled(UserEvents::USER_EVENT_FLAG a_userEventFlags, bool a_enable) { BSAutoLock locker(cacheLock); if (a_enable) { forceEnableInputUserEventsFlags.set(a_userEventFlags); } else { forceEnableInputUserEventsFlags.reset(a_userEventFlags); } } void ForceOtherEventEnabled(OtherInputEvents::OTHER_EVENT_FLAG a_otherEventFlags, bool a_enable) { BSAutoLock locker(cacheLock); if (a_enable) { forceOtherInputEventsFlags.set(a_otherEventFlags); } else { forceOtherInputEventsFlags.reset(a_otherEventFlags); } } // members BSSpinLock cacheLock; // 110 REX::TEnumSet cachedInputUserEventsFlags; // 118 REX::TEnumSet cachedOtherInputEventsFlags; // 11C REX::TEnumSet forceEnableInputUserEventsFlags; // 120 REX::TEnumSet forceOtherInputEventsFlags; // 124 BSSpinLock layerLock; // 128 BSTArray layers; // 130 BSTArray> layerWrappers; // 148 BSTArray debugNames; // 160 bool isCurrentlyInSaveLoad; // 178 }; static_assert(sizeof(BSInputEnableManager) == 0x180); }