2022-12-01 15:42:49 -05:00
|
|
|
|
2022-10-14 14:04:59 -04:00
|
|
|
#include <InternalLoader.hpp>
|
2022-10-30 14:56:36 -04:00
|
|
|
#include <array>
|
|
|
|
#include <Geode/modify/LoadingLayer.hpp>
|
2022-11-28 11:32:25 -05:00
|
|
|
#include <fmt/format.h>
|
2022-12-07 14:21:50 -05:00
|
|
|
#include <Geode/utils/cocos.hpp>
|
2022-11-09 13:03:53 -05:00
|
|
|
|
2022-12-01 15:42:49 -05:00
|
|
|
USE_GEODE_NAMESPACE();
|
|
|
|
|
2022-11-09 13:03:53 -05:00
|
|
|
struct CustomLoadingLayer : Modify<CustomLoadingLayer, LoadingLayer> {
|
2022-10-15 11:35:13 -04:00
|
|
|
bool m_updatingResources;
|
2022-10-14 14:04:59 -04:00
|
|
|
|
2022-10-15 11:35:13 -04:00
|
|
|
CustomLoadingLayer() : m_updatingResources(false) {}
|
2022-10-14 14:04:59 -04:00
|
|
|
|
2022-08-01 11:18:03 -04:00
|
|
|
bool init(bool fromReload) {
|
2022-11-09 13:03:53 -05:00
|
|
|
if (!LoadingLayer::init(fromReload)) return false;
|
2022-08-01 11:18:03 -04:00
|
|
|
|
|
|
|
auto winSize = CCDirector::sharedDirector()->getWinSize();
|
|
|
|
|
|
|
|
auto count = Loader::get()->getAllMods().size();
|
|
|
|
|
|
|
|
auto label = CCLabelBMFont::create(
|
2022-11-28 11:32:25 -05:00
|
|
|
fmt::format("Geode: Loaded {} mods", count).c_str(),
|
2022-08-01 11:18:03 -04:00
|
|
|
"goldFont.fnt"
|
|
|
|
);
|
|
|
|
label->setPosition(winSize.width / 2, 30.f);
|
|
|
|
label->setScale(.45f);
|
2022-10-14 14:04:59 -04:00
|
|
|
label->setID("geode-loaded-info");
|
2022-08-01 11:18:03 -04:00
|
|
|
this->addChild(label);
|
|
|
|
|
2022-12-07 14:21:50 -05:00
|
|
|
// for some reason storing the listener as a field caused the
|
|
|
|
// destructor for the field not to be run
|
|
|
|
this->addChild(EventListenerNode<ResourceDownloadFilter>::create(
|
2022-12-07 05:35:50 -05:00
|
|
|
this, &CustomLoadingLayer::updateResourcesProgress
|
2022-12-07 14:21:50 -05:00
|
|
|
));
|
2022-10-14 14:04:59 -04:00
|
|
|
|
2022-12-01 15:42:49 -05:00
|
|
|
// verify loader resources
|
|
|
|
if (!InternalLoader::get()->verifyLoaderResources()) {
|
2022-10-15 11:35:13 -04:00
|
|
|
m_fields->m_updatingResources = true;
|
2022-10-14 14:04:59 -04:00
|
|
|
this->setUpdateText("Downloading Resources");
|
|
|
|
}
|
|
|
|
|
2022-08-01 11:18:03 -04:00
|
|
|
return true;
|
|
|
|
}
|
2022-10-14 14:04:59 -04:00
|
|
|
|
|
|
|
void setUpdateText(std::string const& text) {
|
2022-10-15 11:35:13 -04:00
|
|
|
m_textArea->setString(text.c_str());
|
2022-10-14 14:04:59 -04:00
|
|
|
}
|
|
|
|
|
2022-12-01 15:42:49 -05:00
|
|
|
void updateResourcesProgress(ResourceDownloadEvent* event) {
|
2022-12-06 14:22:03 -05:00
|
|
|
std::visit(makeVisitor {
|
|
|
|
[&](UpdateProgress const& progress) {
|
|
|
|
this->setUpdateText(fmt::format(
|
|
|
|
"Downloading Resources: {}%", progress.first
|
|
|
|
));
|
|
|
|
},
|
|
|
|
[&](UpdateFinished) {
|
|
|
|
this->setUpdateText("Resources Downloaded");
|
|
|
|
m_fields->m_updatingResources = false;
|
|
|
|
this->loadAssets();
|
|
|
|
},
|
|
|
|
[&](UpdateError const& error) {
|
|
|
|
InternalLoader::platformMessageBox(
|
|
|
|
"Error updating resources",
|
|
|
|
"Unable to update Geode resources: " +
|
|
|
|
error + ".\n"
|
|
|
|
"The game will be loaded as normal, but please be aware "
|
|
|
|
"that it may very likely crash."
|
|
|
|
);
|
|
|
|
this->setUpdateText("Resource Download Failed");
|
|
|
|
m_fields->m_updatingResources = false;
|
|
|
|
this->loadAssets();
|
|
|
|
}
|
|
|
|
}, event->status);
|
2022-10-14 14:04:59 -04:00
|
|
|
}
|
|
|
|
|
2022-11-09 13:03:53 -05:00
|
|
|
void loadAssets() {
|
|
|
|
if (m_fields->m_updatingResources) {
|
2022-10-14 14:04:59 -04:00
|
|
|
return;
|
2022-11-09 13:03:53 -05:00
|
|
|
}
|
|
|
|
LoadingLayer::loadAssets();
|
|
|
|
}
|
2022-08-01 11:18:03 -04:00
|
|
|
};
|