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": "距离无效。请输入有效的数字。",