#pragma once #include "RE/E/ExamineConfirmMenu.h" #include "RE/I/InventoryUserUIInterface.h" #include "RE/W/WorkbenchMenuBase.h" namespace RE { enum class EQUIP_TYPE; class BGSObjectInstanceExtra; class BSInputEnableLayer; class NiAVObject; class __declspec(novtable) ExamineMenu : public WorkbenchMenuBase // 00 { public: static constexpr auto RTTI{ RTTI::ExamineMenu }; static constexpr auto VTABLE{ VTABLE::ExamineMenu }; static constexpr auto MENU_NAME{ "ExamineMenu"sv }; enum class INSPECT_MODE_STATE { kModSlotSelect = 0, kSelectNewMod = 1, kInvComponentSelect = 2, kItemSelect = 3, kConfirm = 4 }; class ComponentBuilderFunctor { public: // members BSTArray> components; // 00 TESObjectMISC* a_object; // 18 std::uint32_t a_index; // 20 }; static_assert(sizeof(ComponentBuilderFunctor) == 0x28); virtual ~ExamineMenu(); // 00 // override (WorkbenchMenuBase) virtual void Call(const Params&) override; // 01 virtual void MapCodeObjectFunctions() override; // 02 virtual UI_MESSAGE_RESULTS ProcessMessage(UIMessage& a_message) override; // 03 virtual void AdvanceMovie(float a_timeDelta, std::uint64_t a_time) override; // 04 virtual void OnHideMenu() override; // 14 virtual void BuildConfirmed(bool a_ownerIsWorkbench) override; // 17 virtual bool TryCreate() override; // 1B // override (BSInputEventUser) virtual bool ShouldHandleEvent(const InputEvent*) override; // 01 virtual void OnThumbstickEvent(const ThumbstickEvent*) override; // 04 virtual void OnCursorMoveEvent(const CursorMoveEvent*) override; // 05 virtual void OnButtonEvent(const ButtonEvent*) override; // 08 // add virtual EQUIP_TYPE GetInventoryEntryEquipState(const InventoryUserUIInterfaceEntry& a_entry); // 1C virtual void ShowCurrent3D(); // 1D virtual TESBoundObject* GetCurrentObj(); // 1E virtual void FindWeaponMods(TESBoundObject* a_object, Scaleform::GFx::Value& a_modList); // 1F virtual void BuildPossibleModList(TESBoundObject* a_object); // 20 virtual void SwitchMod(std::int32_t a_index, Scaleform::GFx::Value& a_entryList); // 21 virtual void NextItemPart(); // 22 virtual void PreviousItemPart(); // 23 virtual void AttachModToPreview(bool a_storeModelPosition); // 24 virtual BGSObjectInstanceExtra* GetInitialObjectInstanceExtra(); // 25 virtual BGSObjectInstanceExtra* GetObjectInstanceExtra(); // 26 virtual const ExtraDataList* GetItemExtraDataList(); // 27 virtual void HighlightWeaponPart(); // 28 virtual void ResetHighlight(); // 29 virtual void CreateModdedInventoryItem(); // 2A virtual void RevertToInventoryItem(); // 2B virtual const char* GetCurrentName(); // 2C virtual void RenameCurrent(const char* a_newName); // 2D virtual void UpdateItemCard(bool a_compare); // 2E virtual void UpdateItemList(std::int32_t a_indexToSelect); // 2F virtual const char* GetBuildConfirmButtonLabel(); // 30 virtual void GetBuildConfirmQuestion(char* a_buffer, std::uint32_t a_bufferLength); // 31 virtual bool GetCanRepairSelectedItem(); // 32 virtual NiAVObject* GetCurrent3D(); // 33 virtual bool GetCurrent3DLoaded(); // 34 virtual bool GetIsValidInventoryItem(const BGSInventoryItem& a_item, std::uint32_t a_stackID); // 35 virtual const char* GetMenuName(); // 36 virtual void OnSwitchBaseItem(); // 37 virtual void PopulateInventoryItemObj(ObjectRefHandle a_owner, const InventoryUserUIInterfaceEntry& a_entry, Scaleform::GFx::Value& a_itemObj); // 38 virtual void RegisterMenuComponents(const Scaleform::GFx::FunctionHandler::Params& a_params); // 39 virtual void RepairSelectedItem(); // 3A virtual void SetFilter(); // 3B virtual void SetMouseRotation(bool a_rotation); // 3C virtual void ToggleItemEquipped(); // 3D virtual void UpdateModSlotList(); // 3E virtual void UpdateModChoiceList(); // 3F virtual const char* GetRankSuffix(std::uint32_t a_rank); // 40 virtual bool QIgnoreRank(); // 41 virtual bool ShouldInitToFirstMod(); // 42 virtual void SetDataForConditionCheck(); // 43 virtual bool AddLooseModToModChoiceArray(BGSMod::Attachment::Mod* a_mod, std::uint8_t a_rank); // 44 virtual bool ShouldShowModSlot(const BGSKeyword* a_keyword); // 45 void BuildWeaponScrappingArray() { using func_t = decltype(&ExamineMenu::BuildWeaponScrappingArray); static REL::Relocation func{ ID::ExamineMenu::BuildWeaponScrappingArray }; return func(this); } [[nodiscard]] std::uint32_t GetSelectedIndex() { using func_t = decltype(&ExamineMenu::GetSelectedIndex); static REL::Relocation func{ ID::ExamineMenu::GetSelectedIndex }; return func(this); } void ShowConfirmMenu(ExamineConfirmMenu::InitData* a_data, ExamineConfirmMenu::ICallback* a_callback) { using func_t = decltype(&ExamineMenu::ShowConfirmMenu); static REL::Relocation func{ ID::ExamineMenu::ShowConfirmMenu }; return func(this, a_data, a_callback); } void ConsumeSelectedItems(bool a_autoBuild, const BGSSoundDescriptorForm* a_consumeSound) { using func_t = decltype(&ExamineMenu::ConsumeSelectedItems); static REL::Relocation func{ ID::ExamineMenu::ConsumeSelectedItems }; return func(this, a_autoBuild, a_consumeSound); } // members ComponentBuilderFunctor componentFunctor; // 340 REX::TEnumSet inspectModeState; // 368 ObjectRefHandle inventorySource; // 36C InventoryUserUIInterface invInterface; // 370 InventoryInterface::Handle modItem; // 3F0 std::uint32_t modStack; // 3F4 BSTHashMap scrappableItemsMap; // 3F8 BSTArray> scrappingArray; // 420 BSTArray> slotObjects; // 440 BSTSmartPointer extraDataList; // 458 std::uint32_t slotObjectIndex; // 460 Scaleform::GFx::Value buttonAnimBase; // 468 Scaleform::GFx::Value itemList; // 488 Scaleform::GFx::Value itemNameTextField; // 4A8 Scaleform::GFx::Value itemInfoList; // 4C8 Scaleform::GFx::Value modChoiceList; // 4E8 Scaleform::GFx::Value modSlotList; // 508 Scaleform::GFx::Value currentModsList; // 528 BGSInventoryItem moddedInventoryItem; // 548 bool queueItemHighlight; // 558 float zoomDistance; // 55C float lastFrameDelta; // 560 float menuCursorLeftPct; // 564 float menuCursorRightPct; // 568 float menuCursorTopPct; // 56C float menuCursorBottomPct; // 570 BSTArray queuedSoundArray; // 578 std::byte attachPointSource3D[0x598 - 0x590]; // 590 - TODO const BGSMod::Attachment::Mod* nullMod; // 598 Scaleform::GFx::Value requirementsList; // 5A0 Scaleform::GFx::Value itemSelectList; // 5C0 const BGSKeyword* keyword; // 5E0 bool queueChangeCameraPosition; // 5E8 bool returnToInspect; // 5E9 bool highlightStoredItem; // 5EA bool textEntry; // 5EB bool virtualKeyboardPendingEvt; // 5EC bool inspectMode; // 5ED bool inspectingSingleItem; // 5EE bool inspectingFeaturedItem; // 5EF bool showFeaturedItemMessage; // 5F0 char renameItemTo[260]; // 5F1 char renameItemCancelState[260]; // 6F5 BSTSmartPointer inputLayer; // 800 }; static_assert(sizeof(ExamineMenu) == 0x810); }