mirror of
https://github.com/geode-sdk/geode.git
synced 2025-02-17 00:30:26 -05:00
featured mod glow :3
This commit is contained in:
parent
7467eecb00
commit
909317146d
6 changed files with 46 additions and 25 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -23,7 +23,6 @@ namespace server {
|
|||
|
||||
struct ServerModMetadata {
|
||||
std::string id;
|
||||
VersionInfo latestVersion;
|
||||
bool featured;
|
||||
size_t downloadCount;
|
||||
std::vector<ServerDeveloper> developers;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue