#pragma once #include "RE/B/BSContainer.h" #include "RE/B/BSPointerHandle.h" #include "RE/B/BSSemaphore.h" #include "RE/B/BSSimpleList.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/B/BSTempEffect.h" #include "RE/M/ModelReferenceEffect.h" #include "RE/N/NiPointer.h" #include "RE/P/PTYPE.h" #include "RE/S/ShaderReferenceEffect.h" namespace RE { class Crime; class MuzzleFlash; class PositionPlayerEvent; class SyncQueueObj; class __declspec(novtable) ProcessLists : public BSTEventSink, // 000 public BSTSingletonSDM // 008 { public: static constexpr auto RTTI{ RTTI::ProcessLists }; static constexpr auto VTABLE{ VTABLE::ProcessLists }; virtual ~ProcessLists(); // 00 // override virtual BSEventNotifyControl ProcessEvent(const PositionPlayerEvent&, BSTEventSource*) override; // 01 [[nodiscard]] static ProcessLists* GetSingleton() { static REL::Relocation singleton{ ID::ProcessLists::Singleton }; return *singleton; } [[nodiscard]] bool AreHostileActorsNear(BSScrapArray* a_hostileActorArray) { using func_t = decltype(&ProcessLists::AreHostileActorsNear); static REL::Relocation func{ ID::ProcessLists::AreHostileActorsNear }; return func(this, a_hostileActorArray); } void ForEachMagicTempEffect(std::function a_callback) { BSAutoLock locker(magicEffectsLock); for (auto& tempEffectPtr : magicEffects) { const auto& tempEffect = tempEffectPtr.get(); if (tempEffect && a_callback(tempEffect) == BSContainer::ForEachResult::kStop) { break; } } } void ForEachModelEffect(std::function a_callback) { ForEachMagicTempEffect([a_callback](BSTempEffect* a_tempEffect) { const auto modelEffect = a_tempEffect->As(); if (modelEffect && a_callback(modelEffect) == BSContainer::ForEachResult::kStop) { return BSContainer::ForEachResult::kStop; } return BSContainer::ForEachResult::kContinue; }); } void ForEachShaderEffect(std::function a_callback) { ForEachMagicTempEffect([a_callback](BSTempEffect* a_tempEffect) { const auto shaderEffect = a_tempEffect->As(); if (shaderEffect && a_callback(shaderEffect) == BSContainer::ForEachResult::kStop) { return BSContainer::ForEachResult::kStop; } return BSContainer::ForEachResult::kContinue; }); } [[nodiscard]] bool IsActorTargetingREFinPackage(const TESObjectREFR* a_actor, PTYPE a_type, bool a_onlyHigh) { using func_t = decltype(&ProcessLists::IsActorTargetingREFinPackage); static REL::Relocation func{ ID::ProcessLists::IsActorTargetingREFinPackage }; return func(this, a_actor, a_type, a_onlyHigh); } [[nodiscard]] std::int16_t RequestHighestDetectionLevelAgainstActor(Actor* a_actor, std::uint32_t& a_LOSCount) { using func_t = decltype(&ProcessLists::RequestHighestDetectionLevelAgainstActor); static REL::Relocation func{ ID::ProcessLists::RequestHighestDetectionLevelAgainstActor }; return func(this, a_actor, a_LOSCount); } // members BSSemaphore movementSyncSema; // 010 float crimeUpdateTimer; // 018 float removeExcessDeadTimer; // 01C std::int32_t numberHighActors; // 020 std::int32_t numberFullyEnabledHighActors; // 024 std::int32_t crimeNumber; // 028 ActorHandle statdetect; // 02C bool runDetection; // 030 bool showDetectionStats; // 031 bool processHigh; // 032 bool processLow; // 033 bool processMHigh; // 034 bool processMLow; // 035 bool processSche; // 036 bool showSubtitle; // 037 bool updatingLowList; // 038 float secondsPassedNoProcess; // 03C BSTArray highActorHandles; // 040 BSTArray lowActorHandles; // 058 BSTArray middleHighActorHandles; // 070 BSTArray middleLowActorHandles; // 088 BSTArray* allProcesss[4]; // 0A0 BSSimpleList* globalCrimes[7]; // 0C0 BSTArray> globalTempEffects; // 0F8 BSSpinLock globalEffectsLock; // 110 BSTArray> magicEffects; // 118 BSSpinLock magicEffectsLock; // 130 BSTArray> interfaceEffects; // 138 BSSpinLock interfaceEffectsLock; // 150 BSSimpleList referenceMuzzleFlashes; // 158 BSTArray tempShouldMoves; // 168 BSSimpleList aliveActors; // 180 BSSimpleList idleChatterActors; // 190 BSSimpleList randomDialogueActors; // 1A0 BSTArray initPackageLocationsQueue; // 1B0 BSSpinLock packageLocationsQueueLock; // 1C8 BSTArray initAnimPositionQueue; // 1D0 BSTArray> syncPositionQueue; // 1E8 float playerActionCommentTimer; // 200 float playerKnockObjectCommentTimer; // 204 std::uint32_t currentLowActor; // 208 std::uint32_t currentMiddleHighActor; // 20C std::uint32_t currentMiddleLowActor; // 210 bool runSchedules; // 214 bool runMovement; // 215 bool runAnimations; // 216 bool updateActorsInPlayerCell; // 217 }; static_assert(sizeof(ProcessLists) == 0x218); }