From 37751a333b007dae72b1502b259259b75b48580f Mon Sep 17 00:00:00 2001 From: sqlerrorthing Date: Sat, 28 Dec 2024 22:41:16 +0800 Subject: [PATCH 1/4] bettertab --- .../minecraft/gui/MixinPlayerListHud.java | 108 +++++++++++++++++- .../features/module/ModuleManager.kt | 3 +- .../module/modules/misc/ModuleBetterTab.kt | 62 ++++++++++ 3 files changed, 169 insertions(+), 4 deletions(-) create mode 100644 src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/misc/ModuleBetterTab.kt diff --git a/src/main/java/net/ccbluex/liquidbounce/injection/mixins/minecraft/gui/MixinPlayerListHud.java b/src/main/java/net/ccbluex/liquidbounce/injection/mixins/minecraft/gui/MixinPlayerListHud.java index 2bfc3dadec7..9c00188303c 100644 --- a/src/main/java/net/ccbluex/liquidbounce/injection/mixins/minecraft/gui/MixinPlayerListHud.java +++ b/src/main/java/net/ccbluex/liquidbounce/injection/mixins/minecraft/gui/MixinPlayerListHud.java @@ -19,16 +19,120 @@ package net.ccbluex.liquidbounce.injection.mixins.minecraft.gui; import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.ref.LocalIntRef; +import net.ccbluex.liquidbounce.features.misc.FriendManager; import net.ccbluex.liquidbounce.features.module.modules.misc.ModuleAntiStaff; +import net.ccbluex.liquidbounce.features.module.modules.misc.ModuleBetterTab; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.hud.PlayerListHud; import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.Text; import net.minecraft.util.Colors; +import net.minecraft.util.math.MathHelper; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.invoke.arg.Args; + +import java.util.Comparator; +import java.util.List; +import java.util.Objects; +import java.util.stream.Stream; @Mixin(PlayerListHud.class) -public class MixinPlayerListHud { +public abstract class MixinPlayerListHud { + + @Shadow + protected abstract List collectPlayerEntries(); + + @ModifyConstant(constant = @Constant(longValue = 80L), method = "collectPlayerEntries") + private long hookTabSize(long count) { + return ModuleBetterTab.INSTANCE.getRunning() ? + ModuleBetterTab.Limits.INSTANCE.getTabSize() : count; + } + + @WrapOperation(method = "collectPlayerEntries", at = @At(value = "INVOKE", target = "Ljava/util/stream/Stream;sorted(Ljava/util/Comparator;)Ljava/util/stream/Stream;")) + private Stream hookSort(Stream instance, Comparator defaultComparator, Operation> original) { + var comparator = ModuleBetterTab.INSTANCE.getRunning() ? + ModuleBetterTab.INSTANCE.getSorting().getComparator() : defaultComparator; + + return original.call(instance, comparator); + } + + @Inject(method = "render", at = @At(value = "INVOKE", target = "Ljava/lang/Math;min(II)I", shift = At.Shift.BEFORE)) + private void hookTabColumnHeight(CallbackInfo ci, @Local(ordinal = 5) LocalIntRef o, @Local(ordinal = 6)LocalIntRef p) { + if (!ModuleBetterTab.INSTANCE.getRunning()) { + return; + } + + int totalPlayers = collectPlayerEntries().size(); + int columns = 1; + int rows = totalPlayers; + + while (rows > ModuleBetterTab.Limits.INSTANCE.getHeight()) { + columns++; + rows = (totalPlayers + columns - 1) / columns; + } + + o.set(rows); + p.set(columns); + } + + @ModifyArg(method = "render", at = @At(value = "INVOKE", target = "Ljava/lang/Math;min(II)I"), index = 0) + private int hookWidth(int width) { + return ModuleBetterTab.INSTANCE.getRunning() && ModuleBetterTab.AccurateLatency.INSTANCE.getRunning() ? width + 30 : width; + } + + @Inject(method = "renderLatencyIcon", at = @At("HEAD"), cancellable = true) + private void hookOnRenderLatencyIcon(DrawContext context, int width, int x, int y, PlayerListEntry entry, CallbackInfo ci) { + var accurateLatency = ModuleBetterTab.AccurateLatency.INSTANCE; + if (ModuleBetterTab.INSTANCE.getRunning() && accurateLatency.getRunning()) { + TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; + + int latency = MathHelper.clamp(entry.getLatency(), 0, 9999); + int color = latency < 150 ? 0x00E970 : latency < 300 ? 0xE7D020 : 0xD74238; + String text = latency + (accurateLatency.getSuffix() ? "ms" : ""); + context.drawTextWithShadow(textRenderer, text, x + width - textRenderer.getWidth(text), y, color); + ci.cancel(); + } + } + + @ModifyArgs(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;fill(IIIII)V", ordinal = 2)) + private void hookRenderPlayerBackground(Args args, @Local(ordinal = 13) int w, @Local(ordinal = 0) List entries) { + if (!ModuleBetterTab.INSTANCE.getRunning()) { + return; + } + + var highlight = ModuleBetterTab.Highlight.INSTANCE; + if (!highlight.getRunning()) { + return; + } + + if (w < entries.size()) { + var entry = entries.get(w); + if (highlight.getSelf().getRunning()) { + if (Objects.equals(entry.getProfile().getName(), MinecraftClient.getInstance().player.getGameProfile().getName())) { + args.set(4, highlight.getSelf().getColor().toARGB()); + return; + } + } + + if (highlight.getFriends().getRunning()) { + for(var friend : FriendManager.INSTANCE.getFriends()) { + if (Objects.equals(entry.getProfile().getName(), friend.getName())) { + args.set(4, highlight.getFriends().getColor().toARGB()); + return; + } + } + } + } + } @ModifyReturnValue(method = "getPlayerName", at = @At("RETURN")) private Text modifyPlayerName(Text original, PlayerListEntry entry) { 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 e708ab0570c..898494db02c 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/ModuleManager.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/ModuleManager.kt @@ -31,8 +31,6 @@ import net.ccbluex.liquidbounce.features.module.modules.client.ModuleRichPresenc import net.ccbluex.liquidbounce.features.module.modules.client.ModuleTargets import net.ccbluex.liquidbounce.features.module.modules.combat.* import net.ccbluex.liquidbounce.features.module.modules.combat.aimbot.ModuleAutoBow -import net.ccbluex.liquidbounce.features.module.modules.combat.aimbot.ModuleDroneControl -import net.ccbluex.liquidbounce.features.module.modules.combat.aimbot.ModuleProjectileAimbot import net.ccbluex.liquidbounce.features.module.modules.combat.autoarmor.ModuleAutoArmor import net.ccbluex.liquidbounce.features.module.modules.combat.criticals.ModuleCriticals import net.ccbluex.liquidbounce.features.module.modules.combat.crystalaura.ModuleCrystalAura @@ -216,6 +214,7 @@ object ModuleManager : EventListener, Iterable by modules { // Misc ModuleAntiBot, + ModuleBetterTab, ModuleBetterChat, ModuleMiddleClickAction, ModuleInventoryTracker, diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/misc/ModuleBetterTab.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/misc/ModuleBetterTab.kt new file mode 100644 index 00000000000..65fc8312976 --- /dev/null +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/misc/ModuleBetterTab.kt @@ -0,0 +1,62 @@ +package net.ccbluex.liquidbounce.features.module.modules.misc + +import net.ccbluex.liquidbounce.config.types.Configurable +import net.ccbluex.liquidbounce.config.types.NamedChoice +import net.ccbluex.liquidbounce.config.types.ToggleableConfigurable +import net.ccbluex.liquidbounce.features.module.Category +import net.ccbluex.liquidbounce.features.module.ClientModule +import net.ccbluex.liquidbounce.render.engine.Color4b +import net.minecraft.client.network.PlayerListEntry +import java.awt.Color + + +/** + * ModuleBetterTab + * + * @author sqlerrorthing + * @since 12/28/2024 + **/ +object ModuleBetterTab : ClientModule("BetterTab", Category.MISC) { + + init { + treeAll( + Limits, + Highlight, + AccurateLatency + ) + } + + val sorting by enumChoice("Sorting", Sorting.VANILLA) + + object AccurateLatency : ToggleableConfigurable(ModuleBetterTab, "AccurateLatency", true) { + val suffix by boolean("AppendMSSuffix", true) + } + + object Limits : Configurable("Limits") { + val tabSize by int("TabSize", 80, 1..1000) + val height by int("ColumnHeight", 20, 1..100) + } + + object Highlight : ToggleableConfigurable(ModuleBetterTab, "Highlight", true) { + class HighlightColored(name: String, color: Color4b) : ToggleableConfigurable(this, name, true) { + val color by color("Color", color) + } + + val self = tree(HighlightColored("Self", Color4b(Color(50, 193, 50, 80)))) + val friends = tree(HighlightColored("Friends", Color4b(Color(16, 89, 203, 80)))) + } +} + +enum class Sorting( + override val choiceName: String, + val comparator: Comparator +) : NamedChoice { + VANILLA("Vanilla", Comparator.comparingInt { -it.listOrder }), + PING("Ping", Comparator.comparingInt { it.latency }), + LENGTH("NameLength", Comparator.comparingInt { it.profile.name.length }), + ALPHABETICAL("Alphabetical", Comparator.comparing { it.profile.name }), + REVERSE_ALPHABETICAL("ReverseAlphabetical", Comparator.comparing({ it.profile.name }, Comparator.reverseOrder())), + NONE("None", { _, _ -> 0 }) +} + + From d8ca0830a9ebbe0225440d43c74d72093eb267fa Mon Sep 17 00:00:00 2001 From: sqlerrorthing Date: Sun, 29 Dec 2024 09:04:18 +0800 Subject: [PATCH 2/4] fix sorting & allow hide header | footer --- .../minecraft/gui/MixinPlayerListHud.java | 46 ++++++++++++++++--- .../module/modules/misc/ModuleBetterTab.kt | 26 +++++++---- 2 files changed, 55 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/ccbluex/liquidbounce/injection/mixins/minecraft/gui/MixinPlayerListHud.java b/src/main/java/net/ccbluex/liquidbounce/injection/mixins/minecraft/gui/MixinPlayerListHud.java index 9c00188303c..b486da7c10b 100644 --- a/src/main/java/net/ccbluex/liquidbounce/injection/mixins/minecraft/gui/MixinPlayerListHud.java +++ b/src/main/java/net/ccbluex/liquidbounce/injection/mixins/minecraft/gui/MixinPlayerListHud.java @@ -18,6 +18,7 @@ */ package net.ccbluex.liquidbounce.injection.mixins.minecraft.gui; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; @@ -59,12 +60,46 @@ private long hookTabSize(long count) { @WrapOperation(method = "collectPlayerEntries", at = @At(value = "INVOKE", target = "Ljava/util/stream/Stream;sorted(Ljava/util/Comparator;)Ljava/util/stream/Stream;")) private Stream hookSort(Stream instance, Comparator defaultComparator, Operation> original) { - var comparator = ModuleBetterTab.INSTANCE.getRunning() ? - ModuleBetterTab.INSTANCE.getSorting().getComparator() : defaultComparator; + var sorting = ModuleBetterTab.INSTANCE.getSorting(); + + boolean running = ModuleBetterTab.INSTANCE.getRunning(); + var customComparator = sorting.getComparator(); + + var comparator = running + ? (customComparator != null ? customComparator : defaultComparator) + : defaultComparator; return original.call(instance, comparator); } + @ModifyExpressionValue(method = "render", at = @At( + value = "FIELD", + target = "Lnet/minecraft/client/gui/hud/PlayerListHud;header:Lnet/minecraft/text/Text;", + ordinal = 0 + )) + private Text hookHeader(Text original) { + if (!ModuleBetterTab.INSTANCE.getRunning()) { + return original; + } + + return ModuleBetterTab.Visibility.INSTANCE.getHeader() ? + original : null; + } + + @ModifyExpressionValue(method = "render", at = @At( + value = "FIELD", + target = "Lnet/minecraft/client/gui/hud/PlayerListHud;footer:Lnet/minecraft/text/Text;", + ordinal = 0 + )) + private Text hookFooter(Text original) { + if (!ModuleBetterTab.INSTANCE.getRunning()) { + return original; + } + + return ModuleBetterTab.Visibility.INSTANCE.getFooter() ? + original : null; + } + @Inject(method = "render", at = @At(value = "INVOKE", target = "Ljava/lang/Math;min(II)I", shift = At.Shift.BEFORE)) private void hookTabColumnHeight(CallbackInfo ci, @Local(ordinal = 5) LocalIntRef o, @Local(ordinal = 6)LocalIntRef p) { if (!ModuleBetterTab.INSTANCE.getRunning()) { @@ -124,11 +159,8 @@ private void hookRenderPlayerBackground(Args args, @Local(ordinal = 13) int w, @ } if (highlight.getFriends().getRunning()) { - for(var friend : FriendManager.INSTANCE.getFriends()) { - if (Objects.equals(entry.getProfile().getName(), friend.getName())) { - args.set(4, highlight.getFriends().getColor().toARGB()); - return; - } + if (FriendManager.INSTANCE.isFriend(entry.getProfile().getName())) { + args.set(4, highlight.getFriends().getColor().toARGB()); } } } diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/misc/ModuleBetterTab.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/misc/ModuleBetterTab.kt index 65fc8312976..78d5662d79f 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/misc/ModuleBetterTab.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/misc/ModuleBetterTab.kt @@ -7,7 +7,6 @@ import net.ccbluex.liquidbounce.features.module.Category import net.ccbluex.liquidbounce.features.module.ClientModule import net.ccbluex.liquidbounce.render.engine.Color4b import net.minecraft.client.network.PlayerListEntry -import java.awt.Color /** @@ -21,37 +20,44 @@ object ModuleBetterTab : ClientModule("BetterTab", Category.MISC) { init { treeAll( Limits, + Visibility, Highlight, - AccurateLatency + AccurateLatency, ) } val sorting by enumChoice("Sorting", Sorting.VANILLA) - object AccurateLatency : ToggleableConfigurable(ModuleBetterTab, "AccurateLatency", true) { - val suffix by boolean("AppendMSSuffix", true) - } - object Limits : Configurable("Limits") { val tabSize by int("TabSize", 80, 1..1000) val height by int("ColumnHeight", 20, 1..100) } + object Visibility : Configurable("Visibility") { + val header by boolean("Header", true) + val footer by boolean("Footer", true) + } + object Highlight : ToggleableConfigurable(ModuleBetterTab, "Highlight", true) { class HighlightColored(name: String, color: Color4b) : ToggleableConfigurable(this, name, true) { val color by color("Color", color) } - val self = tree(HighlightColored("Self", Color4b(Color(50, 193, 50, 80)))) - val friends = tree(HighlightColored("Friends", Color4b(Color(16, 89, 203, 80)))) + val self = tree(HighlightColored("Self", Color4b(50, 193, 50, 80))) + val friends = tree(HighlightColored("Friends", Color4b(16, 89, 203, 80))) + } + + object AccurateLatency : ToggleableConfigurable(ModuleBetterTab, "AccurateLatency", true) { + val suffix by boolean("AppendMSSuffix", true) } } +@Suppress("unused") enum class Sorting( override val choiceName: String, - val comparator: Comparator + val comparator: Comparator? ) : NamedChoice { - VANILLA("Vanilla", Comparator.comparingInt { -it.listOrder }), + VANILLA("Vanilla", null), PING("Ping", Comparator.comparingInt { it.latency }), LENGTH("NameLength", Comparator.comparingInt { it.profile.name.length }), ALPHABETICAL("Alphabetical", Comparator.comparing { it.profile.name }), From f3ab19207bb45197eb6447b04a4156d79d246bd5 Mon Sep 17 00:00:00 2001 From: sqlerrorthing Date: Sun, 29 Dec 2024 09:55:23 +0800 Subject: [PATCH 3/4] allow render only name & display name length comparator --- .../minecraft/gui/MixinPlayerListHud.java | 27 +++++++++++++++++++ .../module/modules/misc/ModuleBetterTab.kt | 4 ++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/ccbluex/liquidbounce/injection/mixins/minecraft/gui/MixinPlayerListHud.java b/src/main/java/net/ccbluex/liquidbounce/injection/mixins/minecraft/gui/MixinPlayerListHud.java index b486da7c10b..49dd82d6c22 100644 --- a/src/main/java/net/ccbluex/liquidbounce/injection/mixins/minecraft/gui/MixinPlayerListHud.java +++ b/src/main/java/net/ccbluex/liquidbounce/injection/mixins/minecraft/gui/MixinPlayerListHud.java @@ -100,6 +100,33 @@ private Text hookFooter(Text original) { original : null; } + @ModifyExpressionValue(method = "render", at = @At( + value = "FIELD", + target = "Lnet/minecraft/client/gui/hud/PlayerListHud$ScoreDisplayEntry;name:Lnet/minecraft/text/Text;" + )) + private Text hookVisibilityName(Text original, @Local(ordinal = 0) PlayerListEntry entry) { + if (!ModuleBetterTab.INSTANCE.getRunning()) { + return original; + } + + return ModuleBetterTab.Visibility.INSTANCE.getNameOnly() ? + Text.of(entry.getProfile().getName()) : original; + + } + + @ModifyExpressionValue(method = "render", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/gui/hud/PlayerListHud;getPlayerName(Lnet/minecraft/client/network/PlayerListEntry;)Lnet/minecraft/text/Text;" + )) + private Text hookWidthVisibilityName(Text original, @Local(ordinal = 0) PlayerListEntry entry) { + if (!ModuleBetterTab.INSTANCE.getRunning()) { + return original; + } + + return ModuleBetterTab.Visibility.INSTANCE.getNameOnly() ? + Text.of(entry.getProfile().getName()) : original; + } + @Inject(method = "render", at = @At(value = "INVOKE", target = "Ljava/lang/Math;min(II)I", shift = At.Shift.BEFORE)) private void hookTabColumnHeight(CallbackInfo ci, @Local(ordinal = 5) LocalIntRef o, @Local(ordinal = 6)LocalIntRef p) { if (!ModuleBetterTab.INSTANCE.getRunning()) { diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/misc/ModuleBetterTab.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/misc/ModuleBetterTab.kt index 78d5662d79f..62ad7954513 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/misc/ModuleBetterTab.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/misc/ModuleBetterTab.kt @@ -7,7 +7,7 @@ import net.ccbluex.liquidbounce.features.module.Category import net.ccbluex.liquidbounce.features.module.ClientModule import net.ccbluex.liquidbounce.render.engine.Color4b import net.minecraft.client.network.PlayerListEntry - +import net.minecraft.text.Text /** * ModuleBetterTab @@ -36,6 +36,7 @@ object ModuleBetterTab : ClientModule("BetterTab", Category.MISC) { object Visibility : Configurable("Visibility") { val header by boolean("Header", true) val footer by boolean("Footer", true) + val nameOnly by boolean("NameOnly", false) } object Highlight : ToggleableConfigurable(ModuleBetterTab, "Highlight", true) { @@ -60,6 +61,7 @@ enum class Sorting( VANILLA("Vanilla", null), PING("Ping", Comparator.comparingInt { it.latency }), LENGTH("NameLength", Comparator.comparingInt { it.profile.name.length }), + SCORE_LENGTH("DisplayNameLength", Comparator.comparingInt { (it.displayName ?: Text.empty()).string.length }), ALPHABETICAL("Alphabetical", Comparator.comparing { it.profile.name }), REVERSE_ALPHABETICAL("ReverseAlphabetical", Comparator.comparing({ it.profile.name }, Comparator.reverseOrder())), NONE("None", { _, _ -> 0 }) From 0e4792b133a12474f76b583a3d387498bdbbf277 Mon Sep 17 00:00:00 2001 From: sqlerrorthing Date: Sun, 29 Dec 2024 10:15:28 +0800 Subject: [PATCH 4/4] module description --- src/main/resources/assets/liquidbounce/lang/de_de.json | 1 + src/main/resources/assets/liquidbounce/lang/en_pt.json | 1 + src/main/resources/assets/liquidbounce/lang/en_us.json | 1 + src/main/resources/assets/liquidbounce/lang/ja_jp.json | 3 ++- src/main/resources/assets/liquidbounce/lang/pt_br.json | 1 + src/main/resources/assets/liquidbounce/lang/ru_ru.json | 1 + src/main/resources/assets/liquidbounce/lang/ua_ua.json | 1 + src/main/resources/assets/liquidbounce/lang/zh_cn.json | 1 + 8 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/liquidbounce/lang/de_de.json b/src/main/resources/assets/liquidbounce/lang/de_de.json index ddf9d2d1169..a81abff420d 100644 --- a/src/main/resources/assets/liquidbounce/lang/de_de.json +++ b/src/main/resources/assets/liquidbounce/lang/de_de.json @@ -619,6 +619,7 @@ "liquidbounce.module.autoPearl.description": "Zielt und wirft automatisch eine Enderperle auf die Flugbahn der feindlichen Enderperle.", "liquidbounce.module.holeFiller.description": "Füllt automatisch sichere Orte mit Blöcken für Crystal PvP.", "liquidbounce.module.itemChams.description": "Wendet visuelle Effekte auf Gegenstände in deiner Hand an.", + "liquidbounce.module.betterTab.description": "Verschiedene Verbesserungen an der Tab-Liste.", "liquidbounce.module.itemTags.description": "Zeigt Bilder und Mengenangaben fallengelassener Gegenstände an.", "liquidbounce.module.baritone.description": "Einstellungen für Baritone." } diff --git a/src/main/resources/assets/liquidbounce/lang/en_pt.json b/src/main/resources/assets/liquidbounce/lang/en_pt.json index cf6c0058949..0ccc05616c0 100644 --- a/src/main/resources/assets/liquidbounce/lang/en_pt.json +++ b/src/main/resources/assets/liquidbounce/lang/en_pt.json @@ -434,5 +434,6 @@ "liquidbounce.command.script.subcommand.edit.result.opened": "Opened script named %s.", "liquidbounce.liquidchat.authenticationFailed": "Authentication failed! LiquidChat requires Minecraft premium account.", "liquidbounce.module.autoBalls.description": "Automatically throws snowballs at your enemies.", + "liquidbounce.module.betterTab.description": "Multiple enhancements to the tab list.", "liquidbounce.module.autoPearl.description": "Mira e lança uma pérola na trajetória da pérola inimiga." } diff --git a/src/main/resources/assets/liquidbounce/lang/en_us.json b/src/main/resources/assets/liquidbounce/lang/en_us.json index 93bf4d22943..b1b980532bf 100644 --- a/src/main/resources/assets/liquidbounce/lang/en_us.json +++ b/src/main/resources/assets/liquidbounce/lang/en_us.json @@ -618,5 +618,6 @@ "liquidbounce.module.packetMine.description": "Allows you to mine blocks by clicking them once.", "liquidbounce.module.fastExp.description": "Automatically repairs your armor.", "liquidbounce.module.itemChams.description": "Applies visual effects to your held items.", + "liquidbounce.module.betterTab.description": "Multiple improvements to the tab list.", "liquidbounce.module.autoPearl.description": "Aims and throws a pearl at an enemies pearl trajectory." } diff --git a/src/main/resources/assets/liquidbounce/lang/ja_jp.json b/src/main/resources/assets/liquidbounce/lang/ja_jp.json index 838863d1e5b..3fff755def2 100644 --- a/src/main/resources/assets/liquidbounce/lang/ja_jp.json +++ b/src/main/resources/assets/liquidbounce/lang/ja_jp.json @@ -500,5 +500,6 @@ "liquidbounce.module.xRay.description": "選択したブロックのみをレンダリングします。", "liquidbounce.module.zoot.description": "すべての悪い効果/火を取り除きます。", "modmenu.descriptionTranslation.liquidbounce": "無料でオープンソースのハッククライアント", - "liquidbounce.module.autoPearl.description": "敵の真珠の軌道に向けて真珠を狙い投げる." + "liquidbounce.module.betterTab.description": "タブリストに複数の改良を加えました。", + "liquidbounce.module.autoPearl.description": "敵の真珠の軌道に向けて真珠を狙い投げる." } diff --git a/src/main/resources/assets/liquidbounce/lang/pt_br.json b/src/main/resources/assets/liquidbounce/lang/pt_br.json index a08a81b2f63..e8943c3f16b 100644 --- a/src/main/resources/assets/liquidbounce/lang/pt_br.json +++ b/src/main/resources/assets/liquidbounce/lang/pt_br.json @@ -501,5 +501,6 @@ "liquidbounce.module.autoFish.value.castDelay.description": "Atraso de lançamento.", "liquidbounce.module.autoFish.value.reelDelay.description": "Atraso de recolhimento.", "liquidbounce.module.autoFish.value.recastDelay.description": "Atraso de novo lançamento.", + "liquidbounce.module.betterTab.description": "Diversas melhorias na lista de abas.", "liquidbounce.module.autoPearl.description": "Mira e lança uma pérola na trajetória da pérola inimiga." } diff --git a/src/main/resources/assets/liquidbounce/lang/ru_ru.json b/src/main/resources/assets/liquidbounce/lang/ru_ru.json index 3f479145185..33352cd411e 100644 --- a/src/main/resources/assets/liquidbounce/lang/ru_ru.json +++ b/src/main/resources/assets/liquidbounce/lang/ru_ru.json @@ -622,5 +622,6 @@ "liquidbounce.module.tpAura.description": "Автоматически телепортирует и атакует врагов вокруг.", "liquidbounce.module.packetMine.description": "Позволяет добывать блоки, щелкая по ним один раз.", "liquidbounce.module.fastExp.description": "Автоматически чинит вашу броню.", + "liquidbounce.module.betterTab.description": "Различные улучшения в таб-листе.", "liquidbounce.module.autoPearl.description": "Прицеливается и бросает пёрл по траектории движения вражеского пёрла." } diff --git a/src/main/resources/assets/liquidbounce/lang/ua_ua.json b/src/main/resources/assets/liquidbounce/lang/ua_ua.json index 499949cb733..dc0a6e869d2 100644 --- a/src/main/resources/assets/liquidbounce/lang/ua_ua.json +++ b/src/main/resources/assets/liquidbounce/lang/ua_ua.json @@ -505,5 +505,6 @@ "liquidbounce.module.autoShop.description": "Опис автоматичного магазину", "liquidbounce.module.autoShop.messages.reloadSuccess": "Перезавантаження успішне", "liquidbounce.module.autoShop.messages.loadError": "Помилка завантаження", + "liquidbounce.module.betterTab.description": "Різноманітні покращення списку вкладок.", "liquidbounce.module.autoPearl.description": "Прицілюється та кидає перлину по траєкторії ворожої перлини." } diff --git a/src/main/resources/assets/liquidbounce/lang/zh_cn.json b/src/main/resources/assets/liquidbounce/lang/zh_cn.json index 0be83ac449d..33c6846bdf8 100644 --- a/src/main/resources/assets/liquidbounce/lang/zh_cn.json +++ b/src/main/resources/assets/liquidbounce/lang/zh_cn.json @@ -617,5 +617,6 @@ "liquidbounce.module.surround.description": "自动在周围建造安全方块,保护你免受爆炸伤害。", "liquidbounce.module.packetMine.description": "使你能通过单次点击破坏方块。", "liquidbounce.module.fastExp.description": "自动用经验瓶修复你的装备。", + "liquidbounce.module.betterTab.description": "对标签列表进行了多项改进。", "liquidbounce.module.autoPearl.description": "瞄准并向敌方珍珠的轨迹投掷一颗珍珠。" }