diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 2d73b966..9c25ee89 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -91818,7 +91818,7 @@ 0x00000071011be734,BaseProcMgr::checkGetActorOk,328,_ZNK4ksys3act11BaseProcMgr19isAccessingProcSafeEPNS0_8BaseProcES3_ 0x00000071011be87c,BaseProcMgr::requestActorCreate,8,_ZN4ksys3act11BaseProcMgr17requestCreateProcERKNS0_21BaseProcCreateRequestE 0x00000071011be884,BaseProcMgr::createActor,8,_ZN4ksys3act11BaseProcMgr10createProcERKNS0_21BaseProcCreateRequestE -0x00000071011be88c,BaseProcMgr::getNextActor,532, +0x00000071011be88c,BaseProcMgr::getNextActor,532,_ZN4ksys3act11BaseProcMgr11getNextProcEPN4sead15CriticalSectionEPNS0_8BaseProcENS2_12TypedBitFlagINS1_10ProcFilterEiEE 0x00000071011beaa0,sub_71011BEAA0,464,_ZN4ksys3act11BaseProcMgr7getProcERKN4sead14SafeStringBaseIcEENS2_12TypedBitFlagINS1_10ProcFilterEiEE 0x00000071011bec70,sub_71011BEC70,252,_ZN4ksys3act11BaseProcMgr7getProcERKjN4sead12TypedBitFlagINS1_10ProcFilterEiEE 0x00000071011bed6c,BaseProcMgr::invokeForEachActor,140,_ZN4ksys3act11BaseProcMgr11forEachProcERN4sead10IDelegate1IPNS0_8BaseProcEEENS2_12TypedBitFlagINS1_10ProcFilterEiEE? diff --git a/lib/agl b/lib/agl index 92c56335..a6301088 160000 --- a/lib/agl +++ b/lib/agl @@ -1 +1 @@ -Subproject commit 92c5633549da576da3168d6c8f988207de639e5c +Subproject commit a63010880b67e5a667aed6528144a4ad94a8cfb4 diff --git a/lib/sead b/lib/sead index 83c6cf26..80d838dc 160000 --- a/lib/sead +++ b/lib/sead @@ -1 +1 @@ -Subproject commit 83c6cf26499441d7b55a89ef9ce560d23d58770d +Subproject commit 80d838dcc8db49409b490b51f6a81ff96e0ea8a2 diff --git a/src/KingSystem/ActorSystem/actBaseProcMgr.cpp b/src/KingSystem/ActorSystem/actBaseProcMgr.cpp index bd228de3..a3ca8407 100644 --- a/src/KingSystem/ActorSystem/actBaseProcMgr.cpp +++ b/src/KingSystem/ActorSystem/actBaseProcMgr.cpp @@ -470,6 +470,37 @@ inline bool BaseProcMgr::checkFilters(BaseProc* proc, ProcFilters filters) const return !filters.isOff(ProcFilter::SkipAccessCheck) || isAccessingProcSafe(proc, nullptr); } +BaseProc* BaseProcMgr::getNextProc(sead::CriticalSection* cs, BaseProc* current_proc, + BaseProcMgr::ProcFilters filters) { + if (&mProcMapCS != cs) + return nullptr; + + BaseProcMapNode* node = nullptr; + if (current_proc) + node = current_proc->mMapNode.next(); + else + node = mLastProcMapNode = mProcMap.startIterating(); + + if (!node && mLastProcMapNode) + node = mLastProcMapNode = mProcMap.nextNode(mLastProcMapNode); + + auto* proc = node ? node->proc() : nullptr; + while (proc) { + if (checkFilters(proc, filters)) + return proc; + + node = proc->mMapNode.next(); + if (!node && mLastProcMapNode) + node = mLastProcMapNode = mProcMap.nextNode(mLastProcMapNode); + + if (!node) + return nullptr; + + proc = node->proc(); + } + return nullptr; +} + BaseProc* BaseProcMgr::getProc(const sead::SafeString& name, BaseProcMgr::ProcFilters filters) { const auto lock = sead::makeScopedLock(mProcMapCS); diff --git a/src/KingSystem/ActorSystem/actBaseProcMgr.h b/src/KingSystem/ActorSystem/actBaseProcMgr.h index c4d8f209..3f0df876 100644 --- a/src/KingSystem/ActorSystem/actBaseProcMgr.h +++ b/src/KingSystem/ActorSystem/actBaseProcMgr.h @@ -172,7 +172,7 @@ public: // region BaseProc iteration - BaseProc* getNextProc(sead::CriticalSection* cs, BaseProc* proc, ProcFilters filters); + BaseProc* getNextProc(sead::CriticalSection* cs, BaseProc* current_proc, ProcFilters filters); BaseProc* getProc(const sead::SafeString& name, ProcFilters filters); BaseProc* getProc(const u32& id, ProcFilters filters); void forEachProc(sead::IDelegate1& callback, ProcFilters filters);