Skip to content

Commit 8c4f2c6

Browse files
committed
refactor: 使用语义更明确的Builder重构游戏清单获取
1 parent 377e59d commit 8c4f2c6

5 files changed

Lines changed: 107 additions & 38 deletions

File tree

ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/launch/GameLauncher.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ import com.movtery.zalithlauncher.game.plugin.renderer.RendererPluginManager
4343
import com.movtery.zalithlauncher.game.renderer.Renderers
4444
import com.movtery.zalithlauncher.game.support.touch_controller.ControllerProxy
4545
import com.movtery.zalithlauncher.game.version.installed.Version
46+
import com.movtery.zalithlauncher.game.version.installed.VersionInfoParser
4647
import com.movtery.zalithlauncher.game.version.installed.VersionsManager
47-
import com.movtery.zalithlauncher.game.version.installed.getGameManifest
4848
import com.movtery.zalithlauncher.game.versioninfo.models.GameManifest
4949
import com.movtery.zalithlauncher.path.LibPath
5050
import com.movtery.zalithlauncher.path.PathManager
@@ -88,7 +88,11 @@ class GameLauncher(
8888
VersionsManager.getVersion(inheritsFrom)?.getClientJar()
8989
} ?: version.getClientJar()
9090

91-
gameManifest = getGameManifest(version, gameManifest = manifest)
91+
gameManifest = VersionInfoParser(version)
92+
.setManifest(manifest)
93+
.setInheriting()
94+
.build()
95+
9296
CallbackBridge.nativeSetUseInputStackQueue(gameManifest.arguments != null)
9397

9498
val currentAccount = AccountsManager.currentAccountFlow.value!!

ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/launch/LaunchArgs.kt

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import com.movtery.zalithlauncher.game.version.download.filterLibrary
3535
import com.movtery.zalithlauncher.game.version.download.getLibraryReplacement
3636
import com.movtery.zalithlauncher.game.version.installed.Version
3737
import com.movtery.zalithlauncher.game.version.installed.VersionInfo
38-
import com.movtery.zalithlauncher.game.version.installed.getGameManifest
38+
import com.movtery.zalithlauncher.game.version.installed.VersionInfoParser
3939
import com.movtery.zalithlauncher.game.versioninfo.models.GameManifest
4040
import com.movtery.zalithlauncher.path.LibPath
4141
import com.movtery.zalithlauncher.path.PathManager
@@ -215,7 +215,7 @@ class LaunchArgs(
215215
}
216216

217217
private fun getMinecraftJVMArgs(): Array<String> {
218-
val gameManifest1 = getGameManifest(version, skipInheriting = true)
218+
val gameManifest1 = VersionInfoParser(version).build()
219219

220220
// // Parse Forge 1.17+ additional JVM Arguments
221221
// if (versionInfo.inheritsFrom == null || versionInfo.arguments == null || versionInfo.arguments.jvm == null) {
@@ -299,18 +299,8 @@ class LaunchArgs(
299299
val libs = LinkedHashMap<GameManifest.Library, String>()
300300

301301
for (libItem in gameManifest.libraries) {
302-
if (!GameManifest.Rule.checkRules(libItem.rules)) {
303-
Logger.debug(TAG, "Library ignored due to unmatched rules: ${libItem.name}")
304-
continue
305-
}
306-
if (libItem.isNative) {
307-
Logger.debug(TAG, "Library ignored because it is a native library: ${libItem.name}")
308-
continue
309-
}
310-
val path = libItem.progressLibrary() ?: run {
311-
Logger.debug(TAG, "Library ignored due to library filtering: ${libItem.name}")
312-
continue
313-
}
302+
if (!(GameManifest.Rule.checkRules(libItem.rules) && !libItem.isNative)) continue
303+
val path = libItem.progressLibrary() ?: continue
314304
with(libSortFix) {
315305
libs.insertLib(libItem, getLibrariesHome() + "/" + path)
316306
}

ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/version/installed/VersionInfoParser.kt

Lines changed: 87 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,69 @@ import java.io.File
2828

2929
private const val TAG = "VersionInfoParser"
3030

31+
class VersionInfoParser(private val version: Version) {
32+
private var gameManifest: GameManifest? = null
33+
private var inherit: Boolean? = null
34+
private var skipIfNotExists: Boolean = false
35+
36+
/**
37+
* 设置预先加载的 [GameManifest]
38+
*/
39+
fun setManifest(manifest: GameManifest): VersionInfoParser {
40+
this.gameManifest = manifest
41+
return this
42+
}
43+
44+
/**
45+
* 启用版本继承
46+
* @param skipIfNotExists 若 [GameManifest.inheritsFrom] 对应的 JSON 文件不存在,则静默跳过继承
47+
*/
48+
fun setInheriting(skipIfNotExists: Boolean = false): VersionInfoParser {
49+
this.inherit = true
50+
this.skipIfNotExists = skipIfNotExists
51+
return this
52+
}
53+
54+
/**
55+
* 构建并返回最终合并后的 [GameManifest]
56+
*/
57+
fun build(): GameManifest {
58+
val manifest = gameManifest ?: GSON.fromJson(
59+
File(version.getVersionPath(), "${version.getVersionName()}.json").readText(),
60+
GameManifest::class.java
61+
)
62+
63+
val inheritsManifest = if (inherit == true && manifest.inheritsFrom != null) {
64+
val inherits = manifest.inheritsFrom
65+
File(version.getVersionsFolder()).child(inherits).child("${inherits}.json")
66+
.let { inheritsFile ->
67+
if (skipIfNotExists && !inheritsFile.exists()) null
68+
else {
69+
GSON.fromJson(inheritsFile.readText(), GameManifest::class.java)
70+
}
71+
}
72+
} else null
73+
74+
return getGameManifest(
75+
gameManifest = manifest,
76+
inheritsManifest = inheritsManifest
77+
)
78+
}
79+
}
80+
3181
/**
3282
* [Modified from PojavLauncher](https://github.com/PojavLauncherTeam/PojavLauncher/blob/a6f3fc0/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java#L885-L979)
3383
*/
34-
fun getGameManifest(
35-
version: Version,
36-
gameManifest: GameManifest = GSON.fromJson(File(version.getVersionPath(), "${version.getVersionName()}.json").readText(), GameManifest::class.java),
37-
skipInheriting: Boolean = false
84+
private fun getGameManifest(
85+
gameManifest: GameManifest,
86+
inheritsManifest: GameManifest?,
3887
): GameManifest {
3988
var gameManifest0 = gameManifest
40-
if (!skipInheriting && gameManifest0.inheritsFrom != null) {
41-
val inheritsManifest = run {
42-
val inherits = gameManifest0.inheritsFrom
43-
GSON.fromJson(File(version.getVersionsFolder()).child(inherits).child("${inherits}.json").readText(), GameManifest::class.java)
44-
}
45-
inheritFields(inheritsManifest, gameManifest0)
89+
if (inheritsManifest != null && gameManifest0.inheritsFrom != null) {
90+
mergeManifest(
91+
from = gameManifest0,
92+
target = inheritsManifest,
93+
)
4694

4795
// Go through the libraries, remove the ones overridden by the custom version
4896
val inheritLibraryList: MutableList<Library> = ArrayList(inheritsManifest.libraries)
@@ -124,14 +172,33 @@ fun getGameManifest(
124172
return gameManifest0
125173
}
126174

127-
private fun String?.isValid(): Boolean = !this.isNullOrEmpty()
128-
private fun inheritFields(target: GameManifest, from: GameManifest) {
129-
from.assetIndex?.let { target.assetIndex = it }
130-
if (from.assets.isValid()) target.assets = from.assets
131-
if (from.id.isValid()) target.id = from.id
132-
if (from.mainClass.isValid()) target.mainClass = from.mainClass
133-
if (from.minecraftArguments.isValid()) target.minecraftArguments = from.minecraftArguments
134-
if (from.releaseTime.isValid()) target.releaseTime = from.releaseTime
135-
if (from.time.isValid()) target.time = from.time
136-
if (from.type.isValid()) target.type = from.type
175+
private inline fun <T> mergeField(
176+
getter: () -> T?,
177+
setter: (T) -> Unit
178+
) {
179+
when (val value = getter()) {
180+
null -> return
181+
182+
is String -> {
183+
if (value.isNotEmpty()) {
184+
setter(value)
185+
}
186+
}
187+
188+
else -> setter(value)
189+
}
190+
}
191+
192+
private fun mergeManifest(
193+
from: GameManifest,
194+
target: GameManifest,
195+
) {
196+
mergeField(from::getRawAssetIndex, target::setAssetIndex)
197+
mergeField(from::getAssets, target::setAssets)
198+
mergeField(from::getId, target::setId)
199+
mergeField(from::getMainClass, target::setMainClass)
200+
mergeField(from::getMinecraftArguments, target::setMinecraftArguments)
201+
mergeField(from::getReleaseTime, target::setReleaseTime)
202+
mergeField(from::getTime, target::setTime)
203+
mergeField(from::getType, target::setType)
137204
}

ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/version/installed/cleanup/GameAssetCleaner.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ import com.movtery.zalithlauncher.coroutine.addTask
2727
import com.movtery.zalithlauncher.coroutine.buildPhase
2828
import com.movtery.zalithlauncher.game.path.getAssetsHome
2929
import com.movtery.zalithlauncher.game.version.download.BaseMinecraftDownloader
30+
import com.movtery.zalithlauncher.game.version.installed.VersionInfoParser
3031
import com.movtery.zalithlauncher.game.version.installed.VersionsManager
31-
import com.movtery.zalithlauncher.game.version.installed.getGameManifest
3232
import com.movtery.zalithlauncher.utils.file.collectFiles
3333
import com.movtery.zalithlauncher.utils.file.findRedundantFiles
3434
import com.movtery.zalithlauncher.utils.file.formatFileSize
@@ -151,7 +151,11 @@ class GameAssetCleaner(
151151

152152
task.updateMessage(R.string.versions_manage_cleanup_progress_next_version, version.getVersionName())
153153

154-
val gameManifest = getGameManifest(version) //已启动游戏时所需的依赖为准
154+
//已启动游戏时所需的依赖为准
155+
val gameManifest = VersionInfoParser(version)
156+
.setInheriting(skipIfNotExists = true)
157+
.build()
158+
155159
val index = downloader.createAssetIndex(downloader.assetIndexTarget, gameManifest)
156160

157161
fun addGameFile(file: File) {

ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/versioninfo/models/GameManifest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ public AssetIndex getAssetIndex() {
112112
}
113113
}
114114

115+
public AssetIndex getRawAssetIndex() {
116+
return assetIndex;
117+
}
118+
115119
public void setAssetIndex(AssetIndex assetIndex) {
116120
this.assetIndex = assetIndex;
117121
}

0 commit comments

Comments
 (0)