From b6909dd928c94c0a26a64056a484c0e84dd42055 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Mon, 26 Apr 2021 14:40:59 +0200 Subject: [PATCH] text: correctly split translated components with oder dependent placeholders --- .../locale/minecraft/MinecraftLanguage.kt | 41 +++++++++++++++++-- .../minosoft/data/text/TextComponent.kt | 4 +- .../minosoft/gui/input/camera/Camera.kt | 2 +- .../packets/s2c/play/ChatMessageS2CP.kt | 4 +- .../de/bixilon/minosoft/util/logging/Log.kt | 8 +++- 5 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/data/locale/minecraft/MinecraftLanguage.kt b/src/main/java/de/bixilon/minosoft/data/locale/minecraft/MinecraftLanguage.kt index a81a3edd9..79cfe1496 100644 --- a/src/main/java/de/bixilon/minosoft/data/locale/minecraft/MinecraftLanguage.kt +++ b/src/main/java/de/bixilon/minosoft/data/locale/minecraft/MinecraftLanguage.kt @@ -46,14 +46,41 @@ open class MinecraftLanguage : Translator { override fun translate(key: String?, parent: TextComponent?, vararg data: Any?): ChatComponent { val placeholder = this.data[key] ?: return ChatComponent.valueOf(null, parent, key.toString() + "->" + data.toString()) - val split = placeholder.split("%s") // ToDo: Split correctly - val ret = BaseComponent() - for ((index, part) in split.withIndex()) { + val arguments: MutableList = mutableListOf() + var splitPlaceholder: List = listOf() + FORMATTER_ORDER_REGEX.find(placeholder)?.let { + if (it.groupValues.isEmpty()) { + // this is not the correct formatter + return@let + } + splitPlaceholder = placeholder.split(FORMATTER_ORDER_REGEX) + for ((index, part) in it.groupValues.withIndex()) { + if (index % 2 == 0) { + continue + } + val dataIndex = part.toInt() - 1 + if (dataIndex < 0 || dataIndex > data.size) { + arguments += null + continue + } + arguments += data[dataIndex] + } + } + + + placeholder.split(FORMATTER_SPLIT_REGEX).let { + if (splitPlaceholder.isEmpty()) { + splitPlaceholder = it + } + arguments.addAll(data.toList()) + } + + for ((index, part) in splitPlaceholder.withIndex()) { ret.parts.add(ChatComponent.valueOf(this, parent, part)) if (index < data.size) { - ret.parts.add(ChatComponent.valueOf(this, parent, data[index])) + ret.parts.add(ChatComponent.valueOf(this, parent, arguments[index])) } } @@ -63,4 +90,10 @@ open class MinecraftLanguage : Translator { override fun toString(): String { return language } + + companion object { + private val FORMATTER_ORDER_REGEX = "%(\\w+)\\\$[sd]".toRegex() // %1$s fell from a high place + private val FORMATTER_SPLIT_REGEX = "%[ds]".toRegex() // %s fell from a high place + + } } diff --git a/src/main/java/de/bixilon/minosoft/data/text/TextComponent.kt b/src/main/java/de/bixilon/minosoft/data/text/TextComponent.kt index 46f23c10f..4d6777ba7 100644 --- a/src/main/java/de/bixilon/minosoft/data/text/TextComponent.kt +++ b/src/main/java/de/bixilon/minosoft/data/text/TextComponent.kt @@ -115,7 +115,7 @@ open class TextComponent( override fun getJavaFXText(nodes: ObservableList): ObservableList { val text = Text(this.message) - val color = this.color ?: ChatColors.WHITE + val color = this.color ?: ProtocolDefinition.DEFAULT_COLOR text.fill = Color.WHITE if (Minosoft.getConfig().config.chat.colored) { text.fill = Color.rgb(color.red, color.green, color.blue) @@ -164,7 +164,7 @@ open class TextComponent( override fun prepareRender(startPosition: Vec2i, offset: Vec2i, renderWindow: RenderWindow, textElement: LabelNode, z: Int, setProperties: TextSetProperties, getProperties: TextGetProperties) { - val color = this.color ?: ChatColors.WHITE + val color = this.color ?: ProtocolDefinition.DEFAULT_COLOR // bring chars in right order and reverse them if right bound diff --git a/src/main/java/de/bixilon/minosoft/gui/input/camera/Camera.kt b/src/main/java/de/bixilon/minosoft/gui/input/camera/Camera.kt index 933c9b82c..90e3c3245 100644 --- a/src/main/java/de/bixilon/minosoft/gui/input/camera/Camera.kt +++ b/src/main/java/de/bixilon/minosoft/gui/input/camera/Camera.kt @@ -49,7 +49,7 @@ class Camera( ) : ScreenResizeCallback { private var mouseSensitivity = Minosoft.getConfig().config.game.camera.moseSensitivity private val walkingSpeed get() = connection.player.baseAbilities.walkingSpeed * ProtocolDefinition.TICKS_PER_SECOND - private val flyingSpeed get() = connection.player.baseAbilities.flyingSpeed * ProtocolDefinition.TICKS_PER_SECOND + private val flyingSpeed get() = connection.player.baseAbilities.flyingSpeed * ProtocolDefinition.TICKS_PER_SECOND var cameraPosition = Vec3(0.0f, 0.0f, 0.0f) private var lastMouseX = 0.0 private var lastMouseY = 0.0 diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ChatMessageS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ChatMessageS2CP.kt index 4b281715a..fde4e9c89 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ChatMessageS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ChatMessageS2CP.kt @@ -13,12 +13,12 @@ package de.bixilon.minosoft.protocol.packets.s2c.play import de.bixilon.minosoft.data.ChatTextPositions -import de.bixilon.minosoft.data.text.ChatColors import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.modding.event.events.ChatMessageReceivingEvent import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer +import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.protocol.protocol.ProtocolVersions import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.LogLevels @@ -39,7 +39,7 @@ class ChatMessageS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() { sender = buffer.readUUID() } } - message.applyDefaultColor(ChatColors.WHITE) + message.applyDefaultColor(ProtocolDefinition.DEFAULT_COLOR) } override fun handle(connection: PlayConnection) { diff --git a/src/main/java/de/bixilon/minosoft/util/logging/Log.kt b/src/main/java/de/bixilon/minosoft/util/logging/Log.kt index 3459ced7b..7f15fbf41 100644 --- a/src/main/java/de/bixilon/minosoft/util/logging/Log.kt +++ b/src/main/java/de/bixilon/minosoft/util/logging/Log.kt @@ -102,7 +102,13 @@ object Log { message.printStackTrace(PrintWriter(stringWriter)) ChatComponent.valueOf(raw = stringWriter.toString()) } - is String -> ChatComponent.valueOf(raw = message.format(*formatting)) + is String -> { + if (formatting.isNotEmpty()) { + ChatComponent.valueOf(raw = message.format(*formatting)) + } else { + ChatComponent.valueOf(raw = message) + } + } else -> ChatComponent.valueOf(raw = message) }