#pragma once #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/N/NiPointer.h" namespace RE { class BSLight; class ProjectileBeginUpdateEvent; class TESDeathEvent; class TESHitEvent; class VATSCameraContext; class VATSCommand; class WeaponFiredEvent; class __declspec(novtable) VATS : public BSTEventSink, // 00 public BSTEventSink, // 08 public BSTEventSink, // 10 public BSTEventSink, // 18 public BSTSingletonSDM // 20 { public: static constexpr auto RTTI{ RTTI::VATS }; static constexpr auto VTABLE{ VTABLE::VATS }; enum class VATS_MODE_ENUM { kNone = 0x0, kPlayback = 0x1 }; virtual ~VATS(); // 00 // override virtual BSEventNotifyControl ProcessEvent(const WeaponFiredEvent& a_event, BSTEventSource* a_source) override; // 01 virtual BSEventNotifyControl ProcessEvent(const ProjectileBeginUpdateEvent& a_event, BSTEventSource* a_source) override; // 02 virtual BSEventNotifyControl ProcessEvent(const TESHitEvent& a_event, BSTEventSource* a_source) override; // 03 virtual BSEventNotifyControl ProcessEvent(const TESDeathEvent& a_event, BSTEventSource* a_source) override; // 04 [[nodiscard]] static VATS* GetSingleton() { static REL::Relocation singleton{ ID::VATS::Singleton }; return *singleton; } // members BSTArray> commands; // 28 REX::TEnumSet mode; // 40 VATSCameraContext* cameraContext; // 48 float castingAfterKillDelay; // 50 NiPointer firstProjectile; // 58 NiPointer lastProjectile; // 60 float fakeShotCounter; // 68 TESIdleForm* meleeAttack; // 70 NiPointer VATSLight; // 78 std::int32_t killCount; // 80 float magicTimeSlowdown; // 84 float playerMagicTimeSlowdown; // 88 NiPointer VATSTarget; // 90 NiPointer VATSAttacker; // 98 NiPointer stranger; // A0 NiPointer predictionProjectile; // A8 BSTSmartPointer reloadCommand; // B0 BSTSmartPointer sightedCommand; // B8 float VATSPlaybackTimer; // C0 float VATSCommandTimer; // C4 bool projectileNearTarget; // C8 bool applyCritical; // C9 bool firstAttackExecuted; // CA bool firstAttackFired; // CB bool readyForShutdown; // CC bool wantsStranger; // CD BSSpinLock spinLock; // D0 }; static_assert(sizeof(VATS) == 0xD8); }