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