refactor: dynamically get best version for intermediary mappings
This commit is contained in:
parent
9eb9ddc668
commit
9349232bd4
@ -2,7 +2,6 @@
|
||||
|
||||
#include "PackProfile_p.h"
|
||||
#include "PackProfile.h"
|
||||
#include "Component.h"
|
||||
#include "meta/Index.h"
|
||||
#include "meta/VersionList.h"
|
||||
#include "meta/Version.h"
|
||||
@ -495,6 +494,31 @@ static bool getTrivialComponentChanges(const ComponentIndex & index, const Requi
|
||||
return succeeded;
|
||||
}
|
||||
|
||||
QString ComponentUpdateTask::findBestComponentVersion(const ComponentPtr component)
|
||||
{
|
||||
auto & components = d->m_list->d->components;
|
||||
auto versions = component->getVersionList();
|
||||
versions->load(d->netmode);
|
||||
|
||||
for (auto & version : versions->versions()) {
|
||||
if (version->isRecommended()) { // only look at recommended versions
|
||||
bool requirementsMet = true;
|
||||
for (auto req : version->requires()) {
|
||||
auto requirementMet = std::any_of(components.begin(), components.end(), [&req](ComponentPtr & cmp){
|
||||
return cmp->getID() == req.uid && cmp->getVersion() == req.equalsVersion;
|
||||
});
|
||||
if (!requirementMet) {
|
||||
requirementsMet = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (requirementsMet) // return first recommended version that meets all requirements
|
||||
return version->version();
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// FIXME, TODO: decouple dependency resolution from loading
|
||||
// FIXME: This works directly with the PackProfile internals. It shouldn't! It needs richer data types than PackProfile uses.
|
||||
// FIXME: throw all this away and use a graph
|
||||
@ -591,27 +615,14 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly)
|
||||
{
|
||||
component->m_version = "3.1.2";
|
||||
}
|
||||
else if (add.uid == "net.fabricmc.intermediary")
|
||||
{
|
||||
auto minecraft = std::find_if(components.begin(), components.end(), [](ComponentPtr & cmp){
|
||||
return cmp->getID() == "net.minecraft";
|
||||
});
|
||||
if(minecraft != components.end()) {
|
||||
component->m_version = (*minecraft)->getVersion();
|
||||
}
|
||||
}
|
||||
else if (add.uid == "org.quiltmc.quilt-mappings")
|
||||
{
|
||||
auto minecraft = std::find_if(components.begin(), components.end(), [](ComponentPtr & cmp){
|
||||
return cmp->getID() == "net.minecraft";
|
||||
});
|
||||
if(minecraft != components.end()) {
|
||||
component->m_version = (*minecraft)->getVersion() + "+build.1";
|
||||
}
|
||||
}
|
||||
}
|
||||
// HACK HACK HACK HACK FIXME: this is a placeholder for deciding what version to use. For now, it is hardcoded.
|
||||
// ############################################################################################################
|
||||
// below is not ugly anymore
|
||||
else if (add.uid == "net.fabricmc.intermediary" || add.uid == "org.quiltmc.quilt-mappings")
|
||||
{
|
||||
component->m_version = findBestComponentVersion(component);
|
||||
}
|
||||
}
|
||||
}
|
||||
component->m_dependencyOnly = true;
|
||||
// FIXME: this should not work directly with the component list
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
#include "tasks/Task.h"
|
||||
#include "net/Mode.h"
|
||||
#include "Component.h"
|
||||
|
||||
#include <memory>
|
||||
class PackProfile;
|
||||
@ -26,6 +27,7 @@ protected:
|
||||
|
||||
private:
|
||||
void loadComponents();
|
||||
QString findBestComponentVersion(ComponentPtr component);
|
||||
void resolveDependencies(bool checkOnly);
|
||||
|
||||
void remoteLoadSucceeded(size_t index);
|
||||
|
Loading…
Reference in New Issue
Block a user