aboutsummaryrefslogtreecommitdiff
path: root/launcher/minecraft/mod/Mod.cpp
diff options
context:
space:
mode:
authorflow <flowlnlnln@gmail.com>2022-06-04 23:11:25 -0300
committerflow <flowlnlnln@gmail.com>2022-06-12 09:25:21 -0300
commit40ccd1a46910012f80285f7b6982a5919e2a9dcf (patch)
treeadf3638518722804784437954bdceae8cd6c3682 /launcher/minecraft/mod/Mod.cpp
parentc4f2e3a95584d9c50544a978a83650f8f83551fa (diff)
downloadPrismLauncher-40ccd1a46910012f80285f7b6982a5919e2a9dcf.tar.gz
PrismLauncher-40ccd1a46910012f80285f7b6982a5919e2a9dcf.tar.bz2
PrismLauncher-40ccd1a46910012f80285f7b6982a5919e2a9dcf.zip
fix: handling of incomplete mods
(i.e. mods without ModDetails that may have metadata)
Diffstat (limited to 'launcher/minecraft/mod/Mod.cpp')
-rw-r--r--launcher/minecraft/mod/Mod.cpp44
1 files changed, 32 insertions, 12 deletions
diff --git a/launcher/minecraft/mod/Mod.cpp b/launcher/minecraft/mod/Mod.cpp
index 71a32d32..39c7efd8 100644
--- a/launcher/minecraft/mod/Mod.cpp
+++ b/launcher/minecraft/mod/Mod.cpp
@@ -58,8 +58,6 @@ Mod::Mod(const QFileInfo& file)
Mod::Mod(const QDir& mods_dir, const Metadata::ModStruct& metadata)
: m_file(mods_dir.absoluteFilePath(metadata.filename))
- // It is weird, but name is not reliable for comparing with the JAR files name
- // FIXME: Maybe use hash when implemented?
, m_internal_id(metadata.filename)
, m_name(metadata.name)
{
@@ -131,7 +129,7 @@ auto Mod::enable(bool value) -> bool
return false;
} else {
path += ".disabled";
-
+
if (!file.rename(path))
return false;
}
@@ -145,16 +143,22 @@ auto Mod::enable(bool value) -> bool
void Mod::setStatus(ModStatus status)
{
- if(m_localDetails.get())
+ if (m_localDetails) {
m_localDetails->status = status;
+ } else {
+ m_temp_status = status;
+ }
}
void Mod::setMetadata(Metadata::ModStruct* metadata)
{
- if(status() == ModStatus::NoMetadata)
+ if (status() == ModStatus::NoMetadata)
setStatus(ModStatus::Installed);
- if(m_localDetails.get())
+ if (m_localDetails) {
m_localDetails->metadata.reset(metadata);
+ } else {
+ m_temp_metadata.reset(metadata);
+ }
}
auto Mod::destroy(QDir& index_dir) -> bool
@@ -205,20 +209,36 @@ auto Mod::authors() const -> QStringList
auto Mod::status() const -> ModStatus
{
+ if (!m_localDetails)
+ return m_temp_status;
return details().status;
}
+auto Mod::metadata() -> std::shared_ptr<Metadata::ModStruct>
+{
+ if (m_localDetails)
+ return m_localDetails->metadata;
+ return m_temp_metadata;
+}
+
+auto Mod::metadata() const -> const std::shared_ptr<Metadata::ModStruct>
+{
+ if (m_localDetails)
+ return m_localDetails->metadata;
+ return m_temp_metadata;
+}
+
void Mod::finishResolvingWithDetails(std::shared_ptr<ModDetails> details)
{
m_resolving = false;
m_resolved = true;
m_localDetails = details;
- if (status() != ModStatus::NoMetadata
- && m_temp_metadata.get()
- && m_temp_metadata->isValid() &&
- m_localDetails.get()) {
-
- m_localDetails->metadata.swap(m_temp_metadata);
+ if (m_localDetails && m_temp_metadata && m_temp_metadata->isValid()) {
+ m_localDetails->metadata = m_temp_metadata;
+ if (status() == ModStatus::NoMetadata)
+ setStatus(ModStatus::Installed);
}
+
+ setStatus(m_temp_status);
}