Skip to content

Commit 8707a1b

Browse files
committed
fix SceneManager use after frees
1 parent a1fd3c2 commit 8707a1b

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

loader/src/hooks/persist.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include <Geode/ui/SceneManager.hpp>
2+
#include <Geode/modify/CCDirector.hpp>
23

34
using namespace geode::prelude;
45

@@ -30,4 +31,27 @@ struct SceneSwitch : Modify<SceneSwitch, AchievementNotifier> {
3031

3132
#endif
3233

34+
struct SceneSwitch2 : Modify<SceneSwitch2, CCDirector> {
35+
GEODE_FORWARD_COMPAT_DISABLE_HOOKS("persist disabled")
36+
// CCDirector does not call willSwitchToScene in these 2 instances,
37+
// so we have to do it ourselves to make everything behave as expected
38+
void popScene() {
39+
CCDirector::popScene();
40+
#ifdef GEODE_IS_WINDOWS
41+
AppDelegate::get()->willSwitchToScene(m_pNextScene);
42+
#else
43+
AchievementNotifier::get()->willSwitchToScene(m_pNextScene);
44+
#endif
45+
}
46+
47+
void popToSceneStackLevel(int level) {
48+
CCDirector::popToSceneStackLevel(level);
49+
#ifdef GEODE_IS_WINDOWS
50+
AppDelegate::get()->willSwitchToScene(m_pNextScene);
51+
#else
52+
AchievementNotifier::get()->willSwitchToScene(m_pNextScene);
53+
#endif
54+
}
55+
};
56+
3357
}

loader/src/ui/nodes/SceneManager.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ void SceneManager::keepAcrossScenes(CCNode* node) {
1818
if (ranges::contains(m_persistedNodes, node)) {
1919
return;
2020
}
21+
m_persistedNodes.push_back(node);
2122
if (m_lastScene) {
2223
node->removeFromParentAndCleanup(false);
2324
m_lastScene->addChild(node);
2425
}
25-
m_persistedNodes.push_back(node);
2626
}
2727

2828
void SceneManager::forget(CCNode* node) {
@@ -37,7 +37,7 @@ void SceneManager::willSwitchToScene(CCScene* scene) {
3737
for (auto& node : m_persistedNodes) {
3838
// no cleanup in order to keep actions running
3939
node->removeFromParentAndCleanup(false);
40-
scene->addChild(node);
40+
if(scene) scene->addChild(node);
4141
}
4242
m_lastScene = scene;
4343
}

0 commit comments

Comments
 (0)