From 6e21670d393bc996f1b437851ccbb9ea00a1c78e Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sat, 24 Jul 2021 18:23:27 +0200 Subject: [PATCH] eros: server list: disable/enable connect button --- src/main/java/de/bixilon/minosoft/Minosoft.kt | 11 +++++- .../bixilon/minosoft/config/server/Server.kt | 8 +--- .../minosoft/data/accounts/AccountType.kt | 1 - .../gui/eros/main/MainErosController.kt | 11 +++++- .../main/play/server/ServerListController.kt | 21 ++++++++-- .../connection/status/StatusConnection.kt | 1 + .../packets/s2c/play/PlayerAbilitiesS2CP.kt | 2 +- .../packets/s2c/play/PlayerEntitySpawnS2CP.kt | 2 +- .../minosoft/util/json/JSONSerializer.kt | 1 + .../minosoft/util/json/VersionSerializer.kt | 39 +++++++++++++++++++ .../minosoft/util/task/worker/StartupTasks.kt | 1 + 11 files changed, 82 insertions(+), 16 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/util/json/VersionSerializer.kt diff --git a/src/main/java/de/bixilon/minosoft/Minosoft.kt b/src/main/java/de/bixilon/minosoft/Minosoft.kt index 319e446e8..c7d791a57 100644 --- a/src/main/java/de/bixilon/minosoft/Minosoft.kt +++ b/src/main/java/de/bixilon/minosoft/Minosoft.kt @@ -71,7 +71,15 @@ object Minosoft { val taskWorker = TaskWorker(criticalErrorHandler = { _, exception -> exception.crash() }) - taskWorker += Task(identifier = StartupTasks.LOAD_CONFIG, priority = ThreadPool.HIGH, executor = { + taskWorker += Task(identifier = StartupTasks.LOAD_VERSIONS, priority = ThreadPool.HIGH, executor = { + Log.log(LogMessageType.OTHER, LogLevels.VERBOSE) { "Loading versions..." } + + Versions.loadAvailableVersions(MINOSOFT_ASSETS_MANAGER.readLegacyJsonAsset(ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "mapping/versions.json"))) + + Log.log(LogMessageType.OTHER, LogLevels.VERBOSE) { "Versions loaded!" } + }) + + taskWorker += Task(identifier = StartupTasks.LOAD_CONFIG, priority = ThreadPool.HIGH, dependencies = arrayOf(StartupTasks.LOAD_VERSIONS), executor = { Log.log(LogMessageType.OTHER, LogLevels.VERBOSE) { "Loading config file..." } config = Configuration() configInitialized = true @@ -87,7 +95,6 @@ object Minosoft { taskWorker += Task(identifier = StartupTasks.LOAD_DEFAULT_REGISTRIES, dependencies = arrayOf(StartupTasks.LOAD_CONFIG), executor = { Log.log(LogMessageType.OTHER, LogLevels.VERBOSE) { "Loading default registries..." } - Versions.loadAvailableVersions(MINOSOFT_ASSETS_MANAGER.readLegacyJsonAsset(ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "mapping/versions.json"))) Resources.load() DefaultRegistries.load() diff --git a/src/main/java/de/bixilon/minosoft/config/server/Server.kt b/src/main/java/de/bixilon/minosoft/config/server/Server.kt index f089066a2..5eb3dc692 100644 --- a/src/main/java/de/bixilon/minosoft/config/server/Server.kt +++ b/src/main/java/de/bixilon/minosoft/config/server/Server.kt @@ -16,6 +16,7 @@ package de.bixilon.minosoft.config.server import com.squareup.moshi.Json import de.bixilon.minosoft.data.assets.AssetsUtil import de.bixilon.minosoft.data.assets.FileAssetsManager +import de.bixilon.minosoft.data.registries.versions.Version import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.gui.eros.main.play.server.card.ServerCard import de.bixilon.minosoft.protocol.network.connection.status.StatusConnection @@ -25,7 +26,7 @@ data class Server( val id: Int = nextServerId++, // ToDo: Is duplicated in config (first key, then in value) var address: String, var name: ChatComponent = ChatComponent.of(address), - @Json(name = "version") var forcedVersion: Int? = null, + @Json(name = "version") var forcedVersion: Version? = null, @Json(name = "favicon") var faviconHash: String? = null, var type: ServerTypes = ServerTypes.NORMAL, ) { @@ -56,11 +57,6 @@ data class Server( if (id > nextServerId) { nextServerId = id + 1 } - forcedVersion?.let { - if (it < 0) { - forcedVersion = null - } - } faviconHash?.let { favicon = AssetsUtil.readAsset(it, true) } } diff --git a/src/main/java/de/bixilon/minosoft/data/accounts/AccountType.kt b/src/main/java/de/bixilon/minosoft/data/accounts/AccountType.kt index d02e200a7..4f70db22e 100644 --- a/src/main/java/de/bixilon/minosoft/data/accounts/AccountType.kt +++ b/src/main/java/de/bixilon/minosoft/data/accounts/AccountType.kt @@ -19,5 +19,4 @@ import kotlin.reflect.KClass abstract class AccountType(`class`: KClass) : CompanionResourceLocation { val TYPE = JSONSerializer.MOSHI.adapter(`class`.java) - } diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/main/MainErosController.kt b/src/main/java/de/bixilon/minosoft/gui/eros/main/MainErosController.kt index 086f7432e..215a81294 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/main/MainErosController.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/main/MainErosController.kt @@ -26,6 +26,7 @@ import de.bixilon.minosoft.util.GitInfo import de.bixilon.minosoft.util.KUtil.asResourceLocation import de.bixilon.minosoft.util.KUtil.decide import de.bixilon.minosoft.util.ShutdownManager +import de.bixilon.minosoft.util.task.pool.DefaultThreadPool import javafx.fxml.FXML import javafx.scene.image.ImageView import javafx.scene.layout.Pane @@ -115,6 +116,14 @@ class MainErosController : JavaFXWindowController() { requestAccountSelect() return } - TODO("Not yet implemented") + + DefaultThreadPool += { + try { + account.verify() + } catch (exception: Throwable) { + // ToDo: Show account window and do account error handling + } + onSuccess(account) + } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/ServerListController.kt b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/ServerListController.kt index 1f0f79347..075a9f4c5 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/ServerListController.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/ServerListController.kt @@ -16,7 +16,6 @@ package de.bixilon.minosoft.gui.eros.main.play.server import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.config.server.Server import de.bixilon.minosoft.data.registries.ResourceLocation -import de.bixilon.minosoft.data.registries.versions.Versions import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.gui.eros.Eros import de.bixilon.minosoft.gui.eros.controller.EmbeddedJavaFXController @@ -25,6 +24,7 @@ import de.bixilon.minosoft.gui.eros.main.play.server.card.ServerCardController import de.bixilon.minosoft.gui.eros.modding.invoker.JavaFXEventInvoker import de.bixilon.minosoft.modding.event.events.status.StatusConnectionUpdateEvent import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection +import de.bixilon.minosoft.protocol.network.connection.status.StatusConnectionStatuses import de.bixilon.minosoft.util.DNSUtil import de.bixilon.minosoft.util.KUtil.asResourceLocation import de.bixilon.minosoft.util.KUtil.decide @@ -64,7 +64,7 @@ class ServerListController : EmbeddedJavaFXController() { refresh() - serverListViewFX.selectionModel.selectedItemProperty().addListener { _, _, new -> + serverListViewFX.selectionModel.selectedItemProperty().addListener { _, old, new -> setServerInfo(new) } } @@ -91,6 +91,7 @@ class ServerListController : EmbeddedJavaFXController() { card.serverListStatusInvoker = JavaFXEventInvoker.of(instantFire = false) { updateServer(server) } card } + val wasSelected = serverListViewFX.selectionModel.selectedItem === card serverListViewFX.items.remove(card) server.ping?.let { @@ -114,6 +115,11 @@ class ServerListController : EmbeddedJavaFXController() { serverListViewFX.items.add(card) serverListViewFX.items.sortBy { it.server.id } // ToDo (Performance): Do not sort, add before/after other server + + + if (wasSelected) { + serverListViewFX.selectionModel.select(card) + } } @@ -123,6 +129,7 @@ class ServerListController : EmbeddedJavaFXController() { return } + val ping = serverCard.server.ping val pane = GridPane() @@ -155,11 +162,17 @@ class ServerListController : EmbeddedJavaFXController() { it.add(Button("Edit"), 2, 0) it.add(Button("Connect").apply { setOnAction { + val pingVersion = ping?.serverVersion ?: return@setOnAction Eros.mainErosController.verifyAccount { account -> - val connection = PlayConnection(serverCard.server.ping?.realAddress ?: DNSUtil.getServerAddress(serverCard.server.address), account, Versions.getVersionById(serverCard.server.forcedVersion!!)) // ToDo: Get ping version + val connection = PlayConnection( + address = serverCard.server.ping?.realAddress ?: DNSUtil.getServerAddress(serverCard.server.address), + account = account, + version = serverCard.server.forcedVersion ?: pingVersion, + ) DefaultThreadPool += { connection.connect() } } } + isDisable = ping?.pingStatus != StatusConnectionStatuses.PING_DONE || (serverCard.server.forcedVersion ?: ping.serverVersion == null) }, 3, 0) @@ -178,7 +191,7 @@ class ServerListController : EmbeddedJavaFXController() { private val SERVER_INFO_PROPERTIES: Map Any?> = mapOf( "minosoft:server.info.server_name".asResourceLocation() to { it.name }, "minosoft:server.info.server_address".asResourceLocation() to { it.address }, - "minosoft:server.info.forced_version".asResourceLocation() to { it.forcedVersion?.let { version -> Versions.getVersionById(version)!! } }, + "minosoft:server.info.forced_version".asResourceLocation() to { it.forcedVersion }, ) } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/status/StatusConnection.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/status/StatusConnection.kt index 06793d66d..7de0b2c71 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/status/StatusConnection.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/status/StatusConnection.kt @@ -59,6 +59,7 @@ class StatusConnection( var serverVersion: Version? = null + override var error: Throwable? = super.error set(value) { field = value diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PlayerAbilitiesS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PlayerAbilitiesS2CP.kt index 5c232bb11..afce98bbb 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PlayerAbilitiesS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PlayerAbilitiesS2CP.kt @@ -46,7 +46,7 @@ class PlayerAbilitiesS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() { } override fun log() { - Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "LocalPlayerEntity abilities: (isInvulnerable=$isInvulnerable, isFlying=$isFlying, canFly=$canFly, canInstantBuild=$canInstantBuild, flyingSpeed=$flyingSpeed, walkingSpeed=$walkingSpeed)" } + Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "Player abilities: (isInvulnerable=$isInvulnerable, isFlying=$isFlying, canFly=$canFly, canInstantBuild=$canInstantBuild, flyingSpeed=$flyingSpeed, walkingSpeed=$walkingSpeed)" } } override fun handle(connection: PlayConnection) { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PlayerEntitySpawnS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PlayerEntitySpawnS2CP.kt index f4858bb2d..1dc85c501 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PlayerEntitySpawnS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PlayerEntitySpawnS2CP.kt @@ -93,6 +93,6 @@ class PlayerEntitySpawnS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() { } override fun log() { - Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "LocalPlayerEntity entity spawn (position=${entity.position}, entityId=$entityId, name=${entity.name}, uuid=$entityUUID)" } + Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "Player entity spawn (position=${entity.position}, entityId=$entityId, name=${entity.name}, uuid=$entityUUID)" } } } diff --git a/src/main/java/de/bixilon/minosoft/util/json/JSONSerializer.kt b/src/main/java/de/bixilon/minosoft/util/json/JSONSerializer.kt index c0041687d..4dd60a534 100644 --- a/src/main/java/de/bixilon/minosoft/util/json/JSONSerializer.kt +++ b/src/main/java/de/bixilon/minosoft/util/json/JSONSerializer.kt @@ -29,6 +29,7 @@ object JSONSerializer { .add(ServerAddressSerializer) .add(ResourceLocationSerializer) .add(UUIDSerializer) + .add(VersionSerializer) .add(KotlinJsonAdapterFactory()) .build()!! diff --git a/src/main/java/de/bixilon/minosoft/util/json/VersionSerializer.kt b/src/main/java/de/bixilon/minosoft/util/json/VersionSerializer.kt new file mode 100644 index 000000000..c1bd61e3a --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/util/json/VersionSerializer.kt @@ -0,0 +1,39 @@ +/* + * Minosoft + * Copyright (C) 2020 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.util.json + +import com.squareup.moshi.* +import de.bixilon.minosoft.data.registries.versions.Version +import de.bixilon.minosoft.data.registries.versions.Versions + +object VersionSerializer : JsonAdapter() { + @FromJson + override fun fromJson(jsonReader: JsonReader): Version? { + return when (jsonReader.peek()) { + JsonReader.Token.NULL -> null + JsonReader.Token.NUMBER -> Versions.getVersionById(jsonReader.nextInt()) + JsonReader.Token.STRING -> Versions.getVersionByName(jsonReader.nextString()) + else -> TODO() + } + } + + @ToJson + override fun toJson(jsonWriter: JsonWriter, version: Version?) { + if (version == null) { + jsonWriter.nullValue() + return + } + jsonWriter.value(version.versionId) + } +} diff --git a/src/main/java/de/bixilon/minosoft/util/task/worker/StartupTasks.kt b/src/main/java/de/bixilon/minosoft/util/task/worker/StartupTasks.kt index 1e09fd7b3..c4f56e7c3 100644 --- a/src/main/java/de/bixilon/minosoft/util/task/worker/StartupTasks.kt +++ b/src/main/java/de/bixilon/minosoft/util/task/worker/StartupTasks.kt @@ -16,6 +16,7 @@ package de.bixilon.minosoft.util.task.worker enum class StartupTasks { LOAD_CONFIG, LOAD_LANGUAGE_FILES, + LOAD_VERSIONS, LOAD_DEFAULT_REGISTRIES, LISTEN_LAN_SERVERS, LOAD_MODS,