1 /* Copyright 2013-2019 MultiMC Contributors
2  *
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <QFileInfo>
17 #include <minecraft/launch/LauncherPartLaunch.h>
18 #include <QDir>
19 #include <settings/Setting.h>
20 
21 #include "LegacyInstance.h"
22 
23 #include "minecraft/legacy/LegacyModList.h"
24 #include "minecraft/WorldList.h"
25 #include <MMCZip.h>
26 #include <FileSystem.h>
27 
LegacyInstance(SettingsObjectPtr globalSettings,SettingsObjectPtr settings,const QString & rootDir)28 LegacyInstance::LegacyInstance(SettingsObjectPtr globalSettings, SettingsObjectPtr settings, const QString &rootDir)
29     : BaseInstance(globalSettings, settings, rootDir)
30 {
31     settings->registerSetting("NeedsRebuild", true);
32     settings->registerSetting("ShouldUpdate", false);
33     settings->registerSetting("JarVersion", QString());
34     settings->registerSetting("IntendedJarVersion", QString());
35     /*
36      * custom base jar has no default. it is determined in code... see the accessor methods for
37      *it
38      *
39      * for instances that DO NOT have the CustomBaseJar setting (legacy instances),
40      * [.]minecraft/bin/mcbackup.jar is the default base jar
41      */
42     settings->registerSetting("UseCustomBaseJar", true);
43     settings->registerSetting("CustomBaseJar", "");
44 }
45 
mainJarToPreserve() const46 QString LegacyInstance::mainJarToPreserve() const
47 {
48     bool customJar = m_settings->get("UseCustomBaseJar").toBool();
49     if(customJar)
50     {
51         auto base = baseJar();
52         if(QFile::exists(base))
53         {
54             return base;
55         }
56     }
57     auto runnable = runnableJar();
58     if(QFile::exists(runnable))
59     {
60         return runnable;
61     }
62     return QString();
63 }
64 
65 
baseJar() const66 QString LegacyInstance::baseJar() const
67 {
68     bool customJar = m_settings->get("UseCustomBaseJar").toBool();
69     if (customJar)
70     {
71         return customBaseJar();
72     }
73     else
74         return defaultBaseJar();
75 }
76 
customBaseJar() const77 QString LegacyInstance::customBaseJar() const
78 {
79     QString value = m_settings->get("CustomBaseJar").toString();
80     if (value.isNull() || value.isEmpty())
81     {
82         return defaultCustomBaseJar();
83     }
84     return value;
85 }
86 
shouldUseCustomBaseJar() const87 bool LegacyInstance::shouldUseCustomBaseJar() const
88 {
89     return m_settings->get("UseCustomBaseJar").toBool();
90 }
91 
92 
createUpdateTask(Net::Mode)93 shared_qobject_ptr<Task> LegacyInstance::createUpdateTask(Net::Mode)
94 {
95     return nullptr;
96 }
97 
jarModList() const98 std::shared_ptr<LegacyModList> LegacyInstance::jarModList() const
99 {
100     if (!jar_mod_list)
101     {
102         auto list = new LegacyModList(jarModsDir(), modListFile());
103         jar_mod_list.reset(list);
104     }
105     jar_mod_list->update();
106     return jar_mod_list;
107 }
108 
gameRoot() const109 QString LegacyInstance::gameRoot() const
110 {
111     QFileInfo mcDir(FS::PathCombine(instanceRoot(), "minecraft"));
112     QFileInfo dotMCDir(FS::PathCombine(instanceRoot(), ".minecraft"));
113 
114     if (mcDir.exists() && !dotMCDir.exists())
115         return mcDir.filePath();
116     else
117         return dotMCDir.filePath();
118 }
119 
binRoot() const120 QString LegacyInstance::binRoot() const
121 {
122     return FS::PathCombine(gameRoot(), "bin");
123 }
124 
jarModsDir() const125 QString LegacyInstance::jarModsDir() const
126 {
127     return FS::PathCombine(instanceRoot(), "instMods");
128 }
129 
libDir() const130 QString LegacyInstance::libDir() const
131 {
132     return FS::PathCombine(gameRoot(), "lib");
133 }
134 
savesDir() const135 QString LegacyInstance::savesDir() const
136 {
137     return FS::PathCombine(gameRoot(), "saves");
138 }
139 
loaderModsDir() const140 QString LegacyInstance::loaderModsDir() const
141 {
142     return FS::PathCombine(gameRoot(), "mods");
143 }
144 
coreModsDir() const145 QString LegacyInstance::coreModsDir() const
146 {
147     return FS::PathCombine(gameRoot(), "coremods");
148 }
149 
resourceDir() const150 QString LegacyInstance::resourceDir() const
151 {
152     return FS::PathCombine(gameRoot(), "resources");
153 }
texturePacksDir() const154 QString LegacyInstance::texturePacksDir() const
155 {
156     return FS::PathCombine(gameRoot(), "texturepacks");
157 }
158 
runnableJar() const159 QString LegacyInstance::runnableJar() const
160 {
161     return FS::PathCombine(binRoot(), "minecraft.jar");
162 }
163 
modListFile() const164 QString LegacyInstance::modListFile() const
165 {
166     return FS::PathCombine(instanceRoot(), "modlist");
167 }
168 
instanceConfigFolder() const169 QString LegacyInstance::instanceConfigFolder() const
170 {
171     return FS::PathCombine(gameRoot(), "config");
172 }
173 
shouldRebuild() const174 bool LegacyInstance::shouldRebuild() const
175 {
176     return m_settings->get("NeedsRebuild").toBool();
177 }
178 
currentVersionId() const179 QString LegacyInstance::currentVersionId() const
180 {
181     return m_settings->get("JarVersion").toString();
182 }
183 
intendedVersionId() const184 QString LegacyInstance::intendedVersionId() const
185 {
186     return m_settings->get("IntendedJarVersion").toString();
187 }
188 
shouldUpdate() const189 bool LegacyInstance::shouldUpdate() const
190 {
191     QVariant var = settings()->get("ShouldUpdate");
192     if (!var.isValid() || var.toBool() == false)
193     {
194         return intendedVersionId() != currentVersionId();
195     }
196     return true;
197 }
198 
defaultBaseJar() const199 QString LegacyInstance::defaultBaseJar() const
200 {
201     return "versions/" + intendedVersionId() + "/" + intendedVersionId() + ".jar";
202 }
203 
defaultCustomBaseJar() const204 QString LegacyInstance::defaultCustomBaseJar() const
205 {
206     return FS::PathCombine(binRoot(), "mcbackup.jar");
207 }
208 
worldList() const209 std::shared_ptr<WorldList> LegacyInstance::worldList() const
210 {
211     if (!m_world_list)
212     {
213         m_world_list.reset(new WorldList(savesDir()));
214     }
215     return m_world_list;
216 }
217 
typeName() const218 QString LegacyInstance::typeName() const
219 {
220     return tr("Legacy");
221 }
222 
getStatusbarDescription()223 QString LegacyInstance::getStatusbarDescription()
224 {
225     return tr("Instance from previous versions.");
226 }
227 
verboseDescription(AuthSessionPtr session)228 QStringList LegacyInstance::verboseDescription(AuthSessionPtr session)
229 {
230     QStringList out;
231 
232     auto alltraits = traits();
233     if(alltraits.size())
234     {
235         out << "Traits:";
236         for (auto trait : alltraits)
237         {
238             out << "  " + trait;
239         }
240         out << "";
241     }
242 
243     QString windowParams;
244     if (settings()->get("LaunchMaximized").toBool())
245     {
246         out << "Window size: max (if available)";
247     }
248     else
249     {
250         auto width = settings()->get("MinecraftWinWidth").toInt();
251         auto height = settings()->get("MinecraftWinHeight").toInt();
252         out << "Window size: " + QString::number(width) + " x " + QString::number(height);
253     }
254     out << "";
255     return out;
256 }
257