diff --git a/src/main/java/dev/cxntered/textreplacer/mixin/FontRendererMixin.java b/src/main/java/dev/cxntered/textreplacer/mixin/FontRendererMixin.java index 54f8f19..3104b35 100644 --- a/src/main/java/dev/cxntered/textreplacer/mixin/FontRendererMixin.java +++ b/src/main/java/dev/cxntered/textreplacer/mixin/FontRendererMixin.java @@ -13,13 +13,13 @@ public abstract class FontRendererMixin { private String textreplacer$spoofRenderString(String string) { if (string == null) return null; if (!TextReplacerConfig.INSTANCE.enabled) return string; - return TextReplacer.INSTANCE.getString(string); + return TextReplacer.getString(string); } @ModifyVariable(method = "getStringWidth", at = @At("HEAD"), argsOnly = true) private String textreplacer$spoofGetStringWidth(String string) { if (string == null) return null; if (!TextReplacerConfig.INSTANCE.enabled) return string; - return TextReplacer.INSTANCE.getString(string); + return TextReplacer.getString(string); } } diff --git a/src/main/kotlin/dev/cxntered/textreplacer/TextReplacer.kt b/src/main/kotlin/dev/cxntered/textreplacer/TextReplacer.kt index 33bbf74..3a32ca0 100644 --- a/src/main/kotlin/dev/cxntered/textreplacer/TextReplacer.kt +++ b/src/main/kotlin/dev/cxntered/textreplacer/TextReplacer.kt @@ -1,9 +1,10 @@ package dev.cxntered.textreplacer -import cc.polyfrost.oneconfig.libs.universal.UMinecraft import cc.polyfrost.oneconfig.renderer.asset.SVG import cc.polyfrost.oneconfig.utils.commands.CommandManager -import dev.cxntered.textreplacer.command.TextReplacerCommand +import cc.polyfrost.oneconfig.utils.commands.annotations.Command +import cc.polyfrost.oneconfig.utils.commands.annotations.Main +import cc.polyfrost.oneconfig.utils.dsl.mc import dev.cxntered.textreplacer.config.TextReplacerConfig import dev.cxntered.textreplacer.elements.ReplacerListOption import net.minecraftforge.fml.common.Mod @@ -24,56 +25,73 @@ object TextReplacer { val PLUS_ICON = SVG("/assets/textreplacer/icons/plus.svg") val MINUS_ICON = SVG("/assets/textreplacer/icons/minus.svg") + private var cachedUsername: String? = null + private var cachedServerIp: String? = null + private var cachedServerDomain: String? = null + @Mod.EventHandler fun onInit(event: FMLInitializationEvent) { TextReplacerConfig.initialize() CommandManager.INSTANCE.registerCommand(TextReplacerCommand()) } + @JvmStatic fun getString(input: String): String { - var string = input - - for (wrapper in ReplacerListOption.wrappedReplacers) { - with (wrapper.replacer) { - if (!enabled) return@with - if (text.isEmpty() || replacementText.isEmpty()) return@with + var shouldExpand = false - text = replaceVariables(text) - replacementText = replaceVariables(replacementText) + val currentUsername = mc.session.profile.name + if (currentUsername != cachedUsername) { + cachedUsername = currentUsername + shouldExpand = true + } - if (string.contains(text)) { - string = string.replace(text, replacementText) - } + val currentServerIp = mc.currentServerData?.serverIP + if (currentServerIp != cachedServerIp) { + cachedServerIp = currentServerIp + cachedServerDomain = currentServerIp?.let { ip -> + val baseAddress = ip.split(":").first() + baseAddress.takeIf { + !InetAddressUtils.isIPv4Address(it) && !InetAddressUtils.isIPv6Address(it) + }?.split(".")?.dropLast(1)?.last() } + shouldExpand = true } - return string - } - - private fun replaceVariables(input: String): String { - var string = input - val mc = UMinecraft.getMinecraft() - - string = string.replace("¶username", mc.session.profile.name) - - if (!mc.isSingleplayer && mc.currentServerData != null) { - var serverIp: String = mc.currentServerData.serverIP - if (serverIp.contains(":")) - serverIp = serverIp.split(":")[0] + return ReplacerListOption.wrappedReplacers.fold(input) { string, wrapper -> + with(wrapper.replacer) { + if (!enabled || text.isEmpty() || replacementText.isEmpty()) return@with string - string = string.replace("¶serverIp", serverIp) + if (shouldExpand || expandedText.isEmpty()) + expandedText = expandText(text) + if (shouldExpand || expandedReplacementText.isEmpty()) + expandedReplacementText = expandText(replacementText) - if (!InetAddressUtils.isIPv4Address(serverIp) && !InetAddressUtils.isIPv6Address(serverIp)) { - val parts = serverIp.split(".") - val serverDomain = parts[parts.size - 2] - - string = string.replace("¶serverDomain", serverDomain) + string.replace(expandedText, expandedReplacementText) } + } + } + + fun expandText(input: String): String { + if (input.isEmpty() || !input.contains('¶')) return input + val variables = mapOf( + "¶username" to cachedUsername, + "¶serverIp" to cachedServerIp?.split(":")?.firstOrNull(), + "¶serverDomain" to cachedServerDomain, // hypixel, for some reason, puts 🎂 in their scoreboard IP - string = string.replace("¶hypixelScoreboardIp", "www.hypixel.ne\uD83C\uDF82§et") + "¶hypixelScoreboardIp" to "www.hypixel.ne\uD83C\uDF82§et" + ) + + return variables.entries.fold(input) { text, (variable, value) -> + if (value != null) text.replace(variable, value.toString()) else text } + } - return string + @Command(value = MODID, description = "Access the $NAME GUI.") + class TextReplacerCommand { + @Main + fun handle() { + TextReplacerConfig.openGui() + } } } \ No newline at end of file diff --git a/src/main/kotlin/dev/cxntered/textreplacer/command/TextReplacerCommand.kt b/src/main/kotlin/dev/cxntered/textreplacer/command/TextReplacerCommand.kt deleted file mode 100644 index 4ab50bc..0000000 --- a/src/main/kotlin/dev/cxntered/textreplacer/command/TextReplacerCommand.kt +++ /dev/null @@ -1,14 +0,0 @@ -package dev.cxntered.textreplacer.command - -import cc.polyfrost.oneconfig.utils.commands.annotations.Command -import cc.polyfrost.oneconfig.utils.commands.annotations.Main -import dev.cxntered.textreplacer.TextReplacer -import dev.cxntered.textreplacer.config.TextReplacerConfig - -@Command(value = TextReplacer.MODID, aliases = ["tr"], description = "Access the ${TextReplacer.NAME} GUI.") -class TextReplacerCommand { - @Main - fun main() { - TextReplacerConfig.openGui() - } -} \ No newline at end of file diff --git a/src/main/kotlin/dev/cxntered/textreplacer/config/Replacer.kt b/src/main/kotlin/dev/cxntered/textreplacer/config/Replacer.kt index f86d145..98d1c2c 100644 --- a/src/main/kotlin/dev/cxntered/textreplacer/config/Replacer.kt +++ b/src/main/kotlin/dev/cxntered/textreplacer/config/Replacer.kt @@ -4,4 +4,6 @@ data class Replacer( var enabled: Boolean = true, var text: String = "", var replacementText: String = "", + @Transient var expandedText: String = "", + @Transient var expandedReplacementText: String = "", ) diff --git a/src/main/kotlin/dev/cxntered/textreplacer/elements/ReplacerTextField.kt b/src/main/kotlin/dev/cxntered/textreplacer/elements/ReplacerTextField.kt index ff4f5a2..639165d 100644 --- a/src/main/kotlin/dev/cxntered/textreplacer/elements/ReplacerTextField.kt +++ b/src/main/kotlin/dev/cxntered/textreplacer/elements/ReplacerTextField.kt @@ -3,14 +3,15 @@ package dev.cxntered.textreplacer.elements import cc.polyfrost.oneconfig.gui.elements.text.TextInputField import cc.polyfrost.oneconfig.internal.assets.SVGs import cc.polyfrost.oneconfig.utils.InputHandler +import dev.cxntered.textreplacer.TextReplacer import kotlin.reflect.KMutableProperty0 @Suppress("UnstableAPIUsage") class ReplacerTextField( private val textProperty: KMutableProperty0, + private val expandedTextProperty: KMutableProperty0, defaultText: String ) : TextInputField(432, 32, defaultText, false, false, SVGs.TEXT_INPUT, 12F) { - override fun draw(vg: Long, x: Float, y: Float, inputHandler: InputHandler) { input = textProperty.get() super.draw(vg, x, y, inputHandler) @@ -20,6 +21,7 @@ class ReplacerTextField( if (!isToggled) return false keyTyped(key, keyCode) textProperty.set(input) + expandedTextProperty.set(TextReplacer.expandText(input)) return true } } \ No newline at end of file diff --git a/src/main/kotlin/dev/cxntered/textreplacer/elements/WrappedReplacer.kt b/src/main/kotlin/dev/cxntered/textreplacer/elements/WrappedReplacer.kt index 59cf3e0..fd908f6 100644 --- a/src/main/kotlin/dev/cxntered/textreplacer/elements/WrappedReplacer.kt +++ b/src/main/kotlin/dev/cxntered/textreplacer/elements/WrappedReplacer.kt @@ -13,8 +13,9 @@ class WrappedReplacer( private val removeButton = BasicButton(32, 32, TextReplacer.MINUS_ICON, BasicButton.ALIGNMENT_CENTER, ColorPalette.PRIMARY_DESTRUCTIVE) private val checkbox = ReplacerCheckbox(replacer) - private val textField = ReplacerTextField(replacer::text, "Text to replace") - private val replacementTextField = ReplacerTextField(replacer::replacementText, "Replacement text") + private val textField = ReplacerTextField(replacer::text, replacer::expandedText, "Text to replace") + private val replacementTextField = + ReplacerTextField(replacer::replacementText, replacer::expandedReplacementText, "Replacement text") init { removeButton.setClickAction {