diff --git a/mod.json b/mod.json index 9845a2b..46eee8f 100644 --- a/mod.json +++ b/mod.json @@ -3,7 +3,7 @@ "gd": { "win": "2.204" }, - "version": "v2.8.5", + "version": "v2.8.6", "id": "maxnu.gd_mega_overlay", "name": "GD Mega Overlay", "developers": ["maxnu", "SpaghettDev"], @@ -18,5 +18,12 @@ "res/default_windows.json", "res/shadow.png" ] - } + }, + "dependencies": [ + { + "id": "geode.node-ids", + "version": ">=v1.7.1", + "importance": "required" + } + ] } \ No newline at end of file diff --git a/src/Hacks/HidePause.cpp b/src/Hacks/HidePause.cpp index b14c619..2381dfa 100644 --- a/src/Hacks/HidePause.cpp +++ b/src/Hacks/HidePause.cpp @@ -20,15 +20,7 @@ class $modify(CCScheduler) if (playLayer) { - auto uiLayer = reinterpret_cast(playLayer->getChildren()->objectAtIndex(8)); - - if (typeinfo_cast(uiLayer)) - uiLayer = reinterpret_cast(playLayer->getChildren()->objectAtIndex(9)); - - if (uiLayer && uiLayer->getChildrenCount() > 0) - reinterpret_cast( - uiLayer->getChildren()->objectAtIndex(0) - )->setVisible(!Settings::get("general/hide_pause/button")); + playLayer->getChildByID("UILayer")->getChildByID("pause-button-menu")->setVisible(!Settings::get("general/hide_pause/button")); // bool m_isPaused; [PlayLayer + 0x2F17] @@ -36,10 +28,7 @@ class $modify(CCScheduler) MBO(bool, playLayer, 0x2F17) && runningScene && runningScene->getChildrenCount() > 1 ) { - auto pauseLayer = reinterpret_cast(runningScene->getChildren()->objectAtIndex(1)); - - if (pauseLayer) - pauseLayer->setVisible(!Settings::get("general/hide_pause/menu")); + runningScene->getChildByID("PauseLayer")->setVisible(!Settings::get("general/hide_pause/menu")); } } diff --git a/src/Macrobot/Macrobot.cpp b/src/Macrobot/Macrobot.cpp index ab941a0..da191fd 100644 --- a/src/Macrobot/Macrobot.cpp +++ b/src/Macrobot/Macrobot.cpp @@ -61,6 +61,12 @@ class $modify(PlayLayer) checkpoints.clear(); } + void onExit() + { + botInput = false; + PlayLayer::onExit(); + } + void loadFromCheckpoint(CheckpointObject * checkpoint) { resetFromStart = false; @@ -141,8 +147,6 @@ class $modify(PlayerObject) { void pushButton(PlayerButton btn) { - if ((playerMode == PLAYBACK && !botInput) || resetFrame) - return; PlayerObject::pushButton(btn); auto pl = PlayLayer::get(); @@ -158,8 +162,6 @@ class $modify(PlayerObject) void releaseButton(PlayerButton btn) { - if ((playerMode == PLAYBACK && !botInput) || resetFrame) - return; PlayerObject::releaseButton(btn); auto pl = PlayLayer::get(); @@ -220,6 +222,14 @@ class $modify(GJBaseGameLayer) GJBaseGameLayer::update(dt); } + + void handleButton(bool down, int button, bool player1) + { + if ((playerMode == PLAYBACK && !botInput) || resetFrame) + return; + + GJBaseGameLayer::handleButton(down, button, player1); + } }; class $modify(CheckpointObject) diff --git a/src/Macrobot/Record.cpp b/src/Macrobot/Record.cpp index fd46f2e..e0853fc 100644 --- a/src/Macrobot/Record.cpp +++ b/src/Macrobot/Record.cpp @@ -5,8 +5,9 @@ #include "AudioRecord.h" #include "Macrobot.h" -#include +#include "portable-file-dialogs.h" +#include #include #include #include @@ -57,18 +58,9 @@ class $modify(PlayLayer) PlayLayer::onQuit(); } - bool canPauseGame() - { - if(recorder.m_recording || recorder.m_recording_audio) - return false; - - return PlayLayer::canPauseGame(); - } - bool init(GJGameLevel* level, bool unk1, bool unk2) { bool res = PlayLayer::init(level, unk1, unk2); - endLevelLayer = nullptr; return res; } @@ -85,15 +77,6 @@ class $modify(PlayLayer) } }; -class $modify(EndLevelLayer) -{ - void showLayer(bool unk) - { - endLevelLayer = this; - return EndLevelLayer::showLayer(unk); - } -}; - class $modify(GJBaseGameLayer) { void update(float dt) @@ -114,7 +97,7 @@ Recorder::Recorder() void Recorder::start_audio() { std::string level_id = PlayLayer::get()->m_level->m_levelName.c_str() + ("_" + std::to_string(PlayLayer::get()->m_level->m_levelID.value())); - auto path = Mod::get()->getSaveDir() / "renders" / level_id / "rendered_video.mp4"; + ghc::filesystem::path path = renderPath; bool hasVideo = ghc::filesystem::exists(path); if (!hasVideo) @@ -129,6 +112,9 @@ void Recorder::start_audio() recorder.m_recording_audio = true; + if (PlayLayer::get()->getChildByID("EndLevelLayer")) + PlayLayer::get()->getChildByID("EndLevelLayer")->removeFromParent(); + PlayLayer::get()->stopAllActions(); MBO(float, PlayLayer::get(), 10960) = 0;//startgamedelayed PlayLayer::get()->startGame(); @@ -186,7 +172,7 @@ void Recorder::start() float afterEnd = Settings::get("recorder/after_end", 3.4f); m_after_end_extra_time = 0.f; - m_after_end_duration = afterEnd; // hacks.afterEndDuration; + m_after_end_duration = afterEnd; m_renderer.m_width = m_width; m_renderer.m_height = m_height; m_renderer.begin(); @@ -194,29 +180,22 @@ void Recorder::start() m_song_start_offset = PlayLayer::get()->m_levelSettings->m_songOffset; + if (PlayLayer::get()->getChildByID("EndLevelLayer")) + PlayLayer::get()->getChildByID("EndLevelLayer")->removeFromParent(); + PlayLayer::get()->stopAllActions(); MBO(float, PlayLayer::get(), 10960) = 0;//startgamedelayed PlayLayer::get()->startGame(); PlayLayer::get()->resetLevelFromStart(); - std::string level_id = PlayLayer::get()->m_level->m_levelName.c_str() + ("_" + std::to_string(PlayLayer::get()->m_level->m_levelID.value())); auto bg_volume = 1; auto sfx_volume = 1; auto song_offset = m_song_start_offset; - if (!ghc::filesystem::is_directory(Mod::get()->getSaveDir() / "renders" / level_id) || - !ghc::filesystem::exists(Mod::get()->getSaveDir() / "renders" / level_id)) - { - ghc::filesystem::create_directory(Mod::get()->getSaveDir() / "renders" / level_id); - } - - if (m_recording_audio) - return; - - std::thread([&, bg_volume, sfx_volume, song_offset, level_id]() + std::thread([&, bg_volume, sfx_volume, song_offset]() { - auto renderedVideo = (Mod::get()->getSaveDir() / "renders" / level_id / "rendered_video.mp4"); + ghc::filesystem::path renderedVideo = renderPath; { std::stringstream stream; @@ -270,7 +249,6 @@ void Recorder::start() void Recorder::stop() { - Common::showWithPriority(FLAlertLayer::create("Info", "Macro rendererd successfully!", "Ok")); m_renderer.end(); m_recording = false; } @@ -341,20 +319,12 @@ void Recorder::capture_frame() void Recorder::stop_audio() { - Common::showWithPriority(FLAlertLayer::create("Info", "Sound recorded successfully!", "Ok")); + Common::showWithPriority(FLAlertLayer::create("Info", "Macro and sound rendererd successfully!", "Ok")); AudioRecord::stop(); m_recording_audio = false; - GJGameLevel *level = - GameManager::get() - ->getPlayLayer() - ->m_level; // MBO(gd::GJGameLevel*, PlayLayer::get(), 1504); // found in playlayer_init - - std::string level_id = PlayLayer::get()->m_level->m_levelName.c_str() + ("_" + std::to_string(PlayLayer::get()->m_level->m_levelID.value())); - - ghc::filesystem::path video_path = Mod::get()->getSaveDir() / "renders" / level_id / "rendered_video.mp4"; - - ghc::filesystem::path temp_path = Mod::get()->getSaveDir() / "renders" / level_id / "music.mp4"; + ghc::filesystem::path video_path = renderPath; + ghc::filesystem::path temp_path = video_path.parent_path() / "music.mp4"; std::stringstream ss; @@ -406,10 +376,7 @@ void Recorder::handle_recording(GJBaseGameLayer *play_layer, float dt) m_after_end_extra_time += dt; m_finished_level = true; } - - /* if (!play_layer->m_hasCompletedLevel) - tfx = play_layer->timeForXPos(play_layer->m_pPlayer1->getPositionX()); - else */ + tfx += dt; float timewarp = MBO(float, PlayLayer::get(), 724); @@ -447,96 +414,70 @@ void Recorder::handle_recording(GJBaseGameLayer *play_layer, float dt) else { stop(); + + if(Settings::get("recorder/record_audio", false)) + start_audio(); + else + Common::showWithPriority(FLAlertLayer::create("Info", "Macro rendererd successfully!", "Ok")); } } void Record::renderWindow() { - bool disabled = !PlayLayer::get() || levelDone || Record::recorder.m_recording_audio || Record::recorder.m_recording || Macrobot::macro.inputs.size() <= 0 || Macrobot::playerMode != 0; - if (disabled) - ImGui::BeginDisabled(); - - if (GUI::button("Start Recording")) + if(recorder.m_recording || recorder.m_recording_audio) { - if (!ghc::filesystem::exists("ffmpeg.exe")) + if (GUI::button("Stop Recording")) { - auto process = subprocess::Popen(string::wideToUtf8((Mod::get()->getResourcesDir() / "get_ffmpeg.exe").wstring())); - try - { - process.close(); - } - catch (const std::exception &e) - { - std::cout << e.what() << '\n'; - } + if(recorder.m_recording) + recorder.stop(); + else if(recorder.m_recording_audio) + recorder.stop_audio(); } - if (ghc::filesystem::exists("ffmpeg.exe")) - Record::recorder.start(); - else - Common::showWithPriority(FLAlertLayer::create("Error", "FFmpeg not found", "Ok")); } + else + { + bool disabled = !PlayLayer::get() || Macrobot::macro.inputs.size() <= 0 || Macrobot::playerMode != 0; - if (GUI::shouldRender() && disabled && ImGui::IsItemHovered()) - ImGui::SetTooltip("You need to be playing a macro to record"); - - if (disabled) - ImGui::EndDisabled(); - - disabled = !PlayLayer::get() || levelDone || Record::recorder.m_recording_audio || !Record::recorder.m_recording || Macrobot::macro.inputs.size() <= 0 || Macrobot::playerMode != 0; - if (disabled) - ImGui::BeginDisabled(); - - if (GUI::button("Stop Recording")) - Record::recorder.stop(); - - if (disabled) - ImGui::EndDisabled(); - - disabled = !PlayLayer::get() || levelDone || Record::recorder.m_recording || Record::recorder.m_recording_audio || Macrobot::macro.inputs.size() <= 0 || Macrobot::playerMode != 0; - - if (disabled) - ImGui::BeginDisabled(); + if(disabled) + ImGui::BeginDisabled(); - if (GUI::button("Start Audio")) - { - if (!ghc::filesystem::exists("ffmpeg.exe")) + if (GUI::button("Start Recording")) { - auto process = subprocess::Popen(string::wideToUtf8((Mod::get()->getResourcesDir() / "get_ffmpeg.exe").wstring())); - try + if (!ghc::filesystem::exists("ffmpeg.exe")) { - process.close(); + auto process = subprocess::Popen(string::wideToUtf8((Mod::get()->getResourcesDir() / "get_ffmpeg.exe").wstring())); + try + { + process.close(); + } + catch (const std::exception &e) + { + std::cout << e.what() << '\n'; + } } - catch (const std::exception &e) + + if (ghc::filesystem::exists("ffmpeg.exe")) { - std::cout << e.what() << '\n'; + renderPath = pfd::save_file("Save Render", string::wideToUtf8((Mod::get()->getSaveDir() / "renders").wstring()), { "Video Files", "*.mp4"}).result(); + + if(ghc::filesystem::path(renderPath).extension().string().empty()) + renderPath.append(".mp4"); + + if(!renderPath.empty()) + Record::recorder.start(); } + else + Common::showWithPriority(FLAlertLayer::create("Error", "FFmpeg not found", "Ok")); } - if (ghc::filesystem::exists("ffmpeg.exe")) - recorder.start_audio(); - else - Common::showWithPriority(FLAlertLayer::create("Error", "FFmpeg not found", "Ok")); - } - - if (GUI::shouldRender() && disabled && ImGui::IsItemHovered()) - ImGui::SetTooltip("You need to be playing a macro to record"); - - if (disabled) - ImGui::EndDisabled(); - - disabled = !PlayLayer::get() || levelDone || Record::recorder.m_recording || !Record::recorder.m_recording_audio || Macrobot::macro.inputs.size() <= 0 || Macrobot::playerMode != 0; - - if (disabled) - ImGui::BeginDisabled(); - - if (GUI::button("Stop Audio") && Record::recorder.m_recording_audio) - { - recorder.m_recording_audio = false; - AudioRecord::stop(); + if(disabled) + { + GUI::tooltip("You need to be playing a macro to record!"); + ImGui::EndDisabled(); + } } - if (disabled) - ImGui::EndDisabled(); + GUI::checkbox("Record audio", "recorder/record_audio"); int resolution[2]; resolution[0] = Settings::get("recorder/resolution/x", 1920); diff --git a/src/Macrobot/Record.h b/src/Macrobot/Record.h index e799819..0d8bbfa 100644 --- a/src/Macrobot/Record.h +++ b/src/Macrobot/Record.h @@ -9,7 +9,6 @@ #include #include #include -#include using namespace cocos2d; @@ -71,8 +70,7 @@ namespace Record inline Recorder recorder; inline bool visiting = false; inline bool inShader = false; - - inline EndLevelLayer* endLevelLayer = nullptr; + inline std::string renderPath = ""; void renderWindow(); } \ No newline at end of file