eros: replace server types with enum

This commit is contained in:
Bixilon 2021-07-28 21:45:15 +02:00
parent a329131716
commit c5e0256ba4
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
7 changed files with 124 additions and 90 deletions

View File

@ -58,6 +58,10 @@ data class ItemStack(
return ChatComponent.of("$item {name=${displayName}, count=$count. nbt=$nbt}") return ChatComponent.of("$item {name=${displayName}, count=$count. nbt=$nbt}")
} }
override fun toString(): String {
return toText().legacyText
}
private fun parseNBT(nbt: MutableMap<String, Any>?) { private fun parseNBT(nbt: MutableMap<String, Any>?) {
if (nbt == null) { if (nbt == null) {

View File

@ -17,7 +17,6 @@ import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.gui.eros.controller.EmbeddedJavaFXController import de.bixilon.minosoft.gui.eros.controller.EmbeddedJavaFXController
import de.bixilon.minosoft.gui.eros.main.play.server.Refreshable import de.bixilon.minosoft.gui.eros.main.play.server.Refreshable
import de.bixilon.minosoft.gui.eros.main.play.server.ServerListController import de.bixilon.minosoft.gui.eros.main.play.server.ServerListController
import de.bixilon.minosoft.gui.eros.main.play.server.type.ServerType
import de.bixilon.minosoft.gui.eros.main.play.server.type.ServerTypeCardController import de.bixilon.minosoft.gui.eros.main.play.server.type.ServerTypeCardController
import de.bixilon.minosoft.gui.eros.modding.events.ErosControllerTerminateEvent import de.bixilon.minosoft.gui.eros.modding.events.ErosControllerTerminateEvent
import de.bixilon.minosoft.gui.eros.modding.invoker.JavaFXEventInvoker import de.bixilon.minosoft.gui.eros.modding.invoker.JavaFXEventInvoker
@ -30,80 +29,81 @@ import de.bixilon.minosoft.protocol.protocol.LANServerListener
import de.bixilon.minosoft.util.KUtil.asResourceLocation import de.bixilon.minosoft.util.KUtil.asResourceLocation
import javafx.fxml.FXML import javafx.fxml.FXML
import javafx.scene.control.ListView import javafx.scene.control.ListView
import javafx.scene.layout.AnchorPane import javafx.scene.layout.GridPane
import javafx.scene.layout.Pane import javafx.scene.layout.Pane
import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid import javafx.scene.text.TextFlow
class PlayMainController : EmbeddedJavaFXController<Pane>() { class PlayMainController : EmbeddedJavaFXController<Pane>() {
@FXML @FXML
private lateinit var playTypeContentFX: Pane private lateinit var playTypeContentFX: Pane
@FXML @FXML
private lateinit var playTypeListViewFX: ListView<ServerType> private lateinit var playTypeListViewFX: ListView<ServerTypes>
@FXML @FXML
private lateinit var refreshPaneFX: AnchorPane private lateinit var refreshPaneFX: GridPane
@FXML
private lateinit var refreshHeaderFX: TextFlow
@FXML
private lateinit var refreshText1FX: TextFlow
@FXML
private lateinit var refreshText2FX: TextFlow
private lateinit var currentController: EmbeddedJavaFXController<*> private lateinit var currentController: EmbeddedJavaFXController<*>
override fun init() { override fun init() {
playTypeListViewFX.setCellFactory { ServerTypeCardController.build() } playTypeListViewFX.setCellFactory { ServerTypeCardController.build() }
playTypeListViewFX.items += ServerType(FontAwesomeSolid.SERVER, CUSTOM_SERVER_TYPE, "0 Servers", "") { playTypeListViewFX.items += ServerTypes.VALUES
return@ServerType JavaFXUtil.loadEmbeddedController<ServerListController>(ServerListController.LAYOUT).apply {
servers = Minosoft.config.config.server.entries.values
refreshList()
}
}
playTypeListViewFX.items += ServerType(FontAwesomeSolid.NETWORK_WIRED, LAN_SERVER_TYPE, "12 Servers", "") {
return@ServerType JavaFXUtil.loadEmbeddedController<ServerListController>(ServerListController.LAYOUT).apply {
val events: MutableList<EventInvoker> = mutableListOf()
events += GlobalEventMaster.registerEvent(JavaFXEventInvoker.of<LANServerDiscoverEvent> { refreshList() })
readOnly = true
customRefresh = {
LANServerListener.clear()
refreshList()
}
GlobalEventMaster.registerEvent(JavaFXEventInvoker.of<ErosControllerTerminateEvent>(oneShot = true) {
if (it.controller != this) {
return@of
}
GlobalEventMaster.unregisterEvents(*events.toTypedArray())
LANServerListener.clear()
})
LANServerListener.clear()
servers = LANServerListener.SERVERS.values
refreshList()
}
}
playTypeListViewFX.selectionModel.selectedItemProperty().addListener { _, _, new -> playTypeListViewFX.selectionModel.selectedItemProperty().addListener { _, _, new ->
if (this::currentController.isInitialized) { if (this::currentController.isInitialized) {
currentController.terminate() currentController.terminate()
} }
currentController = new.content(new) currentController = when (new) {
ServerTypes.CUSTOM -> JavaFXUtil.loadEmbeddedController<ServerListController>(ServerListController.LAYOUT).apply {
servers = Minosoft.config.config.server.entries.values
refreshList()
}
ServerTypes.LAN -> JavaFXUtil.loadEmbeddedController<ServerListController>(ServerListController.LAYOUT).apply {
val events: MutableList<EventInvoker> = mutableListOf()
events += GlobalEventMaster.registerEvent(JavaFXEventInvoker.of<LANServerDiscoverEvent> { refreshList() })
readOnly = true
customRefresh = {
LANServerListener.clear()
refreshList()
}
GlobalEventMaster.registerEvent(JavaFXEventInvoker.of<ErosControllerTerminateEvent>(oneShot = true) {
if (it.controller != this) {
return@of
}
GlobalEventMaster.unregisterEvents(*events.toTypedArray())
LANServerListener.clear()
})
LANServerListener.clear()
servers = LANServerListener.SERVERS.values
refreshList()
}
}
playTypeContentFX.children.setAll(currentController.root) playTypeContentFX.children.setAll(currentController.root)
} }
playTypeListViewFX.selectionModel.select(0) playTypeListViewFX.selectionModel.select(0)
ServerTypeCardController.build().apply { refreshHeaderFX.text = REFRESH_HEADER
refreshPaneFX.children.setAll(root) refreshText1FX.text = REFRESH_TEXT1
iconFX.iconLiteral = "fas-sync-alt" refreshText2FX.text = REFRESH_TEXT2
iconFX.isVisible = true refreshPaneFX.setOnMouseClicked {
val currentController = currentController
headerFX.text = REFRESH_HEADER if (currentController is Refreshable) {
text1FX.text = REFRESH_TEXT1 currentController.refresh()
text2FX.text = REFRESH_TEXT2
root.setOnMouseClicked {
val currentController = currentController
if (currentController is Refreshable) {
currentController.refresh()
}
} }
} }
} }

View File

@ -11,15 +11,26 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft. * This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/ */
package de.bixilon.minosoft.gui.eros.main.play.server.type package de.bixilon.minosoft.gui.eros.main.play
import de.bixilon.minosoft.gui.eros.controller.EmbeddedJavaFXController import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.data.registries.registries.registry.Translatable
import de.bixilon.minosoft.util.KUtil
import de.bixilon.minosoft.util.KUtil.asResourceLocation
import de.bixilon.minosoft.util.enum.ValuesEnum
import org.kordamp.ikonli.Ikon
import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid
data class ServerType( enum class ServerTypes(val icon: Ikon) : Translatable {
val icon: FontAwesomeSolid, CUSTOM(FontAwesomeSolid.SERVER),
val header: Any?, LAN(FontAwesomeSolid.NETWORK_WIRED),
val text1: Any?, ;
val text2: Any?,
val content: (ServerType) -> EmbeddedJavaFXController<*>, override val translationKey: ResourceLocation = "minosoft:server_type.${name.lowercase()}".asResourceLocation()
)
companion object : ValuesEnum<ServerTypes> {
override val VALUES: Array<ServerTypes> = values()
override val NAME_MAP: Map<String, ServerTypes> = KUtil.getEnumValues(VALUES)
}
}

View File

@ -13,15 +13,17 @@
package de.bixilon.minosoft.gui.eros.main.play.server.type package de.bixilon.minosoft.gui.eros.main.play.server.type
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.gui.eros.card.AbstractCard import de.bixilon.minosoft.gui.eros.card.AbstractCard
import de.bixilon.minosoft.gui.eros.card.CardFactory import de.bixilon.minosoft.gui.eros.card.CardFactory
import de.bixilon.minosoft.gui.eros.main.play.ServerTypes
import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.text import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.text
import de.bixilon.minosoft.util.KUtil.asResourceLocation import de.bixilon.minosoft.util.KUtil.asResourceLocation
import javafx.fxml.FXML import javafx.fxml.FXML
import javafx.scene.text.TextFlow import javafx.scene.text.TextFlow
import org.kordamp.ikonli.javafx.FontIcon import org.kordamp.ikonli.javafx.FontIcon
class ServerTypeCardController : AbstractCard<ServerType>() { class ServerTypeCardController : AbstractCard<ServerTypes>() {
@FXML @FXML
lateinit var iconFX: FontIcon lateinit var iconFX: FontIcon
@ -29,29 +31,26 @@ class ServerTypeCardController : AbstractCard<ServerType>() {
lateinit var headerFX: TextFlow lateinit var headerFX: TextFlow
@FXML @FXML
lateinit var text1FX: TextFlow lateinit var textFX: TextFlow
@FXML override fun updateItem(item: ServerTypes?, empty: Boolean) {
lateinit var text2FX: TextFlow
override fun updateItem(item: ServerType?, empty: Boolean) {
super.updateItem(item, empty) super.updateItem(item, empty)
item ?: return item ?: return
iconFX.isVisible = true iconFX.isVisible = true
iconFX.iconCode = item.icon iconFX.iconCode = item.icon
headerFX.text = item.header headerFX.text = Minosoft.LANGUAGE_MANAGER.translate(item)
text1FX.text = item.text1
text2FX.text = item.text2 textFX.text = "? servers"
} }
override fun clear() { override fun clear() {
iconFX.isVisible = false iconFX.isVisible = false
headerFX.children.clear() headerFX.children.clear()
text1FX.children.clear() textFX.children.clear()
text2FX.children.clear()
} }
companion object : CardFactory<ServerTypeCardController> { companion object : CardFactory<ServerTypeCardController> {

View File

@ -120,15 +120,13 @@ class PlayInByteBuffer : InByteBuffer {
) )
} }
return if (readBoolean()) { return readOptional {
ItemStack( ItemStack(
item = connection.registries.itemRegistry[readVarInt()], item = connection.registries.itemRegistry[readVarInt()],
connection = connection, connection = connection,
count = readUnsignedByte(), count = readUnsignedByte(),
nbt = readNBT()?.compoundCast() ?: mutableMapOf(), nbt = readNBT()?.compoundCast() ?: mutableMapOf(),
) )
} else {
null
} }
} }

View File

@ -1,8 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?> <?import javafx.geometry.*?>
<?import javafx.scene.control.ListView?> <?import javafx.scene.control.ListView?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<?import org.kordamp.ikonli.javafx.FontIcon?>
<HBox xmlns:fx="http://javafx.com/fxml/1" prefHeight="500.0" prefWidth="900.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" xmlns="http://javafx.com/javafx/16" fx:controller="de.bixilon.minosoft.gui.eros.main.play.PlayMainController"> <HBox xmlns:fx="http://javafx.com/fxml/1" prefHeight="500.0" prefWidth="900.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" xmlns="http://javafx.com/javafx/16" fx:controller="de.bixilon.minosoft.gui.eros.main.play.PlayMainController">
<GridPane HBox.hgrow="ALWAYS"> <GridPane HBox.hgrow="ALWAYS">
<columnConstraints> <columnConstraints>
@ -25,7 +27,40 @@
<Insets right="10.0"/> <Insets right="10.0"/>
</GridPane.margin> </GridPane.margin>
<ListView fx:id="playTypeListViewFX" maxHeight="Infinity" maxWidth="Infinity" GridPane.hgrow="ALWAYS" GridPane.vgrow="ALWAYS"/> <ListView fx:id="playTypeListViewFX" maxHeight="Infinity" maxWidth="Infinity" GridPane.hgrow="ALWAYS" GridPane.vgrow="ALWAYS"/>
<AnchorPane fx:id="refreshPaneFX" GridPane.rowIndex="1"/> <GridPane fx:id="refreshPaneFX" GridPane.rowIndex="1">
<columnConstraints>
<ColumnConstraints hgrow="NEVER"/>
<ColumnConstraints hgrow="ALWAYS"/>
</columnConstraints>
<rowConstraints>
<RowConstraints vgrow="ALWAYS"/>
</rowConstraints>
<GridPane GridPane.columnIndex="1">
<TextFlow fx:id="refreshHeaderFX" style="-fx-font-weight: bold; -fx-font-size: 20;">
<GridPane.margin>
<Insets bottom="5.0" right="5.0" top="5.0"/>
</GridPane.margin>
<Text text="Header"/>
</TextFlow>
<TextFlow fx:id="refreshText1FX" GridPane.rowIndex="1">
<GridPane.margin>
<Insets bottom="5.0" right="5.0"/>
</GridPane.margin>
<Text text="Text 1"/>
</TextFlow>
<TextFlow fx:id="refreshText2FX" GridPane.rowIndex="2">
<GridPane.margin>
<Insets bottom="5.0" right="5.0"/>
</GridPane.margin>
<Text text="Text 2"/>
</TextFlow>
</GridPane>
<FontIcon iconLiteral="fas-sync-alt" iconSize="50">
<GridPane.margin>
<Insets left="5.0" right="15.0"/>
</GridPane.margin>
</FontIcon>
</GridPane>
</GridPane> </GridPane>
</GridPane> </GridPane>
</HBox> </HBox>

View File

@ -2,7 +2,8 @@
<?import javafx.geometry.Insets?> <?import javafx.geometry.Insets?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?> <?import javafx.scene.text.Text?>
<?import javafx.scene.text.TextFlow?>
<?import org.kordamp.ikonli.javafx.FontIcon?> <?import org.kordamp.ikonli.javafx.FontIcon?>
<HBox xmlns:fx="http://javafx.com/fxml/1" fx:id="root" prefHeight="80.0" prefWidth="190.0" xmlns="http://javafx.com/javafx/16" fx:controller="de.bixilon.minosoft.gui.eros.main.play.server.type.ServerTypeCardController"> <HBox xmlns:fx="http://javafx.com/fxml/1" fx:id="root" prefHeight="80.0" prefWidth="190.0" xmlns="http://javafx.com/javafx/16" fx:controller="de.bixilon.minosoft.gui.eros.main.play.server.type.ServerTypeCardController">
<GridPane HBox.hgrow="ALWAYS"> <GridPane HBox.hgrow="ALWAYS">
@ -20,26 +21,12 @@
</GridPane.margin> </GridPane.margin>
<Text text="Header"/> <Text text="Header"/>
</TextFlow> </TextFlow>
<TextFlow fx:id="text1FX" GridPane.rowIndex="1"> <TextFlow fx:id="textFX" GridPane.rowIndex="1">
<GridPane.margin> <GridPane.margin>
<Insets bottom="5.0" right="5.0"/> <Insets bottom="5.0" right="5.0"/>
</GridPane.margin> </GridPane.margin>
<Text text="Text 1"/> <Text text="Text 1"/>
</TextFlow> </TextFlow>
<TextFlow fx:id="text2FX" GridPane.rowIndex="2">
<GridPane.margin>
<Insets bottom="5.0" right="5.0"/>
</GridPane.margin>
<Text text="Text 2"/>
</TextFlow>
<columnConstraints>
<ColumnConstraints/>
</columnConstraints>
<rowConstraints>
<RowConstraints/>
<RowConstraints/>
<RowConstraints/>
</rowConstraints>
</GridPane> </GridPane>
<FontIcon fx:id="iconFX" iconLiteral="fas-exclamation-triangle" iconSize="50"> <FontIcon fx:id="iconFX" iconLiteral="fas-exclamation-triangle" iconSize="50">
<GridPane.margin> <GridPane.margin>