#pragma once #include "RE/A/ActorValueOwner.h" #include "RE/B/BGSEquipIndex.h" #include "RE/B/BGSInventoryItem.h" #include "RE/B/BGSInventoryList.h" #include "RE/B/BGSObjectInstance.h" #include "RE/B/BSFixedString.h" #include "RE/B/BSHandleRefObject.h" #include "RE/B/BSPointerHandle.h" #include "RE/B/BSStringT.h" #include "RE/B/BSTArray.h" #include "RE/B/BSTEvent.h" #include "RE/B/BSTSmartPointer.h" #include "RE/I/IAnimationGraphManagerHolder.h" #include "RE/I/IKeywordFormBase.h" #include "RE/I/ITEM_REMOVE_REASON.h" #include "RE/M/MapMarkerData.h" #include "RE/N/NiPoint3.h" #include "RE/O/OBJ_REFR.h" #include "RE/T/TESForm.h" namespace RE { enum class BIPED_OBJECT; enum class IO_TASK_PRIORITY; enum class RESET_3D_FLAGS; class ActorCause; class BGSAnimationSequencer; class BGSBehaviorRootData; class BGSDecalGroup; class BipedAnim; class BSActiveGraphIfInactiveEvent; class BSAnimationGraphEvent; class BSAnimationUpdateData; class BSFaceGenNiNode; class DialogueResponse; class ExtraDataList; class hknpBodyId; class hkVector4f; class INSTANCE_FILTER; class LOADED_REF_DATA; class MagicCaster; class MagicTarget; class ModelReferenceEffect; class NiAVObject; class NiNode; class NiTransform; class REFR_LOCK; class ShaderReferenceEffect; class TargetEntry; class TESModel; class TrapData; class TrapEntry; namespace ActorValueEvents { class ActorValueChangedEvent; } namespace BGSInventoryListEvent { class Event; } namespace MagicSystem { enum class CastingSource; } class __declspec(novtable) TESObjectREFR : public TESForm, // 000 public BSHandleRefObject, // 020 public BSTEventSink, // 030 public BSTEventSink, // 038 public BSTEventSink, // 040 public IAnimationGraphManagerHolder, // 048 public IKeywordFormBase, // 050 public ActorValueOwner, // 058 public BSTEventSource // 060 { public: static constexpr auto RTTI{ RTTI::TESObjectREFR }; static constexpr auto VTABLE{ VTABLE::TESObjectREFR }; static constexpr auto FORM_ID{ ENUM_FORM_ID::kREFR }; class RemoveItemData { public: RemoveItemData(TESBoundObject* a_object, std::int32_t a_count) : object(a_object), count(a_count) {} RemoveItemData(TESForm* a_form, std::int32_t a_count) : RemoveItemData(a_form->As(), a_count) {} // members BSTSmallArray stackData; // 00 TESBoundObject* object{ nullptr }; // 20 std::int32_t count{ 0 }; // 28 ITEM_REMOVE_REASON reason{ ITEM_REMOVE_REASON::kNone }; // 2C TESObjectREFR* otherContainer{ nullptr }; // 30 const NiPoint3* dropLoc{ nullptr }; // 38 const NiPoint3* rotate{ nullptr }; // 40 }; static_assert(sizeof(RemoveItemData) == 0x48); F4_HEAP_REDEFINE_NEW(TESObjectREFR); // add virtual void Predestroy(); // 4A virtual void PreModelLoaderQueueing() { return; } // 4B virtual BGSLocation* GetEditorLocation() const; // 4C virtual bool GetEditorLocation(NiPoint3& a_originalLocation, NiPoint3& a_originalAngle, TESForm*& a_locationFormOut, TESForm* a_locationForm); // 4D virtual bool IsTalking() const; // 4E virtual void ForceEditorLocation(BGSLocation* a_location); // 4F virtual void Update3DPosition(bool a_warp); // 50 virtual void UpdateSoundCallBack(bool a_endSceneAction); // 51 virtual bool SetDialoguewithPlayer(bool a_flag, bool a_forceGreet, TESTopicInfo* a_topicInfo); // 52 virtual void AddDynamicIdleCRC([[maybe_unused]] std::uint32_t a_crc) { return; } // 53 virtual void GetPreviousDynamicIdleCRCS(std::uint32_t* a_crcs, std::uint32_t a_requestSize) const; // 54 virtual bool GetFullLODRef() const; // 55 virtual void SetFullLODRef(bool a_val); // 56 virtual BGSAnimationSequencer* GetSequencer() const; // 57 virtual bool QCanUpdateSync() const { return true; } // 58 virtual bool GetAllowPromoteToPersistent() const { return true; } // 59 virtual bool DoesFloat() const { return false; } // 5A virtual TESPackage* CheckForCurrentAliasPackage() { return nullptr; } // 5B virtual BGSScene* GetCurrentScene() const; // 5C virtual void SetCurrentScene(BGSScene* a_scene); // 5D virtual bool UpdateInDialogue(DialogueResponse* a_response, bool); // 5E virtual BGSDialogueBranch* GetExclusiveBranch() const; // 5F virtual void SetExclusiveBranch(BGSDialogueBranch* a_exclusiveBranch); // 60 virtual void StopCurrentDialogue(bool a_force); // 61 virtual void FadeCurrentDialogue(); // 62 virtual void PauseCurrentDialogue(); // 63 virtual void ResumeCurrentDialogue(); // 64 virtual void SetActorCause(ActorCause* a_actorCause); // 65 virtual ActorCause* GetActorCause() const; // 66 virtual float GetActorWidthOrRefDiameter() const; // 67 virtual float GetActorHeightOrRefBound() const; // 68 virtual NiPoint3 GetStartingAngle(); // 69 virtual NiPoint3 GetStartingLocation(); // 6A virtual void SetStartingPosition(const NiPoint3& a_position); // 6B virtual void UpdateRefLight(float a_delta); // 6C virtual ObjectRefHandle RemoveItem(RemoveItemData& a_data); // 6D virtual void AddWornOutfitImpl([[maybe_unused]] BGSOutfit* a_outfit, [[maybe_unused]] bool a_queueItem) { return; } // 6E virtual bool AddWornItem(TESBoundObject* a_object, BSTSmartPointer a_extra, std::int32_t a_number, bool a_forceEquip, BGSEquipIndex a_equipIndex); // 6F virtual void DoTrap([[maybe_unused]] TrapEntry* a_trap, [[maybe_unused]] TargetEntry* a_target) { return; } // 71 virtual void DoTrap([[maybe_unused]] TrapData& a_trapData) { return; } // 70 virtual void SetEquipStateLocked(TESBoundObject* a_object, bool a_lock); // 72 virtual void SendContainerChangedEvent(const TESObjectREFR* a_oldContainer, const TESObjectREFR* apNewContainer, const TESBoundObject* a_baseObject, std::int32_t a_count, std::uint32_t a_referenceFormID, std::uint16_t a_uniqueID) const; // 73 virtual void UnequipArmorFromSlot([[maybe_unused]] BIPED_OBJECT a_bipedObject, [[maybe_unused]] bool a_markAsReequippable) { return; } // 74 virtual void RemoveAllObjectsWorn(); // 75 virtual void PostRemoveWornObject(const BGSObjectInstance& a_object, const BGSEquipSlot* a_equipSlot); // 76 virtual void Set3DUpdateFlag([[maybe_unused]] RESET_3D_FLAGS a_flag) { return; } // 77 virtual void ClearAll3DUpdateFlags() { return; } // 78 virtual float AdjustItemWeight([[maybe_unused]] TESBoundObject& a_object, [[maybe_unused]] const BGSInventoryItem::Stack& a_stack, float a_weight, [[maybe_unused]] bool* a_shouldModifyWholeStackOut) { return a_weight; } // 79 virtual void AddObjectToContainer(TESBoundObject* a_obj, BSTSmartPointer a_extra, std::int32_t a_count, TESObjectREFR* a_oldContainer, ITEM_REMOVE_REASON a_reason); // 7A virtual NiPoint3 GetLookingAtLocation() const; // 7B virtual MagicCaster* GetMagicCaster(MagicSystem::CastingSource a_source); // 7C virtual MagicTarget* GetMagicTarget(); // 7D virtual bool IsChild() const { return false; } // 7E virtual TESActorBase* GetTemplateActorBase() { return nullptr; } // 7F virtual void SetTemplateActorBase(TESActorBase*) { return; } // 80 virtual BSFaceGenNiNode* GetFaceNodeSkinned() { return nullptr; } // 81 virtual BSFaceGenNiNode* GetFaceNode() { return GetFaceNodeSkinned(); } // 82 virtual bool ClampToGround(); // 83 virtual bool DetachHavok(NiAVObject* a_obj3D); // 84 virtual void InitHavok(); // 85 virtual NiAVObject* Load3D(bool a_backgroundLoading); // 86 virtual void Release3DRelatedData(); // 87 virtual void Set3D(NiAVObject* a_object, bool a_queue3DTasks); // 88 virtual bool ShouldBackgroundClone() const; // 89 virtual bool IsReadyForAttach([[maybe_unused]] const IO_TASK_PRIORITY& a_priority) const { return true; } // 8A virtual NiAVObject* Get3D() const; // 8C virtual NiAVObject* Get3D([[maybe_unused]] bool a_firstPerson) const { return Get3D(); } // 8B virtual NiAVObject* GetFullyLoaded3D() const; // 8D virtual bool Is3rdPersonVisible() const { return true; } // 8E virtual bool PopulateGraphProjectsToLoad(const NiAVObject* a_obj3D, BSScrapArray>& a_projectFilenames) const; // 8F virtual TESModel* GetTESModel() const; // 90 virtual TESRace* GetVisualsRace() const; // 91 virtual void GetPhysicsTransform(NiTransform& a_outTransform) const; // 92 virtual NiPoint3 GetBoundMin() const; // 93 virtual NiPoint3 GetBoundMax() const; // 94 virtual bool GetBehaviorRootNameOverrides([[maybe_unused]] BSScrapArray& a_behaviorRoots) const { return false; } // 95 virtual bool GetBehaviorRootNameReplacement([[maybe_unused]] BSFixedString& a_rootNameReplacement) const { return false; } // 96 virtual bool GetBehaviorRootData(bool a_onlyCollectActiveRoots, BSScrapArray& a_behaviorRoots) const; // 97 virtual void OnHeadInitialized() { return; } // 98 virtual bool InitNonNPCAnimation(NiNode& a_nodeForAnim); // 99 virtual bool CheckAndFixSkinAndBoneOrder(NiNode& a_nodeToTest); // 9A virtual void ModifyAnimationUpdateData([[maybe_unused]] BSAnimationUpdateData& a_updateData) { return; } // 9B virtual bool ShouldSaveAnimationOnUnloading() const; // 9C virtual bool ShouldSaveAnimationOnSaving() const; // 9D virtual bool ShouldPerformRevert() const { return true; } // 9E virtual void UpdateAnimation(float a_delta); // 9F virtual void CollectPickNodes() { return; } // A0 virtual const BSTSmartPointer& GetBiped() const; // A2 virtual const BSTSmartPointer& GetBiped(bool a_firstPerson) const; // A1 virtual const BSTSmartPointer& GetCurrentBiped() const { return GetBiped(); } // A3 virtual void SetBiped([[maybe_unused]] const BSTSmartPointer& a_biped) { return; } // A4 virtual void AttachWeapon(const BGSObjectInstanceT& a_weapon, BGSEquipIndex a_equipIndex); // A5 virtual void RemoveWeapon([[maybe_unused]] const BGSObjectInstanceT& a_weapon, [[maybe_unused]] BGSEquipIndex a_equipIndex, [[maybe_unused]] bool a_queue3DTasks) { return; } // A6 virtual void CreateInventoryList(const TESContainer* a_container); // A7 virtual void DestroyInventoryList(); // A8 virtual void SetRunsInLow(bool) { return; } // A9 virtual void SetObjectReference(TESBoundObject* a_object); // AA virtual void MoveHavok(bool a_forceRec); // AB virtual void GetLinearVelocity(NiPoint3& a_velocity) const; // AC virtual void ApplyMovementDelta(float a_timeDelta, const NiPoint3A& a_delta, const NiPoint3& a_angleDelta); // AD virtual void SetActionComplete([[maybe_unused]] bool a_value) { return; } // AE virtual void SetMovementComplete(bool) { return; } // AF virtual void Disable(); // B0 virtual void ResetInventory(bool a_leveledOnly); // B1 virtual NiAVObject* GetCurrent3D() const { return Get3D(); } // B2 virtual Explosion* IsExplosion() { return nullptr; } // B4 virtual const Explosion* IsExplosion() const { return nullptr; } // B3 virtual Projectile* IsProjectile() { return nullptr; } // B6 virtual const Projectile* IsProjectile() const { return nullptr; } // B5 virtual bool OnAddCellPerformQueueReference([[maybe_unused]] TESObjectCELL& a_cell) const { return true; } // B7 virtual void DoMoveToHigh() { return; } // B8 virtual void TryMoveToMiddleLow() { return; } // B9 virtual bool TryChangeSkyCellActorsProcessLevel() { return false; } // BA virtual void SetDisplayGeometry(bool) { return; } // BB virtual void TryUpdateActorLastSeenTime() { return; } // BC virtual void SaveGameTest(); // BD virtual TESObjectCELL* GetSaveParentCell() const; // BE virtual void SetParentCell(TESObjectCELL* a_cell); // BF virtual bool IsDead(bool a_notEssential) const; // C0 virtual bool ProcessInWater(hknpBodyId a_bodyID, float a_waterHeight, float a_deltaTime); // C1 virtual bool ApplyCurrent([[maybe_unused]] float a_deltaTime, [[maybe_unused]] const hkVector4f& a_linVel, const hkVector4f&) { return false; } // C2 virtual BGSDecalGroup* GetDecalGroup() const; // C3 virtual void InitDefaultWornImpl(bool a_weapon, bool a_allowChanges); // C4 virtual bool HasKeywordHelper(const BGSKeyword* a_keyword, const TBO_InstanceData* a_data) const; // C5 bool ActivateRef(TESObjectREFR* a_actionRef, TESBoundObject* a_objectToGet, std::int32_t a_count, bool a_defaultProcessingOnly, bool a_fromScript, bool a_looping) { using func_t = decltype(&TESObjectREFR::ActivateRef); static REL::Relocation func{ ID::TESObjectREFR::ActivateRef }; return func(this, a_actionRef, a_objectToGet, a_count, a_defaultProcessingOnly, a_fromScript, a_looping); } void AddInventoryItem(TESBoundObject* a_object, BSTSmartPointer a_extra, std::uint32_t a_count, TESObjectREFR* a_oldContainer, const INSTANCE_FILTER* a_filter, TESObjectREFR* a_overrideRef) { using func_t = decltype(&TESObjectREFR::AddInventoryItem); static REL::Relocation func{ ID::TESObjectREFR::AddInventoryItem }; return func(this, a_object, a_extra, a_count, a_oldContainer, a_filter, a_overrideRef); } void AddKeyword(BGSKeyword* kwd) { using func_t = decltype(&TESObjectREFR::AddKeyword); static REL::Relocation func{ ID::TESObjectREFR::AddKeyword }; return func(this, kwd); } void AddLockChange() { using func_t = decltype(&TESObjectREFR::AddLockChange); static REL::Relocation func{ ID::TESObjectREFR::AddLockChange }; return func(this); } ModelReferenceEffect* ApplyArtObject( BGSArtObject* a_art, float a_time = -1.0f, TESObjectREFR* a_facingRef = nullptr, bool a_attachToCamera = false, bool a_inheritRotation = false, NiAVObject* a_3D = nullptr, bool a_interfaceEffect = false) { using func_t = decltype(&TESObjectREFR::ApplyArtObject); static REL::Relocation func{ ID::TESObjectREFR::ApplyArtObject }; return func(this, a_art, a_time, a_facingRef, a_attachToCamera, a_inheritRotation, a_3D, a_interfaceEffect); } ShaderReferenceEffect* ApplyEffectShader( TESEffectShader* a_art, float a_time = -1.0f, TESObjectREFR* a_facingRef = nullptr, bool a_attachToCamera = false, bool a_inheritRotation = false, NiAVObject* a_3D = nullptr, bool a_interfaceEffect = false) { using func_t = decltype(&TESObjectREFR::ApplyEffectShader); static REL::Relocation func{ ID::TESObjectREFR::ApplyEffectShader }; return func(this, a_art, a_time, a_facingRef, a_attachToCamera, a_inheritRotation, a_3D, a_interfaceEffect); } void Enable(bool a_resetInventory) { using func_t = decltype(&TESObjectREFR::Enable); static REL::Relocation func{ ID::TESObjectREFR::Enable }; return func(this, a_resetInventory); } static TESObjectREFR* FindReferenceFor3D(const NiAVObject* a_opbject3D) { using func_t = decltype(&TESObjectREFR::FindReferenceFor3D); static REL::Relocation func{ ID::TESObjectREFR::FindReferenceFor3D }; return func(a_opbject3D); } void FindAndWriteStackDataForInventoryItem( TESBoundObject* a_object, BGSInventoryItem::StackDataCompareFunctor& a_compareFunc, BGSInventoryItem::StackDataWriteFunctor& a_writeFunc, bool (*a_objCompFn)(TESBoundObject*, TESBoundObject*) = BGSInventoryList::StandardObjectCompareCallbackFn, bool a_alwaysContinue = false) { if (inventoryList) { inventoryList->FindAndWriteStackDataForItem(a_object, a_compareFunc, a_writeFunc, a_objCompFn, a_alwaysContinue); } } [[nodiscard]] BGSLocation* GetCurrentLocation() const { using func_t = decltype(&TESObjectREFR::GetCurrentLocation); static REL::Relocation func{ ID::TESObjectREFR::GetCurrentLocation }; return func(this); } [[nodiscard]] const char* GetDisplayFullName() { using func_t = decltype(&TESObjectREFR::GetDisplayFullName); static REL::Relocation func{ ID::TESObjectREFR::GetDisplayFullName }; return func(this); } [[nodiscard]] float GetDistanceFromPoint(const NiPoint3& a_point) const { using func_t = decltype(&TESObjectREFR::GetDistanceFromPoint); static REL::Relocation func{ ID::TESObjectREFR::GetDistanceFromPoint }; return func(this, a_point); } [[nodiscard]] float GetDistanceFromReference(const TESObjectREFR* a_ref, bool a_disabled, bool a_sameSpace) const { using func_t = decltype(&TESObjectREFR::GetDistanceFromReference); static REL::Relocation func{ ID::TESObjectREFR::GetDistanceFromReference }; return func(this, a_ref, a_disabled, a_sameSpace); } [[nodiscard]] float GetDistanceSqFromPoint(const NiPoint3& a_point) const { using func_t = decltype(&TESObjectREFR::GetDistanceSqFromPoint); static REL::Relocation func{ ID::TESObjectREFR::GetDistanceSqFromPoint }; return func(this, a_point); } [[nodiscard]] float GetDistanceSqFromReference(const TESObjectREFR* a_ref, bool a_disabled, bool a_sameSpace, bool a_diffZHeight) const { using func_t = decltype(&TESObjectREFR::GetDistanceSqFromReference); static REL::Relocation func{ ID::TESObjectREFR::GetDistanceSqFromReference }; return func(this, a_ref, a_disabled, a_sameSpace, a_diffZHeight); } [[nodiscard]] bool GetEditorDead() const { using func_t = decltype(&TESObjectREFR::GetEditorDead); static REL::Relocation func{ ID::TESObjectREFR::GetEditorDead }; return func(this); } [[nodiscard]] TESBoundObject* GetObjectReference() const noexcept { return data.objectReference; } [[nodiscard]] TESForm* GetOwner() { using func_t = decltype(&TESObjectREFR::GetOwner); static REL::Relocation func{ ID::TESObjectREFR::GetOwner }; return func(this); } [[nodiscard]] TESObjectCELL* GetParentCell() const noexcept { return parentCell; } [[nodiscard]] NiPoint3 GetPosition() const noexcept { return data.location; } [[nodiscard]] float GetPositionX() const noexcept { return data.location.x; } [[nodiscard]] float GetPositionY() const noexcept { return data.location.y; } [[nodiscard]] float GetPositionZ() const noexcept { return data.location.z; } [[nodiscard]] std::int64_t GetGoldAmount() { using func_t = decltype(&TESObjectREFR::GetGoldAmount); static REL::Relocation func{ ID::TESObjectREFR::GetGoldAmount }; return func(this); } [[nodiscard]] ObjectRefHandle GetHandle() { using func_t = decltype(&TESObjectREFR::GetHandle); static REL::Relocation func{ ID::TESObjectREFR::GetHandle }; return func(this); } [[nodiscard]] bool GetHasOwner() { using func_t = decltype(&TESObjectREFR::GetHasOwner); static REL::Relocation func{ ID::TESObjectREFR::GetHasOwner }; return func(this); } [[nodiscard]] std::uint32_t GetInventoryObjectCount(const TESBoundObject* a_object) { using func_t = decltype(&TESObjectREFR::GetInventoryObjectCount); static REL::Relocation func{ ID::TESObjectREFR::GetInventoryObjectCount }; return func(this, a_object); } [[nodiscard]] TESObjectREFR* GetLinkedRef(BGSKeyword* a_keyword) { using func_t = decltype(&TESObjectREFR::GetLinkedRef); static REL::Relocation func{ ID::TESObjectREFR::GetLinkedRef }; return func(this, a_keyword); } [[nodiscard]] REFR_LOCK* GetLock() { using func_t = decltype(&TESObjectREFR::GetLock); static REL::Relocation func{ ID::TESObjectREFR::GetLock }; return func(this); } [[nodiscard]] float GetWeightInContainer() { using func_t = decltype(&TESObjectREFR::GetWeightInContainer); static REL::Relocation func{ ID::TESObjectREFR::GetWeightInContainer }; return func(this); } BaseFormComponent* HasContainer() { using func_t = decltype(&TESObjectREFR::HasContainer); static REL::Relocation func{ ID::TESObjectREFR::HasContainer }; return func(this); } [[nodiscard]] bool IsAnOwner(Actor* a_testOwner, bool a_useFaction, bool a_requiresOwner) { using func_t = decltype(&TESObjectREFR::IsAnOwner); static REL::Relocation func{ ID::TESObjectREFR::IsAnOwner }; return func(this, a_testOwner, a_useFaction, a_requiresOwner); } [[nodiscard]] bool IsCrimeToActivate() { using func_t = decltype(&TESObjectREFR::IsCrimeToActivate); static REL::Relocation func{ ID::TESObjectREFR::IsCrimeToActivate }; return func(this); } [[nodiscard]] bool IsInWater() { return this->GetRelevantWaterHeight() > this->data.location.z; } [[nodiscard]] bool IsLeveledCreature() { using func_t = decltype(&TESObjectREFR::IsLeveledCreature); static REL::Relocation func{ ID::TESObjectREFR::IsLeveledCreature }; return func(this); } void MarkAsDeleted() { using func_t = decltype(&TESObjectREFR::MarkAsDeleted); static REL::Relocation func{ ID::TESObjectREFR::MarkAsDeleted }; return func(this); } void MoveRefToNewSpace(TESObjectCELL* a_interior, TESWorldSpace* a_world) { using func_t = decltype(&TESObjectREFR::MoveRefToNewSpace); static REL::Relocation func{ ID::TESObjectREFR::MoveRefToNewSpace }; return func(this, a_interior, a_world); } void RemoveKeyword(BGSKeyword* a_keyworld) { using func_t = decltype(&TESObjectREFR::RemoveKeyword); static REL::Relocation func{ ID::TESObjectREFR::RemoveKeyword }; return func(this, a_keyworld); } void SetAngleOnReference(const NiPoint3& a_point) { using func_t = decltype(&TESObjectREFR::SetAngleOnReference); static REL::Relocation func{ ID::TESObjectREFR::SetAngleOnReference }; return func(this, a_point); } void SetLinkedRef(Actor* a_actor, BGSKeyword* a_keyword) { using func_t = decltype(&TESObjectREFR::SetLinkedRef); static REL::Relocation func{ ID::TESObjectREFR::SetLinkedRef }; return func(this, a_actor, a_keyword); } void SetLocationOnReference(const NiPoint3& a_point) { using func_t = decltype(&TESObjectREFR::SetLocationOnReference); static REL::Relocation func{ ID::TESObjectREFR::SetLocationOnReference }; return func(this, a_point); } void SetWantsDelete(bool a_delete) { using func_t = decltype(&TESObjectREFR::SetWantsDelete); static REL::Relocation func{ ID::TESObjectREFR::SetWantsDelete }; return func(this, a_delete); } void RebuildBendableSpline(bool rebuildCollision, NiAVObject* target) { using func_t = decltype(&TESObjectREFR::RebuildBendableSpline); static REL::Relocation func{ ID::TESObjectREFR::RebuildBendableSpline }; return func(this, rebuildCollision, target); } bool GetItemCount(uint32_t& count, TESForm* item, bool countComponent) { using func_t = decltype(&TESObjectREFR::GetItemCount); static REL::Relocation func{ ID::TESObjectREFR::GetItemCount }; return func(this, count, item, countComponent); } void UpdateReference3D() { using func_t = decltype(&TESObjectREFR::UpdateReference3D); static REL::Relocation func{ ID::TESObjectREFR::UpdateReference3D }; return func(this); } void GetObjectCenter(NiPoint3& center) { using func_t = decltype(&TESObjectREFR::GetObjectCenter); static REL::Relocation func{ ID::TESObjectREFR::GetObjectCenter }; return func(this, center); } void SetScale(float scale) { using func_t = decltype(&TESObjectREFR::SetScale); static REL::Relocation func{ ID::TESObjectREFR::SetScale }; return func(this, scale); } bool IsMarker() { using func_t = decltype(&TESObjectREFR::IsMarker); static REL::Relocation func{ ID::TESObjectREFR::IsMarker }; return func(this); } bool IsDecalRef() { using func_t = decltype(&TESObjectREFR::IsDecalRef); static REL::Relocation func{ ID::TESObjectREFR::IsDecalRef }; return func(this); } void UpdateDynamicNavmesh(bool a_active) { using func_t = decltype(&TESObjectREFR::UpdateDynamicNavmesh); static REL::Relocation func{ ID::TESObjectREFR::UpdateDynamicNavmesh }; return func(this, a_active); } MapMarkerData* GetMapMarkerData() { using func_t = decltype(&TESObjectREFR::GetMapMarkerData); static REL::Relocation func{ ID::TESObjectREFR::GetMapMarkerData }; return func(this); } float GetRelevantWaterHeight() { using func_t = decltype(&TESObjectREFR::GetRelevantWaterHeight); static REL::Relocation func{ ID::TESObjectREFR::GetRelevantWaterHeight }; return func(this); } bool CanBeMoved() { using func_t = decltype(&TESObjectREFR::CanBeMoved); static REL::Relocation func{ ID::TESObjectREFR::CanBeMoved }; return func(this); } // members TESObjectCELL* parentCell; // 0x0B8 OBJ_REFR data; // 0x0C0 LOADED_REF_DATA* loadedData; // 0x0F0 BGSInventoryList* inventoryList; // 0x0F8 BSTSmartPointer extraList; // 0x100 std::uint16_t refScale; // 0x018 std::int8_t modelState; // 0x10A bool predestroyed; // 0x10B }; static_assert(sizeof(TESObjectREFR) == 0x110); }