Skip to content

Commit f453802

Browse files
authored
Merge pull request #1366 from ZalithLauncher/fix/launch_config
fix(启动): 启动过程中使用Intent传递当前账号
2 parents 8079cf4 + ecbab82 commit f453802

6 files changed

Lines changed: 57 additions & 34 deletions

File tree

ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/account/Account.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
package com.movtery.zalithlauncher.game.account
2020

21+
import android.os.Parcelable
2122
import androidx.room.Entity
2223
import androidx.room.PrimaryKey
2324
import com.movtery.zalithlauncher.game.account.wardrobe.CapeFileDownloader
@@ -30,12 +31,14 @@ import kotlinx.coroutines.Dispatchers
3031
import kotlinx.coroutines.async
3132
import kotlinx.coroutines.joinAll
3233
import kotlinx.coroutines.withContext
34+
import kotlinx.parcelize.Parcelize
3335
import org.apache.commons.io.FileUtils
3436
import java.io.File
3537
import java.util.UUID
3638

3739
private const val TAG = "Account"
3840

41+
@Parcelize
3942
@Entity(tableName = "accounts")
4043
data class Account(
4144
/**
@@ -55,7 +58,7 @@ data class Account(
5558
var otherPassword: String? = null,
5659
var accountType: String? = null,
5760
var skinModelType: SkinModelType = SkinModelType.NONE
58-
) {
61+
): Parcelable {
5962
val hasSkinFile: Boolean
6063
get() = getSkinFile().exists()
6164

ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/account/wardrobe/SkinModelType.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,18 @@
1818

1919
package com.movtery.zalithlauncher.game.account.wardrobe
2020

21+
import android.os.Parcelable
22+
import kotlinx.parcelize.Parcelize
23+
2124
/**
2225
* 皮肤模型枚举
2326
*/
24-
enum class SkinModelType(val string: String, val targetParity: Int, val modelType: String) {
27+
@Parcelize
28+
enum class SkinModelType(
29+
val string: String,
30+
val targetParity: Int,
31+
val modelType: String
32+
): Parcelable {
2533
/** 未设定 */
2634
NONE("none", -1, ""),
2735
/** 粗臂类型 */

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

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package com.movtery.zalithlauncher.game.launch
2020

2121
import android.app.Activity
2222
import android.os.Build
23+
import android.os.Parcelable
2324
import android.widget.Toast
2425
import androidx.compose.ui.unit.IntSize
2526
import com.movtery.zalithlauncher.BuildConfig
@@ -31,7 +32,6 @@ import com.movtery.zalithlauncher.bridge.ZLBridge
3132
import com.movtery.zalithlauncher.context.readAssetFile
3233
import com.movtery.zalithlauncher.game.account.Account
3334
import com.movtery.zalithlauncher.game.account.AccountType
34-
import com.movtery.zalithlauncher.game.account.AccountsManager
3535
import com.movtery.zalithlauncher.game.account.offline.OfflineYggdrasilServer
3636
import com.movtery.zalithlauncher.game.addons.modloader.ModLoader
3737
import com.movtery.zalithlauncher.game.download.game.parseLibraryComponents
@@ -56,6 +56,7 @@ import com.movtery.zalithlauncher.utils.file.ensureDirectorySilently
5656
import com.movtery.zalithlauncher.utils.logging.Logger
5757
import com.movtery.zalithlauncher.utils.string.isBiggerTo
5858
import com.movtery.zalithlauncher.utils.string.isEqualTo
59+
import kotlinx.parcelize.Parcelize
5960
import org.lwjgl.glfw.CallbackBridge
6061
import java.io.File
6162
import javax.microedition.khronos.egl.EGL10
@@ -64,15 +65,31 @@ import javax.microedition.khronos.egl.EGLContext
6465

6566
private const val TAG = "GameLauncher"
6667

68+
@Parcelize
69+
class LaunchConfig(
70+
val version: Version,
71+
val account: Account,
72+
): Parcelable
73+
6774
class GameLauncher(
6875
private val activity: Activity,
69-
private val version: Version,
76+
config: LaunchConfig,
7077
onExit: (code: Int, isSignal: Boolean) -> Unit,
7178
openPath: (folder: File) -> Unit
7279
) : Launcher(onExit, openPath) {
7380
private lateinit var gameManifest: GameManifest
7481
private val offlineServer = OfflineYggdrasilServer(0)
7582

83+
private val version = config.version
84+
private val usingAccount = if (version.offlineAccountLogin) {
85+
//使用临时离线账号启动游戏
86+
config.account.copy(
87+
accountType = AccountType.LOCAL.tag
88+
)
89+
} else {
90+
config.account
91+
}
92+
7693
override fun exit() {
7794
offlineServer.stop()
7895
}
@@ -95,30 +112,19 @@ class GameLauncher(
95112

96113
CallbackBridge.nativeSetUseInputStackQueue(gameManifest.arguments != null)
97114

98-
val currentAccount = AccountsManager.currentAccountFlow.value!!
99-
val account = if (version.offlineAccountLogin) {
100-
//使用临时离线账号启动游戏
101-
currentAccount.copy(
102-
accountType = AccountType.LOCAL.tag
103-
)
104-
} else {
105-
currentAccount
106-
}
107115
val customArgs = version.getJvmArgs().takeIf { it.isNotBlank() } ?: AllSettings.jvmArgs.getValue()
108116
val javaRuntime = getRuntime()
109117

110118
printLauncherInfo(
111119
javaArguments = customArgs.takeIf { it.isNotEmpty() } ?: "NONE",
112120
javaRuntime = javaRuntime,
113-
account = account
114121
)
115122

116123
return launchGame(
117124
screenSize = screenSize,
118-
account = account,
119125
clientJar = clientJar,
120126
javaRuntime = javaRuntime,
121-
customArgs = customArgs
127+
customArgs = customArgs,
122128
)
123129
}
124130

@@ -193,7 +199,6 @@ class GameLauncher(
193199

194200
private suspend fun launchGame(
195201
screenSize: IntSize,
196-
account: Account,
197202
clientJar: File,
198203
javaRuntime: String,
199204
customArgs: String
@@ -210,7 +215,7 @@ class GameLauncher(
210215

211216
val launchArgs = LaunchArgs(
212217
runtimeLibraryPath = runtimeLibraryPath,
213-
account = account,
218+
account = usingAccount,
214219
offlineServer = offlineServer,
215220
gameDirPath = gameDirPath,
216221
version = version,
@@ -247,7 +252,6 @@ class GameLauncher(
247252
private fun printLauncherInfo(
248253
javaArguments: String,
249254
javaRuntime: String,
250-
account: Account
251255
) {
252256
var mcInfo = version.getVersionName()
253257
version.getVersionInfo()?.let { info -> mcInfo = info.getInfoString() }
@@ -267,7 +271,7 @@ class GameLauncher(
267271
append("▷ Game Path: ${version.getGameDir().absolutePath} (Isolation: ${version.isIsolation()})")
268272
append("▷ Custom Java arguments: $javaArguments")
269273
append("▷ Java Runtime: $javaRuntime")
270-
append("▷ Account: ${account.username} (${account.accountType})")
274+
append("▷ Account: ${usingAccount.username} (${usingAccount.accountType})")
271275
}
272276

273277
/**

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ object LaunchGame {
7777
val downloadTask = createDownloadTask(
7878
context = context,
7979
version = version,
80+
account = account,
8081
exitActivity = exitActivity,
8182
waitForVulkanChecker = waitForVulkanChecker,
8283
submitError = submitError
@@ -108,6 +109,7 @@ object LaunchGame {
108109
private fun createDownloadTask(
109110
context: Context,
110111
version: Version,
112+
account: Account,
111113
exitActivity: () -> Unit,
112114
waitForVulkanChecker: suspend () -> Unit,
113115
submitError: (ErrorViewModel.ThrowableMessage) -> Unit
@@ -124,7 +126,7 @@ object LaunchGame {
124126
task.updateMessage(R.string.game_vulkan_check_title)
125127
checkVulkanCapabilities(version, waitForVulkanChecker)
126128

127-
runGame(context, version)
129+
runGame(context, version, account)
128130
exitActivity()
129131
},
130132
onError = { message ->

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,15 @@ import androidx.compose.runtime.setValue
2828
import androidx.compose.ui.unit.IntRect
2929
import androidx.compose.ui.unit.IntSize
3030
import com.movtery.zalithlauncher.bridge.ZLBridge
31-
import com.movtery.zalithlauncher.game.account.AccountsManager
3231
import com.movtery.zalithlauncher.game.control.ControlManager
3332
import com.movtery.zalithlauncher.game.input.EfficientAndroidLWJGLKeycode
3433
import com.movtery.zalithlauncher.game.input.LWJGLCharSender
3534
import com.movtery.zalithlauncher.game.keycodes.LwjglGlfwKeycode
3635
import com.movtery.zalithlauncher.game.launch.GameLauncher
36+
import com.movtery.zalithlauncher.game.launch.LaunchConfig
3737
import com.movtery.zalithlauncher.game.launch.MCOptions
3838
import com.movtery.zalithlauncher.game.launch.loadLanguage
3939
import com.movtery.zalithlauncher.game.version.installed.GraphicsApi
40-
import com.movtery.zalithlauncher.game.version.installed.Version
4140
import com.movtery.zalithlauncher.game.version.installed.utils.isLowerVer
4241
import com.movtery.zalithlauncher.setting.AllSettings
4342
import com.movtery.zalithlauncher.terracotta.Terracotta
@@ -56,7 +55,7 @@ import org.lwjgl.glfw.CallbackBridge
5655

5756
class GameHandler(
5857
val activity: Activity,
59-
private val version: Version,
58+
config: LaunchConfig,
6059
errorViewModel: ErrorViewModel,
6160
eventViewModel: EventViewModel,
6261
private val gamepadViewModel: GamepadViewModel,
@@ -69,6 +68,9 @@ class GameHandler(
6968
launcher = gameLauncher,
7069
onExit = onExit
7170
) {
71+
private val version = config.version
72+
private val account = config.account
73+
7274
private val _inputArea = MutableStateFlow<IntRect?>(null)
7375
override val inputArea = _inputArea.asStateFlow()
7476

@@ -216,9 +218,7 @@ class GameHandler(
216218
textInputMode = textInputMode,
217219
isTouchProxyEnabled = version.enableTouchProxy,
218220
onInputAreaRectUpdated = { _inputArea.value = it },
219-
getAccountName = {
220-
AccountsManager.currentAccountFlow.value?.username //不太可能为空,启动前拦截了这个情况
221-
},
221+
getAccountName = { account.username },
222222
eventViewModel = eventViewModel,
223223
gamepadViewModel = gamepadViewModel,
224224
submitError = {

ZalithLauncher/src/main/java/com/movtery/zalithlauncher/ui/activities/VMActivity.kt

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ import com.movtery.zalithlauncher.bridge.LoggerBridge
6565
import com.movtery.zalithlauncher.bridge.ZLBridge
6666
import com.movtery.zalithlauncher.bridge.ZLBridgeStates
6767
import com.movtery.zalithlauncher.coroutine.DataBridge
68+
import com.movtery.zalithlauncher.game.account.Account
6869
import com.movtery.zalithlauncher.game.input.AWTCharSender
6970
import com.movtery.zalithlauncher.game.input.CharacterSenderStrategy
7071
import com.movtery.zalithlauncher.game.input.LWJGLCharSender
@@ -73,6 +74,7 @@ import com.movtery.zalithlauncher.game.launch.GameLauncher
7374
import com.movtery.zalithlauncher.game.launch.GameService
7475
import com.movtery.zalithlauncher.game.launch.JvmLaunchInfo
7576
import com.movtery.zalithlauncher.game.launch.JvmLauncher
77+
import com.movtery.zalithlauncher.game.launch.LaunchConfig
7678
import com.movtery.zalithlauncher.game.launch.Launcher
7779
import com.movtery.zalithlauncher.game.launch.handler.AbstractHandler
7880
import com.movtery.zalithlauncher.game.launch.handler.GameHandler
@@ -111,7 +113,7 @@ import android.graphics.Color as NativeColor
111113

112114
private const val INTENT_RUN_GAME = "BUNDLE_RUN_GAME"
113115
private const val INTENT_RUN_JAR = "INTENT_RUN_JAR"
114-
private const val INTENT_VERSION = "INTENT_VERSION"
116+
private const val INTENT_GAME_CONFIG = "INTENT_GAME_CONFIG"
115117
private const val INTENT_JAR_INFO = "INTENT_JAR_INFO"
116118

117119
data class LaunchSession(
@@ -171,12 +173,12 @@ class VMViewModel : ViewModel() {
171173

172174
_session = when {
173175
bundle.getBoolean(INTENT_RUN_GAME) -> {
174-
val version: Version = bundle.getParcelableSafely(INTENT_VERSION, Version::class.java)
175-
?: throw IllegalStateException("No launch version has been set.")
176+
val config: LaunchConfig = bundle.getParcelableSafely(INTENT_GAME_CONFIG, LaunchConfig::class.java)
177+
?: throw IllegalStateException("No launch config has been set.")
176178

177179
val launcher = GameLauncher(
178180
activity = activity,
179-
version = version,
181+
config = config,
180182
onExit = { code, isSignal ->
181183
if (code == 0) {
182184
val finishedCount = AllSettings.finishedGame.getValue()
@@ -199,7 +201,7 @@ class VMViewModel : ViewModel() {
199201
launcher = launcher,
200202
handler = GameHandler(
201203
activity = activity,
202-
version = version,
204+
config = config,
203205
errorViewModel = errorViewModel,
204206
eventViewModel = eventViewModel,
205207
gamepadViewModel = gamepadViewModel,
@@ -737,10 +739,14 @@ class VMActivity : BaseAppCompatActivity(), SurfaceTextureListener, SurfaceHolde
737739
* 让VMActivity进入运行游戏模式
738740
* @param version 指定版本
739741
*/
740-
fun runGame(context: Context, version: Version) {
742+
fun runGame(
743+
context: Context,
744+
version: Version,
745+
account: Account,
746+
) {
741747
val intent = Intent(context, VMActivity::class.java).apply {
742748
putExtra(INTENT_RUN_GAME, true)
743-
putExtra(INTENT_VERSION, version)
749+
putExtra(INTENT_GAME_CONFIG, LaunchConfig(version, account))
744750
}
745751
context.startActivity(intent)
746752
}

0 commit comments

Comments
 (0)