diff --git a/config/detekt/baseline.xml b/config/detekt/baseline.xml index 7bc9ddf5dda..85bf96337e5 100644 --- a/config/detekt/baseline.xml +++ b/config/detekt/baseline.xml @@ -102,7 +102,7 @@ LongMethod:ModuleManager.kt$ModuleManager$fun registerInbuilt() LongMethod:RegistryFunctions.kt$@Suppress("UNUSED_PARAMETER") fun getRegistries(requestObject: RequestObject) LongMethod:Value.kt$Value$open fun setByString(string: String) - LongParameterList:Command.kt$Command$( val name: String, val aliases: Array<out String>, val parameters: Array<Parameter<*>>, val subcommands: Array<Command>, val executable: Boolean, val handler: CommandHandler?, private var parentCommand: Command? = null ) + LongParameterList:Command.kt$Command$( val name: String, val aliases: Array<out String>, val parameters: Array<Parameter<*>>, var subcommands: Array<Command>, val hub: Boolean, val handler: CommandHandler?, private var parentCommand: Command? = null ) LongParameterList:EntityExtensions.kt$( pos: Vec3d, exploding: Entity? = null, power: Float = 6f, explosionRange: Float = power * 2f, // allows setting precomputed values damageDistance: Float = explosionRange * explosionRange, exclude: Array<BlockPos>? = null ) LongParameterList:FallingPlayer.kt$FallingPlayer$( private val player: ClientPlayerEntity, var x: Double, var y: Double, var z: Double, private var motionX: Double, private var motionY: Double, private var motionZ: Double, private val yaw: Float ) LongParameterList:FontRenderer.kt$FontRenderer$( x0: Float, x: Float, y: Float, z: Float, color: Color4b, through: Boolean ) diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/config/ConditionalConfigurables.kt b/src/main/kotlin/net/ccbluex/liquidbounce/config/ConditionalConfigurables.kt index 334f6c2f489..d95c04e197c 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/config/ConditionalConfigurables.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/config/ConditionalConfigurables.kt @@ -132,6 +132,10 @@ class ChoiceConfigurable( } } + override fun getCompletion(begin: String): List { + return choices.map { it.choiceName }.filter { it.startsWith(begin) } + } + @ScriptApi fun getChoicesStrings(): Array = this.choices.map { it.name }.toTypedArray() diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/config/Value.kt b/src/main/kotlin/net/ccbluex/liquidbounce/config/Value.kt index 04625529b52..92f64d6e48a 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/config/Value.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/config/Value.kt @@ -352,6 +352,40 @@ open class Value( } } + open fun getCompletion(begin: String): List { + val results = mutableListOf() + + when (this.valueType) { + ValueType.BOOLEAN -> { + results.add("true") + results.add("false") + } + + ValueType.BLOCK -> { + results.addAll(Registries.BLOCK.map { + it.translationKey + .removePrefix("block.") + .replace('.', ':') + }) + } + + ValueType.ITEM -> { + results.addAll(Registries.ITEM.map { + it.translationKey + .removePrefix("item.") + .removePrefix("block.") + .replace('.', ':') + }) + } + + else -> { + /* no special completion */ + } + } + + return results.filter { it.startsWith(begin) } + } + } /** @@ -410,16 +444,18 @@ class ChooseListValue( override fun setByString(string: String) { val newValue = choices.firstOrNull { it.choiceName == string } - if (newValue == null) { - throw IllegalArgumentException( - "ChooseListValue `${this.name}` has no option named $string" + - " (available options are ${this.choices.joinToString { it.choiceName }})" - ) + requireNotNull(newValue) { + "ChooseListValue `${this.name}` has no option named $string" + + " (available options are ${this.choices.joinToString { it.choiceName }})" } set(newValue) } + override fun getCompletion(begin: String): List { + return choices.map { it.choiceName }.filter { it.startsWith(begin) } + } + @ScriptApi fun getChoicesStrings(): Array { return this.choices.map { it.choiceName }.toTypedArray() diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/event/EventManager.kt b/src/main/kotlin/net/ccbluex/liquidbounce/event/EventManager.kt index 86197ffa4ac..8957510427a 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/event/EventManager.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/event/EventManager.kt @@ -122,6 +122,7 @@ val ALL_EVENT_CLASSES: Array> = arrayOf( ClickGuiScaleChangeEvent::class, BrowserUrlChangeEvent::class, TagEntityEvent::class, + RegistryChangeEvent::class, MouseScrollInHotbarEvent::class, PlayerFluidCollisionCheckEvent::class ) diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/event/events/ClientEvents.kt b/src/main/kotlin/net/ccbluex/liquidbounce/event/events/ClientEvents.kt index ac18a589731..f837115491b 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/event/events/ClientEvents.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/event/events/ClientEvents.kt @@ -25,6 +25,7 @@ import net.ccbluex.liquidbounce.config.Value import net.ccbluex.liquidbounce.event.Event import net.ccbluex.liquidbounce.features.chat.packet.User import net.ccbluex.liquidbounce.features.misc.ProxyManager +import net.ccbluex.liquidbounce.features.module.Module import net.ccbluex.liquidbounce.utils.client.Nameable import net.ccbluex.liquidbounce.utils.entity.SimulatedPlayer import net.ccbluex.liquidbounce.utils.inventory.InventoryAction @@ -180,6 +181,9 @@ class SimulatedTickEvent(val movementEvent: MovementInputEvent, val simulatedPla @Nameable("resourceReload") class ResourceReloadEvent : Event() +@Nameable("moduleRegistry") +class RegistryChangeEvent(val change: RegistryChange, val module: Module) : Event() + @Nameable("scaleFactorChange") @WebSocketEvent class ScaleFactorChangeEvent(val scaleFactor: Double) : Event() @@ -201,3 +205,8 @@ class ScheduleInventoryActionEvent( @Nameable("browserUrlChange") @WebSocketEvent class BrowserUrlChangeEvent(val index: Int, val url: String) : Event() + +enum class RegistryChange { + ADD, + REMOVE +} diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/command/Command.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/command/Command.kt index 62bcaffb776..77e195d5f9d 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/command/Command.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/command/Command.kt @@ -31,8 +31,8 @@ class Command( val name: String, val aliases: Array, val parameters: Array>, - val subcommands: Array, - val executable: Boolean, + var subcommands: Array, + val hub: Boolean, val handler: CommandHandler?, private var parentCommand: Command? = null ) : QuickImports { @@ -110,7 +110,7 @@ class Command( val output = ArrayList() // Don't show non-executable commands as executable - if (executable) { + if (handler != null) { val joiner = StringJoiner(" ") for (parameter in parameters) { diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/command/CommandManager.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/command/CommandManager.kt index 8e4df772a17..7fa88e6efb8 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/command/CommandManager.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/command/CommandManager.kt @@ -149,6 +149,7 @@ object CommandManager : Iterable { addCommand(CommandFakePlayer.createCommand()) addCommand(CommandAutoAccount.createCommand()) addCommand(CommandDebug.createCommand()) + addCommand(CommandRestore.createCommand()) // creative commands addCommand(CommandItemRename.createCommand()) @@ -251,11 +252,14 @@ object CommandManager : Iterable { val command = pair.first // If the command is not executable, don't allow it to be executed - if (!command.executable) { + if (command.handler == null) { throw CommandException( translation("liquidbounce.commandManager.invalidUsage", args[0]), usageInfo = command.usage() ) + } else if (command.hub) { + command.handler!!(command, emptyArray()); + return } // The index the command is in @@ -326,7 +330,7 @@ object CommandManager : Iterable { } } - if (!command.executable) { + if (command.handler == null) { throw CommandException( translation("liquidbounce.commandManager.commandNotExecutable", command.name), usageInfo = command.usage() @@ -523,8 +527,6 @@ object CommandManager : Iterable { // return builder.buildFuture() } - - operator fun plusAssign(command: Command) { addCommand(command) } diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/command/builder/CommandBuilder.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/command/builder/CommandBuilder.kt index c0547ee1bcf..28b67773787 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/command/builder/CommandBuilder.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/command/builder/CommandBuilder.kt @@ -29,7 +29,7 @@ class CommandBuilder private constructor(val name: String) { private var parameters: ArrayList> = ArrayList() private var subcommands: ArrayList = ArrayList() private var handler: CommandHandler? = null - private var executable = true + private var hub = false companion object { fun begin(name: String): CommandBuilder = CommandBuilder(name) @@ -60,24 +60,26 @@ class CommandBuilder private constructor(val name: String) { } /** - * If a command is marked as a hub command, it is impossible to execute it. + * If a command is marked as a hub command, it can't have parameters. + * Furthermore, hubs are not required to be executable. * * For example: .friend * - * The command _friend_ would not be executable since it just acts as a - * hub for its subcommands + * The command _friend_ would not be able to have parameters since it just acts as a + * hub for its subcommands. */ fun hub(): CommandBuilder { - this.executable = false + this.hub = true return this } fun build(): Command { - require(executable || this.handler == null) { - "The command is marked as not executable (hub), but no handler was specified" + require(hub && parameters.isEmpty() || !hub) { + "The command is marked as hub, but parameters were specified" } - require(!executable || this.handler != null) { + + require(!hub && handler != null || hub) { "The command is marked as executable, but no handler was specified." } @@ -103,7 +105,7 @@ class CommandBuilder private constructor(val name: String) { this.subcommands.toArray( emptyArray() ), - executable, + this.hub, this.handler ) } diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/command/commands/client/CommandRestore.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/command/commands/client/CommandRestore.kt new file mode 100644 index 00000000000..36b204bf4d4 --- /dev/null +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/command/commands/client/CommandRestore.kt @@ -0,0 +1,108 @@ +/* + * This file is part of LiquidBounce (https://github.com/CCBlueX/LiquidBounce) + * + * Copyright (c) 2015 - 2024 CCBlueX + * + * LiquidBounce 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. + * + * LiquidBounce 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 LiquidBounce. If not, see . + */ +package net.ccbluex.liquidbounce.features.command.commands.client + +import net.ccbluex.liquidbounce.config.Configurable +import net.ccbluex.liquidbounce.config.Value +import net.ccbluex.liquidbounce.event.Listenable +import net.ccbluex.liquidbounce.event.events.RegistryChange +import net.ccbluex.liquidbounce.event.events.RegistryChangeEvent +import net.ccbluex.liquidbounce.event.handler +import net.ccbluex.liquidbounce.features.command.Command +import net.ccbluex.liquidbounce.features.command.builder.CommandBuilder +import net.ccbluex.liquidbounce.lang.translation +import net.ccbluex.liquidbounce.utils.client.MessageMetadata +import net.ccbluex.liquidbounce.utils.client.chat +import net.ccbluex.liquidbounce.utils.client.regular +import net.ccbluex.liquidbounce.utils.client.variable + +/** + * Restore Command + * + * Allows you to restore original configurations. + */ +object CommandRestore : Listenable { + + var command = CommandBuilder.begin("restore").hub().build() + + fun createCommand() = command + + @Suppress("unused") + val handleModules = handler { event -> + when (event.change) { + RegistryChange.ADD -> registerCommands(null, command, event.module, event.module) + RegistryChange.REMOVE -> { + val newSubCommands = command.subcommands.filter { it.name != event.module.name }.toTypedArray() + command.subcommands = newSubCommands + } + } + } + + private fun registerCommands( + commandBuilder: CommandBuilder?, + command: Command?, + configurable: Configurable, + module: Configurable + ) { + val commandBuilder1 = CommandBuilder + .begin(configurable.name) + .handler { _, _ -> handle(module, configurable) } + .hub() + + configurable.inner.forEach { value -> + if (value is Configurable) { + registerCommands(commandBuilder1, null, value, module) + } else { + commandBuilder1.subcommand( + CommandBuilder + .begin(value.name) + .handler { _, _ -> handle(module, value) } + .build() + ) + } + } + + val command1 = commandBuilder1.build() + commandBuilder?.subcommand(command1) + command?.let { it.subcommands += command1 } + } + + private fun handle(module: Configurable, value: Value<*>) { + value.restore() + + if (value is Configurable) { + chat( + regular( + translation("liquidbounce.command.restore.configurable.result.success", variable(value.name)) + ), metadata = MessageMetadata(id = "${module.name}#restored") + ) + } else { + chat( + regular( + translation( + "liquidbounce.command.restore.result.success", + variable(value.name), + variable(module.name) + ) + ), metadata = MessageMetadata(id = "${module.name}#restored") + ) + } + } + +} diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/command/commands/client/CommandValue.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/command/commands/client/CommandValue.kt index d82a439f7b9..40eab904bce 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/command/commands/client/CommandValue.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/command/commands/client/CommandValue.kt @@ -18,73 +18,99 @@ */ package net.ccbluex.liquidbounce.features.command.commands.client +import net.ccbluex.liquidbounce.config.ConfigSystem +import net.ccbluex.liquidbounce.config.Configurable +import net.ccbluex.liquidbounce.config.Value +import net.ccbluex.liquidbounce.event.Listenable +import net.ccbluex.liquidbounce.event.events.RegistryChange +import net.ccbluex.liquidbounce.event.events.RegistryChangeEvent +import net.ccbluex.liquidbounce.event.handler import net.ccbluex.liquidbounce.features.command.Command import net.ccbluex.liquidbounce.features.command.CommandException import net.ccbluex.liquidbounce.features.command.builder.CommandBuilder import net.ccbluex.liquidbounce.features.command.builder.ParameterBuilder -import net.ccbluex.liquidbounce.features.module.Module -import net.ccbluex.liquidbounce.features.module.ModuleManager +import net.ccbluex.liquidbounce.lang.translation +import net.ccbluex.liquidbounce.utils.client.MessageMetadata import net.ccbluex.liquidbounce.utils.client.chat import net.ccbluex.liquidbounce.utils.client.regular +import net.ccbluex.liquidbounce.utils.client.variable /** * Value Command * * Allows you to set the value of a specific module. */ -object CommandValue { +object CommandValue : Listenable { - fun createCommand(): Command { - return CommandBuilder - .begin("value") - .parameter( - ParameterBuilder - .begin("moduleName") - .verifiedBy(ParameterBuilder.MODULE_VALIDATOR) - .autocompletedWith(ModuleManager::autoComplete) - .required() - .build() - ) - .parameter( - ParameterBuilder - .begin("valueName") - .verifiedBy(ParameterBuilder.STRING_VALIDATOR) - .autocompletedWith { begin, args -> - val module = ModuleManager.find { it.name.equals(args[1], true) } - if (module == null) return@autocompletedWith emptyList() + var command = CommandBuilder.begin("value").hub().build() - module.getContainedValuesRecursively() - .filter { it.name.startsWith(begin, true) } - .map { it.name } - } - .required() - .build() - ) - .parameter( - ParameterBuilder - .begin("value") - .verifiedBy(ParameterBuilder.STRING_VALIDATOR) - .useMinecraftAutoCompletion() - .required() - .build() - ) - .handler { command, args -> - val module = args[0] as Module - val valueName = args[1] as String - val valueString = args[2] as String + fun createCommand() = command - val value = module.getContainedValuesRecursively() - .firstOrNull { it.name.equals(valueName, true) } - ?: throw CommandException(command.result("valueNotFound", valueName)) + @Suppress("unused") + val handleModules = handler { event -> + when (event.change) { + RegistryChange.ADD -> registerCommands(null, command, event.module, event.module) + RegistryChange.REMOVE -> { + val newSubCommands = command.subcommands.filter { it.name != event.module.name }.toTypedArray() + command.subcommands = newSubCommands + } + } + } - try { - value.setByString(valueString) - } catch (e: Exception) { - throw CommandException(command.result("valueError", valueName, e.message ?: "")) - } + private fun registerCommands( + commandBuilder: CommandBuilder?, + command: Command?, + configurable: Configurable, + module: Configurable + ) { + val commandBuilder1 = CommandBuilder.begin(configurable.name).hub() - chat(regular(command.result("success"))) + configurable.inner.forEach { value -> + if (value is Configurable) { + registerCommands(commandBuilder1, null, value, module) + } else { + commandBuilder1.subcommand( + CommandBuilder + .begin(value.name) + .parameter( + ParameterBuilder + .begin("value") + .autocompletedWith { begin -> value.getCompletion(begin) } + .verifiedBy(ParameterBuilder.STRING_VALIDATOR) + .required() + .build() + ) + .handler { command, args -> handle(args, module, command, value) } + .build() + ) } - .build() + } + + val command1 = commandBuilder1.build() + commandBuilder?.subcommand(command1) + command?.let { it.subcommands += command1 } + } + + private fun handle(args: Array, module: Configurable, command: Command, value: Value<*>) { + val valueString = args[0] as String + val valueName = value.name + + try { + value.setByString(valueString) + } catch (e: Exception) { + throw CommandException(translation( + "liquidbounce.command.value.result.valueError", + valueName, + e.message ?: "" + )) + } + + chat(regular(translation( + "liquidbounce.command.value.result.success", + variable(valueName), + variable(module.name), + variable(ConfigSystem.clientGson.toJson(value.inner)) + )), metadata = MessageMetadata(id = "${command.translationBaseKey}#changed")) } + } diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/ModuleManager.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/ModuleManager.kt index c936af835f0..153da44ba66 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/ModuleManager.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/ModuleManager.kt @@ -20,10 +20,9 @@ package net.ccbluex.liquidbounce.features.module import net.ccbluex.liquidbounce.LiquidBounce import net.ccbluex.liquidbounce.config.ConfigSystem +import net.ccbluex.liquidbounce.event.EventManager import net.ccbluex.liquidbounce.event.Listenable -import net.ccbluex.liquidbounce.event.events.KeyboardKeyEvent -import net.ccbluex.liquidbounce.event.events.MouseButtonEvent -import net.ccbluex.liquidbounce.event.events.WorldChangeEvent +import net.ccbluex.liquidbounce.event.events.* import net.ccbluex.liquidbounce.event.handler import net.ccbluex.liquidbounce.features.module.modules.client.ModuleAutoConfig import net.ccbluex.liquidbounce.features.module.modules.client.ModuleLiquidChat @@ -352,6 +351,7 @@ object ModuleManager : Listenable, Iterable by modules { private fun addModule(module: Module) { module.initConfigurable() module.init() + EventManager.callEvent(RegistryChangeEvent(RegistryChange.ADD, module)) modules += module } @@ -360,6 +360,7 @@ object ModuleManager : Listenable, Iterable by modules { module.disable() } module.unregister() + EventManager.callEvent(RegistryChangeEvent(RegistryChange.REMOVE, module)) modules -= module } diff --git a/src/main/resources/assets/liquidbounce/lang/en_us.json b/src/main/resources/assets/liquidbounce/lang/en_us.json index 0b8996585ef..0ebd3c2b086 100644 --- a/src/main/resources/assets/liquidbounce/lang/en_us.json +++ b/src/main/resources/assets/liquidbounce/lang/en_us.json @@ -270,10 +270,12 @@ "liquidbounce.command.toggle.result.moduleToggled": "%s has been %s.", "liquidbounce.command.username.description": "Copies your username to the clipboard.", "liquidbounce.command.username.result.username": "Username: %s", - "liquidbounce.command.value.description": "Allows you to change a value", - "liquidbounce.command.value.result.success": "Successfully changed value.", + "liquidbounce.command.value.description": "Allows you to change values in modules.", + "liquidbounce.command.value.result.success": "Successfully changed the value of \"%s\" in \"%s\" to \"%s\".", + "liquidbounce.command.restore.description": "Allows you to restore original configurations.", + "liquidbounce.command.restore.configurable.result.success": "Successfully restored the original values in \"%s\".", + "liquidbounce.command.restore.result.success": "Successfully restored the original value of \"%s\" in \"%s\".", "liquidbounce.command.value.result.valueError": "Unable to change value %s because of an error: '%s'!", - "liquidbounce.command.value.result.valueNotFound": "Unable to find value %s!", "liquidbounce.command.vclip.result.invalidDistance": "Invalid distance. Please enter a valid number.", "liquidbounce.command.teleport.result.invalidCoordinates": "Invalid coordinates. Please enter valid numbers.", "liquidbounce.command.xray.description": "Allows you to see ores through walls.", diff --git a/src/main/resources/assets/liquidbounce/lang/ja_jp.json b/src/main/resources/assets/liquidbounce/lang/ja_jp.json index c0e7734c42f..6767c7b4e99 100644 --- a/src/main/resources/assets/liquidbounce/lang/ja_jp.json +++ b/src/main/resources/assets/liquidbounce/lang/ja_jp.json @@ -249,7 +249,6 @@ "liquidbounce.command.username.description": "ユーザー名をクリップボードにコピーします。", "liquidbounce.command.username.result.username": "ユーザー名: %s ", "liquidbounce.command.value.description": "値を変更できます", - "liquidbounce.command.value.result.success": "値が正常に変更されました。", "liquidbounce.command.value.result.valueError": "要素「%s」を変更できませんでした: 「%s」", "liquidbounce.command.value.result.valueNotFound": "値 %s が見つかりません!", "liquidbounce.command.vclip.result.invalidDistance": "無効な距離です。 有効な距離を入力してください。", diff --git a/src/main/resources/assets/liquidbounce/lang/pt_br.json b/src/main/resources/assets/liquidbounce/lang/pt_br.json index 30022b2c0d7..4790213c53e 100644 --- a/src/main/resources/assets/liquidbounce/lang/pt_br.json +++ b/src/main/resources/assets/liquidbounce/lang/pt_br.json @@ -127,7 +127,6 @@ "liquidbounce.command.chat.description": "Manda uma mensagem no LiquidChat.", "liquidbounce.command.chat.parameter.message.description": "Mensagem para mandar.", "liquidbounce.command.value.description": "Deixa você mudar um valor", - "liquidbounce.command.value.result.success": "Valor mudado.", "liquidbounce.command.value.result.valueNotFound": "Valor %s não existe!", "liquidbounce.command.ping.description": "Checa seu ping.", "liquidbounce.command.ping.result.pingCheck": "seu ping é %sms.", diff --git a/src/main/resources/assets/liquidbounce/lang/ru_ru.json b/src/main/resources/assets/liquidbounce/lang/ru_ru.json index 74aa37949e7..e86ff708f99 100644 --- a/src/main/resources/assets/liquidbounce/lang/ru_ru.json +++ b/src/main/resources/assets/liquidbounce/lang/ru_ru.json @@ -198,7 +198,6 @@ "liquidbounce.command.toggle.result.enabled": "включен", "liquidbounce.command.toggle.result.disabled": "выключен", "liquidbounce.command.value.description": "Позволяет Вам менять значения настроек", - "liquidbounce.command.value.result.success": "Успешно изменено значение настройки.", "liquidbounce.command.value.result.valueError": "Невозможно изменить значение %s из-за ошибки: '%s'!", "liquidbounce.command.value.result.valueNotFound": "Не удалось найти настройку %s!", "liquidbounce.command.xray.description": "Позволяет Вам видеть руды через стены.", diff --git a/src/main/resources/assets/liquidbounce/lang/ua_ua.json b/src/main/resources/assets/liquidbounce/lang/ua_ua.json index b4f6202799b..da10cb06fe5 100644 --- a/src/main/resources/assets/liquidbounce/lang/ua_ua.json +++ b/src/main/resources/assets/liquidbounce/lang/ua_ua.json @@ -167,7 +167,6 @@ "liquidbounce.command.toggle.result.enabled": "включений", "liquidbounce.command.toggle.result.disabled": "вимкнений", "liquidbounce.command.value.description": "Дозволяє Вам змінювати значення налаштувань.", - "liquidbounce.command.value.result.success": "Успішно змінено значення налаштування.", "liquidbounce.command.value.result.valueNotFound": "Не вдалося знайти налаштування %s!", "liquidbounce.command.xray.description": "Дозволяє Вам бачити руди через стіни.", "liquidbounce.command.xray.subcommand.add.description": "Додає блок для відображення у список.", diff --git a/src/main/resources/assets/liquidbounce/lang/zh_cn.json b/src/main/resources/assets/liquidbounce/lang/zh_cn.json index c1672dbc370..ec78284b12c 100644 --- a/src/main/resources/assets/liquidbounce/lang/zh_cn.json +++ b/src/main/resources/assets/liquidbounce/lang/zh_cn.json @@ -269,7 +269,6 @@ "liquidbounce.command.username.description": "复制你的游戏名到剪贴板上。", "liquidbounce.command.username.result.username": "游戏ID: %s", "liquidbounce.command.value.description": "允许你改变这个值", - "liquidbounce.command.value.result.success": "成功改变此值。", "liquidbounce.command.value.result.valueError": "无法改变此值,错误原因: '%s'!", "liquidbounce.command.value.result.valueNotFound": "无法找到值 %s!", "liquidbounce.command.vclip.result.invalidDistance": "距离无效。请输入有效的数字。",