featured mod glow :3

This commit is contained in:
HJfod 2024-02-27 01:16:24 +02:00
parent 7467eecb00
commit 909317146d
6 changed files with 46 additions and 25 deletions

View file

@ -40,5 +40,5 @@ namespace geode {
* logo is initially a loading circle, with the actual sprite downloaded
* asynchronously
*/
GEODE_DLL cocos2d::CCNode* createServerModLogo(std::string const& id);
GEODE_DLL cocos2d::CCNode* createServerModLogo(std::string const& id, bool featured);
}

View file

@ -132,7 +132,6 @@ Result<ServerModMetadata> ServerModMetadata::parse(matjson::Value const& raw) {
auto res = ServerModMetadata();
root.needs("id").into(res.id);
root.needs("latest_version").into(res.latestVersion);
root.needs("featured").into(res.featured);
root.needs("download_count").into(res.downloadCount);
root.has("about").into(res.about);
@ -186,8 +185,13 @@ Result<ServerModsList> ServerModsList::parse(matjson::Value const& raw) {
auto list = ServerModsList();
for (auto item : payload.needs("data").iterate()) {
GEODE_UNWRAP_INTO(auto mod, ServerModMetadata::parse(item.json()));
list.mods.push_back(mod);
auto mod = ServerModMetadata::parse(item.json());
if (mod) {
list.mods.push_back(mod.unwrap());
}
else {
log::error("Unable to parse mod from the server: {}", mod.unwrapErr());
}
}
payload.needs("count").into(list.totalModCount);

View file

@ -23,7 +23,6 @@ namespace server {
struct ServerModMetadata {
std::string id;
VersionInfo latestVersion;
bool featured;
size_t downloadCount;
std::vector<ServerDeveloper> developers;

View file

@ -69,9 +69,10 @@ class ModLogoSprite : public CCNode {
protected:
std::string m_modID;
CCNode* m_sprite = nullptr;
CCNode* m_featuredSprite = nullptr;
EventListener<PromiseEventFilter<ByteVector, server::ServerError>> m_listener;
bool init(std::string const& id, bool fetch) {
bool init(std::string const& id, bool fetch, bool featured) {
if (!CCNode::init())
return false;
@ -81,6 +82,13 @@ protected:
m_modID = id;
m_listener.bind(this, &ModLogoSprite::onFetch);
if (featured) {
m_featuredSprite = CCSprite::createWithSpriteFrameName("logo-glow.png"_spr);
limitNodeSize(m_featuredSprite, m_obContentSize * 1.15f, 99.f, .1f);
m_featuredSprite->setZOrder(-1);
this->addChildAtPosition(m_featuredSprite, Anchor::Center);
}
// Load from Resources
if (!fetch) {
this->setSprite(id == "geode.loader" ?
@ -95,6 +103,10 @@ protected:
m_sprite->runAction(CCRepeatForever::create(CCRotateBy::create(1.f, 360.f)));
m_listener.setFilter(server::getModLogo(id).listen());
}
if (m_featuredSprite) {
m_featuredSprite->setVisible(!fetch);
}
return true;
}
@ -116,6 +128,11 @@ protected:
m_sprite = sprite;
limitNodeSize(m_sprite, m_obContentSize, 99.f, .05f);
this->addChildAtPosition(m_sprite, Anchor::Center);
// Featured sprite is initially invisible if fetched from server
if (m_featuredSprite) {
m_featuredSprite->setVisible(true);
}
}
void onFetch(PromiseEvent<ByteVector, server::ServerError>* event) {
@ -123,6 +140,7 @@ protected:
if (event->getReject()) {
this->setSprite(nullptr);
}
// Otherwise load downloaded sprite to memory
else if (auto data = event->getResolve()) {
auto image = Ref(new CCImage());
image->initWithImageData(const_cast<uint8_t*>(data->data()), data->size());
@ -133,9 +151,9 @@ protected:
}
public:
static ModLogoSprite* create(std::string const& id, bool fetch) {
static ModLogoSprite* create(std::string const& id, bool fetch = false, bool featured = false) {
auto ret = new ModLogoSprite();
if (ret && ret->init(id, fetch)) {
if (ret && ret->init(id, fetch, featured)) {
ret->autorelease();
return ret;
}
@ -145,15 +163,15 @@ public:
};
CCNode* geode::createDefaultLogo() {
return ModLogoSprite::create("", false);
return ModLogoSprite::create("");
}
CCNode* geode::createModLogo(Mod* mod) {
return ModLogoSprite::create(mod->getID(), false);
return ModLogoSprite::create(mod->getID());
}
CCNode* geode::createServerModLogo(std::string const& id) {
return ModLogoSprite::create(id, true);
CCNode* geode::createServerModLogo(std::string const& id, bool featured) {
return ModLogoSprite::create(id, true, featured);
}
// CCNode* geode::createIndexItemLogo(IndexItemHandle item) {

View file

@ -138,7 +138,7 @@ ModMetadata ServerModItem::getMetadata() const {
}
CCNode* ServerModItem::createModLogo() const {
return createServerModLogo(m_metadata.id);
return createServerModLogo(m_metadata.id, m_metadata.featured);
}
bool ServerModItem::wantsRestart() const {

View file

@ -33,9 +33,6 @@ static auto loadServerModsPage(size_t page, bool featuredOnly) {
.pageSize = PAGE_SIZE,
})
.then([resolve, reject](server::ServerModsList list) {
if (list.totalModCount == 0) {
return reject(ModListSource::LoadPageError("No mods found :("));
}
auto content = ModListSource::Page();
for (auto mod : list.mods) {
content.push_back(ServerModItem::create(mod));
@ -69,12 +66,15 @@ typename ModListSource::PagePromise ModListSource::loadPage(size_t page, bool up
m_cachedPages.erase(page);
return PagePromise([this, page](auto resolve, auto reject, auto progress, auto cancelled) {
m_provider(page)
.then([page, this, resolve = std::move(resolve)](auto data) {
.then([page, this, resolve, reject](auto data) {
if (data.second == 0 || data.first.empty()) {
return reject(ModListSource::LoadPageError("No mods found :("));
}
m_cachedItemCount = data.second;
m_cachedPages.insert({ page, data.first });
resolve(data.first);
})
.expect([this, reject = std::move(reject)](auto error) {
.expect([this, reject = reject](auto error) {
reject(error);
})
.progress([this, progress = std::move(progress)](auto prog) {
@ -103,31 +103,31 @@ ModListSource* ModListSource::get(ModListSourceType type) {
switch (type) {
default:
case ModListSourceType::Installed: {
static auto inst = ModListSource::create(loadInstalledModsPage);
static auto inst = Ref(ModListSource::create(loadInstalledModsPage));
return inst;
} break;
case ModListSourceType::Featured: {
static auto inst = ModListSource::create(+[](size_t page) {
static auto inst = Ref(ModListSource::create(+[](size_t page) {
return loadServerModsPage(page, true);
});
}));
return inst;
} break;
case ModListSourceType::Trending: {
static auto inst = ModListSource::create(nullptr);
static auto inst = Ref(ModListSource::create(nullptr));
return inst;
} break;
case ModListSourceType::ModPacks: {
static auto inst = ModListSource::create(nullptr);
static auto inst = Ref(ModListSource::create(nullptr));
return inst;
} break;
case ModListSourceType::All: {
static auto inst = ModListSource::create(+[](size_t page) {
static auto inst = Ref(ModListSource::create(+[](size_t page) {
return loadServerModsPage(page, false);
});
}));
return inst;
} break;
}