Skip to content

Commit 6212f44

Browse files
authored
add recursion check
1 parent bd672d3 commit 6212f44

1 file changed

Lines changed: 20 additions & 7 deletions

File tree

src/GameEventHandler.cpp

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,19 +43,26 @@ std::recursive_mutex morph_task_mutex;
4343
std::recursive_mutex qupdatenormalmap_lock;
4444
std::recursive_mutex loading_game_mutex;
4545
std::recursive_mutex custom_main_task_pool_lock;
46+
std::uint64_t qupdatenormalmap_recursion=0;
4647
std::queue<std::function<void()>> custom_main_task_pool;
4748
auto original_process_task = (void (*)(void* main, void* arg2, void* arg3, void* arg4)) nullptr;
4849
auto qupdatenormalmap = (void (*)(void* arg1, RE::Actor* actor, int armor_slot_bit)) nullptr;
4950
auto original_setskin = (void (*)(RE::TESActorBase* actorbase, RE::TESObjectARMO* skin)) nullptr;
5051
static void setskin_hook(RE::TESActorBase* actorbase, RE::TESObjectARMO* skin) {
5152
if (original_setskin && qupdatenormalmap) {
5253
original_setskin(actorbase, skin);
53-
std::lock_guard l(qupdatenormalmap_lock);
54+
5455
auto actor_forms = RE::TESDataHandler::GetSingleton()->GetFormArray<RE::Actor>();
5556
for (auto* actor: actor_forms) {
5657
if (actor && actor->GetActorBase() == actorbase) {
57-
qupdatenormalmap(nullptr, actor, 0xffffffff);
58-
logger::info("calling QUpdateNormalMap");
58+
std::lock_guard l(qupdatenormalmap_lock);
59+
if (qupdatenormalmap_recursion == 0) {
60+
logger::info("calling QUpdateNormalMap");
61+
qupdatenormalmap_recursion = 1;
62+
qupdatenormalmap(nullptr, actor, 0xffffffff);
63+
64+
qupdatenormalmap_recursion = 0;
65+
}
5966
}
6067
}
6168
}
@@ -400,8 +407,14 @@ namespace plugin {
400407
if (qupdatenormalmap) {
401408
if (auto actor = reference->As<RE::Actor>()) {
402409
std::lock_guard l(qupdatenormalmap_lock);
403-
qupdatenormalmap(nullptr, actor, 0xFFFFFFFF);
404-
logger::info("calling QUpdateNormalMap");
410+
if (qupdatenormalmap_recursion == 0) {
411+
logger::info("calling QUpdateNormalMap");
412+
qupdatenormalmap_recursion = 1;
413+
qupdatenormalmap(nullptr, actor, 0xffffffff);
414+
415+
qupdatenormalmap_recursion = 0;
416+
}
417+
405418
}
406419
}
407420
} else {
@@ -2320,7 +2333,7 @@ namespace plugin {
23202333
if (auto func = func_ptr->func) {
23212334
if (func->GetName() == RE::BSFixedString("QUpdateNormalmap") && func->GetIsNative()) {
23222335
qupdatenormalmap = (void (*)(void* arg1, RE::Actor* actor, int armor_slot_bit)) *
2323-
(uint64_t*) ((uint64_t) func.get() + 0x50);
2336+
(uint64_t*) (((uint64_t) func.get()) + 0x50);
23242337
logger::info("found QUpdateNormalMap");
23252338
}
23262339
}
@@ -2341,7 +2354,7 @@ namespace plugin {
23412354
if (auto func = func_ptr->func) {
23422355
if (func->GetName() == RE::BSFixedString("SetSkin") && func->GetIsNative()) {
23432356
original_setskin = (void (*)(RE::TESActorBase* actorbase, RE::TESObjectARMO* skin)) *
2344-
(uint64_t*) ((uint64_t) func.get() + 0x50);
2357+
(uint64_t*) (((uint64_t) func.get()) + 0x50);
23452358
logger::info("found SetSkin");
23462359
}
23472360
}

0 commit comments

Comments
 (0)