From 67939a1dc66ff5145f92b84800a15e3a878be986 Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Sun, 2 Nov 2025 20:21:35 +0000 Subject: [PATCH 01/72] Add our own custom translation system Reorganised the translation files and keys. Lots of work still to be done to change our hardcoded strings into translatable ones. We should no longer be susceptible to detection by servers using the translation exploit. --- .../mixin/AbstractSignEditScreenMixin.java | 47 -------- .../mixin/ControlListWidgetMixin.java | 25 ++++ .../meteorclient/mixin/DownloaderMixin.java | 7 +- .../mixin/KeyBindingCategoryMixin.java | 30 +++++ .../mixin/LanguageManagerMixin.java | 21 ++++ .../utils/misc/MeteorTranslations.java | 113 ++++++++++++++++++ .../utils/misc/input/KeyBinds.java | 14 ++- .../assets/meteor-client/lang/en_gb.json | 5 - .../assets/meteor-client/lang/en_us.json | 5 - .../assets/meteor-client/lang/hi_in.json | 4 - .../assets/meteor-client/lang/pt_br.json | 4 - .../assets/meteor-client/lang/vi_vn.json | 4 - .../assets/meteor-client/lang/zh_cn.json | 4 - .../assets/meteor-client/language/en_gb.json | 5 + .../assets/meteor-client/language/en_us.json | 5 + .../assets/meteor-client/language/hi_in.json | 4 + .../assets/meteor-client/language/pt_br.json | 4 + .../assets/meteor-client/language/vi_vn.json | 4 + .../assets/meteor-client/language/zh_cn.json | 4 + src/main/resources/meteor-client.mixins.json | 4 +- 20 files changed, 230 insertions(+), 83 deletions(-) delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignEditScreenMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/ControlListWidgetMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/KeyBindingCategoryMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/LanguageManagerMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java delete mode 100644 src/main/resources/assets/meteor-client/lang/en_gb.json delete mode 100644 src/main/resources/assets/meteor-client/lang/en_us.json delete mode 100644 src/main/resources/assets/meteor-client/lang/hi_in.json delete mode 100644 src/main/resources/assets/meteor-client/lang/pt_br.json delete mode 100644 src/main/resources/assets/meteor-client/lang/vi_vn.json delete mode 100644 src/main/resources/assets/meteor-client/lang/zh_cn.json create mode 100644 src/main/resources/assets/meteor-client/language/en_gb.json create mode 100644 src/main/resources/assets/meteor-client/language/en_us.json create mode 100644 src/main/resources/assets/meteor-client/language/hi_in.json create mode 100644 src/main/resources/assets/meteor-client/language/pt_br.json create mode 100644 src/main/resources/assets/meteor-client/language/vi_vn.json create mode 100644 src/main/resources/assets/meteor-client/language/zh_cn.json diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignEditScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignEditScreenMixin.java deleted file mode 100644 index 68cb072b41..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignEditScreenMixin.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.mixin; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import net.minecraft.client.gui.screen.ingame.AbstractSignEditScreen; -import net.minecraft.text.*; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; - -import java.util.stream.Stream; - -@Mixin(AbstractSignEditScreen.class) -public abstract class AbstractSignEditScreenMixin { - @ModifyExpressionValue(method = "(Lnet/minecraft/block/entity/SignBlockEntity;ZZLnet/minecraft/text/Text;)V", at = @At(value = "INVOKE", target = "Ljava/util/stream/IntStream;mapToObj(Ljava/util/function/IntFunction;)Ljava/util/stream/Stream;")) - private Stream modifyTranslatableText(Stream original) { - return original.map(this::modifyText); - } - - // based on https://github.com/JustAlittleWolf/ModDetectionPreventer - @Unique - private Text modifyText(Text message) { - MutableText modified = MutableText.of(message.getContent()); - - if (message.getContent() instanceof KeybindTextContent content) { - String key = content.getKey(); - - if (key.contains("meteor-client")) modified = MutableText.of(new PlainTextContent.Literal(key)); - } - if (message.getContent() instanceof TranslatableTextContent content) { - String key = content.getKey(); - - if (key.contains("meteor-client")) modified = MutableText.of(new PlainTextContent.Literal(key)); - } - - modified.setStyle(message.getStyle()); - for (Text sibling : message.getSiblings()) { - modified.append(modifyText(sibling)); - } - - return modified; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ControlListWidgetMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ControlListWidgetMixin.java new file mode 100644 index 0000000000..416e592ad6 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ControlListWidgetMixin.java @@ -0,0 +1,25 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.sugar.Local; +import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; +import net.minecraft.client.gui.screen.option.ControlsListWidget; +import net.minecraft.client.option.KeyBinding; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(ControlsListWidget.class) +public class ControlListWidgetMixin { + @ModifyExpressionValue(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/text/Text;translatable(Ljava/lang/String;)Lnet/minecraft/text/MutableText;")) + private MutableText modifyText(MutableText original, @Local KeyBinding binding) { + if (binding.getId().startsWith("meteor.key.")) return Text.literal(MeteorTranslations.translate(binding.getId())); + return original; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DownloaderMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DownloaderMixin.java index 85362f4815..1da0f0eb09 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DownloaderMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DownloaderMixin.java @@ -7,8 +7,8 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.sugar.Local; -import meteordevelopment.meteorclient.MeteorClient; import net.minecraft.util.Downloader; +import net.minecraft.util.Uuids; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -36,10 +36,7 @@ public class DownloaderMixin { @ModifyExpressionValue(method = "method_55485", at = @At(value = "INVOKE", target = "Ljava/nio/file/Path;resolve(Ljava/lang/String;)Ljava/nio/file/Path;")) private Path hookResolve(Path original, @Local(argsOnly = true) UUID id) { UUID accountId = mc.getSession().getUuidOrNull(); - if (accountId == null) { - MeteorClient.LOG.warn("Failed to change resource pack download directory because the account id is null."); - return original; - } + if (accountId == null) accountId = Uuids.getOfflinePlayerUuid(mc.getSession().getUsername()); return directory.resolve(accountId.toString()).resolve(id.toString()); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/KeyBindingCategoryMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/KeyBindingCategoryMixin.java new file mode 100644 index 0000000000..766945a158 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/KeyBindingCategoryMixin.java @@ -0,0 +1,30 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; +import net.minecraft.client.option.KeyBinding; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(KeyBinding.Category.class) +public class KeyBindingCategoryMixin { + @Shadow + @Final + private Identifier id; + + @ModifyReturnValue(method = "getLabel", at = @At("RETURN")) + private Text modifyLabel(Text original) { + if (id.getNamespace().equals(MeteorClient.MOD_ID)) return Text.literal(MeteorTranslations.translate(id.getPath())); + return original; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LanguageManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LanguageManagerMixin.java new file mode 100644 index 0000000000..228143cef8 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LanguageManagerMixin.java @@ -0,0 +1,21 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; +import net.minecraft.client.resource.language.LanguageManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(LanguageManager.class) +public class LanguageManagerMixin { + @Inject(method = "setLanguage", at = @At("TAIL")) + private void onSetLanguage(String languageCode, CallbackInfo ci) { + MeteorTranslations.loadLanguage(languageCode); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java new file mode 100644 index 0000000000..da77e861aa --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -0,0 +1,113 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.misc; + +import com.google.gson.Gson; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.utils.PreInit; +import net.minecraft.client.resource.language.ReorderingUtil; +import net.minecraft.text.OrderedText; +import net.minecraft.text.StringVisitable; +import net.minecraft.util.Language; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +public class MeteorTranslations { + private static final Gson GSON = new Gson(); + private static Map languages; + + @PreInit + public static void init() { + languages = new Object2ObjectOpenHashMap<>(); + List toLoad = new ArrayList<>(2); + toLoad.add("en_us"); + if (!mc.options.language.equalsIgnoreCase("en_us")) toLoad.add(mc.options.language); + + for (String language : toLoad) { + loadLanguage(language); + } + } + + public static void loadLanguage(String language) { + language = language.toLowerCase(); + if (languages.containsKey(language)) return; + + try (InputStream stream = MeteorTranslations.class.getResourceAsStream("/assets/meteor-client/language/" + language + ".json")) { + if (stream == null) { + if (language.equals("en_us")) throw new RuntimeException("Error loading the default language"); + else MeteorClient.LOG.error("Error loading language: {}", language); + return; + } + + // noinspection unchecked + Object2ObjectOpenHashMap map = GSON.fromJson(new InputStreamReader(stream), Object2ObjectOpenHashMap.class); + languages.put(language, new MeteorLanguage(map)); + + MeteorClient.LOG.info("Loaded language: {}", language); + } catch (IOException e) { + if (language.equals("en_us")) throw new RuntimeException(e); + else MeteorClient.LOG.error("Error loading language: {}", language, e); + } + } + + public static String translate(String key) { + if (!key.startsWith("meteor.")) key = "meteor." + key; + return _translate(key); + } + + private static String _translate(String key) { + MeteorLanguage currentLang = getCurrentLanguage(); + return currentLang.hasTranslation(key) ? currentLang.get(key) : getDefaultLanguage().get(key); + } + + public static MeteorLanguage getLanguage(String lang) { + return languages.get(lang); + } + + public static MeteorLanguage getCurrentLanguage() { + return languages.get(mc.options.language.toLowerCase()); + } + + public static MeteorLanguage getDefaultLanguage() { + return languages.get("en_us"); + } + + public static class MeteorLanguage extends Language { + private final Map translations; + + public MeteorLanguage(Map translations) { + this.translations = translations; + } + + @Override + public String get(String key, String fallback) { + return translations.getOrDefault(key, fallback); + } + + @Override + public boolean hasTranslation(String key){ + return translations.containsKey(key); + } + + @Override + public boolean isRightToLeft() { + return false; + } + + @Override + public OrderedText reorder(StringVisitable text) { + return ReorderingUtil.reorder(text, false); + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java index 6830326c87..ca346284ad 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java @@ -11,16 +11,22 @@ import org.lwjgl.glfw.GLFW; public class KeyBinds { - private static final KeyBinding.Category CATEGORY = KeyBinding.Category.create(MeteorClient.identifier("meteor-client")); + /** + * see {@link meteordevelopment.meteorclient.mixin.KeyBindingCategoryMixin} + */ + private static final KeyBinding.Category CATEGORY = KeyBinding.Category.create(MeteorClient.identifier("meteor.key.category")); - public static KeyBinding OPEN_GUI = new KeyBinding("key.meteor-client.open-gui", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_RIGHT_SHIFT, CATEGORY); - public static KeyBinding OPEN_COMMANDS = new KeyBinding("key.meteor-client.open-commands", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_PERIOD, CATEGORY); + /** + * see {@link meteordevelopment.meteorclient.mixin.ControlListWidgetMixin} + */ + public static KeyBinding OPEN_GUI = new KeyBinding("meteor.key.open-gui", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_RIGHT_SHIFT, CATEGORY); + public static KeyBinding OPEN_COMMANDS = new KeyBinding("meteor.key.open-commands", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_PERIOD, CATEGORY); private KeyBinds() { } public static KeyBinding[] apply(KeyBinding[] binds) { - // Add key binding + // Add key bindings KeyBinding[] newBinds = new KeyBinding[binds.length + 2]; System.arraycopy(binds, 0, newBinds, 0, binds.length); diff --git a/src/main/resources/assets/meteor-client/lang/en_gb.json b/src/main/resources/assets/meteor-client/lang/en_gb.json deleted file mode 100644 index 7b02207810..0000000000 --- a/src/main/resources/assets/meteor-client/lang/en_gb.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "key.meteor-client.open-gui": "Open GUI", - "key.meteor-client.open-commands": "Open Commands", - "key.category.meteor-client.meteor-client": "Meteor Client" -} diff --git a/src/main/resources/assets/meteor-client/lang/en_us.json b/src/main/resources/assets/meteor-client/lang/en_us.json deleted file mode 100644 index 7b02207810..0000000000 --- a/src/main/resources/assets/meteor-client/lang/en_us.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "key.meteor-client.open-gui": "Open GUI", - "key.meteor-client.open-commands": "Open Commands", - "key.category.meteor-client.meteor-client": "Meteor Client" -} diff --git a/src/main/resources/assets/meteor-client/lang/hi_in.json b/src/main/resources/assets/meteor-client/lang/hi_in.json deleted file mode 100644 index 991dfbf4ee..0000000000 --- a/src/main/resources/assets/meteor-client/lang/hi_in.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "key.meteor-client.open-gui": "GUI खोलें", - "key.meteor-client.open-commands": "कमांड खोलें" -} diff --git a/src/main/resources/assets/meteor-client/lang/pt_br.json b/src/main/resources/assets/meteor-client/lang/pt_br.json deleted file mode 100644 index 0056869be4..0000000000 --- a/src/main/resources/assets/meteor-client/lang/pt_br.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "key.meteor-client.open-gui": "Abrir Menu", - "key.meteor-client.open-commands": "Abrir Comandos" -} diff --git a/src/main/resources/assets/meteor-client/lang/vi_vn.json b/src/main/resources/assets/meteor-client/lang/vi_vn.json deleted file mode 100644 index 86372f9041..0000000000 --- a/src/main/resources/assets/meteor-client/lang/vi_vn.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "key.meteor-client.open-gui": "Mở giao diện", - "key.meteor-client.open-commands": "Mở lệnh" -} diff --git a/src/main/resources/assets/meteor-client/lang/zh_cn.json b/src/main/resources/assets/meteor-client/lang/zh_cn.json deleted file mode 100644 index 4c1eaa1207..0000000000 --- a/src/main/resources/assets/meteor-client/lang/zh_cn.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "key.meteor-client.open-gui": "打开GUI", - "key.meteor-client.open-commands": "输入命令" -} diff --git a/src/main/resources/assets/meteor-client/language/en_gb.json b/src/main/resources/assets/meteor-client/language/en_gb.json new file mode 100644 index 0000000000..7dc5eb6bfc --- /dev/null +++ b/src/main/resources/assets/meteor-client/language/en_gb.json @@ -0,0 +1,5 @@ +{ + "meteor.key.category": "Meteor Client", + "meteor.key.open-gui": "Open GUI", + "meteor.key.open-commands": "Open Commands" +} diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json new file mode 100644 index 0000000000..7dc5eb6bfc --- /dev/null +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -0,0 +1,5 @@ +{ + "meteor.key.category": "Meteor Client", + "meteor.key.open-gui": "Open GUI", + "meteor.key.open-commands": "Open Commands" +} diff --git a/src/main/resources/assets/meteor-client/language/hi_in.json b/src/main/resources/assets/meteor-client/language/hi_in.json new file mode 100644 index 0000000000..563d10c7b6 --- /dev/null +++ b/src/main/resources/assets/meteor-client/language/hi_in.json @@ -0,0 +1,4 @@ +{ + "meteor.key.open-gui": "GUI खोलें", + "meteor.key.open-commands": "कमांड खोलें" +} diff --git a/src/main/resources/assets/meteor-client/language/pt_br.json b/src/main/resources/assets/meteor-client/language/pt_br.json new file mode 100644 index 0000000000..8a593c9df3 --- /dev/null +++ b/src/main/resources/assets/meteor-client/language/pt_br.json @@ -0,0 +1,4 @@ +{ + "meteor.key.open-gui": "Abrir Menu", + "meteor.key.open-commands": "Abrir Comandos" +} diff --git a/src/main/resources/assets/meteor-client/language/vi_vn.json b/src/main/resources/assets/meteor-client/language/vi_vn.json new file mode 100644 index 0000000000..eec2d74d6c --- /dev/null +++ b/src/main/resources/assets/meteor-client/language/vi_vn.json @@ -0,0 +1,4 @@ +{ + "meteor.key.open-gui": "Mở giao diện", + "meteor.key.open-commands": "Mở lệnh" +} diff --git a/src/main/resources/assets/meteor-client/language/zh_cn.json b/src/main/resources/assets/meteor-client/language/zh_cn.json new file mode 100644 index 0000000000..6ca1f878e0 --- /dev/null +++ b/src/main/resources/assets/meteor-client/language/zh_cn.json @@ -0,0 +1,4 @@ +{ + "meteor.key.open-gui": "打开GUI", + "meteor.key.open-commands": "输入命令" +} diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index 039572d42c..991ca13042 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -14,7 +14,6 @@ "AbstractFurnaceScreenMixin", "AbstractSignBlockEntityRendererMixin", "AbstractSignEditScreenAccessor", - "AbstractSignEditScreenMixin", "ArmorFeatureRendererMixin", "BakedQuadMixin", "BannerBlockEntityRendererMixin", @@ -67,6 +66,7 @@ "ConnectScreenMixin", "ContainerComponentAccessor", "ContainerComponentMixin", + "ControlListWidgetMixin", "CrashReportMixin", "CreativeInventoryScreenAccessor", "CreativeSlotMixin", @@ -116,8 +116,10 @@ "ItemRenderStateAccessor", "ItemStackMixin", "KeyBindingAccessor", + "KeyBindingCategoryMixin", "KeyboardInputMixin", "KeyboardMixin", + "LanguageManagerMixin", "LayerRenderStateAccessor", "LightmapTextureManagerMixin", "LightningEntityRendererMixin", From 49a2a44f3233e65d23f556454d8e13467747bc87 Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Mon, 3 Nov 2025 01:35:09 +0000 Subject: [PATCH 02/72] Add a method for addons to provide their own language files to be used by the translation system --- .../meteorclient/addons/MeteorAddon.java | 11 +++ .../utils/misc/MeteorTranslations.java | 83 ++++++++++++++----- 2 files changed, 72 insertions(+), 22 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/addons/MeteorAddon.java b/src/main/java/meteordevelopment/meteorclient/addons/MeteorAddon.java index 8499e60521..c89f917b67 100644 --- a/src/main/java/meteordevelopment/meteorclient/addons/MeteorAddon.java +++ b/src/main/java/meteordevelopment/meteorclient/addons/MeteorAddon.java @@ -7,6 +7,8 @@ import meteordevelopment.meteorclient.utils.render.color.Color; +import java.io.InputStream; + public abstract class MeteorAddon { /** This field is automatically assigned from fabric.mod.json file. */ public String name; @@ -34,4 +36,13 @@ public GithubRepo getRepo() { public String getCommit() { return null; } + + /** + * @param lang A language code in lowercase + * @return An InputStream for the relevant json translation file, or null if the addon doesn't have + * a file for that language. + */ + public InputStream provideLanguage(String lang) { + return null; + } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index da77e861aa..f75cb38a19 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -7,7 +7,10 @@ import com.google.gson.Gson; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.addons.AddonManager; +import meteordevelopment.meteorclient.addons.MeteorAddon; import meteordevelopment.meteorclient.utils.PreInit; import net.minecraft.client.resource.language.ReorderingUtil; import net.minecraft.text.OrderedText; @@ -25,11 +28,10 @@ public class MeteorTranslations { private static final Gson GSON = new Gson(); - private static Map languages; + private static final Map languages = new Object2ObjectOpenHashMap<>(); @PreInit - public static void init() { - languages = new Object2ObjectOpenHashMap<>(); + public static void preInit() { List toLoad = new ArrayList<>(2); toLoad.add("en_us"); if (!mc.options.language.equalsIgnoreCase("en_us")) toLoad.add(mc.options.language); @@ -39,34 +41,47 @@ public static void init() { } } - public static void loadLanguage(String language) { - language = language.toLowerCase(); - if (languages.containsKey(language)) return; + public static void loadLanguage(String languageCode) { + languageCode = languageCode.toLowerCase(); + if (languages.containsKey(languageCode)) return; - try (InputStream stream = MeteorTranslations.class.getResourceAsStream("/assets/meteor-client/language/" + language + ".json")) { + try (InputStream stream = MeteorTranslations.class.getResourceAsStream("/assets/meteor-client/language/" + languageCode + ".json")) { if (stream == null) { - if (language.equals("en_us")) throw new RuntimeException("Error loading the default language"); - else MeteorClient.LOG.error("Error loading language: {}", language); + if (languageCode.equals("en_us")) throw new RuntimeException("Error loading the default language"); + else MeteorClient.LOG.info("No language file found for '{}'", languageCode); return; } // noinspection unchecked Object2ObjectOpenHashMap map = GSON.fromJson(new InputStreamReader(stream), Object2ObjectOpenHashMap.class); - languages.put(language, new MeteorLanguage(map)); + languages.put(languageCode, new MeteorLanguage(map)); - MeteorClient.LOG.info("Loaded language: {}", language); + MeteorClient.LOG.info("Loaded language: {}", languageCode); } catch (IOException e) { - if (language.equals("en_us")) throw new RuntimeException(e); - else MeteorClient.LOG.error("Error loading language: {}", language, e); + if (languageCode.equals("en_us")) throw new RuntimeException(e); + else MeteorClient.LOG.error("Error loading language: {}", languageCode, e); } - } - public static String translate(String key) { - if (!key.startsWith("meteor.")) key = "meteor." + key; - return _translate(key); + for (MeteorAddon addon : AddonManager.ADDONS) { + if (addon == MeteorClient.ADDON) continue; + + try (InputStream stream = addon.provideLanguage(languageCode)) { + if (stream == null) continue; + MeteorLanguage lang = languages.getOrDefault(languageCode, new MeteorLanguage()); + + // noinspection unchecked + Object2ObjectOpenHashMap map = GSON.fromJson(new InputStreamReader(stream), Object2ObjectOpenHashMap.class); + lang.addCustomTranslation(map); + languages.put(languageCode, lang); + + MeteorClient.LOG.info("Loaded language {} from addon {}", languageCode, addon.name); + } catch (IOException e) { + MeteorClient.LOG.error("Error loading language {} from addon {}", languageCode, addon.name, e); + } + } } - private static String _translate(String key) { + public static String translate(String key) { MeteorLanguage currentLang = getCurrentLanguage(); return currentLang.hasTranslation(key) ? currentLang.get(key) : getDefaultLanguage().get(key); } @@ -76,7 +91,7 @@ public static MeteorLanguage getLanguage(String lang) { } public static MeteorLanguage getCurrentLanguage() { - return languages.get(mc.options.language.toLowerCase()); + return languages.getOrDefault(mc.options.language.toLowerCase(), getDefaultLanguage()); } public static MeteorLanguage getDefaultLanguage() { @@ -85,19 +100,43 @@ public static MeteorLanguage getDefaultLanguage() { public static class MeteorLanguage extends Language { private final Map translations; + private final List> customTranslations = new ObjectArrayList<>(); + + public MeteorLanguage() { + this.translations = new Object2ObjectOpenHashMap<>(); + } public MeteorLanguage(Map translations) { this.translations = translations; } + @SuppressWarnings("unused") + public void addCustomTranslation(Map customTranslation) { + if (customTranslations.contains(customTranslation)) return; + + customTranslations.add(customTranslation); + } + @Override public String get(String key, String fallback) { - return translations.getOrDefault(key, fallback); + if (translations.containsKey(key)) return translations.get(key); + + for (Map customTranslation : customTranslations) { + if (customTranslation.containsKey(key)) return customTranslation.get(key); + } + + return fallback; } @Override - public boolean hasTranslation(String key){ - return translations.containsKey(key); + public boolean hasTranslation(String key) { + if (translations.containsKey(key)) return true; + + for (Map customTranslation : customTranslations) { + if (customTranslation.containsKey(key)) return true; + } + + return false; } @Override From e5afd008af7a401e52a5d6e70221fa7bccf550c3 Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Mon, 3 Nov 2025 01:59:20 +0000 Subject: [PATCH 03/72] Fix loading addon translations and add more documentation --- .../meteorclient/addons/MeteorAddon.java | 13 +++++++++++++ .../utils/misc/MeteorTranslations.java | 14 +++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/addons/MeteorAddon.java b/src/main/java/meteordevelopment/meteorclient/addons/MeteorAddon.java index c89f917b67..7ae5918d6f 100644 --- a/src/main/java/meteordevelopment/meteorclient/addons/MeteorAddon.java +++ b/src/main/java/meteordevelopment/meteorclient/addons/MeteorAddon.java @@ -38,6 +38,19 @@ public String getCommit() { } /** + * Example implementation: + *
{@code
+     *  @Override
+     *  public InputStream provideLanguage(String lang) {
+     *      return Addon.class.getResourceAsStream("/assets/addon-name/language/" + lang + ".json")
+     *  }
+     * }
+     * 

+ * + * Addons should not store their language files in the /assets/xxx/lang/ path as it opens up users to detection + * by servers via the translation exploit. + * Storing them anywhere else should prevent them from getting picked up via the vanilla resource loader. + * * @param lang A language code in lowercase * @return An InputStream for the relevant json translation file, or null if the addon doesn't have * a file for that language. diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index f75cb38a19..c2142b5823 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -26,6 +26,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; +@SuppressWarnings("unused") public class MeteorTranslations { private static final Gson GSON = new Gson(); private static final Map languages = new Object2ObjectOpenHashMap<>(); @@ -49,14 +50,14 @@ public static void loadLanguage(String languageCode) { if (stream == null) { if (languageCode.equals("en_us")) throw new RuntimeException("Error loading the default language"); else MeteorClient.LOG.info("No language file found for '{}'", languageCode); - return; } + else { + // noinspection unchecked + Object2ObjectOpenHashMap map = GSON.fromJson(new InputStreamReader(stream), Object2ObjectOpenHashMap.class); + languages.put(languageCode, new MeteorLanguage(map)); - // noinspection unchecked - Object2ObjectOpenHashMap map = GSON.fromJson(new InputStreamReader(stream), Object2ObjectOpenHashMap.class); - languages.put(languageCode, new MeteorLanguage(map)); - - MeteorClient.LOG.info("Loaded language: {}", languageCode); + MeteorClient.LOG.info("Loaded language: {}", languageCode); + } } catch (IOException e) { if (languageCode.equals("en_us")) throw new RuntimeException(e); else MeteorClient.LOG.error("Error loading language: {}", languageCode, e); @@ -110,7 +111,6 @@ public MeteorLanguage(Map translations) { this.translations = translations; } - @SuppressWarnings("unused") public void addCustomTranslation(Map customTranslation) { if (customTranslations.contains(customTranslation)) return; From f4035ea5962bae1efd40d3586af8920058865577 Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Mon, 3 Nov 2025 14:30:22 +0000 Subject: [PATCH 04/72] Extract command descriptions into translatable components --- .../meteorclient/commands/Command.java | 14 ++++++- .../commands/commands/BindCommand.java | 2 +- .../commands/commands/BindsCommand.java | 2 +- .../commands/commands/DismountCommand.java | 2 +- .../commands/commands/DropCommand.java | 2 +- .../commands/commands/EnchantCommand.java | 2 +- .../commands/commands/FakePlayerCommand.java | 2 +- .../commands/commands/FovCommand.java | 2 +- .../commands/commands/FriendsCommand.java | 2 +- .../commands/commands/GiveCommand.java | 2 +- .../commands/commands/HClipCommand.java | 2 +- .../commands/commands/InputCommand.java | 2 +- .../commands/commands/MacroCommand.java | 2 +- .../commands/commands/NbtCommand.java | 2 +- .../commands/commands/NotebotCommand.java | 2 +- .../commands/commands/PeekCommand.java | 2 +- .../commands/commands/ProfilesCommand.java | 2 +- .../commands/commands/ReloadCommand.java | 2 +- .../commands/commands/ResetCommand.java | 2 +- .../commands/commands/RotationCommand.java | 2 +- .../commands/commands/SayCommand.java | 2 +- .../commands/commands/ServerCommand.java | 2 +- .../commands/commands/SpectateCommand.java | 2 +- .../commands/commands/SwarmCommand.java | 2 +- .../commands/commands/VClipCommand.java | 2 +- .../commands/commands/WaspCommand.java | 2 +- .../utils/misc/MeteorTranslations.java | 7 +++- .../assets/meteor-client/language/en_gb.json | 41 ++++++++++++++++++- .../assets/meteor-client/language/en_us.json | 41 ++++++++++++++++++- 29 files changed, 123 insertions(+), 30 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/Command.java b/src/main/java/meteordevelopment/meteorclient/commands/Command.java index 18fea76782..c61ffc4357 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/Command.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/Command.java @@ -12,6 +12,7 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.utils.Utils; +import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.client.MinecraftClient; import net.minecraft.command.CommandRegistryAccess; @@ -32,13 +33,22 @@ public abstract class Command { private final String description; private final List aliases; + // todo remove in the next minecraft version update + @Deprecated(forRemoval = true) public Command(String name, String description, String... aliases) { this.name = name; this.title = Utils.nameToTitle(name); - this.description = description; + this.description = "meteor.command." + name + ".description"; this.aliases = List.of(aliases); } + public Command(String name) { + this.name = name; + this.title = Utils.nameToTitle(name); + this.description = "meteor.command." + name + ".description"; + this.aliases = List.of(); + } + // Helper methods to painlessly infer the CommandSource generic type argument protected static RequiredArgumentBuilder argument(final String name, final ArgumentType type) { return RequiredArgumentBuilder.argument(name, type); @@ -66,7 +76,7 @@ public String getName() { } public String getDescription() { - return description; + return MeteorTranslations.translate(description); } public List getAliases() { diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java index 3ef50aa80d..98302c02fd 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java @@ -14,7 +14,7 @@ public class BindCommand extends Command { public BindCommand() { - super("bind", "Binds a specified module to the next pressed key."); + super("bind"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java index 0bc90a5ea4..d21e6352d7 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java @@ -21,7 +21,7 @@ public class BindsCommand extends Command { public BindsCommand() { - super("binds", "List of all bound modules."); + super("binds"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DismountCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DismountCommand.java index 1cbdfb84cd..78253c2e8c 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DismountCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DismountCommand.java @@ -13,7 +13,7 @@ public class DismountCommand extends Command { public DismountCommand() { - super("dismount", "Dismounts you from entity you are riding."); + super("dismount"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java index 4816bedd09..e6d7c202c4 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java @@ -26,7 +26,7 @@ public class DropCommand extends Command { private static final SimpleCommandExceptionType NO_SUCH_ITEM = new SimpleCommandExceptionType(Text.literal("Could not find an item with that name!")); public DropCommand() { - super("drop", "Automatically drops specified items."); + super("drop"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java index 7eb9e6b584..6d4f03279a 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java @@ -28,7 +28,7 @@ public class EnchantCommand extends Command { private static final SimpleCommandExceptionType NOT_HOLDING_ITEM = new SimpleCommandExceptionType(Text.literal("You need to hold some item to enchant.")); public EnchantCommand() { - super("enchant", "Enchants the item in your hand. REQUIRES Creative mode."); + super("enchant"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java index 5374e1f503..8806330029 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java @@ -18,7 +18,7 @@ public class FakePlayerCommand extends Command { public FakePlayerCommand() { - super("fake-player", "Manages fake players that you can use for testing."); + super("fake-player"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FovCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FovCommand.java index dd612d030a..bf5aef1948 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FovCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FovCommand.java @@ -13,7 +13,7 @@ public class FovCommand extends Command { public FovCommand() { - super("fov", "Changes your fov."); + super("fov"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java index 23ae209cad..84d12f56c6 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java @@ -18,7 +18,7 @@ public class FriendsCommand extends Command { public FriendsCommand() { - super("friends", "Manages friends."); + super("friends"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java index 94150a58b7..fa802ede81 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java @@ -23,7 +23,7 @@ public class GiveCommand extends Command { private final static SimpleCommandExceptionType NO_SPACE = new SimpleCommandExceptionType(Text.literal("No space in hotbar.")); public GiveCommand() { - super("give", "Gives you any item."); + super("give"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/HClipCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/HClipCommand.java index 2af1daa8f3..11528ac7cf 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/HClipCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/HClipCommand.java @@ -14,7 +14,7 @@ public class HClipCommand extends Command { public HClipCommand() { - super("hclip", "Lets you clip through blocks horizontally."); + super("hclip"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java index e453767910..c16e3745da 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java @@ -41,7 +41,7 @@ public class InputCommand extends Command { ); public InputCommand() { - super("input", "Keyboard input simulation."); + super("input"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/MacroCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/MacroCommand.java index 074c9eae8d..22c899af11 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/MacroCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/MacroCommand.java @@ -21,7 +21,7 @@ public class MacroCommand extends Command { public MacroCommand() { - super("macro", "Allows you to execute macros."); + super("macro"); MeteorClient.EVENT_BUS.subscribe(this); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java index 1eea843b3a..667b28c421 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java @@ -51,7 +51,7 @@ public class NbtCommand extends Command { ))); public NbtCommand() { - super("nbt", "Modifies NBT data for an item, example: .nbt add {display:{Name:'{\"text\":\"$cRed Name\"}'}}"); + super("nbt"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java index ee791ce2fc..cf6822fb2e 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java @@ -41,7 +41,7 @@ public class NotebotCommand extends Command { private final Map> song = new HashMap<>(); // tick -> notes public NotebotCommand() { - super("notebot", "Allows you load notebot files"); + super("notebot"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java index 52e9761622..77d2ac6dcf 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java @@ -19,7 +19,7 @@ public class PeekCommand extends Command { private static final SimpleCommandExceptionType CANT_PEEK = new SimpleCommandExceptionType(Text.literal("You must be holding a storage block or looking at an item frame.")); public PeekCommand() { - super("peek", "Lets you see what's inside storage block items."); + super("peek"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java index 43c816f1c1..fa5ccf9412 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java @@ -15,7 +15,7 @@ public class ProfilesCommand extends Command { public ProfilesCommand() { - super("profiles", "Loads and saves profiles."); + super("profiles"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ReloadCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ReloadCommand.java index f299819854..3e7304c5a8 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ReloadCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ReloadCommand.java @@ -17,7 +17,7 @@ public class ReloadCommand extends Command { public ReloadCommand() { - super("reload", "Reloads many systems."); + super("reload"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java index 3377b7d7e1..d5cd90994e 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java @@ -19,7 +19,7 @@ public class ResetCommand extends Command { public ResetCommand() { - super("reset", "Resets specified settings."); + super("reset"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/RotationCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/RotationCommand.java index d9b3be2622..ec0aa00d1b 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/RotationCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/RotationCommand.java @@ -15,7 +15,7 @@ public class RotationCommand extends Command { public RotationCommand() { - super("rotation", "Modifies your rotation."); + super("rotation"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SayCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SayCommand.java index 102bc003fe..298a3512c0 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SayCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SayCommand.java @@ -23,7 +23,7 @@ public class SayCommand extends Command { public SayCommand() { - super("say", "Sends messages in chat."); + super("say"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java index c8441e85c0..969cdaa8b8 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java @@ -50,7 +50,7 @@ public class ServerCommand extends Command { public ServerCommand() { - super("server", "Prints server information"); + super("server"); MeteorClient.EVENT_BUS.subscribe(this); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SpectateCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SpectateCommand.java index d54ed7cce9..deefaa9f60 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SpectateCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SpectateCommand.java @@ -21,7 +21,7 @@ public class SpectateCommand extends Command { private final StaticListener shiftListener = new StaticListener(); public SpectateCommand() { - super("spectate", "Allows you to spectate nearby players"); + super("spectate"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java index 555b73793d..1b39b2b3d9 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java @@ -43,7 +43,7 @@ public class SwarmCommand extends Command { private @Nullable ObjectIntPair pendingConnection; public SwarmCommand() { - super("swarm", "Sends commands to connected swarm workers."); + super("swarm"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/VClipCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/VClipCommand.java index 13124e5a54..d1ee18751c 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/VClipCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/VClipCommand.java @@ -14,7 +14,7 @@ public class VClipCommand extends Command { public VClipCommand() { - super("vclip", "Lets you clip through blocks vertically."); + super("vclip"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java index 1b3fb81e6a..d5d9fb15eb 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java @@ -19,7 +19,7 @@ public class WaspCommand extends Command { private static final SimpleCommandExceptionType CANT_WASP_SELF = new SimpleCommandExceptionType(Text.literal("You cannot target yourself!")); public WaspCommand() { - super("wasp", "Sets the auto wasp target."); + super("wasp"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index c2142b5823..9558feba87 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -84,7 +84,12 @@ public static void loadLanguage(String languageCode) { public static String translate(String key) { MeteorLanguage currentLang = getCurrentLanguage(); - return currentLang.hasTranslation(key) ? currentLang.get(key) : getDefaultLanguage().get(key); + return currentLang.get(key, getDefaultLanguage().get(key)); + } + + public static String translate(String key, String fallback) { + MeteorLanguage currentLang = getCurrentLanguage(); + return currentLang.get(key, getDefaultLanguage().get(key, fallback)); } public static MeteorLanguage getLanguage(String lang) { diff --git a/src/main/resources/assets/meteor-client/language/en_gb.json b/src/main/resources/assets/meteor-client/language/en_gb.json index 7dc5eb6bfc..03d3bb501e 100644 --- a/src/main/resources/assets/meteor-client/language/en_gb.json +++ b/src/main/resources/assets/meteor-client/language/en_gb.json @@ -1,5 +1,44 @@ { "meteor.key.category": "Meteor Client", "meteor.key.open-gui": "Open GUI", - "meteor.key.open-commands": "Open Commands" + "meteor.key.open-commands": "Open Commands", + + "meteor.command.bind.description": "Binds a specified module to the next pressed key.", + "meteor.command.binds.description": "List of all bound modules.", + "meteor.command.commands.description": "List of all commands.", + "meteor.command.damage.description": "Damages self.", + "meteor.command.disconnect.description": "Disconnect from the server", + "meteor.command.dismount.description": "Dismounts you from entity you are riding.", + "meteor.command.drop.description": "Automatically drops specified items.", + "meteor.command.enchant.description": "Enchants the item in your hand. REQUIRES Creative mode.", + "meteor.command.ender-chest.description": "Allows you to preview memory of your ender chest.", + "meteor.command.fake-player.description": "Manages fake players that you can use for testing.", + "meteor.command.fov.description": "Changes your fov.", + "meteor.command.friends.description": "Manages friends.", + "meteor.command.gamemode.description": "Changes your gamemode client-side.", + "meteor.command.give.description": "Gives you any item.", + "meteor.command.hclip.description": "Lets you clip through blocks horizontally.", + "meteor.command.input.description": "Keyboard input simulation.", + "meteor.command.inventory.description": "Allows you to see parts of another player's inventory.", + "meteor.command.locate.description": "Locates structures", + "meteor.command.macro.description": "Allows you to execute macros.", + "meteor.command.modules.description": "Displays a list of all modules.", + "meteor.command.name-history.description": "Provides a list of a players previous names from the laby.net api", + "meteor.command.nbt.description": "Modifies NBT data for an item, example: .nbt add {display:{Name:'{\"text\":\"$cRed Name\"}'}}", + "meteor.command.notebot.description": "Allows you load notebot files", + "meteor.command.peek.description": "Lets you see what's inside storage block items.", + "meteor.command.profiles.description": "Loads and saves profiles.", + "meteor.command.reload.description": "Reloads many systems.", + "meteor.command.reset.description": "Resets specified settings.", + "meteor.command.rotation.description": "Modifies your rotation.", + "meteor.command.save-map.description": "Saves a map to an image.", + "meteor.command.say.description": "Sends messages in chat.", + "meteor.command.server.description": "Prints server information", + "meteor.command.hud.description": "Allows you to view and change module settings.", + "meteor.command.spectate.description": "Allows you to spectate nearby players", + "meteor.command.swarm.description": "Sends commands to connected swarm workers.", + "meteor.command.toggle.description": "Toggles a module.", + "meteor.command.vclip.description": "Lets you clip through blocks vertically.", + "meteor.command.wasp.description": "Sets the auto wasp target.", + "meteor.command.waypoint.description": "Manages waypoints." } diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index 7dc5eb6bfc..03d3bb501e 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -1,5 +1,44 @@ { "meteor.key.category": "Meteor Client", "meteor.key.open-gui": "Open GUI", - "meteor.key.open-commands": "Open Commands" + "meteor.key.open-commands": "Open Commands", + + "meteor.command.bind.description": "Binds a specified module to the next pressed key.", + "meteor.command.binds.description": "List of all bound modules.", + "meteor.command.commands.description": "List of all commands.", + "meteor.command.damage.description": "Damages self.", + "meteor.command.disconnect.description": "Disconnect from the server", + "meteor.command.dismount.description": "Dismounts you from entity you are riding.", + "meteor.command.drop.description": "Automatically drops specified items.", + "meteor.command.enchant.description": "Enchants the item in your hand. REQUIRES Creative mode.", + "meteor.command.ender-chest.description": "Allows you to preview memory of your ender chest.", + "meteor.command.fake-player.description": "Manages fake players that you can use for testing.", + "meteor.command.fov.description": "Changes your fov.", + "meteor.command.friends.description": "Manages friends.", + "meteor.command.gamemode.description": "Changes your gamemode client-side.", + "meteor.command.give.description": "Gives you any item.", + "meteor.command.hclip.description": "Lets you clip through blocks horizontally.", + "meteor.command.input.description": "Keyboard input simulation.", + "meteor.command.inventory.description": "Allows you to see parts of another player's inventory.", + "meteor.command.locate.description": "Locates structures", + "meteor.command.macro.description": "Allows you to execute macros.", + "meteor.command.modules.description": "Displays a list of all modules.", + "meteor.command.name-history.description": "Provides a list of a players previous names from the laby.net api", + "meteor.command.nbt.description": "Modifies NBT data for an item, example: .nbt add {display:{Name:'{\"text\":\"$cRed Name\"}'}}", + "meteor.command.notebot.description": "Allows you load notebot files", + "meteor.command.peek.description": "Lets you see what's inside storage block items.", + "meteor.command.profiles.description": "Loads and saves profiles.", + "meteor.command.reload.description": "Reloads many systems.", + "meteor.command.reset.description": "Resets specified settings.", + "meteor.command.rotation.description": "Modifies your rotation.", + "meteor.command.save-map.description": "Saves a map to an image.", + "meteor.command.say.description": "Sends messages in chat.", + "meteor.command.server.description": "Prints server information", + "meteor.command.hud.description": "Allows you to view and change module settings.", + "meteor.command.spectate.description": "Allows you to spectate nearby players", + "meteor.command.swarm.description": "Sends commands to connected swarm workers.", + "meteor.command.toggle.description": "Toggles a module.", + "meteor.command.vclip.description": "Lets you clip through blocks vertically.", + "meteor.command.wasp.description": "Sets the auto wasp target.", + "meteor.command.waypoint.description": "Manages waypoints." } From 5634110cf97284c6480998df34480eeb800df482 Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Mon, 3 Nov 2025 16:10:31 +0000 Subject: [PATCH 05/72] Add a text component for Meteor translations. Translations will be automatically updated when the user changes their language. --- .../meteorclient/commands/Command.java | 5 +- .../commands/commands/CommandsCommand.java | 3 +- .../utils/misc/MeteorTranslations.java | 21 ++++- .../text/MeteorTranslatableTextComponent.java | 76 +++++++++++++++++++ 4 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java diff --git a/src/main/java/meteordevelopment/meteorclient/commands/Command.java b/src/main/java/meteordevelopment/meteorclient/commands/Command.java index c61ffc4357..ccb23d2edb 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/Command.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/Command.java @@ -12,7 +12,6 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.utils.Utils; -import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.client.MinecraftClient; import net.minecraft.command.CommandRegistryAccess; @@ -33,7 +32,7 @@ public abstract class Command { private final String description; private final List aliases; - // todo remove in the next minecraft version update + // todo remove the description parameter in the next minecraft version update @Deprecated(forRemoval = true) public Command(String name, String description, String... aliases) { this.name = name; @@ -76,7 +75,7 @@ public String getName() { } public String getDescription() { - return MeteorTranslations.translate(description); + return description; } public List getAliases() { diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java index e35078c472..7202c01151 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java @@ -10,6 +10,7 @@ import meteordevelopment.meteorclient.commands.Commands; import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.utils.Utils; +import meteordevelopment.meteorclient.utils.misc.text.MeteorTranslatableTextComponent; import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.command.CommandSource; import net.minecraft.text.ClickEvent; @@ -53,7 +54,7 @@ private MutableText getCommandText(Command command) { } tooltip.append(aliases.formatted(Formatting.GRAY)).append("\n\n"); - tooltip.append(Text.literal(command.getDescription()).formatted(Formatting.WHITE)); + tooltip.append(MutableText.of(new MeteorTranslatableTextComponent(command.getDescription())).formatted(Formatting.WHITE)); // Text MutableText text = Text.literal(Utils.nameToTitle(command.getName())); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index 9558feba87..4d6604b538 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -21,6 +21,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; +import java.util.IllegalFormatException; import java.util.List; import java.util.Map; @@ -82,14 +83,26 @@ public static void loadLanguage(String languageCode) { } } - public static String translate(String key) { + public static String translate(String key, Object... args) { MeteorLanguage currentLang = getCurrentLanguage(); - return currentLang.get(key, getDefaultLanguage().get(key)); + String translated = currentLang.get(key, getDefaultLanguage().get(key)); + + try { + return String.format(translated, args); + } catch (IllegalFormatException e) { + return key; + } } - public static String translate(String key, String fallback) { + public static String translate(String key, String fallback, Object... args) { MeteorLanguage currentLang = getCurrentLanguage(); - return currentLang.get(key, getDefaultLanguage().get(key, fallback)); + String translated = currentLang.get(key, getDefaultLanguage().get(key, fallback)); + + try { + return String.format(translated, args); + } catch (IllegalFormatException e) { + return fallback; + } } public static MeteorLanguage getLanguage(String lang) { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java new file mode 100644 index 0000000000..4313da34f4 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java @@ -0,0 +1,76 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.misc.text; + +import com.mojang.serialization.MapCodec; +import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; +import net.minecraft.text.StringVisitable; +import net.minecraft.text.Style; +import net.minecraft.text.TextContent; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.Optional; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +public class MeteorTranslatableTextComponent implements TextContent { + private final String key; + @Nullable + private final String fallback; + private final Object[] args; + + private String translation; + private String cachedLanguage; + + public MeteorTranslatableTextComponent(String key, @Nullable String fallback, Object... args) { + this.key = key; + this.fallback = fallback; + this.args = args; + } + + public MeteorTranslatableTextComponent(String key) { + this(key, null); + } + + private void updateTranslations() { + if (!mc.options.language.equals(this.cachedLanguage)) { + cachedLanguage = mc.options.language; + translation = fallback == null ? MeteorTranslations.translate(key, args) : MeteorTranslations.translate(key, fallback, args); + } + } + + @Override + public Optional visit(StringVisitable.StyledVisitor visitor, Style style) { + updateTranslations(); + + return visitor.accept(style, translation); + } + + @Override + public Optional visit(StringVisitable.Visitor visitor) { + updateTranslations(); + + return visitor.accept(translation); + } + + @Override + public MapCodec getCodec() { + return null; + } + + @Override + public boolean equals(@Nullable Object o) { + if (this == o) return true; + if (!(o instanceof MeteorTranslatableTextComponent component)) return false; + return component.key.equals(this.key) && component.fallback.equals(this.fallback) && Arrays.equals(this.args, component.args); + } + + @Override + public String toString() { + return "MeteorTranslatableTextComponent[key=" + key + ", fallback=" + fallback + ", args=" + Arrays.toString(args) + "]"; + } +} From ffca0cb562c29474c2e66c2bbf9204c1837d9213 Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Thu, 6 Nov 2025 17:00:40 +0000 Subject: [PATCH 06/72] Assorted fixes and new additions Adds a label in the bottom right corner of the modules screen that can be clicked on to give translation information. --- .../meteorclient/MeteorClient.java | 10 ++++++ .../commands/commands/CommandsCommand.java | 4 +-- .../gui/screens/ModulesScreen.java | 31 +++++++++++++++++++ .../meteorclient/gui/widgets/WWidget.java | 2 +- .../utils/misc/MeteorTranslations.java | 24 +++++++++++--- .../text/MeteorTranslatableTextComponent.java | 7 +++-- .../assets/meteor-client/language/en_gb.json | 2 +- .../assets/meteor-client/language/en_us.json | 2 +- .../assets/meteor-client/language/hi_in.json | 2 ++ .../assets/meteor-client/language/pt_br.json | 2 ++ .../assets/meteor-client/language/vi_vn.json | 2 ++ .../assets/meteor-client/language/zh_cn.json | 2 ++ 12 files changed, 77 insertions(+), 13 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/MeteorClient.java b/src/main/java/meteordevelopment/meteorclient/MeteorClient.java index 2670ade9cc..f2ccda116b 100644 --- a/src/main/java/meteordevelopment/meteorclient/MeteorClient.java +++ b/src/main/java/meteordevelopment/meteorclient/MeteorClient.java @@ -27,6 +27,7 @@ import meteordevelopment.meteorclient.utils.misc.Version; import meteordevelopment.meteorclient.utils.misc.input.KeyAction; import meteordevelopment.meteorclient.utils.misc.input.KeyBinds; +import meteordevelopment.meteorclient.utils.misc.text.MeteorTranslatableTextComponent; import meteordevelopment.meteorclient.utils.network.OnlinePlayers; import meteordevelopment.orbit.EventBus; import meteordevelopment.orbit.EventHandler; @@ -37,6 +38,7 @@ import net.fabricmc.loader.api.metadata.ModMetadata; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.ChatScreen; +import net.minecraft.text.MutableText; import net.minecraft.util.Identifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -197,4 +199,12 @@ private void onOpenScreen(OpenScreenEvent event) { public static Identifier identifier(String path) { return Identifier.of(MeteorClient.MOD_ID, path); } + + public static MutableText translatable(String string, Object... args) { + return MutableText.of(new MeteorTranslatableTextComponent(string, args)); + } + + public static MutableText translatable(String string, String fallback, Object... args) { + return MutableText.of(new MeteorTranslatableTextComponent(string, fallback, args)); + } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java index 7202c01151..020fa30178 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java @@ -6,11 +6,11 @@ package meteordevelopment.meteorclient.commands.commands; import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.commands.Commands; import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.utils.Utils; -import meteordevelopment.meteorclient.utils.misc.text.MeteorTranslatableTextComponent; import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.command.CommandSource; import net.minecraft.text.ClickEvent; @@ -54,7 +54,7 @@ private MutableText getCommandText(Command command) { } tooltip.append(aliases.formatted(Formatting.GRAY)).append("\n\n"); - tooltip.append(MutableText.of(new MeteorTranslatableTextComponent(command.getDescription())).formatted(Formatting.WHITE)); + tooltip.append(MeteorClient.translatable(command.getDescription())).formatted(Formatting.WHITE); // Text MutableText text = Text.literal(Utils.nameToTitle(command.getName())); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java index 02c9c0e33a..b953816a8b 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java @@ -9,6 +9,7 @@ import meteordevelopment.meteorclient.gui.tabs.TabScreen; import meteordevelopment.meteorclient.gui.tabs.Tabs; import meteordevelopment.meteorclient.gui.utils.Cell; +import meteordevelopment.meteorclient.gui.widgets.WLabel; import meteordevelopment.meteorclient.gui.widgets.containers.WContainer; import meteordevelopment.meteorclient.gui.widgets.containers.WSection; import meteordevelopment.meteorclient.gui.widgets.containers.WVerticalList; @@ -18,13 +19,17 @@ import meteordevelopment.meteorclient.systems.modules.Category; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; import meteordevelopment.meteorclient.utils.misc.NbtUtils; +import meteordevelopment.meteorclient.utils.render.prompts.YesNoPrompt; import net.minecraft.item.Items; +import net.minecraft.util.Util; import java.util.ArrayList; import java.util.List; import java.util.Set; +import static meteordevelopment.meteorclient.MeteorClient.mc; import static meteordevelopment.meteorclient.utils.Utils.getWindowHeight; import static meteordevelopment.meteorclient.utils.Utils.getWindowWidth; @@ -43,6 +48,32 @@ public void initWidgets() { WVerticalList help = add(theme.verticalList()).pad(4).bottom().widget(); help.add(theme.label("Left click - Toggle module")); help.add(theme.label("Right click - Open module settings")); + + // Translation info + if (MeteorTranslations.isEnglish()) return; + double t = MeteorTranslations.percentLocalised(); + + WLabel translation = add(theme.label(String.format("%.1f%% translated", t))).pad(4).bottom().right().widget(); + translation.tooltip = "Open translation info"; + translation.instantTooltips = true; + translation.action = () -> { + // people who translate deserve their names recognised for it + String translators = MeteorTranslations.translate("meteor.lang.translators", ""); + // todo switch this to master before we merge + String url = "https://github.com/MeteorDevelopment/meteor-client/blob/translations/src/main/resources/assets/meteor-client/language/" + mc.options.language.toLowerCase() + ".json"; + + YesNoPrompt prompt = YesNoPrompt.create(theme, this) + .title("Translation Information") + .message("The current language (%s) is currently %.1f%% translated.", mc.options.language, t); + + if (!translators.isEmpty()) prompt.message("Translation work done by: " + translators + ".\n"); + + prompt.message("") + .message("Do you want to open the language file for the current language?") + .onYes(() -> Util.getOperatingSystem().open(url)) + .dontShowAgainCheckboxVisible(false) + .show(); + }; } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WWidget.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WWidget.java index c3286c2f36..a87b061696 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WWidget.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WWidget.java @@ -24,7 +24,7 @@ public abstract class WWidget implements BaseWidget { public String tooltip; public boolean mouseOver; - protected boolean instantTooltips; + public boolean instantTooltips; protected double mouseOverTimer; public void init() {} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index 4d6604b538..3b449ac3c7 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -117,16 +117,30 @@ public static MeteorLanguage getDefaultLanguage() { return languages.get("en_us"); } + /** + * @return what percentage of the current language has been localised compared to the default language + */ + public static double percentLocalised() { + // Right now there aren't enough differences between the english dialects to justify each having their own + // translation. Maybe that will change in the future. + if (isEnglish()) return 100; + + double currentLangSize = languages.getOrDefault(mc.options.language.toLowerCase(), new MeteorLanguage()).translations.size(); + return (currentLangSize / getDefaultLanguage().translations.size()) * 100; + } + + public static boolean isEnglish() { + return mc.options.language.toLowerCase().startsWith("en"); + } + public static class MeteorLanguage extends Language { - private final Map translations; + private final Map translations = new Object2ObjectOpenHashMap<>(); private final List> customTranslations = new ObjectArrayList<>(); - public MeteorLanguage() { - this.translations = new Object2ObjectOpenHashMap<>(); - } + public MeteorLanguage() {} public MeteorLanguage(Map translations) { - this.translations = translations; + this.translations.putAll(translations); } public void addCustomTranslation(Map customTranslation) { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java index 4313da34f4..10f568660e 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java @@ -13,6 +13,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Arrays; +import java.util.Objects; import java.util.Optional; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -32,8 +33,8 @@ public MeteorTranslatableTextComponent(String key, @Nullable String fallback, Ob this.args = args; } - public MeteorTranslatableTextComponent(String key) { - this(key, null); + public MeteorTranslatableTextComponent(String key, Object... args) { + this(key, null, args); } private void updateTranslations() { @@ -66,7 +67,7 @@ public MapCodec getCodec() { public boolean equals(@Nullable Object o) { if (this == o) return true; if (!(o instanceof MeteorTranslatableTextComponent component)) return false; - return component.key.equals(this.key) && component.fallback.equals(this.fallback) && Arrays.equals(this.args, component.args); + return Objects.equals(this.key, component.key) && Objects.equals(this.fallback, component.fallback) && Arrays.equals(this.args, component.args); } @Override diff --git a/src/main/resources/assets/meteor-client/language/en_gb.json b/src/main/resources/assets/meteor-client/language/en_gb.json index 03d3bb501e..ea3d85d40f 100644 --- a/src/main/resources/assets/meteor-client/language/en_gb.json +++ b/src/main/resources/assets/meteor-client/language/en_gb.json @@ -34,7 +34,7 @@ "meteor.command.save-map.description": "Saves a map to an image.", "meteor.command.say.description": "Sends messages in chat.", "meteor.command.server.description": "Prints server information", - "meteor.command.hud.description": "Allows you to view and change module settings.", + "meteor.command.settings.description": "Allows you to view and change module settings.", "meteor.command.spectate.description": "Allows you to spectate nearby players", "meteor.command.swarm.description": "Sends commands to connected swarm workers.", "meteor.command.toggle.description": "Toggles a module.", diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index 03d3bb501e..ea3d85d40f 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -34,7 +34,7 @@ "meteor.command.save-map.description": "Saves a map to an image.", "meteor.command.say.description": "Sends messages in chat.", "meteor.command.server.description": "Prints server information", - "meteor.command.hud.description": "Allows you to view and change module settings.", + "meteor.command.settings.description": "Allows you to view and change module settings.", "meteor.command.spectate.description": "Allows you to spectate nearby players", "meteor.command.swarm.description": "Sends commands to connected swarm workers.", "meteor.command.toggle.description": "Toggles a module.", diff --git a/src/main/resources/assets/meteor-client/language/hi_in.json b/src/main/resources/assets/meteor-client/language/hi_in.json index 563d10c7b6..47bce958f5 100644 --- a/src/main/resources/assets/meteor-client/language/hi_in.json +++ b/src/main/resources/assets/meteor-client/language/hi_in.json @@ -1,4 +1,6 @@ { + "meteor.lang.translators" : "devendrapoonia", + "meteor.key.open-gui": "GUI खोलें", "meteor.key.open-commands": "कमांड खोलें" } diff --git a/src/main/resources/assets/meteor-client/language/pt_br.json b/src/main/resources/assets/meteor-client/language/pt_br.json index 8a593c9df3..4a3ccf4e0f 100644 --- a/src/main/resources/assets/meteor-client/language/pt_br.json +++ b/src/main/resources/assets/meteor-client/language/pt_br.json @@ -1,4 +1,6 @@ { + "meteor.lang.translators": "Niix-Dan ", + "meteor.key.open-gui": "Abrir Menu", "meteor.key.open-commands": "Abrir Comandos" } diff --git a/src/main/resources/assets/meteor-client/language/vi_vn.json b/src/main/resources/assets/meteor-client/language/vi_vn.json index eec2d74d6c..dfd1122663 100644 --- a/src/main/resources/assets/meteor-client/language/vi_vn.json +++ b/src/main/resources/assets/meteor-client/language/vi_vn.json @@ -1,4 +1,6 @@ { + "meteor.lang.translators": "AnhNguyenlost13", + "meteor.key.open-gui": "Mở giao diện", "meteor.key.open-commands": "Mở lệnh" } diff --git a/src/main/resources/assets/meteor-client/language/zh_cn.json b/src/main/resources/assets/meteor-client/language/zh_cn.json index 6ca1f878e0..1a3140f140 100644 --- a/src/main/resources/assets/meteor-client/language/zh_cn.json +++ b/src/main/resources/assets/meteor-client/language/zh_cn.json @@ -1,4 +1,6 @@ { + "meteor.lang.translators": "Wuqibor, Enaium", + "meteor.key.open-gui": "打开GUI", "meteor.key.open-commands": "输入命令" } From c32946813ded3dd0d407ab1f4c315039bf49e698 Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Thu, 13 Nov 2025 21:08:07 +0000 Subject: [PATCH 07/72] Moved more strings from commands into the translation files This includes command exceptions and info/warning/error messages. Still more to be done for commands. This is a bit of a rough draft, if you have any ideas on how better to name or format this, open an issue or message me. --- .../meteorclient/MeteorClient.java | 8 ++-- .../meteorclient/commands/Command.java | 26 +++++++----- .../commands/commands/CommandsCommand.java | 3 +- .../commands/commands/DisconnectCommand.java | 2 +- .../commands/commands/DropCommand.java | 12 +++--- .../commands/commands/EnchantCommand.java | 6 +-- .../commands/commands/FakePlayerCommand.java | 7 ++-- .../commands/commands/GiveCommand.java | 6 +-- .../commands/commands/InputCommand.java | 14 +++---- .../commands/commands/MacroCommand.java | 8 ++-- .../commands/commands/NameHistoryCommand.java | 6 +-- .../commands/commands/ProfilesCommand.java | 6 +-- .../commands/commands/ReloadCommand.java | 2 +- .../commands/commands/SaveMapCommand.java | 40 +++++++++---------- .../commands/commands/WaspCommand.java | 6 +-- .../gui/screens/ModulesScreen.java | 2 +- .../mixin/ControlListWidgetMixin.java | 5 +-- .../mixin/KeyBindingCategoryMixin.java | 3 +- .../assets/meteor-client/language/en_gb.json | 32 ++++++++++++++- .../assets/meteor-client/language/en_us.json | 32 ++++++++++++++- .../assets/meteor-client/language/pt_br.json | 2 +- 21 files changed, 145 insertions(+), 83 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/MeteorClient.java b/src/main/java/meteordevelopment/meteorclient/MeteorClient.java index f2ccda116b..7fb667f368 100644 --- a/src/main/java/meteordevelopment/meteorclient/MeteorClient.java +++ b/src/main/java/meteordevelopment/meteorclient/MeteorClient.java @@ -200,11 +200,11 @@ public static Identifier identifier(String path) { return Identifier.of(MeteorClient.MOD_ID, path); } - public static MutableText translatable(String string, Object... args) { - return MutableText.of(new MeteorTranslatableTextComponent(string, args)); + public static MutableText translatable(String key, Object... args) { + return MutableText.of(new MeteorTranslatableTextComponent(key, args)); } - public static MutableText translatable(String string, String fallback, Object... args) { - return MutableText.of(new MeteorTranslatableTextComponent(string, fallback, args)); + public static MutableText translatable(String key, String fallback, Object... args) { + return MutableText.of(new MeteorTranslatableTextComponent(key, fallback, args)); } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/Command.java b/src/main/java/meteordevelopment/meteorclient/commands/Command.java index ccb23d2edb..424502a0be 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/Command.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/Command.java @@ -12,12 +12,14 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.utils.Utils; +import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.client.MinecraftClient; import net.minecraft.command.CommandRegistryAccess; import net.minecraft.command.CommandSource; import net.minecraft.registry.BuiltinRegistries; import net.minecraft.server.command.CommandManager; +import net.minecraft.text.MutableText; import net.minecraft.text.Text; import java.util.List; @@ -29,23 +31,23 @@ public abstract class Command { private final String name; private final String title; - private final String description; private final List aliases; + public final String translationKey; // todo remove the description parameter in the next minecraft version update @Deprecated(forRemoval = true) public Command(String name, String description, String... aliases) { this.name = name; this.title = Utils.nameToTitle(name); - this.description = "meteor.command." + name + ".description"; this.aliases = List.of(aliases); + this.translationKey = "meteor.command." + name; } public Command(String name) { this.name = name; this.title = Utils.nameToTitle(name); - this.description = "meteor.command." + name + ".description"; this.aliases = List.of(); + this.translationKey = "meteor.command." + name; } // Helper methods to painlessly infer the CommandSource generic type argument @@ -74,10 +76,6 @@ public String getName() { return name; } - public String getDescription() { - return description; - } - public List getAliases() { return aliases; } @@ -99,16 +97,24 @@ public void info(Text message) { public void info(String message, Object... args) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.infoPrefix(title, message, args); + ChatUtils.infoPrefix(title, MeteorTranslations.translate(translationKey + ".info." + message, message, args)); } public void warning(String message, Object... args) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.warningPrefix(title, message, args); + ChatUtils.warningPrefix(title, MeteorTranslations.translate(translationKey + ".warning." + message, message, args)); } public void error(String message, Object... args) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.errorPrefix(title, message, args); + ChatUtils.errorPrefix(title, MeteorTranslations.translate(translationKey + ".error." + message, message, args)); + } + + public MutableText translatable(String string, Object... args) { + return MeteorClient.translatable(translationKey + "." + string, args); + } + + public MutableText translatable(String string, String fallback, Object... args) { + return MeteorClient.translatable(translationKey + "." + string, fallback, args); } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java index 020fa30178..ca08d56e89 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java @@ -6,7 +6,6 @@ package meteordevelopment.meteorclient.commands.commands; import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.commands.Commands; import meteordevelopment.meteorclient.systems.config.Config; @@ -54,7 +53,7 @@ private MutableText getCommandText(Command command) { } tooltip.append(aliases.formatted(Formatting.GRAY)).append("\n\n"); - tooltip.append(MeteorClient.translatable(command.getDescription())).formatted(Formatting.WHITE); + tooltip.append(translatable("description")).formatted(Formatting.WHITE); // Text MutableText text = Text.literal(Utils.nameToTitle(command.getName())); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java index f43585276a..2ae2620ecf 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java @@ -21,7 +21,7 @@ public DisconnectCommand() { @Override public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { - mc.player.networkHandler.onDisconnect(new DisconnectS2CPacket(Text.literal("%s[%sDisconnectCommand%s] Disconnected by user.".formatted(Formatting.GRAY, Formatting.BLUE, Formatting.GRAY)))); + mc.player.networkHandler.onDisconnect(new DisconnectS2CPacket(translatable("disconnection_message", Formatting.GRAY, Formatting.BLUE, Formatting.GRAY))); return SINGLE_SUCCESS; }); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java index e6d7c202c4..e03c181216 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java @@ -10,6 +10,7 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.utils.player.InvUtils; import net.minecraft.client.network.ClientPlayerEntity; @@ -19,11 +20,10 @@ import net.minecraft.entity.EquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; -import net.minecraft.text.Text; public class DropCommand extends Command { - private static final SimpleCommandExceptionType NOT_SPECTATOR = new SimpleCommandExceptionType(Text.literal("Can't drop items while in spectator.")); - private static final SimpleCommandExceptionType NO_SUCH_ITEM = new SimpleCommandExceptionType(Text.literal("Could not find an item with that name!")); + private static final SimpleCommandExceptionType NOT_SPECTATOR = new SimpleCommandExceptionType(MeteorClient.translatable("meteor.command.drop.exception.not_spectator")); + private static final SimpleCommandExceptionType NO_SUCH_ITEM = new SimpleCommandExceptionType(MeteorClient.translatable("meteor.command.drop.exception.no_such_item")); public DropCommand() { super("drop"); @@ -70,9 +70,9 @@ public void build(LiteralArgumentBuilder builder) { // Specific item builder.then(argument("item", ItemStackArgumentType.itemStack(REGISTRY_ACCESS)) - .executes(context -> drop(player -> { - dropItem(player, context, Integer.MAX_VALUE); - })) + .executes(context -> drop(player -> + dropItem(player, context, Integer.MAX_VALUE) + )) .then(argument("amount", IntegerArgumentType.integer(1)) .executes(context -> drop(player -> { int amount = IntegerArgumentType.getInteger(context, "amount"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java index 6d4f03279a..d9dc46cb3c 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java @@ -10,6 +10,7 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.commands.arguments.RegistryEntryReferenceArgumentType; import meteordevelopment.meteorclient.utils.Utils; @@ -19,13 +20,12 @@ import net.minecraft.item.ItemStack; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.text.Text; import java.util.function.ToIntFunction; public class EnchantCommand extends Command { - private static final SimpleCommandExceptionType NOT_IN_CREATIVE = new SimpleCommandExceptionType(Text.literal("You must be in creative mode to use this.")); - private static final SimpleCommandExceptionType NOT_HOLDING_ITEM = new SimpleCommandExceptionType(Text.literal("You need to hold some item to enchant.")); + private static final SimpleCommandExceptionType NOT_IN_CREATIVE = new SimpleCommandExceptionType(MeteorClient.translatable("meteor.command.enchant.exception.not_in_creative")); + private static final SimpleCommandExceptionType NOT_HOLDING_ITEM = new SimpleCommandExceptionType(MeteorClient.translatable("meteor.command.enchant.exception.not_holding_item")); public EnchantCommand() { super("enchant"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java index 8806330029..09dd5e3797 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java @@ -13,7 +13,6 @@ import meteordevelopment.meteorclient.systems.modules.player.FakePlayer; import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity; import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerManager; -import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.command.CommandSource; public class FakePlayerCommand extends Command { @@ -43,12 +42,12 @@ public void build(LiteralArgumentBuilder builder) { .executes(context -> { FakePlayerEntity fp = FakePlayerArgumentType.get(context); if (fp == null || !FakePlayerManager.contains(fp)) { - error("Couldn't find a Fake Player with that name."); + error("not_found"); return SINGLE_SUCCESS; } FakePlayerManager.remove(fp); - info("Removed Fake Player %s.".formatted(fp.getName().getString())); + info("removed", fp.getName().getString()); return SINGLE_SUCCESS; }) @@ -65,7 +64,7 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("list") .executes(context -> { info("--- Fake Players ((highlight)%s(default)) ---", FakePlayerManager.count()); - FakePlayerManager.forEach(fp -> ChatUtils.info("(highlight)%s".formatted(fp.getName().getString()))); + FakePlayerManager.forEach(fp -> info("(highlight)%s".formatted(fp.getName().getString()))); return SINGLE_SUCCESS; }) ); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java index fa802ede81..83b4e8bc12 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java @@ -9,6 +9,7 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.utils.player.FindItemResult; import meteordevelopment.meteorclient.utils.player.InvUtils; @@ -16,11 +17,10 @@ import net.minecraft.command.argument.ItemStackArgumentType; import net.minecraft.item.ItemStack; import net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket; -import net.minecraft.text.Text; public class GiveCommand extends Command { - private final static SimpleCommandExceptionType NOT_IN_CREATIVE = new SimpleCommandExceptionType(Text.literal("You must be in creative mode to use this.")); - private final static SimpleCommandExceptionType NO_SPACE = new SimpleCommandExceptionType(Text.literal("No space in hotbar.")); + private final static SimpleCommandExceptionType NOT_IN_CREATIVE = new SimpleCommandExceptionType(MeteorClient.translatable("meteor.command.give.exception.not_in_creative")); + private final static SimpleCommandExceptionType NO_SPACE = new SimpleCommandExceptionType(MeteorClient.translatable("meteor.command.give.exception.no_space")); public GiveCommand() { super("give"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java index c16e3745da..add4cdbd37 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java @@ -76,9 +76,9 @@ public void build(LiteralArgumentBuilder builder) { } builder.then(literal("clear").executes(ctx -> { - if (activeHandlers.isEmpty()) warning("No active keypress handlers."); + if (activeHandlers.isEmpty()) warning("no_handlers"); else { - info("Cleared all keypress handlers."); + info("cleared_handlers"); activeHandlers.forEach(MeteorClient.EVENT_BUS::unsubscribe); activeHandlers.clear(); } @@ -86,12 +86,12 @@ public void build(LiteralArgumentBuilder builder) { })); builder.then(literal("list").executes(ctx -> { - if (activeHandlers.isEmpty()) warning("No active keypress handlers."); + if (activeHandlers.isEmpty()) warning("no_handlers"); else { - info("Active keypress handlers: "); + info(""); for (int i = 0; i < activeHandlers.size(); i++) { KeypressHandler handler = activeHandlers.get(i); - info("(highlight)%d(default) - (highlight)%s %d(default) ticks left out of (highlight)%d(default).", i, I18n.translate(handler.key.getId()), handler.ticks, handler.totalTicks); + info("keypress_handler", i, I18n.translate(handler.key.getId()), handler.ticks, handler.totalTicks); } } return SINGLE_SUCCESS; @@ -99,9 +99,9 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("remove").then(argument("index", IntegerArgumentType.integer(0)).executes(ctx -> { int index = IntegerArgumentType.getInteger(ctx, "index"); - if (index >= activeHandlers.size()) warning("Index out of range."); + if (index >= activeHandlers.size()) warning("out_of_range"); else { - info("Removed keypress handler."); + info("removed_handler"); MeteorClient.EVENT_BUS.unsubscribe(activeHandlers.get(index)); activeHandlers.remove(index); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/MacroCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/MacroCommand.java index 22c899af11..566cfb43e1 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/MacroCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/MacroCommand.java @@ -35,12 +35,12 @@ public void build(LiteralArgumentBuilder builder) { .then(literal("clear") .executes(context -> { if (scheduleQueue.isEmpty() && scheduledMacros.isEmpty()) { - error("No macros are currently scheduled."); + error("none_scheduled"); return SINGLE_SUCCESS; } clearAll(); - info("Cleared all scheduled macros."); + info("cleared_all"); return SINGLE_SUCCESS; }) @@ -49,12 +49,12 @@ public void build(LiteralArgumentBuilder builder) { Macro macro = MacroArgumentType.get(context); if (!isScheduled(macro)) { - error("This macro is not currently scheduled."); + error("not_scheduled"); return SINGLE_SUCCESS; } clear(macro); - info("Cleared scheduled macro."); + info("cleared"); return SINGLE_SUCCESS; }) ) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java index db1a317183..3a646a477c 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java @@ -38,13 +38,13 @@ public void build(LiteralArgumentBuilder builder) { UUID uuid = lookUpTarget.getProfile().id(); NameHistory history = Http.get("https://laby.net/api/v2/user/" + uuid + "/get-profile") - .exceptionHandler(e -> error("There was an error fetching that users name history.")) + .exceptionHandler(e -> error("error_fetching_name")) .sendJson(NameHistory.class); if (history == null) { return; } else if (history.username_history == null || history.username_history.length == 0) { - error("There was an error fetching that users name history."); + error("error_fetching_name"); } String name = lookUpTarget.getProfile().name(); @@ -85,7 +85,7 @@ public void build(LiteralArgumentBuilder builder) { if (!entry.accurate) { MutableText text = Text.literal("*").formatted(Formatting.WHITE); - text.setStyle(text.getStyle().withHoverEvent(new HoverEvent.ShowText(Text.literal("This name history entry is not accurate according to laby.net")))); + text.setStyle(text.getStyle().withHoverEvent(new HoverEvent.ShowText(translatable("inaccurate")))); nameText.append(text); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java index fa5ccf9412..f8b0b7c25d 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java @@ -25,7 +25,7 @@ public void build(LiteralArgumentBuilder builder) { if (profile != null) { profile.load(); - info("Loaded profile (highlight)%s(default).", profile.name.get()); + info("loaded", profile.name.get()); } return SINGLE_SUCCESS; @@ -36,7 +36,7 @@ public void build(LiteralArgumentBuilder builder) { if (profile != null) { profile.save(); - info("Saved profile (highlight)%s(default).", profile.name.get()); + info("saved", profile.name.get()); } return SINGLE_SUCCESS; @@ -47,7 +47,7 @@ public void build(LiteralArgumentBuilder builder) { if (profile != null) { Profiles.get().remove(profile); - info("Deleted profile (highlight)%s(default).", profile.name.get()); + info("deleted", profile.name.get()); } return SINGLE_SUCCESS; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ReloadCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ReloadCommand.java index 3e7304c5a8..4a66ff2272 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ReloadCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ReloadCommand.java @@ -23,7 +23,7 @@ public ReloadCommand() { @Override public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { - warning("Reloading systems, this may take a while."); + warning("reloading"); Systems.load(); Capes.init(); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java index e29c4f2f48..232ed70e9f 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java @@ -19,7 +19,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.map.MapState; -import net.minecraft.text.Text; import org.jetbrains.annotations.Nullable; import org.lwjgl.BufferUtils; import org.lwjgl.PointerBuffer; @@ -33,8 +32,8 @@ import java.nio.ByteBuffer; public class SaveMapCommand extends Command { - private static final SimpleCommandExceptionType MAP_NOT_FOUND = new SimpleCommandExceptionType(Text.literal("You must be holding a filled map.")); - private static final SimpleCommandExceptionType OOPS = new SimpleCommandExceptionType(Text.literal("Something went wrong.")); + private static final SimpleCommandExceptionType MAP_NOT_FOUND = new SimpleCommandExceptionType(MeteorClient.translatable("meteor.command.save-map.exception.map_not_found")); + private static final SimpleCommandExceptionType OOPS = new SimpleCommandExceptionType(MeteorClient.translatable("meteor.command.save-map.exception.oops")); private final PointerBuffer filters; @@ -72,24 +71,25 @@ private void saveMap(int scale) throws CommandSyntaxException { if (path == null) throw OOPS.create(); MapTextureManagerAccessor textureManager = (MapTextureManagerAccessor) mc.gameRenderer.getClient().getMapTextureManager(); - MapTextureManager.MapTexture texture = textureManager.meteor$invokeGetMapTexture(map.get(DataComponentTypes.MAP_ID), state); - if (texture.texture.getImage() == null) throw OOPS.create(); - - try { - if (scale == 128) texture.texture.getImage().writeTo(path); - else { - int[] data = texture.texture.getImage().makePixelArray(); - BufferedImage image = new BufferedImage(128, 128, BufferedImage.TYPE_INT_ARGB); - image.setRGB(0, 0, image.getWidth(), image.getHeight(), data, 0, 128); - - BufferedImage scaledImage = new BufferedImage(scale, scale, 2); - scaledImage.createGraphics().drawImage(image, 0, 0, scale, scale, null); - - ImageIO.write(scaledImage, "png", path); + try (MapTextureManager.MapTexture texture = textureManager.meteor$invokeGetMapTexture(map.get(DataComponentTypes.MAP_ID), state)) { + if (texture.texture.getImage() == null) throw OOPS.create(); + + try { + if (scale == 128) texture.texture.getImage().writeTo(path); + else { + int[] data = texture.texture.getImage().makePixelArray(); + BufferedImage image = new BufferedImage(128, 128, BufferedImage.TYPE_INT_ARGB); + image.setRGB(0, 0, image.getWidth(), image.getHeight(), data, 0, 128); + + BufferedImage scaledImage = new BufferedImage(scale, scale, 2); + scaledImage.createGraphics().drawImage(image, 0, 0, scale, scale, null); + + ImageIO.write(scaledImage, "png", path); + } + } catch (IOException e) { + error("error_writing_texture"); + MeteorClient.LOG.error(e.toString()); } - } catch (IOException e) { - error("Error writing map texture"); - MeteorClient.LOG.error(e.toString()); } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java index d5d9fb15eb..0f57375d76 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java @@ -7,16 +7,16 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.commands.arguments.PlayerArgumentType; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.AutoWasp; import net.minecraft.command.CommandSource; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.text.Text; public class WaspCommand extends Command { - private static final SimpleCommandExceptionType CANT_WASP_SELF = new SimpleCommandExceptionType(Text.literal("You cannot target yourself!")); + private static final SimpleCommandExceptionType CANT_WASP_SELF = new SimpleCommandExceptionType(MeteorClient.translatable("meteor.command.wasp.exception.cant_wasp_self")); public WaspCommand() { super("wasp"); @@ -38,7 +38,7 @@ public void build(LiteralArgumentBuilder builder) { wasp.target = player; if (!wasp.isActive()) wasp.toggle(); - info(player.getName().getString() + " set as target."); + info("target", player.getName().getString()); return SINGLE_SUCCESS; })); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java index b953816a8b..bd1f0bfbd3 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java @@ -66,7 +66,7 @@ public void initWidgets() { .title("Translation Information") .message("The current language (%s) is currently %.1f%% translated.", mc.options.language, t); - if (!translators.isEmpty()) prompt.message("Translation work done by: " + translators + ".\n"); + if (!translators.isEmpty()) prompt.message("Translation work done by: " + translators); prompt.message("") .message("Do you want to open the language file for the current language?") diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ControlListWidgetMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ControlListWidgetMixin.java index 416e592ad6..40bcc25ae7 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ControlListWidgetMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ControlListWidgetMixin.java @@ -7,11 +7,10 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.sugar.Local; -import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; +import meteordevelopment.meteorclient.MeteorClient; import net.minecraft.client.gui.screen.option.ControlsListWidget; import net.minecraft.client.option.KeyBinding; import net.minecraft.text.MutableText; -import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -19,7 +18,7 @@ public class ControlListWidgetMixin { @ModifyExpressionValue(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/text/Text;translatable(Ljava/lang/String;)Lnet/minecraft/text/MutableText;")) private MutableText modifyText(MutableText original, @Local KeyBinding binding) { - if (binding.getId().startsWith("meteor.key.")) return Text.literal(MeteorTranslations.translate(binding.getId())); + if (binding.getId().startsWith("meteor.key.")) return MeteorClient.translatable(binding.getId()); return original; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/KeyBindingCategoryMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/KeyBindingCategoryMixin.java index 766945a158..fcb1709e42 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/KeyBindingCategoryMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/KeyBindingCategoryMixin.java @@ -7,7 +7,6 @@ import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; import net.minecraft.client.option.KeyBinding; import net.minecraft.text.Text; import net.minecraft.util.Identifier; @@ -24,7 +23,7 @@ public class KeyBindingCategoryMixin { @ModifyReturnValue(method = "getLabel", at = @At("RETURN")) private Text modifyLabel(Text original) { - if (id.getNamespace().equals(MeteorClient.MOD_ID)) return Text.literal(MeteorTranslations.translate(id.getPath())); + if (id.getNamespace().equals(MeteorClient.MOD_ID)) return MeteorClient.translatable(id.getPath()); return original; } } diff --git a/src/main/resources/assets/meteor-client/language/en_gb.json b/src/main/resources/assets/meteor-client/language/en_gb.json index ea3d85d40f..35aa0b8e0c 100644 --- a/src/main/resources/assets/meteor-client/language/en_gb.json +++ b/src/main/resources/assets/meteor-client/language/en_gb.json @@ -1,37 +1,65 @@ { "meteor.key.category": "Meteor Client", - "meteor.key.open-gui": "Open GUI", "meteor.key.open-commands": "Open Commands", + "meteor.key.open-gui": "Open GUI", "meteor.command.bind.description": "Binds a specified module to the next pressed key.", "meteor.command.binds.description": "List of all bound modules.", "meteor.command.commands.description": "List of all commands.", "meteor.command.damage.description": "Damages self.", "meteor.command.disconnect.description": "Disconnect from the server", + "meteor.command.disconnect.disconnection_message": "%s[%sDisconnectCommand%s] Disconnected by user.", "meteor.command.dismount.description": "Dismounts you from entity you are riding.", "meteor.command.drop.description": "Automatically drops specified items.", + "meteor.command.drop.exception.no_such_item": "Could not find an item with that name!", + "meteor.command.drop.exception.not_spectator": "Can't drop items while in spectator.", "meteor.command.enchant.description": "Enchants the item in your hand. REQUIRES Creative mode.", + "meteor.command.enchant.exception.not_holding_item": "You need to hold some item to enchant.", + "meteor.command.enchant.exception.not_in_creative": "You must be in creative mode to use this.", "meteor.command.ender-chest.description": "Allows you to preview memory of your ender chest.", "meteor.command.fake-player.description": "Manages fake players that you can use for testing.", + "meteor.command.fake-player.error.not_found": "Couldn't find a Fake Player with that name.", + "meteor.command.fake-player.info.removed": "Removed Fake Player %s.", "meteor.command.fov.description": "Changes your fov.", "meteor.command.friends.description": "Manages friends.", "meteor.command.gamemode.description": "Changes your gamemode client-side.", "meteor.command.give.description": "Gives you any item.", + "meteor.command.give.exception.not_in_creative": "You must be in creative mode to use this.", + "meteor.command.give.exception.no_space": "No space in hotbar.", "meteor.command.hclip.description": "Lets you clip through blocks horizontally.", "meteor.command.input.description": "Keyboard input simulation.", + "meteor.command.input.info.cleared_handlers": "Cleared all keypress handlers.", + "meteor.command.input.info.active_handlers": "Active keypress handlers: ", + "meteor.command.input.info.keypress_handler": "(highlight)%d(default) - (highlight)%s %d(default) ticks left out of (highlight)%d(default).", + "meteor.command.input.info.removed_handler": "Removed keypress handler.", + "meteor.command.input.warning.no_handlers": "No active keypress handlers.", + "meteor.command.input.warning.out_of_range": "Index out of range.", "meteor.command.inventory.description": "Allows you to see parts of another player's inventory.", "meteor.command.locate.description": "Locates structures", "meteor.command.macro.description": "Allows you to execute macros.", + "meteor.command.macro.error.none_scheduled": "No macros are currently scheduled.", + "meteor.command.macro.error.not_scheduled": "This macro is not currently scheduled.", + "meteor.command.macro.info.cleared_all": "Cleared all scheduled macros.", + "meteor.command.macro.info.cleared": "Cleared scheduled macro.", "meteor.command.modules.description": "Displays a list of all modules.", "meteor.command.name-history.description": "Provides a list of a players previous names from the laby.net api", + "meteor.command.name-history.error.error_fetching_name": "There was an error fetching that users name history.", + "meteor.command.name-history.inaccurate": "This name history entry is not accurate according to laby.net", "meteor.command.nbt.description": "Modifies NBT data for an item, example: .nbt add {display:{Name:'{\"text\":\"$cRed Name\"}'}}", "meteor.command.notebot.description": "Allows you load notebot files", "meteor.command.peek.description": "Lets you see what's inside storage block items.", "meteor.command.profiles.description": "Loads and saves profiles.", + "meteor.command.profiles.info.loaded": "Loaded profile (highlight)%s(default).", + "meteor.command.profiles.info.saved": "Saved profile (highlight)%s(default).", + "meteor.command.profiles.info.deleted": "Deleted profile (highlight)%s(default).", "meteor.command.reload.description": "Reloads many systems.", + "meteor.command.reload.warning.reloading": "Reloading systems, this may take a while.", "meteor.command.reset.description": "Resets specified settings.", "meteor.command.rotation.description": "Modifies your rotation.", "meteor.command.save-map.description": "Saves a map to an image.", + "meteor.command.save-map.error.error_writing_texture": "Error writing map texture", + "meteor.command.save-map.exception.map_not_found": "You must be holding a filled map.", + "meteor.command.save-map.exception.oops": "Something went wrong.", "meteor.command.say.description": "Sends messages in chat.", "meteor.command.server.description": "Prints server information", "meteor.command.settings.description": "Allows you to view and change module settings.", @@ -40,5 +68,7 @@ "meteor.command.toggle.description": "Toggles a module.", "meteor.command.vclip.description": "Lets you clip through blocks vertically.", "meteor.command.wasp.description": "Sets the auto wasp target.", + "meteor.command.wasp.exception.cant_wasp_self": "You cannot target yourself!", + "meteor.command.wasp.info.target": "%d set as target.", "meteor.command.waypoint.description": "Manages waypoints." } diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index ea3d85d40f..35aa0b8e0c 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -1,37 +1,65 @@ { "meteor.key.category": "Meteor Client", - "meteor.key.open-gui": "Open GUI", "meteor.key.open-commands": "Open Commands", + "meteor.key.open-gui": "Open GUI", "meteor.command.bind.description": "Binds a specified module to the next pressed key.", "meteor.command.binds.description": "List of all bound modules.", "meteor.command.commands.description": "List of all commands.", "meteor.command.damage.description": "Damages self.", "meteor.command.disconnect.description": "Disconnect from the server", + "meteor.command.disconnect.disconnection_message": "%s[%sDisconnectCommand%s] Disconnected by user.", "meteor.command.dismount.description": "Dismounts you from entity you are riding.", "meteor.command.drop.description": "Automatically drops specified items.", + "meteor.command.drop.exception.no_such_item": "Could not find an item with that name!", + "meteor.command.drop.exception.not_spectator": "Can't drop items while in spectator.", "meteor.command.enchant.description": "Enchants the item in your hand. REQUIRES Creative mode.", + "meteor.command.enchant.exception.not_holding_item": "You need to hold some item to enchant.", + "meteor.command.enchant.exception.not_in_creative": "You must be in creative mode to use this.", "meteor.command.ender-chest.description": "Allows you to preview memory of your ender chest.", "meteor.command.fake-player.description": "Manages fake players that you can use for testing.", + "meteor.command.fake-player.error.not_found": "Couldn't find a Fake Player with that name.", + "meteor.command.fake-player.info.removed": "Removed Fake Player %s.", "meteor.command.fov.description": "Changes your fov.", "meteor.command.friends.description": "Manages friends.", "meteor.command.gamemode.description": "Changes your gamemode client-side.", "meteor.command.give.description": "Gives you any item.", + "meteor.command.give.exception.not_in_creative": "You must be in creative mode to use this.", + "meteor.command.give.exception.no_space": "No space in hotbar.", "meteor.command.hclip.description": "Lets you clip through blocks horizontally.", "meteor.command.input.description": "Keyboard input simulation.", + "meteor.command.input.info.cleared_handlers": "Cleared all keypress handlers.", + "meteor.command.input.info.active_handlers": "Active keypress handlers: ", + "meteor.command.input.info.keypress_handler": "(highlight)%d(default) - (highlight)%s %d(default) ticks left out of (highlight)%d(default).", + "meteor.command.input.info.removed_handler": "Removed keypress handler.", + "meteor.command.input.warning.no_handlers": "No active keypress handlers.", + "meteor.command.input.warning.out_of_range": "Index out of range.", "meteor.command.inventory.description": "Allows you to see parts of another player's inventory.", "meteor.command.locate.description": "Locates structures", "meteor.command.macro.description": "Allows you to execute macros.", + "meteor.command.macro.error.none_scheduled": "No macros are currently scheduled.", + "meteor.command.macro.error.not_scheduled": "This macro is not currently scheduled.", + "meteor.command.macro.info.cleared_all": "Cleared all scheduled macros.", + "meteor.command.macro.info.cleared": "Cleared scheduled macro.", "meteor.command.modules.description": "Displays a list of all modules.", "meteor.command.name-history.description": "Provides a list of a players previous names from the laby.net api", + "meteor.command.name-history.error.error_fetching_name": "There was an error fetching that users name history.", + "meteor.command.name-history.inaccurate": "This name history entry is not accurate according to laby.net", "meteor.command.nbt.description": "Modifies NBT data for an item, example: .nbt add {display:{Name:'{\"text\":\"$cRed Name\"}'}}", "meteor.command.notebot.description": "Allows you load notebot files", "meteor.command.peek.description": "Lets you see what's inside storage block items.", "meteor.command.profiles.description": "Loads and saves profiles.", + "meteor.command.profiles.info.loaded": "Loaded profile (highlight)%s(default).", + "meteor.command.profiles.info.saved": "Saved profile (highlight)%s(default).", + "meteor.command.profiles.info.deleted": "Deleted profile (highlight)%s(default).", "meteor.command.reload.description": "Reloads many systems.", + "meteor.command.reload.warning.reloading": "Reloading systems, this may take a while.", "meteor.command.reset.description": "Resets specified settings.", "meteor.command.rotation.description": "Modifies your rotation.", "meteor.command.save-map.description": "Saves a map to an image.", + "meteor.command.save-map.error.error_writing_texture": "Error writing map texture", + "meteor.command.save-map.exception.map_not_found": "You must be holding a filled map.", + "meteor.command.save-map.exception.oops": "Something went wrong.", "meteor.command.say.description": "Sends messages in chat.", "meteor.command.server.description": "Prints server information", "meteor.command.settings.description": "Allows you to view and change module settings.", @@ -40,5 +68,7 @@ "meteor.command.toggle.description": "Toggles a module.", "meteor.command.vclip.description": "Lets you clip through blocks vertically.", "meteor.command.wasp.description": "Sets the auto wasp target.", + "meteor.command.wasp.exception.cant_wasp_self": "You cannot target yourself!", + "meteor.command.wasp.info.target": "%d set as target.", "meteor.command.waypoint.description": "Manages waypoints." } diff --git a/src/main/resources/assets/meteor-client/language/pt_br.json b/src/main/resources/assets/meteor-client/language/pt_br.json index 4a3ccf4e0f..16cc5e0c1c 100644 --- a/src/main/resources/assets/meteor-client/language/pt_br.json +++ b/src/main/resources/assets/meteor-client/language/pt_br.json @@ -1,5 +1,5 @@ { - "meteor.lang.translators": "Niix-Dan ", + "meteor.lang.translators": "Niix-Dan", "meteor.key.open-gui": "Abrir Menu", "meteor.key.open-commands": "Abrir Comandos" From ed00828f787f1247b0f5ff70d7e702bedc8997bd Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Tue, 18 Nov 2025 00:05:28 -0500 Subject: [PATCH 08/72] add error message when IOExcepting during en_us --- .../meteorclient/utils/misc/MeteorTranslations.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index 3b449ac3c7..e4b396f522 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -60,7 +60,7 @@ public static void loadLanguage(String languageCode) { MeteorClient.LOG.info("Loaded language: {}", languageCode); } } catch (IOException e) { - if (languageCode.equals("en_us")) throw new RuntimeException(e); + if (languageCode.equals("en_us")) throw new RuntimeException("Error loading default language", e); else MeteorClient.LOG.error("Error loading language: {}", languageCode, e); } From 08a8d6b80660a1cf2bb3d05ce89002df34ac9562 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Tue, 18 Nov 2025 00:06:14 -0500 Subject: [PATCH 09/72] always use utf8 for translations --- .../meteorclient/utils/misc/MeteorTranslations.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index e4b396f522..17233e495d 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.IllegalFormatException; import java.util.List; @@ -54,7 +55,7 @@ public static void loadLanguage(String languageCode) { } else { // noinspection unchecked - Object2ObjectOpenHashMap map = GSON.fromJson(new InputStreamReader(stream), Object2ObjectOpenHashMap.class); + Object2ObjectOpenHashMap map = GSON.fromJson(new InputStreamReader(stream, StandardCharsets.UTF_8), Object2ObjectOpenHashMap.class); languages.put(languageCode, new MeteorLanguage(map)); MeteorClient.LOG.info("Loaded language: {}", languageCode); @@ -72,7 +73,7 @@ public static void loadLanguage(String languageCode) { MeteorLanguage lang = languages.getOrDefault(languageCode, new MeteorLanguage()); // noinspection unchecked - Object2ObjectOpenHashMap map = GSON.fromJson(new InputStreamReader(stream), Object2ObjectOpenHashMap.class); + Object2ObjectOpenHashMap map = GSON.fromJson(new InputStreamReader(stream, StandardCharsets.UTF_8), Object2ObjectOpenHashMap.class); lang.addCustomTranslation(map); languages.put(languageCode, lang); From cc08c570d0b1a74f231d8b5f190d46df4a8c1290 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Tue, 18 Nov 2025 00:18:41 -0500 Subject: [PATCH 10/72] set default lang as a constant --- .../utils/misc/MeteorTranslations.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index 17233e495d..82f713810c 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -30,18 +30,22 @@ @SuppressWarnings("unused") public class MeteorTranslations { + private static final String EN_US_CODE = "en_us"; private static final Gson GSON = new Gson(); private static final Map languages = new Object2ObjectOpenHashMap<>(); + private static MeteorLanguage defaultLanguage; @PreInit public static void preInit() { List toLoad = new ArrayList<>(2); - toLoad.add("en_us"); - if (!mc.options.language.equalsIgnoreCase("en_us")) toLoad.add(mc.options.language); + toLoad.add(EN_US_CODE); + if (!mc.options.language.equalsIgnoreCase(EN_US_CODE)) toLoad.add(mc.options.language); for (String language : toLoad) { loadLanguage(language); } + + defaultLanguage = getLanguage(EN_US_CODE); } public static void loadLanguage(String languageCode) { @@ -50,7 +54,7 @@ public static void loadLanguage(String languageCode) { try (InputStream stream = MeteorTranslations.class.getResourceAsStream("/assets/meteor-client/language/" + languageCode + ".json")) { if (stream == null) { - if (languageCode.equals("en_us")) throw new RuntimeException("Error loading the default language"); + if (languageCode.equals(EN_US_CODE)) throw new RuntimeException("Error loading the default language"); else MeteorClient.LOG.info("No language file found for '{}'", languageCode); } else { @@ -61,7 +65,7 @@ public static void loadLanguage(String languageCode) { MeteorClient.LOG.info("Loaded language: {}", languageCode); } } catch (IOException e) { - if (languageCode.equals("en_us")) throw new RuntimeException("Error loading default language", e); + if (languageCode.equals(EN_US_CODE)) throw new RuntimeException("Error loading default language", e); else MeteorClient.LOG.error("Error loading language: {}", languageCode, e); } @@ -115,7 +119,7 @@ public static MeteorLanguage getCurrentLanguage() { } public static MeteorLanguage getDefaultLanguage() { - return languages.get("en_us"); + return defaultLanguage; } /** From bd68d2daa8949d03bed4e72d062d68ba783d11d8 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Tue, 18 Nov 2025 00:42:58 -0500 Subject: [PATCH 11/72] add id field to `MeteorAddon` --- .../meteordevelopment/meteorclient/addons/AddonManager.java | 2 ++ .../meteordevelopment/meteorclient/addons/MeteorAddon.java | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/addons/AddonManager.java b/src/main/java/meteordevelopment/meteorclient/addons/AddonManager.java index 54af1c4d00..2e1a10668e 100644 --- a/src/main/java/meteordevelopment/meteorclient/addons/AddonManager.java +++ b/src/main/java/meteordevelopment/meteorclient/addons/AddonManager.java @@ -48,6 +48,7 @@ public String getCommit() { ModMetadata metadata = FabricLoader.getInstance().getModContainer(MeteorClient.MOD_ID).get().getMetadata(); + MeteorClient.ADDON.id = metadata.getId(); MeteorClient.ADDON.name = metadata.getName(); MeteorClient.ADDON.authors = new String[metadata.getAuthors().size()]; if (metadata.containsCustomValue(MeteorClient.MOD_ID + ":color")) { @@ -72,6 +73,7 @@ public String getCommit() { throw new RuntimeException("Exception during addon init \"%s\".".formatted(metadata.getName()), throwable); } + addon.id = metadata.getId(); addon.name = metadata.getName(); if (metadata.getAuthors().isEmpty()) throw new RuntimeException("Addon \"%s\" requires at least 1 author to be defined in it's fabric.mod.json. See https://fabricmc.net/wiki/documentation:fabric_mod_json_spec".formatted(addon.name)); diff --git a/src/main/java/meteordevelopment/meteorclient/addons/MeteorAddon.java b/src/main/java/meteordevelopment/meteorclient/addons/MeteorAddon.java index 7ae5918d6f..01286ead0f 100644 --- a/src/main/java/meteordevelopment/meteorclient/addons/MeteorAddon.java +++ b/src/main/java/meteordevelopment/meteorclient/addons/MeteorAddon.java @@ -10,6 +10,10 @@ import java.io.InputStream; public abstract class MeteorAddon { + /** This field is automatically assigned from fabric.mod.json file. + * @since 1.21.11 */ // todo replace with exact version when released + public String id; + /** This field is automatically assigned from fabric.mod.json file. */ public String name; From e1eef18ae1e067b448e4a229eb9f242886860ba4 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Tue, 18 Nov 2025 00:50:09 -0500 Subject: [PATCH 12/72] compute map of localized languages --- .../utils/misc/MeteorTranslations.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index 82f713810c..0ce3709542 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -12,6 +12,8 @@ import meteordevelopment.meteorclient.addons.AddonManager; import meteordevelopment.meteorclient.addons.MeteorAddon; import meteordevelopment.meteorclient.utils.PreInit; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.resource.language.LanguageDefinition; import net.minecraft.client.resource.language.ReorderingUtil; import net.minecraft.text.OrderedText; import net.minecraft.text.StringVisitable; @@ -33,10 +35,17 @@ public class MeteorTranslations { private static final String EN_US_CODE = "en_us"; private static final Gson GSON = new Gson(); private static final Map languages = new Object2ObjectOpenHashMap<>(); + private static final Map languageDefinitions = new Object2ObjectOpenHashMap<>(); private static MeteorLanguage defaultLanguage; @PreInit public static void preInit() { + MinecraftClient.getInstance().getLanguageManager().getAllLanguages().forEach((code, definition) -> { + if (hasLocalization(code)) { + languageDefinitions.put(code, definition); + } + }); + List toLoad = new ArrayList<>(2); toLoad.add(EN_US_CODE); if (!mc.options.language.equalsIgnoreCase(EN_US_CODE)) toLoad.add(mc.options.language); @@ -48,6 +57,20 @@ public static void preInit() { defaultLanguage = getLanguage(EN_US_CODE); } + private static boolean hasLocalization(String languageCode) { + if (doesLangFileExist(MeteorClient.ADDON, languageCode)) return true; + + for (MeteorAddon addon : AddonManager.ADDONS) { + if (doesLangFileExist(addon, languageCode)) return true; + } + + return false; + } + + private static boolean doesLangFileExist(MeteorAddon addon, String languageCode) { + return addon.getClass().getResource("/assets/" + addon.id + "/language/" + languageCode + ".json") != null; + } + public static void loadLanguage(String languageCode) { languageCode = languageCode.toLowerCase(); if (languages.containsKey(languageCode)) return; @@ -110,6 +133,10 @@ public static String translate(String key, String fallback, Object... args) { } } + public static Map getLanguageDefinitions() { + return languageDefinitions; + } + public static MeteorLanguage getLanguage(String lang) { return languages.get(lang); } From 6bb4151a365efa0f0f89a13b055d6e9028e8456f Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Tue, 18 Nov 2025 00:52:56 -0500 Subject: [PATCH 13/72] add right-to-left support --- .../utils/misc/MeteorTranslations.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index 0ce3709542..89a7f86b29 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -75,6 +75,9 @@ public static void loadLanguage(String languageCode) { languageCode = languageCode.toLowerCase(); if (languages.containsKey(languageCode)) return; + LanguageDefinition definition = languageDefinitions.get(languageCode); + if (definition == null) return; + try (InputStream stream = MeteorTranslations.class.getResourceAsStream("/assets/meteor-client/language/" + languageCode + ".json")) { if (stream == null) { if (languageCode.equals(EN_US_CODE)) throw new RuntimeException("Error loading the default language"); @@ -83,7 +86,7 @@ public static void loadLanguage(String languageCode) { else { // noinspection unchecked Object2ObjectOpenHashMap map = GSON.fromJson(new InputStreamReader(stream, StandardCharsets.UTF_8), Object2ObjectOpenHashMap.class); - languages.put(languageCode, new MeteorLanguage(map)); + languages.put(languageCode, new MeteorLanguage(definition.rightToLeft(), map)); MeteorClient.LOG.info("Loaded language: {}", languageCode); } @@ -97,7 +100,7 @@ public static void loadLanguage(String languageCode) { try (InputStream stream = addon.provideLanguage(languageCode)) { if (stream == null) continue; - MeteorLanguage lang = languages.getOrDefault(languageCode, new MeteorLanguage()); + MeteorLanguage lang = languages.getOrDefault(languageCode, new MeteorLanguage(definition.rightToLeft())); // noinspection unchecked Object2ObjectOpenHashMap map = GSON.fromJson(new InputStreamReader(stream, StandardCharsets.UTF_8), Object2ObjectOpenHashMap.class); @@ -157,7 +160,7 @@ public static double percentLocalised() { // translation. Maybe that will change in the future. if (isEnglish()) return 100; - double currentLangSize = languages.getOrDefault(mc.options.language.toLowerCase(), new MeteorLanguage()).translations.size(); + double currentLangSize = languages.getOrDefault(mc.options.language.toLowerCase(), new MeteorLanguage(false)).translations.size(); return (currentLangSize / getDefaultLanguage().translations.size()) * 100; } @@ -168,10 +171,14 @@ public static boolean isEnglish() { public static class MeteorLanguage extends Language { private final Map translations = new Object2ObjectOpenHashMap<>(); private final List> customTranslations = new ObjectArrayList<>(); + private final boolean rightToLeft; - public MeteorLanguage() {} + public MeteorLanguage(boolean rightToLeft) { + this.rightToLeft = rightToLeft; + } - public MeteorLanguage(Map translations) { + public MeteorLanguage(boolean rightToLeft, Map translations) { + this(rightToLeft); this.translations.putAll(translations); } @@ -205,12 +212,12 @@ public boolean hasTranslation(String key) { @Override public boolean isRightToLeft() { - return false; + return this.rightToLeft; } @Override public OrderedText reorder(StringVisitable text) { - return ReorderingUtil.reorder(text, false); + return ReorderingUtil.reorder(text, this.rightToLeft); } } } From 083f0d894ae55a8431e3ab15df57d9da0b03950e Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Tue, 18 Nov 2025 01:08:48 -0500 Subject: [PATCH 14/72] flatten translation maps --- .../utils/misc/MeteorTranslations.java | 45 ++++++------------- 1 file changed, 13 insertions(+), 32 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index 89a7f86b29..6c1f314099 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -7,7 +7,6 @@ import com.google.gson.Gson; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.addons.AddonManager; import meteordevelopment.meteorclient.addons.MeteorAddon; @@ -78,6 +77,8 @@ public static void loadLanguage(String languageCode) { LanguageDefinition definition = languageDefinitions.get(languageCode); if (definition == null) return; + Object2ObjectOpenHashMap languageMap = new Object2ObjectOpenHashMap<>(); + try (InputStream stream = MeteorTranslations.class.getResourceAsStream("/assets/meteor-client/language/" + languageCode + ".json")) { if (stream == null) { if (languageCode.equals(EN_US_CODE)) throw new RuntimeException("Error loading the default language"); @@ -86,7 +87,7 @@ public static void loadLanguage(String languageCode) { else { // noinspection unchecked Object2ObjectOpenHashMap map = GSON.fromJson(new InputStreamReader(stream, StandardCharsets.UTF_8), Object2ObjectOpenHashMap.class); - languages.put(languageCode, new MeteorLanguage(definition.rightToLeft(), map)); + languageMap.putAll(map); MeteorClient.LOG.info("Loaded language: {}", languageCode); } @@ -100,18 +101,20 @@ public static void loadLanguage(String languageCode) { try (InputStream stream = addon.provideLanguage(languageCode)) { if (stream == null) continue; - MeteorLanguage lang = languages.getOrDefault(languageCode, new MeteorLanguage(definition.rightToLeft())); // noinspection unchecked Object2ObjectOpenHashMap map = GSON.fromJson(new InputStreamReader(stream, StandardCharsets.UTF_8), Object2ObjectOpenHashMap.class); - lang.addCustomTranslation(map); - languages.put(languageCode, lang); + languageMap.putAll(map); MeteorClient.LOG.info("Loaded language {} from addon {}", languageCode, addon.name); } catch (IOException e) { MeteorClient.LOG.error("Error loading language {} from addon {}", languageCode, addon.name, e); } } + + if (!languageMap.isEmpty()) { + languages.put(languageCode, new MeteorLanguage(definition.rightToLeft(), languageMap)); + } } public static String translate(String key, Object... args) { @@ -160,7 +163,8 @@ public static double percentLocalised() { // translation. Maybe that will change in the future. if (isEnglish()) return 100; - double currentLangSize = languages.getOrDefault(mc.options.language.toLowerCase(), new MeteorLanguage(false)).translations.size(); + MeteorLanguage currentLang = languages.get(mc.options.language.toLowerCase()); + double currentLangSize = currentLang != null ? currentLang.translations.size() : 0; return (currentLangSize / getDefaultLanguage().translations.size()) * 100; } @@ -170,44 +174,21 @@ public static boolean isEnglish() { public static class MeteorLanguage extends Language { private final Map translations = new Object2ObjectOpenHashMap<>(); - private final List> customTranslations = new ObjectArrayList<>(); private final boolean rightToLeft; - public MeteorLanguage(boolean rightToLeft) { - this.rightToLeft = rightToLeft; - } - public MeteorLanguage(boolean rightToLeft, Map translations) { - this(rightToLeft); + this.rightToLeft = rightToLeft; this.translations.putAll(translations); } - public void addCustomTranslation(Map customTranslation) { - if (customTranslations.contains(customTranslation)) return; - - customTranslations.add(customTranslation); - } - @Override public String get(String key, String fallback) { - if (translations.containsKey(key)) return translations.get(key); - - for (Map customTranslation : customTranslations) { - if (customTranslation.containsKey(key)) return customTranslation.get(key); - } - - return fallback; + return translations.getOrDefault(key, fallback); } @Override public boolean hasTranslation(String key) { - if (translations.containsKey(key)) return true; - - for (Map customTranslation : customTranslations) { - if (customTranslation.containsKey(key)) return true; - } - - return false; + return translations.containsKey(key); } @Override From f05923e11248305ff3d6508a527150b1c473e49b Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Tue, 18 Nov 2025 01:13:43 -0500 Subject: [PATCH 15/72] these are actually case sensitive --- .../meteorclient/utils/misc/MeteorTranslations.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index 6c1f314099..5d121fb62c 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -47,7 +47,7 @@ public static void preInit() { List toLoad = new ArrayList<>(2); toLoad.add(EN_US_CODE); - if (!mc.options.language.equalsIgnoreCase(EN_US_CODE)) toLoad.add(mc.options.language); + if (!mc.options.language.equals(EN_US_CODE)) toLoad.add(mc.options.language); for (String language : toLoad) { loadLanguage(language); @@ -71,7 +71,6 @@ private static boolean doesLangFileExist(MeteorAddon addon, String languageCode) } public static void loadLanguage(String languageCode) { - languageCode = languageCode.toLowerCase(); if (languages.containsKey(languageCode)) return; LanguageDefinition definition = languageDefinitions.get(languageCode); @@ -148,7 +147,7 @@ public static MeteorLanguage getLanguage(String lang) { } public static MeteorLanguage getCurrentLanguage() { - return languages.getOrDefault(mc.options.language.toLowerCase(), getDefaultLanguage()); + return languages.getOrDefault(mc.options.language, getDefaultLanguage()); } public static MeteorLanguage getDefaultLanguage() { @@ -163,13 +162,13 @@ public static double percentLocalised() { // translation. Maybe that will change in the future. if (isEnglish()) return 100; - MeteorLanguage currentLang = languages.get(mc.options.language.toLowerCase()); + MeteorLanguage currentLang = languages.get(mc.options.language); double currentLangSize = currentLang != null ? currentLang.translations.size() : 0; return (currentLangSize / getDefaultLanguage().translations.size()) * 100; } public static boolean isEnglish() { - return mc.options.language.toLowerCase().startsWith("en"); + return mc.options.language.startsWith("en"); } public static class MeteorLanguage extends Language { From d380320919f29472e3b0bdfd03276655a10971aa Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Tue, 18 Nov 2025 01:15:47 -0500 Subject: [PATCH 16/72] automatic addon language registration --- .../meteorclient/addons/MeteorAddon.java | 24 ------------------- .../utils/misc/MeteorTranslations.java | 2 +- 2 files changed, 1 insertion(+), 25 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/addons/MeteorAddon.java b/src/main/java/meteordevelopment/meteorclient/addons/MeteorAddon.java index 01286ead0f..5c2eb55fff 100644 --- a/src/main/java/meteordevelopment/meteorclient/addons/MeteorAddon.java +++ b/src/main/java/meteordevelopment/meteorclient/addons/MeteorAddon.java @@ -7,8 +7,6 @@ import meteordevelopment.meteorclient.utils.render.color.Color; -import java.io.InputStream; - public abstract class MeteorAddon { /** This field is automatically assigned from fabric.mod.json file. * @since 1.21.11 */ // todo replace with exact version when released @@ -40,26 +38,4 @@ public GithubRepo getRepo() { public String getCommit() { return null; } - - /** - * Example implementation: - *
{@code
-     *  @Override
-     *  public InputStream provideLanguage(String lang) {
-     *      return Addon.class.getResourceAsStream("/assets/addon-name/language/" + lang + ".json")
-     *  }
-     * }
-     * 

- * - * Addons should not store their language files in the /assets/xxx/lang/ path as it opens up users to detection - * by servers via the translation exploit. - * Storing them anywhere else should prevent them from getting picked up via the vanilla resource loader. - * - * @param lang A language code in lowercase - * @return An InputStream for the relevant json translation file, or null if the addon doesn't have - * a file for that language. - */ - public InputStream provideLanguage(String lang) { - return null; - } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index 5d121fb62c..92a97a3f16 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -98,7 +98,7 @@ public static void loadLanguage(String languageCode) { for (MeteorAddon addon : AddonManager.ADDONS) { if (addon == MeteorClient.ADDON) continue; - try (InputStream stream = addon.provideLanguage(languageCode)) { + try (InputStream stream = addon.getClass().getResourceAsStream("/assets/" + addon.id + "/language/" + languageCode + ".json")) { if (stream == null) continue; // noinspection unchecked From 5848a9fc931b5a718c7aa79f896af8a87dd653c2 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Tue, 18 Nov 2025 01:37:26 -0500 Subject: [PATCH 17/72] oops turns out you dont have those during `@PreInit` --- .../meteorclient/utils/misc/MeteorTranslations.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index 92a97a3f16..e6b460be07 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -34,17 +34,10 @@ public class MeteorTranslations { private static final String EN_US_CODE = "en_us"; private static final Gson GSON = new Gson(); private static final Map languages = new Object2ObjectOpenHashMap<>(); - private static final Map languageDefinitions = new Object2ObjectOpenHashMap<>(); private static MeteorLanguage defaultLanguage; @PreInit public static void preInit() { - MinecraftClient.getInstance().getLanguageManager().getAllLanguages().forEach((code, definition) -> { - if (hasLocalization(code)) { - languageDefinitions.put(code, definition); - } - }); - List toLoad = new ArrayList<>(2); toLoad.add(EN_US_CODE); if (!mc.options.language.equals(EN_US_CODE)) toLoad.add(mc.options.language); @@ -73,7 +66,7 @@ private static boolean doesLangFileExist(MeteorAddon addon, String languageCode) public static void loadLanguage(String languageCode) { if (languages.containsKey(languageCode)) return; - LanguageDefinition definition = languageDefinitions.get(languageCode); + LanguageDefinition definition = MinecraftClient.getInstance().getLanguageManager().getLanguage(languageCode); if (definition == null) return; Object2ObjectOpenHashMap languageMap = new Object2ObjectOpenHashMap<>(); @@ -138,10 +131,6 @@ public static String translate(String key, String fallback, Object... args) { } } - public static Map getLanguageDefinitions() { - return languageDefinitions; - } - public static MeteorLanguage getLanguage(String lang) { return languages.get(lang); } From 0d02a2bab5217c026679cfd2fec508eb37f42b46 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Tue, 18 Nov 2025 01:55:00 -0500 Subject: [PATCH 18/72] fix command descriptions --- .../meteorclient/commands/commands/CommandsCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java index ca08d56e89..7f63c4cd26 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java @@ -53,7 +53,7 @@ private MutableText getCommandText(Command command) { } tooltip.append(aliases.formatted(Formatting.GRAY)).append("\n\n"); - tooltip.append(translatable("description")).formatted(Formatting.WHITE); + tooltip.append(command.translatable("description")).formatted(Formatting.WHITE); // Text MutableText text = Text.literal(Utils.nameToTitle(command.getName())); From 4df0c08345f6b6b0e6eeee9f7d2c62c27da7ae22 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Tue, 18 Nov 2025 01:55:16 -0500 Subject: [PATCH 19/72] sadly cant use these --- .../utils/misc/MeteorTranslations.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index e6b460be07..8ca54ff676 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -49,20 +49,6 @@ public static void preInit() { defaultLanguage = getLanguage(EN_US_CODE); } - private static boolean hasLocalization(String languageCode) { - if (doesLangFileExist(MeteorClient.ADDON, languageCode)) return true; - - for (MeteorAddon addon : AddonManager.ADDONS) { - if (doesLangFileExist(addon, languageCode)) return true; - } - - return false; - } - - private static boolean doesLangFileExist(MeteorAddon addon, String languageCode) { - return addon.getClass().getResource("/assets/" + addon.id + "/language/" + languageCode + ".json") != null; - } - public static void loadLanguage(String languageCode) { if (languages.containsKey(languageCode)) return; From eec45e4174d202cd56112422e8a96a003b8ac90d Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Tue, 18 Nov 2025 02:30:25 -0500 Subject: [PATCH 20/72] dont have like all of the languages --- .../meteorclient/mixin/LanguageManagerMixin.java | 1 + .../meteorclient/utils/misc/MeteorTranslations.java | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LanguageManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LanguageManagerMixin.java index 228143cef8..4a1868909c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LanguageManagerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LanguageManagerMixin.java @@ -17,5 +17,6 @@ public class LanguageManagerMixin { @Inject(method = "setLanguage", at = @At("TAIL")) private void onSetLanguage(String languageCode, CallbackInfo ci) { MeteorTranslations.loadLanguage(languageCode); + MeteorTranslations.clearUnusedLanguages(languageCode); } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index 8ca54ff676..c726bb5d4e 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -22,10 +22,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.IllegalFormatException; -import java.util.List; -import java.util.Map; +import java.util.*; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -95,6 +92,10 @@ public static void loadLanguage(String languageCode) { } } + public static void clearUnusedLanguages(String currentLanguageCode) { + languages.keySet().removeIf(languageCode -> !languageCode.equals(EN_US_CODE) && !languageCode.equals(currentLanguageCode)); + } + public static String translate(String key, Object... args) { MeteorLanguage currentLang = getCurrentLanguage(); String translated = currentLang.get(key, getDefaultLanguage().get(key)); From ad3c0b3b8a844f5b8f2cbef36959f64428838c3e Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Tue, 18 Nov 2025 03:25:55 -0500 Subject: [PATCH 21/72] fix wasp target info --- src/main/resources/assets/meteor-client/language/en_us.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index 35aa0b8e0c..c27502e5fe 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -69,6 +69,6 @@ "meteor.command.vclip.description": "Lets you clip through blocks vertically.", "meteor.command.wasp.description": "Sets the auto wasp target.", "meteor.command.wasp.exception.cant_wasp_self": "You cannot target yourself!", - "meteor.command.wasp.info.target": "%d set as target.", + "meteor.command.wasp.info.target": "%s set as target.", "meteor.command.waypoint.description": "Manages waypoints." } From 8a22141d3aa4cfaf9245f6dd213797e116e3e90c Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Fri, 2 Jan 2026 15:02:51 +0000 Subject: [PATCH 22/72] fix issues --- .../meteorclient/gui/screens/ModulesScreen.java | 3 ++- src/main/resources/assets/meteor-client/language/en_gb.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java index bb8399149d..a20aac7c9d 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java @@ -9,6 +9,7 @@ import meteordevelopment.meteorclient.gui.tabs.TabScreen; import meteordevelopment.meteorclient.gui.tabs.Tabs; import meteordevelopment.meteorclient.gui.utils.Cell; +import meteordevelopment.meteorclient.gui.widgets.WLabel; import meteordevelopment.meteorclient.gui.widgets.containers.WContainer; import meteordevelopment.meteorclient.gui.widgets.containers.WSection; import meteordevelopment.meteorclient.gui.widgets.containers.WVerticalList; @@ -22,8 +23,8 @@ import meteordevelopment.meteorclient.utils.misc.NbtUtils; import meteordevelopment.meteorclient.utils.render.prompts.YesNoPrompt; import net.minecraft.item.Items; -import net.minecraft.util.Util; import net.minecraft.util.Pair; +import net.minecraft.util.Util; import java.util.ArrayList; import java.util.List; diff --git a/src/main/resources/assets/meteor-client/language/en_gb.json b/src/main/resources/assets/meteor-client/language/en_gb.json index 35aa0b8e0c..c27502e5fe 100644 --- a/src/main/resources/assets/meteor-client/language/en_gb.json +++ b/src/main/resources/assets/meteor-client/language/en_gb.json @@ -69,6 +69,6 @@ "meteor.command.vclip.description": "Lets you clip through blocks vertically.", "meteor.command.wasp.description": "Sets the auto wasp target.", "meteor.command.wasp.exception.cant_wasp_self": "You cannot target yourself!", - "meteor.command.wasp.info.target": "%d set as target.", + "meteor.command.wasp.info.target": "%s set as target.", "meteor.command.waypoint.description": "Manages waypoints." } From 6f108f7e79f01c9fdde6b50c79ce5dae3d89f514 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Sat, 3 Jan 2026 00:44:41 -0500 Subject: [PATCH 23/72] define `Settings` base keys --- .../meteorclient/gui/GuiTheme.java | 3 +- .../pathing/BaritoneSettings.java | 2 +- .../meteorclient/renderer/MeshRenderer.java | 1 + .../meteorclient/settings/Settings.java | 12 +++ .../meteorclient/systems/config/Config.java | 2 +- .../meteorclient/systems/hud/Hud.java | 2 +- .../meteorclient/systems/hud/HudElement.java | 3 +- .../systems/hud/screens/HudElementScreen.java | 2 +- .../meteorclient/systems/macros/Macro.java | 2 +- .../meteorclient/systems/modules/Module.java | 3 +- .../render/blockesp/ESPBlockDataScreen.java | 2 +- .../modules/render/marker/BaseMarker.java | 75 ++++++++++--------- .../systems/profiles/Profile.java | 2 +- .../meteorclient/systems/proxies/Proxies.java | 2 +- .../meteorclient/systems/proxies/Proxy.java | 2 +- .../systems/waypoints/Waypoint.java | 2 +- 16 files changed, 70 insertions(+), 47 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java b/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java index 2b52425f84..e387ae6f37 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java @@ -40,7 +40,7 @@ public abstract class GuiTheme implements ISerializable { public static final double TITLE_TEXT_SCALE = 1.25; public final String name; - public final Settings settings = new Settings(); + public final Settings settings; public boolean disableHoverColor; @@ -50,6 +50,7 @@ public abstract class GuiTheme implements ISerializable { public GuiTheme(String name) { this.name = name; + this.settings = new Settings("theme." + name); } public void beforeRender() { diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java index 8294edaa12..72b44d9f0a 100644 --- a/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java +++ b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java @@ -19,7 +19,7 @@ import java.util.Map; public class BaritoneSettings implements IPathManager.ISettings { - private final Settings settings = new Settings(); + private final Settings settings = new Settings("baritone"); private Setting walkOnWater, walkOnLava; private Setting step, noFall; diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java index 738e623776..961b7921f6 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java @@ -166,6 +166,7 @@ public void end() { pass.setPipeline(pipeline); pass.setUniform("MeshData", meshData); + uniforms.forEach(pass::setUniform); for (var name : uniforms.keySet()) { pass.setUniform(name, uniforms.get(name)); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/Settings.java b/src/main/java/meteordevelopment/meteorclient/settings/Settings.java index 6e4ca7d2d7..7d40216b39 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/Settings.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/Settings.java @@ -15,6 +15,7 @@ import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtList; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Iterator; @@ -23,6 +24,17 @@ public class Settings implements ISerializable, Iterable { private SettingGroup defaultGroup; public final List groups = new ArrayList<>(1); + /// {@code null} when {@link Settings} is internal, should not be passed to {@link GuiTheme#settings(Settings)} + public final @Nullable String baseTranslationKey; + + public Settings(@NotNull String baseTranslationKey) { + this.baseTranslationKey = baseTranslationKey; + } + + /// @apiNote marks this {@link Settings} as internal, using it in user-facing UIs will throw + public Settings() { + this.baseTranslationKey = null; + } public void onActivated() { for (SettingGroup group : groups) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java b/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java index f8deb6eff2..863a7f12f9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java @@ -24,7 +24,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class Config extends System { - public final Settings settings = new Settings(); + public final Settings settings = new Settings("config"); private final SettingGroup sgVisual = settings.createGroup("Visual"); private final SettingGroup sgModules = settings.createGroup("Modules"); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java index b5fa527675..23f488126a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java @@ -31,7 +31,7 @@ public class Hud extends System implements Iterable { public static final HudGroup GROUP = new HudGroup("Meteor"); public boolean active; - public Settings settings = new Settings(); + public Settings settings = new Settings("hud"); public final Map> infos = new TreeMap<>(); private final List elements = new ArrayList<>(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/HudElement.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/HudElement.java index 1868e9c1d2..75ecb138da 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/HudElement.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/HudElement.java @@ -18,7 +18,7 @@ public abstract class HudElement implements Snapper.Element, ISerializable info; private boolean active; - public final Settings settings = new Settings(); + public final Settings settings; public final HudBox box = new HudBox(this); public boolean autoAnchors = true; @@ -26,6 +26,7 @@ public abstract class HudElement implements Snapper.Element, ISerializable info) { this.info = info; + this.settings = new Settings("hud." + info.name); this.active = true; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementScreen.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementScreen.java index 387b729678..3b8c03b450 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementScreen.java @@ -36,7 +36,7 @@ public HudElementScreen(GuiTheme theme, HudElement element) { this.element = element; - settings = new Settings(); + settings = new Settings("hud.base"); SettingGroup sg = settings.createGroup("Anchors"); sg.add(new BoolSetting.Builder() .name("auto-anchors") diff --git a/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java b/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java index d1e04fca43..c7249a8a5f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java @@ -22,7 +22,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class Macro implements ISerializable { - public final Settings settings = new Settings(); + public final Settings settings = new Settings("macro"); private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java index 1e7fd08a29..45927ec0c4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java @@ -37,7 +37,7 @@ public abstract class Module implements ISerializable, Comparable se @Override public void initWidgets() { - Settings settings = new Settings(); + Settings settings = new Settings("module.block-esp.data"); SettingGroup sgGeneral = settings.getDefaultGroup(); SettingGroup sgTracer = settings.createGroup("Tracer"); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/BaseMarker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/BaseMarker.java index 81617cd0cb..b4db8dad09 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/BaseMarker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/BaseMarker.java @@ -17,40 +17,47 @@ import net.minecraft.nbt.NbtCompound; public abstract class BaseMarker implements ISerializable { - public final Settings settings = new Settings(); - - protected final SettingGroup sgBase = settings.createGroup("Base"); - - public final Setting name = sgBase.add(new StringSetting.Builder() - .name("name") - .description("Custom name for this marker.") - .build() - ); - - protected final Setting description = sgBase.add(new StringSetting.Builder() - .name("description") - .description("Custom description for this marker.") - .build() - ); - - private final Setting dimension = sgBase.add(new EnumSetting.Builder() - .name("dimension") - .description("In which dimension this marker should be visible.") - .defaultValue(Dimension.Overworld) - .build() - ); - - private final Setting active = sgBase.add(new BoolSetting.Builder() - .name("active") - .description("Is this marker visible.") - .defaultValue(false) - .build() - ); - - public BaseMarker(String name) { - this.name.set(name); - - dimension.set(PlayerUtils.getDimension()); + public final Settings settings; + + protected final SettingGroup sgBase; + + public final Setting name; + protected final Setting description; + private final Setting dimension; + private final Setting active; + + public BaseMarker(String type) { + this.settings = new Settings(type); + + this.sgBase = settings.createGroup("Base"); + + this.name = sgBase.add(new StringSetting.Builder() + .name("name") + .description("Custom name for this marker.") + .build() + ); + this.name.set(type); + + this.description = sgBase.add(new StringSetting.Builder() + .name("description") + .description("Custom description for this marker.") + .build() + ); + + this.dimension = sgBase.add(new EnumSetting.Builder() + .name("dimension") + .description("In which dimension this marker should be visible.") + .defaultValue(Dimension.Overworld) + .build() + ); + this.dimension.set(PlayerUtils.getDimension()); + + this.active = sgBase.add(new BoolSetting.Builder() + .name("active") + .description("Is this marker visible.") + .defaultValue(false) + .build() + ); } protected void render(Render3DEvent event) {} diff --git a/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java b/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java index 8ce3aeb02f..3956307408 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java @@ -23,7 +23,7 @@ import java.util.Objects; public class Profile implements ISerializable { - public final Settings settings = new Settings(); + public final Settings settings = new Settings("profile"); private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgSave = settings.createGroup("Save"); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxies.java b/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxies.java index bb99af47a0..5d1abd3918 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxies.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxies.java @@ -18,7 +18,7 @@ import java.util.regex.Pattern; public class Proxies extends System implements Iterable { - public final Settings settings = new Settings(); + public final Settings settings = new Settings("proxies"); private final SettingGroup sgRefreshing = settings.createGroup("Refreshing"); private final SettingGroup sgCleanup = settings.createGroup("Cleanup"); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxy.java b/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxy.java index f0d53b89da..92d246f21e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxy.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxy.java @@ -25,7 +25,7 @@ import java.util.Objects; public class Proxy implements ISerializable { - public final Settings settings = new Settings(); + public final Settings settings = new Settings("proxy"); private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgOptional = settings.createGroup("Optional"); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoint.java b/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoint.java index 08eeb12808..ee862a39a3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoint.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoint.java @@ -23,7 +23,7 @@ import java.util.UUID; public class Waypoint implements ISerializable { - public final Settings settings = new Settings(); + public final Settings settings = new Settings("waypoint"); private final SettingGroup sgVisual = settings.createGroup("Visual"); private final SettingGroup sgPosition = settings.createGroup("Position"); From 66e129416b301d82b60fe6717f7316b4bff8cf11 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Sat, 3 Jan 2026 02:27:44 -0500 Subject: [PATCH 24/72] throw on internal settings usage --- src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java b/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java index e387ae6f37..2160747723 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java @@ -214,6 +214,7 @@ public WKeybind keybind(Keybind keybind, Keybind defaultValue) { } public WWidget settings(Settings settings, String filter) { + if (settings.baseTranslationKey == null) throw new IllegalArgumentException("Cannot use internal Settings in a GuiTheme!"); return settingsFactory.create(this, settings, filter); } public WWidget settings(Settings settings) { From bd99ca24f7c6176fd47d5b2b4285b646552c5aa8 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Sat, 3 Jan 2026 03:29:37 -0500 Subject: [PATCH 25/72] add supplier fallback translate function --- .../utils/misc/MeteorTranslations.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index c726bb5d4e..bc86976ad2 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -17,12 +17,14 @@ import net.minecraft.text.OrderedText; import net.minecraft.text.StringVisitable; import net.minecraft.util.Language; +import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.*; +import java.util.function.Supplier; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -118,6 +120,17 @@ public static String translate(String key, String fallback, Object... args) { } } + public static String translate(String key, Supplier fallback, Object... args) { + MeteorLanguage currentLang = getCurrentLanguage(); + String translated = currentLang.get(key, getDefaultLanguage().get(key, fallback)); + + try { + return String.format(translated, args); + } catch (IllegalFormatException e) { + return fallback.get(); + } + } + public static MeteorLanguage getLanguage(String lang) { return languages.get(lang); } @@ -161,6 +174,11 @@ public String get(String key, String fallback) { return translations.getOrDefault(key, fallback); } + public String get(String key, Supplier fallback) { + @Nullable String string = translations.get(key); + return string != null ? string : fallback.get(); + } + @Override public boolean hasTranslation(String key) { return translations.containsKey(key); From fffeba8f2efb895c9d6630e175aea5a0088cbb7b Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Sat, 3 Jan 2026 04:11:36 -0500 Subject: [PATCH 26/72] ignore setting group case when loading nbt --- .../meteordevelopment/meteorclient/settings/Settings.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/settings/Settings.java b/src/main/java/meteordevelopment/meteorclient/settings/Settings.java index 7d40216b39..c3a1a8a74b 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/Settings.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/Settings.java @@ -8,6 +8,7 @@ import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.widgets.containers.WContainer; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.ISerializable; import meteordevelopment.meteorclient.utils.render.color.RainbowColors; import meteordevelopment.meteorclient.utils.render.color.SettingColor; @@ -76,6 +77,7 @@ public void reset() { } public SettingGroup getGroup(String name) { + name = Utils.titleToName(name); for (SettingGroup sg : this) { if (sg.name.equals(name)) return sg; } @@ -88,7 +90,7 @@ public int sizeGroups() { } public SettingGroup getDefaultGroup() { - if (defaultGroup == null) defaultGroup = createGroup("General"); + if (defaultGroup == null) defaultGroup = createGroup("general"); return defaultGroup; } From a38282ce1c2bca27646c93395a93bf85577b53db Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Sat, 3 Jan 2026 05:12:32 -0500 Subject: [PATCH 27/72] map modules --- .../commands/commands/BindsCommand.java | 7 +- .../commands/commands/ModulesCommand.java | 6 +- .../gui/DefaultSettingsWidgetFactory.java | 14 +- .../meteorclient/gui/GuiTheme.java | 2 +- .../gui/screens/ModuleScreen.java | 4 +- .../settings/ModuleListSettingScreen.java | 4 +- .../themes/meteor/widgets/WMeteorModule.java | 2 +- .../hud/elements/ActiveModulesHud.java | 8 +- .../systems/hud/elements/ModuleInfosHud.java | 4 +- .../meteorclient/systems/modules/Module.java | 43 +- .../meteorclient/systems/modules/Modules.java | 9 +- .../systems/modules/combat/AnchorAura.java | 34 +- .../systems/modules/combat/AntiAnchor.java | 4 +- .../systems/modules/combat/AntiAnvil.java | 4 +- .../systems/modules/combat/AntiBed.java | 6 +- .../systems/modules/combat/ArrowDodge.java | 11 +- .../systems/modules/combat/AttributeSwap.java | 40 +- .../systems/modules/combat/AutoAnvil.java | 10 +- .../systems/modules/combat/AutoArmor.java | 8 +- .../systems/modules/combat/AutoCity.java | 16 +- .../systems/modules/combat/AutoEXP.java | 8 +- .../systems/modules/combat/AutoLog.java | 17 +- .../systems/modules/combat/AutoTotem.java | 8 +- .../systems/modules/combat/AutoTrap.java | 21 +- .../systems/modules/combat/AutoWeapon.java | 5 +- .../systems/modules/combat/AutoWeb.java | 16 +- .../systems/modules/combat/BedAura.java | 28 +- .../systems/modules/combat/BowAimbot.java | 8 +- .../systems/modules/combat/BowSpam.java | 9 +- .../systems/modules/combat/Burrow.java | 11 +- .../systems/modules/combat/Criticals.java | 8 +- .../systems/modules/combat/CrystalAura.java | 71 +- .../systems/modules/combat/Hitboxes.java | 16 +- .../systems/modules/combat/HoleFiller.java | 29 +- .../systems/modules/combat/KillAura.java | 31 +- .../systems/modules/combat/Offhand.java | 18 +- .../systems/modules/combat/Quiver.java | 12 +- .../systems/modules/combat/SelfAnvil.java | 2 +- .../systems/modules/combat/SelfTrap.java | 15 +- .../systems/modules/combat/SelfWeb.java | 7 +- .../systems/modules/combat/Surround.java | 31 +- .../systems/modules/misc/AntiPacketKick.java | 4 +- .../systems/modules/misc/AutoReconnect.java | 4 +- .../systems/modules/misc/BetterBeacons.java | 2 +- .../systems/modules/misc/BetterChat.java | 33 +- .../systems/modules/misc/BookBot.java | 10 +- .../systems/modules/misc/DiscordPresence.java | 12 +- .../systems/modules/misc/InventoryTweaks.java | 39 +- .../systems/modules/misc/MessageAura.java | 4 +- .../systems/modules/misc/Notebot.java | 29 +- .../systems/modules/misc/Notifier.java | 28 +- .../systems/modules/misc/PacketCanceller.java | 4 +- .../systems/modules/misc/ServerSpoof.java | 7 +- .../systems/modules/misc/SoundBlocker.java | 3 +- .../systems/modules/misc/Spam.java | 13 +- .../systems/modules/misc/swarm/Swarm.java | 5 +- .../systems/modules/movement/AirJump.java | 3 +- .../systems/modules/movement/Anchor.java | 7 +- .../systems/modules/movement/AntiVoid.java | 3 +- .../systems/modules/movement/AutoJump.java | 5 +- .../systems/modules/movement/AutoWalk.java | 7 +- .../systems/modules/movement/AutoWasp.java | 9 +- .../systems/modules/movement/Blink.java | 5 +- .../systems/modules/movement/ClickTP.java | 2 +- .../systems/modules/movement/ElytraBoost.java | 6 +- .../modules/movement/EntityControl.java | 22 +- .../systems/modules/movement/FastClimb.java | 5 +- .../systems/modules/movement/Flight.java | 11 +- .../systems/modules/movement/GUIMove.java | 8 +- .../systems/modules/movement/HighJump.java | 3 +- .../systems/modules/movement/Jesus.java | 19 +- .../systems/modules/movement/LongJump.java | 12 +- .../systems/modules/movement/NoFall.java | 8 +- .../systems/modules/movement/NoSlow.java | 14 +- .../systems/modules/movement/Parkour.java | 3 +- .../systems/modules/movement/ReverseStep.java | 5 +- .../systems/modules/movement/SafeWalk.java | 11 +- .../systems/modules/movement/Scaffold.java | 22 +- .../systems/modules/movement/Slippy.java | 6 +- .../systems/modules/movement/Sneak.java | 3 +- .../systems/modules/movement/Spider.java | 3 +- .../systems/modules/movement/Sprint.java | 7 +- .../systems/modules/movement/Step.java | 6 +- .../modules/movement/TridentBoost.java | 4 +- .../systems/modules/movement/Velocity.java | 16 +- .../modules/movement/elytrafly/ElytraFly.java | 45 +- .../systems/modules/movement/speed/Speed.java | 10 +- .../systems/modules/player/AirPlace.java | 10 +- .../systems/modules/player/AntiAFK.java | 19 +- .../systems/modules/player/AntiHunger.java | 4 +- .../systems/modules/player/AutoClicker.java | 7 +- .../systems/modules/player/AutoEat.java | 10 +- .../systems/modules/player/AutoFish.java | 9 +- .../systems/modules/player/AutoGap.java | 17 +- .../systems/modules/player/AutoMend.java | 5 +- .../systems/modules/player/AutoReplenish.java | 11 +- .../systems/modules/player/AutoRespawn.java | 2 +- .../systems/modules/player/AutoTool.java | 14 +- .../systems/modules/player/BreakDelay.java | 4 +- .../systems/modules/player/ChestSwap.java | 7 +- .../systems/modules/player/EXPThrower.java | 2 +- .../systems/modules/player/FakePlayer.java | 5 +- .../systems/modules/player/FastUse.java | 6 +- .../systems/modules/player/GhostHand.java | 2 +- .../modules/player/InstantRebreak.java | 11 +- .../modules/player/LiquidInteract.java | 2 +- .../modules/player/MiddleClickExtra.java | 9 +- .../systems/modules/player/Multitask.java | 3 +- .../systems/modules/player/NameProtect.java | 5 +- .../systems/modules/player/NoInteract.java | 19 +- .../systems/modules/player/NoMiningTrace.java | 4 +- .../systems/modules/player/NoRotate.java | 2 +- .../modules/player/NoStatusEffects.java | 3 +- .../systems/modules/player/OffhandCrash.java | 5 +- .../systems/modules/player/Portals.java | 2 +- .../systems/modules/player/PotionSaver.java | 4 +- .../systems/modules/player/Reach.java | 4 +- .../systems/modules/player/Rotation.java | 10 +- .../systems/modules/player/SpeedMine.java | 8 +- .../systems/modules/render/BetterTab.java | 9 +- .../modules/render/BetterTooltips.java | 28 +- .../modules/render/BlockSelection.java | 8 +- .../systems/modules/render/Blur.java | 10 +- .../systems/modules/render/BossStack.java | 5 +- .../systems/modules/render/Breadcrumbs.java | 5 +- .../modules/render/BreakIndicators.java | 6 +- .../systems/modules/render/CameraTweaks.java | 9 +- .../systems/modules/render/Chams.java | 28 +- .../systems/modules/render/CityESP.java | 7 +- .../systems/modules/render/ESP.java | 24 +- .../systems/modules/render/EntityOwner.java | 3 +- .../systems/modules/render/FreeLook.java | 9 +- .../systems/modules/render/Freecam.java | 16 +- .../systems/modules/render/Fullbright.java | 5 +- .../systems/modules/render/HandView.java | 22 +- .../systems/modules/render/HoleESP.java | 20 +- .../systems/modules/render/ItemHighlight.java | 4 +- .../systems/modules/render/ItemPhysics.java | 3 +- .../systems/modules/render/LightOverlay.java | 10 +- .../systems/modules/render/LogoutSpots.java | 11 +- .../systems/modules/render/Nametags.java | 36 +- .../systems/modules/render/NoRender.java | 59 +- .../systems/modules/render/PopChams.java | 10 +- .../systems/modules/render/StorageESP.java | 20 +- .../systems/modules/render/TimeChanger.java | 3 +- .../systems/modules/render/Tracers.java | 26 +- .../systems/modules/render/Trail.java | 4 +- .../systems/modules/render/Trajectories.java | 18 +- .../systems/modules/render/TunnelESP.java | 7 +- .../systems/modules/render/VoidESP.java | 11 +- .../systems/modules/render/WallHack.java | 5 +- .../modules/render/WaypointsModule.java | 8 +- .../systems/modules/render/Xray.java | 5 +- .../systems/modules/render/Zoom.java | 8 +- .../modules/render/blockesp/BlockESP.java | 6 +- .../systems/modules/render/marker/Marker.java | 2 +- .../systems/modules/world/Ambience.java | 25 +- .../systems/modules/world/AutoBreed.java | 6 +- .../systems/modules/world/AutoBrewer.java | 3 +- .../systems/modules/world/AutoMount.java | 5 +- .../systems/modules/world/AutoNametag.java | 7 +- .../systems/modules/world/AutoShearer.java | 5 +- .../systems/modules/world/AutoSign.java | 3 +- .../systems/modules/world/AutoSmelter.java | 5 +- .../systems/modules/world/BuildHeight.java | 2 +- .../systems/modules/world/Collisions.java | 6 +- .../systems/modules/world/EChestFarmer.java | 12 +- .../systems/modules/world/EndermanLook.java | 4 +- .../systems/modules/world/Excavator.java | 11 +- .../systems/modules/world/Flamethrower.java | 8 +- .../systems/modules/world/HighwayBuilder.java | 54 +- .../systems/modules/world/InfinityMiner.java | 12 +- .../systems/modules/world/LiquidFiller.java | 15 +- .../systems/modules/world/MountBypass.java | 2 +- .../systems/modules/world/NoGhostBlocks.java | 4 +- .../systems/modules/world/Nuker.java | 36 +- .../systems/modules/world/PacketMine.java | 15 +- .../systems/modules/world/SpawnProofer.java | 10 +- .../systems/modules/world/StashFinder.java | 21 +- .../systems/modules/world/Timer.java | 3 +- .../systems/modules/world/VeinMiner.java | 14 +- .../assets/meteor-client/language/en_us.json | 3384 ++++++++++++++++- 182 files changed, 3747 insertions(+), 1714 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java index d21e6352d7..76abdda30c 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java @@ -9,7 +9,6 @@ import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.command.CommandSource; import net.minecraft.text.HoverEvent; @@ -37,7 +36,7 @@ public void build(LiteralArgumentBuilder builder) { for (Module module : modules) { HoverEvent hoverEvent = new HoverEvent.ShowText(getTooltip(module)); - MutableText text = Text.literal(module.title).formatted(Formatting.WHITE); + MutableText text = module.getTitleText().formatted(Formatting.WHITE); text.setStyle(text.getStyle().withHoverEvent(hoverEvent)); MutableText sep = Text.literal(" - "); @@ -56,8 +55,8 @@ public void build(LiteralArgumentBuilder builder) { } private MutableText getTooltip(Module module) { - MutableText tooltip = Text.literal(Utils.nameToTitle(module.title)).formatted(Formatting.BLUE, Formatting.BOLD).append("\n\n"); - tooltip.append(Text.literal(module.description).formatted(Formatting.WHITE)); + MutableText tooltip = module.getTitleText().formatted(Formatting.BLUE, Formatting.BOLD).append("\n\n"); + tooltip.append(module.getDescriptionText().formatted(Formatting.WHITE)); return tooltip; } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java index 248fea9f6a..6f31d9a2c7 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java @@ -40,11 +40,11 @@ private MutableText getModuleText(Module module) { // Hover tooltip MutableText tooltip = Text.literal(""); - tooltip.append(Text.literal(module.title).formatted(Formatting.BLUE, Formatting.BOLD)).append("\n"); + tooltip.append(module.getTitleText().formatted(Formatting.BLUE, Formatting.BOLD)).append("\n"); tooltip.append(Text.literal(module.name).formatted(Formatting.GRAY)).append("\n\n"); - tooltip.append(Text.literal(module.description).formatted(Formatting.WHITE)); + tooltip.append(module.getDescriptionText().formatted(Formatting.WHITE)); - MutableText finalModule = Text.literal(module.title); + MutableText finalModule = module.getTitleText(); if (!module.isActive()) finalModule.formatted(Formatting.GRAY); if (!module.equals(Modules.get().getGroup(module.category).getLast())) finalModule.append(Text.literal(", ").formatted(Formatting.GRAY)); finalModule.setStyle(finalModule.getStyle().withHoverEvent(new HoverEvent.ShowText(tooltip))); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java index 6a1b773118..3f5c6678fa 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java @@ -23,6 +23,7 @@ import meteordevelopment.meteorclient.renderer.Fonts; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.utils.Utils; +import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import net.minecraft.client.resource.language.I18n; import org.apache.commons.lang3.Strings; @@ -81,7 +82,7 @@ public WWidget create(GuiTheme theme, Settings settings, String filter) { // Add all settings for (SettingGroup group : settings.groups) { - group(list, group, filter, removeInfoList); + group(list, group, filter, removeInfoList, settings.baseTranslationKey); } // Calculate width and set it as minimum width @@ -101,8 +102,9 @@ protected double settingTitleTopMargin() { return 6; } - private void group(WVerticalList list, SettingGroup group, String filter, List removeInfoList) { - WSection section = list.add(theme.section(group.name, group.sectionExpanded)).expandX().widget(); + private void group(WVerticalList list, SettingGroup group, String filter, List removeInfoList, String baseKey) { + String groupKey = group.name.equals("general") ? "module.base.general" : baseKey + "." + group.name; + WSection section = list.add(theme.section(MeteorTranslations.translate(groupKey, group.name), group.sectionExpanded)).expandX().widget(); section.action = () -> group.sectionExpanded = section.isExpanded(); WTable table = section.add(theme.table()).expandX().widget(); @@ -110,7 +112,9 @@ private void group(WVerticalList list, SettingGroup group, String filter, List setting : group) { - if (!Strings.CI.contains(setting.title, filter)) continue; + String settingKey = groupKey + "." + setting.name; + String title = MeteorTranslations.translate(settingKey, () -> Utils.nameToTitle(setting.name)); + if (!Strings.CI.contains(title, filter) && !Strings.CI.contains(setting.name, filter)) continue; boolean visible = setting.isVisible(); setting.lastWasVisible = visible; @@ -119,7 +123,7 @@ private void group(WVerticalList list, SettingGroup group, String filter, List account); public WWidget module(Module module) { - return module(module, module.title); + return module(module, module.getTitle()); } public abstract WWidget module(Module module, String title); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModuleScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModuleScreen.java index a9918bddfe..280a0c4261 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModuleScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModuleScreen.java @@ -40,7 +40,7 @@ public class ModuleScreen extends WindowScreen { private WCheckbox active; public ModuleScreen(GuiTheme theme, Module module) { - super(theme, theme.favorite(module.favorite), module.title); + super(theme, theme.favorite(module.favorite), module.getTitle()); ((WFavorite) window.icon).action = () -> module.favorite = ((WFavorite) window.icon).checked; this.module = module; @@ -49,7 +49,7 @@ public ModuleScreen(GuiTheme theme, Module module) { @Override public void initWidgets() { // Description - add(theme.label(module.description, getWindowWidth() / 2.0)); + add(theme.label(module.getDescription(), getWindowWidth() / 2.0)); if (module.addon != null && module.addon != MeteorClient.ADDON) { WHorizontalList addon = add(theme.horizontalList()).expandX().widget(); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ModuleListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ModuleListSettingScreen.java index b8b3ab4fbf..b37b410875 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ModuleListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ModuleListSettingScreen.java @@ -21,14 +21,14 @@ public ModuleListSettingScreen(GuiTheme theme, Setting> setting) { @Override protected WWidget getValueWidget(Module value) { - return theme.label(value.title); + return theme.label(value.getTitle()); } @Override protected String[] getValueNames(Module value) { String[] names = new String[value.aliases.length + 1]; System.arraycopy(value.aliases, 0, names, 1, value.aliases.length); - names[0] = value.title; + names[0] = value.getTitle(); return names; } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/WMeteorModule.java b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/WMeteorModule.java index 7cd5bd1481..bb0778bf63 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/WMeteorModule.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/WMeteorModule.java @@ -30,7 +30,7 @@ public class WMeteorModule extends WPressable implements MeteorWidget { public WMeteorModule(Module module, String title) { this.module = module; this.title = title; - this.tooltip = module.description; + this.tooltip = module.getDescription(); if (module.isActive()) { animationProgress1 = 1; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ActiveModulesHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ActiveModulesHud.java index 10e21972bc..317267364f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ActiveModulesHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ActiveModulesHud.java @@ -213,7 +213,7 @@ public void tick(HudRenderer renderer) { } modules.sort((e1, e2) -> switch (sort.get()) { - case Alphabetical -> e1.title.compareTo(e2.title); + case Alphabetical -> e1.getTitle().compareTo(e2.getTitle()); case Biggest -> Double.compare(getModuleWidth(renderer, e2), getModuleWidth(renderer, e1)); case Smallest -> Double.compare(getModuleWidth(renderer, e1), getModuleWidth(renderer, e2)); }); @@ -275,10 +275,10 @@ private void renderModule(HudRenderer renderer, int index, double x, double y) { } } - renderer.text(module.title, x, y, color, shadow.get(), getScale()); + renderer.text(module.getTitle(), x, y, color, shadow.get(), getScale()); double textHeight = renderer.textHeight(shadow.get(), getScale()); - double textLength = renderer.textWidth(module.title, shadow.get(), getScale()); + double textLength = renderer.textWidth(module.getTitle(), shadow.get(), getScale()); if (showKeybind.get() && module.keybind.isSet()) { String keybindStr = " [" + module.keybind + "]"; @@ -341,7 +341,7 @@ private void renderModule(HudRenderer renderer, int index, double x, double y) { } private double getModuleWidth(HudRenderer renderer, Module module) { - double width = renderer.textWidth(module.title, shadow.get(), getScale()); + double width = renderer.textWidth(module.getTitle(), shadow.get(), getScale()); if (showKeybind.get() && module.keybind.isSet()) { width += renderer.textWidth(" [" + module.keybind + "]", shadow.get(), getScale()); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ModuleInfosHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ModuleInfosHud.java index 61f0c0f8cd..e85e7b6304 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ModuleInfosHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ModuleInfosHud.java @@ -87,7 +87,7 @@ public void render(HudRenderer renderer) { int i = 0; for (Module module : modules.get()) { - double moduleWidth = renderer.textWidth(module.title) + renderer.textWidth(" "); + double moduleWidth = renderer.textWidth(module.getTitle()) + renderer.textWidth(" "); String text = null; if (module.isActive()) { @@ -102,7 +102,7 @@ public void render(HudRenderer renderer) { moduleWidth += renderer.textWidth(text); double x = this.x + alignX(moduleWidth, alignment.get()); - x = renderer.text(module.title, x, y, moduleColor.get(), textShadow.get()); + x = renderer.text(module.getTitle(), x, y, moduleColor.get(), textShadow.get()); renderer.text(text, x + renderer.textWidth(" "), y, module.isActive() ? onColor.get() : offColor.get(), textShadow.get()); y += renderer.textHeight() + 2; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java index 45927ec0c4..39cd17a338 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java @@ -15,11 +15,14 @@ import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.ISerializable; import meteordevelopment.meteorclient.utils.misc.Keybind; +import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; +import meteordevelopment.meteorclient.utils.misc.text.MeteorTranslatableTextComponent; import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import net.minecraft.client.MinecraftClient; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; +import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import org.jetbrains.annotations.NotNull; @@ -31,8 +34,6 @@ public abstract class Module implements ISerializable, Comparable, Comparable Utils.nameToTitle(this.name)); + } + + public MutableText getTitleText() { + return MutableText.of(new MeteorTranslatableTextComponent("module." + this.name, Utils.nameToTitle(this.name))); + } + + public String getDescription() { + return MeteorTranslations.translate("module." + this.name + ".description", ""); + } + + public MutableText getDescriptionText() { + return MutableText.of(new MeteorTranslatableTextComponent("module." + this.name + ".description", "")); + } + @Override public NbtCompound toTag() { if (!serialize) return null; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index 07346da48f..c5d7f10f18 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -93,7 +93,7 @@ public void load(File folder) { public void sortModules() { for (List modules : groups.values()) { - modules.sort(Comparator.comparing(o -> o.title)); + modules.sort(Comparator.comparing(o -> o.getTitle())); } } @@ -153,20 +153,21 @@ public List> searchTitles(String text) { Map, Integer> modules = new HashMap<>(); for (Module module : this.moduleInstances.values()) { - String title = module.title; + String title = module.getTitle(); int score = Utils.searchLevenshteinDefault(title, text, false); + String display = title; if (Config.get().moduleAliases.get()) { for (String alias : module.aliases) { int aliasScore = Utils.searchLevenshteinDefault(alias, text, false); if (aliasScore < score) { - title = module.title + " (" + alias + ")"; + display = title + " (" + alias + ")"; score = aliasScore; } } } - modules.put(new Pair<>(module, title), score); + modules.put(new Pair<>(module, display), score); } List> l = new ArrayList<>(modules.keySet()); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java index a7e303d03e..4ec0336548 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java @@ -39,16 +39,15 @@ public class AnchorAura extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgPlace = settings.createGroup("Place"); - private final SettingGroup sgBreak = settings.createGroup("Break"); - private final SettingGroup sgPause = settings.createGroup("Pause"); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgPlace = settings.createGroup("place"); + private final SettingGroup sgBreak = settings.createGroup("break"); + private final SettingGroup sgPause = settings.createGroup("pause"); + private final SettingGroup sgRender = settings.createGroup("render"); // General private final Setting targetRange = sgGeneral.add(new DoubleSetting.Builder() .name("target-range") - .description("Range in which to target players.") .defaultValue(10) .min(0) .sliderMax(16) @@ -57,14 +56,12 @@ public class AnchorAura extends Module { private final Setting targetPriority = sgGeneral.add(new EnumSetting.Builder() .name("target-priority") - .description("How to select the player to target.") .defaultValue(SortPriority.LowestHealth) .build() ); private final Setting minDamage = sgGeneral.add(new DoubleSetting.Builder() .name("min-damage") - .description("The minimum damage to inflict on your target.") .defaultValue(7) .min(0) .sliderMax(36) @@ -73,7 +70,6 @@ public class AnchorAura extends Module { private final Setting maxSelfDamage = sgGeneral.add(new DoubleSetting.Builder() .name("max-self-damage") - .description("The maximum damage to inflict on yourself.") .defaultValue(7) .min(0) .sliderMax(36) @@ -82,21 +78,18 @@ public class AnchorAura extends Module { private final Setting antiSuicide = sgGeneral.add(new BoolSetting.Builder() .name("anti-suicide") - .description("Will not place and break anchors if they will kill you.") .defaultValue(true) .build() ); private final Setting swapBack = sgGeneral.add(new BoolSetting.Builder() .name("swap-back") - .description("Switches to your previous slot after using anchors.") .defaultValue(true) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Rotates server-side towards the anchors being placed/broken.") .defaultValue(true) .build() ); @@ -105,14 +98,12 @@ public class AnchorAura extends Module { private final Setting place = sgPlace.add(new BoolSetting.Builder() .name("place") - .description("Allows Anchor Aura to place anchors.") .defaultValue(true) .build() ); private final Setting placeDelay = sgPlace.add(new IntSetting.Builder() .name("place-delay") - .description("The tick delay between placing anchors.") .defaultValue(5) .range(0, 10) .visible(place::get) @@ -121,7 +112,6 @@ public class AnchorAura extends Module { private final Setting placeRange = sgPlace.add(new DoubleSetting.Builder() .name("place-range") - .description("The range at which anchors can be placed.") .defaultValue(4) .range(0, 6) .visible(place::get) @@ -130,7 +120,6 @@ public class AnchorAura extends Module { private final Setting placeWallsRange = sgPlace.add(new DoubleSetting.Builder() .name("walls-range") - .description("Range in which to place anchors when behind blocks.") .defaultValue(4) .range(0, 6) .visible(place::get) @@ -139,7 +128,6 @@ public class AnchorAura extends Module { private final Setting airPlace = sgPlace.add(new BoolSetting.Builder() .name("air-place") - .description("Allows Anchor Aura to place anchors in the air.") .defaultValue(true) .visible(place::get) .build() @@ -149,7 +137,6 @@ public class AnchorAura extends Module { private final Setting chargeDelay = sgBreak.add(new IntSetting.Builder() .name("charge-delay") - .description("The tick delay it takes to charge anchors.") .defaultValue(1) .range(0, 10) .build() @@ -157,7 +144,6 @@ public class AnchorAura extends Module { private final Setting breakDelay = sgBreak.add(new IntSetting.Builder() .name("break-delay") - .description("The tick delay it takes to break anchors.") .defaultValue(1) .range(0, 10) .build() @@ -165,7 +151,6 @@ public class AnchorAura extends Module { private final Setting breakRange = sgBreak.add(new DoubleSetting.Builder() .name("break-range") - .description("Range in which to break anchors.") .defaultValue(4.5) .min(0) .sliderMax(6) @@ -174,7 +159,6 @@ public class AnchorAura extends Module { private final Setting breakWallsRange = sgBreak.add(new DoubleSetting.Builder() .name("walls-range") - .description("Range in which to break anchors when behind blocks.") .defaultValue(4.5) .min(0) .sliderMax(6) @@ -185,21 +169,18 @@ public class AnchorAura extends Module { private final Setting pauseOnUse = sgPause.add(new BoolSetting.Builder() .name("pause-on-use") - .description("Pauses while using an item.") .defaultValue(true) .build() ); private final Setting pauseOnMine = sgPause.add(new BoolSetting.Builder() .name("pause-on-mine") - .description("Pauses while mining blocks.") .defaultValue(true) .build() ); private final Setting pauseOnCA = sgPause.add(new BoolSetting.Builder() .name("pause-on-CA") - .description("Pauses while Crystal Aura is placing.") .defaultValue(true) .build() ); @@ -208,21 +189,18 @@ public class AnchorAura extends Module { private final Setting swing = sgRender.add(new BoolSetting.Builder() .name("swing") - .description("Whether to swing your hand client-side.") .defaultValue(true) .build() ); private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") - .description("Renders the block where it is placing an anchor.") .defaultValue(true) .build() ); private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .visible(render::get) .build() @@ -230,7 +208,6 @@ public class AnchorAura extends Module { private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The side color for positions to be placed.") .defaultValue(new SettingColor(15, 255, 211, 41)) .visible(() -> render.get() && shapeMode.get().sides()) .build() @@ -238,7 +215,6 @@ public class AnchorAura extends Module { private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The line color for positions to be placed.") .defaultValue(new SettingColor(15, 255, 211)) .visible(() -> render.get() && shapeMode.get().lines()) .build() @@ -255,7 +231,7 @@ public class AnchorAura extends Module { private PlayerEntity target; public AnchorAura() { - super(Categories.Combat, "anchor-aura", "Automatically places and breaks Respawn Anchors to harm entities."); + super(Categories.Combat, "anchor-aura"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiAnchor.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiAnchor.java index 5a9ec05d7c..be4c554583 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiAnchor.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiAnchor.java @@ -23,20 +23,18 @@ public class AntiAnchor extends Module { private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Makes you rotate when placing.") .defaultValue(true) .build() ); private final Setting swing = sgGeneral.add(new BoolSetting.Builder() .name("swing") - .description("Swings your hand when placing.") .defaultValue(true) .build() ); public AntiAnchor() { - super(Categories.Combat, "anti-anchor", "Automatically prevents Anchor Aura by placing a slab on your head."); + super(Categories.Combat, "anti-anchor"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiAnvil.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiAnvil.java index 3285309807..7aa19dbd13 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiAnvil.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiAnvil.java @@ -23,20 +23,18 @@ public class AntiAnvil extends Module { private final Setting swing = sgGeneral.add(new BoolSetting.Builder() .name("swing") - .description("Swings your hand client-side when placing.") .defaultValue(true) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Makes you rotate when placing.") .defaultValue(true) .build() ); public AntiAnvil() { - super(Categories.Combat, "anti-anvil", "Automatically prevents Auto Anvil by placing between you and the anvil."); + super(Categories.Combat, "anti-anvil"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiBed.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiBed.java index 34eac3026f..e713e38a5e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiBed.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiBed.java @@ -29,28 +29,24 @@ public class AntiBed extends Module { private final Setting placeStringTop = sgGeneral.add(new BoolSetting.Builder() .name("place-string-top") - .description("Places string above you.") .defaultValue(false) .build() ); private final Setting placeStringMiddle = sgGeneral.add(new BoolSetting.Builder() .name("place-string-middle") - .description("Places string in your upper hitbox.") .defaultValue(true) .build() ); private final Setting placeStringBottom = sgGeneral.add(new BoolSetting.Builder() .name("place-string-bottom") - .description("Places string at your feet.") .defaultValue(false) .build() ); private final Setting onlyInHole = sgGeneral.add(new BoolSetting.Builder() .name("only-in-hole") - .description("Only functions when you are standing in a hole.") .defaultValue(true) .build() ); @@ -58,7 +54,7 @@ public class AntiBed extends Module { private boolean breaking; public AntiBed() { - super(Categories.Combat, "anti-bed", "Places string to prevent beds being placed on you."); + super(Categories.Combat, "anti-bed"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/ArrowDodge.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/ArrowDodge.java index 322d0fa837..0ce5907097 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/ArrowDodge.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/ArrowDodge.java @@ -28,18 +28,16 @@ public class ArrowDodge extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgMovement = settings.createGroup("Movement"); + private final SettingGroup sgMovement = settings.createGroup("movement"); private final Setting moveType = sgMovement.add(new EnumSetting.Builder() .name("move-type") - .description("The way you are moved by this module.") .defaultValue(MoveType.Velocity) .build() ); private final Setting moveSpeed = sgMovement.add(new DoubleSetting.Builder() .name("move-speed") - .description("How fast should you be when dodging arrow.") .defaultValue(1) .min(0.01) .sliderRange(0.01, 5) @@ -48,7 +46,6 @@ public class ArrowDodge extends Module { private final Setting distanceCheck = sgMovement.add(new DoubleSetting.Builder() .name("distance-check") - .description("How far should an arrow be from the player to be considered not hitting.") .defaultValue(1) .min(0.01) .sliderRange(0.01, 5) @@ -57,28 +54,24 @@ public class ArrowDodge extends Module { private final Setting groundCheck = sgGeneral.add(new BoolSetting.Builder() .name("ground-check") - .description("Tries to prevent you from falling to your death.") .defaultValue(true) .build() ); private final Setting allProjectiles = sgGeneral.add(new BoolSetting.Builder() .name("all-projectiles") - .description("Dodge all projectiles, not only arrows.") .defaultValue(false) .build() ); private final Setting ignoreOwn = sgGeneral.add(new BoolSetting.Builder() .name("ignore-own") - .description("Ignore your own projectiles.") .defaultValue(true) .build() ); public final Setting simulationSteps = sgGeneral.add(new IntSetting.Builder() .name("simulation-steps") - .description("How many steps to simulate projectiles. Zero for no limit.") .defaultValue(500) .sliderMax(5000) .build() @@ -100,7 +93,7 @@ public class ArrowDodge extends Module { private final List points = new ArrayList<>(); public ArrowDodge() { - super(Categories.Combat, "arrow-dodge", "Tries to dodge arrows coming at you."); + super(Categories.Combat, "arrow-dodge"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AttributeSwap.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AttributeSwap.java index 2b8aab6fc0..319db4969c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AttributeSwap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AttributeSwap.java @@ -30,22 +30,20 @@ public class AttributeSwap extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgSwappingOptions = settings.createGroup("Swapping Options"); - private final SettingGroup sgSwordEnchants = settings.createGroup("Sword Enchants"); - private final SettingGroup sgMaceEnchants = settings.createGroup("Mace Enchants"); - private final SettingGroup sgOtherEnchants = settings.createGroup("Other Enchants"); - private final SettingGroup sgWeapon = settings.createGroup("Weapon Options"); + private final SettingGroup sgSwappingOptions = settings.createGroup("swapping-ptions"); + private final SettingGroup sgSwordEnchants = settings.createGroup("sword-enchants"); + private final SettingGroup sgMaceEnchants = settings.createGroup("mace-enchants"); + private final SettingGroup sgOtherEnchants = settings.createGroup("other-enchants"); + private final SettingGroup sgWeapon = settings.createGroup("weapon-options"); private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("The mode to use.") .defaultValue(Mode.Simple) .build() ); private final Setting targetSlot = sgGeneral.add(new IntSetting.Builder() .name("target-slot") - .description("Hotbar slot to swap to (1-9).") .defaultValue(1) .min(1) .sliderRange(1, 9) @@ -55,14 +53,12 @@ public class AttributeSwap extends Module { private final Setting swapBack = sgGeneral.add(new BoolSetting.Builder() .name("swap-back") - .description("Swap back to the original slot after a delay.") .defaultValue(true) .build() ); private final Setting swapBackDelay = sgGeneral.add(new IntSetting.Builder() .name("swap-back-delay") - .description("Delay in ticks before swapping back.") .defaultValue(2) .min(0) .max(100) @@ -73,7 +69,6 @@ public class AttributeSwap extends Module { private final Setting smartShieldBreak = sgSwappingOptions.add(new BoolSetting.Builder() .name("shield-breaker") - .description("Automatically swaps to an axe if the target is blocking.") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart) .build() @@ -81,7 +76,6 @@ public class AttributeSwap extends Module { private final Setting smartDurability = sgSwappingOptions.add(new BoolSetting.Builder() .name("durability-saver") - .description("Swaps to a non-damageable item to save durability on the main weapon.") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart) .build() @@ -89,7 +83,6 @@ public class AttributeSwap extends Module { private final Setting swordSwapping = sgSwappingOptions.add(new BoolSetting.Builder() .name("sword-swapping") - .description("Enables smart swapping for sword enchantments.") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart) .build() @@ -97,7 +90,6 @@ public class AttributeSwap extends Module { private final Setting maceSwapping = sgSwappingOptions.add(new BoolSetting.Builder() .name("mace-swapping") - .description("Enables smart swapping for mace enchantments.") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart) .build() @@ -105,7 +97,6 @@ public class AttributeSwap extends Module { private final Setting otherSwapping = sgSwappingOptions.add(new BoolSetting.Builder() .name("other-swapping") - .description("Enables smart swapping for other enchantments like Impaling.") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart) .build() @@ -113,7 +104,6 @@ public class AttributeSwap extends Module { private final Setting enchantFireAspect = sgSwordEnchants.add(new BoolSetting.Builder() .name("fire-aspect") - .description("Swaps to an item with Fire Aspect to set the target on fire, if target isn't already on fire") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart && swordSwapping.get()) .build() @@ -121,7 +111,6 @@ public class AttributeSwap extends Module { private final Setting enchantLooting = sgSwordEnchants.add(new BoolSetting.Builder() .name("looting") - .description("Swaps to an item with Looting for better drops or more experience. Only prefers for mobs (but fire aspect is priority)") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart && swordSwapping.get()) .build() @@ -129,7 +118,6 @@ public class AttributeSwap extends Module { private final Setting enchantSharpness = sgSwordEnchants.add(new BoolSetting.Builder() .name("sharpness") - .description("Swaps to an item with Sharpness for increased damage against all entities.") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart && swordSwapping.get()) .build() @@ -137,7 +125,6 @@ public class AttributeSwap extends Module { private final Setting enchantSmite = sgSwordEnchants.add(new BoolSetting.Builder() .name("smite") - .description("Swaps to an item with Smite for increased damage against undead mobs.") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart && swordSwapping.get()) .build() @@ -145,7 +132,6 @@ public class AttributeSwap extends Module { private final Setting enchantBaneOfArthropods = sgSwordEnchants.add(new BoolSetting.Builder() .name("bane-of-arthropods") - .description("Swaps to an item with Bane of Arthropods for increased damage against arthropods.") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart && swordSwapping.get()) .build() @@ -153,7 +139,6 @@ public class AttributeSwap extends Module { private final Setting enchantSweepingEdge = sgSwordEnchants.add(new BoolSetting.Builder() .name("sweeping-edge") - .description("Swaps to an item with Sweeping Edge for increased sweeping attack damage.") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart && swordSwapping.get()) .build() @@ -161,7 +146,6 @@ public class AttributeSwap extends Module { private final Setting regularMace = sgMaceEnchants.add(new BoolSetting.Builder() .name("regular-mace") - .description("Swaps to a regular Mace when falling if no better option is available.") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart && maceSwapping.get()) .build() @@ -169,7 +153,6 @@ public class AttributeSwap extends Module { private final Setting enchantDensity = sgMaceEnchants.add(new BoolSetting.Builder() .name("density") - .description("Swaps to a Mace with Density to deal increased damage when falling.") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart && maceSwapping.get()) .build() @@ -177,7 +160,6 @@ public class AttributeSwap extends Module { private final Setting enchantBreach = sgMaceEnchants.add(new BoolSetting.Builder() .name("breach") - .description("Swaps to a Mace with Breach to reduce the target's armor effectiveness.") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart && maceSwapping.get()) .build() @@ -185,7 +167,6 @@ public class AttributeSwap extends Module { private final Setting enchantWindBurst = sgMaceEnchants.add(new BoolSetting.Builder() .name("wind-burst") - .description("Swaps to a Mace with Wind Burst to launch up when hitting while falling.") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart && maceSwapping.get()) .build() @@ -193,7 +174,6 @@ public class AttributeSwap extends Module { private final Setting enchantImpaling = sgOtherEnchants.add(new BoolSetting.Builder() .name("impaling") - .description("Swaps to an item with Impaling for increased damage against aquatic mobs.") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart && otherSwapping.get()) .build() @@ -201,14 +181,12 @@ public class AttributeSwap extends Module { private final Setting onlyOnWeapon = sgWeapon.add(new BoolSetting.Builder() .name("only-on-weapon") - .description("Only swaps when holding a selected weapon in hand.") .defaultValue(false) .build() ); private final Setting sword = sgWeapon.add(new BoolSetting.Builder() .name("sword") - .description("Works while holding a sword.") .defaultValue(true) .visible(onlyOnWeapon::get) .build() @@ -216,7 +194,6 @@ public class AttributeSwap extends Module { private final Setting axe = sgWeapon.add(new BoolSetting.Builder() .name("axe") - .description("Works while holding an axe.") .defaultValue(true) .visible(onlyOnWeapon::get) .build() @@ -224,7 +201,6 @@ public class AttributeSwap extends Module { private final Setting pickaxe = sgWeapon.add(new BoolSetting.Builder() .name("pickaxe") - .description("Works while holding a pickaxe.") .defaultValue(true) .visible(onlyOnWeapon::get) .build() @@ -232,7 +208,6 @@ public class AttributeSwap extends Module { private final Setting shovel = sgWeapon.add(new BoolSetting.Builder() .name("shovel") - .description("Works while holding a shovel.") .defaultValue(true) .visible(onlyOnWeapon::get) .build() @@ -240,7 +215,6 @@ public class AttributeSwap extends Module { private final Setting hoe = sgWeapon.add(new BoolSetting.Builder() .name("hoe") - .description("Works while holding a hoe.") .defaultValue(true) .visible(onlyOnWeapon::get) .build() @@ -248,7 +222,6 @@ public class AttributeSwap extends Module { private final Setting mace = sgWeapon.add(new BoolSetting.Builder() .name("mace") - .description("Works while holding a mace.") .defaultValue(true) .visible(onlyOnWeapon::get) .build() @@ -256,7 +229,6 @@ public class AttributeSwap extends Module { private final Setting trident = sgWeapon.add(new BoolSetting.Builder() .name("trident") - .description("Works while holding a trident.") .defaultValue(true) .visible(onlyOnWeapon::get) .build() @@ -266,7 +238,7 @@ public class AttributeSwap extends Module { private boolean awaitingBack; public AttributeSwap() { - super(Categories.Combat, "attribute-swap", "Swaps to a target slot when you attack."); + super(Categories.Combat, "attribute-swap"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoAnvil.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoAnvil.java index 674afe4078..48c14df2fb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoAnvil.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoAnvil.java @@ -33,7 +33,6 @@ public class AutoAnvil extends Module { private final Setting range = sgGeneral.add(new DoubleSetting.Builder() .name("target-range") - .description("The radius in which players get targeted.") .defaultValue(4) .min(0) .sliderMax(5) @@ -42,14 +41,12 @@ public class AutoAnvil extends Module { private final Setting priority = sgGeneral.add(new EnumSetting.Builder() .name("target-priority") - .description("How to select the player to target.") .defaultValue(SortPriority.LowestHealth) .build() ); private final Setting height = sgGeneral.add(new IntSetting.Builder() .name("height") - .description("The height to place anvils at.") .defaultValue(2) .range(0, 5) .sliderMax(5) @@ -58,7 +55,6 @@ public class AutoAnvil extends Module { private final Setting delay = sgGeneral.add(new IntSetting.Builder() .name("delay") - .description("The delay in between anvil placements.") .defaultValue(10) .min(0) .sliderMax(50) @@ -67,28 +63,24 @@ public class AutoAnvil extends Module { private final Setting placeButton = sgGeneral.add(new BoolSetting.Builder() .name("place-at-feet") - .description("Automatically places a button or pressure plate at the targets feet to break the anvils.") .defaultValue(true) .build() ); private final Setting multiPlace = sgGeneral.add(new BoolSetting.Builder() .name("multi-place") - .description("Places multiple anvils at once.") .defaultValue(true) .build() ); private final Setting toggleOnBreak = sgGeneral.add(new BoolSetting.Builder() .name("toggle-on-break") - .description("Toggles when the target's helmet slot is empty.") .defaultValue(false) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Automatically rotates towards the position anvils/pressure plates/buttons are placed.") .defaultValue(true) .build() ); @@ -97,7 +89,7 @@ public class AutoAnvil extends Module { private int timer; public AutoAnvil() { - super(Categories.Combat, "auto-anvil", "Automatically places anvils above players to destroy helmets."); + super(Categories.Combat, "auto-anvil"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoArmor.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoArmor.java index 476b016a0c..1e3d75ac96 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoArmor.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoArmor.java @@ -37,14 +37,12 @@ public class AutoArmor extends Module { private final Setting preferredProtection = sgGeneral.add(new EnumSetting.Builder() .name("preferred-protection") - .description("Which type of protection to prefer.") .defaultValue(Protection.Protection) .build() ); private final Setting delay = sgGeneral.add(new IntSetting.Builder() .name("swap-delay") - .description("The delay between equipping armor pieces.") .defaultValue(1) .min(0) .sliderMax(5) @@ -53,28 +51,24 @@ public class AutoArmor extends Module { private final Setting>> avoidedEnchantments = sgGeneral.add(new EnchantmentListSetting.Builder() .name("avoided-enchantments") - .description("Enchantments that should be avoided.") .defaultValue(Enchantments.BINDING_CURSE, Enchantments.FROST_WALKER) .build() ); private final Setting blastLeggings = sgGeneral.add(new BoolSetting.Builder() .name("blast-prot-leggings") - .description("Uses blast protection for leggings regardless of preferred protection.") .defaultValue(true) .build() ); private final Setting antiBreak = sgGeneral.add(new BoolSetting.Builder() .name("anti-break") - .description("Takes off armor if it is about to break.") .defaultValue(false) .build() ); private final Setting ignoreElytra = sgGeneral.add(new BoolSetting.Builder() .name("ignore-elytra") - .description("Will not replace your elytra if you have it equipped.") .defaultValue(true) .build() ); @@ -88,7 +82,7 @@ public class AutoArmor extends Module { private int timer; public AutoArmor() { - super(Categories.Combat, "auto-armor", "Automatically equips armor."); + super(Categories.Combat, "auto-armor"); armorPieces[0] = helmet; armorPieces[1] = chestplate; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java index a7e3629c6f..8a4293619b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java @@ -31,12 +31,11 @@ public class AutoCity extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgRender = settings.createGroup("render"); private final Setting targetRange = sgGeneral.add(new DoubleSetting.Builder() .name("target-range") - .description("The radius in which players get targeted.") .defaultValue(5.5) .min(0) .sliderMax(7) @@ -45,7 +44,6 @@ public class AutoCity extends Module { private final Setting breakRange = sgGeneral.add(new DoubleSetting.Builder() .name("break-range") - .description("How close a block must be to you to be considered.") .defaultValue(4.5) .min(0) .sliderMax(6) @@ -54,21 +52,18 @@ public class AutoCity extends Module { private final Setting switchMode = sgGeneral.add(new EnumSetting.Builder() .name("switch-mode") - .description("How to switch to a pickaxe.") .defaultValue(SwitchMode.Normal) .build() ); private final Setting support = sgGeneral.add(new BoolSetting.Builder() .name("support") - .description("If there is no block below a city block it will place one before mining.") .defaultValue(true) .build() ); private final Setting placeRange = sgGeneral.add(new DoubleSetting.Builder() .name("place-range") - .description("How far away to try and place a block.") .defaultValue(4.5) .min(0) .sliderMax(6) @@ -78,14 +73,12 @@ public class AutoCity extends Module { private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Automatically rotates you towards the city block.") .defaultValue(true) .build() ); private final Setting chatInfo = sgGeneral.add(new BoolSetting.Builder() .name("chat-info") - .description("Whether the module should send messages in chat.") .defaultValue(true) .build() ); @@ -94,21 +87,18 @@ public class AutoCity extends Module { private final Setting swingHand = sgRender.add(new BoolSetting.Builder() .name("swing-hand") - .description("Whether to render your hand swinging.") .defaultValue(false) .build() ); private final Setting renderBlock = sgRender.add(new BoolSetting.Builder() .name("render-block") - .description("Whether to render the block being broken.") .defaultValue(true) .build() ); private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .visible(renderBlock::get) .build() @@ -116,7 +106,6 @@ public class AutoCity extends Module { private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The side color of the rendering.") .defaultValue(new SettingColor(225, 0, 0, 75)) .visible(() -> renderBlock.get() && shapeMode.get().sides()) .build() @@ -124,7 +113,6 @@ public class AutoCity extends Module { private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The line color of the rendering.") .defaultValue(new SettingColor(225, 0, 0, 255)) .visible(() -> renderBlock.get() && shapeMode.get().lines()) .build() @@ -136,7 +124,7 @@ public class AutoCity extends Module { private float progress; public AutoCity() { - super(Categories.Combat, "auto-city", "Automatically mine blocks next to someone's feet."); + super(Categories.Combat, "auto-city"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoEXP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoEXP.java index b79065eb46..76cd66ac7b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoEXP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoEXP.java @@ -27,28 +27,24 @@ public class AutoEXP extends Module { private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("Which items to repair.") .defaultValue(Mode.Both) .build() ); private final Setting replenish = sgGeneral.add(new BoolSetting.Builder() .name("replenish") - .description("Automatically replenishes exp into a selected hotbar slot.") .defaultValue(true) .build() ); private final Setting onlyGround = sgGeneral.add(new BoolSetting.Builder() .name("only-on-ground") - .description("Only throw when the player is on the ground.") .defaultValue(false) .build() ); private final Setting slot = sgGeneral.add(new IntSetting.Builder() .name("exp-slot") - .description("The slot to replenish exp into.") .visible(replenish::get) .defaultValue(6) .range(1, 9) @@ -58,7 +54,6 @@ public class AutoEXP extends Module { private final Setting minThreshold = sgGeneral.add(new IntSetting.Builder() .name("min-threshold") - .description("The minimum durability percentage that an item needs to fall to, to be repaired.") .defaultValue(30) .range(1, 100) .sliderRange(1, 100) @@ -67,7 +62,6 @@ public class AutoEXP extends Module { private final Setting maxThreshold = sgGeneral.add(new IntSetting.Builder() .name("max-threshold") - .description("The maximum durability percentage to repair items to.") .defaultValue(80) .range(1, 100) .sliderRange(1, 100) @@ -77,7 +71,7 @@ public class AutoEXP extends Module { private int repairingI; public AutoEXP() { - super(Categories.Combat, "auto-exp", "Automatically repairs your armor and tools in pvp."); + super(Categories.Combat, "auto-exp"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoLog.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoLog.java index a7245f206e..8914571a50 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoLog.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoLog.java @@ -35,11 +35,10 @@ public class AutoLog extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgEntities = settings.createGroup("Entities"); + private final SettingGroup sgEntities = settings.createGroup("entities"); private final Setting health = sgGeneral.add(new IntSetting.Builder() .name("health") - .description("Automatically disconnects when health is lower or equal to this value. Set to 0 to disable.") .defaultValue(6) .range(0, 19) .sliderMax(19) @@ -48,14 +47,12 @@ public class AutoLog extends Module { private final Setting smart = sgGeneral.add(new BoolSetting.Builder() .name("predict-incoming-damage") - .description("Disconnects when it detects you're about to take enough damage to set you under the 'health' setting.") .defaultValue(true) .build() ); private final Setting totemPops = sgGeneral.add(new IntSetting.Builder() .name("totem-pops") - .description("Disconnects when you have popped this many totems. Set to 0 to disable.") .defaultValue(0) .min(0) .build() @@ -63,35 +60,30 @@ public class AutoLog extends Module { private final Setting onlyTrusted = sgGeneral.add(new BoolSetting.Builder() .name("only-trusted") - .description("Disconnects when a player not on your friends list appears in render distance.") .defaultValue(false) .build() ); private final Setting instantDeath = sgGeneral.add(new BoolSetting.Builder() .name("32K") - .description("Disconnects when a player near you can instantly kill you.") .defaultValue(false) .build() ); private final Setting smartToggle = sgGeneral.add(new BoolSetting.Builder() .name("smart-toggle") - .description("Disables Auto Log after a low-health logout. WILL re-enable once you heal.") .defaultValue(false) .build() ); private final Setting toggleOff = sgGeneral.add(new BoolSetting.Builder() .name("toggle-off") - .description("Disables Auto Log after usage.") .defaultValue(true) .build() ); private final Setting toggleAutoReconnect = sgGeneral.add(new BoolSetting.Builder() .name("toggle-auto-reconnect") - .description("Whether to disable Auto Reconnect after a logout.") .defaultValue(true) .build() ); @@ -100,21 +92,18 @@ public class AutoLog extends Module { private final Setting>> entities = sgEntities.add(new EntityTypeListSetting.Builder() .name("entities") - .description("Disconnects when a specified entity is present within a specified range.") .defaultValue(EntityType.END_CRYSTAL) .build() ); private final Setting useTotalCount = sgEntities.add(new BoolSetting.Builder() .name("use-total-count") - .description("Toggle between counting the total number of all selected entities or each entity individually.") .defaultValue(true) .visible(() -> !entities.get().isEmpty()) .build()); private final Setting combinedEntityThreshold = sgEntities.add(new IntSetting.Builder() .name("combined-entity-threshold") - .description("The minimum total number of selected entities that must be near you before disconnection occurs.") .defaultValue(10) .min(1) .sliderMax(32) @@ -124,7 +113,6 @@ public class AutoLog extends Module { private final Setting individualEntityThreshold = sgEntities.add(new IntSetting.Builder() .name("individual-entity-threshold") - .description("The minimum number of entities individually that must be near you before disconnection occurs.") .defaultValue(2) .min(1) .sliderMax(16) @@ -134,7 +122,6 @@ public class AutoLog extends Module { private final Setting range = sgEntities.add(new IntSetting.Builder() .name("range") - .description("How close an entity has to be to you before you disconnect.") .defaultValue(5) .min(1) .sliderMax(16) @@ -148,7 +135,7 @@ public class AutoLog extends Module { private int pops; public AutoLog() { - super(Categories.Combat, "auto-log", "Automatically disconnects you when certain requirements are met."); + super(Categories.Combat, "auto-log"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTotem.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTotem.java index 9682a1f166..2df546f202 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTotem.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTotem.java @@ -26,14 +26,12 @@ public class AutoTotem extends Module { private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("Determines when to hold a totem, strict will always hold.") .defaultValue(Mode.Smart) .build() ); private final Setting delay = sgGeneral.add(new IntSetting.Builder() .name("delay") - .description("The ticks between slot movements.") .defaultValue(0) .min(0) .build() @@ -41,7 +39,6 @@ public class AutoTotem extends Module { private final Setting health = sgGeneral.add(new IntSetting.Builder() .name("health") - .description("The health to hold a totem at.") .defaultValue(10) .range(0, 36) .sliderMax(36) @@ -51,7 +48,6 @@ public class AutoTotem extends Module { private final Setting elytra = sgGeneral.add(new BoolSetting.Builder() .name("elytra") - .description("Will always hold a totem when flying with elytra.") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart) .build() @@ -59,7 +55,6 @@ public class AutoTotem extends Module { private final Setting fall = sgGeneral.add(new BoolSetting.Builder() .name("fall") - .description("Will hold a totem when fall damage could kill you.") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart) .build() @@ -67,7 +62,6 @@ public class AutoTotem extends Module { private final Setting explosion = sgGeneral.add(new BoolSetting.Builder() .name("explosion") - .description("Will hold a totem when explosion damage could kill you.") .defaultValue(true) .visible(() -> mode.get() == Mode.Smart) .build() @@ -77,7 +71,7 @@ public class AutoTotem extends Module { private int totems, ticks; public AutoTotem() { - super(Categories.Combat, "auto-totem", "Automatically equips a totem in your offhand."); + super(Categories.Combat, "auto-totem"); } @EventHandler(priority = EventPriority.HIGHEST) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java index d22367c277..1a4c69071d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java @@ -39,20 +39,18 @@ public class AutoTrap extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("whitelist") - .description("Which blocks to use.") .defaultValue(Blocks.OBSIDIAN, Blocks.CRYING_OBSIDIAN) .build() ); private final Setting placeRange = sgGeneral.add(new DoubleSetting.Builder() .name("place-range") - .description("The range at which blocks can be placed.") .defaultValue(4) .min(0) .sliderMax(6) @@ -61,7 +59,6 @@ public class AutoTrap extends Module { private final Setting placeWallsRange = sgGeneral.add(new DoubleSetting.Builder() .name("walls-range") - .description("Range in which to place when behind blocks.") .defaultValue(4) .min(0) .sliderMax(6) @@ -70,14 +67,12 @@ public class AutoTrap extends Module { private final Setting priority = sgGeneral.add(new EnumSetting.Builder() .name("target-priority") - .description("How to select the player to target.") .defaultValue(SortPriority.LowestHealth) .build() ); private final Setting targetRange = sgGeneral.add(new DoubleSetting.Builder() .name("target-range") - .description("The maximum distance to target players.") .defaultValue(3) .min(0) .sliderMax(10) @@ -86,14 +81,12 @@ public class AutoTrap extends Module { private final Setting delay = sgGeneral.add(new IntSetting.Builder() .name("place-delay") - .description("How many ticks between block placements.") .defaultValue(1) .build() ); private final Setting blocksPerTick = sgGeneral.add(new IntSetting.Builder() .name("blocks-per-tick") - .description("How many blocks to place in one tick.") .defaultValue(1) .min(1) .build() @@ -101,28 +94,24 @@ public class AutoTrap extends Module { private final Setting topPlacement = sgGeneral.add(new EnumSetting.Builder() .name("top-blocks") - .description("Which blocks to place on the top half of the target.") .defaultValue(TopMode.Full) .build() ); private final Setting bottomPlacement = sgGeneral.add(new EnumSetting.Builder() .name("bottom-blocks") - .description("Which blocks to place on the bottom half of the target.") .defaultValue(BottomMode.Platform) .build() ); private final Setting selfToggle = sgGeneral.add(new BoolSetting.Builder() .name("self-toggle") - .description("Turns off after placing all blocks.") .defaultValue(true) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Rotates towards blocks when placing.") .defaultValue(true) .build() ); @@ -131,14 +120,12 @@ public class AutoTrap extends Module { private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") - .description("Renders an overlay where blocks will be placed.") .defaultValue(true) .build() ); private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .visible(render::get) .build() @@ -146,7 +133,6 @@ public class AutoTrap extends Module { private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The side color of the target block rendering.") .defaultValue(new SettingColor(197, 137, 232, 10)) .visible(() -> render.get() && shapeMode.get().sides()) .build() @@ -154,7 +140,6 @@ public class AutoTrap extends Module { private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The line color of the target block rendering.") .defaultValue(new SettingColor(197, 137, 232)) .visible(() -> render.get() && shapeMode.get().lines()) .build() @@ -162,7 +147,6 @@ public class AutoTrap extends Module { private final Setting nextSideColor = sgRender.add(new ColorSetting.Builder() .name("next-side-color") - .description("The side color of the next block to be placed.") .defaultValue(new SettingColor(227, 196, 245, 10)) .visible(() -> render.get() && shapeMode.get().sides()) .build() @@ -170,7 +154,6 @@ public class AutoTrap extends Module { private final Setting nextLineColor = sgRender.add(new ColorSetting.Builder() .name("next-line-color") - .description("The line color of the next block to be placed.") .defaultValue(new SettingColor(5, 139, 221)) .visible(() -> render.get() && shapeMode.get().lines()) .build() @@ -182,7 +165,7 @@ public class AutoTrap extends Module { private int timer; public AutoTrap() { - super(Categories.Combat, "auto-trap", "Traps people in a box to prevent them from moving."); + super(Categories.Combat, "auto-trap"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeapon.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeapon.java index 3285e112f1..3ac0399e38 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeapon.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeapon.java @@ -22,27 +22,24 @@ public class AutoWeapon extends Module { private final Setting weapon = sgGeneral.add(new EnumSetting.Builder() .name("weapon") - .description("What type of weapon to use.") .defaultValue(Weapon.Sword) .build() ); private final Setting threshold = sgGeneral.add(new IntSetting.Builder() .name("threshold") - .description("If the non-preferred weapon produces this much damage this will favor it over your preferred weapon.") .defaultValue(4) .build() ); private final Setting antiBreak = sgGeneral.add(new BoolSetting.Builder() .name("anti-break") - .description("Prevents you from breaking your weapon.") .defaultValue(false) .build() ); public AutoWeapon() { - super(Categories.Combat, "auto-weapon", "Finds the best weapon to use in your hotbar."); + super(Categories.Combat, "auto-weapon"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeb.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeb.java index 0199240000..735f598989 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeb.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeb.java @@ -31,11 +31,10 @@ public class AutoWeb extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgRender = settings.createGroup("render"); private final Setting placeRange = sgGeneral.add(new DoubleSetting.Builder() .name("place-range") - .description("The range at which webs can be placed.") .defaultValue(4) .min(0) .sliderMax(6) @@ -44,7 +43,6 @@ public class AutoWeb extends Module { private final Setting placeWallsRange = sgGeneral.add(new DoubleSetting.Builder() .name("walls-range") - .description("Range in which to place webs when behind blocks.") .defaultValue(4) .min(0) .sliderMax(6) @@ -53,14 +51,12 @@ public class AutoWeb extends Module { private final Setting priority = sgGeneral.add(new EnumSetting.Builder() .name("target-priority") - .description("How to filter targets within range.") .defaultValue(SortPriority.LowestDistance) .build() ); private final Setting targetRange = sgGeneral.add(new DoubleSetting.Builder() .name("target-range") - .description("The maximum distance to target players.") .defaultValue(10) .min(0) .sliderMax(30) @@ -69,14 +65,12 @@ public class AutoWeb extends Module { private final Setting predictMovement = sgGeneral.add(new BoolSetting.Builder() .name("predict-movement") - .description("Predict target movement to account for ping.") .defaultValue(true) .build() ); private final Setting ticksToPredict = sgGeneral.add(new DoubleSetting.Builder() .name("ticks-to-predict") - .description("How many ticks ahead we should predict for.") .defaultValue(10) .min(1) .sliderMax(30) @@ -86,14 +80,12 @@ public class AutoWeb extends Module { private final Setting doubles = sgGeneral.add(new BoolSetting.Builder() .name("doubles") - .description("Places webs in the target's upper hitbox as well as the lower hitbox.") .defaultValue(false) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Rotates towards the webs when placing.") .defaultValue(true) .build() ); @@ -102,14 +94,12 @@ public class AutoWeb extends Module { private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") - .description("Renders an overlay where webs are placed.") .defaultValue(true) .build() ); private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .visible(render::get) .build() @@ -117,7 +107,6 @@ public class AutoWeb extends Module { private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The side color of the placed web rendering.") .defaultValue(new SettingColor(239, 231, 244, 31)) .visible(() -> render.get() && shapeMode.get().sides()) .build() @@ -125,7 +114,6 @@ public class AutoWeb extends Module { private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The line color of the placed web rendering.") .defaultValue(new SettingColor(255, 255, 255)) .visible(() -> render.get() && shapeMode.get().lines()) .build() @@ -135,7 +123,7 @@ public class AutoWeb extends Module { private PlayerEntity target = null; public AutoWeb() { - super(Categories.Combat, "auto-web", "Automatically places webs on other players."); + super(Categories.Combat, "auto-web"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java index c0dfa23870..930f1fe5b9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java @@ -38,16 +38,15 @@ public class BedAura extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgTargeting = settings.createGroup("Targeting"); - private final SettingGroup sgAutoMove = settings.createGroup("Inventory"); - private final SettingGroup sgPause = settings.createGroup("Pause"); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgTargeting = settings.createGroup("targeting"); + private final SettingGroup sgAutoMove = settings.createGroup("inventory"); + private final SettingGroup sgPause = settings.createGroup("pause"); + private final SettingGroup sgRender = settings.createGroup("render"); // General private final Setting delay = sgGeneral.add(new IntSetting.Builder() .name("delay") - .description("The delay between placing beds in ticks.") .defaultValue(9) .min(0) .sliderMax(20) @@ -56,7 +55,6 @@ public class BedAura extends Module { private final Setting strictDirection = sgGeneral.add(new BoolSetting.Builder() .name("strict-direction") - .description("Only places beds in the direction you are facing.") .defaultValue(false) .build() ); @@ -65,7 +63,6 @@ public class BedAura extends Module { private final Setting targetRange = sgTargeting.add(new DoubleSetting.Builder() .name("target-range") - .description("The range at which players can be targeted.") .defaultValue(4) .min(0) .sliderMax(5) @@ -74,14 +71,12 @@ public class BedAura extends Module { private final Setting priority = sgTargeting.add(new EnumSetting.Builder() .name("target-priority") - .description("How to filter targets within range.") .defaultValue(SortPriority.LowestHealth) .build() ); private final Setting minDamage = sgTargeting.add(new DoubleSetting.Builder() .name("min-damage") - .description("The minimum damage to inflict on your target.") .defaultValue(7) .range(0, 36) .sliderMax(36) @@ -90,7 +85,6 @@ public class BedAura extends Module { private final Setting maxSelfDamage = sgTargeting.add(new DoubleSetting.Builder() .name("max-self-damage") - .description("The maximum damage to inflict on yourself.") .defaultValue(7) .range(0, 36) .sliderMax(36) @@ -99,7 +93,6 @@ public class BedAura extends Module { private final Setting antiSuicide = sgTargeting.add(new BoolSetting.Builder() .name("anti-suicide") - .description("Will not place and break beds if they will kill you.") .defaultValue(true) .build() ); @@ -108,14 +101,12 @@ public class BedAura extends Module { private final Setting autoMove = sgAutoMove.add(new BoolSetting.Builder() .name("auto-move") - .description("Moves beds into a selected hotbar slot.") .defaultValue(false) .build() ); private final Setting autoMoveSlot = sgAutoMove.add(new IntSetting.Builder() .name("auto-move-slot") - .description("The slot auto move moves beds to.") .defaultValue(9) .range(1, 9) .sliderRange(1, 9) @@ -125,7 +116,6 @@ public class BedAura extends Module { private final Setting autoSwitch = sgAutoMove.add(new BoolSetting.Builder() .name("auto-switch") - .description("Switches to and from beds automatically.") .defaultValue(true) .build() ); @@ -134,21 +124,18 @@ public class BedAura extends Module { private final Setting pauseOnEat = sgPause.add(new BoolSetting.Builder() .name("pause-on-eat") - .description("Pauses while eating.") .defaultValue(true) .build() ); private final Setting pauseOnDrink = sgPause.add(new BoolSetting.Builder() .name("pause-on-drink") - .description("Pauses while drinking.") .defaultValue(true) .build() ); private final Setting pauseOnMine = sgPause.add(new BoolSetting.Builder() .name("pause-on-mine") - .description("Pauses while mining.") .defaultValue(true) .build() ); @@ -157,35 +144,30 @@ public class BedAura extends Module { private final Setting swing = sgRender.add(new BoolSetting.Builder() .name("swing") - .description("Whether to swing hand client-side.") .defaultValue(true) .build() ); private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") - .description("Renders the block where it is placing a bed.") .defaultValue(true) .build() ); private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The side color for positions to be placed.") .defaultValue(new SettingColor(15, 255, 211,75)) .build() ); private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The line color for positions to be placed.") .defaultValue(new SettingColor(15, 255, 211)) .build() ); @@ -196,7 +178,7 @@ public class BedAura extends Module { private int timer; public BedAura() { - super(Categories.Combat, "bed-aura", "Automatically places and explodes beds in the Nether and End."); + super(Categories.Combat, "bed-aura"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java index f978b420cd..2263596ba5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java @@ -35,7 +35,6 @@ public class BowAimbot extends Module { private final Setting range = sgGeneral.add(new DoubleSetting.Builder() .name("range") - .description("The maximum range the entity can be to aim at it.") .defaultValue(20) .range(0, 100) .sliderMax(100) @@ -44,28 +43,24 @@ public class BowAimbot extends Module { private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("entities") - .description("Entities to attack.") .onlyAttackable() .build() ); private final Setting priority = sgGeneral.add(new EnumSetting.Builder() .name("priority") - .description("What type of entities to target.") .defaultValue(SortPriority.LowestHealth) .build() ); private final Setting babies = sgGeneral.add(new BoolSetting.Builder() .name("babies") - .description("Whether or not to attack baby variants of the entity.") .defaultValue(true) .build() ); private final Setting nametagged = sgGeneral.add(new BoolSetting.Builder() .name("nametagged") - .description("Whether or not to attack mobs with a name tag.") .defaultValue(false) .build() ); @@ -73,7 +68,6 @@ public class BowAimbot extends Module { private final Setting pauseOnCombat = sgGeneral.add(new BoolSetting.Builder() .name("pause-on-combat") - .description("Freezes Baritone temporarily until you released the bow.") .defaultValue(false) .build() ); @@ -82,7 +76,7 @@ public class BowAimbot extends Module { private Entity target; public BowAimbot() { - super(Categories.Combat, "bow-aimbot", "Automatically aims your bow for you."); + super(Categories.Combat, "bow-aimbot"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowSpam.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowSpam.java index d269633452..bb69d55a04 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowSpam.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowSpam.java @@ -23,11 +23,10 @@ public class BowSpam extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgCrossbows = settings.createGroup("Crossbows"); + private final SettingGroup sgCrossbows = settings.createGroup("crossbows"); private final Setting charge = sgGeneral.add(new IntSetting.Builder() .name("charge") - .description("How long to charge the bow before releasing in ticks.") .defaultValue(5) .range(4, 20) .sliderRange(4, 20) @@ -36,21 +35,18 @@ public class BowSpam extends Module { private final Setting onlyWhenHoldingRightClick = sgGeneral.add(new BoolSetting.Builder() .name("when-holding-right-click") - .description("Works only when holding right click.") .defaultValue(false) .build() ); private final Setting spamCrossbows = sgCrossbows.add(new BoolSetting.Builder() .name("spam-crossbows") - .description("Whether to spam loaded crossbows; takes priority over charging bows.") .defaultValue(true) .build() ); private final Setting crossbowDelay = sgCrossbows.add(new IntSetting.Builder() .name("crossbow-delay") - .description("Delay between shooting crossbows in ticks.") .defaultValue(10) .sliderRange(0, 20) .min(0) @@ -59,7 +55,6 @@ public class BowSpam extends Module { private final Setting searchInventory = sgCrossbows.add(new BoolSetting.Builder() .name("search-inventory") - .description("Whether to search your inventory to find loaded crossbows.") .defaultValue(true) .build() ); @@ -69,7 +64,7 @@ public class BowSpam extends Module { private int ticks = 0; public BowSpam() { - super(Categories.Combat, "bow-spam", "Spams bows and crossbows.", "auto-bow", "crossbow-spam", "auto-crossbow"); + super(Categories.Combat, "bow-spam", "auto-bow", "crossbow-spam", "auto-crossbow"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Burrow.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Burrow.java index 0a052c34c9..f8367b35f0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Burrow.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Burrow.java @@ -38,28 +38,24 @@ public class Burrow extends Module { private final Setting block = sgGeneral.add(new EnumSetting.Builder() .name("block-to-use") - .description("The block to use for Burrow.") .defaultValue(Block.EChest) .build() ); private final Setting instant = sgGeneral.add(new BoolSetting.Builder() .name("instant") - .description("Jumps with packets rather than vanilla jump.") .defaultValue(true) .build() ); private final Setting automatic = sgGeneral.add(new BoolSetting.Builder() .name("automatic") - .description("Automatically burrows on activate rather than waiting for jump.") .defaultValue(true) .build() ); private final Setting triggerHeight = sgGeneral.add(new DoubleSetting.Builder() .name("trigger-height") - .description("How high you have to jump before a rubberband is triggered.") .defaultValue(1.12) .range(0.01, 1.4) .sliderRange(0.01, 1.4) @@ -68,7 +64,6 @@ public class Burrow extends Module { private final Setting rubberbandHeight = sgGeneral.add(new DoubleSetting.Builder() .name("rubberband-height") - .description("How far to attempt to cause rubberband.") .defaultValue(12) .sliderMin(-30) .sliderMax(30) @@ -77,7 +72,6 @@ public class Burrow extends Module { private final Setting timer = sgGeneral.add(new DoubleSetting.Builder() .name("timer") - .description("Timer override.") .defaultValue(1) .min(0.01) .sliderRange(0.01, 10) @@ -86,21 +80,18 @@ public class Burrow extends Module { private final Setting onlyInHole = sgGeneral.add(new BoolSetting.Builder() .name("only-in-holes") - .description("Stops you from burrowing when not in a hole.") .defaultValue(false) .build() ); private final Setting center = sgGeneral.add(new BoolSetting.Builder() .name("center") - .description("Centers you to the middle of the block before burrowing.") .defaultValue(true) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Faces the block you place server-side.") .defaultValue(true) .build() ); @@ -109,7 +100,7 @@ public class Burrow extends Module { private boolean shouldBurrow; public Burrow() { - super(Categories.Combat, "burrow", "Attempts to clip you into a block."); + super(Categories.Combat, "burrow"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Criticals.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Criticals.java index 02e60af412..239a853704 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Criticals.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Criticals.java @@ -27,18 +27,16 @@ public class Criticals extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgMace = settings.createGroup("Mace"); + private final SettingGroup sgMace = settings.createGroup("mace"); private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("The mode on how Criticals will function.") .defaultValue(Mode.Packet) .build() ); private final Setting ka = sgGeneral.add(new BoolSetting.Builder() .name("only-killaura") - .description("Only performs crits when using killaura.") .defaultValue(false) .visible(() -> mode.get() != Mode.None) .build() @@ -46,14 +44,12 @@ public class Criticals extends Module { private final Setting mace = sgMace.add(new BoolSetting.Builder() .name("smash-attack") - .description("Will always perform smash attacks when using a mace.") .defaultValue(true) .build() ); private final Setting extraHeight = sgMace.add(new DoubleSetting.Builder() .name("additional-height") - .description("The amount of additional height to spoof. More height means more damage.") .defaultValue(0.0) .min(0) .sliderRange(0, 100) @@ -69,7 +65,7 @@ public class Criticals extends Module { private boolean waitingForPeak; public Criticals() { - super(Categories.Combat, "criticals", "Performs critical attacks when you hit your target."); + super(Categories.Combat, "criticals"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java index b3e4461342..5fb24d3c90 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java @@ -68,18 +68,17 @@ public class CrystalAura extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgSwitch = settings.createGroup("Switch"); - private final SettingGroup sgPlace = settings.createGroup("Place"); - private final SettingGroup sgFacePlace = settings.createGroup("Face Place"); - private final SettingGroup sgBreak = settings.createGroup("Break"); - private final SettingGroup sgPause = settings.createGroup("Pause"); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgSwitch = settings.createGroup("switch"); + private final SettingGroup sgPlace = settings.createGroup("place"); + private final SettingGroup sgFacePlace = settings.createGroup("face-place"); + private final SettingGroup sgBreak = settings.createGroup("break"); + private final SettingGroup sgPause = settings.createGroup("pause"); + private final SettingGroup sgRender = settings.createGroup("render"); // General private final Setting targetRange = sgGeneral.add(new DoubleSetting.Builder() .name("target-range") - .description("Range in which to target players.") .defaultValue(10) .min(0) .sliderMax(16) @@ -88,14 +87,12 @@ public class CrystalAura extends Module { private final Setting predictMovement = sgGeneral.add(new BoolSetting.Builder() .name("predict-movement") - .description("Predicts target movement.") .defaultValue(false) .build() ); private final Setting minDamage = sgGeneral.add(new DoubleSetting.Builder() .name("min-damage") - .description("Minimum damage the crystal needs to deal to your target.") .defaultValue(6) .min(0) .build() @@ -103,7 +100,6 @@ public class CrystalAura extends Module { private final Setting maxDamage = sgGeneral.add(new DoubleSetting.Builder() .name("max-damage") - .description("Maximum damage crystals can deal to yourself.") .defaultValue(6) .range(0, 36) .sliderMax(36) @@ -112,28 +108,24 @@ public class CrystalAura extends Module { private final Setting antiSuicide = sgGeneral.add(new BoolSetting.Builder() .name("anti-suicide") - .description("Will not place and break crystals if they will kill you.") .defaultValue(true) .build() ); private final Setting ignoreNakeds = sgGeneral.add(new BoolSetting.Builder() .name("ignore-nakeds") - .description("Ignore players with no items.") .defaultValue(false) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Rotates server-side towards the crystals being hit/placed.") .defaultValue(true) .build() ); private final Setting yawStepMode = sgGeneral.add(new EnumSetting.Builder() .name("yaw-steps-mode") - .description("When to run the yaw steps check.") .defaultValue(YawStepMode.Break) .visible(rotate::get) .build() @@ -141,7 +133,6 @@ public class CrystalAura extends Module { private final Setting yawSteps = sgGeneral.add(new DoubleSetting.Builder() .name("yaw-steps") - .description("Maximum number of degrees its allowed to rotate in one tick.") .defaultValue(180) .range(1, 180) .visible(rotate::get) @@ -150,7 +141,6 @@ public class CrystalAura extends Module { private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("entities") - .description("Entities to attack.") .onlyAttackable() .defaultValue(EntityType.PLAYER, EntityType.WARDEN, EntityType.WITHER) .build() @@ -160,14 +150,12 @@ public class CrystalAura extends Module { private final Setting autoSwitch = sgSwitch.add(new EnumSetting.Builder() .name("auto-switch") - .description("Switches to crystals in your hotbar once a target is found.") .defaultValue(AutoSwitchMode.Normal) .build() ); private final Setting switchDelay = sgSwitch.add(new IntSetting.Builder() .name("switch-delay") - .description("The delay in ticks to wait to break a crystal after switching hotbar slot.") .defaultValue(0) .min(0) .build() @@ -175,7 +163,6 @@ public class CrystalAura extends Module { private final Setting noGapSwitch = sgSwitch.add(new BoolSetting.Builder() .name("no-gap-switch") - .description("Won't auto switch if you're holding a gapple.") .defaultValue(true) .visible(() -> autoSwitch.get() == AutoSwitchMode.Normal) .build() @@ -183,14 +170,12 @@ public class CrystalAura extends Module { private final Setting noBowSwitch = sgSwitch.add(new BoolSetting.Builder() .name("no-bow-switch") - .description("Won't auto switch if you're holding a bow.") .defaultValue(true) .build() ); private final Setting antiWeakness = sgSwitch.add(new BoolSetting.Builder() .name("anti-weakness") - .description("Switches to tools with so you can break crystals with the weakness effect.") .defaultValue(true) .build() ); @@ -199,14 +184,12 @@ public class CrystalAura extends Module { private final Setting doPlace = sgPlace.add(new BoolSetting.Builder() .name("place") - .description("If the CA should place crystals.") .defaultValue(true) .build() ); public final Setting placeDelay = sgPlace.add(new IntSetting.Builder() .name("place-delay") - .description("The delay in ticks to wait to place a crystal after it's exploded.") .defaultValue(0) .min(0) .sliderMax(20) @@ -215,7 +198,6 @@ public class CrystalAura extends Module { private final Setting placeRange = sgPlace.add(new DoubleSetting.Builder() .name("place-range") - .description("Range in which to place crystals.") .defaultValue(4.5) .min(0) .sliderMax(6) @@ -224,7 +206,6 @@ public class CrystalAura extends Module { private final Setting placeWallsRange = sgPlace.add(new DoubleSetting.Builder() .name("walls-range") - .description("Range in which to place crystals when behind blocks.") .defaultValue(4.5) .min(0) .sliderMax(6) @@ -233,21 +214,18 @@ public class CrystalAura extends Module { private final Setting placement112 = sgPlace.add(new BoolSetting.Builder() .name("1.12-placement") - .description("Uses 1.12 crystal placement.") .defaultValue(false) .build() ); private final Setting support = sgPlace.add(new EnumSetting.Builder() .name("support") - .description("Places a support block in air if no other position have been found.") .defaultValue(SupportMode.Disabled) .build() ); private final Setting supportDelay = sgPlace.add(new IntSetting.Builder() .name("support-delay") - .description("Delay in ticks after placing support block.") .defaultValue(1) .min(0) .visible(() -> support.get() != SupportMode.Disabled) @@ -258,14 +236,12 @@ public class CrystalAura extends Module { private final Setting facePlace = sgFacePlace.add(new BoolSetting.Builder() .name("face-place") - .description("Will face-place when target is below a certain health or armor durability threshold.") .defaultValue(true) .build() ); private final Setting facePlaceHealth = sgFacePlace.add(new DoubleSetting.Builder() .name("face-place-health") - .description("The health the target has to be at to start face placing.") .defaultValue(8) .min(1) .sliderMin(1) @@ -276,7 +252,6 @@ public class CrystalAura extends Module { private final Setting facePlaceDurability = sgFacePlace.add(new DoubleSetting.Builder() .name("face-place-durability") - .description("The durability threshold percentage to be able to face-place.") .defaultValue(2) .min(1) .sliderMin(1) @@ -287,7 +262,6 @@ public class CrystalAura extends Module { private final Setting facePlaceArmor = sgFacePlace.add(new BoolSetting.Builder() .name("face-place-missing-armor") - .description("Automatically starts face placing when a target misses a piece of armor.") .defaultValue(false) .visible(facePlace::get) .build() @@ -295,7 +269,6 @@ public class CrystalAura extends Module { private final Setting forceFacePlace = sgFacePlace.add(new KeybindSetting.Builder() .name("force-face-place") - .description("Starts face place when this button is pressed.") .defaultValue(Keybind.none()) .build() ); @@ -304,14 +277,12 @@ public class CrystalAura extends Module { private final Setting doBreak = sgBreak.add(new BoolSetting.Builder() .name("break") - .description("If the CA should break crystals.") .defaultValue(true) .build() ); private final Setting breakDelay = sgBreak.add(new IntSetting.Builder() .name("break-delay") - .description("The delay in ticks to wait to break a crystal after it's placed.") .defaultValue(0) .min(0) .sliderMax(20) @@ -320,14 +291,12 @@ public class CrystalAura extends Module { private final Setting smartDelay = sgBreak.add(new BoolSetting.Builder() .name("smart-delay") - .description("Only breaks crystals when the target can receive damage.") .defaultValue(false) .build() ); private final Setting breakRange = sgBreak.add(new DoubleSetting.Builder() .name("break-range") - .description("Range in which to break crystals.") .defaultValue(4.5) .min(0) .sliderMax(6) @@ -336,7 +305,6 @@ public class CrystalAura extends Module { private final Setting breakWallsRange = sgBreak.add(new DoubleSetting.Builder() .name("walls-range") - .description("Range in which to break crystals when behind blocks.") .defaultValue(4.5) .min(0) .sliderMax(6) @@ -345,14 +313,12 @@ public class CrystalAura extends Module { private final Setting onlyBreakOwn = sgBreak.add(new BoolSetting.Builder() .name("only-own") - .description("Only breaks own crystals.") .defaultValue(false) .build() ); private final Setting breakAttempts = sgBreak.add(new IntSetting.Builder() .name("break-attempts") - .description("How many times to hit a crystal before stopping to target it.") .defaultValue(2) .sliderMin(1) .sliderMax(5) @@ -361,7 +327,6 @@ public class CrystalAura extends Module { private final Setting ticksExisted = sgBreak.add(new IntSetting.Builder() .name("ticks-existed") - .description("Amount of ticks a crystal needs to have lived for it to be attacked by CrystalAura.") .defaultValue(0) .min(0) .build() @@ -369,7 +334,6 @@ public class CrystalAura extends Module { private final Setting attackFrequency = sgBreak.add(new IntSetting.Builder() .name("attack-frequency") - .description("Maximum hits to do per second.") .defaultValue(25) .min(1) .sliderRange(1, 30) @@ -378,7 +342,6 @@ public class CrystalAura extends Module { private final Setting fastBreak = sgBreak.add(new BoolSetting.Builder() .name("fast-break") - .description("Ignores break delay and tries to break the crystal as soon as it's spawned in the world.") .defaultValue(true) .build() ); @@ -387,35 +350,30 @@ public class CrystalAura extends Module { public final Setting pauseOnUse = sgPause.add(new EnumSetting.Builder() .name("pause-on-use") - .description("Which processes should be paused while using an item.") .defaultValue(PauseMode.Place) .build() ); public final Setting pauseOnMine = sgPause.add(new EnumSetting.Builder() .name("pause-on-mine") - .description("Which processes should be paused while mining a block.") .defaultValue(PauseMode.None) .build() ); private final Setting pauseOnLag = sgPause.add(new BoolSetting.Builder() .name("pause-on-lag") - .description("Whether to pause if the server is not responding.") .defaultValue(true) .build() ); public final Setting> pauseModules = sgPause.add(new ModuleListSetting.Builder() .name("pause-modules") - .description("Pauses while any of the selected modules are active.") .defaultValue(BedAura.class) .build() ); public final Setting pauseHealth = sgPause.add(new DoubleSetting.Builder() .name("pause-health") - .description("Pauses when you go below a certain health.") .defaultValue(5) .range(0,36) .sliderRange(0,36) @@ -426,21 +384,18 @@ public class CrystalAura extends Module { public final Setting swingMode = sgRender.add(new EnumSetting.Builder() .name("swing-mode") - .description("How to swing when placing.") .defaultValue(SwingMode.Both) .build() ); private final Setting renderMode = sgRender.add(new EnumSetting.Builder() .name("render-mode") - .description("The mode to render in.") .defaultValue(RenderMode.Normal) .build() ); private final Setting renderPlace = sgRender.add(new BoolSetting.Builder() .name("render-place") - .description("Renders a block overlay over the block the crystals are being placed on.") .defaultValue(true) .visible(() -> renderMode.get() == RenderMode.Normal) .build() @@ -448,7 +403,6 @@ public class CrystalAura extends Module { private final Setting placeRenderTime = sgRender.add(new IntSetting.Builder() .name("place-time") - .description("How long to render placements.") .defaultValue(10) .min(0) .sliderMax(20) @@ -458,7 +412,6 @@ public class CrystalAura extends Module { private final Setting renderBreak = sgRender.add(new BoolSetting.Builder() .name("render-break") - .description("Renders a block overlay over the block the crystals are broken on.") .defaultValue(false) .visible(() -> renderMode.get() == RenderMode.Normal) .build() @@ -466,7 +419,6 @@ public class CrystalAura extends Module { private final Setting breakRenderTime = sgRender.add(new IntSetting.Builder() .name("break-time") - .description("How long to render breaking for.") .defaultValue(13) .min(0) .sliderMax(20) @@ -476,7 +428,6 @@ public class CrystalAura extends Module { private final Setting smoothness = sgRender.add(new IntSetting.Builder() .name("smoothness") - .description("How smoothly the render should move around.") .defaultValue(10) .min(0) .sliderMax(20) @@ -486,7 +437,6 @@ public class CrystalAura extends Module { private final Setting height = sgRender.add(new DoubleSetting.Builder() .name("height") - .description("How tall the gradient should be.") .defaultValue(0.7) .min(0) .sliderMax(1) @@ -496,7 +446,6 @@ public class CrystalAura extends Module { private final Setting renderTime = sgRender.add(new IntSetting.Builder() .name("render-time") - .description("How long to render placements.") .defaultValue(10) .min(0) .sliderMax(20) @@ -506,7 +455,6 @@ public class CrystalAura extends Module { private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .visible(() -> renderMode.get() != RenderMode.None) .build() @@ -514,7 +462,6 @@ public class CrystalAura extends Module { private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The side color of the block overlay.") .defaultValue(new SettingColor(255, 255, 255, 45)) .visible(() -> shapeMode.get().sides() && renderMode.get() != RenderMode.None) .build() @@ -522,7 +469,6 @@ public class CrystalAura extends Module { private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The line color of the block overlay.") .defaultValue(new SettingColor(255, 255, 255)) .visible(() -> shapeMode.get().lines() && renderMode.get() != RenderMode.None) .build() @@ -530,7 +476,6 @@ public class CrystalAura extends Module { private final Setting renderDamageText = sgRender.add(new BoolSetting.Builder() .name("damage") - .description("Renders crystal damage text in the block overlay.") .defaultValue(true) .visible(() -> renderMode.get() != RenderMode.None) .build() @@ -538,7 +483,6 @@ public class CrystalAura extends Module { private final Setting damageColor = sgRender.add(new ColorSetting.Builder() .name("damage-color") - .description("The color of the damage text.") .defaultValue(new SettingColor(255, 255, 255)) .visible(() -> renderMode.get() != RenderMode.None && renderDamageText.get()) .build() @@ -546,7 +490,6 @@ public class CrystalAura extends Module { private final Setting damageTextScale = sgRender.add(new DoubleSetting.Builder() .name("damage-scale") - .description("How big the damage text should be.") .defaultValue(1.25) .min(1) .sliderMax(4) @@ -601,7 +544,7 @@ public class CrystalAura extends Module { private double renderDamage; public CrystalAura() { - super(Categories.Combat, "crystal-aura", "Automatically places and attacks crystals."); + super(Categories.Combat, "crystal-aura"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Hitboxes.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Hitboxes.java index 8f8f469066..e7e493c8e1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Hitboxes.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Hitboxes.java @@ -21,39 +21,34 @@ public class Hitboxes extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgWeapon = settings.createGroup("Weapon Options"); + private final SettingGroup sgWeapon = settings.createGroup("weapon-options"); private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("entities") - .description("Which entities to target.") .defaultValue(EntityType.PLAYER) .build() ); private final Setting value = sgGeneral.add(new DoubleSetting.Builder() .name("expand") - .description("How much to expand the hitbox of the entity.") .defaultValue(0.5) .build() ); private final Setting ignoreFriends = sgGeneral.add(new BoolSetting.Builder() .name("ignore-friends") - .description("Doesn't expand the hitboxes of friends.") .defaultValue(true) .build() ); private final Setting onlyOnWeapon = sgWeapon.add(new BoolSetting.Builder() .name("only-on-weapon") - .description("Only modifies hitbox when holding a weapon in hand.") .defaultValue(false) .build() ); private final Setting sword = sgWeapon.add(new BoolSetting.Builder() .name("sword") - .description("Enable when holding a sword.") .defaultValue(true) .visible(onlyOnWeapon::get) .build() @@ -61,7 +56,6 @@ public class Hitboxes extends Module { private final Setting axe = sgWeapon.add(new BoolSetting.Builder() .name("axe") - .description("Enable when holding an axe.") .defaultValue(true) .visible(onlyOnWeapon::get) .build() @@ -69,7 +63,6 @@ public class Hitboxes extends Module { private final Setting pickaxe = sgWeapon.add(new BoolSetting.Builder() .name("pickaxe") - .description("Enable when holding a pickaxe.") .defaultValue(true) .visible(onlyOnWeapon::get) .build() @@ -77,7 +70,6 @@ public class Hitboxes extends Module { private final Setting shovel = sgWeapon.add(new BoolSetting.Builder() .name("shovel") - .description("Enable when holding a shovel.") .defaultValue(true) .visible(onlyOnWeapon::get) .build() @@ -85,7 +77,6 @@ public class Hitboxes extends Module { private final Setting hoe = sgWeapon.add(new BoolSetting.Builder() .name("hoe") - .description("Enable when holding a hoe.") .defaultValue(true) .visible(onlyOnWeapon::get) .build() @@ -93,7 +84,6 @@ public class Hitboxes extends Module { private final Setting mace = sgWeapon.add(new BoolSetting.Builder() .name("mace") - .description("Enable when holding a mace.") .defaultValue(true) .visible(onlyOnWeapon::get) .build() @@ -101,7 +91,6 @@ public class Hitboxes extends Module { private final Setting spear = sgWeapon.add(new BoolSetting.Builder() .name("spear") - .description("Enable when holding a spear.") .defaultValue(true) .visible(onlyOnWeapon::get) .build() @@ -109,14 +98,13 @@ public class Hitboxes extends Module { private final Setting trident = sgWeapon.add(new BoolSetting.Builder() .name("trident") - .description("Enable when holding a trident.") .defaultValue(true) .visible(onlyOnWeapon::get) .build() ); public Hitboxes() { - super(Categories.Combat, "hitboxes", "Expands an entity's hitboxes."); + super(Categories.Combat, "hitboxes"); } public double getEntityValue(Entity entity) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java index 25ea0b41cf..987be62c9d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java @@ -39,12 +39,11 @@ public class HoleFiller extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgSmart = settings.createGroup("Smart"); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgSmart = settings.createGroup("smart"); + private final SettingGroup sgRender = settings.createGroup("render"); private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") - .description("Which blocks can be used to fill holes.") .defaultValue( Blocks.OBSIDIAN, Blocks.CRYING_OBSIDIAN, @@ -57,7 +56,6 @@ public class HoleFiller extends Module { private final Setting searchRadius = sgGeneral.add(new IntSetting.Builder() .name("search-radius") - .description("Horizontal radius in which to search for holes.") .defaultValue(5) .min(0) .sliderMax(6) @@ -66,7 +64,6 @@ public class HoleFiller extends Module { private final Setting placeRange = sgGeneral.add(new DoubleSetting.Builder() .name("place-range") - .description("How far away from the player you can place a block.") .defaultValue(4.5) .min(0) .sliderMax(6) @@ -75,7 +72,6 @@ public class HoleFiller extends Module { private final Setting placeWallsRange = sgGeneral.add(new DoubleSetting.Builder() .name("walls-range") - .description("How far away from the player you can place a block behind walls.") .defaultValue(4.5) .min(0) .sliderMax(6) @@ -84,21 +80,18 @@ public class HoleFiller extends Module { private final Setting doubles = sgGeneral.add(new BoolSetting.Builder() .name("doubles") - .description("Fills double holes.") .defaultValue(true) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Automatically rotates towards the holes being filled.") .defaultValue(false) .build() ); private final Setting placeDelay = sgGeneral.add(new IntSetting.Builder() .name("place-delay") - .description("The ticks delay between placement.") .defaultValue(1) .min(0) .build() @@ -106,7 +99,6 @@ public class HoleFiller extends Module { private final Setting blocksPerTick = sgGeneral.add(new IntSetting.Builder() .name("blocks-per-tick") - .description("How many blocks to place in one tick.") .defaultValue(3) .min(1) .build() @@ -116,14 +108,12 @@ public class HoleFiller extends Module { private final Setting smart = sgSmart.add(new BoolSetting.Builder() .name("smart") - .description("Take more factors into account before filling a hole.") .defaultValue(true) .build() ); public final Setting forceFill = sgSmart.add(new KeybindSetting.Builder() .name("force-fill") - .description("Fills all holes around you regardless of target checks.") .defaultValue(Keybind.none()) .visible(smart::get) .build() @@ -131,7 +121,6 @@ public class HoleFiller extends Module { private final Setting predictMovement = sgSmart.add(new BoolSetting.Builder() .name("predict-movement") - .description("Predict target movement to account for ping.") .defaultValue(true) .visible(smart::get) .build() @@ -139,7 +128,6 @@ public class HoleFiller extends Module { private final Setting ticksToPredict = sgSmart.add(new DoubleSetting.Builder() .name("ticks-to-predict") - .description("How many ticks ahead we should predict for.") .defaultValue(10) .min(1) .sliderMax(30) @@ -149,7 +137,6 @@ public class HoleFiller extends Module { private final Setting ignoreSafe = sgSmart.add(new BoolSetting.Builder() .name("ignore-safe") - .description("Ignore players in safe holes.") .defaultValue(true) .visible(smart::get) .build() @@ -157,7 +144,6 @@ public class HoleFiller extends Module { private final Setting onlyMoving = sgSmart.add(new BoolSetting.Builder() .name("only-moving") - .description("Ignore players if they're standing still.") .defaultValue(true) .visible(smart::get) .build() @@ -165,7 +151,6 @@ public class HoleFiller extends Module { private final Setting targetRange = sgSmart.add(new DoubleSetting.Builder() .name("target-range") - .description("How far away to target players.") .defaultValue(7) .min(0) .sliderMin(1) @@ -176,7 +161,6 @@ public class HoleFiller extends Module { private final Setting feetRange = sgSmart.add(new DoubleSetting.Builder() .name("feet-range") - .description("How far from a hole a player's feet must be to fill it.") .defaultValue(1.5) .min(0) .sliderMax(4) @@ -188,21 +172,18 @@ public class HoleFiller extends Module { private final Setting swing = sgRender.add(new BoolSetting.Builder() .name("swing") - .description("Swing the player's hand when placing.") .defaultValue(true) .build() ); private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") - .description("Renders an overlay where blocks will be placed.") .defaultValue(true) .build() ); private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .visible(render::get) .build() @@ -210,7 +191,6 @@ public class HoleFiller extends Module { private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The side color of the target block rendering.") .defaultValue(new SettingColor(197, 137, 232, 10)) .visible(() -> render.get() && shapeMode.get().sides()) .build() @@ -218,7 +198,6 @@ public class HoleFiller extends Module { private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The line color of the target block rendering.") .defaultValue(new SettingColor(197, 137, 232)) .visible(() -> render.get() && shapeMode.get().lines()) .build() @@ -226,7 +205,6 @@ public class HoleFiller extends Module { private final Setting nextSideColor = sgRender.add(new ColorSetting.Builder() .name("next-side-color") - .description("The side color of the next block to be placed.") .defaultValue(new SettingColor(227, 196, 245, 10)) .visible(() -> render.get() && shapeMode.get().sides()) .build() @@ -234,7 +212,6 @@ public class HoleFiller extends Module { private final Setting nextLineColor = sgRender.add(new ColorSetting.Builder() .name("next-line-color") - .description("The line color of the next block to be placed.") .defaultValue(new SettingColor(5, 139, 221)) .visible(() -> render.get() && shapeMode.get().lines()) .build() @@ -245,7 +222,7 @@ public class HoleFiller extends Module { private int timer; public HoleFiller() { - super(Categories.Combat, "hole-filler", "Fills holes with specified blocks."); + super(Categories.Combat, "hole-filler"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java index 769dff7ea8..edc6f48e82 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java @@ -47,21 +47,19 @@ public class KillAura extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgTargeting = settings.createGroup("Targeting"); - private final SettingGroup sgTiming = settings.createGroup("Timing"); + private final SettingGroup sgTargeting = settings.createGroup("targeting"); + private final SettingGroup sgTiming = settings.createGroup("timing"); // General private final Setting attackWhenHolding = sgGeneral.add(new EnumSetting.Builder() .name("attack-when-holding") - .description("Only attacks an entity when a specified item is in your hand.") .defaultValue(AttackItems.Weapons) .build() ); private final Setting> weapons = sgGeneral.add(new ItemListSetting.Builder() .name("selected-weapon-types") - .description("Which types of weapons to attack with (if you select the diamond sword, any type of sword may be used to attack).") .defaultValue(Items.DIAMOND_SWORD, Items.DIAMOND_AXE, Items.TRIDENT) .filter(FILTER::contains) .visible(() -> attackWhenHolding.get() == AttackItems.Weapons) @@ -70,21 +68,18 @@ public class KillAura extends Module { private final Setting rotation = sgGeneral.add(new EnumSetting.Builder() .name("rotate") - .description("Determines when you should rotate towards the target.") .defaultValue(RotationMode.Always) .build() ); private final Setting autoSwitch = sgGeneral.add(new BoolSetting.Builder() .name("auto-switch") - .description("Switches to an acceptable weapon when attacking the target.") .defaultValue(false) .build() ); private final Setting swapBack = sgGeneral.add(new BoolSetting.Builder() .name("swap-back") - .description("Switches to your previous slot when done attacking the target.") .defaultValue(false) .visible(autoSwitch::get) .build() @@ -92,7 +87,6 @@ public class KillAura extends Module { private final Setting shieldMode = sgGeneral.add(new EnumSetting.Builder() .name("shield-mode") - .description("Will try and use an axe to break target shields.") .defaultValue(ShieldMode.Break) .visible(autoSwitch::get) .build() @@ -100,21 +94,18 @@ public class KillAura extends Module { private final Setting onlyOnClick = sgGeneral.add(new BoolSetting.Builder() .name("only-on-click") - .description("Only attacks when holding left click.") .defaultValue(false) .build() ); private final Setting onlyOnLook = sgGeneral.add(new BoolSetting.Builder() .name("only-on-look") - .description("Only attacks when looking at an entity.") .defaultValue(false) .build() ); private final Setting pauseOnCombat = sgGeneral.add(new BoolSetting.Builder() .name("pause-baritone") - .description("Freezes Baritone temporarily until you are finished attacking the entity.") .defaultValue(true) .build() ); @@ -123,7 +114,6 @@ public class KillAura extends Module { private final Setting>> entities = sgTargeting.add(new EntityTypeListSetting.Builder() .name("entities") - .description("Entities to attack.") .onlyAttackable() .defaultValue(EntityType.PLAYER) .build() @@ -131,14 +121,12 @@ public class KillAura extends Module { private final Setting priority = sgTargeting.add(new EnumSetting.Builder() .name("priority") - .description("How to filter targets within range.") .defaultValue(SortPriority.ClosestAngle) .build() ); private final Setting maxTargets = sgTargeting.add(new IntSetting.Builder() .name("max-targets") - .description("How many entities to target at once.") .defaultValue(1) .min(1) .sliderRange(1, 5) @@ -148,7 +136,6 @@ public class KillAura extends Module { private final Setting range = sgTargeting.add(new DoubleSetting.Builder() .name("range") - .description("The maximum range the entity can be to attack it.") .defaultValue(4.5) .min(0) .sliderMax(6) @@ -157,7 +144,6 @@ public class KillAura extends Module { private final Setting wallsRange = sgTargeting.add(new DoubleSetting.Builder() .name("walls-range") - .description("The maximum range the entity can be attacked through walls.") .defaultValue(3.5) .min(0) .sliderMax(6) @@ -166,28 +152,24 @@ public class KillAura extends Module { private final Setting mobAgeFilter = sgTargeting.add(new EnumSetting.Builder() .name("mob-age-filter") - .description("Determines the age of the mobs to target (baby, adult, or both).") .defaultValue(EntityAge.Adult) .build() ); private final Setting ignoreNamed = sgTargeting.add(new BoolSetting.Builder() .name("ignore-named") - .description("Whether or not to attack mobs with a name.") .defaultValue(false) .build() ); private final Setting ignorePassive = sgTargeting.add(new BoolSetting.Builder() .name("ignore-passive") - .description("Will only attack sometimes passive mobs if they are targeting you.") .defaultValue(true) .build() ); private final Setting ignoreTamed = sgTargeting.add(new BoolSetting.Builder() .name("ignore-tamed") - .description("Will avoid attacking mobs you tamed.") .defaultValue(false) .build() ); @@ -196,42 +178,36 @@ public class KillAura extends Module { private final Setting pauseOnLag = sgTiming.add(new BoolSetting.Builder() .name("pause-on-lag") - .description("Pauses if the server is lagging.") .defaultValue(true) .build() ); private final Setting pauseOnUse = sgTiming.add(new BoolSetting.Builder() .name("pause-on-use") - .description("Does not attack while using an item.") .defaultValue(false) .build() ); private final Setting pauseOnCA = sgTiming.add(new BoolSetting.Builder() .name("pause-on-CA") - .description("Does not attack while CA is placing.") .defaultValue(true) .build() ); private final Setting tpsSync = sgTiming.add(new BoolSetting.Builder() .name("TPS-sync") - .description("Tries to sync attack delay with the server's TPS.") .defaultValue(true) .build() ); private final Setting customDelay = sgTiming.add(new BoolSetting.Builder() .name("custom-delay") - .description("Use a custom delay instead of the vanilla cooldown.") .defaultValue(false) .build() ); private final Setting hitDelay = sgTiming.add(new IntSetting.Builder() .name("hit-delay") - .description("How fast you hit the entity in ticks.") .defaultValue(11) .min(0) .sliderMax(60) @@ -241,7 +217,6 @@ public class KillAura extends Module { private final Setting switchDelay = sgTiming.add(new IntSetting.Builder() .name("switch-delay") - .description("How many ticks to wait before hitting an entity after switching hotbar slots.") .defaultValue(0) .min(0) .sliderMax(10) @@ -256,7 +231,7 @@ public class KillAura extends Module { public static int previousSlot; public KillAura() { - super(Categories.Combat, "kill-aura", "Attacks specified entities around you."); + super(Categories.Combat, "kill-aura"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Offhand.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Offhand.java index 2e4609ea49..bf04fcf6db 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Offhand.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Offhand.java @@ -26,14 +26,13 @@ import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_RIGHT; public class Offhand extends Module { - private final SettingGroup sgCombat = settings.createGroup("Combat"); - private final SettingGroup sgTotem = settings.createGroup("Totem"); + private final SettingGroup sgCombat = settings.createGroup("combat"); + private final SettingGroup sgTotem = settings.createGroup("totem"); //Combat private final Setting delayTicks = sgCombat.add(new IntSetting.Builder() .name("item-switch-delay") - .description("The delay in ticks between slot movements.") .defaultValue(0) .min(0) .sliderMax(20) @@ -41,21 +40,18 @@ public class Offhand extends Module { ); private final Setting preferreditem = sgCombat.add(new EnumSetting.Builder() .name("item") - .description("Which item to hold in your offhand.") .defaultValue(Item.Crystal) .build() ); private final Setting hotbar = sgCombat.add(new BoolSetting.Builder() .name("hotbar") - .description("Whether to use items from your hotbar.") .defaultValue(false) .build() ); private final Setting rightgapple = sgCombat.add(new BoolSetting.Builder() .name("right-gapple") - .description("Will switch to a gapple when holding right click.(DO NOT USE WITH POTION ON)") .defaultValue(false) .build() ); @@ -63,7 +59,6 @@ public class Offhand extends Module { private final Setting SwordGap = sgCombat.add(new BoolSetting.Builder() .name("sword-gapple") - .description("Will switch to a gapple when holding a sword and right click.") .defaultValue(false) .visible(rightgapple::get) .build() @@ -71,7 +66,6 @@ public class Offhand extends Module { private final Setting alwaysSwordGap = sgCombat.add(new BoolSetting.Builder() .name("always-gap-on-sword") - .description("Holds an Enchanted Golden Apple when you are holding a sword.") .defaultValue(false) .visible(() -> !rightgapple.get()) .build() @@ -80,14 +74,12 @@ public class Offhand extends Module { private final Setting alwaysPot = sgCombat.add(new BoolSetting.Builder() .name("always-pot-on-sword") - .description("Will switch to a potion when holding a sword") .defaultValue(false) .visible(() -> !rightgapple.get() && !alwaysSwordGap.get()) .build() ); private final Setting potionClick = sgCombat.add(new BoolSetting.Builder() .name("sword-pot") - .description("Will switch to a potion when holding a sword and right click.") .defaultValue(false) .visible(() -> !rightgapple.get() && !alwaysPot.get() && !alwaysSwordGap.get() ) .build() @@ -97,7 +89,6 @@ public class Offhand extends Module { private final Setting minHealth = sgTotem.add(new DoubleSetting.Builder() .name("min-health") - .description("Will hold a totem when below this amount of health.") .defaultValue(10) .range(0,36) .sliderRange(0,36) @@ -106,21 +97,18 @@ public class Offhand extends Module { private final Setting elytra = sgTotem.add(new BoolSetting.Builder() .name("elytra") - .description("Will always hold a totem while flying with an elytra.") .defaultValue(false) .build() ); private final Setting falling = sgTotem.add(new BoolSetting.Builder() .name("falling") - .description("Will hold a totem if fall damage could kill you.") .defaultValue(false) .build() ); private final Setting explosion = sgTotem.add(new BoolSetting.Builder() .name("explosion") - .description("Will hold a totem when explosion damage could kill you.") .defaultValue(true) .build() ); @@ -135,7 +123,7 @@ public class Offhand extends Module { private int totems, ticks; public Offhand() { - super(Categories.Combat, "offhand", "Allows you to hold specified items in your offhand."); + super(Categories.Combat, "offhand"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Quiver.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Quiver.java index 62e5fc0dec..26a8c6ee5d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Quiver.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Quiver.java @@ -35,19 +35,17 @@ public class Quiver extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgSafety = settings.createGroup("Safety"); + private final SettingGroup sgSafety = settings.createGroup("safety"); private final Setting> effects = sgGeneral.add(new StatusEffectListSetting.Builder() .name("effects") - .description("Which effects to shoot you with.") .defaultValue(StatusEffects.STRENGTH.value()) .build() ); private final Setting cooldown = sgGeneral.add(new IntSetting.Builder() .name("cooldown") - .description("How many ticks between shooting effects (19 minimum for NCP).") .defaultValue(10) .range(0,40) .sliderRange(0,40) @@ -56,21 +54,18 @@ public class Quiver extends Module { private final Setting checkEffects = sgGeneral.add(new BoolSetting.Builder() .name("check-effects") - .description("Won't shoot you with effects you already have.") .defaultValue(true) .build() ); private final Setting silentBow = sgGeneral.add(new BoolSetting.Builder() .name("silent-bow") - .description("Takes a bow from your inventory to quiver.") .defaultValue(true) .build() ); private final Setting chatInfo = sgGeneral.add(new BoolSetting.Builder() .name("chat-info") - .description("Sends info about quiver checks in chat.") .defaultValue(false) .build() ); @@ -79,21 +74,18 @@ public class Quiver extends Module { private final Setting onlyInHoles = sgSafety.add(new BoolSetting.Builder() .name("only-in-holes") - .description("Only quiver when you're in a hole.") .defaultValue(true) .build() ); private final Setting onlyOnGround = sgSafety.add(new BoolSetting.Builder() .name("only-on-ground") - .description("Only quiver when you're on the ground.") .defaultValue(true) .build() ); private final Setting minHealth = sgSafety.add(new DoubleSetting.Builder() .name("min-health") - .description("How much health you must have to quiver.") .defaultValue(10) .range(0,36) .sliderRange(0,36) @@ -107,7 +99,7 @@ public class Quiver extends Module { private final BlockPos.Mutable testPos = new BlockPos.Mutable(); public Quiver() { - super(Categories.Combat, "quiver", "Shoots arrows at yourself."); + super(Categories.Combat, "quiver"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfAnvil.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfAnvil.java index ee1b0a2754..0f074589a8 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfAnvil.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfAnvil.java @@ -18,7 +18,7 @@ public class SelfAnvil extends Module { public SelfAnvil() { - super(Categories.Combat, "self-anvil", "Automatically places an anvil on you to prevent other players from going into your hole."); + super(Categories.Combat, "self-anvil"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java index d1706de6b9..f1affec325 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java @@ -39,55 +39,48 @@ public enum BottomMode { } private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("whitelist") - .description("Which blocks to use.") .defaultValue(Blocks.OBSIDIAN, Blocks.NETHERITE_BLOCK) .build() ); private final Setting topPlacement = sgGeneral.add(new EnumSetting.Builder() .name("top-mode") - .description("Which positions to place on your top half.") .defaultValue(TopMode.Top) .build() ); private final Setting bottomPlacement = sgGeneral.add(new EnumSetting.Builder() .name("bottom-mode") - .description("Which positions to place on your bottom half.") .defaultValue(BottomMode.None) .build() ); private final Setting delaySetting = sgGeneral.add(new IntSetting.Builder() .name("place-delay") - .description("How many ticks between block placements.") .defaultValue(1) .build() ); private final Setting center = sgGeneral.add(new BoolSetting.Builder() .name("center") - .description("Centers you on the block you are standing on before placing.") .defaultValue(true) .build() ); private final Setting turnOff = sgGeneral.add(new BoolSetting.Builder() .name("turn-off") - .description("Turns off after placing.") .defaultValue(true) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Sends rotation packets to the server when placing.") .defaultValue(true) .build() ); @@ -96,28 +89,24 @@ public enum BottomMode { private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") - .description("Renders a block overlay where the blocks will be placed.") .defaultValue(true) .build() ); private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The color of the sides of the blocks being rendered.") .defaultValue(new SettingColor(204, 0, 0, 10)) .build() ); private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The color of the lines of the blocks being rendered.") .defaultValue(new SettingColor(204, 0, 0, 255)) .build() ); @@ -127,7 +116,7 @@ public enum BottomMode { private int delay; public SelfTrap(){ - super(Categories.Combat, "self-trap", "Places blocks above your head."); + super(Categories.Combat, "self-trap"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfWeb.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfWeb.java index ab3ff3f6bc..da53f86311 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfWeb.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfWeb.java @@ -22,14 +22,12 @@ public class SelfWeb extends Module { private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("The mode to use for selfweb.") .defaultValue(Mode.Normal) .build() ); private final Setting range = sgGeneral.add(new IntSetting.Builder() .name("range") - .description("How far away the player has to be from you to place webs. Requires Mode to Smart.") .defaultValue(3) .min(1) .sliderRange(1, 7) @@ -39,27 +37,24 @@ public class SelfWeb extends Module { private final Setting doubles = sgGeneral.add(new BoolSetting.Builder() .name("double-place") - .description("Places webs in your upper hitbox as well.") .defaultValue(false) .build() ); private final Setting turnOff = sgGeneral.add(new BoolSetting.Builder() .name("auto-toggle") - .description("Toggles off after placing the webs.") .defaultValue(true) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Forces you to rotate downwards when placing webs.") .defaultValue(true) .build() ); public SelfWeb() { - super(Categories.Combat, "self-web", "Automatically places webs on you."); + super(Categories.Combat, "self-web"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java index e23990d57e..a511033975 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java @@ -44,14 +44,13 @@ public class Surround extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgToggles = settings.createGroup("Toggles"); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgToggles = settings.createGroup("toggles"); + private final SettingGroup sgRender = settings.createGroup("render"); // General private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") - .description("What blocks to use for surround.") .defaultValue(Blocks.OBSIDIAN, Blocks.CRYING_OBSIDIAN, Blocks.NETHERITE_BLOCK) .filter(this::blockFilter) .build() @@ -59,7 +58,6 @@ public class Surround extends Module { private final Setting delay = sgGeneral.add(new IntSetting.Builder() .name("delay") - .description("Delay, in ticks, between block placements.") .min(0) .defaultValue(0) .build() @@ -67,7 +65,6 @@ public class Surround extends Module { private final Setting blocksPerTick = sgGeneral.add(new IntSetting.Builder() .name("blocks-per-tick") - .description("How many blocks to place in one tick.") .defaultValue(1) .min(1) .build() @@ -75,42 +72,36 @@ public class Surround extends Module { private final Setting
center = sgGeneral.add(new EnumSetting.Builder
() .name("center") - .description("Teleports you to the center of the block.") .defaultValue(Center.Incomplete) .build() ); private final Setting doubleHeight = sgGeneral.add(new BoolSetting.Builder() .name("double-height") - .description("Places obsidian on top of the original surround blocks to prevent people from face-placing you.") .defaultValue(false) .build() ); private final Setting onlyOnGround = sgGeneral.add(new BoolSetting.Builder() .name("only-on-ground") - .description("Works only when you are standing on blocks.") .defaultValue(true) .build() ); private final Setting airPlace = sgGeneral.add(new BoolSetting.Builder() .name("air-place") - .description("Allows Surround to place blocks in the air.") .defaultValue(true) .build() ); private final Setting toggleModules = sgGeneral.add(new BoolSetting.Builder() .name("toggle-modules") - .description("Turn off other modules when surround is activated.") .defaultValue(false) .build() ); private final Setting toggleBack = sgGeneral.add(new BoolSetting.Builder() .name("toggle-back-on") - .description("Turn the other modules back on when surround is deactivated.") .defaultValue(false) .visible(toggleModules::get) .build() @@ -118,21 +109,18 @@ public class Surround extends Module { private final Setting> modules = sgGeneral.add(new ModuleListSetting.Builder() .name("modules") - .description("Which modules to disable on activation.") .visible(toggleModules::get) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Automatically faces towards the obsidian being placed.") .defaultValue(true) .build() ); private final Setting protect = sgGeneral.add(new BoolSetting.Builder() .name("protect") - .description("Attempts to break crystals around surround positions to prevent surround break.") .defaultValue(true) .build() ); @@ -141,21 +129,18 @@ public class Surround extends Module { private final Setting toggleOnYChange = sgToggles.add(new BoolSetting.Builder() .name("toggle-on-y-change") - .description("Automatically disables when your y level changes (step, jumping, etc).") .defaultValue(true) .build() ); private final Setting toggleOnComplete = sgToggles.add(new BoolSetting.Builder() .name("toggle-on-complete") - .description("Toggles off when all blocks are placed.") .defaultValue(false) .build() ); private final Setting toggleOnDeath = sgToggles.add(new BoolSetting.Builder() .name("toggle-on-death") - .description("Toggles off when you die.") .defaultValue(true) .build() ); @@ -164,35 +149,30 @@ public class Surround extends Module { private final Setting swing = sgRender.add(new BoolSetting.Builder() .name("swing") - .description("Render your hand swinging when placing surround blocks.") .defaultValue(true) .build() ); private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") - .description("Renders a block overlay where the obsidian will be placed.") .defaultValue(true) .build() ); private final Setting renderBelow = sgRender.add(new BoolSetting.Builder() .name("below") - .description("Renders the block below you.") .defaultValue(false) .build() ); private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting safeSideColor = sgRender.add(new ColorSetting.Builder() .name("safe-side-color") - .description("The side color for safe blocks.") .defaultValue(new SettingColor(13, 255, 0, 0)) .visible(() -> render.get() && shapeMode.get() != ShapeMode.Lines) .build() @@ -200,7 +180,6 @@ public class Surround extends Module { private final Setting safeLineColor = sgRender.add(new ColorSetting.Builder() .name("safe-line-color") - .description("The line color for safe blocks.") .defaultValue(new SettingColor(13, 255, 0, 0)) .visible(() -> render.get() && shapeMode.get() != ShapeMode.Sides) .build() @@ -208,7 +187,6 @@ public class Surround extends Module { private final Setting normalSideColor = sgRender.add(new ColorSetting.Builder() .name("normal-side-color") - .description("The side color for normal blocks.") .defaultValue(new SettingColor(0, 255, 238, 12)) .visible(() -> render.get() && shapeMode.get() != ShapeMode.Lines) .build() @@ -216,7 +194,6 @@ public class Surround extends Module { private final Setting normalLineColor = sgRender.add(new ColorSetting.Builder() .name("normal-line-color") - .description("The line color for normal blocks.") .defaultValue(new SettingColor(0, 255, 238, 100)) .visible(() -> render.get() && shapeMode.get() != ShapeMode.Sides) .build() @@ -224,7 +201,6 @@ public class Surround extends Module { private final Setting unsafeSideColor = sgRender.add(new ColorSetting.Builder() .name("unsafe-side-color") - .description("The side color for unsafe blocks.") .defaultValue(new SettingColor(204, 0, 0, 12)) .visible(() -> render.get() && shapeMode.get() != ShapeMode.Lines) .build() @@ -232,7 +208,6 @@ public class Surround extends Module { private final Setting unsafeLineColor = sgRender.add(new ColorSetting.Builder() .name("unsafe-line-color") - .description("The line color for unsafe blocks.") .defaultValue(new SettingColor(204, 0, 0, 100)) .visible(() -> render.get() && shapeMode.get() != ShapeMode.Sides) .build() @@ -242,7 +217,7 @@ public class Surround extends Module { private int timer; public Surround() { - super(Categories.Combat, "surround", "Surrounds you in blocks to prevent massive crystal damage."); + super(Categories.Combat, "surround"); } // Render diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AntiPacketKick.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AntiPacketKick.java index cf23ec9f5d..4df044e706 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AntiPacketKick.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AntiPacketKick.java @@ -16,21 +16,19 @@ public class AntiPacketKick extends Module { public final Setting catchExceptions = sgGeneral.add(new BoolSetting.Builder() .name("catch-exceptions") - .description("Drops corrupted packets.") .defaultValue(false) .build() ); public final Setting logExceptions = sgGeneral.add(new BoolSetting.Builder() .name("log-exceptions") - .description("Logs caught exceptions.") .defaultValue(false) .visible(catchExceptions::get) .build() ); public AntiPacketKick() { - super(Categories.Misc, "anti-packet-kick", "Attempts to prevent you from being disconnected by large packets."); + super(Categories.Misc, "anti-packet-kick"); } public boolean catchExceptions() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoReconnect.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoReconnect.java index 997f57d442..d9fae8cbbc 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoReconnect.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/AutoReconnect.java @@ -24,7 +24,6 @@ public class AutoReconnect extends Module { public final Setting time = sgGeneral.add(new DoubleSetting.Builder() .name("delay") - .description("The amount of seconds to wait before reconnecting to the server.") .defaultValue(3.5) .min(0) .decimalPlaces(1) @@ -33,7 +32,6 @@ public class AutoReconnect extends Module { public final Setting button = sgGeneral.add(new BoolSetting.Builder() .name("hide-buttons") - .description("Will hide the buttons related to Auto Reconnect.") .defaultValue(false) .build() ); @@ -41,7 +39,7 @@ public class AutoReconnect extends Module { public Pair lastServerConnection; public AutoReconnect() { - super(Categories.Misc, "auto-reconnect", "Automatically reconnects when disconnected from a server."); + super(Categories.Misc, "auto-reconnect"); MeteorClient.EVENT_BUS.subscribe(new StaticListener()); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterBeacons.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterBeacons.java index de0fbddf72..20ab135611 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterBeacons.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterBeacons.java @@ -10,6 +10,6 @@ public class BetterBeacons extends Module { public BetterBeacons() { - super(Categories.Misc, "better-beacons", "Select effects unaffected by beacon level."); + super(Categories.Misc, "better-beacons"); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index fe3757a136..ac4f510c41 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -48,35 +48,31 @@ public class BetterChat extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgFilter = settings.createGroup("Filter"); - private final SettingGroup sgLongerChat = settings.createGroup("Longer Chat"); - private final SettingGroup sgPrefix = settings.createGroup("Prefix"); - private final SettingGroup sgSuffix = settings.createGroup("Suffix"); + private final SettingGroup sgFilter = settings.createGroup("filter"); + private final SettingGroup sgLongerChat = settings.createGroup("longer-chat"); + private final SettingGroup sgPrefix = settings.createGroup("prefix"); + private final SettingGroup sgSuffix = settings.createGroup("suffix"); private final Setting annoy = sgGeneral.add(new BoolSetting.Builder() .name("annoy") - .description("Makes your messages aNnOyInG.") .defaultValue(false) .build() ); private final Setting fancy = sgGeneral.add(new BoolSetting.Builder() .name("fancy-chat") - .description("Makes your messages ғᴀɴᴄʏ!") .defaultValue(false) .build() ); private final Setting timestamps = sgGeneral.add(new BoolSetting.Builder() .name("timestamps") - .description("Adds client-side time stamps to the beginning of chat messages.") .defaultValue(false) .build() ); private final Setting showSeconds = sgGeneral.add(new BoolSetting.Builder() .name("show-seconds") - .description("Shows seconds in the chat message timestamps") .defaultValue(false) .visible(timestamps::get) .onChanged(o -> updateDateFormat()) @@ -85,21 +81,18 @@ public class BetterChat extends Module { private final Setting playerHeads = sgGeneral.add(new BoolSetting.Builder() .name("player-heads") - .description("Displays player heads next to their messages.") .defaultValue(true) .build() ); private final Setting coordsProtection = sgGeneral.add(new BoolSetting.Builder() .name("coords-protection") - .description("Prevents you from sending messages in chat that may contain coordinates.") .defaultValue(true) .build() ); private final Setting keepHistory = sgGeneral.add(new BoolSetting.Builder() .name("keep-history") - .description("Prevents the chat history from being cleared when disconnecting.") .defaultValue(true) .build() ); @@ -108,14 +101,12 @@ public class BetterChat extends Module { private final Setting antiSpam = sgFilter.add(new BoolSetting.Builder() .name("anti-spam") - .description("Blocks duplicate messages from filling your chat.") .defaultValue(true) .build() ); private final Setting antiSpamDepth = sgFilter.add(new IntSetting.Builder() .name("depth") - .description("How many messages to filter.") .defaultValue(20) .min(1) .sliderMin(1) @@ -125,21 +116,18 @@ public class BetterChat extends Module { private final Setting antiClear = sgFilter.add(new BoolSetting.Builder() .name("anti-clear") - .description("Prevents servers from clearing chat.") .defaultValue(true) .build() ); private final Setting filterRegex = sgFilter.add(new BoolSetting.Builder() .name("filter-regex") - .description("Filter out chat messages that match the regex filter.") .defaultValue(false) .build() ); private final Setting> regexFilters = sgFilter.add(new StringListSetting.Builder() .name("regex-filter") - .description("Regex filter used for filtering chat messages.") .visible(filterRegex::get) .onChanged(strings -> compileFilterRegexList()) .build() @@ -150,21 +138,18 @@ public class BetterChat extends Module { private final Setting infiniteChatBox = sgLongerChat.add(new BoolSetting.Builder() .name("infinite-chat-box") - .description("Lets you type infinitely long messages.") .defaultValue(true) .build() ); private final Setting longerChatHistory = sgLongerChat.add(new BoolSetting.Builder() .name("longer-chat-history") - .description("Extends chat length.") .defaultValue(true) .build() ); private final Setting longerChatLines = sgLongerChat.add(new IntSetting.Builder() .name("extra-lines") - .description("The amount of extra chat lines.") .defaultValue(1000) .min(0) .sliderRange(0, 1000) @@ -176,21 +161,18 @@ public class BetterChat extends Module { private final Setting prefix = sgPrefix.add(new BoolSetting.Builder() .name("prefix") - .description("Adds a prefix to your chat messages.") .defaultValue(false) .build() ); private final Setting prefixRandom = sgPrefix.add(new BoolSetting.Builder() .name("random") - .description("Uses a random number as your prefix.") .defaultValue(false) .build() ); private final Setting prefixText = sgPrefix.add(new StringSetting.Builder() .name("text") - .description("The text to add as your prefix.") .defaultValue("> ") .visible(() -> !prefixRandom.get()) .build() @@ -198,7 +180,6 @@ public class BetterChat extends Module { private final Setting prefixSmallCaps = sgPrefix.add(new BoolSetting.Builder() .name("small-caps") - .description("Uses small caps in the prefix.") .defaultValue(false) .visible(() -> !prefixRandom.get()) .build() @@ -208,21 +189,18 @@ public class BetterChat extends Module { private final Setting suffix = sgSuffix.add(new BoolSetting.Builder() .name("suffix") - .description("Adds a suffix to your chat messages.") .defaultValue(false) .build() ); private final Setting suffixRandom = sgSuffix.add(new BoolSetting.Builder() .name("random") - .description("Uses a random number as your suffix.") .defaultValue(false) .build() ); private final Setting suffixText = sgSuffix.add(new StringSetting.Builder() .name("text") - .description("The text to add as your suffix.") .defaultValue(" | meteor on crack!") .visible(() -> !suffixRandom.get()) .build() @@ -230,7 +208,6 @@ public class BetterChat extends Module { private final Setting suffixSmallCaps = sgSuffix.add(new BoolSetting.Builder() .name("small-caps") - .description("Uses small caps in the suffix.") .defaultValue(true) .visible(() -> !suffixRandom.get()) .build() @@ -245,7 +222,7 @@ public class BetterChat extends Module { public final IntList lines = new IntArrayList(); public BetterChat() { - super(Categories.Misc, "better-chat", "Improves your chat experience in various ways."); + super(Categories.Misc, "better-chat"); String[] a = "abcdefghijklmnopqrstuvwxyz".split(""); String[] b = "ᴀʙᴄᴅᴇꜰɢʜɪᴊᴋʟᴍɴᴏᴩqʀꜱᴛᴜᴠᴡxyᴢ".split(""); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java index dc900275eb..9e8734dc42 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java @@ -51,14 +51,12 @@ public class BookBot extends Module { private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("What kind of text to write.") .defaultValue(Mode.Random) .build() ); private final Setting pages = sgGeneral.add(new IntSetting.Builder() .name("pages") - .description("The number of pages to write per book.") .defaultValue(50) .range(1, 100) .sliderRange(1, 100) @@ -68,7 +66,6 @@ public class BookBot extends Module { private final Setting onlyAscii = sgGeneral.add(new BoolSetting.Builder() .name("ascii-only") - .description("Only uses the characters in the ASCII charset.") .defaultValue(false) .visible(() -> mode.get() == Mode.Random) .build() @@ -76,7 +73,6 @@ public class BookBot extends Module { private final Setting delay = sgGeneral.add(new IntSetting.Builder() .name("delay") - .description("The amount of delay between writing books.") .defaultValue(20) .min(1) .sliderRange(1, 200) @@ -85,14 +81,12 @@ public class BookBot extends Module { private final Setting sign = sgGeneral.add(new BoolSetting.Builder() .name("sign") - .description("Whether to sign the book.") .defaultValue(true) .build() ); private final Setting name = sgGeneral.add(new StringSetting.Builder() .name("name") - .description("The name you want to give your books.") .defaultValue("Meteor on Crack!") .visible(sign::get) .build() @@ -100,7 +94,6 @@ public class BookBot extends Module { private final Setting count = sgGeneral.add(new BoolSetting.Builder() .name("append-count") - .description("Whether to append the number of the book to the title.") .defaultValue(true) .visible(sign::get) .build() @@ -108,7 +101,6 @@ public class BookBot extends Module { private final Setting wordWrap = sgGeneral.add(new BoolSetting.Builder() .name("word-wrap") - .description("Prevents words from being cut in the middle of lines.") .defaultValue(true) .visible(() -> mode.get() == Mode.File) .build() @@ -121,7 +113,7 @@ public class BookBot extends Module { private Random random; public BookBot() { - super(Categories.Misc, "book-bot", "Automatically writes in books."); + super(Categories.Misc, "book-bot"); if (!file.exists()) { file = null; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java index 5a36774923..8e130c96c9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java @@ -46,14 +46,13 @@ public enum SelectMode { Sequential } - private final SettingGroup sgLine1 = settings.createGroup("Line 1"); - private final SettingGroup sgLine2 = settings.createGroup("Line 2"); + private final SettingGroup sgLine1 = settings.createGroup("line-1"); + private final SettingGroup sgLine2 = settings.createGroup("line-2"); // Line 1 private final Setting> line1Strings = sgLine1.add(new StringListSetting.Builder() .name("line-1-messages") - .description("Messages used for the first line.") .defaultValue("{player}", "{server}") .onChanged(strings -> recompileLine1()) .renderer(StarscriptTextBoxRenderer.class) @@ -62,7 +61,6 @@ public enum SelectMode { private final Setting line1UpdateDelay = sgLine1.add(new IntSetting.Builder() .name("line-1-update-delay") - .description("How fast to update the first line in ticks.") .defaultValue(200) .min(10) .sliderRange(10, 200) @@ -71,7 +69,6 @@ public enum SelectMode { private final Setting line1SelectMode = sgLine1.add(new EnumSetting.Builder() .name("line-1-select-mode") - .description("How to select messages for the first line.") .defaultValue(SelectMode.Sequential) .build() ); @@ -80,7 +77,6 @@ public enum SelectMode { private final Setting> line2Strings = sgLine2.add(new StringListSetting.Builder() .name("line-2-messages") - .description("Messages used for the second line.") .defaultValue("Meteor on Crack!", "{round(server.tps, 1)} TPS", "Playing on {server.difficulty} difficulty.", "{server.player_count} Players online") .onChanged(strings -> recompileLine2()) .renderer(StarscriptTextBoxRenderer.class) @@ -89,7 +85,6 @@ public enum SelectMode { private final Setting line2UpdateDelay = sgLine2.add(new IntSetting.Builder() .name("line-2-update-delay") - .description("How fast to update the second line in ticks.") .defaultValue(60) .min(10) .sliderRange(10, 200) @@ -98,7 +93,6 @@ public enum SelectMode { private final Setting line2SelectMode = sgLine2.add(new EnumSetting.Builder() .name("line-2-select-mode") - .description("How to select messages for the second line.") .defaultValue(SelectMode.Sequential) .build() ); @@ -122,7 +116,7 @@ public enum SelectMode { } public DiscordPresence() { - super(Categories.Misc, "discord-presence", "Displays Meteor as your presence on Discord."); + super(Categories.Misc, "discord-presence"); runInMainMenu = true; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java index 8a13ebb7f2..6c8e3bd5e9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java @@ -43,24 +43,22 @@ public class InventoryTweaks extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgSorting = settings.createGroup("Sorting"); - private final SettingGroup sgAntiDrop = settings.createGroup("Anti Drop"); - private final SettingGroup sgAutoDrop = settings.createGroup("Auto Drop"); - private final SettingGroup sgStealDump = settings.createGroup("Steal and Dump"); - private final SettingGroup sgAutoSteal = settings.createGroup("Auto Steal"); + private final SettingGroup sgSorting = settings.createGroup("sorting"); + private final SettingGroup sgAntiDrop = settings.createGroup("anti-drop"); + private final SettingGroup sgAutoDrop = settings.createGroup("auto-drop"); + private final SettingGroup sgStealDump = settings.createGroup("steal-and-dump"); + private final SettingGroup sgAutoSteal = settings.createGroup("auto-steal"); // General private final Setting mouseDragItemMove = sgGeneral.add(new BoolSetting.Builder() .name("mouse-drag-item-move") - .description("Moving mouse over items while holding shift will transfer it to the other container.") .defaultValue(true) .build() ); private final Setting xCarry = sgGeneral.add(new BoolSetting.Builder() .name("xcarry") - .description("Allows you to store four extra item stacks in your crafting grid.") .defaultValue(true) .onChanged(v -> { if (v || !Utils.canUpdate()) return; @@ -74,14 +72,12 @@ public class InventoryTweaks extends Module { private final Setting sortingEnabled = sgSorting.add(new BoolSetting.Builder() .name("sorting-enabled") - .description("Automatically sorts stacks in inventory.") .defaultValue(true) .build() ); private final Setting sortingKey = sgSorting.add(new KeybindSetting.Builder() .name("sorting-key") - .description("Key to trigger the sort.") .visible(sortingEnabled::get) .defaultValue(Keybind.fromButton(GLFW.GLFW_MOUSE_BUTTON_MIDDLE)) .build() @@ -89,7 +85,6 @@ public class InventoryTweaks extends Module { private final Setting sortingDelay = sgSorting.add(new IntSetting.Builder() .name("sorting-delay") - .description("Delay in ticks between moving items when sorting.") .visible(sortingEnabled::get) .defaultValue(1) .min(0) @@ -98,7 +93,6 @@ public class InventoryTweaks extends Module { private final Setting disableInCreative = sgSorting.add(new BoolSetting.Builder() .name("disable-in-creative") - .description("Disables the inventory sorter when in creative mode.") .defaultValue(true) .visible(sortingEnabled::get) .build() @@ -106,7 +100,6 @@ public class InventoryTweaks extends Module { private final Setting uncapBundleScrolling = sgGeneral.add(new BoolSetting.Builder() .name("uncap-bundle-scrolling") - .description("Whether to uncap the bundle scrolling feature to let you select any item.") .defaultValue(true) .build() ); @@ -115,20 +108,17 @@ public class InventoryTweaks extends Module { private final Setting> antiDropItems = sgAntiDrop.add(new ItemListSetting.Builder() .name("anti-drop-items") - .description("Items to prevent dropping. Doesn't work in creative inventory screen.") .build() ); private final Setting antiItemFrame = sgAntiDrop.add(new BoolSetting.Builder() .name("item-frames") - .description("Prevent anti-drop items from being placed in item frames or pots") .defaultValue(true) .build() ); private final Setting antiDropOverrideBind = sgAntiDrop.add(new KeybindSetting.Builder() .name("override-bind") - .description("Hold this bind to temporarily bypass anti-drop") .build() ); @@ -136,27 +126,23 @@ public class InventoryTweaks extends Module { private final Setting> autoDropItems = sgAutoDrop.add(new ItemListSetting.Builder() .name("auto-drop-items") - .description("Items to drop.") .build() ); private final Setting autoDropExcludeEquipped = sgAutoDrop.add(new BoolSetting.Builder() .name("exclude-equipped") - .description("Whether or not to drop items equipped in armor slots.") .defaultValue(true) .build() ); private final Setting autoDropExcludeHotbar = sgAutoDrop.add(new BoolSetting.Builder() .name("exclude-hotbar") - .description("Whether or not to drop items from your hotbar.") .defaultValue(false) .build() ); private final Setting autoDropOnlyFullStacks = sgAutoDrop.add(new BoolSetting.Builder() .name("only-full-stacks") - .description("Only drops the items if the stack is full.") .defaultValue(false) .build() ); @@ -165,28 +151,24 @@ public class InventoryTweaks extends Module { public final Setting>> stealScreens = sgStealDump.add(new ScreenHandlerListSetting.Builder() .name("steal-screens") - .description("Select the screens to display buttons and auto steal.") .defaultValue(List.of(ScreenHandlerType.GENERIC_9X3, ScreenHandlerType.GENERIC_9X6)) .build() ); private final Setting buttons = sgStealDump.add(new BoolSetting.Builder() .name("inventory-buttons") - .description("Shows steal and dump buttons in container guis.") .defaultValue(true) .build() ); private final Setting stealDrop = sgStealDump.add(new BoolSetting.Builder() .name("steal-drop") - .description("Drop items to the ground instead of stealing them.") .defaultValue(false) .build() ); private final Setting dropBackwards = sgStealDump.add(new BoolSetting.Builder() .name("drop-backwards") - .description("Drop items behind you.") .defaultValue(false) .visible(stealDrop::get) .build() @@ -194,27 +176,23 @@ public class InventoryTweaks extends Module { private final Setting dumpFilter = sgStealDump.add(new EnumSetting.Builder() .name("dump-filter") - .description("Dump mode.") .defaultValue(ListMode.None) .build() ); private final Setting> dumpItems = sgStealDump.add(new ItemListSetting.Builder() .name("dump-items") - .description("Items to dump.") .build() ); private final Setting stealFilter = sgStealDump.add(new EnumSetting.Builder() .name("steal-filter") - .description("Steal mode.") .defaultValue(ListMode.None) .build() ); private final Setting> stealItems = sgStealDump.add(new ItemListSetting.Builder() .name("steal-items") - .description("Items to steal.") .build() ); @@ -222,7 +200,6 @@ public class InventoryTweaks extends Module { private final Setting autoSteal = sgAutoSteal.add(new BoolSetting.Builder() .name("auto-steal") - .description("Automatically removes all possible items when you open a container.") .defaultValue(false) .onChanged(val -> checkAutoStealSettings()) .build() @@ -230,7 +207,6 @@ public class InventoryTweaks extends Module { private final Setting autoDump = sgAutoSteal.add(new BoolSetting.Builder() .name("auto-dump") - .description("Automatically dumps all possible items when you open a container.") .defaultValue(false) .onChanged(val -> checkAutoStealSettings()) .build() @@ -238,7 +214,6 @@ public class InventoryTweaks extends Module { private final Setting autoStealDelay = sgAutoSteal.add(new IntSetting.Builder() .name("delay") - .description("The minimum delay between stealing the next stack in milliseconds.") .defaultValue(20) .sliderMax(1000) .build() @@ -246,7 +221,6 @@ public class InventoryTweaks extends Module { private final Setting autoStealInitDelay = sgAutoSteal.add(new IntSetting.Builder() .name("initial-delay") - .description("The initial delay before stealing in milliseconds. 0 to use normal delay instead.") .defaultValue(50) .sliderMax(1000) .build() @@ -254,7 +228,6 @@ public class InventoryTweaks extends Module { private final Setting autoStealRandomDelay = sgAutoSteal.add(new IntSetting.Builder() .name("random") - .description("Randomly adds a delay of up to the specified time in milliseconds.") .min(0) .sliderMax(1000) .defaultValue(50) @@ -265,7 +238,7 @@ public class InventoryTweaks extends Module { private boolean invOpened; public InventoryTweaks() { - super(Categories.Misc, "inventory-tweaks", "Various inventory related utilities."); + super(Categories.Misc, "inventory-tweaks"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MessageAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MessageAura.java index 23c795b191..2e57211dcb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MessageAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/MessageAura.java @@ -22,20 +22,18 @@ public class MessageAura extends Module { private final Setting message = sgGeneral.add(new StringSetting.Builder() .name("message") - .description("The specified message sent to the player.") .defaultValue("Meteor on Crack!") .build() ); private final Setting ignoreFriends = sgGeneral.add(new BoolSetting.Builder() .name("ignore-friends") - .description("Will not send any messages to people friended.") .defaultValue(false) .build() ); public MessageAura() { - super(Categories.Misc, "message-aura", "Sends a specified message to any player that enters render distance."); + super(Categories.Misc, "message-aura"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java index f5a5afea78..bb3b9435d9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java @@ -61,12 +61,11 @@ public class Notebot extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgNoteMap = settings.createGroup("Note Map", false); - private final SettingGroup sgRender = settings.createGroup("Render", true); + private final SettingGroup sgNoteMap = settings.createGroup("note-map", false); + private final SettingGroup sgRender = settings.createGroup("render", true); public final Setting tickDelay = sgGeneral.add(new IntSetting.Builder() .name("tick-delay") - .description("The delay when loading a song.") .defaultValue(1) .sliderRange(1, 20) .min(1) @@ -75,7 +74,6 @@ public class Notebot extends Module { public final Setting concurrentTuneBlocks = sgGeneral.add(new IntSetting.Builder() .name("concurrent-tune-blocks") - .description("How many noteblocks can be tuned at the same time. On Paper it is recommended to set it to 1 to avoid bugs.") .defaultValue(1) .min(1) .sliderRange(1, 20) @@ -84,56 +82,48 @@ public class Notebot extends Module { public final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("Select mode of notebot") .defaultValue(NotebotUtils.NotebotMode.ExactInstruments) .build() ); public final Setting instrumentDetectMode = sgGeneral.add(new EnumSetting.Builder() .name("instrument-detect-mode") - .description("Select an instrument detect mode. Can be useful when server has a plugin that modifies noteblock state (e.g ItemsAdder) but noteblock can still play the right note") .defaultValue(InstrumentDetectMode.BlockState) .build() ); public final Setting polyphonic = sgGeneral.add(new BoolSetting.Builder() .name("polyphonic") - .description("Whether or not to allow multiple notes to be played at the same time") .defaultValue(true) .build() ); public final Setting autoRotate = sgGeneral.add(new BoolSetting.Builder() .name("auto-rotate") - .description("Should client look at note block when it wants to hit it") .defaultValue(true) .build() ); public final Setting autoPlay = sgGeneral.add(new BoolSetting.Builder() .name("auto-play") - .description("Auto plays random songs") .defaultValue(false) .build() ); public final Setting roundOutOfRange = sgGeneral.add(new BoolSetting.Builder() .name("round-out-of-range") - .description("Rounds out of range notes") .defaultValue(false) .build() ); public final Setting swingArm = sgGeneral.add(new BoolSetting.Builder() .name("swing-arm") - .description("Should swing arm on hit") .defaultValue(true) .build() ); public final Setting checkNoteblocksAgainDelay = sgGeneral.add(new IntSetting.Builder() .name("check-noteblocks-again-delay") - .description("How much delay should be between end of tuning and checking again") .defaultValue(10) .min(1) .sliderRange(1, 20) @@ -142,84 +132,72 @@ public class Notebot extends Module { public final Setting renderText = sgRender.add(new BoolSetting.Builder() .name("render-text") - .description("Whether or not to render the text above noteblocks.") .defaultValue(true) .build() ); public final Setting renderBoxes = sgRender.add(new BoolSetting.Builder() .name("render-boxes") - .description("Whether or not to render the outline around the noteblocks.") .defaultValue(true) .build() ); public final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); public final Setting untunedSideColor = sgRender.add(new ColorSetting.Builder() .name("untuned-side-color") - .description("The color of the sides of the untuned blocks being rendered.") .defaultValue(new SettingColor(204, 0, 0, 10)) .build() ); public final Setting untunedLineColor = sgRender.add(new ColorSetting.Builder() .name("untuned-line-color") - .description("The color of the lines of the untuned blocks being rendered.") .defaultValue(new SettingColor(204, 0, 0, 255)) .build() ); public final Setting tunedSideColor = sgRender.add(new ColorSetting.Builder() .name("tuned-side-color") - .description("The color of the sides of the tuned blocks being rendered.") .defaultValue(new SettingColor(0, 204, 0, 10)) .build() ); public final Setting tunedLineColor = sgRender.add(new ColorSetting.Builder() .name("tuned-line-color") - .description("The color of the lines of the tuned blocks being rendered.") .defaultValue(new SettingColor(0, 204, 0, 255)) .build() ); public final Setting tuneHitSideColor = sgRender.add(new ColorSetting.Builder() .name("hit-side-color") - .description("The color of the sides being rendered on noteblock tune hit.") .defaultValue(new SettingColor(255, 153, 0, 10)) .build() ); private final Setting tuneHitLineColor = sgRender.add(new ColorSetting.Builder() .name("hit-line-color") - .description("The color of the lines being rendered on noteblock tune hit.") .defaultValue(new SettingColor(255, 153, 0, 255)) .build() ); public final Setting scannedNoteblockSideColor = sgRender.add(new ColorSetting.Builder() .name("scanned-noteblock-side-color") - .description("The color of the sides of the scanned noteblocks being rendered.") .defaultValue(new SettingColor(255, 255, 0, 30)) .build() ); private final Setting scannedNoteblockLineColor = sgRender.add(new ColorSetting.Builder() .name("scanned-noteblock-line-color") - .description("The color of the lines of the scanned noteblocks being rendered.") .defaultValue(new SettingColor(255, 255, 0, 255)) .build() ); public final Setting noteTextScale = sgRender.add(new DoubleSetting.Builder() .name("note-text-scale") - .description("The scale.") .defaultValue(1.5) .min(0) .build() @@ -227,7 +205,6 @@ public class Notebot extends Module { public final Setting showScannedNoteblocks = sgRender.add(new BoolSetting.Builder() .name("show-scanned-noteblocks") - .description("Show scanned Noteblocks") .defaultValue(false) .build() ); @@ -252,7 +229,7 @@ public class Notebot extends Module { public Notebot() { - super(Categories.Misc, "notebot", "Plays noteblock nicely"); + super(Categories.Misc, "notebot"); for (NoteBlockInstrument inst : NoteBlockInstrument.values()) { NotebotUtils.OptionalInstrument optionalInstrument = NotebotUtils.OptionalInstrument.fromMinecraftInstrument(inst); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java index aee4004eef..a5dcf327c1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java @@ -43,23 +43,21 @@ import static meteordevelopment.meteorclient.utils.player.ChatUtils.formatCoords; public class Notifier extends Module { - private final SettingGroup sgTotemPops = settings.createGroup("Totem Pops"); - private final SettingGroup sgVisualRange = settings.createGroup("Visual Range"); - private final SettingGroup sgPearl = settings.createGroup("Pearl"); - private final SettingGroup sgJoinsLeaves = settings.createGroup("Joins/Leaves"); + private final SettingGroup sgTotemPops = settings.createGroup("totem-pops"); + private final SettingGroup sgVisualRange = settings.createGroup("visual-range"); + private final SettingGroup sgPearl = settings.createGroup("pearl"); + private final SettingGroup sgJoinsLeaves = settings.createGroup("joins/leaves"); // Totem Pops private final Setting totemPops = sgTotemPops.add(new BoolSetting.Builder() .name("totem-pops") - .description("Notifies you when a player pops a totem.") .defaultValue(true) .build() ); private final Setting totemsDistanceCheck = sgTotemPops.add(new BoolSetting.Builder() .name("distance-check") - .description("Limits the distance in which the pops are recognized.") .defaultValue(false) .visible(totemPops::get) .build() @@ -67,7 +65,6 @@ public class Notifier extends Module { private final Setting totemsDistance = sgTotemPops.add(new IntSetting.Builder() .name("player-radius") - .description("The radius in which to log totem pops.") .defaultValue(30) .sliderRange(1, 50) .range(1, 100) @@ -77,21 +74,18 @@ public class Notifier extends Module { private final Setting totemsIgnoreOwn = sgTotemPops.add(new BoolSetting.Builder() .name("ignore-own") - .description("Ignores your own totem pops.") .defaultValue(false) .build() ); private final Setting totemsIgnoreFriends = sgTotemPops.add(new BoolSetting.Builder() .name("ignore-friends") - .description("Ignores friends totem pops.") .defaultValue(false) .build() ); private final Setting totemsIgnoreOthers = sgTotemPops.add(new BoolSetting.Builder() .name("ignore-others") - .description("Ignores other players totem pops.") .defaultValue(false) .build() ); @@ -100,42 +94,36 @@ public class Notifier extends Module { private final Setting visualRange = sgVisualRange.add(new BoolSetting.Builder() .name("visual-range") - .description("Notifies you when an entity enters your render distance.") .defaultValue(false) .build() ); private final Setting event = sgVisualRange.add(new EnumSetting.Builder() .name("event") - .description("When to log the entities.") .defaultValue(Event.Both) .build() ); private final Setting>> entities = sgVisualRange.add(new EntityTypeListSetting.Builder() .name("entities") - .description("Which entities to notify about.") .defaultValue(EntityType.PLAYER) .build() ); private final Setting visualRangeIgnoreFriends = sgVisualRange.add(new BoolSetting.Builder() .name("ignore-friends") - .description("Ignores friends.") .defaultValue(true) .build() ); private final Setting visualRangeIgnoreFakes = sgVisualRange.add(new BoolSetting.Builder() .name("ignore-fake-players") - .description("Ignores fake players.") .defaultValue(true) .build() ); private final Setting visualMakeSound = sgVisualRange.add(new BoolSetting.Builder() .name("sound") - .description("Emits a sound effect on enter / leave") .defaultValue(true) .build() ); @@ -144,21 +132,18 @@ public class Notifier extends Module { private final Setting pearl = sgPearl.add(new BoolSetting.Builder() .name("pearl") - .description("Notifies you when a player is teleported using an ender pearl.") .defaultValue(true) .build() ); private final Setting pearlIgnoreOwn = sgPearl.add(new BoolSetting.Builder() .name("ignore-own") - .description("Ignores your own pearls.") .defaultValue(false) .build() ); private final Setting pearlIgnoreFriends = sgPearl.add(new BoolSetting.Builder() .name("ignore-friends") - .description("Ignores friends pearls.") .defaultValue(false) .build() ); @@ -167,14 +152,12 @@ public class Notifier extends Module { private final Setting joinsLeavesMode = sgJoinsLeaves.add(new EnumSetting.Builder() .name("player-joins-leaves") - .description("How to handle player join/leave notifications.") .defaultValue(JoinLeaveModes.None) .build() ); private final Setting notificationDelay = sgJoinsLeaves.add(new IntSetting.Builder() .name("notification-delay") - .description("How long to wait in ticks before posting the next join/leave notification in your chat.") .range(0, 1000) .sliderRange(0, 100) .defaultValue(0) @@ -183,7 +166,6 @@ public class Notifier extends Module { private final Setting simpleNotifications = sgJoinsLeaves.add(new BoolSetting.Builder() .name("simple-notifications") - .description("Display join/leave notifications without a prefix, to reduce chat clutter.") .defaultValue(true) .build() ); @@ -198,7 +180,7 @@ public class Notifier extends Module { private final Random random = new Random(); public Notifier() { - super(Categories.Misc, "notifier", "Notifies you of different events."); + super(Categories.Misc, "notifier"); } // Visual Range diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/PacketCanceller.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/PacketCanceller.java index ba7a2c1f15..7f84cd8321 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/PacketCanceller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/PacketCanceller.java @@ -23,20 +23,18 @@ public class PacketCanceller extends Module { private final Setting>>> s2cPackets = sgGeneral.add(new PacketListSetting.Builder() .name("S2C-packets") - .description("Server-to-client packets to cancel.") .filter(aClass -> PacketUtils.getS2CPackets().contains(aClass)) .build() ); private final Setting>>> c2sPackets = sgGeneral.add(new PacketListSetting.Builder() .name("C2S-packets") - .description("Client-to-server packets to cancel.") .filter(aClass -> PacketUtils.getC2SPackets().contains(aClass)) .build() ); public PacketCanceller() { - super(Categories.Misc, "packet-canceller", "Allows you to cancel certain packets."); + super(Categories.Misc, "packet-canceller"); runInMainMenu = true; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java index c4000b203e..0ef69798c5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/ServerSpoof.java @@ -36,14 +36,12 @@ public class ServerSpoof extends Module { private final Setting spoofBrand = sgGeneral.add(new BoolSetting.Builder() .name("spoof-brand") - .description("Whether or not to spoof the brand.") .defaultValue(true) .build() ); private final Setting brand = sgGeneral.add(new StringSetting.Builder() .name("brand") - .description("Specify the brand that will be send to the server.") .defaultValue("vanilla") .visible(spoofBrand::get) .build() @@ -51,21 +49,18 @@ public class ServerSpoof extends Module { private final Setting resourcePack = sgGeneral.add(new BoolSetting.Builder() .name("resource-pack") - .description("Spoof accepting server resource pack.") .defaultValue(false) .build() ); private final Setting blockChannels = sgGeneral.add(new BoolSetting.Builder() .name("block-channels") - .description("Whether or not to block some channels.") .defaultValue(true) .build() ); private final Setting> channels = sgGeneral.add(new StringListSetting.Builder() .name("channels") - .description("If the channel contains the keyword, this outgoing channel will be blocked.") .defaultValue("fabric", "minecraft:register") .visible(blockChannels::get) .build() @@ -75,7 +70,7 @@ public class ServerSpoof extends Module { public boolean silentAcceptResourcePack = false; public ServerSpoof() { - super(Categories.Misc, "server-spoof", "Spoof client brand, resource pack and channels."); + super(Categories.Misc, "server-spoof"); runInMainMenu = true; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/SoundBlocker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/SoundBlocker.java index 7b2ff09a72..1a0c636f20 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/SoundBlocker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/SoundBlocker.java @@ -23,12 +23,11 @@ public class SoundBlocker extends Module { private final Setting> sounds = sgGeneral.add(new SoundEventListSetting.Builder() .name("sounds") - .description("Sounds to block.") .build() ); public SoundBlocker() { - super(Categories.Misc, "sound-blocker", "Cancels out selected sounds."); + super(Categories.Misc, "sound-blocker"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Spam.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Spam.java index 5315c3e448..c27dee6643 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Spam.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Spam.java @@ -24,14 +24,12 @@ public class Spam extends Module { private final Setting> messages = sgGeneral.add(new StringListSetting.Builder() .name("messages") - .description("Messages to use for spam.") .defaultValue(List.of("Meteor on Crack!")) .build() ); private final Setting delay = sgGeneral.add(new IntSetting.Builder() .name("delay") - .description("The delay between specified messages in ticks.") .defaultValue(20) .min(0) .sliderMax(200) @@ -40,35 +38,30 @@ public class Spam extends Module { private final Setting disableOnLeave = sgGeneral.add(new BoolSetting.Builder() .name("disable-on-leave") - .description("Disables spam when you leave a server.") .defaultValue(true) .build() ); private final Setting disableOnDisconnect = sgGeneral.add(new BoolSetting.Builder() .name("disable-on-disconnect") - .description("Disables spam when you are disconnected from a server.") .defaultValue(true) .build() ); private final Setting random = sgGeneral.add(new BoolSetting.Builder() .name("randomise") - .description("Selects a random message from your spam message list.") .defaultValue(false) .build() ); private final Setting autoSplitMessages = sgGeneral.add(new BoolSetting.Builder() .name("auto-split-messages") - .description("Automatically split up large messages after a certain length") .defaultValue(false) .build() ); private final Setting splitLength = sgGeneral.add(new IntSetting.Builder() .name("split-length") - .description("The length after which to split messages in chat") .visible(autoSplitMessages::get) .defaultValue(256) .min(1) @@ -78,7 +71,6 @@ public class Spam extends Module { private final Setting autoSplitDelay = sgGeneral.add(new IntSetting.Builder() .name("split-delay") - .description("The delay between split messages in ticks.") .visible(autoSplitMessages::get) .defaultValue(20) .min(0) @@ -88,14 +80,12 @@ public class Spam extends Module { private final Setting bypass = sgGeneral.add(new BoolSetting.Builder() .name("bypass") - .description("Add random text at the end of the message to try to bypass anti spams.") .defaultValue(false) .build() ); private final Setting uppercase = sgGeneral.add(new BoolSetting.Builder() .name("include-uppercase-characters") - .description("Whether the bypass text should include uppercase characters.") .visible(bypass::get) .defaultValue(true) .build() @@ -103,7 +93,6 @@ public class Spam extends Module { private final Setting length = sgGeneral.add(new IntSetting.Builder() .name("length") - .description("Number of characters used to bypass anti spam.") .visible(bypass::get) .defaultValue(16) .sliderRange(1, 256) @@ -114,7 +103,7 @@ public class Spam extends Module { private String text; public Spam() { - super(Categories.Misc, "spam", "Spams specified messages in chat."); + super(Categories.Misc, "spam"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/Swarm.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/Swarm.java index ce046432e4..43338c84a5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/Swarm.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/Swarm.java @@ -24,14 +24,12 @@ public class Swarm extends Module { public final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("What type of client to run.") .defaultValue(Mode.Host) .build() ); private final Setting ipAddress = sgGeneral.add(new StringSetting.Builder() .name("ip") - .description("The IP address of the host server.") .defaultValue("localhost") .visible(() -> mode.get() == Mode.Worker) .build() @@ -39,7 +37,6 @@ public class Swarm extends Module { private final Setting serverPort = sgGeneral.add(new IntSetting.Builder() .name("port") - .description("The port used for connections.") .defaultValue(6969) .range(1, 65535) .noSlider() @@ -50,7 +47,7 @@ public class Swarm extends Module { public SwarmWorker worker; public Swarm() { - super(Categories.Misc, "swarm", "Allows you to control multiple instances of Meteor from one central host."); + super(Categories.Misc, "swarm"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AirJump.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AirJump.java index a078d0323f..a80be53858 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AirJump.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AirJump.java @@ -22,7 +22,6 @@ public class AirJump extends Module { private final Setting maintainLevel = sgGeneral.add(new BoolSetting.Builder() .name("maintain-level") - .description("Maintains your current Y level when holding the jump key.") .defaultValue(false) .build() ); @@ -30,7 +29,7 @@ public class AirJump extends Module { private int level; public AirJump() { - super(Categories.Movement, "air-jump", "Lets you jump in the air."); + super(Categories.Movement, "air-jump"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Anchor.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Anchor.java index 4005727fae..e717392f4b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Anchor.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Anchor.java @@ -22,7 +22,6 @@ public class Anchor extends Module { private final Setting maxHeight = sgGeneral.add(new IntSetting.Builder() .name("max-height") - .description("The maximum height Anchor will work at.") .defaultValue(10) .range(0, 255) .sliderMax(20) @@ -31,7 +30,6 @@ public class Anchor extends Module { private final Setting minPitch = sgGeneral.add(new IntSetting.Builder() .name("min-pitch") - .description("The minimum pitch at which anchor will work.") .defaultValue(0) .range(-90, 90) .sliderRange(-90, 90) @@ -40,21 +38,18 @@ public class Anchor extends Module { private final Setting cancelMove = sgGeneral.add(new BoolSetting.Builder() .name("cancel-jump-in-hole") - .description("Prevents you from jumping when Anchor is active and Min Pitch is met.") .defaultValue(false) .build() ); private final Setting pull = sgGeneral.add(new BoolSetting.Builder() .name("pull") - .description("The pull strength of Anchor.") .defaultValue(false) .build() ); private final Setting pullSpeed = sgGeneral.add(new DoubleSetting.Builder() .name("pull-speed") - .description("How fast to pull towards the hole in blocks per second.") .defaultValue(0.3) .min(0) .sliderMax(5) @@ -72,7 +67,7 @@ public class Anchor extends Module { public double deltaX, deltaZ; public Anchor() { - super(Categories.Movement, "anchor", "Helps you get into holes by stopping your movement completely over a hole."); + super(Categories.Movement, "anchor"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AntiVoid.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AntiVoid.java index 6a697bdb25..5a1023e08c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AntiVoid.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AntiVoid.java @@ -20,7 +20,6 @@ public class AntiVoid extends Module { private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("The method to prevent you from falling into the void.") .defaultValue(Mode.Jump) .onChanged(a -> onActivate()) .build() @@ -29,7 +28,7 @@ public class AntiVoid extends Module { private boolean wasFlightEnabled, hasRun; public AntiVoid() { - super(Categories.Movement, "anti-void", "Attempts to prevent you from falling into the void."); + super(Categories.Movement, "anti-void"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoJump.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoJump.java index 3277d74f90..1e12312268 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoJump.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoJump.java @@ -20,21 +20,18 @@ public class AutoJump extends Module { private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("The method of jumping.") .defaultValue(Mode.Jump) .build() ); private final Setting jumpIf = sgGeneral.add(new EnumSetting.Builder() .name("jump-if") - .description("Jump if.") .defaultValue(JumpWhen.Always) .build() ); private final Setting velocityHeight = sgGeneral.add(new DoubleSetting.Builder() .name("velocity-height") - .description("The distance that velocity mode moves you.") .defaultValue(0.25) .min(0) .sliderMax(2) @@ -42,7 +39,7 @@ public class AutoJump extends Module { ); public AutoJump() { - super(Categories.Movement, "auto-jump", "Automatically jumps."); + super(Categories.Movement, "auto-jump"); } private boolean jump() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWalk.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWalk.java index aa839a3795..d820efb792 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWalk.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWalk.java @@ -31,7 +31,6 @@ public class AutoWalk extends Module { private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("Walking mode.") .defaultValue(Mode.Smart) .onChanged(mode1 -> { if (isActive() && Utils.canUpdate()) { @@ -49,7 +48,6 @@ public class AutoWalk extends Module { private final Setting direction = sgGeneral.add(new EnumSetting.Builder() .name("simple-direction") - .description("The direction to walk in simple mode.") .defaultValue(Direction.Forwards) .onChanged(direction1 -> { if (isActive()) unpress(); @@ -60,14 +58,12 @@ public class AutoWalk extends Module { private final Setting disableOnInput = sgGeneral.add(new BoolSetting.Builder() .name("disable-on-input") - .description("Disable module on manual movement input") .defaultValue(false) .build() ); private final Setting disableOnY = sgGeneral.add(new BoolSetting.Builder() .name("disable-on-y-change") - .description("Disable module if player moves vertically") .defaultValue(false) .visible(() -> mode.get() == Mode.Simple) .build() @@ -75,14 +71,13 @@ public class AutoWalk extends Module { private final Setting waitForChunks = sgGeneral.add(new BoolSetting.Builder() .name("no-unloaded-chunks") - .description("Do not allow movement into unloaded chunks") .defaultValue(true) .visible(() -> mode.get() == Mode.Simple) .build() ); public AutoWalk() { - super(Categories.Movement, "auto-walk", "Automatically walks forward."); + super(Categories.Movement, "auto-walk"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWasp.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWasp.java index 34921e0a4b..5a4f7cc852 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWasp.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWasp.java @@ -34,49 +34,42 @@ public class AutoWasp extends Module { private final Setting horizontalSpeed = sgGeneral.add(new DoubleSetting.Builder() .name("horizontal-speed") - .description("Horizontal elytra speed.") .defaultValue(2.0) .build() ); private final Setting verticalSpeed = sgGeneral.add(new DoubleSetting.Builder() .name("vertical-speed") - .description("Vertical elytra speed.") .defaultValue(3.0) .build() ); private final Setting avoidLanding = sgGeneral.add(new BoolSetting.Builder() .name("avoid-landing") - .description("Will try to avoid landing if your target is on the ground.") .defaultValue(true) .build() ); private final Setting predictMovement = sgGeneral.add(new BoolSetting.Builder() .name("predict-movement") - .description("Tries to predict the targets position according to their movement.") .defaultValue(true) .build() ); private final Setting onlyFriends = sgGeneral.add(new BoolSetting.Builder() .name("only-friends") - .description("Will only follow friends.") .defaultValue(false) .build() ); private final Setting action = sgGeneral.add(new EnumSetting.Builder() .name("action-on-target-loss") - .description("What to do if you lose the target.") .defaultValue(Action.TOGGLE) .build() ); private final Setting offset = sgGeneral.add(new Vector3dSetting.Builder() .name("offset") - .description("How many blocks offset to wasp at from the target.") .defaultValue(0, 0, 0) .build() ); @@ -86,7 +79,7 @@ public class AutoWasp extends Module { private boolean incrementJumpTimer = false; public AutoWasp() { - super(Categories.Movement, "auto-wasp", "Wasps for you. Unable to traverse around blocks, assumes a clear straight line to the target."); + super(Categories.Movement, "auto-wasp"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Blink.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Blink.java index 91e529faaf..809568f23b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Blink.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Blink.java @@ -28,14 +28,12 @@ public class Blink extends Module { private final Setting renderOriginal = sgGeneral.add(new BoolSetting.Builder() .name("render-original") - .description("Renders your player model at the original position.") .defaultValue(true) .build() ); private final Setting delay = sgGeneral.add(new IntSetting.Builder() .name("pulse-delay") - .description("After the duration in ticks has elapsed, send all packets and start blinking again. 0 to disable.") .defaultValue(0) .min(0) .sliderMax(60) @@ -45,7 +43,6 @@ public class Blink extends Module { @SuppressWarnings("unused") private final Setting cancelBlink = sgGeneral.add(new KeybindSetting.Builder() .name("cancel-blink") - .description("Cancels sending packets and sends you back to your original position.") .defaultValue(Keybind.none()) .action(() -> { cancelled = true; @@ -62,7 +59,7 @@ public class Blink extends Module { private int timer = 0; public Blink() { - super(Categories.Movement, "blink", "Allows you to essentially teleport while suspending motion updates."); + super(Categories.Movement, "blink"); runInMainMenu = true; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ClickTP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ClickTP.java index efd47f775b..fc6bdd5a18 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ClickTP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ClickTP.java @@ -28,7 +28,7 @@ public class ClickTP extends Module { public ClickTP() { - super(Categories.Movement, "click-tp", "Teleports you to the block you click on."); + super(Categories.Movement, "click-tp"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ElytraBoost.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ElytraBoost.java index 4f3a123210..1766e9ee0e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ElytraBoost.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ElytraBoost.java @@ -32,14 +32,12 @@ public class ElytraBoost extends Module { private final Setting dontConsumeFirework = sgGeneral.add(new BoolSetting.Builder() .name("anti-consume") - .description("Prevents fireworks from being consumed when using Elytra Boost.") .defaultValue(true) .build() ); private final Setting fireworkLevel = sgGeneral.add(new IntSetting.Builder() .name("firework-duration") - .description("The duration of the firework.") .defaultValue(0) .range(0, 255) .sliderMax(255) @@ -48,7 +46,6 @@ public class ElytraBoost extends Module { private final Setting playSound = sgGeneral.add(new BoolSetting.Builder() .name("play-sound") - .description("Plays the firework sound when a boost is triggered.") .defaultValue(true) .build() ); @@ -56,7 +53,6 @@ public class ElytraBoost extends Module { @SuppressWarnings("unused") private final Setting keybind = sgGeneral.add(new KeybindSetting.Builder() .name("keybind") - .description("The keybind to boost.") .action(this::boost) .build() ); @@ -64,7 +60,7 @@ public class ElytraBoost extends Module { private final List fireworks = new ArrayList<>(); public ElytraBoost() { - super(Categories.Movement, "elytra-boost", "Boosts your elytra as if you used a firework."); + super(Categories.Movement, "elytra-boost"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/EntityControl.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/EntityControl.java index 61b40e941d..e9daec0fb1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/EntityControl.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/EntityControl.java @@ -29,9 +29,9 @@ import java.util.Set; public class EntityControl extends Module { - private final SettingGroup sgControl = settings.createGroup("Control"); - private final SettingGroup sgSpeed = settings.createGroup("Speed"); - private final SettingGroup sgFlight = settings.createGroup("Flight"); + private final SettingGroup sgControl = settings.createGroup("control"); + private final SettingGroup sgSpeed = settings.createGroup("speed"); + private final SettingGroup sgFlight = settings.createGroup("flight"); List> list = new ArrayList<>(); { @@ -44,7 +44,6 @@ public class EntityControl extends Module { private final Setting>> entities = sgControl.add(new EntityTypeListSetting.Builder() .name("entities") - .description("Target entities.") .filter(entityType -> EntityUtils.isRideable(entityType) && entityType != EntityType.MINECART && entityType != EntityType.LLAMA && entityType != EntityType.TRADER_LLAMA) .defaultValue(list.toArray(new EntityType[0])) .build() @@ -52,42 +51,36 @@ public class EntityControl extends Module { private final Setting spoofSaddle = sgControl.add(new BoolSetting.Builder() .name("spoof-saddle*") - .description("Lets you control rideable entities without them being saddled. Only works on older server versions.") .defaultValue(false) .build() ); private final Setting maxJump = sgControl.add(new BoolSetting.Builder() .name("max-jump") - .description("Sets jump power to maximum.") .defaultValue(true) .build() ); public final Setting lockYaw = sgControl.add(new BoolSetting.Builder() .name("lock-yaw") - .description("Locks the Entity's yaw.") .defaultValue(true) .build() ); private final Setting cancelServerPackets = sgControl.add(new BoolSetting.Builder() .name("cancel-server-packets") - .description("Cancels incoming vehicle move packets. WILL desync you from the server if you make an invalid movement.") .defaultValue(false) .build() ); private final Setting speed = sgSpeed.add(new BoolSetting.Builder() .name("speed") - .description("Makes you go faster horizontally when riding entities.") .defaultValue(false) .build() ); private final Setting horizontalSpeed = sgSpeed.add(new DoubleSetting.Builder() .name("horizontal-speed") - .description("Horizontal speed in blocks per second.") .defaultValue(10) .min(0) .sliderMax(50) @@ -97,7 +90,6 @@ public class EntityControl extends Module { private final Setting onlyOnGround = sgSpeed.add(new BoolSetting.Builder() .name("only-on-ground") - .description("Use speed only when standing on a block.") .defaultValue(false) .visible(speed::get) .build() @@ -105,7 +97,6 @@ public class EntityControl extends Module { private final Setting inWater = sgSpeed.add(new BoolSetting.Builder() .name("in-water") - .description("Use speed when in water.") .defaultValue(true) .visible(speed::get) .build() @@ -113,14 +104,12 @@ public class EntityControl extends Module { private final Setting flight = sgFlight.add(new BoolSetting.Builder() .name("fly") - .description("Allows you to fly with entities.") .defaultValue(false) .build() ); private final Setting verticalSpeed = sgFlight.add(new DoubleSetting.Builder() .name("vertical-speed") - .description("Vertical speed in blocks per second.") .defaultValue(6) .min(0) .sliderMax(20) @@ -130,7 +119,6 @@ public class EntityControl extends Module { private final Setting fallSpeed = sgFlight.add(new DoubleSetting.Builder() .name("fall-speed") - .description("How fast you will fall in blocks per second. Set to a small value to prevent fly kicks.") .defaultValue(0) .min(0) .visible(flight::get) @@ -139,7 +127,6 @@ public class EntityControl extends Module { private final Setting antiKick = sgFlight.add(new BoolSetting.Builder() .name("anti-fly-kick") - .description("Whether to prevent the server from kicking you for flying.") .defaultValue(true) .visible(flight::get) .build() @@ -147,7 +134,6 @@ public class EntityControl extends Module { private final Setting delay = sgFlight.add(new IntSetting.Builder() .name("delay") - .description("The amount of delay, in ticks, between flying down a bit and return to original position") .defaultValue(40) .min(1) .sliderMax(80) @@ -156,7 +142,7 @@ public class EntityControl extends Module { ); public EntityControl() { - super(Categories.Movement, "entity-control", "Lets you control rideable entities without a saddle.", "entity-speed", "entity-fly", "boat-fly"); + super(Categories.Movement, "entity-control", "entity-speed", "entity-fly", "boat-fly"); } private int delayLeft; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/FastClimb.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/FastClimb.java index 21a119b661..edf55b1e98 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/FastClimb.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/FastClimb.java @@ -25,14 +25,12 @@ public class FastClimb extends Module { private final Setting timerMode = sgGeneral.add(new BoolSetting.Builder() .name("timer-mode") - .description("Use timer.") .defaultValue(false) .build() ); private final Setting speed = sgGeneral.add(new DoubleSetting.Builder() .name("climb-speed") - .description("Your climb speed.") .defaultValue(0.2872) .min(0.0) .visible(() -> !timerMode.get()) @@ -41,7 +39,6 @@ public class FastClimb extends Module { private final Setting timer = sgGeneral.add(new DoubleSetting.Builder() .name("timer") - .description("The timer value for Timer.") .defaultValue(1.436) .min(1) .sliderMin(1) @@ -52,7 +49,7 @@ public class FastClimb extends Module { private boolean resetTimer; public FastClimb() { - super(Categories.Movement, "fast-climb", "Allows you to climb faster."); + super(Categories.Movement, "fast-climb"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java index dc52cfae3b..57aa20b4e4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Flight.java @@ -22,11 +22,10 @@ public class Flight extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgAntiKick = settings.createGroup("Anti Kick"); //Pog + private final SettingGroup sgAntiKick = settings.createGroup("anti-kick"); //Pog private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("The mode for Flight.") .defaultValue(Mode.Abilities) .onChanged(mode -> { if (!isActive() || !Utils.canUpdate()) return; @@ -37,7 +36,6 @@ public class Flight extends Module { private final Setting speed = sgGeneral.add(new DoubleSetting.Builder() .name("speed") - .description("Your speed when flying.") .defaultValue(0.1) .min(0.0) .build() @@ -45,14 +43,12 @@ public class Flight extends Module { private final Setting verticalSpeedMatch = sgGeneral.add(new BoolSetting.Builder() .name("vertical-speed-match") - .description("Matches your vertical speed to your horizontal speed, otherwise uses vanilla ratio.") .defaultValue(false) .build() ); private final Setting noSneak = sgGeneral.add(new BoolSetting.Builder() .name("no-sneak") - .description("Prevents you from sneaking while flying.") .defaultValue(false) .visible(() -> mode.get() == Mode.Velocity) .build() @@ -60,14 +56,12 @@ public class Flight extends Module { private final Setting antiKickMode = sgAntiKick.add(new EnumSetting.Builder() .name("mode") - .description("The mode for anti kick.") .defaultValue(AntiKickMode.Packet) .build() ); private final Setting delay = sgAntiKick.add(new IntSetting.Builder() .name("delay") - .description("The amount of delay, in ticks, between flying down a bit and return to original position") .defaultValue(20) .min(1) .sliderMax(200) @@ -77,7 +71,6 @@ public class Flight extends Module { // Anti Kick private final Setting offTime = sgAntiKick.add(new IntSetting.Builder() .name("off-time") - .description("The amount of delay, in ticks, to fly down a bit to reset floating ticks.") .defaultValue(1) .min(1) .sliderRange(1, 20) @@ -91,7 +84,7 @@ public class Flight extends Module { private double lastPacketY = Double.MAX_VALUE; public Flight() { - super(Categories.Movement, "flight", "FLYYYY! No Fall is recommended with this module."); + super(Categories.Movement, "flight"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java index 4ee40cb9f9..c6b98ccdb7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java @@ -37,14 +37,12 @@ public enum Screens { private final Setting screens = sgGeneral.add(new EnumSetting.Builder() .name("guis") - .description("Which GUIs to move in.") .defaultValue(Screens.Inventory) .build() ); public final Setting jump = sgGeneral.add(new BoolSetting.Builder() .name("jump") - .description("Allows you to jump while in GUIs.") .defaultValue(true) .onChanged(aBoolean -> { if (isActive() && !aBoolean) mc.options.jumpKey.setPressed(false); @@ -54,7 +52,6 @@ public enum Screens { public final Setting sneak = sgGeneral.add(new BoolSetting.Builder() .name("sneak") - .description("Allows you to sneak while in GUIs.") .defaultValue(true) .onChanged(aBoolean -> { if (isActive() && !aBoolean) mc.options.sneakKey.setPressed(false); @@ -64,7 +61,6 @@ public enum Screens { public final Setting sprint = sgGeneral.add(new BoolSetting.Builder() .name("sprint") - .description("Allows you to sprint while in GUIs.") .defaultValue(true) .onChanged(aBoolean -> { if (isActive() && !aBoolean) mc.options.sprintKey.setPressed(false); @@ -74,21 +70,19 @@ public enum Screens { private final Setting arrowsRotate = sgGeneral.add(new BoolSetting.Builder() .name("arrows-rotate") - .description("Allows you to use your arrow keys to rotate while in GUIs.") .defaultValue(true) .build() ); private final Setting rotateSpeed = sgGeneral.add(new DoubleSetting.Builder() .name("rotate-speed") - .description("Rotation speed while in GUIs.") .defaultValue(4) .min(0) .build() ); public GUIMove() { - super(Categories.Movement, "gui-move", "Allows you to perform various actions while in GUIs."); + super(Categories.Movement, "gui-move"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/HighJump.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/HighJump.java index a56b858c7e..6462f2bee2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/HighJump.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/HighJump.java @@ -18,14 +18,13 @@ public class HighJump extends Module { private final Setting multiplier = sgGeneral.add(new DoubleSetting.Builder() .name("jump-multiplier") - .description("Jump height multiplier.") .defaultValue(1) .min(0) .build() ); public HighJump() { - super(Categories.Movement, "high-jump", "Makes you jump higher than normal."); + super(Categories.Movement, "high-jump"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java index 84118b1dde..52b8126588 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Jesus.java @@ -43,15 +43,14 @@ import java.util.stream.Collectors; public class Jesus extends Module { - private final SettingGroup sgGeneral = settings.createGroup("General"); - private final SettingGroup sgWater = settings.createGroup("Water"); - private final SettingGroup sgLava = settings.createGroup("Lava"); + private final SettingGroup sgGeneral = settings.createGroup("general"); + private final SettingGroup sgWater = settings.createGroup("water"); + private final SettingGroup sgLava = settings.createGroup("lava"); // General private final Setting powderSnow = sgGeneral.add(new BoolSetting.Builder() .name("powder-snow") - .description("Walk on powder snow.") .defaultValue(true) .build() ); @@ -60,14 +59,12 @@ public class Jesus extends Module { private final Setting waterMode = sgWater.add(new EnumSetting.Builder() .name("mode") - .description("How to treat the water.") .defaultValue(Mode.Solid) .build() ); private final Setting dipIfBurning = sgWater.add(new BoolSetting.Builder() .name("dip-if-burning") - .description("Lets you go into the water when you are burning.") .defaultValue(true) .visible(() -> waterMode.get() == Mode.Solid) .build() @@ -75,7 +72,6 @@ public class Jesus extends Module { private final Setting dipOnSneakWater = sgWater.add(new BoolSetting.Builder() .name("dip-on-sneak") - .description("Lets you go into the water when your sneak key is held.") .defaultValue(true) .visible(() -> waterMode.get() == Mode.Solid) .build() @@ -83,7 +79,6 @@ public class Jesus extends Module { private final Setting dipOnFallWater = sgWater.add(new BoolSetting.Builder() .name("dip-on-fall") - .description("Lets you go into the water when you fall over a certain height.") .defaultValue(true) .visible(() -> waterMode.get() == Mode.Solid) .build() @@ -91,7 +86,6 @@ public class Jesus extends Module { private final Setting dipFallHeightWater = sgWater.add(new IntSetting.Builder() .name("dip-fall-height") - .description("The fall height at which you will go into the water.") .defaultValue(4) .range(1, 255) .sliderRange(3, 20) @@ -103,14 +97,12 @@ public class Jesus extends Module { private final Setting lavaMode = sgLava.add(new EnumSetting.Builder() .name("mode") - .description("How to treat the lava.") .defaultValue(Mode.Solid) .build() ); private final Setting dipIfFireResistant = sgLava.add(new BoolSetting.Builder() .name("dip-if-resistant") - .description("Lets you go into the lava if you have Fire Resistance effect.") .defaultValue(true) .visible(() -> lavaMode.get() == Mode.Solid) .build() @@ -118,7 +110,6 @@ public class Jesus extends Module { private final Setting dipOnSneakLava = sgLava.add(new BoolSetting.Builder() .name("dip-on-sneak") - .description("Lets you go into the lava when your sneak key is held.") .defaultValue(true) .visible(() -> lavaMode.get() == Mode.Solid) .build() @@ -126,7 +117,6 @@ public class Jesus extends Module { private final Setting dipOnFallLava = sgLava.add(new BoolSetting.Builder() .name("dip-on-fall") - .description("Lets you go into the lava when you fall over a certain height.") .defaultValue(true) .visible(() -> lavaMode.get() == Mode.Solid) .build() @@ -134,7 +124,6 @@ public class Jesus extends Module { private final Setting dipFallHeightLava = sgLava.add(new IntSetting.Builder() .name("dip-fall-height") - .description("The fall height at which you will go into the lava.") .defaultValue(4) .range(1, 255) .sliderRange(3, 20) @@ -155,7 +144,7 @@ public class Jesus extends Module { public boolean isInBubbleColumn = false; public Jesus() { - super(Categories.Movement, "jesus", "Walk on liquids and powder snow like Jesus."); + super(Categories.Movement, "jesus"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/LongJump.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/LongJump.java index 62f785b422..111c5df1d9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/LongJump.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/LongJump.java @@ -25,14 +25,12 @@ public class LongJump extends Module { public final Setting jumpMode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("The method of jumping.") .defaultValue(JumpMode.Vanilla) .build() ); private final Setting vanillaBoostFactor = sgGeneral.add(new DoubleSetting.Builder() .name("vanilla-boost-factor") - .description("The amount by which to boost the jump.") .visible(() -> jumpMode.get() == JumpMode.Vanilla) .defaultValue(1.261) .min(0) @@ -42,7 +40,6 @@ public class LongJump extends Module { private final Setting burstInitialSpeed = sgGeneral.add(new DoubleSetting.Builder() .name("burst-initial-speed") - .description("The initial speed of the runup.") .visible(() -> jumpMode.get() == JumpMode.Burst) .defaultValue(6) .min(0) @@ -52,7 +49,6 @@ public class LongJump extends Module { private final Setting burstBoostFactor = sgGeneral.add(new DoubleSetting.Builder() .name("burst-boost-factor") - .description("The amount by which to boost the jump.") .visible(() -> jumpMode.get() == JumpMode.Burst) .defaultValue(2.149) .min(0) @@ -62,7 +58,6 @@ public class LongJump extends Module { private final Setting onlyOnGround = sgGeneral.add(new BoolSetting.Builder() .name("only-on-ground") - .description("Only performs the jump if you are on the ground.") .visible(() -> jumpMode.get() == JumpMode.Burst) .defaultValue(true) .build() @@ -70,7 +65,6 @@ public class LongJump extends Module { private final Setting onJump = sgGeneral.add(new BoolSetting.Builder() .name("on-jump") - .description("Whether the player needs to jump first or not.") .visible(() -> jumpMode.get() == JumpMode.Burst) .defaultValue(false) .build() @@ -78,7 +72,6 @@ public class LongJump extends Module { private final Setting glideMultiplier = sgGeneral.add(new DoubleSetting.Builder() .name("glide-multiplier") - .description("The amount by to multiply the glide velocity.") .visible(() -> jumpMode.get() == JumpMode.Glide) .defaultValue(1) .min(0) @@ -88,7 +81,6 @@ public class LongJump extends Module { public final Setting timer = sgGeneral.add(new DoubleSetting.Builder() .name("timer") - .description("Timer override.") .defaultValue(1) .min(0.01) .sliderMin(0.01) @@ -97,7 +89,6 @@ public class LongJump extends Module { private final Setting autoDisable = sgGeneral.add(new BoolSetting.Builder() .name("auto-disable") - .description("Automatically disabled the module after jumping.") .visible(() -> jumpMode.get() != JumpMode.Vanilla) .defaultValue(true) .build() @@ -105,13 +96,12 @@ public class LongJump extends Module { private final Setting disableOnRubberband = sgGeneral.add(new BoolSetting.Builder() .name("disable-on-rubberband") - .description("Disables the module when you get lagged back.") .defaultValue(true) .build() ); public LongJump() { - super(Categories.Movement, "long-jump", "Allows you to jump further than normal."); + super(Categories.Movement, "long-jump"); } private int stage; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoFall.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoFall.java index f9eb17f08f..383478eb7f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoFall.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoFall.java @@ -47,14 +47,12 @@ public class NoFall extends Module { private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("The way you are saved from fall damage.") .defaultValue(Mode.Packet) .build() ); private final Setting placedItem = sgGeneral.add(new EnumSetting.Builder() .name("placed-item") - .description("Which block to place.") .defaultValue(PlacedItem.Bucket) .visible(() -> mode.get() == Mode.Place) .build() @@ -62,7 +60,6 @@ public class NoFall extends Module { private final Setting airPlaceMode = sgGeneral.add(new EnumSetting.Builder() .name("air-place-mode") - .description("Whether place mode places before you die or before you take damage.") .defaultValue(PlaceMode.BeforeDeath) .visible(() -> mode.get() == Mode.AirPlace) .build() @@ -70,7 +67,6 @@ public class NoFall extends Module { private final Setting anchor = sgGeneral.add(new BoolSetting.Builder() .name("anchor") - .description("Centers the player and reduces movement when using bucket or air place mode.") .defaultValue(true) .visible(() -> mode.get() != Mode.Packet) .build() @@ -78,14 +74,12 @@ public class NoFall extends Module { private final Setting antiBounce = sgGeneral.add(new BoolSetting.Builder() .name("anti-bounce") - .description("Disables bouncing on slime-block and bed upon landing.") .defaultValue(true) .build() ); private final Setting pauseOnMace = sgGeneral.add(new BoolSetting.Builder() .name("pause-on-mace") - .description("Pauses NoFall when using a mace.") .defaultValue(true) .build() ); @@ -96,7 +90,7 @@ public class NoFall extends Module { private boolean prePathManagerNoFall; public NoFall() { - super(Categories.Movement, "no-fall", "Attempts to prevent you from taking fall damage."); + super(Categories.Movement, "no-fall"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoSlow.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoSlow.java index 1651f349d1..8b81449cfc 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoSlow.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/NoSlow.java @@ -19,21 +19,18 @@ public class NoSlow extends Module { private final Setting items = sgGeneral.add(new BoolSetting.Builder() .name("items") - .description("Whether or not using items will slow you.") .defaultValue(true) .build() ); private final Setting web = sgGeneral.add(new EnumSetting.Builder() .name("web") - .description("Whether or not cobwebs will not slow you down.") .defaultValue(WebMode.Vanilla) .build() ); private final Setting webTimer = sgGeneral.add(new DoubleSetting.Builder() .name("web-timer") - .description("The timer value for WebMode Timer.") .defaultValue(10) .min(1) .sliderMin(1) @@ -43,63 +40,54 @@ public class NoSlow extends Module { private final Setting honeyBlock = sgGeneral.add(new BoolSetting.Builder() .name("honey-block") - .description("Whether or not honey blocks will not slow you down.") .defaultValue(true) .build() ); private final Setting soulSand = sgGeneral.add(new BoolSetting.Builder() .name("soul-sand") - .description("Whether or not soul sand will not slow you down.") .defaultValue(true) .build() ); private final Setting slimeBlock = sgGeneral.add(new BoolSetting.Builder() .name("slime-block") - .description("Whether or not slime blocks will not slow you down.") .defaultValue(true) .build() ); private final Setting berryBush = sgGeneral.add(new BoolSetting.Builder() .name("berry-bush") - .description("Whether or not berry bushes will not slow you down.") .defaultValue(true) .build() ); private final Setting airStrict = sgGeneral.add(new BoolSetting.Builder() .name("air-strict") - .description("Will attempt to bypass anti-cheats like 2b2t's. Only works while in air.") .defaultValue(false) .build() ); private final Setting fluidDrag = sgGeneral.add(new BoolSetting.Builder() .name("fluid-drag") - .description("Whether or not fluid drag will not slow you down.") .defaultValue(false) .build() ); private final Setting sneaking = sgGeneral.add(new BoolSetting.Builder() .name("sneaking") - .description("Whether or not sneaking will not slow you down.") .defaultValue(false) .build() ); private final Setting hunger = sgGeneral.add(new BoolSetting.Builder() .name("hunger") - .description("Whether or not hunger will not slow you down.") .defaultValue(false) .build() ); private final Setting slowness = sgGeneral.add(new BoolSetting.Builder() .name("slowness") - .description("Whether or not slowness will not slow you down.") .defaultValue(false) .build() ); @@ -107,7 +95,7 @@ public class NoSlow extends Module { private boolean resetTimer; public NoSlow() { - super(Categories.Movement, "no-slow", "Allows you to move normally when using objects that will slow you."); + super(Categories.Movement, "no-slow"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Parkour.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Parkour.java index 5daec23b24..91970ecf94 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Parkour.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Parkour.java @@ -24,14 +24,13 @@ public class Parkour extends Module { private final Setting edgeDistance = sgGeneral.add(new DoubleSetting.Builder() .name("edge-distance") - .description("How far from the edge should you jump.") .range(0.001, 0.1) .defaultValue(0.001) .build() ); public Parkour() { - super(Categories.Movement, "parkour", "Automatically jumps at the edges of blocks."); + super(Categories.Movement, "parkour"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ReverseStep.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ReverseStep.java index 0e57822cc5..200659b2b4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ReverseStep.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/ReverseStep.java @@ -23,7 +23,6 @@ public class ReverseStep extends Module { private final Setting fallSpeed = sgGeneral.add(new DoubleSetting.Builder() .name("fall-speed") - .description("How fast to fall in blocks per second.") .defaultValue(3) .min(0) .build() @@ -31,7 +30,6 @@ public class ReverseStep extends Module { private final Setting fallDistance = sgGeneral.add(new DoubleSetting.Builder() .name("fall-distance") - .description("The maximum fall distance this setting will activate at.") .defaultValue(3) .min(0) .build() @@ -39,13 +37,12 @@ public class ReverseStep extends Module { private final Setting vehicles = sgGeneral.add(new BoolSetting.Builder() .name("vehicles") - .description("Whether or not reverse step should affect vehicles.") .defaultValue(false) .build() ); public ReverseStep() { - super(Categories.Movement, "reverse-step", "Allows you to fall down blocks at a greater speed."); + super(Categories.Movement, "reverse-step"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/SafeWalk.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/SafeWalk.java index d908103c99..1fd037e96f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/SafeWalk.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/SafeWalk.java @@ -23,11 +23,10 @@ public class SafeWalk extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgRender = settings.createGroup("render"); private final Setting fallDistance = sgGeneral.add(new IntSetting.Builder() .name("minimum-fall-distance") - .description("The minimum number of blocks you are expected to fall before the module activates.") .defaultValue(1) .min(1) .build() @@ -35,14 +34,12 @@ public class SafeWalk extends Module { private final Setting sneak = sgGeneral.add(new BoolSetting.Builder() .name("sneak") - .description("Sneak when approaching edge of block.") .defaultValue(false) .build() ); private final Setting safeSneak = sgGeneral.add(new BoolSetting.Builder() .name("safe-sneak") - .description("Prevent you from falling if sneak doesn't trigger correctly.") .defaultValue(true) .visible(sneak::get) .build() @@ -50,7 +47,6 @@ public class SafeWalk extends Module { private final Setting sneakSprint = sgGeneral.add(new BoolSetting.Builder() .name("sneak-on-sprint") - .description("Sneak even when sprinting at the block edge.") .defaultValue(true) .visible(sneak::get) .build() @@ -58,7 +54,6 @@ public class SafeWalk extends Module { private final Setting edgeDistance = sgGeneral.add(new DoubleSetting.Builder() .name("edge-distance") - .description("Distance offset before reaching an edge.") .defaultValue(0.30) .sliderRange(0.00, 0.30) .decimalPlaces(2) @@ -68,7 +63,6 @@ public class SafeWalk extends Module { private final Setting renderEdgeDistance = sgRender.add(new BoolSetting.Builder() .name("render") - .description("Render edge distance helper.") .defaultValue(false) .visible(sneak::get) .build() @@ -76,14 +70,13 @@ public class SafeWalk extends Module { private final Setting renderPlayerBox = sgRender.add(new BoolSetting.Builder() .name("render-player-box") - .description("Render player box helper.") .defaultValue(false) .visible(() -> sneak.get() && renderEdgeDistance.get()) .build() ); public SafeWalk() { - super(Categories.Movement, "safe-walk", "Prevents you from walking off blocks."); + super(Categories.Movement, "safe-walk"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java index ad02674d0f..52eacc7702 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java @@ -32,31 +32,27 @@ public class Scaffold extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgRender = settings.createGroup("render"); private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") - .description("Selected blocks.") .build() ); private final Setting blocksFilter = sgGeneral.add(new EnumSetting.Builder() .name("blocks-filter") - .description("How to use the block list setting") .defaultValue(ListMode.Blacklist) .build() ); private final Setting fastTower = sgGeneral.add(new BoolSetting.Builder() .name("fast-tower") - .description("Whether or not to scaffold upwards faster.") .defaultValue(false) .build() ); private final Setting towerSpeed = sgGeneral.add(new DoubleSetting.Builder() .name("tower-speed") - .description("The speed at which to tower.") .defaultValue(0.5) .min(0) .sliderMax(1) @@ -66,7 +62,6 @@ public class Scaffold extends Module { private final Setting whileMoving = sgGeneral.add(new BoolSetting.Builder() .name("while-moving") - .description("Allows you to tower while moving.") .defaultValue(false) .visible(fastTower::get) .build() @@ -74,42 +69,36 @@ public class Scaffold extends Module { private final Setting onlyOnClick = sgGeneral.add(new BoolSetting.Builder() .name("only-on-click") - .description("Only places blocks when holding right click.") .defaultValue(false) .build() ); private final Setting renderSwing = sgGeneral.add(new BoolSetting.Builder() .name("swing") - .description("Renders your client-side swing.") .defaultValue(false) .build() ); private final Setting autoSwitch = sgGeneral.add(new BoolSetting.Builder() .name("auto-switch") - .description("Automatically swaps to a block before placing.") .defaultValue(true) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Rotates towards the blocks being placed.") .defaultValue(true) .build() ); private final Setting airPlace = sgGeneral.add(new BoolSetting.Builder() .name("air-place") - .description("Allow air place. This also allows you to modify scaffold radius.") .defaultValue(false) .build() ); private final Setting aheadDistance = sgGeneral.add(new DoubleSetting.Builder() .name("ahead-distance") - .description("How far ahead to place blocks.") .defaultValue(0) .min(0) .sliderMax(1) @@ -119,7 +108,6 @@ public class Scaffold extends Module { private final Setting placeRange = sgGeneral.add(new DoubleSetting.Builder() .name("closest-block-range") - .description("How far can scaffold place blocks when you are in air.") .defaultValue(4) .min(0) .sliderMax(8) @@ -129,7 +117,6 @@ public class Scaffold extends Module { private final Setting radius = sgGeneral.add(new DoubleSetting.Builder() .name("radius") - .description("Scaffold radius.") .defaultValue(0) .min(0) .max(6) @@ -139,7 +126,6 @@ public class Scaffold extends Module { private final Setting blocksPerTick = sgGeneral.add(new IntSetting.Builder() .name("blocks-per-tick") - .description("How many blocks to place in one tick.") .defaultValue(3) .min(1) .visible(airPlace::get) @@ -150,14 +136,12 @@ public class Scaffold extends Module { private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") - .description("Whether to render blocks that have been placed.") .defaultValue(true) .build() ); private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .visible(render::get) .build() @@ -165,7 +149,6 @@ public class Scaffold extends Module { private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The side color of the target block rendering.") .defaultValue(new SettingColor(197, 137, 232, 10)) .visible(render::get) .build() @@ -173,7 +156,6 @@ public class Scaffold extends Module { private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The line color of the target block rendering.") .defaultValue(new SettingColor(197, 137, 232)) .visible(render::get) .build() @@ -182,7 +164,7 @@ public class Scaffold extends Module { private final BlockPos.Mutable bp = new BlockPos.Mutable(); public Scaffold() { - super(Categories.Movement, "scaffold", "Automatically places blocks under you."); + super(Categories.Movement, "scaffold"); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Slippy.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Slippy.java index 18ee10e8d7..163a4063fa 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Slippy.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Slippy.java @@ -17,7 +17,6 @@ public class Slippy extends Module { public final Setting friction = sgGeneral.add(new DoubleSetting.Builder() .name("friction") - .description("The base friction level.") .range(0.01, 1.10) .sliderRange(0.01, 1.10) .defaultValue(1) @@ -26,27 +25,24 @@ public class Slippy extends Module { public final Setting listMode = sgGeneral.add(new EnumSetting.Builder() .name("list-mode") - .description("The mode to select blocks.") .defaultValue(ListMode.Blacklist) .build() ); public final Setting> ignoredBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("ignored-blocks") - .description("Decide which blocks not to slip on") .visible(() -> listMode.get() == ListMode.Blacklist) .build() ); public final Setting> allowedBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("allowed-blocks") - .description("Decide which blocks to slip on") .visible(() -> listMode.get() == ListMode.Whitelist) .build() ); public Slippy() { - super(Categories.Movement, "slippy", "Changes the base friction level of blocks."); + super(Categories.Movement, "slippy"); } public enum ListMode { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sneak.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sneak.java index aa362123e5..ab24bc8e71 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sneak.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sneak.java @@ -16,13 +16,12 @@ public class Sneak extends Module { private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("Which method to sneak.") .defaultValue(Mode.Vanilla) .build() ); public Sneak() { - super (Categories.Movement, "sneak", "Sneaks for you"); + super (Categories.Movement, "sneak"); } public boolean doPacket() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Spider.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Spider.java index 7242d480fd..ec582a8901 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Spider.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Spider.java @@ -19,14 +19,13 @@ public class Spider extends Module { private final Setting speed = sgGeneral.add(new DoubleSetting.Builder() .name("climb-speed") - .description("The speed you go up blocks.") .defaultValue(0.2) .min(0.0) .build() ); public Spider() { - super(Categories.Movement, "spider", "Allows you to climb walls like a spider."); + super(Categories.Movement, "spider"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java index 2c45aa5f03..99de639373 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Sprint.java @@ -30,28 +30,24 @@ public enum Mode { public final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("sprint-mode") - .description("What mode of sprinting.") .defaultValue(Mode.Strict) .build() ); private final Setting keepSprint = sgGeneral.add(new BoolSetting.Builder() .name("keep-sprint") - .description("Whether to keep sprinting after attacking.") .defaultValue(false) .build() ); private final Setting unsprintOnHit = sgGeneral.add(new BoolSetting.Builder() .name("unsprint-on-hit") - .description("Whether to stop sprinting before attacking, to ensure you get crits and sweep attacks.") .defaultValue(false) .build() ); public final Setting unsprintInWater = sgGeneral.add(new BoolSetting.Builder() .name("unsprint-in-water") - .description("Whether to stop sprinting when in water.") .defaultValue(true) .visible(() -> mode.get() == Mode.Rage) .build() @@ -59,14 +55,13 @@ public enum Mode { private final Setting permaSprint = sgGeneral.add(new BoolSetting.Builder() .name("sprint-while-stationary") - .description("Sprint even when not moving.") .defaultValue(false) .visible(() -> mode.get() == Mode.Rage) .build() ); public Sprint() { - super(Categories.Movement, "sprint", "Automatically sprints."); + super(Categories.Movement, "sprint"); } @EventHandler(priority = EventPriority.HIGH) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Step.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Step.java index cefeb58637..999d32efd7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Step.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Step.java @@ -28,7 +28,6 @@ public class Step extends Module { public final Setting height = sgGeneral.add(new DoubleSetting.Builder() .name("height") - .description("Step height.") .defaultValue(1.25) .min(0) .build() @@ -36,21 +35,18 @@ public class Step extends Module { private final Setting activeWhen = sgGeneral.add(new EnumSetting.Builder() .name("active-when") - .description("Step is active when you meet these requirements.") .defaultValue(ActiveWhen.Always) .build() ); private final Setting safeStep = sgGeneral.add(new BoolSetting.Builder() .name("safe-step") - .description("Doesn't let you step out of a hole if you are low on health or there is a crystal nearby.") .defaultValue(false) .build() ); private final Setting stepHealth = sgGeneral.add(new IntSetting.Builder() .name("step-health") - .description("The health you stop being able to step at.") .defaultValue(5) .range(1, 36) .sliderRange(1, 36) @@ -62,7 +58,7 @@ public class Step extends Module { private boolean prevPathManagerStep; public Step() { - super(Categories.Movement, "step", "Allows you to walk up full blocks instantly."); + super(Categories.Movement, "step"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/TridentBoost.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/TridentBoost.java index 4396451731..6b4cae79dc 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/TridentBoost.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/TridentBoost.java @@ -17,7 +17,6 @@ public class TridentBoost extends Module { private final Setting multiplier = sgGeneral.add(new DoubleSetting.Builder() .name("boost") - .description("How much your velocity is multiplied by when using riptide.") .defaultValue(2) .min(0.1) .sliderMin(1) @@ -26,13 +25,12 @@ public class TridentBoost extends Module { private final Setting allowOutOfWater = sgGeneral.add(new BoolSetting.Builder() .name("out-of-water") - .description("Whether riptide should work out of water") .defaultValue(true) .build() ); public TridentBoost() { - super(Categories.Movement, "trident-boost", "Boosts you when using riptide with a trident."); + super(Categories.Movement, "trident-boost"); } public double getMultiplier() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Velocity.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Velocity.java index 2628cd6acb..269a3e454c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Velocity.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Velocity.java @@ -24,14 +24,12 @@ public class Velocity extends Module { public final Setting knockback = sgGeneral.add(new BoolSetting.Builder() .name("knockback") - .description("Modifies the amount of knockback you take from attacks.") .defaultValue(true) .build() ); public final Setting knockbackHorizontal = sgGeneral.add(new DoubleSetting.Builder() .name("knockback-horizontal") - .description("How much horizontal knockback you will take.") .defaultValue(0) .sliderMax(1) .visible(knockback::get) @@ -40,7 +38,6 @@ public class Velocity extends Module { public final Setting knockbackVertical = sgGeneral.add(new DoubleSetting.Builder() .name("knockback-vertical") - .description("How much vertical knockback you will take.") .defaultValue(0) .sliderMax(1) .visible(knockback::get) @@ -49,14 +46,12 @@ public class Velocity extends Module { public final Setting explosions = sgGeneral.add(new BoolSetting.Builder() .name("explosions") - .description("Modifies your knockback from explosions.") .defaultValue(true) .build() ); public final Setting explosionsHorizontal = sgGeneral.add(new DoubleSetting.Builder() .name("explosions-horizontal") - .description("How much velocity you will take from explosions horizontally.") .defaultValue(0) .sliderMax(1) .visible(explosions::get) @@ -65,7 +60,6 @@ public class Velocity extends Module { public final Setting explosionsVertical = sgGeneral.add(new DoubleSetting.Builder() .name("explosions-vertical") - .description("How much velocity you will take from explosions vertically.") .defaultValue(0) .sliderMax(1) .visible(explosions::get) @@ -74,14 +68,12 @@ public class Velocity extends Module { public final Setting liquids = sgGeneral.add(new BoolSetting.Builder() .name("liquids") - .description("Modifies the amount you are pushed by flowing liquids.") .defaultValue(true) .build() ); public final Setting liquidsHorizontal = sgGeneral.add(new DoubleSetting.Builder() .name("liquids-horizontal") - .description("How much velocity you will take from liquids horizontally.") .defaultValue(0) .sliderMax(1) .visible(liquids::get) @@ -90,7 +82,6 @@ public class Velocity extends Module { public final Setting liquidsVertical = sgGeneral.add(new DoubleSetting.Builder() .name("liquids-vertical") - .description("How much velocity you will take from liquids vertically.") .defaultValue(0) .sliderMax(1) .visible(liquids::get) @@ -99,14 +90,12 @@ public class Velocity extends Module { public final Setting entityPush = sgGeneral.add(new BoolSetting.Builder() .name("entity-push") - .description("Modifies the amount you are pushed by entities.") .defaultValue(true) .build() ); public final Setting entityPushAmount = sgGeneral.add(new DoubleSetting.Builder() .name("entity-push-amount") - .description("How much you will be pushed.") .defaultValue(0) .sliderMax(1) .visible(entityPush::get) @@ -115,27 +104,24 @@ public class Velocity extends Module { public final Setting blocks = sgGeneral.add(new BoolSetting.Builder() .name("blocks") - .description("Prevents you from being pushed out of blocks.") .defaultValue(true) .build() ); public final Setting sinking = sgGeneral.add(new BoolSetting.Builder() .name("sinking") - .description("Prevents you from sinking in liquids.") .defaultValue(false) .build() ); public final Setting fishing = sgGeneral.add(new BoolSetting.Builder() .name("fishing") - .description("Prevents you from being pulled by fishing rods.") .defaultValue(false) .build() ); public Velocity() { - super(Categories.Movement, "velocity", "Prevents you from being moved by external forces."); + super(Categories.Movement, "velocity"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java index 9af851c443..fd4b999d2a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFly.java @@ -39,14 +39,13 @@ public class ElytraFly extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgInventory = settings.createGroup("Inventory"); - private final SettingGroup sgAutopilot = settings.createGroup("Autopilot"); + private final SettingGroup sgInventory = settings.createGroup("inventory"); + private final SettingGroup sgAutopilot = settings.createGroup("autopilot"); // General public final Setting flightMode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("The mode of flying.") .defaultValue(ElytraFlightModes.Vanilla) .onModuleActivated(flightModesSetting -> onModeChanged(flightModesSetting.get())) .onChanged(this::onModeChanged) @@ -55,7 +54,6 @@ public class ElytraFly extends Module { public final Setting autoTakeOff = sgGeneral.add(new BoolSetting.Builder() .name("auto-take-off") - .description("Automatically takes off when you hold jump without needing to double jump.") .defaultValue(false) .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Bounce) .build() @@ -63,7 +61,6 @@ public class ElytraFly extends Module { public final Setting fallMultiplier = sgGeneral.add(new DoubleSetting.Builder() .name("fall-multiplier") - .description("Controls how fast will you go down naturally.") .defaultValue(0.01) .min(0) .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Bounce) @@ -72,7 +69,6 @@ public class ElytraFly extends Module { public final Setting horizontalSpeed = sgGeneral.add(new DoubleSetting.Builder() .name("horizontal-speed") - .description("How fast you go forward and backward.") .defaultValue(1) .min(0) .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Bounce) @@ -81,7 +77,6 @@ public class ElytraFly extends Module { public final Setting verticalSpeed = sgGeneral.add(new DoubleSetting.Builder() .name("vertical-speed") - .description("How fast you go up and down.") .defaultValue(1) .min(0) .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Bounce) @@ -114,7 +109,6 @@ public class ElytraFly extends Module { public final Setting stopInWater = sgGeneral.add(new BoolSetting.Builder() .name("stop-in-water") - .description("Stops flying in water.") .defaultValue(true) .visible(() -> flightMode.get() != ElytraFlightModes.Bounce) .build() @@ -122,14 +116,12 @@ public class ElytraFly extends Module { public final Setting dontGoIntoUnloadedChunks = sgGeneral.add(new BoolSetting.Builder() .name("no-unloaded-chunks") - .description("Stops you from going into unloaded chunks.") .defaultValue(true) .build() ); public final Setting autoHover = sgGeneral.add(new BoolSetting.Builder() .name("auto-hover") - .description("Automatically hover .3 blocks off ground when holding shift.") .defaultValue(false) .visible(() -> flightMode.get() != ElytraFlightModes.Bounce) .build() @@ -137,7 +129,6 @@ public class ElytraFly extends Module { public final Setting noCrash = sgGeneral.add(new BoolSetting.Builder() .name("no-crash") - .description("Stops you from going into walls.") .defaultValue(false) .visible(() -> flightMode.get() != ElytraFlightModes.Bounce) .build() @@ -145,7 +136,6 @@ public class ElytraFly extends Module { public final Setting crashLookAhead = sgGeneral.add(new IntSetting.Builder() .name("crash-look-ahead") - .description("Distance to look ahead when flying.") .defaultValue(5) .range(1, 15) .sliderMin(1) @@ -155,7 +145,6 @@ public class ElytraFly extends Module { private final Setting instaDrop = sgGeneral.add(new BoolSetting.Builder() .name("insta-drop") - .description("Makes you drop out of flight instantly.") .defaultValue(false) .visible(() -> flightMode.get() != ElytraFlightModes.Bounce) .build() @@ -163,10 +152,6 @@ public class ElytraFly extends Module { public final Setting pitch40lowerBounds = sgGeneral.add(new DoubleSetting.Builder() .name("pitch40-lower-bounds") - .description( - "The bottom height boundary for pitch40. You must be at least 40 blocks above this boundary when starting the module.\n" + - "After descending below this boundary you will start pitching upwards." - ) .defaultValue(180) .min(-128) .sliderMax(360) @@ -176,10 +161,6 @@ public class ElytraFly extends Module { public final Setting pitch40upperBounds = sgGeneral.add(new DoubleSetting.Builder() .name("pitch40-upper-bounds") - .description( - "The upper height boundary for pitch40. You must be above this boundary when starting the module.\n" + - "When ascending above this boundary, if you are not already, you will start pitching downwards." - ) .defaultValue(220) .min(-128) .sliderMax(360) @@ -189,7 +170,6 @@ public class ElytraFly extends Module { public final Setting pitch40rotationSpeedUp = sgGeneral.add(new DoubleSetting.Builder() .name("pitch40-rotate-speed-up") - .description("The speed for pitch rotation upwards (degrees per tick).") .defaultValue(5.45) .min(1) .sliderMax(20) @@ -199,7 +179,6 @@ public class ElytraFly extends Module { public final Setting pitch40rotationSpeedDown = sgGeneral.add(new DoubleSetting.Builder() .name("pitch40-rotate-speed-down") - .description("The speed for pitch rotation downwards (degrees per tick).") .defaultValue(0.90) .min(0.5) .sliderMax(2) @@ -209,7 +188,6 @@ public class ElytraFly extends Module { public final Setting autoJump = sgGeneral.add(new BoolSetting.Builder() .name("auto-jump") - .description("Automatically jumps for you.") .defaultValue(true) .visible(() -> flightMode.get() == ElytraFlightModes.Bounce) .build() @@ -217,7 +195,6 @@ public class ElytraFly extends Module { public final Setting yawLockMode = sgGeneral.add(new EnumSetting.Builder() .name("yaw-lock") - .description("Whether to enable yaw lock or not") .defaultValue(Rotation.LockMode.Smart) .visible(() -> flightMode.get() == ElytraFlightModes.Bounce) .build() @@ -225,7 +202,6 @@ public class ElytraFly extends Module { public final Setting yaw = sgGeneral.add(new DoubleSetting.Builder() .name("yaw") - .description("The yaw angle to look at when using simple rotation lock in bounce mode.") .defaultValue(0) .range(0, 360) .sliderRange(0,360) @@ -235,7 +211,6 @@ public class ElytraFly extends Module { public final Setting lockPitch = sgGeneral.add(new BoolSetting.Builder() .name("pitch-lock") - .description("Whether to lock your pitch angle.") .defaultValue(true) .visible(() -> flightMode.get() == ElytraFlightModes.Bounce) .build() @@ -243,7 +218,6 @@ public class ElytraFly extends Module { public final Setting pitch = sgGeneral.add(new DoubleSetting.Builder() .name("pitch") - .description("The pitch angle to look at when using the bounce mode.") .defaultValue(85) .range(0, 90) .sliderRange(0, 90) @@ -253,7 +227,6 @@ public class ElytraFly extends Module { public final Setting restart = sgGeneral.add(new BoolSetting.Builder() .name("restart") - .description("Restarts flying with the elytra when rubberbanding.") .defaultValue(true) .visible(() -> flightMode.get() == ElytraFlightModes.Bounce) .build() @@ -261,7 +234,6 @@ public class ElytraFly extends Module { public final Setting restartDelay = sgGeneral.add(new IntSetting.Builder() .name("restart-delay") - .description("How many ticks to wait before restarting the elytra again after rubberbanding.") .defaultValue(7) .min(0) .sliderRange(0, 20) @@ -271,7 +243,6 @@ public class ElytraFly extends Module { public final Setting sprint = sgGeneral.add(new BoolSetting.Builder() .name("sprint-constantly") - .description("Sprints all the time. If turned off, it will only sprint when the player is touching the ground.") .defaultValue(true) .visible(() -> flightMode.get() == ElytraFlightModes.Bounce) .build() @@ -279,7 +250,6 @@ public class ElytraFly extends Module { public final Setting manualTakeoff = sgGeneral.add(new BoolSetting.Builder() .name("manual-takeoff") - .description("Does not automatically take off.") .defaultValue(false) .visible(() -> flightMode.get() == ElytraFlightModes.Bounce) .build() @@ -289,14 +259,12 @@ public class ElytraFly extends Module { public final Setting replace = sgInventory.add(new BoolSetting.Builder() .name("elytra-replace") - .description("Replaces broken elytra with a new elytra.") .defaultValue(false) .build() ); public final Setting replaceDurability = sgInventory.add(new IntSetting.Builder() .name("replace-durability") - .description("The durability threshold your elytra will be replaced at.") .defaultValue(2) .range(1, Items.ELYTRA.getComponents().getOrDefault(DataComponentTypes.MAX_DAMAGE, 432) - 1) .sliderRange(1, Items.ELYTRA.getComponents().getOrDefault(DataComponentTypes.MAX_DAMAGE, 432) - 1) @@ -306,21 +274,18 @@ public class ElytraFly extends Module { public final Setting chestSwap = sgInventory.add(new EnumSetting.Builder() .name("chest-swap") - .description("Enables ChestSwap when toggling this module.") .defaultValue(ChestSwapMode.Never) .build() ); public final Setting autoReplenish = sgInventory.add(new BoolSetting.Builder() .name("replenish-fireworks") - .description("Moves fireworks into a selected hotbar slot.") .defaultValue(false) .build() ); public final Setting replenishSlot = sgInventory.add(new IntSetting.Builder() .name("replenish-slot") - .description("The slot auto move moves fireworks to.") .defaultValue(9) .range(1, 9) .sliderRange(1, 9) @@ -332,7 +297,6 @@ public class ElytraFly extends Module { public final Setting autoPilot = sgAutopilot.add(new BoolSetting.Builder() .name("auto-pilot") - .description("Moves forward while elytra flying.") .defaultValue(false) .visible(() -> flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Bounce) .build() @@ -340,7 +304,6 @@ public class ElytraFly extends Module { public final Setting useFireworks = sgAutopilot.add(new BoolSetting.Builder() .name("use-fireworks") - .description("Uses firework rockets every second of your choice.") .defaultValue(false) .visible(() -> autoPilot.get() && flightMode.get() != ElytraFlightModes.Pitch40 && flightMode.get() != ElytraFlightModes.Bounce) .build() @@ -348,7 +311,6 @@ public class ElytraFly extends Module { public final Setting autoPilotFireworkDelay = sgAutopilot.add(new DoubleSetting.Builder() .name("firework-delay") - .description("The delay in seconds in between using fireworks if \"Use Fireworks\" is enabled.") .min(1) .defaultValue(8) .sliderMax(20) @@ -358,7 +320,6 @@ public class ElytraFly extends Module { public final Setting autoPilotMinimumHeight = sgAutopilot.add(new DoubleSetting.Builder() .name("minimum-height") - .description("The minimum height for autopilot.") .defaultValue(120) .min(-128) .sliderMax(260) @@ -369,7 +330,7 @@ public class ElytraFly extends Module { private ElytraFlightMode currentMode = new Vanilla(); public ElytraFly() { - super(Categories.Movement, "elytra-fly", "Gives you more control over your elytra."); + super(Categories.Movement, "elytra-fly"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/speed/Speed.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/speed/Speed.java index 40b4d268da..490a22970c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/speed/Speed.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/speed/Speed.java @@ -25,7 +25,6 @@ public class Speed extends Module { public final Setting speedMode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("The method of applying speed.") .defaultValue(SpeedModes.Vanilla) .onModuleActivated(speedModesSetting -> onSpeedModeChanged(speedModesSetting.get())) .onChanged(this::onSpeedModeChanged) @@ -34,7 +33,6 @@ public class Speed extends Module { public final Setting vanillaSpeed = sgGeneral.add(new DoubleSetting.Builder() .name("vanilla-speed") - .description("The speed in blocks per second.") .defaultValue(5.6) .min(0) .sliderMax(20) @@ -44,7 +42,6 @@ public class Speed extends Module { public final Setting ncpSpeed = sgGeneral.add(new DoubleSetting.Builder() .name("strafe-speed") - .description("The speed.") .visible(() -> speedMode.get() == SpeedModes.Strafe) .defaultValue(1.6) .min(0) @@ -54,7 +51,6 @@ public class Speed extends Module { public final Setting ncpSpeedLimit = sgGeneral.add(new BoolSetting.Builder() .name("speed-limit") - .description("Limits your speed on servers with very strict anticheats.") .visible(() -> speedMode.get() == SpeedModes.Strafe) .defaultValue(false) .build() @@ -62,7 +58,6 @@ public class Speed extends Module { public final Setting timer = sgGeneral.add(new DoubleSetting.Builder() .name("timer") - .description("Timer override.") .defaultValue(1) .min(0.01) .sliderMin(0.01) @@ -72,21 +67,18 @@ public class Speed extends Module { public final Setting inLiquids = sgGeneral.add(new BoolSetting.Builder() .name("in-liquids") - .description("Uses speed when in lava or water.") .defaultValue(false) .build() ); public final Setting whenSneaking = sgGeneral.add(new BoolSetting.Builder() .name("when-sneaking") - .description("Uses speed when sneaking.") .defaultValue(false) .build() ); public final Setting vanillaOnGround = sgGeneral.add(new BoolSetting.Builder() .name("only-on-ground") - .description("Uses speed only when standing on a block.") .visible(() -> speedMode.get() == SpeedModes.Vanilla) .defaultValue(false) .build() @@ -95,7 +87,7 @@ public class Speed extends Module { private SpeedMode currentMode; public Speed() { - super(Categories.Movement, "speed", "Modifies your movement speed when moving on the ground."); + super(Categories.Movement, "speed"); onSpeedModeChanged(speedMode.get()); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AirPlace.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AirPlace.java index 15200a20d6..cf3047f5d1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AirPlace.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AirPlace.java @@ -26,34 +26,30 @@ public class AirPlace extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRange = settings.createGroup("Range"); + private final SettingGroup sgRange = settings.createGroup("range"); // General private final Setting render = sgGeneral.add(new BoolSetting.Builder() .name("render") - .description("Renders a block overlay where the obsidian will be placed.") .defaultValue(true) .build() ); private final Setting shapeMode = sgGeneral.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting sideColor = sgGeneral.add(new ColorSetting.Builder() .name("side-color") - .description("The color of the sides of the blocks being rendered.") .defaultValue(new SettingColor(204, 0, 0, 10)) .build() ); private final Setting lineColor = sgGeneral.add(new ColorSetting.Builder() .name("line-color") - .description("The color of the lines of the blocks being rendered.") .defaultValue(new SettingColor(204, 0, 0, 255)) .build() ); @@ -62,14 +58,12 @@ public class AirPlace extends Module { private final Setting customRange = sgRange.add(new BoolSetting.Builder() .name("custom-range") - .description("Use custom range for air place.") .defaultValue(false) .build() ); private final Setting range = sgRange.add(new DoubleSetting.Builder() .name("range") - .description("Custom range to place at.") .visible(customRange::get) .defaultValue(5) .min(0) @@ -80,7 +74,7 @@ public class AirPlace extends Module { private HitResult hitResult; public AirPlace() { - super(Categories.Player, "air-place", "Places a block where your crosshair is pointing at."); + super(Categories.Player, "air-place"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiAFK.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiAFK.java index 2d170034d7..2f47a42189 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiAFK.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiAFK.java @@ -18,35 +18,31 @@ import java.util.Random; public class AntiAFK extends Module { - private final SettingGroup sgActions = settings.createGroup("Actions"); - private final SettingGroup sgMessages = settings.createGroup("Messages"); + private final SettingGroup sgActions = settings.createGroup("actions"); + private final SettingGroup sgMessages = settings.createGroup("messages"); // Actions private final Setting jump = sgActions.add(new BoolSetting.Builder() .name("jump") - .description("Jump randomly.") .defaultValue(true) .build() ); private final Setting swing = sgActions.add(new BoolSetting.Builder() .name("swing") - .description("Swings your hand.") .defaultValue(false) .build() ); private final Setting sneak = sgActions.add(new BoolSetting.Builder() .name("sneak") - .description("Sneaks and unsneaks quickly.") .defaultValue(false) .build() ); private final Setting sneakTime = sgActions.add(new IntSetting.Builder() .name("sneak-time") - .description("How many ticks to stay sneaked.") .defaultValue(5) .min(1) .sliderMin(1) @@ -56,7 +52,6 @@ public class AntiAFK extends Module { private final Setting strafe = sgActions.add(new BoolSetting.Builder() .name("strafe") - .description("Strafe right and left.") .defaultValue(false) .onChanged(aBoolean -> { strafeTimer = 0; @@ -72,14 +67,12 @@ public class AntiAFK extends Module { private final Setting spin = sgActions.add(new BoolSetting.Builder() .name("spin") - .description("Spins the player in place.") .defaultValue(true) .build() ); private final Setting spinMode = sgActions.add(new EnumSetting.Builder() .name("spin-mode") - .description("The method of rotating.") .defaultValue(SpinMode.Server) .visible(spin::get) .build() @@ -87,7 +80,6 @@ public class AntiAFK extends Module { private final Setting spinSpeed = sgActions.add(new IntSetting.Builder() .name("speed") - .description("The speed to spin you.") .defaultValue(7) .visible(spin::get) .build() @@ -95,7 +87,6 @@ public class AntiAFK extends Module { private final Setting pitch = sgActions.add(new IntSetting.Builder() .name("pitch") - .description("The pitch to send to the server.") .defaultValue(0) .range(-90, 90) .sliderRange(-90, 90) @@ -108,14 +99,12 @@ public class AntiAFK extends Module { private final Setting sendMessages = sgMessages.add(new BoolSetting.Builder() .name("send-messages") - .description("Sends messages to prevent getting kicked for AFK.") .defaultValue(false) .build() ); private final Setting randomMessage = sgMessages.add(new BoolSetting.Builder() .name("random") - .description("Selects a random message from your message list.") .defaultValue(false) .visible(sendMessages::get) .build() @@ -123,7 +112,6 @@ public class AntiAFK extends Module { private final Setting delay = sgMessages.add(new IntSetting.Builder() .name("delay") - .description("The delay between specified messages in seconds.") .defaultValue(15) .min(0) .sliderMax(30) @@ -133,7 +121,6 @@ public class AntiAFK extends Module { private final Setting> messages = sgMessages.add(new StringListSetting.Builder() .name("messages") - .description("The messages to choose from.") .defaultValue( "Meteor on top!", "Meteor on crack!" @@ -143,7 +130,7 @@ public class AntiAFK extends Module { ); public AntiAFK() { - super(Categories.Player, "anti-afk", "Performs different actions to prevent getting kicked while AFK."); + super(Categories.Player, "anti-afk"); } private final Random random = new Random(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java index 5c94ffe687..0a749da4bf 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiHunger.java @@ -22,14 +22,12 @@ public class AntiHunger extends Module { private final Setting sprint = sgGeneral.add(new BoolSetting.Builder() .name("sprint") - .description("Spoofs sprinting packets.") .defaultValue(true) .build() ); private final Setting onGround = sgGeneral.add(new BoolSetting.Builder() .name("on-ground") - .description("Spoofs the onGround flag.") .defaultValue(true) .build() ); @@ -37,7 +35,7 @@ public class AntiHunger extends Module { private boolean lastOnGround, ignorePacket; public AntiHunger() { - super(Categories.Player, "anti-hunger", "Reduces (does NOT remove) hunger consumption."); + super(Categories.Player, "anti-hunger"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoClicker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoClicker.java index 8ab9a34069..6e7be53116 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoClicker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoClicker.java @@ -17,21 +17,18 @@ public class AutoClicker extends Module { private final Setting inScreens = sgGeneral.add(new BoolSetting.Builder() .name("while-in-screens") - .description("Whether to click while a screen is open.") .defaultValue(true) .build() ); private final Setting leftClickMode = sgGeneral.add(new EnumSetting.Builder() .name("mode-left") - .description("The method of clicking for left clicks.") .defaultValue(Mode.Press) .build() ); private final Setting leftClickDelay = sgGeneral.add(new IntSetting.Builder() .name("delay-left") - .description("The amount of delay between left clicks in ticks.") .defaultValue(2) .min(0) .sliderMax(60) @@ -41,14 +38,12 @@ public class AutoClicker extends Module { private final Setting rightClickMode = sgGeneral.add(new EnumSetting.Builder() .name("mode-right") - .description("The method of clicking for right clicks.") .defaultValue(Mode.Press) .build() ); private final Setting rightClickDelay = sgGeneral.add(new IntSetting.Builder() .name("delay-right") - .description("The amount of delay between right clicks in ticks.") .defaultValue(2) .min(0) .sliderMax(60) @@ -59,7 +54,7 @@ public class AutoClicker extends Module { private int rightClickTimer, leftClickTimer; public AutoClicker() { - super(Categories.Player, "auto-clicker", "Automatically clicks."); + super(Categories.Player, "auto-clicker"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java index 8640666fd1..c49b32bb22 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java @@ -36,12 +36,11 @@ public class AutoEat extends Module { // Settings groups private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgThreshold = settings.createGroup("Threshold"); + private final SettingGroup sgThreshold = settings.createGroup("threshold"); // General public final Setting> blacklist = sgGeneral.add(new ItemListSetting.Builder() .name("blacklist") - .description("Which items to not eat.") .defaultValue( Items.ENCHANTED_GOLDEN_APPLE, Items.GOLDEN_APPLE, @@ -59,14 +58,12 @@ public class AutoEat extends Module { private final Setting pauseAuras = sgGeneral.add(new BoolSetting.Builder() .name("pause-auras") - .description("Pauses all auras when eating.") .defaultValue(true) .build() ); private final Setting pauseBaritone = sgGeneral.add(new BoolSetting.Builder() .name("pause-baritone") - .description("Pause baritone when eating.") .defaultValue(true) .build() ); @@ -74,14 +71,12 @@ public class AutoEat extends Module { // Threshold private final Setting thresholdMode = sgThreshold.add(new EnumSetting.Builder() .name("threshold-mode") - .description("The threshold mode to trigger auto eat.") .defaultValue(ThresholdMode.Any) .build() ); private final Setting healthThreshold = sgThreshold.add(new DoubleSetting.Builder() .name("health-threshold") - .description("The level of health you eat at.") .defaultValue(10) .range(1, 19) .sliderRange(1, 19) @@ -91,7 +86,6 @@ public class AutoEat extends Module { private final Setting hungerThreshold = sgThreshold.add(new IntSetting.Builder() .name("hunger-threshold") - .description("The level of hunger you eat at.") .defaultValue(16) .range(1, 19) .sliderRange(1, 19) @@ -107,7 +101,7 @@ public class AutoEat extends Module { private boolean wasBaritone = false; public AutoEat() { - super(Categories.Player, "auto-eat", "Automatically eats food."); + super(Categories.Player, "auto-eat"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoFish.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoFish.java index ae630c33a1..9d40f168e2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoFish.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoFish.java @@ -27,28 +27,24 @@ public class AutoFish extends Module { private final Setting autoSwitch = sgGeneral.add(new BoolSetting.Builder() .name("auto-switch") - .description("Automatically switch to a fishing rod.") .defaultValue(true) .build() ); private final Setting antiBreak = sgGeneral.add(new BoolSetting.Builder() .name("anti-break") - .description("Avoid using rods that would break if they were cast.") .defaultValue(true) .build() ); private final Setting autoCast = sgGeneral.add(new BoolSetting.Builder() .name("auto-cast") - .description("Automatically cast the fishing rod.") .defaultValue(true) .build() ); private final Setting castDelay = sgGeneral.add(new IntSetting.Builder() .name("cast-delay") - .description("How long to wait between recasts if the bobber fails to land in water.") .defaultValue(14) .min(1) .sliderMax(60) @@ -57,7 +53,6 @@ public class AutoFish extends Module { private final Setting castDelayVariance = sgGeneral.add(new IntSetting.Builder() .name("cast-delay-variance") - .description("Maximum amount of randomness added to cast delay.") .defaultValue(0) .min(0) .sliderMax(30) @@ -66,7 +61,6 @@ public class AutoFish extends Module { private final Setting catchDelay = sgGeneral.add(new IntSetting.Builder() .name("catch-delay") - .description("How long to wait after hooking a fish to reel it in.") .defaultValue(6) .min(1) .sliderMax(20) @@ -75,7 +69,6 @@ public class AutoFish extends Module { private final Setting catchDelayVariance = sgGeneral.add(new IntSetting.Builder() .name("catch-delay-variance") - .description("Maximum amount of randomness added to catch delay.") .defaultValue(0) .min(0) .sliderMax(10) // Since the shortest Java edition catch window is 20 ticks, this is the highest possible variance that won't miss fish. @@ -83,7 +76,7 @@ public class AutoFish extends Module { ); public AutoFish() { - super(Categories.Player, "auto-fish", "Automatically fishes for you."); + super(Categories.Player, "auto-fish"); } private double castDelayLeft = 0.0; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoGap.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoGap.java index b9dbc11d2f..693fadbbcd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoGap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoGap.java @@ -39,35 +39,31 @@ public class AutoGap extends Module { private static final Class[] AURAS = new Class[] { KillAura.class, CrystalAura.class, AnchorAura.class, BedAura.class }; private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgPotions = settings.createGroup("Potions"); - private final SettingGroup sgHealth = settings.createGroup("Health"); + private final SettingGroup sgPotions = settings.createGroup("potions"); + private final SettingGroup sgHealth = settings.createGroup("health"); // General private final Setting allowEgap = sgGeneral.add(new BoolSetting.Builder() .name("allow-egap") - .description("Allow eating E-Gaps over Gaps if found.") .defaultValue(true) .build() ); private final Setting always = sgGeneral.add(new BoolSetting.Builder() .name("always") - .description("If it should always eat.") .defaultValue(false) .build() ); private final Setting pauseAuras = sgGeneral.add(new BoolSetting.Builder() .name("pause-auras") - .description("Pauses all auras when eating.") .defaultValue(true) .build() ); private final Setting pauseBaritone = sgGeneral.add(new BoolSetting.Builder() .name("pause-baritone") - .description("Pause baritone when eating.") .defaultValue(true) .build() ); @@ -75,14 +71,12 @@ public class AutoGap extends Module { // Potions private final Setting beforeExpiry = sgPotions.add(new BoolSetting.Builder() .name("before-expiry") - .description("If it should eat before potion effects expire.") .defaultValue(false) .build() ); private final Setting expiryThreshold = sgPotions.add(new IntSetting.Builder() .name("expiry-threshold") - .description("Time in ticks before the potion effect expires to start eating.") .defaultValue(60) .min(0) .sliderMax(200) @@ -92,14 +86,12 @@ public class AutoGap extends Module { private final Setting potionsRegeneration = sgPotions.add(new BoolSetting.Builder() .name("potions-regeneration") - .description("If it should eat when Regeneration runs out.") .defaultValue(false) .build() ); private final Setting potionsFireResistance = sgPotions.add(new BoolSetting.Builder() .name("potions-fire-resistance") - .description("If it should eat when Fire Resistance runs out. Requires E-Gaps.") .defaultValue(true) .visible(allowEgap::get) .build() @@ -107,7 +99,6 @@ public class AutoGap extends Module { private final Setting potionsAbsorption = sgPotions.add(new BoolSetting.Builder() .name("potions-absorption") - .description("If it should eat when Absorption runs out. Requires E-Gaps.") .defaultValue(false) .visible(allowEgap::get) .build() @@ -117,14 +108,12 @@ public class AutoGap extends Module { private final Setting healthEnabled = sgHealth.add(new BoolSetting.Builder() .name("health-enabled") - .description("If it should eat when health drops below threshold.") .defaultValue(true) .build() ); private final Setting healthThreshold = sgHealth.add(new IntSetting.Builder() .name("health-threshold") - .description("Health threshold to eat at. Includes absorption.") .defaultValue(20) .min(0) .sliderMax(40) @@ -140,7 +129,7 @@ public class AutoGap extends Module { private boolean wasBaritone; public AutoGap() { - super(Categories.Player, "auto-gap", "Automatically eats Gaps or E-Gaps."); + super(Categories.Player, "auto-gap"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java index 569400a272..be6c795796 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java @@ -27,21 +27,18 @@ public class AutoMend extends Module { private final Setting> blacklist = sgGeneral.add(new ItemListSetting.Builder() .name("blacklist") - .description("Item blacklist.") .filter(item -> item.getComponents().get(DataComponentTypes.DAMAGE) != null) .build() ); private final Setting force = sgGeneral.add(new BoolSetting.Builder() .name("force") - .description("Replaces item in offhand even if there is some other non-repairable item.") .defaultValue(false) .build() ); private final Setting autoDisable = sgGeneral.add(new BoolSetting.Builder() .name("auto-disable") - .description("Automatically disables when there are no more items to repair.") .defaultValue(true) .build() ); @@ -49,7 +46,7 @@ public class AutoMend extends Module { private boolean didMove; public AutoMend() { - super(Categories.Player, "auto-mend", "Automatically replaces items in your offhand with mending when fully repaired."); + super(Categories.Player, "auto-mend"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java index cdb30f7461..93b9dfdd68 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java @@ -26,7 +26,6 @@ public class AutoReplenish extends Module { private final Setting minCount = sgGeneral.add(new IntSetting.Builder() .name("min-count") - .description("Replenish a slot when it reaches this item count.") .defaultValue(8) .min(1) .sliderRange(1, 63) @@ -35,7 +34,6 @@ public class AutoReplenish extends Module { private final Setting tickDelay = sgGeneral.add(new IntSetting.Builder() .name("delay") - .description("How long in ticks to wait between replenishing your hotbar.") .defaultValue(1) .min(0) .build() @@ -43,21 +41,18 @@ public class AutoReplenish extends Module { private final Setting offhand = sgGeneral.add(new BoolSetting.Builder() .name("offhand") - .description("Whether or not to replenish items in your offhand.") .defaultValue(true) .build() ); private final Setting unstackable = sgGeneral.add(new BoolSetting.Builder() .name("unstackable") - .description("Replenish unstackable items.") .defaultValue(true) .build() ); private final Setting sameEnchants = sgGeneral.add(new BoolSetting.Builder() .name("same-enchants") - .description("Only replace unstackables with items that have the same enchants.") .defaultValue(true) .visible(unstackable::get) .build() @@ -65,14 +60,12 @@ public class AutoReplenish extends Module { private final Setting searchHotbar = sgGeneral.add(new BoolSetting.Builder() .name("search-hotbar") - .description("Combine stacks in your hotbar/offhand as a last resort.") .defaultValue(false) .build() ); private final Setting> excludedItems = sgGeneral.add(new ItemListSetting.Builder() .name("excluded-items") - .description("Items that won't be replenished.") .build() ); @@ -85,7 +78,7 @@ public class AutoReplenish extends Module { private int tickDelayLeft; public AutoReplenish() { - super(Categories.Player, "auto-replenish", "Automatically refills items in your hotbar, main hand, or offhand."); + super(Categories.Player, "auto-replenish"); Arrays.fill(items, Items.AIR.getDefaultStack()); } @@ -131,7 +124,7 @@ private void checkSlot(int slot, ItemStack stack) { items[slot] = stack.copy(); if (slot == 9) slot = SlotUtils.OFFHAND; - + if (excludedItems.get().contains(stack.getItem())) return; if (excludedItems.get().contains(prevStack.getItem())) return; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoRespawn.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoRespawn.java index 67dbafdb66..ec7e771dbe 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoRespawn.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoRespawn.java @@ -16,7 +16,7 @@ public class AutoRespawn extends Module { public AutoRespawn() { - super(Categories.Player, "auto-respawn", "Automatically respawns after death."); + super(Categories.Player, "auto-respawn"); } @EventHandler(priority = EventPriority.HIGH) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java index fdc6774c86..e4a54ba2ed 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java @@ -33,41 +33,36 @@ public class AutoTool extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgWhitelist = settings.createGroup("Whitelist"); + private final SettingGroup sgWhitelist = settings.createGroup("whitelist"); // General private final Setting prefer = sgGeneral.add(new EnumSetting.Builder() .name("prefer") - .description("Either to prefer Silk Touch, Fortune, or none.") .defaultValue(EnchantPreference.Fortune) .build() ); private final Setting silkTouchForEnderChest = sgGeneral.add(new BoolSetting.Builder() .name("silk-touch-for-ender-chest") - .description("Mines Ender Chests only with the Silk Touch enchantment.") .defaultValue(true) .build() ); private final Setting fortuneForOresCrops = sgGeneral.add(new BoolSetting.Builder() .name("fortune-for-ores-and-crops") - .description("Mines Ores and crops only with the Fortune enchantment.") .defaultValue(false) .build() ); private final Setting antiBreak = sgGeneral.add(new BoolSetting.Builder() .name("anti-break") - .description("Stops you from breaking your tool.") .defaultValue(false) .build() ); private final Setting breakDurability = sgGeneral.add(new IntSetting.Builder() .name("anti-break-percentage") - .description("The durability percentage to stop using a tool.") .defaultValue(10) .range(1, 100) .sliderRange(1, 100) @@ -77,14 +72,12 @@ public class AutoTool extends Module { private final Setting switchBack = sgGeneral.add(new BoolSetting.Builder() .name("switch-back") - .description("Switches your hand to whatever was selected when releasing your attack key.") .defaultValue(false) .build() ); private final Setting switchDelay = sgGeneral.add((new IntSetting.Builder() .name("switch-delay") - .description("Delay in ticks before switching tools.") .defaultValue(0) .build() )); @@ -93,14 +86,12 @@ public class AutoTool extends Module { private final Setting listMode = sgWhitelist.add(new EnumSetting.Builder() .name("list-mode") - .description("Selection mode.") .defaultValue(ListMode.Blacklist) .build() ); private final Setting> whitelist = sgWhitelist.add(new ItemListSetting.Builder() .name("whitelist") - .description("The tools you want to use.") .visible(() -> listMode.get() == ListMode.Whitelist) .filter(AutoTool::isTool) .build() @@ -108,7 +99,6 @@ public class AutoTool extends Module { private final Setting> blacklist = sgWhitelist.add(new ItemListSetting.Builder() .name("blacklist") - .description("The tools you don't want to use.") .visible(() -> listMode.get() == ListMode.Blacklist) .filter(AutoTool::isTool) .build() @@ -120,7 +110,7 @@ public class AutoTool extends Module { private int bestSlot; public AutoTool() { - super(Categories.Player, "auto-tool", "Automatically switches to the most effective tool when performing an action."); + super(Categories.Player, "auto-tool"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/BreakDelay.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/BreakDelay.java index fe0b0f497e..6f683f15f8 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/BreakDelay.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/BreakDelay.java @@ -21,7 +21,6 @@ public class BreakDelay extends Module { private final Setting cooldown = sgGeneral.add(new IntSetting.Builder() .name("cooldown") - .description("Block break cooldown in ticks.") .defaultValue(0) .min(0) .sliderMax(5) @@ -30,7 +29,6 @@ public class BreakDelay extends Module { private final Setting noInstaBreak = sgGeneral.add(new BoolSetting.Builder() .name("no-insta-break") - .description("Prevents you from misbreaking blocks if you can instantly break them.") .defaultValue(false) .build() ); @@ -38,7 +36,7 @@ public class BreakDelay extends Module { private boolean breakBlockCooldown = false; public BreakDelay() { - super(Categories.Player, "break-delay", "Changes the delay between breaking blocks."); + super(Categories.Player, "break-delay"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/ChestSwap.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/ChestSwap.java index 8cbeed193c..adfed938bd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/ChestSwap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/ChestSwap.java @@ -25,27 +25,24 @@ public class ChestSwap extends Module { private final Setting chestplate = sgGeneral.add(new EnumSetting.Builder() .name("chestplate") - .description("Which type of chestplate to swap to.") .defaultValue(Chestplate.PreferNetherite) .build() ); private final Setting stayOn = sgGeneral.add(new BoolSetting.Builder() .name("stay-on") - .description("Stays on and activates when you turn it off.") .defaultValue(false) .build() ); private final Setting closeInventory = sgGeneral.add(new BoolSetting.Builder() .name("close-inventory") - .description("Sends inventory close after swap.") .defaultValue(true) .build() ); public ChestSwap() { - super(Categories.Player, "chest-swap", "Automatically swaps between a chestplate and an elytra."); + super(Categories.Player, "chest-swap"); } @Override @@ -138,7 +135,7 @@ private void equip(int slot) { @Override public void sendToggledMsg() { if (stayOn.get()) super.sendToggledMsg(); - else if (Config.get().chatFeedback.get() && chatFeedback) info("Triggered (highlight)%s(default).", title); + else if (Config.get().chatFeedback.get() && chatFeedback) info("Triggered (highlight)%s(default).", this.getTitle()); } public enum Chestplate { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/EXPThrower.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/EXPThrower.java index a64f656e02..a86ab6df37 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/EXPThrower.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/EXPThrower.java @@ -16,7 +16,7 @@ public class EXPThrower extends Module { public EXPThrower() { - super(Categories.Player, "exp-thrower", "Automatically throws XP bottles from your hotbar."); + super(Categories.Player, "exp-thrower"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FakePlayer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FakePlayer.java index 9b427a8aed..ec79dfc330 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FakePlayer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FakePlayer.java @@ -21,21 +21,18 @@ public class FakePlayer extends Module { public final Setting name = sgGeneral.add(new StringSetting.Builder() .name("name") - .description("The name of the fake player.") .defaultValue("seasnail8169") .build() ); public final Setting copyInv = sgGeneral.add(new BoolSetting.Builder() .name("copy-inv") - .description("Copies your inventory to the fake player.") .defaultValue(true) .build() ); public final Setting health = sgGeneral.add(new IntSetting.Builder() .name("health") - .description("The fake player's default health.") .defaultValue(20) .min(1) .sliderRange(1, 100) @@ -45,7 +42,7 @@ public class FakePlayer extends Module { private WTable table; public FakePlayer() { - super(Categories.Player, "fake-player", "Spawns a client-side fake player for testing usages. No need to be active."); + super(Categories.Player, "fake-player"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FastUse.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FastUse.java index 0a17c7d48a..e6d6870c54 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FastUse.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FastUse.java @@ -24,21 +24,18 @@ public enum Mode { private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("Which items to fast use.") .defaultValue(Mode.All) .build() ); private final Setting> items = sgGeneral.add(new ItemListSetting.Builder() .name("items") - .description("Which items should fast place work on in \"Some\" mode.") .visible(() -> mode.get() == Mode.Some) .build() ); private final Setting blocks = sgGeneral.add(new BoolSetting.Builder() .name("blocks") - .description("Fast-places blocks if the mode is \"Some\" mode.") .visible(() -> mode.get() == Mode.Some) .defaultValue(false) .build() @@ -46,7 +43,6 @@ public enum Mode { private final Setting cooldown = sgGeneral.add(new IntSetting.Builder() .name("cooldown") - .description("Fast-use cooldown in ticks.") .defaultValue(0) .min(0) .sliderMax(4) @@ -54,7 +50,7 @@ public enum Mode { ); public FastUse() { - super(Categories.Player, "fast-use", "Allows you to use items at very high speeds."); + super(Categories.Player, "fast-use"); } public int getItemUseCooldown(ItemStack itemStack) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/GhostHand.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/GhostHand.java index efd61e216a..71eef7cf1d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/GhostHand.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/GhostHand.java @@ -23,7 +23,7 @@ public class GhostHand extends Module { private final Set posList = new ObjectOpenHashSet<>(); public GhostHand() { - super(Categories.Player, "ghost-hand", "Opens containers through walls."); + super(Categories.Player, "ghost-hand"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java index 06766eef18..b1785f7ec2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java @@ -25,11 +25,10 @@ public class InstantRebreak extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgRender = settings.createGroup("render"); private final Setting tickDelay = sgGeneral.add(new IntSetting.Builder() .name("delay") - .description("The delay between break attempts.") .defaultValue(0) .min(0) .sliderMax(20) @@ -38,14 +37,12 @@ public class InstantRebreak extends Module { private final Setting pick = sgGeneral.add(new BoolSetting.Builder() .name("only-pick") - .description("Only tries to mine the block if you are holding a pickaxe.") .defaultValue(true) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Faces the block being mined server side.") .defaultValue(true) .build() ); @@ -54,28 +51,24 @@ public class InstantRebreak extends Module { private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") - .description("Renders an overlay on the block being broken.") .defaultValue(true) .build() ); private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The color of the sides of the blocks being rendered.") .defaultValue(new SettingColor(204, 0, 0, 10)) .build() ); private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The color of the lines of the blocks being rendered.") .defaultValue(new SettingColor(204, 0, 0, 255)) .build() ); @@ -85,7 +78,7 @@ public class InstantRebreak extends Module { private Direction direction; public InstantRebreak() { - super(Categories.Player, "instant-rebreak", "Instantly re-breaks blocks in the same position."); + super(Categories.Player, "instant-rebreak"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/LiquidInteract.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/LiquidInteract.java index aaea7b351f..b9c649c297 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/LiquidInteract.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/LiquidInteract.java @@ -10,6 +10,6 @@ public class LiquidInteract extends Module { public LiquidInteract() { - super(Categories.Player, "liquid-interact", "Allows you to interact with liquids."); + super(Categories.Player, "liquid-interact"); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java index ed8f38d0b3..75b059f9d5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java @@ -35,14 +35,12 @@ public class MiddleClickExtra extends Module { private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("Which item to use when you middle click.") .defaultValue(Mode.Pearl) .build() ); private final Setting message = sgGeneral.add(new BoolSetting.Builder() .name("send-message") - .description("Sends a message when you add a player as a friend.") .defaultValue(false) .visible(() -> mode.get() == Mode.AddFriend) .build() @@ -50,7 +48,6 @@ public class MiddleClickExtra extends Module { private final Setting friendMessage = sgGeneral.add(new StringSetting.Builder() .name("message-to-send") - .description("Message to send when you add a player as a friend (use %player for the player's name)") .defaultValue("/msg %player I just friended you on Meteor.") .visible(() -> mode.get() == Mode.AddFriend) .build() @@ -58,7 +55,6 @@ public class MiddleClickExtra extends Module { private final Setting quickSwap = sgGeneral.add(new BoolSetting.Builder() .name("quick-swap") - .description("Allows you to use items in your inventory by simulating hotbar key presses. May get flagged by anticheats.") .defaultValue(false) .visible(() -> mode.get() != Mode.AddFriend) .build() @@ -66,7 +62,6 @@ public class MiddleClickExtra extends Module { private final Setting swapBack = sgGeneral.add(new BoolSetting.Builder() .name("swap-back") - .description("Swap back to your original slot when you finish using an item.") .defaultValue(false) .visible(() -> mode.get() != Mode.AddFriend && !quickSwap.get()) .build() @@ -74,21 +69,19 @@ public class MiddleClickExtra extends Module { private final Setting disableInCreative = sgGeneral.add(new BoolSetting.Builder() .name("disable-in-creative") - .description("Middle click action is disabled in Creative mode.") .defaultValue(true) .build() ); private final Setting notify = sgGeneral.add(new BoolSetting.Builder() .name("notify") - .description("Notifies you when you do not have the specified item in your hotbar.") .defaultValue(true) .visible(() -> mode.get() != Mode.AddFriend) .build() ); public MiddleClickExtra() { - super(Categories.Player, "middle-click-extra", "Perform various actions when you middle click."); + super(Categories.Player, "middle-click-extra"); } private boolean isUsing; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Multitask.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Multitask.java index 62a5b98abe..45303f4bdb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Multitask.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Multitask.java @@ -16,13 +16,12 @@ public class Multitask extends Module { private final Setting attackingEntities = sgGeneral.add(new BoolSetting.Builder() .name("attacking-entities") - .description("Lets you attack entities while using an item.") .defaultValue(true) .build() ); public Multitask() { - super(Categories.Player, "multitask", "Lets you use items and attack at the same time."); + super(Categories.Player, "multitask"); } public boolean attackingEntities() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NameProtect.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NameProtect.java index 5ba3b14f4b..ceade4289e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NameProtect.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NameProtect.java @@ -17,14 +17,12 @@ public class NameProtect extends Module { private final Setting nameProtect = sgGeneral.add(new BoolSetting.Builder() .name("name-protect") - .description("Hides your name client-side.") .defaultValue(true) .build() ); private final Setting name = sgGeneral.add(new StringSetting.Builder() .name("name") - .description("Name to be replaced with.") .defaultValue("seasnail") .visible(nameProtect::get) .build() @@ -32,7 +30,6 @@ public class NameProtect extends Module { private final Setting skinProtect = sgGeneral.add(new BoolSetting.Builder() .name("skin-protect") - .description("Make players become Steves.") .defaultValue(true) .build() ); @@ -40,7 +37,7 @@ public class NameProtect extends Module { private String username = "If you see this, something is wrong."; public NameProtect() { - super(Categories.Player, "name-protect", "Hide player names and skins."); + super(Categories.Player, "name-protect"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoInteract.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoInteract.java index 4bea37d511..427539536f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoInteract.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoInteract.java @@ -28,40 +28,35 @@ import java.util.Set; public class NoInteract extends Module { - private final SettingGroup sgBlocks = settings.createGroup("Blocks"); - private final SettingGroup sgEntities = settings.createGroup("Entities"); + private final SettingGroup sgBlocks = settings.createGroup("blocks"); + private final SettingGroup sgEntities = settings.createGroup("entities"); // Blocks private final Setting> blockMine = sgBlocks.add(new BlockListSetting.Builder() .name("block-mine") - .description("Cancels block mining.") .build() ); private final Setting blockMineMode = sgBlocks.add(new EnumSetting.Builder() .name("block-mine-mode") - .description("List mode to use for block mine.") .defaultValue(ListMode.BlackList) .build() ); private final Setting> blockInteract = sgBlocks.add(new BlockListSetting.Builder() .name("block-interact") - .description("Cancels block interaction.") .build() ); private final Setting blockInteractMode = sgBlocks.add(new EnumSetting.Builder() .name("block-interact-mode") - .description("List mode to use for block interact.") .defaultValue(ListMode.BlackList) .build() ); private final Setting blockInteractHand = sgBlocks.add(new EnumSetting.Builder() .name("block-interact-hand") - .description("Cancels block interaction if performed by this hand.") .defaultValue(HandMode.None) .build() ); @@ -70,62 +65,54 @@ public class NoInteract extends Module { private final Setting>> entityHit = sgEntities.add(new EntityTypeListSetting.Builder() .name("entity-hit") - .description("Cancel entity hitting.") .onlyAttackable() .build() ); private final Setting entityHitMode = sgEntities.add(new EnumSetting.Builder() .name("entity-hit-mode") - .description("List mode to use for entity hit.") .defaultValue(ListMode.BlackList) .build() ); private final Setting>> entityInteract = sgEntities.add(new EntityTypeListSetting.Builder() .name("entity-interact") - .description("Cancel entity interaction.") .onlyAttackable() .build() ); private final Setting entityInteractMode = sgEntities.add(new EnumSetting.Builder() .name("entity-interact-mode") - .description("List mode to use for entity interact.") .defaultValue(ListMode.BlackList) .build() ); private final Setting entityInteractHand = sgEntities.add(new EnumSetting.Builder() .name("entity-interact-hand") - .description("Cancels entity interaction if performed by this hand.") .defaultValue(HandMode.None) .build() ); private final Setting friends = sgEntities.add(new EnumSetting.Builder() .name("friends") - .description("Friends cancel mode.") .defaultValue(InteractMode.None) .build() ); private final Setting babies = sgEntities.add(new EnumSetting.Builder() .name("babies") - .description("Baby entity cancel mode.") .defaultValue(InteractMode.None) .build() ); private final Setting nametagged = sgEntities.add(new EnumSetting.Builder() .name("nametagged") - .description("Nametagged entity cancel mode.") .defaultValue(InteractMode.None) .build() ); public NoInteract() { - super(Categories.Player, "no-interact", "Blocks interactions with certain types of inputs."); + super(Categories.Player, "no-interact"); } @EventHandler(priority = EventPriority.HIGH) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoMiningTrace.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoMiningTrace.java index 2d8858b463..a89c4c30b6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoMiningTrace.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoMiningTrace.java @@ -22,20 +22,18 @@ public class NoMiningTrace extends Module { private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("blacklisted-entities") - .description("Entities you will interact with as normal.") .defaultValue() .build() ); private final Setting onlyWhenHoldingPickaxe = sgGeneral.add(new BoolSetting.Builder() .name("only-when-holding-a-pickaxe") - .description("Whether or not to work only when holding a pickaxe.") .defaultValue(true) .build() ); public NoMiningTrace() { - super(Categories.Player, "no-mining-trace", "Allows you to mine blocks through entities."); + super(Categories.Player, "no-mining-trace"); } public boolean canWork(Entity entity) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoRotate.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoRotate.java index bf4bdf24a4..48abe8d3a6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoRotate.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoRotate.java @@ -14,7 +14,7 @@ public class NoRotate extends Module { public NoRotate() { - super(Categories.Player, "no-rotate", "Attempts to block rotations sent from server to client."); + super(Categories.Player, "no-rotate"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoStatusEffects.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoStatusEffects.java index 85e8c3cc0c..be4521722b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoStatusEffects.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoStatusEffects.java @@ -19,7 +19,6 @@ public class NoStatusEffects extends Module { private final Setting> blockedEffects = sgGeneral.add(new StatusEffectListSetting.Builder() .name("blocked-effects") - .description("Effects to block.") .defaultValue( LEVITATION.value(), JUMP_BOOST.value(), @@ -30,7 +29,7 @@ public class NoStatusEffects extends Module { ); public NoStatusEffects() { - super(Categories.Player, "no-status-effects", "Blocks specified status effects."); + super(Categories.Player, "no-status-effects"); } public boolean shouldBlock(StatusEffect effect) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/OffhandCrash.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/OffhandCrash.java index 32900028a3..48db1105bb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/OffhandCrash.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/OffhandCrash.java @@ -26,14 +26,12 @@ public class OffhandCrash extends Module { private final Setting doCrash = sgGeneral.add(new BoolSetting.Builder() .name("do-crash") - .description("Sends X number of offhand swap sound packets to the server per tick.") .defaultValue(true) .build() ); private final Setting speed = sgGeneral.add(new IntSetting.Builder() .name("speed") - .description("The amount of swaps per tick.") .defaultValue(2000) .min(1) .sliderRange(1, 10000) @@ -43,13 +41,12 @@ public class OffhandCrash extends Module { private final Setting antiCrash = sgGeneral.add(new BoolSetting.Builder() .name("anti-crash") - .description("Attempts to prevent you from crashing yourself.") .defaultValue(true) .build() ); public OffhandCrash() { - super(Categories.Misc, "offhand-crash", "An exploit that can crash other players by swapping back and forth between your main hand and offhand."); + super(Categories.Misc, "offhand-crash"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Portals.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Portals.java index bfbcb8e990..02d419ea96 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Portals.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Portals.java @@ -10,6 +10,6 @@ public class Portals extends Module { public Portals() { - super(Categories.Player, "portals", "Allows you to use GUIs normally while in a Nether Portal."); + super(Categories.Player, "portals"); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/PotionSaver.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/PotionSaver.java index 44e2079955..22f8f054fc 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/PotionSaver.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/PotionSaver.java @@ -23,7 +23,6 @@ public class PotionSaver extends Module { private final Setting> effects = sgGeneral.add(new StatusEffectListSetting.Builder() .name("effects") - .description("The effects to preserve.") .defaultValue( STRENGTH.value(), ABSORPTION.value(), @@ -45,13 +44,12 @@ public class PotionSaver extends Module { public final Setting onlyWhenStationary = sgGeneral.add(new BoolSetting.Builder() .name("only-when-stationary") - .description("Only freezes effects when you aren't moving.") .defaultValue(false) .build() ); public PotionSaver() { - super(Categories.Player, "potion-saver", "Stops potion effects ticking when you stand still."); + super(Categories.Player, "potion-saver"); } public boolean shouldFreeze(StatusEffect effect) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Reach.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Reach.java index b0bc8fe98c..7a7882c0ea 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Reach.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Reach.java @@ -19,20 +19,18 @@ public class Reach extends Module { private final Setting blockReach = sgGeneral.add(new DoubleSetting.Builder() .name("extra-block-reach") - .description("The distance to add to your block reach.") .sliderMax(1) .build() ); private final Setting entityReach = sgGeneral.add(new DoubleSetting.Builder() .name("extra-entity-reach") - .description("The distance to add to your entity reach.") .sliderMax(1) .build() ); public Reach() { - super(Categories.Player, "reach", "Gives you super long arms."); + super(Categories.Player, "reach"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Rotation.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Rotation.java index 3f5d5fb8bd..57503febb1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Rotation.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/Rotation.java @@ -15,21 +15,19 @@ import meteordevelopment.orbit.EventHandler; public class Rotation extends Module { - private final SettingGroup sgYaw = settings.createGroup("Yaw"); - private final SettingGroup sgPitch = settings.createGroup("Pitch"); + private final SettingGroup sgYaw = settings.createGroup("yaw"); + private final SettingGroup sgPitch = settings.createGroup("pitch"); // Yaw private final Setting yawLockMode = sgYaw.add(new EnumSetting.Builder() .name("yaw-lock-mode") - .description("The way in which your yaw is locked.") .defaultValue(LockMode.Simple) .build() ); private final Setting yawAngle = sgYaw.add(new DoubleSetting.Builder() .name("yaw-angle") - .description("Yaw angle in degrees.") .defaultValue(0) .sliderMax(360) .max(360) @@ -41,14 +39,12 @@ public class Rotation extends Module { private final Setting pitchLockMode = sgPitch.add(new EnumSetting.Builder() .name("pitch-lock-mode") - .description("The way in which your pitch is locked.") .defaultValue(LockMode.Simple) .build() ); private final Setting pitchAngle = sgPitch.add(new DoubleSetting.Builder() .name("pitch-angle") - .description("Pitch angle in degrees.") .defaultValue(0) .range(-90, 90) .sliderRange(-90, 90) @@ -57,7 +53,7 @@ public class Rotation extends Module { ); public Rotation() { - super(Categories.Player, "rotation", "Changes/locks your yaw and pitch."); + super(Categories.Player, "rotation"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java index 1f5f738693..d9b6d7408d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java @@ -34,7 +34,6 @@ public class SpeedMine extends Module { private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") - .description("Selected blocks.") .filter(block -> block.getHardness() > 0) .visible(() -> mode.get() != Mode.Haste) .build() @@ -42,7 +41,6 @@ public class SpeedMine extends Module { private final Setting blocksFilter = sgGeneral.add(new EnumSetting.Builder() .name("blocks-filter") - .description("How to use the blocks setting.") .defaultValue(ListMode.Blacklist) .visible(() -> mode.get() != Mode.Haste) .build() @@ -50,7 +48,6 @@ public class SpeedMine extends Module { public final Setting modifier = sgGeneral.add(new DoubleSetting.Builder() .name("modifier") - .description("Mining speed modifier. An additional value of 0.2 is equivalent to one haste level (1.2 = haste 1).") .defaultValue(1.4) .visible(() -> mode.get() == Mode.Normal) .min(0) @@ -59,7 +56,6 @@ public class SpeedMine extends Module { private final Setting hasteAmplifier = sgGeneral.add(new IntSetting.Builder() .name("haste-amplifier") - .description("What value of haste to give you. Above 2 not recommended.") .defaultValue(2) .min(1) .visible(() -> mode.get() == Mode.Haste) @@ -69,7 +65,6 @@ public class SpeedMine extends Module { private final Setting instamine = sgGeneral.add(new BoolSetting.Builder() .name("instamine") - .description("Whether or not to instantly mine blocks under certain conditions.") .defaultValue(true) .visible(() -> mode.get() == Mode.Damage) .build() @@ -77,14 +72,13 @@ public class SpeedMine extends Module { private final Setting grimBypass = sgGeneral.add(new BoolSetting.Builder() .name("grim-bypass") - .description("Bypasses Grim's fastbreak check, working as of 2.3.58") .defaultValue(false) .visible(() -> mode.get() == Mode.Damage) .build() ); public SpeedMine() { - super(Categories.Player, "speed-mine", "Allows you to quickly mine blocks."); + super(Categories.Player, "speed-mine"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTab.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTab.java index ac4ed36104..e83253e26c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTab.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTab.java @@ -26,7 +26,6 @@ public class BetterTab extends Module { public final Setting tabSize = sgGeneral.add(new IntSetting.Builder() .name("tablist-size") - .description("How many players in total to display in the tablist.") .defaultValue(100) .min(1) .sliderRange(1, 1000) @@ -35,7 +34,6 @@ public class BetterTab extends Module { public final Setting tabHeight = sgGeneral.add(new IntSetting.Builder() .name("column-height") - .description("How many players to display in each column.") .defaultValue(20) .min(1) .sliderRange(1, 1000) @@ -44,14 +42,12 @@ public class BetterTab extends Module { private final Setting self = sgGeneral.add(new BoolSetting.Builder() .name("highlight-self") - .description("Highlights yourself in the tablist.") .defaultValue(true) .build() ); private final Setting selfColor = sgGeneral.add(new ColorSetting.Builder() .name("self-color") - .description("The color to highlight your name with.") .defaultValue(new SettingColor(250, 130, 30)) .visible(self::get) .build() @@ -59,28 +55,25 @@ public class BetterTab extends Module { private final Setting friends = sgGeneral.add(new BoolSetting.Builder() .name("highlight-friends") - .description("Highlights friends in the tablist.") .defaultValue(true) .build() ); public final Setting accurateLatency = sgGeneral.add(new BoolSetting.Builder() .name("accurate-latency") - .description("Shows latency as a number in the tablist.") .defaultValue(true) .build() ); private final Setting gamemode = sgGeneral.add(new BoolSetting.Builder() .name("gamemode") - .description("Display gamemode next to the nick.") .defaultValue(false) .build() ); public BetterTab() { - super(Categories.Render, "better-tab", "Various improvements to the tab list."); + super(Categories.Render, "better-tab"); } public Text getPlayerName(PlayerListEntry playerListEntry) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java index 11b39e6c16..3aacb344e3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java @@ -58,15 +58,14 @@ public class BetterTooltips extends Module { public static final Color ECHEST_COLOR = new Color(0, 50, 50); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgPreviews = settings.createGroup("Previews"); - private final SettingGroup sgOther = settings.createGroup("Other"); - private final SettingGroup sgHideFlags = settings.createGroup("Hide Flags"); + private final SettingGroup sgPreviews = settings.createGroup("previews"); + private final SettingGroup sgOther = settings.createGroup("other"); + private final SettingGroup sgHideFlags = settings.createGroup("hide-flags"); // General private final Setting displayWhen = sgGeneral.add(new EnumSetting.Builder() .name("display-when") - .description("When to display previews.") .defaultValue(DisplayWhen.Keybind) .onChanged(value -> updateTooltips = true) .build() @@ -74,7 +73,6 @@ public class BetterTooltips extends Module { private final Setting keybind = sgGeneral.add(new KeybindSetting.Builder() .name("keybind") - .description("The bind for keybind mode.") .defaultValue(Keybind.fromKey(GLFW_KEY_LEFT_ALT)) .visible(() -> displayWhen.get() == DisplayWhen.Keybind) .onChanged(value -> updateTooltips = true) @@ -83,14 +81,12 @@ public class BetterTooltips extends Module { private final Setting openContents = sgGeneral.add(new BoolSetting.Builder() .name("open-contents") - .description("Opens a GUI window with the inventory of the storage block or book when you click the item.") .defaultValue(true) .build() ); private final Setting openContentsKey = sgGeneral.add(new KeybindSetting.Builder() .name("keybind") - .description("Key to open contents (containers, books, etc.) when pressed on items.") .defaultValue(Keybind.fromButton(GLFW_MOUSE_BUTTON_MIDDLE)) .visible(openContents::get) .build() @@ -98,7 +94,6 @@ public class BetterTooltips extends Module { private final Setting pauseInCreative = sgGeneral.add(new BoolSetting.Builder() .name("pause-in-creative") - .description("Pauses middle click open while the player is in creative mode.") .defaultValue(true) .visible(openContents::get) .build() @@ -108,7 +103,6 @@ public class BetterTooltips extends Module { private final Setting shulkers = sgPreviews.add(new BoolSetting.Builder() .name("containers") - .description("Shows a preview of a containers when hovering over it in an inventory.") .defaultValue(true) .onChanged(value -> updateTooltips = true) .build() @@ -116,14 +110,12 @@ public class BetterTooltips extends Module { private final Setting shulkerCompactTooltip = sgPreviews.add(new BoolSetting.Builder() .name("compact-shulker-tooltip") - .description("Compacts the lines of the shulker tooltip.") .defaultValue(true) .build() ); private final Setting echest = sgPreviews.add(new BoolSetting.Builder() .name("echests") - .description("Shows a preview of your echest when hovering over it in an inventory.") .defaultValue(true) .onChanged(value -> updateTooltips = true) .build() @@ -131,7 +123,6 @@ public class BetterTooltips extends Module { private final Setting maps = sgPreviews.add(new BoolSetting.Builder() .name("maps") - .description("Shows a preview of a map when hovering over it in an inventory.") .defaultValue(true) .onChanged(value -> updateTooltips = true) .build() @@ -139,7 +130,6 @@ public class BetterTooltips extends Module { public final Setting mapsScale = sgPreviews.add(new DoubleSetting.Builder() .name("map-scale") - .description("The scale of the map preview.") .defaultValue(1) .min(0.001) .sliderMax(1) @@ -149,7 +139,6 @@ public class BetterTooltips extends Module { private final Setting books = sgPreviews.add(new BoolSetting.Builder() .name("books") - .description("Shows contents of a book when hovering over it in an inventory.") .defaultValue(true) .onChanged(value -> updateTooltips = true) .build() @@ -157,7 +146,6 @@ public class BetterTooltips extends Module { private final Setting banners = sgPreviews.add(new BoolSetting.Builder() .name("banners") - .description("Shows banners' patterns when hovering over it in an inventory. Also works with shields.") .defaultValue(true) .onChanged(value -> updateTooltips = true) .build() @@ -165,7 +153,6 @@ public class BetterTooltips extends Module { private final Setting entitiesInBuckets = sgPreviews.add(new BoolSetting.Builder() .name("entities-in-buckets") - .description("Shows entities in buckets when hovering over it in an inventory.") .defaultValue(true) .onChanged(value -> updateTooltips = true) .build() @@ -173,7 +160,6 @@ public class BetterTooltips extends Module { private final Setting bundles = sgPreviews.add(new BoolSetting.Builder() .name("bundles") - .description("Shows a preview of bundle contents when hovering over it in an inventory.") .defaultValue(true) .onChanged(value -> updateTooltips = true) .build() @@ -181,7 +167,6 @@ public class BetterTooltips extends Module { private final Setting foodInfo = sgPreviews.add(new BoolSetting.Builder() .name("food-info") - .description("Shows hunger and saturation values for food items.") .defaultValue(true) .onChanged(value -> updateTooltips = true) .build() @@ -191,7 +176,6 @@ public class BetterTooltips extends Module { public final Setting byteSize = sgOther.add(new BoolSetting.Builder() .name("byte-size") - .description("Displays an item's size in bytes in the tooltip.") .defaultValue(true) .onChanged(value -> updateTooltips = true) .build() @@ -199,7 +183,6 @@ public class BetterTooltips extends Module { private final Setting sizeType = sgOther.add(new EnumSetting.Builder() .name("byte-size-format") - .description("The format by which to display the item's byte size.") .defaultValue(SortSize.Dynamic) .visible(byteSize::get) .build() @@ -207,7 +190,6 @@ public class BetterTooltips extends Module { private final Setting statusEffects = sgOther.add(new BoolSetting.Builder() .name("status-effects") - .description("Adds list of status effects to tooltips of food items.") .defaultValue(true) .onChanged(value -> updateTooltips = true) .build() @@ -217,14 +199,12 @@ public class BetterTooltips extends Module { public final Setting tooltip = sgHideFlags.add(new BoolSetting.Builder() .name("tooltip") - .description("Show the tooltip when it's hidden.") .defaultValue(false) .build() ); public final Setting additional = sgHideFlags.add(new BoolSetting.Builder() .name("tooltip-components") - .description("Shows tooltip components when they're hidden - e.g. enchantments, attributes, lore, etc.") .defaultValue(false) .build() ); @@ -234,7 +214,7 @@ public class BetterTooltips extends Module { private static final ItemStack[] PEEK_SCREEN = new ItemStack[27]; public BetterTooltips() { - super(Categories.Render, "better-tooltips", "Displays more useful tooltips for certain items."); + super(Categories.Render, "better-tooltips"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BlockSelection.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BlockSelection.java index a45948b7bc..a3ea51577c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BlockSelection.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BlockSelection.java @@ -24,48 +24,42 @@ public class BlockSelection extends Module { private final Setting advanced = sgGeneral.add(new BoolSetting.Builder() .name("advanced") - .description("Shows a more advanced outline on different types of shape blocks.") .defaultValue(true) .build() ); private final Setting oneSide = sgGeneral.add(new BoolSetting.Builder() .name("single-side") - .description("Only renders the side you are looking at.") .defaultValue(false) .build() ); private final Setting shapeMode = sgGeneral.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting sideColor = sgGeneral.add(new ColorSetting.Builder() .name("side-color") - .description("The side color.") .defaultValue(new SettingColor(255, 255, 255, 50)) .build() ); private final Setting lineColor = sgGeneral.add(new ColorSetting.Builder() .name("line-color") - .description("The line color.") .defaultValue(new SettingColor(255, 255, 255, 255)) .build() ); private final Setting hideInside = sgGeneral.add(new BoolSetting.Builder() .name("hide-when-inside-block") - .description("Hide selection when inside target block.") .defaultValue(true) .build() ); public BlockSelection() { - super(Categories.Render, "block-selection", "Modifies how your block selection is rendered."); + super(Categories.Render, "block-selection"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Blur.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Blur.java index 0d59260b42..eacf2251dd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Blur.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Blur.java @@ -37,7 +37,7 @@ public class Blur extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgScreens = settings.createGroup("Screens"); + private final SettingGroup sgScreens = settings.createGroup("screens"); // Strength-Levels from https://github.com/jonaburg/picom/blob/a8445684fe18946604848efb73ace9457b29bf80/src/backend/backend_common.c#L372 private final IntFloatImmutablePair[] strengths = new IntFloatImmutablePair[]{ @@ -66,7 +66,6 @@ public class Blur extends Module { // General private final Setting strength = sgGeneral.add(new IntSetting.Builder() .name("strength") - .description("How strong the blur should be.") .defaultValue(5) .min(1) .max(20) @@ -76,7 +75,6 @@ public class Blur extends Module { private final Setting fadeTime = sgGeneral.add(new IntSetting.Builder() .name("fade-time") - .description("How long the fade will last in milliseconds.") .defaultValue(100) .min(0) .sliderMax(500) @@ -87,27 +85,23 @@ public class Blur extends Module { private final Setting meteor = sgScreens.add(new BoolSetting.Builder() .name("meteor") - .description("Applies blur to Meteor screens.") .defaultValue(true) .build()); private final Setting inventories = sgScreens.add(new BoolSetting.Builder() .name("inventories") - .description("Applies blur to inventory screens.") .defaultValue(true) .build() ); private final Setting chat = sgScreens.add(new BoolSetting.Builder() .name("chat") - .description("Applies blur when in chat.") .defaultValue(false) .build() ); private final Setting other = sgScreens.add(new BoolSetting.Builder() .name("other") - .description("Applies blur to all other screen types.") .defaultValue(true) .build() ); @@ -120,7 +114,7 @@ public class Blur extends Module { private float previousOffset = -1; public Blur() { - super(Categories.Render, "blur", "Blurs background when in GUI screens."); + super(Categories.Render, "blur"); // Initialize fbos for the first time for (int i = 0; i < fbos.length; i++) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BossStack.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BossStack.java index 31b16db480..bab2265ea9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BossStack.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BossStack.java @@ -25,21 +25,18 @@ public class BossStack extends Module { public final Setting stack = sgGeneral.add(new BoolSetting.Builder() .name("stack") - .description("Stacks boss bars and adds a counter to the text.") .defaultValue(true) .build() ); public final Setting hideName = sgGeneral.add(new BoolSetting.Builder() .name("hide-name") - .description("Hides the names of boss bars.") .defaultValue(false) .build() ); private final Setting spacing = sgGeneral.add(new DoubleSetting.Builder() .name("bar-spacing") - .description("The spacing reduction between each boss bar.") .defaultValue(10) .min(0) .build() @@ -48,7 +45,7 @@ public class BossStack extends Module { public static final Map barMap = new WeakHashMap<>(); public BossStack() { - super(Categories.Render, "boss-stack", "Stacks boss bars to make your HUD less cluttered."); + super(Categories.Render, "boss-stack"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Breadcrumbs.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Breadcrumbs.java index 548423bb9a..cf33e33b72 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Breadcrumbs.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Breadcrumbs.java @@ -23,14 +23,12 @@ public class Breadcrumbs extends Module { private final Setting color = sgGeneral.add(new ColorSetting.Builder() .name("color") - .description("The color of the Breadcrumbs trail.") .defaultValue(new SettingColor(225, 25, 25)) .build() ); private final Setting maxSections = sgGeneral.add(new IntSetting.Builder() .name("max-sections") - .description("The maximum number of sections.") .defaultValue(1000) .min(1) .sliderRange(1, 5000) @@ -39,7 +37,6 @@ public class Breadcrumbs extends Module { private final Setting sectionLength = sgGeneral.add(new DoubleSetting.Builder() .name("section-length") - .description("The section length in blocks.") .defaultValue(0.5) .min(0) .sliderMax(1) @@ -54,7 +51,7 @@ public class Breadcrumbs extends Module { private DimensionType lastDimension; public Breadcrumbs() { - super(Categories.Render, "breadcrumbs", "Displays a trail behind where you have walked."); + super(Categories.Render, "breadcrumbs"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BreakIndicators.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BreakIndicators.java index cfc126e643..98b9e32642 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BreakIndicators.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BreakIndicators.java @@ -32,28 +32,24 @@ public class BreakIndicators extends Module { private final Setting shapeMode = sgGeneral.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); public final Setting packetMine = sgGeneral.add(new BoolSetting.Builder() .name("packet-mine") - .description("Whether or not to render blocks being packet mined.") .defaultValue(true) .build() ); private final Setting startColor = sgGeneral.add(new ColorSetting.Builder() .name("start-color") - .description("The color for the non-broken block.") .defaultValue(new SettingColor(25, 252, 25, 150)) .build() ); private final Setting endColor = sgGeneral.add(new ColorSetting.Builder() .name("end-color") - .description("The color for the fully-broken block.") .defaultValue(new SettingColor(255, 25, 25, 150)) .build() ); @@ -62,7 +58,7 @@ public class BreakIndicators extends Module { private final Color cLines = new Color(); public BreakIndicators() { - super(Categories.Render, "break-indicators", "Renders the progress of a block being broken."); + super(Categories.Render, "break-indicators"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CameraTweaks.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CameraTweaks.java index 6dcbccda95..dbd9b8857f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CameraTweaks.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CameraTweaks.java @@ -17,20 +17,18 @@ public class CameraTweaks extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgScrolling = settings.createGroup("Scrolling"); + private final SettingGroup sgScrolling = settings.createGroup("scrolling"); // General private final Setting clip = sgGeneral.add(new BoolSetting.Builder() .name("clip") - .description("Allows the camera to clip through blocks.") .defaultValue(true) .build() ); private final Setting cameraDistance = sgGeneral.add(new DoubleSetting.Builder() .name("camera-distance") - .description("The distance the third person camera is from the player.") .defaultValue(4) .min(0) .onChanged(value -> distance = value) @@ -41,14 +39,12 @@ public class CameraTweaks extends Module { private final Setting scrollingEnabled = sgScrolling.add(new BoolSetting.Builder() .name("scrolling") - .description("Allows you to scroll to change camera distance.") .defaultValue(true) .build() ); private final Setting scrollKeybind = sgScrolling.add(new KeybindSetting.Builder() .name("bind") - .description("Binds camera distance scrolling to a key.") .visible(scrollingEnabled::get) .defaultValue(Keybind.fromKey(GLFW.GLFW_KEY_LEFT_ALT)) .build() @@ -56,7 +52,6 @@ public class CameraTweaks extends Module { private final Setting scrollSensitivity = sgScrolling.add(new DoubleSetting.Builder() .name("sensitivity") - .description("Sensitivity of the scroll wheel when changing the cameras distance.") .visible(scrollingEnabled::get) .defaultValue(1) .min(0.01) @@ -66,7 +61,7 @@ public class CameraTweaks extends Module { public double distance; public CameraTweaks() { - super(Categories.Render, "camera-tweaks", "Allows modification of the third person camera."); + super(Categories.Render, "camera-tweaks"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Chams.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Chams.java index b1cf4e20de..57f8f8827b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Chams.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Chams.java @@ -17,30 +17,27 @@ import java.util.Set; public class Chams extends Module { - private final SettingGroup sgThroughWalls = settings.createGroup("Through Walls"); - private final SettingGroup sgPlayers = settings.createGroup("Players"); - private final SettingGroup sgCrystals = settings.createGroup("Crystals"); - private final SettingGroup sgHand = settings.createGroup("Hand"); + private final SettingGroup sgThroughWalls = settings.createGroup("through-walls"); + private final SettingGroup sgPlayers = settings.createGroup("players"); + private final SettingGroup sgCrystals = settings.createGroup("crystals"); + private final SettingGroup sgHand = settings.createGroup("hand"); // Through walls public final Setting>> entities = sgThroughWalls.add(new EntityTypeListSetting.Builder() .name("entities") - .description("Select entities to show through walls.") .onlyAttackable() .build() ); public final Setting shader = sgThroughWalls.add(new EnumSetting.Builder() .name("shader") - .description("Renders a shader over of the entities.") .defaultValue(Shader.Image) .build() ); public final Setting shaderColor = sgThroughWalls.add(new ColorSetting.Builder() .name("color") - .description("The color that the shader is drawn with.") .defaultValue(new SettingColor(255, 255, 255, 150)) .visible(() -> shader.get() != Shader.None) .build() @@ -48,7 +45,6 @@ public class Chams extends Module { public final Setting ignoreSelfDepth = sgThroughWalls.add(new BoolSetting.Builder() .name("ignore-self") - .description("Ignores yourself drawing the player.") .defaultValue(true) .build() ); @@ -57,14 +53,12 @@ public class Chams extends Module { public final Setting players = sgPlayers.add(new BoolSetting.Builder() .name("players") - .description("Enables model tweaks for players.") .defaultValue(false) .build() ); public final Setting ignoreSelf = sgPlayers.add(new BoolSetting.Builder() .name("ignore-self") - .description("Ignores yourself when tweaking player models.") .defaultValue(false) .visible(players::get) .build() @@ -72,7 +66,6 @@ public class Chams extends Module { public final Setting playersTexture = sgPlayers.add(new BoolSetting.Builder() .name("texture") - .description("Enables player model textures.") .defaultValue(false) .visible(players::get) .build() @@ -80,7 +73,6 @@ public class Chams extends Module { public final Setting playersColor = sgPlayers.add(new ColorSetting.Builder() .name("color") - .description("The color of player models.") .defaultValue(new SettingColor(198, 135, 254, 150)) .visible(players::get) .build() @@ -88,7 +80,6 @@ public class Chams extends Module { public final Setting playersScale = sgPlayers.add(new DoubleSetting.Builder() .name("scale") - .description("Players scale.") .defaultValue(1.0) .min(0.0) .visible(players::get) @@ -99,14 +90,12 @@ public class Chams extends Module { public final Setting crystals = sgCrystals.add(new BoolSetting.Builder() .name("crystals") - .description("Enables model tweaks for end crystals.") .defaultValue(false) .build() ); public final Setting crystalsScale = sgCrystals.add(new DoubleSetting.Builder() .name("scale") - .description("Crystal scale.") .defaultValue(0.6) .min(0) .visible(crystals::get) @@ -115,7 +104,6 @@ public class Chams extends Module { public final Setting crystalsBounce = sgCrystals.add(new DoubleSetting.Builder() .name("bounce") - .description("How high crystals bounce.") .defaultValue(0.6) .min(0.0) .visible(crystals::get) @@ -124,7 +112,6 @@ public class Chams extends Module { public final Setting crystalsRotationSpeed = sgCrystals.add(new DoubleSetting.Builder() .name("rotation-speed") - .description("Multiplies the rotation speed of the crystal.") .defaultValue(0.3) .min(0) .visible(crystals::get) @@ -133,7 +120,6 @@ public class Chams extends Module { public final Setting crystalsTexture = sgCrystals.add(new BoolSetting.Builder() .name("texture") - .description("Whether to render crystal model textures.") .defaultValue(true) .visible(crystals::get) .build() @@ -141,7 +127,6 @@ public class Chams extends Module { public final Setting crystalsColor = sgCrystals.add(new ColorSetting.Builder() .name("crystal-color") - .description("The color of the of the crystal.") .defaultValue(new SettingColor(198, 135, 254, 255)) .visible(crystals::get) .build() @@ -151,14 +136,12 @@ public class Chams extends Module { public final Setting hand = sgHand.add(new BoolSetting.Builder() .name("enabled") - .description("Enables tweaks of hand rendering.") .defaultValue(false) .build() ); public final Setting handTexture = sgHand.add(new BoolSetting.Builder() .name("texture") - .description("Whether to render hand textures.") .defaultValue(false) .visible(hand::get) .build() @@ -166,7 +149,6 @@ public class Chams extends Module { public final Setting handColor = sgHand.add(new ColorSetting.Builder() .name("hand-color") - .description("The color of your hand.") .defaultValue(new SettingColor(198, 135, 254, 150)) .visible(hand::get) .build() @@ -175,7 +157,7 @@ public class Chams extends Module { public static final Identifier BLANK = MeteorClient.identifier("textures/blank.png"); public Chams() { - super(Categories.Render, "chams", "Tweaks rendering of entities."); + super(Categories.Render, "chams"); } public boolean shouldRender(Entity entity) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CityESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CityESP.java index 6d9816db96..ff809525eb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CityESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CityESP.java @@ -23,27 +23,24 @@ import net.minecraft.util.math.BlockPos; public class CityESP extends Module { - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgRender = settings.createGroup("render"); // Render private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The side color of the rendering.") .defaultValue(new SettingColor(225, 0, 0, 75)) .build() ); private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The line color of the rendering.") .defaultValue(new SettingColor(225, 0, 0, 255)) .build() ); @@ -51,7 +48,7 @@ public class CityESP extends Module { private BlockPos target; public CityESP() { - super(Categories.Render, "city-esp", "Displays blocks that can be broken in order to city another player."); + super(Categories.Render, "city-esp"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java index 796ca5dd4d..28dfa43eb6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java @@ -33,27 +33,24 @@ public class ESP extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgColors = settings.createGroup("Colors"); + private final SettingGroup sgColors = settings.createGroup("colors"); // General public final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("Rendering mode.") .defaultValue(Mode.Shader) .build() ); public final Setting highlightTarget = sgGeneral.add(new BoolSetting.Builder() .name("highlight-target") - .description("highlights the currently targeted entity differently") .defaultValue(false) .build() ); public final Setting targetHitbox = sgGeneral.add(new BoolSetting.Builder() .name("target-hitbox") - .description("draw the hitbox of the target entity") .defaultValue(true) .visible(highlightTarget::get) .build() @@ -61,7 +58,6 @@ public class ESP extends Module { public final Setting outlineWidth = sgGeneral.add(new IntSetting.Builder() .name("outline-width") - .description("The width of the shader outline.") .visible(() -> mode.get() == Mode.Shader) .defaultValue(2) .range(1, 10) @@ -71,7 +67,6 @@ public class ESP extends Module { public final Setting glowMultiplier = sgGeneral.add(new DoubleSetting.Builder() .name("glow-multiplier") - .description("Multiplier for glow effect") .visible(() -> mode.get() == Mode.Shader) .decimalPlaces(3) .defaultValue(3.5) @@ -82,14 +77,12 @@ public class ESP extends Module { public final Setting ignoreSelf = sgGeneral.add(new BoolSetting.Builder() .name("ignore-self") - .description("Ignores yourself drawing the shader.") .defaultValue(true) .build() ); public final Setting shapeMode = sgGeneral.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .visible(() -> mode.get() != Mode.Glow) .defaultValue(ShapeMode.Both) .build() @@ -97,7 +90,6 @@ public class ESP extends Module { public final Setting fillOpacity = sgGeneral.add(new DoubleSetting.Builder() .name("fill-opacity") - .description("The opacity of the shape fill.") .visible(() -> shapeMode.get() != ShapeMode.Lines && mode.get() != Mode.Glow) .defaultValue(0.3) .range(0, 1) @@ -107,7 +99,6 @@ public class ESP extends Module { private final Setting fadeDistance = sgGeneral.add(new DoubleSetting.Builder() .name("fade-distance") - .description("The distance from an entity where the color begins to fade.") .defaultValue(3) .min(0) .sliderMax(12) @@ -116,7 +107,6 @@ public class ESP extends Module { private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("entities") - .description("Select specific entities.") .defaultValue(EntityType.PLAYER) .build() ); @@ -125,14 +115,12 @@ public class ESP extends Module { public final Setting distance = sgColors.add(new BoolSetting.Builder() .name("distance-colors") - .description("Changes the color of tracers depending on distance.") .defaultValue(false) .build() ); public final Setting friendOverride = sgColors.add(new BoolSetting.Builder() .name("show-friend-colors") - .description("Whether or not to override the distance color of friends with the friend color.") .defaultValue(true) .visible(distance::get) .build() @@ -140,7 +128,6 @@ public class ESP extends Module { private final Setting playersColor = sgColors.add(new ColorSetting.Builder() .name("players-color") - .description("The other player's color.") .defaultValue(new SettingColor(255, 255, 255)) .visible(() -> !distance.get()) .build() @@ -148,7 +135,6 @@ public class ESP extends Module { private final Setting animalsColor = sgColors.add(new ColorSetting.Builder() .name("animals-color") - .description("The animal's color.") .defaultValue(new SettingColor(25, 255, 25, 255)) .visible(() -> !distance.get()) .build() @@ -156,7 +142,6 @@ public class ESP extends Module { private final Setting waterAnimalsColor = sgColors.add(new ColorSetting.Builder() .name("water-animals-color") - .description("The water animal's color.") .defaultValue(new SettingColor(25, 25, 255, 255)) .visible(() -> !distance.get()) .build() @@ -164,7 +149,6 @@ public class ESP extends Module { private final Setting monstersColor = sgColors.add(new ColorSetting.Builder() .name("monsters-color") - .description("The monster's color.") .defaultValue(new SettingColor(255, 25, 25, 255)) .visible(() -> !distance.get()) .build() @@ -172,7 +156,6 @@ public class ESP extends Module { private final Setting ambientColor = sgColors.add(new ColorSetting.Builder() .name("ambient-color") - .description("The ambient's color.") .defaultValue(new SettingColor(25, 25, 25, 255)) .visible(() -> !distance.get()) .build() @@ -180,7 +163,6 @@ public class ESP extends Module { private final Setting miscColor = sgColors.add(new ColorSetting.Builder() .name("misc-color") - .description("The misc color.") .defaultValue(new SettingColor(175, 175, 175, 255)) .visible(() -> !distance.get()) .build() @@ -188,7 +170,6 @@ public class ESP extends Module { private final Setting targetColor = sgColors.add(new ColorSetting.Builder() .name("target-color") - .description("The target color.") .defaultValue(new SettingColor(200, 200, 200, 255)) .visible(highlightTarget::get) .build() @@ -196,7 +177,6 @@ public class ESP extends Module { private final Setting targetHitboxColor = sgColors.add(new ColorSetting.Builder() .name("target-hitbox-color") - .description("The target hitbox color.") .defaultValue(new SettingColor(100, 200, 200, 255)) .visible(() -> highlightTarget.get() && targetHitbox.get()) .build() @@ -213,7 +193,7 @@ public class ESP extends Module { private int count; public ESP() { - super(Categories.Render, "esp", "Renders entities through walls."); + super(Categories.Render, "esp"); } // Box diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java index 7e7b8dfb3f..768f2266df 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/EntityOwner.java @@ -41,7 +41,6 @@ public class EntityOwner extends Module { private final Setting scale = sgGeneral.add(new DoubleSetting.Builder() .name("scale") - .description("The scale of the text.") .defaultValue(1) .min(0) .build() @@ -51,7 +50,7 @@ public class EntityOwner extends Module { private final Map uuidToName = new HashMap<>(); public EntityOwner() { - super(Categories.Render, "entity-owner", "Displays the name of the player who owns the entity you're looking at."); + super(Categories.Render, "entity-owner"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/FreeLook.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/FreeLook.java index 8e78bba0e8..4df12afd78 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/FreeLook.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/FreeLook.java @@ -17,27 +17,24 @@ public class FreeLook extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgArrows = settings.createGroup("Arrows"); + private final SettingGroup sgArrows = settings.createGroup("arrows"); // General public final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("Which entity to rotate.") .defaultValue(Mode.Player) .build() ); public final Setting togglePerspective = sgGeneral.add(new BoolSetting.Builder() .name("toggle-perspective") - .description("Changes your perspective on toggle.") .defaultValue(true) .build() ); public final Setting sensitivity = sgGeneral.add(new DoubleSetting.Builder() .name("camera-sensitivity") - .description("How fast the camera moves in camera mode.") .defaultValue(8) .min(0) .sliderMax(10) @@ -48,14 +45,12 @@ public class FreeLook extends Module { public final Setting arrows = sgArrows.add(new BoolSetting.Builder() .name("arrows-control-opposite") - .description("Allows you to control the other entities rotation with the arrow keys.") .defaultValue(true) .build() ); private final Setting arrowSpeed = sgArrows.add(new DoubleSetting.Builder() .name("arrow-speed") - .description("Rotation speed with arrow keys.") .defaultValue(4) .min(0) .build() @@ -67,7 +62,7 @@ public class FreeLook extends Module { private Perspective prePers; public FreeLook() { - super(Categories.Render, "free-look", "Allows more rotation options in third person."); + super(Categories.Render, "free-look"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java index a07806d4d1..2472c05a4b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java @@ -51,11 +51,10 @@ public class Freecam extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgPathing = settings.createGroup("Pathing"); + private final SettingGroup sgPathing = settings.createGroup("pathing"); private final Setting speed = sgGeneral.add(new DoubleSetting.Builder() .name("speed") - .description("Your speed while in freecam.") .onChanged(aDouble -> speedValue = aDouble) .defaultValue(1.0) .min(0.0) @@ -64,7 +63,6 @@ public class Freecam extends Module { private final Setting speedScrollSensitivity = sgGeneral.add(new DoubleSetting.Builder() .name("speed-scroll-sensitivity") - .description("Allows you to change speed value using scroll wheel. 0 to disable.") .defaultValue(0) .min(0) .sliderMax(2) @@ -73,70 +71,60 @@ public class Freecam extends Module { private final Setting staySneaking = sgGeneral.add(new BoolSetting.Builder() .name("stay-sneaking") - .description("If you are sneaking when you enter freecam, whether your player should remain sneaking.") .defaultValue(true) .build() ); private final Setting toggleOnDamage = sgGeneral.add(new BoolSetting.Builder() .name("toggle-on-damage") - .description("Disables freecam when you take damage.") .defaultValue(false) .build() ); private final Setting toggleOnDeath = sgGeneral.add(new BoolSetting.Builder() .name("toggle-on-death") - .description("Disables freecam when you die.") .defaultValue(false) .build() ); private final Setting toggleOnLog = sgGeneral.add(new BoolSetting.Builder() .name("toggle-on-log") - .description("Disables freecam when you disconnect from a server.") .defaultValue(true) .build() ); private final Setting reloadChunks = sgGeneral.add(new BoolSetting.Builder() .name("reload-chunks") - .description("Disables cave culling.") .defaultValue(true) .build() ); private final Setting renderHands = sgGeneral.add(new BoolSetting.Builder() .name("show-hands") - .description("Whether or not to render your hands in freecam.") .defaultValue(true) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Rotates to the block or entity you are looking at.") .defaultValue(false) .build() ); private final Setting staticView = sgGeneral.add(new BoolSetting.Builder() .name("static") - .description("Disables settings that move the view.") .defaultValue(true) .build() ); private final Setting baritoneClick = sgPathing.add(new BoolSetting.Builder() .name("click-to-path") - .description("Sets a pathfinding goal to any block/entity you click at.") .defaultValue(false) .build() ); private final Setting requireDoubleClick = sgPathing.add(new BoolSetting.Builder() .name("double-click") - .description("Require two clicks to start pathing.") .defaultValue(false) .build() ); @@ -158,7 +146,7 @@ public class Freecam extends Module { private long clickTs = 0; public Freecam() { - super(Categories.Render, "freecam", "Allows the camera to move away from the player."); + super(Categories.Render, "freecam"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Fullbright.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Fullbright.java index 0dbdb00dfd..edee06e057 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Fullbright.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Fullbright.java @@ -24,7 +24,6 @@ public class Fullbright extends Module { public final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("The mode to use for Fullbright.") .defaultValue(Mode.Gamma) .onChanged(mode -> { if (isActive()) { @@ -37,7 +36,6 @@ public class Fullbright extends Module { public final Setting lightType = sgGeneral.add(new EnumSetting.Builder() .name("light-type") - .description("Which type of light to use for Luminance mode.") .defaultValue(LightType.BLOCK) .visible(() -> mode.get() == Mode.Luminance) .onChanged(integer -> { @@ -48,7 +46,6 @@ public class Fullbright extends Module { private final Setting minimumLightLevel = sgGeneral.add(new IntSetting.Builder() .name("minimum-light-level") - .description("Minimum light level when using Luminance mode.") .visible(() -> mode.get() == Mode.Luminance) .defaultValue(8) .range(0, 15) @@ -60,7 +57,7 @@ public class Fullbright extends Module { ); public Fullbright() { - super(Categories.Render, "fullbright", "Lights up your world!"); + super(Categories.Render, "fullbright"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HandView.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HandView.java index 214054d993..0d230a04b9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HandView.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HandView.java @@ -19,50 +19,44 @@ public class HandView extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgMainHand = settings.createGroup("Main Hand"); - private final SettingGroup sgOffHand = settings.createGroup("Off Hand"); - private final SettingGroup sgArm = settings.createGroup("Arm"); + private final SettingGroup sgMainHand = settings.createGroup("main-hand"); + private final SettingGroup sgOffHand = settings.createGroup("off-hand"); + private final SettingGroup sgArm = settings.createGroup("arm"); // General private final Setting followRotations = sgGeneral.add(new BoolSetting.Builder() .name("server-rotations") - .description("Makes your hands follow your serverside rotations.") .defaultValue(false) .build() ); public final Setting oldAnimations = sgGeneral.add(new BoolSetting.Builder() .name("old-animations") - .description("Changes hit animations to those like 1.8") .defaultValue(false) .build() ); public final Setting skipSwapping = sgGeneral.add(new BoolSetting.Builder() .name("skip-swapping-animation") - .description("Whether or not to skip the item swapping animation") .defaultValue(false) .build() ); private final Setting disableFoodAnimation = sgGeneral.add(new BoolSetting.Builder() .name("disable-eating-animation") - .description("Disables the eating animation. Potentially desirable if it goes offscreen.") .defaultValue(false) .build() ); public final Setting swingMode = sgGeneral.add(new EnumSetting.Builder() .name("swing-mode") - .description("Modifies your client & server hand swinging.") .defaultValue(SwingMode.None) .build() ); public final Setting swingSpeed = sgGeneral.add(new IntSetting.Builder() .name("swing-speed") - .description("The swing speed of your hands.") .defaultValue(6) .range(0, 20) .sliderMax(20) @@ -71,7 +65,6 @@ public class HandView extends Module { public final Setting mainSwing = sgGeneral.add(new DoubleSetting.Builder() .name("main-hand-progress") - .description("The swing progress of your main hand.") .defaultValue(0) .range(0, 1) .sliderMax(1) @@ -80,7 +73,6 @@ public class HandView extends Module { public final Setting offSwing = sgGeneral.add(new DoubleSetting.Builder() .name("off-hand-progress") - .description("The swing progress of your off hand.") .defaultValue(0) .range(0, 1) .sliderMax(1) @@ -91,7 +83,6 @@ public class HandView extends Module { private final Setting scaleMain = sgMainHand.add(new Vector3dSetting.Builder() .name("scale") - .description("The scale of your main hand.") .defaultValue(1, 1, 1) .sliderMax(5) .decimalPlaces(1) @@ -100,7 +91,6 @@ public class HandView extends Module { private final Setting posMain = sgMainHand.add(new Vector3dSetting.Builder() .name("position") - .description("The position of your main hand.") .defaultValue(0, 0, 0) .sliderRange(-3, 3) .decimalPlaces(1) @@ -109,7 +99,6 @@ public class HandView extends Module { private final Setting rotMain = sgMainHand.add(new Vector3dSetting.Builder() .name("rotation") - .description("The rotation of your main hand.") .defaultValue(0, 0, 0) .sliderRange(-180, 180) .decimalPlaces(0) @@ -120,7 +109,6 @@ public class HandView extends Module { private final Setting scaleOff = sgOffHand.add(new Vector3dSetting.Builder() .name("scale") - .description("The scale of your off hand.") .defaultValue(1, 1, 1) .sliderMax(5) .decimalPlaces(1) @@ -129,7 +117,6 @@ public class HandView extends Module { private final Setting posOff = sgOffHand.add(new Vector3dSetting.Builder() .name("position") - .description("The position of your off hand.") .defaultValue(0, 0, 0) .sliderRange(-3, 3) .decimalPlaces(1) @@ -138,7 +125,6 @@ public class HandView extends Module { private final Setting rotOff = sgOffHand.add(new Vector3dSetting.Builder() .name("rotation") - .description("The rotation of your off hand.") .defaultValue(0, 0, 0) .sliderRange(-180, 180) .decimalPlaces(0) @@ -172,7 +158,7 @@ public class HandView extends Module { ); public HandView() { - super(Categories.Render, "hand-view", "Alters the way items are rendered in your hands."); + super(Categories.Render, "hand-view"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HoleESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HoleESP.java index a2893ded8c..db12ec4155 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HoleESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HoleESP.java @@ -32,13 +32,12 @@ public class HoleESP extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General private final Setting horizontalRadius = sgGeneral.add(new IntSetting.Builder() .name("horizontal-radius") - .description("Horizontal radius in which to search for holes.") .defaultValue(10) .min(0) .sliderMax(32) @@ -47,7 +46,6 @@ public class HoleESP extends Module { private final Setting verticalRadius = sgGeneral.add(new IntSetting.Builder() .name("vertical-radius") - .description("Vertical radius in which to search for holes.") .defaultValue(5) .min(0) .sliderMax(32) @@ -56,7 +54,6 @@ public class HoleESP extends Module { private final Setting holeHeight = sgGeneral.add(new IntSetting.Builder() .name("min-height") - .description("Minimum hole height required to be rendered.") .defaultValue(3) .min(1) .sliderMin(1) @@ -65,21 +62,18 @@ public class HoleESP extends Module { private final Setting doubles = sgGeneral.add(new BoolSetting.Builder() .name("doubles") - .description("Highlights double holes that can be stood across.") .defaultValue(true) .build() ); private final Setting ignoreOwn = sgGeneral.add(new BoolSetting.Builder() .name("ignore-own") - .description("Ignores rendering the hole you are currently standing in.") .defaultValue(false) .build() ); private final Setting webs = sgGeneral.add(new BoolSetting.Builder() .name("webs") - .description("Whether to show holes that have webs inside of them.") .defaultValue(false) .build() ); @@ -88,14 +82,12 @@ public class HoleESP extends Module { private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting height = sgRender.add(new DoubleSetting.Builder() .name("height") - .description("The height of rendering.") .defaultValue(0.2) .min(0) .build() @@ -103,56 +95,48 @@ public class HoleESP extends Module { private final Setting topQuad = sgRender.add(new BoolSetting.Builder() .name("top-quad") - .description("Whether to render a quad at the top of the hole.") .defaultValue(true) .build() ); private final Setting bottomQuad = sgRender.add(new BoolSetting.Builder() .name("bottom-quad") - .description("Whether to render a quad at the bottom of the hole.") .defaultValue(false) .build() ); private final Setting bedrockColorTop = sgRender.add(new ColorSetting.Builder() .name("bedrock-top") - .description("The top color for holes that are completely bedrock.") .defaultValue(new SettingColor(100, 255, 0, 200)) .build() ); private final Setting bedrockColorBottom = sgRender.add(new ColorSetting.Builder() .name("bedrock-bottom") - .description("The bottom color for holes that are completely bedrock.") .defaultValue(new SettingColor(100, 255, 0, 0)) .build() ); private final Setting obsidianColorTop = sgRender.add(new ColorSetting.Builder() .name("obsidian-top") - .description("The top color for holes that are completely obsidian.") .defaultValue(new SettingColor(255, 0, 0, 200)) .build() ); private final Setting obsidianColorBottom = sgRender.add(new ColorSetting.Builder() .name("obsidian-bottom") - .description("The bottom color for holes that are completely obsidian.") .defaultValue(new SettingColor(255, 0, 0, 0)) .build() ); private final Setting mixedColorTop = sgRender.add(new ColorSetting.Builder() .name("mixed-top") - .description("The top color for holes that have mixed bedrock and obsidian.") .defaultValue(new SettingColor(255, 127, 0, 200)) .build() ); private final Setting mixedColorBottom = sgRender.add(new ColorSetting.Builder() .name("mixed-bottom") - .description("The bottom color for holes that have mixed bedrock and obsidian.") .defaultValue(new SettingColor(255, 127, 0, 0)) .build() ); @@ -163,7 +147,7 @@ public class HoleESP extends Module { private final byte NULL = 0; public HoleESP() { - super(Categories.Render, "hole-esp", "Displays holes that you will take less damage in."); + super(Categories.Render, "hole-esp"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemHighlight.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemHighlight.java index 3b4d786bb1..427f25c0bd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemHighlight.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemHighlight.java @@ -22,19 +22,17 @@ public class ItemHighlight extends Module { private final Setting> items = sgGeneral.add(new ItemListSetting.Builder() .name("items") - .description("Items to highlight.") .build() ); private final Setting color = sgGeneral.add(new ColorSetting.Builder() .name("color") - .description("The color to highlight the items with.") .defaultValue(new SettingColor(225, 25, 255, 50)) .build() ); public ItemHighlight() { - super(Categories.Render, "item-highlight", "Highlights selected items when in guis"); + super(Categories.Render, "item-highlight"); } public int getColor(ItemStack stack) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java index 8c979a3977..71033b928d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java @@ -35,7 +35,6 @@ public class ItemPhysics extends Module { private final Setting randomRotation = sgGeneral.add(new BoolSetting.Builder() .name("random-rotation") - .description("Adds a random rotation to every item.") .defaultValue(true) .build() ); @@ -44,7 +43,7 @@ public class ItemPhysics extends Module { private boolean skipTransformation; public ItemPhysics() { - super(Categories.Render, "item-physics", "Applies physics to items on the ground."); + super(Categories.Render, "item-physics"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LightOverlay.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LightOverlay.java index 2bccfec04b..26c2d7e0e0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LightOverlay.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LightOverlay.java @@ -24,13 +24,12 @@ public class LightOverlay extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgColors = settings.createGroup("Colors"); + private final SettingGroup sgColors = settings.createGroup("colors"); // General private final Setting horizontalRange = sgGeneral.add(new IntSetting.Builder() .name("horizontal-range") - .description("Horizontal range in blocks.") .defaultValue(8) .min(0) .build() @@ -38,7 +37,6 @@ public class LightOverlay extends Module { private final Setting verticalRange = sgGeneral.add(new IntSetting.Builder() .name("vertical-range") - .description("Vertical range in blocks.") .defaultValue(4) .min(0) .build() @@ -46,14 +44,12 @@ public class LightOverlay extends Module { private final Setting seeThroughBlocks = sgGeneral.add(new BoolSetting.Builder() .name("see-through-blocks") - .description("Allows you to see the lines through blocks.") .defaultValue(false) .build() ); private final Setting lightLevel = sgGeneral.add(new IntSetting.Builder() .name("light-level") - .description("Which light levels to render. Old spawning light: 7.") .defaultValue(0) .min(0) .sliderMax(15) @@ -64,14 +60,12 @@ public class LightOverlay extends Module { private final Setting color = sgColors.add(new ColorSetting.Builder() .name("color") - .description("Color of places where mobs can currently spawn.") .defaultValue(new SettingColor(225, 25, 25)) .build() ); private final Setting potentialColor = sgColors.add(new ColorSetting.Builder() .name("potential-color") - .description("Color of places where mobs can potentially spawn (eg at night).") .defaultValue(new SettingColor(225, 225, 25)) .build() ); @@ -80,7 +74,7 @@ public class LightOverlay extends Module { private final List crosses = new ArrayList<>(); public LightOverlay() { - super(Categories.Render, "light-overlay", "Shows blocks where mobs can spawn."); + super(Categories.Render, "light-overlay"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java index cdfaa7adda..153c369073 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java @@ -36,13 +36,12 @@ public class LogoutSpots extends Module { private static final Color RED = new Color(225, 25, 25); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General private final Setting scale = sgGeneral.add(new DoubleSetting.Builder() .name("scale") - .description("The scale.") .defaultValue(1) .min(0) .build() @@ -50,7 +49,6 @@ public class LogoutSpots extends Module { private final Setting fullHeight = sgGeneral.add(new BoolSetting.Builder() .name("full-height") - .description("Displays the height as the player's full height.") .defaultValue(true) .build() ); @@ -59,35 +57,30 @@ public class LogoutSpots extends Module { private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The side color.") .defaultValue(new SettingColor(255, 0, 255, 55)) .build() ); private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The line color.") .defaultValue(new SettingColor(255, 0, 255)) .build() ); private final Setting nameColor = sgRender.add(new ColorSetting.Builder() .name("name-color") - .description("The name color.") .defaultValue(new SettingColor(255, 255, 255)) .build() ); private final Setting nameBackgroundColor = sgRender.add(new ColorSetting.Builder() .name("name-background-color") - .description("The name background color.") .defaultValue(new SettingColor(0, 0, 0, 75)) .build() ); @@ -101,7 +94,7 @@ public class LogoutSpots extends Module { private DimensionType lastDimension; public LogoutSpots() { - super(Categories.Render, "logout-spots", "Displays a box where another player has logged out at."); + super(Categories.Render, "logout-spots"); lineColor.onChanged(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java index 7740d17ae4..78944ccd3c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java @@ -49,22 +49,20 @@ public class Nametags extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgPlayers = settings.createGroup("Players"); - private final SettingGroup sgItems = settings.createGroup("Items"); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgPlayers = settings.createGroup("players"); + private final SettingGroup sgItems = settings.createGroup("items"); + private final SettingGroup sgRender = settings.createGroup("render"); // General private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("entities") - .description("Select entities to draw nametags on.") .defaultValue(EntityType.PLAYER, EntityType.ITEM) .build() ); private final Setting scale = sgGeneral.add(new DoubleSetting.Builder() .name("scale") - .description("The scale of the nametag.") .defaultValue(1.1) .min(0.1) .build() @@ -72,35 +70,30 @@ public class Nametags extends Module { private final Setting ignoreSelf = sgGeneral.add(new BoolSetting.Builder() .name("ignore-self") - .description("Ignore yourself when in third person or freecam.") .defaultValue(true) .build() ); private final Setting ignoreFriends = sgGeneral.add(new BoolSetting.Builder() .name("ignore-friends") - .description("Ignore rendering nametags for friends.") .defaultValue(false) .build() ); private final Setting ignoreBots = sgGeneral.add(new BoolSetting.Builder() .name("ignore-bots") - .description("Only render non-bot nametags.") .defaultValue(true) .build() ); private final Setting culling = sgGeneral.add(new BoolSetting.Builder() .name("culling") - .description("Only render a certain number of nametags at a certain distance.") .defaultValue(false) .build() ); private final Setting maxCullRange = sgGeneral.add(new DoubleSetting.Builder() .name("culling-range") - .description("Only render nametags within this distance of your player.") .defaultValue(20) .min(0) .sliderMax(200) @@ -110,7 +103,6 @@ public class Nametags extends Module { private final Setting maxCullCount = sgGeneral.add(new IntSetting.Builder() .name("culling-count") - .description("Only render this many nametags.") .defaultValue(50) .min(1) .sliderRange(1, 100) @@ -122,42 +114,36 @@ public class Nametags extends Module { private final Setting displayHealth = sgPlayers.add(new BoolSetting.Builder() .name("health") - .description("Shows the player's health.") .defaultValue(true) .build() ); private final Setting displayGameMode = sgPlayers.add(new BoolSetting.Builder() .name("gamemode") - .description("Shows the player's GameMode.") .defaultValue(false) .build() ); private final Setting displayDistance = sgPlayers.add(new BoolSetting.Builder() .name("distance") - .description("Shows the distance between you and the player.") .defaultValue(false) .build() ); private final Setting displayPing = sgPlayers.add(new BoolSetting.Builder() .name("ping") - .description("Shows the player's ping.") .defaultValue(true) .build() ); private final Setting displayItems = sgPlayers.add(new BoolSetting.Builder() .name("items") - .description("Displays armor and hand items above the name tags.") .defaultValue(true) .build() ); private final Setting itemSpacing = sgPlayers.add(new DoubleSetting.Builder() .name("item-spacing") - .description("The spacing between items.") .defaultValue(2) .range(0, 10) .visible(displayItems::get) @@ -166,7 +152,6 @@ public class Nametags extends Module { private final Setting ignoreEmpty = sgPlayers.add(new BoolSetting.Builder() .name("ignore-empty-slots") - .description("Doesn't add spacing where an empty item stack would be.") .defaultValue(true) .visible(displayItems::get) .build() @@ -174,7 +159,6 @@ public class Nametags extends Module { private final Setting itemDurability = sgPlayers.add(new EnumSetting.Builder() .name("durability") - .description("Displays item durability as either a total, percentage, or neither.") .defaultValue(Durability.None) .visible(displayItems::get) .build() @@ -182,7 +166,6 @@ public class Nametags extends Module { private final Setting displayEnchants = sgPlayers.add(new BoolSetting.Builder() .name("display-enchants") - .description("Displays item enchantments on the items.") .defaultValue(false) .visible(displayItems::get) .build() @@ -190,7 +173,6 @@ public class Nametags extends Module { private final Setting>> shownEnchantments = sgPlayers.add(new EnchantmentListSetting.Builder() .name("shown-enchantments") - .description("The enchantments that are shown on nametags.") .visible(() -> displayItems.get() && displayEnchants.get()) .defaultValue( Enchantments.PROTECTION, @@ -203,7 +185,6 @@ public class Nametags extends Module { private final Setting enchantPos = sgPlayers.add(new EnumSetting.Builder() .name("enchantment-position") - .description("Where the enchantments are rendered.") .defaultValue(Position.Above) .visible(() -> displayItems.get() && displayEnchants.get()) .build() @@ -211,7 +192,6 @@ public class Nametags extends Module { private final Setting enchantLength = sgPlayers.add(new IntSetting.Builder() .name("enchant-name-length") - .description("The length enchantment names are trimmed to.") .defaultValue(3) .range(1, 5) .sliderRange(1, 5) @@ -221,7 +201,6 @@ public class Nametags extends Module { private final Setting enchantTextScale = sgPlayers.add(new DoubleSetting.Builder() .name("enchant-text-scale") - .description("The scale of the enchantment text.") .defaultValue(1) .range(0.1, 2) .sliderRange(0.1, 2) @@ -233,7 +212,6 @@ public class Nametags extends Module { private final Setting itemCount = sgItems.add(new BoolSetting.Builder() .name("show-count") - .description("Displays the number of items in the stack.") .defaultValue(true) .build() ); @@ -242,21 +220,18 @@ public class Nametags extends Module { private final Setting background = sgRender.add(new ColorSetting.Builder() .name("background-color") - .description("The color of the nametag background.") .defaultValue(new SettingColor(0, 0, 0, 75)) .build() ); private final Setting nameColor = sgRender.add(new ColorSetting.Builder() .name("name-color") - .description("The color of the nametag names.") .defaultValue(new SettingColor()) .build() ); private final Setting pingColor = sgRender.add(new ColorSetting.Builder() .name("ping-color") - .description("The color of the nametag ping.") .defaultValue(new SettingColor(20, 170, 170)) .visible(displayPing::get) .build() @@ -264,7 +239,6 @@ public class Nametags extends Module { private final Setting gamemodeColor = sgRender.add(new ColorSetting.Builder() .name("gamemode-color") - .description("The color of the nametag gamemode.") .defaultValue(new SettingColor(232, 185, 35)) .visible(displayGameMode::get) .build() @@ -272,7 +246,6 @@ public class Nametags extends Module { private final Setting distanceColorMode = sgRender.add(new EnumSetting.Builder() .name("distance-color-mode") - .description("The mode to color the nametag distance with.") .defaultValue(DistanceColorMode.Gradient) .visible(displayDistance::get) .build() @@ -280,7 +253,6 @@ public class Nametags extends Module { private final Setting distanceColor = sgRender.add(new ColorSetting.Builder() .name("distance-color") - .description("The color of the nametag distance.") .defaultValue(new SettingColor(150, 150, 150)) .visible(() -> displayDistance.get() && distanceColorMode.get() == DistanceColorMode.Flat) .build() @@ -298,7 +270,7 @@ public class Nametags extends Module { private final List entityList = new ArrayList<>(); public Nametags() { - super(Categories.Render, "nametags", "Displays customizable nametags above players, items and other entities."); + super(Categories.Render, "nametags"); } private static String ticksToTime(int ticks) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java index 145a1ee45a..9cd1bc0a1f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java @@ -24,100 +24,87 @@ import java.util.Set; public class NoRender extends Module { - private final SettingGroup sgOverlay = settings.createGroup("Overlay"); - private final SettingGroup sgHUD = settings.createGroup("HUD"); - private final SettingGroup sgWorld = settings.createGroup("World"); - private final SettingGroup sgEntity = settings.createGroup("Entity"); + private final SettingGroup sgOverlay = settings.createGroup("overlay"); + private final SettingGroup sgHUD = settings.createGroup("hud"); + private final SettingGroup sgWorld = settings.createGroup("world"); + private final SettingGroup sgEntity = settings.createGroup("entity"); // Overlay private final Setting noPortalOverlay = sgOverlay.add(new BoolSetting.Builder() .name("portal-overlay") - .description("Disables rendering of the nether portal overlay.") .defaultValue(false) .build() ); private final Setting noSpyglassOverlay = sgOverlay.add(new BoolSetting.Builder() .name("spyglass-overlay") - .description("Disables rendering of the spyglass overlay.") .defaultValue(false) .build() ); private final Setting noNausea = sgOverlay.add(new BoolSetting.Builder() .name("nausea") - .description("Disables rendering of the nausea overlay.") .defaultValue(false) .build() ); private final Setting noPumpkinOverlay = sgOverlay.add(new BoolSetting.Builder() .name("pumpkin-overlay") - .description("Disables rendering of the pumpkin head overlay") .defaultValue(false) .build() ); private final Setting noPowderedSnowOverlay = sgOverlay.add(new BoolSetting.Builder() .name("powdered-snow-overlay") - .description("Disables rendering of the powdered snow overlay.") .defaultValue(false) .build() ); private final Setting noFireOverlay = sgOverlay.add(new BoolSetting.Builder() .name("fire-overlay") - .description("Disables rendering of the fire overlay.") .defaultValue(false) .build() ); private final Setting noLiquidOverlay = sgOverlay.add(new BoolSetting.Builder() .name("liquid-overlay") - .description("Disables rendering of the liquid overlay.") .defaultValue(false) .build() ); private final Setting noInWallOverlay = sgOverlay.add(new BoolSetting.Builder() .name("in-wall-overlay") - .description("Disables rendering of the overlay when inside blocks.") .defaultValue(false) .build() ); private final Setting noVignette = sgOverlay.add(new BoolSetting.Builder() .name("vignette") - .description("Disables rendering of the vignette overlay.") .defaultValue(false) .build() ); private final Setting noGuiBackground = sgOverlay.add(new BoolSetting.Builder() .name("gui-background") - .description("Disables rendering of the GUI background overlay.") .defaultValue(false) .build() ); private final Setting noTotemAnimation = sgOverlay.add(new BoolSetting.Builder() .name("totem-animation") - .description("Disables rendering of the totem animation when you pop a totem.") .defaultValue(false) .build() ); private final Setting noEatParticles = sgOverlay.add(new BoolSetting.Builder() .name("eating-particles") - .description("Disables rendering of eating particles.") .defaultValue(false) .build() ); private final Setting noEnchantGlint = sgOverlay.add(new BoolSetting.Builder() .name("enchantment-glint") - .description("Disables rending of the enchantment glint.") .defaultValue(false) .build() ); @@ -126,55 +113,47 @@ public class NoRender extends Module { private final Setting noBossBar = sgHUD.add(new BoolSetting.Builder() .name("boss-bar") - .description("Disable rendering of boss bars.") .defaultValue(false) .build() ); private final Setting noScoreboard = sgHUD.add(new BoolSetting.Builder() .name("scoreboard") - .description("Disable rendering of the scoreboard.") .defaultValue(false) .build() ); private final Setting noCrosshair = sgHUD.add(new BoolSetting.Builder() .name("crosshair") - .description("Disables rendering of the crosshair.") .defaultValue(false) .build() ); private final Setting noTitle = sgHUD.add(new BoolSetting.Builder() .name("title") - .description("Disables rendering of the title.") .defaultValue(false) .build() ); private final Setting noHeldItemName = sgHUD.add(new BoolSetting.Builder() .name("held-item-name") - .description("Disables rendering of the held item name.") .defaultValue(false) .build() ); private final Setting noObfuscation = sgHUD.add(new BoolSetting.Builder() .name("obfuscation") - .description("Disables obfuscation styling of characters.") .defaultValue(false) .build() ); private final Setting noPotionIcons = sgHUD.add(new BoolSetting.Builder() .name("potion-icons") - .description("Disables rendering of status effect icons.") .defaultValue(false) .build() ); private final Setting noMessageSignatureIndicator = sgHUD.add(new BoolSetting.Builder() .name("message-signature-indicator") - .description("Disables chat message signature indicator on the left of the message.") .defaultValue(false) .build() ); @@ -183,84 +162,72 @@ public class NoRender extends Module { private final Setting noWeather = sgWorld.add(new BoolSetting.Builder() .name("weather") - .description("Disables rendering of weather.") .defaultValue(false) .build() ); private final Setting noWorldBorder = sgWorld.add(new BoolSetting.Builder() .name("world-border") - .description("Disables rendering of the world border.") .defaultValue(false) .build() ); private final Setting noBlindness = sgWorld.add(new BoolSetting.Builder() .name("blindness") - .description("Disables rendering of blindness.") .defaultValue(false) .build() ); private final Setting noDarkness = sgWorld.add(new BoolSetting.Builder() .name("darkness") - .description("Disables rendering of darkness.") .defaultValue(false) .build() ); private final Setting noFog = sgWorld.add(new BoolSetting.Builder() .name("fog") - .description("Disables rendering of fog.") .defaultValue(false) .build() ); private final Setting noEnchTableBook = sgWorld.add(new BoolSetting.Builder() .name("enchantment-table-book") - .description("Disables rendering of books above enchanting tables.") .defaultValue(false) .build() ); private final Setting noSignText = sgWorld.add(new BoolSetting.Builder() .name("sign-text") - .description("Disables rendering of text on signs.") .defaultValue(false) .build() ); private final Setting noBlockBreakParticles = sgWorld.add(new BoolSetting.Builder() .name("block-break-particles") - .description("Disables rendering of block-break particles.") .defaultValue(false) .build() ); private final Setting noBlockBreakOverlay = sgWorld.add(new BoolSetting.Builder() .name("block-break-overlay") - .description("Disables rendering of block-break overlay.") .defaultValue(false) .build() ); private final Setting noBeaconBeams = sgWorld.add(new BoolSetting.Builder() .name("beacon-beams") - .description("Disables rendering of beacon beams.") .defaultValue(false) .build() ); private final Setting noFallingBlocks = sgWorld.add(new BoolSetting.Builder() .name("falling-blocks") - .description("Disables rendering of falling blocks.") .defaultValue(false) .build() ); private final Setting noCaveCulling = sgWorld.add(new BoolSetting.Builder() .name("cave-culling") - .description("Disables Minecraft's cave culling algorithm.") .defaultValue(false) .onChanged(b -> mc.worldRenderer.reload()) .build() @@ -268,48 +235,41 @@ public class NoRender extends Module { private final Setting noMapMarkers = sgWorld.add(new BoolSetting.Builder() .name("map-markers") - .description("Disables markers on maps.") .defaultValue(false) .build() ); private final Setting noMapContents = sgWorld.add(new BoolSetting.Builder() .name("map-contents") - .description("Disable rendering of maps.") .defaultValue(false) .build() ); private final Setting bannerRender = sgWorld.add(new EnumSetting.Builder() .name("banners") - .description("Changes rendering of banners.") .defaultValue(BannerRenderMode.Everything) .build() ); private final Setting noFireworkExplosions = sgWorld.add(new BoolSetting.Builder() .name("firework-explosions") - .description("Disables rendering of firework explosions.") .defaultValue(false) .build() ); private final Setting>> particles = sgWorld.add(new ParticleTypeListSetting.Builder() .name("particles") - .description("Particles to not render.") .build() ); private final Setting noBarrierInvis = sgWorld.add(new BoolSetting.Builder() .name("barrier-invisibility") - .description("Disables barriers being invisible when not holding one.") .defaultValue(false) .build() ); private final Setting noTextureRotations = sgWorld.add(new BoolSetting.Builder() .name("texture-rotations") - .description("Changes texture rotations and model offsets to use a constant value instead of the block position.") .defaultValue(false) .onChanged(b -> mc.worldRenderer.reload()) .build() @@ -317,7 +277,6 @@ public class NoRender extends Module { private final Setting> blockEntities = sgWorld.add(new BlockListSetting.Builder() .name("block-entities") - .description("Block entities (chest, shulker block, etc.) to not render.") .filter(block -> block instanceof BlockEntityProvider && !(block instanceof AbstractBannerBlock)) .build() ); @@ -326,61 +285,53 @@ public class NoRender extends Module { private final Setting>> entities = sgEntity.add(new EntityTypeListSetting.Builder() .name("entities") - .description("Disables rendering of selected entities.") .build() ); private final Setting dropSpawnPacket = sgEntity.add(new BoolSetting.Builder() .name("drop-spawn-packets") - .description("WARNING! Drops all spawn packets of entities selected in the above list.") .defaultValue(false) .build() ); private final Setting noArmor = sgEntity.add(new BoolSetting.Builder() .name("armor") - .description("Disables rendering of armor on entities.") .defaultValue(false) .build() ); private final Setting noInvisibility = sgEntity.add(new BoolSetting.Builder() .name("invisibility") - .description("Shows invisible entities.") .defaultValue(false) .build() ); private final Setting noGlowing = sgEntity.add(new BoolSetting.Builder() .name("glowing") - .description("Disables rendering of the glowing effect") .defaultValue(false) .build() ); private final Setting noMobInSpawner = sgEntity.add(new BoolSetting.Builder() .name("spawner-entities") - .description("Disables rendering of spinning mobs inside of mob spawners") .defaultValue(false) .build() ); private final Setting noDeadEntities = sgEntity.add(new BoolSetting.Builder() .name("dead-entities") - .description("Disables rendering of dead entities") .defaultValue(false) .build() ); private final Setting noNametags = sgEntity.add(new BoolSetting.Builder() .name("nametags") - .description("Disables rendering of entity nametags") .defaultValue(false) .build() ); public NoRender() { - super(Categories.Render, "no-render", "Disables certain animations or overlays from rendering."); + super(Categories.Render, "no-render"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/PopChams.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/PopChams.java index 4b741fa3a5..6e78866764 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/PopChams.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/PopChams.java @@ -30,14 +30,12 @@ public class PopChams extends Module { private final Setting onlyOne = sgGeneral.add(new BoolSetting.Builder() .name("only-one") - .description("Only allow one ghost per player.") .defaultValue(false) .build() ); private final Setting renderTime = sgGeneral.add(new DoubleSetting.Builder() .name("render-time") - .description("How long the ghost is rendered in seconds.") .defaultValue(1) .min(0.1) .sliderMax(6) @@ -46,7 +44,6 @@ public class PopChams extends Module { private final Setting yModifier = sgGeneral.add(new DoubleSetting.Builder() .name("y-modifier") - .description("How much should the Y position of the ghost change per second.") .defaultValue(0.75) .sliderRange(-4, 4) .build() @@ -54,7 +51,6 @@ public class PopChams extends Module { private final Setting scaleModifier = sgGeneral.add(new DoubleSetting.Builder() .name("scale-modifier") - .description("How much should the scale of the ghost change per second.") .defaultValue(-0.25) .sliderRange(-4, 4) .build() @@ -62,28 +58,24 @@ public class PopChams extends Module { private final Setting fadeOut = sgGeneral.add(new BoolSetting.Builder() .name("fade-out") - .description("Fades out the color.") .defaultValue(true) .build() ); private final Setting shapeMode = sgGeneral.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting sideColor = sgGeneral.add(new ColorSetting.Builder() .name("side-color") - .description("The side color.") .defaultValue(new SettingColor(255, 255, 255, 25)) .build() ); private final Setting lineColor = sgGeneral.add(new ColorSetting.Builder() .name("line-color") - .description("The line color.") .defaultValue(new SettingColor(255, 255, 255, 127)) .build() ); @@ -91,7 +83,7 @@ public class PopChams extends Module { private final List ghosts = new ArrayList<>(); public PopChams() { - super(Categories.Render, "pop-chams", "Renders a ghost where players pop totem."); + super(Categories.Render, "pop-chams"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/StorageESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/StorageESP.java index 8a8ecfe1c1..92f72c3409 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/StorageESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/StorageESP.java @@ -43,40 +43,35 @@ public class StorageESP extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgOpened = settings.createGroup("Opened Rendering"); + private final SettingGroup sgOpened = settings.createGroup("opened-rendering"); private final Set interactedBlocks = new HashSet<>(); private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("Rendering mode.") .defaultValue(Mode.Shader) .build() ); private final Setting>> storageBlocks = sgGeneral.add(new StorageBlockListSetting.Builder() .name("storage-blocks") - .description("Select the storage blocks to display.") .defaultValue(StorageBlockListSetting.STORAGE_BLOCKS) .build() ); private final Setting tracers = sgGeneral.add(new BoolSetting.Builder() .name("tracers") - .description("Draws tracers to storage blocks.") .defaultValue(false) .build() ); public final Setting shapeMode = sgGeneral.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); public final Setting fillOpacity = sgGeneral.add(new IntSetting.Builder() .name("fill-opacity") - .description("The opacity of the shape fill.") .visible(() -> shapeMode.get() != ShapeMode.Lines) .defaultValue(50) .range(0, 255) @@ -86,7 +81,6 @@ public class StorageESP extends Module { public final Setting outlineWidth = sgGeneral.add(new IntSetting.Builder() .name("width") - .description("The width of the shader outline.") .visible(() -> mode.get() == Mode.Shader) .defaultValue(1) .range(1, 10) @@ -96,7 +90,6 @@ public class StorageESP extends Module { public final Setting glowMultiplier = sgGeneral.add(new DoubleSetting.Builder() .name("glow-multiplier") - .description("Multiplier for glow effect") .visible(() -> mode.get() == Mode.Shader) .decimalPlaces(3) .defaultValue(3.5) @@ -107,49 +100,42 @@ public class StorageESP extends Module { private final Setting chest = sgGeneral.add(new ColorSetting.Builder() .name("chest") - .description("The color of chests.") .defaultValue(new SettingColor(255, 160, 0, 255)) .build() ); private final Setting trappedChest = sgGeneral.add(new ColorSetting.Builder() .name("trapped-chest") - .description("The color of trapped chests.") .defaultValue(new SettingColor(255, 0, 0, 255)) .build() ); private final Setting barrel = sgGeneral.add(new ColorSetting.Builder() .name("barrel") - .description("The color of barrels.") .defaultValue(new SettingColor(255, 160, 0, 255)) .build() ); private final Setting shulker = sgGeneral.add(new ColorSetting.Builder() .name("shulker") - .description("The color of Shulker Boxes.") .defaultValue(new SettingColor(255, 160, 0, 255)) .build() ); private final Setting enderChest = sgGeneral.add(new ColorSetting.Builder() .name("ender-chest") - .description("The color of Ender Chests.") .defaultValue(new SettingColor(120, 0, 255, 255)) .build() ); private final Setting other = sgGeneral.add(new ColorSetting.Builder() .name("other") - .description("The color of furnaces, dispensers, droppers and hoppers.") .defaultValue(new SettingColor(140, 140, 140, 255)) .build() ); private final Setting fadeDistance = sgGeneral.add(new DoubleSetting.Builder() .name("fade-distance") - .description("The distance at which the color will fade.") .defaultValue(6) .min(0) .sliderMax(12) @@ -158,14 +144,12 @@ public class StorageESP extends Module { private final Setting hideOpened = sgOpened.add(new BoolSetting.Builder() .name("hide-opened") - .description("Hides opened containers.") .defaultValue(false) .build() ); private final Setting openedColor = sgOpened.add(new ColorSetting.Builder() .name("opened-color") - .description("Optional setting to change colors of opened chests, as opposed to not rendering. Disabled at zero opacity.") .defaultValue(new SettingColor(203, 90, 203, 0)) // TRANSPARENT BY DEFAULT. .build() ); @@ -180,7 +164,7 @@ public class StorageESP extends Module { private final MeshBuilderVertexConsumerProvider vertexConsumerProvider; public StorageESP() { - super(Categories.Render, "storage-esp", "Renders all specified storage blocks."); + super(Categories.Render, "storage-esp"); mesh = new MeshBuilder(MeteorRenderPipelines.WORLD_COLORED); vertexConsumerProvider = new MeshBuilderVertexConsumerProvider(mesh); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/TimeChanger.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/TimeChanger.java index 228fb8afb0..be5248fa49 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/TimeChanger.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/TimeChanger.java @@ -20,7 +20,6 @@ public class TimeChanger extends Module { private final Setting time = sgGeneral.add(new DoubleSetting.Builder() .name("time") - .description("The specified time to be set.") .defaultValue(0) .sliderRange(-20000, 20000) .build() @@ -29,7 +28,7 @@ public class TimeChanger extends Module { long oldTime; public TimeChanger() { - super(Categories.Render, "time-changer", "Makes you able to set a custom time."); + super(Categories.Render, "time-changer"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java index edac39cb37..96a6a0dbf3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java @@ -35,8 +35,8 @@ public class Tracers extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgAppearance = settings.createGroup("Appearance"); - private final SettingGroup sgColors = settings.createGroup("Colors"); + private final SettingGroup sgAppearance = settings.createGroup("appearance"); + private final SettingGroup sgColors = settings.createGroup("colors"); public enum TracerStyle { Lines, @@ -47,28 +47,24 @@ public enum TracerStyle { private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("entities") - .description("Select specific entities.") .defaultValue(EntityType.PLAYER) .build() ); private final Setting ignoreSelf = sgGeneral.add(new BoolSetting.Builder() .name("ignore-self") - .description("Doesn't draw tracers to yourself when in third person or freecam.") .defaultValue(false) .build() ); public final Setting ignoreFriends = sgGeneral.add(new BoolSetting.Builder() .name("ignore-friends") - .description("Doesn't draw tracers to friends.") .defaultValue(false) .build() ); public final Setting showInvis = sgGeneral.add(new BoolSetting.Builder() .name("show-invisible") - .description("Shows invisible entities.") .defaultValue(true) .build() ); @@ -77,14 +73,12 @@ public enum TracerStyle { private final Setting style = sgAppearance.add(new EnumSetting.Builder() .name("style") - .description("What display mode should be used") .defaultValue(TracerStyle.Lines) .build() ); private final Setting target = sgAppearance.add(new EnumSetting.Builder() .name("target") - .description("What part of the entity to target.") .defaultValue(Target.Body) .visible(() -> style.get() == TracerStyle.Lines) .build() @@ -92,7 +86,6 @@ public enum TracerStyle { private final Setting stem = sgAppearance.add(new BoolSetting.Builder() .name("stem") - .description("Draw a line through the center of the tracer target.") .defaultValue(true) .visible(() -> style.get() == TracerStyle.Lines) .build() @@ -100,7 +93,6 @@ public enum TracerStyle { private final Setting maxDist = sgAppearance.add(new IntSetting.Builder() .name("max-distance") - .description("Maximum distance for tracers to show.") .defaultValue(256) .min(0) .sliderMax(256) @@ -109,7 +101,6 @@ public enum TracerStyle { private final Setting distanceOffscreen = sgAppearance.add(new IntSetting.Builder() .name("distance-offscreen") - .description("Offscreen's distance from center.") .defaultValue(200) .min(0) .sliderMax(500) @@ -119,7 +110,6 @@ public enum TracerStyle { private final Setting sizeOffscreen = sgAppearance.add(new IntSetting.Builder() .name("size-offscreen") - .description("Offscreen's size.") .defaultValue(10) .min(2) .sliderMax(50) @@ -129,7 +119,6 @@ public enum TracerStyle { private final Setting blinkOffscreen = sgAppearance.add(new BoolSetting.Builder() .name("blink-offscreen") - .description("Make offscreen Blink.") .defaultValue(true) .visible(() -> style.get() == TracerStyle.Offscreen) .build() @@ -137,7 +126,6 @@ public enum TracerStyle { private final Setting blinkOffscreenSpeed = sgAppearance.add(new DoubleSetting.Builder() .name("blink-offscreen-speed") - .description("Offscreen's blink speed.") .defaultValue(4) .min(1) .sliderMax(15) @@ -149,14 +137,12 @@ public enum TracerStyle { public final Setting distance = sgColors.add(new BoolSetting.Builder() .name("distance-colors") - .description("Changes the color of tracers depending on distance.") .defaultValue(false) .build() ); public final Setting friendOverride = sgColors.add(new BoolSetting.Builder() .name("show-friend-colors") - .description("Whether or not to override the distance color of friends with the friend color.") .defaultValue(true) .visible(() -> distance.get() && !ignoreFriends.get()) .build() @@ -164,7 +150,6 @@ public enum TracerStyle { private final Setting playersColor = sgColors.add(new ColorSetting.Builder() .name("players-colors") - .description("The player's color.") .defaultValue(new SettingColor(205, 205, 205, 127)) .visible(() -> !distance.get()) .build() @@ -172,7 +157,6 @@ public enum TracerStyle { private final Setting animalsColor = sgColors.add(new ColorSetting.Builder() .name("animals-color") - .description("The animal's color.") .defaultValue(new SettingColor(145, 255, 145, 127)) .visible(() -> !distance.get()) .build() @@ -180,7 +164,6 @@ public enum TracerStyle { private final Setting waterAnimalsColor = sgColors.add(new ColorSetting.Builder() .name("water-animals-color") - .description("The water animal's color.") .defaultValue(new SettingColor(145, 145, 255, 127)) .visible(() -> !distance.get()) .build() @@ -188,7 +171,6 @@ public enum TracerStyle { private final Setting monstersColor = sgColors.add(new ColorSetting.Builder() .name("monsters-color") - .description("The monster's color.") .defaultValue(new SettingColor(255, 145, 145, 127)) .visible(() -> !distance.get()) .build() @@ -196,7 +178,6 @@ public enum TracerStyle { private final Setting ambientColor = sgColors.add(new ColorSetting.Builder() .name("ambient-color") - .description("The ambient color.") .defaultValue(new SettingColor(75, 75, 75, 127)) .visible(() -> !distance.get()) .build() @@ -204,7 +185,6 @@ public enum TracerStyle { private final Setting miscColor = sgColors.add(new ColorSetting.Builder() .name("misc-color") - .description("The misc color.") .defaultValue(new SettingColor(145, 145, 145, 127)) .visible(() -> !distance.get()) .build() @@ -214,7 +194,7 @@ public enum TracerStyle { private final Instant initTimer = Instant.now(); public Tracers() { - super(Categories.Render, "tracers", "Displays tracer lines to specified entities."); + super(Categories.Render, "tracers"); } private boolean shouldBeIgnored(Entity entity) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trail.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trail.java index 70e1de3c5e..60bdb42941 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trail.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trail.java @@ -24,20 +24,18 @@ public class Trail extends Module { private final Setting>> particles = sgGeneral.add(new ParticleTypeListSetting.Builder() .name("particles") - .description("Particles to draw.") .defaultValue(ParticleTypes.DRIPPING_OBSIDIAN_TEAR, ParticleTypes.CAMPFIRE_COSY_SMOKE) .build() ); private final Setting pause = sgGeneral.add(new BoolSetting.Builder() .name("pause-when-stationary") - .description("Whether or not to add particles when you are not moving.") .defaultValue(true) .build() ); public Trail() { - super(Categories.Render, "trail", "Renders a customizable trail behind your player."); + super(Categories.Render, "trail"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java index 8d5077999a..658e2e921c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java @@ -37,13 +37,12 @@ public class Trajectories extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General private final Setting> items = sgGeneral.add(new ItemListSetting.Builder() .name("items") - .description("Items to display trajectories for.") .defaultValue(getDefaultItems()) .filter(this::itemFilter) .build() @@ -51,21 +50,18 @@ public class Trajectories extends Module { private final Setting otherPlayers = sgGeneral.add(new BoolSetting.Builder() .name("other-players") - .description("Calculates trajectories for other players.") .defaultValue(true) .build() ); private final Setting firedProjectiles = sgGeneral.add(new BoolSetting.Builder() .name("fired-projectiles") - .description("Calculates trajectories for already fired projectiles.") .defaultValue(false) .build() ); private final Setting ignoreWitherSkulls = sgGeneral.add(new BoolSetting.Builder() .name("ignore-wither-skulls") - .description("Whether to ignore fired wither skulls.") .defaultValue(false) .visible(firedProjectiles::get) .build() @@ -73,14 +69,12 @@ public class Trajectories extends Module { private final Setting accurate = sgGeneral.add(new BoolSetting.Builder() .name("accurate") - .description("Whether or not to calculate more accurate.") .defaultValue(false) .build() ); public final Setting simulationSteps = sgGeneral.add(new IntSetting.Builder() .name("simulation-steps") - .description("How many steps to simulate projectiles. Zero for no limit") .defaultValue(500) .sliderMax(5000) .build() @@ -90,7 +84,6 @@ public class Trajectories extends Module { private final Setting ignoreFirstTicks = sgRender.add(new IntSetting.Builder() .name("ignore-rendering-first-ticks") - .description("Ignores rendering the first given ticks, to make the rest of the path more visible.") .defaultValue(3) .min(0) .build() @@ -98,35 +91,30 @@ public class Trajectories extends Module { private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The side color.") .defaultValue(new SettingColor(255, 150, 0, 35)) .build() ); private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The line color.") .defaultValue(new SettingColor(255, 150, 0)) .build() ); private final Setting renderPositionBox = sgRender.add(new BoolSetting.Builder() .name("render-position-boxes") - .description("Renders the actual position the projectile will be at each tick along it's trajectory.") .defaultValue(false) .build() ); private final Setting positionBoxSize = sgRender.add(new DoubleSetting.Builder() .name("position-box-size") - .description("The size of the box drawn at the simulated positions.") .defaultValue(0.02) .sliderRange(0.01, 0.1) .visible(renderPositionBox::get) @@ -135,7 +123,6 @@ public class Trajectories extends Module { private final Setting positionSideColor = sgRender.add(new ColorSetting.Builder() .name("position-side-color") - .description("The side color.") .defaultValue(new SettingColor(255, 150, 0, 35)) .visible(renderPositionBox::get) .build() @@ -143,7 +130,6 @@ public class Trajectories extends Module { private final Setting positionLineColor = sgRender.add(new ColorSetting.Builder() .name("position-line-color") - .description("The line color.") .defaultValue(new SettingColor(255, 150, 0)) .visible(renderPositionBox::get) .build() @@ -157,7 +143,7 @@ public class Trajectories extends Module { private static final double MULTISHOT_OFFSET = Math.toRadians(10); // accurate-ish offset of crossbow multishot in radians (10° degrees) public Trajectories() { - super(Categories.Render, "trajectories", "Predicts the trajectory of throwable items."); + super(Categories.Render, "trajectories"); } private boolean itemFilter(Item item) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/TunnelESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/TunnelESP.java index 7d5cf45b90..5bbfaeb1ef 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/TunnelESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/TunnelESP.java @@ -42,7 +42,6 @@ public class TunnelESP extends Module { private final Setting height = sgGeneral.add(new DoubleSetting.Builder() .name("height") - .description("Height of the rendered box.") .defaultValue(0.1) .sliderMax(2) .build() @@ -50,28 +49,24 @@ public class TunnelESP extends Module { private final Setting connected = sgGeneral.add(new BoolSetting.Builder() .name("connected") - .description("If neighbouring holes should be connected.") .defaultValue(true) .build() ); private final Setting shapeMode = sgGeneral.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting sideColor = sgGeneral.add(new ColorSetting.Builder() .name("side-color") - .description("The side color.") .defaultValue(new SettingColor(255, 175, 25, 50)) .build() ); private final Setting lineColor = sgGeneral.add(new ColorSetting.Builder() .name("line-color") - .description("The line color.") .defaultValue(new SettingColor(255, 175, 25, 255)) .build() ); @@ -79,7 +74,7 @@ public class TunnelESP extends Module { private final Long2ObjectMap chunks = new Long2ObjectOpenHashMap<>(); public TunnelESP() { - super(Categories.Render, "tunnel-esp", "Highlights tunnels."); + super(Categories.Render, "tunnel-esp"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/VoidESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/VoidESP.java index 407a87f794..561e9052e5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/VoidESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/VoidESP.java @@ -30,20 +30,18 @@ public class VoidESP extends Module { private static final Direction[] SIDES = {Direction.EAST, Direction.NORTH, Direction.SOUTH, Direction.WEST}; private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General private final Setting airOnly = sgGeneral.add(new BoolSetting.Builder() .name("air-only") - .description("Checks bedrock only for air blocks.") .defaultValue(false) .build() ); private final Setting horizontalRadius = sgGeneral.add(new IntSetting.Builder() .name("horizontal-radius") - .description("Horizontal radius in which to search for holes.") .defaultValue(64) .min(0) .sliderMax(256) @@ -52,7 +50,6 @@ public class VoidESP extends Module { private final Setting holeHeight = sgGeneral.add(new IntSetting.Builder() .name("hole-height") - .description("The minimum hole height to be rendered.") .defaultValue(1) .min(1) .sliderRange(1, 5) @@ -61,7 +58,6 @@ public class VoidESP extends Module { private final Setting netherRoof = sgGeneral.add(new BoolSetting.Builder() .name("nether-roof") - .description("Check for holes in nether roof.") .defaultValue(true) .build() ); @@ -70,21 +66,18 @@ public class VoidESP extends Module { private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("fill-color") - .description("The color that fills holes in the void.") .defaultValue(new SettingColor(225, 25, 25, 50)) .build() ); private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The color to draw lines of holes to the void.") .defaultValue(new SettingColor(225, 25, 255)) .build() ); @@ -95,7 +88,7 @@ public class VoidESP extends Module { private final List voidHoles = new ArrayList<>(); public VoidESP() { - super(Categories.Render, "void-esp", "Renders holes in bedrock layers that lead to the void."); + super(Categories.Render, "void-esp"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WallHack.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WallHack.java index be042352c5..9e05580d9a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WallHack.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WallHack.java @@ -23,7 +23,6 @@ public class WallHack extends Module { public final Setting opacity = sgGeneral.add(new IntSetting.Builder() .name("opacity") - .description("The opacity for rendered blocks.") .defaultValue(0) .range(0, 255) .sliderMax(255) @@ -37,7 +36,6 @@ public class WallHack extends Module { public final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") - .description("What blocks should be targeted for Wall Hack.") .defaultValue() .onChanged(onChanged -> { if (isActive()) mc.worldRenderer.reload(); @@ -47,13 +45,12 @@ public class WallHack extends Module { public final Setting occludeChunks = sgGeneral.add(new BoolSetting.Builder() .name("occlude-chunks") - .description("Whether caves should occlude underground (may look wonky when on).") .defaultValue(false) .build() ); public WallHack() { - super(Categories.Render, "wall-hack", "Makes blocks translucent."); + super(Categories.Render, "wall-hack"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java index 5df199eb84..2991aea436 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java @@ -48,11 +48,10 @@ public class WaypointsModule extends Module { private static final Color TEXT = new Color(255, 255, 255); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgDeathPosition = settings.createGroup("Death Position"); + private final SettingGroup sgDeathPosition = settings.createGroup("death-position"); public final Setting textRenderDistance = sgGeneral.add(new IntSetting.Builder() .name("text-render-distance") - .description("Maximum distance from the center of the screen at which text will be rendered.") .defaultValue(100) .min(0) .sliderMax(200) @@ -61,7 +60,6 @@ public class WaypointsModule extends Module { private final Setting waypointFadeDistance = sgGeneral.add(new IntSetting.Builder() .name("waypoint-fade-distance") - .description("The distance to a waypoint at which it begins to start fading.") .defaultValue(20) .sliderRange(0, 100) .min(0) @@ -70,7 +68,6 @@ public class WaypointsModule extends Module { private final Setting maxDeathPositions = sgDeathPosition.add(new IntSetting.Builder() .name("max-death-positions") - .description("The amount of death positions to save, 0 to disable") .defaultValue(0) .min(0) .sliderMax(20) @@ -80,13 +77,12 @@ public class WaypointsModule extends Module { private final Setting dpChat = sgDeathPosition.add(new BoolSetting.Builder() .name("chat") - .description("Send a chat message with your position once you die") .defaultValue(false) .build() ); public WaypointsModule() { - super(Categories.Render, "waypoints", "Allows you to create waypoints."); + super(Categories.Render, "waypoints"); } private final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java index 351a230172..40c299e43e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java @@ -35,7 +35,6 @@ public class Xray extends Module { private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("whitelist") - .description("Which blocks to show x-rayed.") .defaultValue(ORES) .onChanged(v -> { if (isActive()) mc.worldRenderer.reload(); @@ -45,7 +44,6 @@ public class Xray extends Module { public final Setting opacity = sgGeneral.add(new IntSetting.Builder() .name("opacity") - .description("The opacity for all other blocks.") .defaultValue(25) .range(0, 255) .sliderMax(255) @@ -57,7 +55,6 @@ public class Xray extends Module { private final Setting exposedOnly = sgGeneral.add(new BoolSetting.Builder() .name("exposed-only") - .description("Show only exposed ores.") .defaultValue(false) .onChanged(onChanged -> { if (isActive()) mc.worldRenderer.reload(); @@ -65,7 +62,7 @@ public class Xray extends Module { .build()); public Xray() { - super(Categories.Render, "xray", "Only renders specified blocks. Good for mining."); + super(Categories.Render, "xray"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Zoom.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Zoom.java index 65d6dc066d..ad9267ef7b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Zoom.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Zoom.java @@ -26,7 +26,6 @@ public class Zoom extends Module { private final Setting zoom = sgGeneral.add(new DoubleSetting.Builder() .name("zoom") - .description("How much to zoom.") .defaultValue(6) .min(1) .build() @@ -34,7 +33,6 @@ public class Zoom extends Module { private final Setting scrollSensitivity = sgGeneral.add(new DoubleSetting.Builder() .name("scroll-sensitivity") - .description("Allows you to change zoom value using scroll wheel. 0 to disable.") .defaultValue(1) .min(0) .build() @@ -42,28 +40,24 @@ public class Zoom extends Module { private final Setting smooth = sgGeneral.add(new BoolSetting.Builder() .name("smooth") - .description("Smooth transition.") .defaultValue(true) .build() ); private final Setting cinematic = sgGeneral.add(new BoolSetting.Builder() .name("cinematic") - .description("Enables cinematic camera.") .defaultValue(false) .build() ); private final Setting hideHud = sgGeneral.add(new BoolSetting.Builder() .name("hide-HUD") - .description("Whether or not to hide the Minecraft HUD.") .defaultValue(false) .build() ); private final Setting renderHands = sgGeneral.add(new BoolSetting.Builder() .name("show-hands") - .description("Whether or not to render your hands.") .defaultValue(false) .visible(() -> !hideHud.get()) .build() @@ -79,7 +73,7 @@ public class Zoom extends Module { private boolean hudManualToggled; public Zoom() { - super(Categories.Render, "zoom", "Zooms your view."); + super(Categories.Render, "zoom"); autoSubscribe = false; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/BlockESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/BlockESP.java index 8cfe86c072..b625cd5da7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/BlockESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/BlockESP.java @@ -40,7 +40,6 @@ public class BlockESP extends Module { private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") - .description("Blocks to search for.") .onChanged(blocks1 -> { if (isActive() && Utils.canUpdate()) onActivate(); }) @@ -49,7 +48,6 @@ public class BlockESP extends Module { private final Setting defaultBlockConfig = sgGeneral.add(new GenericSetting.Builder() .name("default-block-config") - .description("Default block config.") .defaultValue( new ESPBlockData( ShapeMode.Lines, @@ -64,14 +62,12 @@ public class BlockESP extends Module { private final Setting> blockConfigs = sgGeneral.add(new BlockDataSetting.Builder() .name("block-configs") - .description("Config for each block.") .defaultData(defaultBlockConfig) .build() ); private final Setting tracers = sgGeneral.add(new BoolSetting.Builder() .name("tracers") - .description("Render tracer lines.") .defaultValue(false) .build() ); @@ -85,7 +81,7 @@ public class BlockESP extends Module { private DimensionType lastDimension; public BlockESP() { - super(Categories.Render, "block-esp", "Renders specified blocks through walls.", "search"); + super(Categories.Render, "block-esp", "search"); RainbowColors.register(this::onTickRainbow); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Marker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Marker.java index 3bf83adb35..8c7a8a42bf 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Marker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Marker.java @@ -31,7 +31,7 @@ public class Marker extends Module { private final ArrayList markers = new ArrayList<>(); public Marker() { - super(Categories.Render, "marker", "Renders shapes. Useful for large scale projects"); + super(Categories.Render, "marker"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Ambience.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Ambience.java index 6657250d4d..c5376d7ff3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Ambience.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Ambience.java @@ -18,28 +18,25 @@ * @author Walaryne */ public class Ambience extends Module { - private final SettingGroup sgSky = settings.createGroup("Sky"); - private final SettingGroup sgWorld = settings.createGroup("World"); + private final SettingGroup sgSky = settings.createGroup("sky"); + private final SettingGroup sgWorld = settings.createGroup("world"); // Sky public final Setting endSky = sgSky.add(new BoolSetting.Builder() .name("end-sky") - .description("Makes the sky like the end.") .defaultValue(false) .build() ); public final Setting customSkyColor = sgSky.add(new BoolSetting.Builder() .name("custom-sky-color") - .description("Whether the sky color should be changed.") .defaultValue(false) .build() ); public final Setting overworldSkyColor = sgSky.add(new ColorSetting.Builder() .name("overworld-sky-color") - .description("The color of the overworld sky.") .defaultValue(new SettingColor(0, 125, 255)) .visible(customSkyColor::get) .build() @@ -47,7 +44,6 @@ public class Ambience extends Module { public final Setting netherSkyColor = sgSky.add(new ColorSetting.Builder() .name("nether-sky-color") - .description("The color of the nether sky.") .defaultValue(new SettingColor(102, 0, 0)) .visible(customSkyColor::get) .build() @@ -55,7 +51,6 @@ public class Ambience extends Module { public final Setting endSkyColor = sgSky.add(new ColorSetting.Builder() .name("end-sky-color") - .description("The color of the end sky.") .defaultValue(new SettingColor(65, 30, 90)) .visible(customSkyColor::get) .build() @@ -63,14 +58,12 @@ public class Ambience extends Module { public final Setting customCloudColor = sgSky.add(new BoolSetting.Builder() .name("custom-cloud-color") - .description("Whether the clouds color should be changed.") .defaultValue(false) .build() ); public final Setting cloudColor = sgSky.add(new ColorSetting.Builder() .name("cloud-color") - .description("The color of the clouds.") .defaultValue(new SettingColor(102, 0, 0)) .visible(customCloudColor::get) .build() @@ -78,14 +71,12 @@ public class Ambience extends Module { public final Setting changeLightningColor = sgSky.add(new BoolSetting.Builder() .name("custom-lightning-color") - .description("Whether the lightning color should be changed.") .defaultValue(false) .build() ); public final Setting lightningColor = sgSky.add(new ColorSetting.Builder() .name("lightning-color") - .description("The color of the lightning.") .defaultValue(new SettingColor(102, 0, 0)) .visible(changeLightningColor::get) .build() @@ -94,7 +85,6 @@ public class Ambience extends Module { // World public final Setting customGrassColor = sgWorld.add(new BoolSetting.Builder() .name("custom-grass-color") - .description("Whether the grass color should be changed.") .defaultValue(false) .onChanged(val -> reload()) .build() @@ -102,7 +92,6 @@ public class Ambience extends Module { public final Setting grassColor = sgWorld.add(new ColorSetting.Builder() .name("grass-color") - .description("The color of the grass.") .defaultValue(new SettingColor(102, 0, 0)) .visible(customGrassColor::get) .onChanged(val -> reload()) @@ -111,7 +100,6 @@ public class Ambience extends Module { public final Setting customFoliageColor = sgWorld.add(new BoolSetting.Builder() .name("custom-foliage-color") - .description("Whether the foliage color should be changed.") .defaultValue(false) .onChanged(val -> reload()) .build() @@ -119,7 +107,6 @@ public class Ambience extends Module { public final Setting foliageColor = sgWorld.add(new ColorSetting.Builder() .name("foliage-color") - .description("The color of the foliage.") .defaultValue(new SettingColor(102, 0, 0)) .visible(customFoliageColor::get) .onChanged(val -> reload()) @@ -128,7 +115,6 @@ public class Ambience extends Module { public final Setting customWaterColor = sgWorld.add(new BoolSetting.Builder() .name("custom-water-color") - .description("Whether the water color should be changed.") .defaultValue(false) .onChanged(val -> reload()) .build() @@ -136,7 +122,6 @@ public class Ambience extends Module { public final Setting waterColor = sgWorld.add(new ColorSetting.Builder() .name("water-color") - .description("The color of the water.") .defaultValue(new SettingColor(102, 0, 0)) .visible(customWaterColor::get) .onChanged(val -> reload()) @@ -145,7 +130,6 @@ public class Ambience extends Module { public final Setting customLavaColor = sgWorld.add(new BoolSetting.Builder() .name("custom-lava-color") - .description("Whether the lava color should be changed.") .defaultValue(false) .onChanged(val -> reload()) .build() @@ -153,7 +137,6 @@ public class Ambience extends Module { public final Setting lavaColor = sgWorld.add(new ColorSetting.Builder() .name("lava-color") - .description("The color of the lava.") .defaultValue(new SettingColor(102, 0, 0)) .visible(customLavaColor::get) .onChanged(val -> reload()) @@ -162,21 +145,19 @@ public class Ambience extends Module { public final Setting customFogColor = sgWorld.add(new BoolSetting.Builder() .name("custom-fog-color") - .description("Whether the fog color should be changed.") .defaultValue(false) .build() ); public final Setting fogColor = sgWorld.add(new ColorSetting.Builder() .name("fog-color") - .description("The color of the fog.") .defaultValue(new SettingColor(102, 0, 0)) .visible(customFogColor::get) .build() ); public Ambience() { - super(Categories.World, "ambience", "Change the color of various pieces of the environment."); + super(Categories.World, "ambience"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java index 98c647ecd5..082145743d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java @@ -27,7 +27,6 @@ public class AutoBreed extends Module { private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("entities") - .description("Entities to breed.") .defaultValue(EntityType.HORSE, EntityType.DONKEY, EntityType.COW, EntityType.MOOSHROOM, EntityType.SHEEP, EntityType.PIG, EntityType.CHICKEN, EntityType.WOLF, EntityType.CAT, EntityType.OCELOT, EntityType.RABBIT, EntityType.LLAMA, EntityType.TURTLE, @@ -38,7 +37,6 @@ public class AutoBreed extends Module { private final Setting range = sgGeneral.add(new DoubleSetting.Builder() .name("range") - .description("How far away the animals can be to be bred.") .min(0) .defaultValue(4.5) .build() @@ -46,14 +44,12 @@ public class AutoBreed extends Module { private final Setting hand = sgGeneral.add(new EnumSetting.Builder() .name("hand-for-breeding") - .description("The hand to use for breeding.") .defaultValue(Hand.MAIN_HAND) .build() ); private final Setting mobAgeFilter = sgGeneral.add(new EnumSetting.Builder() .name("mob-age-filter") - .description("Determines the age of the mobs to target (baby, adult, or both).") .defaultValue(EntityAge.Adult) .build() ); @@ -61,7 +57,7 @@ public class AutoBreed extends Module { private final List animalsFed = new ArrayList<>(); public AutoBreed() { - super(Categories.World, "auto-breed", "Automatically breeds specified animals."); + super(Categories.World, "auto-breed"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBrewer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBrewer.java index 212c4adc04..1b2d746e5f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBrewer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBrewer.java @@ -25,7 +25,6 @@ public class AutoBrewer extends Module { private final Setting potion = sgGeneral.add(new PotionSetting.Builder() .name("potion") - .description("The type of potion to brew.") .defaultValue(MyPotion.Strength) .build() ); @@ -35,7 +34,7 @@ public class AutoBrewer extends Module { private int timer; public AutoBrewer() { - super(Categories.World, "auto-brewer", "Automatically brews the specified potion."); + super(Categories.World, "auto-brewer"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoMount.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoMount.java index cad9a7ed35..4c3b3a5b17 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoMount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoMount.java @@ -37,27 +37,24 @@ public class AutoMount extends Module { private final Setting checkSaddle = sgGeneral.add(new BoolSetting.Builder() .name("check-saddle") - .description("Checks if the entity contains a saddle before mounting.") .defaultValue(false) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Faces the entity you mount.") .defaultValue(true) .build() ); private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("entities") - .description("Rideable entities.") .filter(EntityUtils::isRideable) .build() ); public AutoMount() { - super(Categories.World, "auto-mount", "Automatically mounts entities."); + super(Categories.World, "auto-mount"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java index 5c93427b05..cb091b1024 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java @@ -32,13 +32,11 @@ public class AutoNametag extends Module { private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("entities") - .description("Which entities to nametag.") .build() ); private final Setting range = sgGeneral.add(new DoubleSetting.Builder() .name("range") - .description("The maximum range an entity can be to be nametagged.") .defaultValue(5) .min(0) .sliderMax(6) @@ -47,21 +45,18 @@ public class AutoNametag extends Module { private final Setting priority = sgGeneral.add(new EnumSetting.Builder() .name("priority") - .description("Priority sort") .defaultValue(SortPriority.LowestDistance) .build() ); private final Setting renametag = sgGeneral.add(new BoolSetting.Builder() .name("renametag") - .description("Allows already nametagged entities to be renamed.") .defaultValue(true) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Automatically faces towards the mob being nametagged.") .defaultValue(true) .build() ); @@ -72,7 +67,7 @@ public class AutoNametag extends Module { private boolean offHand; public AutoNametag() { - super(Categories.World, "auto-nametag", "Automatically uses nametags on entities without a nametag. WILL nametag ALL entities in the specified distance."); + super(Categories.World, "auto-nametag"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoShearer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoShearer.java index 1da38889d6..2a43dd1f90 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoShearer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoShearer.java @@ -28,7 +28,6 @@ public class AutoShearer extends Module { private final Setting distance = sgGeneral.add(new DoubleSetting.Builder() .name("distance") - .description("The maximum distance the sheep have to be to be sheared.") .min(0.0) .defaultValue(5.0) .build() @@ -36,14 +35,12 @@ public class AutoShearer extends Module { private final Setting antiBreak = sgGeneral.add(new BoolSetting.Builder() .name("anti-break") - .description("Prevents shears from being broken.") .defaultValue(false) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Automatically faces towards the animal being sheared.") .defaultValue(true) .build() ); @@ -52,7 +49,7 @@ public class AutoShearer extends Module { private Hand hand; public AutoShearer() { - super(Categories.World, "auto-shearer", "Automatically shears sheep."); + super(Categories.World, "auto-shearer"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java index 6e807ac7ef..8a758715d7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java @@ -27,7 +27,6 @@ public class AutoSign extends Module { private final Setting delay = sgGeneral.add(new IntSetting.Builder() .name("delay") - .description("The tick delay between sign update packets.") .defaultValue(10) .range(0, 100) .sliderRange(0, 100) @@ -42,7 +41,7 @@ public class AutoSign extends Module { private int timer = 0; public AutoSign() { - super(Categories.World, "auto-sign", "Automatically writes signs. The first sign's text will be used."); + super(Categories.World, "auto-sign"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java index 80c600eeeb..f67e9eb54f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java @@ -27,7 +27,6 @@ public class AutoSmelter extends Module { private final Setting> fuelItems = sgGeneral.add(new ItemListSetting.Builder() .name("fuel-items") - .description("Items to use as fuel") .defaultValue(Items.COAL, Items.CHARCOAL) .filter(this::fuelItemFilter) .bypassFilterWhenSavingAndLoading() @@ -36,7 +35,6 @@ public class AutoSmelter extends Module { private final Setting> smeltableItems = sgGeneral.add(new ItemListSetting.Builder() .name("smeltable-items") - .description("Items to smelt") .defaultValue(Items.IRON_ORE, Items.GOLD_ORE, Items.COPPER_ORE, Items.RAW_IRON, Items.RAW_COPPER, Items.RAW_GOLD) .filter(this::smeltableItemFilter) .bypassFilterWhenSavingAndLoading() @@ -45,13 +43,12 @@ public class AutoSmelter extends Module { private final Setting disableWhenOutOfItems = sgGeneral.add(new BoolSetting.Builder() .name("disable-when-out-of-items") - .description("Disable the module when you run out of items") .defaultValue(true) .build() ); public AutoSmelter() { - super(Categories.World, "auto-smelter", "Automatically smelts items from your inventory"); + super(Categories.World, "auto-smelter"); } private boolean fuelItemFilter(Item item) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/BuildHeight.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/BuildHeight.java index d0bf0dab2a..1c998b592c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/BuildHeight.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/BuildHeight.java @@ -15,7 +15,7 @@ public class BuildHeight extends Module { public BuildHeight() { - super(Categories.World, "build-height", "Allows you to interact with objects at the build limit."); + super(Categories.World, "build-height"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Collisions.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Collisions.java index ab424c1a0d..0532e3a3cd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Collisions.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Collisions.java @@ -28,34 +28,30 @@ public class Collisions extends Module { public final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") - .description("What blocks should be added collision box.") .filter(this::blockFilter) .build() ); private final Setting magma = sgGeneral.add(new BoolSetting.Builder() .name("magma") - .description("Prevents you from walking over magma blocks.") .defaultValue(false) .build() ); private final Setting unloadedChunks = sgGeneral.add(new BoolSetting.Builder() .name("unloaded-chunks") - .description("Stops you from going into unloaded chunks.") .defaultValue(false) .build() ); private final Setting ignoreBorder = sgGeneral.add(new BoolSetting.Builder() .name("ignore-border") - .description("Removes world border collision.") .defaultValue(false) .build() ); public Collisions() { - super(Categories.World, "collisions", "Adds collision boxes to certain blocks/areas."); + super(Categories.World, "collisions"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java index f2455ea334..7ee661687a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java @@ -33,18 +33,16 @@ public class EChestFarmer extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgRender = settings.createGroup("render"); private final Setting selfToggle = sgGeneral.add(new BoolSetting.Builder() .name("self-toggle") - .description("Disables when you reach the desired amount of obsidian.") .defaultValue(false) .build() ); private final Setting ignoreExisting = sgGeneral.add(new BoolSetting.Builder() .name("ignore-existing") - .description("Ignores existing obsidian in your inventory and mines the total target amount.") .defaultValue(true) .visible(selfToggle::get) .build() @@ -52,7 +50,6 @@ public class EChestFarmer extends Module { private final Setting amount = sgGeneral.add(new IntSetting.Builder() .name("amount") - .description("The amount of obsidian to farm.") .defaultValue(64) .sliderMax(128) .range(8, 512) @@ -65,35 +62,30 @@ public class EChestFarmer extends Module { private final Setting swingHand = sgRender.add(new BoolSetting.Builder() .name("swing-hand") - .description("Swing hand client-side.") .defaultValue(true) .build() ); private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") - .description("Renders a block overlay where the obsidian will be placed.") .defaultValue(true) .build() ); private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The color of the sides of the blocks being rendered.") .defaultValue(new SettingColor(204, 0, 0, 50)) .build() ); private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The color of the lines of the blocks being rendered.") .defaultValue(new SettingColor(204, 0, 0, 255)) .build() ); @@ -104,7 +96,7 @@ public class EChestFarmer extends Module { private int startCount; public EChestFarmer() { - super(Categories.World, "echest-farmer", "Places and breaks EChests to farm obsidian."); + super(Categories.World, "echest-farmer"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EndermanLook.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EndermanLook.java index aed2241daf..beec980d28 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EndermanLook.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EndermanLook.java @@ -27,21 +27,19 @@ public class EndermanLook extends Module { private final Setting lookMode = sgGeneral.add(new EnumSetting.Builder() .name("look-mode") - .description("How this module behaves.") .defaultValue(Mode.Away) .build() ); private final Setting stun = sgGeneral.add(new BoolSetting.Builder() .name("stun-hostiles") - .description("Automatically stares at hostile endermen to stun them in place.") .defaultValue(true) .visible(() -> lookMode.get() == Mode.Away) .build() ); public EndermanLook() { - super(Categories.World, "enderman-look", "Either looks at all Endermen or prevents you from looking at Endermen."); + super(Categories.World, "enderman-look"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java index 03be24476b..00cd4656ae 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java @@ -22,15 +22,15 @@ import net.minecraft.util.hit.BlockHitResult; import org.lwjgl.glfw.GLFW; +// todo map public class Excavator extends Module { private final IBaritone baritone = BaritoneAPI.getProvider().getPrimaryBaritone(); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRendering = settings.createGroup("Rendering"); + private final SettingGroup sgRendering = settings.createGroup("rendering"); // Keybindings private final Setting selectionBind = sgGeneral.add(new KeybindSetting.Builder() .name("selection-bind") - .description("Bind to draw selection.") .defaultValue(Keybind.fromButton(GLFW.GLFW_MOUSE_BUTTON_RIGHT)) .build() ); @@ -38,14 +38,12 @@ public class Excavator extends Module { // Logging private final Setting logSelection = sgGeneral.add(new BoolSetting.Builder() .name("log-selection") - .description("Logs the selection coordinates to the chat.") .defaultValue(true) .build() ); private final Setting keepActive = sgGeneral.add(new BoolSetting.Builder() .name("keep-active") - .description("Keep the module active after finishing the excavation.") .defaultValue(false) .build() ); @@ -53,21 +51,18 @@ public class Excavator extends Module { // Rendering private final Setting shapeMode = sgRendering.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting sideColor = sgRendering.add(new ColorSetting.Builder() .name("side-color") - .description("The side color.") .defaultValue(new SettingColor(255, 255, 255, 50)) .build() ); private final Setting lineColor = sgRendering.add(new ColorSetting.Builder() .name("line-color") - .description("The line color.") .defaultValue(new SettingColor(255, 255, 255, 255)) .build() ); @@ -82,7 +77,7 @@ private enum Status { private BetterBlockPos start, end; public Excavator() { - super(Categories.World, "excavator", "Excavate a selection area."); + super(Categories.World, "excavator"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java index 4b4c2719a3..d831c896df 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java @@ -33,7 +33,6 @@ public class Flamethrower extends Module { private final Setting distance = sgGeneral.add(new DoubleSetting.Builder() .name("distance") - .description("The maximum distance the animal has to be to be roasted.") .min(0.0) .defaultValue(5.0) .build() @@ -41,21 +40,18 @@ public class Flamethrower extends Module { private final Setting antiBreak = sgGeneral.add(new BoolSetting.Builder() .name("anti-break") - .description("Prevents flint and steel from being broken.") .defaultValue(false) .build() ); private final Setting putOutFire = sgGeneral.add(new BoolSetting.Builder() .name("put-out-fire") - .description("Tries to put out the fire when animal is low health, so the items don't burn.") .defaultValue(true) .build() ); private final Setting targetBabies = sgGeneral.add(new BoolSetting.Builder() .name("target-babies") - .description("If checked babies will also be killed.") .defaultValue(false) .build() ); @@ -68,14 +64,12 @@ public class Flamethrower extends Module { private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Automatically faces towards the animal roasted.") .defaultValue(true) .build() ); private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() .name("entities") - .description("Entities to cook.") .defaultValue( EntityType.PIG, EntityType.COW, @@ -91,7 +85,7 @@ public class Flamethrower extends Module { private Hand hand; public Flamethrower() { - super(Categories.World, "flamethrower", "Ignites every alive piece of food."); + super(Categories.World, "flamethrower"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java index 9a82372443..fcf11bc3d1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java @@ -108,17 +108,16 @@ public enum BlockadeType { } private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgDigging = settings.createGroup("Digging"); - private final SettingGroup sgPaving = settings.createGroup("Paving"); - private final SettingGroup sgInventory = settings.createGroup("Inventory"); - private final SettingGroup sgRenderDigging = settings.createGroup("Render Digging"); - private final SettingGroup sgRenderPaving = settings.createGroup("Render Paving"); + private final SettingGroup sgDigging = settings.createGroup("digging"); + private final SettingGroup sgPaving = settings.createGroup("paving"); + private final SettingGroup sgInventory = settings.createGroup("inventory"); + private final SettingGroup sgRenderDigging = settings.createGroup("render-digging"); + private final SettingGroup sgRenderPaving = settings.createGroup("render-paving"); // General private final Setting width = sgGeneral.add(new IntSetting.Builder() .name("width") - .description("Width of the highway.") .defaultValue(4) .range(1, 5) .sliderRange(1, 5) @@ -127,7 +126,6 @@ public enum BlockadeType { private final Setting height = sgGeneral.add(new IntSetting.Builder() .name("height") - .description("Height of the highway.") .defaultValue(3) .range(2, 5) .sliderRange(2, 5) @@ -136,21 +134,18 @@ public enum BlockadeType { private final Setting floor = sgGeneral.add(new EnumSetting.Builder() .name("floor") - .description("What floor placement mode to use.") .defaultValue(Floor.Replace) .build() ); private final Setting railings = sgGeneral.add(new BoolSetting.Builder() .name("railings") - .description("Builds railings next to the highway.") .defaultValue(true) .build() ); private final Setting cornerBlock = sgGeneral.add(new BoolSetting.Builder() .name("corner-support-block") - .description("Places a support block underneath the railings, to prevent air placing.") .defaultValue(true) .visible(railings::get) .build() @@ -158,35 +153,30 @@ public enum BlockadeType { private final Setting mineAboveRailings = sgGeneral.add(new BoolSetting.Builder() .name("mine-above-railings") - .description("Mines blocks above railings.") .defaultValue(true) .build() ); private final Setting rotation = sgGeneral.add(new EnumSetting.Builder() .name("rotation") - .description("Mode of rotation.") .defaultValue(Rotation.Both) .build() ); private final Setting disconnectOnToggle = sgGeneral.add(new BoolSetting.Builder() .name("disconnect-on-toggle") - .description("Automatically disconnects when the module is turned off, for example for not having enough blocks.") .defaultValue(false) .build() ); private final Setting pauseOnLag = sgGeneral.add(new BoolSetting.Builder() .name("pause-on-lag") - .description("Pauses the current process while the server stops responding.") .defaultValue(true) .build() ); private final Setting destroyCrystalTraps = sgGeneral.add(new BoolSetting.Builder() .name("destroy-crystal-traps") - .description("Use a bow to defuse crystal traps safely from a distance. An infinity bow is recommended.") .defaultValue(true) .build() ); @@ -195,14 +185,12 @@ public enum BlockadeType { private final Setting doubleMine = sgDigging.add(new BoolSetting.Builder() .name("double-mine") - .description("Whether to double mine blocks when applicable (normal mine and packet mine simultaneously).") .defaultValue(true) .build() ); private final Setting fastBreak = sgDigging.add(new BoolSetting.Builder() .name("fast-break") - .description("Whether to finish breaking blocks faster than normal while double mining.") .defaultValue(true) .visible(doubleMine::get) .build() @@ -210,14 +198,12 @@ public enum BlockadeType { private final Setting dontBreakTools = sgDigging.add(new BoolSetting.Builder() .name("dont-break-tools") - .description("Don't break tools.") .defaultValue(false) .build() ); private final Setting breakDurability = sgDigging.add(new IntSetting.Builder() .name("durability-percentage") - .description("The durability percentage at which to stop using a tool.") .defaultValue(2) .range(1, 100) .sliderRange(1, 100) @@ -227,7 +213,6 @@ public enum BlockadeType { private final Setting savePickaxes = sgDigging.add(new IntSetting.Builder() .name("save-pickaxes") - .description("How many pickaxes to ensure are saved. Hitting this number in your inventory will trigger a restock or the module toggling off.") .defaultValue(1) .range(0, 36) .sliderRange(0, 36) @@ -237,7 +222,6 @@ public enum BlockadeType { private final Setting breakDelay = sgDigging.add(new IntSetting.Builder() .name("break-delay") - .description("The delay between breaking blocks.") .defaultValue(0) .min(0) .build() @@ -245,7 +229,6 @@ public enum BlockadeType { private final Setting blocksPerTick = sgDigging.add(new IntSetting.Builder() .name("blocks-per-tick") - .description("The maximum amount of blocks that can be mined in a tick. Only applies to blocks instantly breakable.") .defaultValue(1) .range(1, 100) .sliderRange(1, 25) @@ -256,7 +239,6 @@ public enum BlockadeType { public final Setting> blocksToPlace = sgPaving.add(new BlockListSetting.Builder() .name("blocks-to-place") - .description("Blocks it is allowed to place.") .defaultValue(Blocks.OBSIDIAN) .filter(block -> Block.isShapeFullCube(block.getDefaultState().getCollisionShape(EmptyBlockView.INSTANCE, BlockPos.ORIGIN))) .build() @@ -264,7 +246,6 @@ public enum BlockadeType { private final Setting placeRange = sgPaving.add(new DoubleSetting.Builder() .name("place-range") - .description("The maximum distance at which you can place blocks.") .defaultValue(4.5) .sliderMax(5.5) .build() @@ -272,7 +253,6 @@ public enum BlockadeType { private final Setting placeDelay = sgPaving.add(new IntSetting.Builder() .name("place-delay") - .description("The delay between placing blocks.") .defaultValue(0) .min(0) .build() @@ -280,7 +260,6 @@ public enum BlockadeType { private final Setting placementsPerTick = sgPaving.add(new IntSetting.Builder() .name("placements-per-tick") - .description("The maximum amount of blocks that can be placed in a tick.") .defaultValue(1) .min(1) .build() @@ -290,7 +269,6 @@ public enum BlockadeType { private final Setting> trashItems = sgInventory.add(new ItemListSetting.Builder() .name("trash-items") - .description("Items that are considered trash and can be thrown out.") .defaultValue( Items.NETHERRACK, Items.QUARTZ, Items.GOLD_NUGGET, Items.GOLDEN_SWORD, Items.GLOWSTONE_DUST, Items.GLOWSTONE, Items.BLACKSTONE, Items.BASALT, Items.GHAST_TEAR, Items.SOUL_SAND, Items.SOUL_SOIL, @@ -301,7 +279,6 @@ public enum BlockadeType { private final Setting inventoryDelay = sgInventory.add(new IntSetting.Builder() .name("inventory-delay") - .description("Delay in ticks on inventory interactions.") .defaultValue(3) .min(0) .build() @@ -309,28 +286,24 @@ public enum BlockadeType { private final Setting ejectUselessShulkers = sgInventory.add(new BoolSetting.Builder() .name("eject-useless-shulkers") - .description("Whether you should eject useless shulkers. Warning - will throw out any shulkers that don't contain blocks to place, pickaxes, or food. Be careful with your kits.") .defaultValue(true) .build() ); private final Setting searchEnderChest = sgInventory.add(new BoolSetting.Builder() .name("search-ender-chest") - .description("Searches your ender chest to find items to use. Be careful with this one, especially if you let it search through shulkers.") .defaultValue(false) .build() ); private final Setting searchShulkers = sgInventory.add(new BoolSetting.Builder() .name("search-shulkers") - .description("Searches through shulkers to find items to use.") .defaultValue(true) .build() ); private final Setting minEmpty = sgInventory.add(new IntSetting.Builder() .name("minimum-empty-slots") - .description("The minimum amount of empty slots you want left after mining obsidian.") .defaultValue(3) .sliderRange(0, 9) .min(0) @@ -339,14 +312,12 @@ public enum BlockadeType { private final Setting mineEnderChests = sgInventory.add(new BoolSetting.Builder() .name("mine-ender-chests") - .description("Mines ender chests for obsidian.") .defaultValue(true) .build() ); private final Setting blockadeType = sgInventory.add(new EnumSetting.Builder() .name("echest-blockade-type") - .description("What blockade type to use (the structure placed when mining echests).") .defaultValue(BlockadeType.Full) .visible(mineEnderChests::get) .build() @@ -354,7 +325,6 @@ public enum BlockadeType { public final Setting saveEchests = sgInventory.add(new IntSetting.Builder() .name("save-ender-chests") - .description("How many ender chests to ensure are saved. Hitting this number in your inventory will trigger a restock or the module toggling off.") .defaultValue(2) .range(0, 64) .sliderRange(0, 64) @@ -364,7 +334,6 @@ public enum BlockadeType { private final Setting rebreakEchests = sgInventory.add(new BoolSetting.Builder() .name("instantly-rebreak-echests") - .description("Whether or not to use the instant rebreak exploit to break echests.") .defaultValue(false) .visible(mineEnderChests::get) .build() @@ -372,7 +341,6 @@ public enum BlockadeType { private final Setting rebreakTimer = sgInventory.add(new IntSetting.Builder() .name("rebreak-delay") - .description("Delay between rebreak attempts.") .defaultValue(0) .sliderMax(20) .visible(() -> mineEnderChests.get() && rebreakEchests.get()) @@ -383,28 +351,24 @@ public enum BlockadeType { private final Setting renderMine = sgRenderDigging.add(new BoolSetting.Builder() .name("render-blocks-to-mine") - .description("Render blocks to be mined.") .defaultValue(true) .build() ); private final Setting renderMineShape = sgRenderDigging.add(new EnumSetting.Builder() .name("blocks-to-mine-shape-mode") - .description("How the blocks to be mined are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting renderMineSideColor = sgRenderDigging.add(new ColorSetting.Builder() .name("blocks-to-mine-side-color") - .description("Color of blocks to be mined.") .defaultValue(new SettingColor(225, 25, 25, 25)) .build() ); private final Setting renderMineLineColor = sgRenderDigging.add(new ColorSetting.Builder() .name("blocks-to-mine-line-color") - .description("Color of blocks to be mined.") .defaultValue(new SettingColor(225, 25, 25)) .build() ); @@ -413,28 +377,24 @@ public enum BlockadeType { private final Setting renderPlace = sgRenderPaving.add(new BoolSetting.Builder() .name("render-blocks-to-place") - .description("Render blocks to be placed.") .defaultValue(true) .build() ); private final Setting renderPlaceShape = sgRenderPaving.add(new EnumSetting.Builder() .name("blocks-to-place-shape-mode") - .description("How the blocks to be placed are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting renderPlaceSideColor = sgRenderPaving.add(new ColorSetting.Builder() .name("blocks-to-place-side-color") - .description("Color of blocks to be placed.") .defaultValue(new SettingColor(25, 25, 225, 25)) .build() ); private final Setting renderPlaceLineColor = sgRenderPaving.add(new ColorSetting.Builder() .name("blocks-to-place-line-color") - .description("Color of blocks to be placed.") .defaultValue(new SettingColor(25, 25, 225)) .build() ); @@ -462,7 +422,7 @@ public enum BlockadeType { private final MBlockPos posRender3 = new MBlockPos(); public HighwayBuilder() { - super(Categories.World, "highway-builder", "Automatically builds highways."); + super(Categories.World, "highway-builder"); runInMainMenu = true; } @@ -712,7 +672,7 @@ private boolean canPlace(MBlockPos pos, boolean liquids) { } private void disconnect(String message, Object... args) { - MutableText text = Text.literal(String.format("%s[%s%s%s] %s", Formatting.GRAY, Formatting.BLUE, title, Formatting.GRAY, Formatting.RED) + String.format(message, args)).append("\n"); + MutableText text = Text.literal(String.format("%s[%s%s%s] %s", Formatting.GRAY, Formatting.BLUE, this.getTitle(), Formatting.GRAY, Formatting.RED) + String.format(message, args)).append("\n"); text.append(getStatsText()); mc.getNetworkHandler().getConnection().disconnect(text); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java index 18c85701c6..4b0968bd3a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java @@ -34,15 +34,15 @@ import java.util.List; import java.util.function.Predicate; +// todo map public class InfinityMiner extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgWhenFull = settings.createGroup("When Full"); + private final SettingGroup sgWhenFull = settings.createGroup("when-full"); // General public final Setting> targetBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("target-blocks") - .description("The target blocks to mine.") .defaultValue(Blocks.DIAMOND_ORE, Blocks.DEEPSLATE_DIAMOND_ORE) .filter(this::filterBlocks) .build() @@ -50,14 +50,12 @@ public class InfinityMiner extends Module { public final Setting> targetItems = sgGeneral.add(new ItemListSetting.Builder() .name("target-items") - .description("The target items to collect.") .defaultValue(Items.DIAMOND) .build() ); public final Setting> repairBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("repair-blocks") - .description("The repair blocks to mine.") .defaultValue(Blocks.COAL_ORE, Blocks.REDSTONE_ORE, Blocks.NETHER_QUARTZ_ORE) .filter(this::filterBlocks) .build() @@ -65,7 +63,6 @@ public class InfinityMiner extends Module { public final Setting startRepairing = sgGeneral.add(new DoubleSetting.Builder() .name("repair-threshold") - .description("The durability percentage at which to start repairing.") .defaultValue(20) .range(1, 99) .sliderRange(1, 99) @@ -74,7 +71,6 @@ public class InfinityMiner extends Module { public final Setting startMining = sgGeneral.add(new DoubleSetting.Builder() .name("mine-threshold") - .description("The durability percentage at which to start mining.") .defaultValue(70) .range(1, 99) .sliderRange(1, 99) @@ -85,14 +81,12 @@ public class InfinityMiner extends Module { public final Setting walkHome = sgWhenFull.add(new BoolSetting.Builder() .name("walk-home") - .description("Will walk 'home' when your inventory is full.") .defaultValue(false) .build() ); public final Setting logOut = sgWhenFull.add(new BoolSetting.Builder() .name("log-out") - .description("Logs out when your inventory is full. Will walk home FIRST if walk home is enabled.") .defaultValue(false) .build() ); @@ -106,7 +100,7 @@ public class InfinityMiner extends Module { private boolean repairing; public InfinityMiner() { - super(Categories.World, "infinity-miner", "Allows you to essentially mine forever by mining repair blocks when the durability gets low. Needs a mending pickaxe."); + super(Categories.World, "infinity-miner"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/LiquidFiller.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/LiquidFiller.java index cd3b248e9e..d73e95d0b2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/LiquidFiller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/LiquidFiller.java @@ -31,25 +31,22 @@ public class LiquidFiller extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgWhitelist = settings.createGroup("Whitelist"); + private final SettingGroup sgWhitelist = settings.createGroup("whitelist"); private final Setting placeInLiquids = sgGeneral.add(new EnumSetting.Builder() .name("place-in") - .description("What type of liquids to place in.") .defaultValue(PlaceIn.Both) .build() ); private final Setting shape = sgGeneral.add(new EnumSetting.Builder() .name("shape") - .description("The shape of placing algorithm.") .defaultValue(Shape.Sphere) .build() ); private final Setting placeRange = sgGeneral.add(new DoubleSetting.Builder() .name("place-range") - .description("The range at which blocks can be placed.") .defaultValue(4.5) .min(0) .sliderMax(6) @@ -58,7 +55,6 @@ public class LiquidFiller extends Module { private final Setting placeWallsRange = sgGeneral.add(new DoubleSetting.Builder() .name("walls-range") - .description("Range in which to place when behind blocks.") .defaultValue(4.5) .min(0) .sliderMax(6) @@ -67,7 +63,6 @@ public class LiquidFiller extends Module { private final Setting delay = sgGeneral.add(new IntSetting.Builder() .name("delay") - .description("Delay between actions in ticks.") .defaultValue(0) .min(0) .build() @@ -75,7 +70,6 @@ public class LiquidFiller extends Module { private final Setting maxBlocksPerTick = sgGeneral.add(new IntSetting.Builder() .name("max-blocks-per-tick") - .description("Maximum blocks to try to place per tick.") .defaultValue(1) .min(1) .sliderRange(1, 10) @@ -84,14 +78,12 @@ public class LiquidFiller extends Module { private final Setting sortMode = sgGeneral.add(new EnumSetting.Builder() .name("sort-mode") - .description("The blocks you want to place first.") .defaultValue(SortMode.Furthest) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Automatically rotates towards the space targeted for filling.") .defaultValue(true) .build() ); @@ -100,14 +92,12 @@ public class LiquidFiller extends Module { private final Setting listMode = sgWhitelist.add(new EnumSetting.Builder() .name("list-mode") - .description("Selection mode.") .defaultValue(ListMode.Whitelist) .build() ); private final Setting> whitelist = sgWhitelist.add(new BlockListSetting.Builder() .name("whitelist") - .description("The allowed blocks that it will use to fill up the liquid.") .defaultValue( Blocks.DIRT, Blocks.COBBLESTONE, @@ -123,7 +113,6 @@ public class LiquidFiller extends Module { private final Setting> blacklist = sgWhitelist.add(new BlockListSetting.Builder() .name("blacklist") - .description("The denied blocks that it not will use to fill up the liquid.") .visible(() -> listMode.get() == ListMode.Blacklist) .build() ); @@ -133,7 +122,7 @@ public class LiquidFiller extends Module { private int timer; public LiquidFiller(){ - super(Categories.World, "liquid-filler", "Places blocks inside of liquid source blocks within range of you."); + super(Categories.World, "liquid-filler"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/MountBypass.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/MountBypass.java index f4b33af72b..1127d495e8 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/MountBypass.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/MountBypass.java @@ -17,7 +17,7 @@ public class MountBypass extends Module { private boolean dontCancel; public MountBypass() { - super(Categories.World, "mount-bypass", "Allows you to bypass the IllegalStacks plugin and put chests on entities."); + super(Categories.World, "mount-bypass"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/NoGhostBlocks.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/NoGhostBlocks.java index e05462d3ae..caa3b50607 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/NoGhostBlocks.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/NoGhostBlocks.java @@ -20,20 +20,18 @@ public class NoGhostBlocks extends Module { private final Setting breaking = sgGeneral.add(new BoolSetting.Builder() .name("breaking") - .description("Whether to apply for block breaking actions.") .defaultValue(true) .build() ); public final Setting placing = sgGeneral.add(new BoolSetting.Builder() .name("placing") - .description("Whether to apply for block placement actions.") .defaultValue(true) .build() ); public NoGhostBlocks() { - super(Categories.World, "no-ghost-blocks", "Attempts to prevent ghost blocks arising."); + super(Categories.World, "no-ghost-blocks"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java index a644676956..c364769bb6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java @@ -46,28 +46,25 @@ public class Nuker extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgWhitelist = settings.createGroup("Whitelist"); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgWhitelist = settings.createGroup("whitelist"); + private final SettingGroup sgRender = settings.createGroup("render"); // General private final Setting shape = sgGeneral.add(new EnumSetting.Builder() .name("shape") - .description("The shape of nuking algorithm.") .defaultValue(Shape.Sphere) .build() ); private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("The way the blocks are broken.") .defaultValue(Mode.Flatten) .build() ); private final Setting range = sgGeneral.add(new DoubleSetting.Builder() .name("range") - .description("The break range.") .defaultValue(4) .min(0) .visible(() -> shape.get() != Shape.Cube) @@ -76,7 +73,6 @@ public class Nuker extends Module { private final Setting range_up = sgGeneral.add(new IntSetting.Builder() .name("up") - .description("The break range.") .defaultValue(1) .min(0) .visible(() -> shape.get() == Shape.Cube) @@ -85,7 +81,6 @@ public class Nuker extends Module { private final Setting range_down = sgGeneral.add(new IntSetting.Builder() .name("down") - .description("The break range.") .defaultValue(1) .min(0) .visible(() -> shape.get() == Shape.Cube) @@ -94,7 +89,6 @@ public class Nuker extends Module { private final Setting range_left = sgGeneral.add(new IntSetting.Builder() .name("left") - .description("The break range.") .defaultValue(1) .min(0) .visible(() -> shape.get() == Shape.Cube) @@ -103,7 +97,6 @@ public class Nuker extends Module { private final Setting range_right = sgGeneral.add(new IntSetting.Builder() .name("right") - .description("The break range.") .defaultValue(1) .min(0) .visible(() -> shape.get() == Shape.Cube) @@ -112,7 +105,6 @@ public class Nuker extends Module { private final Setting range_forward = sgGeneral.add(new IntSetting.Builder() .name("forward") - .description("The break range.") .defaultValue(1) .min(0) .visible(() -> shape.get() == Shape.Cube) @@ -121,7 +113,6 @@ public class Nuker extends Module { private final Setting range_back = sgGeneral.add(new IntSetting.Builder() .name("back") - .description("The break range.") .defaultValue(1) .min(0) .visible(() -> shape.get() == Shape.Cube) @@ -130,7 +121,6 @@ public class Nuker extends Module { private final Setting wallsRange = sgGeneral.add(new DoubleSetting.Builder() .name("walls-range") - .description("Range in which to break when behind blocks.") .defaultValue(4.0) .min(0) .sliderMax(6) @@ -139,14 +129,12 @@ public class Nuker extends Module { private final Setting delay = sgGeneral.add(new IntSetting.Builder() .name("delay") - .description("Delay in ticks between breaking blocks.") .defaultValue(0) .build() ); private final Setting maxBlocksPerTick = sgGeneral.add(new IntSetting.Builder() .name("max-blocks-per-tick") - .description("Maximum blocks to try to break per tick. Useful when insta mining.") .defaultValue(1) .min(1) .build() @@ -154,35 +142,30 @@ public class Nuker extends Module { private final Setting sortMode = sgGeneral.add(new EnumSetting.Builder() .name("sort-mode") - .description("The blocks you want to mine first.") .defaultValue(SortMode.Closest) .build() ); private final Setting packetMine = sgGeneral.add(new BoolSetting.Builder() .name("packet-mine") - .description("Attempt to instamine everything at once.") .defaultValue(false) .build() ); private final Setting suitableTools = sgGeneral.add(new BoolSetting.Builder() .name("only-suitable-tools") - .description("Only mines when using an appropriate for the block.") .defaultValue(false) .build() ); private final Setting interact = sgGeneral.add(new BoolSetting.Builder() .name("interact") - .description("Interacts with the block instead of mining.") .defaultValue(false) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Rotates server-side to the block being mined.") .defaultValue(true) .build() ); @@ -191,28 +174,24 @@ public class Nuker extends Module { private final Setting listMode = sgWhitelist.add(new EnumSetting.Builder() .name("list-mode") - .description("Selection mode.") .defaultValue(ListMode.Blacklist) .build() ); private final Setting> blacklist = sgWhitelist.add(new BlockListSetting.Builder() .name("blacklist") - .description("The blocks you don't want to mine.") .visible(() -> listMode.get() == ListMode.Blacklist) .build() ); private final Setting> whitelist = sgWhitelist.add(new BlockListSetting.Builder() .name("whitelist") - .description("The blocks you want to mine.") .visible(() -> listMode.get() == ListMode.Whitelist) .build() ); private final Setting selectBlockBind = sgWhitelist.add(new KeybindSetting.Builder() .name("select-block-bind") - .description("Adds targeted block to list when this button is pressed.") .defaultValue(Keybind.none()) .build() ); @@ -221,49 +200,42 @@ public class Nuker extends Module { private final Setting swing = sgRender.add(new BoolSetting.Builder() .name("swing") - .description("Whether to swing hand client-side.") .defaultValue(true) .build() ); private final Setting enableRenderBounding = sgRender.add(new BoolSetting.Builder() .name("bounding-box") - .description("Enable rendering bounding box for Cube and Uniform Cube.") .defaultValue(true) .build() ); private final Setting shapeModeBox = sgRender.add(new EnumSetting.Builder() .name("nuke-box-mode") - .description("How the shape for the bounding box is rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting sideColorBox = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The side color of the bounding box.") .defaultValue(new SettingColor(16,106,144, 100)) .build() ); private final Setting lineColorBox = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The line color of the bounding box.") .defaultValue(new SettingColor(16,106,144, 255)) .build() ); private final Setting enableRenderBreaking = sgRender.add(new BoolSetting.Builder() .name("broken-blocks") - .description("Enable rendering bounding box for Cube and Uniform Cube.") .defaultValue(true) .build() ); private final Setting shapeModeBreak = sgRender.add(new EnumSetting.Builder() .name("nuke-block-mode") - .description("How the shapes for broken blocks are rendered.") .defaultValue(ShapeMode.Both) .visible(enableRenderBreaking::get) .build() @@ -271,7 +243,6 @@ public class Nuker extends Module { private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The side color of the target block rendering.") .defaultValue(new SettingColor(255, 0, 0, 80)) .visible(enableRenderBreaking::get) .build() @@ -279,7 +250,6 @@ public class Nuker extends Module { private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The line color of the target block rendering.") .defaultValue(new SettingColor(255, 0, 0, 255)) .visible(enableRenderBreaking::get) .build() @@ -300,7 +270,7 @@ public class Nuker extends Module { int maxv = 0; public Nuker() { - super(Categories.World, "nuker", "Breaks blocks around you."); + super(Categories.World, "nuker"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/PacketMine.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/PacketMine.java index d2fd88d8da..a3209d11db 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/PacketMine.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/PacketMine.java @@ -35,13 +35,12 @@ public class PacketMine extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General private final Setting delay = sgGeneral.add(new IntSetting.Builder() .name("delay") - .description("Delay between mining blocks in ticks.") .defaultValue(1) .min(0) .build() @@ -49,21 +48,18 @@ public class PacketMine extends Module { private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Sends rotation packets to the server when mining.") .defaultValue(true) .build() ); private final Setting autoSwitch = sgGeneral.add(new BoolSetting.Builder() .name("auto-switch") - .description("Automatically switches to the best tool when the block is ready to be mined instantly.") .defaultValue(false) .build() ); private final Setting notOnUse = sgGeneral.add(new BoolSetting.Builder() .name("not-on-use") - .description("Won't auto switch if you're using an item.") .defaultValue(true) .visible(autoSwitch::get) .build() @@ -71,7 +67,6 @@ public class PacketMine extends Module { private final Setting obscureBreakingProgress = sgGeneral.add(new BoolSetting.Builder() .name("obscure-breaking-progress") - .description("Spams abort breaking packets to obscure the block mining progress from other players. Does not hide it perfectly.") .defaultValue(false) .build() ); @@ -80,42 +75,36 @@ public class PacketMine extends Module { private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") - .description("Whether or not to render the block being mined.") .defaultValue(true) .build() ); private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting readySideColor = sgRender.add(new ColorSetting.Builder() .name("ready-side-color") - .description("The color of the sides of the blocks that can be broken.") .defaultValue(new SettingColor(0, 204, 0, 10)) .build() ); private final Setting readyLineColor = sgRender.add(new ColorSetting.Builder() .name("ready-line-color") - .description("The color of the lines of the blocks that can be broken.") .defaultValue(new SettingColor(0, 204, 0, 255)) .build() ); private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The color of the sides of the blocks being rendered.") .defaultValue(new SettingColor(204, 0, 0, 10)) .build() ); private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The color of the lines of the blocks being rendered.") .defaultValue(new SettingColor(204, 0, 0, 255)) .build() ); @@ -126,7 +115,7 @@ public class PacketMine extends Module { private boolean swapped, shouldUpdateSlot; public PacketMine() { - super(Categories.World, "packet-mine", "Sends packets to mine blocks without the mining animation."); + super(Categories.World, "packet-mine"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java index b1c7856378..28387d3847 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java @@ -31,7 +31,6 @@ public class SpawnProofer extends Module { private final Setting placeDelay = sgGeneral.add(new IntSetting.Builder() .name("place-delay") - .description("The tick delay between placing blocks.") .defaultValue(1) .range(0, 10) .build() @@ -39,7 +38,6 @@ public class SpawnProofer extends Module { private final Setting placeRange = sgGeneral.add(new DoubleSetting.Builder() .name("place-range") - .description("How far away from the player you can place a block.") .defaultValue(4.5) .min(0) .sliderMax(6) @@ -48,7 +46,6 @@ public class SpawnProofer extends Module { private final Setting wallsRange = sgGeneral.add(new DoubleSetting.Builder() .name("walls-range") - .description("How far away from the player you can place a block behind walls.") .defaultValue(4.5) .min(0) .sliderMax(6) @@ -57,7 +54,6 @@ public class SpawnProofer extends Module { private final Setting blocksPerTick = sgGeneral.add(new IntSetting.Builder() .name("blocks-per-tick") - .description("How many blocks to place in one tick.") .defaultValue(1) .min(1) .build() @@ -65,7 +61,6 @@ public class SpawnProofer extends Module { private final Setting lightLevel = sgGeneral.add(new IntSetting.Builder() .name("light-level") - .description("Light levels to spawn proof. Old spawning light: 7.") .defaultValue(0) .min(0) .sliderMax(15) @@ -74,7 +69,6 @@ public class SpawnProofer extends Module { private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") - .description("Block to use for spawn proofing.") .defaultValue(Blocks.TORCH, Blocks.STONE_BUTTON, Blocks.STONE_SLAB) .filter(this::filterBlocks) .build() @@ -82,14 +76,12 @@ public class SpawnProofer extends Module { private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("Which spawn types should be spawn proofed.") .defaultValue(Mode.Both) .build() ); private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Rotates towards the blocks being placed.") .defaultValue(true) .build() ); @@ -99,7 +91,7 @@ public class SpawnProofer extends Module { private int timer; public SpawnProofer() { - super(Categories.World, "spawn-proofer", "Automatically spawnproofs unlit areas."); + super(Categories.World, "spawn-proofer"); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java index cd25bf95d5..3bc9693430 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java @@ -51,7 +51,7 @@ public class StashFinder extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgRender = settings.createGroup("render"); private static final List DEFAULT_SUPPORT_BLOCK_BLACKLIST = List.of( Blocks.OXIDIZED_COPPER, @@ -66,14 +66,12 @@ public class StashFinder extends Module { private final Setting>> storageBlocks = sgGeneral.add(new StorageBlockListSetting.Builder() .name("storage-blocks") - .description("Select the storage blocks to search for.") .defaultValue(StorageBlockListSetting.STORAGE_BLOCKS) .build() ); private final Setting minimumStorageCount = sgGeneral.add(new IntSetting.Builder() .name("minimum-storage-count") - .description("The minimum amount of storage blocks in a chunk to record the chunk.") .defaultValue(4) .min(1) .sliderMin(1) @@ -82,14 +80,12 @@ public class StashFinder extends Module { private final Setting> blacklistedBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("blacklisted-support-blocks") - .description("Blocks that prevent counting a storage block entity when it sits on them.") .defaultValue(DEFAULT_SUPPORT_BLOCK_BLACKLIST) .build() ); private final Setting minimumDistance = sgGeneral.add(new IntSetting.Builder() .name("minimum-distance") - .description("The minimum distance you must be from spawn to record a certain chunk.") .defaultValue(0) .min(0) .sliderMax(10000) @@ -98,14 +94,12 @@ public class StashFinder extends Module { private final Setting sendNotifications = sgGeneral.add(new BoolSetting.Builder() .name("notifications") - .description("Sends Minecraft notifications when new stashes are found.") .defaultValue(true) .build() ); private final Setting notificationMode = sgGeneral.add(new EnumSetting.Builder() .name("notification-mode") - .description("The mode to use for notifications.") .defaultValue(Mode.Both) .visible(sendNotifications::get) .build() @@ -113,14 +107,12 @@ public class StashFinder extends Module { private final Setting renderTracer = sgRender.add(new BoolSetting.Builder() .name("render-tracer") - .description("Renders a tracer to the last found stash.") .defaultValue(true) .build() ); private final Setting traceColor = sgRender.add(new ColorSetting.Builder() .name("tracer-color") - .description("Color of the stash tracer.") .defaultValue(new SettingColor(255, 215, 0, 255)) .visible(renderTracer::get) .build() @@ -128,7 +120,6 @@ public class StashFinder extends Module { private final Setting traceArrivalDistance = sgRender.add(new IntSetting.Builder() .name("tracer-hide-at-distance") - .description("Hide the trace when you are this close to the stash.") .defaultValue(16) .min(1) .sliderMin(1) @@ -139,7 +130,6 @@ public class StashFinder extends Module { private final Setting traceMaxDistance = sgRender.add(new IntSetting.Builder() .name("tracer-max-distance") - .description("Hide the trace when you are farther than this distance from the stash.") .defaultValue(2000) .min(10) .sliderMin(50) @@ -150,14 +140,12 @@ public class StashFinder extends Module { private final Setting renderChunkColumn = sgRender.add(new BoolSetting.Builder() .name("render-chunk-column") - .description("Renders a vertical column at the center of traced chunks.") .defaultValue(false) .build() ); private final Setting traceColumnColor = sgRender.add(new ColorSetting.Builder() .name("chunk-column-color") - .description("Color of the stash tracer column.") .defaultValue(new SettingColor(255, 215, 0, 100)) .visible(renderChunkColumn::get) .build() @@ -165,7 +153,6 @@ public class StashFinder extends Module { private final Setting clearTracesBind = sgRender.add(new KeybindSetting.Builder() .name("clear-traces-bind") - .description("Keybind to clear all stash traces.") .defaultValue(Keybind.none()) .build() ); @@ -175,7 +162,7 @@ public class StashFinder extends Module { public List chunks = new ArrayList<>(); public StashFinder() { - super(Categories.World, "stash-finder", "Searches loaded chunks for storage blocks. Saves to /meteor-client"); + super(Categories.World, "stash-finder"); } @Override @@ -236,12 +223,12 @@ private void onChunkData(ChunkDataEvent event) { switch (notificationMode.get()) { case Chat -> sendChatNotification(chunk); case Toast -> { - MeteorToast toast = new MeteorToast.Builder(title).icon(Items.CHEST).text("Found Stash!").build(); + MeteorToast toast = new MeteorToast.Builder(this.getTitle()).icon(Items.CHEST).text("Found Stash!").build(); mc.getToastManager().add(toast); } case Both -> { sendChatNotification(chunk); - MeteorToast toast = new MeteorToast.Builder(title).icon(Items.CHEST).text("Found Stash!").build(); + MeteorToast toast = new MeteorToast.Builder(this.getTitle()).icon(Items.CHEST).text("Found Stash!").build(); mc.getToastManager().add(toast); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Timer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Timer.java index 7f0bd8f516..6b97670b4a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Timer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Timer.java @@ -16,7 +16,6 @@ public class Timer extends Module { private final Setting multiplier = sgGeneral.add(new DoubleSetting.Builder() .name("multiplier") - .description("The timer multiplier amount.") .defaultValue(1) .min(0.1) .sliderMin(0.1) @@ -27,7 +26,7 @@ public class Timer extends Module { private double override = 1; public Timer() { - super(Categories.World, "timer", "Changes the speed of everything in your game."); + super(Categories.World, "timer"); } public double getMultiplier() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java index 1060dd4082..ef7a7ac268 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java @@ -34,7 +34,7 @@ public class VeinMiner extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgRender = settings.createGroup("render"); private final Set blockNeighbours = Set.of( new Vec3i(1, -1, 1), new Vec3i(0, -1, 1), new Vec3i(-1, -1, 1), @@ -54,21 +54,18 @@ public class VeinMiner extends Module { private final Setting> selectedBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") - .description("Which blocks to select.") .defaultValue(Blocks.STONE, Blocks.DIRT, Blocks.GRASS_BLOCK) .build() ); private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("Selection mode.") .defaultValue(ListMode.Blacklist) .build() ); private final Setting depth = sgGeneral.add(new IntSetting.Builder() .name("depth") - .description("Amount of iterations used to scan for similar blocks.") .defaultValue(3) .min(1) .sliderRange(1, 15) @@ -77,7 +74,6 @@ public class VeinMiner extends Module { private final Setting delay = sgGeneral.add(new IntSetting.Builder() .name("delay") - .description("Delay between mining blocks.") .defaultValue(0) .min(0) .sliderRange(0, 20) @@ -86,7 +82,6 @@ public class VeinMiner extends Module { private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") - .description("Sends rotation packets to the server when mining.") .defaultValue(true) .build() ); @@ -95,35 +90,30 @@ public class VeinMiner extends Module { private final Setting swingHand = sgRender.add(new BoolSetting.Builder() .name("swing-hand") - .description("Swing hand client-side.") .defaultValue(true) .build() ); private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") - .description("Whether or not to render the block being mined.") .defaultValue(true) .build() ); private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The color of the sides of the blocks being rendered.") .defaultValue(new SettingColor(204, 0, 0, 10)) .build() ); private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The color of the lines of the blocks being rendered.") .defaultValue(new SettingColor(204, 0, 0, 255)) .build() ); @@ -135,7 +125,7 @@ public class VeinMiner extends Module { private int tick = 0; public VeinMiner() { - super(Categories.World, "vein-miner", "Mines all nearby blocks with this type"); + super(Categories.World, "vein-miner"); } @Override diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index c27502e5fe..c71eb7572f 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -70,5 +70,3387 @@ "meteor.command.wasp.description": "Sets the auto wasp target.", "meteor.command.wasp.exception.cant_wasp_self": "You cannot target yourself!", "meteor.command.wasp.info.target": "%s set as target.", - "meteor.command.waypoint.description": "Manages waypoints." + "meteor.command.waypoint.description": "Manages waypoints.", + + "category.combat": "Combat", + "category.player": "Player", + "category.movement": "Movement", + "category.render": "Render", + "category.world": "World", + "category.misc": "Misc", + + "module.base.general": "General", + + "module.air-jump": "Air Jump", + "module.air-jump.description": "Lets you jump in the air.", + "module.air-jump.general.maintain-level": "Maintain Level", + "module.air-jump.general.maintain-level.description": "Maintains your current Y level when holding the jump key.", + + "module.auto-fish": "Auto Fish", + "module.auto-fish.description": "Automatically fishes for you.", + "module.auto-fish.general.auto-switch": "Auto Switch", + "module.auto-fish.general.auto-switch.description": "Automatically switch to a fishing rod.", + "module.auto-fish.general.anti-break": "Anti Break", + "module.auto-fish.general.anti-break.description": "Avoid using rods that would break if they were cast.", + "module.auto-fish.general.auto-cast": "Auto Cast", + "module.auto-fish.general.auto-cast.description": "Automatically cast the fishing rod.", + "module.auto-fish.general.cast-delay": "Cast Delay", + "module.auto-fish.general.cast-delay.description": "How long to wait between recasts if the bobber fails to land in water.", + "module.auto-fish.general.cast-delay-variance": "Cast Delay Variance", + "module.auto-fish.general.cast-delay-variance.description": "Maximum amount of randomness added to cast delay.", + "module.auto-fish.general.catch-delay": "Catch Delay", + "module.auto-fish.general.catch-delay.description": "How long to wait after hooking a fish to reel it in.", + "module.auto-fish.general.catch-delay-variance": "Catch Delay Variance", + "module.auto-fish.general.catch-delay-variance.description": "Maximum amount of randomness added to catch delay.", + + "module.name-protect": "Name Protect", + "module.name-protect.description": "Hide player names and skins.", + "module.name-protect.general.name-protect": "Name Protect", + "module.name-protect.general.name-protect.description": "Hides your name client-side.", + "module.name-protect.general.name": "Name", + "module.name-protect.general.name.description": "Name to be replaced with.", + "module.name-protect.general.skin-protect": "Skin Protect", + "module.name-protect.general.skin-protect.description": "Make players become Steves.", + + "module.velocity": "Velocity", + "module.velocity.description": "Prevents you from being moved by external forces.", + "module.velocity.general.knockback": "Knockback", + "module.velocity.general.knockback.description": "Modifies the amount of knockback you take from attacks.", + "module.velocity.general.knockback-horizontal": "Knockback Horizontal", + "module.velocity.general.knockback-horizontal.description": "How much horizontal knockback you will take.", + "module.velocity.general.knockback-vertical": "Knockback Vertical", + "module.velocity.general.knockback-vertical.description": "How much vertical knockback you will take.", + "module.velocity.general.explosions": "Explosions", + "module.velocity.general.explosions.description": "Modifies your knockback from explosions.", + "module.velocity.general.explosions-horizontal": "Explosions Horizontal", + "module.velocity.general.explosions-horizontal.description": "How much velocity you will take from explosions horizontally.", + "module.velocity.general.explosions-vertical": "Explosions Vertical", + "module.velocity.general.explosions-vertical.description": "How much velocity you will take from explosions vertically.", + "module.velocity.general.liquids": "Liquids", + "module.velocity.general.liquids.description": "Modifies the amount you are pushed by flowing liquids.", + "module.velocity.general.liquids-horizontal": "Liquids Horizontal", + "module.velocity.general.liquids-horizontal.description": "How much velocity you will take from liquids horizontally.", + "module.velocity.general.liquids-vertical": "Liquids Vertical", + "module.velocity.general.liquids-vertical.description": "How much velocity you will take from liquids vertically.", + "module.velocity.general.entity-push": "Entity Push", + "module.velocity.general.entity-push.description": "Modifies the amount you are pushed by entities.", + "module.velocity.general.entity-push-amount": "Entity Push Amount", + "module.velocity.general.entity-push-amount.description": "How much you will be pushed.", + "module.velocity.general.blocks": "Blocks", + "module.velocity.general.blocks.description": "Prevents you from being pushed out of blocks.", + "module.velocity.general.sinking": "Sinking", + "module.velocity.general.sinking.description": "Prevents you from sinking in liquids.", + "module.velocity.general.fishing": "Fishing", + "module.velocity.general.fishing.description": "Prevents you from being pulled by fishing rods.", + + "module.no-ghost-blocks": "No Ghost Blocks", + "module.no-ghost-blocks.description": "Attempts to prevent ghost blocks arising.", + "module.no-ghost-blocks.general.breaking": "Breaking", + "module.no-ghost-blocks.general.breaking.description": "Whether to apply for block breaking actions.", + "module.no-ghost-blocks.general.placing": "Placing", + "module.no-ghost-blocks.general.placing.description": "Whether to apply for block placement actions.", + + "module.bed-aura": "Bed Aura", + "module.bed-aura.description": "Automatically places and explodes beds in the Nether and End.", + "module.bed-aura.general.delay": "Delay", + "module.bed-aura.general.delay.description": "The delay between placing beds in ticks.", + "module.bed-aura.general.strict-direction": "Strict Direction", + "module.bed-aura.general.strict-direction.description": "Only places beds in the direction you are facing.", + "module.bed-aura.targeting": "Targeting", + "module.bed-aura.targeting.target-range": "Target Range", + "module.bed-aura.targeting.target-range.description": "The range at which players can be targeted.", + "module.bed-aura.targeting.target-priority": "Target Priority", + "module.bed-aura.targeting.target-priority.description": "How to filter targets within range.", + "module.bed-aura.targeting.min-damage": "Min Damage", + "module.bed-aura.targeting.min-damage.description": "The minimum damage to inflict on your target.", + "module.bed-aura.targeting.max-self-damage": "Max Self Damage", + "module.bed-aura.targeting.max-self-damage.description": "The maximum damage to inflict on yourself.", + "module.bed-aura.targeting.anti-suicide": "Anti Suicide", + "module.bed-aura.targeting.anti-suicide.description": "Will not place and break beds if they will kill you.", + "module.bed-aura.inventory": "Inventory", + "module.bed-aura.inventory.auto-move": "Auto Move", + "module.bed-aura.inventory.auto-move.description": "Moves beds into a selected hotbar slot.", + "module.bed-aura.inventory.auto-move-slot": "Auto Move Slot", + "module.bed-aura.inventory.auto-move-slot.description": "The slot auto move moves beds to.", + "module.bed-aura.inventory.auto-switch": "Auto Switch", + "module.bed-aura.inventory.auto-switch.description": "Switches to and from beds automatically.", + "module.bed-aura.pause": "Pause", + "module.bed-aura.pause.pause-on-eat": "Pause On Eat", + "module.bed-aura.pause.pause-on-eat.description": "Pauses while eating.", + "module.bed-aura.pause.pause-on-drink": "Pause On Drink", + "module.bed-aura.pause.pause-on-drink.description": "Pauses while drinking.", + "module.bed-aura.pause.pause-on-mine": "Pause On Mine", + "module.bed-aura.pause.pause-on-mine.description": "Pauses while mining.", + "module.bed-aura.render": "Render", + "module.bed-aura.render.swing": "Swing", + "module.bed-aura.render.swing.description": "Whether to swing hand client-side.", + "module.bed-aura.render.render": "Render", + "module.bed-aura.render.render.description": "Renders the block where it is placing a bed.", + "module.bed-aura.render.shape-mode": "Shape Mode", + "module.bed-aura.render.shape-mode.description": "How the shapes are rendered.", + "module.bed-aura.render.side-color": "Side Color", + "module.bed-aura.render.side-color.description": "The side color for positions to be placed.", + "module.bed-aura.render.line-color": "Line Color", + "module.bed-aura.render.line-color.description": "The line color for positions to be placed.", + + "module.auto-jump": "Auto Jump", + "module.auto-jump.description": "Automatically jumps.", + "module.auto-jump.general.mode": "Mode", + "module.auto-jump.general.mode.description": "The method of jumping.", + "module.auto-jump.general.jump-if": "Jump If", + "module.auto-jump.general.jump-if.description": "Jump if.", + "module.auto-jump.general.velocity-height": "Velocity Height", + "module.auto-jump.general.velocity-height.description": "The distance that velocity mode moves you.", + + "module.ambience": "Ambience", + "module.ambience.description": "Change the color of various pieces of the environment.", + "module.ambience.sky": "Sky", + "module.ambience.sky.end-sky": "End Sky", + "module.ambience.sky.end-sky.description": "Makes the sky like the end.", + "module.ambience.sky.custom-sky-color": "Custom Sky Color", + "module.ambience.sky.custom-sky-color.description": "Whether the sky color should be changed.", + "module.ambience.sky.overworld-sky-color": "Overworld Sky Color", + "module.ambience.sky.overworld-sky-color.description": "The color of the overworld sky.", + "module.ambience.sky.nether-sky-color": "Nether Sky Color", + "module.ambience.sky.nether-sky-color.description": "The color of the nether sky.", + "module.ambience.sky.end-sky-color": "End Sky Color", + "module.ambience.sky.end-sky-color.description": "The color of the end sky.", + "module.ambience.sky.custom-cloud-color": "Custom Cloud Color", + "module.ambience.sky.custom-cloud-color.description": "Whether the clouds color should be changed.", + "module.ambience.sky.cloud-color": "Cloud Color", + "module.ambience.sky.cloud-color.description": "The color of the clouds.", + "module.ambience.sky.custom-lightning-color": "Custom Lightning Color", + "module.ambience.sky.custom-lightning-color.description": "Whether the lightning color should be changed.", + "module.ambience.sky.lightning-color": "Lightning Color", + "module.ambience.sky.lightning-color.description": "The color of the lightning.", + "module.ambience.world": "World", + "module.ambience.world.custom-grass-color": "Custom Grass Color", + "module.ambience.world.custom-grass-color.description": "Whether the grass color should be changed.", + "module.ambience.world.grass-color": "Grass Color", + "module.ambience.world.grass-color.description": "The color of the grass.", + "module.ambience.world.custom-foliage-color": "Custom Foliage Color", + "module.ambience.world.custom-foliage-color.description": "Whether the foliage color should be changed.", + "module.ambience.world.foliage-color": "Foliage Color", + "module.ambience.world.foliage-color.description": "The color of the foliage.", + "module.ambience.world.custom-water-color": "Custom Water Color", + "module.ambience.world.custom-water-color.description": "Whether the water color should be changed.", + "module.ambience.world.water-color": "Water Color", + "module.ambience.world.water-color.description": "The color of the water.", + "module.ambience.world.custom-lava-color": "Custom Lava Color", + "module.ambience.world.custom-lava-color.description": "Whether the lava color should be changed.", + "module.ambience.world.lava-color": "Lava Color", + "module.ambience.world.lava-color.description": "The color of the lava.", + "module.ambience.world.custom-fog-color": "Custom Fog Color", + "module.ambience.world.custom-fog-color.description": "Whether the fog color should be changed.", + "module.ambience.world.fog-color": "Fog Color", + "module.ambience.world.fog-color.description": "The color of the fog.", + + "module.better-tooltips": "Better Tooltips", + "module.better-tooltips.description": "Displays more useful tooltips for certain items.", + "module.better-tooltips.general.display-when": "Display When", + "module.better-tooltips.general.display-when.description": "When to display previews.", + "module.better-tooltips.general.keybind": "Keybind", + "module.better-tooltips.general.keybind.description": "The bind for keybind mode.", + "module.better-tooltips.general.open-contents": "Open Contents", + "module.better-tooltips.general.open-contents.description": "Opens a GUI window with the inventory of the storage block or book when you click the item.", + "module.better-tooltips.general.keybind-$todo-duplicates$": "Keybind", + "module.better-tooltips.general.keybind.description-$todo-duplicates$": "Key to open contents (containers, books, etc.) when pressed on items.", + "module.better-tooltips.general.pause-in-creative": "Pause In Creative", + "module.better-tooltips.general.pause-in-creative.description": "Pauses middle click open while the player is in creative mode.", + "module.better-tooltips.previews": "Previews", + "module.better-tooltips.previews.containers": "Containers", + "module.better-tooltips.previews.containers.description": "Shows a preview of a containers when hovering over it in an inventory.", + "module.better-tooltips.previews.compact-shulker-tooltip": "Compact Shulker Tooltip", + "module.better-tooltips.previews.compact-shulker-tooltip.description": "Compacts the lines of the shulker tooltip.", + "module.better-tooltips.previews.echests": "Echests", + "module.better-tooltips.previews.echests.description": "Shows a preview of your echest when hovering over it in an inventory.", + "module.better-tooltips.previews.maps": "Maps", + "module.better-tooltips.previews.maps.description": "Shows a preview of a map when hovering over it in an inventory.", + "module.better-tooltips.previews.map-scale": "Map Scale", + "module.better-tooltips.previews.map-scale.description": "The scale of the map preview.", + "module.better-tooltips.previews.books": "Books", + "module.better-tooltips.previews.books.description": "Shows contents of a book when hovering over it in an inventory.", + "module.better-tooltips.previews.banners": "Banners", + "module.better-tooltips.previews.banners.description": "Shows banners' patterns when hovering over it in an inventory. Also works with shields.", + "module.better-tooltips.previews.entities-in-buckets": "Entities In Buckets", + "module.better-tooltips.previews.entities-in-buckets.description": "Shows entities in buckets when hovering over it in an inventory.", + "module.better-tooltips.previews.bundles": "Bundles", + "module.better-tooltips.previews.bundles.description": "Shows a preview of bundle contents when hovering over it in an inventory.", + "module.better-tooltips.previews.food-info": "Food Info", + "module.better-tooltips.previews.food-info.description": "Shows hunger and saturation values for food items.", + "module.better-tooltips.other": "Other", + "module.better-tooltips.other.byte-size": "Byte Size", + "module.better-tooltips.other.byte-size.description": "Displays an item's size in bytes in the tooltip.", + "module.better-tooltips.other.byte-size-format": "Byte Size Format", + "module.better-tooltips.other.byte-size-format.description": "The format by which to display the item's byte size.", + "module.better-tooltips.other.status-effects": "Status Effects", + "module.better-tooltips.other.status-effects.description": "Adds list of status effects to tooltips of food items.", + "module.better-tooltips.hide-flags": "Hide Flags", + "module.better-tooltips.hide-flags.tooltip": "Tooltip", + "module.better-tooltips.hide-flags.tooltip.description": "Show the tooltip when it's hidden.", + "module.better-tooltips.hide-flags.tooltip-components": "Tooltip Components", + "module.better-tooltips.hide-flags.tooltip-components.description": "Shows tooltip components when they're hidden - e.g. enchantments, attributes, lore, etc.", + + "module.notifier": "Notifier", + "module.notifier.description": "Notifies you of different events.", + "module.notifier.totem-pops": "Totem Pops", + "module.notifier.totem-pops.totem-pops": "Totem Pops", + "module.notifier.totem-pops.totem-pops.description": "Notifies you when a player pops a totem.", + "module.notifier.totem-pops.distance-check": "Distance Check", + "module.notifier.totem-pops.distance-check.description": "Limits the distance in which the pops are recognized.", + "module.notifier.totem-pops.player-radius": "Player Radius", + "module.notifier.totem-pops.player-radius.description": "The radius in which to log totem pops.", + "module.notifier.totem-pops.ignore-own": "Ignore Own", + "module.notifier.totem-pops.ignore-own.description": "Ignores your own totem pops.", + "module.notifier.totem-pops.ignore-friends": "Ignore Friends", + "module.notifier.totem-pops.ignore-friends.description": "Ignores friends totem pops.", + "module.notifier.totem-pops.ignore-others": "Ignore Others", + "module.notifier.totem-pops.ignore-others.description": "Ignores other players totem pops.", + "module.notifier.visual-range": "Visual Range", + "module.notifier.visual-range.visual-range": "Visual Range", + "module.notifier.visual-range.visual-range.description": "Notifies you when an entity enters your render distance.", + "module.notifier.visual-range.event": "Event", + "module.notifier.visual-range.event.description": "When to log the entities.", + "module.notifier.visual-range.entities": "Entities", + "module.notifier.visual-range.entities.description": "Which entities to notify about.", + "module.notifier.visual-range.ignore-friends": "Ignore Friends", + "module.notifier.visual-range.ignore-friends.description": "Ignores friends.", + "module.notifier.visual-range.ignore-fake-players": "Ignore Fake Players", + "module.notifier.visual-range.ignore-fake-players.description": "Ignores fake players.", + "module.notifier.visual-range.sound": "Sound", + "module.notifier.visual-range.sound.description": "Emits a sound effect on enter / leave", + "module.notifier.pearl": "Pearl", + "module.notifier.pearl.pearl": "Pearl", + "module.notifier.pearl.pearl.description": "Notifies you when a player is teleported using an ender pearl.", + "module.notifier.pearl.ignore-own": "Ignore Own", + "module.notifier.pearl.ignore-own.description": "Ignores your own pearls.", + "module.notifier.pearl.ignore-friends": "Ignore Friends", + "module.notifier.pearl.ignore-friends.description": "Ignores friends pearls.", + "module.notifier.joins/leaves": "Joins/Leaves", + "module.notifier.joins/leaves.player-joins-leaves": "Player Joins Leaves", + "module.notifier.joins/leaves.player-joins-leaves.description": "How to handle player join/leave notifications.", + "module.notifier.joins/leaves.notification-delay": "Notification Delay", + "module.notifier.joins/leaves.notification-delay.description": "How long to wait in ticks before posting the next join/leave notification in your chat.", + "module.notifier.joins/leaves.simple-notifications": "Simple Notifications", + "module.notifier.joins/leaves.simple-notifications.description": "Display join/leave notifications without a prefix, to reduce chat clutter.", + + "module.item-physics": "Item Physics", + "module.item-physics.description": "Applies physics to items on the ground.", + "module.item-physics.general.random-rotation": "Random Rotation", + "module.item-physics.general.random-rotation.description": "Adds a random rotation to every item.", + + "module.air-place": "Air Place", + "module.air-place.description": "Places a block where your crosshair is pointing at.", + "module.air-place.general.render": "Render", + "module.air-place.general.render.description": "Renders a block overlay where the obsidian will be placed.", + "module.air-place.general.shape-mode": "Shape Mode", + "module.air-place.general.shape-mode.description": "How the shapes are rendered.", + "module.air-place.general.side-color": "Side Color", + "module.air-place.general.side-color.description": "The color of the sides of the blocks being rendered.", + "module.air-place.general.line-color": "Line Color", + "module.air-place.general.line-color.description": "The color of the lines of the blocks being rendered.", + "module.air-place.range": "Range", + "module.air-place.range.custom-range": "Custom Range", + "module.air-place.range.custom-range.description": "Use custom range for air place.", + "module.air-place.range.range": "Range", + "module.air-place.range.range.description": "Custom range to place at.", + + "module.enderman-look": "Enderman Look", + "module.enderman-look.description": "Either looks at all Endermen or prevents you from looking at Endermen.", + "module.enderman-look.general.look-mode": "Look Mode", + "module.enderman-look.general.look-mode.description": "How this module behaves.", + "module.enderman-look.general.stun-hostiles": "Stun Hostiles", + "module.enderman-look.general.stun-hostiles.description": "Automatically stares at hostile endermen to stun them in place.", + + "module.timer": "Timer", + "module.timer.description": "Changes the speed of everything in your game.", + "module.timer.general.multiplier": "Multiplier", + "module.timer.general.multiplier.description": "The timer multiplier amount.", + + "module.surround": "Surround", + "module.surround.description": "Surrounds you in blocks to prevent massive crystal damage.", + "module.surround.general.blocks": "Blocks", + "module.surround.general.blocks.description": "What blocks to use for surround.", + "module.surround.general.delay": "Delay", + "module.surround.general.delay.description": "Delay, in ticks, between block placements.", + "module.surround.general.blocks-per-tick": "Blocks Per Tick", + "module.surround.general.blocks-per-tick.description": "How many blocks to place in one tick.", + "module.surround.general.center": "Center", + "module.surround.general.center.description": "Teleports you to the center of the block.", + "module.surround.general.double-height": "Double Height", + "module.surround.general.double-height.description": "Places obsidian on top of the original surround blocks to prevent people from face-placing you.", + "module.surround.general.only-on-ground": "Only On Ground", + "module.surround.general.only-on-ground.description": "Works only when you are standing on blocks.", + "module.surround.general.air-place": "Air Place", + "module.surround.general.air-place.description": "Allows Surround to place blocks in the air.", + "module.surround.general.toggle-modules": "Toggle Modules", + "module.surround.general.toggle-modules.description": "Turn off other modules when surround is activated.", + "module.surround.general.toggle-back-on": "Toggle Back On", + "module.surround.general.toggle-back-on.description": "Turn the other modules back on when surround is deactivated.", + "module.surround.general.modules": "Modules", + "module.surround.general.modules.description": "Which modules to disable on activation.", + "module.surround.general.rotate": "Rotate", + "module.surround.general.rotate.description": "Automatically faces towards the obsidian being placed.", + "module.surround.general.protect": "Protect", + "module.surround.general.protect.description": "Attempts to break crystals around surround positions to prevent surround break.", + "module.surround.toggles": "Toggles", + "module.surround.toggles.toggle-on-y-change": "Toggle On Y Change", + "module.surround.toggles.toggle-on-y-change.description": "Automatically disables when your y level changes (step, jumping, etc).", + "module.surround.toggles.toggle-on-complete": "Toggle On Complete", + "module.surround.toggles.toggle-on-complete.description": "Toggles off when all blocks are placed.", + "module.surround.toggles.toggle-on-death": "Toggle On Death", + "module.surround.toggles.toggle-on-death.description": "Toggles off when you die.", + "module.surround.render": "Render", + "module.surround.render.swing": "Swing", + "module.surround.render.swing.description": "Render your hand swinging when placing surround blocks.", + "module.surround.render.render": "Render", + "module.surround.render.render.description": "Renders a block overlay where the obsidian will be placed.", + "module.surround.render.below": "Below", + "module.surround.render.below.description": "Renders the block below you.", + "module.surround.render.shape-mode": "Shape Mode", + "module.surround.render.shape-mode.description": "How the shapes are rendered.", + "module.surround.render.safe-side-color": "Safe Side Color", + "module.surround.render.safe-side-color.description": "The side color for safe blocks.", + "module.surround.render.safe-line-color": "Safe Line Color", + "module.surround.render.safe-line-color.description": "The line color for safe blocks.", + "module.surround.render.normal-side-color": "Normal Side Color", + "module.surround.render.normal-side-color.description": "The side color for normal blocks.", + "module.surround.render.normal-line-color": "Normal Line Color", + "module.surround.render.normal-line-color.description": "The line color for normal blocks.", + "module.surround.render.unsafe-side-color": "Unsafe Side Color", + "module.surround.render.unsafe-side-color.description": "The side color for unsafe blocks.", + "module.surround.render.unsafe-line-color": "Unsafe Line Color", + "module.surround.render.unsafe-line-color.description": "The line color for unsafe blocks.", + + "module.no-rotate": "No Rotate", + "module.no-rotate.description": "Attempts to block rotations sent from server to client.", + + "module.long-jump": "Long Jump", + "module.long-jump.description": "Allows you to jump further than normal.", + "module.long-jump.general.mode": "Mode", + "module.long-jump.general.mode.description": "The method of jumping.", + "module.long-jump.general.vanilla-boost-factor": "Vanilla Boost Factor", + "module.long-jump.general.vanilla-boost-factor.description": "The amount by which to boost the jump.", + "module.long-jump.general.burst-initial-speed": "Burst Initial Speed", + "module.long-jump.general.burst-initial-speed.description": "The initial speed of the runup.", + "module.long-jump.general.burst-boost-factor": "Burst Boost Factor", + "module.long-jump.general.burst-boost-factor.description": "The amount by which to boost the jump.", + "module.long-jump.general.only-on-ground": "Only On Ground", + "module.long-jump.general.only-on-ground.description": "Only performs the jump if you are on the ground.", + "module.long-jump.general.on-jump": "On Jump", + "module.long-jump.general.on-jump.description": "Whether the player needs to jump first or not.", + "module.long-jump.general.glide-multiplier": "Glide Multiplier", + "module.long-jump.general.glide-multiplier.description": "The amount by to multiply the glide velocity.", + "module.long-jump.general.timer": "Timer", + "module.long-jump.general.timer.description": "Timer override.", + "module.long-jump.general.auto-disable": "Auto Disable", + "module.long-jump.general.auto-disable.description": "Automatically disabled the module after jumping.", + "module.long-jump.general.disable-on-rubberband": "Disable On Rubberband", + "module.long-jump.general.disable-on-rubberband.description": "Disables the module when you get lagged back.", + + "module.trajectories": "Trajectories", + "module.trajectories.description": "Predicts the trajectory of throwable items.", + "module.trajectories.general.items": "Items", + "module.trajectories.general.items.description": "Items to display trajectories for.", + "module.trajectories.general.other-players": "Other Players", + "module.trajectories.general.other-players.description": "Calculates trajectories for other players.", + "module.trajectories.general.fired-projectiles": "Fired Projectiles", + "module.trajectories.general.fired-projectiles.description": "Calculates trajectories for already fired projectiles.", + "module.trajectories.general.ignore-wither-skulls": "Ignore Wither Skulls", + "module.trajectories.general.ignore-wither-skulls.description": "Whether to ignore fired wither skulls.", + "module.trajectories.general.accurate": "Accurate", + "module.trajectories.general.accurate.description": "Whether or not to calculate more accurate.", + "module.trajectories.general.simulation-steps": "Simulation Steps", + "module.trajectories.general.simulation-steps.description": "How many steps to simulate projectiles. Zero for no limit", + "module.trajectories.render": "Render", + "module.trajectories.render.ignore-rendering-first-ticks": "Ignore Rendering First Ticks", + "module.trajectories.render.ignore-rendering-first-ticks.description": "Ignores rendering the first given ticks, to make the rest of the path more visible.", + "module.trajectories.render.shape-mode": "Shape Mode", + "module.trajectories.render.shape-mode.description": "How the shapes are rendered.", + "module.trajectories.render.side-color": "Side Color", + "module.trajectories.render.side-color.description": "The side color.", + "module.trajectories.render.line-color": "Line Color", + "module.trajectories.render.line-color.description": "The line color.", + "module.trajectories.render.render-position-boxes": "Render Position Boxes", + "module.trajectories.render.render-position-boxes.description": "Renders the actual position the projectile will be at each tick along it's trajectory.", + "module.trajectories.render.position-box-size": "Position Box Size", + "module.trajectories.render.position-box-size.description": "The size of the box drawn at the simulated positions.", + "module.trajectories.render.position-side-color": "Position Side Color", + "module.trajectories.render.position-side-color.description": "The side color.", + "module.trajectories.render.position-line-color": "Position Line Color", + "module.trajectories.render.position-line-color.description": "The line color.", + + "module.chams": "Chams", + "module.chams.description": "Tweaks rendering of entities.", + "module.chams.through-walls": "Through Walls", + "module.chams.through-walls.entities": "Entities", + "module.chams.through-walls.entities.description": "Select entities to show through walls.", + "module.chams.through-walls.shader": "Shader", + "module.chams.through-walls.shader.description": "Renders a shader over of the entities.", + "module.chams.through-walls.color": "Color", + "module.chams.through-walls.color.description": "The color that the shader is drawn with.", + "module.chams.through-walls.ignore-self": "Ignore Self", + "module.chams.through-walls.ignore-self.description": "Ignores yourself drawing the player.", + "module.chams.players": "Players", + "module.chams.players.players": "Players", + "module.chams.players.players.description": "Enables model tweaks for players.", + "module.chams.players.ignore-self": "Ignore Self", + "module.chams.players.ignore-self.description": "Ignores yourself when tweaking player models.", + "module.chams.players.texture": "Texture", + "module.chams.players.texture.description": "Enables player model textures.", + "module.chams.players.color": "Color", + "module.chams.players.color.description": "The color of player models.", + "module.chams.players.scale": "Scale", + "module.chams.players.scale.description": "Players scale.", + "module.chams.crystals": "Crystals", + "module.chams.crystals.crystals": "Crystals", + "module.chams.crystals.crystals.description": "Enables model tweaks for end crystals.", + "module.chams.crystals.scale": "Scale", + "module.chams.crystals.scale.description": "Crystal scale.", + "module.chams.crystals.bounce": "Bounce", + "module.chams.crystals.bounce.description": "How high crystals bounce.", + "module.chams.crystals.rotation-speed": "Rotation Speed", + "module.chams.crystals.rotation-speed.description": "Multiplies the rotation speed of the crystal.", + "module.chams.crystals.texture": "Texture", + "module.chams.crystals.texture.description": "Whether to render crystal model textures.", + "module.chams.crystals.crystal-color": "Crystal Color", + "module.chams.crystals.crystal-color.description": "The color of the of the crystal.", + "module.chams.hand": "Hand", + "module.chams.hand.enabled": "Enabled", + "module.chams.hand.enabled.description": "Enables tweaks of hand rendering.", + "module.chams.hand.texture": "Texture", + "module.chams.hand.texture.description": "Whether to render hand textures.", + "module.chams.hand.hand-color": "Hand Color", + "module.chams.hand.hand-color.description": "The color of your hand.", + + "module.server-spoof": "Server Spoof", + "module.server-spoof.description": "Spoof client brand, resource pack and channels.", + "module.server-spoof.general.spoof-brand": "Spoof Brand", + "module.server-spoof.general.spoof-brand.description": "Whether or not to spoof the brand.", + "module.server-spoof.general.brand": "Brand", + "module.server-spoof.general.brand.description": "Specify the brand that will be send to the server.", + "module.server-spoof.general.resource-pack": "Resource Pack", + "module.server-spoof.general.resource-pack.description": "Spoof accepting server resource pack.", + "module.server-spoof.general.block-channels": "Block Channels", + "module.server-spoof.general.block-channels.description": "Whether or not to block some channels.", + "module.server-spoof.general.channels": "Channels", + "module.server-spoof.general.channels.description": "If the channel contains the keyword, this outgoing channel will be blocked.", + + "module.fullbright": "Fullbright", + "module.fullbright.description": "Lights up your world!", + "module.fullbright.general.mode": "Mode", + "module.fullbright.general.mode.description": "The mode to use for Fullbright.", + "module.fullbright.general.light-type": "Light Type", + "module.fullbright.general.light-type.description": "Which type of light to use for Luminance mode.", + "module.fullbright.general.minimum-light-level": "Minimum Light Level", + "module.fullbright.general.minimum-light-level.description": "Minimum light level when using Luminance mode.", + + "module.freecam": "Freecam", + "module.freecam.description": "Allows the camera to move away from the player.", + "module.freecam.general.speed": "Speed", + "module.freecam.general.speed.description": "Your speed while in freecam.", + "module.freecam.general.speed-scroll-sensitivity": "Speed Scroll Sensitivity", + "module.freecam.general.speed-scroll-sensitivity.description": "Allows you to change speed value using scroll wheel. 0 to disable.", + "module.freecam.general.stay-sneaking": "Stay Sneaking", + "module.freecam.general.stay-sneaking.description": "If you are sneaking when you enter freecam, whether your player should remain sneaking.", + "module.freecam.general.toggle-on-damage": "Toggle On Damage", + "module.freecam.general.toggle-on-damage.description": "Disables freecam when you take damage.", + "module.freecam.general.toggle-on-death": "Toggle On Death", + "module.freecam.general.toggle-on-death.description": "Disables freecam when you die.", + "module.freecam.general.toggle-on-log": "Toggle On Log", + "module.freecam.general.toggle-on-log.description": "Disables freecam when you disconnect from a server.", + "module.freecam.general.reload-chunks": "Reload Chunks", + "module.freecam.general.reload-chunks.description": "Disables cave culling.", + "module.freecam.general.show-hands": "Show Hands", + "module.freecam.general.show-hands.description": "Whether or not to render your hands in freecam.", + "module.freecam.general.rotate": "Rotate", + "module.freecam.general.rotate.description": "Rotates to the block or entity you are looking at.", + "module.freecam.general.static": "Static", + "module.freecam.general.static.description": "Disables settings that move the view.", + "module.freecam.pathing": "Pathing", + "module.freecam.pathing.click-to-path": "Click To Path", + "module.freecam.pathing.click-to-path.description": "Sets a pathfinding goal to any block/entity you click at.", + "module.freecam.pathing.double-click": "Double Click", + "module.freecam.pathing.double-click.description": "Require two clicks to start pathing.", + + "module.exp-thrower": "Exp Thrower", + "module.exp-thrower.description": "Automatically throws XP bottles from your hotbar.", + + "module.auto-totem": "Auto Totem", + "module.auto-totem.description": "Automatically equips a totem in your offhand.", + "module.auto-totem.general.mode": "Mode", + "module.auto-totem.general.mode.description": "Determines when to hold a totem, strict will always hold.", + "module.auto-totem.general.delay": "Delay", + "module.auto-totem.general.delay.description": "The ticks between slot movements.", + "module.auto-totem.general.health": "Health", + "module.auto-totem.general.health.description": "The health to hold a totem at.", + "module.auto-totem.general.elytra": "Elytra", + "module.auto-totem.general.elytra.description": "Will always hold a totem when flying with elytra.", + "module.auto-totem.general.fall": "Fall", + "module.auto-totem.general.fall.description": "Will hold a totem when fall damage could kill you.", + "module.auto-totem.general.explosion": "Explosion", + "module.auto-totem.general.explosion.description": "Will hold a totem when explosion damage could kill you.", + + "module.book-bot": "Book Bot", + "module.book-bot.description": "Automatically writes in books.", + "module.book-bot.general.mode": "Mode", + "module.book-bot.general.mode.description": "What kind of text to write.", + "module.book-bot.general.pages": "Pages", + "module.book-bot.general.pages.description": "The number of pages to write per book.", + "module.book-bot.general.ascii-only": "Ascii Only", + "module.book-bot.general.ascii-only.description": "Only uses the characters in the ASCII charset.", + "module.book-bot.general.delay": "Delay", + "module.book-bot.general.delay.description": "The amount of delay between writing books.", + "module.book-bot.general.sign": "Sign", + "module.book-bot.general.sign.description": "Whether to sign the book.", + "module.book-bot.general.name": "Name", + "module.book-bot.general.name.description": "The name you want to give your books.", + "module.book-bot.general.append-count": "Append Count", + "module.book-bot.general.append-count.description": "Whether to append the number of the book to the title.", + "module.book-bot.general.word-wrap": "Word Wrap", + "module.book-bot.general.word-wrap.description": "Prevents words from being cut in the middle of lines.", + + "module.auto-gap": "Auto Gap", + "module.auto-gap.description": "Automatically eats Gaps or E-Gaps.", + "module.auto-gap.general.allow-egap": "Allow Egap", + "module.auto-gap.general.allow-egap.description": "Allow eating E-Gaps over Gaps if found.", + "module.auto-gap.general.always": "Always", + "module.auto-gap.general.always.description": "If it should always eat.", + "module.auto-gap.general.pause-auras": "Pause Auras", + "module.auto-gap.general.pause-auras.description": "Pauses all auras when eating.", + "module.auto-gap.general.pause-baritone": "Pause Baritone", + "module.auto-gap.general.pause-baritone.description": "Pause baritone when eating.", + "module.auto-gap.potions": "Potions", + "module.auto-gap.potions.before-expiry": "Before Expiry", + "module.auto-gap.potions.before-expiry.description": "If it should eat before potion effects expire.", + "module.auto-gap.potions.expiry-threshold": "Expiry Threshold", + "module.auto-gap.potions.expiry-threshold.description": "Time in ticks before the potion effect expires to start eating.", + "module.auto-gap.potions.potions-regeneration": "Potions Regeneration", + "module.auto-gap.potions.potions-regeneration.description": "If it should eat when Regeneration runs out.", + "module.auto-gap.potions.potions-fire-resistance": "Potions Fire Resistance", + "module.auto-gap.potions.potions-fire-resistance.description": "If it should eat when Fire Resistance runs out. Requires E-Gaps.", + "module.auto-gap.potions.potions-absorption": "Potions Absorption", + "module.auto-gap.potions.potions-absorption.description": "If it should eat when Absorption runs out. Requires E-Gaps.", + "module.auto-gap.health": "Health", + "module.auto-gap.health.health-enabled": "Health Enabled", + "module.auto-gap.health.health-enabled.description": "If it should eat when health drops below threshold.", + "module.auto-gap.health.health-threshold": "Health Threshold", + "module.auto-gap.health.health-threshold.description": "Health threshold to eat at. Includes absorption.", + + "module.middle-click-extra": "Middle Click Extra", + "module.middle-click-extra.description": "Perform various actions when you middle click.", + "module.middle-click-extra.general.mode": "Mode", + "module.middle-click-extra.general.mode.description": "Which item to use when you middle click.", + "module.middle-click-extra.general.send-message": "Send Message", + "module.middle-click-extra.general.send-message.description": "Sends a message when you add a player as a friend.", + "module.middle-click-extra.general.message-to-send": "Message To Send", + "module.middle-click-extra.general.message-to-send.description": "Message to send when you add a player as a friend (use %player for the player's name)", + "module.middle-click-extra.general.quick-swap": "Quick Swap", + "module.middle-click-extra.general.quick-swap.description": "Allows you to use items in your inventory by simulating hotbar key presses. May get flagged by anticheats.", + "module.middle-click-extra.general.swap-back": "Swap Back", + "module.middle-click-extra.general.swap-back.description": "Swap back to your original slot when you finish using an item.", + "module.middle-click-extra.general.disable-in-creative": "Disable In Creative", + "module.middle-click-extra.general.disable-in-creative.description": "Middle click action is disabled in Creative mode.", + "module.middle-click-extra.general.notify": "Notify", + "module.middle-click-extra.general.notify.description": "Notifies you when you do not have the specified item in your hotbar.", + + "module.logout-spots": "Logout Spots", + "module.logout-spots.description": "Displays a box where another player has logged out at.", + "module.logout-spots.general.scale": "Scale", + "module.logout-spots.general.scale.description": "The scale.", + "module.logout-spots.general.full-height": "Full Height", + "module.logout-spots.general.full-height.description": "Displays the height as the player's full height.", + "module.logout-spots.render": "Render", + "module.logout-spots.render.shape-mode": "Shape Mode", + "module.logout-spots.render.shape-mode.description": "How the shapes are rendered.", + "module.logout-spots.render.side-color": "Side Color", + "module.logout-spots.render.side-color.description": "The side color.", + "module.logout-spots.render.line-color": "Line Color", + "module.logout-spots.render.line-color.description": "The line color.", + "module.logout-spots.render.name-color": "Name Color", + "module.logout-spots.render.name-color.description": "The name color.", + "module.logout-spots.render.name-background-color": "Name Background Color", + "module.logout-spots.render.name-background-color.description": "The name background color.", + + "module.sound-blocker": "Sound Blocker", + "module.sound-blocker.description": "Cancels out selected sounds.", + "module.sound-blocker.general.sounds": "Sounds", + "module.sound-blocker.general.sounds.description": "Sounds to block.", + + "module.vein-miner": "Vein Miner", + "module.vein-miner.description": "Mines all nearby blocks with this type", + "module.vein-miner.general.blocks": "Blocks", + "module.vein-miner.general.blocks.description": "Which blocks to select.", + "module.vein-miner.general.mode": "Mode", + "module.vein-miner.general.mode.description": "Selection mode.", + "module.vein-miner.general.depth": "Depth", + "module.vein-miner.general.depth.description": "Amount of iterations used to scan for similar blocks.", + "module.vein-miner.general.delay": "Delay", + "module.vein-miner.general.delay.description": "Delay between mining blocks.", + "module.vein-miner.general.rotate": "Rotate", + "module.vein-miner.general.rotate.description": "Sends rotation packets to the server when mining.", + "module.vein-miner.render": "Render", + "module.vein-miner.render.swing-hand": "Swing Hand", + "module.vein-miner.render.swing-hand.description": "Swing hand client-side.", + "module.vein-miner.render.render": "Render", + "module.vein-miner.render.render.description": "Whether or not to render the block being mined.", + "module.vein-miner.render.shape-mode": "Shape Mode", + "module.vein-miner.render.shape-mode.description": "How the shapes are rendered.", + "module.vein-miner.render.side-color": "Side Color", + "module.vein-miner.render.side-color.description": "The color of the sides of the blocks being rendered.", + "module.vein-miner.render.line-color": "Line Color", + "module.vein-miner.render.line-color.description": "The color of the lines of the blocks being rendered.", + + "module.nuker": "Nuker", + "module.nuker.description": "Breaks blocks around you.", + "module.nuker.general.shape": "Shape", + "module.nuker.general.shape.description": "The shape of nuking algorithm.", + "module.nuker.general.mode": "Mode", + "module.nuker.general.mode.description": "The way the blocks are broken.", + "module.nuker.general.range": "Range", + "module.nuker.general.range.description": "The break range.", + "module.nuker.general.up": "Up", + "module.nuker.general.up.description": "The break range.", + "module.nuker.general.down": "Down", + "module.nuker.general.down.description": "The break range.", + "module.nuker.general.left": "Left", + "module.nuker.general.left.description": "The break range.", + "module.nuker.general.right": "Right", + "module.nuker.general.right.description": "The break range.", + "module.nuker.general.forward": "Forward", + "module.nuker.general.forward.description": "The break range.", + "module.nuker.general.back": "Back", + "module.nuker.general.back.description": "The break range.", + "module.nuker.general.walls-range": "Walls Range", + "module.nuker.general.walls-range.description": "Range in which to break when behind blocks.", + "module.nuker.general.delay": "Delay", + "module.nuker.general.delay.description": "Delay in ticks between breaking blocks.", + "module.nuker.general.max-blocks-per-tick": "Max Blocks Per Tick", + "module.nuker.general.max-blocks-per-tick.description": "Maximum blocks to try to break per tick. Useful when insta mining.", + "module.nuker.general.sort-mode": "Sort Mode", + "module.nuker.general.sort-mode.description": "The blocks you want to mine first.", + "module.nuker.general.packet-mine": "Packet Mine", + "module.nuker.general.packet-mine.description": "Attempt to instamine everything at once.", + "module.nuker.general.only-suitable-tools": "Only Suitable Tools", + "module.nuker.general.only-suitable-tools.description": "Only mines when using an appropriate for the block.", + "module.nuker.general.interact": "Interact", + "module.nuker.general.interact.description": "Interacts with the block instead of mining.", + "module.nuker.general.rotate": "Rotate", + "module.nuker.general.rotate.description": "Rotates server-side to the block being mined.", + "module.nuker.whitelist": "Whitelist", + "module.nuker.whitelist.list-mode": "List Mode", + "module.nuker.whitelist.list-mode.description": "Selection mode.", + "module.nuker.whitelist.blacklist": "Blacklist", + "module.nuker.whitelist.blacklist.description": "The blocks you don't want to mine.", + "module.nuker.whitelist.whitelist": "Whitelist", + "module.nuker.whitelist.whitelist.description": "The blocks you want to mine.", + "module.nuker.whitelist.select-block-bind": "Select Block Bind", + "module.nuker.whitelist.select-block-bind.description": "Adds targeted block to list when this button is pressed.", + "module.nuker.render": "Render", + "module.nuker.render.swing": "Swing", + "module.nuker.render.swing.description": "Whether to swing hand client-side.", + "module.nuker.render.bounding-box": "Bounding Box", + "module.nuker.render.bounding-box.description": "Enable rendering bounding box for Cube and Uniform Cube.", + "module.nuker.render.nuke-box-mode": "Nuke Box Mode", + "module.nuker.render.nuke-box-mode.description": "How the shape for the bounding box is rendered.", + "module.nuker.render.side-color": "Side Color", + "module.nuker.render.side-color.description": "The side color of the bounding box.", + "module.nuker.render.line-color": "Line Color", + "module.nuker.render.line-color.description": "The line color of the bounding box.", + "module.nuker.render.broken-blocks": "Broken Blocks", + "module.nuker.render.broken-blocks.description": "Enable rendering bounding box for Cube and Uniform Cube.", + "module.nuker.render.nuke-block-mode": "Nuke Block Mode", + "module.nuker.render.nuke-block-mode.description": "How the shapes for broken blocks are rendered.", + "module.nuker.render.side-color-$todo-duplicates$": "Side Color", + "module.nuker.render.side-color.description-$todo-duplicates$": "The side color of the target block rendering.", + "module.nuker.render.line-color-$todo-duplicates$": "Line Color", + "module.nuker.render.line-color.description-$todo-duplicates$": "The line color of the target block rendering.", + + "module.auto-trap": "Auto Trap", + "module.auto-trap.description": "Traps people in a box to prevent them from moving.", + "module.auto-trap.general.whitelist": "Whitelist", + "module.auto-trap.general.whitelist.description": "Which blocks to use.", + "module.auto-trap.general.place-range": "Place Range", + "module.auto-trap.general.place-range.description": "The range at which blocks can be placed.", + "module.auto-trap.general.walls-range": "Walls Range", + "module.auto-trap.general.walls-range.description": "Range in which to place when behind blocks.", + "module.auto-trap.general.target-priority": "Target Priority", + "module.auto-trap.general.target-priority.description": "How to select the player to target.", + "module.auto-trap.general.target-range": "Target Range", + "module.auto-trap.general.target-range.description": "The maximum distance to target players.", + "module.auto-trap.general.place-delay": "Place Delay", + "module.auto-trap.general.place-delay.description": "How many ticks between block placements.", + "module.auto-trap.general.blocks-per-tick": "Blocks Per Tick", + "module.auto-trap.general.blocks-per-tick.description": "How many blocks to place in one tick.", + "module.auto-trap.general.top-blocks": "Top Blocks", + "module.auto-trap.general.top-blocks.description": "Which blocks to place on the top half of the target.", + "module.auto-trap.general.bottom-blocks": "Bottom Blocks", + "module.auto-trap.general.bottom-blocks.description": "Which blocks to place on the bottom half of the target.", + "module.auto-trap.general.self-toggle": "Self Toggle", + "module.auto-trap.general.self-toggle.description": "Turns off after placing all blocks.", + "module.auto-trap.general.rotate": "Rotate", + "module.auto-trap.general.rotate.description": "Rotates towards blocks when placing.", + "module.auto-trap.render": "Render", + "module.auto-trap.render.render": "Render", + "module.auto-trap.render.render.description": "Renders an overlay where blocks will be placed.", + "module.auto-trap.render.shape-mode": "Shape Mode", + "module.auto-trap.render.shape-mode.description": "How the shapes are rendered.", + "module.auto-trap.render.side-color": "Side Color", + "module.auto-trap.render.side-color.description": "The side color of the target block rendering.", + "module.auto-trap.render.line-color": "Line Color", + "module.auto-trap.render.line-color.description": "The line color of the target block rendering.", + "module.auto-trap.render.next-side-color": "Next Side Color", + "module.auto-trap.render.next-side-color.description": "The side color of the next block to be placed.", + "module.auto-trap.render.next-line-color": "Next Line Color", + "module.auto-trap.render.next-line-color.description": "The line color of the next block to be placed.", + + "module.wall-hack": "Wall Hack", + "module.wall-hack.description": "Makes blocks translucent.", + "module.wall-hack.general.opacity": "Opacity", + "module.wall-hack.general.opacity.description": "The opacity for rendered blocks.", + "module.wall-hack.general.blocks": "Blocks", + "module.wall-hack.general.blocks.description": "What blocks should be targeted for Wall Hack.", + "module.wall-hack.general.occlude-chunks": "Occlude Chunks", + "module.wall-hack.general.occlude-chunks.description": "Whether caves should occlude underground (may look wonky when on).", + + "module.no-render": "No Render", + "module.no-render.description": "Disables certain animations or overlays from rendering.", + "module.no-render.overlay": "Overlay", + "module.no-render.overlay.portal-overlay": "Portal Overlay", + "module.no-render.overlay.portal-overlay.description": "Disables rendering of the nether portal overlay.", + "module.no-render.overlay.spyglass-overlay": "Spyglass Overlay", + "module.no-render.overlay.spyglass-overlay.description": "Disables rendering of the spyglass overlay.", + "module.no-render.overlay.nausea": "Nausea", + "module.no-render.overlay.nausea.description": "Disables rendering of the nausea overlay.", + "module.no-render.overlay.pumpkin-overlay": "Pumpkin Overlay", + "module.no-render.overlay.pumpkin-overlay.description": "Disables rendering of the pumpkin head overlay", + "module.no-render.overlay.powdered-snow-overlay": "Powdered Snow Overlay", + "module.no-render.overlay.powdered-snow-overlay.description": "Disables rendering of the powdered snow overlay.", + "module.no-render.overlay.fire-overlay": "Fire Overlay", + "module.no-render.overlay.fire-overlay.description": "Disables rendering of the fire overlay.", + "module.no-render.overlay.liquid-overlay": "Liquid Overlay", + "module.no-render.overlay.liquid-overlay.description": "Disables rendering of the liquid overlay.", + "module.no-render.overlay.in-wall-overlay": "In Wall Overlay", + "module.no-render.overlay.in-wall-overlay.description": "Disables rendering of the overlay when inside blocks.", + "module.no-render.overlay.vignette": "Vignette", + "module.no-render.overlay.vignette.description": "Disables rendering of the vignette overlay.", + "module.no-render.overlay.gui-background": "Gui Background", + "module.no-render.overlay.gui-background.description": "Disables rendering of the GUI background overlay.", + "module.no-render.overlay.totem-animation": "Totem Animation", + "module.no-render.overlay.totem-animation.description": "Disables rendering of the totem animation when you pop a totem.", + "module.no-render.overlay.eating-particles": "Eating Particles", + "module.no-render.overlay.eating-particles.description": "Disables rendering of eating particles.", + "module.no-render.overlay.enchantment-glint": "Enchantment Glint", + "module.no-render.overlay.enchantment-glint.description": "Disables rending of the enchantment glint.", + "module.no-render.hud": "HUD", + "module.no-render.hud.boss-bar": "Boss Bar", + "module.no-render.hud.boss-bar.description": "Disable rendering of boss bars.", + "module.no-render.hud.scoreboard": "Scoreboard", + "module.no-render.hud.scoreboard.description": "Disable rendering of the scoreboard.", + "module.no-render.hud.crosshair": "Crosshair", + "module.no-render.hud.crosshair.description": "Disables rendering of the crosshair.", + "module.no-render.hud.title": "Title", + "module.no-render.hud.title.description": "Disables rendering of the title.", + "module.no-render.hud.held-item-name": "Held Item Name", + "module.no-render.hud.held-item-name.description": "Disables rendering of the held item name.", + "module.no-render.hud.obfuscation": "Obfuscation", + "module.no-render.hud.obfuscation.description": "Disables obfuscation styling of characters.", + "module.no-render.hud.potion-icons": "Potion Icons", + "module.no-render.hud.potion-icons.description": "Disables rendering of status effect icons.", + "module.no-render.hud.message-signature-indicator": "Message Signature Indicator", + "module.no-render.hud.message-signature-indicator.description": "Disables chat message signature indicator on the left of the message.", + "module.no-render.world": "World", + "module.no-render.world.weather": "Weather", + "module.no-render.world.weather.description": "Disables rendering of weather.", + "module.no-render.world.world-border": "World Border", + "module.no-render.world.world-border.description": "Disables rendering of the world border.", + "module.no-render.world.blindness": "Blindness", + "module.no-render.world.blindness.description": "Disables rendering of blindness.", + "module.no-render.world.darkness": "Darkness", + "module.no-render.world.darkness.description": "Disables rendering of darkness.", + "module.no-render.world.fog": "Fog", + "module.no-render.world.fog.description": "Disables rendering of fog.", + "module.no-render.world.enchantment-table-book": "Enchantment Table Book", + "module.no-render.world.enchantment-table-book.description": "Disables rendering of books above enchanting tables.", + "module.no-render.world.sign-text": "Sign Text", + "module.no-render.world.sign-text.description": "Disables rendering of text on signs.", + "module.no-render.world.block-break-particles": "Block Break Particles", + "module.no-render.world.block-break-particles.description": "Disables rendering of block-break particles.", + "module.no-render.world.block-break-overlay": "Block Break Overlay", + "module.no-render.world.block-break-overlay.description": "Disables rendering of block-break overlay.", + "module.no-render.world.beacon-beams": "Beacon Beams", + "module.no-render.world.beacon-beams.description": "Disables rendering of beacon beams.", + "module.no-render.world.falling-blocks": "Falling Blocks", + "module.no-render.world.falling-blocks.description": "Disables rendering of falling blocks.", + "module.no-render.world.cave-culling": "Cave Culling", + "module.no-render.world.cave-culling.description": "Disables Minecraft's cave culling algorithm.", + "module.no-render.world.map-markers": "Map Markers", + "module.no-render.world.map-markers.description": "Disables markers on maps.", + "module.no-render.world.map-contents": "Map Contents", + "module.no-render.world.map-contents.description": "Disable rendering of maps.", + "module.no-render.world.banners": "Banners", + "module.no-render.world.banners.description": "Changes rendering of banners.", + "module.no-render.world.firework-explosions": "Firework Explosions", + "module.no-render.world.firework-explosions.description": "Disables rendering of firework explosions.", + "module.no-render.world.particles": "Particles", + "module.no-render.world.particles.description": "Particles to not render.", + "module.no-render.world.barrier-invisibility": "Barrier Invisibility", + "module.no-render.world.barrier-invisibility.description": "Disables barriers being invisible when not holding one.", + "module.no-render.world.texture-rotations": "Texture Rotations", + "module.no-render.world.texture-rotations.description": "Changes texture rotations and model offsets to use a constant value instead of the block position.", + "module.no-render.world.block-entities": "Block Entities", + "module.no-render.world.block-entities.description": "Block entities (chest, shulker block, etc.) to not render.", + "module.no-render.entity": "Entity", + "module.no-render.entity.entities": "Entities", + "module.no-render.entity.entities.description": "Disables rendering of selected entities.", + "module.no-render.entity.drop-spawn-packets": "Drop Spawn Packets", + "module.no-render.entity.drop-spawn-packets.description": "WARNING! Drops all spawn packets of entities selected in the above list.", + "module.no-render.entity.armor": "Armor", + "module.no-render.entity.armor.description": "Disables rendering of armor on entities.", + "module.no-render.entity.invisibility": "Invisibility", + "module.no-render.entity.invisibility.description": "Shows invisible entities.", + "module.no-render.entity.glowing": "Glowing", + "module.no-render.entity.glowing.description": "Disables rendering of the glowing effect", + "module.no-render.entity.spawner-entities": "Spawner Entities", + "module.no-render.entity.spawner-entities.description": "Disables rendering of spinning mobs inside of mob spawners", + "module.no-render.entity.dead-entities": "Dead Entities", + "module.no-render.entity.dead-entities.description": "Disables rendering of dead entities", + "module.no-render.entity.nametags": "Nametags", + "module.no-render.entity.nametags.description": "Disables rendering of entity nametags", + + "module.hand-view": "Hand View", + "module.hand-view.description": "Alters the way items are rendered in your hands.", + "module.hand-view.general.server-rotations": "Server Rotations", + "module.hand-view.general.server-rotations.description": "Makes your hands follow your serverside rotations.", + "module.hand-view.general.old-animations": "Old Animations", + "module.hand-view.general.old-animations.description": "Changes hit animations to those like 1.8", + "module.hand-view.general.skip-swapping-animation": "Skip Swapping Animation", + "module.hand-view.general.skip-swapping-animation.description": "Whether or not to skip the item swapping animation", + "module.hand-view.general.disable-eating-animation": "Disable Eating Animation", + "module.hand-view.general.disable-eating-animation.description": "Disables the eating animation. Potentially desirable if it goes offscreen.", + "module.hand-view.general.swing-mode": "Swing Mode", + "module.hand-view.general.swing-mode.description": "Modifies your client & server hand swinging.", + "module.hand-view.general.swing-speed": "Swing Speed", + "module.hand-view.general.swing-speed.description": "The swing speed of your hands.", + "module.hand-view.general.main-hand-progress": "Main Hand Progress", + "module.hand-view.general.main-hand-progress.description": "The swing progress of your main hand.", + "module.hand-view.general.off-hand-progress": "Off Hand Progress", + "module.hand-view.general.off-hand-progress.description": "The swing progress of your off hand.", + "module.hand-view.main-hand": "Main Hand", + "module.hand-view.main-hand.scale": "Scale", + "module.hand-view.main-hand.scale.description": "The scale of your main hand.", + "module.hand-view.main-hand.position": "Position", + "module.hand-view.main-hand.position.description": "The position of your main hand.", + "module.hand-view.main-hand.rotation": "Rotation", + "module.hand-view.main-hand.rotation.description": "The rotation of your main hand.", + "module.hand-view.off-hand": "Off Hand", + "module.hand-view.off-hand.scale": "Scale", + "module.hand-view.off-hand.scale.description": "The scale of your off hand.", + "module.hand-view.off-hand.position": "Position", + "module.hand-view.off-hand.position.description": "The position of your off hand.", + "module.hand-view.off-hand.rotation": "Rotation", + "module.hand-view.off-hand.rotation.description": "The rotation of your off hand.", + "module.hand-view.arm": "Arm", + "module.hand-view.arm.scale": "Scale", + "module.hand-view.arm.scale.description": "", + "module.hand-view.arm.position": "Position", + "module.hand-view.arm.position.description": "", + "module.hand-view.arm.rotation": "Rotation", + "module.hand-view.arm.rotation.description": "", + + "module.instant-rebreak": "Instant Rebreak", + "module.instant-rebreak.description": "Instantly re-breaks blocks in the same position.", + "module.instant-rebreak.general.delay": "Delay", + "module.instant-rebreak.general.delay.description": "The delay between break attempts.", + "module.instant-rebreak.general.only-pick": "Only Pick", + "module.instant-rebreak.general.only-pick.description": "Only tries to mine the block if you are holding a pickaxe.", + "module.instant-rebreak.general.rotate": "Rotate", + "module.instant-rebreak.general.rotate.description": "Faces the block being mined server side.", + "module.instant-rebreak.render": "Render", + "module.instant-rebreak.render.render": "Render", + "module.instant-rebreak.render.render.description": "Renders an overlay on the block being broken.", + "module.instant-rebreak.render.shape-mode": "Shape Mode", + "module.instant-rebreak.render.shape-mode.description": "How the shapes are rendered.", + "module.instant-rebreak.render.side-color": "Side Color", + "module.instant-rebreak.render.side-color.description": "The color of the sides of the blocks being rendered.", + "module.instant-rebreak.render.line-color": "Line Color", + "module.instant-rebreak.render.line-color.description": "The color of the lines of the blocks being rendered.", + + "module.liquid-interact": "Liquid Interact", + "module.liquid-interact.description": "Allows you to interact with liquids.", + + "module.crystal-aura": "Crystal Aura", + "module.crystal-aura.description": "Automatically places and attacks crystals.", + "module.crystal-aura.general.target-range": "Target Range", + "module.crystal-aura.general.target-range.description": "Range in which to target players.", + "module.crystal-aura.general.predict-movement": "Predict Movement", + "module.crystal-aura.general.predict-movement.description": "Predicts target movement.", + "module.crystal-aura.general.min-damage": "Min Damage", + "module.crystal-aura.general.min-damage.description": "Minimum damage the crystal needs to deal to your target.", + "module.crystal-aura.general.max-damage": "Max Damage", + "module.crystal-aura.general.max-damage.description": "Maximum damage crystals can deal to yourself.", + "module.crystal-aura.general.anti-suicide": "Anti Suicide", + "module.crystal-aura.general.anti-suicide.description": "Will not place and break crystals if they will kill you.", + "module.crystal-aura.general.ignore-nakeds": "Ignore Nakeds", + "module.crystal-aura.general.ignore-nakeds.description": "Ignore players with no items.", + "module.crystal-aura.general.rotate": "Rotate", + "module.crystal-aura.general.rotate.description": "Rotates server-side towards the crystals being hit/placed.", + "module.crystal-aura.general.yaw-steps-mode": "Yaw Steps Mode", + "module.crystal-aura.general.yaw-steps-mode.description": "When to run the yaw steps check.", + "module.crystal-aura.general.yaw-steps": "Yaw Steps", + "module.crystal-aura.general.yaw-steps.description": "Maximum number of degrees its allowed to rotate in one tick.", + "module.crystal-aura.general.entities": "Entities", + "module.crystal-aura.general.entities.description": "Entities to attack.", + "module.crystal-aura.switch": "Switch", + "module.crystal-aura.switch.auto-switch": "Auto Switch", + "module.crystal-aura.switch.auto-switch.description": "Switches to crystals in your hotbar once a target is found.", + "module.crystal-aura.switch.switch-delay": "Switch Delay", + "module.crystal-aura.switch.switch-delay.description": "The delay in ticks to wait to break a crystal after switching hotbar slot.", + "module.crystal-aura.switch.no-gap-switch": "No Gap Switch", + "module.crystal-aura.switch.no-gap-switch.description": "Won't auto switch if you're holding a gapple.", + "module.crystal-aura.switch.no-bow-switch": "No Bow Switch", + "module.crystal-aura.switch.no-bow-switch.description": "Won't auto switch if you're holding a bow.", + "module.crystal-aura.switch.anti-weakness": "Anti Weakness", + "module.crystal-aura.switch.anti-weakness.description": "Switches to tools with so you can break crystals with the weakness effect.", + "module.crystal-aura.place": "Place", + "module.crystal-aura.place.place": "Place", + "module.crystal-aura.place.place.description": "If the CA should place crystals.", + "module.crystal-aura.place.place-delay": "Place Delay", + "module.crystal-aura.place.place-delay.description": "The delay in ticks to wait to place a crystal after it's exploded.", + "module.crystal-aura.place.place-range": "Place Range", + "module.crystal-aura.place.place-range.description": "Range in which to place crystals.", + "module.crystal-aura.place.walls-range": "Walls Range", + "module.crystal-aura.place.walls-range.description": "Range in which to place crystals when behind blocks.", + "module.crystal-aura.place.1.12-placement": "1.12 Placement", + "module.crystal-aura.place.1.12-placement.description": "Uses 1.12 crystal placement.", + "module.crystal-aura.place.support": "Support", + "module.crystal-aura.place.support.description": "Places a support block in air if no other position have been found.", + "module.crystal-aura.place.support-delay": "Support Delay", + "module.crystal-aura.place.support-delay.description": "Delay in ticks after placing support block.", + "module.crystal-aura.face-place": "Face Place", + "module.crystal-aura.face-place.face-place": "Face Place", + "module.crystal-aura.face-place.face-place.description": "Will face-place when target is below a certain health or armor durability threshold.", + "module.crystal-aura.face-place.face-place-health": "Face Place Health", + "module.crystal-aura.face-place.face-place-health.description": "The health the target has to be at to start face placing.", + "module.crystal-aura.face-place.face-place-durability": "Face Place Durability", + "module.crystal-aura.face-place.face-place-durability.description": "The durability threshold percentage to be able to face-place.", + "module.crystal-aura.face-place.face-place-missing-armor": "Face Place Missing Armor", + "module.crystal-aura.face-place.face-place-missing-armor.description": "Automatically starts face placing when a target misses a piece of armor.", + "module.crystal-aura.face-place.force-face-place": "Force Face Place", + "module.crystal-aura.face-place.force-face-place.description": "Starts face place when this button is pressed.", + "module.crystal-aura.break": "Break", + "module.crystal-aura.break.break": "Break", + "module.crystal-aura.break.break.description": "If the CA should break crystals.", + "module.crystal-aura.break.break-delay": "Break Delay", + "module.crystal-aura.break.break-delay.description": "The delay in ticks to wait to break a crystal after it's placed.", + "module.crystal-aura.break.smart-delay": "Smart Delay", + "module.crystal-aura.break.smart-delay.description": "Only breaks crystals when the target can receive damage.", + "module.crystal-aura.break.break-range": "Break Range", + "module.crystal-aura.break.break-range.description": "Range in which to break crystals.", + "module.crystal-aura.break.walls-range": "Walls Range", + "module.crystal-aura.break.walls-range.description": "Range in which to break crystals when behind blocks.", + "module.crystal-aura.break.only-own": "Only Own", + "module.crystal-aura.break.only-own.description": "Only breaks own crystals.", + "module.crystal-aura.break.break-attempts": "Break Attempts", + "module.crystal-aura.break.break-attempts.description": "How many times to hit a crystal before stopping to target it.", + "module.crystal-aura.break.ticks-existed": "Ticks Existed", + "module.crystal-aura.break.ticks-existed.description": "Amount of ticks a crystal needs to have lived for it to be attacked by CrystalAura.", + "module.crystal-aura.break.attack-frequency": "Attack Frequency", + "module.crystal-aura.break.attack-frequency.description": "Maximum hits to do per second.", + "module.crystal-aura.break.fast-break": "Fast Break", + "module.crystal-aura.break.fast-break.description": "Ignores break delay and tries to break the crystal as soon as it's spawned in the world.", + "module.crystal-aura.pause": "Pause", + "module.crystal-aura.pause.pause-on-use": "Pause On Use", + "module.crystal-aura.pause.pause-on-use.description": "Which processes should be paused while using an item.", + "module.crystal-aura.pause.pause-on-mine": "Pause On Mine", + "module.crystal-aura.pause.pause-on-mine.description": "Which processes should be paused while mining a block.", + "module.crystal-aura.pause.pause-on-lag": "Pause On Lag", + "module.crystal-aura.pause.pause-on-lag.description": "Whether to pause if the server is not responding.", + "module.crystal-aura.pause.pause-modules": "Pause Modules", + "module.crystal-aura.pause.pause-modules.description": "Pauses while any of the selected modules are active.", + "module.crystal-aura.pause.pause-health": "Pause Health", + "module.crystal-aura.pause.pause-health.description": "Pauses when you go below a certain health.", + "module.crystal-aura.render": "Render", + "module.crystal-aura.render.swing-mode": "Swing Mode", + "module.crystal-aura.render.swing-mode.description": "How to swing when placing.", + "module.crystal-aura.render.render-mode": "Render Mode", + "module.crystal-aura.render.render-mode.description": "The mode to render in.", + "module.crystal-aura.render.render-place": "Render Place", + "module.crystal-aura.render.render-place.description": "Renders a block overlay over the block the crystals are being placed on.", + "module.crystal-aura.render.place-time": "Place Time", + "module.crystal-aura.render.place-time.description": "How long to render placements.", + "module.crystal-aura.render.render-break": "Render Break", + "module.crystal-aura.render.render-break.description": "Renders a block overlay over the block the crystals are broken on.", + "module.crystal-aura.render.break-time": "Break Time", + "module.crystal-aura.render.break-time.description": "How long to render breaking for.", + "module.crystal-aura.render.smoothness": "Smoothness", + "module.crystal-aura.render.smoothness.description": "How smoothly the render should move around.", + "module.crystal-aura.render.height": "Height", + "module.crystal-aura.render.height.description": "How tall the gradient should be.", + "module.crystal-aura.render.render-time": "Render Time", + "module.crystal-aura.render.render-time.description": "How long to render placements.", + "module.crystal-aura.render.shape-mode": "Shape Mode", + "module.crystal-aura.render.shape-mode.description": "How the shapes are rendered.", + "module.crystal-aura.render.side-color": "Side Color", + "module.crystal-aura.render.side-color.description": "The side color of the block overlay.", + "module.crystal-aura.render.line-color": "Line Color", + "module.crystal-aura.render.line-color.description": "The line color of the block overlay.", + "module.crystal-aura.render.damage": "Damage", + "module.crystal-aura.render.damage.description": "Renders crystal damage text in the block overlay.", + "module.crystal-aura.render.damage-color": "Damage Color", + "module.crystal-aura.render.damage-color.description": "The color of the damage text.", + "module.crystal-aura.render.damage-scale": "Damage Scale", + "module.crystal-aura.render.damage-scale.description": "How big the damage text should be.", + + "module.spider": "Spider", + "module.spider.description": "Allows you to climb walls like a spider.", + "module.spider.general.climb-speed": "Climb Speed", + "module.spider.general.climb-speed.description": "The speed you go up blocks.", + + "module.auto-log": "Auto Log", + "module.auto-log.description": "Automatically disconnects you when certain requirements are met.", + "module.auto-log.general.health": "Health", + "module.auto-log.general.health.description": "Automatically disconnects when health is lower or equal to this value. Set to 0 to disable.", + "module.auto-log.general.predict-incoming-damage": "Predict Incoming Damage", + "module.auto-log.general.predict-incoming-damage.description": "Disconnects when it detects you're about to take enough damage to set you under the 'health' setting.", + "module.auto-log.general.totem-pops": "Totem Pops", + "module.auto-log.general.totem-pops.description": "Disconnects when you have popped this many totems. Set to 0 to disable.", + "module.auto-log.general.only-trusted": "Only Trusted", + "module.auto-log.general.only-trusted.description": "Disconnects when a player not on your friends list appears in render distance.", + "module.auto-log.general.32K": "32K", + "module.auto-log.general.32K.description": "Disconnects when a player near you can instantly kill you.", + "module.auto-log.general.smart-toggle": "Smart Toggle", + "module.auto-log.general.smart-toggle.description": "Disables Auto Log after a low-health logout. WILL re-enable once you heal.", + "module.auto-log.general.toggle-off": "Toggle Off", + "module.auto-log.general.toggle-off.description": "Disables Auto Log after usage.", + "module.auto-log.general.toggle-auto-reconnect": "Toggle Auto Reconnect", + "module.auto-log.general.toggle-auto-reconnect.description": "Whether to disable Auto Reconnect after a logout.", + "module.auto-log.entities": "Entities", + "module.auto-log.entities.entities": "Entities", + "module.auto-log.entities.entities.description": "Disconnects when a specified entity is present within a specified range.", + "module.auto-log.entities.use-total-count": "Use Total Count", + "module.auto-log.entities.use-total-count.description": "Toggle between counting the total number of all selected entities or each entity individually.", + "module.auto-log.entities.combined-entity-threshold": "Combined Entity Threshold", + "module.auto-log.entities.combined-entity-threshold.description": "The minimum total number of selected entities that must be near you before disconnection occurs.", + "module.auto-log.entities.individual-entity-threshold": "Individual Entity Threshold", + "module.auto-log.entities.individual-entity-threshold.description": "The minimum number of entities individually that must be near you before disconnection occurs.", + "module.auto-log.entities.range": "Range", + "module.auto-log.entities.range.description": "How close an entity has to be to you before you disconnect.", + + "module.high-jump": "High Jump", + "module.high-jump.description": "Makes you jump higher than normal.", + "module.high-jump.general.jump-multiplier": "Jump Multiplier", + "module.high-jump.general.jump-multiplier.description": "Jump height multiplier.", + + "module.speed": "Speed", + "module.speed.description": "Modifies your movement speed when moving on the ground.", + "module.speed.general.mode": "Mode", + "module.speed.general.mode.description": "The method of applying speed.", + "module.speed.general.vanilla-speed": "Vanilla Speed", + "module.speed.general.vanilla-speed.description": "The speed in blocks per second.", + "module.speed.general.strafe-speed": "Strafe Speed", + "module.speed.general.strafe-speed.description": "The speed.", + "module.speed.general.speed-limit": "Speed Limit", + "module.speed.general.speed-limit.description": "Limits your speed on servers with very strict anticheats.", + "module.speed.general.timer": "Timer", + "module.speed.general.timer.description": "Timer override.", + "module.speed.general.in-liquids": "In Liquids", + "module.speed.general.in-liquids.description": "Uses speed when in lava or water.", + "module.speed.general.when-sneaking": "When Sneaking", + "module.speed.general.when-sneaking.description": "Uses speed when sneaking.", + "module.speed.general.only-on-ground": "Only On Ground", + "module.speed.general.only-on-ground.description": "Uses speed only when standing on a block.", + + "module.offhand": "Offhand", + "module.offhand.description": "Allows you to hold specified items in your offhand.", + "module.offhand.combat": "Combat", + "module.offhand.combat.item-switch-delay": "Item Switch Delay", + "module.offhand.combat.item-switch-delay.description": "The delay in ticks between slot movements.", + "module.offhand.combat.item": "Item", + "module.offhand.combat.item.description": "Which item to hold in your offhand.", + "module.offhand.combat.hotbar": "Hotbar", + "module.offhand.combat.hotbar.description": "Whether to use items from your hotbar.", + "module.offhand.combat.right-gapple": "Right Gapple", + "module.offhand.combat.right-gapple.description": "Will switch to a gapple when holding right click.(DO NOT USE WITH POTION ON)", + "module.offhand.combat.sword-gapple": "Sword Gapple", + "module.offhand.combat.sword-gapple.description": "Will switch to a gapple when holding a sword and right click.", + "module.offhand.combat.always-gap-on-sword": "Always Gap On Sword", + "module.offhand.combat.always-gap-on-sword.description": "Holds an Enchanted Golden Apple when you are holding a sword.", + "module.offhand.combat.always-pot-on-sword": "Always Pot On Sword", + "module.offhand.combat.always-pot-on-sword.description": "Will switch to a potion when holding a sword", + "module.offhand.combat.sword-pot": "Sword Pot", + "module.offhand.combat.sword-pot.description": "Will switch to a potion when holding a sword and right click.", + "module.offhand.totem": "Totem", + "module.offhand.totem.min-health": "Min Health", + "module.offhand.totem.min-health.description": "Will hold a totem when below this amount of health.", + "module.offhand.totem.elytra": "Elytra", + "module.offhand.totem.elytra.description": "Will always hold a totem while flying with an elytra.", + "module.offhand.totem.falling": "Falling", + "module.offhand.totem.falling.description": "Will hold a totem if fall damage could kill you.", + "module.offhand.totem.explosion": "Explosion", + "module.offhand.totem.explosion.description": "Will hold a totem when explosion damage could kill you.", + + "module.arrow-dodge": "Arrow Dodge", + "module.arrow-dodge.description": "Tries to dodge arrows coming at you.", + "module.arrow-dodge.general.ground-check": "Ground Check", + "module.arrow-dodge.general.ground-check.description": "Tries to prevent you from falling to your death.", + "module.arrow-dodge.general.all-projectiles": "All Projectiles", + "module.arrow-dodge.general.all-projectiles.description": "Dodge all projectiles, not only arrows.", + "module.arrow-dodge.general.ignore-own": "Ignore Own", + "module.arrow-dodge.general.ignore-own.description": "Ignore your own projectiles.", + "module.arrow-dodge.general.simulation-steps": "Simulation Steps", + "module.arrow-dodge.general.simulation-steps.description": "How many steps to simulate projectiles. Zero for no limit.", + "module.arrow-dodge.movement": "Movement", + "module.arrow-dodge.movement.move-type": "Move Type", + "module.arrow-dodge.movement.move-type.description": "The way you are moved by this module.", + "module.arrow-dodge.movement.move-speed": "Move Speed", + "module.arrow-dodge.movement.move-speed.description": "How fast should you be when dodging arrow.", + "module.arrow-dodge.movement.distance-check": "Distance Check", + "module.arrow-dodge.movement.distance-check.description": "How far should an arrow be from the player to be considered not hitting.", + + "module.multitask": "Multitask", + "module.multitask.description": "Lets you use items and attack at the same time.", + "module.multitask.general.attacking-entities": "Attacking Entities", + "module.multitask.general.attacking-entities.description": "Lets you attack entities while using an item.", + + "module.auto-replenish": "Auto Replenish", + "module.auto-replenish.description": "Automatically refills items in your hotbar, main hand, or offhand.", + "module.auto-replenish.general.min-count": "Min Count", + "module.auto-replenish.general.min-count.description": "Replenish a slot when it reaches this item count.", + "module.auto-replenish.general.delay": "Delay", + "module.auto-replenish.general.delay.description": "How long in ticks to wait between replenishing your hotbar.", + "module.auto-replenish.general.offhand": "Offhand", + "module.auto-replenish.general.offhand.description": "Whether or not to replenish items in your offhand.", + "module.auto-replenish.general.unstackable": "Unstackable", + "module.auto-replenish.general.unstackable.description": "Replenish unstackable items.", + "module.auto-replenish.general.same-enchants": "Same Enchants", + "module.auto-replenish.general.same-enchants.description": "Only replace unstackables with items that have the same enchants.", + "module.auto-replenish.general.search-hotbar": "Search Hotbar", + "module.auto-replenish.general.search-hotbar.description": "Combine stacks in your hotbar/offhand as a last resort.", + "module.auto-replenish.general.excluded-items": "Excluded Items", + "module.auto-replenish.general.excluded-items.description": "Items that won't be replenished.", + + "module.break-indicators": "Break Indicators", + "module.break-indicators.description": "Renders the progress of a block being broken.", + "module.break-indicators.general.shape-mode": "Shape Mode", + "module.break-indicators.general.shape-mode.description": "How the shapes are rendered.", + "module.break-indicators.general.packet-mine": "Packet Mine", + "module.break-indicators.general.packet-mine.description": "Whether or not to render blocks being packet mined.", + "module.break-indicators.general.start-color": "Start Color", + "module.break-indicators.general.start-color.description": "The color for the non-broken block.", + "module.break-indicators.general.end-color": "End Color", + "module.break-indicators.general.end-color.description": "The color for the fully-broken block.", + + "module.potion-saver": "Potion Saver", + "module.potion-saver.description": "Stops potion effects ticking when you stand still.", + "module.potion-saver.general.effects": "Effects", + "module.potion-saver.general.effects.description": "The effects to preserve.", + "module.potion-saver.general.only-when-stationary": "Only When Stationary", + "module.potion-saver.general.only-when-stationary.description": "Only freezes effects when you aren't moving.", + + "module.block-esp": "Block Esp", + "module.block-esp.description": "Renders specified blocks through walls.", + "module.block-esp.general.blocks": "Blocks", + "module.block-esp.general.blocks.description": "Blocks to search for.", + "module.block-esp.general.default-block-config": "Default Block Config", + "module.block-esp.general.default-block-config.description": "Default block config.", + "module.block-esp.general.block-configs": "Block Configs", + "module.block-esp.general.block-configs.description": "Config for each block.", + "module.block-esp.general.tracers": "Tracers", + "module.block-esp.general.tracers.description": "Render tracer lines.", + + "module.packet-mine": "Packet Mine", + "module.packet-mine.description": "Sends packets to mine blocks without the mining animation.", + "module.packet-mine.general.delay": "Delay", + "module.packet-mine.general.delay.description": "Delay between mining blocks in ticks.", + "module.packet-mine.general.rotate": "Rotate", + "module.packet-mine.general.rotate.description": "Sends rotation packets to the server when mining.", + "module.packet-mine.general.auto-switch": "Auto Switch", + "module.packet-mine.general.auto-switch.description": "Automatically switches to the best tool when the block is ready to be mined instantly.", + "module.packet-mine.general.not-on-use": "Not On Use", + "module.packet-mine.general.not-on-use.description": "Won't auto switch if you're using an item.", + "module.packet-mine.general.obscure-breaking-progress": "Obscure Breaking Progress", + "module.packet-mine.general.obscure-breaking-progress.description": "Spams abort breaking packets to obscure the block mining progress from other players. Does not hide it perfectly.", + "module.packet-mine.render": "Render", + "module.packet-mine.render.render": "Render", + "module.packet-mine.render.render.description": "Whether or not to render the block being mined.", + "module.packet-mine.render.shape-mode": "Shape Mode", + "module.packet-mine.render.shape-mode.description": "How the shapes are rendered.", + "module.packet-mine.render.ready-side-color": "Ready Side Color", + "module.packet-mine.render.ready-side-color.description": "The color of the sides of the blocks that can be broken.", + "module.packet-mine.render.ready-line-color": "Ready Line Color", + "module.packet-mine.render.ready-line-color.description": "The color of the lines of the blocks that can be broken.", + "module.packet-mine.render.side-color": "Side Color", + "module.packet-mine.render.side-color.description": "The color of the sides of the blocks being rendered.", + "module.packet-mine.render.line-color": "Line Color", + "module.packet-mine.render.line-color.description": "The color of the lines of the blocks being rendered.", + + "module.liquid-filler": "Liquid Filler", + "module.liquid-filler.description": "Places blocks inside of liquid source blocks within range of you.", + "module.liquid-filler.general.place-in": "Place In", + "module.liquid-filler.general.place-in.description": "What type of liquids to place in.", + "module.liquid-filler.general.shape": "Shape", + "module.liquid-filler.general.shape.description": "The shape of placing algorithm.", + "module.liquid-filler.general.place-range": "Place Range", + "module.liquid-filler.general.place-range.description": "The range at which blocks can be placed.", + "module.liquid-filler.general.walls-range": "Walls Range", + "module.liquid-filler.general.walls-range.description": "Range in which to place when behind blocks.", + "module.liquid-filler.general.delay": "Delay", + "module.liquid-filler.general.delay.description": "Delay between actions in ticks.", + "module.liquid-filler.general.max-blocks-per-tick": "Max Blocks Per Tick", + "module.liquid-filler.general.max-blocks-per-tick.description": "Maximum blocks to try to place per tick.", + "module.liquid-filler.general.sort-mode": "Sort Mode", + "module.liquid-filler.general.sort-mode.description": "The blocks you want to place first.", + "module.liquid-filler.general.rotate": "Rotate", + "module.liquid-filler.general.rotate.description": "Automatically rotates towards the space targeted for filling.", + "module.liquid-filler.whitelist": "Whitelist", + "module.liquid-filler.whitelist.list-mode": "List Mode", + "module.liquid-filler.whitelist.list-mode.description": "Selection mode.", + "module.liquid-filler.whitelist.whitelist": "Whitelist", + "module.liquid-filler.whitelist.whitelist.description": "The allowed blocks that it will use to fill up the liquid.", + "module.liquid-filler.whitelist.blacklist": "Blacklist", + "module.liquid-filler.whitelist.blacklist.description": "The denied blocks that it not will use to fill up the liquid.", + + "module.quiver": "Quiver", + "module.quiver.description": "Shoots arrows at yourself.", + "module.quiver.general.effects": "Effects", + "module.quiver.general.effects.description": "Which effects to shoot you with.", + "module.quiver.general.cooldown": "Cooldown", + "module.quiver.general.cooldown.description": "How many ticks between shooting effects (19 minimum for NCP).", + "module.quiver.general.check-effects": "Check Effects", + "module.quiver.general.check-effects.description": "Won't shoot you with effects you already have.", + "module.quiver.general.silent-bow": "Silent Bow", + "module.quiver.general.silent-bow.description": "Takes a bow from your inventory to quiver.", + "module.quiver.general.chat-info": "Chat Info", + "module.quiver.general.chat-info.description": "Sends info about quiver checks in chat.", + "module.quiver.safety": "Safety", + "module.quiver.safety.only-in-holes": "Only In Holes", + "module.quiver.safety.only-in-holes.description": "Only quiver when you're in a hole.", + "module.quiver.safety.only-on-ground": "Only On Ground", + "module.quiver.safety.only-on-ground.description": "Only quiver when you're on the ground.", + "module.quiver.safety.min-health": "Min Health", + "module.quiver.safety.min-health.description": "How much health you must have to quiver.", + + "module.chest-swap": "Chest Swap", + "module.chest-swap.description": "Automatically swaps between a chestplate and an elytra.", + "module.chest-swap.general.chestplate": "Chestplate", + "module.chest-swap.general.chestplate.description": "Which type of chestplate to swap to.", + "module.chest-swap.general.stay-on": "Stay On", + "module.chest-swap.general.stay-on.description": "Stays on and activates when you turn it off.", + "module.chest-swap.general.close-inventory": "Close Inventory", + "module.chest-swap.general.close-inventory.description": "Sends inventory close after swap.", + + "module.fast-use": "Fast Use", + "module.fast-use.description": "Allows you to use items at very high speeds.", + "module.fast-use.general.mode": "Mode", + "module.fast-use.general.mode.description": "Which items to fast use.", + "module.fast-use.general.items": "Items", + "module.fast-use.general.items.description": "Which items should fast place work on in \"Some\" mode.", + "module.fast-use.general.blocks": "Blocks", + "module.fast-use.general.blocks.description": "Fast-places blocks if the mode is \"Some\" mode.", + "module.fast-use.general.cooldown": "Cooldown", + "module.fast-use.general.cooldown.description": "Fast-use cooldown in ticks.", + + "module.anchor": "Anchor", + "module.anchor.description": "Helps you get into holes by stopping your movement completely over a hole.", + "module.anchor.general.max-height": "Max Height", + "module.anchor.general.max-height.description": "The maximum height Anchor will work at.", + "module.anchor.general.min-pitch": "Min Pitch", + "module.anchor.general.min-pitch.description": "The minimum pitch at which anchor will work.", + "module.anchor.general.cancel-jump-in-hole": "Cancel Jump In Hole", + "module.anchor.general.cancel-jump-in-hole.description": "Prevents you from jumping when Anchor is active and Min Pitch is met.", + "module.anchor.general.pull": "Pull", + "module.anchor.general.pull.description": "The pull strength of Anchor.", + "module.anchor.general.pull-speed": "Pull Speed", + "module.anchor.general.pull-speed.description": "How fast to pull towards the hole in blocks per second.", + + "module.anti-anvil": "Anti Anvil", + "module.anti-anvil.description": "Automatically prevents Auto Anvil by placing between you and the anvil.", + "module.anti-anvil.general.swing": "Swing", + "module.anti-anvil.general.swing.description": "Swings your hand client-side when placing.", + "module.anti-anvil.general.rotate": "Rotate", + "module.anti-anvil.general.rotate.description": "Makes you rotate when placing.", + + "module.highway-builder": "Highway Builder", + "module.highway-builder.description": "Automatically builds highways.", + "module.highway-builder.general.width": "Width", + "module.highway-builder.general.width.description": "Width of the highway.", + "module.highway-builder.general.height": "Height", + "module.highway-builder.general.height.description": "Height of the highway.", + "module.highway-builder.general.floor": "Floor", + "module.highway-builder.general.floor.description": "What floor placement mode to use.", + "module.highway-builder.general.railings": "Railings", + "module.highway-builder.general.railings.description": "Builds railings next to the highway.", + "module.highway-builder.general.corner-support-block": "Corner Support Block", + "module.highway-builder.general.corner-support-block.description": "Places a support block underneath the railings, to prevent air placing.", + "module.highway-builder.general.mine-above-railings": "Mine Above Railings", + "module.highway-builder.general.mine-above-railings.description": "Mines blocks above railings.", + "module.highway-builder.general.rotation": "Rotation", + "module.highway-builder.general.rotation.description": "Mode of rotation.", + "module.highway-builder.general.disconnect-on-toggle": "Disconnect On Toggle", + "module.highway-builder.general.disconnect-on-toggle.description": "Automatically disconnects when the module is turned off, for example for not having enough blocks.", + "module.highway-builder.general.pause-on-lag": "Pause On Lag", + "module.highway-builder.general.pause-on-lag.description": "Pauses the current process while the server stops responding.", + "module.highway-builder.general.destroy-crystal-traps": "Destroy Crystal Traps", + "module.highway-builder.general.destroy-crystal-traps.description": "Use a bow to defuse crystal traps safely from a distance. An infinity bow is recommended.", + "module.highway-builder.digging": "Digging", + "module.highway-builder.digging.double-mine": "Double Mine", + "module.highway-builder.digging.double-mine.description": "Whether to double mine blocks when applicable (normal mine and packet mine simultaneously).", + "module.highway-builder.digging.fast-break": "Fast Break", + "module.highway-builder.digging.fast-break.description": "Whether to finish breaking blocks faster than normal while double mining.", + "module.highway-builder.digging.dont-break-tools": "Dont Break Tools", + "module.highway-builder.digging.dont-break-tools.description": "Don't break tools.", + "module.highway-builder.digging.durability-percentage": "Durability Percentage", + "module.highway-builder.digging.durability-percentage.description": "The durability percentage at which to stop using a tool.", + "module.highway-builder.digging.save-pickaxes": "Save Pickaxes", + "module.highway-builder.digging.save-pickaxes.description": "How many pickaxes to ensure are saved. Hitting this number in your inventory will trigger a restock or the module toggling off.", + "module.highway-builder.digging.break-delay": "Break Delay", + "module.highway-builder.digging.break-delay.description": "The delay between breaking blocks.", + "module.highway-builder.digging.blocks-per-tick": "Blocks Per Tick", + "module.highway-builder.digging.blocks-per-tick.description": "The maximum amount of blocks that can be mined in a tick. Only applies to blocks instantly breakable.", + "module.highway-builder.paving": "Paving", + "module.highway-builder.paving.blocks-to-place": "Blocks To Place", + "module.highway-builder.paving.blocks-to-place.description": "Blocks it is allowed to place.", + "module.highway-builder.paving.place-range": "Place Range", + "module.highway-builder.paving.place-range.description": "The maximum distance at which you can place blocks.", + "module.highway-builder.paving.place-delay": "Place Delay", + "module.highway-builder.paving.place-delay.description": "The delay between placing blocks.", + "module.highway-builder.paving.placements-per-tick": "Placements Per Tick", + "module.highway-builder.paving.placements-per-tick.description": "The maximum amount of blocks that can be placed in a tick.", + "module.highway-builder.inventory": "Inventory", + "module.highway-builder.inventory.trash-items": "Trash Items", + "module.highway-builder.inventory.trash-items.description": "Items that are considered trash and can be thrown out.", + "module.highway-builder.inventory.inventory-delay": "Inventory Delay", + "module.highway-builder.inventory.inventory-delay.description": "Delay in ticks on inventory interactions.", + "module.highway-builder.inventory.eject-useless-shulkers": "Eject Useless Shulkers", + "module.highway-builder.inventory.eject-useless-shulkers.description": "Whether you should eject useless shulkers. Warning - will throw out any shulkers that don't contain blocks to place, pickaxes, or food. Be careful with your kits.", + "module.highway-builder.inventory.search-ender-chest": "Search Ender Chest", + "module.highway-builder.inventory.search-ender-chest.description": "Searches your ender chest to find items to use. Be careful with this one, especially if you let it search through shulkers.", + "module.highway-builder.inventory.search-shulkers": "Search Shulkers", + "module.highway-builder.inventory.search-shulkers.description": "Searches through shulkers to find items to use.", + "module.highway-builder.inventory.minimum-empty-slots": "Minimum Empty Slots", + "module.highway-builder.inventory.minimum-empty-slots.description": "The minimum amount of empty slots you want left after mining obsidian.", + "module.highway-builder.inventory.mine-ender-chests": "Mine Ender Chests", + "module.highway-builder.inventory.mine-ender-chests.description": "Mines ender chests for obsidian.", + "module.highway-builder.inventory.echest-blockade-type": "Echest Blockade Type", + "module.highway-builder.inventory.echest-blockade-type.description": "What blockade type to use (the structure placed when mining echests).", + "module.highway-builder.inventory.save-ender-chests": "Save Ender Chests", + "module.highway-builder.inventory.save-ender-chests.description": "How many ender chests to ensure are saved. Hitting this number in your inventory will trigger a restock or the module toggling off.", + "module.highway-builder.inventory.instantly-rebreak-echests": "Instantly Rebreak Echests", + "module.highway-builder.inventory.instantly-rebreak-echests.description": "Whether or not to use the instant rebreak exploit to break echests.", + "module.highway-builder.inventory.rebreak-delay": "Rebreak Delay", + "module.highway-builder.inventory.rebreak-delay.description": "Delay between rebreak attempts.", + "module.highway-builder.render-digging": "Render Digging", + "module.highway-builder.render-digging.render-blocks-to-mine": "Render Blocks To Mine", + "module.highway-builder.render-digging.render-blocks-to-mine.description": "Render blocks to be mined.", + "module.highway-builder.render-digging.blocks-to-mine-shape-mode": "Blocks To Mine Shape Mode", + "module.highway-builder.render-digging.blocks-to-mine-shape-mode.description": "How the blocks to be mined are rendered.", + "module.highway-builder.render-digging.blocks-to-mine-side-color": "Blocks To Mine Side Color", + "module.highway-builder.render-digging.blocks-to-mine-side-color.description": "Color of blocks to be mined.", + "module.highway-builder.render-digging.blocks-to-mine-line-color": "Blocks To Mine Line Color", + "module.highway-builder.render-digging.blocks-to-mine-line-color.description": "Color of blocks to be mined.", + "module.highway-builder.render-paving": "Render Paving", + "module.highway-builder.render-paving.render-blocks-to-place": "Render Blocks To Place", + "module.highway-builder.render-paving.render-blocks-to-place.description": "Render blocks to be placed.", + "module.highway-builder.render-paving.blocks-to-place-shape-mode": "Blocks To Place Shape Mode", + "module.highway-builder.render-paving.blocks-to-place-shape-mode.description": "How the blocks to be placed are rendered.", + "module.highway-builder.render-paving.blocks-to-place-side-color": "Blocks To Place Side Color", + "module.highway-builder.render-paving.blocks-to-place-side-color.description": "Color of blocks to be placed.", + "module.highway-builder.render-paving.blocks-to-place-line-color": "Blocks To Place Line Color", + "module.highway-builder.render-paving.blocks-to-place-line-color.description": "Color of blocks to be placed.", + + "module.breadcrumbs": "Breadcrumbs", + "module.breadcrumbs.description": "Displays a trail behind where you have walked.", + "module.breadcrumbs.general.color": "Color", + "module.breadcrumbs.general.color.description": "The color of the Breadcrumbs trail.", + "module.breadcrumbs.general.max-sections": "Max Sections", + "module.breadcrumbs.general.max-sections.description": "The maximum number of sections.", + "module.breadcrumbs.general.section-length": "Section Length", + "module.breadcrumbs.general.section-length.description": "The section length in blocks.", + + "module.auto-brewer": "Auto Brewer", + "module.auto-brewer.description": "Automatically brews the specified potion.", + "module.auto-brewer.general.potion": "Potion", + "module.auto-brewer.general.potion.description": "The type of potion to brew.", + + "module.storage-esp": "Storage Esp", + "module.storage-esp.description": "Renders all specified storage blocks.", + "module.storage-esp.general.mode": "Mode", + "module.storage-esp.general.mode.description": "Rendering mode.", + "module.storage-esp.general.storage-blocks": "Storage Blocks", + "module.storage-esp.general.storage-blocks.description": "Select the storage blocks to display.", + "module.storage-esp.general.tracers": "Tracers", + "module.storage-esp.general.tracers.description": "Draws tracers to storage blocks.", + "module.storage-esp.general.shape-mode": "Shape Mode", + "module.storage-esp.general.shape-mode.description": "How the shapes are rendered.", + "module.storage-esp.general.fill-opacity": "Fill Opacity", + "module.storage-esp.general.fill-opacity.description": "The opacity of the shape fill.", + "module.storage-esp.general.width": "Width", + "module.storage-esp.general.width.description": "The width of the shader outline.", + "module.storage-esp.general.glow-multiplier": "Glow Multiplier", + "module.storage-esp.general.glow-multiplier.description": "Multiplier for glow effect", + "module.storage-esp.general.chest": "Chest", + "module.storage-esp.general.chest.description": "The color of chests.", + "module.storage-esp.general.trapped-chest": "Trapped Chest", + "module.storage-esp.general.trapped-chest.description": "The color of trapped chests.", + "module.storage-esp.general.barrel": "Barrel", + "module.storage-esp.general.barrel.description": "The color of barrels.", + "module.storage-esp.general.shulker": "Shulker", + "module.storage-esp.general.shulker.description": "The color of Shulker Boxes.", + "module.storage-esp.general.ender-chest": "Ender Chest", + "module.storage-esp.general.ender-chest.description": "The color of Ender Chests.", + "module.storage-esp.general.other": "Other", + "module.storage-esp.general.other.description": "The color of furnaces, dispensers, droppers and hoppers.", + "module.storage-esp.general.fade-distance": "Fade Distance", + "module.storage-esp.general.fade-distance.description": "The distance at which the color will fade.", + "module.storage-esp.opened-rendering": "Opened Rendering", + "module.storage-esp.opened-rendering.hide-opened": "Hide Opened", + "module.storage-esp.opened-rendering.hide-opened.description": "Hides opened containers.", + "module.storage-esp.opened-rendering.opened-color": "Opened Color", + "module.storage-esp.opened-rendering.opened-color.description": "Optional setting to change colors of opened chests, as opposed to not rendering. Disabled at zero opacity.", + + "module.no-status-effects": "No Status Effects", + "module.no-status-effects.description": "Blocks specified status effects.", + "module.no-status-effects.general.blocked-effects": "Blocked Effects", + "module.no-status-effects.general.blocked-effects.description": "Effects to block.", + + "module.attribute-swap": "Attribute Swap", + "module.attribute-swap.description": "Swaps to a target slot when you attack.", + "module.attribute-swap.general.mode": "Mode", + "module.attribute-swap.general.mode.description": "The mode to use.", + "module.attribute-swap.general.target-slot": "Target Slot", + "module.attribute-swap.general.target-slot.description": "Hotbar slot to swap to (1-9).", + "module.attribute-swap.general.swap-back": "Swap Back", + "module.attribute-swap.general.swap-back.description": "Swap back to the original slot after a delay.", + "module.attribute-swap.general.swap-back-delay": "Swap Back Delay", + "module.attribute-swap.general.swap-back-delay.description": "Delay in ticks before swapping back.", + "module.attribute-swap.swapping-options": "Swapping Options", + "module.attribute-swap.swapping-options.shield-breaker": "Shield Breaker", + "module.attribute-swap.swapping-options.shield-breaker.description": "Automatically swaps to an axe if the target is blocking.", + "module.attribute-swap.swapping-options.durability-saver": "Durability Saver", + "module.attribute-swap.swapping-options.durability-saver.description": "Swaps to a non-damageable item to save durability on the main weapon.", + "module.attribute-swap.swapping-options.sword-swapping": "Sword Swapping", + "module.attribute-swap.swapping-options.sword-swapping.description": "Enables smart swapping for sword enchantments.", + "module.attribute-swap.swapping-options.mace-swapping": "Mace Swapping", + "module.attribute-swap.swapping-options.mace-swapping.description": "Enables smart swapping for mace enchantments.", + "module.attribute-swap.swapping-options.other-swapping": "Other Swapping", + "module.attribute-swap.swapping-options.other-swapping.description": "Enables smart swapping for other enchantments like Impaling.", + "module.attribute-swap.sword-enchants": "Sword Enchants", + "module.attribute-swap.sword-enchants.fire-aspect": "Fire Aspect", + "module.attribute-swap.sword-enchants.fire-aspect.description": "Swaps to an item with Fire Aspect to set the target on fire, if target isn't already on fire", + "module.attribute-swap.sword-enchants.looting": "Looting", + "module.attribute-swap.sword-enchants.looting.description": "Swaps to an item with Looting for better drops or more experience. Only prefers for mobs (but fire aspect is priority)", + "module.attribute-swap.sword-enchants.sharpness": "Sharpness", + "module.attribute-swap.sword-enchants.sharpness.description": "Swaps to an item with Sharpness for increased damage against all entities.", + "module.attribute-swap.sword-enchants.smite": "Smite", + "module.attribute-swap.sword-enchants.smite.description": "Swaps to an item with Smite for increased damage against undead mobs.", + "module.attribute-swap.sword-enchants.bane-of-arthropods": "Bane Of Arthropods", + "module.attribute-swap.sword-enchants.bane-of-arthropods.description": "Swaps to an item with Bane of Arthropods for increased damage against arthropods.", + "module.attribute-swap.sword-enchants.sweeping-edge": "Sweeping Edge", + "module.attribute-swap.sword-enchants.sweeping-edge.description": "Swaps to an item with Sweeping Edge for increased sweeping attack damage.", + "module.attribute-swap.mace-enchants": "Mace Enchants", + "module.attribute-swap.mace-enchants.regular-mace": "Regular Mace", + "module.attribute-swap.mace-enchants.regular-mace.description": "Swaps to a regular Mace when falling if no better option is available.", + "module.attribute-swap.mace-enchants.density": "Density", + "module.attribute-swap.mace-enchants.density.description": "Swaps to a Mace with Density to deal increased damage when falling.", + "module.attribute-swap.mace-enchants.breach": "Breach", + "module.attribute-swap.mace-enchants.breach.description": "Swaps to a Mace with Breach to reduce the target's armor effectiveness.", + "module.attribute-swap.mace-enchants.wind-burst": "Wind Burst", + "module.attribute-swap.mace-enchants.wind-burst.description": "Swaps to a Mace with Wind Burst to launch up when hitting while falling.", + "module.attribute-swap.other-enchants": "Other Enchants", + "module.attribute-swap.other-enchants.impaling": "Impaling", + "module.attribute-swap.other-enchants.impaling.description": "Swaps to an item with Impaling for increased damage against aquatic mobs.", + "module.attribute-swap.weapon-options": "Weapon Options", + "module.attribute-swap.weapon-options.only-on-weapon": "Only On Weapon", + "module.attribute-swap.weapon-options.only-on-weapon.description": "Only swaps when holding a selected weapon in hand.", + "module.attribute-swap.weapon-options.sword": "Sword", + "module.attribute-swap.weapon-options.sword.description": "Works while holding a sword.", + "module.attribute-swap.weapon-options.axe": "Axe", + "module.attribute-swap.weapon-options.axe.description": "Works while holding an axe.", + "module.attribute-swap.weapon-options.pickaxe": "Pickaxe", + "module.attribute-swap.weapon-options.pickaxe.description": "Works while holding a pickaxe.", + "module.attribute-swap.weapon-options.shovel": "Shovel", + "module.attribute-swap.weapon-options.shovel.description": "Works while holding a shovel.", + "module.attribute-swap.weapon-options.hoe": "Hoe", + "module.attribute-swap.weapon-options.hoe.description": "Works while holding a hoe.", + "module.attribute-swap.weapon-options.mace": "Mace", + "module.attribute-swap.weapon-options.mace.description": "Works while holding a mace.", + "module.attribute-swap.weapon-options.trident": "Trident", + "module.attribute-swap.weapon-options.trident.description": "Works while holding a trident.", + + "module.echest-farmer": "Echest Farmer", + "module.echest-farmer.description": "Places and breaks EChests to farm obsidian.", + "module.echest-farmer.general.self-toggle": "Self Toggle", + "module.echest-farmer.general.self-toggle.description": "Disables when you reach the desired amount of obsidian.", + "module.echest-farmer.general.ignore-existing": "Ignore Existing", + "module.echest-farmer.general.ignore-existing.description": "Ignores existing obsidian in your inventory and mines the total target amount.", + "module.echest-farmer.general.amount": "Amount", + "module.echest-farmer.general.amount.description": "The amount of obsidian to farm.", + "module.echest-farmer.render": "Render", + "module.echest-farmer.render.swing-hand": "Swing Hand", + "module.echest-farmer.render.swing-hand.description": "Swing hand client-side.", + "module.echest-farmer.render.render": "Render", + "module.echest-farmer.render.render.description": "Renders a block overlay where the obsidian will be placed.", + "module.echest-farmer.render.shape-mode": "Shape Mode", + "module.echest-farmer.render.shape-mode.description": "How the shapes are rendered.", + "module.echest-farmer.render.side-color": "Side Color", + "module.echest-farmer.render.side-color.description": "The color of the sides of the blocks being rendered.", + "module.echest-farmer.render.line-color": "Line Color", + "module.echest-farmer.render.line-color.description": "The color of the lines of the blocks being rendered.", + + "module.self-anvil": "Self Anvil", + "module.self-anvil.description": "Automatically places an anvil on you to prevent other players from going into your hole.", + + "module.flamethrower": "Flamethrower", + "module.flamethrower.description": "Ignites every alive piece of food.", + "module.flamethrower.general.distance": "Distance", + "module.flamethrower.general.distance.description": "The maximum distance the animal has to be to be roasted.", + "module.flamethrower.general.anti-break": "Anti Break", + "module.flamethrower.general.anti-break.description": "Prevents flint and steel from being broken.", + "module.flamethrower.general.put-out-fire": "Put Out Fire", + "module.flamethrower.general.put-out-fire.description": "Tries to put out the fire when animal is low health, so the items don't burn.", + "module.flamethrower.general.target-babies": "Target Babies", + "module.flamethrower.general.target-babies.description": "If checked babies will also be killed.", + "module.flamethrower.general.tick-interval": "Tick Interval", + "module.flamethrower.general.tick-interval.description": "", + "module.flamethrower.general.rotate": "Rotate", + "module.flamethrower.general.rotate.description": "Automatically faces towards the animal roasted.", + "module.flamethrower.general.entities": "Entities", + "module.flamethrower.general.entities.description": "Entities to cook.", + + "module.anti-bed": "Anti Bed", + "module.anti-bed.description": "Places string to prevent beds being placed on you.", + "module.anti-bed.general.place-string-top": "Place String Top", + "module.anti-bed.general.place-string-top.description": "Places string above you.", + "module.anti-bed.general.place-string-middle": "Place String Middle", + "module.anti-bed.general.place-string-middle.description": "Places string in your upper hitbox.", + "module.anti-bed.general.place-string-bottom": "Place String Bottom", + "module.anti-bed.general.place-string-bottom.description": "Places string at your feet.", + "module.anti-bed.general.only-in-hole": "Only In Hole", + "module.anti-bed.general.only-in-hole.description": "Only functions when you are standing in a hole.", + + "module.auto-mend": "Auto Mend", + "module.auto-mend.description": "Automatically replaces items in your offhand with mending when fully repaired.", + "module.auto-mend.general.blacklist": "Blacklist", + "module.auto-mend.general.blacklist.description": "Item blacklist.", + "module.auto-mend.general.force": "Force", + "module.auto-mend.general.force.description": "Replaces item in offhand even if there is some other non-repairable item.", + "module.auto-mend.general.auto-disable": "Auto Disable", + "module.auto-mend.general.auto-disable.description": "Automatically disables when there are no more items to repair.", + + "module.auto-anvil": "Auto Anvil", + "module.auto-anvil.description": "Automatically places anvils above players to destroy helmets.", + "module.auto-anvil.general.target-range": "Target Range", + "module.auto-anvil.general.target-range.description": "The radius in which players get targeted.", + "module.auto-anvil.general.target-priority": "Target Priority", + "module.auto-anvil.general.target-priority.description": "How to select the player to target.", + "module.auto-anvil.general.height": "Height", + "module.auto-anvil.general.height.description": "The height to place anvils at.", + "module.auto-anvil.general.delay": "Delay", + "module.auto-anvil.general.delay.description": "The delay in between anvil placements.", + "module.auto-anvil.general.place-at-feet": "Place At Feet", + "module.auto-anvil.general.place-at-feet.description": "Automatically places a button or pressure plate at the targets feet to break the anvils.", + "module.auto-anvil.general.multi-place": "Multi Place", + "module.auto-anvil.general.multi-place.description": "Places multiple anvils at once.", + "module.auto-anvil.general.toggle-on-break": "Toggle On Break", + "module.auto-anvil.general.toggle-on-break.description": "Toggles when the target's helmet slot is empty.", + "module.auto-anvil.general.rotate": "Rotate", + "module.auto-anvil.general.rotate.description": "Automatically rotates towards the position anvils/pressure plates/buttons are placed.", + + "module.burrow": "Burrow", + "module.burrow.description": "Attempts to clip you into a block.", + "module.burrow.general.block-to-use": "Block To Use", + "module.burrow.general.block-to-use.description": "The block to use for Burrow.", + "module.burrow.general.instant": "Instant", + "module.burrow.general.instant.description": "Jumps with packets rather than vanilla jump.", + "module.burrow.general.automatic": "Automatic", + "module.burrow.general.automatic.description": "Automatically burrows on activate rather than waiting for jump.", + "module.burrow.general.trigger-height": "Trigger Height", + "module.burrow.general.trigger-height.description": "How high you have to jump before a rubberband is triggered.", + "module.burrow.general.rubberband-height": "Rubberband Height", + "module.burrow.general.rubberband-height.description": "How far to attempt to cause rubberband.", + "module.burrow.general.timer": "Timer", + "module.burrow.general.timer.description": "Timer override.", + "module.burrow.general.only-in-holes": "Only In Holes", + "module.burrow.general.only-in-holes.description": "Stops you from burrowing when not in a hole.", + "module.burrow.general.center": "Center", + "module.burrow.general.center.description": "Centers you to the middle of the block before burrowing.", + "module.burrow.general.rotate": "Rotate", + "module.burrow.general.rotate.description": "Faces the block you place server-side.", + + "module.auto-sign": "Auto Sign", + "module.auto-sign.description": "Automatically writes signs. The first sign's text will be used.", + "module.auto-sign.general.delay": "Delay", + "module.auto-sign.general.delay.description": "The tick delay between sign update packets.", + + "module.swarm": "Swarm", + "module.swarm.description": "Allows you to control multiple instances of Meteor from one central host.", + "module.swarm.general.mode": "Mode", + "module.swarm.general.mode.description": "What type of client to run.", + "module.swarm.general.ip": "Ip", + "module.swarm.general.ip.description": "The IP address of the host server.", + "module.swarm.general.port": "Port", + "module.swarm.general.port.description": "The port used for connections.", + + "module.auto-reconnect": "Auto Reconnect", + "module.auto-reconnect.description": "Automatically reconnects when disconnected from a server.", + "module.auto-reconnect.general.delay": "Delay", + "module.auto-reconnect.general.delay.description": "The amount of seconds to wait before reconnecting to the server.", + "module.auto-reconnect.general.hide-buttons": "Hide Buttons", + "module.auto-reconnect.general.hide-buttons.description": "Will hide the buttons related to Auto Reconnect.", + + "module.build-height": "Build Height", + "module.build-height.description": "Allows you to interact with objects at the build limit.", + + "module.time-changer": "Time Changer", + "module.time-changer.description": "Makes you able to set a custom time.", + "module.time-changer.general.time": "Time", + "module.time-changer.general.time.description": "The specified time to be set.", + + "module.hole-esp": "Hole Esp", + "module.hole-esp.description": "Displays holes that you will take less damage in.", + "module.hole-esp.general.horizontal-radius": "Horizontal Radius", + "module.hole-esp.general.horizontal-radius.description": "Horizontal radius in which to search for holes.", + "module.hole-esp.general.vertical-radius": "Vertical Radius", + "module.hole-esp.general.vertical-radius.description": "Vertical radius in which to search for holes.", + "module.hole-esp.general.min-height": "Min Height", + "module.hole-esp.general.min-height.description": "Minimum hole height required to be rendered.", + "module.hole-esp.general.doubles": "Doubles", + "module.hole-esp.general.doubles.description": "Highlights double holes that can be stood across.", + "module.hole-esp.general.ignore-own": "Ignore Own", + "module.hole-esp.general.ignore-own.description": "Ignores rendering the hole you are currently standing in.", + "module.hole-esp.general.webs": "Webs", + "module.hole-esp.general.webs.description": "Whether to show holes that have webs inside of them.", + "module.hole-esp.render": "Render", + "module.hole-esp.render.shape-mode": "Shape Mode", + "module.hole-esp.render.shape-mode.description": "How the shapes are rendered.", + "module.hole-esp.render.height": "Height", + "module.hole-esp.render.height.description": "The height of rendering.", + "module.hole-esp.render.top-quad": "Top Quad", + "module.hole-esp.render.top-quad.description": "Whether to render a quad at the top of the hole.", + "module.hole-esp.render.bottom-quad": "Bottom Quad", + "module.hole-esp.render.bottom-quad.description": "Whether to render a quad at the bottom of the hole.", + "module.hole-esp.render.bedrock-top": "Bedrock Top", + "module.hole-esp.render.bedrock-top.description": "The top color for holes that are completely bedrock.", + "module.hole-esp.render.bedrock-bottom": "Bedrock Bottom", + "module.hole-esp.render.bedrock-bottom.description": "The bottom color for holes that are completely bedrock.", + "module.hole-esp.render.obsidian-top": "Obsidian Top", + "module.hole-esp.render.obsidian-top.description": "The top color for holes that are completely obsidian.", + "module.hole-esp.render.obsidian-bottom": "Obsidian Bottom", + "module.hole-esp.render.obsidian-bottom.description": "The bottom color for holes that are completely obsidian.", + "module.hole-esp.render.mixed-top": "Mixed Top", + "module.hole-esp.render.mixed-top.description": "The top color for holes that have mixed bedrock and obsidian.", + "module.hole-esp.render.mixed-bottom": "Mixed Bottom", + "module.hole-esp.render.mixed-bottom.description": "The bottom color for holes that have mixed bedrock and obsidian.", + + "module.city-esp": "City Esp", + "module.city-esp.description": "Displays blocks that can be broken in order to city another player.", + "module.city-esp.render": "Render", + "module.city-esp.render.shape-mode": "Shape Mode", + "module.city-esp.render.shape-mode.description": "How the shapes are rendered.", + "module.city-esp.render.side-color": "Side Color", + "module.city-esp.render.side-color.description": "The side color of the rendering.", + "module.city-esp.render.line-color": "Line Color", + "module.city-esp.render.line-color.description": "The line color of the rendering.", + + "module.anti-afk": "Anti Afk", + "module.anti-afk.description": "Performs different actions to prevent getting kicked while AFK.", + "module.anti-afk.actions": "Actions", + "module.anti-afk.actions.jump": "Jump", + "module.anti-afk.actions.jump.description": "Jump randomly.", + "module.anti-afk.actions.swing": "Swing", + "module.anti-afk.actions.swing.description": "Swings your hand.", + "module.anti-afk.actions.sneak": "Sneak", + "module.anti-afk.actions.sneak.description": "Sneaks and unsneaks quickly.", + "module.anti-afk.actions.sneak-time": "Sneak Time", + "module.anti-afk.actions.sneak-time.description": "How many ticks to stay sneaked.", + "module.anti-afk.actions.strafe": "Strafe", + "module.anti-afk.actions.strafe.description": "Strafe right and left.", + "module.anti-afk.actions.spin": "Spin", + "module.anti-afk.actions.spin.description": "Spins the player in place.", + "module.anti-afk.actions.spin-mode": "Spin Mode", + "module.anti-afk.actions.spin-mode.description": "The method of rotating.", + "module.anti-afk.actions.speed": "Speed", + "module.anti-afk.actions.speed.description": "The speed to spin you.", + "module.anti-afk.actions.pitch": "Pitch", + "module.anti-afk.actions.pitch.description": "The pitch to send to the server.", + "module.anti-afk.messages": "Messages", + "module.anti-afk.messages.send-messages": "Send Messages", + "module.anti-afk.messages.send-messages.description": "Sends messages to prevent getting kicked for AFK.", + "module.anti-afk.messages.random": "Random", + "module.anti-afk.messages.random.description": "Selects a random message from your message list.", + "module.anti-afk.messages.delay": "Delay", + "module.anti-afk.messages.delay.description": "The delay between specified messages in seconds.", + "module.anti-afk.messages.messages": "Messages", + "module.anti-afk.messages.messages.description": "The messages to choose from.", + + "module.gui-move": "Gui Move", + "module.gui-move.description": "Allows you to perform various actions while in GUIs.", + "module.gui-move.general.guis": "Guis", + "module.gui-move.general.guis.description": "Which GUIs to move in.", + "module.gui-move.general.jump": "Jump", + "module.gui-move.general.jump.description": "Allows you to jump while in GUIs.", + "module.gui-move.general.sneak": "Sneak", + "module.gui-move.general.sneak.description": "Allows you to sneak while in GUIs.", + "module.gui-move.general.sprint": "Sprint", + "module.gui-move.general.sprint.description": "Allows you to sprint while in GUIs.", + "module.gui-move.general.arrows-rotate": "Arrows Rotate", + "module.gui-move.general.arrows-rotate.description": "Allows you to use your arrow keys to rotate while in GUIs.", + "module.gui-move.general.rotate-speed": "Rotate Speed", + "module.gui-move.general.rotate-speed.description": "Rotation speed while in GUIs.", + + "module.trident-boost": "Trident Boost", + "module.trident-boost.description": "Boosts you when using riptide with a trident.", + "module.trident-boost.general.boost": "Boost", + "module.trident-boost.general.boost.description": "How much your velocity is multiplied by when using riptide.", + "module.trident-boost.general.out-of-water": "Out Of Water", + "module.trident-boost.general.out-of-water.description": "Whether riptide should work out of water", + + "module.better-tab": "Better Tab", + "module.better-tab.description": "Various improvements to the tab list.", + "module.better-tab.general.tablist-size": "Tablist Size", + "module.better-tab.general.tablist-size.description": "How many players in total to display in the tablist.", + "module.better-tab.general.column-height": "Column Height", + "module.better-tab.general.column-height.description": "How many players to display in each column.", + "module.better-tab.general.highlight-self": "Highlight Self", + "module.better-tab.general.highlight-self.description": "Highlights yourself in the tablist.", + "module.better-tab.general.self-color": "Self Color", + "module.better-tab.general.self-color.description": "The color to highlight your name with.", + "module.better-tab.general.highlight-friends": "Highlight Friends", + "module.better-tab.general.highlight-friends.description": "Highlights friends in the tablist.", + "module.better-tab.general.accurate-latency": "Accurate Latency", + "module.better-tab.general.accurate-latency.description": "Shows latency as a number in the tablist.", + "module.better-tab.general.gamemode": "Gamemode", + "module.better-tab.general.gamemode.description": "Display gamemode next to the nick.", + + "module.mount-bypass": "Mount Bypass", + "module.mount-bypass.description": "Allows you to bypass the IllegalStacks plugin and put chests on entities.", + + "module.anti-packet-kick": "Anti Packet Kick", + "module.anti-packet-kick.description": "Attempts to prevent you from being disconnected by large packets.", + "module.anti-packet-kick.general.catch-exceptions": "Catch Exceptions", + "module.anti-packet-kick.general.catch-exceptions.description": "Drops corrupted packets.", + "module.anti-packet-kick.general.log-exceptions": "Log Exceptions", + "module.anti-packet-kick.general.log-exceptions.description": "Logs caught exceptions.", + + "module.light-overlay": "Light Overlay", + "module.light-overlay.description": "Shows blocks where mobs can spawn.", + "module.light-overlay.general.horizontal-range": "Horizontal Range", + "module.light-overlay.general.horizontal-range.description": "Horizontal range in blocks.", + "module.light-overlay.general.vertical-range": "Vertical Range", + "module.light-overlay.general.vertical-range.description": "Vertical range in blocks.", + "module.light-overlay.general.see-through-blocks": "See Through Blocks", + "module.light-overlay.general.see-through-blocks.description": "Allows you to see the lines through blocks.", + "module.light-overlay.general.light-level": "Light Level", + "module.light-overlay.general.light-level.description": "Which light levels to render. Old spawning light: 7.", + "module.light-overlay.colors": "Colors", + "module.light-overlay.colors.color": "Color", + "module.light-overlay.colors.color.description": "Color of places where mobs can currently spawn.", + "module.light-overlay.colors.potential-color": "Potential Color", + "module.light-overlay.colors.potential-color.description": "Color of places where mobs can potentially spawn (eg at night).", + + "module.hole-filler": "Hole Filler", + "module.hole-filler.description": "Fills holes with specified blocks.", + "module.hole-filler.general.blocks": "Blocks", + "module.hole-filler.general.blocks.description": "Which blocks can be used to fill holes.", + "module.hole-filler.general.search-radius": "Search Radius", + "module.hole-filler.general.search-radius.description": "Horizontal radius in which to search for holes.", + "module.hole-filler.general.place-range": "Place Range", + "module.hole-filler.general.place-range.description": "How far away from the player you can place a block.", + "module.hole-filler.general.walls-range": "Walls Range", + "module.hole-filler.general.walls-range.description": "How far away from the player you can place a block behind walls.", + "module.hole-filler.general.doubles": "Doubles", + "module.hole-filler.general.doubles.description": "Fills double holes.", + "module.hole-filler.general.rotate": "Rotate", + "module.hole-filler.general.rotate.description": "Automatically rotates towards the holes being filled.", + "module.hole-filler.general.place-delay": "Place Delay", + "module.hole-filler.general.place-delay.description": "The ticks delay between placement.", + "module.hole-filler.general.blocks-per-tick": "Blocks Per Tick", + "module.hole-filler.general.blocks-per-tick.description": "How many blocks to place in one tick.", + "module.hole-filler.smart": "Smart", + "module.hole-filler.smart.smart": "Smart", + "module.hole-filler.smart.smart.description": "Take more factors into account before filling a hole.", + "module.hole-filler.smart.force-fill": "Force Fill", + "module.hole-filler.smart.force-fill.description": "Fills all holes around you regardless of target checks.", + "module.hole-filler.smart.predict-movement": "Predict Movement", + "module.hole-filler.smart.predict-movement.description": "Predict target movement to account for ping.", + "module.hole-filler.smart.ticks-to-predict": "Ticks To Predict", + "module.hole-filler.smart.ticks-to-predict.description": "How many ticks ahead we should predict for.", + "module.hole-filler.smart.ignore-safe": "Ignore Safe", + "module.hole-filler.smart.ignore-safe.description": "Ignore players in safe holes.", + "module.hole-filler.smart.only-moving": "Only Moving", + "module.hole-filler.smart.only-moving.description": "Ignore players if they're standing still.", + "module.hole-filler.smart.target-range": "Target Range", + "module.hole-filler.smart.target-range.description": "How far away to target players.", + "module.hole-filler.smart.feet-range": "Feet Range", + "module.hole-filler.smart.feet-range.description": "How far from a hole a player's feet must be to fill it.", + "module.hole-filler.render": "Render", + "module.hole-filler.render.swing": "Swing", + "module.hole-filler.render.swing.description": "Swing the player's hand when placing.", + "module.hole-filler.render.render": "Render", + "module.hole-filler.render.render.description": "Renders an overlay where blocks will be placed.", + "module.hole-filler.render.shape-mode": "Shape Mode", + "module.hole-filler.render.shape-mode.description": "How the shapes are rendered.", + "module.hole-filler.render.side-color": "Side Color", + "module.hole-filler.render.side-color.description": "The side color of the target block rendering.", + "module.hole-filler.render.line-color": "Line Color", + "module.hole-filler.render.line-color.description": "The line color of the target block rendering.", + "module.hole-filler.render.next-side-color": "Next Side Color", + "module.hole-filler.render.next-side-color.description": "The side color of the next block to be placed.", + "module.hole-filler.render.next-line-color": "Next Line Color", + "module.hole-filler.render.next-line-color.description": "The line color of the next block to be placed.", + + "module.message-aura": "Message Aura", + "module.message-aura.description": "Sends a specified message to any player that enters render distance.", + "module.message-aura.general.message": "Message", + "module.message-aura.general.message.description": "The specified message sent to the player.", + "module.message-aura.general.ignore-friends": "Ignore Friends", + "module.message-aura.general.ignore-friends.description": "Will not send any messages to people friended.", + + "module.fast-climb": "Fast Climb", + "module.fast-climb.description": "Allows you to climb faster.", + "module.fast-climb.general.timer-mode": "Timer Mode", + "module.fast-climb.general.timer-mode.description": "Use timer.", + "module.fast-climb.general.climb-speed": "Climb Speed", + "module.fast-climb.general.climb-speed.description": "Your climb speed.", + "module.fast-climb.general.timer": "Timer", + "module.fast-climb.general.timer.description": "The timer value for Timer.", + + "module.sprint": "Sprint", + "module.sprint.description": "Automatically sprints.", + "module.sprint.general.sprint-mode": "Sprint Mode", + "module.sprint.general.sprint-mode.description": "What mode of sprinting.", + "module.sprint.general.keep-sprint": "Keep Sprint", + "module.sprint.general.keep-sprint.description": "Whether to keep sprinting after attacking.", + "module.sprint.general.unsprint-on-hit": "Unsprint On Hit", + "module.sprint.general.unsprint-on-hit.description": "Whether to stop sprinting before attacking, to ensure you get crits and sweep attacks.", + "module.sprint.general.unsprint-in-water": "Unsprint In Water", + "module.sprint.general.unsprint-in-water.description": "Whether to stop sprinting when in water.", + "module.sprint.general.sprint-while-stationary": "Sprint While Stationary", + "module.sprint.general.sprint-while-stationary.description": "Sprint even when not moving.", + + "module.xray": "Xray", + "module.xray.description": "Only renders specified blocks. Good for mining.", + "module.xray.general.whitelist": "Whitelist", + "module.xray.general.whitelist.description": "Which blocks to show x-rayed.", + "module.xray.general.opacity": "Opacity", + "module.xray.general.opacity.description": "The opacity for all other blocks.", + "module.xray.general.exposed-only": "Exposed Only", + "module.xray.general.exposed-only.description": "Show only exposed ores.", + + "module.notebot": "Notebot", + "module.notebot.description": "Plays noteblock nicely", + "module.notebot.general.tick-delay": "Tick Delay", + "module.notebot.general.tick-delay.description": "The delay when loading a song.", + "module.notebot.general.concurrent-tune-blocks": "Concurrent Tune Blocks", + "module.notebot.general.concurrent-tune-blocks.description": "How many noteblocks can be tuned at the same time. On Paper it is recommended to set it to 1 to avoid bugs.", + "module.notebot.general.mode": "Mode", + "module.notebot.general.mode.description": "Select mode of notebot", + "module.notebot.general.instrument-detect-mode": "Instrument Detect Mode", + "module.notebot.general.instrument-detect-mode.description": "Select an instrument detect mode. Can be useful when server has a plugin that modifies noteblock state (e.g ItemsAdder) but noteblock can still play the right note", + "module.notebot.general.polyphonic": "Polyphonic", + "module.notebot.general.polyphonic.description": "Whether or not to allow multiple notes to be played at the same time", + "module.notebot.general.auto-rotate": "Auto Rotate", + "module.notebot.general.auto-rotate.description": "Should client look at note block when it wants to hit it", + "module.notebot.general.auto-play": "Auto Play", + "module.notebot.general.auto-play.description": "Auto plays random songs", + "module.notebot.general.round-out-of-range": "Round Out Of Range", + "module.notebot.general.round-out-of-range.description": "Rounds out of range notes", + "module.notebot.general.swing-arm": "Swing Arm", + "module.notebot.general.swing-arm.description": "Should swing arm on hit", + "module.notebot.general.check-noteblocks-again-delay": "Check Noteblocks Again Delay", + "module.notebot.general.check-noteblocks-again-delay.description": "How much delay should be between end of tuning and checking again", + "module.notebot.note-map": "Note Map", + "module.notebot.note-map.Harp": "Harp", + "module.notebot.note-map.Harp.description": "", + "module.notebot.note-map.Basedrum": "Basedrum", + "module.notebot.note-map.Basedrum.description": "", + "module.notebot.note-map.Snare": "Snare", + "module.notebot.note-map.Snare.description": "", + "module.notebot.note-map.Hat": "Hat", + "module.notebot.note-map.Hat.description": "", + "module.notebot.note-map.Bass": "Bass", + "module.notebot.note-map.Bass.description": "", + "module.notebot.note-map.Flute": "Flute", + "module.notebot.note-map.Flute.description": "", + "module.notebot.note-map.Bell": "Bell", + "module.notebot.note-map.Bell.description": "", + "module.notebot.note-map.Guitar": "Guitar", + "module.notebot.note-map.Guitar.description": "", + "module.notebot.note-map.Chime": "Chime", + "module.notebot.note-map.Chime.description": "", + "module.notebot.note-map.Xylophone": "Xylophone", + "module.notebot.note-map.Xylophone.description": "", + "module.notebot.note-map.IronXylophone": "IronXylophone", + "module.notebot.note-map.IronXylophone.description": "", + "module.notebot.note-map.CowBell": "CowBell", + "module.notebot.note-map.CowBell.description": "", + "module.notebot.note-map.Didgeridoo": "Didgeridoo", + "module.notebot.note-map.Didgeridoo.description": "", + "module.notebot.note-map.Bit": "Bit", + "module.notebot.note-map.Bit.description": "", + "module.notebot.note-map.Banjo": "Banjo", + "module.notebot.note-map.Banjo.description": "", + "module.notebot.note-map.Pling": "Pling", + "module.notebot.note-map.Pling.description": "", + "module.notebot.render": "Render", + "module.notebot.render.render-text": "Render Text", + "module.notebot.render.render-text.description": "Whether or not to render the text above noteblocks.", + "module.notebot.render.render-boxes": "Render Boxes", + "module.notebot.render.render-boxes.description": "Whether or not to render the outline around the noteblocks.", + "module.notebot.render.shape-mode": "Shape Mode", + "module.notebot.render.shape-mode.description": "How the shapes are rendered.", + "module.notebot.render.untuned-side-color": "Untuned Side Color", + "module.notebot.render.untuned-side-color.description": "The color of the sides of the untuned blocks being rendered.", + "module.notebot.render.untuned-line-color": "Untuned Line Color", + "module.notebot.render.untuned-line-color.description": "The color of the lines of the untuned blocks being rendered.", + "module.notebot.render.tuned-side-color": "Tuned Side Color", + "module.notebot.render.tuned-side-color.description": "The color of the sides of the tuned blocks being rendered.", + "module.notebot.render.tuned-line-color": "Tuned Line Color", + "module.notebot.render.tuned-line-color.description": "The color of the lines of the tuned blocks being rendered.", + "module.notebot.render.hit-side-color": "Hit Side Color", + "module.notebot.render.hit-side-color.description": "The color of the sides being rendered on noteblock tune hit.", + "module.notebot.render.hit-line-color": "Hit Line Color", + "module.notebot.render.hit-line-color.description": "The color of the lines being rendered on noteblock tune hit.", + "module.notebot.render.scanned-noteblock-side-color": "Scanned Noteblock Side Color", + "module.notebot.render.scanned-noteblock-side-color.description": "The color of the sides of the scanned noteblocks being rendered.", + "module.notebot.render.scanned-noteblock-line-color": "Scanned Noteblock Line Color", + "module.notebot.render.scanned-noteblock-line-color.description": "The color of the lines of the scanned noteblocks being rendered.", + "module.notebot.render.note-text-scale": "Note Text Scale", + "module.notebot.render.note-text-scale.description": "The scale.", + "module.notebot.render.show-scanned-noteblocks": "Show Scanned Noteblocks", + "module.notebot.render.show-scanned-noteblocks.description": "Show scanned Noteblocks", + + "module.item-highlight": "Item Highlight", + "module.item-highlight.description": "Highlights selected items when in guis", + "module.item-highlight.general.items": "Items", + "module.item-highlight.general.items.description": "Items to highlight.", + "module.item-highlight.general.color": "Color", + "module.item-highlight.general.color.description": "The color to highlight the items with.", + + "module.auto-mount": "Auto Mount", + "module.auto-mount.description": "Automatically mounts entities.", + "module.auto-mount.general.check-saddle": "Check Saddle", + "module.auto-mount.general.check-saddle.description": "Checks if the entity contains a saddle before mounting.", + "module.auto-mount.general.rotate": "Rotate", + "module.auto-mount.general.rotate.description": "Faces the entity you mount.", + "module.auto-mount.general.entities": "Entities", + "module.auto-mount.general.entities.description": "Rideable entities.", + + "module.zoom": "Zoom", + "module.zoom.description": "Zooms your view.", + "module.zoom.general.zoom": "Zoom", + "module.zoom.general.zoom.description": "How much to zoom.", + "module.zoom.general.scroll-sensitivity": "Scroll Sensitivity", + "module.zoom.general.scroll-sensitivity.description": "Allows you to change zoom value using scroll wheel. 0 to disable.", + "module.zoom.general.smooth": "Smooth", + "module.zoom.general.smooth.description": "Smooth transition.", + "module.zoom.general.cinematic": "Cinematic", + "module.zoom.general.cinematic.description": "Enables cinematic camera.", + "module.zoom.general.hide-HUD": "Hide HUD", + "module.zoom.general.hide-HUD.description": "Whether or not to hide the Minecraft HUD.", + "module.zoom.general.show-hands": "Show Hands", + "module.zoom.general.show-hands.description": "Whether or not to render your hands.", + + "module.bow-spam": "Bow Spam", + "module.bow-spam.description": "Spams bows and crossbows.", + "module.bow-spam.general.charge": "Charge", + "module.bow-spam.general.charge.description": "How long to charge the bow before releasing in ticks.", + "module.bow-spam.general.when-holding-right-click": "When Holding Right Click", + "module.bow-spam.general.when-holding-right-click.description": "Works only when holding right click.", + "module.bow-spam.crossbows": "Crossbows", + "module.bow-spam.crossbows.spam-crossbows": "Spam Crossbows", + "module.bow-spam.crossbows.spam-crossbows.description": "Whether to spam loaded crossbows; takes priority over charging bows.", + "module.bow-spam.crossbows.crossbow-delay": "Crossbow Delay", + "module.bow-spam.crossbows.crossbow-delay.description": "Delay between shooting crossbows in ticks.", + "module.bow-spam.crossbows.search-inventory": "Search Inventory", + "module.bow-spam.crossbows.search-inventory.description": "Whether to search your inventory to find loaded crossbows.", + + "module.free-look": "Free Look", + "module.free-look.description": "Allows more rotation options in third person.", + "module.free-look.general.mode": "Mode", + "module.free-look.general.mode.description": "Which entity to rotate.", + "module.free-look.general.toggle-perspective": "Toggle Perspective", + "module.free-look.general.toggle-perspective.description": "Changes your perspective on toggle.", + "module.free-look.general.camera-sensitivity": "Camera Sensitivity", + "module.free-look.general.camera-sensitivity.description": "How fast the camera moves in camera mode.", + "module.free-look.arrows": "Arrows", + "module.free-look.arrows.arrows-control-opposite": "Arrows Control Opposite", + "module.free-look.arrows.arrows-control-opposite.description": "Allows you to control the other entities rotation with the arrow keys.", + "module.free-look.arrows.arrow-speed": "Arrow Speed", + "module.free-look.arrows.arrow-speed.description": "Rotation speed with arrow keys.", + + "module.auto-walk": "Auto Walk", + "module.auto-walk.description": "Automatically walks forward.", + "module.auto-walk.general.mode": "Mode", + "module.auto-walk.general.mode.description": "Walking mode.", + "module.auto-walk.general.simple-direction": "Simple Direction", + "module.auto-walk.general.simple-direction.description": "The direction to walk in simple mode.", + "module.auto-walk.general.disable-on-input": "Disable On Input", + "module.auto-walk.general.disable-on-input.description": "Disable module on manual movement input", + "module.auto-walk.general.disable-on-y-change": "Disable On Y Change", + "module.auto-walk.general.disable-on-y-change.description": "Disable module if player moves vertically", + "module.auto-walk.general.no-unloaded-chunks": "No Unloaded Chunks", + "module.auto-walk.general.no-unloaded-chunks.description": "Do not allow movement into unloaded chunks", + + "module.self-trap": "Self Trap", + "module.self-trap.description": "Places blocks above your head.", + "module.self-trap.general.whitelist": "Whitelist", + "module.self-trap.general.whitelist.description": "Which blocks to use.", + "module.self-trap.general.top-mode": "Top Mode", + "module.self-trap.general.top-mode.description": "Which positions to place on your top half.", + "module.self-trap.general.bottom-mode": "Bottom Mode", + "module.self-trap.general.bottom-mode.description": "Which positions to place on your bottom half.", + "module.self-trap.general.place-delay": "Place Delay", + "module.self-trap.general.place-delay.description": "How many ticks between block placements.", + "module.self-trap.general.center": "Center", + "module.self-trap.general.center.description": "Centers you on the block you are standing on before placing.", + "module.self-trap.general.turn-off": "Turn Off", + "module.self-trap.general.turn-off.description": "Turns off after placing.", + "module.self-trap.general.rotate": "Rotate", + "module.self-trap.general.rotate.description": "Sends rotation packets to the server when placing.", + "module.self-trap.render": "Render", + "module.self-trap.render.render": "Render", + "module.self-trap.render.render.description": "Renders a block overlay where the blocks will be placed.", + "module.self-trap.render.shape-mode": "Shape Mode", + "module.self-trap.render.shape-mode.description": "How the shapes are rendered.", + "module.self-trap.render.side-color": "Side Color", + "module.self-trap.render.side-color.description": "The color of the sides of the blocks being rendered.", + "module.self-trap.render.line-color": "Line Color", + "module.self-trap.render.line-color.description": "The color of the lines of the blocks being rendered.", + + "module.safe-walk": "Safe Walk", + "module.safe-walk.description": "Prevents you from walking off blocks.", + "module.safe-walk.general.minimum-fall-distance": "Minimum Fall Distance", + "module.safe-walk.general.minimum-fall-distance.description": "The minimum number of blocks you are expected to fall before the module activates.", + "module.safe-walk.general.sneak": "Sneak", + "module.safe-walk.general.sneak.description": "Sneak when approaching edge of block.", + "module.safe-walk.general.safe-sneak": "Safe Sneak", + "module.safe-walk.general.safe-sneak.description": "Prevent you from falling if sneak doesn't trigger correctly.", + "module.safe-walk.general.sneak-on-sprint": "Sneak On Sprint", + "module.safe-walk.general.sneak-on-sprint.description": "Sneak even when sprinting at the block edge.", + "module.safe-walk.general.edge-distance": "Edge Distance", + "module.safe-walk.general.edge-distance.description": "Distance offset before reaching an edge.", + "module.safe-walk.render": "Render", + "module.safe-walk.render.render": "Render", + "module.safe-walk.render.render.description": "Render edge distance helper.", + "module.safe-walk.render.render-player-box": "Render Player Box", + "module.safe-walk.render.render-player-box.description": "Render player box helper.", + + "module.auto-wasp": "Auto Wasp", + "module.auto-wasp.description": "Wasps for you. Unable to traverse around blocks, assumes a clear straight line to the target.", + "module.auto-wasp.general.horizontal-speed": "Horizontal Speed", + "module.auto-wasp.general.horizontal-speed.description": "Horizontal elytra speed.", + "module.auto-wasp.general.vertical-speed": "Vertical Speed", + "module.auto-wasp.general.vertical-speed.description": "Vertical elytra speed.", + "module.auto-wasp.general.avoid-landing": "Avoid Landing", + "module.auto-wasp.general.avoid-landing.description": "Will try to avoid landing if your target is on the ground.", + "module.auto-wasp.general.predict-movement": "Predict Movement", + "module.auto-wasp.general.predict-movement.description": "Tries to predict the targets position according to their movement.", + "module.auto-wasp.general.only-friends": "Only Friends", + "module.auto-wasp.general.only-friends.description": "Will only follow friends.", + "module.auto-wasp.general.action-on-target-loss": "Action On Target Loss", + "module.auto-wasp.general.action-on-target-loss.description": "What to do if you lose the target.", + "module.auto-wasp.general.offset": "Offset", + "module.auto-wasp.general.offset.description": "How many blocks offset to wasp at from the target.", + + "module.break-delay": "Break Delay", + "module.break-delay.description": "Changes the delay between breaking blocks.", + "module.break-delay.general.cooldown": "Cooldown", + "module.break-delay.general.cooldown.description": "Block break cooldown in ticks.", + "module.break-delay.general.no-insta-break": "No Insta Break", + "module.break-delay.general.no-insta-break.description": "Prevents you from misbreaking blocks if you can instantly break them.", + + "module.auto-armor": "Auto Armor", + "module.auto-armor.description": "Automatically equips armor.", + "module.auto-armor.general.preferred-protection": "Preferred Protection", + "module.auto-armor.general.preferred-protection.description": "Which type of protection to prefer.", + "module.auto-armor.general.swap-delay": "Swap Delay", + "module.auto-armor.general.swap-delay.description": "The delay between equipping armor pieces.", + "module.auto-armor.general.avoided-enchantments": "Avoided Enchantments", + "module.auto-armor.general.avoided-enchantments.description": "Enchantments that should be avoided.", + "module.auto-armor.general.blast-prot-leggings": "Blast Prot Leggings", + "module.auto-armor.general.blast-prot-leggings.description": "Uses blast protection for leggings regardless of preferred protection.", + "module.auto-armor.general.anti-break": "Anti Break", + "module.auto-armor.general.anti-break.description": "Takes off armor if it is about to break.", + "module.auto-armor.general.ignore-elytra": "Ignore Elytra", + "module.auto-armor.general.ignore-elytra.description": "Will not replace your elytra if you have it equipped.", + + "module.pop-chams": "Pop Chams", + "module.pop-chams.description": "Renders a ghost where players pop totem.", + "module.pop-chams.general.only-one": "Only One", + "module.pop-chams.general.only-one.description": "Only allow one ghost per player.", + "module.pop-chams.general.render-time": "Render Time", + "module.pop-chams.general.render-time.description": "How long the ghost is rendered in seconds.", + "module.pop-chams.general.y-modifier": "Y Modifier", + "module.pop-chams.general.y-modifier.description": "How much should the Y position of the ghost change per second.", + "module.pop-chams.general.scale-modifier": "Scale Modifier", + "module.pop-chams.general.scale-modifier.description": "How much should the scale of the ghost change per second.", + "module.pop-chams.general.fade-out": "Fade Out", + "module.pop-chams.general.fade-out.description": "Fades out the color.", + "module.pop-chams.general.shape-mode": "Shape Mode", + "module.pop-chams.general.shape-mode.description": "How the shapes are rendered.", + "module.pop-chams.general.side-color": "Side Color", + "module.pop-chams.general.side-color.description": "The side color.", + "module.pop-chams.general.line-color": "Line Color", + "module.pop-chams.general.line-color.description": "The line color.", + + "module.ghost-hand": "Ghost Hand", + "module.ghost-hand.description": "Opens containers through walls.", + + "module.slippy": "Slippy", + "module.slippy.description": "Changes the base friction level of blocks.", + "module.slippy.general.friction": "Friction", + "module.slippy.general.friction.description": "The base friction level.", + "module.slippy.general.list-mode": "List Mode", + "module.slippy.general.list-mode.description": "The mode to select blocks.", + "module.slippy.general.ignored-blocks": "Ignored Blocks", + "module.slippy.general.ignored-blocks.description": "Decide which blocks not to slip on", + "module.slippy.general.allowed-blocks": "Allowed Blocks", + "module.slippy.general.allowed-blocks.description": "Decide which blocks to slip on", + + "module.auto-tool": "Auto Tool", + "module.auto-tool.description": "Automatically switches to the most effective tool when performing an action.", + "module.auto-tool.general.prefer": "Prefer", + "module.auto-tool.general.prefer.description": "Either to prefer Silk Touch, Fortune, or none.", + "module.auto-tool.general.silk-touch-for-ender-chest": "Silk Touch For Ender Chest", + "module.auto-tool.general.silk-touch-for-ender-chest.description": "Mines Ender Chests only with the Silk Touch enchantment.", + "module.auto-tool.general.fortune-for-ores-and-crops": "Fortune For Ores And Crops", + "module.auto-tool.general.fortune-for-ores-and-crops.description": "Mines Ores and crops only with the Fortune enchantment.", + "module.auto-tool.general.anti-break": "Anti Break", + "module.auto-tool.general.anti-break.description": "Stops you from breaking your tool.", + "module.auto-tool.general.anti-break-percentage": "Anti Break Percentage", + "module.auto-tool.general.anti-break-percentage.description": "The durability percentage to stop using a tool.", + "module.auto-tool.general.switch-back": "Switch Back", + "module.auto-tool.general.switch-back.description": "Switches your hand to whatever was selected when releasing your attack key.", + "module.auto-tool.general.switch-delay": "Switch Delay", + "module.auto-tool.general.switch-delay.description": "Delay in ticks before switching tools.", + "module.auto-tool.whitelist": "Whitelist", + "module.auto-tool.whitelist.list-mode": "List Mode", + "module.auto-tool.whitelist.list-mode.description": "Selection mode.", + "module.auto-tool.whitelist.whitelist": "Whitelist", + "module.auto-tool.whitelist.whitelist.description": "The tools you want to use.", + "module.auto-tool.whitelist.blacklist": "Blacklist", + "module.auto-tool.whitelist.blacklist.description": "The tools you don't want to use.", + + "module.anti-hunger": "Anti Hunger", + "module.anti-hunger.description": "Reduces (does NOT remove) hunger consumption.", + "module.anti-hunger.general.sprint": "Sprint", + "module.anti-hunger.general.sprint.description": "Spoofs sprinting packets.", + "module.anti-hunger.general.on-ground": "On Ground", + "module.anti-hunger.general.on-ground.description": "Spoofs the onGround flag.", + + "module.auto-clicker": "Auto Clicker", + "module.auto-clicker.description": "Automatically clicks.", + "module.auto-clicker.general.while-in-screens": "While In Screens", + "module.auto-clicker.general.while-in-screens.description": "Whether to click while a screen is open.", + "module.auto-clicker.general.mode-left": "Mode Left", + "module.auto-clicker.general.mode-left.description": "The method of clicking for left clicks.", + "module.auto-clicker.general.delay-left": "Delay Left", + "module.auto-clicker.general.delay-left.description": "The amount of delay between left clicks in ticks.", + "module.auto-clicker.general.mode-right": "Mode Right", + "module.auto-clicker.general.mode-right.description": "The method of clicking for right clicks.", + "module.auto-clicker.general.delay-right": "Delay Right", + "module.auto-clicker.general.delay-right.description": "The amount of delay between right clicks in ticks.", + + "module.auto-shearer": "Auto Shearer", + "module.auto-shearer.description": "Automatically shears sheep.", + "module.auto-shearer.general.distance": "Distance", + "module.auto-shearer.general.distance.description": "The maximum distance the sheep have to be to be sheared.", + "module.auto-shearer.general.anti-break": "Anti Break", + "module.auto-shearer.general.anti-break.description": "Prevents shears from being broken.", + "module.auto-shearer.general.rotate": "Rotate", + "module.auto-shearer.general.rotate.description": "Automatically faces towards the animal being sheared.", + + "module.boss-stack": "Boss Stack", + "module.boss-stack.description": "Stacks boss bars to make your HUD less cluttered.", + "module.boss-stack.general.stack": "Stack", + "module.boss-stack.general.stack.description": "Stacks boss bars and adds a counter to the text.", + "module.boss-stack.general.hide-name": "Hide Name", + "module.boss-stack.general.hide-name.description": "Hides the names of boss bars.", + "module.boss-stack.general.bar-spacing": "Bar Spacing", + "module.boss-stack.general.bar-spacing.description": "The spacing reduction between each boss bar.", + + "module.camera-tweaks": "Camera Tweaks", + "module.camera-tweaks.description": "Allows modification of the third person camera.", + "module.camera-tweaks.general.clip": "Clip", + "module.camera-tweaks.general.clip.description": "Allows the camera to clip through blocks.", + "module.camera-tweaks.general.camera-distance": "Camera Distance", + "module.camera-tweaks.general.camera-distance.description": "The distance the third person camera is from the player.", + "module.camera-tweaks.scrolling": "Scrolling", + "module.camera-tweaks.scrolling.scrolling": "Scrolling", + "module.camera-tweaks.scrolling.scrolling.description": "Allows you to scroll to change camera distance.", + "module.camera-tweaks.scrolling.bind": "Bind", + "module.camera-tweaks.scrolling.bind.description": "Binds camera distance scrolling to a key.", + "module.camera-tweaks.scrolling.sensitivity": "Sensitivity", + "module.camera-tweaks.scrolling.sensitivity.description": "Sensitivity of the scroll wheel when changing the cameras distance.", + + "module.auto-weapon": "Auto Weapon", + "module.auto-weapon.description": "Finds the best weapon to use in your hotbar.", + "module.auto-weapon.general.weapon": "Weapon", + "module.auto-weapon.general.weapon.description": "What type of weapon to use.", + "module.auto-weapon.general.threshold": "Threshold", + "module.auto-weapon.general.threshold.description": "If the non-preferred weapon produces this much damage this will favor it over your preferred weapon.", + "module.auto-weapon.general.anti-break": "Anti Break", + "module.auto-weapon.general.anti-break.description": "Prevents you from breaking your weapon.", + + "module.better-chat": "Better Chat", + "module.better-chat.description": "Improves your chat experience in various ways.", + "module.better-chat.general.annoy": "Annoy", + "module.better-chat.general.annoy.description": "Makes your messages aNnOyInG.", + "module.better-chat.general.fancy-chat": "Fancy Chat", + "module.better-chat.general.fancy-chat.description": "Makes your messages ғᴀɴᴄʏ!", + "module.better-chat.general.timestamps": "Timestamps", + "module.better-chat.general.timestamps.description": "Adds client-side time stamps to the beginning of chat messages.", + "module.better-chat.general.show-seconds": "Show Seconds", + "module.better-chat.general.show-seconds.description": "Shows seconds in the chat message timestamps", + "module.better-chat.general.player-heads": "Player Heads", + "module.better-chat.general.player-heads.description": "Displays player heads next to their messages.", + "module.better-chat.general.coords-protection": "Coords Protection", + "module.better-chat.general.coords-protection.description": "Prevents you from sending messages in chat that may contain coordinates.", + "module.better-chat.general.keep-history": "Keep History", + "module.better-chat.general.keep-history.description": "Prevents the chat history from being cleared when disconnecting.", + "module.better-chat.filter": "Filter", + "module.better-chat.filter.anti-spam": "Anti Spam", + "module.better-chat.filter.anti-spam.description": "Blocks duplicate messages from filling your chat.", + "module.better-chat.filter.depth": "Depth", + "module.better-chat.filter.depth.description": "How many messages to filter.", + "module.better-chat.filter.anti-clear": "Anti Clear", + "module.better-chat.filter.anti-clear.description": "Prevents servers from clearing chat.", + "module.better-chat.filter.filter-regex": "Filter Regex", + "module.better-chat.filter.filter-regex.description": "Filter out chat messages that match the regex filter.", + "module.better-chat.filter.regex-filter": "Regex Filter", + "module.better-chat.filter.regex-filter.description": "Regex filter used for filtering chat messages.", + "module.better-chat.longer-chat": "Longer Chat", + "module.better-chat.longer-chat.infinite-chat-box": "Infinite Chat Box", + "module.better-chat.longer-chat.infinite-chat-box.description": "Lets you type infinitely long messages.", + "module.better-chat.longer-chat.longer-chat-history": "Longer Chat History", + "module.better-chat.longer-chat.longer-chat-history.description": "Extends chat length.", + "module.better-chat.longer-chat.extra-lines": "Extra Lines", + "module.better-chat.longer-chat.extra-lines.description": "The amount of extra chat lines.", + "module.better-chat.prefix": "Prefix", + "module.better-chat.prefix.prefix": "Prefix", + "module.better-chat.prefix.prefix.description": "Adds a prefix to your chat messages.", + "module.better-chat.prefix.random": "Random", + "module.better-chat.prefix.random.description": "Uses a random number as your prefix.", + "module.better-chat.prefix.text": "Text", + "module.better-chat.prefix.text.description": "The text to add as your prefix.", + "module.better-chat.prefix.small-caps": "Small Caps", + "module.better-chat.prefix.small-caps.description": "Uses small caps in the prefix.", + "module.better-chat.suffix": "Suffix", + "module.better-chat.suffix.suffix": "Suffix", + "module.better-chat.suffix.suffix.description": "Adds a suffix to your chat messages.", + "module.better-chat.suffix.random": "Random", + "module.better-chat.suffix.random.description": "Uses a random number as your suffix.", + "module.better-chat.suffix.text": "Text", + "module.better-chat.suffix.text.description": "The text to add as your suffix.", + "module.better-chat.suffix.small-caps": "Small Caps", + "module.better-chat.suffix.small-caps.description": "Uses small caps in the suffix.", + + "module.offhand-crash": "Offhand Crash", + "module.offhand-crash.description": "An exploit that can crash other players by swapping back and forth between your main hand and offhand.", + "module.offhand-crash.general.do-crash": "Do Crash", + "module.offhand-crash.general.do-crash.description": "Sends X number of offhand swap sound packets to the server per tick.", + "module.offhand-crash.general.speed": "Speed", + "module.offhand-crash.general.speed.description": "The amount of swaps per tick.", + "module.offhand-crash.general.anti-crash": "Anti Crash", + "module.offhand-crash.general.anti-crash.description": "Attempts to prevent you from crashing yourself.", + + "module.auto-breed": "Auto Breed", + "module.auto-breed.description": "Automatically breeds specified animals.", + "module.auto-breed.general.entities": "Entities", + "module.auto-breed.general.entities.description": "Entities to breed.", + "module.auto-breed.general.range": "Range", + "module.auto-breed.general.range.description": "How far away the animals can be to be bred.", + "module.auto-breed.general.hand-for-breeding": "Hand For Breeding", + "module.auto-breed.general.hand-for-breeding.description": "The hand to use for breeding.", + "module.auto-breed.general.mob-age-filter": "Mob Age Filter", + "module.auto-breed.general.mob-age-filter.description": "Determines the age of the mobs to target (baby, adult, or both).", + + "module.spawn-proofer": "Spawn Proofer", + "module.spawn-proofer.description": "Automatically spawnproofs unlit areas.", + "module.spawn-proofer.general.place-delay": "Place Delay", + "module.spawn-proofer.general.place-delay.description": "The tick delay between placing blocks.", + "module.spawn-proofer.general.place-range": "Place Range", + "module.spawn-proofer.general.place-range.description": "How far away from the player you can place a block.", + "module.spawn-proofer.general.walls-range": "Walls Range", + "module.spawn-proofer.general.walls-range.description": "How far away from the player you can place a block behind walls.", + "module.spawn-proofer.general.blocks-per-tick": "Blocks Per Tick", + "module.spawn-proofer.general.blocks-per-tick.description": "How many blocks to place in one tick.", + "module.spawn-proofer.general.light-level": "Light Level", + "module.spawn-proofer.general.light-level.description": "Light levels to spawn proof. Old spawning light: 7.", + "module.spawn-proofer.general.blocks": "Blocks", + "module.spawn-proofer.general.blocks.description": "Block to use for spawn proofing.", + "module.spawn-proofer.general.mode": "Mode", + "module.spawn-proofer.general.mode.description": "Which spawn types should be spawn proofed.", + "module.spawn-proofer.general.rotate": "Rotate", + "module.spawn-proofer.general.rotate.description": "Rotates towards the blocks being placed.", + + "module.step": "Step", + "module.step.description": "Allows you to walk up full blocks instantly.", + "module.step.general.height": "Height", + "module.step.general.height.description": "Step height.", + "module.step.general.active-when": "Active When", + "module.step.general.active-when.description": "Step is active when you meet these requirements.", + "module.step.general.safe-step": "Safe Step", + "module.step.general.safe-step.description": "Doesn't let you step out of a hole if you are low on health or there is a crystal nearby.", + "module.step.general.step-health": "Step Health", + "module.step.general.step-health.description": "The health you stop being able to step at.", + + "module.entity-owner": "Entity Owner", + "module.entity-owner.description": "Displays the name of the player who owns the entity you're looking at.", + "module.entity-owner.general.scale": "Scale", + "module.entity-owner.general.scale.description": "The scale of the text.", + + "module.scaffold": "Scaffold", + "module.scaffold.description": "Automatically places blocks under you.", + "module.scaffold.general.blocks": "Blocks", + "module.scaffold.general.blocks.description": "Selected blocks.", + "module.scaffold.general.blocks-filter": "Blocks Filter", + "module.scaffold.general.blocks-filter.description": "How to use the block list setting", + "module.scaffold.general.fast-tower": "Fast Tower", + "module.scaffold.general.fast-tower.description": "Whether or not to scaffold upwards faster.", + "module.scaffold.general.tower-speed": "Tower Speed", + "module.scaffold.general.tower-speed.description": "The speed at which to tower.", + "module.scaffold.general.while-moving": "While Moving", + "module.scaffold.general.while-moving.description": "Allows you to tower while moving.", + "module.scaffold.general.only-on-click": "Only On Click", + "module.scaffold.general.only-on-click.description": "Only places blocks when holding right click.", + "module.scaffold.general.swing": "Swing", + "module.scaffold.general.swing.description": "Renders your client-side swing.", + "module.scaffold.general.auto-switch": "Auto Switch", + "module.scaffold.general.auto-switch.description": "Automatically swaps to a block before placing.", + "module.scaffold.general.rotate": "Rotate", + "module.scaffold.general.rotate.description": "Rotates towards the blocks being placed.", + "module.scaffold.general.air-place": "Air Place", + "module.scaffold.general.air-place.description": "Allow air place. This also allows you to modify scaffold radius.", + "module.scaffold.general.ahead-distance": "Ahead Distance", + "module.scaffold.general.ahead-distance.description": "How far ahead to place blocks.", + "module.scaffold.general.closest-block-range": "Closest Block Range", + "module.scaffold.general.closest-block-range.description": "How far can scaffold place blocks when you are in air.", + "module.scaffold.general.radius": "Radius", + "module.scaffold.general.radius.description": "Scaffold radius.", + "module.scaffold.general.blocks-per-tick": "Blocks Per Tick", + "module.scaffold.general.blocks-per-tick.description": "How many blocks to place in one tick.", + "module.scaffold.render": "Render", + "module.scaffold.render.render": "Render", + "module.scaffold.render.render.description": "Whether to render blocks that have been placed.", + "module.scaffold.render.shape-mode": "Shape Mode", + "module.scaffold.render.shape-mode.description": "How the shapes are rendered.", + "module.scaffold.render.side-color": "Side Color", + "module.scaffold.render.side-color.description": "The side color of the target block rendering.", + "module.scaffold.render.line-color": "Line Color", + "module.scaffold.render.line-color.description": "The line color of the target block rendering.", + + "module.sneak": "Sneak", + "module.sneak.description": "Sneaks for you", + "module.sneak.general.mode": "Mode", + "module.sneak.general.mode.description": "Which method to sneak.", + + "module.no-slow": "No Slow", + "module.no-slow.description": "Allows you to move normally when using objects that will slow you.", + "module.no-slow.general.items": "Items", + "module.no-slow.general.items.description": "Whether or not using items will slow you.", + "module.no-slow.general.web": "Web", + "module.no-slow.general.web.description": "Whether or not cobwebs will not slow you down.", + "module.no-slow.general.web-timer": "Web Timer", + "module.no-slow.general.web-timer.description": "The timer value for WebMode Timer.", + "module.no-slow.general.honey-block": "Honey Block", + "module.no-slow.general.honey-block.description": "Whether or not honey blocks will not slow you down.", + "module.no-slow.general.soul-sand": "Soul Sand", + "module.no-slow.general.soul-sand.description": "Whether or not soul sand will not slow you down.", + "module.no-slow.general.slime-block": "Slime Block", + "module.no-slow.general.slime-block.description": "Whether or not slime blocks will not slow you down.", + "module.no-slow.general.berry-bush": "Berry Bush", + "module.no-slow.general.berry-bush.description": "Whether or not berry bushes will not slow you down.", + "module.no-slow.general.air-strict": "Air Strict", + "module.no-slow.general.air-strict.description": "Will attempt to bypass anti-cheats like 2b2t's. Only works while in air.", + "module.no-slow.general.fluid-drag": "Fluid Drag", + "module.no-slow.general.fluid-drag.description": "Whether or not fluid drag will not slow you down.", + "module.no-slow.general.sneaking": "Sneaking", + "module.no-slow.general.sneaking.description": "Whether or not sneaking will not slow you down.", + "module.no-slow.general.hunger": "Hunger", + "module.no-slow.general.hunger.description": "Whether or not hunger will not slow you down.", + "module.no-slow.general.slowness": "Slowness", + "module.no-slow.general.slowness.description": "Whether or not slowness will not slow you down.", + + "module.fake-player": "Fake Player", + "module.fake-player.description": "Spawns a client-side fake player for testing usages. No need to be active.", + "module.fake-player.general.name": "Name", + "module.fake-player.general.name.description": "The name of the fake player.", + "module.fake-player.general.copy-inv": "Copy Inv", + "module.fake-player.general.copy-inv.description": "Copies your inventory to the fake player.", + "module.fake-player.general.health": "Health", + "module.fake-player.general.health.description": "The fake player's default health.", + + "module.nametags": "Nametags", + "module.nametags.description": "Displays customizable nametags above players, items and other entities.", + "module.nametags.general.entities": "Entities", + "module.nametags.general.entities.description": "Select entities to draw nametags on.", + "module.nametags.general.scale": "Scale", + "module.nametags.general.scale.description": "The scale of the nametag.", + "module.nametags.general.ignore-self": "Ignore Self", + "module.nametags.general.ignore-self.description": "Ignore yourself when in third person or freecam.", + "module.nametags.general.ignore-friends": "Ignore Friends", + "module.nametags.general.ignore-friends.description": "Ignore rendering nametags for friends.", + "module.nametags.general.ignore-bots": "Ignore Bots", + "module.nametags.general.ignore-bots.description": "Only render non-bot nametags.", + "module.nametags.general.culling": "Culling", + "module.nametags.general.culling.description": "Only render a certain number of nametags at a certain distance.", + "module.nametags.general.culling-range": "Culling Range", + "module.nametags.general.culling-range.description": "Only render nametags within this distance of your player.", + "module.nametags.general.culling-count": "Culling Count", + "module.nametags.general.culling-count.description": "Only render this many nametags.", + "module.nametags.players": "Players", + "module.nametags.players.health": "Health", + "module.nametags.players.health.description": "Shows the player's health.", + "module.nametags.players.gamemode": "Gamemode", + "module.nametags.players.gamemode.description": "Shows the player's GameMode.", + "module.nametags.players.distance": "Distance", + "module.nametags.players.distance.description": "Shows the distance between you and the player.", + "module.nametags.players.ping": "Ping", + "module.nametags.players.ping.description": "Shows the player's ping.", + "module.nametags.players.items": "Items", + "module.nametags.players.items.description": "Displays armor and hand items above the name tags.", + "module.nametags.players.item-spacing": "Item Spacing", + "module.nametags.players.item-spacing.description": "The spacing between items.", + "module.nametags.players.ignore-empty-slots": "Ignore Empty Slots", + "module.nametags.players.ignore-empty-slots.description": "Doesn't add spacing where an empty item stack would be.", + "module.nametags.players.durability": "Durability", + "module.nametags.players.durability.description": "Displays item durability as either a total, percentage, or neither.", + "module.nametags.players.display-enchants": "Display Enchants", + "module.nametags.players.display-enchants.description": "Displays item enchantments on the items.", + "module.nametags.players.shown-enchantments": "Shown Enchantments", + "module.nametags.players.shown-enchantments.description": "The enchantments that are shown on nametags.", + "module.nametags.players.enchantment-position": "Enchantment Position", + "module.nametags.players.enchantment-position.description": "Where the enchantments are rendered.", + "module.nametags.players.enchant-name-length": "Enchant Name Length", + "module.nametags.players.enchant-name-length.description": "The length enchantment names are trimmed to.", + "module.nametags.players.enchant-text-scale": "Enchant Text Scale", + "module.nametags.players.enchant-text-scale.description": "The scale of the enchantment text.", + "module.nametags.items": "Items", + "module.nametags.items.show-count": "Show Count", + "module.nametags.items.show-count.description": "Displays the number of items in the stack.", + "module.nametags.render": "Render", + "module.nametags.render.background-color": "Background Color", + "module.nametags.render.background-color.description": "The color of the nametag background.", + "module.nametags.render.name-color": "Name Color", + "module.nametags.render.name-color.description": "The color of the nametag names.", + "module.nametags.render.ping-color": "Ping Color", + "module.nametags.render.ping-color.description": "The color of the nametag ping.", + "module.nametags.render.gamemode-color": "Gamemode Color", + "module.nametags.render.gamemode-color.description": "The color of the nametag gamemode.", + "module.nametags.render.distance-color-mode": "Distance Color Mode", + "module.nametags.render.distance-color-mode.description": "The mode to color the nametag distance with.", + "module.nametags.render.distance-color": "Distance Color", + "module.nametags.render.distance-color.description": "The color of the nametag distance.", + + "module.esp": "Esp", + "module.esp.description": "Renders entities through walls.", + "module.esp.general.mode": "Mode", + "module.esp.general.mode.description": "Rendering mode.", + "module.esp.general.highlight-target": "Highlight Target", + "module.esp.general.highlight-target.description": "highlights the currently targeted entity differently", + "module.esp.general.target-hitbox": "Target Hitbox", + "module.esp.general.target-hitbox.description": "draw the hitbox of the target entity", + "module.esp.general.outline-width": "Outline Width", + "module.esp.general.outline-width.description": "The width of the shader outline.", + "module.esp.general.glow-multiplier": "Glow Multiplier", + "module.esp.general.glow-multiplier.description": "Multiplier for glow effect", + "module.esp.general.ignore-self": "Ignore Self", + "module.esp.general.ignore-self.description": "Ignores yourself drawing the shader.", + "module.esp.general.shape-mode": "Shape Mode", + "module.esp.general.shape-mode.description": "How the shapes are rendered.", + "module.esp.general.fill-opacity": "Fill Opacity", + "module.esp.general.fill-opacity.description": "The opacity of the shape fill.", + "module.esp.general.fade-distance": "Fade Distance", + "module.esp.general.fade-distance.description": "The distance from an entity where the color begins to fade.", + "module.esp.general.entities": "Entities", + "module.esp.general.entities.description": "Select specific entities.", + "module.esp.colors": "Colors", + "module.esp.colors.distance-colors": "Distance Colors", + "module.esp.colors.distance-colors.description": "Changes the color of tracers depending on distance.", + "module.esp.colors.show-friend-colors": "Show Friend Colors", + "module.esp.colors.show-friend-colors.description": "Whether or not to override the distance color of friends with the friend color.", + "module.esp.colors.players-color": "Players Color", + "module.esp.colors.players-color.description": "The other player's color.", + "module.esp.colors.animals-color": "Animals Color", + "module.esp.colors.animals-color.description": "The animal's color.", + "module.esp.colors.water-animals-color": "Water Animals Color", + "module.esp.colors.water-animals-color.description": "The water animal's color.", + "module.esp.colors.monsters-color": "Monsters Color", + "module.esp.colors.monsters-color.description": "The monster's color.", + "module.esp.colors.ambient-color": "Ambient Color", + "module.esp.colors.ambient-color.description": "The ambient's color.", + "module.esp.colors.misc-color": "Misc Color", + "module.esp.colors.misc-color.description": "The misc color.", + "module.esp.colors.target-color": "Target Color", + "module.esp.colors.target-color.description": "The target color.", + "module.esp.colors.target-hitbox-color": "Target Hitbox Color", + "module.esp.colors.target-hitbox-color.description": "The target hitbox color.", + + "module.rotation": "Rotation", + "module.rotation.description": "Changes/locks your yaw and pitch.", + "module.rotation.yaw": "Yaw", + "module.rotation.yaw.yaw-lock-mode": "Yaw Lock Mode", + "module.rotation.yaw.yaw-lock-mode.description": "The way in which your yaw is locked.", + "module.rotation.yaw.yaw-angle": "Yaw Angle", + "module.rotation.yaw.yaw-angle.description": "Yaw angle in degrees.", + "module.rotation.pitch": "Pitch", + "module.rotation.pitch.pitch-lock-mode": "Pitch Lock Mode", + "module.rotation.pitch.pitch-lock-mode.description": "The way in which your pitch is locked.", + "module.rotation.pitch.pitch-angle": "Pitch Angle", + "module.rotation.pitch.pitch-angle.description": "Pitch angle in degrees.", + + "module.elytra-fly": "Elytra Fly", + "module.elytra-fly.description": "Gives you more control over your elytra.", + "module.elytra-fly.general.mode": "Mode", + "module.elytra-fly.general.mode.description": "The mode of flying.", + "module.elytra-fly.general.auto-take-off": "Auto Take Off", + "module.elytra-fly.general.auto-take-off.description": "Automatically takes off when you hold jump without needing to double jump.", + "module.elytra-fly.general.fall-multiplier": "Fall Multiplier", + "module.elytra-fly.general.fall-multiplier.description": "Controls how fast will you go down naturally.", + "module.elytra-fly.general.horizontal-speed": "Horizontal Speed", + "module.elytra-fly.general.horizontal-speed.description": "How fast you go forward and backward.", + "module.elytra-fly.general.vertical-speed": "Vertical Speed", + "module.elytra-fly.general.vertical-speed.description": "How fast you go up and down.", + "module.elytra-fly.general.acceleration": "Acceleration", + "module.elytra-fly.general.acceleration.description": "", + "module.elytra-fly.general.acceleration-step": "Acceleration Step", + "module.elytra-fly.general.acceleration-step.description": "", + "module.elytra-fly.general.acceleration-start": "Acceleration Start", + "module.elytra-fly.general.acceleration-start.description": "", + "module.elytra-fly.general.stop-in-water": "Stop In Water", + "module.elytra-fly.general.stop-in-water.description": "Stops flying in water.", + "module.elytra-fly.general.no-unloaded-chunks": "No Unloaded Chunks", + "module.elytra-fly.general.no-unloaded-chunks.description": "Stops you from going into unloaded chunks.", + "module.elytra-fly.general.auto-hover": "Auto Hover", + "module.elytra-fly.general.auto-hover.description": "Automatically hover .3 blocks off ground when holding shift.", + "module.elytra-fly.general.no-crash": "No Crash", + "module.elytra-fly.general.no-crash.description": "Stops you from going into walls.", + "module.elytra-fly.general.crash-look-ahead": "Crash Look Ahead", + "module.elytra-fly.general.crash-look-ahead.description": "Distance to look ahead when flying.", + "module.elytra-fly.general.insta-drop": "Insta Drop", + "module.elytra-fly.general.insta-drop.description": "Makes you drop out of flight instantly.", + "module.elytra-fly.general.pitch40-lower-bounds": "Pitch40 Lower Bounds", + "module.elytra-fly.general.pitch40-lower-bounds.description": "The bottom height boundary for pitch40. You must be at least 40 blocks above this boundary when starting the module.\nAfter descending below this boundary you will start pitching upwards.", + "module.elytra-fly.general.pitch40-upper-bounds": "Pitch40 Upper Bounds", + "module.elytra-fly.general.pitch40-upper-bounds.description": "The upper height boundary for pitch40. You must be above this boundary when starting the module.\nWhen ascending above this boundary, if you are not already, you will start pitching downwards.", + "module.elytra-fly.general.pitch40-rotate-speed-up": "Pitch40 Rotate Speed Up", + "module.elytra-fly.general.pitch40-rotate-speed-up.description": "The speed for pitch rotation upwards (degrees per tick).", + "module.elytra-fly.general.pitch40-rotate-speed-down": "Pitch40 Rotate Speed Down", + "module.elytra-fly.general.pitch40-rotate-speed-down.description": "The speed for pitch rotation downwards (degrees per tick).", + "module.elytra-fly.general.auto-jump": "Auto Jump", + "module.elytra-fly.general.auto-jump.description": "Automatically jumps for you.", + "module.elytra-fly.general.yaw-lock": "Yaw Lock", + "module.elytra-fly.general.yaw-lock.description": "Whether to enable yaw lock or not", + "module.elytra-fly.general.yaw": "Yaw", + "module.elytra-fly.general.yaw.description": "The yaw angle to look at when using simple rotation lock in bounce mode.", + "module.elytra-fly.general.pitch-lock": "Pitch Lock", + "module.elytra-fly.general.pitch-lock.description": "Whether to lock your pitch angle.", + "module.elytra-fly.general.pitch": "Pitch", + "module.elytra-fly.general.pitch.description": "The pitch angle to look at when using the bounce mode.", + "module.elytra-fly.general.restart": "Restart", + "module.elytra-fly.general.restart.description": "Restarts flying with the elytra when rubberbanding.", + "module.elytra-fly.general.restart-delay": "Restart Delay", + "module.elytra-fly.general.restart-delay.description": "How many ticks to wait before restarting the elytra again after rubberbanding.", + "module.elytra-fly.general.sprint-constantly": "Sprint Constantly", + "module.elytra-fly.general.sprint-constantly.description": "Sprints all the time. If turned off, it will only sprint when the player is touching the ground.", + "module.elytra-fly.general.manual-takeoff": "Manual Takeoff", + "module.elytra-fly.general.manual-takeoff.description": "Does not automatically take off.", + "module.elytra-fly.inventory": "Inventory", + "module.elytra-fly.inventory.elytra-replace": "Elytra Replace", + "module.elytra-fly.inventory.elytra-replace.description": "Replaces broken elytra with a new elytra.", + "module.elytra-fly.inventory.replace-durability": "Replace Durability", + "module.elytra-fly.inventory.replace-durability.description": "The durability threshold your elytra will be replaced at.", + "module.elytra-fly.inventory.chest-swap": "Chest Swap", + "module.elytra-fly.inventory.chest-swap.description": "Enables ChestSwap when toggling this module.", + "module.elytra-fly.inventory.replenish-fireworks": "Replenish Fireworks", + "module.elytra-fly.inventory.replenish-fireworks.description": "Moves fireworks into a selected hotbar slot.", + "module.elytra-fly.inventory.replenish-slot": "Replenish Slot", + "module.elytra-fly.inventory.replenish-slot.description": "The slot auto move moves fireworks to.", + "module.elytra-fly.autopilot": "Autopilot", + "module.elytra-fly.autopilot.auto-pilot": "Auto Pilot", + "module.elytra-fly.autopilot.auto-pilot.description": "Moves forward while elytra flying.", + "module.elytra-fly.autopilot.use-fireworks": "Use Fireworks", + "module.elytra-fly.autopilot.use-fireworks.description": "Uses firework rockets every second of your choice.", + "module.elytra-fly.autopilot.firework-delay": "Firework Delay", + "module.elytra-fly.autopilot.firework-delay.description": "The delay in seconds in between using fireworks if \"Use Fireworks\" is enabled.", + "module.elytra-fly.autopilot.minimum-height": "Minimum Height", + "module.elytra-fly.autopilot.minimum-height.description": "The minimum height for autopilot.", + + "module.auto-respawn": "Auto Respawn", + "module.auto-respawn.description": "Automatically respawns after death.", + + "module.entity-control": "Entity Control", + "module.entity-control.description": "Lets you control rideable entities without a saddle.", + "module.entity-control.control": "Control", + "module.entity-control.control.entities": "Entities", + "module.entity-control.control.entities.description": "Target entities.", + "module.entity-control.control.spoof-saddle*": "Spoof Saddle*", + "module.entity-control.control.spoof-saddle*.description": "Lets you control rideable entities without them being saddled. Only works on older server versions.", + "module.entity-control.control.max-jump": "Max Jump", + "module.entity-control.control.max-jump.description": "Sets jump power to maximum.", + "module.entity-control.control.lock-yaw": "Lock Yaw", + "module.entity-control.control.lock-yaw.description": "Locks the Entity's yaw.", + "module.entity-control.control.cancel-server-packets": "Cancel Server Packets", + "module.entity-control.control.cancel-server-packets.description": "Cancels incoming vehicle move packets. WILL desync you from the server if you make an invalid movement.", + "module.entity-control.speed": "Speed", + "module.entity-control.speed.speed": "Speed", + "module.entity-control.speed.speed.description": "Makes you go faster horizontally when riding entities.", + "module.entity-control.speed.horizontal-speed": "Horizontal Speed", + "module.entity-control.speed.horizontal-speed.description": "Horizontal speed in blocks per second.", + "module.entity-control.speed.only-on-ground": "Only On Ground", + "module.entity-control.speed.only-on-ground.description": "Use speed only when standing on a block.", + "module.entity-control.speed.in-water": "In Water", + "module.entity-control.speed.in-water.description": "Use speed when in water.", + "module.entity-control.flight": "Flight", + "module.entity-control.flight.fly": "Fly", + "module.entity-control.flight.fly.description": "Allows you to fly with entities.", + "module.entity-control.flight.vertical-speed": "Vertical Speed", + "module.entity-control.flight.vertical-speed.description": "Vertical speed in blocks per second.", + "module.entity-control.flight.fall-speed": "Fall Speed", + "module.entity-control.flight.fall-speed.description": "How fast you will fall in blocks per second. Set to a small value to prevent fly kicks.", + "module.entity-control.flight.anti-fly-kick": "Anti Fly Kick", + "module.entity-control.flight.anti-fly-kick.description": "Whether to prevent the server from kicking you for flying.", + "module.entity-control.flight.delay": "Delay", + "module.entity-control.flight.delay.description": "The amount of delay, in ticks, between flying down a bit and return to original position", + + "module.stash-finder": "Stash Finder", + "module.stash-finder.description": "Searches loaded chunks for storage blocks. Saves to /meteor-client", + "module.stash-finder.general.storage-blocks": "Storage Blocks", + "module.stash-finder.general.storage-blocks.description": "Select the storage blocks to search for.", + "module.stash-finder.general.minimum-storage-count": "Minimum Storage Count", + "module.stash-finder.general.minimum-storage-count.description": "The minimum amount of storage blocks in a chunk to record the chunk.", + "module.stash-finder.general.blacklisted-support-blocks": "Blacklisted Support Blocks", + "module.stash-finder.general.blacklisted-support-blocks.description": "Blocks that prevent counting a storage block entity when it sits on them.", + "module.stash-finder.general.minimum-distance": "Minimum Distance", + "module.stash-finder.general.minimum-distance.description": "The minimum distance you must be from spawn to record a certain chunk.", + "module.stash-finder.general.notifications": "Notifications", + "module.stash-finder.general.notifications.description": "Sends Minecraft notifications when new stashes are found.", + "module.stash-finder.general.notification-mode": "Notification Mode", + "module.stash-finder.general.notification-mode.description": "The mode to use for notifications.", + "module.stash-finder.render": "Render", + "module.stash-finder.render.render-tracer": "Render Tracer", + "module.stash-finder.render.render-tracer.description": "Renders a tracer to the last found stash.", + "module.stash-finder.render.tracer-color": "Tracer Color", + "module.stash-finder.render.tracer-color.description": "Color of the stash tracer.", + "module.stash-finder.render.tracer-hide-at-distance": "Tracer Hide At Distance", + "module.stash-finder.render.tracer-hide-at-distance.description": "Hide the trace when you are this close to the stash.", + "module.stash-finder.render.tracer-max-distance": "Tracer Max Distance", + "module.stash-finder.render.tracer-max-distance.description": "Hide the trace when you are farther than this distance from the stash.", + "module.stash-finder.render.render-chunk-column": "Render Chunk Column", + "module.stash-finder.render.render-chunk-column.description": "Renders a vertical column at the center of traced chunks.", + "module.stash-finder.render.chunk-column-color": "Chunk Column Color", + "module.stash-finder.render.chunk-column-color.description": "Color of the stash tracer column.", + "module.stash-finder.render.clear-traces-bind": "Clear Traces Bind", + "module.stash-finder.render.clear-traces-bind.description": "Keybind to clear all stash traces.", + + "module.better-beacons": "Better Beacons", + "module.better-beacons.description": "Select effects unaffected by beacon level.", + + "module.auto-nametag": "Auto Nametag", + "module.auto-nametag.description": "Automatically uses nametags on entities without a nametag. WILL nametag ALL entities in the specified distance.", + "module.auto-nametag.general.entities": "Entities", + "module.auto-nametag.general.entities.description": "Which entities to nametag.", + "module.auto-nametag.general.range": "Range", + "module.auto-nametag.general.range.description": "The maximum range an entity can be to be nametagged.", + "module.auto-nametag.general.priority": "Priority", + "module.auto-nametag.general.priority.description": "Priority sort", + "module.auto-nametag.general.renametag": "Renametag", + "module.auto-nametag.general.renametag.description": "Allows already nametagged entities to be renamed.", + "module.auto-nametag.general.rotate": "Rotate", + "module.auto-nametag.general.rotate.description": "Automatically faces towards the mob being nametagged.", + + "module.elytra-boost": "Elytra Boost", + "module.elytra-boost.description": "Boosts your elytra as if you used a firework.", + "module.elytra-boost.general.anti-consume": "Anti Consume", + "module.elytra-boost.general.anti-consume.description": "Prevents fireworks from being consumed when using Elytra Boost.", + "module.elytra-boost.general.firework-duration": "Firework Duration", + "module.elytra-boost.general.firework-duration.description": "The duration of the firework.", + "module.elytra-boost.general.play-sound": "Play Sound", + "module.elytra-boost.general.play-sound.description": "Plays the firework sound when a boost is triggered.", + "module.elytra-boost.general.keybind": "Keybind", + "module.elytra-boost.general.keybind.description": "The keybind to boost.", + + "module.blink": "Blink", + "module.blink.description": "Allows you to essentially teleport while suspending motion updates.", + "module.blink.general.render-original": "Render Original", + "module.blink.general.render-original.description": "Renders your player model at the original position.", + "module.blink.general.pulse-delay": "Pulse Delay", + "module.blink.general.pulse-delay.description": "After the duration in ticks has elapsed, send all packets and start blinking again. 0 to disable.", + "module.blink.general.cancel-blink": "Cancel Blink", + "module.blink.general.cancel-blink.description": "Cancels sending packets and sends you back to your original position.", + + "module.block-selection": "Block Selection", + "module.block-selection.description": "Modifies how your block selection is rendered.", + "module.block-selection.general.advanced": "Advanced", + "module.block-selection.general.advanced.description": "Shows a more advanced outline on different types of shape blocks.", + "module.block-selection.general.single-side": "Single Side", + "module.block-selection.general.single-side.description": "Only renders the side you are looking at.", + "module.block-selection.general.shape-mode": "Shape Mode", + "module.block-selection.general.shape-mode.description": "How the shapes are rendered.", + "module.block-selection.general.side-color": "Side Color", + "module.block-selection.general.side-color.description": "The side color.", + "module.block-selection.general.line-color": "Line Color", + "module.block-selection.general.line-color.description": "The line color.", + "module.block-selection.general.hide-when-inside-block": "Hide When Inside Block", + "module.block-selection.general.hide-when-inside-block.description": "Hide selection when inside target block.", + + "module.auto-city": "Auto City", + "module.auto-city.description": "Automatically mine blocks next to someone's feet.", + "module.auto-city.general.target-range": "Target Range", + "module.auto-city.general.target-range.description": "The radius in which players get targeted.", + "module.auto-city.general.break-range": "Break Range", + "module.auto-city.general.break-range.description": "How close a block must be to you to be considered.", + "module.auto-city.general.switch-mode": "Switch Mode", + "module.auto-city.general.switch-mode.description": "How to switch to a pickaxe.", + "module.auto-city.general.support": "Support", + "module.auto-city.general.support.description": "If there is no block below a city block it will place one before mining.", + "module.auto-city.general.place-range": "Place Range", + "module.auto-city.general.place-range.description": "How far away to try and place a block.", + "module.auto-city.general.rotate": "Rotate", + "module.auto-city.general.rotate.description": "Automatically rotates you towards the city block.", + "module.auto-city.general.chat-info": "Chat Info", + "module.auto-city.general.chat-info.description": "Whether the module should send messages in chat.", + "module.auto-city.render": "Render", + "module.auto-city.render.swing-hand": "Swing Hand", + "module.auto-city.render.swing-hand.description": "Whether to render your hand swinging.", + "module.auto-city.render.render-block": "Render Block", + "module.auto-city.render.render-block.description": "Whether to render the block being broken.", + "module.auto-city.render.shape-mode": "Shape Mode", + "module.auto-city.render.shape-mode.description": "How the shapes are rendered.", + "module.auto-city.render.side-color": "Side Color", + "module.auto-city.render.side-color.description": "The side color of the rendering.", + "module.auto-city.render.line-color": "Line Color", + "module.auto-city.render.line-color.description": "The line color of the rendering.", + + "module.waypoints": "Waypoints", + "module.waypoints.description": "Allows you to create waypoints.", + "module.waypoints.general.text-render-distance": "Text Render Distance", + "module.waypoints.general.text-render-distance.description": "Maximum distance from the center of the screen at which text will be rendered.", + "module.waypoints.general.waypoint-fade-distance": "Waypoint Fade Distance", + "module.waypoints.general.waypoint-fade-distance.description": "The distance to a waypoint at which it begins to start fading.", + "module.waypoints.death-position": "Death Position", + "module.waypoints.death-position.max-death-positions": "Max Death Positions", + "module.waypoints.death-position.max-death-positions.description": "The amount of death positions to save, 0 to disable", + "module.waypoints.death-position.chat": "Chat", + "module.waypoints.death-position.chat.description": "Send a chat message with your position once you die", + + "module.auto-web": "Auto Web", + "module.auto-web.description": "Automatically places webs on other players.", + "module.auto-web.general.place-range": "Place Range", + "module.auto-web.general.place-range.description": "The range at which webs can be placed.", + "module.auto-web.general.walls-range": "Walls Range", + "module.auto-web.general.walls-range.description": "Range in which to place webs when behind blocks.", + "module.auto-web.general.target-priority": "Target Priority", + "module.auto-web.general.target-priority.description": "How to filter targets within range.", + "module.auto-web.general.target-range": "Target Range", + "module.auto-web.general.target-range.description": "The maximum distance to target players.", + "module.auto-web.general.predict-movement": "Predict Movement", + "module.auto-web.general.predict-movement.description": "Predict target movement to account for ping.", + "module.auto-web.general.ticks-to-predict": "Ticks To Predict", + "module.auto-web.general.ticks-to-predict.description": "How many ticks ahead we should predict for.", + "module.auto-web.general.doubles": "Doubles", + "module.auto-web.general.doubles.description": "Places webs in the target's upper hitbox as well as the lower hitbox.", + "module.auto-web.general.rotate": "Rotate", + "module.auto-web.general.rotate.description": "Rotates towards the webs when placing.", + "module.auto-web.render": "Render", + "module.auto-web.render.render": "Render", + "module.auto-web.render.render.description": "Renders an overlay where webs are placed.", + "module.auto-web.render.shape-mode": "Shape Mode", + "module.auto-web.render.shape-mode.description": "How the shapes are rendered.", + "module.auto-web.render.side-color": "Side Color", + "module.auto-web.render.side-color.description": "The side color of the placed web rendering.", + "module.auto-web.render.line-color": "Line Color", + "module.auto-web.render.line-color.description": "The line color of the placed web rendering.", + + "module.auto-eat": "Auto Eat", + "module.auto-eat.description": "Automatically eats food.", + "module.auto-eat.general.blacklist": "Blacklist", + "module.auto-eat.general.blacklist.description": "Which items to not eat.", + "module.auto-eat.general.pause-auras": "Pause Auras", + "module.auto-eat.general.pause-auras.description": "Pauses all auras when eating.", + "module.auto-eat.general.pause-baritone": "Pause Baritone", + "module.auto-eat.general.pause-baritone.description": "Pause baritone when eating.", + "module.auto-eat.threshold": "Threshold", + "module.auto-eat.threshold.threshold-mode": "Threshold Mode", + "module.auto-eat.threshold.threshold-mode.description": "The threshold mode to trigger auto eat.", + "module.auto-eat.threshold.health-threshold": "Health Threshold", + "module.auto-eat.threshold.health-threshold.description": "The level of health you eat at.", + "module.auto-eat.threshold.hunger-threshold": "Hunger Threshold", + "module.auto-eat.threshold.hunger-threshold.description": "The level of hunger you eat at.", + + "module.hitboxes": "Hitboxes", + "module.hitboxes.description": "Expands an entity's hitboxes.", + "module.hitboxes.general.entities": "Entities", + "module.hitboxes.general.entities.description": "Which entities to target.", + "module.hitboxes.general.expand": "Expand", + "module.hitboxes.general.expand.description": "How much to expand the hitbox of the entity.", + "module.hitboxes.general.ignore-friends": "Ignore Friends", + "module.hitboxes.general.ignore-friends.description": "Doesn't expand the hitboxes of friends.", + "module.hitboxes.weapon-options": "Weapon Options", + "module.hitboxes.weapon-options.only-on-weapon": "Only On Weapon", + "module.hitboxes.weapon-options.only-on-weapon.description": "Only modifies hitbox when holding a weapon in hand.", + "module.hitboxes.weapon-options.sword": "Sword", + "module.hitboxes.weapon-options.sword.description": "Enable when holding a sword.", + "module.hitboxes.weapon-options.axe": "Axe", + "module.hitboxes.weapon-options.axe.description": "Enable when holding an axe.", + "module.hitboxes.weapon-options.pickaxe": "Pickaxe", + "module.hitboxes.weapon-options.pickaxe.description": "Enable when holding a pickaxe.", + "module.hitboxes.weapon-options.shovel": "Shovel", + "module.hitboxes.weapon-options.shovel.description": "Enable when holding a shovel.", + "module.hitboxes.weapon-options.hoe": "Hoe", + "module.hitboxes.weapon-options.hoe.description": "Enable when holding a hoe.", + "module.hitboxes.weapon-options.mace": "Mace", + "module.hitboxes.weapon-options.mace.description": "Enable when holding a mace.", + "module.hitboxes.weapon-options.spear": "Spear", + "module.hitboxes.weapon-options.spear.description": "Enable when holding a spear.", + "module.hitboxes.weapon-options.trident": "Trident", + "module.hitboxes.weapon-options.trident.description": "Enable when holding a trident.", + + "module.trail": "Trail", + "module.trail.description": "Renders a customizable trail behind your player.", + "module.trail.general.particles": "Particles", + "module.trail.general.particles.description": "Particles to draw.", + "module.trail.general.pause-when-stationary": "Pause When Stationary", + "module.trail.general.pause-when-stationary.description": "Whether or not to add particles when you are not moving.", + + "module.self-web": "Self Web", + "module.self-web.description": "Automatically places webs on you.", + "module.self-web.general.mode": "Mode", + "module.self-web.general.mode.description": "The mode to use for selfweb.", + "module.self-web.general.range": "Range", + "module.self-web.general.range.description": "How far away the player has to be from you to place webs. Requires Mode to Smart.", + "module.self-web.general.double-place": "Double Place", + "module.self-web.general.double-place.description": "Places webs in your upper hitbox as well.", + "module.self-web.general.auto-toggle": "Auto Toggle", + "module.self-web.general.auto-toggle.description": "Toggles off after placing the webs.", + "module.self-web.general.rotate": "Rotate", + "module.self-web.general.rotate.description": "Forces you to rotate downwards when placing webs.", + + "module.flight": "Flight", + "module.flight.description": "FLYYYY! No Fall is recommended with this module.", + "module.flight.general.mode": "Mode", + "module.flight.general.mode.description": "The mode for Flight.", + "module.flight.general.speed": "Speed", + "module.flight.general.speed.description": "Your speed when flying.", + "module.flight.general.vertical-speed-match": "Vertical Speed Match", + "module.flight.general.vertical-speed-match.description": "Matches your vertical speed to your horizontal speed, otherwise uses vanilla ratio.", + "module.flight.general.no-sneak": "No Sneak", + "module.flight.general.no-sneak.description": "Prevents you from sneaking while flying.", + "module.flight.anti-kick": "Anti Kick", + "module.flight.anti-kick.mode": "Mode", + "module.flight.anti-kick.mode.description": "The mode for anti kick.", + "module.flight.anti-kick.delay": "Delay", + "module.flight.anti-kick.delay.description": "The amount of delay, in ticks, between flying down a bit and return to original position", + "module.flight.anti-kick.off-time": "Off Time", + "module.flight.anti-kick.off-time.description": "The amount of delay, in ticks, to fly down a bit to reset floating ticks.", + + "module.reverse-step": "Reverse Step", + "module.reverse-step.description": "Allows you to fall down blocks at a greater speed.", + "module.reverse-step.general.fall-speed": "Fall Speed", + "module.reverse-step.general.fall-speed.description": "How fast to fall in blocks per second.", + "module.reverse-step.general.fall-distance": "Fall Distance", + "module.reverse-step.general.fall-distance.description": "The maximum fall distance this setting will activate at.", + "module.reverse-step.general.vehicles": "Vehicles", + "module.reverse-step.general.vehicles.description": "Whether or not reverse step should affect vehicles.", + + "module.blur": "Blur", + "module.blur.description": "Blurs background when in GUI screens.", + "module.blur.general.strength": "Strength", + "module.blur.general.strength.description": "How strong the blur should be.", + "module.blur.general.fade-time": "Fade Time", + "module.blur.general.fade-time.description": "How long the fade will last in milliseconds.", + "module.blur.screens": "Screens", + "module.blur.screens.meteor": "Meteor", + "module.blur.screens.meteor.description": "Applies blur to Meteor screens.", + "module.blur.screens.inventories": "Inventories", + "module.blur.screens.inventories.description": "Applies blur to inventory screens.", + "module.blur.screens.chat": "Chat", + "module.blur.screens.chat.description": "Applies blur when in chat.", + "module.blur.screens.other": "Other", + "module.blur.screens.other.description": "Applies blur to all other screen types.", + + "module.discord-presence": "Discord Presence", + "module.discord-presence.description": "Displays Meteor as your presence on Discord.", + "module.discord-presence.line-1": "Line 1", + "module.discord-presence.line-1.line-1-messages": "Line 1 Messages", + "module.discord-presence.line-1.line-1-messages.description": "Messages used for the first line.", + "module.discord-presence.line-1.line-1-update-delay": "Line 1 Update Delay", + "module.discord-presence.line-1.line-1-update-delay.description": "How fast to update the first line in ticks.", + "module.discord-presence.line-1.line-1-select-mode": "Line 1 Select Mode", + "module.discord-presence.line-1.line-1-select-mode.description": "How to select messages for the first line.", + "module.discord-presence.line-2": "Line 2", + "module.discord-presence.line-2.line-2-messages": "Line 2 Messages", + "module.discord-presence.line-2.line-2-messages.description": "Messages used for the second line.", + "module.discord-presence.line-2.line-2-update-delay": "Line 2 Update Delay", + "module.discord-presence.line-2.line-2-update-delay.description": "How fast to update the second line in ticks.", + "module.discord-presence.line-2.line-2-select-mode": "Line 2 Select Mode", + "module.discord-presence.line-2.line-2-select-mode.description": "How to select messages for the second line.", + + "module.void-esp": "Void Esp", + "module.void-esp.description": "Renders holes in bedrock layers that lead to the void.", + "module.void-esp.general.air-only": "Air Only", + "module.void-esp.general.air-only.description": "Checks bedrock only for air blocks.", + "module.void-esp.general.horizontal-radius": "Horizontal Radius", + "module.void-esp.general.horizontal-radius.description": "Horizontal radius in which to search for holes.", + "module.void-esp.general.hole-height": "Hole Height", + "module.void-esp.general.hole-height.description": "The minimum hole height to be rendered.", + "module.void-esp.general.nether-roof": "Nether Roof", + "module.void-esp.general.nether-roof.description": "Check for holes in nether roof.", + "module.void-esp.render": "Render", + "module.void-esp.render.shape-mode": "Shape Mode", + "module.void-esp.render.shape-mode.description": "How the shapes are rendered.", + "module.void-esp.render.fill-color": "Fill Color", + "module.void-esp.render.fill-color.description": "The color that fills holes in the void.", + "module.void-esp.render.line-color": "Line Color", + "module.void-esp.render.line-color.description": "The color to draw lines of holes to the void.", + + "module.reach": "Reach", + "module.reach.description": "Gives you super long arms.", + "module.reach.general.extra-block-reach": "Extra Block Reach", + "module.reach.general.extra-block-reach.description": "The distance to add to your block reach.", + "module.reach.general.extra-entity-reach": "Extra Entity Reach", + "module.reach.general.extra-entity-reach.description": "The distance to add to your entity reach.", + + "module.speed-mine": "Speed Mine", + "module.speed-mine.description": "Allows you to quickly mine blocks.", + "module.speed-mine.general.mode": "Mode", + "module.speed-mine.general.mode.description": "", + "module.speed-mine.general.blocks": "Blocks", + "module.speed-mine.general.blocks.description": "Selected blocks.", + "module.speed-mine.general.blocks-filter": "Blocks Filter", + "module.speed-mine.general.blocks-filter.description": "How to use the blocks setting.", + "module.speed-mine.general.modifier": "Modifier", + "module.speed-mine.general.modifier.description": "Mining speed modifier. An additional value of 0.2 is equivalent to one haste level (1.2 = haste 1).", + "module.speed-mine.general.haste-amplifier": "Haste Amplifier", + "module.speed-mine.general.haste-amplifier.description": "What value of haste to give you. Above 2 not recommended.", + "module.speed-mine.general.instamine": "Instamine", + "module.speed-mine.general.instamine.description": "Whether or not to instantly mine blocks under certain conditions.", + "module.speed-mine.general.grim-bypass": "Grim Bypass", + "module.speed-mine.general.grim-bypass.description": "Bypasses Grim's fastbreak check, working as of 2.3.58", + + "module.inventory-tweaks": "Inventory Tweaks", + "module.inventory-tweaks.description": "Various inventory related utilities.", + "module.inventory-tweaks.general.mouse-drag-item-move": "Mouse Drag Item Move", + "module.inventory-tweaks.general.mouse-drag-item-move.description": "Moving mouse over items while holding shift will transfer it to the other container.", + "module.inventory-tweaks.general.xcarry": "Xcarry", + "module.inventory-tweaks.general.xcarry.description": "Allows you to store four extra item stacks in your crafting grid.", + "module.inventory-tweaks.general.uncap-bundle-scrolling": "Uncap Bundle Scrolling", + "module.inventory-tweaks.general.uncap-bundle-scrolling.description": "Whether to uncap the bundle scrolling feature to let you select any item.", + "module.inventory-tweaks.sorting": "Sorting", + "module.inventory-tweaks.sorting.sorting-enabled": "Sorting Enabled", + "module.inventory-tweaks.sorting.sorting-enabled.description": "Automatically sorts stacks in inventory.", + "module.inventory-tweaks.sorting.sorting-key": "Sorting Key", + "module.inventory-tweaks.sorting.sorting-key.description": "Key to trigger the sort.", + "module.inventory-tweaks.sorting.sorting-delay": "Sorting Delay", + "module.inventory-tweaks.sorting.sorting-delay.description": "Delay in ticks between moving items when sorting.", + "module.inventory-tweaks.sorting.disable-in-creative": "Disable In Creative", + "module.inventory-tweaks.sorting.disable-in-creative.description": "Disables the inventory sorter when in creative mode.", + "module.inventory-tweaks.anti-drop": "Anti Drop", + "module.inventory-tweaks.anti-drop.anti-drop-items": "Anti Drop Items", + "module.inventory-tweaks.anti-drop.anti-drop-items.description": "Items to prevent dropping. Doesn't work in creative inventory screen.", + "module.inventory-tweaks.anti-drop.item-frames": "Item Frames", + "module.inventory-tweaks.anti-drop.item-frames.description": "Prevent anti-drop items from being placed in item frames or pots", + "module.inventory-tweaks.anti-drop.override-bind": "Override Bind", + "module.inventory-tweaks.anti-drop.override-bind.description": "Hold this bind to temporarily bypass anti-drop", + "module.inventory-tweaks.auto-drop": "Auto Drop", + "module.inventory-tweaks.auto-drop.auto-drop-items": "Auto Drop Items", + "module.inventory-tweaks.auto-drop.auto-drop-items.description": "Items to drop.", + "module.inventory-tweaks.auto-drop.exclude-equipped": "Exclude Equipped", + "module.inventory-tweaks.auto-drop.exclude-equipped.description": "Whether or not to drop items equipped in armor slots.", + "module.inventory-tweaks.auto-drop.exclude-hotbar": "Exclude Hotbar", + "module.inventory-tweaks.auto-drop.exclude-hotbar.description": "Whether or not to drop items from your hotbar.", + "module.inventory-tweaks.auto-drop.only-full-stacks": "Only Full Stacks", + "module.inventory-tweaks.auto-drop.only-full-stacks.description": "Only drops the items if the stack is full.", + "module.inventory-tweaks.steal-and-dump": "Steal and Dump", + "module.inventory-tweaks.steal-and-dump.steal-screens": "Steal Screens", + "module.inventory-tweaks.steal-and-dump.steal-screens.description": "Select the screens to display buttons and auto steal.", + "module.inventory-tweaks.steal-and-dump.inventory-buttons": "Inventory Buttons", + "module.inventory-tweaks.steal-and-dump.inventory-buttons.description": "Shows steal and dump buttons in container guis.", + "module.inventory-tweaks.steal-and-dump.steal-drop": "Steal Drop", + "module.inventory-tweaks.steal-and-dump.steal-drop.description": "Drop items to the ground instead of stealing them.", + "module.inventory-tweaks.steal-and-dump.drop-backwards": "Drop Backwards", + "module.inventory-tweaks.steal-and-dump.drop-backwards.description": "Drop items behind you.", + "module.inventory-tweaks.steal-and-dump.dump-filter": "Dump Filter", + "module.inventory-tweaks.steal-and-dump.dump-filter.description": "Dump mode.", + "module.inventory-tweaks.steal-and-dump.dump-items": "Dump Items", + "module.inventory-tweaks.steal-and-dump.dump-items.description": "Items to dump.", + "module.inventory-tweaks.steal-and-dump.steal-filter": "Steal Filter", + "module.inventory-tweaks.steal-and-dump.steal-filter.description": "Steal mode.", + "module.inventory-tweaks.steal-and-dump.steal-items": "Steal Items", + "module.inventory-tweaks.steal-and-dump.steal-items.description": "Items to steal.", + "module.inventory-tweaks.auto-steal": "Auto Steal", + "module.inventory-tweaks.auto-steal.auto-steal": "Auto Steal", + "module.inventory-tweaks.auto-steal.auto-steal.description": "Automatically removes all possible items when you open a container.", + "module.inventory-tweaks.auto-steal.auto-dump": "Auto Dump", + "module.inventory-tweaks.auto-steal.auto-dump.description": "Automatically dumps all possible items when you open a container.", + "module.inventory-tweaks.auto-steal.delay": "Delay", + "module.inventory-tweaks.auto-steal.delay.description": "The minimum delay between stealing the next stack in milliseconds.", + "module.inventory-tweaks.auto-steal.initial-delay": "Initial Delay", + "module.inventory-tweaks.auto-steal.initial-delay.description": "The initial delay before stealing in milliseconds. 0 to use normal delay instead.", + "module.inventory-tweaks.auto-steal.random": "Random", + "module.inventory-tweaks.auto-steal.random.description": "Randomly adds a delay of up to the specified time in milliseconds.", + + "module.no-fall": "No Fall", + "module.no-fall.description": "Attempts to prevent you from taking fall damage.", + "module.no-fall.general.mode": "Mode", + "module.no-fall.general.mode.description": "The way you are saved from fall damage.", + "module.no-fall.general.placed-item": "Placed Item", + "module.no-fall.general.placed-item.description": "Which block to place.", + "module.no-fall.general.air-place-mode": "Air Place Mode", + "module.no-fall.general.air-place-mode.description": "Whether place mode places before you die or before you take damage.", + "module.no-fall.general.anchor": "Anchor", + "module.no-fall.general.anchor.description": "Centers the player and reduces movement when using bucket or air place mode.", + "module.no-fall.general.anti-bounce": "Anti Bounce", + "module.no-fall.general.anti-bounce.description": "Disables bouncing on slime-block and bed upon landing.", + "module.no-fall.general.pause-on-mace": "Pause On Mace", + "module.no-fall.general.pause-on-mace.description": "Pauses NoFall when using a mace.", + + "module.no-interact": "No Interact", + "module.no-interact.description": "Blocks interactions with certain types of inputs.", + "module.no-interact.blocks": "Blocks", + "module.no-interact.blocks.block-mine": "Block Mine", + "module.no-interact.blocks.block-mine.description": "Cancels block mining.", + "module.no-interact.blocks.block-mine-mode": "Block Mine Mode", + "module.no-interact.blocks.block-mine-mode.description": "List mode to use for block mine.", + "module.no-interact.blocks.block-interact": "Block Interact", + "module.no-interact.blocks.block-interact.description": "Cancels block interaction.", + "module.no-interact.blocks.block-interact-mode": "Block Interact Mode", + "module.no-interact.blocks.block-interact-mode.description": "List mode to use for block interact.", + "module.no-interact.blocks.block-interact-hand": "Block Interact Hand", + "module.no-interact.blocks.block-interact-hand.description": "Cancels block interaction if performed by this hand.", + "module.no-interact.entities": "Entities", + "module.no-interact.entities.entity-hit": "Entity Hit", + "module.no-interact.entities.entity-hit.description": "Cancel entity hitting.", + "module.no-interact.entities.entity-hit-mode": "Entity Hit Mode", + "module.no-interact.entities.entity-hit-mode.description": "List mode to use for entity hit.", + "module.no-interact.entities.entity-interact": "Entity Interact", + "module.no-interact.entities.entity-interact.description": "Cancel entity interaction.", + "module.no-interact.entities.entity-interact-mode": "Entity Interact Mode", + "module.no-interact.entities.entity-interact-mode.description": "List mode to use for entity interact.", + "module.no-interact.entities.entity-interact-hand": "Entity Interact Hand", + "module.no-interact.entities.entity-interact-hand.description": "Cancels entity interaction if performed by this hand.", + "module.no-interact.entities.friends": "Friends", + "module.no-interact.entities.friends.description": "Friends cancel mode.", + "module.no-interact.entities.babies": "Babies", + "module.no-interact.entities.babies.description": "Baby entity cancel mode.", + "module.no-interact.entities.nametagged": "Nametagged", + "module.no-interact.entities.nametagged.description": "Nametagged entity cancel mode.", + + "module.portals": "Portals", + "module.portals.description": "Allows you to use GUIs normally while in a Nether Portal.", + + "module.marker": "Marker", + "module.marker.description": "Renders shapes. Useful for large scale projects", + + "module.criticals": "Criticals", + "module.criticals.description": "Performs critical attacks when you hit your target.", + "module.criticals.general.mode": "Mode", + "module.criticals.general.mode.description": "The mode on how Criticals will function.", + "module.criticals.general.only-killaura": "Only Killaura", + "module.criticals.general.only-killaura.description": "Only performs crits when using killaura.", + "module.criticals.mace": "Mace", + "module.criticals.mace.smash-attack": "Smash Attack", + "module.criticals.mace.smash-attack.description": "Will always perform smash attacks when using a mace.", + "module.criticals.mace.additional-height": "Additional Height", + "module.criticals.mace.additional-height.description": "The amount of additional height to spoof. More height means more damage.", + + "module.tunnel-esp": "Tunnel Esp", + "module.tunnel-esp.description": "Highlights tunnels.", + "module.tunnel-esp.general.height": "Height", + "module.tunnel-esp.general.height.description": "Height of the rendered box.", + "module.tunnel-esp.general.connected": "Connected", + "module.tunnel-esp.general.connected.description": "If neighbouring holes should be connected.", + "module.tunnel-esp.general.shape-mode": "Shape Mode", + "module.tunnel-esp.general.shape-mode.description": "How the shapes are rendered.", + "module.tunnel-esp.general.side-color": "Side Color", + "module.tunnel-esp.general.side-color.description": "The side color.", + "module.tunnel-esp.general.line-color": "Line Color", + "module.tunnel-esp.general.line-color.description": "The line color.", + + "module.auto-smelter": "Auto Smelter", + "module.auto-smelter.description": "Automatically smelts items from your inventory", + "module.auto-smelter.general.fuel-items": "Fuel Items", + "module.auto-smelter.general.fuel-items.description": "Items to use as fuel", + "module.auto-smelter.general.smeltable-items": "Smeltable Items", + "module.auto-smelter.general.smeltable-items.description": "Items to smelt", + "module.auto-smelter.general.disable-when-out-of-items": "Disable When Out Of Items", + "module.auto-smelter.general.disable-when-out-of-items.description": "Disable the module when you run out of items", + + "module.anchor-aura": "Anchor Aura", + "module.anchor-aura.description": "Automatically places and breaks Respawn Anchors to harm entities.", + "module.anchor-aura.general.target-range": "Target Range", + "module.anchor-aura.general.target-range.description": "Range in which to target players.", + "module.anchor-aura.general.target-priority": "Target Priority", + "module.anchor-aura.general.target-priority.description": "How to select the player to target.", + "module.anchor-aura.general.min-damage": "Min Damage", + "module.anchor-aura.general.min-damage.description": "The minimum damage to inflict on your target.", + "module.anchor-aura.general.max-self-damage": "Max Self Damage", + "module.anchor-aura.general.max-self-damage.description": "The maximum damage to inflict on yourself.", + "module.anchor-aura.general.anti-suicide": "Anti Suicide", + "module.anchor-aura.general.anti-suicide.description": "Will not place and break anchors if they will kill you.", + "module.anchor-aura.general.swap-back": "Swap Back", + "module.anchor-aura.general.swap-back.description": "Switches to your previous slot after using anchors.", + "module.anchor-aura.general.rotate": "Rotate", + "module.anchor-aura.general.rotate.description": "Rotates server-side towards the anchors being placed/broken.", + "module.anchor-aura.place": "Place", + "module.anchor-aura.place.place": "Place", + "module.anchor-aura.place.place.description": "Allows Anchor Aura to place anchors.", + "module.anchor-aura.place.place-delay": "Place Delay", + "module.anchor-aura.place.place-delay.description": "The tick delay between placing anchors.", + "module.anchor-aura.place.place-range": "Place Range", + "module.anchor-aura.place.place-range.description": "The range at which anchors can be placed.", + "module.anchor-aura.place.walls-range": "Walls Range", + "module.anchor-aura.place.walls-range.description": "Range in which to place anchors when behind blocks.", + "module.anchor-aura.place.air-place": "Air Place", + "module.anchor-aura.place.air-place.description": "Allows Anchor Aura to place anchors in the air.", + "module.anchor-aura.break": "Break", + "module.anchor-aura.break.charge-delay": "Charge Delay", + "module.anchor-aura.break.charge-delay.description": "The tick delay it takes to charge anchors.", + "module.anchor-aura.break.break-delay": "Break Delay", + "module.anchor-aura.break.break-delay.description": "The tick delay it takes to break anchors.", + "module.anchor-aura.break.break-range": "Break Range", + "module.anchor-aura.break.break-range.description": "Range in which to break anchors.", + "module.anchor-aura.break.walls-range": "Walls Range", + "module.anchor-aura.break.walls-range.description": "Range in which to break anchors when behind blocks.", + "module.anchor-aura.pause": "Pause", + "module.anchor-aura.pause.pause-on-use": "Pause On Use", + "module.anchor-aura.pause.pause-on-use.description": "Pauses while using an item.", + "module.anchor-aura.pause.pause-on-mine": "Pause On Mine", + "module.anchor-aura.pause.pause-on-mine.description": "Pauses while mining blocks.", + "module.anchor-aura.pause.pause-on-CA": "Pause On CA", + "module.anchor-aura.pause.pause-on-CA.description": "Pauses while Crystal Aura is placing.", + "module.anchor-aura.render": "Render", + "module.anchor-aura.render.swing": "Swing", + "module.anchor-aura.render.swing.description": "Whether to swing your hand client-side.", + "module.anchor-aura.render.render": "Render", + "module.anchor-aura.render.render.description": "Renders the block where it is placing an anchor.", + "module.anchor-aura.render.shape-mode": "Shape Mode", + "module.anchor-aura.render.shape-mode.description": "How the shapes are rendered.", + "module.anchor-aura.render.side-color": "Side Color", + "module.anchor-aura.render.side-color.description": "The side color for positions to be placed.", + "module.anchor-aura.render.line-color": "Line Color", + "module.anchor-aura.render.line-color.description": "The line color for positions to be placed.", + + "module.anti-void": "Anti Void", + "module.anti-void.description": "Attempts to prevent you from falling into the void.", + "module.anti-void.general.mode": "Mode", + "module.anti-void.general.mode.description": "The method to prevent you from falling into the void.", + + "module.kill-aura": "Kill Aura", + "module.kill-aura.description": "Attacks specified entities around you.", + "module.kill-aura.general.attack-when-holding": "Attack When Holding", + "module.kill-aura.general.attack-when-holding.description": "Only attacks an entity when a specified item is in your hand.", + "module.kill-aura.general.selected-weapon-types": "Selected Weapon Types", + "module.kill-aura.general.selected-weapon-types.description": "Which types of weapons to attack with (if you select the diamond sword, any type of sword may be used to attack).", + "module.kill-aura.general.rotate": "Rotate", + "module.kill-aura.general.rotate.description": "Determines when you should rotate towards the target.", + "module.kill-aura.general.auto-switch": "Auto Switch", + "module.kill-aura.general.auto-switch.description": "Switches to an acceptable weapon when attacking the target.", + "module.kill-aura.general.swap-back": "Swap Back", + "module.kill-aura.general.swap-back.description": "Switches to your previous slot when done attacking the target.", + "module.kill-aura.general.shield-mode": "Shield Mode", + "module.kill-aura.general.shield-mode.description": "Will try and use an axe to break target shields.", + "module.kill-aura.general.only-on-click": "Only On Click", + "module.kill-aura.general.only-on-click.description": "Only attacks when holding left click.", + "module.kill-aura.general.only-on-look": "Only On Look", + "module.kill-aura.general.only-on-look.description": "Only attacks when looking at an entity.", + "module.kill-aura.general.pause-baritone": "Pause Baritone", + "module.kill-aura.general.pause-baritone.description": "Freezes Baritone temporarily until you are finished attacking the entity.", + "module.kill-aura.targeting": "Targeting", + "module.kill-aura.targeting.entities": "Entities", + "module.kill-aura.targeting.entities.description": "Entities to attack.", + "module.kill-aura.targeting.priority": "Priority", + "module.kill-aura.targeting.priority.description": "How to filter targets within range.", + "module.kill-aura.targeting.max-targets": "Max Targets", + "module.kill-aura.targeting.max-targets.description": "How many entities to target at once.", + "module.kill-aura.targeting.range": "Range", + "module.kill-aura.targeting.range.description": "The maximum range the entity can be to attack it.", + "module.kill-aura.targeting.walls-range": "Walls Range", + "module.kill-aura.targeting.walls-range.description": "The maximum range the entity can be attacked through walls.", + "module.kill-aura.targeting.mob-age-filter": "Mob Age Filter", + "module.kill-aura.targeting.mob-age-filter.description": "Determines the age of the mobs to target (baby, adult, or both).", + "module.kill-aura.targeting.ignore-named": "Ignore Named", + "module.kill-aura.targeting.ignore-named.description": "Whether or not to attack mobs with a name.", + "module.kill-aura.targeting.ignore-passive": "Ignore Passive", + "module.kill-aura.targeting.ignore-passive.description": "Will only attack sometimes passive mobs if they are targeting you.", + "module.kill-aura.targeting.ignore-tamed": "Ignore Tamed", + "module.kill-aura.targeting.ignore-tamed.description": "Will avoid attacking mobs you tamed.", + "module.kill-aura.timing": "Timing", + "module.kill-aura.timing.pause-on-lag": "Pause On Lag", + "module.kill-aura.timing.pause-on-lag.description": "Pauses if the server is lagging.", + "module.kill-aura.timing.pause-on-use": "Pause On Use", + "module.kill-aura.timing.pause-on-use.description": "Does not attack while using an item.", + "module.kill-aura.timing.pause-on-CA": "Pause On CA", + "module.kill-aura.timing.pause-on-CA.description": "Does not attack while CA is placing.", + "module.kill-aura.timing.TPS-sync": "TPS Sync", + "module.kill-aura.timing.TPS-sync.description": "Tries to sync attack delay with the server's TPS.", + "module.kill-aura.timing.custom-delay": "Custom Delay", + "module.kill-aura.timing.custom-delay.description": "Use a custom delay instead of the vanilla cooldown.", + "module.kill-aura.timing.hit-delay": "Hit Delay", + "module.kill-aura.timing.hit-delay.description": "How fast you hit the entity in ticks.", + "module.kill-aura.timing.switch-delay": "Switch Delay", + "module.kill-aura.timing.switch-delay.description": "How many ticks to wait before hitting an entity after switching hotbar slots.", + + "module.parkour": "Parkour", + "module.parkour.description": "Automatically jumps at the edges of blocks.", + "module.parkour.general.edge-distance": "Edge Distance", + "module.parkour.general.edge-distance.description": "How far from the edge should you jump.", + + "module.spam": "Spam", + "module.spam.description": "Spams specified messages in chat.", + "module.spam.general.messages": "Messages", + "module.spam.general.messages.description": "Messages to use for spam.", + "module.spam.general.delay": "Delay", + "module.spam.general.delay.description": "The delay between specified messages in ticks.", + "module.spam.general.disable-on-leave": "Disable On Leave", + "module.spam.general.disable-on-leave.description": "Disables spam when you leave a server.", + "module.spam.general.disable-on-disconnect": "Disable On Disconnect", + "module.spam.general.disable-on-disconnect.description": "Disables spam when you are disconnected from a server.", + "module.spam.general.randomise": "Randomise", + "module.spam.general.randomise.description": "Selects a random message from your spam message list.", + "module.spam.general.auto-split-messages": "Auto Split Messages", + "module.spam.general.auto-split-messages.description": "Automatically split up large messages after a certain length", + "module.spam.general.split-length": "Split Length", + "module.spam.general.split-length.description": "The length after which to split messages in chat", + "module.spam.general.split-delay": "Split Delay", + "module.spam.general.split-delay.description": "The delay between split messages in ticks.", + "module.spam.general.bypass": "Bypass", + "module.spam.general.bypass.description": "Add random text at the end of the message to try to bypass anti spams.", + "module.spam.general.include-uppercase-characters": "Include Uppercase Characters", + "module.spam.general.include-uppercase-characters.description": "Whether the bypass text should include uppercase characters.", + "module.spam.general.length": "Length", + "module.spam.general.length.description": "Number of characters used to bypass anti spam.", + + "module.collisions": "Collisions", + "module.collisions.description": "Adds collision boxes to certain blocks/areas.", + "module.collisions.general.blocks": "Blocks", + "module.collisions.general.blocks.description": "What blocks should be added collision box.", + "module.collisions.general.magma": "Magma", + "module.collisions.general.magma.description": "Prevents you from walking over magma blocks.", + "module.collisions.general.unloaded-chunks": "Unloaded Chunks", + "module.collisions.general.unloaded-chunks.description": "Stops you from going into unloaded chunks.", + "module.collisions.general.ignore-border": "Ignore Border", + "module.collisions.general.ignore-border.description": "Removes world border collision.", + + "module.click-tp": "Click Tp", + "module.click-tp.description": "Teleports you to the block you click on.", + + "module.packet-canceller": "Packet Canceller", + "module.packet-canceller.description": "Allows you to cancel certain packets.", + "module.packet-canceller.general.S2C-packets": "S2C Packets", + "module.packet-canceller.general.S2C-packets.description": "Server-to-client packets to cancel.", + "module.packet-canceller.general.C2S-packets": "C2S Packets", + "module.packet-canceller.general.C2S-packets.description": "Client-to-server packets to cancel.", + + "module.tracers": "Tracers", + "module.tracers.description": "Displays tracer lines to specified entities.", + "module.tracers.general.entities": "Entities", + "module.tracers.general.entities.description": "Select specific entities.", + "module.tracers.general.ignore-self": "Ignore Self", + "module.tracers.general.ignore-self.description": "Doesn't draw tracers to yourself when in third person or freecam.", + "module.tracers.general.ignore-friends": "Ignore Friends", + "module.tracers.general.ignore-friends.description": "Doesn't draw tracers to friends.", + "module.tracers.general.show-invisible": "Show Invisible", + "module.tracers.general.show-invisible.description": "Shows invisible entities.", + "module.tracers.appearance": "Appearance", + "module.tracers.appearance.style": "Style", + "module.tracers.appearance.style.description": "What display mode should be used", + "module.tracers.appearance.target": "Target", + "module.tracers.appearance.target.description": "What part of the entity to target.", + "module.tracers.appearance.stem": "Stem", + "module.tracers.appearance.stem.description": "Draw a line through the center of the tracer target.", + "module.tracers.appearance.max-distance": "Max Distance", + "module.tracers.appearance.max-distance.description": "Maximum distance for tracers to show.", + "module.tracers.appearance.distance-offscreen": "Distance Offscreen", + "module.tracers.appearance.distance-offscreen.description": "Offscreen's distance from center.", + "module.tracers.appearance.size-offscreen": "Size Offscreen", + "module.tracers.appearance.size-offscreen.description": "Offscreen's size.", + "module.tracers.appearance.blink-offscreen": "Blink Offscreen", + "module.tracers.appearance.blink-offscreen.description": "Make offscreen Blink.", + "module.tracers.appearance.blink-offscreen-speed": "Blink Offscreen Speed", + "module.tracers.appearance.blink-offscreen-speed.description": "Offscreen's blink speed.", + "module.tracers.colors": "Colors", + "module.tracers.colors.distance-colors": "Distance Colors", + "module.tracers.colors.distance-colors.description": "Changes the color of tracers depending on distance.", + "module.tracers.colors.show-friend-colors": "Show Friend Colors", + "module.tracers.colors.show-friend-colors.description": "Whether or not to override the distance color of friends with the friend color.", + "module.tracers.colors.players-colors": "Players Colors", + "module.tracers.colors.players-colors.description": "The player's color.", + "module.tracers.colors.animals-color": "Animals Color", + "module.tracers.colors.animals-color.description": "The animal's color.", + "module.tracers.colors.water-animals-color": "Water Animals Color", + "module.tracers.colors.water-animals-color.description": "The water animal's color.", + "module.tracers.colors.monsters-color": "Monsters Color", + "module.tracers.colors.monsters-color.description": "The monster's color.", + "module.tracers.colors.ambient-color": "Ambient Color", + "module.tracers.colors.ambient-color.description": "The ambient color.", + "module.tracers.colors.misc-color": "Misc Color", + "module.tracers.colors.misc-color.description": "The misc color.", + + "module.auto-exp": "Auto Exp", + "module.auto-exp.description": "Automatically repairs your armor and tools in pvp.", + "module.auto-exp.general.mode": "Mode", + "module.auto-exp.general.mode.description": "Which items to repair.", + "module.auto-exp.general.replenish": "Replenish", + "module.auto-exp.general.replenish.description": "Automatically replenishes exp into a selected hotbar slot.", + "module.auto-exp.general.only-on-ground": "Only On Ground", + "module.auto-exp.general.only-on-ground.description": "Only throw when the player is on the ground.", + "module.auto-exp.general.exp-slot": "Exp Slot", + "module.auto-exp.general.exp-slot.description": "The slot to replenish exp into.", + "module.auto-exp.general.min-threshold": "Min Threshold", + "module.auto-exp.general.min-threshold.description": "The minimum durability percentage that an item needs to fall to, to be repaired.", + "module.auto-exp.general.max-threshold": "Max Threshold", + "module.auto-exp.general.max-threshold.description": "The maximum durability percentage to repair items to.", + + "module.jesus": "Jesus", + "module.jesus.description": "Walk on liquids and powder snow like Jesus.", + "module.jesus.general.powder-snow": "Powder Snow", + "module.jesus.general.powder-snow.description": "Walk on powder snow.", + "module.jesus.water": "Water", + "module.jesus.water.mode": "Mode", + "module.jesus.water.mode.description": "How to treat the water.", + "module.jesus.water.dip-if-burning": "Dip If Burning", + "module.jesus.water.dip-if-burning.description": "Lets you go into the water when you are burning.", + "module.jesus.water.dip-on-sneak": "Dip On Sneak", + "module.jesus.water.dip-on-sneak.description": "Lets you go into the water when your sneak key is held.", + "module.jesus.water.dip-on-fall": "Dip On Fall", + "module.jesus.water.dip-on-fall.description": "Lets you go into the water when you fall over a certain height.", + "module.jesus.water.dip-fall-height": "Dip Fall Height", + "module.jesus.water.dip-fall-height.description": "The fall height at which you will go into the water.", + "module.jesus.lava": "Lava", + "module.jesus.lava.mode": "Mode", + "module.jesus.lava.mode.description": "How to treat the lava.", + "module.jesus.lava.dip-if-resistant": "Dip If Resistant", + "module.jesus.lava.dip-if-resistant.description": "Lets you go into the lava if you have Fire Resistance effect.", + "module.jesus.lava.dip-on-sneak": "Dip On Sneak", + "module.jesus.lava.dip-on-sneak.description": "Lets you go into the lava when your sneak key is held.", + "module.jesus.lava.dip-on-fall": "Dip On Fall", + "module.jesus.lava.dip-on-fall.description": "Lets you go into the lava when you fall over a certain height.", + "module.jesus.lava.dip-fall-height": "Dip Fall Height", + "module.jesus.lava.dip-fall-height.description": "The fall height at which you will go into the lava.", + + "module.no-mining-trace": "No Mining Trace", + "module.no-mining-trace.description": "Allows you to mine blocks through entities.", + "module.no-mining-trace.general.blacklisted-entities": "Blacklisted Entities", + "module.no-mining-trace.general.blacklisted-entities.description": "Entities you will interact with as normal.", + "module.no-mining-trace.general.only-when-holding-a-pickaxe": "Only When Holding A Pickaxe", + "module.no-mining-trace.general.only-when-holding-a-pickaxe.description": "Whether or not to work only when holding a pickaxe.", + + "module.bow-aimbot": "Bow Aimbot", + "module.bow-aimbot.description": "Automatically aims your bow for you.", + "module.bow-aimbot.general.range": "Range", + "module.bow-aimbot.general.range.description": "The maximum range the entity can be to aim at it.", + "module.bow-aimbot.general.entities": "Entities", + "module.bow-aimbot.general.entities.description": "Entities to attack.", + "module.bow-aimbot.general.priority": "Priority", + "module.bow-aimbot.general.priority.description": "What type of entities to target.", + "module.bow-aimbot.general.babies": "Babies", + "module.bow-aimbot.general.babies.description": "Whether or not to attack baby variants of the entity.", + "module.bow-aimbot.general.nametagged": "Nametagged", + "module.bow-aimbot.general.nametagged.description": "Whether or not to attack mobs with a name tag.", + "module.bow-aimbot.general.pause-on-combat": "Pause On Combat", + "module.bow-aimbot.general.pause-on-combat.description": "Freezes Baritone temporarily until you released the bow." } From 514469bf92d326611d394ed3ff17b1c6f61d9fb5 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Sat, 3 Jan 2026 21:00:42 -0500 Subject: [PATCH 28/72] max excavator & infinity miner --- .../systems/modules/world/Excavator.java | 1 - .../systems/modules/world/InfinityMiner.java | 1 - .../assets/meteor-client/language/en_us.json | 34 +++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java index 00cd4656ae..f359176d50 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java @@ -22,7 +22,6 @@ import net.minecraft.util.hit.BlockHitResult; import org.lwjgl.glfw.GLFW; -// todo map public class Excavator extends Module { private final IBaritone baritone = BaritoneAPI.getProvider().getPrimaryBaritone(); private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java index 4b0968bd3a..f30ada1fc7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java @@ -34,7 +34,6 @@ import java.util.List; import java.util.function.Predicate; -// todo map public class InfinityMiner extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgWhenFull = settings.createGroup("when-full"); diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index c71eb7572f..382d3e0762 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -362,6 +362,22 @@ "module.enderman-look.general.stun-hostiles": "Stun Hostiles", "module.enderman-look.general.stun-hostiles.description": "Automatically stares at hostile endermen to stun them in place.", + "module.excavator": "Excavator", + "module.excavator.description": "Excavate a selection area.", + "module.excavator.general.selection-bind": "Selection Bind", + "module.excavator.general.selection-bind.description": "Bind to draw selection.", + "module.excavator.general.log-selection": "Log Selection", + "module.excavator.general.log-selection.description": "Logs the selection coordinates to the chat.", + "module.excavator.general.keep-active": "Keep Active", + "module.excavator.general.keep-active.description": "Keep the module active after finishing the excavation.", + "module.excavator.rendering": "Rendering", + "module.excavator.rendering.shape-mode": "Shape Mode", + "module.excavator.rendering.shape-mode.description": "How the shapes are rendered.", + "module.excavator.rendering.side-color": "Side Color", + "module.excavator.rendering.side-color.description": "The side color.", + "module.excavator.rendering.line-color": "Line Color", + "module.excavator.rendering.line-color.description": "The line color.", + "module.timer": "Timer", "module.timer.description": "Changes the speed of everything in your game.", "module.timer.general.multiplier": "Multiplier", @@ -1459,6 +1475,24 @@ "module.highway-builder.render-paving.blocks-to-place-line-color": "Blocks To Place Line Color", "module.highway-builder.render-paving.blocks-to-place-line-color.description": "Color of blocks to be placed.", + "module.infinity-miner": "Infinity Miner", + "module.infinity-miner.description": "Allows you to essentially mine forever by mining repair blocks when the durability gets low. Needs a mending pickaxe.", + "module.infinity-miner.general.target-blocks": "Target Blocks", + "module.infinity-miner.general.target-blocks.description": "The target blocks to mine.", + "module.infinity-miner.general.target-items": "Target Items", + "module.infinity-miner.general.target-items.description": "The target items to collect.", + "module.infinity-miner.general.repair-blocks": "Repair Blocks", + "module.infinity-miner.general.repair-blocks.description": "The repair blocks to mine.", + "module.infinity-miner.general.start-repairing": "Start Repairing", + "module.infinity-miner.general.start-repairing.description": "The durability percentage at which to start repairing.", + "module.infinity-miner.general.start-mining": "Start Mining", + "module.infinity-miner.general.start-mining.description": "The durability percentage at which to start mining.", + "module.infinity-miner.when-full": "When Full", + "module.infinity-miner.when-full.walk-home": "Walk Home", + "module.infinity-miner.when-full.walk-home.description": "Will walk 'home' when your inventory is full.", + "module.infinity-miner.when-full.log-out": "Log Out", + "module.infinity-miner.when-full.log-out.description": "Logs out when your inventory is full. Will walk home FIRST if walk home is enabled.", + "module.breadcrumbs": "Breadcrumbs", "module.breadcrumbs.description": "Displays a trail behind where you have walked.", "module.breadcrumbs.general.color": "Color", From 0de96768c62f564c5cf4d5c492b576e61e76acc3 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Sat, 3 Jan 2026 21:03:40 -0500 Subject: [PATCH 29/72] solve setting name conflicts --- .../systems/modules/render/BetterTooltips.java | 2 +- .../meteorclient/systems/modules/world/Nuker.java | 4 ++-- .../assets/meteor-client/language/en_us.json | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java index 3aacb344e3..f716f1b042 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java @@ -86,7 +86,7 @@ public class BetterTooltips extends Module { ); private final Setting openContentsKey = sgGeneral.add(new KeybindSetting.Builder() - .name("keybind") + .name("open-contents-keybind") .defaultValue(Keybind.fromButton(GLFW_MOUSE_BUTTON_MIDDLE)) .visible(openContents::get) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java index c364769bb6..481517600a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java @@ -242,14 +242,14 @@ public class Nuker extends Module { ); private final Setting sideColor = sgRender.add(new ColorSetting.Builder() - .name("side-color") + .name("breaking-side-color") .defaultValue(new SettingColor(255, 0, 0, 80)) .visible(enableRenderBreaking::get) .build() ); private final Setting lineColor = sgRender.add(new ColorSetting.Builder() - .name("line-color") + .name("breaking-line-color") .defaultValue(new SettingColor(255, 0, 0, 255)) .visible(enableRenderBreaking::get) .build() diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index 382d3e0762..39ba55f291 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -253,8 +253,8 @@ "module.better-tooltips.general.keybind.description": "The bind for keybind mode.", "module.better-tooltips.general.open-contents": "Open Contents", "module.better-tooltips.general.open-contents.description": "Opens a GUI window with the inventory of the storage block or book when you click the item.", - "module.better-tooltips.general.keybind-$todo-duplicates$": "Keybind", - "module.better-tooltips.general.keybind.description-$todo-duplicates$": "Key to open contents (containers, books, etc.) when pressed on items.", + "module.better-tooltips.general.open-contents-keybind": "Open Contents Keybind", + "module.better-tooltips.general.open-contents-keybind.description": "Key to open contents (containers, books, etc.) when pressed on items.", "module.better-tooltips.general.pause-in-creative": "Pause In Creative", "module.better-tooltips.general.pause-in-creative.description": "Pauses middle click open while the player is in creative mode.", "module.better-tooltips.previews": "Previews", @@ -777,10 +777,10 @@ "module.nuker.render.broken-blocks.description": "Enable rendering bounding box for Cube and Uniform Cube.", "module.nuker.render.nuke-block-mode": "Nuke Block Mode", "module.nuker.render.nuke-block-mode.description": "How the shapes for broken blocks are rendered.", - "module.nuker.render.side-color-$todo-duplicates$": "Side Color", - "module.nuker.render.side-color.description-$todo-duplicates$": "The side color of the target block rendering.", - "module.nuker.render.line-color-$todo-duplicates$": "Line Color", - "module.nuker.render.line-color.description-$todo-duplicates$": "The line color of the target block rendering.", + "module.nuker.render.breaking-side-color": "Breaking Side Color", + "module.nuker.render.breaking-side-color.description": "The side color of the target block rendering.", + "module.nuker.render.breaking-line-color": "Breaking Line Color", + "module.nuker.render.breaking-line-color.description": "The line color of the target block rendering.", "module.auto-trap": "Auto Trap", "module.auto-trap.description": "Traps people in a box to prevent them from moving.", From 3362d812a83552da08f37c19ba68bc7b60ad81bd Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Sat, 3 Jan 2026 21:27:09 -0500 Subject: [PATCH 30/72] map commands --- .../meteorclient/commands/Command.java | 11 +- .../commands/commands/CommandsCommand.java | 2 +- .../commands/commands/DamageCommand.java | 2 +- .../commands/commands/DisconnectCommand.java | 2 +- .../commands/commands/EnderChestCommand.java | 2 +- .../commands/commands/GamemodeCommand.java | 2 +- .../commands/commands/InventoryCommand.java | 2 +- .../commands/commands/LocateCommand.java | 2 +- .../commands/commands/ModulesCommand.java | 2 +- .../commands/commands/NameHistoryCommand.java | 2 +- .../commands/commands/SaveMapCommand.java | 2 +- .../commands/commands/SettingCommand.java | 2 +- .../commands/commands/ToggleCommand.java | 2 +- .../commands/commands/WaypointCommand.java | 2 +- .../assets/meteor-client/language/en_us.json | 136 +++++++++--------- 15 files changed, 84 insertions(+), 89 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/Command.java b/src/main/java/meteordevelopment/meteorclient/commands/Command.java index 424502a0be..0809c14978 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/Command.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/Command.java @@ -34,20 +34,15 @@ public abstract class Command { private final List aliases; public final String translationKey; - // todo remove the description parameter in the next minecraft version update - @Deprecated(forRemoval = true) - public Command(String name, String description, String... aliases) { + public Command(String name, String... aliases) { this.name = name; this.title = Utils.nameToTitle(name); this.aliases = List.of(aliases); - this.translationKey = "meteor.command." + name; + this.translationKey = "command." + name; } public Command(String name) { - this.name = name; - this.title = Utils.nameToTitle(name); - this.aliases = List.of(); - this.translationKey = "meteor.command." + name; + this(name, new String[0]); } // Helper methods to painlessly infer the CommandSource generic type argument diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java index 7f63c4cd26..6f0be6c8e1 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java @@ -20,7 +20,7 @@ public class CommandsCommand extends Command { public CommandsCommand() { - super("commands", "List of all commands.", "help"); + super("commands", "help"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DamageCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DamageCommand.java index 973c10bb0c..653f411b9e 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DamageCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DamageCommand.java @@ -21,7 +21,7 @@ public class DamageCommand extends Command { private final static SimpleCommandExceptionType INVULNERABLE = new SimpleCommandExceptionType(Text.literal("You are invulnerable.")); public DamageCommand() { - super("damage", "Damages self", "dmg"); + super("damage", "dmg"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java index 2ae2620ecf..2cfa733b92 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java @@ -15,7 +15,7 @@ public class DisconnectCommand extends Command { public DisconnectCommand() { - super("disconnect", "Disconnect from the server", "dc"); + super("disconnect", "dc"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnderChestCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnderChestCommand.java index 818bf8bb27..2c5210ad1c 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnderChestCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnderChestCommand.java @@ -14,7 +14,7 @@ public class EnderChestCommand extends Command { public EnderChestCommand() { - super("ender-chest", "Allows you to preview memory of your ender chest.", "ec", "echest"); + super("ender-chest", "ec", "echest"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/GamemodeCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/GamemodeCommand.java index 9033346af8..2fcaba695f 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/GamemodeCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/GamemodeCommand.java @@ -12,7 +12,7 @@ public class GamemodeCommand extends Command { public GamemodeCommand() { - super("gamemode", "Changes your gamemode client-side.", "gm"); + super("gamemode", "gm"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/InventoryCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/InventoryCommand.java index 8ef230967c..6bcd33a815 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/InventoryCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/InventoryCommand.java @@ -14,7 +14,7 @@ public class InventoryCommand extends Command { public InventoryCommand() { - super("inventory", "Allows you to see parts of another player's inventory.", "inv", "invsee"); + super("inventory", "inv", "invsee"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java index f3c4895d35..32062c3935 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java @@ -67,7 +67,7 @@ public class LocateCommand extends Command { ); public LocateCommand() { - super("locate", "Locates structures", "loc"); + super("locate", "loc"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java index 6f31d9a2c7..e677da9b73 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java @@ -18,7 +18,7 @@ public class ModulesCommand extends Command { public ModulesCommand() { - super("modules", "Displays a list of all modules.", "features"); + super("modules", "features"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java index 3a646a477c..ba5b8aea0c 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java @@ -27,7 +27,7 @@ public class NameHistoryCommand extends Command { public NameHistoryCommand() { - super("name-history", "Provides a list of a players previous names from the laby.net api.", "history", "names"); + super("name-history", "history", "names"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java index 232ed70e9f..668893f56b 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java @@ -38,7 +38,7 @@ public class SaveMapCommand extends Command { private final PointerBuffer filters; public SaveMapCommand() { - super("save-map", "Saves a map to an image.", "sm"); + super("save-map", "sm"); filters = BufferUtils.createPointerBuffer(1); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java index 25a2e92b65..04fca1e192 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java @@ -22,7 +22,7 @@ public class SettingCommand extends Command { public SettingCommand() { - super("settings", "Allows you to view and change module settings.", "s"); + super("settings", "s"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ToggleCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ToggleCommand.java index c7fdbdd5e6..7bb31f750b 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ToggleCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ToggleCommand.java @@ -17,7 +17,7 @@ public class ToggleCommand extends Command { public ToggleCommand() { - super("toggle", "Toggles a module.", "t"); + super("toggle", "t"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java index 54082c09c2..d65e1fdc3e 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java @@ -20,7 +20,7 @@ public class WaypointCommand extends Command { public WaypointCommand() { - super("waypoint", "Manages waypoints.", "wp"); + super("waypoint", "wp"); } @Override diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index 39ba55f291..84039104d4 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -3,74 +3,74 @@ "meteor.key.open-commands": "Open Commands", "meteor.key.open-gui": "Open GUI", - "meteor.command.bind.description": "Binds a specified module to the next pressed key.", - "meteor.command.binds.description": "List of all bound modules.", - "meteor.command.commands.description": "List of all commands.", - "meteor.command.damage.description": "Damages self.", - "meteor.command.disconnect.description": "Disconnect from the server", - "meteor.command.disconnect.disconnection_message": "%s[%sDisconnectCommand%s] Disconnected by user.", - "meteor.command.dismount.description": "Dismounts you from entity you are riding.", - "meteor.command.drop.description": "Automatically drops specified items.", - "meteor.command.drop.exception.no_such_item": "Could not find an item with that name!", - "meteor.command.drop.exception.not_spectator": "Can't drop items while in spectator.", - "meteor.command.enchant.description": "Enchants the item in your hand. REQUIRES Creative mode.", - "meteor.command.enchant.exception.not_holding_item": "You need to hold some item to enchant.", - "meteor.command.enchant.exception.not_in_creative": "You must be in creative mode to use this.", - "meteor.command.ender-chest.description": "Allows you to preview memory of your ender chest.", - "meteor.command.fake-player.description": "Manages fake players that you can use for testing.", - "meteor.command.fake-player.error.not_found": "Couldn't find a Fake Player with that name.", - "meteor.command.fake-player.info.removed": "Removed Fake Player %s.", - "meteor.command.fov.description": "Changes your fov.", - "meteor.command.friends.description": "Manages friends.", - "meteor.command.gamemode.description": "Changes your gamemode client-side.", - "meteor.command.give.description": "Gives you any item.", - "meteor.command.give.exception.not_in_creative": "You must be in creative mode to use this.", - "meteor.command.give.exception.no_space": "No space in hotbar.", - "meteor.command.hclip.description": "Lets you clip through blocks horizontally.", - "meteor.command.input.description": "Keyboard input simulation.", - "meteor.command.input.info.cleared_handlers": "Cleared all keypress handlers.", - "meteor.command.input.info.active_handlers": "Active keypress handlers: ", - "meteor.command.input.info.keypress_handler": "(highlight)%d(default) - (highlight)%s %d(default) ticks left out of (highlight)%d(default).", - "meteor.command.input.info.removed_handler": "Removed keypress handler.", - "meteor.command.input.warning.no_handlers": "No active keypress handlers.", - "meteor.command.input.warning.out_of_range": "Index out of range.", - "meteor.command.inventory.description": "Allows you to see parts of another player's inventory.", - "meteor.command.locate.description": "Locates structures", - "meteor.command.macro.description": "Allows you to execute macros.", - "meteor.command.macro.error.none_scheduled": "No macros are currently scheduled.", - "meteor.command.macro.error.not_scheduled": "This macro is not currently scheduled.", - "meteor.command.macro.info.cleared_all": "Cleared all scheduled macros.", - "meteor.command.macro.info.cleared": "Cleared scheduled macro.", - "meteor.command.modules.description": "Displays a list of all modules.", - "meteor.command.name-history.description": "Provides a list of a players previous names from the laby.net api", - "meteor.command.name-history.error.error_fetching_name": "There was an error fetching that users name history.", - "meteor.command.name-history.inaccurate": "This name history entry is not accurate according to laby.net", - "meteor.command.nbt.description": "Modifies NBT data for an item, example: .nbt add {display:{Name:'{\"text\":\"$cRed Name\"}'}}", - "meteor.command.notebot.description": "Allows you load notebot files", - "meteor.command.peek.description": "Lets you see what's inside storage block items.", - "meteor.command.profiles.description": "Loads and saves profiles.", - "meteor.command.profiles.info.loaded": "Loaded profile (highlight)%s(default).", - "meteor.command.profiles.info.saved": "Saved profile (highlight)%s(default).", - "meteor.command.profiles.info.deleted": "Deleted profile (highlight)%s(default).", - "meteor.command.reload.description": "Reloads many systems.", - "meteor.command.reload.warning.reloading": "Reloading systems, this may take a while.", - "meteor.command.reset.description": "Resets specified settings.", - "meteor.command.rotation.description": "Modifies your rotation.", - "meteor.command.save-map.description": "Saves a map to an image.", - "meteor.command.save-map.error.error_writing_texture": "Error writing map texture", - "meteor.command.save-map.exception.map_not_found": "You must be holding a filled map.", - "meteor.command.save-map.exception.oops": "Something went wrong.", - "meteor.command.say.description": "Sends messages in chat.", - "meteor.command.server.description": "Prints server information", - "meteor.command.settings.description": "Allows you to view and change module settings.", - "meteor.command.spectate.description": "Allows you to spectate nearby players", - "meteor.command.swarm.description": "Sends commands to connected swarm workers.", - "meteor.command.toggle.description": "Toggles a module.", - "meteor.command.vclip.description": "Lets you clip through blocks vertically.", - "meteor.command.wasp.description": "Sets the auto wasp target.", - "meteor.command.wasp.exception.cant_wasp_self": "You cannot target yourself!", - "meteor.command.wasp.info.target": "%s set as target.", - "meteor.command.waypoint.description": "Manages waypoints.", + "command.bind.description": "Binds a specified module to the next pressed key.", + "command.binds.description": "List of all bound modules.", + "command.commands.description": "List of all commands.", + "command.damage.description": "Damages self.", + "command.disconnect.description": "Disconnect from the server", + "command.disconnect.disconnection_message": "%s[%sDisconnectCommand%s] Disconnected by user.", + "command.dismount.description": "Dismounts you from entity you are riding.", + "command.drop.description": "Automatically drops specified items.", + "command.drop.exception.no_such_item": "Could not find an item with that name!", + "command.drop.exception.not_spectator": "Can't drop items while in spectator.", + "command.enchant.description": "Enchants the item in your hand. REQUIRES Creative mode.", + "command.enchant.exception.not_holding_item": "You need to hold some item to enchant.", + "command.enchant.exception.not_in_creative": "You must be in creative mode to use this.", + "command.ender-chest.description": "Allows you to preview memory of your ender chest.", + "command.fake-player.description": "Manages fake players that you can use for testing.", + "command.fake-player.error.not_found": "Couldn't find a Fake Player with that name.", + "command.fake-player.info.removed": "Removed Fake Player %s.", + "command.fov.description": "Changes your fov.", + "command.friends.description": "Manages friends.", + "command.gamemode.description": "Changes your gamemode client-side.", + "command.give.description": "Gives you any item.", + "command.give.exception.not_in_creative": "You must be in creative mode to use this.", + "command.give.exception.no_space": "No space in hotbar.", + "command.hclip.description": "Lets you clip through blocks horizontally.", + "command.input.description": "Keyboard input simulation.", + "command.input.info.cleared_handlers": "Cleared all keypress handlers.", + "command.input.info.active_handlers": "Active keypress handlers: ", + "command.input.info.keypress_handler": "(highlight)%d(default) - (highlight)%s %d(default) ticks left out of (highlight)%d(default).", + "command.input.info.removed_handler": "Removed keypress handler.", + "command.input.warning.no_handlers": "No active keypress handlers.", + "command.input.warning.out_of_range": "Index out of range.", + "command.inventory.description": "Allows you to see parts of another player's inventory.", + "command.locate.description": "Locates structures", + "command.macro.description": "Allows you to execute macros.", + "command.macro.error.none_scheduled": "No macros are currently scheduled.", + "command.macro.error.not_scheduled": "This macro is not currently scheduled.", + "command.macro.info.cleared_all": "Cleared all scheduled macros.", + "command.macro.info.cleared": "Cleared scheduled macro.", + "command.modules.description": "Displays a list of all modules.", + "command.name-history.description": "Provides a list of a players previous names from the laby.net api", + "command.name-history.error.error_fetching_name": "There was an error fetching that users name history.", + "command.name-history.inaccurate": "This name history entry is not accurate according to laby.net", + "command.nbt.description": "Modifies NBT data for an item, example: .nbt add {display:{Name:'{\"text\":\"$cRed Name\"}'}}", + "command.notebot.description": "Allows you load notebot files", + "command.peek.description": "Lets you see what's inside storage block items.", + "command.profiles.description": "Loads and saves profiles.", + "command.profiles.info.loaded": "Loaded profile (highlight)%s(default).", + "command.profiles.info.saved": "Saved profile (highlight)%s(default).", + "command.profiles.info.deleted": "Deleted profile (highlight)%s(default).", + "command.reload.description": "Reloads many systems.", + "command.reload.warning.reloading": "Reloading systems, this may take a while.", + "command.reset.description": "Resets specified settings.", + "command.rotation.description": "Modifies your rotation.", + "command.save-map.description": "Saves a map to an image.", + "command.save-map.error.error_writing_texture": "Error writing map texture", + "command.save-map.exception.map_not_found": "You must be holding a filled map.", + "command.save-map.exception.oops": "Something went wrong.", + "command.say.description": "Sends messages in chat.", + "command.server.description": "Prints server information", + "command.settings.description": "Allows you to view and change module settings.", + "command.spectate.description": "Allows you to spectate nearby players", + "command.swarm.description": "Sends commands to connected swarm workers.", + "command.toggle.description": "Toggles a module.", + "command.vclip.description": "Lets you clip through blocks vertically.", + "command.wasp.description": "Sets the auto wasp target.", + "command.wasp.exception.cant_wasp_self": "You cannot target yourself!", + "command.wasp.info.target": "%s set as target.", + "command.waypoint.description": "Manages waypoints.", "category.combat": "Combat", "category.player": "Player", From 6791cf47c58bb5ec31cb4d53d74d66f469b75815 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Sat, 3 Jan 2026 21:39:31 -0500 Subject: [PATCH 31/72] map shared module settings --- .../gui/DefaultSettingsWidgetFactory.java | 2 +- .../meteorclient/gui/screens/ModuleScreen.java | 17 +++++++++-------- .../assets/meteor-client/language/en_us.json | 8 ++++++++ 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java index 3f5c6678fa..638e57c6d2 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java @@ -112,7 +112,7 @@ private void group(WVerticalList list, SettingGroup group, String filter, List setting : group) { - String settingKey = groupKey + "." + setting.name; + String settingKey = baseKey + "." + group.name + "." + setting.name; String title = MeteorTranslations.translate(settingKey, () -> Utils.nameToTitle(setting.name)); if (!Strings.CI.contains(title, filter) && !Strings.CI.contains(setting.name, filter)) continue; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModuleScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModuleScreen.java index 280a0c4261..86a9b7aa01 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModuleScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModuleScreen.java @@ -23,6 +23,7 @@ import meteordevelopment.meteorclient.gui.widgets.pressable.WFavorite; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; import meteordevelopment.meteorclient.utils.misc.NbtUtils; import meteordevelopment.meteorclient.utils.render.prompts.OkPrompt; import meteordevelopment.orbit.EventHandler; @@ -53,7 +54,7 @@ public void initWidgets() { if (module.addon != null && module.addon != MeteorClient.ADDON) { WHorizontalList addon = add(theme.horizontalList()).expandX().widget(); - addon.add(theme.label("From: ").color(theme.textSecondaryColor())).widget(); + addon.add(theme.label(MeteorTranslations.translate("module.base.from")).color(theme.textSecondaryColor())).widget(); addon.add(theme.label(module.addon.name).color(module.addon.color)).widget(); } @@ -73,12 +74,12 @@ public void initWidgets() { } // Bind - WSection section = add(theme.section("Bind", true)).expandX().widget(); + WSection section = add(theme.section(MeteorTranslations.translate("module.base.bind"), true)).expandX().widget(); // Keybind WHorizontalList bind = section.add(theme.horizontalList()).expandX().widget(); - bind.add(theme.label("Bind: ")); + bind.add(theme.label(MeteorTranslations.translate("module.base.bind.bind"))); keybind = bind.add(theme.keybind(module.keybind)).expandX().widget(); keybind.actionOnSet = () -> Modules.get().setModuleToBind(module); @@ -89,14 +90,14 @@ public void initWidgets() { // Toggle on bind release WHorizontalList tobr = section.add(theme.horizontalList()).widget(); - tobr.add(theme.label("Toggle on bind release: ")); + tobr.add(theme.label(MeteorTranslations.translate("module.base.bind.toggle-on-release"))); WCheckbox tobrC = tobr.add(theme.checkbox(module.toggleOnBindRelease)).widget(); tobrC.action = () -> module.toggleOnBindRelease = tobrC.checked; // Chat feedback WHorizontalList cf = section.add(theme.horizontalList()).widget(); - cf.add(theme.label("Chat Feedback: ")); + cf.add(theme.label(MeteorTranslations.translate("module.base.bind.chat-feedback"))); WCheckbox cfC = cf.add(theme.checkbox(module.chatFeedback)).widget(); cfC.action = () -> module.chatFeedback = cfC.checked; @@ -106,7 +107,7 @@ public void initWidgets() { WHorizontalList bottom = add(theme.horizontalList()).expandX().widget(); // Active - bottom.add(theme.label("Active: ")); + bottom.add(theme.label(MeteorTranslations.translate("module.base.active"))); active = bottom.add(theme.checkbox(module.isActive())).expandCellX().widget(); active.action = () -> { if (module.isActive() != active.checked) module.toggle(); @@ -126,11 +127,11 @@ public void initWidgets() { .show(); } }; - copy.tooltip = "Copy config"; + copy.tooltip = MeteorTranslations.translate("module.base.copy-config"); WButton paste = sharing.add(theme.button(GuiRenderer.PASTE)).widget(); paste.action = this::fromClipboard; - paste.tooltip = "Paste config"; + paste.tooltip = MeteorTranslations.translate("module.base.paste-config"); } @Override diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index 84039104d4..26783b8dd9 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -80,6 +80,14 @@ "category.misc": "Misc", "module.base.general": "General", + "module.base.bind": "Bind", + "module.base.bind.bind": "Bind: ", + "module.base.bind.toggle-on-release": "Toggle on bind release: ", + "module.base.bind.chat-feedback": "Chat Feedback: ", + "module.base.active": "Active: ", + "module.base.copy-config": "Copy config", + "module.base.paste-config": "Paste config", + "module.base.from": "From: ", "module.air-jump": "Air Jump", "module.air-jump.description": "Lets you jump in the air.", From 7801131091d5d6333a963cc20a7c7c85af8a46a4 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Sat, 3 Jan 2026 21:57:39 -0500 Subject: [PATCH 32/72] remove empty descriptions --- .../assets/meteor-client/language/en_us.json | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index 26783b8dd9..9a803fd151 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -976,11 +976,11 @@ "module.hand-view.off-hand.rotation.description": "The rotation of your off hand.", "module.hand-view.arm": "Arm", "module.hand-view.arm.scale": "Scale", - "module.hand-view.arm.scale.description": "", + "module.hand-view.arm.position": "Position", - "module.hand-view.arm.position.description": "", + "module.hand-view.arm.rotation": "Rotation", - "module.hand-view.arm.rotation.description": "", + "module.instant-rebreak": "Instant Rebreak", "module.instant-rebreak.description": "Instantly re-breaks blocks in the same position.", @@ -1654,7 +1654,7 @@ "module.flamethrower.general.target-babies": "Target Babies", "module.flamethrower.general.target-babies.description": "If checked babies will also be killed.", "module.flamethrower.general.tick-interval": "Tick Interval", - "module.flamethrower.general.tick-interval.description": "", + "module.flamethrower.general.rotate": "Rotate", "module.flamethrower.general.rotate.description": "Automatically faces towards the animal roasted.", "module.flamethrower.general.entities": "Entities", @@ -2004,37 +2004,37 @@ "module.notebot.general.check-noteblocks-again-delay.description": "How much delay should be between end of tuning and checking again", "module.notebot.note-map": "Note Map", "module.notebot.note-map.Harp": "Harp", - "module.notebot.note-map.Harp.description": "", + "module.notebot.note-map.Basedrum": "Basedrum", - "module.notebot.note-map.Basedrum.description": "", + "module.notebot.note-map.Snare": "Snare", - "module.notebot.note-map.Snare.description": "", + "module.notebot.note-map.Hat": "Hat", - "module.notebot.note-map.Hat.description": "", + "module.notebot.note-map.Bass": "Bass", - "module.notebot.note-map.Bass.description": "", + "module.notebot.note-map.Flute": "Flute", - "module.notebot.note-map.Flute.description": "", + "module.notebot.note-map.Bell": "Bell", - "module.notebot.note-map.Bell.description": "", + "module.notebot.note-map.Guitar": "Guitar", - "module.notebot.note-map.Guitar.description": "", + "module.notebot.note-map.Chime": "Chime", - "module.notebot.note-map.Chime.description": "", + "module.notebot.note-map.Xylophone": "Xylophone", - "module.notebot.note-map.Xylophone.description": "", + "module.notebot.note-map.IronXylophone": "IronXylophone", - "module.notebot.note-map.IronXylophone.description": "", + "module.notebot.note-map.CowBell": "CowBell", - "module.notebot.note-map.CowBell.description": "", + "module.notebot.note-map.Didgeridoo": "Didgeridoo", - "module.notebot.note-map.Didgeridoo.description": "", + "module.notebot.note-map.Bit": "Bit", - "module.notebot.note-map.Bit.description": "", + "module.notebot.note-map.Banjo": "Banjo", - "module.notebot.note-map.Banjo.description": "", + "module.notebot.note-map.Pling": "Pling", - "module.notebot.note-map.Pling.description": "", + "module.notebot.render": "Render", "module.notebot.render.render-text": "Render Text", "module.notebot.render.render-text.description": "Whether or not to render the text above noteblocks.", @@ -2657,11 +2657,11 @@ "module.elytra-fly.general.vertical-speed": "Vertical Speed", "module.elytra-fly.general.vertical-speed.description": "How fast you go up and down.", "module.elytra-fly.general.acceleration": "Acceleration", - "module.elytra-fly.general.acceleration.description": "", + "module.elytra-fly.general.acceleration-step": "Acceleration Step", - "module.elytra-fly.general.acceleration-step.description": "", + "module.elytra-fly.general.acceleration-start": "Acceleration Start", - "module.elytra-fly.general.acceleration-start.description": "", + "module.elytra-fly.general.stop-in-water": "Stop In Water", "module.elytra-fly.general.stop-in-water.description": "Stops flying in water.", "module.elytra-fly.general.no-unloaded-chunks": "No Unloaded Chunks", @@ -3059,7 +3059,7 @@ "module.speed-mine": "Speed Mine", "module.speed-mine.description": "Allows you to quickly mine blocks.", "module.speed-mine.general.mode": "Mode", - "module.speed-mine.general.mode.description": "", + "module.speed-mine.general.blocks": "Blocks", "module.speed-mine.general.blocks.description": "Selected blocks.", "module.speed-mine.general.blocks-filter": "Blocks Filter", From 6ffa4a8e86d55b2d409ad6281e863e5a91ab386d Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Sun, 4 Jan 2026 01:59:54 -0500 Subject: [PATCH 33/72] dont load empty entries in lang --- .../meteorclient/utils/misc/MeteorTranslations.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index bc86976ad2..ca8ffabd18 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -81,6 +81,7 @@ public static void loadLanguage(String languageCode) { // noinspection unchecked Object2ObjectOpenHashMap map = GSON.fromJson(new InputStreamReader(stream, StandardCharsets.UTF_8), Object2ObjectOpenHashMap.class); + map.values().removeIf(String::isEmpty); languageMap.putAll(map); MeteorClient.LOG.info("Loaded language {} from addon {}", languageCode, addon.name); From 320ccadddf6e8bf8c2b433c3f6b3108ce4762d09 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Sun, 4 Jan 2026 02:03:34 -0500 Subject: [PATCH 34/72] support renaming settinggroups without losing data --- .../meteorclient/settings/SettingGroup.java | 8 ++++++++ .../meteordevelopment/meteorclient/settings/Settings.java | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java b/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java index 49b4d121c9..dfa00a5d44 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java @@ -5,11 +5,13 @@ package meteordevelopment.meteorclient.settings; +import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.ISerializable; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtList; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Iterator; @@ -18,6 +20,7 @@ public class SettingGroup implements ISerializable, Iterable> { public final String name; public boolean sectionExpanded; + public @Nullable String oldName; final List> settings = new ArrayList<>(1); @@ -51,6 +54,11 @@ public boolean wasChanged() { return false; } + public SettingGroup renamedFrom(String oldName) { + this.oldName = Utils.titleToName(oldName); + return this; + } + @Override public @NotNull Iterator> iterator() { return settings.iterator(); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/Settings.java b/src/main/java/meteordevelopment/meteorclient/settings/Settings.java index c3a1a8a74b..36e054efa2 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/Settings.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/Settings.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Objects; public class Settings implements ISerializable, Iterable { private SettingGroup defaultGroup; @@ -82,6 +83,10 @@ public SettingGroup getGroup(String name) { if (sg.name.equals(name)) return sg; } + for (SettingGroup sg : this) { + if (Objects.equals(sg.oldName, name)) return sg; + } + return null; } From ef654fe26c9d22b5c081cd38ddd75e1e3d32e2ee Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Sun, 4 Jan 2026 02:15:19 -0500 Subject: [PATCH 35/72] rename 'Render' setting groups to 'Visual' --- .../systems/modules/combat/AnchorAura.java | 12 +++---- .../systems/modules/combat/AutoCity.java | 12 +++---- .../systems/modules/combat/AutoTrap.java | 14 ++++---- .../systems/modules/combat/AutoWeb.java | 10 +++--- .../systems/modules/combat/BedAura.java | 12 +++---- .../systems/modules/combat/CrystalAura.java | 32 +++++++++---------- .../systems/modules/combat/HoleFiller.java | 16 +++++----- .../systems/modules/combat/SelfTrap.java | 10 +++--- .../systems/modules/combat/Surround.java | 22 ++++++------- .../systems/modules/movement/SafeWalk.java | 6 ++-- .../systems/modules/movement/Scaffold.java | 10 +++--- .../modules/player/InstantRebreak.java | 10 +++--- .../systems/modules/render/CityESP.java | 8 ++--- .../systems/modules/render/HoleESP.java | 22 ++++++------- .../systems/modules/render/LogoutSpots.java | 12 +++---- .../systems/modules/render/Nametags.java | 14 ++++---- .../systems/modules/render/Trajectories.java | 18 +++++------ .../systems/modules/render/VoidESP.java | 8 ++--- .../modules/render/marker/CuboidMarker.java | 10 +++--- .../modules/render/marker/Sphere2dMarker.java | 12 +++---- .../systems/modules/world/EChestFarmer.java | 12 +++---- .../systems/modules/world/Excavator.java | 8 ++--- .../systems/modules/world/Nuker.java | 20 ++++++------ .../systems/modules/world/PacketMine.java | 14 ++++---- .../systems/modules/world/StashFinder.java | 16 +++++----- .../systems/modules/world/VeinMiner.java | 12 +++---- 26 files changed, 176 insertions(+), 176 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java index 4ec0336548..905ae3e520 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java @@ -42,7 +42,7 @@ public class AnchorAura extends Module { private final SettingGroup sgPlace = settings.createGroup("place"); private final SettingGroup sgBreak = settings.createGroup("break"); private final SettingGroup sgPause = settings.createGroup("pause"); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); // General @@ -187,33 +187,33 @@ public class AnchorAura extends Module { // Render - private final Setting swing = sgRender.add(new BoolSetting.Builder() + private final Setting swing = sgVisual.add(new BoolSetting.Builder() .name("swing") .defaultValue(true) .build() ); - private final Setting render = sgRender.add(new BoolSetting.Builder() + private final Setting render = sgVisual.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .visible(render::get) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(15, 255, 211, 41)) .visible(() -> render.get() && shapeMode.get().sides()) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(15, 255, 211)) .visible(() -> render.get() && shapeMode.get().lines()) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java index 8a4293619b..e93829d849 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java @@ -31,7 +31,7 @@ public class AutoCity extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); private final Setting targetRange = sgGeneral.add(new DoubleSetting.Builder() @@ -85,33 +85,33 @@ public class AutoCity extends Module { // Render - private final Setting swingHand = sgRender.add(new BoolSetting.Builder() + private final Setting swingHand = sgVisual.add(new BoolSetting.Builder() .name("swing-hand") .defaultValue(false) .build() ); - private final Setting renderBlock = sgRender.add(new BoolSetting.Builder() + private final Setting renderBlock = sgVisual.add(new BoolSetting.Builder() .name("render-block") .defaultValue(true) .build() ); - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .visible(renderBlock::get) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(225, 0, 0, 75)) .visible(() -> renderBlock.get() && shapeMode.get().sides()) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(225, 0, 0, 255)) .visible(() -> renderBlock.get() && shapeMode.get().lines()) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java index 1a4c69071d..4b627f6798 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java @@ -39,7 +39,7 @@ public class AutoTrap extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); // General @@ -118,41 +118,41 @@ public class AutoTrap extends Module { // Render - private final Setting render = sgRender.add(new BoolSetting.Builder() + private final Setting render = sgVisual.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .visible(render::get) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(197, 137, 232, 10)) .visible(() -> render.get() && shapeMode.get().sides()) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(197, 137, 232)) .visible(() -> render.get() && shapeMode.get().lines()) .build() ); - private final Setting nextSideColor = sgRender.add(new ColorSetting.Builder() + private final Setting nextSideColor = sgVisual.add(new ColorSetting.Builder() .name("next-side-color") .defaultValue(new SettingColor(227, 196, 245, 10)) .visible(() -> render.get() && shapeMode.get().sides()) .build() ); - private final Setting nextLineColor = sgRender.add(new ColorSetting.Builder() + private final Setting nextLineColor = sgVisual.add(new ColorSetting.Builder() .name("next-line-color") .defaultValue(new SettingColor(5, 139, 221)) .visible(() -> render.get() && shapeMode.get().lines()) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeb.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeb.java index 735f598989..b03b491587 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeb.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeb.java @@ -31,7 +31,7 @@ public class AutoWeb extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); private final Setting placeRange = sgGeneral.add(new DoubleSetting.Builder() .name("place-range") @@ -92,27 +92,27 @@ public class AutoWeb extends Module { // Render - private final Setting render = sgRender.add(new BoolSetting.Builder() + private final Setting render = sgVisual.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .visible(render::get) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(239, 231, 244, 31)) .visible(() -> render.get() && shapeMode.get().sides()) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(255, 255, 255)) .visible(() -> render.get() && shapeMode.get().lines()) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java index 930f1fe5b9..0bd9fd556c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java @@ -41,7 +41,7 @@ public class BedAura extends Module { private final SettingGroup sgTargeting = settings.createGroup("targeting"); private final SettingGroup sgAutoMove = settings.createGroup("inventory"); private final SettingGroup sgPause = settings.createGroup("pause"); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); // General @@ -142,31 +142,31 @@ public class BedAura extends Module { // Render - private final Setting swing = sgRender.add(new BoolSetting.Builder() + private final Setting swing = sgVisual.add(new BoolSetting.Builder() .name("swing") .defaultValue(true) .build() ); - private final Setting render = sgRender.add(new BoolSetting.Builder() + private final Setting render = sgVisual.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(15, 255, 211,75)) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(15, 255, 211)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java index 5fb24d3c90..c4357af0c4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java @@ -73,7 +73,7 @@ public class CrystalAura extends Module { private final SettingGroup sgFacePlace = settings.createGroup("face-place"); private final SettingGroup sgBreak = settings.createGroup("break"); private final SettingGroup sgPause = settings.createGroup("pause"); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); // General @@ -382,26 +382,26 @@ public class CrystalAura extends Module { // Render - public final Setting swingMode = sgRender.add(new EnumSetting.Builder() + public final Setting swingMode = sgVisual.add(new EnumSetting.Builder() .name("swing-mode") .defaultValue(SwingMode.Both) .build() ); - private final Setting renderMode = sgRender.add(new EnumSetting.Builder() + private final Setting renderMode = sgVisual.add(new EnumSetting.Builder() .name("render-mode") .defaultValue(RenderMode.Normal) .build() ); - private final Setting renderPlace = sgRender.add(new BoolSetting.Builder() + private final Setting renderPlace = sgVisual.add(new BoolSetting.Builder() .name("render-place") .defaultValue(true) .visible(() -> renderMode.get() == RenderMode.Normal) .build() ); - private final Setting placeRenderTime = sgRender.add(new IntSetting.Builder() + private final Setting placeRenderTime = sgVisual.add(new IntSetting.Builder() .name("place-time") .defaultValue(10) .min(0) @@ -410,14 +410,14 @@ public class CrystalAura extends Module { .build() ); - private final Setting renderBreak = sgRender.add(new BoolSetting.Builder() + private final Setting renderBreak = sgVisual.add(new BoolSetting.Builder() .name("render-break") .defaultValue(false) .visible(() -> renderMode.get() == RenderMode.Normal) .build() ); - private final Setting breakRenderTime = sgRender.add(new IntSetting.Builder() + private final Setting breakRenderTime = sgVisual.add(new IntSetting.Builder() .name("break-time") .defaultValue(13) .min(0) @@ -426,7 +426,7 @@ public class CrystalAura extends Module { .build() ); - private final Setting smoothness = sgRender.add(new IntSetting.Builder() + private final Setting smoothness = sgVisual.add(new IntSetting.Builder() .name("smoothness") .defaultValue(10) .min(0) @@ -435,7 +435,7 @@ public class CrystalAura extends Module { .build() ); - private final Setting height = sgRender.add(new DoubleSetting.Builder() + private final Setting height = sgVisual.add(new DoubleSetting.Builder() .name("height") .defaultValue(0.7) .min(0) @@ -444,7 +444,7 @@ public class CrystalAura extends Module { .build() ); - private final Setting renderTime = sgRender.add(new IntSetting.Builder() + private final Setting renderTime = sgVisual.add(new IntSetting.Builder() .name("render-time") .defaultValue(10) .min(0) @@ -453,42 +453,42 @@ public class CrystalAura extends Module { .build() ); - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .visible(() -> renderMode.get() != RenderMode.None) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(255, 255, 255, 45)) .visible(() -> shapeMode.get().sides() && renderMode.get() != RenderMode.None) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(255, 255, 255)) .visible(() -> shapeMode.get().lines() && renderMode.get() != RenderMode.None) .build() ); - private final Setting renderDamageText = sgRender.add(new BoolSetting.Builder() + private final Setting renderDamageText = sgVisual.add(new BoolSetting.Builder() .name("damage") .defaultValue(true) .visible(() -> renderMode.get() != RenderMode.None) .build() ); - private final Setting damageColor = sgRender.add(new ColorSetting.Builder() + private final Setting damageColor = sgVisual.add(new ColorSetting.Builder() .name("damage-color") .defaultValue(new SettingColor(255, 255, 255)) .visible(() -> renderMode.get() != RenderMode.None && renderDamageText.get()) .build() ); - private final Setting damageTextScale = sgRender.add(new DoubleSetting.Builder() + private final Setting damageTextScale = sgVisual.add(new DoubleSetting.Builder() .name("damage-scale") .defaultValue(1.25) .min(1) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java index 987be62c9d..6c947398c1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java @@ -40,7 +40,7 @@ public class HoleFiller extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgSmart = settings.createGroup("smart"); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") @@ -170,47 +170,47 @@ public class HoleFiller extends Module { // Render - private final Setting swing = sgRender.add(new BoolSetting.Builder() + private final Setting swing = sgVisual.add(new BoolSetting.Builder() .name("swing") .defaultValue(true) .build() ); - private final Setting render = sgRender.add(new BoolSetting.Builder() + private final Setting render = sgVisual.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .visible(render::get) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(197, 137, 232, 10)) .visible(() -> render.get() && shapeMode.get().sides()) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(197, 137, 232)) .visible(() -> render.get() && shapeMode.get().lines()) .build() ); - private final Setting nextSideColor = sgRender.add(new ColorSetting.Builder() + private final Setting nextSideColor = sgVisual.add(new ColorSetting.Builder() .name("next-side-color") .defaultValue(new SettingColor(227, 196, 245, 10)) .visible(() -> render.get() && shapeMode.get().sides()) .build() ); - private final Setting nextLineColor = sgRender.add(new ColorSetting.Builder() + private final Setting nextLineColor = sgVisual.add(new ColorSetting.Builder() .name("next-line-color") .defaultValue(new SettingColor(5, 139, 221)) .visible(() -> render.get() && shapeMode.get().lines()) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java index f1affec325..55bfde039d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java @@ -39,7 +39,7 @@ public enum BottomMode { } private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); // General @@ -87,25 +87,25 @@ public enum BottomMode { // Render - private final Setting render = sgRender.add(new BoolSetting.Builder() + private final Setting render = sgVisual.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(204, 0, 0, 10)) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(204, 0, 0, 255)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java index a511033975..f1a800fe8e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java @@ -45,7 +45,7 @@ public class Surround extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgToggles = settings.createGroup("toggles"); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); // General @@ -147,66 +147,66 @@ public class Surround extends Module { // Render - private final Setting swing = sgRender.add(new BoolSetting.Builder() + private final Setting swing = sgVisual.add(new BoolSetting.Builder() .name("swing") .defaultValue(true) .build() ); - private final Setting render = sgRender.add(new BoolSetting.Builder() + private final Setting render = sgVisual.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting renderBelow = sgRender.add(new BoolSetting.Builder() + private final Setting renderBelow = sgVisual.add(new BoolSetting.Builder() .name("below") .defaultValue(false) .build() ); - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting safeSideColor = sgRender.add(new ColorSetting.Builder() + private final Setting safeSideColor = sgVisual.add(new ColorSetting.Builder() .name("safe-side-color") .defaultValue(new SettingColor(13, 255, 0, 0)) .visible(() -> render.get() && shapeMode.get() != ShapeMode.Lines) .build() ); - private final Setting safeLineColor = sgRender.add(new ColorSetting.Builder() + private final Setting safeLineColor = sgVisual.add(new ColorSetting.Builder() .name("safe-line-color") .defaultValue(new SettingColor(13, 255, 0, 0)) .visible(() -> render.get() && shapeMode.get() != ShapeMode.Sides) .build() ); - private final Setting normalSideColor = sgRender.add(new ColorSetting.Builder() + private final Setting normalSideColor = sgVisual.add(new ColorSetting.Builder() .name("normal-side-color") .defaultValue(new SettingColor(0, 255, 238, 12)) .visible(() -> render.get() && shapeMode.get() != ShapeMode.Lines) .build() ); - private final Setting normalLineColor = sgRender.add(new ColorSetting.Builder() + private final Setting normalLineColor = sgVisual.add(new ColorSetting.Builder() .name("normal-line-color") .defaultValue(new SettingColor(0, 255, 238, 100)) .visible(() -> render.get() && shapeMode.get() != ShapeMode.Sides) .build() ); - private final Setting unsafeSideColor = sgRender.add(new ColorSetting.Builder() + private final Setting unsafeSideColor = sgVisual.add(new ColorSetting.Builder() .name("unsafe-side-color") .defaultValue(new SettingColor(204, 0, 0, 12)) .visible(() -> render.get() && shapeMode.get() != ShapeMode.Lines) .build() ); - private final Setting unsafeLineColor = sgRender.add(new ColorSetting.Builder() + private final Setting unsafeLineColor = sgVisual.add(new ColorSetting.Builder() .name("unsafe-line-color") .defaultValue(new SettingColor(204, 0, 0, 100)) .visible(() -> render.get() && shapeMode.get() != ShapeMode.Sides) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/SafeWalk.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/SafeWalk.java index 1fd037e96f..b7180f2d6f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/SafeWalk.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/SafeWalk.java @@ -23,7 +23,7 @@ public class SafeWalk extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); private final Setting fallDistance = sgGeneral.add(new IntSetting.Builder() .name("minimum-fall-distance") @@ -61,14 +61,14 @@ public class SafeWalk extends Module { .build() ); - private final Setting renderEdgeDistance = sgRender.add(new BoolSetting.Builder() + private final Setting renderEdgeDistance = sgVisual.add(new BoolSetting.Builder() .name("render") .defaultValue(false) .visible(sneak::get) .build() ); - private final Setting renderPlayerBox = sgRender.add(new BoolSetting.Builder() + private final Setting renderPlayerBox = sgVisual.add(new BoolSetting.Builder() .name("render-player-box") .defaultValue(false) .visible(() -> sneak.get() && renderEdgeDistance.get()) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java index 52eacc7702..b847ece85c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java @@ -32,7 +32,7 @@ public class Scaffold extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") @@ -134,27 +134,27 @@ public class Scaffold extends Module { // Render - private final Setting render = sgRender.add(new BoolSetting.Builder() + private final Setting render = sgVisual.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .visible(render::get) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(197, 137, 232, 10)) .visible(render::get) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(197, 137, 232)) .visible(render::get) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java index b1785f7ec2..5442400bb7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java @@ -25,7 +25,7 @@ public class InstantRebreak extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); private final Setting tickDelay = sgGeneral.add(new IntSetting.Builder() .name("delay") @@ -49,25 +49,25 @@ public class InstantRebreak extends Module { // Render - private final Setting render = sgRender.add(new BoolSetting.Builder() + private final Setting render = sgVisual.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(204, 0, 0, 10)) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(204, 0, 0, 255)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CityESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CityESP.java index ff809525eb..7d6bd60e00 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CityESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CityESP.java @@ -23,23 +23,23 @@ import net.minecraft.util.math.BlockPos; public class CityESP extends Module { - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); // Render - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(225, 0, 0, 75)) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(225, 0, 0, 255)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HoleESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HoleESP.java index db12ec4155..3ff5e7dee5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HoleESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HoleESP.java @@ -32,7 +32,7 @@ public class HoleESP extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); // General @@ -80,62 +80,62 @@ public class HoleESP extends Module { // Render - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting height = sgRender.add(new DoubleSetting.Builder() + private final Setting height = sgVisual.add(new DoubleSetting.Builder() .name("height") .defaultValue(0.2) .min(0) .build() ); - private final Setting topQuad = sgRender.add(new BoolSetting.Builder() + private final Setting topQuad = sgVisual.add(new BoolSetting.Builder() .name("top-quad") .defaultValue(true) .build() ); - private final Setting bottomQuad = sgRender.add(new BoolSetting.Builder() + private final Setting bottomQuad = sgVisual.add(new BoolSetting.Builder() .name("bottom-quad") .defaultValue(false) .build() ); - private final Setting bedrockColorTop = sgRender.add(new ColorSetting.Builder() + private final Setting bedrockColorTop = sgVisual.add(new ColorSetting.Builder() .name("bedrock-top") .defaultValue(new SettingColor(100, 255, 0, 200)) .build() ); - private final Setting bedrockColorBottom = sgRender.add(new ColorSetting.Builder() + private final Setting bedrockColorBottom = sgVisual.add(new ColorSetting.Builder() .name("bedrock-bottom") .defaultValue(new SettingColor(100, 255, 0, 0)) .build() ); - private final Setting obsidianColorTop = sgRender.add(new ColorSetting.Builder() + private final Setting obsidianColorTop = sgVisual.add(new ColorSetting.Builder() .name("obsidian-top") .defaultValue(new SettingColor(255, 0, 0, 200)) .build() ); - private final Setting obsidianColorBottom = sgRender.add(new ColorSetting.Builder() + private final Setting obsidianColorBottom = sgVisual.add(new ColorSetting.Builder() .name("obsidian-bottom") .defaultValue(new SettingColor(255, 0, 0, 0)) .build() ); - private final Setting mixedColorTop = sgRender.add(new ColorSetting.Builder() + private final Setting mixedColorTop = sgVisual.add(new ColorSetting.Builder() .name("mixed-top") .defaultValue(new SettingColor(255, 127, 0, 200)) .build() ); - private final Setting mixedColorBottom = sgRender.add(new ColorSetting.Builder() + private final Setting mixedColorBottom = sgVisual.add(new ColorSetting.Builder() .name("mixed-bottom") .defaultValue(new SettingColor(255, 127, 0, 0)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java index 153c369073..8127116f50 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java @@ -36,7 +36,7 @@ public class LogoutSpots extends Module { private static final Color RED = new Color(225, 25, 25); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); // General @@ -55,31 +55,31 @@ public class LogoutSpots extends Module { // Render - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(255, 0, 255, 55)) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(255, 0, 255)) .build() ); - private final Setting nameColor = sgRender.add(new ColorSetting.Builder() + private final Setting nameColor = sgVisual.add(new ColorSetting.Builder() .name("name-color") .defaultValue(new SettingColor(255, 255, 255)) .build() ); - private final Setting nameBackgroundColor = sgRender.add(new ColorSetting.Builder() + private final Setting nameBackgroundColor = sgVisual.add(new ColorSetting.Builder() .name("name-background-color") .defaultValue(new SettingColor(0, 0, 0, 75)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java index 78944ccd3c..f58bbef73e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java @@ -51,7 +51,7 @@ public class Nametags extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgPlayers = settings.createGroup("players"); private final SettingGroup sgItems = settings.createGroup("items"); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); // General @@ -218,40 +218,40 @@ public class Nametags extends Module { // Render - private final Setting background = sgRender.add(new ColorSetting.Builder() + private final Setting background = sgVisual.add(new ColorSetting.Builder() .name("background-color") .defaultValue(new SettingColor(0, 0, 0, 75)) .build() ); - private final Setting nameColor = sgRender.add(new ColorSetting.Builder() + private final Setting nameColor = sgVisual.add(new ColorSetting.Builder() .name("name-color") .defaultValue(new SettingColor()) .build() ); - private final Setting pingColor = sgRender.add(new ColorSetting.Builder() + private final Setting pingColor = sgVisual.add(new ColorSetting.Builder() .name("ping-color") .defaultValue(new SettingColor(20, 170, 170)) .visible(displayPing::get) .build() ); - private final Setting gamemodeColor = sgRender.add(new ColorSetting.Builder() + private final Setting gamemodeColor = sgVisual.add(new ColorSetting.Builder() .name("gamemode-color") .defaultValue(new SettingColor(232, 185, 35)) .visible(displayGameMode::get) .build() ); - private final Setting distanceColorMode = sgRender.add(new EnumSetting.Builder() + private final Setting distanceColorMode = sgVisual.add(new EnumSetting.Builder() .name("distance-color-mode") .defaultValue(DistanceColorMode.Gradient) .visible(displayDistance::get) .build() ); - private final Setting distanceColor = sgRender.add(new ColorSetting.Builder() + private final Setting distanceColor = sgVisual.add(new ColorSetting.Builder() .name("distance-color") .defaultValue(new SettingColor(150, 150, 150)) .visible(() -> displayDistance.get() && distanceColorMode.get() == DistanceColorMode.Flat) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java index 658e2e921c..fd5ffed6e2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java @@ -37,7 +37,7 @@ public class Trajectories extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); // General @@ -82,38 +82,38 @@ public class Trajectories extends Module { // Render - private final Setting ignoreFirstTicks = sgRender.add(new IntSetting.Builder() + private final Setting ignoreFirstTicks = sgVisual.add(new IntSetting.Builder() .name("ignore-rendering-first-ticks") .defaultValue(3) .min(0) .build() ); - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(255, 150, 0, 35)) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(255, 150, 0)) .build() ); - private final Setting renderPositionBox = sgRender.add(new BoolSetting.Builder() + private final Setting renderPositionBox = sgVisual.add(new BoolSetting.Builder() .name("render-position-boxes") .defaultValue(false) .build() ); - private final Setting positionBoxSize = sgRender.add(new DoubleSetting.Builder() + private final Setting positionBoxSize = sgVisual.add(new DoubleSetting.Builder() .name("position-box-size") .defaultValue(0.02) .sliderRange(0.01, 0.1) @@ -121,14 +121,14 @@ public class Trajectories extends Module { .build() ); - private final Setting positionSideColor = sgRender.add(new ColorSetting.Builder() + private final Setting positionSideColor = sgVisual.add(new ColorSetting.Builder() .name("position-side-color") .defaultValue(new SettingColor(255, 150, 0, 35)) .visible(renderPositionBox::get) .build() ); - private final Setting positionLineColor = sgRender.add(new ColorSetting.Builder() + private final Setting positionLineColor = sgVisual.add(new ColorSetting.Builder() .name("position-line-color") .defaultValue(new SettingColor(255, 150, 0)) .visible(renderPositionBox::get) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/VoidESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/VoidESP.java index 561e9052e5..228a2870dc 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/VoidESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/VoidESP.java @@ -30,7 +30,7 @@ public class VoidESP extends Module { private static final Direction[] SIDES = {Direction.EAST, Direction.NORTH, Direction.SOUTH, Direction.WEST}; private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); // General @@ -64,19 +64,19 @@ public class VoidESP extends Module { // Render - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("fill-color") .defaultValue(new SettingColor(225, 25, 25, 50)) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(225, 25, 255)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/CuboidMarker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/CuboidMarker.java index e869df4538..02ad8922c7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/CuboidMarker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/CuboidMarker.java @@ -20,7 +20,7 @@ public enum Mode { } private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgVisual = settings.createGroup("Visual").renamedFrom("Render"); // General @@ -38,28 +38,28 @@ public enum Mode { // Render - private final Setting mode = sgRender.add(new EnumSetting.Builder() + private final Setting mode = sgVisual.add(new EnumSetting.Builder() .name("mode") .description("What mode to use for this marker.") .defaultValue(Mode.Full) .build() ); - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .description("The color of the sides of the blocks being rendered.") .defaultValue(new SettingColor(0, 100, 255, 50)) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .description("The color of the lines of the blocks being rendered.") .defaultValue(new SettingColor(0, 100, 255, 255)) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Sphere2dMarker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Sphere2dMarker.java index 53b57e9a48..f14b5efd51 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Sphere2dMarker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Sphere2dMarker.java @@ -33,7 +33,7 @@ public Block(int x, int y, int z) { public static final String type = "Sphere-2D"; private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgVisual = settings.createGroup("Visual").renamedFrom("Render"); private final SettingGroup sgKeybinding = settings.createGroup("Keybinding"); private final Setting center = sgGeneral.add(new BlockPosSetting.Builder() @@ -65,14 +65,14 @@ public Block(int x, int y, int z) { // Render - private final Setting limitRenderRange = sgRender.add(new BoolSetting.Builder() + private final Setting limitRenderRange = sgVisual.add(new BoolSetting.Builder() .name("limit-render-range") .description("Whether to limit rendering range (useful in very large circles)") .defaultValue(false) .build() ); - private final Setting renderRange = sgRender.add(new IntSetting.Builder() + private final Setting renderRange = sgVisual.add(new IntSetting.Builder() .name("render-range") .description("Rendering range") .defaultValue(10) @@ -82,21 +82,21 @@ public Block(int x, int y, int z) { .build() ); - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .description("The color of the sides of the blocks being rendered.") .defaultValue(new SettingColor(0, 100, 255, 50)) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .description("The color of the lines of the blocks being rendered.") .defaultValue(new SettingColor(0, 100, 255, 255)) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java index 7ee661687a..a30c934f70 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java @@ -33,7 +33,7 @@ public class EChestFarmer extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); private final Setting selfToggle = sgGeneral.add(new BoolSetting.Builder() .name("self-toggle") @@ -60,31 +60,31 @@ public class EChestFarmer extends Module { // Render - private final Setting swingHand = sgRender.add(new BoolSetting.Builder() + private final Setting swingHand = sgVisual.add(new BoolSetting.Builder() .name("swing-hand") .defaultValue(true) .build() ); - private final Setting render = sgRender.add(new BoolSetting.Builder() + private final Setting render = sgVisual.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(204, 0, 0, 50)) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(204, 0, 0, 255)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java index f359176d50..4b613d8e61 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java @@ -25,7 +25,7 @@ public class Excavator extends Module { private final IBaritone baritone = BaritoneAPI.getProvider().getPrimaryBaritone(); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRendering = settings.createGroup("rendering"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("rendering"); // Keybindings private final Setting selectionBind = sgGeneral.add(new KeybindSetting.Builder() @@ -48,19 +48,19 @@ public class Excavator extends Module { ); // Rendering - private final Setting shapeMode = sgRendering.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgRendering.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(255, 255, 255, 50)) .build() ); - private final Setting lineColor = sgRendering.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(255, 255, 255, 255)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java index 481517600a..71f25c356c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java @@ -47,7 +47,7 @@ public class Nuker extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgWhitelist = settings.createGroup("whitelist"); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); // General @@ -198,57 +198,57 @@ public class Nuker extends Module { // Rendering - private final Setting swing = sgRender.add(new BoolSetting.Builder() + private final Setting swing = sgVisual.add(new BoolSetting.Builder() .name("swing") .defaultValue(true) .build() ); - private final Setting enableRenderBounding = sgRender.add(new BoolSetting.Builder() + private final Setting enableRenderBounding = sgVisual.add(new BoolSetting.Builder() .name("bounding-box") .defaultValue(true) .build() ); - private final Setting shapeModeBox = sgRender.add(new EnumSetting.Builder() + private final Setting shapeModeBox = sgVisual.add(new EnumSetting.Builder() .name("nuke-box-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColorBox = sgRender.add(new ColorSetting.Builder() + private final Setting sideColorBox = sgVisual.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(16,106,144, 100)) .build() ); - private final Setting lineColorBox = sgRender.add(new ColorSetting.Builder() + private final Setting lineColorBox = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(16,106,144, 255)) .build() ); - private final Setting enableRenderBreaking = sgRender.add(new BoolSetting.Builder() + private final Setting enableRenderBreaking = sgVisual.add(new BoolSetting.Builder() .name("broken-blocks") .defaultValue(true) .build() ); - private final Setting shapeModeBreak = sgRender.add(new EnumSetting.Builder() + private final Setting shapeModeBreak = sgVisual.add(new EnumSetting.Builder() .name("nuke-block-mode") .defaultValue(ShapeMode.Both) .visible(enableRenderBreaking::get) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("breaking-side-color") .defaultValue(new SettingColor(255, 0, 0, 80)) .visible(enableRenderBreaking::get) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("breaking-line-color") .defaultValue(new SettingColor(255, 0, 0, 255)) .visible(enableRenderBreaking::get) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/PacketMine.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/PacketMine.java index a3209d11db..9837fc5300 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/PacketMine.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/PacketMine.java @@ -35,7 +35,7 @@ public class PacketMine extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); // General @@ -73,37 +73,37 @@ public class PacketMine extends Module { // Render - private final Setting render = sgRender.add(new BoolSetting.Builder() + private final Setting render = sgVisual.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting readySideColor = sgRender.add(new ColorSetting.Builder() + private final Setting readySideColor = sgVisual.add(new ColorSetting.Builder() .name("ready-side-color") .defaultValue(new SettingColor(0, 204, 0, 10)) .build() ); - private final Setting readyLineColor = sgRender.add(new ColorSetting.Builder() + private final Setting readyLineColor = sgVisual.add(new ColorSetting.Builder() .name("ready-line-color") .defaultValue(new SettingColor(0, 204, 0, 255)) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(204, 0, 0, 10)) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(204, 0, 0, 255)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java index 3bc9693430..3cdce03aa7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java @@ -51,7 +51,7 @@ public class StashFinder extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); private static final List DEFAULT_SUPPORT_BLOCK_BLACKLIST = List.of( Blocks.OXIDIZED_COPPER, @@ -105,20 +105,20 @@ public class StashFinder extends Module { .build() ); - private final Setting renderTracer = sgRender.add(new BoolSetting.Builder() + private final Setting renderTracer = sgVisual.add(new BoolSetting.Builder() .name("render-tracer") .defaultValue(true) .build() ); - private final Setting traceColor = sgRender.add(new ColorSetting.Builder() + private final Setting traceColor = sgVisual.add(new ColorSetting.Builder() .name("tracer-color") .defaultValue(new SettingColor(255, 215, 0, 255)) .visible(renderTracer::get) .build() ); - private final Setting traceArrivalDistance = sgRender.add(new IntSetting.Builder() + private final Setting traceArrivalDistance = sgVisual.add(new IntSetting.Builder() .name("tracer-hide-at-distance") .defaultValue(16) .min(1) @@ -128,7 +128,7 @@ public class StashFinder extends Module { .build() ); - private final Setting traceMaxDistance = sgRender.add(new IntSetting.Builder() + private final Setting traceMaxDistance = sgVisual.add(new IntSetting.Builder() .name("tracer-max-distance") .defaultValue(2000) .min(10) @@ -138,20 +138,20 @@ public class StashFinder extends Module { .build() ); - private final Setting renderChunkColumn = sgRender.add(new BoolSetting.Builder() + private final Setting renderChunkColumn = sgVisual.add(new BoolSetting.Builder() .name("render-chunk-column") .defaultValue(false) .build() ); - private final Setting traceColumnColor = sgRender.add(new ColorSetting.Builder() + private final Setting traceColumnColor = sgVisual.add(new ColorSetting.Builder() .name("chunk-column-color") .defaultValue(new SettingColor(255, 215, 0, 100)) .visible(renderChunkColumn::get) .build() ); - private final Setting clearTracesBind = sgRender.add(new KeybindSetting.Builder() + private final Setting clearTracesBind = sgVisual.add(new KeybindSetting.Builder() .name("clear-traces-bind") .defaultValue(Keybind.none()) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java index ef7a7ac268..8d13147fe3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java @@ -34,7 +34,7 @@ public class VeinMiner extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); private final Set blockNeighbours = Set.of( new Vec3i(1, -1, 1), new Vec3i(0, -1, 1), new Vec3i(-1, -1, 1), @@ -88,31 +88,31 @@ public class VeinMiner extends Module { // Render - private final Setting swingHand = sgRender.add(new BoolSetting.Builder() + private final Setting swingHand = sgVisual.add(new BoolSetting.Builder() .name("swing-hand") .defaultValue(true) .build() ); - private final Setting render = sgRender.add(new BoolSetting.Builder() + private final Setting render = sgVisual.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(204, 0, 0, 10)) .build() ); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(204, 0, 0, 255)) .build() From b28b0496e051ebca60671546d060cd769b7201a5 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Mon, 5 Jan 2026 19:22:01 -0500 Subject: [PATCH 36/72] dont put setting groups in their module's namespace --- .../gui/DefaultSettingsWidgetFactory.java | 3 +- .../meteorclient/settings/SettingGroup.java | 2 + .../assets/meteor-client/language/en_us.json | 184 +++++++++--------- 3 files changed, 90 insertions(+), 99 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java index 638e57c6d2..6aa01dbb88 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java @@ -103,8 +103,7 @@ protected double settingTitleTopMargin() { } private void group(WVerticalList list, SettingGroup group, String filter, List removeInfoList, String baseKey) { - String groupKey = group.name.equals("general") ? "module.base.general" : baseKey + "." + group.name; - WSection section = list.add(theme.section(MeteorTranslations.translate(groupKey, group.name), group.sectionExpanded)).expandX().widget(); + WSection section = list.add(theme.section(MeteorTranslations.translate(group.translationKey), group.sectionExpanded)).expandX().widget(); section.action = () -> group.sectionExpanded = section.isExpanded(); WTable table = section.add(theme.table()).expandX().widget(); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java b/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java index dfa00a5d44..b2fe870d3a 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java @@ -19,6 +19,7 @@ public class SettingGroup implements ISerializable, Iterable> { public final String name; + public final String translationKey; public boolean sectionExpanded; public @Nullable String oldName; @@ -26,6 +27,7 @@ public class SettingGroup implements ISerializable, Iterable Date: Mon, 5 Jan 2026 19:22:11 -0500 Subject: [PATCH 37/72] Revert "rename 'Render' setting groups to 'Visual'" This reverts commit c6f36cf3119487bd0da6102e215f6640364ab692. --- .../systems/modules/combat/AnchorAura.java | 12 +++---- .../systems/modules/combat/AutoCity.java | 12 +++---- .../systems/modules/combat/AutoTrap.java | 14 ++++---- .../systems/modules/combat/AutoWeb.java | 10 +++--- .../systems/modules/combat/BedAura.java | 12 +++---- .../systems/modules/combat/CrystalAura.java | 32 +++++++++---------- .../systems/modules/combat/HoleFiller.java | 16 +++++----- .../systems/modules/combat/SelfTrap.java | 10 +++--- .../systems/modules/combat/Surround.java | 22 ++++++------- .../systems/modules/movement/SafeWalk.java | 6 ++-- .../systems/modules/movement/Scaffold.java | 10 +++--- .../modules/player/InstantRebreak.java | 10 +++--- .../systems/modules/render/CityESP.java | 8 ++--- .../systems/modules/render/HoleESP.java | 22 ++++++------- .../systems/modules/render/LogoutSpots.java | 12 +++---- .../systems/modules/render/Nametags.java | 14 ++++---- .../systems/modules/render/Trajectories.java | 18 +++++------ .../systems/modules/render/VoidESP.java | 8 ++--- .../modules/render/marker/CuboidMarker.java | 10 +++--- .../modules/render/marker/Sphere2dMarker.java | 12 +++---- .../systems/modules/world/EChestFarmer.java | 12 +++---- .../systems/modules/world/Excavator.java | 8 ++--- .../systems/modules/world/Nuker.java | 20 ++++++------ .../systems/modules/world/PacketMine.java | 14 ++++---- .../systems/modules/world/StashFinder.java | 16 +++++----- .../systems/modules/world/VeinMiner.java | 12 +++---- 26 files changed, 176 insertions(+), 176 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java index 905ae3e520..4ec0336548 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java @@ -42,7 +42,7 @@ public class AnchorAura extends Module { private final SettingGroup sgPlace = settings.createGroup("place"); private final SettingGroup sgBreak = settings.createGroup("break"); private final SettingGroup sgPause = settings.createGroup("pause"); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General @@ -187,33 +187,33 @@ public class AnchorAura extends Module { // Render - private final Setting swing = sgVisual.add(new BoolSetting.Builder() + private final Setting swing = sgRender.add(new BoolSetting.Builder() .name("swing") .defaultValue(true) .build() ); - private final Setting render = sgVisual.add(new BoolSetting.Builder() + private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .visible(render::get) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(15, 255, 211, 41)) .visible(() -> render.get() && shapeMode.get().sides()) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(15, 255, 211)) .visible(() -> render.get() && shapeMode.get().lines()) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java index e93829d849..8a4293619b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java @@ -31,7 +31,7 @@ public class AutoCity extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); private final Setting targetRange = sgGeneral.add(new DoubleSetting.Builder() @@ -85,33 +85,33 @@ public class AutoCity extends Module { // Render - private final Setting swingHand = sgVisual.add(new BoolSetting.Builder() + private final Setting swingHand = sgRender.add(new BoolSetting.Builder() .name("swing-hand") .defaultValue(false) .build() ); - private final Setting renderBlock = sgVisual.add(new BoolSetting.Builder() + private final Setting renderBlock = sgRender.add(new BoolSetting.Builder() .name("render-block") .defaultValue(true) .build() ); - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .visible(renderBlock::get) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(225, 0, 0, 75)) .visible(() -> renderBlock.get() && shapeMode.get().sides()) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(225, 0, 0, 255)) .visible(() -> renderBlock.get() && shapeMode.get().lines()) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java index 4b627f6798..1a4c69071d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java @@ -39,7 +39,7 @@ public class AutoTrap extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General @@ -118,41 +118,41 @@ public class AutoTrap extends Module { // Render - private final Setting render = sgVisual.add(new BoolSetting.Builder() + private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .visible(render::get) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(197, 137, 232, 10)) .visible(() -> render.get() && shapeMode.get().sides()) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(197, 137, 232)) .visible(() -> render.get() && shapeMode.get().lines()) .build() ); - private final Setting nextSideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting nextSideColor = sgRender.add(new ColorSetting.Builder() .name("next-side-color") .defaultValue(new SettingColor(227, 196, 245, 10)) .visible(() -> render.get() && shapeMode.get().sides()) .build() ); - private final Setting nextLineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting nextLineColor = sgRender.add(new ColorSetting.Builder() .name("next-line-color") .defaultValue(new SettingColor(5, 139, 221)) .visible(() -> render.get() && shapeMode.get().lines()) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeb.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeb.java index b03b491587..735f598989 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeb.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeb.java @@ -31,7 +31,7 @@ public class AutoWeb extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); private final Setting placeRange = sgGeneral.add(new DoubleSetting.Builder() .name("place-range") @@ -92,27 +92,27 @@ public class AutoWeb extends Module { // Render - private final Setting render = sgVisual.add(new BoolSetting.Builder() + private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .visible(render::get) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(239, 231, 244, 31)) .visible(() -> render.get() && shapeMode.get().sides()) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(255, 255, 255)) .visible(() -> render.get() && shapeMode.get().lines()) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java index 0bd9fd556c..930f1fe5b9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java @@ -41,7 +41,7 @@ public class BedAura extends Module { private final SettingGroup sgTargeting = settings.createGroup("targeting"); private final SettingGroup sgAutoMove = settings.createGroup("inventory"); private final SettingGroup sgPause = settings.createGroup("pause"); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General @@ -142,31 +142,31 @@ public class BedAura extends Module { // Render - private final Setting swing = sgVisual.add(new BoolSetting.Builder() + private final Setting swing = sgRender.add(new BoolSetting.Builder() .name("swing") .defaultValue(true) .build() ); - private final Setting render = sgVisual.add(new BoolSetting.Builder() + private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(15, 255, 211,75)) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(15, 255, 211)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java index c4357af0c4..5fb24d3c90 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java @@ -73,7 +73,7 @@ public class CrystalAura extends Module { private final SettingGroup sgFacePlace = settings.createGroup("face-place"); private final SettingGroup sgBreak = settings.createGroup("break"); private final SettingGroup sgPause = settings.createGroup("pause"); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General @@ -382,26 +382,26 @@ public class CrystalAura extends Module { // Render - public final Setting swingMode = sgVisual.add(new EnumSetting.Builder() + public final Setting swingMode = sgRender.add(new EnumSetting.Builder() .name("swing-mode") .defaultValue(SwingMode.Both) .build() ); - private final Setting renderMode = sgVisual.add(new EnumSetting.Builder() + private final Setting renderMode = sgRender.add(new EnumSetting.Builder() .name("render-mode") .defaultValue(RenderMode.Normal) .build() ); - private final Setting renderPlace = sgVisual.add(new BoolSetting.Builder() + private final Setting renderPlace = sgRender.add(new BoolSetting.Builder() .name("render-place") .defaultValue(true) .visible(() -> renderMode.get() == RenderMode.Normal) .build() ); - private final Setting placeRenderTime = sgVisual.add(new IntSetting.Builder() + private final Setting placeRenderTime = sgRender.add(new IntSetting.Builder() .name("place-time") .defaultValue(10) .min(0) @@ -410,14 +410,14 @@ public class CrystalAura extends Module { .build() ); - private final Setting renderBreak = sgVisual.add(new BoolSetting.Builder() + private final Setting renderBreak = sgRender.add(new BoolSetting.Builder() .name("render-break") .defaultValue(false) .visible(() -> renderMode.get() == RenderMode.Normal) .build() ); - private final Setting breakRenderTime = sgVisual.add(new IntSetting.Builder() + private final Setting breakRenderTime = sgRender.add(new IntSetting.Builder() .name("break-time") .defaultValue(13) .min(0) @@ -426,7 +426,7 @@ public class CrystalAura extends Module { .build() ); - private final Setting smoothness = sgVisual.add(new IntSetting.Builder() + private final Setting smoothness = sgRender.add(new IntSetting.Builder() .name("smoothness") .defaultValue(10) .min(0) @@ -435,7 +435,7 @@ public class CrystalAura extends Module { .build() ); - private final Setting height = sgVisual.add(new DoubleSetting.Builder() + private final Setting height = sgRender.add(new DoubleSetting.Builder() .name("height") .defaultValue(0.7) .min(0) @@ -444,7 +444,7 @@ public class CrystalAura extends Module { .build() ); - private final Setting renderTime = sgVisual.add(new IntSetting.Builder() + private final Setting renderTime = sgRender.add(new IntSetting.Builder() .name("render-time") .defaultValue(10) .min(0) @@ -453,42 +453,42 @@ public class CrystalAura extends Module { .build() ); - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .visible(() -> renderMode.get() != RenderMode.None) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(255, 255, 255, 45)) .visible(() -> shapeMode.get().sides() && renderMode.get() != RenderMode.None) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(255, 255, 255)) .visible(() -> shapeMode.get().lines() && renderMode.get() != RenderMode.None) .build() ); - private final Setting renderDamageText = sgVisual.add(new BoolSetting.Builder() + private final Setting renderDamageText = sgRender.add(new BoolSetting.Builder() .name("damage") .defaultValue(true) .visible(() -> renderMode.get() != RenderMode.None) .build() ); - private final Setting damageColor = sgVisual.add(new ColorSetting.Builder() + private final Setting damageColor = sgRender.add(new ColorSetting.Builder() .name("damage-color") .defaultValue(new SettingColor(255, 255, 255)) .visible(() -> renderMode.get() != RenderMode.None && renderDamageText.get()) .build() ); - private final Setting damageTextScale = sgVisual.add(new DoubleSetting.Builder() + private final Setting damageTextScale = sgRender.add(new DoubleSetting.Builder() .name("damage-scale") .defaultValue(1.25) .min(1) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java index 6c947398c1..987be62c9d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java @@ -40,7 +40,7 @@ public class HoleFiller extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgSmart = settings.createGroup("smart"); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") @@ -170,47 +170,47 @@ public class HoleFiller extends Module { // Render - private final Setting swing = sgVisual.add(new BoolSetting.Builder() + private final Setting swing = sgRender.add(new BoolSetting.Builder() .name("swing") .defaultValue(true) .build() ); - private final Setting render = sgVisual.add(new BoolSetting.Builder() + private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .visible(render::get) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(197, 137, 232, 10)) .visible(() -> render.get() && shapeMode.get().sides()) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(197, 137, 232)) .visible(() -> render.get() && shapeMode.get().lines()) .build() ); - private final Setting nextSideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting nextSideColor = sgRender.add(new ColorSetting.Builder() .name("next-side-color") .defaultValue(new SettingColor(227, 196, 245, 10)) .visible(() -> render.get() && shapeMode.get().sides()) .build() ); - private final Setting nextLineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting nextLineColor = sgRender.add(new ColorSetting.Builder() .name("next-line-color") .defaultValue(new SettingColor(5, 139, 221)) .visible(() -> render.get() && shapeMode.get().lines()) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java index 55bfde039d..f1affec325 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java @@ -39,7 +39,7 @@ public enum BottomMode { } private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General @@ -87,25 +87,25 @@ public enum BottomMode { // Render - private final Setting render = sgVisual.add(new BoolSetting.Builder() + private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(204, 0, 0, 10)) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(204, 0, 0, 255)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java index f1a800fe8e..a511033975 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java @@ -45,7 +45,7 @@ public class Surround extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgToggles = settings.createGroup("toggles"); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General @@ -147,66 +147,66 @@ public class Surround extends Module { // Render - private final Setting swing = sgVisual.add(new BoolSetting.Builder() + private final Setting swing = sgRender.add(new BoolSetting.Builder() .name("swing") .defaultValue(true) .build() ); - private final Setting render = sgVisual.add(new BoolSetting.Builder() + private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting renderBelow = sgVisual.add(new BoolSetting.Builder() + private final Setting renderBelow = sgRender.add(new BoolSetting.Builder() .name("below") .defaultValue(false) .build() ); - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting safeSideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting safeSideColor = sgRender.add(new ColorSetting.Builder() .name("safe-side-color") .defaultValue(new SettingColor(13, 255, 0, 0)) .visible(() -> render.get() && shapeMode.get() != ShapeMode.Lines) .build() ); - private final Setting safeLineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting safeLineColor = sgRender.add(new ColorSetting.Builder() .name("safe-line-color") .defaultValue(new SettingColor(13, 255, 0, 0)) .visible(() -> render.get() && shapeMode.get() != ShapeMode.Sides) .build() ); - private final Setting normalSideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting normalSideColor = sgRender.add(new ColorSetting.Builder() .name("normal-side-color") .defaultValue(new SettingColor(0, 255, 238, 12)) .visible(() -> render.get() && shapeMode.get() != ShapeMode.Lines) .build() ); - private final Setting normalLineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting normalLineColor = sgRender.add(new ColorSetting.Builder() .name("normal-line-color") .defaultValue(new SettingColor(0, 255, 238, 100)) .visible(() -> render.get() && shapeMode.get() != ShapeMode.Sides) .build() ); - private final Setting unsafeSideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting unsafeSideColor = sgRender.add(new ColorSetting.Builder() .name("unsafe-side-color") .defaultValue(new SettingColor(204, 0, 0, 12)) .visible(() -> render.get() && shapeMode.get() != ShapeMode.Lines) .build() ); - private final Setting unsafeLineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting unsafeLineColor = sgRender.add(new ColorSetting.Builder() .name("unsafe-line-color") .defaultValue(new SettingColor(204, 0, 0, 100)) .visible(() -> render.get() && shapeMode.get() != ShapeMode.Sides) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/SafeWalk.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/SafeWalk.java index b7180f2d6f..1fd037e96f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/SafeWalk.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/SafeWalk.java @@ -23,7 +23,7 @@ public class SafeWalk extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); private final Setting fallDistance = sgGeneral.add(new IntSetting.Builder() .name("minimum-fall-distance") @@ -61,14 +61,14 @@ public class SafeWalk extends Module { .build() ); - private final Setting renderEdgeDistance = sgVisual.add(new BoolSetting.Builder() + private final Setting renderEdgeDistance = sgRender.add(new BoolSetting.Builder() .name("render") .defaultValue(false) .visible(sneak::get) .build() ); - private final Setting renderPlayerBox = sgVisual.add(new BoolSetting.Builder() + private final Setting renderPlayerBox = sgRender.add(new BoolSetting.Builder() .name("render-player-box") .defaultValue(false) .visible(() -> sneak.get() && renderEdgeDistance.get()) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java index b847ece85c..52eacc7702 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java @@ -32,7 +32,7 @@ public class Scaffold extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") @@ -134,27 +134,27 @@ public class Scaffold extends Module { // Render - private final Setting render = sgVisual.add(new BoolSetting.Builder() + private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .visible(render::get) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(197, 137, 232, 10)) .visible(render::get) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(197, 137, 232)) .visible(render::get) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java index 5442400bb7..b1785f7ec2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java @@ -25,7 +25,7 @@ public class InstantRebreak extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); private final Setting tickDelay = sgGeneral.add(new IntSetting.Builder() .name("delay") @@ -49,25 +49,25 @@ public class InstantRebreak extends Module { // Render - private final Setting render = sgVisual.add(new BoolSetting.Builder() + private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(204, 0, 0, 10)) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(204, 0, 0, 255)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CityESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CityESP.java index 7d6bd60e00..ff809525eb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CityESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CityESP.java @@ -23,23 +23,23 @@ import net.minecraft.util.math.BlockPos; public class CityESP extends Module { - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); // Render - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(225, 0, 0, 75)) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(225, 0, 0, 255)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HoleESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HoleESP.java index 3ff5e7dee5..db12ec4155 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HoleESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HoleESP.java @@ -32,7 +32,7 @@ public class HoleESP extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General @@ -80,62 +80,62 @@ public class HoleESP extends Module { // Render - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting height = sgVisual.add(new DoubleSetting.Builder() + private final Setting height = sgRender.add(new DoubleSetting.Builder() .name("height") .defaultValue(0.2) .min(0) .build() ); - private final Setting topQuad = sgVisual.add(new BoolSetting.Builder() + private final Setting topQuad = sgRender.add(new BoolSetting.Builder() .name("top-quad") .defaultValue(true) .build() ); - private final Setting bottomQuad = sgVisual.add(new BoolSetting.Builder() + private final Setting bottomQuad = sgRender.add(new BoolSetting.Builder() .name("bottom-quad") .defaultValue(false) .build() ); - private final Setting bedrockColorTop = sgVisual.add(new ColorSetting.Builder() + private final Setting bedrockColorTop = sgRender.add(new ColorSetting.Builder() .name("bedrock-top") .defaultValue(new SettingColor(100, 255, 0, 200)) .build() ); - private final Setting bedrockColorBottom = sgVisual.add(new ColorSetting.Builder() + private final Setting bedrockColorBottom = sgRender.add(new ColorSetting.Builder() .name("bedrock-bottom") .defaultValue(new SettingColor(100, 255, 0, 0)) .build() ); - private final Setting obsidianColorTop = sgVisual.add(new ColorSetting.Builder() + private final Setting obsidianColorTop = sgRender.add(new ColorSetting.Builder() .name("obsidian-top") .defaultValue(new SettingColor(255, 0, 0, 200)) .build() ); - private final Setting obsidianColorBottom = sgVisual.add(new ColorSetting.Builder() + private final Setting obsidianColorBottom = sgRender.add(new ColorSetting.Builder() .name("obsidian-bottom") .defaultValue(new SettingColor(255, 0, 0, 0)) .build() ); - private final Setting mixedColorTop = sgVisual.add(new ColorSetting.Builder() + private final Setting mixedColorTop = sgRender.add(new ColorSetting.Builder() .name("mixed-top") .defaultValue(new SettingColor(255, 127, 0, 200)) .build() ); - private final Setting mixedColorBottom = sgVisual.add(new ColorSetting.Builder() + private final Setting mixedColorBottom = sgRender.add(new ColorSetting.Builder() .name("mixed-bottom") .defaultValue(new SettingColor(255, 127, 0, 0)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java index 8127116f50..153c369073 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/LogoutSpots.java @@ -36,7 +36,7 @@ public class LogoutSpots extends Module { private static final Color RED = new Color(225, 25, 25); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General @@ -55,31 +55,31 @@ public class LogoutSpots extends Module { // Render - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(255, 0, 255, 55)) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(255, 0, 255)) .build() ); - private final Setting nameColor = sgVisual.add(new ColorSetting.Builder() + private final Setting nameColor = sgRender.add(new ColorSetting.Builder() .name("name-color") .defaultValue(new SettingColor(255, 255, 255)) .build() ); - private final Setting nameBackgroundColor = sgVisual.add(new ColorSetting.Builder() + private final Setting nameBackgroundColor = sgRender.add(new ColorSetting.Builder() .name("name-background-color") .defaultValue(new SettingColor(0, 0, 0, 75)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java index f58bbef73e..78944ccd3c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java @@ -51,7 +51,7 @@ public class Nametags extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgPlayers = settings.createGroup("players"); private final SettingGroup sgItems = settings.createGroup("items"); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General @@ -218,40 +218,40 @@ public class Nametags extends Module { // Render - private final Setting background = sgVisual.add(new ColorSetting.Builder() + private final Setting background = sgRender.add(new ColorSetting.Builder() .name("background-color") .defaultValue(new SettingColor(0, 0, 0, 75)) .build() ); - private final Setting nameColor = sgVisual.add(new ColorSetting.Builder() + private final Setting nameColor = sgRender.add(new ColorSetting.Builder() .name("name-color") .defaultValue(new SettingColor()) .build() ); - private final Setting pingColor = sgVisual.add(new ColorSetting.Builder() + private final Setting pingColor = sgRender.add(new ColorSetting.Builder() .name("ping-color") .defaultValue(new SettingColor(20, 170, 170)) .visible(displayPing::get) .build() ); - private final Setting gamemodeColor = sgVisual.add(new ColorSetting.Builder() + private final Setting gamemodeColor = sgRender.add(new ColorSetting.Builder() .name("gamemode-color") .defaultValue(new SettingColor(232, 185, 35)) .visible(displayGameMode::get) .build() ); - private final Setting distanceColorMode = sgVisual.add(new EnumSetting.Builder() + private final Setting distanceColorMode = sgRender.add(new EnumSetting.Builder() .name("distance-color-mode") .defaultValue(DistanceColorMode.Gradient) .visible(displayDistance::get) .build() ); - private final Setting distanceColor = sgVisual.add(new ColorSetting.Builder() + private final Setting distanceColor = sgRender.add(new ColorSetting.Builder() .name("distance-color") .defaultValue(new SettingColor(150, 150, 150)) .visible(() -> displayDistance.get() && distanceColorMode.get() == DistanceColorMode.Flat) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java index fd5ffed6e2..658e2e921c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java @@ -37,7 +37,7 @@ public class Trajectories extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General @@ -82,38 +82,38 @@ public class Trajectories extends Module { // Render - private final Setting ignoreFirstTicks = sgVisual.add(new IntSetting.Builder() + private final Setting ignoreFirstTicks = sgRender.add(new IntSetting.Builder() .name("ignore-rendering-first-ticks") .defaultValue(3) .min(0) .build() ); - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(255, 150, 0, 35)) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(255, 150, 0)) .build() ); - private final Setting renderPositionBox = sgVisual.add(new BoolSetting.Builder() + private final Setting renderPositionBox = sgRender.add(new BoolSetting.Builder() .name("render-position-boxes") .defaultValue(false) .build() ); - private final Setting positionBoxSize = sgVisual.add(new DoubleSetting.Builder() + private final Setting positionBoxSize = sgRender.add(new DoubleSetting.Builder() .name("position-box-size") .defaultValue(0.02) .sliderRange(0.01, 0.1) @@ -121,14 +121,14 @@ public class Trajectories extends Module { .build() ); - private final Setting positionSideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting positionSideColor = sgRender.add(new ColorSetting.Builder() .name("position-side-color") .defaultValue(new SettingColor(255, 150, 0, 35)) .visible(renderPositionBox::get) .build() ); - private final Setting positionLineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting positionLineColor = sgRender.add(new ColorSetting.Builder() .name("position-line-color") .defaultValue(new SettingColor(255, 150, 0)) .visible(renderPositionBox::get) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/VoidESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/VoidESP.java index 228a2870dc..561e9052e5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/VoidESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/VoidESP.java @@ -30,7 +30,7 @@ public class VoidESP extends Module { private static final Direction[] SIDES = {Direction.EAST, Direction.NORTH, Direction.SOUTH, Direction.WEST}; private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General @@ -64,19 +64,19 @@ public class VoidESP extends Module { // Render - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("fill-color") .defaultValue(new SettingColor(225, 25, 25, 50)) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(225, 25, 255)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/CuboidMarker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/CuboidMarker.java index 02ad8922c7..e869df4538 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/CuboidMarker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/CuboidMarker.java @@ -20,7 +20,7 @@ public enum Mode { } private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("Visual").renamedFrom("Render"); + private final SettingGroup sgRender = settings.createGroup("Render"); // General @@ -38,28 +38,28 @@ public enum Mode { // Render - private final Setting mode = sgVisual.add(new EnumSetting.Builder() + private final Setting mode = sgRender.add(new EnumSetting.Builder() .name("mode") .description("What mode to use for this marker.") .defaultValue(Mode.Full) .build() ); - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") .description("The color of the sides of the blocks being rendered.") .defaultValue(new SettingColor(0, 100, 255, 50)) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .description("The color of the lines of the blocks being rendered.") .defaultValue(new SettingColor(0, 100, 255, 255)) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Sphere2dMarker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Sphere2dMarker.java index f14b5efd51..53b57e9a48 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Sphere2dMarker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Sphere2dMarker.java @@ -33,7 +33,7 @@ public Block(int x, int y, int z) { public static final String type = "Sphere-2D"; private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("Visual").renamedFrom("Render"); + private final SettingGroup sgRender = settings.createGroup("Render"); private final SettingGroup sgKeybinding = settings.createGroup("Keybinding"); private final Setting center = sgGeneral.add(new BlockPosSetting.Builder() @@ -65,14 +65,14 @@ public Block(int x, int y, int z) { // Render - private final Setting limitRenderRange = sgVisual.add(new BoolSetting.Builder() + private final Setting limitRenderRange = sgRender.add(new BoolSetting.Builder() .name("limit-render-range") .description("Whether to limit rendering range (useful in very large circles)") .defaultValue(false) .build() ); - private final Setting renderRange = sgVisual.add(new IntSetting.Builder() + private final Setting renderRange = sgRender.add(new IntSetting.Builder() .name("render-range") .description("Rendering range") .defaultValue(10) @@ -82,21 +82,21 @@ public Block(int x, int y, int z) { .build() ); - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") .description("The color of the sides of the blocks being rendered.") .defaultValue(new SettingColor(0, 100, 255, 50)) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .description("The color of the lines of the blocks being rendered.") .defaultValue(new SettingColor(0, 100, 255, 255)) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java index a30c934f70..7ee661687a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EChestFarmer.java @@ -33,7 +33,7 @@ public class EChestFarmer extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); private final Setting selfToggle = sgGeneral.add(new BoolSetting.Builder() .name("self-toggle") @@ -60,31 +60,31 @@ public class EChestFarmer extends Module { // Render - private final Setting swingHand = sgVisual.add(new BoolSetting.Builder() + private final Setting swingHand = sgRender.add(new BoolSetting.Builder() .name("swing-hand") .defaultValue(true) .build() ); - private final Setting render = sgVisual.add(new BoolSetting.Builder() + private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(204, 0, 0, 50)) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(204, 0, 0, 255)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java index 4b613d8e61..f359176d50 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java @@ -25,7 +25,7 @@ public class Excavator extends Module { private final IBaritone baritone = BaritoneAPI.getProvider().getPrimaryBaritone(); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("rendering"); + private final SettingGroup sgRendering = settings.createGroup("rendering"); // Keybindings private final Setting selectionBind = sgGeneral.add(new KeybindSetting.Builder() @@ -48,19 +48,19 @@ public class Excavator extends Module { ); // Rendering - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRendering.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRendering.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(255, 255, 255, 50)) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRendering.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(255, 255, 255, 255)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java index 71f25c356c..481517600a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java @@ -47,7 +47,7 @@ public class Nuker extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgWhitelist = settings.createGroup("whitelist"); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General @@ -198,57 +198,57 @@ public class Nuker extends Module { // Rendering - private final Setting swing = sgVisual.add(new BoolSetting.Builder() + private final Setting swing = sgRender.add(new BoolSetting.Builder() .name("swing") .defaultValue(true) .build() ); - private final Setting enableRenderBounding = sgVisual.add(new BoolSetting.Builder() + private final Setting enableRenderBounding = sgRender.add(new BoolSetting.Builder() .name("bounding-box") .defaultValue(true) .build() ); - private final Setting shapeModeBox = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeModeBox = sgRender.add(new EnumSetting.Builder() .name("nuke-box-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColorBox = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColorBox = sgRender.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(16,106,144, 100)) .build() ); - private final Setting lineColorBox = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColorBox = sgRender.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(16,106,144, 255)) .build() ); - private final Setting enableRenderBreaking = sgVisual.add(new BoolSetting.Builder() + private final Setting enableRenderBreaking = sgRender.add(new BoolSetting.Builder() .name("broken-blocks") .defaultValue(true) .build() ); - private final Setting shapeModeBreak = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeModeBreak = sgRender.add(new EnumSetting.Builder() .name("nuke-block-mode") .defaultValue(ShapeMode.Both) .visible(enableRenderBreaking::get) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("breaking-side-color") .defaultValue(new SettingColor(255, 0, 0, 80)) .visible(enableRenderBreaking::get) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("breaking-line-color") .defaultValue(new SettingColor(255, 0, 0, 255)) .visible(enableRenderBreaking::get) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/PacketMine.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/PacketMine.java index 9837fc5300..a3209d11db 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/PacketMine.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/PacketMine.java @@ -35,7 +35,7 @@ public class PacketMine extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General @@ -73,37 +73,37 @@ public class PacketMine extends Module { // Render - private final Setting render = sgVisual.add(new BoolSetting.Builder() + private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting readySideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting readySideColor = sgRender.add(new ColorSetting.Builder() .name("ready-side-color") .defaultValue(new SettingColor(0, 204, 0, 10)) .build() ); - private final Setting readyLineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting readyLineColor = sgRender.add(new ColorSetting.Builder() .name("ready-line-color") .defaultValue(new SettingColor(0, 204, 0, 255)) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(204, 0, 0, 10)) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(204, 0, 0, 255)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java index 3cdce03aa7..3bc9693430 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java @@ -51,7 +51,7 @@ public class StashFinder extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); private static final List DEFAULT_SUPPORT_BLOCK_BLACKLIST = List.of( Blocks.OXIDIZED_COPPER, @@ -105,20 +105,20 @@ public class StashFinder extends Module { .build() ); - private final Setting renderTracer = sgVisual.add(new BoolSetting.Builder() + private final Setting renderTracer = sgRender.add(new BoolSetting.Builder() .name("render-tracer") .defaultValue(true) .build() ); - private final Setting traceColor = sgVisual.add(new ColorSetting.Builder() + private final Setting traceColor = sgRender.add(new ColorSetting.Builder() .name("tracer-color") .defaultValue(new SettingColor(255, 215, 0, 255)) .visible(renderTracer::get) .build() ); - private final Setting traceArrivalDistance = sgVisual.add(new IntSetting.Builder() + private final Setting traceArrivalDistance = sgRender.add(new IntSetting.Builder() .name("tracer-hide-at-distance") .defaultValue(16) .min(1) @@ -128,7 +128,7 @@ public class StashFinder extends Module { .build() ); - private final Setting traceMaxDistance = sgVisual.add(new IntSetting.Builder() + private final Setting traceMaxDistance = sgRender.add(new IntSetting.Builder() .name("tracer-max-distance") .defaultValue(2000) .min(10) @@ -138,20 +138,20 @@ public class StashFinder extends Module { .build() ); - private final Setting renderChunkColumn = sgVisual.add(new BoolSetting.Builder() + private final Setting renderChunkColumn = sgRender.add(new BoolSetting.Builder() .name("render-chunk-column") .defaultValue(false) .build() ); - private final Setting traceColumnColor = sgVisual.add(new ColorSetting.Builder() + private final Setting traceColumnColor = sgRender.add(new ColorSetting.Builder() .name("chunk-column-color") .defaultValue(new SettingColor(255, 215, 0, 100)) .visible(renderChunkColumn::get) .build() ); - private final Setting clearTracesBind = sgVisual.add(new KeybindSetting.Builder() + private final Setting clearTracesBind = sgRender.add(new KeybindSetting.Builder() .name("clear-traces-bind") .defaultValue(Keybind.none()) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java index 8d13147fe3..ef7a7ac268 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java @@ -34,7 +34,7 @@ public class VeinMiner extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("visual").renamedFrom("render"); + private final SettingGroup sgRender = settings.createGroup("render"); private final Set blockNeighbours = Set.of( new Vec3i(1, -1, 1), new Vec3i(0, -1, 1), new Vec3i(-1, -1, 1), @@ -88,31 +88,31 @@ public class VeinMiner extends Module { // Render - private final Setting swingHand = sgVisual.add(new BoolSetting.Builder() + private final Setting swingHand = sgRender.add(new BoolSetting.Builder() .name("swing-hand") .defaultValue(true) .build() ); - private final Setting render = sgVisual.add(new BoolSetting.Builder() + private final Setting render = sgRender.add(new BoolSetting.Builder() .name("render") .defaultValue(true) .build() ); - private final Setting shapeMode = sgVisual.add(new EnumSetting.Builder() + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") .defaultValue(ShapeMode.Both) .build() ); - private final Setting sideColor = sgVisual.add(new ColorSetting.Builder() + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") .defaultValue(new SettingColor(204, 0, 0, 10)) .build() ); - private final Setting lineColor = sgVisual.add(new ColorSetting.Builder() + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") .defaultValue(new SettingColor(204, 0, 0, 255)) .build() From 97cfd458760c9c8f81626167c68e197ea9ee8666 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Mon, 5 Jan 2026 19:28:42 -0500 Subject: [PATCH 38/72] map categories --- .../commands/commands/ModulesCommand.java | 2 +- .../meteorclient/gui/screens/ModulesScreen.java | 2 +- .../meteorclient/systems/modules/Categories.java | 12 ++++++------ .../meteorclient/systems/modules/Category.java | 9 ++++++++- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java index e677da9b73..b3aaf85cf6 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java @@ -29,7 +29,7 @@ public void build(LiteralArgumentBuilder builder) { Modules.loopCategories().forEach(category -> { MutableText categoryMessage = Text.literal(""); Modules.get().getGroup(category).forEach(module -> categoryMessage.append(getModuleText(module))); - ChatUtils.sendMsg(category.name, categoryMessage); + ChatUtils.sendMsg(category.getName(), categoryMessage); // todo }); return SINGLE_SUCCESS; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java index a20aac7c9d..4610674f07 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java @@ -86,7 +86,7 @@ protected void init() { // Category protected WWindow createCategory(WContainer c, Category category, List moduleList) { - WWindow w = theme.window(category.name); + WWindow w = theme.window(category.getName()); w.id = category.name; w.padding = 0; w.spacing = 0; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Categories.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Categories.java index 5ff0101feb..6ef58af416 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Categories.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Categories.java @@ -10,12 +10,12 @@ import net.minecraft.item.Items; public class Categories { - public static final Category Combat = new Category("Combat", Items.GOLDEN_SWORD.getDefaultStack()); - public static final Category Player = new Category("Player", Items.ARMOR_STAND.getDefaultStack()); - public static final Category Movement = new Category("Movement", Items.DIAMOND_BOOTS.getDefaultStack()); - public static final Category Render = new Category("Render", Items.GLASS.getDefaultStack()); - public static final Category World = new Category("World", Items.GRASS_BLOCK.getDefaultStack()); - public static final Category Misc = new Category("Misc", Items.LAVA_BUCKET.getDefaultStack()); + public static final Category Combat = new Category("combat", Items.GOLDEN_SWORD.getDefaultStack()); + public static final Category Player = new Category("player", Items.ARMOR_STAND.getDefaultStack()); + public static final Category Movement = new Category("movement", Items.DIAMOND_BOOTS.getDefaultStack()); + public static final Category Render = new Category("render", Items.GLASS.getDefaultStack()); + public static final Category World = new Category("world", Items.GRASS_BLOCK.getDefaultStack()); + public static final Category Misc = new Category("misc", Items.LAVA_BUCKET.getDefaultStack()); public static boolean REGISTERING; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Category.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Category.java index 0deefe861c..69688550ab 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Category.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Category.java @@ -5,16 +5,19 @@ package meteordevelopment.meteorclient.systems.modules; +import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; public class Category { public final String name; + private final String translationKey; public final ItemStack icon; private final int nameHash; public Category(String name, ItemStack icon) { this.name = name; + this.translationKey = "category." + name; this.nameHash = name.hashCode(); this.icon = icon == null ? Items.AIR.getDefaultStack() : icon; } @@ -22,9 +25,13 @@ public Category(String name) { this(name, null); } + public String getName() { + return MeteorTranslations.translate(this.translationKey); + } + @Override public String toString() { - return name; + return this.getName(); } @Override From 4c517a9d58f0cff654e52c2ae7540a8783e5e552 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Mon, 5 Jan 2026 19:33:25 -0500 Subject: [PATCH 39/72] warn on missing keys --- .../meteorclient/utils/misc/MeteorTranslations.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index ca8ffabd18..e0407c5f9f 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -11,6 +11,7 @@ import meteordevelopment.meteorclient.addons.AddonManager; import meteordevelopment.meteorclient.addons.MeteorAddon; import meteordevelopment.meteorclient.utils.PreInit; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; import net.minecraft.client.resource.language.LanguageDefinition; import net.minecraft.client.resource.language.ReorderingUtil; @@ -30,6 +31,7 @@ @SuppressWarnings("unused") public class MeteorTranslations { + private static final boolean DEBUG_MISSING_ENTRIES = FabricLoader.getInstance().isDevelopmentEnvironment() || Boolean.getBoolean("meteor.lang.debug"); private static final String EN_US_CODE = "en_us"; private static final Gson GSON = new Gson(); private static final Map languages = new Object2ObjectOpenHashMap<>(); @@ -101,6 +103,7 @@ public static void clearUnusedLanguages(String currentLanguageCode) { public static String translate(String key, Object... args) { MeteorLanguage currentLang = getCurrentLanguage(); + debug(currentLang, key); String translated = currentLang.get(key, getDefaultLanguage().get(key)); try { @@ -112,6 +115,7 @@ public static String translate(String key, Object... args) { public static String translate(String key, String fallback, Object... args) { MeteorLanguage currentLang = getCurrentLanguage(); + debug(currentLang, key); String translated = currentLang.get(key, getDefaultLanguage().get(key, fallback)); try { @@ -123,6 +127,7 @@ public static String translate(String key, String fallback, Object... args) { public static String translate(String key, Supplier fallback, Object... args) { MeteorLanguage currentLang = getCurrentLanguage(); + debug(currentLang, key); String translated = currentLang.get(key, getDefaultLanguage().get(key, fallback)); try { @@ -132,6 +137,12 @@ public static String translate(String key, Supplier fallback, Object... } } + private static void debug(MeteorLanguage language, String key) { + if (DEBUG_MISSING_ENTRIES && !language.hasTranslation(key)) { + MeteorClient.LOG.warn("Missing entry for '{}' in lang '{}'.", key, mc.options.language); + } + } + public static MeteorLanguage getLanguage(String lang) { return languages.get(lang); } From e81bb30982d51bb8e4c7f865cf9922d73317d1ad Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Mon, 5 Jan 2026 19:37:23 -0500 Subject: [PATCH 40/72] Revert "support renaming settinggroups without losing data" This reverts commit 3e3a93e746c7c7606221d948a76f9311206f15a6. --- .../meteorclient/settings/SettingGroup.java | 8 -------- .../meteordevelopment/meteorclient/settings/Settings.java | 5 ----- 2 files changed, 13 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java b/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java index b2fe870d3a..8112c2b039 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java @@ -5,13 +5,11 @@ package meteordevelopment.meteorclient.settings; -import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.ISerializable; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtList; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Iterator; @@ -21,7 +19,6 @@ public class SettingGroup implements ISerializable, Iterable> settings = new ArrayList<>(1); @@ -56,11 +53,6 @@ public boolean wasChanged() { return false; } - public SettingGroup renamedFrom(String oldName) { - this.oldName = Utils.titleToName(oldName); - return this; - } - @Override public @NotNull Iterator> iterator() { return settings.iterator(); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/Settings.java b/src/main/java/meteordevelopment/meteorclient/settings/Settings.java index 36e054efa2..c3a1a8a74b 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/Settings.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/Settings.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.Objects; public class Settings implements ISerializable, Iterable { private SettingGroup defaultGroup; @@ -83,10 +82,6 @@ public SettingGroup getGroup(String name) { if (sg.name.equals(name)) return sg; } - for (SettingGroup sg : this) { - if (Objects.equals(sg.oldName, name)) return sg; - } - return null; } From e63d3e528f16f5b9abaf125e1fe998e1217afeda Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Mon, 5 Jan 2026 19:40:46 -0500 Subject: [PATCH 41/72] finishing touches --- .../gui/DefaultSettingsWidgetFactory.java | 2 +- .../meteorclient/settings/SettingGroup.java | 2 +- .../meteorclient/systems/modules/Module.java | 9 ++++----- .../utils/misc/MeteorTranslations.java | 6 +++--- .../assets/meteor-client/language/en_us.json | 19 ------------------- 5 files changed, 9 insertions(+), 29 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java index 6aa01dbb88..9a23adfbdc 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java @@ -112,7 +112,7 @@ private void group(WVerticalList list, SettingGroup group, String filter, List setting : group) { String settingKey = baseKey + "." + group.name + "." + setting.name; - String title = MeteorTranslations.translate(settingKey, () -> Utils.nameToTitle(setting.name)); + String title = MeteorTranslations.translate(settingKey); if (!Strings.CI.contains(title, filter) && !Strings.CI.contains(setting.name, filter)) continue; boolean visible = setting.isVisible(); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java b/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java index 8112c2b039..eeaa1a005e 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java @@ -24,7 +24,7 @@ public class SettingGroup implements ISerializable, Iterable Utils.nameToTitle(this.name)); + return MeteorTranslations.translate("module." + this.name); } public MutableText getTitleText() { - return MutableText.of(new MeteorTranslatableTextComponent("module." + this.name, Utils.nameToTitle(this.name))); + return MeteorClient.translatable("module." + this.name); } public String getDescription() { - return MeteorTranslations.translate("module." + this.name + ".description", ""); + return MeteorTranslations.translate("module." + this.name + ".description"); } public MutableText getDescriptionText() { - return MutableText.of(new MeteorTranslatableTextComponent("module." + this.name + ".description", "")); + return MeteorClient.translatable("module." + this.name + ".description"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index e0407c5f9f..505da3c566 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -104,7 +104,7 @@ public static void clearUnusedLanguages(String currentLanguageCode) { public static String translate(String key, Object... args) { MeteorLanguage currentLang = getCurrentLanguage(); debug(currentLang, key); - String translated = currentLang.get(key, getDefaultLanguage().get(key)); + String translated = currentLang.get(key, () -> getDefaultLanguage().get(key)); try { return String.format(translated, args); @@ -116,7 +116,7 @@ public static String translate(String key, Object... args) { public static String translate(String key, String fallback, Object... args) { MeteorLanguage currentLang = getCurrentLanguage(); debug(currentLang, key); - String translated = currentLang.get(key, getDefaultLanguage().get(key, fallback)); + String translated = currentLang.get(key, () -> getDefaultLanguage().get(key, fallback)); try { return String.format(translated, args); @@ -128,7 +128,7 @@ public static String translate(String key, String fallback, Object... args) { public static String translate(String key, Supplier fallback, Object... args) { MeteorLanguage currentLang = getCurrentLanguage(); debug(currentLang, key); - String translated = currentLang.get(key, getDefaultLanguage().get(key, fallback)); + String translated = currentLang.get(key, () -> getDefaultLanguage().get(key, fallback)); try { return String.format(translated, args); diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index ff14b1f513..55d99da0d0 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -1032,12 +1032,9 @@ "module.hand-view.off-hand.rotation": "Rotation", "module.hand-view.off-hand.rotation.description": "The rotation of your off hand.", "module.hand-view.arm.scale": "Scale", - "module.hand-view.arm.position": "Position", - "module.hand-view.arm.rotation": "Rotation", - "module.instant-rebreak": "Instant Rebreak", "module.instant-rebreak.description": "Instantly re-breaks blocks in the same position.", "module.instant-rebreak.general.delay": "Delay", @@ -1693,7 +1690,6 @@ "module.flamethrower.general.target-babies": "Target Babies", "module.flamethrower.general.target-babies.description": "If checked babies will also be killed.", "module.flamethrower.general.tick-interval": "Tick Interval", - "module.flamethrower.general.rotate": "Rotate", "module.flamethrower.general.rotate.description": "Automatically faces towards the animal roasted.", "module.flamethrower.general.entities": "Entities", @@ -2036,35 +2032,20 @@ "module.notebot.general.check-noteblocks-again-delay.description": "How much delay should be between end of tuning and checking again", "module.notebot.note-map": "Note Map", "module.notebot.note-map.Harp": "Harp", - "module.notebot.note-map.Basedrum": "Basedrum", - "module.notebot.note-map.Snare": "Snare", - "module.notebot.note-map.Hat": "Hat", - "module.notebot.note-map.Bass": "Bass", - "module.notebot.note-map.Flute": "Flute", - "module.notebot.note-map.Bell": "Bell", - "module.notebot.note-map.Guitar": "Guitar", - "module.notebot.note-map.Chime": "Chime", - "module.notebot.note-map.Xylophone": "Xylophone", - "module.notebot.note-map.IronXylophone": "IronXylophone", - "module.notebot.note-map.CowBell": "CowBell", - "module.notebot.note-map.Didgeridoo": "Didgeridoo", - "module.notebot.note-map.Bit": "Bit", - "module.notebot.note-map.Banjo": "Banjo", - "module.notebot.note-map.Pling": "Pling", "module.notebot.render.render-text": "Render Text", From 2d7e9cfe9d750a3c7fa07f9e4ffaa7cef09ec8dd Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Mon, 5 Jan 2026 19:46:31 -0500 Subject: [PATCH 42/72] when did i touch this :sob: --- .../meteordevelopment/meteorclient/renderer/MeshRenderer.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java index 961b7921f6..738e623776 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java @@ -166,7 +166,6 @@ public void end() { pass.setPipeline(pipeline); pass.setUniform("MeshData", meshData); - uniforms.forEach(pass::setUniform); for (var name : uniforms.keySet()) { pass.setUniform(name, uniforms.get(name)); } From 38f03000baad6df2541c4d204ddd31ccc10b219a Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Mon, 5 Jan 2026 19:57:27 -0500 Subject: [PATCH 43/72] error checking n shit --- .../utils/misc/MeteorTranslations.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index 505da3c566..4424140ef7 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -6,6 +6,9 @@ package meteordevelopment.meteorclient.utils.misc; import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.addons.AddonManager; @@ -23,6 +26,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.Reader; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.function.Supplier; @@ -64,10 +68,7 @@ public static void loadLanguage(String languageCode) { else MeteorClient.LOG.info("No language file found for '{}'", languageCode); } else { - // noinspection unchecked - Object2ObjectOpenHashMap map = GSON.fromJson(new InputStreamReader(stream, StandardCharsets.UTF_8), Object2ObjectOpenHashMap.class); - languageMap.putAll(map); - + loadToMap(new InputStreamReader(stream, StandardCharsets.UTF_8), languageMap); MeteorClient.LOG.info("Loaded language: {}", languageCode); } } catch (IOException e) { @@ -81,11 +82,7 @@ public static void loadLanguage(String languageCode) { try (InputStream stream = addon.getClass().getResourceAsStream("/assets/" + addon.id + "/language/" + languageCode + ".json")) { if (stream == null) continue; - // noinspection unchecked - Object2ObjectOpenHashMap map = GSON.fromJson(new InputStreamReader(stream, StandardCharsets.UTF_8), Object2ObjectOpenHashMap.class); - map.values().removeIf(String::isEmpty); - languageMap.putAll(map); - + loadToMap(new InputStreamReader(stream, StandardCharsets.UTF_8), languageMap); MeteorClient.LOG.info("Loaded language {} from addon {}", languageCode, addon.name); } catch (IOException e) { MeteorClient.LOG.error("Error loading language {} from addon {}", languageCode, addon.name, e); @@ -97,6 +94,18 @@ public static void loadLanguage(String languageCode) { } } + private static void loadToMap(Reader reader, Map map) { + JsonObject object = GSON.fromJson(reader, JsonObject.class); + for (Map.Entry entry : object.entrySet()) { + if (entry.getValue() instanceof JsonPrimitive primitive && primitive.isString()) { + String value = primitive.getAsString(); + if (!value.isEmpty()) map.put(entry.getKey(), value); + } else { + MeteorClient.LOG.error("Unexpected element '{}' for '{}'.", entry.getValue().toString(), entry.getKey()); + } + } + } + public static void clearUnusedLanguages(String currentLanguageCode) { languages.keySet().removeIf(languageCode -> !languageCode.equals(EN_US_CODE) && !languageCode.equals(currentLanguageCode)); } From 479f21df42e157e3385e82161564b21f3f5cb93f Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Tue, 6 Jan 2026 16:09:18 +0000 Subject: [PATCH 44/72] fix typo + clean up duplicates in the lang file --- .../systems/modules/combat/AttributeSwap.java | 2 +- .../assets/meteor-client/language/en_us.json | 29 +------------------ 2 files changed, 2 insertions(+), 29 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AttributeSwap.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AttributeSwap.java index 319db4969c..b5a0c763e0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AttributeSwap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AttributeSwap.java @@ -30,7 +30,7 @@ public class AttributeSwap extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgSwappingOptions = settings.createGroup("swapping-ptions"); + private final SettingGroup sgSwappingOptions = settings.createGroup("swapping-options"); private final SettingGroup sgSwordEnchants = settings.createGroup("sword-enchants"); private final SettingGroup sgMaceEnchants = settings.createGroup("mace-enchants"); private final SettingGroup sgOtherEnchants = settings.createGroup("other-enchants"); diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index 55d99da0d0..3119a16048 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -117,7 +117,7 @@ "setting.group.hud": "Hud", "setting.group.world": "World", "setting.group.entity": "Entity", - "setting.group.swapping-ptions": "Swapping Ptions", + "setting.group.swapping-options": "Swapping Options", "setting.group.sword-enchants": "Sword Enchants", "setting.group.mace-enchants": "Mace Enchants", "setting.group.other-enchants": "Other Enchants", @@ -371,7 +371,6 @@ "module.better-tooltips.other.byte-size-format.description": "The format by which to display the item's byte size.", "module.better-tooltips.other.status-effects": "Status Effects", "module.better-tooltips.other.status-effects.description": "Adds list of status effects to tooltips of food items.", - "module.better-tooltips.hide-flags": "Hide Flags", "module.better-tooltips.hide-flags.tooltip": "Tooltip", "module.better-tooltips.hide-flags.tooltip.description": "Show the tooltip when it's hidden.", "module.better-tooltips.hide-flags.tooltip-components": "Tooltip Components", @@ -379,7 +378,6 @@ "module.notifier": "Notifier", "module.notifier.description": "Notifies you of different events.", - "module.notifier.totem-pops": "Totem Pops", "module.notifier.totem-pops.totem-pops": "Totem Pops", "module.notifier.totem-pops.totem-pops.description": "Notifies you when a player pops a totem.", "module.notifier.totem-pops.distance-check": "Distance Check", @@ -392,7 +390,6 @@ "module.notifier.totem-pops.ignore-friends.description": "Ignores friends totem pops.", "module.notifier.totem-pops.ignore-others": "Ignore Others", "module.notifier.totem-pops.ignore-others.description": "Ignores other players totem pops.", - "module.notifier.visual-range": "Visual Range", "module.notifier.visual-range.visual-range": "Visual Range", "module.notifier.visual-range.visual-range.description": "Notifies you when an entity enters your render distance.", "module.notifier.visual-range.event": "Event", @@ -411,7 +408,6 @@ "module.notifier.pearl.ignore-own.description": "Ignores your own pearls.", "module.notifier.pearl.ignore-friends": "Ignore Friends", "module.notifier.pearl.ignore-friends.description": "Ignores friends pearls.", - "module.notifier.joins/leaves": "Joins/Leaves", "module.notifier.joins/leaves.player-joins-leaves": "Player Joins Leaves", "module.notifier.joins/leaves.player-joins-leaves.description": "How to handle player join/leave notifications.", "module.notifier.joins/leaves.notification-delay": "Notification Delay", @@ -578,7 +574,6 @@ "module.chams": "Chams", "module.chams.description": "Tweaks rendering of entities.", - "module.chams.through-walls": "Through Walls", "module.chams.through-walls.entities": "Entities", "module.chams.through-walls.entities.description": "Select entities to show through walls.", "module.chams.through-walls.shader": "Shader", @@ -1017,14 +1012,12 @@ "module.hand-view.general.main-hand-progress.description": "The swing progress of your main hand.", "module.hand-view.general.off-hand-progress": "Off Hand Progress", "module.hand-view.general.off-hand-progress.description": "The swing progress of your off hand.", - "module.hand-view.main-hand": "Main Hand", "module.hand-view.main-hand.scale": "Scale", "module.hand-view.main-hand.scale.description": "The scale of your main hand.", "module.hand-view.main-hand.position": "Position", "module.hand-view.main-hand.position.description": "The position of your main hand.", "module.hand-view.main-hand.rotation": "Rotation", "module.hand-view.main-hand.rotation.description": "The rotation of your main hand.", - "module.hand-view.off-hand": "Off Hand", "module.hand-view.off-hand.scale": "Scale", "module.hand-view.off-hand.scale.description": "The scale of your off hand.", "module.hand-view.off-hand.position": "Position", @@ -1101,7 +1094,6 @@ "module.crystal-aura.place.support.description": "Places a support block in air if no other position have been found.", "module.crystal-aura.place.support-delay": "Support Delay", "module.crystal-aura.place.support-delay.description": "Delay in ticks after placing support block.", - "module.crystal-aura.face-place": "Face Place", "module.crystal-aura.face-place.face-place": "Face Place", "module.crystal-aura.face-place.face-place.description": "Will face-place when target is below a certain health or armor durability threshold.", "module.crystal-aura.face-place.face-place-health": "Face Place Health", @@ -1501,7 +1493,6 @@ "module.highway-builder.inventory.instantly-rebreak-echests.description": "Whether or not to use the instant rebreak exploit to break echests.", "module.highway-builder.inventory.rebreak-delay": "Rebreak Delay", "module.highway-builder.inventory.rebreak-delay.description": "Delay between rebreak attempts.", - "module.highway-builder.render-digging": "Render Digging", "module.highway-builder.render-digging.render-blocks-to-mine": "Render Blocks To Mine", "module.highway-builder.render-digging.render-blocks-to-mine.description": "Render blocks to be mined.", "module.highway-builder.render-digging.blocks-to-mine-shape-mode": "Blocks To Mine Shape Mode", @@ -1510,7 +1501,6 @@ "module.highway-builder.render-digging.blocks-to-mine-side-color.description": "Color of blocks to be mined.", "module.highway-builder.render-digging.blocks-to-mine-line-color": "Blocks To Mine Line Color", "module.highway-builder.render-digging.blocks-to-mine-line-color.description": "Color of blocks to be mined.", - "module.highway-builder.render-paving": "Render Paving", "module.highway-builder.render-paving.render-blocks-to-place": "Render Blocks To Place", "module.highway-builder.render-paving.render-blocks-to-place.description": "Render blocks to be placed.", "module.highway-builder.render-paving.blocks-to-place-shape-mode": "Blocks To Place Shape Mode", @@ -1582,7 +1572,6 @@ "module.storage-esp.general.other.description": "The color of furnaces, dispensers, droppers and hoppers.", "module.storage-esp.general.fade-distance": "Fade Distance", "module.storage-esp.general.fade-distance.description": "The distance at which the color will fade.", - "module.storage-esp.opened-rendering": "Opened Rendering", "module.storage-esp.opened-rendering.hide-opened": "Hide Opened", "module.storage-esp.opened-rendering.hide-opened.description": "Hides opened containers.", "module.storage-esp.opened-rendering.opened-color": "Opened Color", @@ -1603,7 +1592,6 @@ "module.attribute-swap.general.swap-back.description": "Swap back to the original slot after a delay.", "module.attribute-swap.general.swap-back-delay": "Swap Back Delay", "module.attribute-swap.general.swap-back-delay.description": "Delay in ticks before swapping back.", - "module.attribute-swap.swapping-options": "Swapping Options", "module.attribute-swap.swapping-options.shield-breaker": "Shield Breaker", "module.attribute-swap.swapping-options.shield-breaker.description": "Automatically swaps to an axe if the target is blocking.", "module.attribute-swap.swapping-options.durability-saver": "Durability Saver", @@ -1614,7 +1602,6 @@ "module.attribute-swap.swapping-options.mace-swapping.description": "Enables smart swapping for mace enchantments.", "module.attribute-swap.swapping-options.other-swapping": "Other Swapping", "module.attribute-swap.swapping-options.other-swapping.description": "Enables smart swapping for other enchantments like Impaling.", - "module.attribute-swap.sword-enchants": "Sword Enchants", "module.attribute-swap.sword-enchants.fire-aspect": "Fire Aspect", "module.attribute-swap.sword-enchants.fire-aspect.description": "Swaps to an item with Fire Aspect to set the target on fire, if target isn't already on fire", "module.attribute-swap.sword-enchants.looting": "Looting", @@ -1627,7 +1614,6 @@ "module.attribute-swap.sword-enchants.bane-of-arthropods.description": "Swaps to an item with Bane of Arthropods for increased damage against arthropods.", "module.attribute-swap.sword-enchants.sweeping-edge": "Sweeping Edge", "module.attribute-swap.sword-enchants.sweeping-edge.description": "Swaps to an item with Sweeping Edge for increased sweeping attack damage.", - "module.attribute-swap.mace-enchants": "Mace Enchants", "module.attribute-swap.mace-enchants.regular-mace": "Regular Mace", "module.attribute-swap.mace-enchants.regular-mace.description": "Swaps to a regular Mace when falling if no better option is available.", "module.attribute-swap.mace-enchants.density": "Density", @@ -1636,10 +1622,8 @@ "module.attribute-swap.mace-enchants.breach.description": "Swaps to a Mace with Breach to reduce the target's armor effectiveness.", "module.attribute-swap.mace-enchants.wind-burst": "Wind Burst", "module.attribute-swap.mace-enchants.wind-burst.description": "Swaps to a Mace with Wind Burst to launch up when hitting while falling.", - "module.attribute-swap.other-enchants": "Other Enchants", "module.attribute-swap.other-enchants.impaling": "Impaling", "module.attribute-swap.other-enchants.impaling.description": "Swaps to an item with Impaling for increased damage against aquatic mobs.", - "module.attribute-swap.weapon-options": "Weapon Options", "module.attribute-swap.weapon-options.only-on-weapon": "Only On Weapon", "module.attribute-swap.weapon-options.only-on-weapon.description": "Only swaps when holding a selected weapon in hand.", "module.attribute-swap.weapon-options.sword": "Sword", @@ -2030,7 +2014,6 @@ "module.notebot.general.swing-arm.description": "Should swing arm on hit", "module.notebot.general.check-noteblocks-again-delay": "Check Noteblocks Again Delay", "module.notebot.general.check-noteblocks-again-delay.description": "How much delay should be between end of tuning and checking again", - "module.notebot.note-map": "Note Map", "module.notebot.note-map.Harp": "Harp", "module.notebot.note-map.Basedrum": "Basedrum", "module.notebot.note-map.Snare": "Snare", @@ -2368,7 +2351,6 @@ "module.better-chat.filter.filter-regex.description": "Filter out chat messages that match the regex filter.", "module.better-chat.filter.regex-filter": "Regex Filter", "module.better-chat.filter.regex-filter.description": "Regex filter used for filtering chat messages.", - "module.better-chat.longer-chat": "Longer Chat", "module.better-chat.longer-chat.infinite-chat-box": "Infinite Chat Box", "module.better-chat.longer-chat.infinite-chat-box.description": "Lets you type infinitely long messages.", "module.better-chat.longer-chat.longer-chat-history": "Longer Chat History", @@ -2862,7 +2844,6 @@ "module.waypoints.general.text-render-distance.description": "Maximum distance from the center of the screen at which text will be rendered.", "module.waypoints.general.waypoint-fade-distance": "Waypoint Fade Distance", "module.waypoints.general.waypoint-fade-distance.description": "The distance to a waypoint at which it begins to start fading.", - "module.waypoints.death-position": "Death Position", "module.waypoints.death-position.max-death-positions": "Max Death Positions", "module.waypoints.death-position.max-death-positions.description": "The amount of death positions to save, 0 to disable", "module.waypoints.death-position.chat": "Chat", @@ -2918,7 +2899,6 @@ "module.hitboxes.general.expand.description": "How much to expand the hitbox of the entity.", "module.hitboxes.general.ignore-friends": "Ignore Friends", "module.hitboxes.general.ignore-friends.description": "Doesn't expand the hitboxes of friends.", - "module.hitboxes.weapon-options": "Weapon Options", "module.hitboxes.weapon-options.only-on-weapon": "Only On Weapon", "module.hitboxes.weapon-options.only-on-weapon.description": "Only modifies hitbox when holding a weapon in hand.", "module.hitboxes.weapon-options.sword": "Sword", @@ -2968,7 +2948,6 @@ "module.flight.general.vertical-speed-match.description": "Matches your vertical speed to your horizontal speed, otherwise uses vanilla ratio.", "module.flight.general.no-sneak": "No Sneak", "module.flight.general.no-sneak.description": "Prevents you from sneaking while flying.", - "module.flight.anti-kick": "Anti Kick", "module.flight.anti-kick.mode": "Mode", "module.flight.anti-kick.mode.description": "The mode for anti kick.", "module.flight.anti-kick.delay": "Delay", @@ -3002,14 +2981,12 @@ "module.discord-presence": "Discord Presence", "module.discord-presence.description": "Displays Meteor as your presence on Discord.", - "module.discord-presence.line-1": "Line 1", "module.discord-presence.line-1.line-1-messages": "Line 1 Messages", "module.discord-presence.line-1.line-1-messages.description": "Messages used for the first line.", "module.discord-presence.line-1.line-1-update-delay": "Line 1 Update Delay", "module.discord-presence.line-1.line-1-update-delay.description": "How fast to update the first line in ticks.", "module.discord-presence.line-1.line-1-select-mode": "Line 1 Select Mode", "module.discord-presence.line-1.line-1-select-mode.description": "How to select messages for the first line.", - "module.discord-presence.line-2": "Line 2", "module.discord-presence.line-2.line-2-messages": "Line 2 Messages", "module.discord-presence.line-2.line-2-messages.description": "Messages used for the second line.", "module.discord-presence.line-2.line-2-update-delay": "Line 2 Update Delay", @@ -3074,14 +3051,12 @@ "module.inventory-tweaks.sorting.sorting-delay.description": "Delay in ticks between moving items when sorting.", "module.inventory-tweaks.sorting.disable-in-creative": "Disable In Creative", "module.inventory-tweaks.sorting.disable-in-creative.description": "Disables the inventory sorter when in creative mode.", - "module.inventory-tweaks.anti-drop": "Anti Drop", "module.inventory-tweaks.anti-drop.anti-drop-items": "Anti Drop Items", "module.inventory-tweaks.anti-drop.anti-drop-items.description": "Items to prevent dropping. Doesn't work in creative inventory screen.", "module.inventory-tweaks.anti-drop.item-frames": "Item Frames", "module.inventory-tweaks.anti-drop.item-frames.description": "Prevent anti-drop items from being placed in item frames or pots", "module.inventory-tweaks.anti-drop.override-bind": "Override Bind", "module.inventory-tweaks.anti-drop.override-bind.description": "Hold this bind to temporarily bypass anti-drop", - "module.inventory-tweaks.auto-drop": "Auto Drop", "module.inventory-tweaks.auto-drop.auto-drop-items": "Auto Drop Items", "module.inventory-tweaks.auto-drop.auto-drop-items.description": "Items to drop.", "module.inventory-tweaks.auto-drop.exclude-equipped": "Exclude Equipped", @@ -3090,7 +3065,6 @@ "module.inventory-tweaks.auto-drop.exclude-hotbar.description": "Whether or not to drop items from your hotbar.", "module.inventory-tweaks.auto-drop.only-full-stacks": "Only Full Stacks", "module.inventory-tweaks.auto-drop.only-full-stacks.description": "Only drops the items if the stack is full.", - "module.inventory-tweaks.steal-and-dump": "Steal and Dump", "module.inventory-tweaks.steal-and-dump.steal-screens": "Steal Screens", "module.inventory-tweaks.steal-and-dump.steal-screens.description": "Select the screens to display buttons and auto steal.", "module.inventory-tweaks.steal-and-dump.inventory-buttons": "Inventory Buttons", @@ -3107,7 +3081,6 @@ "module.inventory-tweaks.steal-and-dump.steal-filter.description": "Steal mode.", "module.inventory-tweaks.steal-and-dump.steal-items": "Steal Items", "module.inventory-tweaks.steal-and-dump.steal-items.description": "Items to steal.", - "module.inventory-tweaks.auto-steal": "Auto Steal", "module.inventory-tweaks.auto-steal.auto-steal": "Auto Steal", "module.inventory-tweaks.auto-steal.auto-steal.description": "Automatically removes all possible items when you open a container.", "module.inventory-tweaks.auto-steal.auto-dump": "Auto Dump", From 720f178a6c77fffd6f7a80c03ab4ef1cfae02892 Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Tue, 6 Jan 2026 16:15:01 +0000 Subject: [PATCH 45/72] copy en_us over to en_gb --- .../assets/meteor-client/language/en_gb.json | 3506 ++++++++++++++++- .../assets/meteor-client/language/en_us.json | 2 + 2 files changed, 3440 insertions(+), 68 deletions(-) diff --git a/src/main/resources/assets/meteor-client/language/en_gb.json b/src/main/resources/assets/meteor-client/language/en_gb.json index c27502e5fe..718c010de5 100644 --- a/src/main/resources/assets/meteor-client/language/en_gb.json +++ b/src/main/resources/assets/meteor-client/language/en_gb.json @@ -1,74 +1,3444 @@ { + "meteor.lang.translators" : "MeteorDevelopment", + "meteor.key.category": "Meteor Client", "meteor.key.open-commands": "Open Commands", "meteor.key.open-gui": "Open GUI", - "meteor.command.bind.description": "Binds a specified module to the next pressed key.", - "meteor.command.binds.description": "List of all bound modules.", - "meteor.command.commands.description": "List of all commands.", - "meteor.command.damage.description": "Damages self.", - "meteor.command.disconnect.description": "Disconnect from the server", - "meteor.command.disconnect.disconnection_message": "%s[%sDisconnectCommand%s] Disconnected by user.", - "meteor.command.dismount.description": "Dismounts you from entity you are riding.", - "meteor.command.drop.description": "Automatically drops specified items.", - "meteor.command.drop.exception.no_such_item": "Could not find an item with that name!", - "meteor.command.drop.exception.not_spectator": "Can't drop items while in spectator.", - "meteor.command.enchant.description": "Enchants the item in your hand. REQUIRES Creative mode.", - "meteor.command.enchant.exception.not_holding_item": "You need to hold some item to enchant.", - "meteor.command.enchant.exception.not_in_creative": "You must be in creative mode to use this.", - "meteor.command.ender-chest.description": "Allows you to preview memory of your ender chest.", - "meteor.command.fake-player.description": "Manages fake players that you can use for testing.", - "meteor.command.fake-player.error.not_found": "Couldn't find a Fake Player with that name.", - "meteor.command.fake-player.info.removed": "Removed Fake Player %s.", - "meteor.command.fov.description": "Changes your fov.", - "meteor.command.friends.description": "Manages friends.", - "meteor.command.gamemode.description": "Changes your gamemode client-side.", - "meteor.command.give.description": "Gives you any item.", - "meteor.command.give.exception.not_in_creative": "You must be in creative mode to use this.", - "meteor.command.give.exception.no_space": "No space in hotbar.", - "meteor.command.hclip.description": "Lets you clip through blocks horizontally.", - "meteor.command.input.description": "Keyboard input simulation.", - "meteor.command.input.info.cleared_handlers": "Cleared all keypress handlers.", - "meteor.command.input.info.active_handlers": "Active keypress handlers: ", - "meteor.command.input.info.keypress_handler": "(highlight)%d(default) - (highlight)%s %d(default) ticks left out of (highlight)%d(default).", - "meteor.command.input.info.removed_handler": "Removed keypress handler.", - "meteor.command.input.warning.no_handlers": "No active keypress handlers.", - "meteor.command.input.warning.out_of_range": "Index out of range.", - "meteor.command.inventory.description": "Allows you to see parts of another player's inventory.", - "meteor.command.locate.description": "Locates structures", - "meteor.command.macro.description": "Allows you to execute macros.", - "meteor.command.macro.error.none_scheduled": "No macros are currently scheduled.", - "meteor.command.macro.error.not_scheduled": "This macro is not currently scheduled.", - "meteor.command.macro.info.cleared_all": "Cleared all scheduled macros.", - "meteor.command.macro.info.cleared": "Cleared scheduled macro.", - "meteor.command.modules.description": "Displays a list of all modules.", - "meteor.command.name-history.description": "Provides a list of a players previous names from the laby.net api", - "meteor.command.name-history.error.error_fetching_name": "There was an error fetching that users name history.", - "meteor.command.name-history.inaccurate": "This name history entry is not accurate according to laby.net", - "meteor.command.nbt.description": "Modifies NBT data for an item, example: .nbt add {display:{Name:'{\"text\":\"$cRed Name\"}'}}", - "meteor.command.notebot.description": "Allows you load notebot files", - "meteor.command.peek.description": "Lets you see what's inside storage block items.", - "meteor.command.profiles.description": "Loads and saves profiles.", - "meteor.command.profiles.info.loaded": "Loaded profile (highlight)%s(default).", - "meteor.command.profiles.info.saved": "Saved profile (highlight)%s(default).", - "meteor.command.profiles.info.deleted": "Deleted profile (highlight)%s(default).", - "meteor.command.reload.description": "Reloads many systems.", - "meteor.command.reload.warning.reloading": "Reloading systems, this may take a while.", - "meteor.command.reset.description": "Resets specified settings.", - "meteor.command.rotation.description": "Modifies your rotation.", - "meteor.command.save-map.description": "Saves a map to an image.", - "meteor.command.save-map.error.error_writing_texture": "Error writing map texture", - "meteor.command.save-map.exception.map_not_found": "You must be holding a filled map.", - "meteor.command.save-map.exception.oops": "Something went wrong.", - "meteor.command.say.description": "Sends messages in chat.", - "meteor.command.server.description": "Prints server information", - "meteor.command.settings.description": "Allows you to view and change module settings.", - "meteor.command.spectate.description": "Allows you to spectate nearby players", - "meteor.command.swarm.description": "Sends commands to connected swarm workers.", - "meteor.command.toggle.description": "Toggles a module.", - "meteor.command.vclip.description": "Lets you clip through blocks vertically.", - "meteor.command.wasp.description": "Sets the auto wasp target.", - "meteor.command.wasp.exception.cant_wasp_self": "You cannot target yourself!", - "meteor.command.wasp.info.target": "%s set as target.", - "meteor.command.waypoint.description": "Manages waypoints." + "command.bind.description": "Binds a specified module to the next pressed key.", + "command.binds.description": "List of all bound modules.", + "command.commands.description": "List of all commands.", + "command.damage.description": "Damages self.", + "command.disconnect.description": "Disconnect from the server", + "command.disconnect.disconnection_message": "%s[%sDisconnectCommand%s] Disconnected by user.", + "command.dismount.description": "Dismounts you from entity you are riding.", + "command.drop.description": "Automatically drops specified items.", + "command.drop.exception.no_such_item": "Could not find an item with that name!", + "command.drop.exception.not_spectator": "Can't drop items while in spectator.", + "command.enchant.description": "Enchants the item in your hand. REQUIRES Creative mode.", + "command.enchant.exception.not_holding_item": "You need to hold some item to enchant.", + "command.enchant.exception.not_in_creative": "You must be in creative mode to use this.", + "command.ender-chest.description": "Allows you to preview memory of your ender chest.", + "command.fake-player.description": "Manages fake players that you can use for testing.", + "command.fake-player.error.not_found": "Couldn't find a Fake Player with that name.", + "command.fake-player.info.removed": "Removed Fake Player %s.", + "command.fov.description": "Changes your fov.", + "command.friends.description": "Manages friends.", + "command.gamemode.description": "Changes your gamemode client-side.", + "command.give.description": "Gives you any item.", + "command.give.exception.not_in_creative": "You must be in creative mode to use this.", + "command.give.exception.no_space": "No space in hotbar.", + "command.hclip.description": "Lets you clip through blocks horizontally.", + "command.input.description": "Keyboard input simulation.", + "command.input.info.cleared_handlers": "Cleared all keypress handlers.", + "command.input.info.active_handlers": "Active keypress handlers: ", + "command.input.info.keypress_handler": "(highlight)%d(default) - (highlight)%s %d(default) ticks left out of (highlight)%d(default).", + "command.input.info.removed_handler": "Removed keypress handler.", + "command.input.warning.no_handlers": "No active keypress handlers.", + "command.input.warning.out_of_range": "Index out of range.", + "command.inventory.description": "Allows you to see parts of another player's inventory.", + "command.locate.description": "Locates structures", + "command.macro.description": "Allows you to execute macros.", + "command.macro.error.none_scheduled": "No macros are currently scheduled.", + "command.macro.error.not_scheduled": "This macro is not currently scheduled.", + "command.macro.info.cleared_all": "Cleared all scheduled macros.", + "command.macro.info.cleared": "Cleared scheduled macro.", + "command.modules.description": "Displays a list of all modules.", + "command.name-history.description": "Provides a list of a players previous names from the laby.net api", + "command.name-history.error.error_fetching_name": "There was an error fetching that users name history.", + "command.name-history.inaccurate": "This name history entry is not accurate according to laby.net", + "command.nbt.description": "Modifies NBT data for an item, example: .nbt add {display:{Name:'{\"text\":\"$cRed Name\"}'}}", + "command.notebot.description": "Allows you load notebot files", + "command.peek.description": "Lets you see what's inside storage block items.", + "command.profiles.description": "Loads and saves profiles.", + "command.profiles.info.loaded": "Loaded profile (highlight)%s(default).", + "command.profiles.info.saved": "Saved profile (highlight)%s(default).", + "command.profiles.info.deleted": "Deleted profile (highlight)%s(default).", + "command.reload.description": "Reloads many systems.", + "command.reload.warning.reloading": "Reloading systems, this may take a while.", + "command.reset.description": "Resets specified settings.", + "command.rotation.description": "Modifies your rotation.", + "command.save-map.description": "Saves a map to an image.", + "command.save-map.error.error_writing_texture": "Error writing map texture", + "command.save-map.exception.map_not_found": "You must be holding a filled map.", + "command.save-map.exception.oops": "Something went wrong.", + "command.say.description": "Sends messages in chat.", + "command.server.description": "Prints server information", + "command.settings.description": "Allows you to view and change module settings.", + "command.spectate.description": "Allows you to spectate nearby players", + "command.swarm.description": "Sends commands to connected swarm workers.", + "command.toggle.description": "Toggles a module.", + "command.vclip.description": "Lets you clip through blocks vertically.", + "command.wasp.description": "Sets the auto wasp target.", + "command.wasp.exception.cant_wasp_self": "You cannot target yourself!", + "command.wasp.info.target": "%s set as target.", + "command.waypoint.description": "Manages waypoints.", + + "category.combat": "Combat", + "category.player": "Player", + "category.movement": "Movement", + "category.render": "Render", + "category.world": "World", + "category.misc": "Misc", + + "setting.group.general": "General", + "setting.group.entities": "Entities", + "setting.group.whitelist": "Whitelist", + "setting.group.visual": "Visual", + "setting.group.arrows": "Arrows", + "setting.group.movement": "Movement", + "setting.group.pathing": "Pathing", + "setting.group.screens": "Screens", + "setting.group.yaw": "Yaw", + "setting.group.pitch": "Pitch", + "setting.group.threshold": "Threshold", + "setting.group.players": "Players", + "setting.group.items": "Items", + "setting.group.colors": "Colors", + "setting.group.water": "Water", + "setting.group.lava": "Lava", + "setting.group.targeting": "Targeting", + "setting.group.inventory": "Inventory", + "setting.group.pause": "Pause", + "setting.group.filter": "Filter", + "setting.group.longer-chat": "Longer Chat", + "setting.group.prefix": "Prefix", + "setting.group.suffix": "Suffix", + "setting.group.toggles": "Toggles", + "setting.group.note-map": "Note Map", + "setting.group.render": "Render", + "setting.group.scrolling": "Scrolling", + "setting.group.main-hand": "Main Hand", + "setting.group.off-hand": "Off Hand", + "setting.group.arm": "Arm", + "setting.group.opened-rendering": "Opened Rendering", + "setting.group.potions": "Potions", + "setting.group.health": "Health", + "setting.group.death-position": "Death Position", + "setting.group.overlay": "Overlay", + "setting.group.hud": "Hud", + "setting.group.world": "World", + "setting.group.entity": "Entity", + "setting.group.swapping-options": "Swapping Options", + "setting.group.sword-enchants": "Sword Enchants", + "setting.group.mace-enchants": "Mace Enchants", + "setting.group.other-enchants": "Other Enchants", + "setting.group.weapon-options": "Weapon Options", + "setting.group.blocks": "Blocks", + "setting.group.through-walls": "Through Walls", + "setting.group.crystals": "Crystals", + "setting.group.hand": "Hand", + "setting.group.sky": "Sky", + "setting.group.place": "Place", + "setting.group.break": "Break", + "setting.group.combat": "Combat", + "setting.group.totem": "Totem", + "setting.group.previews": "Previews", + "setting.group.other": "Other", + "setting.group.hide-flags": "Hide Flags", + "setting.group.safety": "Safety", + "setting.group.mace": "Mace", + "setting.group.switch": "Switch", + "setting.group.face-place": "Face Place", + "setting.group.digging": "Digging", + "setting.group.paving": "Paving", + "setting.group.render-digging": "Render Digging", + "setting.group.render-paving": "Render Paving", + "setting.group.crossbows": "Crossbows", + "setting.group.timing": "Timing", + "setting.group.sorting": "Sorting", + "setting.group.anti-drop": "Anti Drop", + "setting.group.auto-drop": "Auto Drop", + "setting.group.steal-and-dump": "Steal And Dump", + "setting.group.auto-steal": "Auto Steal", + "setting.group.line-1": "Line 1", + "setting.group.line-2": "Line 2", + "setting.group.anti-kick": "Anti Kick", + "setting.group.appearance": "Appearance", + "setting.group.autopilot": "Autopilot", + "setting.group.totem-pops": "Totem Pops", + "setting.group.visual-range": "Visual Range", + "setting.group.pearl": "Pearl", + "setting.group.joins/leaves": "Joins/leaves", + "setting.group.actions": "Actions", + "setting.group.messages": "Messages", + "setting.group.control": "Control", + "setting.group.speed": "Speed", + "setting.group.flight": "Flight", + "setting.group.range": "Range", + "setting.group.smart": "Smart", + + "module.base.bind": "Bind", + "module.base.bind.bind": "Bind: ", + "module.base.bind.toggle-on-release": "Toggle on bind release: ", + "module.base.bind.chat-feedback": "Chat Feedback: ", + "module.base.active": "Active: ", + "module.base.copy-config": "Copy config", + "module.base.paste-config": "Paste config", + "module.base.from": "From: ", + + "module.air-jump": "Air Jump", + "module.air-jump.description": "Lets you jump in the air.", + "module.air-jump.general.maintain-level": "Maintain Level", + "module.air-jump.general.maintain-level.description": "Maintains your current Y level when holding the jump key.", + + "module.auto-fish": "Auto Fish", + "module.auto-fish.description": "Automatically fishes for you.", + "module.auto-fish.general.auto-switch": "Auto Switch", + "module.auto-fish.general.auto-switch.description": "Automatically switch to a fishing rod.", + "module.auto-fish.general.anti-break": "Anti Break", + "module.auto-fish.general.anti-break.description": "Avoid using rods that would break if they were cast.", + "module.auto-fish.general.auto-cast": "Auto Cast", + "module.auto-fish.general.auto-cast.description": "Automatically cast the fishing rod.", + "module.auto-fish.general.cast-delay": "Cast Delay", + "module.auto-fish.general.cast-delay.description": "How long to wait between recasts if the bobber fails to land in water.", + "module.auto-fish.general.cast-delay-variance": "Cast Delay Variance", + "module.auto-fish.general.cast-delay-variance.description": "Maximum amount of randomness added to cast delay.", + "module.auto-fish.general.catch-delay": "Catch Delay", + "module.auto-fish.general.catch-delay.description": "How long to wait after hooking a fish to reel it in.", + "module.auto-fish.general.catch-delay-variance": "Catch Delay Variance", + "module.auto-fish.general.catch-delay-variance.description": "Maximum amount of randomness added to catch delay.", + + "module.name-protect": "Name Protect", + "module.name-protect.description": "Hide player names and skins.", + "module.name-protect.general.name-protect": "Name Protect", + "module.name-protect.general.name-protect.description": "Hides your name client-side.", + "module.name-protect.general.name": "Name", + "module.name-protect.general.name.description": "Name to be replaced with.", + "module.name-protect.general.skin-protect": "Skin Protect", + "module.name-protect.general.skin-protect.description": "Make players become Steves.", + + "module.velocity": "Velocity", + "module.velocity.description": "Prevents you from being moved by external forces.", + "module.velocity.general.knockback": "Knockback", + "module.velocity.general.knockback.description": "Modifies the amount of knockback you take from attacks.", + "module.velocity.general.knockback-horizontal": "Knockback Horizontal", + "module.velocity.general.knockback-horizontal.description": "How much horizontal knockback you will take.", + "module.velocity.general.knockback-vertical": "Knockback Vertical", + "module.velocity.general.knockback-vertical.description": "How much vertical knockback you will take.", + "module.velocity.general.explosions": "Explosions", + "module.velocity.general.explosions.description": "Modifies your knockback from explosions.", + "module.velocity.general.explosions-horizontal": "Explosions Horizontal", + "module.velocity.general.explosions-horizontal.description": "How much velocity you will take from explosions horizontally.", + "module.velocity.general.explosions-vertical": "Explosions Vertical", + "module.velocity.general.explosions-vertical.description": "How much velocity you will take from explosions vertically.", + "module.velocity.general.liquids": "Liquids", + "module.velocity.general.liquids.description": "Modifies the amount you are pushed by flowing liquids.", + "module.velocity.general.liquids-horizontal": "Liquids Horizontal", + "module.velocity.general.liquids-horizontal.description": "How much velocity you will take from liquids horizontally.", + "module.velocity.general.liquids-vertical": "Liquids Vertical", + "module.velocity.general.liquids-vertical.description": "How much velocity you will take from liquids vertically.", + "module.velocity.general.entity-push": "Entity Push", + "module.velocity.general.entity-push.description": "Modifies the amount you are pushed by entities.", + "module.velocity.general.entity-push-amount": "Entity Push Amount", + "module.velocity.general.entity-push-amount.description": "How much you will be pushed.", + "module.velocity.general.blocks": "Blocks", + "module.velocity.general.blocks.description": "Prevents you from being pushed out of blocks.", + "module.velocity.general.sinking": "Sinking", + "module.velocity.general.sinking.description": "Prevents you from sinking in liquids.", + "module.velocity.general.fishing": "Fishing", + "module.velocity.general.fishing.description": "Prevents you from being pulled by fishing rods.", + + "module.no-ghost-blocks": "No Ghost Blocks", + "module.no-ghost-blocks.description": "Attempts to prevent ghost blocks arising.", + "module.no-ghost-blocks.general.breaking": "Breaking", + "module.no-ghost-blocks.general.breaking.description": "Whether to apply for block breaking actions.", + "module.no-ghost-blocks.general.placing": "Placing", + "module.no-ghost-blocks.general.placing.description": "Whether to apply for block placement actions.", + + "module.bed-aura": "Bed Aura", + "module.bed-aura.description": "Automatically places and explodes beds in the Nether and End.", + "module.bed-aura.general.delay": "Delay", + "module.bed-aura.general.delay.description": "The delay between placing beds in ticks.", + "module.bed-aura.general.strict-direction": "Strict Direction", + "module.bed-aura.general.strict-direction.description": "Only places beds in the direction you are facing.", + "module.bed-aura.targeting.target-range": "Target Range", + "module.bed-aura.targeting.target-range.description": "The range at which players can be targeted.", + "module.bed-aura.targeting.target-priority": "Target Priority", + "module.bed-aura.targeting.target-priority.description": "How to filter targets within range.", + "module.bed-aura.targeting.min-damage": "Min Damage", + "module.bed-aura.targeting.min-damage.description": "The minimum damage to inflict on your target.", + "module.bed-aura.targeting.max-self-damage": "Max Self Damage", + "module.bed-aura.targeting.max-self-damage.description": "The maximum damage to inflict on yourself.", + "module.bed-aura.targeting.anti-suicide": "Anti Suicide", + "module.bed-aura.targeting.anti-suicide.description": "Will not place and break beds if they will kill you.", + "module.bed-aura.inventory.auto-move": "Auto Move", + "module.bed-aura.inventory.auto-move.description": "Moves beds into a selected hotbar slot.", + "module.bed-aura.inventory.auto-move-slot": "Auto Move Slot", + "module.bed-aura.inventory.auto-move-slot.description": "The slot auto move moves beds to.", + "module.bed-aura.inventory.auto-switch": "Auto Switch", + "module.bed-aura.inventory.auto-switch.description": "Switches to and from beds automatically.", + "module.bed-aura.pause.pause-on-eat": "Pause On Eat", + "module.bed-aura.pause.pause-on-eat.description": "Pauses while eating.", + "module.bed-aura.pause.pause-on-drink": "Pause On Drink", + "module.bed-aura.pause.pause-on-drink.description": "Pauses while drinking.", + "module.bed-aura.pause.pause-on-mine": "Pause On Mine", + "module.bed-aura.pause.pause-on-mine.description": "Pauses while mining.", + "module.bed-aura.render.swing": "Swing", + "module.bed-aura.render.swing.description": "Whether to swing hand client-side.", + "module.bed-aura.render.render": "Render", + "module.bed-aura.render.render.description": "Renders the block where it is placing a bed.", + "module.bed-aura.render.shape-mode": "Shape Mode", + "module.bed-aura.render.shape-mode.description": "How the shapes are rendered.", + "module.bed-aura.render.side-color": "Side Color", + "module.bed-aura.render.side-color.description": "The side color for positions to be placed.", + "module.bed-aura.render.line-color": "Line Color", + "module.bed-aura.render.line-color.description": "The line color for positions to be placed.", + + "module.auto-jump": "Auto Jump", + "module.auto-jump.description": "Automatically jumps.", + "module.auto-jump.general.mode": "Mode", + "module.auto-jump.general.mode.description": "The method of jumping.", + "module.auto-jump.general.jump-if": "Jump If", + "module.auto-jump.general.jump-if.description": "Jump if.", + "module.auto-jump.general.velocity-height": "Velocity Height", + "module.auto-jump.general.velocity-height.description": "The distance that velocity mode moves you.", + + "module.ambience": "Ambience", + "module.ambience.description": "Change the color of various pieces of the environment.", + "module.ambience.sky.end-sky": "End Sky", + "module.ambience.sky.end-sky.description": "Makes the sky like the end.", + "module.ambience.sky.custom-sky-color": "Custom Sky Color", + "module.ambience.sky.custom-sky-color.description": "Whether the sky color should be changed.", + "module.ambience.sky.overworld-sky-color": "Overworld Sky Color", + "module.ambience.sky.overworld-sky-color.description": "The color of the overworld sky.", + "module.ambience.sky.nether-sky-color": "Nether Sky Color", + "module.ambience.sky.nether-sky-color.description": "The color of the nether sky.", + "module.ambience.sky.end-sky-color": "End Sky Color", + "module.ambience.sky.end-sky-color.description": "The color of the end sky.", + "module.ambience.sky.custom-cloud-color": "Custom Cloud Color", + "module.ambience.sky.custom-cloud-color.description": "Whether the clouds color should be changed.", + "module.ambience.sky.cloud-color": "Cloud Color", + "module.ambience.sky.cloud-color.description": "The color of the clouds.", + "module.ambience.sky.custom-lightning-color": "Custom Lightning Color", + "module.ambience.sky.custom-lightning-color.description": "Whether the lightning color should be changed.", + "module.ambience.sky.lightning-color": "Lightning Color", + "module.ambience.sky.lightning-color.description": "The color of the lightning.", + "module.ambience.world.custom-grass-color": "Custom Grass Color", + "module.ambience.world.custom-grass-color.description": "Whether the grass color should be changed.", + "module.ambience.world.grass-color": "Grass Color", + "module.ambience.world.grass-color.description": "The color of the grass.", + "module.ambience.world.custom-foliage-color": "Custom Foliage Color", + "module.ambience.world.custom-foliage-color.description": "Whether the foliage color should be changed.", + "module.ambience.world.foliage-color": "Foliage Color", + "module.ambience.world.foliage-color.description": "The color of the foliage.", + "module.ambience.world.custom-water-color": "Custom Water Color", + "module.ambience.world.custom-water-color.description": "Whether the water color should be changed.", + "module.ambience.world.water-color": "Water Color", + "module.ambience.world.water-color.description": "The color of the water.", + "module.ambience.world.custom-lava-color": "Custom Lava Color", + "module.ambience.world.custom-lava-color.description": "Whether the lava color should be changed.", + "module.ambience.world.lava-color": "Lava Color", + "module.ambience.world.lava-color.description": "The color of the lava.", + "module.ambience.world.custom-fog-color": "Custom Fog Color", + "module.ambience.world.custom-fog-color.description": "Whether the fog color should be changed.", + "module.ambience.world.fog-color": "Fog Color", + "module.ambience.world.fog-color.description": "The color of the fog.", + + "module.better-tooltips": "Better Tooltips", + "module.better-tooltips.description": "Displays more useful tooltips for certain items.", + "module.better-tooltips.general.display-when": "Display When", + "module.better-tooltips.general.display-when.description": "When to display previews.", + "module.better-tooltips.general.keybind": "Keybind", + "module.better-tooltips.general.keybind.description": "The bind for keybind mode.", + "module.better-tooltips.general.open-contents": "Open Contents", + "module.better-tooltips.general.open-contents.description": "Opens a GUI window with the inventory of the storage block or book when you click the item.", + "module.better-tooltips.general.open-contents-keybind": "Open Contents Keybind", + "module.better-tooltips.general.open-contents-keybind.description": "Key to open contents (containers, books, etc.) when pressed on items.", + "module.better-tooltips.general.pause-in-creative": "Pause In Creative", + "module.better-tooltips.general.pause-in-creative.description": "Pauses middle click open while the player is in creative mode.", + "module.better-tooltips.previews.containers": "Containers", + "module.better-tooltips.previews.containers.description": "Shows a preview of a containers when hovering over it in an inventory.", + "module.better-tooltips.previews.compact-shulker-tooltip": "Compact Shulker Tooltip", + "module.better-tooltips.previews.compact-shulker-tooltip.description": "Compacts the lines of the shulker tooltip.", + "module.better-tooltips.previews.echests": "Echests", + "module.better-tooltips.previews.echests.description": "Shows a preview of your echest when hovering over it in an inventory.", + "module.better-tooltips.previews.maps": "Maps", + "module.better-tooltips.previews.maps.description": "Shows a preview of a map when hovering over it in an inventory.", + "module.better-tooltips.previews.map-scale": "Map Scale", + "module.better-tooltips.previews.map-scale.description": "The scale of the map preview.", + "module.better-tooltips.previews.books": "Books", + "module.better-tooltips.previews.books.description": "Shows contents of a book when hovering over it in an inventory.", + "module.better-tooltips.previews.banners": "Banners", + "module.better-tooltips.previews.banners.description": "Shows banners' patterns when hovering over it in an inventory. Also works with shields.", + "module.better-tooltips.previews.entities-in-buckets": "Entities In Buckets", + "module.better-tooltips.previews.entities-in-buckets.description": "Shows entities in buckets when hovering over it in an inventory.", + "module.better-tooltips.previews.bundles": "Bundles", + "module.better-tooltips.previews.bundles.description": "Shows a preview of bundle contents when hovering over it in an inventory.", + "module.better-tooltips.previews.food-info": "Food Info", + "module.better-tooltips.previews.food-info.description": "Shows hunger and saturation values for food items.", + "module.better-tooltips.other.byte-size": "Byte Size", + "module.better-tooltips.other.byte-size.description": "Displays an item's size in bytes in the tooltip.", + "module.better-tooltips.other.byte-size-format": "Byte Size Format", + "module.better-tooltips.other.byte-size-format.description": "The format by which to display the item's byte size.", + "module.better-tooltips.other.status-effects": "Status Effects", + "module.better-tooltips.other.status-effects.description": "Adds list of status effects to tooltips of food items.", + "module.better-tooltips.hide-flags.tooltip": "Tooltip", + "module.better-tooltips.hide-flags.tooltip.description": "Show the tooltip when it's hidden.", + "module.better-tooltips.hide-flags.tooltip-components": "Tooltip Components", + "module.better-tooltips.hide-flags.tooltip-components.description": "Shows tooltip components when they're hidden - e.g. enchantments, attributes, lore, etc.", + + "module.notifier": "Notifier", + "module.notifier.description": "Notifies you of different events.", + "module.notifier.totem-pops.totem-pops": "Totem Pops", + "module.notifier.totem-pops.totem-pops.description": "Notifies you when a player pops a totem.", + "module.notifier.totem-pops.distance-check": "Distance Check", + "module.notifier.totem-pops.distance-check.description": "Limits the distance in which the pops are recognized.", + "module.notifier.totem-pops.player-radius": "Player Radius", + "module.notifier.totem-pops.player-radius.description": "The radius in which to log totem pops.", + "module.notifier.totem-pops.ignore-own": "Ignore Own", + "module.notifier.totem-pops.ignore-own.description": "Ignores your own totem pops.", + "module.notifier.totem-pops.ignore-friends": "Ignore Friends", + "module.notifier.totem-pops.ignore-friends.description": "Ignores friends totem pops.", + "module.notifier.totem-pops.ignore-others": "Ignore Others", + "module.notifier.totem-pops.ignore-others.description": "Ignores other players totem pops.", + "module.notifier.visual-range.visual-range": "Visual Range", + "module.notifier.visual-range.visual-range.description": "Notifies you when an entity enters your render distance.", + "module.notifier.visual-range.event": "Event", + "module.notifier.visual-range.event.description": "When to log the entities.", + "module.notifier.visual-range.entities": "Entities", + "module.notifier.visual-range.entities.description": "Which entities to notify about.", + "module.notifier.visual-range.ignore-friends": "Ignore Friends", + "module.notifier.visual-range.ignore-friends.description": "Ignores friends.", + "module.notifier.visual-range.ignore-fake-players": "Ignore Fake Players", + "module.notifier.visual-range.ignore-fake-players.description": "Ignores fake players.", + "module.notifier.visual-range.sound": "Sound", + "module.notifier.visual-range.sound.description": "Emits a sound effect on enter / leave", + "module.notifier.pearl.pearl": "Pearl", + "module.notifier.pearl.pearl.description": "Notifies you when a player is teleported using an ender pearl.", + "module.notifier.pearl.ignore-own": "Ignore Own", + "module.notifier.pearl.ignore-own.description": "Ignores your own pearls.", + "module.notifier.pearl.ignore-friends": "Ignore Friends", + "module.notifier.pearl.ignore-friends.description": "Ignores friends pearls.", + "module.notifier.joins/leaves.player-joins-leaves": "Player Joins Leaves", + "module.notifier.joins/leaves.player-joins-leaves.description": "How to handle player join/leave notifications.", + "module.notifier.joins/leaves.notification-delay": "Notification Delay", + "module.notifier.joins/leaves.notification-delay.description": "How long to wait in ticks before posting the next join/leave notification in your chat.", + "module.notifier.joins/leaves.simple-notifications": "Simple Notifications", + "module.notifier.joins/leaves.simple-notifications.description": "Display join/leave notifications without a prefix, to reduce chat clutter.", + + "module.item-physics": "Item Physics", + "module.item-physics.description": "Applies physics to items on the ground.", + "module.item-physics.general.random-rotation": "Random Rotation", + "module.item-physics.general.random-rotation.description": "Adds a random rotation to every item.", + + "module.air-place": "Air Place", + "module.air-place.description": "Places a block where your crosshair is pointing at.", + "module.air-place.general.render": "Render", + "module.air-place.general.render.description": "Renders a block overlay where the obsidian will be placed.", + "module.air-place.general.shape-mode": "Shape Mode", + "module.air-place.general.shape-mode.description": "How the shapes are rendered.", + "module.air-place.general.side-color": "Side Color", + "module.air-place.general.side-color.description": "The color of the sides of the blocks being rendered.", + "module.air-place.general.line-color": "Line Color", + "module.air-place.general.line-color.description": "The color of the lines of the blocks being rendered.", + "module.air-place.range.custom-range": "Custom Range", + "module.air-place.range.custom-range.description": "Use custom range for air place.", + "module.air-place.range.range": "Range", + "module.air-place.range.range.description": "Custom range to place at.", + + "module.enderman-look": "Enderman Look", + "module.enderman-look.description": "Either looks at all Endermen or prevents you from looking at Endermen.", + "module.enderman-look.general.look-mode": "Look Mode", + "module.enderman-look.general.look-mode.description": "How this module behaves.", + "module.enderman-look.general.stun-hostiles": "Stun Hostiles", + "module.enderman-look.general.stun-hostiles.description": "Automatically stares at hostile endermen to stun them in place.", + + "module.excavator": "Excavator", + "module.excavator.description": "Excavate a selection area.", + "module.excavator.general.selection-bind": "Selection Bind", + "module.excavator.general.selection-bind.description": "Bind to draw selection.", + "module.excavator.general.log-selection": "Log Selection", + "module.excavator.general.log-selection.description": "Logs the selection coordinates to the chat.", + "module.excavator.general.keep-active": "Keep Active", + "module.excavator.general.keep-active.description": "Keep the module active after finishing the excavation.", + "module.excavator.rendering.shape-mode": "Shape Mode", + "module.excavator.rendering.shape-mode.description": "How the shapes are rendered.", + "module.excavator.rendering.side-color": "Side Color", + "module.excavator.rendering.side-color.description": "The side color.", + "module.excavator.rendering.line-color": "Line Color", + "module.excavator.rendering.line-color.description": "The line color.", + + "module.timer": "Timer", + "module.timer.description": "Changes the speed of everything in your game.", + "module.timer.general.multiplier": "Multiplier", + "module.timer.general.multiplier.description": "The timer multiplier amount.", + + "module.surround": "Surround", + "module.surround.description": "Surrounds you in blocks to prevent massive crystal damage.", + "module.surround.general.blocks": "Blocks", + "module.surround.general.blocks.description": "What blocks to use for surround.", + "module.surround.general.delay": "Delay", + "module.surround.general.delay.description": "Delay, in ticks, between block placements.", + "module.surround.general.blocks-per-tick": "Blocks Per Tick", + "module.surround.general.blocks-per-tick.description": "How many blocks to place in one tick.", + "module.surround.general.center": "Center", + "module.surround.general.center.description": "Teleports you to the center of the block.", + "module.surround.general.double-height": "Double Height", + "module.surround.general.double-height.description": "Places obsidian on top of the original surround blocks to prevent people from face-placing you.", + "module.surround.general.only-on-ground": "Only On Ground", + "module.surround.general.only-on-ground.description": "Works only when you are standing on blocks.", + "module.surround.general.air-place": "Air Place", + "module.surround.general.air-place.description": "Allows Surround to place blocks in the air.", + "module.surround.general.toggle-modules": "Toggle Modules", + "module.surround.general.toggle-modules.description": "Turn off other modules when surround is activated.", + "module.surround.general.toggle-back-on": "Toggle Back On", + "module.surround.general.toggle-back-on.description": "Turn the other modules back on when surround is deactivated.", + "module.surround.general.modules": "Modules", + "module.surround.general.modules.description": "Which modules to disable on activation.", + "module.surround.general.rotate": "Rotate", + "module.surround.general.rotate.description": "Automatically faces towards the obsidian being placed.", + "module.surround.general.protect": "Protect", + "module.surround.general.protect.description": "Attempts to break crystals around surround positions to prevent surround break.", + "module.surround.toggles.toggle-on-y-change": "Toggle On Y Change", + "module.surround.toggles.toggle-on-y-change.description": "Automatically disables when your y level changes (step, jumping, etc).", + "module.surround.toggles.toggle-on-complete": "Toggle On Complete", + "module.surround.toggles.toggle-on-complete.description": "Toggles off when all blocks are placed.", + "module.surround.toggles.toggle-on-death": "Toggle On Death", + "module.surround.toggles.toggle-on-death.description": "Toggles off when you die.", + "module.surround.render.swing": "Swing", + "module.surround.render.swing.description": "Render your hand swinging when placing surround blocks.", + "module.surround.render.render": "Render", + "module.surround.render.render.description": "Renders a block overlay where the obsidian will be placed.", + "module.surround.render.below": "Below", + "module.surround.render.below.description": "Renders the block below you.", + "module.surround.render.shape-mode": "Shape Mode", + "module.surround.render.shape-mode.description": "How the shapes are rendered.", + "module.surround.render.safe-side-color": "Safe Side Color", + "module.surround.render.safe-side-color.description": "The side color for safe blocks.", + "module.surround.render.safe-line-color": "Safe Line Color", + "module.surround.render.safe-line-color.description": "The line color for safe blocks.", + "module.surround.render.normal-side-color": "Normal Side Color", + "module.surround.render.normal-side-color.description": "The side color for normal blocks.", + "module.surround.render.normal-line-color": "Normal Line Color", + "module.surround.render.normal-line-color.description": "The line color for normal blocks.", + "module.surround.render.unsafe-side-color": "Unsafe Side Color", + "module.surround.render.unsafe-side-color.description": "The side color for unsafe blocks.", + "module.surround.render.unsafe-line-color": "Unsafe Line Color", + "module.surround.render.unsafe-line-color.description": "The line color for unsafe blocks.", + + "module.no-rotate": "No Rotate", + "module.no-rotate.description": "Attempts to block rotations sent from server to client.", + + "module.long-jump": "Long Jump", + "module.long-jump.description": "Allows you to jump further than normal.", + "module.long-jump.general.mode": "Mode", + "module.long-jump.general.mode.description": "The method of jumping.", + "module.long-jump.general.vanilla-boost-factor": "Vanilla Boost Factor", + "module.long-jump.general.vanilla-boost-factor.description": "The amount by which to boost the jump.", + "module.long-jump.general.burst-initial-speed": "Burst Initial Speed", + "module.long-jump.general.burst-initial-speed.description": "The initial speed of the runup.", + "module.long-jump.general.burst-boost-factor": "Burst Boost Factor", + "module.long-jump.general.burst-boost-factor.description": "The amount by which to boost the jump.", + "module.long-jump.general.only-on-ground": "Only On Ground", + "module.long-jump.general.only-on-ground.description": "Only performs the jump if you are on the ground.", + "module.long-jump.general.on-jump": "On Jump", + "module.long-jump.general.on-jump.description": "Whether the player needs to jump first or not.", + "module.long-jump.general.glide-multiplier": "Glide Multiplier", + "module.long-jump.general.glide-multiplier.description": "The amount by to multiply the glide velocity.", + "module.long-jump.general.timer": "Timer", + "module.long-jump.general.timer.description": "Timer override.", + "module.long-jump.general.auto-disable": "Auto Disable", + "module.long-jump.general.auto-disable.description": "Automatically disabled the module after jumping.", + "module.long-jump.general.disable-on-rubberband": "Disable On Rubberband", + "module.long-jump.general.disable-on-rubberband.description": "Disables the module when you get lagged back.", + + "module.trajectories": "Trajectories", + "module.trajectories.description": "Predicts the trajectory of throwable items.", + "module.trajectories.general.items": "Items", + "module.trajectories.general.items.description": "Items to display trajectories for.", + "module.trajectories.general.other-players": "Other Players", + "module.trajectories.general.other-players.description": "Calculates trajectories for other players.", + "module.trajectories.general.fired-projectiles": "Fired Projectiles", + "module.trajectories.general.fired-projectiles.description": "Calculates trajectories for already fired projectiles.", + "module.trajectories.general.ignore-wither-skulls": "Ignore Wither Skulls", + "module.trajectories.general.ignore-wither-skulls.description": "Whether to ignore fired wither skulls.", + "module.trajectories.general.accurate": "Accurate", + "module.trajectories.general.accurate.description": "Whether or not to calculate more accurate.", + "module.trajectories.general.simulation-steps": "Simulation Steps", + "module.trajectories.general.simulation-steps.description": "How many steps to simulate projectiles. Zero for no limit", + "module.trajectories.render.ignore-rendering-first-ticks": "Ignore Rendering First Ticks", + "module.trajectories.render.ignore-rendering-first-ticks.description": "Ignores rendering the first given ticks, to make the rest of the path more visible.", + "module.trajectories.render.shape-mode": "Shape Mode", + "module.trajectories.render.shape-mode.description": "How the shapes are rendered.", + "module.trajectories.render.side-color": "Side Color", + "module.trajectories.render.side-color.description": "The side color.", + "module.trajectories.render.line-color": "Line Color", + "module.trajectories.render.line-color.description": "The line color.", + "module.trajectories.render.render-position-boxes": "Render Position Boxes", + "module.trajectories.render.render-position-boxes.description": "Renders the actual position the projectile will be at each tick along it's trajectory.", + "module.trajectories.render.position-box-size": "Position Box Size", + "module.trajectories.render.position-box-size.description": "The size of the box drawn at the simulated positions.", + "module.trajectories.render.position-side-color": "Position Side Color", + "module.trajectories.render.position-side-color.description": "The side color.", + "module.trajectories.render.position-line-color": "Position Line Color", + "module.trajectories.render.position-line-color.description": "The line color.", + + "module.chams": "Chams", + "module.chams.description": "Tweaks rendering of entities.", + "module.chams.through-walls.entities": "Entities", + "module.chams.through-walls.entities.description": "Select entities to show through walls.", + "module.chams.through-walls.shader": "Shader", + "module.chams.through-walls.shader.description": "Renders a shader over of the entities.", + "module.chams.through-walls.color": "Color", + "module.chams.through-walls.color.description": "The color that the shader is drawn with.", + "module.chams.through-walls.ignore-self": "Ignore Self", + "module.chams.through-walls.ignore-self.description": "Ignores yourself drawing the player.", + "module.chams.players.players": "Players", + "module.chams.players.players.description": "Enables model tweaks for players.", + "module.chams.players.ignore-self": "Ignore Self", + "module.chams.players.ignore-self.description": "Ignores yourself when tweaking player models.", + "module.chams.players.texture": "Texture", + "module.chams.players.texture.description": "Enables player model textures.", + "module.chams.players.color": "Color", + "module.chams.players.color.description": "The color of player models.", + "module.chams.players.scale": "Scale", + "module.chams.players.scale.description": "Players scale.", + "module.chams.crystals.crystals": "Crystals", + "module.chams.crystals.crystals.description": "Enables model tweaks for end crystals.", + "module.chams.crystals.scale": "Scale", + "module.chams.crystals.scale.description": "Crystal scale.", + "module.chams.crystals.bounce": "Bounce", + "module.chams.crystals.bounce.description": "How high crystals bounce.", + "module.chams.crystals.rotation-speed": "Rotation Speed", + "module.chams.crystals.rotation-speed.description": "Multiplies the rotation speed of the crystal.", + "module.chams.crystals.texture": "Texture", + "module.chams.crystals.texture.description": "Whether to render crystal model textures.", + "module.chams.crystals.crystal-color": "Crystal Color", + "module.chams.crystals.crystal-color.description": "The color of the of the crystal.", + "module.chams.hand.enabled": "Enabled", + "module.chams.hand.enabled.description": "Enables tweaks of hand rendering.", + "module.chams.hand.texture": "Texture", + "module.chams.hand.texture.description": "Whether to render hand textures.", + "module.chams.hand.hand-color": "Hand Color", + "module.chams.hand.hand-color.description": "The color of your hand.", + + "module.server-spoof": "Server Spoof", + "module.server-spoof.description": "Spoof client brand, resource pack and channels.", + "module.server-spoof.general.spoof-brand": "Spoof Brand", + "module.server-spoof.general.spoof-brand.description": "Whether or not to spoof the brand.", + "module.server-spoof.general.brand": "Brand", + "module.server-spoof.general.brand.description": "Specify the brand that will be send to the server.", + "module.server-spoof.general.resource-pack": "Resource Pack", + "module.server-spoof.general.resource-pack.description": "Spoof accepting server resource pack.", + "module.server-spoof.general.block-channels": "Block Channels", + "module.server-spoof.general.block-channels.description": "Whether or not to block some channels.", + "module.server-spoof.general.channels": "Channels", + "module.server-spoof.general.channels.description": "If the channel contains the keyword, this outgoing channel will be blocked.", + + "module.fullbright": "Fullbright", + "module.fullbright.description": "Lights up your world!", + "module.fullbright.general.mode": "Mode", + "module.fullbright.general.mode.description": "The mode to use for Fullbright.", + "module.fullbright.general.light-type": "Light Type", + "module.fullbright.general.light-type.description": "Which type of light to use for Luminance mode.", + "module.fullbright.general.minimum-light-level": "Minimum Light Level", + "module.fullbright.general.minimum-light-level.description": "Minimum light level when using Luminance mode.", + + "module.freecam": "Freecam", + "module.freecam.description": "Allows the camera to move away from the player.", + "module.freecam.general.speed": "Speed", + "module.freecam.general.speed.description": "Your speed while in freecam.", + "module.freecam.general.speed-scroll-sensitivity": "Speed Scroll Sensitivity", + "module.freecam.general.speed-scroll-sensitivity.description": "Allows you to change speed value using scroll wheel. 0 to disable.", + "module.freecam.general.stay-sneaking": "Stay Sneaking", + "module.freecam.general.stay-sneaking.description": "If you are sneaking when you enter freecam, whether your player should remain sneaking.", + "module.freecam.general.toggle-on-damage": "Toggle On Damage", + "module.freecam.general.toggle-on-damage.description": "Disables freecam when you take damage.", + "module.freecam.general.toggle-on-death": "Toggle On Death", + "module.freecam.general.toggle-on-death.description": "Disables freecam when you die.", + "module.freecam.general.toggle-on-log": "Toggle On Log", + "module.freecam.general.toggle-on-log.description": "Disables freecam when you disconnect from a server.", + "module.freecam.general.reload-chunks": "Reload Chunks", + "module.freecam.general.reload-chunks.description": "Disables cave culling.", + "module.freecam.general.show-hands": "Show Hands", + "module.freecam.general.show-hands.description": "Whether or not to render your hands in freecam.", + "module.freecam.general.rotate": "Rotate", + "module.freecam.general.rotate.description": "Rotates to the block or entity you are looking at.", + "module.freecam.general.static": "Static", + "module.freecam.general.static.description": "Disables settings that move the view.", + "module.freecam.pathing.click-to-path": "Click To Path", + "module.freecam.pathing.click-to-path.description": "Sets a pathfinding goal to any block/entity you click at.", + "module.freecam.pathing.double-click": "Double Click", + "module.freecam.pathing.double-click.description": "Require two clicks to start pathing.", + + "module.exp-thrower": "Exp Thrower", + "module.exp-thrower.description": "Automatically throws XP bottles from your hotbar.", + + "module.auto-totem": "Auto Totem", + "module.auto-totem.description": "Automatically equips a totem in your offhand.", + "module.auto-totem.general.mode": "Mode", + "module.auto-totem.general.mode.description": "Determines when to hold a totem, strict will always hold.", + "module.auto-totem.general.delay": "Delay", + "module.auto-totem.general.delay.description": "The ticks between slot movements.", + "module.auto-totem.general.health": "Health", + "module.auto-totem.general.health.description": "The health to hold a totem at.", + "module.auto-totem.general.elytra": "Elytra", + "module.auto-totem.general.elytra.description": "Will always hold a totem when flying with elytra.", + "module.auto-totem.general.fall": "Fall", + "module.auto-totem.general.fall.description": "Will hold a totem when fall damage could kill you.", + "module.auto-totem.general.explosion": "Explosion", + "module.auto-totem.general.explosion.description": "Will hold a totem when explosion damage could kill you.", + + "module.book-bot": "Book Bot", + "module.book-bot.description": "Automatically writes in books.", + "module.book-bot.general.mode": "Mode", + "module.book-bot.general.mode.description": "What kind of text to write.", + "module.book-bot.general.pages": "Pages", + "module.book-bot.general.pages.description": "The number of pages to write per book.", + "module.book-bot.general.ascii-only": "Ascii Only", + "module.book-bot.general.ascii-only.description": "Only uses the characters in the ASCII charset.", + "module.book-bot.general.delay": "Delay", + "module.book-bot.general.delay.description": "The amount of delay between writing books.", + "module.book-bot.general.sign": "Sign", + "module.book-bot.general.sign.description": "Whether to sign the book.", + "module.book-bot.general.name": "Name", + "module.book-bot.general.name.description": "The name you want to give your books.", + "module.book-bot.general.append-count": "Append Count", + "module.book-bot.general.append-count.description": "Whether to append the number of the book to the title.", + "module.book-bot.general.word-wrap": "Word Wrap", + "module.book-bot.general.word-wrap.description": "Prevents words from being cut in the middle of lines.", + + "module.auto-gap": "Auto Gap", + "module.auto-gap.description": "Automatically eats Gaps or E-Gaps.", + "module.auto-gap.general.allow-egap": "Allow Egap", + "module.auto-gap.general.allow-egap.description": "Allow eating E-Gaps over Gaps if found.", + "module.auto-gap.general.always": "Always", + "module.auto-gap.general.always.description": "If it should always eat.", + "module.auto-gap.general.pause-auras": "Pause Auras", + "module.auto-gap.general.pause-auras.description": "Pauses all auras when eating.", + "module.auto-gap.general.pause-baritone": "Pause Baritone", + "module.auto-gap.general.pause-baritone.description": "Pause baritone when eating.", + "module.auto-gap.potions.before-expiry": "Before Expiry", + "module.auto-gap.potions.before-expiry.description": "If it should eat before potion effects expire.", + "module.auto-gap.potions.expiry-threshold": "Expiry Threshold", + "module.auto-gap.potions.expiry-threshold.description": "Time in ticks before the potion effect expires to start eating.", + "module.auto-gap.potions.potions-regeneration": "Potions Regeneration", + "module.auto-gap.potions.potions-regeneration.description": "If it should eat when Regeneration runs out.", + "module.auto-gap.potions.potions-fire-resistance": "Potions Fire Resistance", + "module.auto-gap.potions.potions-fire-resistance.description": "If it should eat when Fire Resistance runs out. Requires E-Gaps.", + "module.auto-gap.potions.potions-absorption": "Potions Absorption", + "module.auto-gap.potions.potions-absorption.description": "If it should eat when Absorption runs out. Requires E-Gaps.", + "module.auto-gap.health.health-enabled": "Health Enabled", + "module.auto-gap.health.health-enabled.description": "If it should eat when health drops below threshold.", + "module.auto-gap.health.health-threshold": "Health Threshold", + "module.auto-gap.health.health-threshold.description": "Health threshold to eat at. Includes absorption.", + + "module.middle-click-extra": "Middle Click Extra", + "module.middle-click-extra.description": "Perform various actions when you middle click.", + "module.middle-click-extra.general.mode": "Mode", + "module.middle-click-extra.general.mode.description": "Which item to use when you middle click.", + "module.middle-click-extra.general.send-message": "Send Message", + "module.middle-click-extra.general.send-message.description": "Sends a message when you add a player as a friend.", + "module.middle-click-extra.general.message-to-send": "Message To Send", + "module.middle-click-extra.general.message-to-send.description": "Message to send when you add a player as a friend (use %player for the player's name)", + "module.middle-click-extra.general.quick-swap": "Quick Swap", + "module.middle-click-extra.general.quick-swap.description": "Allows you to use items in your inventory by simulating hotbar key presses. May get flagged by anticheats.", + "module.middle-click-extra.general.swap-back": "Swap Back", + "module.middle-click-extra.general.swap-back.description": "Swap back to your original slot when you finish using an item.", + "module.middle-click-extra.general.disable-in-creative": "Disable In Creative", + "module.middle-click-extra.general.disable-in-creative.description": "Middle click action is disabled in Creative mode.", + "module.middle-click-extra.general.notify": "Notify", + "module.middle-click-extra.general.notify.description": "Notifies you when you do not have the specified item in your hotbar.", + + "module.logout-spots": "Logout Spots", + "module.logout-spots.description": "Displays a box where another player has logged out at.", + "module.logout-spots.general.scale": "Scale", + "module.logout-spots.general.scale.description": "The scale.", + "module.logout-spots.general.full-height": "Full Height", + "module.logout-spots.general.full-height.description": "Displays the height as the player's full height.", + "module.logout-spots.render.shape-mode": "Shape Mode", + "module.logout-spots.render.shape-mode.description": "How the shapes are rendered.", + "module.logout-spots.render.side-color": "Side Color", + "module.logout-spots.render.side-color.description": "The side color.", + "module.logout-spots.render.line-color": "Line Color", + "module.logout-spots.render.line-color.description": "The line color.", + "module.logout-spots.render.name-color": "Name Color", + "module.logout-spots.render.name-color.description": "The name color.", + "module.logout-spots.render.name-background-color": "Name Background Color", + "module.logout-spots.render.name-background-color.description": "The name background color.", + + "module.sound-blocker": "Sound Blocker", + "module.sound-blocker.description": "Cancels out selected sounds.", + "module.sound-blocker.general.sounds": "Sounds", + "module.sound-blocker.general.sounds.description": "Sounds to block.", + + "module.vein-miner": "Vein Miner", + "module.vein-miner.description": "Mines all nearby blocks with this type", + "module.vein-miner.general.blocks": "Blocks", + "module.vein-miner.general.blocks.description": "Which blocks to select.", + "module.vein-miner.general.mode": "Mode", + "module.vein-miner.general.mode.description": "Selection mode.", + "module.vein-miner.general.depth": "Depth", + "module.vein-miner.general.depth.description": "Amount of iterations used to scan for similar blocks.", + "module.vein-miner.general.delay": "Delay", + "module.vein-miner.general.delay.description": "Delay between mining blocks.", + "module.vein-miner.general.rotate": "Rotate", + "module.vein-miner.general.rotate.description": "Sends rotation packets to the server when mining.", + "module.vein-miner.render.swing-hand": "Swing Hand", + "module.vein-miner.render.swing-hand.description": "Swing hand client-side.", + "module.vein-miner.render.render": "Render", + "module.vein-miner.render.render.description": "Whether or not to render the block being mined.", + "module.vein-miner.render.shape-mode": "Shape Mode", + "module.vein-miner.render.shape-mode.description": "How the shapes are rendered.", + "module.vein-miner.render.side-color": "Side Color", + "module.vein-miner.render.side-color.description": "The color of the sides of the blocks being rendered.", + "module.vein-miner.render.line-color": "Line Color", + "module.vein-miner.render.line-color.description": "The color of the lines of the blocks being rendered.", + + "module.nuker": "Nuker", + "module.nuker.description": "Breaks blocks around you.", + "module.nuker.general.shape": "Shape", + "module.nuker.general.shape.description": "The shape of nuking algorithm.", + "module.nuker.general.mode": "Mode", + "module.nuker.general.mode.description": "The way the blocks are broken.", + "module.nuker.general.range": "Range", + "module.nuker.general.range.description": "The break range.", + "module.nuker.general.up": "Up", + "module.nuker.general.up.description": "The break range.", + "module.nuker.general.down": "Down", + "module.nuker.general.down.description": "The break range.", + "module.nuker.general.left": "Left", + "module.nuker.general.left.description": "The break range.", + "module.nuker.general.right": "Right", + "module.nuker.general.right.description": "The break range.", + "module.nuker.general.forward": "Forward", + "module.nuker.general.forward.description": "The break range.", + "module.nuker.general.back": "Back", + "module.nuker.general.back.description": "The break range.", + "module.nuker.general.walls-range": "Walls Range", + "module.nuker.general.walls-range.description": "Range in which to break when behind blocks.", + "module.nuker.general.delay": "Delay", + "module.nuker.general.delay.description": "Delay in ticks between breaking blocks.", + "module.nuker.general.max-blocks-per-tick": "Max Blocks Per Tick", + "module.nuker.general.max-blocks-per-tick.description": "Maximum blocks to try to break per tick. Useful when insta mining.", + "module.nuker.general.sort-mode": "Sort Mode", + "module.nuker.general.sort-mode.description": "The blocks you want to mine first.", + "module.nuker.general.packet-mine": "Packet Mine", + "module.nuker.general.packet-mine.description": "Attempt to instamine everything at once.", + "module.nuker.general.only-suitable-tools": "Only Suitable Tools", + "module.nuker.general.only-suitable-tools.description": "Only mines when using an appropriate for the block.", + "module.nuker.general.interact": "Interact", + "module.nuker.general.interact.description": "Interacts with the block instead of mining.", + "module.nuker.general.rotate": "Rotate", + "module.nuker.general.rotate.description": "Rotates server-side to the block being mined.", + "module.nuker.whitelist.list-mode": "List Mode", + "module.nuker.whitelist.list-mode.description": "Selection mode.", + "module.nuker.whitelist.blacklist": "Blacklist", + "module.nuker.whitelist.blacklist.description": "The blocks you don't want to mine.", + "module.nuker.whitelist.whitelist": "Whitelist", + "module.nuker.whitelist.whitelist.description": "The blocks you want to mine.", + "module.nuker.whitelist.select-block-bind": "Select Block Bind", + "module.nuker.whitelist.select-block-bind.description": "Adds targeted block to list when this button is pressed.", + "module.nuker.render.swing": "Swing", + "module.nuker.render.swing.description": "Whether to swing hand client-side.", + "module.nuker.render.bounding-box": "Bounding Box", + "module.nuker.render.bounding-box.description": "Enable rendering bounding box for Cube and Uniform Cube.", + "module.nuker.render.nuke-box-mode": "Nuke Box Mode", + "module.nuker.render.nuke-box-mode.description": "How the shape for the bounding box is rendered.", + "module.nuker.render.side-color": "Side Color", + "module.nuker.render.side-color.description": "The side color of the bounding box.", + "module.nuker.render.line-color": "Line Color", + "module.nuker.render.line-color.description": "The line color of the bounding box.", + "module.nuker.render.broken-blocks": "Broken Blocks", + "module.nuker.render.broken-blocks.description": "Enable rendering bounding box for Cube and Uniform Cube.", + "module.nuker.render.nuke-block-mode": "Nuke Block Mode", + "module.nuker.render.nuke-block-mode.description": "How the shapes for broken blocks are rendered.", + "module.nuker.render.breaking-side-color": "Breaking Side Color", + "module.nuker.render.breaking-side-color.description": "The side color of the target block rendering.", + "module.nuker.render.breaking-line-color": "Breaking Line Color", + "module.nuker.render.breaking-line-color.description": "The line color of the target block rendering.", + + "module.auto-trap": "Auto Trap", + "module.auto-trap.description": "Traps people in a box to prevent them from moving.", + "module.auto-trap.general.whitelist": "Whitelist", + "module.auto-trap.general.whitelist.description": "Which blocks to use.", + "module.auto-trap.general.place-range": "Place Range", + "module.auto-trap.general.place-range.description": "The range at which blocks can be placed.", + "module.auto-trap.general.walls-range": "Walls Range", + "module.auto-trap.general.walls-range.description": "Range in which to place when behind blocks.", + "module.auto-trap.general.target-priority": "Target Priority", + "module.auto-trap.general.target-priority.description": "How to select the player to target.", + "module.auto-trap.general.target-range": "Target Range", + "module.auto-trap.general.target-range.description": "The maximum distance to target players.", + "module.auto-trap.general.place-delay": "Place Delay", + "module.auto-trap.general.place-delay.description": "How many ticks between block placements.", + "module.auto-trap.general.blocks-per-tick": "Blocks Per Tick", + "module.auto-trap.general.blocks-per-tick.description": "How many blocks to place in one tick.", + "module.auto-trap.general.top-blocks": "Top Blocks", + "module.auto-trap.general.top-blocks.description": "Which blocks to place on the top half of the target.", + "module.auto-trap.general.bottom-blocks": "Bottom Blocks", + "module.auto-trap.general.bottom-blocks.description": "Which blocks to place on the bottom half of the target.", + "module.auto-trap.general.self-toggle": "Self Toggle", + "module.auto-trap.general.self-toggle.description": "Turns off after placing all blocks.", + "module.auto-trap.general.rotate": "Rotate", + "module.auto-trap.general.rotate.description": "Rotates towards blocks when placing.", + "module.auto-trap.render.render": "Render", + "module.auto-trap.render.render.description": "Renders an overlay where blocks will be placed.", + "module.auto-trap.render.shape-mode": "Shape Mode", + "module.auto-trap.render.shape-mode.description": "How the shapes are rendered.", + "module.auto-trap.render.side-color": "Side Color", + "module.auto-trap.render.side-color.description": "The side color of the target block rendering.", + "module.auto-trap.render.line-color": "Line Color", + "module.auto-trap.render.line-color.description": "The line color of the target block rendering.", + "module.auto-trap.render.next-side-color": "Next Side Color", + "module.auto-trap.render.next-side-color.description": "The side color of the next block to be placed.", + "module.auto-trap.render.next-line-color": "Next Line Color", + "module.auto-trap.render.next-line-color.description": "The line color of the next block to be placed.", + + "module.wall-hack": "Wall Hack", + "module.wall-hack.description": "Makes blocks translucent.", + "module.wall-hack.general.opacity": "Opacity", + "module.wall-hack.general.opacity.description": "The opacity for rendered blocks.", + "module.wall-hack.general.blocks": "Blocks", + "module.wall-hack.general.blocks.description": "What blocks should be targeted for Wall Hack.", + "module.wall-hack.general.occlude-chunks": "Occlude Chunks", + "module.wall-hack.general.occlude-chunks.description": "Whether caves should occlude underground (may look wonky when on).", + + "module.no-render": "No Render", + "module.no-render.description": "Disables certain animations or overlays from rendering.", + "module.no-render.overlay.portal-overlay": "Portal Overlay", + "module.no-render.overlay.portal-overlay.description": "Disables rendering of the nether portal overlay.", + "module.no-render.overlay.spyglass-overlay": "Spyglass Overlay", + "module.no-render.overlay.spyglass-overlay.description": "Disables rendering of the spyglass overlay.", + "module.no-render.overlay.nausea": "Nausea", + "module.no-render.overlay.nausea.description": "Disables rendering of the nausea overlay.", + "module.no-render.overlay.pumpkin-overlay": "Pumpkin Overlay", + "module.no-render.overlay.pumpkin-overlay.description": "Disables rendering of the pumpkin head overlay", + "module.no-render.overlay.powdered-snow-overlay": "Powdered Snow Overlay", + "module.no-render.overlay.powdered-snow-overlay.description": "Disables rendering of the powdered snow overlay.", + "module.no-render.overlay.fire-overlay": "Fire Overlay", + "module.no-render.overlay.fire-overlay.description": "Disables rendering of the fire overlay.", + "module.no-render.overlay.liquid-overlay": "Liquid Overlay", + "module.no-render.overlay.liquid-overlay.description": "Disables rendering of the liquid overlay.", + "module.no-render.overlay.in-wall-overlay": "In Wall Overlay", + "module.no-render.overlay.in-wall-overlay.description": "Disables rendering of the overlay when inside blocks.", + "module.no-render.overlay.vignette": "Vignette", + "module.no-render.overlay.vignette.description": "Disables rendering of the vignette overlay.", + "module.no-render.overlay.gui-background": "Gui Background", + "module.no-render.overlay.gui-background.description": "Disables rendering of the GUI background overlay.", + "module.no-render.overlay.totem-animation": "Totem Animation", + "module.no-render.overlay.totem-animation.description": "Disables rendering of the totem animation when you pop a totem.", + "module.no-render.overlay.eating-particles": "Eating Particles", + "module.no-render.overlay.eating-particles.description": "Disables rendering of eating particles.", + "module.no-render.overlay.enchantment-glint": "Enchantment Glint", + "module.no-render.overlay.enchantment-glint.description": "Disables rending of the enchantment glint.", + "module.no-render.hud.boss-bar": "Boss Bar", + "module.no-render.hud.boss-bar.description": "Disable rendering of boss bars.", + "module.no-render.hud.scoreboard": "Scoreboard", + "module.no-render.hud.scoreboard.description": "Disable rendering of the scoreboard.", + "module.no-render.hud.crosshair": "Crosshair", + "module.no-render.hud.crosshair.description": "Disables rendering of the crosshair.", + "module.no-render.hud.title": "Title", + "module.no-render.hud.title.description": "Disables rendering of the title.", + "module.no-render.hud.held-item-name": "Held Item Name", + "module.no-render.hud.held-item-name.description": "Disables rendering of the held item name.", + "module.no-render.hud.obfuscation": "Obfuscation", + "module.no-render.hud.obfuscation.description": "Disables obfuscation styling of characters.", + "module.no-render.hud.potion-icons": "Potion Icons", + "module.no-render.hud.potion-icons.description": "Disables rendering of status effect icons.", + "module.no-render.hud.message-signature-indicator": "Message Signature Indicator", + "module.no-render.hud.message-signature-indicator.description": "Disables chat message signature indicator on the left of the message.", + "module.no-render.world.weather": "Weather", + "module.no-render.world.weather.description": "Disables rendering of weather.", + "module.no-render.world.world-border": "World Border", + "module.no-render.world.world-border.description": "Disables rendering of the world border.", + "module.no-render.world.blindness": "Blindness", + "module.no-render.world.blindness.description": "Disables rendering of blindness.", + "module.no-render.world.darkness": "Darkness", + "module.no-render.world.darkness.description": "Disables rendering of darkness.", + "module.no-render.world.fog": "Fog", + "module.no-render.world.fog.description": "Disables rendering of fog.", + "module.no-render.world.enchantment-table-book": "Enchantment Table Book", + "module.no-render.world.enchantment-table-book.description": "Disables rendering of books above enchanting tables.", + "module.no-render.world.sign-text": "Sign Text", + "module.no-render.world.sign-text.description": "Disables rendering of text on signs.", + "module.no-render.world.block-break-particles": "Block Break Particles", + "module.no-render.world.block-break-particles.description": "Disables rendering of block-break particles.", + "module.no-render.world.block-break-overlay": "Block Break Overlay", + "module.no-render.world.block-break-overlay.description": "Disables rendering of block-break overlay.", + "module.no-render.world.beacon-beams": "Beacon Beams", + "module.no-render.world.beacon-beams.description": "Disables rendering of beacon beams.", + "module.no-render.world.falling-blocks": "Falling Blocks", + "module.no-render.world.falling-blocks.description": "Disables rendering of falling blocks.", + "module.no-render.world.cave-culling": "Cave Culling", + "module.no-render.world.cave-culling.description": "Disables Minecraft's cave culling algorithm.", + "module.no-render.world.map-markers": "Map Markers", + "module.no-render.world.map-markers.description": "Disables markers on maps.", + "module.no-render.world.map-contents": "Map Contents", + "module.no-render.world.map-contents.description": "Disable rendering of maps.", + "module.no-render.world.banners": "Banners", + "module.no-render.world.banners.description": "Changes rendering of banners.", + "module.no-render.world.firework-explosions": "Firework Explosions", + "module.no-render.world.firework-explosions.description": "Disables rendering of firework explosions.", + "module.no-render.world.particles": "Particles", + "module.no-render.world.particles.description": "Particles to not render.", + "module.no-render.world.barrier-invisibility": "Barrier Invisibility", + "module.no-render.world.barrier-invisibility.description": "Disables barriers being invisible when not holding one.", + "module.no-render.world.texture-rotations": "Texture Rotations", + "module.no-render.world.texture-rotations.description": "Changes texture rotations and model offsets to use a constant value instead of the block position.", + "module.no-render.world.block-entities": "Block Entities", + "module.no-render.world.block-entities.description": "Block entities (chest, shulker block, etc.) to not render.", + "module.no-render.entity.entities": "Entities", + "module.no-render.entity.entities.description": "Disables rendering of selected entities.", + "module.no-render.entity.drop-spawn-packets": "Drop Spawn Packets", + "module.no-render.entity.drop-spawn-packets.description": "WARNING! Drops all spawn packets of entities selected in the above list.", + "module.no-render.entity.armor": "Armor", + "module.no-render.entity.armor.description": "Disables rendering of armor on entities.", + "module.no-render.entity.invisibility": "Invisibility", + "module.no-render.entity.invisibility.description": "Shows invisible entities.", + "module.no-render.entity.glowing": "Glowing", + "module.no-render.entity.glowing.description": "Disables rendering of the glowing effect", + "module.no-render.entity.spawner-entities": "Spawner Entities", + "module.no-render.entity.spawner-entities.description": "Disables rendering of spinning mobs inside of mob spawners", + "module.no-render.entity.dead-entities": "Dead Entities", + "module.no-render.entity.dead-entities.description": "Disables rendering of dead entities", + "module.no-render.entity.nametags": "Nametags", + "module.no-render.entity.nametags.description": "Disables rendering of entity nametags", + + "module.hand-view": "Hand View", + "module.hand-view.description": "Alters the way items are rendered in your hands.", + "module.hand-view.general.server-rotations": "Server Rotations", + "module.hand-view.general.server-rotations.description": "Makes your hands follow your serverside rotations.", + "module.hand-view.general.old-animations": "Old Animations", + "module.hand-view.general.old-animations.description": "Changes hit animations to those like 1.8", + "module.hand-view.general.skip-swapping-animation": "Skip Swapping Animation", + "module.hand-view.general.skip-swapping-animation.description": "Whether or not to skip the item swapping animation", + "module.hand-view.general.disable-eating-animation": "Disable Eating Animation", + "module.hand-view.general.disable-eating-animation.description": "Disables the eating animation. Potentially desirable if it goes offscreen.", + "module.hand-view.general.swing-mode": "Swing Mode", + "module.hand-view.general.swing-mode.description": "Modifies your client & server hand swinging.", + "module.hand-view.general.swing-speed": "Swing Speed", + "module.hand-view.general.swing-speed.description": "The swing speed of your hands.", + "module.hand-view.general.main-hand-progress": "Main Hand Progress", + "module.hand-view.general.main-hand-progress.description": "The swing progress of your main hand.", + "module.hand-view.general.off-hand-progress": "Off Hand Progress", + "module.hand-view.general.off-hand-progress.description": "The swing progress of your off hand.", + "module.hand-view.main-hand.scale": "Scale", + "module.hand-view.main-hand.scale.description": "The scale of your main hand.", + "module.hand-view.main-hand.position": "Position", + "module.hand-view.main-hand.position.description": "The position of your main hand.", + "module.hand-view.main-hand.rotation": "Rotation", + "module.hand-view.main-hand.rotation.description": "The rotation of your main hand.", + "module.hand-view.off-hand.scale": "Scale", + "module.hand-view.off-hand.scale.description": "The scale of your off hand.", + "module.hand-view.off-hand.position": "Position", + "module.hand-view.off-hand.position.description": "The position of your off hand.", + "module.hand-view.off-hand.rotation": "Rotation", + "module.hand-view.off-hand.rotation.description": "The rotation of your off hand.", + "module.hand-view.arm.scale": "Scale", + "module.hand-view.arm.position": "Position", + "module.hand-view.arm.rotation": "Rotation", + + "module.instant-rebreak": "Instant Rebreak", + "module.instant-rebreak.description": "Instantly re-breaks blocks in the same position.", + "module.instant-rebreak.general.delay": "Delay", + "module.instant-rebreak.general.delay.description": "The delay between break attempts.", + "module.instant-rebreak.general.only-pick": "Only Pick", + "module.instant-rebreak.general.only-pick.description": "Only tries to mine the block if you are holding a pickaxe.", + "module.instant-rebreak.general.rotate": "Rotate", + "module.instant-rebreak.general.rotate.description": "Faces the block being mined server side.", + "module.instant-rebreak.render.render": "Render", + "module.instant-rebreak.render.render.description": "Renders an overlay on the block being broken.", + "module.instant-rebreak.render.shape-mode": "Shape Mode", + "module.instant-rebreak.render.shape-mode.description": "How the shapes are rendered.", + "module.instant-rebreak.render.side-color": "Side Color", + "module.instant-rebreak.render.side-color.description": "The color of the sides of the blocks being rendered.", + "module.instant-rebreak.render.line-color": "Line Color", + "module.instant-rebreak.render.line-color.description": "The color of the lines of the blocks being rendered.", + + "module.liquid-interact": "Liquid Interact", + "module.liquid-interact.description": "Allows you to interact with liquids.", + + "module.crystal-aura": "Crystal Aura", + "module.crystal-aura.description": "Automatically places and attacks crystals.", + "module.crystal-aura.general.target-range": "Target Range", + "module.crystal-aura.general.target-range.description": "Range in which to target players.", + "module.crystal-aura.general.predict-movement": "Predict Movement", + "module.crystal-aura.general.predict-movement.description": "Predicts target movement.", + "module.crystal-aura.general.min-damage": "Min Damage", + "module.crystal-aura.general.min-damage.description": "Minimum damage the crystal needs to deal to your target.", + "module.crystal-aura.general.max-damage": "Max Damage", + "module.crystal-aura.general.max-damage.description": "Maximum damage crystals can deal to yourself.", + "module.crystal-aura.general.anti-suicide": "Anti Suicide", + "module.crystal-aura.general.anti-suicide.description": "Will not place and break crystals if they will kill you.", + "module.crystal-aura.general.ignore-nakeds": "Ignore Nakeds", + "module.crystal-aura.general.ignore-nakeds.description": "Ignore players with no items.", + "module.crystal-aura.general.rotate": "Rotate", + "module.crystal-aura.general.rotate.description": "Rotates server-side towards the crystals being hit/placed.", + "module.crystal-aura.general.yaw-steps-mode": "Yaw Steps Mode", + "module.crystal-aura.general.yaw-steps-mode.description": "When to run the yaw steps check.", + "module.crystal-aura.general.yaw-steps": "Yaw Steps", + "module.crystal-aura.general.yaw-steps.description": "Maximum number of degrees its allowed to rotate in one tick.", + "module.crystal-aura.general.entities": "Entities", + "module.crystal-aura.general.entities.description": "Entities to attack.", + "module.crystal-aura.switch.auto-switch": "Auto Switch", + "module.crystal-aura.switch.auto-switch.description": "Switches to crystals in your hotbar once a target is found.", + "module.crystal-aura.switch.switch-delay": "Switch Delay", + "module.crystal-aura.switch.switch-delay.description": "The delay in ticks to wait to break a crystal after switching hotbar slot.", + "module.crystal-aura.switch.no-gap-switch": "No Gap Switch", + "module.crystal-aura.switch.no-gap-switch.description": "Won't auto switch if you're holding a gapple.", + "module.crystal-aura.switch.no-bow-switch": "No Bow Switch", + "module.crystal-aura.switch.no-bow-switch.description": "Won't auto switch if you're holding a bow.", + "module.crystal-aura.switch.anti-weakness": "Anti Weakness", + "module.crystal-aura.switch.anti-weakness.description": "Switches to tools with so you can break crystals with the weakness effect.", + "module.crystal-aura.place.place": "Place", + "module.crystal-aura.place.place.description": "If the CA should place crystals.", + "module.crystal-aura.place.place-delay": "Place Delay", + "module.crystal-aura.place.place-delay.description": "The delay in ticks to wait to place a crystal after it's exploded.", + "module.crystal-aura.place.place-range": "Place Range", + "module.crystal-aura.place.place-range.description": "Range in which to place crystals.", + "module.crystal-aura.place.walls-range": "Walls Range", + "module.crystal-aura.place.walls-range.description": "Range in which to place crystals when behind blocks.", + "module.crystal-aura.place.1.12-placement": "1.12 Placement", + "module.crystal-aura.place.1.12-placement.description": "Uses 1.12 crystal placement.", + "module.crystal-aura.place.support": "Support", + "module.crystal-aura.place.support.description": "Places a support block in air if no other position have been found.", + "module.crystal-aura.place.support-delay": "Support Delay", + "module.crystal-aura.place.support-delay.description": "Delay in ticks after placing support block.", + "module.crystal-aura.face-place.face-place": "Face Place", + "module.crystal-aura.face-place.face-place.description": "Will face-place when target is below a certain health or armor durability threshold.", + "module.crystal-aura.face-place.face-place-health": "Face Place Health", + "module.crystal-aura.face-place.face-place-health.description": "The health the target has to be at to start face placing.", + "module.crystal-aura.face-place.face-place-durability": "Face Place Durability", + "module.crystal-aura.face-place.face-place-durability.description": "The durability threshold percentage to be able to face-place.", + "module.crystal-aura.face-place.face-place-missing-armor": "Face Place Missing Armor", + "module.crystal-aura.face-place.face-place-missing-armor.description": "Automatically starts face placing when a target misses a piece of armor.", + "module.crystal-aura.face-place.force-face-place": "Force Face Place", + "module.crystal-aura.face-place.force-face-place.description": "Starts face place when this button is pressed.", + "module.crystal-aura.break.break": "Break", + "module.crystal-aura.break.break.description": "If the CA should break crystals.", + "module.crystal-aura.break.break-delay": "Break Delay", + "module.crystal-aura.break.break-delay.description": "The delay in ticks to wait to break a crystal after it's placed.", + "module.crystal-aura.break.smart-delay": "Smart Delay", + "module.crystal-aura.break.smart-delay.description": "Only breaks crystals when the target can receive damage.", + "module.crystal-aura.break.break-range": "Break Range", + "module.crystal-aura.break.break-range.description": "Range in which to break crystals.", + "module.crystal-aura.break.walls-range": "Walls Range", + "module.crystal-aura.break.walls-range.description": "Range in which to break crystals when behind blocks.", + "module.crystal-aura.break.only-own": "Only Own", + "module.crystal-aura.break.only-own.description": "Only breaks own crystals.", + "module.crystal-aura.break.break-attempts": "Break Attempts", + "module.crystal-aura.break.break-attempts.description": "How many times to hit a crystal before stopping to target it.", + "module.crystal-aura.break.ticks-existed": "Ticks Existed", + "module.crystal-aura.break.ticks-existed.description": "Amount of ticks a crystal needs to have lived for it to be attacked by CrystalAura.", + "module.crystal-aura.break.attack-frequency": "Attack Frequency", + "module.crystal-aura.break.attack-frequency.description": "Maximum hits to do per second.", + "module.crystal-aura.break.fast-break": "Fast Break", + "module.crystal-aura.break.fast-break.description": "Ignores break delay and tries to break the crystal as soon as it's spawned in the world.", + "module.crystal-aura.pause.pause-on-use": "Pause On Use", + "module.crystal-aura.pause.pause-on-use.description": "Which processes should be paused while using an item.", + "module.crystal-aura.pause.pause-on-mine": "Pause On Mine", + "module.crystal-aura.pause.pause-on-mine.description": "Which processes should be paused while mining a block.", + "module.crystal-aura.pause.pause-on-lag": "Pause On Lag", + "module.crystal-aura.pause.pause-on-lag.description": "Whether to pause if the server is not responding.", + "module.crystal-aura.pause.pause-modules": "Pause Modules", + "module.crystal-aura.pause.pause-modules.description": "Pauses while any of the selected modules are active.", + "module.crystal-aura.pause.pause-health": "Pause Health", + "module.crystal-aura.pause.pause-health.description": "Pauses when you go below a certain health.", + "module.crystal-aura.render.swing-mode": "Swing Mode", + "module.crystal-aura.render.swing-mode.description": "How to swing when placing.", + "module.crystal-aura.render.render-mode": "Render Mode", + "module.crystal-aura.render.render-mode.description": "The mode to render in.", + "module.crystal-aura.render.render-place": "Render Place", + "module.crystal-aura.render.render-place.description": "Renders a block overlay over the block the crystals are being placed on.", + "module.crystal-aura.render.place-time": "Place Time", + "module.crystal-aura.render.place-time.description": "How long to render placements.", + "module.crystal-aura.render.render-break": "Render Break", + "module.crystal-aura.render.render-break.description": "Renders a block overlay over the block the crystals are broken on.", + "module.crystal-aura.render.break-time": "Break Time", + "module.crystal-aura.render.break-time.description": "How long to render breaking for.", + "module.crystal-aura.render.smoothness": "Smoothness", + "module.crystal-aura.render.smoothness.description": "How smoothly the render should move around.", + "module.crystal-aura.render.height": "Height", + "module.crystal-aura.render.height.description": "How tall the gradient should be.", + "module.crystal-aura.render.render-time": "Render Time", + "module.crystal-aura.render.render-time.description": "How long to render placements.", + "module.crystal-aura.render.shape-mode": "Shape Mode", + "module.crystal-aura.render.shape-mode.description": "How the shapes are rendered.", + "module.crystal-aura.render.side-color": "Side Color", + "module.crystal-aura.render.side-color.description": "The side color of the block overlay.", + "module.crystal-aura.render.line-color": "Line Color", + "module.crystal-aura.render.line-color.description": "The line color of the block overlay.", + "module.crystal-aura.render.damage": "Damage", + "module.crystal-aura.render.damage.description": "Renders crystal damage text in the block overlay.", + "module.crystal-aura.render.damage-color": "Damage Color", + "module.crystal-aura.render.damage-color.description": "The color of the damage text.", + "module.crystal-aura.render.damage-scale": "Damage Scale", + "module.crystal-aura.render.damage-scale.description": "How big the damage text should be.", + + "module.spider": "Spider", + "module.spider.description": "Allows you to climb walls like a spider.", + "module.spider.general.climb-speed": "Climb Speed", + "module.spider.general.climb-speed.description": "The speed you go up blocks.", + + "module.auto-log": "Auto Log", + "module.auto-log.description": "Automatically disconnects you when certain requirements are met.", + "module.auto-log.general.health": "Health", + "module.auto-log.general.health.description": "Automatically disconnects when health is lower or equal to this value. Set to 0 to disable.", + "module.auto-log.general.predict-incoming-damage": "Predict Incoming Damage", + "module.auto-log.general.predict-incoming-damage.description": "Disconnects when it detects you're about to take enough damage to set you under the 'health' setting.", + "module.auto-log.general.totem-pops": "Totem Pops", + "module.auto-log.general.totem-pops.description": "Disconnects when you have popped this many totems. Set to 0 to disable.", + "module.auto-log.general.only-trusted": "Only Trusted", + "module.auto-log.general.only-trusted.description": "Disconnects when a player not on your friends list appears in render distance.", + "module.auto-log.general.32K": "32K", + "module.auto-log.general.32K.description": "Disconnects when a player near you can instantly kill you.", + "module.auto-log.general.smart-toggle": "Smart Toggle", + "module.auto-log.general.smart-toggle.description": "Disables Auto Log after a low-health logout. WILL re-enable once you heal.", + "module.auto-log.general.toggle-off": "Toggle Off", + "module.auto-log.general.toggle-off.description": "Disables Auto Log after usage.", + "module.auto-log.general.toggle-auto-reconnect": "Toggle Auto Reconnect", + "module.auto-log.general.toggle-auto-reconnect.description": "Whether to disable Auto Reconnect after a logout.", + "module.auto-log.entities.entities": "Entities", + "module.auto-log.entities.entities.description": "Disconnects when a specified entity is present within a specified range.", + "module.auto-log.entities.use-total-count": "Use Total Count", + "module.auto-log.entities.use-total-count.description": "Toggle between counting the total number of all selected entities or each entity individually.", + "module.auto-log.entities.combined-entity-threshold": "Combined Entity Threshold", + "module.auto-log.entities.combined-entity-threshold.description": "The minimum total number of selected entities that must be near you before disconnection occurs.", + "module.auto-log.entities.individual-entity-threshold": "Individual Entity Threshold", + "module.auto-log.entities.individual-entity-threshold.description": "The minimum number of entities individually that must be near you before disconnection occurs.", + "module.auto-log.entities.range": "Range", + "module.auto-log.entities.range.description": "How close an entity has to be to you before you disconnect.", + + "module.high-jump": "High Jump", + "module.high-jump.description": "Makes you jump higher than normal.", + "module.high-jump.general.jump-multiplier": "Jump Multiplier", + "module.high-jump.general.jump-multiplier.description": "Jump height multiplier.", + + "module.speed": "Speed", + "module.speed.description": "Modifies your movement speed when moving on the ground.", + "module.speed.general.mode": "Mode", + "module.speed.general.mode.description": "The method of applying speed.", + "module.speed.general.vanilla-speed": "Vanilla Speed", + "module.speed.general.vanilla-speed.description": "The speed in blocks per second.", + "module.speed.general.strafe-speed": "Strafe Speed", + "module.speed.general.strafe-speed.description": "The speed.", + "module.speed.general.speed-limit": "Speed Limit", + "module.speed.general.speed-limit.description": "Limits your speed on servers with very strict anticheats.", + "module.speed.general.timer": "Timer", + "module.speed.general.timer.description": "Timer override.", + "module.speed.general.in-liquids": "In Liquids", + "module.speed.general.in-liquids.description": "Uses speed when in lava or water.", + "module.speed.general.when-sneaking": "When Sneaking", + "module.speed.general.when-sneaking.description": "Uses speed when sneaking.", + "module.speed.general.only-on-ground": "Only On Ground", + "module.speed.general.only-on-ground.description": "Uses speed only when standing on a block.", + + "module.offhand": "Offhand", + "module.offhand.description": "Allows you to hold specified items in your offhand.", + "module.offhand.combat.item-switch-delay": "Item Switch Delay", + "module.offhand.combat.item-switch-delay.description": "The delay in ticks between slot movements.", + "module.offhand.combat.item": "Item", + "module.offhand.combat.item.description": "Which item to hold in your offhand.", + "module.offhand.combat.hotbar": "Hotbar", + "module.offhand.combat.hotbar.description": "Whether to use items from your hotbar.", + "module.offhand.combat.right-gapple": "Right Gapple", + "module.offhand.combat.right-gapple.description": "Will switch to a gapple when holding right click.(DO NOT USE WITH POTION ON)", + "module.offhand.combat.sword-gapple": "Sword Gapple", + "module.offhand.combat.sword-gapple.description": "Will switch to a gapple when holding a sword and right click.", + "module.offhand.combat.always-gap-on-sword": "Always Gap On Sword", + "module.offhand.combat.always-gap-on-sword.description": "Holds an Enchanted Golden Apple when you are holding a sword.", + "module.offhand.combat.always-pot-on-sword": "Always Pot On Sword", + "module.offhand.combat.always-pot-on-sword.description": "Will switch to a potion when holding a sword", + "module.offhand.combat.sword-pot": "Sword Pot", + "module.offhand.combat.sword-pot.description": "Will switch to a potion when holding a sword and right click.", + "module.offhand.totem.min-health": "Min Health", + "module.offhand.totem.min-health.description": "Will hold a totem when below this amount of health.", + "module.offhand.totem.elytra": "Elytra", + "module.offhand.totem.elytra.description": "Will always hold a totem while flying with an elytra.", + "module.offhand.totem.falling": "Falling", + "module.offhand.totem.falling.description": "Will hold a totem if fall damage could kill you.", + "module.offhand.totem.explosion": "Explosion", + "module.offhand.totem.explosion.description": "Will hold a totem when explosion damage could kill you.", + + "module.arrow-dodge": "Arrow Dodge", + "module.arrow-dodge.description": "Tries to dodge arrows coming at you.", + "module.arrow-dodge.general.ground-check": "Ground Check", + "module.arrow-dodge.general.ground-check.description": "Tries to prevent you from falling to your death.", + "module.arrow-dodge.general.all-projectiles": "All Projectiles", + "module.arrow-dodge.general.all-projectiles.description": "Dodge all projectiles, not only arrows.", + "module.arrow-dodge.general.ignore-own": "Ignore Own", + "module.arrow-dodge.general.ignore-own.description": "Ignore your own projectiles.", + "module.arrow-dodge.general.simulation-steps": "Simulation Steps", + "module.arrow-dodge.general.simulation-steps.description": "How many steps to simulate projectiles. Zero for no limit.", + "module.arrow-dodge.movement.move-type": "Move Type", + "module.arrow-dodge.movement.move-type.description": "The way you are moved by this module.", + "module.arrow-dodge.movement.move-speed": "Move Speed", + "module.arrow-dodge.movement.move-speed.description": "How fast should you be when dodging arrow.", + "module.arrow-dodge.movement.distance-check": "Distance Check", + "module.arrow-dodge.movement.distance-check.description": "How far should an arrow be from the player to be considered not hitting.", + + "module.multitask": "Multitask", + "module.multitask.description": "Lets you use items and attack at the same time.", + "module.multitask.general.attacking-entities": "Attacking Entities", + "module.multitask.general.attacking-entities.description": "Lets you attack entities while using an item.", + + "module.auto-replenish": "Auto Replenish", + "module.auto-replenish.description": "Automatically refills items in your hotbar, main hand, or offhand.", + "module.auto-replenish.general.min-count": "Min Count", + "module.auto-replenish.general.min-count.description": "Replenish a slot when it reaches this item count.", + "module.auto-replenish.general.delay": "Delay", + "module.auto-replenish.general.delay.description": "How long in ticks to wait between replenishing your hotbar.", + "module.auto-replenish.general.offhand": "Offhand", + "module.auto-replenish.general.offhand.description": "Whether or not to replenish items in your offhand.", + "module.auto-replenish.general.unstackable": "Unstackable", + "module.auto-replenish.general.unstackable.description": "Replenish unstackable items.", + "module.auto-replenish.general.same-enchants": "Same Enchants", + "module.auto-replenish.general.same-enchants.description": "Only replace unstackables with items that have the same enchants.", + "module.auto-replenish.general.search-hotbar": "Search Hotbar", + "module.auto-replenish.general.search-hotbar.description": "Combine stacks in your hotbar/offhand as a last resort.", + "module.auto-replenish.general.excluded-items": "Excluded Items", + "module.auto-replenish.general.excluded-items.description": "Items that won't be replenished.", + + "module.break-indicators": "Break Indicators", + "module.break-indicators.description": "Renders the progress of a block being broken.", + "module.break-indicators.general.shape-mode": "Shape Mode", + "module.break-indicators.general.shape-mode.description": "How the shapes are rendered.", + "module.break-indicators.general.packet-mine": "Packet Mine", + "module.break-indicators.general.packet-mine.description": "Whether or not to render blocks being packet mined.", + "module.break-indicators.general.start-color": "Start Color", + "module.break-indicators.general.start-color.description": "The color for the non-broken block.", + "module.break-indicators.general.end-color": "End Color", + "module.break-indicators.general.end-color.description": "The color for the fully-broken block.", + + "module.potion-saver": "Potion Saver", + "module.potion-saver.description": "Stops potion effects ticking when you stand still.", + "module.potion-saver.general.effects": "Effects", + "module.potion-saver.general.effects.description": "The effects to preserve.", + "module.potion-saver.general.only-when-stationary": "Only When Stationary", + "module.potion-saver.general.only-when-stationary.description": "Only freezes effects when you aren't moving.", + + "module.block-esp": "Block Esp", + "module.block-esp.description": "Renders specified blocks through walls.", + "module.block-esp.general.blocks": "Blocks", + "module.block-esp.general.blocks.description": "Blocks to search for.", + "module.block-esp.general.default-block-config": "Default Block Config", + "module.block-esp.general.default-block-config.description": "Default block config.", + "module.block-esp.general.block-configs": "Block Configs", + "module.block-esp.general.block-configs.description": "Config for each block.", + "module.block-esp.general.tracers": "Tracers", + "module.block-esp.general.tracers.description": "Render tracer lines.", + + "module.packet-mine": "Packet Mine", + "module.packet-mine.description": "Sends packets to mine blocks without the mining animation.", + "module.packet-mine.general.delay": "Delay", + "module.packet-mine.general.delay.description": "Delay between mining blocks in ticks.", + "module.packet-mine.general.rotate": "Rotate", + "module.packet-mine.general.rotate.description": "Sends rotation packets to the server when mining.", + "module.packet-mine.general.auto-switch": "Auto Switch", + "module.packet-mine.general.auto-switch.description": "Automatically switches to the best tool when the block is ready to be mined instantly.", + "module.packet-mine.general.not-on-use": "Not On Use", + "module.packet-mine.general.not-on-use.description": "Won't auto switch if you're using an item.", + "module.packet-mine.general.obscure-breaking-progress": "Obscure Breaking Progress", + "module.packet-mine.general.obscure-breaking-progress.description": "Spams abort breaking packets to obscure the block mining progress from other players. Does not hide it perfectly.", + "module.packet-mine.render.render": "Render", + "module.packet-mine.render.render.description": "Whether or not to render the block being mined.", + "module.packet-mine.render.shape-mode": "Shape Mode", + "module.packet-mine.render.shape-mode.description": "How the shapes are rendered.", + "module.packet-mine.render.ready-side-color": "Ready Side Color", + "module.packet-mine.render.ready-side-color.description": "The color of the sides of the blocks that can be broken.", + "module.packet-mine.render.ready-line-color": "Ready Line Color", + "module.packet-mine.render.ready-line-color.description": "The color of the lines of the blocks that can be broken.", + "module.packet-mine.render.side-color": "Side Color", + "module.packet-mine.render.side-color.description": "The color of the sides of the blocks being rendered.", + "module.packet-mine.render.line-color": "Line Color", + "module.packet-mine.render.line-color.description": "The color of the lines of the blocks being rendered.", + + "module.liquid-filler": "Liquid Filler", + "module.liquid-filler.description": "Places blocks inside of liquid source blocks within range of you.", + "module.liquid-filler.general.place-in": "Place In", + "module.liquid-filler.general.place-in.description": "What type of liquids to place in.", + "module.liquid-filler.general.shape": "Shape", + "module.liquid-filler.general.shape.description": "The shape of placing algorithm.", + "module.liquid-filler.general.place-range": "Place Range", + "module.liquid-filler.general.place-range.description": "The range at which blocks can be placed.", + "module.liquid-filler.general.walls-range": "Walls Range", + "module.liquid-filler.general.walls-range.description": "Range in which to place when behind blocks.", + "module.liquid-filler.general.delay": "Delay", + "module.liquid-filler.general.delay.description": "Delay between actions in ticks.", + "module.liquid-filler.general.max-blocks-per-tick": "Max Blocks Per Tick", + "module.liquid-filler.general.max-blocks-per-tick.description": "Maximum blocks to try to place per tick.", + "module.liquid-filler.general.sort-mode": "Sort Mode", + "module.liquid-filler.general.sort-mode.description": "The blocks you want to place first.", + "module.liquid-filler.general.rotate": "Rotate", + "module.liquid-filler.general.rotate.description": "Automatically rotates towards the space targeted for filling.", + "module.liquid-filler.whitelist.list-mode": "List Mode", + "module.liquid-filler.whitelist.list-mode.description": "Selection mode.", + "module.liquid-filler.whitelist.whitelist": "Whitelist", + "module.liquid-filler.whitelist.whitelist.description": "The allowed blocks that it will use to fill up the liquid.", + "module.liquid-filler.whitelist.blacklist": "Blacklist", + "module.liquid-filler.whitelist.blacklist.description": "The denied blocks that it not will use to fill up the liquid.", + + "module.quiver": "Quiver", + "module.quiver.description": "Shoots arrows at yourself.", + "module.quiver.general.effects": "Effects", + "module.quiver.general.effects.description": "Which effects to shoot you with.", + "module.quiver.general.cooldown": "Cooldown", + "module.quiver.general.cooldown.description": "How many ticks between shooting effects (19 minimum for NCP).", + "module.quiver.general.check-effects": "Check Effects", + "module.quiver.general.check-effects.description": "Won't shoot you with effects you already have.", + "module.quiver.general.silent-bow": "Silent Bow", + "module.quiver.general.silent-bow.description": "Takes a bow from your inventory to quiver.", + "module.quiver.general.chat-info": "Chat Info", + "module.quiver.general.chat-info.description": "Sends info about quiver checks in chat.", + "module.quiver.safety.only-in-holes": "Only In Holes", + "module.quiver.safety.only-in-holes.description": "Only quiver when you're in a hole.", + "module.quiver.safety.only-on-ground": "Only On Ground", + "module.quiver.safety.only-on-ground.description": "Only quiver when you're on the ground.", + "module.quiver.safety.min-health": "Min Health", + "module.quiver.safety.min-health.description": "How much health you must have to quiver.", + + "module.chest-swap": "Chest Swap", + "module.chest-swap.description": "Automatically swaps between a chestplate and an elytra.", + "module.chest-swap.general.chestplate": "Chestplate", + "module.chest-swap.general.chestplate.description": "Which type of chestplate to swap to.", + "module.chest-swap.general.stay-on": "Stay On", + "module.chest-swap.general.stay-on.description": "Stays on and activates when you turn it off.", + "module.chest-swap.general.close-inventory": "Close Inventory", + "module.chest-swap.general.close-inventory.description": "Sends inventory close after swap.", + + "module.fast-use": "Fast Use", + "module.fast-use.description": "Allows you to use items at very high speeds.", + "module.fast-use.general.mode": "Mode", + "module.fast-use.general.mode.description": "Which items to fast use.", + "module.fast-use.general.items": "Items", + "module.fast-use.general.items.description": "Which items should fast place work on in \"Some\" mode.", + "module.fast-use.general.blocks": "Blocks", + "module.fast-use.general.blocks.description": "Fast-places blocks if the mode is \"Some\" mode.", + "module.fast-use.general.cooldown": "Cooldown", + "module.fast-use.general.cooldown.description": "Fast-use cooldown in ticks.", + + "module.anchor": "Anchor", + "module.anchor.description": "Helps you get into holes by stopping your movement completely over a hole.", + "module.anchor.general.max-height": "Max Height", + "module.anchor.general.max-height.description": "The maximum height Anchor will work at.", + "module.anchor.general.min-pitch": "Min Pitch", + "module.anchor.general.min-pitch.description": "The minimum pitch at which anchor will work.", + "module.anchor.general.cancel-jump-in-hole": "Cancel Jump In Hole", + "module.anchor.general.cancel-jump-in-hole.description": "Prevents you from jumping when Anchor is active and Min Pitch is met.", + "module.anchor.general.pull": "Pull", + "module.anchor.general.pull.description": "The pull strength of Anchor.", + "module.anchor.general.pull-speed": "Pull Speed", + "module.anchor.general.pull-speed.description": "How fast to pull towards the hole in blocks per second.", + + "module.anti-anvil": "Anti Anvil", + "module.anti-anvil.description": "Automatically prevents Auto Anvil by placing between you and the anvil.", + "module.anti-anvil.general.swing": "Swing", + "module.anti-anvil.general.swing.description": "Swings your hand client-side when placing.", + "module.anti-anvil.general.rotate": "Rotate", + "module.anti-anvil.general.rotate.description": "Makes you rotate when placing.", + + "module.highway-builder": "Highway Builder", + "module.highway-builder.description": "Automatically builds highways.", + "module.highway-builder.general.width": "Width", + "module.highway-builder.general.width.description": "Width of the highway.", + "module.highway-builder.general.height": "Height", + "module.highway-builder.general.height.description": "Height of the highway.", + "module.highway-builder.general.floor": "Floor", + "module.highway-builder.general.floor.description": "What floor placement mode to use.", + "module.highway-builder.general.railings": "Railings", + "module.highway-builder.general.railings.description": "Builds railings next to the highway.", + "module.highway-builder.general.corner-support-block": "Corner Support Block", + "module.highway-builder.general.corner-support-block.description": "Places a support block underneath the railings, to prevent air placing.", + "module.highway-builder.general.mine-above-railings": "Mine Above Railings", + "module.highway-builder.general.mine-above-railings.description": "Mines blocks above railings.", + "module.highway-builder.general.rotation": "Rotation", + "module.highway-builder.general.rotation.description": "Mode of rotation.", + "module.highway-builder.general.disconnect-on-toggle": "Disconnect On Toggle", + "module.highway-builder.general.disconnect-on-toggle.description": "Automatically disconnects when the module is turned off, for example for not having enough blocks.", + "module.highway-builder.general.pause-on-lag": "Pause On Lag", + "module.highway-builder.general.pause-on-lag.description": "Pauses the current process while the server stops responding.", + "module.highway-builder.general.destroy-crystal-traps": "Destroy Crystal Traps", + "module.highway-builder.general.destroy-crystal-traps.description": "Use a bow to defuse crystal traps safely from a distance. An infinity bow is recommended.", + "module.highway-builder.digging.double-mine": "Double Mine", + "module.highway-builder.digging.double-mine.description": "Whether to double mine blocks when applicable (normal mine and packet mine simultaneously).", + "module.highway-builder.digging.fast-break": "Fast Break", + "module.highway-builder.digging.fast-break.description": "Whether to finish breaking blocks faster than normal while double mining.", + "module.highway-builder.digging.dont-break-tools": "Dont Break Tools", + "module.highway-builder.digging.dont-break-tools.description": "Don't break tools.", + "module.highway-builder.digging.durability-percentage": "Durability Percentage", + "module.highway-builder.digging.durability-percentage.description": "The durability percentage at which to stop using a tool.", + "module.highway-builder.digging.save-pickaxes": "Save Pickaxes", + "module.highway-builder.digging.save-pickaxes.description": "How many pickaxes to ensure are saved. Hitting this number in your inventory will trigger a restock or the module toggling off.", + "module.highway-builder.digging.break-delay": "Break Delay", + "module.highway-builder.digging.break-delay.description": "The delay between breaking blocks.", + "module.highway-builder.digging.blocks-per-tick": "Blocks Per Tick", + "module.highway-builder.digging.blocks-per-tick.description": "The maximum amount of blocks that can be mined in a tick. Only applies to blocks instantly breakable.", + "module.highway-builder.paving.blocks-to-place": "Blocks To Place", + "module.highway-builder.paving.blocks-to-place.description": "Blocks it is allowed to place.", + "module.highway-builder.paving.place-range": "Place Range", + "module.highway-builder.paving.place-range.description": "The maximum distance at which you can place blocks.", + "module.highway-builder.paving.place-delay": "Place Delay", + "module.highway-builder.paving.place-delay.description": "The delay between placing blocks.", + "module.highway-builder.paving.placements-per-tick": "Placements Per Tick", + "module.highway-builder.paving.placements-per-tick.description": "The maximum amount of blocks that can be placed in a tick.", + "module.highway-builder.inventory.trash-items": "Trash Items", + "module.highway-builder.inventory.trash-items.description": "Items that are considered trash and can be thrown out.", + "module.highway-builder.inventory.inventory-delay": "Inventory Delay", + "module.highway-builder.inventory.inventory-delay.description": "Delay in ticks on inventory interactions.", + "module.highway-builder.inventory.eject-useless-shulkers": "Eject Useless Shulkers", + "module.highway-builder.inventory.eject-useless-shulkers.description": "Whether you should eject useless shulkers. Warning - will throw out any shulkers that don't contain blocks to place, pickaxes, or food. Be careful with your kits.", + "module.highway-builder.inventory.search-ender-chest": "Search Ender Chest", + "module.highway-builder.inventory.search-ender-chest.description": "Searches your ender chest to find items to use. Be careful with this one, especially if you let it search through shulkers.", + "module.highway-builder.inventory.search-shulkers": "Search Shulkers", + "module.highway-builder.inventory.search-shulkers.description": "Searches through shulkers to find items to use.", + "module.highway-builder.inventory.minimum-empty-slots": "Minimum Empty Slots", + "module.highway-builder.inventory.minimum-empty-slots.description": "The minimum amount of empty slots you want left after mining obsidian.", + "module.highway-builder.inventory.mine-ender-chests": "Mine Ender Chests", + "module.highway-builder.inventory.mine-ender-chests.description": "Mines ender chests for obsidian.", + "module.highway-builder.inventory.echest-blockade-type": "Echest Blockade Type", + "module.highway-builder.inventory.echest-blockade-type.description": "What blockade type to use (the structure placed when mining echests).", + "module.highway-builder.inventory.save-ender-chests": "Save Ender Chests", + "module.highway-builder.inventory.save-ender-chests.description": "How many ender chests to ensure are saved. Hitting this number in your inventory will trigger a restock or the module toggling off.", + "module.highway-builder.inventory.instantly-rebreak-echests": "Instantly Rebreak Echests", + "module.highway-builder.inventory.instantly-rebreak-echests.description": "Whether or not to use the instant rebreak exploit to break echests.", + "module.highway-builder.inventory.rebreak-delay": "Rebreak Delay", + "module.highway-builder.inventory.rebreak-delay.description": "Delay between rebreak attempts.", + "module.highway-builder.render-digging.render-blocks-to-mine": "Render Blocks To Mine", + "module.highway-builder.render-digging.render-blocks-to-mine.description": "Render blocks to be mined.", + "module.highway-builder.render-digging.blocks-to-mine-shape-mode": "Blocks To Mine Shape Mode", + "module.highway-builder.render-digging.blocks-to-mine-shape-mode.description": "How the blocks to be mined are rendered.", + "module.highway-builder.render-digging.blocks-to-mine-side-color": "Blocks To Mine Side Color", + "module.highway-builder.render-digging.blocks-to-mine-side-color.description": "Color of blocks to be mined.", + "module.highway-builder.render-digging.blocks-to-mine-line-color": "Blocks To Mine Line Color", + "module.highway-builder.render-digging.blocks-to-mine-line-color.description": "Color of blocks to be mined.", + "module.highway-builder.render-paving.render-blocks-to-place": "Render Blocks To Place", + "module.highway-builder.render-paving.render-blocks-to-place.description": "Render blocks to be placed.", + "module.highway-builder.render-paving.blocks-to-place-shape-mode": "Blocks To Place Shape Mode", + "module.highway-builder.render-paving.blocks-to-place-shape-mode.description": "How the blocks to be placed are rendered.", + "module.highway-builder.render-paving.blocks-to-place-side-color": "Blocks To Place Side Color", + "module.highway-builder.render-paving.blocks-to-place-side-color.description": "Color of blocks to be placed.", + "module.highway-builder.render-paving.blocks-to-place-line-color": "Blocks To Place Line Color", + "module.highway-builder.render-paving.blocks-to-place-line-color.description": "Color of blocks to be placed.", + + "module.infinity-miner": "Infinity Miner", + "module.infinity-miner.description": "Allows you to essentially mine forever by mining repair blocks when the durability gets low. Needs a mending pickaxe.", + "module.infinity-miner.general.target-blocks": "Target Blocks", + "module.infinity-miner.general.target-blocks.description": "The target blocks to mine.", + "module.infinity-miner.general.target-items": "Target Items", + "module.infinity-miner.general.target-items.description": "The target items to collect.", + "module.infinity-miner.general.repair-blocks": "Repair Blocks", + "module.infinity-miner.general.repair-blocks.description": "The repair blocks to mine.", + "module.infinity-miner.general.start-repairing": "Start Repairing", + "module.infinity-miner.general.start-repairing.description": "The durability percentage at which to start repairing.", + "module.infinity-miner.general.start-mining": "Start Mining", + "module.infinity-miner.general.start-mining.description": "The durability percentage at which to start mining.", + "module.infinity-miner.when-full": "When Full", + "module.infinity-miner.when-full.walk-home": "Walk Home", + "module.infinity-miner.when-full.walk-home.description": "Will walk 'home' when your inventory is full.", + "module.infinity-miner.when-full.log-out": "Log Out", + "module.infinity-miner.when-full.log-out.description": "Logs out when your inventory is full. Will walk home FIRST if walk home is enabled.", + + "module.breadcrumbs": "Breadcrumbs", + "module.breadcrumbs.description": "Displays a trail behind where you have walked.", + "module.breadcrumbs.general.color": "Color", + "module.breadcrumbs.general.color.description": "The color of the Breadcrumbs trail.", + "module.breadcrumbs.general.max-sections": "Max Sections", + "module.breadcrumbs.general.max-sections.description": "The maximum number of sections.", + "module.breadcrumbs.general.section-length": "Section Length", + "module.breadcrumbs.general.section-length.description": "The section length in blocks.", + + "module.auto-brewer": "Auto Brewer", + "module.auto-brewer.description": "Automatically brews the specified potion.", + "module.auto-brewer.general.potion": "Potion", + "module.auto-brewer.general.potion.description": "The type of potion to brew.", + + "module.storage-esp": "Storage Esp", + "module.storage-esp.description": "Renders all specified storage blocks.", + "module.storage-esp.general.mode": "Mode", + "module.storage-esp.general.mode.description": "Rendering mode.", + "module.storage-esp.general.storage-blocks": "Storage Blocks", + "module.storage-esp.general.storage-blocks.description": "Select the storage blocks to display.", + "module.storage-esp.general.tracers": "Tracers", + "module.storage-esp.general.tracers.description": "Draws tracers to storage blocks.", + "module.storage-esp.general.shape-mode": "Shape Mode", + "module.storage-esp.general.shape-mode.description": "How the shapes are rendered.", + "module.storage-esp.general.fill-opacity": "Fill Opacity", + "module.storage-esp.general.fill-opacity.description": "The opacity of the shape fill.", + "module.storage-esp.general.width": "Width", + "module.storage-esp.general.width.description": "The width of the shader outline.", + "module.storage-esp.general.glow-multiplier": "Glow Multiplier", + "module.storage-esp.general.glow-multiplier.description": "Multiplier for glow effect", + "module.storage-esp.general.chest": "Chest", + "module.storage-esp.general.chest.description": "The color of chests.", + "module.storage-esp.general.trapped-chest": "Trapped Chest", + "module.storage-esp.general.trapped-chest.description": "The color of trapped chests.", + "module.storage-esp.general.barrel": "Barrel", + "module.storage-esp.general.barrel.description": "The color of barrels.", + "module.storage-esp.general.shulker": "Shulker", + "module.storage-esp.general.shulker.description": "The color of Shulker Boxes.", + "module.storage-esp.general.ender-chest": "Ender Chest", + "module.storage-esp.general.ender-chest.description": "The color of Ender Chests.", + "module.storage-esp.general.other": "Other", + "module.storage-esp.general.other.description": "The color of furnaces, dispensers, droppers and hoppers.", + "module.storage-esp.general.fade-distance": "Fade Distance", + "module.storage-esp.general.fade-distance.description": "The distance at which the color will fade.", + "module.storage-esp.opened-rendering.hide-opened": "Hide Opened", + "module.storage-esp.opened-rendering.hide-opened.description": "Hides opened containers.", + "module.storage-esp.opened-rendering.opened-color": "Opened Color", + "module.storage-esp.opened-rendering.opened-color.description": "Optional setting to change colors of opened chests, as opposed to not rendering. Disabled at zero opacity.", + + "module.no-status-effects": "No Status Effects", + "module.no-status-effects.description": "Blocks specified status effects.", + "module.no-status-effects.general.blocked-effects": "Blocked Effects", + "module.no-status-effects.general.blocked-effects.description": "Effects to block.", + + "module.attribute-swap": "Attribute Swap", + "module.attribute-swap.description": "Swaps to a target slot when you attack.", + "module.attribute-swap.general.mode": "Mode", + "module.attribute-swap.general.mode.description": "The mode to use.", + "module.attribute-swap.general.target-slot": "Target Slot", + "module.attribute-swap.general.target-slot.description": "Hotbar slot to swap to (1-9).", + "module.attribute-swap.general.swap-back": "Swap Back", + "module.attribute-swap.general.swap-back.description": "Swap back to the original slot after a delay.", + "module.attribute-swap.general.swap-back-delay": "Swap Back Delay", + "module.attribute-swap.general.swap-back-delay.description": "Delay in ticks before swapping back.", + "module.attribute-swap.swapping-options.shield-breaker": "Shield Breaker", + "module.attribute-swap.swapping-options.shield-breaker.description": "Automatically swaps to an axe if the target is blocking.", + "module.attribute-swap.swapping-options.durability-saver": "Durability Saver", + "module.attribute-swap.swapping-options.durability-saver.description": "Swaps to a non-damageable item to save durability on the main weapon.", + "module.attribute-swap.swapping-options.sword-swapping": "Sword Swapping", + "module.attribute-swap.swapping-options.sword-swapping.description": "Enables smart swapping for sword enchantments.", + "module.attribute-swap.swapping-options.mace-swapping": "Mace Swapping", + "module.attribute-swap.swapping-options.mace-swapping.description": "Enables smart swapping for mace enchantments.", + "module.attribute-swap.swapping-options.other-swapping": "Other Swapping", + "module.attribute-swap.swapping-options.other-swapping.description": "Enables smart swapping for other enchantments like Impaling.", + "module.attribute-swap.sword-enchants.fire-aspect": "Fire Aspect", + "module.attribute-swap.sword-enchants.fire-aspect.description": "Swaps to an item with Fire Aspect to set the target on fire, if target isn't already on fire", + "module.attribute-swap.sword-enchants.looting": "Looting", + "module.attribute-swap.sword-enchants.looting.description": "Swaps to an item with Looting for better drops or more experience. Only prefers for mobs (but fire aspect is priority)", + "module.attribute-swap.sword-enchants.sharpness": "Sharpness", + "module.attribute-swap.sword-enchants.sharpness.description": "Swaps to an item with Sharpness for increased damage against all entities.", + "module.attribute-swap.sword-enchants.smite": "Smite", + "module.attribute-swap.sword-enchants.smite.description": "Swaps to an item with Smite for increased damage against undead mobs.", + "module.attribute-swap.sword-enchants.bane-of-arthropods": "Bane Of Arthropods", + "module.attribute-swap.sword-enchants.bane-of-arthropods.description": "Swaps to an item with Bane of Arthropods for increased damage against arthropods.", + "module.attribute-swap.sword-enchants.sweeping-edge": "Sweeping Edge", + "module.attribute-swap.sword-enchants.sweeping-edge.description": "Swaps to an item with Sweeping Edge for increased sweeping attack damage.", + "module.attribute-swap.mace-enchants.regular-mace": "Regular Mace", + "module.attribute-swap.mace-enchants.regular-mace.description": "Swaps to a regular Mace when falling if no better option is available.", + "module.attribute-swap.mace-enchants.density": "Density", + "module.attribute-swap.mace-enchants.density.description": "Swaps to a Mace with Density to deal increased damage when falling.", + "module.attribute-swap.mace-enchants.breach": "Breach", + "module.attribute-swap.mace-enchants.breach.description": "Swaps to a Mace with Breach to reduce the target's armor effectiveness.", + "module.attribute-swap.mace-enchants.wind-burst": "Wind Burst", + "module.attribute-swap.mace-enchants.wind-burst.description": "Swaps to a Mace with Wind Burst to launch up when hitting while falling.", + "module.attribute-swap.other-enchants.impaling": "Impaling", + "module.attribute-swap.other-enchants.impaling.description": "Swaps to an item with Impaling for increased damage against aquatic mobs.", + "module.attribute-swap.weapon-options.only-on-weapon": "Only On Weapon", + "module.attribute-swap.weapon-options.only-on-weapon.description": "Only swaps when holding a selected weapon in hand.", + "module.attribute-swap.weapon-options.sword": "Sword", + "module.attribute-swap.weapon-options.sword.description": "Works while holding a sword.", + "module.attribute-swap.weapon-options.axe": "Axe", + "module.attribute-swap.weapon-options.axe.description": "Works while holding an axe.", + "module.attribute-swap.weapon-options.pickaxe": "Pickaxe", + "module.attribute-swap.weapon-options.pickaxe.description": "Works while holding a pickaxe.", + "module.attribute-swap.weapon-options.shovel": "Shovel", + "module.attribute-swap.weapon-options.shovel.description": "Works while holding a shovel.", + "module.attribute-swap.weapon-options.hoe": "Hoe", + "module.attribute-swap.weapon-options.hoe.description": "Works while holding a hoe.", + "module.attribute-swap.weapon-options.mace": "Mace", + "module.attribute-swap.weapon-options.mace.description": "Works while holding a mace.", + "module.attribute-swap.weapon-options.trident": "Trident", + "module.attribute-swap.weapon-options.trident.description": "Works while holding a trident.", + + "module.echest-farmer": "Echest Farmer", + "module.echest-farmer.description": "Places and breaks EChests to farm obsidian.", + "module.echest-farmer.general.self-toggle": "Self Toggle", + "module.echest-farmer.general.self-toggle.description": "Disables when you reach the desired amount of obsidian.", + "module.echest-farmer.general.ignore-existing": "Ignore Existing", + "module.echest-farmer.general.ignore-existing.description": "Ignores existing obsidian in your inventory and mines the total target amount.", + "module.echest-farmer.general.amount": "Amount", + "module.echest-farmer.general.amount.description": "The amount of obsidian to farm.", + "module.echest-farmer.render.swing-hand": "Swing Hand", + "module.echest-farmer.render.swing-hand.description": "Swing hand client-side.", + "module.echest-farmer.render.render": "Render", + "module.echest-farmer.render.render.description": "Renders a block overlay where the obsidian will be placed.", + "module.echest-farmer.render.shape-mode": "Shape Mode", + "module.echest-farmer.render.shape-mode.description": "How the shapes are rendered.", + "module.echest-farmer.render.side-color": "Side Color", + "module.echest-farmer.render.side-color.description": "The color of the sides of the blocks being rendered.", + "module.echest-farmer.render.line-color": "Line Color", + "module.echest-farmer.render.line-color.description": "The color of the lines of the blocks being rendered.", + + "module.self-anvil": "Self Anvil", + "module.self-anvil.description": "Automatically places an anvil on you to prevent other players from going into your hole.", + + "module.flamethrower": "Flamethrower", + "module.flamethrower.description": "Ignites every alive piece of food.", + "module.flamethrower.general.distance": "Distance", + "module.flamethrower.general.distance.description": "The maximum distance the animal has to be to be roasted.", + "module.flamethrower.general.anti-break": "Anti Break", + "module.flamethrower.general.anti-break.description": "Prevents flint and steel from being broken.", + "module.flamethrower.general.put-out-fire": "Put Out Fire", + "module.flamethrower.general.put-out-fire.description": "Tries to put out the fire when animal is low health, so the items don't burn.", + "module.flamethrower.general.target-babies": "Target Babies", + "module.flamethrower.general.target-babies.description": "If checked babies will also be killed.", + "module.flamethrower.general.tick-interval": "Tick Interval", + "module.flamethrower.general.rotate": "Rotate", + "module.flamethrower.general.rotate.description": "Automatically faces towards the animal roasted.", + "module.flamethrower.general.entities": "Entities", + "module.flamethrower.general.entities.description": "Entities to cook.", + + "module.anti-bed": "Anti Bed", + "module.anti-bed.description": "Places string to prevent beds being placed on you.", + "module.anti-bed.general.place-string-top": "Place String Top", + "module.anti-bed.general.place-string-top.description": "Places string above you.", + "module.anti-bed.general.place-string-middle": "Place String Middle", + "module.anti-bed.general.place-string-middle.description": "Places string in your upper hitbox.", + "module.anti-bed.general.place-string-bottom": "Place String Bottom", + "module.anti-bed.general.place-string-bottom.description": "Places string at your feet.", + "module.anti-bed.general.only-in-hole": "Only In Hole", + "module.anti-bed.general.only-in-hole.description": "Only functions when you are standing in a hole.", + + "module.auto-mend": "Auto Mend", + "module.auto-mend.description": "Automatically replaces items in your offhand with mending when fully repaired.", + "module.auto-mend.general.blacklist": "Blacklist", + "module.auto-mend.general.blacklist.description": "Item blacklist.", + "module.auto-mend.general.force": "Force", + "module.auto-mend.general.force.description": "Replaces item in offhand even if there is some other non-repairable item.", + "module.auto-mend.general.auto-disable": "Auto Disable", + "module.auto-mend.general.auto-disable.description": "Automatically disables when there are no more items to repair.", + + "module.auto-anvil": "Auto Anvil", + "module.auto-anvil.description": "Automatically places anvils above players to destroy helmets.", + "module.auto-anvil.general.target-range": "Target Range", + "module.auto-anvil.general.target-range.description": "The radius in which players get targeted.", + "module.auto-anvil.general.target-priority": "Target Priority", + "module.auto-anvil.general.target-priority.description": "How to select the player to target.", + "module.auto-anvil.general.height": "Height", + "module.auto-anvil.general.height.description": "The height to place anvils at.", + "module.auto-anvil.general.delay": "Delay", + "module.auto-anvil.general.delay.description": "The delay in between anvil placements.", + "module.auto-anvil.general.place-at-feet": "Place At Feet", + "module.auto-anvil.general.place-at-feet.description": "Automatically places a button or pressure plate at the targets feet to break the anvils.", + "module.auto-anvil.general.multi-place": "Multi Place", + "module.auto-anvil.general.multi-place.description": "Places multiple anvils at once.", + "module.auto-anvil.general.toggle-on-break": "Toggle On Break", + "module.auto-anvil.general.toggle-on-break.description": "Toggles when the target's helmet slot is empty.", + "module.auto-anvil.general.rotate": "Rotate", + "module.auto-anvil.general.rotate.description": "Automatically rotates towards the position anvils/pressure plates/buttons are placed.", + + "module.burrow": "Burrow", + "module.burrow.description": "Attempts to clip you into a block.", + "module.burrow.general.block-to-use": "Block To Use", + "module.burrow.general.block-to-use.description": "The block to use for Burrow.", + "module.burrow.general.instant": "Instant", + "module.burrow.general.instant.description": "Jumps with packets rather than vanilla jump.", + "module.burrow.general.automatic": "Automatic", + "module.burrow.general.automatic.description": "Automatically burrows on activate rather than waiting for jump.", + "module.burrow.general.trigger-height": "Trigger Height", + "module.burrow.general.trigger-height.description": "How high you have to jump before a rubberband is triggered.", + "module.burrow.general.rubberband-height": "Rubberband Height", + "module.burrow.general.rubberband-height.description": "How far to attempt to cause rubberband.", + "module.burrow.general.timer": "Timer", + "module.burrow.general.timer.description": "Timer override.", + "module.burrow.general.only-in-holes": "Only In Holes", + "module.burrow.general.only-in-holes.description": "Stops you from burrowing when not in a hole.", + "module.burrow.general.center": "Center", + "module.burrow.general.center.description": "Centers you to the middle of the block before burrowing.", + "module.burrow.general.rotate": "Rotate", + "module.burrow.general.rotate.description": "Faces the block you place server-side.", + + "module.auto-sign": "Auto Sign", + "module.auto-sign.description": "Automatically writes signs. The first sign's text will be used.", + "module.auto-sign.general.delay": "Delay", + "module.auto-sign.general.delay.description": "The tick delay between sign update packets.", + + "module.swarm": "Swarm", + "module.swarm.description": "Allows you to control multiple instances of Meteor from one central host.", + "module.swarm.general.mode": "Mode", + "module.swarm.general.mode.description": "What type of client to run.", + "module.swarm.general.ip": "Ip", + "module.swarm.general.ip.description": "The IP address of the host server.", + "module.swarm.general.port": "Port", + "module.swarm.general.port.description": "The port used for connections.", + + "module.auto-reconnect": "Auto Reconnect", + "module.auto-reconnect.description": "Automatically reconnects when disconnected from a server.", + "module.auto-reconnect.general.delay": "Delay", + "module.auto-reconnect.general.delay.description": "The amount of seconds to wait before reconnecting to the server.", + "module.auto-reconnect.general.hide-buttons": "Hide Buttons", + "module.auto-reconnect.general.hide-buttons.description": "Will hide the buttons related to Auto Reconnect.", + + "module.build-height": "Build Height", + "module.build-height.description": "Allows you to interact with objects at the build limit.", + + "module.time-changer": "Time Changer", + "module.time-changer.description": "Makes you able to set a custom time.", + "module.time-changer.general.time": "Time", + "module.time-changer.general.time.description": "The specified time to be set.", + + "module.hole-esp": "Hole Esp", + "module.hole-esp.description": "Displays holes that you will take less damage in.", + "module.hole-esp.general.horizontal-radius": "Horizontal Radius", + "module.hole-esp.general.horizontal-radius.description": "Horizontal radius in which to search for holes.", + "module.hole-esp.general.vertical-radius": "Vertical Radius", + "module.hole-esp.general.vertical-radius.description": "Vertical radius in which to search for holes.", + "module.hole-esp.general.min-height": "Min Height", + "module.hole-esp.general.min-height.description": "Minimum hole height required to be rendered.", + "module.hole-esp.general.doubles": "Doubles", + "module.hole-esp.general.doubles.description": "Highlights double holes that can be stood across.", + "module.hole-esp.general.ignore-own": "Ignore Own", + "module.hole-esp.general.ignore-own.description": "Ignores rendering the hole you are currently standing in.", + "module.hole-esp.general.webs": "Webs", + "module.hole-esp.general.webs.description": "Whether to show holes that have webs inside of them.", + "module.hole-esp.render.shape-mode": "Shape Mode", + "module.hole-esp.render.shape-mode.description": "How the shapes are rendered.", + "module.hole-esp.render.height": "Height", + "module.hole-esp.render.height.description": "The height of rendering.", + "module.hole-esp.render.top-quad": "Top Quad", + "module.hole-esp.render.top-quad.description": "Whether to render a quad at the top of the hole.", + "module.hole-esp.render.bottom-quad": "Bottom Quad", + "module.hole-esp.render.bottom-quad.description": "Whether to render a quad at the bottom of the hole.", + "module.hole-esp.render.bedrock-top": "Bedrock Top", + "module.hole-esp.render.bedrock-top.description": "The top color for holes that are completely bedrock.", + "module.hole-esp.render.bedrock-bottom": "Bedrock Bottom", + "module.hole-esp.render.bedrock-bottom.description": "The bottom color for holes that are completely bedrock.", + "module.hole-esp.render.obsidian-top": "Obsidian Top", + "module.hole-esp.render.obsidian-top.description": "The top color for holes that are completely obsidian.", + "module.hole-esp.render.obsidian-bottom": "Obsidian Bottom", + "module.hole-esp.render.obsidian-bottom.description": "The bottom color for holes that are completely obsidian.", + "module.hole-esp.render.mixed-top": "Mixed Top", + "module.hole-esp.render.mixed-top.description": "The top color for holes that have mixed bedrock and obsidian.", + "module.hole-esp.render.mixed-bottom": "Mixed Bottom", + "module.hole-esp.render.mixed-bottom.description": "The bottom color for holes that have mixed bedrock and obsidian.", + + "module.city-esp": "City Esp", + "module.city-esp.description": "Displays blocks that can be broken in order to city another player.", + "module.city-esp.render.shape-mode": "Shape Mode", + "module.city-esp.render.shape-mode.description": "How the shapes are rendered.", + "module.city-esp.render.side-color": "Side Color", + "module.city-esp.render.side-color.description": "The side color of the rendering.", + "module.city-esp.render.line-color": "Line Color", + "module.city-esp.render.line-color.description": "The line color of the rendering.", + + "module.anti-afk": "Anti Afk", + "module.anti-afk.description": "Performs different actions to prevent getting kicked while AFK.", + "module.anti-afk.actions.jump": "Jump", + "module.anti-afk.actions.jump.description": "Jump randomly.", + "module.anti-afk.actions.swing": "Swing", + "module.anti-afk.actions.swing.description": "Swings your hand.", + "module.anti-afk.actions.sneak": "Sneak", + "module.anti-afk.actions.sneak.description": "Sneaks and unsneaks quickly.", + "module.anti-afk.actions.sneak-time": "Sneak Time", + "module.anti-afk.actions.sneak-time.description": "How many ticks to stay sneaked.", + "module.anti-afk.actions.strafe": "Strafe", + "module.anti-afk.actions.strafe.description": "Strafe right and left.", + "module.anti-afk.actions.spin": "Spin", + "module.anti-afk.actions.spin.description": "Spins the player in place.", + "module.anti-afk.actions.spin-mode": "Spin Mode", + "module.anti-afk.actions.spin-mode.description": "The method of rotating.", + "module.anti-afk.actions.speed": "Speed", + "module.anti-afk.actions.speed.description": "The speed to spin you.", + "module.anti-afk.actions.pitch": "Pitch", + "module.anti-afk.actions.pitch.description": "The pitch to send to the server.", + "module.anti-afk.messages.send-messages": "Send Messages", + "module.anti-afk.messages.send-messages.description": "Sends messages to prevent getting kicked for AFK.", + "module.anti-afk.messages.random": "Random", + "module.anti-afk.messages.random.description": "Selects a random message from your message list.", + "module.anti-afk.messages.delay": "Delay", + "module.anti-afk.messages.delay.description": "The delay between specified messages in seconds.", + "module.anti-afk.messages.messages": "Messages", + "module.anti-afk.messages.messages.description": "The messages to choose from.", + + "module.gui-move": "Gui Move", + "module.gui-move.description": "Allows you to perform various actions while in GUIs.", + "module.gui-move.general.guis": "Guis", + "module.gui-move.general.guis.description": "Which GUIs to move in.", + "module.gui-move.general.jump": "Jump", + "module.gui-move.general.jump.description": "Allows you to jump while in GUIs.", + "module.gui-move.general.sneak": "Sneak", + "module.gui-move.general.sneak.description": "Allows you to sneak while in GUIs.", + "module.gui-move.general.sprint": "Sprint", + "module.gui-move.general.sprint.description": "Allows you to sprint while in GUIs.", + "module.gui-move.general.arrows-rotate": "Arrows Rotate", + "module.gui-move.general.arrows-rotate.description": "Allows you to use your arrow keys to rotate while in GUIs.", + "module.gui-move.general.rotate-speed": "Rotate Speed", + "module.gui-move.general.rotate-speed.description": "Rotation speed while in GUIs.", + + "module.trident-boost": "Trident Boost", + "module.trident-boost.description": "Boosts you when using riptide with a trident.", + "module.trident-boost.general.boost": "Boost", + "module.trident-boost.general.boost.description": "How much your velocity is multiplied by when using riptide.", + "module.trident-boost.general.out-of-water": "Out Of Water", + "module.trident-boost.general.out-of-water.description": "Whether riptide should work out of water", + + "module.better-tab": "Better Tab", + "module.better-tab.description": "Various improvements to the tab list.", + "module.better-tab.general.tablist-size": "Tablist Size", + "module.better-tab.general.tablist-size.description": "How many players in total to display in the tablist.", + "module.better-tab.general.column-height": "Column Height", + "module.better-tab.general.column-height.description": "How many players to display in each column.", + "module.better-tab.general.highlight-self": "Highlight Self", + "module.better-tab.general.highlight-self.description": "Highlights yourself in the tablist.", + "module.better-tab.general.self-color": "Self Color", + "module.better-tab.general.self-color.description": "The color to highlight your name with.", + "module.better-tab.general.highlight-friends": "Highlight Friends", + "module.better-tab.general.highlight-friends.description": "Highlights friends in the tablist.", + "module.better-tab.general.accurate-latency": "Accurate Latency", + "module.better-tab.general.accurate-latency.description": "Shows latency as a number in the tablist.", + "module.better-tab.general.gamemode": "Gamemode", + "module.better-tab.general.gamemode.description": "Display gamemode next to the nick.", + + "module.mount-bypass": "Mount Bypass", + "module.mount-bypass.description": "Allows you to bypass the IllegalStacks plugin and put chests on entities.", + + "module.anti-packet-kick": "Anti Packet Kick", + "module.anti-packet-kick.description": "Attempts to prevent you from being disconnected by large packets.", + "module.anti-packet-kick.general.catch-exceptions": "Catch Exceptions", + "module.anti-packet-kick.general.catch-exceptions.description": "Drops corrupted packets.", + "module.anti-packet-kick.general.log-exceptions": "Log Exceptions", + "module.anti-packet-kick.general.log-exceptions.description": "Logs caught exceptions.", + + "module.light-overlay": "Light Overlay", + "module.light-overlay.description": "Shows blocks where mobs can spawn.", + "module.light-overlay.general.horizontal-range": "Horizontal Range", + "module.light-overlay.general.horizontal-range.description": "Horizontal range in blocks.", + "module.light-overlay.general.vertical-range": "Vertical Range", + "module.light-overlay.general.vertical-range.description": "Vertical range in blocks.", + "module.light-overlay.general.see-through-blocks": "See Through Blocks", + "module.light-overlay.general.see-through-blocks.description": "Allows you to see the lines through blocks.", + "module.light-overlay.general.light-level": "Light Level", + "module.light-overlay.general.light-level.description": "Which light levels to render. Old spawning light: 7.", + "module.light-overlay.colors.color": "Color", + "module.light-overlay.colors.color.description": "Color of places where mobs can currently spawn.", + "module.light-overlay.colors.potential-color": "Potential Color", + "module.light-overlay.colors.potential-color.description": "Color of places where mobs can potentially spawn (eg at night).", + + "module.hole-filler": "Hole Filler", + "module.hole-filler.description": "Fills holes with specified blocks.", + "module.hole-filler.general.blocks": "Blocks", + "module.hole-filler.general.blocks.description": "Which blocks can be used to fill holes.", + "module.hole-filler.general.search-radius": "Search Radius", + "module.hole-filler.general.search-radius.description": "Horizontal radius in which to search for holes.", + "module.hole-filler.general.place-range": "Place Range", + "module.hole-filler.general.place-range.description": "How far away from the player you can place a block.", + "module.hole-filler.general.walls-range": "Walls Range", + "module.hole-filler.general.walls-range.description": "How far away from the player you can place a block behind walls.", + "module.hole-filler.general.doubles": "Doubles", + "module.hole-filler.general.doubles.description": "Fills double holes.", + "module.hole-filler.general.rotate": "Rotate", + "module.hole-filler.general.rotate.description": "Automatically rotates towards the holes being filled.", + "module.hole-filler.general.place-delay": "Place Delay", + "module.hole-filler.general.place-delay.description": "The ticks delay between placement.", + "module.hole-filler.general.blocks-per-tick": "Blocks Per Tick", + "module.hole-filler.general.blocks-per-tick.description": "How many blocks to place in one tick.", + "module.hole-filler.smart.smart": "Smart", + "module.hole-filler.smart.smart.description": "Take more factors into account before filling a hole.", + "module.hole-filler.smart.force-fill": "Force Fill", + "module.hole-filler.smart.force-fill.description": "Fills all holes around you regardless of target checks.", + "module.hole-filler.smart.predict-movement": "Predict Movement", + "module.hole-filler.smart.predict-movement.description": "Predict target movement to account for ping.", + "module.hole-filler.smart.ticks-to-predict": "Ticks To Predict", + "module.hole-filler.smart.ticks-to-predict.description": "How many ticks ahead we should predict for.", + "module.hole-filler.smart.ignore-safe": "Ignore Safe", + "module.hole-filler.smart.ignore-safe.description": "Ignore players in safe holes.", + "module.hole-filler.smart.only-moving": "Only Moving", + "module.hole-filler.smart.only-moving.description": "Ignore players if they're standing still.", + "module.hole-filler.smart.target-range": "Target Range", + "module.hole-filler.smart.target-range.description": "How far away to target players.", + "module.hole-filler.smart.feet-range": "Feet Range", + "module.hole-filler.smart.feet-range.description": "How far from a hole a player's feet must be to fill it.", + "module.hole-filler.render.swing": "Swing", + "module.hole-filler.render.swing.description": "Swing the player's hand when placing.", + "module.hole-filler.render.render": "Render", + "module.hole-filler.render.render.description": "Renders an overlay where blocks will be placed.", + "module.hole-filler.render.shape-mode": "Shape Mode", + "module.hole-filler.render.shape-mode.description": "How the shapes are rendered.", + "module.hole-filler.render.side-color": "Side Color", + "module.hole-filler.render.side-color.description": "The side color of the target block rendering.", + "module.hole-filler.render.line-color": "Line Color", + "module.hole-filler.render.line-color.description": "The line color of the target block rendering.", + "module.hole-filler.render.next-side-color": "Next Side Color", + "module.hole-filler.render.next-side-color.description": "The side color of the next block to be placed.", + "module.hole-filler.render.next-line-color": "Next Line Color", + "module.hole-filler.render.next-line-color.description": "The line color of the next block to be placed.", + + "module.message-aura": "Message Aura", + "module.message-aura.description": "Sends a specified message to any player that enters render distance.", + "module.message-aura.general.message": "Message", + "module.message-aura.general.message.description": "The specified message sent to the player.", + "module.message-aura.general.ignore-friends": "Ignore Friends", + "module.message-aura.general.ignore-friends.description": "Will not send any messages to people friended.", + + "module.fast-climb": "Fast Climb", + "module.fast-climb.description": "Allows you to climb faster.", + "module.fast-climb.general.timer-mode": "Timer Mode", + "module.fast-climb.general.timer-mode.description": "Use timer.", + "module.fast-climb.general.climb-speed": "Climb Speed", + "module.fast-climb.general.climb-speed.description": "Your climb speed.", + "module.fast-climb.general.timer": "Timer", + "module.fast-climb.general.timer.description": "The timer value for Timer.", + + "module.sprint": "Sprint", + "module.sprint.description": "Automatically sprints.", + "module.sprint.general.sprint-mode": "Sprint Mode", + "module.sprint.general.sprint-mode.description": "What mode of sprinting.", + "module.sprint.general.keep-sprint": "Keep Sprint", + "module.sprint.general.keep-sprint.description": "Whether to keep sprinting after attacking.", + "module.sprint.general.unsprint-on-hit": "Unsprint On Hit", + "module.sprint.general.unsprint-on-hit.description": "Whether to stop sprinting before attacking, to ensure you get crits and sweep attacks.", + "module.sprint.general.unsprint-in-water": "Unsprint In Water", + "module.sprint.general.unsprint-in-water.description": "Whether to stop sprinting when in water.", + "module.sprint.general.sprint-while-stationary": "Sprint While Stationary", + "module.sprint.general.sprint-while-stationary.description": "Sprint even when not moving.", + + "module.xray": "Xray", + "module.xray.description": "Only renders specified blocks. Good for mining.", + "module.xray.general.whitelist": "Whitelist", + "module.xray.general.whitelist.description": "Which blocks to show x-rayed.", + "module.xray.general.opacity": "Opacity", + "module.xray.general.opacity.description": "The opacity for all other blocks.", + "module.xray.general.exposed-only": "Exposed Only", + "module.xray.general.exposed-only.description": "Show only exposed ores.", + + "module.notebot": "Notebot", + "module.notebot.description": "Plays noteblock nicely", + "module.notebot.general.tick-delay": "Tick Delay", + "module.notebot.general.tick-delay.description": "The delay when loading a song.", + "module.notebot.general.concurrent-tune-blocks": "Concurrent Tune Blocks", + "module.notebot.general.concurrent-tune-blocks.description": "How many noteblocks can be tuned at the same time. On Paper it is recommended to set it to 1 to avoid bugs.", + "module.notebot.general.mode": "Mode", + "module.notebot.general.mode.description": "Select mode of notebot", + "module.notebot.general.instrument-detect-mode": "Instrument Detect Mode", + "module.notebot.general.instrument-detect-mode.description": "Select an instrument detect mode. Can be useful when server has a plugin that modifies noteblock state (e.g ItemsAdder) but noteblock can still play the right note", + "module.notebot.general.polyphonic": "Polyphonic", + "module.notebot.general.polyphonic.description": "Whether or not to allow multiple notes to be played at the same time", + "module.notebot.general.auto-rotate": "Auto Rotate", + "module.notebot.general.auto-rotate.description": "Should client look at note block when it wants to hit it", + "module.notebot.general.auto-play": "Auto Play", + "module.notebot.general.auto-play.description": "Auto plays random songs", + "module.notebot.general.round-out-of-range": "Round Out Of Range", + "module.notebot.general.round-out-of-range.description": "Rounds out of range notes", + "module.notebot.general.swing-arm": "Swing Arm", + "module.notebot.general.swing-arm.description": "Should swing arm on hit", + "module.notebot.general.check-noteblocks-again-delay": "Check Noteblocks Again Delay", + "module.notebot.general.check-noteblocks-again-delay.description": "How much delay should be between end of tuning and checking again", + "module.notebot.note-map.Harp": "Harp", + "module.notebot.note-map.Basedrum": "Basedrum", + "module.notebot.note-map.Snare": "Snare", + "module.notebot.note-map.Hat": "Hat", + "module.notebot.note-map.Bass": "Bass", + "module.notebot.note-map.Flute": "Flute", + "module.notebot.note-map.Bell": "Bell", + "module.notebot.note-map.Guitar": "Guitar", + "module.notebot.note-map.Chime": "Chime", + "module.notebot.note-map.Xylophone": "Xylophone", + "module.notebot.note-map.IronXylophone": "IronXylophone", + "module.notebot.note-map.CowBell": "CowBell", + "module.notebot.note-map.Didgeridoo": "Didgeridoo", + "module.notebot.note-map.Bit": "Bit", + "module.notebot.note-map.Banjo": "Banjo", + "module.notebot.note-map.Pling": "Pling", + + "module.notebot.render.render-text": "Render Text", + "module.notebot.render.render-text.description": "Whether or not to render the text above noteblocks.", + "module.notebot.render.render-boxes": "Render Boxes", + "module.notebot.render.render-boxes.description": "Whether or not to render the outline around the noteblocks.", + "module.notebot.render.shape-mode": "Shape Mode", + "module.notebot.render.shape-mode.description": "How the shapes are rendered.", + "module.notebot.render.untuned-side-color": "Untuned Side Color", + "module.notebot.render.untuned-side-color.description": "The color of the sides of the untuned blocks being rendered.", + "module.notebot.render.untuned-line-color": "Untuned Line Color", + "module.notebot.render.untuned-line-color.description": "The color of the lines of the untuned blocks being rendered.", + "module.notebot.render.tuned-side-color": "Tuned Side Color", + "module.notebot.render.tuned-side-color.description": "The color of the sides of the tuned blocks being rendered.", + "module.notebot.render.tuned-line-color": "Tuned Line Color", + "module.notebot.render.tuned-line-color.description": "The color of the lines of the tuned blocks being rendered.", + "module.notebot.render.hit-side-color": "Hit Side Color", + "module.notebot.render.hit-side-color.description": "The color of the sides being rendered on noteblock tune hit.", + "module.notebot.render.hit-line-color": "Hit Line Color", + "module.notebot.render.hit-line-color.description": "The color of the lines being rendered on noteblock tune hit.", + "module.notebot.render.scanned-noteblock-side-color": "Scanned Noteblock Side Color", + "module.notebot.render.scanned-noteblock-side-color.description": "The color of the sides of the scanned noteblocks being rendered.", + "module.notebot.render.scanned-noteblock-line-color": "Scanned Noteblock Line Color", + "module.notebot.render.scanned-noteblock-line-color.description": "The color of the lines of the scanned noteblocks being rendered.", + "module.notebot.render.note-text-scale": "Note Text Scale", + "module.notebot.render.note-text-scale.description": "The scale.", + "module.notebot.render.show-scanned-noteblocks": "Show Scanned Noteblocks", + "module.notebot.render.show-scanned-noteblocks.description": "Show scanned Noteblocks", + + "module.item-highlight": "Item Highlight", + "module.item-highlight.description": "Highlights selected items when in guis", + "module.item-highlight.general.items": "Items", + "module.item-highlight.general.items.description": "Items to highlight.", + "module.item-highlight.general.color": "Color", + "module.item-highlight.general.color.description": "The color to highlight the items with.", + + "module.auto-mount": "Auto Mount", + "module.auto-mount.description": "Automatically mounts entities.", + "module.auto-mount.general.check-saddle": "Check Saddle", + "module.auto-mount.general.check-saddle.description": "Checks if the entity contains a saddle before mounting.", + "module.auto-mount.general.rotate": "Rotate", + "module.auto-mount.general.rotate.description": "Faces the entity you mount.", + "module.auto-mount.general.entities": "Entities", + "module.auto-mount.general.entities.description": "Rideable entities.", + + "module.zoom": "Zoom", + "module.zoom.description": "Zooms your view.", + "module.zoom.general.zoom": "Zoom", + "module.zoom.general.zoom.description": "How much to zoom.", + "module.zoom.general.scroll-sensitivity": "Scroll Sensitivity", + "module.zoom.general.scroll-sensitivity.description": "Allows you to change zoom value using scroll wheel. 0 to disable.", + "module.zoom.general.smooth": "Smooth", + "module.zoom.general.smooth.description": "Smooth transition.", + "module.zoom.general.cinematic": "Cinematic", + "module.zoom.general.cinematic.description": "Enables cinematic camera.", + "module.zoom.general.hide-HUD": "Hide HUD", + "module.zoom.general.hide-HUD.description": "Whether or not to hide the Minecraft HUD.", + "module.zoom.general.show-hands": "Show Hands", + "module.zoom.general.show-hands.description": "Whether or not to render your hands.", + + "module.bow-spam": "Bow Spam", + "module.bow-spam.description": "Spams bows and crossbows.", + "module.bow-spam.general.charge": "Charge", + "module.bow-spam.general.charge.description": "How long to charge the bow before releasing in ticks.", + "module.bow-spam.general.when-holding-right-click": "When Holding Right Click", + "module.bow-spam.general.when-holding-right-click.description": "Works only when holding right click.", + "module.bow-spam.crossbows.spam-crossbows": "Spam Crossbows", + "module.bow-spam.crossbows.spam-crossbows.description": "Whether to spam loaded crossbows; takes priority over charging bows.", + "module.bow-spam.crossbows.crossbow-delay": "Crossbow Delay", + "module.bow-spam.crossbows.crossbow-delay.description": "Delay between shooting crossbows in ticks.", + "module.bow-spam.crossbows.search-inventory": "Search Inventory", + "module.bow-spam.crossbows.search-inventory.description": "Whether to search your inventory to find loaded crossbows.", + + "module.free-look": "Free Look", + "module.free-look.description": "Allows more rotation options in third person.", + "module.free-look.general.mode": "Mode", + "module.free-look.general.mode.description": "Which entity to rotate.", + "module.free-look.general.toggle-perspective": "Toggle Perspective", + "module.free-look.general.toggle-perspective.description": "Changes your perspective on toggle.", + "module.free-look.general.camera-sensitivity": "Camera Sensitivity", + "module.free-look.general.camera-sensitivity.description": "How fast the camera moves in camera mode.", + "module.free-look.arrows.arrows-control-opposite": "Arrows Control Opposite", + "module.free-look.arrows.arrows-control-opposite.description": "Allows you to control the other entities rotation with the arrow keys.", + "module.free-look.arrows.arrow-speed": "Arrow Speed", + "module.free-look.arrows.arrow-speed.description": "Rotation speed with arrow keys.", + + "module.auto-walk": "Auto Walk", + "module.auto-walk.description": "Automatically walks forward.", + "module.auto-walk.general.mode": "Mode", + "module.auto-walk.general.mode.description": "Walking mode.", + "module.auto-walk.general.simple-direction": "Simple Direction", + "module.auto-walk.general.simple-direction.description": "The direction to walk in simple mode.", + "module.auto-walk.general.disable-on-input": "Disable On Input", + "module.auto-walk.general.disable-on-input.description": "Disable module on manual movement input", + "module.auto-walk.general.disable-on-y-change": "Disable On Y Change", + "module.auto-walk.general.disable-on-y-change.description": "Disable module if player moves vertically", + "module.auto-walk.general.no-unloaded-chunks": "No Unloaded Chunks", + "module.auto-walk.general.no-unloaded-chunks.description": "Do not allow movement into unloaded chunks", + + "module.self-trap": "Self Trap", + "module.self-trap.description": "Places blocks above your head.", + "module.self-trap.general.whitelist": "Whitelist", + "module.self-trap.general.whitelist.description": "Which blocks to use.", + "module.self-trap.general.top-mode": "Top Mode", + "module.self-trap.general.top-mode.description": "Which positions to place on your top half.", + "module.self-trap.general.bottom-mode": "Bottom Mode", + "module.self-trap.general.bottom-mode.description": "Which positions to place on your bottom half.", + "module.self-trap.general.place-delay": "Place Delay", + "module.self-trap.general.place-delay.description": "How many ticks between block placements.", + "module.self-trap.general.center": "Center", + "module.self-trap.general.center.description": "Centers you on the block you are standing on before placing.", + "module.self-trap.general.turn-off": "Turn Off", + "module.self-trap.general.turn-off.description": "Turns off after placing.", + "module.self-trap.general.rotate": "Rotate", + "module.self-trap.general.rotate.description": "Sends rotation packets to the server when placing.", + "module.self-trap.render.render": "Render", + "module.self-trap.render.render.description": "Renders a block overlay where the blocks will be placed.", + "module.self-trap.render.shape-mode": "Shape Mode", + "module.self-trap.render.shape-mode.description": "How the shapes are rendered.", + "module.self-trap.render.side-color": "Side Color", + "module.self-trap.render.side-color.description": "The color of the sides of the blocks being rendered.", + "module.self-trap.render.line-color": "Line Color", + "module.self-trap.render.line-color.description": "The color of the lines of the blocks being rendered.", + + "module.safe-walk": "Safe Walk", + "module.safe-walk.description": "Prevents you from walking off blocks.", + "module.safe-walk.general.minimum-fall-distance": "Minimum Fall Distance", + "module.safe-walk.general.minimum-fall-distance.description": "The minimum number of blocks you are expected to fall before the module activates.", + "module.safe-walk.general.sneak": "Sneak", + "module.safe-walk.general.sneak.description": "Sneak when approaching edge of block.", + "module.safe-walk.general.safe-sneak": "Safe Sneak", + "module.safe-walk.general.safe-sneak.description": "Prevent you from falling if sneak doesn't trigger correctly.", + "module.safe-walk.general.sneak-on-sprint": "Sneak On Sprint", + "module.safe-walk.general.sneak-on-sprint.description": "Sneak even when sprinting at the block edge.", + "module.safe-walk.general.edge-distance": "Edge Distance", + "module.safe-walk.general.edge-distance.description": "Distance offset before reaching an edge.", + "module.safe-walk.render.render": "Render", + "module.safe-walk.render.render.description": "Render edge distance helper.", + "module.safe-walk.render.render-player-box": "Render Player Box", + "module.safe-walk.render.render-player-box.description": "Render player box helper.", + + "module.auto-wasp": "Auto Wasp", + "module.auto-wasp.description": "Wasps for you. Unable to traverse around blocks, assumes a clear straight line to the target.", + "module.auto-wasp.general.horizontal-speed": "Horizontal Speed", + "module.auto-wasp.general.horizontal-speed.description": "Horizontal elytra speed.", + "module.auto-wasp.general.vertical-speed": "Vertical Speed", + "module.auto-wasp.general.vertical-speed.description": "Vertical elytra speed.", + "module.auto-wasp.general.avoid-landing": "Avoid Landing", + "module.auto-wasp.general.avoid-landing.description": "Will try to avoid landing if your target is on the ground.", + "module.auto-wasp.general.predict-movement": "Predict Movement", + "module.auto-wasp.general.predict-movement.description": "Tries to predict the targets position according to their movement.", + "module.auto-wasp.general.only-friends": "Only Friends", + "module.auto-wasp.general.only-friends.description": "Will only follow friends.", + "module.auto-wasp.general.action-on-target-loss": "Action On Target Loss", + "module.auto-wasp.general.action-on-target-loss.description": "What to do if you lose the target.", + "module.auto-wasp.general.offset": "Offset", + "module.auto-wasp.general.offset.description": "How many blocks offset to wasp at from the target.", + + "module.break-delay": "Break Delay", + "module.break-delay.description": "Changes the delay between breaking blocks.", + "module.break-delay.general.cooldown": "Cooldown", + "module.break-delay.general.cooldown.description": "Block break cooldown in ticks.", + "module.break-delay.general.no-insta-break": "No Insta Break", + "module.break-delay.general.no-insta-break.description": "Prevents you from misbreaking blocks if you can instantly break them.", + + "module.auto-armor": "Auto Armor", + "module.auto-armor.description": "Automatically equips armor.", + "module.auto-armor.general.preferred-protection": "Preferred Protection", + "module.auto-armor.general.preferred-protection.description": "Which type of protection to prefer.", + "module.auto-armor.general.swap-delay": "Swap Delay", + "module.auto-armor.general.swap-delay.description": "The delay between equipping armor pieces.", + "module.auto-armor.general.avoided-enchantments": "Avoided Enchantments", + "module.auto-armor.general.avoided-enchantments.description": "Enchantments that should be avoided.", + "module.auto-armor.general.blast-prot-leggings": "Blast Prot Leggings", + "module.auto-armor.general.blast-prot-leggings.description": "Uses blast protection for leggings regardless of preferred protection.", + "module.auto-armor.general.anti-break": "Anti Break", + "module.auto-armor.general.anti-break.description": "Takes off armor if it is about to break.", + "module.auto-armor.general.ignore-elytra": "Ignore Elytra", + "module.auto-armor.general.ignore-elytra.description": "Will not replace your elytra if you have it equipped.", + + "module.pop-chams": "Pop Chams", + "module.pop-chams.description": "Renders a ghost where players pop totem.", + "module.pop-chams.general.only-one": "Only One", + "module.pop-chams.general.only-one.description": "Only allow one ghost per player.", + "module.pop-chams.general.render-time": "Render Time", + "module.pop-chams.general.render-time.description": "How long the ghost is rendered in seconds.", + "module.pop-chams.general.y-modifier": "Y Modifier", + "module.pop-chams.general.y-modifier.description": "How much should the Y position of the ghost change per second.", + "module.pop-chams.general.scale-modifier": "Scale Modifier", + "module.pop-chams.general.scale-modifier.description": "How much should the scale of the ghost change per second.", + "module.pop-chams.general.fade-out": "Fade Out", + "module.pop-chams.general.fade-out.description": "Fades out the color.", + "module.pop-chams.general.shape-mode": "Shape Mode", + "module.pop-chams.general.shape-mode.description": "How the shapes are rendered.", + "module.pop-chams.general.side-color": "Side Color", + "module.pop-chams.general.side-color.description": "The side color.", + "module.pop-chams.general.line-color": "Line Color", + "module.pop-chams.general.line-color.description": "The line color.", + + "module.ghost-hand": "Ghost Hand", + "module.ghost-hand.description": "Opens containers through walls.", + + "module.slippy": "Slippy", + "module.slippy.description": "Changes the base friction level of blocks.", + "module.slippy.general.friction": "Friction", + "module.slippy.general.friction.description": "The base friction level.", + "module.slippy.general.list-mode": "List Mode", + "module.slippy.general.list-mode.description": "The mode to select blocks.", + "module.slippy.general.ignored-blocks": "Ignored Blocks", + "module.slippy.general.ignored-blocks.description": "Decide which blocks not to slip on", + "module.slippy.general.allowed-blocks": "Allowed Blocks", + "module.slippy.general.allowed-blocks.description": "Decide which blocks to slip on", + + "module.auto-tool": "Auto Tool", + "module.auto-tool.description": "Automatically switches to the most effective tool when performing an action.", + "module.auto-tool.general.prefer": "Prefer", + "module.auto-tool.general.prefer.description": "Either to prefer Silk Touch, Fortune, or none.", + "module.auto-tool.general.silk-touch-for-ender-chest": "Silk Touch For Ender Chest", + "module.auto-tool.general.silk-touch-for-ender-chest.description": "Mines Ender Chests only with the Silk Touch enchantment.", + "module.auto-tool.general.fortune-for-ores-and-crops": "Fortune For Ores And Crops", + "module.auto-tool.general.fortune-for-ores-and-crops.description": "Mines Ores and crops only with the Fortune enchantment.", + "module.auto-tool.general.anti-break": "Anti Break", + "module.auto-tool.general.anti-break.description": "Stops you from breaking your tool.", + "module.auto-tool.general.anti-break-percentage": "Anti Break Percentage", + "module.auto-tool.general.anti-break-percentage.description": "The durability percentage to stop using a tool.", + "module.auto-tool.general.switch-back": "Switch Back", + "module.auto-tool.general.switch-back.description": "Switches your hand to whatever was selected when releasing your attack key.", + "module.auto-tool.general.switch-delay": "Switch Delay", + "module.auto-tool.general.switch-delay.description": "Delay in ticks before switching tools.", + "module.auto-tool.whitelist.list-mode": "List Mode", + "module.auto-tool.whitelist.list-mode.description": "Selection mode.", + "module.auto-tool.whitelist.whitelist": "Whitelist", + "module.auto-tool.whitelist.whitelist.description": "The tools you want to use.", + "module.auto-tool.whitelist.blacklist": "Blacklist", + "module.auto-tool.whitelist.blacklist.description": "The tools you don't want to use.", + + "module.anti-hunger": "Anti Hunger", + "module.anti-hunger.description": "Reduces (does NOT remove) hunger consumption.", + "module.anti-hunger.general.sprint": "Sprint", + "module.anti-hunger.general.sprint.description": "Spoofs sprinting packets.", + "module.anti-hunger.general.on-ground": "On Ground", + "module.anti-hunger.general.on-ground.description": "Spoofs the onGround flag.", + + "module.auto-clicker": "Auto Clicker", + "module.auto-clicker.description": "Automatically clicks.", + "module.auto-clicker.general.while-in-screens": "While In Screens", + "module.auto-clicker.general.while-in-screens.description": "Whether to click while a screen is open.", + "module.auto-clicker.general.mode-left": "Mode Left", + "module.auto-clicker.general.mode-left.description": "The method of clicking for left clicks.", + "module.auto-clicker.general.delay-left": "Delay Left", + "module.auto-clicker.general.delay-left.description": "The amount of delay between left clicks in ticks.", + "module.auto-clicker.general.mode-right": "Mode Right", + "module.auto-clicker.general.mode-right.description": "The method of clicking for right clicks.", + "module.auto-clicker.general.delay-right": "Delay Right", + "module.auto-clicker.general.delay-right.description": "The amount of delay between right clicks in ticks.", + + "module.auto-shearer": "Auto Shearer", + "module.auto-shearer.description": "Automatically shears sheep.", + "module.auto-shearer.general.distance": "Distance", + "module.auto-shearer.general.distance.description": "The maximum distance the sheep have to be to be sheared.", + "module.auto-shearer.general.anti-break": "Anti Break", + "module.auto-shearer.general.anti-break.description": "Prevents shears from being broken.", + "module.auto-shearer.general.rotate": "Rotate", + "module.auto-shearer.general.rotate.description": "Automatically faces towards the animal being sheared.", + + "module.boss-stack": "Boss Stack", + "module.boss-stack.description": "Stacks boss bars to make your HUD less cluttered.", + "module.boss-stack.general.stack": "Stack", + "module.boss-stack.general.stack.description": "Stacks boss bars and adds a counter to the text.", + "module.boss-stack.general.hide-name": "Hide Name", + "module.boss-stack.general.hide-name.description": "Hides the names of boss bars.", + "module.boss-stack.general.bar-spacing": "Bar Spacing", + "module.boss-stack.general.bar-spacing.description": "The spacing reduction between each boss bar.", + + "module.camera-tweaks": "Camera Tweaks", + "module.camera-tweaks.description": "Allows modification of the third person camera.", + "module.camera-tweaks.general.clip": "Clip", + "module.camera-tweaks.general.clip.description": "Allows the camera to clip through blocks.", + "module.camera-tweaks.general.camera-distance": "Camera Distance", + "module.camera-tweaks.general.camera-distance.description": "The distance the third person camera is from the player.", + "module.camera-tweaks.scrolling.scrolling": "Scrolling", + "module.camera-tweaks.scrolling.scrolling.description": "Allows you to scroll to change camera distance.", + "module.camera-tweaks.scrolling.bind": "Bind", + "module.camera-tweaks.scrolling.bind.description": "Binds camera distance scrolling to a key.", + "module.camera-tweaks.scrolling.sensitivity": "Sensitivity", + "module.camera-tweaks.scrolling.sensitivity.description": "Sensitivity of the scroll wheel when changing the cameras distance.", + + "module.auto-weapon": "Auto Weapon", + "module.auto-weapon.description": "Finds the best weapon to use in your hotbar.", + "module.auto-weapon.general.weapon": "Weapon", + "module.auto-weapon.general.weapon.description": "What type of weapon to use.", + "module.auto-weapon.general.threshold": "Threshold", + "module.auto-weapon.general.threshold.description": "If the non-preferred weapon produces this much damage this will favor it over your preferred weapon.", + "module.auto-weapon.general.anti-break": "Anti Break", + "module.auto-weapon.general.anti-break.description": "Prevents you from breaking your weapon.", + + "module.better-chat": "Better Chat", + "module.better-chat.description": "Improves your chat experience in various ways.", + "module.better-chat.general.annoy": "Annoy", + "module.better-chat.general.annoy.description": "Makes your messages aNnOyInG.", + "module.better-chat.general.fancy-chat": "Fancy Chat", + "module.better-chat.general.fancy-chat.description": "Makes your messages ғᴀɴᴄʏ!", + "module.better-chat.general.timestamps": "Timestamps", + "module.better-chat.general.timestamps.description": "Adds client-side time stamps to the beginning of chat messages.", + "module.better-chat.general.show-seconds": "Show Seconds", + "module.better-chat.general.show-seconds.description": "Shows seconds in the chat message timestamps", + "module.better-chat.general.player-heads": "Player Heads", + "module.better-chat.general.player-heads.description": "Displays player heads next to their messages.", + "module.better-chat.general.coords-protection": "Coords Protection", + "module.better-chat.general.coords-protection.description": "Prevents you from sending messages in chat that may contain coordinates.", + "module.better-chat.general.keep-history": "Keep History", + "module.better-chat.general.keep-history.description": "Prevents the chat history from being cleared when disconnecting.", + "module.better-chat.filter.anti-spam": "Anti Spam", + "module.better-chat.filter.anti-spam.description": "Blocks duplicate messages from filling your chat.", + "module.better-chat.filter.depth": "Depth", + "module.better-chat.filter.depth.description": "How many messages to filter.", + "module.better-chat.filter.anti-clear": "Anti Clear", + "module.better-chat.filter.anti-clear.description": "Prevents servers from clearing chat.", + "module.better-chat.filter.filter-regex": "Filter Regex", + "module.better-chat.filter.filter-regex.description": "Filter out chat messages that match the regex filter.", + "module.better-chat.filter.regex-filter": "Regex Filter", + "module.better-chat.filter.regex-filter.description": "Regex filter used for filtering chat messages.", + "module.better-chat.longer-chat.infinite-chat-box": "Infinite Chat Box", + "module.better-chat.longer-chat.infinite-chat-box.description": "Lets you type infinitely long messages.", + "module.better-chat.longer-chat.longer-chat-history": "Longer Chat History", + "module.better-chat.longer-chat.longer-chat-history.description": "Extends chat length.", + "module.better-chat.longer-chat.extra-lines": "Extra Lines", + "module.better-chat.longer-chat.extra-lines.description": "The amount of extra chat lines.", + "module.better-chat.prefix.prefix": "Prefix", + "module.better-chat.prefix.prefix.description": "Adds a prefix to your chat messages.", + "module.better-chat.prefix.random": "Random", + "module.better-chat.prefix.random.description": "Uses a random number as your prefix.", + "module.better-chat.prefix.text": "Text", + "module.better-chat.prefix.text.description": "The text to add as your prefix.", + "module.better-chat.prefix.small-caps": "Small Caps", + "module.better-chat.prefix.small-caps.description": "Uses small caps in the prefix.", + "module.better-chat.suffix.suffix": "Suffix", + "module.better-chat.suffix.suffix.description": "Adds a suffix to your chat messages.", + "module.better-chat.suffix.random": "Random", + "module.better-chat.suffix.random.description": "Uses a random number as your suffix.", + "module.better-chat.suffix.text": "Text", + "module.better-chat.suffix.text.description": "The text to add as your suffix.", + "module.better-chat.suffix.small-caps": "Small Caps", + "module.better-chat.suffix.small-caps.description": "Uses small caps in the suffix.", + + "module.offhand-crash": "Offhand Crash", + "module.offhand-crash.description": "An exploit that can crash other players by swapping back and forth between your main hand and offhand.", + "module.offhand-crash.general.do-crash": "Do Crash", + "module.offhand-crash.general.do-crash.description": "Sends X number of offhand swap sound packets to the server per tick.", + "module.offhand-crash.general.speed": "Speed", + "module.offhand-crash.general.speed.description": "The amount of swaps per tick.", + "module.offhand-crash.general.anti-crash": "Anti Crash", + "module.offhand-crash.general.anti-crash.description": "Attempts to prevent you from crashing yourself.", + + "module.auto-breed": "Auto Breed", + "module.auto-breed.description": "Automatically breeds specified animals.", + "module.auto-breed.general.entities": "Entities", + "module.auto-breed.general.entities.description": "Entities to breed.", + "module.auto-breed.general.range": "Range", + "module.auto-breed.general.range.description": "How far away the animals can be to be bred.", + "module.auto-breed.general.hand-for-breeding": "Hand For Breeding", + "module.auto-breed.general.hand-for-breeding.description": "The hand to use for breeding.", + "module.auto-breed.general.mob-age-filter": "Mob Age Filter", + "module.auto-breed.general.mob-age-filter.description": "Determines the age of the mobs to target (baby, adult, or both).", + + "module.spawn-proofer": "Spawn Proofer", + "module.spawn-proofer.description": "Automatically spawnproofs unlit areas.", + "module.spawn-proofer.general.place-delay": "Place Delay", + "module.spawn-proofer.general.place-delay.description": "The tick delay between placing blocks.", + "module.spawn-proofer.general.place-range": "Place Range", + "module.spawn-proofer.general.place-range.description": "How far away from the player you can place a block.", + "module.spawn-proofer.general.walls-range": "Walls Range", + "module.spawn-proofer.general.walls-range.description": "How far away from the player you can place a block behind walls.", + "module.spawn-proofer.general.blocks-per-tick": "Blocks Per Tick", + "module.spawn-proofer.general.blocks-per-tick.description": "How many blocks to place in one tick.", + "module.spawn-proofer.general.light-level": "Light Level", + "module.spawn-proofer.general.light-level.description": "Light levels to spawn proof. Old spawning light: 7.", + "module.spawn-proofer.general.blocks": "Blocks", + "module.spawn-proofer.general.blocks.description": "Block to use for spawn proofing.", + "module.spawn-proofer.general.mode": "Mode", + "module.spawn-proofer.general.mode.description": "Which spawn types should be spawn proofed.", + "module.spawn-proofer.general.rotate": "Rotate", + "module.spawn-proofer.general.rotate.description": "Rotates towards the blocks being placed.", + + "module.step": "Step", + "module.step.description": "Allows you to walk up full blocks instantly.", + "module.step.general.height": "Height", + "module.step.general.height.description": "Step height.", + "module.step.general.active-when": "Active When", + "module.step.general.active-when.description": "Step is active when you meet these requirements.", + "module.step.general.safe-step": "Safe Step", + "module.step.general.safe-step.description": "Doesn't let you step out of a hole if you are low on health or there is a crystal nearby.", + "module.step.general.step-health": "Step Health", + "module.step.general.step-health.description": "The health you stop being able to step at.", + + "module.entity-owner": "Entity Owner", + "module.entity-owner.description": "Displays the name of the player who owns the entity you're looking at.", + "module.entity-owner.general.scale": "Scale", + "module.entity-owner.general.scale.description": "The scale of the text.", + + "module.scaffold": "Scaffold", + "module.scaffold.description": "Automatically places blocks under you.", + "module.scaffold.general.blocks": "Blocks", + "module.scaffold.general.blocks.description": "Selected blocks.", + "module.scaffold.general.blocks-filter": "Blocks Filter", + "module.scaffold.general.blocks-filter.description": "How to use the block list setting", + "module.scaffold.general.fast-tower": "Fast Tower", + "module.scaffold.general.fast-tower.description": "Whether or not to scaffold upwards faster.", + "module.scaffold.general.tower-speed": "Tower Speed", + "module.scaffold.general.tower-speed.description": "The speed at which to tower.", + "module.scaffold.general.while-moving": "While Moving", + "module.scaffold.general.while-moving.description": "Allows you to tower while moving.", + "module.scaffold.general.only-on-click": "Only On Click", + "module.scaffold.general.only-on-click.description": "Only places blocks when holding right click.", + "module.scaffold.general.swing": "Swing", + "module.scaffold.general.swing.description": "Renders your client-side swing.", + "module.scaffold.general.auto-switch": "Auto Switch", + "module.scaffold.general.auto-switch.description": "Automatically swaps to a block before placing.", + "module.scaffold.general.rotate": "Rotate", + "module.scaffold.general.rotate.description": "Rotates towards the blocks being placed.", + "module.scaffold.general.air-place": "Air Place", + "module.scaffold.general.air-place.description": "Allow air place. This also allows you to modify scaffold radius.", + "module.scaffold.general.ahead-distance": "Ahead Distance", + "module.scaffold.general.ahead-distance.description": "How far ahead to place blocks.", + "module.scaffold.general.closest-block-range": "Closest Block Range", + "module.scaffold.general.closest-block-range.description": "How far can scaffold place blocks when you are in air.", + "module.scaffold.general.radius": "Radius", + "module.scaffold.general.radius.description": "Scaffold radius.", + "module.scaffold.general.blocks-per-tick": "Blocks Per Tick", + "module.scaffold.general.blocks-per-tick.description": "How many blocks to place in one tick.", + "module.scaffold.render.render": "Render", + "module.scaffold.render.render.description": "Whether to render blocks that have been placed.", + "module.scaffold.render.shape-mode": "Shape Mode", + "module.scaffold.render.shape-mode.description": "How the shapes are rendered.", + "module.scaffold.render.side-color": "Side Color", + "module.scaffold.render.side-color.description": "The side color of the target block rendering.", + "module.scaffold.render.line-color": "Line Color", + "module.scaffold.render.line-color.description": "The line color of the target block rendering.", + + "module.sneak": "Sneak", + "module.sneak.description": "Sneaks for you", + "module.sneak.general.mode": "Mode", + "module.sneak.general.mode.description": "Which method to sneak.", + + "module.no-slow": "No Slow", + "module.no-slow.description": "Allows you to move normally when using objects that will slow you.", + "module.no-slow.general.items": "Items", + "module.no-slow.general.items.description": "Whether or not using items will slow you.", + "module.no-slow.general.web": "Web", + "module.no-slow.general.web.description": "Whether or not cobwebs will not slow you down.", + "module.no-slow.general.web-timer": "Web Timer", + "module.no-slow.general.web-timer.description": "The timer value for WebMode Timer.", + "module.no-slow.general.honey-block": "Honey Block", + "module.no-slow.general.honey-block.description": "Whether or not honey blocks will not slow you down.", + "module.no-slow.general.soul-sand": "Soul Sand", + "module.no-slow.general.soul-sand.description": "Whether or not soul sand will not slow you down.", + "module.no-slow.general.slime-block": "Slime Block", + "module.no-slow.general.slime-block.description": "Whether or not slime blocks will not slow you down.", + "module.no-slow.general.berry-bush": "Berry Bush", + "module.no-slow.general.berry-bush.description": "Whether or not berry bushes will not slow you down.", + "module.no-slow.general.air-strict": "Air Strict", + "module.no-slow.general.air-strict.description": "Will attempt to bypass anti-cheats like 2b2t's. Only works while in air.", + "module.no-slow.general.fluid-drag": "Fluid Drag", + "module.no-slow.general.fluid-drag.description": "Whether or not fluid drag will not slow you down.", + "module.no-slow.general.sneaking": "Sneaking", + "module.no-slow.general.sneaking.description": "Whether or not sneaking will not slow you down.", + "module.no-slow.general.hunger": "Hunger", + "module.no-slow.general.hunger.description": "Whether or not hunger will not slow you down.", + "module.no-slow.general.slowness": "Slowness", + "module.no-slow.general.slowness.description": "Whether or not slowness will not slow you down.", + + "module.fake-player": "Fake Player", + "module.fake-player.description": "Spawns a client-side fake player for testing usages. No need to be active.", + "module.fake-player.general.name": "Name", + "module.fake-player.general.name.description": "The name of the fake player.", + "module.fake-player.general.copy-inv": "Copy Inv", + "module.fake-player.general.copy-inv.description": "Copies your inventory to the fake player.", + "module.fake-player.general.health": "Health", + "module.fake-player.general.health.description": "The fake player's default health.", + + "module.nametags": "Nametags", + "module.nametags.description": "Displays customizable nametags above players, items and other entities.", + "module.nametags.general.entities": "Entities", + "module.nametags.general.entities.description": "Select entities to draw nametags on.", + "module.nametags.general.scale": "Scale", + "module.nametags.general.scale.description": "The scale of the nametag.", + "module.nametags.general.ignore-self": "Ignore Self", + "module.nametags.general.ignore-self.description": "Ignore yourself when in third person or freecam.", + "module.nametags.general.ignore-friends": "Ignore Friends", + "module.nametags.general.ignore-friends.description": "Ignore rendering nametags for friends.", + "module.nametags.general.ignore-bots": "Ignore Bots", + "module.nametags.general.ignore-bots.description": "Only render non-bot nametags.", + "module.nametags.general.culling": "Culling", + "module.nametags.general.culling.description": "Only render a certain number of nametags at a certain distance.", + "module.nametags.general.culling-range": "Culling Range", + "module.nametags.general.culling-range.description": "Only render nametags within this distance of your player.", + "module.nametags.general.culling-count": "Culling Count", + "module.nametags.general.culling-count.description": "Only render this many nametags.", + "module.nametags.players.health": "Health", + "module.nametags.players.health.description": "Shows the player's health.", + "module.nametags.players.gamemode": "Gamemode", + "module.nametags.players.gamemode.description": "Shows the player's GameMode.", + "module.nametags.players.distance": "Distance", + "module.nametags.players.distance.description": "Shows the distance between you and the player.", + "module.nametags.players.ping": "Ping", + "module.nametags.players.ping.description": "Shows the player's ping.", + "module.nametags.players.items": "Items", + "module.nametags.players.items.description": "Displays armor and hand items above the name tags.", + "module.nametags.players.item-spacing": "Item Spacing", + "module.nametags.players.item-spacing.description": "The spacing between items.", + "module.nametags.players.ignore-empty-slots": "Ignore Empty Slots", + "module.nametags.players.ignore-empty-slots.description": "Doesn't add spacing where an empty item stack would be.", + "module.nametags.players.durability": "Durability", + "module.nametags.players.durability.description": "Displays item durability as either a total, percentage, or neither.", + "module.nametags.players.display-enchants": "Display Enchants", + "module.nametags.players.display-enchants.description": "Displays item enchantments on the items.", + "module.nametags.players.shown-enchantments": "Shown Enchantments", + "module.nametags.players.shown-enchantments.description": "The enchantments that are shown on nametags.", + "module.nametags.players.enchantment-position": "Enchantment Position", + "module.nametags.players.enchantment-position.description": "Where the enchantments are rendered.", + "module.nametags.players.enchant-name-length": "Enchant Name Length", + "module.nametags.players.enchant-name-length.description": "The length enchantment names are trimmed to.", + "module.nametags.players.enchant-text-scale": "Enchant Text Scale", + "module.nametags.players.enchant-text-scale.description": "The scale of the enchantment text.", + "module.nametags.items.show-count": "Show Count", + "module.nametags.items.show-count.description": "Displays the number of items in the stack.", + "module.nametags.render.background-color": "Background Color", + "module.nametags.render.background-color.description": "The color of the nametag background.", + "module.nametags.render.name-color": "Name Color", + "module.nametags.render.name-color.description": "The color of the nametag names.", + "module.nametags.render.ping-color": "Ping Color", + "module.nametags.render.ping-color.description": "The color of the nametag ping.", + "module.nametags.render.gamemode-color": "Gamemode Color", + "module.nametags.render.gamemode-color.description": "The color of the nametag gamemode.", + "module.nametags.render.distance-color-mode": "Distance Color Mode", + "module.nametags.render.distance-color-mode.description": "The mode to color the nametag distance with.", + "module.nametags.render.distance-color": "Distance Color", + "module.nametags.render.distance-color.description": "The color of the nametag distance.", + + "module.esp": "Esp", + "module.esp.description": "Renders entities through walls.", + "module.esp.general.mode": "Mode", + "module.esp.general.mode.description": "Rendering mode.", + "module.esp.general.highlight-target": "Highlight Target", + "module.esp.general.highlight-target.description": "highlights the currently targeted entity differently", + "module.esp.general.target-hitbox": "Target Hitbox", + "module.esp.general.target-hitbox.description": "draw the hitbox of the target entity", + "module.esp.general.outline-width": "Outline Width", + "module.esp.general.outline-width.description": "The width of the shader outline.", + "module.esp.general.glow-multiplier": "Glow Multiplier", + "module.esp.general.glow-multiplier.description": "Multiplier for glow effect", + "module.esp.general.ignore-self": "Ignore Self", + "module.esp.general.ignore-self.description": "Ignores yourself drawing the shader.", + "module.esp.general.shape-mode": "Shape Mode", + "module.esp.general.shape-mode.description": "How the shapes are rendered.", + "module.esp.general.fill-opacity": "Fill Opacity", + "module.esp.general.fill-opacity.description": "The opacity of the shape fill.", + "module.esp.general.fade-distance": "Fade Distance", + "module.esp.general.fade-distance.description": "The distance from an entity where the color begins to fade.", + "module.esp.general.entities": "Entities", + "module.esp.general.entities.description": "Select specific entities.", + "module.esp.colors.distance-colors": "Distance Colors", + "module.esp.colors.distance-colors.description": "Changes the color of tracers depending on distance.", + "module.esp.colors.show-friend-colors": "Show Friend Colors", + "module.esp.colors.show-friend-colors.description": "Whether or not to override the distance color of friends with the friend color.", + "module.esp.colors.players-color": "Players Color", + "module.esp.colors.players-color.description": "The other player's color.", + "module.esp.colors.animals-color": "Animals Color", + "module.esp.colors.animals-color.description": "The animal's color.", + "module.esp.colors.water-animals-color": "Water Animals Color", + "module.esp.colors.water-animals-color.description": "The water animal's color.", + "module.esp.colors.monsters-color": "Monsters Color", + "module.esp.colors.monsters-color.description": "The monster's color.", + "module.esp.colors.ambient-color": "Ambient Color", + "module.esp.colors.ambient-color.description": "The ambient's color.", + "module.esp.colors.misc-color": "Misc Color", + "module.esp.colors.misc-color.description": "The misc color.", + "module.esp.colors.target-color": "Target Color", + "module.esp.colors.target-color.description": "The target color.", + "module.esp.colors.target-hitbox-color": "Target Hitbox Color", + "module.esp.colors.target-hitbox-color.description": "The target hitbox color.", + + "module.rotation": "Rotation", + "module.rotation.description": "Changes/locks your yaw and pitch.", + "module.rotation.yaw.yaw-lock-mode": "Yaw Lock Mode", + "module.rotation.yaw.yaw-lock-mode.description": "The way in which your yaw is locked.", + "module.rotation.yaw.yaw-angle": "Yaw Angle", + "module.rotation.yaw.yaw-angle.description": "Yaw angle in degrees.", + "module.rotation.pitch.pitch-lock-mode": "Pitch Lock Mode", + "module.rotation.pitch.pitch-lock-mode.description": "The way in which your pitch is locked.", + "module.rotation.pitch.pitch-angle": "Pitch Angle", + "module.rotation.pitch.pitch-angle.description": "Pitch angle in degrees.", + + "module.elytra-fly": "Elytra Fly", + "module.elytra-fly.description": "Gives you more control over your elytra.", + "module.elytra-fly.general.mode": "Mode", + "module.elytra-fly.general.mode.description": "The mode of flying.", + "module.elytra-fly.general.auto-take-off": "Auto Take Off", + "module.elytra-fly.general.auto-take-off.description": "Automatically takes off when you hold jump without needing to double jump.", + "module.elytra-fly.general.fall-multiplier": "Fall Multiplier", + "module.elytra-fly.general.fall-multiplier.description": "Controls how fast will you go down naturally.", + "module.elytra-fly.general.horizontal-speed": "Horizontal Speed", + "module.elytra-fly.general.horizontal-speed.description": "How fast you go forward and backward.", + "module.elytra-fly.general.vertical-speed": "Vertical Speed", + "module.elytra-fly.general.vertical-speed.description": "How fast you go up and down.", + "module.elytra-fly.general.acceleration": "Acceleration", + + "module.elytra-fly.general.acceleration-step": "Acceleration Step", + + "module.elytra-fly.general.acceleration-start": "Acceleration Start", + + "module.elytra-fly.general.stop-in-water": "Stop In Water", + "module.elytra-fly.general.stop-in-water.description": "Stops flying in water.", + "module.elytra-fly.general.no-unloaded-chunks": "No Unloaded Chunks", + "module.elytra-fly.general.no-unloaded-chunks.description": "Stops you from going into unloaded chunks.", + "module.elytra-fly.general.auto-hover": "Auto Hover", + "module.elytra-fly.general.auto-hover.description": "Automatically hover .3 blocks off ground when holding shift.", + "module.elytra-fly.general.no-crash": "No Crash", + "module.elytra-fly.general.no-crash.description": "Stops you from going into walls.", + "module.elytra-fly.general.crash-look-ahead": "Crash Look Ahead", + "module.elytra-fly.general.crash-look-ahead.description": "Distance to look ahead when flying.", + "module.elytra-fly.general.insta-drop": "Insta Drop", + "module.elytra-fly.general.insta-drop.description": "Makes you drop out of flight instantly.", + "module.elytra-fly.general.pitch40-lower-bounds": "Pitch40 Lower Bounds", + "module.elytra-fly.general.pitch40-lower-bounds.description": "The bottom height boundary for pitch40. You must be at least 40 blocks above this boundary when starting the module.\nAfter descending below this boundary you will start pitching upwards.", + "module.elytra-fly.general.pitch40-upper-bounds": "Pitch40 Upper Bounds", + "module.elytra-fly.general.pitch40-upper-bounds.description": "The upper height boundary for pitch40. You must be above this boundary when starting the module.\nWhen ascending above this boundary, if you are not already, you will start pitching downwards.", + "module.elytra-fly.general.pitch40-rotate-speed-up": "Pitch40 Rotate Speed Up", + "module.elytra-fly.general.pitch40-rotate-speed-up.description": "The speed for pitch rotation upwards (degrees per tick).", + "module.elytra-fly.general.pitch40-rotate-speed-down": "Pitch40 Rotate Speed Down", + "module.elytra-fly.general.pitch40-rotate-speed-down.description": "The speed for pitch rotation downwards (degrees per tick).", + "module.elytra-fly.general.auto-jump": "Auto Jump", + "module.elytra-fly.general.auto-jump.description": "Automatically jumps for you.", + "module.elytra-fly.general.yaw-lock": "Yaw Lock", + "module.elytra-fly.general.yaw-lock.description": "Whether to enable yaw lock or not", + "module.elytra-fly.general.yaw": "Yaw", + "module.elytra-fly.general.yaw.description": "The yaw angle to look at when using simple rotation lock in bounce mode.", + "module.elytra-fly.general.pitch-lock": "Pitch Lock", + "module.elytra-fly.general.pitch-lock.description": "Whether to lock your pitch angle.", + "module.elytra-fly.general.pitch": "Pitch", + "module.elytra-fly.general.pitch.description": "The pitch angle to look at when using the bounce mode.", + "module.elytra-fly.general.restart": "Restart", + "module.elytra-fly.general.restart.description": "Restarts flying with the elytra when rubberbanding.", + "module.elytra-fly.general.restart-delay": "Restart Delay", + "module.elytra-fly.general.restart-delay.description": "How many ticks to wait before restarting the elytra again after rubberbanding.", + "module.elytra-fly.general.sprint-constantly": "Sprint Constantly", + "module.elytra-fly.general.sprint-constantly.description": "Sprints all the time. If turned off, it will only sprint when the player is touching the ground.", + "module.elytra-fly.general.manual-takeoff": "Manual Takeoff", + "module.elytra-fly.general.manual-takeoff.description": "Does not automatically take off.", + "module.elytra-fly.inventory.elytra-replace": "Elytra Replace", + "module.elytra-fly.inventory.elytra-replace.description": "Replaces broken elytra with a new elytra.", + "module.elytra-fly.inventory.replace-durability": "Replace Durability", + "module.elytra-fly.inventory.replace-durability.description": "The durability threshold your elytra will be replaced at.", + "module.elytra-fly.inventory.chest-swap": "Chest Swap", + "module.elytra-fly.inventory.chest-swap.description": "Enables ChestSwap when toggling this module.", + "module.elytra-fly.inventory.replenish-fireworks": "Replenish Fireworks", + "module.elytra-fly.inventory.replenish-fireworks.description": "Moves fireworks into a selected hotbar slot.", + "module.elytra-fly.inventory.replenish-slot": "Replenish Slot", + "module.elytra-fly.inventory.replenish-slot.description": "The slot auto move moves fireworks to.", + "module.elytra-fly.autopilot.auto-pilot": "Auto Pilot", + "module.elytra-fly.autopilot.auto-pilot.description": "Moves forward while elytra flying.", + "module.elytra-fly.autopilot.use-fireworks": "Use Fireworks", + "module.elytra-fly.autopilot.use-fireworks.description": "Uses firework rockets every second of your choice.", + "module.elytra-fly.autopilot.firework-delay": "Firework Delay", + "module.elytra-fly.autopilot.firework-delay.description": "The delay in seconds in between using fireworks if \"Use Fireworks\" is enabled.", + "module.elytra-fly.autopilot.minimum-height": "Minimum Height", + "module.elytra-fly.autopilot.minimum-height.description": "The minimum height for autopilot.", + + "module.auto-respawn": "Auto Respawn", + "module.auto-respawn.description": "Automatically respawns after death.", + + "module.entity-control": "Entity Control", + "module.entity-control.description": "Lets you control rideable entities without a saddle.", + "module.entity-control.control.entities": "Entities", + "module.entity-control.control.entities.description": "Target entities.", + "module.entity-control.control.spoof-saddle*": "Spoof Saddle*", + "module.entity-control.control.spoof-saddle*.description": "Lets you control rideable entities without them being saddled. Only works on older server versions.", + "module.entity-control.control.max-jump": "Max Jump", + "module.entity-control.control.max-jump.description": "Sets jump power to maximum.", + "module.entity-control.control.lock-yaw": "Lock Yaw", + "module.entity-control.control.lock-yaw.description": "Locks the Entity's yaw.", + "module.entity-control.control.cancel-server-packets": "Cancel Server Packets", + "module.entity-control.control.cancel-server-packets.description": "Cancels incoming vehicle move packets. WILL desync you from the server if you make an invalid movement.", + "module.entity-control.speed.speed": "Speed", + "module.entity-control.speed.speed.description": "Makes you go faster horizontally when riding entities.", + "module.entity-control.speed.horizontal-speed": "Horizontal Speed", + "module.entity-control.speed.horizontal-speed.description": "Horizontal speed in blocks per second.", + "module.entity-control.speed.only-on-ground": "Only On Ground", + "module.entity-control.speed.only-on-ground.description": "Use speed only when standing on a block.", + "module.entity-control.speed.in-water": "In Water", + "module.entity-control.speed.in-water.description": "Use speed when in water.", + "module.entity-control.flight.fly": "Fly", + "module.entity-control.flight.fly.description": "Allows you to fly with entities.", + "module.entity-control.flight.vertical-speed": "Vertical Speed", + "module.entity-control.flight.vertical-speed.description": "Vertical speed in blocks per second.", + "module.entity-control.flight.fall-speed": "Fall Speed", + "module.entity-control.flight.fall-speed.description": "How fast you will fall in blocks per second. Set to a small value to prevent fly kicks.", + "module.entity-control.flight.anti-fly-kick": "Anti Fly Kick", + "module.entity-control.flight.anti-fly-kick.description": "Whether to prevent the server from kicking you for flying.", + "module.entity-control.flight.delay": "Delay", + "module.entity-control.flight.delay.description": "The amount of delay, in ticks, between flying down a bit and return to original position", + + "module.stash-finder": "Stash Finder", + "module.stash-finder.description": "Searches loaded chunks for storage blocks. Saves to /meteor-client", + "module.stash-finder.general.storage-blocks": "Storage Blocks", + "module.stash-finder.general.storage-blocks.description": "Select the storage blocks to search for.", + "module.stash-finder.general.minimum-storage-count": "Minimum Storage Count", + "module.stash-finder.general.minimum-storage-count.description": "The minimum amount of storage blocks in a chunk to record the chunk.", + "module.stash-finder.general.blacklisted-support-blocks": "Blacklisted Support Blocks", + "module.stash-finder.general.blacklisted-support-blocks.description": "Blocks that prevent counting a storage block entity when it sits on them.", + "module.stash-finder.general.minimum-distance": "Minimum Distance", + "module.stash-finder.general.minimum-distance.description": "The minimum distance you must be from spawn to record a certain chunk.", + "module.stash-finder.general.notifications": "Notifications", + "module.stash-finder.general.notifications.description": "Sends Minecraft notifications when new stashes are found.", + "module.stash-finder.general.notification-mode": "Notification Mode", + "module.stash-finder.general.notification-mode.description": "The mode to use for notifications.", + "module.stash-finder.render.render-tracer": "Render Tracer", + "module.stash-finder.render.render-tracer.description": "Renders a tracer to the last found stash.", + "module.stash-finder.render.tracer-color": "Tracer Color", + "module.stash-finder.render.tracer-color.description": "Color of the stash tracer.", + "module.stash-finder.render.tracer-hide-at-distance": "Tracer Hide At Distance", + "module.stash-finder.render.tracer-hide-at-distance.description": "Hide the trace when you are this close to the stash.", + "module.stash-finder.render.tracer-max-distance": "Tracer Max Distance", + "module.stash-finder.render.tracer-max-distance.description": "Hide the trace when you are farther than this distance from the stash.", + "module.stash-finder.render.render-chunk-column": "Render Chunk Column", + "module.stash-finder.render.render-chunk-column.description": "Renders a vertical column at the center of traced chunks.", + "module.stash-finder.render.chunk-column-color": "Chunk Column Color", + "module.stash-finder.render.chunk-column-color.description": "Color of the stash tracer column.", + "module.stash-finder.render.clear-traces-bind": "Clear Traces Bind", + "module.stash-finder.render.clear-traces-bind.description": "Keybind to clear all stash traces.", + + "module.better-beacons": "Better Beacons", + "module.better-beacons.description": "Select effects unaffected by beacon level.", + + "module.auto-nametag": "Auto Nametag", + "module.auto-nametag.description": "Automatically uses nametags on entities without a nametag. WILL nametag ALL entities in the specified distance.", + "module.auto-nametag.general.entities": "Entities", + "module.auto-nametag.general.entities.description": "Which entities to nametag.", + "module.auto-nametag.general.range": "Range", + "module.auto-nametag.general.range.description": "The maximum range an entity can be to be nametagged.", + "module.auto-nametag.general.priority": "Priority", + "module.auto-nametag.general.priority.description": "Priority sort", + "module.auto-nametag.general.renametag": "Renametag", + "module.auto-nametag.general.renametag.description": "Allows already nametagged entities to be renamed.", + "module.auto-nametag.general.rotate": "Rotate", + "module.auto-nametag.general.rotate.description": "Automatically faces towards the mob being nametagged.", + + "module.elytra-boost": "Elytra Boost", + "module.elytra-boost.description": "Boosts your elytra as if you used a firework.", + "module.elytra-boost.general.anti-consume": "Anti Consume", + "module.elytra-boost.general.anti-consume.description": "Prevents fireworks from being consumed when using Elytra Boost.", + "module.elytra-boost.general.firework-duration": "Firework Duration", + "module.elytra-boost.general.firework-duration.description": "The duration of the firework.", + "module.elytra-boost.general.play-sound": "Play Sound", + "module.elytra-boost.general.play-sound.description": "Plays the firework sound when a boost is triggered.", + "module.elytra-boost.general.keybind": "Keybind", + "module.elytra-boost.general.keybind.description": "The keybind to boost.", + + "module.blink": "Blink", + "module.blink.description": "Allows you to essentially teleport while suspending motion updates.", + "module.blink.general.render-original": "Render Original", + "module.blink.general.render-original.description": "Renders your player model at the original position.", + "module.blink.general.pulse-delay": "Pulse Delay", + "module.blink.general.pulse-delay.description": "After the duration in ticks has elapsed, send all packets and start blinking again. 0 to disable.", + "module.blink.general.cancel-blink": "Cancel Blink", + "module.blink.general.cancel-blink.description": "Cancels sending packets and sends you back to your original position.", + + "module.block-selection": "Block Selection", + "module.block-selection.description": "Modifies how your block selection is rendered.", + "module.block-selection.general.advanced": "Advanced", + "module.block-selection.general.advanced.description": "Shows a more advanced outline on different types of shape blocks.", + "module.block-selection.general.single-side": "Single Side", + "module.block-selection.general.single-side.description": "Only renders the side you are looking at.", + "module.block-selection.general.shape-mode": "Shape Mode", + "module.block-selection.general.shape-mode.description": "How the shapes are rendered.", + "module.block-selection.general.side-color": "Side Color", + "module.block-selection.general.side-color.description": "The side color.", + "module.block-selection.general.line-color": "Line Color", + "module.block-selection.general.line-color.description": "The line color.", + "module.block-selection.general.hide-when-inside-block": "Hide When Inside Block", + "module.block-selection.general.hide-when-inside-block.description": "Hide selection when inside target block.", + + "module.auto-city": "Auto City", + "module.auto-city.description": "Automatically mine blocks next to someone's feet.", + "module.auto-city.general.target-range": "Target Range", + "module.auto-city.general.target-range.description": "The radius in which players get targeted.", + "module.auto-city.general.break-range": "Break Range", + "module.auto-city.general.break-range.description": "How close a block must be to you to be considered.", + "module.auto-city.general.switch-mode": "Switch Mode", + "module.auto-city.general.switch-mode.description": "How to switch to a pickaxe.", + "module.auto-city.general.support": "Support", + "module.auto-city.general.support.description": "If there is no block below a city block it will place one before mining.", + "module.auto-city.general.place-range": "Place Range", + "module.auto-city.general.place-range.description": "How far away to try and place a block.", + "module.auto-city.general.rotate": "Rotate", + "module.auto-city.general.rotate.description": "Automatically rotates you towards the city block.", + "module.auto-city.general.chat-info": "Chat Info", + "module.auto-city.general.chat-info.description": "Whether the module should send messages in chat.", + "module.auto-city.render.swing-hand": "Swing Hand", + "module.auto-city.render.swing-hand.description": "Whether to render your hand swinging.", + "module.auto-city.render.render-block": "Render Block", + "module.auto-city.render.render-block.description": "Whether to render the block being broken.", + "module.auto-city.render.shape-mode": "Shape Mode", + "module.auto-city.render.shape-mode.description": "How the shapes are rendered.", + "module.auto-city.render.side-color": "Side Color", + "module.auto-city.render.side-color.description": "The side color of the rendering.", + "module.auto-city.render.line-color": "Line Color", + "module.auto-city.render.line-color.description": "The line color of the rendering.", + + "module.waypoints": "Waypoints", + "module.waypoints.description": "Allows you to create waypoints.", + "module.waypoints.general.text-render-distance": "Text Render Distance", + "module.waypoints.general.text-render-distance.description": "Maximum distance from the center of the screen at which text will be rendered.", + "module.waypoints.general.waypoint-fade-distance": "Waypoint Fade Distance", + "module.waypoints.general.waypoint-fade-distance.description": "The distance to a waypoint at which it begins to start fading.", + "module.waypoints.death-position.max-death-positions": "Max Death Positions", + "module.waypoints.death-position.max-death-positions.description": "The amount of death positions to save, 0 to disable", + "module.waypoints.death-position.chat": "Chat", + "module.waypoints.death-position.chat.description": "Send a chat message with your position once you die", + + "module.auto-web": "Auto Web", + "module.auto-web.description": "Automatically places webs on other players.", + "module.auto-web.general.place-range": "Place Range", + "module.auto-web.general.place-range.description": "The range at which webs can be placed.", + "module.auto-web.general.walls-range": "Walls Range", + "module.auto-web.general.walls-range.description": "Range in which to place webs when behind blocks.", + "module.auto-web.general.target-priority": "Target Priority", + "module.auto-web.general.target-priority.description": "How to filter targets within range.", + "module.auto-web.general.target-range": "Target Range", + "module.auto-web.general.target-range.description": "The maximum distance to target players.", + "module.auto-web.general.predict-movement": "Predict Movement", + "module.auto-web.general.predict-movement.description": "Predict target movement to account for ping.", + "module.auto-web.general.ticks-to-predict": "Ticks To Predict", + "module.auto-web.general.ticks-to-predict.description": "How many ticks ahead we should predict for.", + "module.auto-web.general.doubles": "Doubles", + "module.auto-web.general.doubles.description": "Places webs in the target's upper hitbox as well as the lower hitbox.", + "module.auto-web.general.rotate": "Rotate", + "module.auto-web.general.rotate.description": "Rotates towards the webs when placing.", + "module.auto-web.render.render": "Render", + "module.auto-web.render.render.description": "Renders an overlay where webs are placed.", + "module.auto-web.render.shape-mode": "Shape Mode", + "module.auto-web.render.shape-mode.description": "How the shapes are rendered.", + "module.auto-web.render.side-color": "Side Color", + "module.auto-web.render.side-color.description": "The side color of the placed web rendering.", + "module.auto-web.render.line-color": "Line Color", + "module.auto-web.render.line-color.description": "The line color of the placed web rendering.", + + "module.auto-eat": "Auto Eat", + "module.auto-eat.description": "Automatically eats food.", + "module.auto-eat.general.blacklist": "Blacklist", + "module.auto-eat.general.blacklist.description": "Which items to not eat.", + "module.auto-eat.general.pause-auras": "Pause Auras", + "module.auto-eat.general.pause-auras.description": "Pauses all auras when eating.", + "module.auto-eat.general.pause-baritone": "Pause Baritone", + "module.auto-eat.general.pause-baritone.description": "Pause baritone when eating.", + "module.auto-eat.threshold.threshold-mode": "Threshold Mode", + "module.auto-eat.threshold.threshold-mode.description": "The threshold mode to trigger auto eat.", + "module.auto-eat.threshold.health-threshold": "Health Threshold", + "module.auto-eat.threshold.health-threshold.description": "The level of health you eat at.", + "module.auto-eat.threshold.hunger-threshold": "Hunger Threshold", + "module.auto-eat.threshold.hunger-threshold.description": "The level of hunger you eat at.", + + "module.hitboxes": "Hitboxes", + "module.hitboxes.description": "Expands an entity's hitboxes.", + "module.hitboxes.general.entities": "Entities", + "module.hitboxes.general.entities.description": "Which entities to target.", + "module.hitboxes.general.expand": "Expand", + "module.hitboxes.general.expand.description": "How much to expand the hitbox of the entity.", + "module.hitboxes.general.ignore-friends": "Ignore Friends", + "module.hitboxes.general.ignore-friends.description": "Doesn't expand the hitboxes of friends.", + "module.hitboxes.weapon-options.only-on-weapon": "Only On Weapon", + "module.hitboxes.weapon-options.only-on-weapon.description": "Only modifies hitbox when holding a weapon in hand.", + "module.hitboxes.weapon-options.sword": "Sword", + "module.hitboxes.weapon-options.sword.description": "Enable when holding a sword.", + "module.hitboxes.weapon-options.axe": "Axe", + "module.hitboxes.weapon-options.axe.description": "Enable when holding an axe.", + "module.hitboxes.weapon-options.pickaxe": "Pickaxe", + "module.hitboxes.weapon-options.pickaxe.description": "Enable when holding a pickaxe.", + "module.hitboxes.weapon-options.shovel": "Shovel", + "module.hitboxes.weapon-options.shovel.description": "Enable when holding a shovel.", + "module.hitboxes.weapon-options.hoe": "Hoe", + "module.hitboxes.weapon-options.hoe.description": "Enable when holding a hoe.", + "module.hitboxes.weapon-options.mace": "Mace", + "module.hitboxes.weapon-options.mace.description": "Enable when holding a mace.", + "module.hitboxes.weapon-options.spear": "Spear", + "module.hitboxes.weapon-options.spear.description": "Enable when holding a spear.", + "module.hitboxes.weapon-options.trident": "Trident", + "module.hitboxes.weapon-options.trident.description": "Enable when holding a trident.", + + "module.trail": "Trail", + "module.trail.description": "Renders a customizable trail behind your player.", + "module.trail.general.particles": "Particles", + "module.trail.general.particles.description": "Particles to draw.", + "module.trail.general.pause-when-stationary": "Pause When Stationary", + "module.trail.general.pause-when-stationary.description": "Whether or not to add particles when you are not moving.", + + "module.self-web": "Self Web", + "module.self-web.description": "Automatically places webs on you.", + "module.self-web.general.mode": "Mode", + "module.self-web.general.mode.description": "The mode to use for selfweb.", + "module.self-web.general.range": "Range", + "module.self-web.general.range.description": "How far away the player has to be from you to place webs. Requires Mode to Smart.", + "module.self-web.general.double-place": "Double Place", + "module.self-web.general.double-place.description": "Places webs in your upper hitbox as well.", + "module.self-web.general.auto-toggle": "Auto Toggle", + "module.self-web.general.auto-toggle.description": "Toggles off after placing the webs.", + "module.self-web.general.rotate": "Rotate", + "module.self-web.general.rotate.description": "Forces you to rotate downwards when placing webs.", + + "module.flight": "Flight", + "module.flight.description": "FLYYYY! No Fall is recommended with this module.", + "module.flight.general.mode": "Mode", + "module.flight.general.mode.description": "The mode for Flight.", + "module.flight.general.speed": "Speed", + "module.flight.general.speed.description": "Your speed when flying.", + "module.flight.general.vertical-speed-match": "Vertical Speed Match", + "module.flight.general.vertical-speed-match.description": "Matches your vertical speed to your horizontal speed, otherwise uses vanilla ratio.", + "module.flight.general.no-sneak": "No Sneak", + "module.flight.general.no-sneak.description": "Prevents you from sneaking while flying.", + "module.flight.anti-kick.mode": "Mode", + "module.flight.anti-kick.mode.description": "The mode for anti kick.", + "module.flight.anti-kick.delay": "Delay", + "module.flight.anti-kick.delay.description": "The amount of delay, in ticks, between flying down a bit and return to original position", + "module.flight.anti-kick.off-time": "Off Time", + "module.flight.anti-kick.off-time.description": "The amount of delay, in ticks, to fly down a bit to reset floating ticks.", + + "module.reverse-step": "Reverse Step", + "module.reverse-step.description": "Allows you to fall down blocks at a greater speed.", + "module.reverse-step.general.fall-speed": "Fall Speed", + "module.reverse-step.general.fall-speed.description": "How fast to fall in blocks per second.", + "module.reverse-step.general.fall-distance": "Fall Distance", + "module.reverse-step.general.fall-distance.description": "The maximum fall distance this setting will activate at.", + "module.reverse-step.general.vehicles": "Vehicles", + "module.reverse-step.general.vehicles.description": "Whether or not reverse step should affect vehicles.", + + "module.blur": "Blur", + "module.blur.description": "Blurs background when in GUI screens.", + "module.blur.general.strength": "Strength", + "module.blur.general.strength.description": "How strong the blur should be.", + "module.blur.general.fade-time": "Fade Time", + "module.blur.general.fade-time.description": "How long the fade will last in milliseconds.", + "module.blur.screens.meteor": "Meteor", + "module.blur.screens.meteor.description": "Applies blur to Meteor screens.", + "module.blur.screens.inventories": "Inventories", + "module.blur.screens.inventories.description": "Applies blur to inventory screens.", + "module.blur.screens.chat": "Chat", + "module.blur.screens.chat.description": "Applies blur when in chat.", + "module.blur.screens.other": "Other", + "module.blur.screens.other.description": "Applies blur to all other screen types.", + + "module.discord-presence": "Discord Presence", + "module.discord-presence.description": "Displays Meteor as your presence on Discord.", + "module.discord-presence.line-1.line-1-messages": "Line 1 Messages", + "module.discord-presence.line-1.line-1-messages.description": "Messages used for the first line.", + "module.discord-presence.line-1.line-1-update-delay": "Line 1 Update Delay", + "module.discord-presence.line-1.line-1-update-delay.description": "How fast to update the first line in ticks.", + "module.discord-presence.line-1.line-1-select-mode": "Line 1 Select Mode", + "module.discord-presence.line-1.line-1-select-mode.description": "How to select messages for the first line.", + "module.discord-presence.line-2.line-2-messages": "Line 2 Messages", + "module.discord-presence.line-2.line-2-messages.description": "Messages used for the second line.", + "module.discord-presence.line-2.line-2-update-delay": "Line 2 Update Delay", + "module.discord-presence.line-2.line-2-update-delay.description": "How fast to update the second line in ticks.", + "module.discord-presence.line-2.line-2-select-mode": "Line 2 Select Mode", + "module.discord-presence.line-2.line-2-select-mode.description": "How to select messages for the second line.", + + "module.void-esp": "Void Esp", + "module.void-esp.description": "Renders holes in bedrock layers that lead to the void.", + "module.void-esp.general.air-only": "Air Only", + "module.void-esp.general.air-only.description": "Checks bedrock only for air blocks.", + "module.void-esp.general.horizontal-radius": "Horizontal Radius", + "module.void-esp.general.horizontal-radius.description": "Horizontal radius in which to search for holes.", + "module.void-esp.general.hole-height": "Hole Height", + "module.void-esp.general.hole-height.description": "The minimum hole height to be rendered.", + "module.void-esp.general.nether-roof": "Nether Roof", + "module.void-esp.general.nether-roof.description": "Check for holes in nether roof.", + "module.void-esp.render.shape-mode": "Shape Mode", + "module.void-esp.render.shape-mode.description": "How the shapes are rendered.", + "module.void-esp.render.fill-color": "Fill Color", + "module.void-esp.render.fill-color.description": "The color that fills holes in the void.", + "module.void-esp.render.line-color": "Line Color", + "module.void-esp.render.line-color.description": "The color to draw lines of holes to the void.", + + "module.reach": "Reach", + "module.reach.description": "Gives you super long arms.", + "module.reach.general.extra-block-reach": "Extra Block Reach", + "module.reach.general.extra-block-reach.description": "The distance to add to your block reach.", + "module.reach.general.extra-entity-reach": "Extra Entity Reach", + "module.reach.general.extra-entity-reach.description": "The distance to add to your entity reach.", + + "module.speed-mine": "Speed Mine", + "module.speed-mine.description": "Allows you to quickly mine blocks.", + "module.speed-mine.general.mode": "Mode", + + "module.speed-mine.general.blocks": "Blocks", + "module.speed-mine.general.blocks.description": "Selected blocks.", + "module.speed-mine.general.blocks-filter": "Blocks Filter", + "module.speed-mine.general.blocks-filter.description": "How to use the blocks setting.", + "module.speed-mine.general.modifier": "Modifier", + "module.speed-mine.general.modifier.description": "Mining speed modifier. An additional value of 0.2 is equivalent to one haste level (1.2 = haste 1).", + "module.speed-mine.general.haste-amplifier": "Haste Amplifier", + "module.speed-mine.general.haste-amplifier.description": "What value of haste to give you. Above 2 not recommended.", + "module.speed-mine.general.instamine": "Instamine", + "module.speed-mine.general.instamine.description": "Whether or not to instantly mine blocks under certain conditions.", + "module.speed-mine.general.grim-bypass": "Grim Bypass", + "module.speed-mine.general.grim-bypass.description": "Bypasses Grim's fastbreak check, working as of 2.3.58", + + "module.inventory-tweaks": "Inventory Tweaks", + "module.inventory-tweaks.description": "Various inventory related utilities.", + "module.inventory-tweaks.general.mouse-drag-item-move": "Mouse Drag Item Move", + "module.inventory-tweaks.general.mouse-drag-item-move.description": "Moving mouse over items while holding shift will transfer it to the other container.", + "module.inventory-tweaks.general.xcarry": "Xcarry", + "module.inventory-tweaks.general.xcarry.description": "Allows you to store four extra item stacks in your crafting grid.", + "module.inventory-tweaks.general.uncap-bundle-scrolling": "Uncap Bundle Scrolling", + "module.inventory-tweaks.general.uncap-bundle-scrolling.description": "Whether to uncap the bundle scrolling feature to let you select any item.", + "module.inventory-tweaks.sorting.sorting-enabled": "Sorting Enabled", + "module.inventory-tweaks.sorting.sorting-enabled.description": "Automatically sorts stacks in inventory.", + "module.inventory-tweaks.sorting.sorting-key": "Sorting Key", + "module.inventory-tweaks.sorting.sorting-key.description": "Key to trigger the sort.", + "module.inventory-tweaks.sorting.sorting-delay": "Sorting Delay", + "module.inventory-tweaks.sorting.sorting-delay.description": "Delay in ticks between moving items when sorting.", + "module.inventory-tweaks.sorting.disable-in-creative": "Disable In Creative", + "module.inventory-tweaks.sorting.disable-in-creative.description": "Disables the inventory sorter when in creative mode.", + "module.inventory-tweaks.anti-drop.anti-drop-items": "Anti Drop Items", + "module.inventory-tweaks.anti-drop.anti-drop-items.description": "Items to prevent dropping. Doesn't work in creative inventory screen.", + "module.inventory-tweaks.anti-drop.item-frames": "Item Frames", + "module.inventory-tweaks.anti-drop.item-frames.description": "Prevent anti-drop items from being placed in item frames or pots", + "module.inventory-tweaks.anti-drop.override-bind": "Override Bind", + "module.inventory-tweaks.anti-drop.override-bind.description": "Hold this bind to temporarily bypass anti-drop", + "module.inventory-tweaks.auto-drop.auto-drop-items": "Auto Drop Items", + "module.inventory-tweaks.auto-drop.auto-drop-items.description": "Items to drop.", + "module.inventory-tweaks.auto-drop.exclude-equipped": "Exclude Equipped", + "module.inventory-tweaks.auto-drop.exclude-equipped.description": "Whether or not to drop items equipped in armor slots.", + "module.inventory-tweaks.auto-drop.exclude-hotbar": "Exclude Hotbar", + "module.inventory-tweaks.auto-drop.exclude-hotbar.description": "Whether or not to drop items from your hotbar.", + "module.inventory-tweaks.auto-drop.only-full-stacks": "Only Full Stacks", + "module.inventory-tweaks.auto-drop.only-full-stacks.description": "Only drops the items if the stack is full.", + "module.inventory-tweaks.steal-and-dump.steal-screens": "Steal Screens", + "module.inventory-tweaks.steal-and-dump.steal-screens.description": "Select the screens to display buttons and auto steal.", + "module.inventory-tweaks.steal-and-dump.inventory-buttons": "Inventory Buttons", + "module.inventory-tweaks.steal-and-dump.inventory-buttons.description": "Shows steal and dump buttons in container guis.", + "module.inventory-tweaks.steal-and-dump.steal-drop": "Steal Drop", + "module.inventory-tweaks.steal-and-dump.steal-drop.description": "Drop items to the ground instead of stealing them.", + "module.inventory-tweaks.steal-and-dump.drop-backwards": "Drop Backwards", + "module.inventory-tweaks.steal-and-dump.drop-backwards.description": "Drop items behind you.", + "module.inventory-tweaks.steal-and-dump.dump-filter": "Dump Filter", + "module.inventory-tweaks.steal-and-dump.dump-filter.description": "Dump mode.", + "module.inventory-tweaks.steal-and-dump.dump-items": "Dump Items", + "module.inventory-tweaks.steal-and-dump.dump-items.description": "Items to dump.", + "module.inventory-tweaks.steal-and-dump.steal-filter": "Steal Filter", + "module.inventory-tweaks.steal-and-dump.steal-filter.description": "Steal mode.", + "module.inventory-tweaks.steal-and-dump.steal-items": "Steal Items", + "module.inventory-tweaks.steal-and-dump.steal-items.description": "Items to steal.", + "module.inventory-tweaks.auto-steal.auto-steal": "Auto Steal", + "module.inventory-tweaks.auto-steal.auto-steal.description": "Automatically removes all possible items when you open a container.", + "module.inventory-tweaks.auto-steal.auto-dump": "Auto Dump", + "module.inventory-tweaks.auto-steal.auto-dump.description": "Automatically dumps all possible items when you open a container.", + "module.inventory-tweaks.auto-steal.delay": "Delay", + "module.inventory-tweaks.auto-steal.delay.description": "The minimum delay between stealing the next stack in milliseconds.", + "module.inventory-tweaks.auto-steal.initial-delay": "Initial Delay", + "module.inventory-tweaks.auto-steal.initial-delay.description": "The initial delay before stealing in milliseconds. 0 to use normal delay instead.", + "module.inventory-tweaks.auto-steal.random": "Random", + "module.inventory-tweaks.auto-steal.random.description": "Randomly adds a delay of up to the specified time in milliseconds.", + + "module.no-fall": "No Fall", + "module.no-fall.description": "Attempts to prevent you from taking fall damage.", + "module.no-fall.general.mode": "Mode", + "module.no-fall.general.mode.description": "The way you are saved from fall damage.", + "module.no-fall.general.placed-item": "Placed Item", + "module.no-fall.general.placed-item.description": "Which block to place.", + "module.no-fall.general.air-place-mode": "Air Place Mode", + "module.no-fall.general.air-place-mode.description": "Whether place mode places before you die or before you take damage.", + "module.no-fall.general.anchor": "Anchor", + "module.no-fall.general.anchor.description": "Centers the player and reduces movement when using bucket or air place mode.", + "module.no-fall.general.anti-bounce": "Anti Bounce", + "module.no-fall.general.anti-bounce.description": "Disables bouncing on slime-block and bed upon landing.", + "module.no-fall.general.pause-on-mace": "Pause On Mace", + "module.no-fall.general.pause-on-mace.description": "Pauses NoFall when using a mace.", + + "module.no-interact": "No Interact", + "module.no-interact.description": "Blocks interactions with certain types of inputs.", + "module.no-interact.blocks.block-mine": "Block Mine", + "module.no-interact.blocks.block-mine.description": "Cancels block mining.", + "module.no-interact.blocks.block-mine-mode": "Block Mine Mode", + "module.no-interact.blocks.block-mine-mode.description": "List mode to use for block mine.", + "module.no-interact.blocks.block-interact": "Block Interact", + "module.no-interact.blocks.block-interact.description": "Cancels block interaction.", + "module.no-interact.blocks.block-interact-mode": "Block Interact Mode", + "module.no-interact.blocks.block-interact-mode.description": "List mode to use for block interact.", + "module.no-interact.blocks.block-interact-hand": "Block Interact Hand", + "module.no-interact.blocks.block-interact-hand.description": "Cancels block interaction if performed by this hand.", + "module.no-interact.entities.entity-hit": "Entity Hit", + "module.no-interact.entities.entity-hit.description": "Cancel entity hitting.", + "module.no-interact.entities.entity-hit-mode": "Entity Hit Mode", + "module.no-interact.entities.entity-hit-mode.description": "List mode to use for entity hit.", + "module.no-interact.entities.entity-interact": "Entity Interact", + "module.no-interact.entities.entity-interact.description": "Cancel entity interaction.", + "module.no-interact.entities.entity-interact-mode": "Entity Interact Mode", + "module.no-interact.entities.entity-interact-mode.description": "List mode to use for entity interact.", + "module.no-interact.entities.entity-interact-hand": "Entity Interact Hand", + "module.no-interact.entities.entity-interact-hand.description": "Cancels entity interaction if performed by this hand.", + "module.no-interact.entities.friends": "Friends", + "module.no-interact.entities.friends.description": "Friends cancel mode.", + "module.no-interact.entities.babies": "Babies", + "module.no-interact.entities.babies.description": "Baby entity cancel mode.", + "module.no-interact.entities.nametagged": "Nametagged", + "module.no-interact.entities.nametagged.description": "Nametagged entity cancel mode.", + + "module.portals": "Portals", + "module.portals.description": "Allows you to use GUIs normally while in a Nether Portal.", + + "module.marker": "Marker", + "module.marker.description": "Renders shapes. Useful for large scale projects", + + "module.criticals": "Criticals", + "module.criticals.description": "Performs critical attacks when you hit your target.", + "module.criticals.general.mode": "Mode", + "module.criticals.general.mode.description": "The mode on how Criticals will function.", + "module.criticals.general.only-killaura": "Only Killaura", + "module.criticals.general.only-killaura.description": "Only performs crits when using killaura.", + "module.criticals.mace.smash-attack": "Smash Attack", + "module.criticals.mace.smash-attack.description": "Will always perform smash attacks when using a mace.", + "module.criticals.mace.additional-height": "Additional Height", + "module.criticals.mace.additional-height.description": "The amount of additional height to spoof. More height means more damage.", + + "module.tunnel-esp": "Tunnel Esp", + "module.tunnel-esp.description": "Highlights tunnels.", + "module.tunnel-esp.general.height": "Height", + "module.tunnel-esp.general.height.description": "Height of the rendered box.", + "module.tunnel-esp.general.connected": "Connected", + "module.tunnel-esp.general.connected.description": "If neighbouring holes should be connected.", + "module.tunnel-esp.general.shape-mode": "Shape Mode", + "module.tunnel-esp.general.shape-mode.description": "How the shapes are rendered.", + "module.tunnel-esp.general.side-color": "Side Color", + "module.tunnel-esp.general.side-color.description": "The side color.", + "module.tunnel-esp.general.line-color": "Line Color", + "module.tunnel-esp.general.line-color.description": "The line color.", + + "module.auto-smelter": "Auto Smelter", + "module.auto-smelter.description": "Automatically smelts items from your inventory", + "module.auto-smelter.general.fuel-items": "Fuel Items", + "module.auto-smelter.general.fuel-items.description": "Items to use as fuel", + "module.auto-smelter.general.smeltable-items": "Smeltable Items", + "module.auto-smelter.general.smeltable-items.description": "Items to smelt", + "module.auto-smelter.general.disable-when-out-of-items": "Disable When Out Of Items", + "module.auto-smelter.general.disable-when-out-of-items.description": "Disable the module when you run out of items", + + "module.anchor-aura": "Anchor Aura", + "module.anchor-aura.description": "Automatically places and breaks Respawn Anchors to harm entities.", + "module.anchor-aura.general.target-range": "Target Range", + "module.anchor-aura.general.target-range.description": "Range in which to target players.", + "module.anchor-aura.general.target-priority": "Target Priority", + "module.anchor-aura.general.target-priority.description": "How to select the player to target.", + "module.anchor-aura.general.min-damage": "Min Damage", + "module.anchor-aura.general.min-damage.description": "The minimum damage to inflict on your target.", + "module.anchor-aura.general.max-self-damage": "Max Self Damage", + "module.anchor-aura.general.max-self-damage.description": "The maximum damage to inflict on yourself.", + "module.anchor-aura.general.anti-suicide": "Anti Suicide", + "module.anchor-aura.general.anti-suicide.description": "Will not place and break anchors if they will kill you.", + "module.anchor-aura.general.swap-back": "Swap Back", + "module.anchor-aura.general.swap-back.description": "Switches to your previous slot after using anchors.", + "module.anchor-aura.general.rotate": "Rotate", + "module.anchor-aura.general.rotate.description": "Rotates server-side towards the anchors being placed/broken.", + "module.anchor-aura.place.place": "Place", + "module.anchor-aura.place.place.description": "Allows Anchor Aura to place anchors.", + "module.anchor-aura.place.place-delay": "Place Delay", + "module.anchor-aura.place.place-delay.description": "The tick delay between placing anchors.", + "module.anchor-aura.place.place-range": "Place Range", + "module.anchor-aura.place.place-range.description": "The range at which anchors can be placed.", + "module.anchor-aura.place.walls-range": "Walls Range", + "module.anchor-aura.place.walls-range.description": "Range in which to place anchors when behind blocks.", + "module.anchor-aura.place.air-place": "Air Place", + "module.anchor-aura.place.air-place.description": "Allows Anchor Aura to place anchors in the air.", + "module.anchor-aura.break.charge-delay": "Charge Delay", + "module.anchor-aura.break.charge-delay.description": "The tick delay it takes to charge anchors.", + "module.anchor-aura.break.break-delay": "Break Delay", + "module.anchor-aura.break.break-delay.description": "The tick delay it takes to break anchors.", + "module.anchor-aura.break.break-range": "Break Range", + "module.anchor-aura.break.break-range.description": "Range in which to break anchors.", + "module.anchor-aura.break.walls-range": "Walls Range", + "module.anchor-aura.break.walls-range.description": "Range in which to break anchors when behind blocks.", + "module.anchor-aura.pause.pause-on-use": "Pause On Use", + "module.anchor-aura.pause.pause-on-use.description": "Pauses while using an item.", + "module.anchor-aura.pause.pause-on-mine": "Pause On Mine", + "module.anchor-aura.pause.pause-on-mine.description": "Pauses while mining blocks.", + "module.anchor-aura.pause.pause-on-CA": "Pause On CA", + "module.anchor-aura.pause.pause-on-CA.description": "Pauses while Crystal Aura is placing.", + "module.anchor-aura.render.swing": "Swing", + "module.anchor-aura.render.swing.description": "Whether to swing your hand client-side.", + "module.anchor-aura.render.render": "Render", + "module.anchor-aura.render.render.description": "Renders the block where it is placing an anchor.", + "module.anchor-aura.render.shape-mode": "Shape Mode", + "module.anchor-aura.render.shape-mode.description": "How the shapes are rendered.", + "module.anchor-aura.render.side-color": "Side Color", + "module.anchor-aura.render.side-color.description": "The side color for positions to be placed.", + "module.anchor-aura.render.line-color": "Line Color", + "module.anchor-aura.render.line-color.description": "The line color for positions to be placed.", + + "module.anti-void": "Anti Void", + "module.anti-void.description": "Attempts to prevent you from falling into the void.", + "module.anti-void.general.mode": "Mode", + "module.anti-void.general.mode.description": "The method to prevent you from falling into the void.", + + "module.kill-aura": "Kill Aura", + "module.kill-aura.description": "Attacks specified entities around you.", + "module.kill-aura.general.attack-when-holding": "Attack When Holding", + "module.kill-aura.general.attack-when-holding.description": "Only attacks an entity when a specified item is in your hand.", + "module.kill-aura.general.selected-weapon-types": "Selected Weapon Types", + "module.kill-aura.general.selected-weapon-types.description": "Which types of weapons to attack with (if you select the diamond sword, any type of sword may be used to attack).", + "module.kill-aura.general.rotate": "Rotate", + "module.kill-aura.general.rotate.description": "Determines when you should rotate towards the target.", + "module.kill-aura.general.auto-switch": "Auto Switch", + "module.kill-aura.general.auto-switch.description": "Switches to an acceptable weapon when attacking the target.", + "module.kill-aura.general.swap-back": "Swap Back", + "module.kill-aura.general.swap-back.description": "Switches to your previous slot when done attacking the target.", + "module.kill-aura.general.shield-mode": "Shield Mode", + "module.kill-aura.general.shield-mode.description": "Will try and use an axe to break target shields.", + "module.kill-aura.general.only-on-click": "Only On Click", + "module.kill-aura.general.only-on-click.description": "Only attacks when holding left click.", + "module.kill-aura.general.only-on-look": "Only On Look", + "module.kill-aura.general.only-on-look.description": "Only attacks when looking at an entity.", + "module.kill-aura.general.pause-baritone": "Pause Baritone", + "module.kill-aura.general.pause-baritone.description": "Freezes Baritone temporarily until you are finished attacking the entity.", + "module.kill-aura.targeting.entities": "Entities", + "module.kill-aura.targeting.entities.description": "Entities to attack.", + "module.kill-aura.targeting.priority": "Priority", + "module.kill-aura.targeting.priority.description": "How to filter targets within range.", + "module.kill-aura.targeting.max-targets": "Max Targets", + "module.kill-aura.targeting.max-targets.description": "How many entities to target at once.", + "module.kill-aura.targeting.range": "Range", + "module.kill-aura.targeting.range.description": "The maximum range the entity can be to attack it.", + "module.kill-aura.targeting.walls-range": "Walls Range", + "module.kill-aura.targeting.walls-range.description": "The maximum range the entity can be attacked through walls.", + "module.kill-aura.targeting.mob-age-filter": "Mob Age Filter", + "module.kill-aura.targeting.mob-age-filter.description": "Determines the age of the mobs to target (baby, adult, or both).", + "module.kill-aura.targeting.ignore-named": "Ignore Named", + "module.kill-aura.targeting.ignore-named.description": "Whether or not to attack mobs with a name.", + "module.kill-aura.targeting.ignore-passive": "Ignore Passive", + "module.kill-aura.targeting.ignore-passive.description": "Will only attack sometimes passive mobs if they are targeting you.", + "module.kill-aura.targeting.ignore-tamed": "Ignore Tamed", + "module.kill-aura.targeting.ignore-tamed.description": "Will avoid attacking mobs you tamed.", + "module.kill-aura.timing.pause-on-lag": "Pause On Lag", + "module.kill-aura.timing.pause-on-lag.description": "Pauses if the server is lagging.", + "module.kill-aura.timing.pause-on-use": "Pause On Use", + "module.kill-aura.timing.pause-on-use.description": "Does not attack while using an item.", + "module.kill-aura.timing.pause-on-CA": "Pause On CA", + "module.kill-aura.timing.pause-on-CA.description": "Does not attack while CA is placing.", + "module.kill-aura.timing.TPS-sync": "TPS Sync", + "module.kill-aura.timing.TPS-sync.description": "Tries to sync attack delay with the server's TPS.", + "module.kill-aura.timing.custom-delay": "Custom Delay", + "module.kill-aura.timing.custom-delay.description": "Use a custom delay instead of the vanilla cooldown.", + "module.kill-aura.timing.hit-delay": "Hit Delay", + "module.kill-aura.timing.hit-delay.description": "How fast you hit the entity in ticks.", + "module.kill-aura.timing.switch-delay": "Switch Delay", + "module.kill-aura.timing.switch-delay.description": "How many ticks to wait before hitting an entity after switching hotbar slots.", + + "module.parkour": "Parkour", + "module.parkour.description": "Automatically jumps at the edges of blocks.", + "module.parkour.general.edge-distance": "Edge Distance", + "module.parkour.general.edge-distance.description": "How far from the edge should you jump.", + + "module.spam": "Spam", + "module.spam.description": "Spams specified messages in chat.", + "module.spam.general.messages": "Messages", + "module.spam.general.messages.description": "Messages to use for spam.", + "module.spam.general.delay": "Delay", + "module.spam.general.delay.description": "The delay between specified messages in ticks.", + "module.spam.general.disable-on-leave": "Disable On Leave", + "module.spam.general.disable-on-leave.description": "Disables spam when you leave a server.", + "module.spam.general.disable-on-disconnect": "Disable On Disconnect", + "module.spam.general.disable-on-disconnect.description": "Disables spam when you are disconnected from a server.", + "module.spam.general.randomise": "Randomise", + "module.spam.general.randomise.description": "Selects a random message from your spam message list.", + "module.spam.general.auto-split-messages": "Auto Split Messages", + "module.spam.general.auto-split-messages.description": "Automatically split up large messages after a certain length", + "module.spam.general.split-length": "Split Length", + "module.spam.general.split-length.description": "The length after which to split messages in chat", + "module.spam.general.split-delay": "Split Delay", + "module.spam.general.split-delay.description": "The delay between split messages in ticks.", + "module.spam.general.bypass": "Bypass", + "module.spam.general.bypass.description": "Add random text at the end of the message to try to bypass anti spams.", + "module.spam.general.include-uppercase-characters": "Include Uppercase Characters", + "module.spam.general.include-uppercase-characters.description": "Whether the bypass text should include uppercase characters.", + "module.spam.general.length": "Length", + "module.spam.general.length.description": "Number of characters used to bypass anti spam.", + + "module.collisions": "Collisions", + "module.collisions.description": "Adds collision boxes to certain blocks/areas.", + "module.collisions.general.blocks": "Blocks", + "module.collisions.general.blocks.description": "What blocks should be added collision box.", + "module.collisions.general.magma": "Magma", + "module.collisions.general.magma.description": "Prevents you from walking over magma blocks.", + "module.collisions.general.unloaded-chunks": "Unloaded Chunks", + "module.collisions.general.unloaded-chunks.description": "Stops you from going into unloaded chunks.", + "module.collisions.general.ignore-border": "Ignore Border", + "module.collisions.general.ignore-border.description": "Removes world border collision.", + + "module.click-tp": "Click Tp", + "module.click-tp.description": "Teleports you to the block you click on.", + + "module.packet-canceller": "Packet Canceller", + "module.packet-canceller.description": "Allows you to cancel certain packets.", + "module.packet-canceller.general.S2C-packets": "S2C Packets", + "module.packet-canceller.general.S2C-packets.description": "Server-to-client packets to cancel.", + "module.packet-canceller.general.C2S-packets": "C2S Packets", + "module.packet-canceller.general.C2S-packets.description": "Client-to-server packets to cancel.", + + "module.tracers": "Tracers", + "module.tracers.description": "Displays tracer lines to specified entities.", + "module.tracers.general.entities": "Entities", + "module.tracers.general.entities.description": "Select specific entities.", + "module.tracers.general.ignore-self": "Ignore Self", + "module.tracers.general.ignore-self.description": "Doesn't draw tracers to yourself when in third person or freecam.", + "module.tracers.general.ignore-friends": "Ignore Friends", + "module.tracers.general.ignore-friends.description": "Doesn't draw tracers to friends.", + "module.tracers.general.show-invisible": "Show Invisible", + "module.tracers.general.show-invisible.description": "Shows invisible entities.", + "module.tracers.appearance.style": "Style", + "module.tracers.appearance.style.description": "What display mode should be used", + "module.tracers.appearance.target": "Target", + "module.tracers.appearance.target.description": "What part of the entity to target.", + "module.tracers.appearance.stem": "Stem", + "module.tracers.appearance.stem.description": "Draw a line through the center of the tracer target.", + "module.tracers.appearance.max-distance": "Max Distance", + "module.tracers.appearance.max-distance.description": "Maximum distance for tracers to show.", + "module.tracers.appearance.distance-offscreen": "Distance Offscreen", + "module.tracers.appearance.distance-offscreen.description": "Offscreen's distance from center.", + "module.tracers.appearance.size-offscreen": "Size Offscreen", + "module.tracers.appearance.size-offscreen.description": "Offscreen's size.", + "module.tracers.appearance.blink-offscreen": "Blink Offscreen", + "module.tracers.appearance.blink-offscreen.description": "Make offscreen Blink.", + "module.tracers.appearance.blink-offscreen-speed": "Blink Offscreen Speed", + "module.tracers.appearance.blink-offscreen-speed.description": "Offscreen's blink speed.", + "module.tracers.colors.distance-colors": "Distance Colors", + "module.tracers.colors.distance-colors.description": "Changes the color of tracers depending on distance.", + "module.tracers.colors.show-friend-colors": "Show Friend Colors", + "module.tracers.colors.show-friend-colors.description": "Whether or not to override the distance color of friends with the friend color.", + "module.tracers.colors.players-colors": "Players Colors", + "module.tracers.colors.players-colors.description": "The player's color.", + "module.tracers.colors.animals-color": "Animals Color", + "module.tracers.colors.animals-color.description": "The animal's color.", + "module.tracers.colors.water-animals-color": "Water Animals Color", + "module.tracers.colors.water-animals-color.description": "The water animal's color.", + "module.tracers.colors.monsters-color": "Monsters Color", + "module.tracers.colors.monsters-color.description": "The monster's color.", + "module.tracers.colors.ambient-color": "Ambient Color", + "module.tracers.colors.ambient-color.description": "The ambient color.", + "module.tracers.colors.misc-color": "Misc Color", + "module.tracers.colors.misc-color.description": "The misc color.", + + "module.auto-exp": "Auto Exp", + "module.auto-exp.description": "Automatically repairs your armor and tools in pvp.", + "module.auto-exp.general.mode": "Mode", + "module.auto-exp.general.mode.description": "Which items to repair.", + "module.auto-exp.general.replenish": "Replenish", + "module.auto-exp.general.replenish.description": "Automatically replenishes exp into a selected hotbar slot.", + "module.auto-exp.general.only-on-ground": "Only On Ground", + "module.auto-exp.general.only-on-ground.description": "Only throw when the player is on the ground.", + "module.auto-exp.general.exp-slot": "Exp Slot", + "module.auto-exp.general.exp-slot.description": "The slot to replenish exp into.", + "module.auto-exp.general.min-threshold": "Min Threshold", + "module.auto-exp.general.min-threshold.description": "The minimum durability percentage that an item needs to fall to, to be repaired.", + "module.auto-exp.general.max-threshold": "Max Threshold", + "module.auto-exp.general.max-threshold.description": "The maximum durability percentage to repair items to.", + + "module.jesus": "Jesus", + "module.jesus.description": "Walk on liquids and powder snow like Jesus.", + "module.jesus.general.powder-snow": "Powder Snow", + "module.jesus.general.powder-snow.description": "Walk on powder snow.", + "module.jesus.water.mode": "Mode", + "module.jesus.water.mode.description": "How to treat the water.", + "module.jesus.water.dip-if-burning": "Dip If Burning", + "module.jesus.water.dip-if-burning.description": "Lets you go into the water when you are burning.", + "module.jesus.water.dip-on-sneak": "Dip On Sneak", + "module.jesus.water.dip-on-sneak.description": "Lets you go into the water when your sneak key is held.", + "module.jesus.water.dip-on-fall": "Dip On Fall", + "module.jesus.water.dip-on-fall.description": "Lets you go into the water when you fall over a certain height.", + "module.jesus.water.dip-fall-height": "Dip Fall Height", + "module.jesus.water.dip-fall-height.description": "The fall height at which you will go into the water.", + "module.jesus.lava.mode": "Mode", + "module.jesus.lava.mode.description": "How to treat the lava.", + "module.jesus.lava.dip-if-resistant": "Dip If Resistant", + "module.jesus.lava.dip-if-resistant.description": "Lets you go into the lava if you have Fire Resistance effect.", + "module.jesus.lava.dip-on-sneak": "Dip On Sneak", + "module.jesus.lava.dip-on-sneak.description": "Lets you go into the lava when your sneak key is held.", + "module.jesus.lava.dip-on-fall": "Dip On Fall", + "module.jesus.lava.dip-on-fall.description": "Lets you go into the lava when you fall over a certain height.", + "module.jesus.lava.dip-fall-height": "Dip Fall Height", + "module.jesus.lava.dip-fall-height.description": "The fall height at which you will go into the lava.", + + "module.no-mining-trace": "No Mining Trace", + "module.no-mining-trace.description": "Allows you to mine blocks through entities.", + "module.no-mining-trace.general.blacklisted-entities": "Blacklisted Entities", + "module.no-mining-trace.general.blacklisted-entities.description": "Entities you will interact with as normal.", + "module.no-mining-trace.general.only-when-holding-a-pickaxe": "Only When Holding A Pickaxe", + "module.no-mining-trace.general.only-when-holding-a-pickaxe.description": "Whether or not to work only when holding a pickaxe.", + + "module.bow-aimbot": "Bow Aimbot", + "module.bow-aimbot.description": "Automatically aims your bow for you.", + "module.bow-aimbot.general.range": "Range", + "module.bow-aimbot.general.range.description": "The maximum range the entity can be to aim at it.", + "module.bow-aimbot.general.entities": "Entities", + "module.bow-aimbot.general.entities.description": "Entities to attack.", + "module.bow-aimbot.general.priority": "Priority", + "module.bow-aimbot.general.priority.description": "What type of entities to target.", + "module.bow-aimbot.general.babies": "Babies", + "module.bow-aimbot.general.babies.description": "Whether or not to attack baby variants of the entity.", + "module.bow-aimbot.general.nametagged": "Nametagged", + "module.bow-aimbot.general.nametagged.description": "Whether or not to attack mobs with a name tag.", + "module.bow-aimbot.general.pause-on-combat": "Pause On Combat", + "module.bow-aimbot.general.pause-on-combat.description": "Freezes Baritone temporarily until you released the bow." } diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index 3119a16048..718c010de5 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -1,4 +1,6 @@ { + "meteor.lang.translators" : "MeteorDevelopment", + "meteor.key.category": "Meteor Client", "meteor.key.open-commands": "Open Commands", "meteor.key.open-gui": "Open GUI", From e028a5b7708168839319f6bafcb547ebf816a20e Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Wed, 7 Jan 2026 23:56:59 +0000 Subject: [PATCH 46/72] add the remaining missing strings to the language file TODO BaritoneSettings --- .../meteorclient/gui/GuiTheme.java | 3 +- .../gui/themes/meteor/MeteorGuiTheme.java | 87 ++- .../pathing/BaritoneSettings.java | 21 +- .../meteorclient/systems/config/Config.java | 25 +- .../meteorclient/systems/hud/Hud.java | 10 +- .../hud/elements/ActiveModulesHud.java | 23 +- .../systems/hud/elements/ArmorHud.java | 16 +- .../systems/hud/elements/CombatHud.java | 30 +- .../systems/hud/elements/CompassHud.java | 15 +- .../systems/hud/elements/HoleHud.java | 9 +- .../systems/hud/elements/InventoryHud.java | 9 +- .../systems/hud/elements/ItemHud.java | 10 +- .../systems/hud/elements/LagNotifierHud.java | 13 +- .../systems/hud/elements/MapHud.java | 8 +- .../systems/hud/elements/ModuleInfosHud.java | 7 - .../systems/hud/elements/PlayerModelHud.java | 13 +- .../systems/hud/elements/PlayerRadarHud.java | 16 +- .../systems/hud/elements/PotionTimersHud.java | 19 +- .../systems/hud/elements/TextHud.java | 16 +- .../systems/hud/screens/HudElementScreen.java | 5 +- .../meteorclient/systems/macros/Macro.java | 3 - .../render/blockesp/ESPBlockDataScreen.java | 7 +- .../modules/render/marker/BaseMarker.java | 10 +- .../modules/render/marker/CuboidMarker.java | 8 +- .../systems/modules/render/marker/Marker.java | 2 +- .../modules/render/marker/Sphere2dMarker.java | 18 +- .../systems/profiles/Profile.java | 8 +- .../meteorclient/systems/proxies/Proxies.java | 11 +- .../meteorclient/systems/proxies/Proxy.java | 9 +- .../systems/waypoints/Waypoint.java | 15 +- .../assets/meteor-client/language/en_gb.json | 584 ++++++++++++++++- .../assets/meteor-client/language/en_us.json | 590 +++++++++++++++++- 32 files changed, 1284 insertions(+), 336 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java b/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java index 2fa795c3c6..6481d0e6ee 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java @@ -34,6 +34,7 @@ import net.minecraft.util.math.BlockPos; import java.util.HashMap; +import java.util.Locale; import java.util.Map; public abstract class GuiTheme implements ISerializable { @@ -50,7 +51,7 @@ public abstract class GuiTheme implements ISerializable { public GuiTheme(String name) { this.name = name; - this.settings = new Settings("theme." + name); + this.settings = new Settings("theme." + name.toLowerCase(Locale.ROOT)); } public void beforeRender() { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java index a2b5ffe06b..86b1819ed9 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java @@ -36,20 +36,19 @@ public class MeteorGuiTheme extends GuiTheme { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgColors = settings.createGroup("Colors"); - private final SettingGroup sgTextColors = settings.createGroup("Text"); - private final SettingGroup sgBackgroundColors = settings.createGroup("Background"); - private final SettingGroup sgOutline = settings.createGroup("Outline"); - private final SettingGroup sgSeparator = settings.createGroup("Separator"); - private final SettingGroup sgScrollbar = settings.createGroup("Scrollbar"); - private final SettingGroup sgSlider = settings.createGroup("Slider"); - private final SettingGroup sgStarscript = settings.createGroup("Starscript"); + private final SettingGroup sgColors = settings.createGroup("colors"); + private final SettingGroup sgTextColors = settings.createGroup("text"); + private final SettingGroup sgBackgroundColors = settings.createGroup("background"); + private final SettingGroup sgOutline = settings.createGroup("outline"); + private final SettingGroup sgSeparator = settings.createGroup("separator"); + private final SettingGroup sgScrollbar = settings.createGroup("scrollbar"); + private final SettingGroup sgSlider = settings.createGroup("slider"); + private final SettingGroup sgStarscript = settings.createGroup("starscript"); // General public final Setting scale = sgGeneral.add(new DoubleSetting.Builder() .name("scale") - .description("Scale of the GUI.") .defaultValue(1) .min(0.75) .sliderRange(0.75, 4) @@ -62,21 +61,18 @@ public class MeteorGuiTheme extends GuiTheme { public final Setting moduleAlignment = sgGeneral.add(new EnumSetting.Builder() .name("module-alignment") - .description("How module titles are aligned.") .defaultValue(AlignmentX.Center) .build() ); public final Setting categoryIcons = sgGeneral.add(new BoolSetting.Builder() .name("category-icons") - .description("Adds item icons to module categories.") .defaultValue(false) .build() ); public final Setting hideHUD = sgGeneral.add(new BoolSetting.Builder() .name("hide-HUD") - .description("Hide HUD when in GUI.") .defaultValue(false) .onChanged(v -> { if (mc.currentScreen instanceof WidgetScreen) mc.options.hudHidden = v; @@ -86,20 +82,20 @@ public class MeteorGuiTheme extends GuiTheme { // Colors - public final Setting accentColor = color("accent", "Main color of the GUI.", new SettingColor(145, 61, 226)); - public final Setting checkboxColor = color("checkbox", "Color of checkbox.", new SettingColor(145, 61, 226)); - public final Setting plusColor = color("plus", "Color of plus button.", new SettingColor(50, 255, 50)); - public final Setting minusColor = color("minus", "Color of minus button.", new SettingColor(255, 50, 50)); - public final Setting favoriteColor = color("favorite", "Color of checked favorite button.", new SettingColor(250, 215, 0)); + public final Setting accentColor = color("accent", new SettingColor(145, 61, 226)); + public final Setting checkboxColor = color("checkbox", new SettingColor(145, 61, 226)); + public final Setting plusColor = color("plus", new SettingColor(50, 255, 50)); + public final Setting minusColor = color("minus", new SettingColor(255, 50, 50)); + public final Setting favoriteColor = color("favorite", new SettingColor(250, 215, 0)); // Text - public final Setting textColor = color(sgTextColors, "text", "Color of text.", new SettingColor(255, 255, 255)); - public final Setting textSecondaryColor = color(sgTextColors, "text-secondary-text", "Color of secondary text.", new SettingColor(150, 150, 150)); - public final Setting textHighlightColor = color(sgTextColors, "text-highlight", "Color of text highlighting.", new SettingColor(45, 125, 245, 100)); - public final Setting titleTextColor = color(sgTextColors, "title-text", "Color of title text.", new SettingColor(255, 255, 255)); - public final Setting loggedInColor = color(sgTextColors, "logged-in-text", "Color of logged in account name.", new SettingColor(45, 225, 45)); - public final Setting placeholderColor = color(sgTextColors, "placeholder", "Color of placeholder text.", new SettingColor(255, 255, 255, 20)); + public final Setting textColor = color(sgTextColors, "text", new SettingColor(255, 255, 255)); + public final Setting textSecondaryColor = color(sgTextColors, "text-secondary-text", new SettingColor(150, 150, 150)); + public final Setting textHighlightColor = color(sgTextColors, "text-highlight", new SettingColor(45, 125, 245, 100)); + public final Setting titleTextColor = color(sgTextColors, "title-text", new SettingColor(255, 255, 255)); + public final Setting loggedInColor = color(sgTextColors, "logged-in-text", new SettingColor(45, 225, 45)); + public final Setting placeholderColor = color(sgTextColors, "placeholder", new SettingColor(255, 255, 255, 20)); // Background @@ -111,7 +107,7 @@ public class MeteorGuiTheme extends GuiTheme { new SettingColor(40, 40, 40, 200) ); - public final Setting moduleBackground = color(sgBackgroundColors, "module-background", "Color of module background when active.", new SettingColor(50, 50, 50)); + public final Setting moduleBackground = color(sgBackgroundColors, "module-background", new SettingColor(50, 50, 50)); // Outline @@ -125,9 +121,9 @@ public class MeteorGuiTheme extends GuiTheme { // Separator - public final Setting separatorText = color(sgSeparator, "separator-text", "Color of separator text", new SettingColor(255, 255, 255)); - public final Setting separatorCenter = color(sgSeparator, "separator-center", "Center color of separators.", new SettingColor(255, 255, 255)); - public final Setting separatorEdges = color(sgSeparator, "separator-edges", "Color of separator edges.", new SettingColor(225, 225, 225, 150)); + public final Setting separatorText = color(sgSeparator, "separator-text", new SettingColor(255, 255, 255)); + public final Setting separatorCenter = color(sgSeparator, "separator-center", new SettingColor(255, 255, 255)); + public final Setting separatorEdges = color(sgSeparator, "separator-edges", new SettingColor(225, 225, 225, 150)); // Scrollbar @@ -149,21 +145,21 @@ public class MeteorGuiTheme extends GuiTheme { new SettingColor(150, 60, 255) ); - public final Setting sliderLeft = color(sgSlider, "slider-left", "Color of slider left part.", new SettingColor(100,35,170)); - public final Setting sliderRight = color(sgSlider, "slider-right", "Color of slider right part.", new SettingColor(50, 50, 50)); + public final Setting sliderLeft = color(sgSlider, "slider-left", new SettingColor(100,35,170)); + public final Setting sliderRight = color(sgSlider, "slider-right", new SettingColor(50, 50, 50)); // Starscript - private final Setting starscriptText = color(sgStarscript, "starscript-text", "Color of text in Starscript code.", new SettingColor(169, 183, 198)); - private final Setting starscriptBraces = color(sgStarscript, "starscript-braces", "Color of braces in Starscript code.", new SettingColor(150, 150, 150)); - private final Setting starscriptParenthesis = color(sgStarscript, "starscript-parenthesis", "Color of parenthesis in Starscript code.", new SettingColor(169, 183, 198)); - private final Setting starscriptDots = color(sgStarscript, "starscript-dots", "Color of dots in starscript code.", new SettingColor(169, 183, 198)); - private final Setting starscriptCommas = color(sgStarscript, "starscript-commas", "Color of commas in starscript code.", new SettingColor(169, 183, 198)); - private final Setting starscriptOperators = color(sgStarscript, "starscript-operators", "Color of operators in Starscript code.", new SettingColor(169, 183, 198)); - private final Setting starscriptStrings = color(sgStarscript, "starscript-strings", "Color of strings in Starscript code.", new SettingColor(106, 135, 89)); - private final Setting starscriptNumbers = color(sgStarscript, "starscript-numbers", "Color of numbers in Starscript code.", new SettingColor(104, 141, 187)); - private final Setting starscriptKeywords = color(sgStarscript, "starscript-keywords", "Color of keywords in Starscript code.", new SettingColor(204, 120, 50)); - private final Setting starscriptAccessedObjects = color(sgStarscript, "starscript-accessed-objects", "Color of accessed objects (before a dot) in Starscript code.", new SettingColor(152, 118, 170)); + private final Setting starscriptText = color(sgStarscript, "starscript-text", new SettingColor(169, 183, 198)); + private final Setting starscriptBraces = color(sgStarscript, "starscript-braces", new SettingColor(150, 150, 150)); + private final Setting starscriptParenthesis = color(sgStarscript, "starscript-parenthesis", new SettingColor(169, 183, 198)); + private final Setting starscriptDots = color(sgStarscript, "starscript-dots", new SettingColor(169, 183, 198)); + private final Setting starscriptCommas = color(sgStarscript, "starscript-commas", new SettingColor(169, 183, 198)); + private final Setting starscriptOperators = color(sgStarscript, "starscript-operators", new SettingColor(169, 183, 198)); + private final Setting starscriptStrings = color(sgStarscript, "starscript-strings", new SettingColor(106, 135, 89)); + private final Setting starscriptNumbers = color(sgStarscript, "starscript-numbers", new SettingColor(104, 141, 187)); + private final Setting starscriptKeywords = color(sgStarscript, "starscript-keywords", new SettingColor(204, 120, 50)); + private final Setting starscriptAccessedObjects = color(sgStarscript, "starscript-accessed-objects", new SettingColor(152, 118, 170)); public MeteorGuiTheme() { super("Meteor"); @@ -171,15 +167,14 @@ public MeteorGuiTheme() { settingsFactory = new DefaultSettingsWidgetFactory(this); } - private Setting color(SettingGroup group, String name, String description, SettingColor color) { + private Setting color(SettingGroup group, String name, SettingColor color) { return group.add(new ColorSetting.Builder() .name(name + "-color") - .description(description) .defaultValue(color) .build()); } - private Setting color(String name, String description, SettingColor color) { - return color(sgColors, name, description, color); + private Setting color(String name, SettingColor color) { + return color(sgColors, name, color); } // Widgets @@ -391,9 +386,9 @@ public class ThreeStateColorSetting { private final Setting normal, hovered, pressed; public ThreeStateColorSetting(SettingGroup group, String name, SettingColor c1, SettingColor c2, SettingColor c3) { - normal = color(group, name, "Color of " + name + ".", c1); - hovered = color(group, "hovered-" + name, "Color of " + name + " when hovered.", c2); - pressed = color(group, "pressed-" + name, "Color of " + name + " when pressed.", c3); + normal = color(group, name, c1); + hovered = color(group, "hovered-" + name, c2); + pressed = color(group, "pressed-" + name, c3); } public SettingColor get() { diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java index 72b44d9f0a..32a74a7dbb 100644 --- a/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java +++ b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java @@ -13,7 +13,10 @@ import net.minecraft.item.Item; import java.awt.*; -import java.lang.reflect.*; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -68,14 +71,14 @@ public void save() { @SuppressWarnings({"rawtypes", "unchecked"}) private void createWrappers() { - SettingGroup sgBool = settings.createGroup("Checkboxes"); - SettingGroup sgDouble = settings.createGroup("Numbers"); - SettingGroup sgInt = settings.createGroup("Whole Numbers"); - SettingGroup sgString = settings.createGroup("Strings"); - SettingGroup sgColor = settings.createGroup("Colors"); - - SettingGroup sgBlockLists = settings.createGroup("Block Lists"); - SettingGroup sgItemLists = settings.createGroup("Item Lists"); + SettingGroup sgBool = settings.createGroup("checkboxes"); + SettingGroup sgDouble = settings.createGroup("numbers"); + SettingGroup sgInt = settings.createGroup("whole-numbers"); + SettingGroup sgString = settings.createGroup("strings"); + SettingGroup sgColor = settings.createGroup("colors"); + + SettingGroup sgBlockLists = settings.createGroup("block-lists"); + SettingGroup sgItemLists = settings.createGroup("item-lists"); try { Class klass = BaritoneAPI.getSettings().getClass(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java b/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java index 863a7f12f9..d010d5507b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java @@ -26,23 +26,21 @@ public class Config extends System { public final Settings settings = new Settings("config"); - private final SettingGroup sgVisual = settings.createGroup("Visual"); - private final SettingGroup sgModules = settings.createGroup("Modules"); - private final SettingGroup sgChat = settings.createGroup("Chat"); - private final SettingGroup sgMisc = settings.createGroup("Misc"); + private final SettingGroup sgVisual = settings.createGroup("visual"); + private final SettingGroup sgModules = settings.createGroup("modules"); + private final SettingGroup sgChat = settings.createGroup("chat"); + private final SettingGroup sgMisc = settings.createGroup("misc"); // Visual public final Setting customFont = sgVisual.add(new BoolSetting.Builder() .name("custom-font") - .description("Use a custom font.") .defaultValue(true) .build() ); public final Setting font = sgVisual.add(new FontFaceSetting.Builder() .name("font") - .description("Custom font to use.") .visible(customFont::get) .onChanged(Fonts::load) .build() @@ -50,7 +48,6 @@ public class Config extends System { public final Setting rainbowSpeed = sgVisual.add(new DoubleSetting.Builder() .name("rainbow-speed") - .description("The global rainbow speed.") .defaultValue(0.5) .range(0, 10) .sliderMax(5) @@ -59,21 +56,18 @@ public class Config extends System { public final Setting titleScreenCredits = sgVisual.add(new BoolSetting.Builder() .name("title-screen-credits") - .description("Show Meteor credits on title screen") .defaultValue(true) .build() ); public final Setting titleScreenSplashes = sgVisual.add(new BoolSetting.Builder() .name("title-screen-splashes") - .description("Show Meteor splash texts on title screen") .defaultValue(true) .build() ); public final Setting customWindowTitle = sgVisual.add(new BoolSetting.Builder() .name("custom-window-title") - .description("Show custom text in the window title.") .defaultValue(false) .onModuleActivated(setting -> mc.updateWindowTitle()) .onChanged(value -> mc.updateWindowTitle()) @@ -82,7 +76,6 @@ public class Config extends System { public final Setting customWindowTitleText = sgVisual.add(new StringSetting.Builder() .name("window-title-text") - .description("The text it displays in the window title.") .visible(customWindowTitle::get) .defaultValue("Minecraft {mc_version} - {meteor.name} {meteor.version}") .onChanged(value -> mc.updateWindowTitle()) @@ -91,14 +84,12 @@ public class Config extends System { public final Setting friendColor = sgVisual.add(new ColorSetting.Builder() .name("friend-color") - .description("The color used to show friends.") .defaultValue(new SettingColor(0, 255, 180)) .build() ); public final Setting syncListSettingWidths = sgVisual.add(new BoolSetting.Builder() .name("sync-list-setting-widths") - .description("Prevents the list setting screens from moving around as you add & remove elements.") .defaultValue(false) .build() ); @@ -107,13 +98,11 @@ public class Config extends System { public final Setting> hiddenModules = sgModules.add(new ModuleListSetting.Builder() .name("hidden-modules") - .description("Prevent these modules from being rendered as options in the clickgui.") .build() ); public final Setting moduleSearchCount = sgModules.add(new IntSetting.Builder() .name("module-search-count") - .description("Amount of modules and settings to be shown in the module search bar.") .defaultValue(8) .min(1).sliderMax(12) .build() @@ -121,7 +110,6 @@ public class Config extends System { public final Setting moduleAliases = sgModules.add(new BoolSetting.Builder() .name("search-module-aliases") - .description("Whether or not module aliases will be used in the module search bar.") .defaultValue(true) .build() ); @@ -130,21 +118,18 @@ public class Config extends System { public final Setting prefix = sgChat.add(new StringSetting.Builder() .name("prefix") - .description("Prefix.") .defaultValue(".") .build() ); public final Setting chatFeedback = sgChat.add(new BoolSetting.Builder() .name("chat-feedback") - .description("Sends chat feedback when meteor performs certain actions.") .defaultValue(true) .build() ); public final Setting deleteChatFeedback = sgChat.add(new BoolSetting.Builder() .name("delete-chat-feedback") - .description("Delete previous matching chat feedback to keep chat clear.") .visible(chatFeedback::get) .defaultValue(true) .build() @@ -154,14 +139,12 @@ public class Config extends System { public final Setting rotationHoldTicks = sgMisc.add(new IntSetting.Builder() .name("rotation-hold") - .description("Hold long to hold server side rotation when not sending any packets.") .defaultValue(4) .build() ); public final Setting useTeamColor = sgMisc.add(new BoolSetting.Builder() .name("use-team-color") - .description("Uses player's team color for rendering things like esp and tracers.") .defaultValue(true) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java index 23f488126a..4bd31ddce9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java @@ -37,14 +37,13 @@ public class Hud extends System implements Iterable { private final List elements = new ArrayList<>(); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgEditor = settings.createGroup("Editor"); - private final SettingGroup sgKeybind = settings.createGroup("Bind"); + private final SettingGroup sgEditor = settings.createGroup("editor"); + private final SettingGroup sgKeybind = settings.createGroup("bind"); // General private final Setting customFont = sgGeneral.add(new BoolSetting.Builder() .name("custom-font") - .description("Text will use custom font.") .defaultValue(true) .onChanged(aBoolean -> { for (HudElement element : elements) element.onFontChanged(); @@ -54,14 +53,12 @@ public class Hud extends System implements Iterable { private final Setting hideInMenus = sgGeneral.add(new BoolSetting.Builder() .name("hide-in-menus") - .description("Hides the meteor hud when in inventory screens or game menus.") .defaultValue(false) .build() ); private final Setting textScale = sgGeneral.add(new DoubleSetting.Builder() .name("text-scale") - .description("Scale of text if not overridden by the element.") .defaultValue(1) .min(0.5) .sliderRange(0.5, 3) @@ -70,7 +67,6 @@ public class Hud extends System implements Iterable { public final Setting> textColors = sgGeneral.add(new ColorListSetting.Builder() .name("text-colors") - .description("Colors used for the Text element.") .defaultValue(List.of(new SettingColor(), new SettingColor(175, 175, 175), new SettingColor(25, 225, 25), new SettingColor(225, 25, 25))) .build() ); @@ -79,7 +75,6 @@ public class Hud extends System implements Iterable { public final Setting border = sgEditor.add(new IntSetting.Builder() .name("border") - .description("Space around the edges of the screen.") .defaultValue(4) .sliderMax(20) .build() @@ -87,7 +82,6 @@ public class Hud extends System implements Iterable { public final Setting snappingRange = sgEditor.add(new IntSetting.Builder() .name("snapping-range") - .description("Snapping range in editor.") .defaultValue(10) .sliderMax(20) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ActiveModulesHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ActiveModulesHud.java index 317267364f..51966605bc 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ActiveModulesHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ActiveModulesHud.java @@ -21,54 +21,47 @@ public class ActiveModulesHud extends HudElement { private static final Color WHITE = new Color(); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgColor = settings.createGroup("Color"); - private final SettingGroup sgScale = settings.createGroup("Scale"); - private final SettingGroup sgBackground = settings.createGroup("Background"); + private final SettingGroup sgColor = settings.createGroup("colors"); + private final SettingGroup sgScale = settings.createGroup("scale"); + private final SettingGroup sgBackground = settings.createGroup("background"); private final Setting sort = sgGeneral.add(new EnumSetting.Builder() .name("sort") - .description("How to sort active modules.") .defaultValue(Sort.Biggest) .build() ); private final Setting> hiddenModules = sgGeneral.add(new ModuleListSetting.Builder() .name("hidden-modules") - .description("Which modules not to show in the list.") .build() ); private final Setting activeInfo = sgGeneral.add(new BoolSetting.Builder() .name("module-info") - .description("Shows info from the module next to the name in the active modules list.") .defaultValue(true) .build() ); private final Setting showKeybind = sgGeneral.add(new BoolSetting.Builder() .name("show-keybind") - .description("Shows the module's keybind next to its name.") .defaultValue(false) .build() ); private final Setting shadow = sgGeneral.add(new BoolSetting.Builder() .name("shadow") - .description("Renders shadow behind text.") .defaultValue(true) .build() ); private final Setting outlines = sgGeneral.add(new BoolSetting.Builder() .name("outlines") - .description("Whether or not to render outlines") .defaultValue(false) .build() ); private final Setting outlineWidth = sgGeneral.add(new IntSetting.Builder() .name("outline-width") - .description("Outline width") .defaultValue(2) .min(1) .sliderMin(1) @@ -78,7 +71,6 @@ public class ActiveModulesHud extends HudElement { private final Setting alignment = sgGeneral.add(new EnumSetting.Builder() .name("alignment") - .description("Horizontal alignment.") .defaultValue(Alignment.Auto) .build() ); @@ -87,14 +79,12 @@ public class ActiveModulesHud extends HudElement { private final Setting colorMode = sgColor.add(new EnumSetting.Builder() .name("color-mode") - .description("What color to use for active modules.") .defaultValue(ColorMode.Rainbow) .build() ); private final Setting flatColor = sgColor.add(new ColorSetting.Builder() .name("flat-color") - .description("Color for flat color mode.") .defaultValue(new SettingColor(225, 25, 25)) .visible(() -> colorMode.get() == ColorMode.Flat) .build() @@ -102,7 +92,6 @@ public class ActiveModulesHud extends HudElement { private final Setting rainbowSpeed = sgColor.add(new DoubleSetting.Builder() .name("rainbow-speed") - .description("Rainbow speed of rainbow color mode.") .defaultValue(0.05) .sliderMin(0.01) .sliderMax(0.2) @@ -113,7 +102,6 @@ public class ActiveModulesHud extends HudElement { private final Setting rainbowSpread = sgColor.add(new DoubleSetting.Builder() .name("rainbow-spread") - .description("Rainbow spread of rainbow color mode.") .defaultValue(0.01) .sliderMin(0.001) .sliderMax(0.05) @@ -140,7 +128,6 @@ public class ActiveModulesHud extends HudElement { private final Setting moduleInfoColor = sgColor.add(new ColorSetting.Builder() .name("module-info-color") - .description("Color of module info text.") .defaultValue(new SettingColor(175, 175, 175)) .visible(activeInfo::get) .build() @@ -150,14 +137,12 @@ public class ActiveModulesHud extends HudElement { private final Setting customScale = sgScale.add(new BoolSetting.Builder() .name("custom-scale") - .description("Applies a custom scale to this hud element.") .defaultValue(false) .build() ); private final Setting scale = sgScale.add(new DoubleSetting.Builder() .name("scale") - .description("Custom scale.") .visible(customScale::get) .defaultValue(1) .min(0.5) @@ -169,14 +154,12 @@ public class ActiveModulesHud extends HudElement { private final Setting background = sgBackground.add(new BoolSetting.Builder() .name("background") - .description("Displays background.") .defaultValue(false) .build() ); private final Setting backgroundColor = sgBackground.add(new ColorSetting.Builder() .name("background-color") - .description("Color used for the background.") .visible(background::get) .defaultValue(new SettingColor(25, 25, 25, 50)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ArmorHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ArmorHud.java index a3bd7f6f01..9af850cb75 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ArmorHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ArmorHud.java @@ -22,15 +22,14 @@ public class ArmorHud extends HudElement { public static final HudElementInfo INFO = new HudElementInfo<>(Hud.GROUP, "armor", "Displays your armor.", ArmorHud::new); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgDurability = settings.createGroup("Durability"); - private final SettingGroup sgScale = settings.createGroup("Scale"); - private final SettingGroup sgBackground = settings.createGroup("Background"); + private final SettingGroup sgDurability = settings.createGroup("durability"); + private final SettingGroup sgScale = settings.createGroup("scale"); + private final SettingGroup sgBackground = settings.createGroup("background"); // General private final Setting orientation = sgGeneral.add(new EnumSetting.Builder() .name("orientation") - .description("How to display armor.") .defaultValue(Orientation.Horizontal) .onChanged(val -> calculateSize()) .build() @@ -38,14 +37,12 @@ public class ArmorHud extends HudElement { private final Setting flipOrder = sgGeneral.add(new BoolSetting.Builder() .name("flip-order") - .description("Flips the order of armor items.") .defaultValue(true) .build() ); private final Setting showEmpty = sgGeneral.add(new BoolSetting.Builder() .name("show-empty") - .description("Renders barrier icons for empty slots.") .defaultValue(false) .build() ); @@ -54,7 +51,6 @@ public class ArmorHud extends HudElement { private final Setting durability = sgDurability.add(new EnumSetting.Builder() .name("durability") - .description("How to display armor durability.") .defaultValue(Durability.Bar) .onChanged(durability1 -> calculateSize()) .build() @@ -62,7 +58,6 @@ public class ArmorHud extends HudElement { private final Setting durabilityColor = sgDurability.add(new ColorSetting.Builder() .name("durability-color") - .description("Color of the text.") .visible(() -> durability.get() == Durability.Total || durability.get() == Durability.Percentage) .defaultValue(new SettingColor()) .build() @@ -70,7 +65,6 @@ public class ArmorHud extends HudElement { private final Setting durabilityShadow = sgDurability.add(new BoolSetting.Builder() .name("durability-shadow") - .description("Text shadow.") .visible(() -> durability.get() == Durability.Total || durability.get() == Durability.Percentage) .defaultValue(true) .build() @@ -80,7 +74,6 @@ public class ArmorHud extends HudElement { private final Setting customScale = sgScale.add(new BoolSetting.Builder() .name("custom-scale") - .description("Applies a custom scale to this hud element.") .defaultValue(false) .onChanged(aBoolean -> calculateSize()) .build() @@ -88,7 +81,6 @@ public class ArmorHud extends HudElement { private final Setting scale = sgScale.add(new DoubleSetting.Builder() .name("scale") - .description("Custom scale.") .visible(customScale::get) .defaultValue(2) .onChanged(aDouble -> calculateSize()) @@ -101,14 +93,12 @@ public class ArmorHud extends HudElement { private final Setting background = sgBackground.add(new BoolSetting.Builder() .name("background") - .description("Displays background.") .defaultValue(false) .build() ); private final Setting backgroundColor = sgBackground.add(new ColorSetting.Builder() .name("background-color") - .description("Color used for the background.") .visible(background::get) .defaultValue(new SettingColor(25, 25, 25, 50)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java index 2e2ffd1a42..a6be7adb89 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java @@ -55,16 +55,15 @@ public class CombatHud extends HudElement { public static final HudElementInfo INFO = new HudElementInfo<>(Hud.GROUP, "combat", "Displays information about your combat target.", CombatHud::new); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgEnchantments = settings.createGroup("Enchantments"); - private final SettingGroup sgHealth = settings.createGroup("Health"); - private final SettingGroup sgDistance = settings.createGroup("Distance"); - private final SettingGroup sgPing = settings.createGroup("Ping"); - private final SettingGroup sgScale = settings.createGroup("Scale"); - private final SettingGroup sgBackground = settings.createGroup("Background"); + private final SettingGroup sgEnchantments = settings.createGroup("enchantments"); + private final SettingGroup sgHealth = settings.createGroup("health"); + private final SettingGroup sgDistance = settings.createGroup("distance"); + private final SettingGroup sgPing = settings.createGroup("ping"); + private final SettingGroup sgScale = settings.createGroup("scale"); + private final SettingGroup sgBackground = settings.createGroup("background"); private final Setting range = sgGeneral.add(new DoubleSetting.Builder() .name("range") - .description("The range to target players.") .defaultValue(100) .min(1) .sliderMax(200) @@ -75,21 +74,18 @@ public class CombatHud extends HudElement { private final Setting healthColor1 = sgHealth.add(new ColorSetting.Builder() .name("health-stage-1") - .description("The color on the left of the health gradient.") .defaultValue(new SettingColor(255, 15, 15)) .build() ); private final Setting healthColor2 = sgHealth.add(new ColorSetting.Builder() .name("health-stage-2") - .description("The color in the middle of the health gradient.") .defaultValue(new SettingColor(255, 150, 15)) .build() ); private final Setting healthColor3 = sgHealth.add(new ColorSetting.Builder() .name("health-stage-3") - .description("The color on the right of the health gradient.") .defaultValue(new SettingColor(15, 255, 15)) .build() ); @@ -98,14 +94,12 @@ public class CombatHud extends HudElement { private final Setting>> displayedEnchantments = sgEnchantments.add(new EnchantmentListSetting.Builder() .name("displayed-enchantments") - .description("The enchantments that are shown on nametags.") .vanillaDefaults() .build() ); private final Setting enchantmentTextColor = sgEnchantments.add(new ColorSetting.Builder() .name("enchantment-color") - .description("Color of enchantment text.") .defaultValue(new SettingColor(255, 255, 255)) .build() ); @@ -114,14 +108,12 @@ public class CombatHud extends HudElement { private final Setting displayPing = sgPing.add(new BoolSetting.Builder() .name("ping") - .description("Shows the player's ping.") .defaultValue(true) .build() ); private final Setting pingColor1 = sgPing.add(new ColorSetting.Builder() .name("ping-stage-1") - .description("Color of ping text when under 75.") .defaultValue(new SettingColor(15, 255, 15)) .visible(displayPing::get) .build() @@ -129,7 +121,6 @@ public class CombatHud extends HudElement { private final Setting pingColor2 = sgPing.add(new ColorSetting.Builder() .name("ping-stage-2") - .description("Color of ping text when between 75 and 200.") .defaultValue(new SettingColor(255, 150, 15)) .visible(displayPing::get) .build() @@ -137,7 +128,6 @@ public class CombatHud extends HudElement { private final Setting pingColor3 = sgPing.add(new ColorSetting.Builder() .name("ping-stage-3") - .description("Color of ping text when over 200.") .defaultValue(new SettingColor(255, 15, 15)) .visible(displayPing::get) .build() @@ -147,14 +137,12 @@ public class CombatHud extends HudElement { private final Setting displayDistance = sgDistance.add(new BoolSetting.Builder() .name("distance") - .description("Shows the distance between you and the player.") .defaultValue(true) .build() ); private final Setting distColor1 = sgDistance.add(new ColorSetting.Builder() .name("distance-stage-1") - .description("The color when a player is within 10 blocks of you.") .defaultValue(new SettingColor(255, 15, 15)) .visible(displayDistance::get) .build() @@ -162,7 +150,6 @@ public class CombatHud extends HudElement { private final Setting distColor2 = sgDistance.add(new ColorSetting.Builder() .name("distance-stage-2") - .description("The color when a player is within 50 blocks of you.") .defaultValue(new SettingColor(255, 150, 15)) .visible(displayDistance::get) .build() @@ -170,7 +157,6 @@ public class CombatHud extends HudElement { private final Setting distColor3 = sgDistance.add(new ColorSetting.Builder() .name("distance-stage-3") - .description("The color when a player is greater then 50 blocks away from you.") .defaultValue(new SettingColor(15, 255, 15)) .visible(displayDistance::get) .build() @@ -180,7 +166,6 @@ public class CombatHud extends HudElement { public final Setting customScale = sgScale.add(new BoolSetting.Builder() .name("custom-scale") - .description("Applies a custom scale to this hud element.") .defaultValue(false) .onChanged(aBoolean -> calculateSize()) .build() @@ -188,7 +173,6 @@ public class CombatHud extends HudElement { public final Setting scale = sgScale.add(new DoubleSetting.Builder() .name("scale") - .description("Custom scale.") .visible(customScale::get) .defaultValue(2) .onChanged(aDouble -> calculateSize()) @@ -201,14 +185,12 @@ public class CombatHud extends HudElement { public final Setting background = sgBackground.add(new BoolSetting.Builder() .name("background") - .description("Displays background.") .defaultValue(false) .build() ); public final Setting backgroundColor = sgBackground.add(new ColorSetting.Builder() .name("background-color") - .description("Color used for the background.") .visible(background::get) .defaultValue(new SettingColor(25, 25, 25, 50)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CompassHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CompassHud.java index fcd83dbdea..aa8f4c4552 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CompassHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CompassHud.java @@ -19,35 +19,31 @@ public class CompassHud extends HudElement { public static final HudElementInfo INFO = new HudElementInfo<>(Hud.GROUP, "compass", "Displays a compass.", CompassHud::new); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgScale = settings.createGroup("Scale"); - private final SettingGroup sgBackground = settings.createGroup("Background"); + private final SettingGroup sgScale = settings.createGroup("scale"); + private final SettingGroup sgBackground = settings.createGroup("background"); // General private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("type") - .description("Which type of direction information to show.") .defaultValue(Mode.Axis) .build() ); private final Setting colorNorth = sgGeneral.add(new ColorSetting.Builder() .name("color-north") - .description("Color of north.") .defaultValue(new SettingColor(225, 45, 45)) .build() ); private final Setting colorOther = sgGeneral.add(new ColorSetting.Builder() - .name("color-north") - .description("Color of other directions.") + .name("color-other") .defaultValue(new SettingColor()) .build() ); private final Setting shadow = sgGeneral.add(new BoolSetting.Builder() .name("shadow") - .description("Text shadow.") .defaultValue(false) .build() ); @@ -56,7 +52,6 @@ public class CompassHud extends HudElement { private final Setting customScale = sgScale.add(new BoolSetting.Builder() .name("custom-scale") - .description("Apply custom scales to this hud element.") .defaultValue(false) .onChanged(aBoolean -> calculateSize()) .build() @@ -64,7 +59,6 @@ public class CompassHud extends HudElement { private final Setting textScale = sgScale.add(new DoubleSetting.Builder() .name("text-scale") - .description("Scale to use for the letters.") .visible(customScale::get) .defaultValue(1) .min(0.5) @@ -74,7 +68,6 @@ public class CompassHud extends HudElement { private final Setting compassScale = sgScale.add(new DoubleSetting.Builder() .name("compass-scale") - .description("Scale of the whole HUD element.") .visible(customScale::get) .defaultValue(1) .min(0.5) @@ -87,14 +80,12 @@ public class CompassHud extends HudElement { private final Setting background = sgBackground.add(new BoolSetting.Builder() .name("background") - .description("Displays background.") .defaultValue(false) .build() ); private final Setting backgroundColor = sgBackground.add(new ColorSetting.Builder() .name("background-color") - .description("Color used for the background.") .visible(background::get) .defaultValue(new SettingColor(25, 25, 25, 50)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/HoleHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/HoleHud.java index da963f4230..feb87fa74f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/HoleHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/HoleHud.java @@ -26,14 +26,13 @@ public class HoleHud extends HudElement { public static final HudElementInfo INFO = new HudElementInfo<>(Hud.GROUP, "hole", "Displays information about the hole you are standing in.", HoleHud::new); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgScale = settings.createGroup("Scale"); - private final SettingGroup sgBackground = settings.createGroup("Background"); + private final SettingGroup sgScale = settings.createGroup("scale"); + private final SettingGroup sgBackground = settings.createGroup("background"); // General public final Setting> safe = sgGeneral.add(new BlockListSetting.Builder() .name("safe-blocks") - .description("Which blocks to consider safe.") .defaultValue(Blocks.OBSIDIAN, Blocks.BEDROCK, Blocks.CRYING_OBSIDIAN, Blocks.NETHERITE_BLOCK) .build() ); @@ -42,7 +41,6 @@ public class HoleHud extends HudElement { public final Setting customScale = sgScale.add(new BoolSetting.Builder() .name("custom-scale") - .description("Applies a custom scale to this hud element.") .defaultValue(false) .onChanged(aBoolean -> calculateSize()) .build() @@ -50,7 +48,6 @@ public class HoleHud extends HudElement { public final Setting scale = sgScale.add(new DoubleSetting.Builder() .name("scale") - .description("Custom scale.") .visible(customScale::get) .defaultValue(2) .onChanged(aDouble -> calculateSize()) @@ -63,14 +60,12 @@ public class HoleHud extends HudElement { public final Setting background = sgBackground.add(new BoolSetting.Builder() .name("background") - .description("Displays background.") .defaultValue(false) .build() ); public final Setting backgroundColor = sgBackground.add(new ColorSetting.Builder() .name("background-color") - .description("Color used for the background.") .visible(background::get) .defaultValue(new SettingColor(25, 25, 25, 50)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/InventoryHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/InventoryHud.java index 8b30db3f8e..e58aa9ea4b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/InventoryHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/InventoryHud.java @@ -27,12 +27,11 @@ public class InventoryHud extends HudElement { private static final Identifier TEXTURE_TRANSPARENT = MeteorClient.identifier("textures/container-transparent.png"); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgScale = settings.createGroup("Scale"); - private final SettingGroup sgBackground = settings.createGroup("Background"); + private final SettingGroup sgScale = settings.createGroup("scale"); + private final SettingGroup sgBackground = settings.createGroup("background"); private final Setting containers = sgGeneral.add(new BoolSetting.Builder() .name("containers") - .description("Shows the contents of a container when holding them.") .defaultValue(false) .build() ); @@ -41,7 +40,6 @@ public class InventoryHud extends HudElement { public final Setting customScale = sgScale.add(new BoolSetting.Builder() .name("custom-scale") - .description("Applies a custom scale to this hud element.") .defaultValue(false) .onChanged(aBoolean -> calculateSize()) .build() @@ -49,7 +47,6 @@ public class InventoryHud extends HudElement { public final Setting scale = sgScale.add(new DoubleSetting.Builder() .name("scale") - .description("Custom scale.") .visible(customScale::get) .defaultValue(2) .onChanged(aDouble -> calculateSize()) @@ -62,7 +59,6 @@ public class InventoryHud extends HudElement { private final Setting background = sgBackground.add(new EnumSetting.Builder() .name("background") - .description("Background of inventory viewer.") .defaultValue(Background.Texture) .onChanged(bg -> calculateSize()) .build() @@ -70,7 +66,6 @@ public class InventoryHud extends HudElement { public final Setting backgroundColor = sgBackground.add(new ColorSetting.Builder() .name("background-color") - .description("Color used for the background.") .visible(() -> background.get() == Background.Flat) .defaultValue(new SettingColor(25, 25, 25, 50)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ItemHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ItemHud.java index 975d8da941..efac788ce8 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ItemHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ItemHud.java @@ -21,21 +21,19 @@ public class ItemHud extends HudElement { public static final HudElementInfo INFO = new HudElementInfo<>(Hud.GROUP, "item", "Displays the item count.", ItemHud::new); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgScale = settings.createGroup("Scale"); - private final SettingGroup sgBackground = settings.createGroup("Background"); + private final SettingGroup sgScale = settings.createGroup("scale"); + private final SettingGroup sgBackground = settings.createGroup("background"); // General private final Setting item = sgGeneral.add(new ItemSetting.Builder() .name("item") - .description("Item to display") .defaultValue(Items.TOTEM_OF_UNDYING) .build() ); private final Setting noneMode = sgGeneral.add(new EnumSetting.Builder() .name("none-mode") - .description("How to render the item when you don't have the specified item in your inventory.") .defaultValue(NoneMode.HideCount) .build() ); @@ -44,7 +42,6 @@ public class ItemHud extends HudElement { public final Setting customScale = sgScale.add(new BoolSetting.Builder() .name("custom-scale") - .description("Applies a custom scale to this hud element.") .defaultValue(false) .onChanged(aBoolean -> calculateSize()) .build() @@ -52,7 +49,6 @@ public class ItemHud extends HudElement { public final Setting scale = sgScale.add(new DoubleSetting.Builder() .name("scale") - .description("Custom scale.") .visible(customScale::get) .defaultValue(2) .onChanged(aDouble -> calculateSize()) @@ -65,14 +61,12 @@ public class ItemHud extends HudElement { public final Setting background = sgBackground.add(new BoolSetting.Builder() .name("background") - .description("Displays background.") .defaultValue(false) .build() ); public final Setting backgroundColor = sgBackground.add(new ColorSetting.Builder() .name("background-color") - .description("Color used for the background.") .visible(background::get) .defaultValue(new SettingColor(25, 25, 25, 50)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/LagNotifierHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/LagNotifierHud.java index 6154e8f8d4..24731d10be 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/LagNotifierHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/LagNotifierHud.java @@ -18,42 +18,37 @@ public class LagNotifierHud extends HudElement { public static final HudElementInfo INFO = new HudElementInfo<>(Hud.GROUP, "lag-notifier", "Displays if the server is lagging in ticks.", LagNotifierHud::new); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgScale = settings.createGroup("Scale"); - private final SettingGroup sgBackground = settings.createGroup("Background"); + private final SettingGroup sgScale = settings.createGroup("scale"); + private final SettingGroup sgBackground = settings.createGroup("background"); // General private final Setting shadow = sgGeneral.add(new BoolSetting.Builder() .name("shadow") - .description("Text shadow.") .defaultValue(true) .build() ); private final Setting textColor = sgGeneral.add(new ColorSetting.Builder() .name("text-color") - .description("A.") .defaultValue(new SettingColor()) .build() ); private final Setting color1 = sgGeneral.add(new ColorSetting.Builder() .name("color-1") - .description("First color.") .defaultValue(new SettingColor(255, 255, 5)) .build() ); private final Setting color2 = sgGeneral.add(new ColorSetting.Builder() .name("color-2") - .description("Second color.") .defaultValue(new SettingColor(235, 158, 52)) .build() ); private final Setting color3 = sgGeneral.add(new ColorSetting.Builder() .name("color-3") - .description("Third color.") .defaultValue(new SettingColor(225, 45, 45)) .build() ); @@ -62,14 +57,12 @@ public class LagNotifierHud extends HudElement { private final Setting customScale = sgScale.add(new BoolSetting.Builder() .name("custom-scale") - .description("Applies a custom scale to this hud element.") .defaultValue(false) .build() ); private final Setting scale = sgScale.add(new DoubleSetting.Builder() .name("scale") - .description("Custom scale.") .visible(customScale::get) .defaultValue(1) .min(0.5) @@ -81,14 +74,12 @@ public class LagNotifierHud extends HudElement { private final Setting background = sgBackground.add(new BoolSetting.Builder() .name("background") - .description("Displays background.") .defaultValue(false) .build() ); private final Setting backgroundColor = sgBackground.add(new ColorSetting.Builder() .name("background-color") - .description("Color used for the background.") .visible(background::get) .defaultValue(new SettingColor(25, 25, 25, 50)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/MapHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/MapHud.java index 8c997a2f6c..26bd7a5313 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/MapHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/MapHud.java @@ -30,20 +30,18 @@ public class MapHud extends HudElement { public static final HudElementInfo INFO = new HudElementInfo<>(Hud.GROUP, "map", "Displays the contents of a map on your Hud.", MapHud::new); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgVisual = settings.createGroup("Visual"); + private final SettingGroup sgVisual = settings.createGroup("visual"); // General private final Setting mode = sgGeneral.add(new EnumSetting.Builder() .name("mode") - .description("How to determine which map to render.") .defaultValue(Mode.Simple) .build() ); private final Setting slotIndex = sgGeneral.add(new IntSetting.Builder() .name("slot-index") - .description("Which slot to grab the map from.") .visible(() -> mode.get() == Mode.SlotIndex) .defaultValue(0) .sliderRange(0, 40) @@ -52,7 +50,6 @@ public class MapHud extends HudElement { private final Setting mapId = sgGeneral.add(new IntSetting.Builder() .name("map-id") - .description("Which map id to render from. Must be in your inventory!") .visible(() -> mode.get() == Mode.MapId) .defaultValue(0) .noSlider() @@ -63,7 +60,6 @@ public class MapHud extends HudElement { private final Setting scale = sgVisual.add(new DoubleSetting.Builder() .name("scale") - .description("How big to render the map.") .defaultValue(1) .min(0.5) .sliderRange(0.5, 3) @@ -72,14 +68,12 @@ public class MapHud extends HudElement { private final Setting background = sgVisual.add(new BoolSetting.Builder() .name("background") - .description("Displays background.") .defaultValue(false) .build() ); private final Setting backgroundColor = sgVisual.add(new ColorSetting.Builder() .name("background-color") - .description("Color used for the background.") .visible(background::get) .defaultValue(new SettingColor(25, 25, 25, 50)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ModuleInfosHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ModuleInfosHud.java index e85e7b6304..09f4233fba 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ModuleInfosHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ModuleInfosHud.java @@ -21,49 +21,42 @@ public class ModuleInfosHud extends HudElement { private final Setting> modules = sgGeneral.add(new ModuleListSetting.Builder() .name("modules") - .description("Which modules to display") .defaultValue(KillAura.class, CrystalAura.class, AnchorAura.class, BedAura.class, Surround.class) .build() ); private final Setting additionalInfo = sgGeneral.add(new BoolSetting.Builder() .name("additional-info") - .description("Shows additional info from the module next to the name in the module info list.") .defaultValue(true) .build() ); private final Setting textShadow = sgGeneral.add(new BoolSetting.Builder() .name("text-shadow") - .description("Renders shadow behind text.") .defaultValue(true) .build() ); private final Setting moduleColor = sgGeneral.add(new ColorSetting.Builder() .name("module-color") - .description("Module color.") .defaultValue(new SettingColor()) .build() ); private final Setting onColor = sgGeneral.add(new ColorSetting.Builder() .name("on-color") - .description("Color when module is on.") .defaultValue(new SettingColor(25, 225, 25)) .build() ); private final Setting offColor = sgGeneral.add(new ColorSetting.Builder() .name("off-color") - .description("Color when module is off.") .defaultValue(new SettingColor(225, 25, 25)) .build() ); private final Setting alignment = sgGeneral.add(new EnumSetting.Builder() .name("alignment") - .description("Horizontal alignment.") .defaultValue(Alignment.Auto) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerModelHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerModelHud.java index 73814d21d9..6fe8a855fd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerModelHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerModelHud.java @@ -20,21 +20,19 @@ public class PlayerModelHud extends HudElement { public static final HudElementInfo INFO = new HudElementInfo<>(Hud.GROUP, "player-model", "Displays a model of your player.", PlayerModelHud::new); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgScale = settings.createGroup("Scale"); - private final SettingGroup sgBackground = settings.createGroup("Background"); + private final SettingGroup sgScale = settings.createGroup("scale"); + private final SettingGroup sgBackground = settings.createGroup("background"); // General private final Setting copyYaw = sgGeneral.add(new BoolSetting.Builder() .name("copy-yaw") - .description("Makes the player model's yaw equal to yours.") .defaultValue(true) .build() ); private final Setting customYaw = sgGeneral.add(new IntSetting.Builder() .name("custom-yaw") - .description("Custom yaw for when copy yaw is off.") .defaultValue(0) .range(-180, 180) .sliderRange(-180, 180) @@ -44,14 +42,12 @@ public class PlayerModelHud extends HudElement { private final Setting copyPitch = sgGeneral.add(new BoolSetting.Builder() .name("copy-pitch") - .description("Makes the player model's pitch equal to yours.") .defaultValue(true) .build() ); private final Setting customPitch = sgGeneral.add(new IntSetting.Builder() .name("custom-pitch") - .description("Custom pitch for when copy pitch is off.") .defaultValue(0) .range(-90, 90) .sliderRange(-90, 90) @@ -61,7 +57,6 @@ public class PlayerModelHud extends HudElement { private final Setting centerOrientation = sgGeneral.add(new EnumSetting.Builder() .name("center-orientation") - .description("Which direction the player faces when the HUD model faces directly forward.") .defaultValue(CenterOrientation.South) .build() ); @@ -70,7 +65,6 @@ public class PlayerModelHud extends HudElement { public final Setting customScale = sgScale.add(new BoolSetting.Builder() .name("custom-scale") - .description("Applies a custom scale to this hud element.") .defaultValue(false) .onChanged(aBoolean -> calculateSize()) .build() @@ -78,7 +72,6 @@ public class PlayerModelHud extends HudElement { public final Setting scale = sgScale.add(new DoubleSetting.Builder() .name("scale") - .description("Custom scale.") .visible(customScale::get) .defaultValue(2) .onChanged(aDouble -> calculateSize()) @@ -91,14 +84,12 @@ public class PlayerModelHud extends HudElement { private final Setting background = sgBackground.add(new BoolSetting.Builder() .name("background") - .description("Displays background.") .defaultValue(false) .build() ); private final Setting backgroundColor = sgBackground.add(new ColorSetting.Builder() .name("background-color") - .description("Color used for the background.") .visible(background::get) .defaultValue(new SettingColor(25, 25, 25, 50)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerRadarHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerRadarHud.java index c2908620f3..b19bcdf37c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerRadarHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerRadarHud.java @@ -24,14 +24,13 @@ public class PlayerRadarHud extends HudElement { public static final HudElementInfo INFO = new HudElementInfo<>(Hud.GROUP, "player-radar", "Displays players in your visual range.", PlayerRadarHud::new); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgScale = settings.createGroup("Scale"); - private final SettingGroup sgBackground = settings.createGroup("Background"); + private final SettingGroup sgScale = settings.createGroup("scale"); + private final SettingGroup sgBackground = settings.createGroup("background"); // General private final Setting limit = sgGeneral.add(new IntSetting.Builder() .name("limit") - .description("The max number of players to show.") .defaultValue(10) .min(1) .sliderRange(1, 20) @@ -40,49 +39,42 @@ public class PlayerRadarHud extends HudElement { private final Setting distance = sgGeneral.add(new BoolSetting.Builder() .name("distance") - .description("Shows the distance to the player next to their name.") .defaultValue(false) .build() ); private final Setting friends = sgGeneral.add(new BoolSetting.Builder() .name("display-friends") - .description("Whether to show friends or not.") .defaultValue(true) .build() ); private final Setting shadow = sgGeneral.add(new BoolSetting.Builder() .name("shadow") - .description("Renders shadow behind text.") .defaultValue(true) .build() ); private final Setting primaryColor = sgGeneral.add(new ColorSetting.Builder() .name("primary-color") - .description("Primary color.") .defaultValue(new SettingColor()) .build() ); private final Setting secondaryColor = sgGeneral.add(new ColorSetting.Builder() .name("secondary-color") - .description("Secondary color.") .defaultValue(new SettingColor(175, 175, 175)) .build() ); private final Setting alignment = sgGeneral.add(new EnumSetting.Builder() .name("alignment") - .description("Horizontal alignment.") .defaultValue(Alignment.Auto) .build() ); private final Setting border = sgGeneral.add(new IntSetting.Builder() .name("border") - .description("How much space to add around the element.") .defaultValue(0) .build() ); @@ -91,14 +83,12 @@ public class PlayerRadarHud extends HudElement { private final Setting customScale = sgScale.add(new BoolSetting.Builder() .name("custom-scale") - .description("Applies a custom scale to this hud element.") .defaultValue(false) .build() ); private final Setting scale = sgScale.add(new DoubleSetting.Builder() .name("scale") - .description("Custom scale.") .visible(customScale::get) .defaultValue(1) .min(0.5) @@ -110,14 +100,12 @@ public class PlayerRadarHud extends HudElement { private final Setting background = sgBackground.add(new BoolSetting.Builder() .name("background") - .description("Displays background.") .defaultValue(false) .build() ); private final Setting backgroundColor = sgBackground.add(new ColorSetting.Builder() .name("background-color") - .description("Color used for the background.") .visible(background::get) .defaultValue(new SettingColor(25, 25, 25, 50)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java index 33101ee694..94016aaf07 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java @@ -25,34 +25,30 @@ public class PotionTimersHud extends HudElement { public static final HudElementInfo INFO = new HudElementInfo<>(Hud.GROUP, "potion-timers", "Displays active potion effects with timers.", PotionTimersHud::new); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgScale = settings.createGroup("Scale"); - private final SettingGroup sgBackground = settings.createGroup("Background"); + private final SettingGroup sgScale = settings.createGroup("scale"); + private final SettingGroup sgBackground = settings.createGroup("background"); // General private final Setting> hiddenEffects = sgGeneral.add(new StatusEffectListSetting.Builder() .name("hidden-effects") - .description("Which effects not to show in the list.") .build() ); private final Setting showAmbient = sgGeneral.add(new BoolSetting.Builder() .name("show-ambient") - .description("Whether to show ambient effects like from beacons and conduits.") .defaultValue(true) .build() ); private final Setting colorMode = sgGeneral.add(new EnumSetting.Builder() .name("color-mode") - .description("What color to use for effects.") .defaultValue(ColorMode.Effect) .build() ); private final Setting flatColor = sgGeneral.add(new ColorSetting.Builder() .name("flat-color") - .description("Color for flat color mode.") .defaultValue(new SettingColor(225, 25, 25)) .visible(() -> colorMode.get() == ColorMode.Flat) .build() @@ -60,7 +56,6 @@ public class PotionTimersHud extends HudElement { private final Setting rainbowSpeed = sgGeneral.add(new DoubleSetting.Builder() .name("rainbow-speed") - .description("Rainbow speed of rainbow color mode.") .defaultValue(0.05) .sliderMin(0.01) .sliderMax(0.2) @@ -71,7 +66,6 @@ public class PotionTimersHud extends HudElement { private final Setting rainbowSpread = sgGeneral.add(new DoubleSetting.Builder() .name("rainbow-spread") - .description("Rainbow spread of rainbow color mode.") .defaultValue(0.01) .sliderMin(0.001) .sliderMax(0.05) @@ -82,7 +76,6 @@ public class PotionTimersHud extends HudElement { private final Setting rainbowSaturation = sgGeneral.add(new DoubleSetting.Builder() .name("rainbow-saturation") - .description("Saturation of rainbow color mode.") .defaultValue(1.0d) .sliderRange(0.0d, 1.0d) .visible(() -> colorMode.get() == ColorMode.Rainbow) @@ -91,7 +84,6 @@ public class PotionTimersHud extends HudElement { private final Setting rainbowBrightness = sgGeneral.add(new DoubleSetting.Builder() .name("rainbow-brightness") - .description("Brightness of rainbow color mode.") .defaultValue(1.0d) .sliderRange(0.0d, 1.0d) .visible(() -> colorMode.get() == ColorMode.Rainbow) @@ -100,21 +92,18 @@ public class PotionTimersHud extends HudElement { private final Setting shadow = sgGeneral.add(new BoolSetting.Builder() .name("shadow") - .description("Renders shadow behind text.") .defaultValue(true) .build() ); private final Setting alignment = sgGeneral.add(new EnumSetting.Builder() .name("alignment") - .description("Horizontal alignment.") .defaultValue(Alignment.Auto) .build() ); private final Setting border = sgGeneral.add(new IntSetting.Builder() .name("border") - .description("How much space to add around the element.") .defaultValue(0) .build() ); @@ -123,14 +112,12 @@ public class PotionTimersHud extends HudElement { private final Setting customScale = sgScale.add(new BoolSetting.Builder() .name("custom-scale") - .description("Applies a custom scale to this hud element.") .defaultValue(false) .build() ); private final Setting scale = sgScale.add(new DoubleSetting.Builder() .name("scale") - .description("Custom scale.") .visible(customScale::get) .defaultValue(1) .min(0.5) @@ -142,14 +129,12 @@ public class PotionTimersHud extends HudElement { private final Setting background = sgBackground.add(new BoolSetting.Builder() .name("background") - .description("Displays background.") .defaultValue(false) .build() ); private final Setting backgroundColor = sgBackground.add(new ColorSetting.Builder() .name("background-color") - .description("Color used for the background.") .visible(background::get) .defaultValue(new SettingColor(25, 25, 25, 50)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/TextHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/TextHud.java index 659b38742f..97d81b9f98 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/TextHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/TextHud.java @@ -27,9 +27,9 @@ public class TextHud extends HudElement { private static final Color WHITE = new Color(); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgShown = settings.createGroup("Shown"); - private final SettingGroup sgScale = settings.createGroup("Scale"); - private final SettingGroup sgBackground = settings.createGroup("Background"); + private final SettingGroup sgShown = settings.createGroup("shown"); + private final SettingGroup sgScale = settings.createGroup("scale"); + private final SettingGroup sgBackground = settings.createGroup("background"); private double originalWidth, originalHeight; private boolean needsCompile, recalculateSize; @@ -40,7 +40,6 @@ public class TextHud extends HudElement { public final Setting text = sgGeneral.add(new StringSetting.Builder() .name("text") - .description("Text to display with Starscript.") .defaultValue(MeteorClient.NAME) .onChanged(s -> recompile()) .wide() @@ -50,7 +49,6 @@ public class TextHud extends HudElement { public final Setting updateDelay = sgGeneral.add(new IntSetting.Builder() .name("update-delay") - .description("Update delay in ticks") .defaultValue(4) .onChanged(integer -> { if (timer > integer) timer = integer; @@ -61,7 +59,6 @@ public class TextHud extends HudElement { public final Setting shadow = sgGeneral.add(new BoolSetting.Builder() .name("shadow") - .description("Renders shadow behind text.") .defaultValue(true) .onChanged(aBoolean -> recalculateSize = true) .build() @@ -69,7 +66,6 @@ public class TextHud extends HudElement { public final Setting border = sgGeneral.add(new IntSetting.Builder() .name("border") - .description("How much space to add around the text.") .defaultValue(0) .onChanged(integer -> super.setSize(originalWidth + integer * 2, originalHeight + integer * 2)) .build() @@ -79,7 +75,6 @@ public class TextHud extends HudElement { public final Setting shown = sgShown.add(new EnumSetting.Builder() .name("shown") - .description("When this text element is shown.") .defaultValue(Shown.Always) .onChanged(s -> recompile()) .build() @@ -87,7 +82,6 @@ public class TextHud extends HudElement { public final Setting condition = sgShown.add(new StringSetting.Builder() .name("condition") - .description("Condition to check when shown is not Always.") .visible(() -> shown.get() != Shown.Always) .onChanged(s -> recompile()) .renderer(StarscriptTextBoxRenderer.class) @@ -98,7 +92,6 @@ public class TextHud extends HudElement { public final Setting customScale = sgScale.add(new BoolSetting.Builder() .name("custom-scale") - .description("Applies a custom scale to this hud element.") .defaultValue(false) .onChanged(aBoolean -> recalculateSize = true) .build() @@ -106,7 +99,6 @@ public class TextHud extends HudElement { public final Setting scale = sgScale.add(new DoubleSetting.Builder() .name("scale") - .description("Custom scale.") .visible(customScale::get) .defaultValue(1) .onChanged(aDouble -> recalculateSize = true) @@ -119,14 +111,12 @@ public class TextHud extends HudElement { public final Setting background = sgBackground.add(new BoolSetting.Builder() .name("background") - .description("Displays background.") .defaultValue(false) .build() ); public final Setting backgroundColor = sgBackground.add(new ColorSetting.Builder() .name("background-color") - .description("Color used for the background.") .visible(background::get) .defaultValue(new SettingColor(25, 25, 25, 50)) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementScreen.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementScreen.java index 3b8c03b450..709e4b70cd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementScreen.java @@ -37,10 +37,9 @@ public HudElementScreen(GuiTheme theme, HudElement element) { this.element = element; settings = new Settings("hud.base"); - SettingGroup sg = settings.createGroup("Anchors"); + SettingGroup sg = settings.createGroup("anchors"); sg.add(new BoolSetting.Builder() .name("auto-anchors") - .description("Automatically assigns anchors based on the position.") .defaultValue(true) .onModuleActivated(booleanSetting -> booleanSetting.set(element.autoAnchors)) .onChanged(aBoolean -> { @@ -51,7 +50,6 @@ public HudElementScreen(GuiTheme theme, HudElement element) { ); sg.add(new EnumSetting.Builder() .name("x-anchor") - .description("Horizontal anchor.") .defaultValue(XAnchor.Left) .visible(() -> !element.autoAnchors) .onModuleActivated(xAnchorSetting -> xAnchorSetting.set(element.box.xAnchor)) @@ -60,7 +58,6 @@ public HudElementScreen(GuiTheme theme, HudElement element) { ); sg.add(new EnumSetting.Builder() .name("y-anchor") - .description("Vertical anchor.") .defaultValue(YAnchor.Top) .visible(() -> !element.autoAnchors) .onModuleActivated(yAnchorSetting -> yAnchorSetting.set(element.box.yAnchor)) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java b/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java index c7249a8a5f..29fc08d3a9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java @@ -28,13 +28,11 @@ public class Macro implements ISerializable { public Setting name = sgGeneral.add(new StringSetting.Builder() .name("name") - .description("The name of the macro.") .build() ); public Setting> messages = sgGeneral.add(new StringListSetting.Builder() .name("messages") - .description("The messages for the macro to send.") .onChanged(v -> dirty = true) .renderer(StarscriptTextBoxRenderer.class) .build() @@ -42,7 +40,6 @@ public class Macro implements ISerializable { public Setting keybind = sgGeneral.add(new KeybindSetting.Builder() .name("keybind") - .description("The bind to run the macro.") .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPBlockDataScreen.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPBlockDataScreen.java index 631a052bbc..8f1bc3df4d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPBlockDataScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPBlockDataScreen.java @@ -38,11 +38,10 @@ private ESPBlockDataScreen(GuiTheme theme, ESPBlockData blockData, Setting se public void initWidgets() { Settings settings = new Settings("module.block-esp.data"); SettingGroup sgGeneral = settings.getDefaultGroup(); - SettingGroup sgTracer = settings.createGroup("Tracer"); + SettingGroup sgTracer = settings.createGroup("tracer"); sgGeneral.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shape is rendered.") .defaultValue(ShapeMode.Lines) .onModuleActivated(shapeModeSetting -> shapeModeSetting.set(blockData.shapeMode)) .onChanged(shapeMode -> { @@ -56,7 +55,6 @@ public void initWidgets() { sgGeneral.add(new ColorSetting.Builder() .name("line-color") - .description("Color of lines.") .defaultValue(new SettingColor(0, 255, 200)) .onModuleActivated(settingColorSetting -> settingColorSetting.get().set(blockData.lineColor)) .onChanged(settingColor -> { @@ -70,7 +68,6 @@ public void initWidgets() { sgGeneral.add(new ColorSetting.Builder() .name("side-color") - .description("Color of sides.") .defaultValue(new SettingColor(0, 255, 200, 25)) .onModuleActivated(settingColorSetting -> settingColorSetting.get().set(blockData.sideColor)) .onChanged(settingColor -> { @@ -84,7 +81,6 @@ public void initWidgets() { sgTracer.add(new BoolSetting.Builder() .name("tracer") - .description("If tracer line is allowed to this block.") .defaultValue(true) .onModuleActivated(booleanSetting -> booleanSetting.set(blockData.tracer)) .onChanged(aBoolean -> { @@ -98,7 +94,6 @@ public void initWidgets() { sgTracer.add(new ColorSetting.Builder() .name("tracer-color") - .description("Color of tracer line.") .defaultValue(new SettingColor(0, 255, 200, 125)) .onModuleActivated(settingColorSetting -> settingColorSetting.get().set(blockData.tracerColor)) .onChanged(settingColor -> { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/BaseMarker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/BaseMarker.java index b4db8dad09..15787c67f0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/BaseMarker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/BaseMarker.java @@ -16,6 +16,8 @@ import net.minecraft.client.gui.screen.Screen; import net.minecraft.nbt.NbtCompound; +import java.util.Locale; + public abstract class BaseMarker implements ISerializable { public final Settings settings; @@ -27,26 +29,23 @@ public abstract class BaseMarker implements ISerializable { private final Setting active; public BaseMarker(String type) { - this.settings = new Settings(type); + this.settings = new Settings("marker." + type.toLowerCase(Locale.ROOT)); - this.sgBase = settings.createGroup("Base"); + this.sgBase = settings.createGroup("base"); this.name = sgBase.add(new StringSetting.Builder() .name("name") - .description("Custom name for this marker.") .build() ); this.name.set(type); this.description = sgBase.add(new StringSetting.Builder() .name("description") - .description("Custom description for this marker.") .build() ); this.dimension = sgBase.add(new EnumSetting.Builder() .name("dimension") - .description("In which dimension this marker should be visible.") .defaultValue(Dimension.Overworld) .build() ); @@ -54,7 +53,6 @@ public BaseMarker(String type) { this.active = sgBase.add(new BoolSetting.Builder() .name("active") - .description("Is this marker visible.") .defaultValue(false) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/CuboidMarker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/CuboidMarker.java index e869df4538..641700160f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/CuboidMarker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/CuboidMarker.java @@ -20,19 +20,17 @@ public enum Mode { } private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); + private final SettingGroup sgRender = settings.createGroup("render"); // General private final Setting pos1 = sgGeneral.add(new BlockPosSetting.Builder() .name("pos-1") - .description("1st corner of the cuboid") .build() ); private final Setting pos2 = sgGeneral.add(new BlockPosSetting.Builder() .name("pos-2") - .description("2nd corner of the cuboid") .build() ); @@ -40,28 +38,24 @@ public enum Mode { private final Setting mode = sgRender.add(new EnumSetting.Builder() .name("mode") - .description("What mode to use for this marker.") .defaultValue(Mode.Full) .build() ); private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The color of the sides of the blocks being rendered.") .defaultValue(new SettingColor(0, 100, 255, 50)) .build() ); private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The color of the lines of the blocks being rendered.") .defaultValue(new SettingColor(0, 100, 255, 255)) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Marker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Marker.java index 8c7a8a42bf..2da228c5a4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Marker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Marker.java @@ -27,7 +27,7 @@ import java.util.ArrayList; public class Marker extends Module { - private final MarkerFactory factory = new MarkerFactory(); + public final MarkerFactory factory = new MarkerFactory(); private final ArrayList markers = new ArrayList<>(); public Marker() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Sphere2dMarker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Sphere2dMarker.java index 53b57e9a48..ca7faee222 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Sphere2dMarker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/marker/Sphere2dMarker.java @@ -33,19 +33,17 @@ public Block(int x, int y, int z) { public static final String type = "Sphere-2D"; private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgRender = settings.createGroup("Render"); - private final SettingGroup sgKeybinding = settings.createGroup("Keybinding"); + private final SettingGroup sgRender = settings.createGroup("render"); + private final SettingGroup sgBind = settings.createGroup("bind"); private final Setting center = sgGeneral.add(new BlockPosSetting.Builder() .name("center") - .description("Center of the sphere") .onChanged(bp -> dirty = true) .build() ); private final Setting radius = sgGeneral.add(new IntSetting.Builder() .name("radius") - .description("Radius of the sphere") .defaultValue(20) .min(1) .noSlider() @@ -55,7 +53,6 @@ public Block(int x, int y, int z) { private final Setting layer = sgGeneral.add(new IntSetting.Builder() .name("layer") - .description("Which layer to render") .defaultValue(0) .min(0) .noSlider() @@ -67,14 +64,12 @@ public Block(int x, int y, int z) { private final Setting limitRenderRange = sgRender.add(new BoolSetting.Builder() .name("limit-render-range") - .description("Whether to limit rendering range (useful in very large circles)") .defaultValue(false) .build() ); private final Setting renderRange = sgRender.add(new IntSetting.Builder() .name("render-range") - .description("Rendering range") .defaultValue(10) .min(1) .sliderRange(1, 20) @@ -84,21 +79,18 @@ public Block(int x, int y, int z) { private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() .name("shape-mode") - .description("How the shapes are rendered.") .defaultValue(ShapeMode.Both) .build() ); private final Setting sideColor = sgRender.add(new ColorSetting.Builder() .name("side-color") - .description("The color of the sides of the blocks being rendered.") .defaultValue(new SettingColor(0, 100, 255, 50)) .build() ); private final Setting lineColor = sgRender.add(new ColorSetting.Builder() .name("line-color") - .description("The color of the lines of the blocks being rendered.") .defaultValue(new SettingColor(0, 100, 255, 255)) .build() ); @@ -106,9 +98,8 @@ public Block(int x, int y, int z) { // Keybinding @SuppressWarnings("unused") - private final Setting nextLayerKey = sgKeybinding.add(new KeybindSetting.Builder() + private final Setting nextLayerKey = sgBind.add(new KeybindSetting.Builder() .name("next-layer-keybind") - .description("Keybind to increment layer") .action(() -> { if (isVisible() && layer.get() < radius.get() * 2) layer.set(layer.get() + 1); }) @@ -116,9 +107,8 @@ public Block(int x, int y, int z) { ); @SuppressWarnings("unused") - private final Setting prevLayerKey = sgKeybinding.add(new KeybindSetting.Builder() + private final Setting prevLayerKey = sgBind.add(new KeybindSetting.Builder() .name("prev-layer-keybind") - .description("Keybind to increment layer") .action(() -> { if (isVisible()) layer.set(layer.get() - 1); }) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java b/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java index 3956307408..8c180ef6de 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java @@ -26,46 +26,40 @@ public class Profile implements ISerializable { public final Settings settings = new Settings("profile"); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgSave = settings.createGroup("Save"); + private final SettingGroup sgSave = settings.createGroup("save"); public Setting name = sgGeneral.add(new StringSetting.Builder() .name("name") - .description("The name of the profile.") .filter(Utils::nameFilter) .build() ); public Setting> loadOnJoin = sgGeneral.add(new StringListSetting.Builder() .name("load-on-join") - .description("Which servers to set this profile as active when joining.") .filter(Utils::ipFilter) .build() ); public Setting hud = sgSave.add(new BoolSetting.Builder() .name("hud") - .description("Whether the profile should save hud.") .defaultValue(false) .build() ); public Setting macros = sgSave.add(new BoolSetting.Builder() .name("macros") - .description("Whether the profile should save macros.") .defaultValue(false) .build() ); public Setting modules = sgSave.add(new BoolSetting.Builder() .name("modules") - .description("Whether the profile should save modules.") .defaultValue(false) .build() ); public Setting waypoints = sgSave.add(new BoolSetting.Builder() .name("waypoints") - .description("Whether the profile should save waypoints.") .defaultValue(false) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxies.java b/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxies.java index 5d1abd3918..fdc19abd75 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxies.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxies.java @@ -19,12 +19,11 @@ public class Proxies extends System implements Iterable { public final Settings settings = new Settings("proxies"); - private final SettingGroup sgRefreshing = settings.createGroup("Refreshing"); - private final SettingGroup sgCleanup = settings.createGroup("Cleanup"); + private final SettingGroup sgRefreshing = settings.createGroup("refreshing"); + private final SettingGroup sgCleanup = settings.createGroup("cleanup"); private final Setting threads = sgRefreshing.add(new IntSetting.Builder() .name("threads") - .description("The number of concurrent threads to check proxies with.") .defaultValue(8) .min(0) .sliderRange(0, 32) @@ -33,7 +32,6 @@ public class Proxies extends System implements Iterable { public final Setting timeout = sgRefreshing.add(new IntSetting.Builder() .name("timeout") - .description("The timeout in milliseconds for checking proxies.") .defaultValue(5000) .min(0) .sliderRange(0, 15000) @@ -42,7 +40,6 @@ public class Proxies extends System implements Iterable { private final Setting tries = sgRefreshing.add(new IntSetting.Builder() .name("retries-on-timeout") - .description("How many additional times to check a proxy if the check times out.") .defaultValue(1) .min(0) .sliderRange(0, 5) @@ -51,21 +48,18 @@ public class Proxies extends System implements Iterable { private final Setting sort = sgCleanup.add(new BoolSetting.Builder() .name("sort-by-latency") - .description("Whether to sort the proxy list by latency.") .defaultValue(true) .build() ); private final Setting pruneDead = sgCleanup.add(new BoolSetting.Builder() .name("prune-dead") - .description("Whether to prune dead proxies.") .defaultValue(true) .build() ); private final Setting pruneLatency = sgCleanup.add(new IntSetting.Builder() .name("prune-by-latency") - .description("Prune proxies at or above this latency in ms. 0 to disable.") .defaultValue(2000) .min(0) .sliderRange(0, 10000) @@ -74,7 +68,6 @@ public class Proxies extends System implements Iterable { private final Setting pruneExcess = sgCleanup.add(new IntSetting.Builder() .name("prune-to-count") - .description("If in excess, prune the number of proxies to this count. 0 to disable. Prioritises by latency.") .defaultValue(0) .sliderRange(0, 25) .build() diff --git a/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxy.java b/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxy.java index 92d246f21e..54b15ec81b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxy.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/proxies/Proxy.java @@ -28,31 +28,27 @@ public class Proxy implements ISerializable { public final Settings settings = new Settings("proxy"); private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgOptional = settings.createGroup("Optional"); + private final SettingGroup sgOptional = settings.createGroup("optional"); public Setting name = sgGeneral.add(new StringSetting.Builder() .name("name") - .description("The name of the proxy.") .build() ); public Setting type = sgGeneral.add(new EnumSetting.Builder() .name("type") - .description("The type of proxy.") .defaultValue(ProxyType.Socks5) .build() ); public Setting address = sgGeneral.add(new StringSetting.Builder() .name("address") - .description("The ip address of the proxy.") .filter(Utils::ipFilter) .build() ); public Setting port = sgGeneral.add(new IntSetting.Builder() .name("port") - .description("The port of the proxy.") .defaultValue(0) .range(0, 65535) .sliderMax(65535) @@ -62,7 +58,6 @@ public class Proxy implements ISerializable { public Setting enabled = sgGeneral.add(new BoolSetting.Builder() .name("enabled") - .description("Whether the proxy is enabled.") .defaultValue(true) .build() ); @@ -71,13 +66,11 @@ public class Proxy implements ISerializable { public Setting username = sgOptional.add(new StringSetting.Builder() .name("username") - .description("The username of the proxy.") .build() ); public Setting password = sgOptional.add(new StringSetting.Builder() .name("password") - .description("The password of the proxy.") .visible(() -> type.get().equals(ProxyType.Socks5)) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoint.java b/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoint.java index ee862a39a3..b13212b4bf 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoint.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/waypoints/Waypoint.java @@ -25,8 +25,8 @@ public class Waypoint implements ISerializable { public final Settings settings = new Settings("waypoint"); - private final SettingGroup sgVisual = settings.createGroup("Visual"); - private final SettingGroup sgPosition = settings.createGroup("Position"); + private final SettingGroup sgVisual = settings.createGroup("visual"); + private final SettingGroup sgPosition = settings.createGroup("position"); public enum NearAction { Disabled, Hide, Delete @@ -34,14 +34,12 @@ public enum NearAction { public Setting name = sgVisual.add(new StringSetting.Builder() .name("name") - .description("The name of the waypoint.") .defaultValue("Home") .build() ); public Setting icon = sgVisual.add(new ProvidedStringSetting.Builder() .name("icon") - .description("The icon of the waypoint.") .defaultValue("Square") .supplier(() -> Waypoints.BUILTIN_ICONS) .onChanged(v -> validateIcon()) @@ -50,49 +48,42 @@ public enum NearAction { public Setting color = sgVisual.add(new ColorSetting.Builder() .name("color") - .description("The color of the waypoint.") .defaultValue(MeteorClient.ADDON.color.toSetting()) .build() ); public Setting visible = sgVisual.add(new BoolSetting.Builder() .name("visible") - .description("Whether to show the waypoint.") .defaultValue(true) .build() ); public Setting maxVisible = sgVisual.add(new IntSetting.Builder() .name("max-visible-distance") - .description("How far away to render the waypoint.") .defaultValue(5000) .build() ); public Setting scale = sgVisual.add(new DoubleSetting.Builder() .name("scale") - .description("The scale of the waypoint.") .defaultValue(1.5) .build() ); public Setting pos = sgPosition.add(new BlockPosSetting.Builder() .name("location") - .description("The location of the waypoint.") .defaultValue(BlockPos.ORIGIN) .build() ); public Setting dimension = sgPosition.add(new EnumSetting.Builder() .name("dimension") - .description("Which dimension the waypoint is in.") .defaultValue(Dimension.Overworld) .build() ); public Setting opposite = sgPosition.add(new BoolSetting.Builder() .name("opposite-dimension") - .description("Whether to show the waypoint in the opposite dimension.") .defaultValue(true) .visible(() -> dimension.get() != Dimension.End) .build() @@ -100,14 +91,12 @@ public enum NearAction { public Setting actionWhenNear = sgPosition.add(new EnumSetting.Builder() .name("action-when-near") - .description("Action to be performed when the player is near.") .defaultValue(NearAction.Disabled) .build() ); public Setting actionWhenNearDistance = sgPosition.add(new IntSetting.Builder() .name("action-when-near-distance") - .description("How close (in blocks) the player has to be for the near action to be performed.") .defaultValue(8) .sliderRange(0, 32) .visible(() -> actionWhenNear.get() != NearAction.Disabled) diff --git a/src/main/resources/assets/meteor-client/language/en_gb.json b/src/main/resources/assets/meteor-client/language/en_gb.json index 718c010de5..7e700764dc 100644 --- a/src/main/resources/assets/meteor-client/language/en_gb.json +++ b/src/main/resources/assets/meteor-client/language/en_gb.json @@ -1,5 +1,5 @@ { - "meteor.lang.translators" : "MeteorDevelopment", + "meteor.lang.translators": "MeteorDevelopment", "meteor.key.category": "Meteor Client", "meteor.key.open-commands": "Open Commands", @@ -74,6 +74,501 @@ "command.wasp.info.target": "%s set as target.", "command.waypoint.description": "Manages waypoints.", + "config.visual.custom-font": "Custom Font", + "config.visual.custom-font.description": "Use a custom font.", + "config.visual.font": "Font", + "config.visual.font.description": "Custom font to use.", + "config.visual.rainbow-speed": "Rainbow Speed", + "config.visual.rainbow-speed.description": "The global rainbow speed.", + "config.visual.title-screen-credits": "Title Screen Credits", + "config.visual.title-screen-credits.description": "Show Meteor credits on title screen", + "config.visual.title-screen-splashes": "Title Screen Splashes", + "config.visual.title-screen-splashes.description": "Show Meteor splash texts on title screen", + "config.visual.custom-window-title": "Custom Window Title", + "config.visual.custom-window-title.description": "Show custom text in the window title.", + "config.visual.window-title-text": "Window Title Text", + "config.visual.window-title-text.description": "The text it displays in the window title.", + "config.visual.friend-color": "Friend Color", + "config.visual.friend-color.description": "The color used to show friends.", + "config.visual.sync-list-setting-widths": "Sync List Setting Widths", + "config.visual.sync-list-setting-widths.description": "Prevents the list setting screens from moving around as you add & remove elements.", + "config.modules.hidden-modules": "Hidden Modules", + "config.modules.hidden-modules.description": "Prevent these modules from being rendered as options in the clickgui.", + "config.modules.module-search-count": "Module Search Count", + "config.modules.module-search-count.description": "Amount of modules and settings to be shown in the module search bar.", + "config.modules.search-module-aliases": "Search Module Aliases", + "config.modules.search-module-aliases.description": "Whether or not module aliases will be used in the module search bar.", + "config.chat.prefix": "Prefix", + "config.chat.prefix.description": "Prefix.", + "config.chat.chat-feedback": "Chat Feedback", + "config.chat.chat-feedback.description": "Sends chat feedback when meteor performs certain actions.", + "config.chat.delete-chat-feedback": "Delete Chat Feedback", + "config.chat.delete-chat-feedback.description": "Delete previous matching chat feedback to keep chat clear.", + "config.misc.rotation-hold": "Rotation Hold", + "config.misc.rotation-hold.description": "Hold long to hold server side rotation when not sending any packets.", + "config.misc.use-team-color": "Use Team Color", + "config.misc.use-team-color.description": "Uses player's team color for rendering things like esp and tracers.", + + "hud.general.custom-font": "Custom Font", + "hud.general.custom-font.description": "Text will use custom font.", + "hud.general.hide-in-menus": "Hide In Menus", + "hud.general.hide-in-menus.description": "Hides the meteor hud when in inventory screens or game menus.", + "hud.general.text-scale": "Text Scale", + "hud.general.text-scale.description": "Scale of text if not overridden by the element.", + "hud.general.text-colors": "Text Colors", + "hud.general.text-colors.description": "Colors used for the Text element.", + "hud.editor.border": "Border", + "hud.editor.border.description": "Space around the edges of the screen.", + "hud.editor.snapping-range": "Snapping Range", + "hud.editor.snapping-range.description": "Snapping range in editor.", + "hud.bind.bind": "Bind", + "hud.bind.bind.description": "Keybind for toggling the hud", + + "hud.base.anchors.auto-anchors": "Automatically assigns anchors based on the position.", + "hud.base.anchors.x-anchor": "Horizontal anchor.", + "hud.base.anchors.y-anchor": "Vertical anchor.", + + "hud.active-modules.general.sort": "Sort", + "hud.active-modules.general.sort.description": "How to sort active modules.", + "hud.active-modules.general.hidden-modules": "Hidden Modules", + "hud.active-modules.general.hidden-modules.description": "Which modules not to show in the list.", + "hud.active-modules.general.module-info": "Module Info", + "hud.active-modules.general.module-info.description": "Shows info from the module next to the name in the active modules list.", + "hud.active-modules.general.show-keybind": "Show Keybind", + "hud.active-modules.general.show-keybind.description": "Shows the module's keybind next to its name.", + "hud.active-modules.general.shadow": "Shadow", + "hud.active-modules.general.shadow.description": "Renders shadow behind text.", + "hud.active-modules.general.outlines": "Outlines", + "hud.active-modules.general.outlines.description": "Whether or not to render outlines", + "hud.active-modules.general.outline-width": "Outline Width", + "hud.active-modules.general.outline-width.description": "Outline width", + "hud.active-modules.general.alignment": "Alignment", + "hud.active-modules.general.alignment.description": "Horizontal alignment.", + "hud.active-modules.color.color-mode": "Color Mode", + "hud.active-modules.color.color-mode.description": "What color to use for active modules.", + "hud.active-modules.color.flat-color": "Flat Color", + "hud.active-modules.color.flat-color.description": "Color for flat color mode.", + "hud.active-modules.color.rainbow-speed": "Rainbow Speed", + "hud.active-modules.color.rainbow-speed.description": "Rainbow speed of rainbow color mode.", + "hud.active-modules.color.rainbow-spread": "Rainbow Spread", + "hud.active-modules.color.rainbow-spread.description": "Rainbow spread of rainbow color mode.", + "hud.active-modules.color.rainbow-saturation": "Rainbow Saturation", + "hud.active-modules.color.rainbow-saturation.description": "", + "hud.active-modules.color.rainbow-brightness": "Rainbow Brightness", + "hud.active-modules.color.rainbow-brightness.description": "", + "hud.active-modules.color.module-info-color": "Module Info Color", + "hud.active-modules.color.module-info-color.description": "Color of module info text.", + "hud.active-modules.scale.custom-scale": "Custom Scale", + "hud.active-modules.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.active-modules.scale.scale": "Scale", + "hud.active-modules.scale.scale.description": "Custom scale.", + "hud.active-modules.background.background": "Background", + "hud.active-modules.background.background.description": "Displays background.", + "hud.active-modules.background.background-color": "Background Color", + "hud.active-modules.background.background-color.description": "Color used for the background.", + "hud.armor.general.orientation": "Orientation", + "hud.armor.general.orientation.description": "How to display armor.", + "hud.armor.general.flip-order": "Flip Order", + "hud.armor.general.flip-order.description": "Flips the order of armor items.", + "hud.armor.general.show-empty": "Show Empty", + "hud.armor.general.show-empty.description": "Renders barrier icons for empty slots.", + "hud.armor.durability.durability": "Durability", + "hud.armor.durability.durability.description": "How to display armor durability.", + "hud.armor.durability.durability-color": "Durability Color", + "hud.armor.durability.durability-color.description": "Color of the text.", + "hud.armor.durability.durability-shadow": "Durability Shadow", + "hud.armor.durability.durability-shadow.description": "Text shadow.", + "hud.armor.scale.custom-scale": "Custom Scale", + "hud.armor.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.armor.scale.scale": "Scale", + "hud.armor.scale.scale.description": "Custom scale.", + "hud.armor.background.background": "Background", + "hud.armor.background.background.description": "Displays background.", + "hud.armor.background.background-color": "Background Color", + "hud.armor.background.background-color.description": "Color used for the background.", + "hud.combat.general.range": "Range", + "hud.combat.general.range.description": "The range to target players.", + "hud.combat.enchantments.displayed-enchantments": "Displayed Enchantments", + "hud.combat.enchantments.displayed-enchantments.description": "The enchantments that are shown on nametags.", + "hud.combat.enchantments.enchantment-color": "Enchantment Color", + "hud.combat.enchantments.enchantment-color.description": "Color of enchantment text.", + "hud.combat.health.health-stage-1": "Health Stage 1", + "hud.combat.health.health-stage-1.description": "The color on the left of the health gradient.", + "hud.combat.health.health-stage-2": "Health Stage 2", + "hud.combat.health.health-stage-2.description": "The color in the middle of the health gradient.", + "hud.combat.health.health-stage-3": "Health Stage 3", + "hud.combat.health.health-stage-3.description": "The color on the right of the health gradient.", + "hud.combat.distance.distance": "Distance", + "hud.combat.distance.distance.description": "Shows the distance between you and the player.", + "hud.combat.distance.distance-stage-1": "Distance Stage 1", + "hud.combat.distance.distance-stage-1.description": "The color when a player is within 10 blocks of you.", + "hud.combat.distance.distance-stage-2": "Distance Stage 2", + "hud.combat.distance.distance-stage-2.description": "The color when a player is within 50 blocks of you.", + "hud.combat.distance.distance-stage-3": "Distance Stage 3", + "hud.combat.distance.distance-stage-3.description": "The color when a player is greater then 50 blocks away from you.", + "hud.combat.ping.ping": "Ping", + "hud.combat.ping.ping.description": "Shows the player's ping.", + "hud.combat.ping.ping-stage-1": "Ping Stage 1", + "hud.combat.ping.ping-stage-1.description": "Color of ping text when under 75.", + "hud.combat.ping.ping-stage-2": "Ping Stage 2", + "hud.combat.ping.ping-stage-2.description": "Color of ping text when between 75 and 200.", + "hud.combat.ping.ping-stage-3": "Ping Stage 3", + "hud.combat.ping.ping-stage-3.description": "Color of ping text when over 200.", + "hud.combat.scale.custom-scale": "Custom Scale", + "hud.combat.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.combat.scale.scale": "Scale", + "hud.combat.scale.scale.description": "Custom scale.", + "hud.combat.background.background": "Background", + "hud.combat.background.background.description": "Displays background.", + "hud.combat.background.background-color": "Background Color", + "hud.combat.background.background-color.description": "Color used for the background.", + "hud.compass.general.type": "Type", + "hud.compass.general.type.description": "Which type of direction information to show.", + "hud.compass.general.color-north": "Color North", + "hud.compass.general.color-north.description": "Color of north.", + "hud.compass.general.color-other": "Color Other", + "hud.compass.general.color-other.description": "Color of other directions.", + "hud.compass.general.shadow": "Shadow", + "hud.compass.general.shadow.description": "Text shadow.", + "hud.compass.scale.custom-scale": "Custom Scale", + "hud.compass.scale.custom-scale.description": "Apply custom scales to this hud element.", + "hud.compass.scale.text-scale": "Text Scale", + "hud.compass.scale.text-scale.description": "Scale to use for the letters.", + "hud.compass.scale.compass-scale": "Compass Scale", + "hud.compass.scale.compass-scale.description": "Scale of the whole HUD element.", + "hud.compass.background.background": "Background", + "hud.compass.background.background.description": "Displays background.", + "hud.compass.background.background-color": "Background Color", + "hud.compass.background.background-color.description": "Color used for the background.", + "hud.hole.general.safe-blocks": "Safe Blocks", + "hud.hole.general.safe-blocks.description": "Which blocks to consider safe.", + "hud.hole.scale.custom-scale": "Custom Scale", + "hud.hole.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.hole.scale.scale": "Scale", + "hud.hole.scale.scale.description": "Custom scale.", + "hud.hole.background.background": "Background", + "hud.hole.background.background.description": "Displays background.", + "hud.hole.background.background-color": "Background Color", + "hud.hole.background.background-color.description": "Color used for the background.", + "hud.inventory.general.containers": "Containers", + "hud.inventory.general.containers.description": "Shows the contents of a container when holding them.", + "hud.inventory.scale.custom-scale": "Custom Scale", + "hud.inventory.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.inventory.scale.scale": "Scale", + "hud.inventory.scale.scale.description": "Custom scale.", + "hud.inventory.background.background": "Background", + "hud.inventory.background.background.description": "Background of inventory viewer.", + "hud.inventory.background.background-color": "Background Color", + "hud.inventory.background.background-color.description": "Color used for the background.", + "hud.item.general.item": "Item", + "hud.item.general.item.description": "Item to display", + "hud.item.general.none-mode": "None Mode", + "hud.item.general.none-mode.description": "How to render the item when you don't have the specified item in your inventory.", + "hud.item.scale.custom-scale": "Custom Scale", + "hud.item.scale.`custom-scale`.description": "Applies a custom scale to this hud element.", + "hud.item.scale.scale": "Scale", + "hud.item.scale.scale.description": "Custom scale.", + "hud.item.background.background": "Background", + "hud.item.background.background.description": "Displays background.", + "hud.item.background.background-color": "Background Color", + "hud.item.background.background-color.description": "Color used for the background.", + "hud.lag-notifier.general.shadow": "Shadow", + "hud.lag-notifier.general.shadow.description": "Text shadow.", + "hud.lag-notifier.general.text-color": "Text Color", + "hud.lag-notifier.general.text-color.description": "A.", + "hud.lag-notifier.general.color-1": "Color 1", + "hud.lag-notifier.general.color-1.description": "First color.", + "hud.lag-notifier.general.color-2": "Color 2", + "hud.lag-notifier.general.color-2.description": "Second color.", + "hud.lag-notifier.general.color-3": "Color 3", + "hud.lag-notifier.general.color-3.description": "Third color.", + "hud.lag-notifier.scale.custom-scale": "Custom Scale", + "hud.lag-notifier.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.lag-notifier.scale.scale": "Scale", + "hud.lag-notifier.scale.scale.description": "Custom scale.", + "hud.lag-notifier.background.background": "Background", + "hud.lag-notifier.background.background.description": "Displays background.", + "hud.lag-notifier.background.background-color": "Background Color", + "hud.lag-notifier.background.background-color.description": "Color used for the background.", + "hud.map.general.mode": "Mode", + "hud.map.general.mode.description": "How to determine which map to render.", + "hud.map.general.slot-index": "Slot Index", + "hud.map.general.slot-index.description": "Which slot to grab the map from.", + "hud.map.general.map-id": "Map Id", + "hud.map.general.map-id.description": "Which map id to render from. Must be in your inventory!", + "hud.map.visual.scale": "Scale", + "hud.map.visual.scale.description": "How big to render the map.", + "hud.map.visual.background": "Background", + "hud.map.visual.background.description": "Displays background.", + "hud.map.visual.background-color": "Background Color", + "hud.map.visual.background-color.description": "Color used for the background.", + "hud.module-infos.general.modules": "Modules", + "hud.module-infos.general.modules.description": "Which modules to display", + "hud.module-infos.general.additional-info": "Additional Info", + "hud.module-infos.general.additional-info.description": "Shows additional info from the module next to the name in the module info list.", + "hud.module-infos.general.text-shadow": "Text Shadow", + "hud.module-infos.general.text-shadow.description": "Renders shadow behind text.", + "hud.module-infos.general.module-color": "Module Color", + "hud.module-infos.general.module-color.description": "Module color.", + "hud.module-infos.general.on-color": "On Color", + "hud.module-infos.general.on-color.description": "Color when module is on.", + "hud.module-infos.general.off-color": "Off Color", + "hud.module-infos.general.off-color.description": "Color when module is off.", + "hud.module-infos.general.alignment": "Alignment", + "hud.module-infos.general.alignment.description": "Horizontal alignment.", + "hud.player-model.general.copy-yaw": "Copy Yaw", + "hud.player-model.general.copy-yaw.description": "Makes the player model's yaw equal to yours.", + "hud.player-model.general.custom-yaw": "Custom Yaw", + "hud.player-model.general.custom-yaw.description": "Custom yaw for when copy yaw is off.", + "hud.player-model.general.copy-pitch": "Copy Pitch", + "hud.player-model.general.copy-pitch.description": "Makes the player model's pitch equal to yours.", + "hud.player-model.general.custom-pitch": "Custom Pitch", + "hud.player-model.general.custom-pitch.description": "Custom pitch for when copy pitch is off.", + "hud.player-model.general.center-orientation": "Center Orientation", + "hud.player-model.general.center-orientation.description": "Which direction the player faces when the HUD model faces directly forward.", + "hud.player-model.scale.custom-scale": "Custom Scale", + "hud.player-model.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.player-model.scale.scale": "Scale", + "hud.player-model.scale.scale.description": "Custom scale.", + "hud.player-model.background.background": "Background", + "hud.player-model.background.background.description": "Displays background.", + "hud.player-model.background.background-color": "Background Color", + "hud.player-model.background.background-color.description": "Color used for the background.", + "hud.player-radar.general.limit": "Limit", + "hud.player-radar.general.limit.description": "The max number of players to show.", + "hud.player-radar.general.distance": "Distance", + "hud.player-radar.general.distance.description": "Shows the distance to the player next to their name.", + "hud.player-radar.general.display-friends": "Display Friends", + "hud.player-radar.general.display-friends.description": "Whether to show friends or not.", + "hud.player-radar.general.shadow": "Shadow", + "hud.player-radar.general.shadow.description": "Renders shadow behind text.", + "hud.player-radar.general.primary-color": "Primary Color", + "hud.player-radar.general.primary-color.description": "Primary color.", + "hud.player-radar.general.secondary-color": "Secondary Color", + "hud.player-radar.general.secondary-color.description": "Secondary color.", + "hud.player-radar.general.alignment": "Alignment", + "hud.player-radar.general.alignment.description": "Horizontal alignment.", + "hud.player-radar.general.border": "Border", + "hud.player-radar.general.border.description": "How much space to add around the element.", + "hud.player-radar.scale.custom-scale": "Custom Scale", + "hud.player-radar.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.player-radar.scale.scale": "Scale", + "hud.player-radar.scale.scale.description": "Custom scale.", + "hud.player-radar.background.background": "Background", + "hud.player-radar.background.background.description": "Displays background.", + "hud.player-radar.background.background-color": "Background Color", + "hud.player-radar.background.background-color.description": "Color used for the background.", + "hud.potion-timers.general.hidden-effects": "Hidden Effects", + "hud.potion-timers.general.hidden-effects.description": "Which effects not to show in the list.", + "hud.potion-timers.general.show-ambient": "Show Ambient", + "hud.potion-timers.general.show-ambient.description": "Whether to show ambient effects like from beacons and conduits.", + "hud.potion-timers.general.color-mode": "Color Mode", + "hud.potion-timers.general.color-mode.description": "What color to use for effects.", + "hud.potion-timers.general.flat-color": "Flat Color", + "hud.potion-timers.general.flat-color.description": "Color for flat color mode.", + "hud.potion-timers.general.rainbow-speed": "Rainbow Speed", + "hud.potion-timers.general.rainbow-speed.description": "Rainbow speed of rainbow color mode.", + "hud.potion-timers.general.rainbow-spread": "Rainbow Spread", + "hud.potion-timers.general.rainbow-spread.description": "Rainbow spread of rainbow color mode.", + "hud.potion-timers.general.rainbow-saturation": "Rainbow Saturation", + "hud.potion-timers.general.rainbow-saturation.description": "Saturation of rainbow color mode.", + "hud.potion-timers.general.rainbow-brightness": "Rainbow Brightness", + "hud.potion-timers.general.rainbow-brightness.description": "Brightness of rainbow color mode.", + "hud.potion-timers.general.shadow": "Shadow", + "hud.potion-timers.general.shadow.description": "Renders shadow behind text.", + "hud.potion-timers.general.alignment": "Alignment", + "hud.potion-timers.general.alignment.description": "Horizontal alignment.", + "hud.potion-timers.general.border": "Border", + "hud.potion-timers.general.border.description": "How much space to add around the element.", + "hud.potion-timers.scale.custom-scale": "Custom Scale", + "hud.potion-timers.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.potion-timers.scale.scale": "Scale", + "hud.potion-timers.scale.scale.description": "Custom scale.", + "hud.potion-timers.background.background": "Background", + "hud.potion-timers.background.background.description": "Displays background.", + "hud.potion-timers.background.background-color": "Background Color", + "hud.potion-timers.background.background-color.description": "Color used for the background.", + "hud.text.general.text": "Text", + "hud.text.general.text.description": "Text to display with Starscript.", + "hud.text.general.update-delay": "Update Delay", + "hud.text.general.update-delay.description": "Update delay in ticks", + "hud.text.general.shadow": "Shadow", + "hud.text.general.shadow.description": "Renders shadow behind text.", + "hud.text.general.border": "Border", + "hud.text.general.border.description": "How much space to add around the text.", + "hud.text.shown.shown": "Shown", + "hud.text.shown.shown.description": "When this text element is shown.", + "hud.text.shown.condition": "Condition", + "hud.text.shown.condition.description": "Condition to check when shown is not Always.", + "hud.text.scale.custom-scale": "Custom Scale", + "hud.text.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.text.scale.scale": "Scale", + "hud.text.scale.scale.description": "Custom scale.", + "hud.text.background.background": "Background", + "hud.text.background.background.description": "Displays background.", + "hud.text.background.background-color": "Background Color", + "hud.text.background.background-color.description": "Color used for the background.", + + "macro.general.name": "Name", + "macro.general.name.description": "The name of the macro.", + "macro.general.messages": "Messages", + "macro.general.messages.description": "The messages for the macro to send.", + "macro.general.keybind": "Keybind", + "macro.general.keybind.description": "The bind to run the macro.", + + "profile.general.name": "Name", + "profile.general.name.description": "The name of the profile.", + "profile.general.load-on-join": "Load On Join", + "profile.general.load-on-join.description": "Which servers to set this profile as active when joining.", + "profile.save.hud": "Hud", + "profile.save.hud.description": "Whether the profile should save hud.", + "profile.save.macros": "Macros", + "profile.save.macros.description": "Whether the profile should save macros.", + "profile.save.modules": "Modules", + "profile.save.modules.description": "Whether the profile should save modules.", + "profile.save.waypoints": "Waypoints", + "profile.save.waypoints.description": "Whether the profile should save waypoints.", + + "proxies.refreshing.threads": "Threads", + "proxies.refreshing.threads.description": "The number of concurrent threads to check proxies with.", + "proxies.refreshing.timeout": "Timeout", + "proxies.refreshing.timeout.description": "The timeout in milliseconds for checking proxies.", + "proxies.refreshing.retries-on-timeout": "Retries On Timeout", + "proxies.refreshing.retries-on-timeout.description": "How many additional times to check a proxy if the check times out.", + "proxies.cleanup.sort-by-latency": "Sort By Latency", + "proxies.cleanup.sort-by-latency.description": "Whether to sort the proxy list by latency.", + "proxies.cleanup.prune-dead": "Prune Dead", + "proxies.cleanup.prune-dead.description": "Whether to prune dead proxies.", + "proxies.cleanup.prune-by-latency": "Prune By Latency", + "proxies.cleanup.prune-by-latency.description": "Prune proxies at or above this latency in ms. 0 to disable.", + "proxies.cleanup.prune-to-count": "Prune To Count", + "proxies.cleanup.prune-to-count.description": "If in excess, prune the number of proxies to this count. 0 to disable. Prioritises by latency.", + + "proxy.general.name": "Name", + "proxy.general.name.description": "The name of the proxy.", + "proxy.general.type": "Type", + "proxy.general.type.description": "The type of proxy.", + "proxy.general.address": "Address", + "proxy.general.address.description": "The ip address of the proxy.", + "proxy.general.port": "Port", + "proxy.general.port.description": "The port of the proxy.", + "proxy.general.enabled": "Enabled", + "proxy.general.enabled.description": "Whether the proxy is enabled.", + "proxy.optional.username": "Username", + "proxy.optional.username.description": "The username of the proxy.", + "proxy.optional.password": "Password", + "proxy.optional.password.description": "The password of the proxy.", + + "waypoint.visual.name": "Name", + "waypoint.visual.name.description": "The name of the waypoint.", + "waypoint.visual.icon": "Icon", + "waypoint.visual.icon.description": "The icon of the waypoint.", + "waypoint.visual.color": "Color", + "waypoint.visual.color.description": "The color of the waypoint.", + "waypoint.visual.visible": "Visible", + "waypoint.visual.visible.description": "Whether to show the waypoint.", + "waypoint.visual.max-visible-distance": "Max Visible Distance", + "waypoint.visual.max-visible-distance.description": "How far away to render the waypoint.", + "waypoint.visual.scale": "Scale", + "waypoint.visual.scale.description": "The scale of the waypoint.", + "waypoint.position.location": "Location", + "waypoint.position.location.description": "The location of the waypoint.", + "waypoint.position.dimension": "Dimension", + "waypoint.position.dimension.description": "Which dimension the waypoint is in.", + "waypoint.position.opposite-dimension": "Opposite Dimension", + "waypoint.position.opposite-dimension.description": "Whether to show the waypoint in the opposite dimension.", + "waypoint.position.action-when-near": "Action When Near", + "waypoint.position.action-when-near.description": "Action to be performed when the player is near.", + "waypoint.position.action-when-near-distance": "Action When Near Distance", + "waypoint.position.action-when-near-distance.description": "How close (in blocks) the player has to be for the near action to be performed.", + + "theme.meteor.general.scale": "Scale", + "theme.meteor.general.scale.description": "Scale of the GUI.", + "theme.meteor.general.module-alignment": "Module Alignment", + "theme.meteor.general.module-alignment.description": "How module titles are aligned.", + "theme.meteor.general.category-icons": "Category Icons", + "theme.meteor.general.category-icons.description": "Adds item icons to module categories.", + "theme.meteor.general.hide-HUD": "Hide HUD", + "theme.meteor.general.hide-HUD.description": "Hide HUD when in GUI.", + "theme.meteor.colors.accent-color": "Accent Color", + "theme.meteor.colors.accent-color.description": "Main color of the GUI.", + "theme.meteor.colors.checkbox-color": "Checkbox Color", + "theme.meteor.colors.checkbox-color.description": "Color of checkbox.", + "theme.meteor.colors.plus-color": "Plus Color", + "theme.meteor.colors.plus-color.description": "Color of plus button.", + "theme.meteor.colors.minus-color": "Minus Color", + "theme.meteor.colors.minus-color.description": "Color of minus button.", + "theme.meteor.colors.favorite-color": "Favorite Color", + "theme.meteor.colors.favorite-color.description": "Color of checked favorite button.", + "theme.meteor.text.text-color": "Text Color", + "theme.meteor.text.text-color.description": "Color of text.", + "theme.meteor.text.text-secondary-text-color": "Text Secondary Text Color", + "theme.meteor.text.text-secondary-text-color.description": "Color of secondary text.", + "theme.meteor.text.text-highlight-color": "Text Highlight Color", + "theme.meteor.text.text-highlight-color.description": "Color of text highlighting.", + "theme.meteor.text.title-text-color": "Title Text Color", + "theme.meteor.text.title-text-color.description": "Color of title text.", + "theme.meteor.text.logged-in-text-color": "Logged In Text Color", + "theme.meteor.text.logged-in-text-color.description": "Color of logged in account name.", + "theme.meteor.text.placeholder-color": "Placeholder Color", + "theme.meteor.text.placeholder-color.description": "Color of placeholder text.", + "theme.meteor.background.background-color": "Background Color", + "theme.meteor.background.background-color.description": "Color of background.", + "theme.meteor.background.hovered-background-color": "Hovered Background Color", + "theme.meteor.background.hovered-background-color.description": "Color of background when hovered.", + "theme.meteor.background.pressed-background-color": "Pressed Background Color", + "theme.meteor.background.pressed-background-color.description": "Color of background when pressed.", + "theme.meteor.background.module-background-color": "Module Background Color", + "theme.meteor.background.module-background-color.description": "Color of module background when active.", + "theme.meteor.outline.outline-color": "Outline Color", + "theme.meteor.outline.outline-color.description": "Color of outline.", + "theme.meteor.outline.hovered-outline-color": "Hovered Outline Color", + "theme.meteor.outline.hovered-outline-color.description": "Color of outline when hovered.", + "theme.meteor.outline.pressed-outline-color": "Pressed Outline Color", + "theme.meteor.outline.pressed-outline-color.description": "Color of outline when pressed.", + "theme.meteor.separator.separator-text-color": "Separator Text Color", + "theme.meteor.separator.separator-text-color.description": "Color of separator text", + "theme.meteor.separator.separator-center-color": "Separator Center Color", + "theme.meteor.separator.separator-center-color.description": "Center color of separators.", + "theme.meteor.separator.separator-edges-color": "Separator Edges Color", + "theme.meteor.separator.separator-edges-color.description": "Color of separator edges.", + "theme.meteor.scrollbar.Scrollbar-color": "Scrollbar Color", + "theme.meteor.scrollbar.Scrollbar-color.description": "Color of Scrollbar.", + "theme.meteor.scrollbar.hovered-Scrollbar-color": "Hovered Scrollbar Color", + "theme.meteor.scrollbar.hovered-Scrollbar-color.description": "Color of Scrollbar when hovered.", + "theme.meteor.scrollbar.pressed-Scrollbar-color": "Pressed Scrollbar Color", + "theme.meteor.scrollbar.pressed-Scrollbar-color.description": "Color of Scrollbar when pressed.", + "theme.meteor.slider.slider-handle-color": "Slider Handle Color", + "theme.meteor.slider.slider-handle-color.description": "Color of slider-handle.", + "theme.meteor.slider.hovered-slider-handle-color": "Hovered Slider Handle Color", + "theme.meteor.slider.hovered-slider-handle-color.description": "Color of slider-handle when hovered.", + "theme.meteor.slider.pressed-slider-handle-color": "Pressed Slider Handle Color", + "theme.meteor.slider.pressed-slider-handle-color.description": "Color of slider-handle when pressed.", + "theme.meteor.slider.slider-left-color": "Slider Left Color", + "theme.meteor.slider.slider-left-color.description": "Color of slider left part.", + "theme.meteor.slider.slider-right-color": "Slider Right Color", + "theme.meteor.slider.slider-right-color.description": "Color of slider right part.", + "theme.meteor.starscript.starscript-text-color": "Starscript Text Color", + "theme.meteor.starscript.starscript-text-color.description": "Color of text in Starscript code.", + "theme.meteor.starscript.starscript-braces-color": "Starscript Braces Color", + "theme.meteor.starscript.starscript-braces-color.description": "Color of braces in Starscript code.", + "theme.meteor.starscript.starscript-parenthesis-color": "Starscript Parenthesis Color", + "theme.meteor.starscript.starscript-parenthesis-color.description": "Color of parenthesis in Starscript code.", + "theme.meteor.starscript.starscript-dots-color": "Starscript Dots Color", + "theme.meteor.starscript.starscript-dots-color.description": "Color of dots in starscript code.", + "theme.meteor.starscript.starscript-commas-color": "Starscript Commas Color", + "theme.meteor.starscript.starscript-commas-color.description": "Color of commas in starscript code.", + "theme.meteor.starscript.starscript-operators-color": "Starscript Operators Color", + "theme.meteor.starscript.starscript-operators-color.description": "Color of operators in Starscript code.", + "theme.meteor.starscript.starscript-strings-color": "Starscript Strings Color", + "theme.meteor.starscript.starscript-strings-color.description": "Color of strings in Starscript code.", + "theme.meteor.starscript.starscript-numbers-color": "Starscript Numbers Color", + "theme.meteor.starscript.starscript-numbers-color.description": "Color of numbers in Starscript code.", + "theme.meteor.starscript.starscript-keywords-color": "Starscript Keywords Color", + "theme.meteor.starscript.starscript-keywords-color.description": "Color of keywords in Starscript code.", + "theme.meteor.starscript.starscript-accessed-objects-color": "Starscript Accessed Objects Color", + "theme.meteor.starscript.starscript-accessed-objects-color.description": "Color of accessed objects (before a dot) in Starscript code.", + "category.combat": "Combat", "category.player": "Player", "category.movement": "Movement", @@ -167,6 +662,32 @@ "setting.group.flight": "Flight", "setting.group.range": "Range", "setting.group.smart": "Smart", + "setting.group.editor": "Editor", + "setting.group.bind": "Bind", + "setting.group.modules": "Modules", + "setting.group.chat": "Chat", + "setting.group.misc": "Misc", + "setting.group.save": "Save", + "setting.group.refreshing": "Refreshing", + "setting.group.cleanup": "Cleanup", + "setting.group.optional": "Optional", + "setting.group.position": "Position", + "setting.group.text": "Text", + "setting.group.background": "Background", + "setting.group.outline": "Outline", + "setting.group.separator": "Separator", + "setting.group.scrollbar": "Scrollbar", + "setting.group.slider": "Slider", + "setting.group.starscript": "Starscript", + "setting.group.scale": "Scale", + "setting.group.shown": "Shown", + "setting.group.durability": "Durability", + "setting.group.enchantments": "Enchantments", + "setting.group.distance": "Distance", + "setting.group.ping": "Ping", + "setting.group.anchors": "Anchors", + "setting.group.tracer": "Tracer", + "setting.group.base": "Base", "module.base.bind": "Bind", "module.base.bind.bind": "Bind: ", @@ -1320,6 +1841,17 @@ "module.block-esp.general.tracers": "Tracers", "module.block-esp.general.tracers.description": "Render tracer lines.", + "module.block-esp.data.shape-mode": "Shape Mode", + "module.block-esp.data.shape-mode.description": "How the shape is rendered.", + "module.block-esp.data.line-color": "Line Color", + "module.block-esp.data.line-color.description": "Color of lines.", + "module.block-esp.data.side-color": "Side Color", + "module.block-esp.data.side-color.description": "Color of sides.", + "module.block-esp.data.tracer": "Tracer", + "module.block-esp.data.tracer.description": "If tracer line should be drawn to this block.", + "module.block-esp.data.tracer-color": "Tracer Color", + "module.block-esp.data.tracer-color.description": "Color of the tracer line.", + "module.packet-mine": "Packet Mine", "module.packet-mine.description": "Sends packets to mine blocks without the mining animation.", "module.packet-mine.general.delay": "Delay", @@ -3144,6 +3676,56 @@ "module.marker": "Marker", "module.marker.description": "Renders shapes. Useful for large scale projects", + "marker.sphere-2d.base.name": "Name", + "marker.sphere-2d.base.name.description": "Custom name for this marker.", + "marker.sphere-2d.base.description": "Description", + "marker.sphere-2d.base.description.description": "Custom description for this marker.", + "marker.sphere-2d.base.dimension": "Dimension", + "marker.sphere-2d.base.dimension.description": "In which dimension this marker should be visible.", + "marker.sphere-2d.base.active": "Active", + "marker.sphere-2d.base.active.description": "Is this marker visible.", + "marker.sphere-2d.general.center": "Center", + "marker.sphere-2d.general.center.description": "Center of the sphere", + "marker.sphere-2d.general.radius": "Radius", + "marker.sphere-2d.general.radius.description": "Radius of the sphere", + "marker.sphere-2d.general.layer": "Layer", + "marker.sphere-2d.general.layer.description": "Which layer to render", + "marker.sphere-2d.render.limit-render-range": "Limit Render Range", + "marker.sphere-2d.render.limit-render-range.description": "Whether to limit rendering range (useful in very large circles)", + "marker.sphere-2d.render.render-range": "Render Range", + "marker.sphere-2d.render.render-range.description": "Rendering range", + "marker.sphere-2d.render.shape-mode": "Shape Mode", + "marker.sphere-2d.render.shape-mode.description": "How the shapes are rendered.", + "marker.sphere-2d.render.side-color": "Side Color", + "marker.sphere-2d.render.side-color.description": "The color of the sides of the blocks being rendered.", + "marker.sphere-2d.render.line-color": "Line Color", + "marker.sphere-2d.render.line-color.description": "The color of the lines of the blocks being rendered.", + "marker.sphere-2d.keybinding.next-layer-keybind": "Next Layer Keybind", + "marker.sphere-2d.keybinding.next-layer-keybind.description": "Keybind to increment layer", + "marker.sphere-2d.keybinding.prev-layer-keybind": "Prev Layer Keybind", + "marker.sphere-2d.keybinding.prev-layer-keybind.description": "Keybind to increment layer", + "marker.cuboid.base.name": "Name", + "marker.cuboid.base.name.description": "Custom name for this marker.", + "marker.cuboid.base.description": "Description", + "marker.cuboid.base.description.description": "Custom description for this marker.", + "marker.cuboid.base.dimension": "Dimension", + "marker.cuboid.base.dimension.description": "In which dimension this marker should be visible.", + "marker.cuboid.base.active": "Active", + "marker.cuboid.base.active.description": "Is this marker visible.", + "marker.cuboid.general.pos-1": "Pos 1", + "marker.cuboid.general.pos-1.description": "1st corner of the cuboid", + "marker.cuboid.general.pos-2": "Pos 2", + "marker.cuboid.general.pos-2.description": "2nd corner of the cuboid", + "marker.cuboid.render.mode": "Mode", + "marker.cuboid.render.mode.description": "What mode to use for this marker.", + "marker.cuboid.render.shape-mode": "Shape Mode", + "marker.cuboid.render.shape-mode.description": "How the shapes are rendered.", + "marker.cuboid.render.side-color": "Side Color", + "marker.cuboid.render.side-color.description": "The color of the sides of the blocks being rendered.", + "marker.cuboid.render.line-color": "Line Color", + "marker.cuboid.render.line-color.description": "The color of the lines of the blocks being rendered.", + + "module.criticals": "Criticals", "module.criticals.description": "Performs critical attacks when you hit your target.", "module.criticals.general.mode": "Mode", diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index 718c010de5..bc9f17c8bd 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -1,5 +1,5 @@ { - "meteor.lang.translators" : "MeteorDevelopment", + "meteor.lang.translators": "MeteorDevelopment", "meteor.key.category": "Meteor Client", "meteor.key.open-commands": "Open Commands", @@ -74,6 +74,501 @@ "command.wasp.info.target": "%s set as target.", "command.waypoint.description": "Manages waypoints.", + "config.visual.custom-font": "Custom Font", + "config.visual.custom-font.description": "Use a custom font.", + "config.visual.font": "Font", + "config.visual.font.description": "Custom font to use.", + "config.visual.rainbow-speed": "Rainbow Speed", + "config.visual.rainbow-speed.description": "The global rainbow speed.", + "config.visual.title-screen-credits": "Title Screen Credits", + "config.visual.title-screen-credits.description": "Show Meteor credits on title screen", + "config.visual.title-screen-splashes": "Title Screen Splashes", + "config.visual.title-screen-splashes.description": "Show Meteor splash texts on title screen", + "config.visual.custom-window-title": "Custom Window Title", + "config.visual.custom-window-title.description": "Show custom text in the window title.", + "config.visual.window-title-text": "Window Title Text", + "config.visual.window-title-text.description": "The text it displays in the window title.", + "config.visual.friend-color": "Friend Color", + "config.visual.friend-color.description": "The color used to show friends.", + "config.visual.sync-list-setting-widths": "Sync List Setting Widths", + "config.visual.sync-list-setting-widths.description": "Prevents the list setting screens from moving around as you add & remove elements.", + "config.modules.hidden-modules": "Hidden Modules", + "config.modules.hidden-modules.description": "Prevent these modules from being rendered as options in the clickgui.", + "config.modules.module-search-count": "Module Search Count", + "config.modules.module-search-count.description": "Amount of modules and settings to be shown in the module search bar.", + "config.modules.search-module-aliases": "Search Module Aliases", + "config.modules.search-module-aliases.description": "Whether or not module aliases will be used in the module search bar.", + "config.chat.prefix": "Prefix", + "config.chat.prefix.description": "Prefix.", + "config.chat.chat-feedback": "Chat Feedback", + "config.chat.chat-feedback.description": "Sends chat feedback when meteor performs certain actions.", + "config.chat.delete-chat-feedback": "Delete Chat Feedback", + "config.chat.delete-chat-feedback.description": "Delete previous matching chat feedback to keep chat clear.", + "config.misc.rotation-hold": "Rotation Hold", + "config.misc.rotation-hold.description": "Hold long to hold server side rotation when not sending any packets.", + "config.misc.use-team-color": "Use Team Color", + "config.misc.use-team-color.description": "Uses player's team color for rendering things like esp and tracers.", + + "hud.general.custom-font": "Custom Font", + "hud.general.custom-font.description": "Text will use custom font.", + "hud.general.hide-in-menus": "Hide In Menus", + "hud.general.hide-in-menus.description": "Hides the meteor hud when in inventory screens or game menus.", + "hud.general.text-scale": "Text Scale", + "hud.general.text-scale.description": "Scale of text if not overridden by the element.", + "hud.general.text-colors": "Text Colors", + "hud.general.text-colors.description": "Colors used for the Text element.", + "hud.editor.border": "Border", + "hud.editor.border.description": "Space around the edges of the screen.", + "hud.editor.snapping-range": "Snapping Range", + "hud.editor.snapping-range.description": "Snapping range in editor.", + "hud.bind.bind": "Bind", + "hud.bind.bind.description": "Keybind for toggling the hud", + + "hud.base.anchors.auto-anchors": "Automatically assigns anchors based on the position.", + "hud.base.anchors.x-anchor": "Horizontal anchor.", + "hud.base.anchors.y-anchor": "Vertical anchor.", + + "hud.active-modules.general.sort": "Sort", + "hud.active-modules.general.sort.description": "How to sort active modules.", + "hud.active-modules.general.hidden-modules": "Hidden Modules", + "hud.active-modules.general.hidden-modules.description": "Which modules not to show in the list.", + "hud.active-modules.general.module-info": "Module Info", + "hud.active-modules.general.module-info.description": "Shows info from the module next to the name in the active modules list.", + "hud.active-modules.general.show-keybind": "Show Keybind", + "hud.active-modules.general.show-keybind.description": "Shows the module's keybind next to its name.", + "hud.active-modules.general.shadow": "Shadow", + "hud.active-modules.general.shadow.description": "Renders shadow behind text.", + "hud.active-modules.general.outlines": "Outlines", + "hud.active-modules.general.outlines.description": "Whether or not to render outlines", + "hud.active-modules.general.outline-width": "Outline Width", + "hud.active-modules.general.outline-width.description": "Outline width", + "hud.active-modules.general.alignment": "Alignment", + "hud.active-modules.general.alignment.description": "Horizontal alignment.", + "hud.active-modules.color.color-mode": "Color Mode", + "hud.active-modules.color.color-mode.description": "What color to use for active modules.", + "hud.active-modules.color.flat-color": "Flat Color", + "hud.active-modules.color.flat-color.description": "Color for flat color mode.", + "hud.active-modules.color.rainbow-speed": "Rainbow Speed", + "hud.active-modules.color.rainbow-speed.description": "Rainbow speed of rainbow color mode.", + "hud.active-modules.color.rainbow-spread": "Rainbow Spread", + "hud.active-modules.color.rainbow-spread.description": "Rainbow spread of rainbow color mode.", + "hud.active-modules.color.rainbow-saturation": "Rainbow Saturation", + "hud.active-modules.color.rainbow-saturation.description": "", + "hud.active-modules.color.rainbow-brightness": "Rainbow Brightness", + "hud.active-modules.color.rainbow-brightness.description": "", + "hud.active-modules.color.module-info-color": "Module Info Color", + "hud.active-modules.color.module-info-color.description": "Color of module info text.", + "hud.active-modules.scale.custom-scale": "Custom Scale", + "hud.active-modules.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.active-modules.scale.scale": "Scale", + "hud.active-modules.scale.scale.description": "Custom scale.", + "hud.active-modules.background.background": "Background", + "hud.active-modules.background.background.description": "Displays background.", + "hud.active-modules.background.background-color": "Background Color", + "hud.active-modules.background.background-color.description": "Color used for the background.", + "hud.armor.general.orientation": "Orientation", + "hud.armor.general.orientation.description": "How to display armor.", + "hud.armor.general.flip-order": "Flip Order", + "hud.armor.general.flip-order.description": "Flips the order of armor items.", + "hud.armor.general.show-empty": "Show Empty", + "hud.armor.general.show-empty.description": "Renders barrier icons for empty slots.", + "hud.armor.durability.durability": "Durability", + "hud.armor.durability.durability.description": "How to display armor durability.", + "hud.armor.durability.durability-color": "Durability Color", + "hud.armor.durability.durability-color.description": "Color of the text.", + "hud.armor.durability.durability-shadow": "Durability Shadow", + "hud.armor.durability.durability-shadow.description": "Text shadow.", + "hud.armor.scale.custom-scale": "Custom Scale", + "hud.armor.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.armor.scale.scale": "Scale", + "hud.armor.scale.scale.description": "Custom scale.", + "hud.armor.background.background": "Background", + "hud.armor.background.background.description": "Displays background.", + "hud.armor.background.background-color": "Background Color", + "hud.armor.background.background-color.description": "Color used for the background.", + "hud.combat.general.range": "Range", + "hud.combat.general.range.description": "The range to target players.", + "hud.combat.enchantments.displayed-enchantments": "Displayed Enchantments", + "hud.combat.enchantments.displayed-enchantments.description": "The enchantments that are shown on nametags.", + "hud.combat.enchantments.enchantment-color": "Enchantment Color", + "hud.combat.enchantments.enchantment-color.description": "Color of enchantment text.", + "hud.combat.health.health-stage-1": "Health Stage 1", + "hud.combat.health.health-stage-1.description": "The color on the left of the health gradient.", + "hud.combat.health.health-stage-2": "Health Stage 2", + "hud.combat.health.health-stage-2.description": "The color in the middle of the health gradient.", + "hud.combat.health.health-stage-3": "Health Stage 3", + "hud.combat.health.health-stage-3.description": "The color on the right of the health gradient.", + "hud.combat.distance.distance": "Distance", + "hud.combat.distance.distance.description": "Shows the distance between you and the player.", + "hud.combat.distance.distance-stage-1": "Distance Stage 1", + "hud.combat.distance.distance-stage-1.description": "The color when a player is within 10 blocks of you.", + "hud.combat.distance.distance-stage-2": "Distance Stage 2", + "hud.combat.distance.distance-stage-2.description": "The color when a player is within 50 blocks of you.", + "hud.combat.distance.distance-stage-3": "Distance Stage 3", + "hud.combat.distance.distance-stage-3.description": "The color when a player is greater then 50 blocks away from you.", + "hud.combat.ping.ping": "Ping", + "hud.combat.ping.ping.description": "Shows the player's ping.", + "hud.combat.ping.ping-stage-1": "Ping Stage 1", + "hud.combat.ping.ping-stage-1.description": "Color of ping text when under 75.", + "hud.combat.ping.ping-stage-2": "Ping Stage 2", + "hud.combat.ping.ping-stage-2.description": "Color of ping text when between 75 and 200.", + "hud.combat.ping.ping-stage-3": "Ping Stage 3", + "hud.combat.ping.ping-stage-3.description": "Color of ping text when over 200.", + "hud.combat.scale.custom-scale": "Custom Scale", + "hud.combat.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.combat.scale.scale": "Scale", + "hud.combat.scale.scale.description": "Custom scale.", + "hud.combat.background.background": "Background", + "hud.combat.background.background.description": "Displays background.", + "hud.combat.background.background-color": "Background Color", + "hud.combat.background.background-color.description": "Color used for the background.", + "hud.compass.general.type": "Type", + "hud.compass.general.type.description": "Which type of direction information to show.", + "hud.compass.general.color-north": "Color North", + "hud.compass.general.color-north.description": "Color of north.", + "hud.compass.general.color-other": "Color Other", + "hud.compass.general.color-other.description": "Color of other directions.", + "hud.compass.general.shadow": "Shadow", + "hud.compass.general.shadow.description": "Text shadow.", + "hud.compass.scale.custom-scale": "Custom Scale", + "hud.compass.scale.custom-scale.description": "Apply custom scales to this hud element.", + "hud.compass.scale.text-scale": "Text Scale", + "hud.compass.scale.text-scale.description": "Scale to use for the letters.", + "hud.compass.scale.compass-scale": "Compass Scale", + "hud.compass.scale.compass-scale.description": "Scale of the whole HUD element.", + "hud.compass.background.background": "Background", + "hud.compass.background.background.description": "Displays background.", + "hud.compass.background.background-color": "Background Color", + "hud.compass.background.background-color.description": "Color used for the background.", + "hud.hole.general.safe-blocks": "Safe Blocks", + "hud.hole.general.safe-blocks.description": "Which blocks to consider safe.", + "hud.hole.scale.custom-scale": "Custom Scale", + "hud.hole.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.hole.scale.scale": "Scale", + "hud.hole.scale.scale.description": "Custom scale.", + "hud.hole.background.background": "Background", + "hud.hole.background.background.description": "Displays background.", + "hud.hole.background.background-color": "Background Color", + "hud.hole.background.background-color.description": "Color used for the background.", + "hud.inventory.general.containers": "Containers", + "hud.inventory.general.containers.description": "Shows the contents of a container when holding them.", + "hud.inventory.scale.custom-scale": "Custom Scale", + "hud.inventory.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.inventory.scale.scale": "Scale", + "hud.inventory.scale.scale.description": "Custom scale.", + "hud.inventory.background.background": "Background", + "hud.inventory.background.background.description": "Background of inventory viewer.", + "hud.inventory.background.background-color": "Background Color", + "hud.inventory.background.background-color.description": "Color used for the background.", + "hud.item.general.item": "Item", + "hud.item.general.item.description": "Item to display", + "hud.item.general.none-mode": "None Mode", + "hud.item.general.none-mode.description": "How to render the item when you don't have the specified item in your inventory.", + "hud.item.scale.custom-scale": "Custom Scale", + "hud.item.scale.`custom-scale`.description": "Applies a custom scale to this hud element.", + "hud.item.scale.scale": "Scale", + "hud.item.scale.scale.description": "Custom scale.", + "hud.item.background.background": "Background", + "hud.item.background.background.description": "Displays background.", + "hud.item.background.background-color": "Background Color", + "hud.item.background.background-color.description": "Color used for the background.", + "hud.lag-notifier.general.shadow": "Shadow", + "hud.lag-notifier.general.shadow.description": "Text shadow.", + "hud.lag-notifier.general.text-color": "Text Color", + "hud.lag-notifier.general.text-color.description": "A.", + "hud.lag-notifier.general.color-1": "Color 1", + "hud.lag-notifier.general.color-1.description": "First color.", + "hud.lag-notifier.general.color-2": "Color 2", + "hud.lag-notifier.general.color-2.description": "Second color.", + "hud.lag-notifier.general.color-3": "Color 3", + "hud.lag-notifier.general.color-3.description": "Third color.", + "hud.lag-notifier.scale.custom-scale": "Custom Scale", + "hud.lag-notifier.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.lag-notifier.scale.scale": "Scale", + "hud.lag-notifier.scale.scale.description": "Custom scale.", + "hud.lag-notifier.background.background": "Background", + "hud.lag-notifier.background.background.description": "Displays background.", + "hud.lag-notifier.background.background-color": "Background Color", + "hud.lag-notifier.background.background-color.description": "Color used for the background.", + "hud.map.general.mode": "Mode", + "hud.map.general.mode.description": "How to determine which map to render.", + "hud.map.general.slot-index": "Slot Index", + "hud.map.general.slot-index.description": "Which slot to grab the map from.", + "hud.map.general.map-id": "Map Id", + "hud.map.general.map-id.description": "Which map id to render from. Must be in your inventory!", + "hud.map.visual.scale": "Scale", + "hud.map.visual.scale.description": "How big to render the map.", + "hud.map.visual.background": "Background", + "hud.map.visual.background.description": "Displays background.", + "hud.map.visual.background-color": "Background Color", + "hud.map.visual.background-color.description": "Color used for the background.", + "hud.module-infos.general.modules": "Modules", + "hud.module-infos.general.modules.description": "Which modules to display", + "hud.module-infos.general.additional-info": "Additional Info", + "hud.module-infos.general.additional-info.description": "Shows additional info from the module next to the name in the module info list.", + "hud.module-infos.general.text-shadow": "Text Shadow", + "hud.module-infos.general.text-shadow.description": "Renders shadow behind text.", + "hud.module-infos.general.module-color": "Module Color", + "hud.module-infos.general.module-color.description": "Module color.", + "hud.module-infos.general.on-color": "On Color", + "hud.module-infos.general.on-color.description": "Color when module is on.", + "hud.module-infos.general.off-color": "Off Color", + "hud.module-infos.general.off-color.description": "Color when module is off.", + "hud.module-infos.general.alignment": "Alignment", + "hud.module-infos.general.alignment.description": "Horizontal alignment.", + "hud.player-model.general.copy-yaw": "Copy Yaw", + "hud.player-model.general.copy-yaw.description": "Makes the player model's yaw equal to yours.", + "hud.player-model.general.custom-yaw": "Custom Yaw", + "hud.player-model.general.custom-yaw.description": "Custom yaw for when copy yaw is off.", + "hud.player-model.general.copy-pitch": "Copy Pitch", + "hud.player-model.general.copy-pitch.description": "Makes the player model's pitch equal to yours.", + "hud.player-model.general.custom-pitch": "Custom Pitch", + "hud.player-model.general.custom-pitch.description": "Custom pitch for when copy pitch is off.", + "hud.player-model.general.center-orientation": "Center Orientation", + "hud.player-model.general.center-orientation.description": "Which direction the player faces when the HUD model faces directly forward.", + "hud.player-model.scale.custom-scale": "Custom Scale", + "hud.player-model.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.player-model.scale.scale": "Scale", + "hud.player-model.scale.scale.description": "Custom scale.", + "hud.player-model.background.background": "Background", + "hud.player-model.background.background.description": "Displays background.", + "hud.player-model.background.background-color": "Background Color", + "hud.player-model.background.background-color.description": "Color used for the background.", + "hud.player-radar.general.limit": "Limit", + "hud.player-radar.general.limit.description": "The max number of players to show.", + "hud.player-radar.general.distance": "Distance", + "hud.player-radar.general.distance.description": "Shows the distance to the player next to their name.", + "hud.player-radar.general.display-friends": "Display Friends", + "hud.player-radar.general.display-friends.description": "Whether to show friends or not.", + "hud.player-radar.general.shadow": "Shadow", + "hud.player-radar.general.shadow.description": "Renders shadow behind text.", + "hud.player-radar.general.primary-color": "Primary Color", + "hud.player-radar.general.primary-color.description": "Primary color.", + "hud.player-radar.general.secondary-color": "Secondary Color", + "hud.player-radar.general.secondary-color.description": "Secondary color.", + "hud.player-radar.general.alignment": "Alignment", + "hud.player-radar.general.alignment.description": "Horizontal alignment.", + "hud.player-radar.general.border": "Border", + "hud.player-radar.general.border.description": "How much space to add around the element.", + "hud.player-radar.scale.custom-scale": "Custom Scale", + "hud.player-radar.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.player-radar.scale.scale": "Scale", + "hud.player-radar.scale.scale.description": "Custom scale.", + "hud.player-radar.background.background": "Background", + "hud.player-radar.background.background.description": "Displays background.", + "hud.player-radar.background.background-color": "Background Color", + "hud.player-radar.background.background-color.description": "Color used for the background.", + "hud.potion-timers.general.hidden-effects": "Hidden Effects", + "hud.potion-timers.general.hidden-effects.description": "Which effects not to show in the list.", + "hud.potion-timers.general.show-ambient": "Show Ambient", + "hud.potion-timers.general.show-ambient.description": "Whether to show ambient effects like from beacons and conduits.", + "hud.potion-timers.general.color-mode": "Color Mode", + "hud.potion-timers.general.color-mode.description": "What color to use for effects.", + "hud.potion-timers.general.flat-color": "Flat Color", + "hud.potion-timers.general.flat-color.description": "Color for flat color mode.", + "hud.potion-timers.general.rainbow-speed": "Rainbow Speed", + "hud.potion-timers.general.rainbow-speed.description": "Rainbow speed of rainbow color mode.", + "hud.potion-timers.general.rainbow-spread": "Rainbow Spread", + "hud.potion-timers.general.rainbow-spread.description": "Rainbow spread of rainbow color mode.", + "hud.potion-timers.general.rainbow-saturation": "Rainbow Saturation", + "hud.potion-timers.general.rainbow-saturation.description": "Saturation of rainbow color mode.", + "hud.potion-timers.general.rainbow-brightness": "Rainbow Brightness", + "hud.potion-timers.general.rainbow-brightness.description": "Brightness of rainbow color mode.", + "hud.potion-timers.general.shadow": "Shadow", + "hud.potion-timers.general.shadow.description": "Renders shadow behind text.", + "hud.potion-timers.general.alignment": "Alignment", + "hud.potion-timers.general.alignment.description": "Horizontal alignment.", + "hud.potion-timers.general.border": "Border", + "hud.potion-timers.general.border.description": "How much space to add around the element.", + "hud.potion-timers.scale.custom-scale": "Custom Scale", + "hud.potion-timers.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.potion-timers.scale.scale": "Scale", + "hud.potion-timers.scale.scale.description": "Custom scale.", + "hud.potion-timers.background.background": "Background", + "hud.potion-timers.background.background.description": "Displays background.", + "hud.potion-timers.background.background-color": "Background Color", + "hud.potion-timers.background.background-color.description": "Color used for the background.", + "hud.text.general.text": "Text", + "hud.text.general.text.description": "Text to display with Starscript.", + "hud.text.general.update-delay": "Update Delay", + "hud.text.general.update-delay.description": "Update delay in ticks", + "hud.text.general.shadow": "Shadow", + "hud.text.general.shadow.description": "Renders shadow behind text.", + "hud.text.general.border": "Border", + "hud.text.general.border.description": "How much space to add around the text.", + "hud.text.shown.shown": "Shown", + "hud.text.shown.shown.description": "When this text element is shown.", + "hud.text.shown.condition": "Condition", + "hud.text.shown.condition.description": "Condition to check when shown is not Always.", + "hud.text.scale.custom-scale": "Custom Scale", + "hud.text.scale.custom-scale.description": "Applies a custom scale to this hud element.", + "hud.text.scale.scale": "Scale", + "hud.text.scale.scale.description": "Custom scale.", + "hud.text.background.background": "Background", + "hud.text.background.background.description": "Displays background.", + "hud.text.background.background-color": "Background Color", + "hud.text.background.background-color.description": "Color used for the background.", + + "macro.general.name": "Name", + "macro.general.name.description": "The name of the macro.", + "macro.general.messages": "Messages", + "macro.general.messages.description": "The messages for the macro to send.", + "macro.general.keybind": "Keybind", + "macro.general.keybind.description": "The bind to run the macro.", + + "profile.general.name": "Name", + "profile.general.name.description": "The name of the profile.", + "profile.general.load-on-join": "Load On Join", + "profile.general.load-on-join.description": "Which servers to set this profile as active when joining.", + "profile.save.hud": "Hud", + "profile.save.hud.description": "Whether the profile should save hud.", + "profile.save.macros": "Macros", + "profile.save.macros.description": "Whether the profile should save macros.", + "profile.save.modules": "Modules", + "profile.save.modules.description": "Whether the profile should save modules.", + "profile.save.waypoints": "Waypoints", + "profile.save.waypoints.description": "Whether the profile should save waypoints.", + + "proxies.refreshing.threads": "Threads", + "proxies.refreshing.threads.description": "The number of concurrent threads to check proxies with.", + "proxies.refreshing.timeout": "Timeout", + "proxies.refreshing.timeout.description": "The timeout in milliseconds for checking proxies.", + "proxies.refreshing.retries-on-timeout": "Retries On Timeout", + "proxies.refreshing.retries-on-timeout.description": "How many additional times to check a proxy if the check times out.", + "proxies.cleanup.sort-by-latency": "Sort By Latency", + "proxies.cleanup.sort-by-latency.description": "Whether to sort the proxy list by latency.", + "proxies.cleanup.prune-dead": "Prune Dead", + "proxies.cleanup.prune-dead.description": "Whether to prune dead proxies.", + "proxies.cleanup.prune-by-latency": "Prune By Latency", + "proxies.cleanup.prune-by-latency.description": "Prune proxies at or above this latency in ms. 0 to disable.", + "proxies.cleanup.prune-to-count": "Prune To Count", + "proxies.cleanup.prune-to-count.description": "If in excess, prune the number of proxies to this count. 0 to disable. Prioritises by latency.", + + "proxy.general.name": "Name", + "proxy.general.name.description": "The name of the proxy.", + "proxy.general.type": "Type", + "proxy.general.type.description": "The type of proxy.", + "proxy.general.address": "Address", + "proxy.general.address.description": "The ip address of the proxy.", + "proxy.general.port": "Port", + "proxy.general.port.description": "The port of the proxy.", + "proxy.general.enabled": "Enabled", + "proxy.general.enabled.description": "Whether the proxy is enabled.", + "proxy.optional.username": "Username", + "proxy.optional.username.description": "The username of the proxy.", + "proxy.optional.password": "Password", + "proxy.optional.password.description": "The password of the proxy.", + + "waypoint.visual.name": "Name", + "waypoint.visual.name.description": "The name of the waypoint.", + "waypoint.visual.icon": "Icon", + "waypoint.visual.icon.description": "The icon of the waypoint.", + "waypoint.visual.color": "Color", + "waypoint.visual.color.description": "The color of the waypoint.", + "waypoint.visual.visible": "Visible", + "waypoint.visual.visible.description": "Whether to show the waypoint.", + "waypoint.visual.max-visible-distance": "Max Visible Distance", + "waypoint.visual.max-visible-distance.description": "How far away to render the waypoint.", + "waypoint.visual.scale": "Scale", + "waypoint.visual.scale.description": "The scale of the waypoint.", + "waypoint.position.location": "Location", + "waypoint.position.location.description": "The location of the waypoint.", + "waypoint.position.dimension": "Dimension", + "waypoint.position.dimension.description": "Which dimension the waypoint is in.", + "waypoint.position.opposite-dimension": "Opposite Dimension", + "waypoint.position.opposite-dimension.description": "Whether to show the waypoint in the opposite dimension.", + "waypoint.position.action-when-near": "Action When Near", + "waypoint.position.action-when-near.description": "Action to be performed when the player is near.", + "waypoint.position.action-when-near-distance": "Action When Near Distance", + "waypoint.position.action-when-near-distance.description": "How close (in blocks) the player has to be for the near action to be performed.", + + "theme.meteor.general.scale": "Scale", + "theme.meteor.general.scale.description": "Scale of the GUI.", + "theme.meteor.general.module-alignment": "Module Alignment", + "theme.meteor.general.module-alignment.description": "How module titles are aligned.", + "theme.meteor.general.category-icons": "Category Icons", + "theme.meteor.general.category-icons.description": "Adds item icons to module categories.", + "theme.meteor.general.hide-HUD": "Hide HUD", + "theme.meteor.general.hide-HUD.description": "Hide HUD when in GUI.", + "theme.meteor.colors.accent-color": "Accent Color", + "theme.meteor.colors.accent-color.description": "Main color of the GUI.", + "theme.meteor.colors.checkbox-color": "Checkbox Color", + "theme.meteor.colors.checkbox-color.description": "Color of checkbox.", + "theme.meteor.colors.plus-color": "Plus Color", + "theme.meteor.colors.plus-color.description": "Color of plus button.", + "theme.meteor.colors.minus-color": "Minus Color", + "theme.meteor.colors.minus-color.description": "Color of minus button.", + "theme.meteor.colors.favorite-color": "Favorite Color", + "theme.meteor.colors.favorite-color.description": "Color of checked favorite button.", + "theme.meteor.text.text-color": "Text Color", + "theme.meteor.text.text-color.description": "Color of text.", + "theme.meteor.text.text-secondary-text-color": "Text Secondary Text Color", + "theme.meteor.text.text-secondary-text-color.description": "Color of secondary text.", + "theme.meteor.text.text-highlight-color": "Text Highlight Color", + "theme.meteor.text.text-highlight-color.description": "Color of text highlighting.", + "theme.meteor.text.title-text-color": "Title Text Color", + "theme.meteor.text.title-text-color.description": "Color of title text.", + "theme.meteor.text.logged-in-text-color": "Logged In Text Color", + "theme.meteor.text.logged-in-text-color.description": "Color of logged in account name.", + "theme.meteor.text.placeholder-color": "Placeholder Color", + "theme.meteor.text.placeholder-color.description": "Color of placeholder text.", + "theme.meteor.background.background-color": "Background Color", + "theme.meteor.background.background-color.description": "Color of background.", + "theme.meteor.background.hovered-background-color": "Hovered Background Color", + "theme.meteor.background.hovered-background-color.description": "Color of background when hovered.", + "theme.meteor.background.pressed-background-color": "Pressed Background Color", + "theme.meteor.background.pressed-background-color.description": "Color of background when pressed.", + "theme.meteor.background.module-background-color": "Module Background Color", + "theme.meteor.background.module-background-color.description": "Color of module background when active.", + "theme.meteor.outline.outline-color": "Outline Color", + "theme.meteor.outline.outline-color.description": "Color of outline.", + "theme.meteor.outline.hovered-outline-color": "Hovered Outline Color", + "theme.meteor.outline.hovered-outline-color.description": "Color of outline when hovered.", + "theme.meteor.outline.pressed-outline-color": "Pressed Outline Color", + "theme.meteor.outline.pressed-outline-color.description": "Color of outline when pressed.", + "theme.meteor.separator.separator-text-color": "Separator Text Color", + "theme.meteor.separator.separator-text-color.description": "Color of separator text", + "theme.meteor.separator.separator-center-color": "Separator Center Color", + "theme.meteor.separator.separator-center-color.description": "Center color of separators.", + "theme.meteor.separator.separator-edges-color": "Separator Edges Color", + "theme.meteor.separator.separator-edges-color.description": "Color of separator edges.", + "theme.meteor.scrollbar.Scrollbar-color": "Scrollbar Color", + "theme.meteor.scrollbar.Scrollbar-color.description": "Color of Scrollbar.", + "theme.meteor.scrollbar.hovered-Scrollbar-color": "Hovered Scrollbar Color", + "theme.meteor.scrollbar.hovered-Scrollbar-color.description": "Color of Scrollbar when hovered.", + "theme.meteor.scrollbar.pressed-Scrollbar-color": "Pressed Scrollbar Color", + "theme.meteor.scrollbar.pressed-Scrollbar-color.description": "Color of Scrollbar when pressed.", + "theme.meteor.slider.slider-handle-color": "Slider Handle Color", + "theme.meteor.slider.slider-handle-color.description": "Color of slider-handle.", + "theme.meteor.slider.hovered-slider-handle-color": "Hovered Slider Handle Color", + "theme.meteor.slider.hovered-slider-handle-color.description": "Color of slider-handle when hovered.", + "theme.meteor.slider.pressed-slider-handle-color": "Pressed Slider Handle Color", + "theme.meteor.slider.pressed-slider-handle-color.description": "Color of slider-handle when pressed.", + "theme.meteor.slider.slider-left-color": "Slider Left Color", + "theme.meteor.slider.slider-left-color.description": "Color of slider left part.", + "theme.meteor.slider.slider-right-color": "Slider Right Color", + "theme.meteor.slider.slider-right-color.description": "Color of slider right part.", + "theme.meteor.starscript.starscript-text-color": "Starscript Text Color", + "theme.meteor.starscript.starscript-text-color.description": "Color of text in Starscript code.", + "theme.meteor.starscript.starscript-braces-color": "Starscript Braces Color", + "theme.meteor.starscript.starscript-braces-color.description": "Color of braces in Starscript code.", + "theme.meteor.starscript.starscript-parenthesis-color": "Starscript Parenthesis Color", + "theme.meteor.starscript.starscript-parenthesis-color.description": "Color of parenthesis in Starscript code.", + "theme.meteor.starscript.starscript-dots-color": "Starscript Dots Color", + "theme.meteor.starscript.starscript-dots-color.description": "Color of dots in starscript code.", + "theme.meteor.starscript.starscript-commas-color": "Starscript Commas Color", + "theme.meteor.starscript.starscript-commas-color.description": "Color of commas in starscript code.", + "theme.meteor.starscript.starscript-operators-color": "Starscript Operators Color", + "theme.meteor.starscript.starscript-operators-color.description": "Color of operators in Starscript code.", + "theme.meteor.starscript.starscript-strings-color": "Starscript Strings Color", + "theme.meteor.starscript.starscript-strings-color.description": "Color of strings in Starscript code.", + "theme.meteor.starscript.starscript-numbers-color": "Starscript Numbers Color", + "theme.meteor.starscript.starscript-numbers-color.description": "Color of numbers in Starscript code.", + "theme.meteor.starscript.starscript-keywords-color": "Starscript Keywords Color", + "theme.meteor.starscript.starscript-keywords-color.description": "Color of keywords in Starscript code.", + "theme.meteor.starscript.starscript-accessed-objects-color": "Starscript Accessed Objects Color", + "theme.meteor.starscript.starscript-accessed-objects-color.description": "Color of accessed objects (before a dot) in Starscript code.", + "category.combat": "Combat", "category.player": "Player", "category.movement": "Movement", @@ -167,6 +662,38 @@ "setting.group.flight": "Flight", "setting.group.range": "Range", "setting.group.smart": "Smart", + "setting.group.editor": "Editor", + "setting.group.bind": "Bind", + "setting.group.modules": "Modules", + "setting.group.chat": "Chat", + "setting.group.misc": "Misc", + "setting.group.save": "Save", + "setting.group.refreshing": "Refreshing", + "setting.group.cleanup": "Cleanup", + "setting.group.optional": "Optional", + "setting.group.position": "Position", + "setting.group.text": "Text", + "setting.group.background": "Background", + "setting.group.outline": "Outline", + "setting.group.separator": "Separator", + "setting.group.scrollbar": "Scrollbar", + "setting.group.slider": "Slider", + "setting.group.starscript": "Starscript", + "setting.group.scale": "Scale", + "setting.group.shown": "Shown", + "setting.group.durability": "Durability", + "setting.group.enchantments": "Enchantments", + "setting.group.distance": "Distance", + "setting.group.ping": "Ping", + "setting.group.anchors": "Anchors", + "setting.group.tracer": "Tracer", + "setting.group.base": "Base", + "setting.group.strings": "Strings", + "setting.group.whole-numbers": "Whole Numbers", + "setting.group.numbers": "Numbers", + "setting.group.checkboxes": "Checkboxes", + "setting.group.block-lists": "Block Lists", + "setting.group.item-lists": "Item Lists", "module.base.bind": "Bind", "module.base.bind.bind": "Bind: ", @@ -1320,6 +1847,17 @@ "module.block-esp.general.tracers": "Tracers", "module.block-esp.general.tracers.description": "Render tracer lines.", + "module.block-esp.data.shape-mode": "Shape Mode", + "module.block-esp.data.shape-mode.description": "How the shape is rendered.", + "module.block-esp.data.line-color": "Line Color", + "module.block-esp.data.line-color.description": "Color of lines.", + "module.block-esp.data.side-color": "Side Color", + "module.block-esp.data.side-color.description": "Color of sides.", + "module.block-esp.data.tracer": "Tracer", + "module.block-esp.data.tracer.description": "If tracer line should be drawn to this block.", + "module.block-esp.data.tracer-color": "Tracer Color", + "module.block-esp.data.tracer-color.description": "Color of the tracer line.", + "module.packet-mine": "Packet Mine", "module.packet-mine.description": "Sends packets to mine blocks without the mining animation.", "module.packet-mine.general.delay": "Delay", @@ -3144,6 +3682,56 @@ "module.marker": "Marker", "module.marker.description": "Renders shapes. Useful for large scale projects", + "marker.sphere-2d.base.name": "Name", + "marker.sphere-2d.base.name.description": "Custom name for this marker.", + "marker.sphere-2d.base.description": "Description", + "marker.sphere-2d.base.description.description": "Custom description for this marker.", + "marker.sphere-2d.base.dimension": "Dimension", + "marker.sphere-2d.base.dimension.description": "In which dimension this marker should be visible.", + "marker.sphere-2d.base.active": "Active", + "marker.sphere-2d.base.active.description": "Is this marker visible.", + "marker.sphere-2d.general.center": "Center", + "marker.sphere-2d.general.center.description": "Center of the sphere", + "marker.sphere-2d.general.radius": "Radius", + "marker.sphere-2d.general.radius.description": "Radius of the sphere", + "marker.sphere-2d.general.layer": "Layer", + "marker.sphere-2d.general.layer.description": "Which layer to render", + "marker.sphere-2d.render.limit-render-range": "Limit Render Range", + "marker.sphere-2d.render.limit-render-range.description": "Whether to limit rendering range (useful in very large circles)", + "marker.sphere-2d.render.render-range": "Render Range", + "marker.sphere-2d.render.render-range.description": "Rendering range", + "marker.sphere-2d.render.shape-mode": "Shape Mode", + "marker.sphere-2d.render.shape-mode.description": "How the shapes are rendered.", + "marker.sphere-2d.render.side-color": "Side Color", + "marker.sphere-2d.render.side-color.description": "The color of the sides of the blocks being rendered.", + "marker.sphere-2d.render.line-color": "Line Color", + "marker.sphere-2d.render.line-color.description": "The color of the lines of the blocks being rendered.", + "marker.sphere-2d.keybinding.next-layer-keybind": "Next Layer Keybind", + "marker.sphere-2d.keybinding.next-layer-keybind.description": "Keybind to increment layer", + "marker.sphere-2d.keybinding.prev-layer-keybind": "Prev Layer Keybind", + "marker.sphere-2d.keybinding.prev-layer-keybind.description": "Keybind to increment layer", + "marker.cuboid.base.name": "Name", + "marker.cuboid.base.name.description": "Custom name for this marker.", + "marker.cuboid.base.description": "Description", + "marker.cuboid.base.description.description": "Custom description for this marker.", + "marker.cuboid.base.dimension": "Dimension", + "marker.cuboid.base.dimension.description": "In which dimension this marker should be visible.", + "marker.cuboid.base.active": "Active", + "marker.cuboid.base.active.description": "Is this marker visible.", + "marker.cuboid.general.pos-1": "Pos 1", + "marker.cuboid.general.pos-1.description": "1st corner of the cuboid", + "marker.cuboid.general.pos-2": "Pos 2", + "marker.cuboid.general.pos-2.description": "2nd corner of the cuboid", + "marker.cuboid.render.mode": "Mode", + "marker.cuboid.render.mode.description": "What mode to use for this marker.", + "marker.cuboid.render.shape-mode": "Shape Mode", + "marker.cuboid.render.shape-mode.description": "How the shapes are rendered.", + "marker.cuboid.render.side-color": "Side Color", + "marker.cuboid.render.side-color.description": "The color of the sides of the blocks being rendered.", + "marker.cuboid.render.line-color": "Line Color", + "marker.cuboid.render.line-color.description": "The color of the lines of the blocks being rendered.", + + "module.criticals": "Criticals", "module.criticals.description": "Performs critical attacks when you hit your target.", "module.criticals.general.mode": "Mode", From a3fc6e63347899b9994ff270876fdaf0a5ff1d99 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Mon, 12 Jan 2026 23:18:21 -0500 Subject: [PATCH 47/72] support the entire utf 16 plane in font rendering --- .../renderer/text/CustomTextRenderer.java | 9 +- .../meteorclient/renderer/text/Font.java | 203 ++++++++++++------ .../meteorclient/systems/hud/HudRenderer.java | 13 +- 3 files changed, 143 insertions(+), 82 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java b/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java index c31faabc6e..f1242672a1 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java @@ -8,6 +8,7 @@ import meteordevelopment.meteorclient.renderer.MeshBuilder; import meteordevelopment.meteorclient.renderer.MeshRenderer; import meteordevelopment.meteorclient.renderer.MeteorRenderPipelines; +import meteordevelopment.meteorclient.renderer.Texture; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.render.color.Color; import net.minecraft.client.MinecraftClient; @@ -38,7 +39,7 @@ public CustomTextRenderer(FontFace fontFace) { fonts = new Font[5]; for (int i = 0; i < fonts.length; i++) { - fonts[i] = new Font(buffer, (int) Math.round(27 * ((i * 0.5) + 1))); + fonts[i] = new Font(fontFace, buffer, (int) Math.round(27 * ((i * 0.5) + 1))); } } @@ -125,11 +126,13 @@ public void end() { if (!scaleOnly) { mesh.end(); + Texture fontAtlas = font.getTexture(); + MeshRenderer.begin() .attachments(MinecraftClient.getInstance().getFramebuffer()) .pipeline(MeteorRenderPipelines.UI_TEXT) .mesh(mesh) - .sampler("u_Texture", font.texture.getGlTextureView(), font.texture.getSampler()) + .sampler("u_Texture", fontAtlas.getGlTextureView(), fontAtlas.getSampler()) .end(); } @@ -139,7 +142,7 @@ public void end() { public void destroy() { for (Font font : this.fonts) { - font.texture.close(); + font.close(); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java b/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java index 7886610014..ad95a12927 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java @@ -7,10 +7,12 @@ import com.mojang.blaze3d.textures.FilterMode; import com.mojang.blaze3d.textures.TextureFormat; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.ints.*; import meteordevelopment.meteorclient.renderer.MeshBuilder; import meteordevelopment.meteorclient.renderer.Texture; +import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.render.color.Color; +import org.jetbrains.annotations.Nullable; import org.lwjgl.BufferUtils; import org.lwjgl.stb.*; import org.lwjgl.system.MemoryStack; @@ -19,84 +21,125 @@ import java.nio.IntBuffer; public class Font { - public final Texture texture; + private static final int size = 2048; + private final Texture texture; + private final FontFace fontFace; private final int height; private final float scale; private final float ascent; private final Int2ObjectOpenHashMap charMap = new Int2ObjectOpenHashMap<>(); - private static final int size = 2048; + private final Int2IntMap pending = new Int2IntOpenHashMap(); + private @Nullable STBTTFontinfo fontInfo; + private @Nullable ByteBuffer fontBuffer; - public Font(ByteBuffer buffer, int height) { + public Font(FontFace fontFace, ByteBuffer buffer, int height) { + this.fontFace = fontFace; + this.fontBuffer = buffer; this.height = height; // Initialize font - STBTTFontinfo fontInfo = STBTTFontinfo.create(); - STBTruetype.stbtt_InitFont(fontInfo, buffer); + STBTTFontinfo fontInfo = this.getOrCreateFontInfo(); + texture = new Texture(size, size, TextureFormat.RED8, FilterMode.LINEAR, FilterMode.LINEAR); + scale = STBTruetype.stbtt_ScaleForPixelHeight(fontInfo, height); + + // Get font vertical ascent + try (MemoryStack stack = MemoryStack.stackPush()) { + IntBuffer ascent = stack.mallocInt(1); + STBTruetype.stbtt_GetFontVMetrics(fontInfo, ascent, null, null); + this.ascent = ascent.get(0); + } + } + + public Font(FontFace fontFace, int height) { + this(fontFace, readFont(fontFace), height); + } + private void renderAndUploadAtlas() { // Allocate buffers - ByteBuffer bitmap = BufferUtils.createByteBuffer(size * size); - STBTTPackedchar.Buffer[] cdata = { - STBTTPackedchar.create(95), // Basic Latin - STBTTPackedchar.create(96), // Latin 1 Supplement - STBTTPackedchar.create(128), // Latin Extended-A - STBTTPackedchar.create(144), // Greek and Coptic - STBTTPackedchar.create(256), // Cyrillic - STBTTPackedchar.create(1) // infinity symbol - }; + int chars = charMap.size() + pending.size(); - // create and initialise packing context - STBTTPackContext packContext = STBTTPackContext.create(); - STBTruetype.stbtt_PackBegin(packContext, bitmap, size, size, 0 ,1); + STBTTPackRange.Buffer packRange = STBTTPackRange.create(1); + STBTTPackedchar.Buffer packedCharBuffer = STBTTPackedchar.create(chars); // create the pack range, populate with the specific packing ranges - STBTTPackRange.Buffer packRange = STBTTPackRange.create(cdata.length); - packRange.put(STBTTPackRange.create().set(height, 32, null, 95, cdata[0], (byte) 2, (byte) 2)); - packRange.put(STBTTPackRange.create().set(height, 160, null, 96, cdata[1], (byte) 2, (byte) 2)); - packRange.put(STBTTPackRange.create().set(height, 256, null, 128, cdata[2], (byte) 2, (byte) 2)); - packRange.put(STBTTPackRange.create().set(height, 880, null, 144, cdata[3], (byte) 2, (byte) 2)); - packRange.put(STBTTPackRange.create().set(height, 1024, null, 256, cdata[4], (byte) 2, (byte) 2)); - packRange.put(STBTTPackRange.create().set(height, 8734, null, 1, cdata[5], (byte) 2, (byte) 2)); // lol + IntBuffer charBuffer = BufferUtils.createIntBuffer(chars); + for (int c : charMap.keySet()) charBuffer.put(c); + charMap.clear(); + for (int c : pending.keySet()) charBuffer.put(c); + pending.clear(); + charBuffer.flip(); + + packRange.put(STBTTPackRange.create().set(height, 0, charBuffer, chars, packedCharBuffer, (byte) 0, (byte) 0)); packRange.flip(); - // write and finish - STBTruetype.stbtt_PackFontRanges(packContext, buffer, 0, packRange); + // create and initialise packing context + ByteBuffer bitmap = BufferUtils.createByteBuffer(size * size); + + STBTTPackContext packContext = STBTTPackContext.create(); + STBTruetype.stbtt_PackBegin(packContext, bitmap, size, size, 0 ,1); + + // pack and upload + STBTruetype.stbtt_PackFontRanges(packContext, this.fontBuffer, 0, packRange); STBTruetype.stbtt_PackEnd(packContext); - // Create texture object and get font scale - texture = new Texture(size, size, TextureFormat.RED8, FilterMode.LINEAR, FilterMode.LINEAR); texture.upload(bitmap); - scale = STBTruetype.stbtt_ScaleForPixelHeight(fontInfo, height); - // Get font vertical ascent - try (MemoryStack stack = MemoryStack.stackPush()) { - IntBuffer ascent = stack.mallocInt(1); - STBTruetype.stbtt_GetFontVMetrics(fontInfo, ascent, null, null); - this.ascent = ascent.get(0); + // update char data + for (int i = 0; i < chars; i++) { + int codepoint = charBuffer.get(i); + STBTTPackedchar packedChar = packedCharBuffer.get(i); + + float ipw = 1f / size; // pixel width and height + float iph = 1f / size; + + charMap.put(codepoint, new CharData( + packedChar.xoff(), + packedChar.yoff(), + packedChar.xoff2(), + packedChar.yoff2(), + packedChar.x0() * ipw, + packedChar.y0() * iph, + packedChar.x1() * ipw, + packedChar.y1() * iph, + packedChar.xadvance() + )); } - for (int i = 0; i < cdata.length; i++) { - STBTTPackedchar.Buffer cbuf = cdata[i]; - int offset = packRange.get(i).first_unicode_codepoint_in_range(); - - for (int j = 0; j < cbuf.capacity(); j++) { - STBTTPackedchar packedChar = cbuf.get(j); - - float ipw = 1f / size; // pixel width and height - float iph = 1f / size; - - charMap.put(j + offset, new CharData( - packedChar.xoff(), - packedChar.yoff(), - packedChar.xoff2(), - packedChar.yoff2(), - packedChar.x0() * ipw, - packedChar.y0() * iph, - packedChar.x1() * ipw, - packedChar.y1() * iph, - packedChar.xadvance() - )); - } + // clear + this.fontInfo = null; + this.fontBuffer = null; + } + + private STBTTFontinfo getOrCreateFontInfo() { + if (this.fontInfo != null) { + return this.fontInfo; } + + if (this.fontBuffer == null) { + this.fontBuffer = readFont(this.fontFace); + } + + STBTTFontinfo fontInfo = STBTTFontinfo.create(); + STBTruetype.stbtt_InitFont(fontInfo, fontBuffer); + + return this.fontInfo = fontInfo; + } + + private static ByteBuffer readFont(FontFace fontFace) { + byte[] data = Utils.readBytes(fontFace.toStream()); + return BufferUtils.createByteBuffer(data.length).put(data).flip(); + } + + private int addCharacter(int codepoint) { + return pending.computeIfAbsent(codepoint, c -> { + STBTTFontinfo fontInfo = this.getOrCreateFontInfo(); + + try (MemoryStack stack = MemoryStack.stackPush()) { + IntBuffer advance = stack.mallocInt(1); + STBTruetype.stbtt_GetCodepointHMetrics(fontInfo, c, advance, null); + return advance.get(); + } + }); } public double getWidth(String string, int length) { @@ -104,10 +147,13 @@ public double getWidth(String string, int length) { for (int i = 0; i < length; i++) { int cp = string.charAt(i); - CharData c = charMap.get(cp); - if (c == null) c = charMap.get(32); - - width += c.xAdvance; + @Nullable CharData c = charMap.get(cp); + if (c != null) { + width += c.xAdvance; + } else { + int advance = addCharacter(cp); + width += advance * this.scale; + } } return width; @@ -125,20 +171,35 @@ public double render(MeshBuilder mesh, String string, double x, double y, Color for (int i = 0; i < length; i++) { int cp = string.charAt(i); - CharData c = charMap.get(cp); - if (c == null) c = charMap.get(32); + @Nullable CharData c = charMap.get(cp); + if (c != null) { + mesh.quad( + mesh.vec2(x + c.x0 * scale, y + c.y0 * scale).vec2(c.u0, c.v0).color(color).next(), + mesh.vec2(x + c.x0 * scale, y + c.y1 * scale).vec2(c.u0, c.v1).color(color).next(), + mesh.vec2(x + c.x1 * scale, y + c.y1 * scale).vec2(c.u1, c.v1).color(color).next(), + mesh.vec2(x + c.x1 * scale, y + c.y0 * scale).vec2(c.u1, c.v0).color(color).next() + ); + + x += c.xAdvance * scale; + } else { + int advance = addCharacter(cp); + x += advance * this.scale * scale; + } + } - mesh.quad( - mesh.vec2(x + c.x0 * scale, y + c.y0 * scale).vec2(c.u0, c.v0).color(color).next(), - mesh.vec2(x + c.x0 * scale, y + c.y1 * scale).vec2(c.u0, c.v1).color(color).next(), - mesh.vec2(x + c.x1 * scale, y + c.y1 * scale).vec2(c.u1, c.v1).color(color).next(), - mesh.vec2(x + c.x1 * scale, y + c.y0 * scale).vec2(c.u1, c.v0).color(color).next() - ); + return x; + } - x += c.xAdvance * scale; + public Texture getTexture() { + if (fontInfo != null) { + renderAndUploadAtlas(); } - return x; + return this.texture; + } + + public void close() { + this.texture.close(); } private record CharData(float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float xAdvance) {} diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/HudRenderer.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/HudRenderer.java index 3316565d67..5ee5cb0a77 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/HudRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/HudRenderer.java @@ -27,9 +27,7 @@ import net.minecraft.util.Identifier; import org.joml.Quaternionf; import org.joml.Vector3f; -import org.lwjgl.BufferUtils; -import java.nio.ByteBuffer; import java.time.Duration; import java.util.ArrayList; import java.util.Iterator; @@ -85,11 +83,13 @@ public void end() { FontHolder fontHolder = it.next(); if (fontHolder.visited) { + Texture fontAtlas = fontHolder.font.getTexture(); + MeshRenderer.begin() .attachments(mc.getFramebuffer()) .pipeline(MeteorRenderPipelines.UI_TEXT) .mesh(fontHolder.getMesh()) - .sampler("u_Texture", fontHolder.font.texture.getGlTextureView(), fontHolder.font.texture.getSampler()) + .sampler("u_Texture", fontAtlas.getGlTextureView(), fontAtlas.getSampler()) .end(); } else { @@ -298,10 +298,7 @@ private void onCustomFontChanged(CustomFontChangedEvent event) { } private static FontHolder loadFont(int height) { - byte[] data = Utils.readBytes(Fonts.RENDERER.fontFace.toStream()); - ByteBuffer buffer = BufferUtils.createByteBuffer(data.length).put(data).flip(); - - return new FontHolder(new Font(buffer, height)); + return new FontHolder(new Font(Fonts.RENDERER.fontFace, height)); } private static class FontHolder { @@ -321,7 +318,7 @@ public MeshBuilder getMesh() { } public void destroy() { - font.texture.close(); + font.close(); } } } From b536421f312214172d82491d52831fbbcb869dae Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Tue, 13 Jan 2026 17:46:23 -0500 Subject: [PATCH 48/72] dont invalidate existing char data when updating glyph atlas --- .../meteorclient/renderer/text/Font.java | 157 ++++++++++-------- 1 file changed, 91 insertions(+), 66 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java b/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java index ad95a12927..565002b165 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java @@ -5,6 +5,8 @@ package meteordevelopment.meteorclient.renderer.text; +import com.mojang.blaze3d.opengl.GlConst; +import com.mojang.blaze3d.opengl.GlStateManager; import com.mojang.blaze3d.textures.FilterMode; import com.mojang.blaze3d.textures.TextureFormat; import it.unimi.dsi.fastutil.ints.*; @@ -12,10 +14,13 @@ import meteordevelopment.meteorclient.renderer.Texture; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.render.color.Color; +import net.minecraft.client.texture.GlTexture; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.lwjgl.BufferUtils; import org.lwjgl.stb.*; import org.lwjgl.system.MemoryStack; +import org.lwjgl.system.MemoryUtil; import java.nio.ByteBuffer; import java.nio.IntBuffer; @@ -28,20 +33,28 @@ public class Font { private final float scale; private final float ascent; private final Int2ObjectOpenHashMap charMap = new Int2ObjectOpenHashMap<>(); - private final Int2IntMap pending = new Int2IntOpenHashMap(); - private @Nullable STBTTFontinfo fontInfo; - private @Nullable ByteBuffer fontBuffer; + private final STBTTPackContext packContext; + private final ByteBuffer fontAtlasBuffer; + private @Nullable ByteBuffer fileBuffer; - public Font(FontFace fontFace, ByteBuffer buffer, int height) { + public Font(FontFace fontFace, @NotNull ByteBuffer buffer, int height) { this.fontFace = fontFace; - this.fontBuffer = buffer; + this.fileBuffer = buffer; this.height = height; - // Initialize font - STBTTFontinfo fontInfo = this.getOrCreateFontInfo(); + // allocate data + STBTTFontinfo fontInfo = STBTTFontinfo.create(); + STBTruetype.stbtt_InitFont(fontInfo, buffer); + texture = new Texture(size, size, TextureFormat.RED8, FilterMode.LINEAR, FilterMode.LINEAR); scale = STBTruetype.stbtt_ScaleForPixelHeight(fontInfo, height); + // initialize font info & zero out texture + fontAtlasBuffer = BufferUtils.createByteBuffer(size * size); + + packContext = STBTTPackContext.create(); + STBTruetype.stbtt_PackBegin(packContext, fontAtlasBuffer, size, size, 0 ,1); + // Get font vertical ascent try (MemoryStack stack = MemoryStack.stackPush()) { IntBuffer ascent = stack.mallocInt(1); @@ -54,9 +67,23 @@ public Font(FontFace fontFace, int height) { this(fontFace, readFont(fontFace), height); } - private void renderAndUploadAtlas() { + private void upload() { + GlStateManager._bindTexture(((GlTexture) this.texture.getGlTexture()).getGlId()); + GlStateManager._pixelStore(GlConst.GL_UNPACK_ROW_LENGTH, size); + GlStateManager._pixelStore(GlConst.GL_UNPACK_SKIP_PIXELS, 0); + GlStateManager._pixelStore(GlConst.GL_UNPACK_SKIP_ROWS, 0); + GlStateManager._pixelStore(GlConst.GL_UNPACK_ALIGNMENT, 1); + GlStateManager._texSubImage2D(GlConst.GL_TEXTURE_2D, 0, 0, 0, size, size, GlConst.GL_RED, GlConst.GL_UNSIGNED_BYTE, MemoryUtil.memAddress0(this.fontAtlasBuffer)); + } + + // currently unused, but useful in the future hopefully + private void regenerateAtlas() { + if (this.fileBuffer == null) { + this.fileBuffer = readFont(this.fontFace); + } + // Allocate buffers - int chars = charMap.size() + pending.size(); + int chars = charMap.size(); STBTTPackRange.Buffer packRange = STBTTPackRange.create(1); STBTTPackedchar.Buffer packedCharBuffer = STBTTPackedchar.create(chars); @@ -65,24 +92,17 @@ private void renderAndUploadAtlas() { IntBuffer charBuffer = BufferUtils.createIntBuffer(chars); for (int c : charMap.keySet()) charBuffer.put(c); charMap.clear(); - for (int c : pending.keySet()) charBuffer.put(c); - pending.clear(); charBuffer.flip(); packRange.put(STBTTPackRange.create().set(height, 0, charBuffer, chars, packedCharBuffer, (byte) 0, (byte) 0)); packRange.flip(); // create and initialise packing context - ByteBuffer bitmap = BufferUtils.createByteBuffer(size * size); - - STBTTPackContext packContext = STBTTPackContext.create(); - STBTruetype.stbtt_PackBegin(packContext, bitmap, size, size, 0 ,1); // pack and upload - STBTruetype.stbtt_PackFontRanges(packContext, this.fontBuffer, 0, packRange); - STBTruetype.stbtt_PackEnd(packContext); + STBTruetype.stbtt_PackFontRanges(packContext, this.fileBuffer, 0, packRange); - texture.upload(bitmap); + this.upload(); // update char data for (int i = 0; i < chars; i++) { @@ -106,23 +126,7 @@ private void renderAndUploadAtlas() { } // clear - this.fontInfo = null; - this.fontBuffer = null; - } - - private STBTTFontinfo getOrCreateFontInfo() { - if (this.fontInfo != null) { - return this.fontInfo; - } - - if (this.fontBuffer == null) { - this.fontBuffer = readFont(this.fontFace); - } - - STBTTFontinfo fontInfo = STBTTFontinfo.create(); - STBTruetype.stbtt_InitFont(fontInfo, fontBuffer); - - return this.fontInfo = fontInfo; + this.fileBuffer = null; } private static ByteBuffer readFont(FontFace fontFace) { @@ -130,15 +134,43 @@ private static ByteBuffer readFont(FontFace fontFace) { return BufferUtils.createByteBuffer(data.length).put(data).flip(); } - private int addCharacter(int codepoint) { - return pending.computeIfAbsent(codepoint, c -> { - STBTTFontinfo fontInfo = this.getOrCreateFontInfo(); - - try (MemoryStack stack = MemoryStack.stackPush()) { - IntBuffer advance = stack.mallocInt(1); - STBTruetype.stbtt_GetCodepointHMetrics(fontInfo, c, advance, null); - return advance.get(); + private CharData getCharData(int codepoint) { + return charMap.computeIfAbsent(codepoint, c -> { + if (this.fileBuffer == null) { + this.fileBuffer = readFont(this.fontFace); } + + // allocate buffers + STBTTPackRange.Buffer packRange = STBTTPackRange.create(1); + STBTTPackedchar.Buffer packedCharBuffer = STBTTPackedchar.create(1); + + IntBuffer charBuffer = BufferUtils.createIntBuffer(1); + charBuffer.put(codepoint); + charBuffer.flip(); + + packRange.put(STBTTPackRange.create().set(height, 0, charBuffer, 1, packedCharBuffer, (byte) 0, (byte) 0)); + packRange.flip(); + + // pack and upload + STBTruetype.stbtt_PackFontRanges(packContext, this.fileBuffer, 0, packRange); + + // update char data + STBTTPackedchar packedChar = packedCharBuffer.get(0); + + float ipw = 1f / size; // pixel width and height + float iph = 1f / size; + + return new CharData( + packedChar.xoff(), + packedChar.yoff(), + packedChar.xoff2(), + packedChar.yoff2(), + packedChar.x0() * ipw, + packedChar.y0() * iph, + packedChar.x1() * ipw, + packedChar.y1() * iph, + packedChar.xadvance() + ); }); } @@ -147,13 +179,8 @@ public double getWidth(String string, int length) { for (int i = 0; i < length; i++) { int cp = string.charAt(i); - @Nullable CharData c = charMap.get(cp); - if (c != null) { - width += c.xAdvance; - } else { - int advance = addCharacter(cp); - width += advance * this.scale; - } + CharData c = this.getCharData(cp); + width += c.xAdvance(); } return width; @@ -171,28 +198,25 @@ public double render(MeshBuilder mesh, String string, double x, double y, Color for (int i = 0; i < length; i++) { int cp = string.charAt(i); - @Nullable CharData c = charMap.get(cp); - if (c != null) { - mesh.quad( - mesh.vec2(x + c.x0 * scale, y + c.y0 * scale).vec2(c.u0, c.v0).color(color).next(), - mesh.vec2(x + c.x0 * scale, y + c.y1 * scale).vec2(c.u0, c.v1).color(color).next(), - mesh.vec2(x + c.x1 * scale, y + c.y1 * scale).vec2(c.u1, c.v1).color(color).next(), - mesh.vec2(x + c.x1 * scale, y + c.y0 * scale).vec2(c.u1, c.v0).color(color).next() - ); - - x += c.xAdvance * scale; - } else { - int advance = addCharacter(cp); - x += advance * this.scale * scale; - } + CharData c = this.getCharData(cp); + mesh.quad( + mesh.vec2(x + c.x0() * scale, y + c.y0() * scale).vec2(c.u0(), c.v0()).color(color).next(), + mesh.vec2(x + c.x0() * scale, y + c.y1() * scale).vec2(c.u0(), c.v1()).color(color).next(), + mesh.vec2(x + c.x1() * scale, y + c.y1() * scale).vec2(c.u1(), c.v1()).color(color).next(), + mesh.vec2(x + c.x1() * scale, y + c.y0() * scale).vec2(c.u1(), c.v0()).color(color).next() + ); + + x += c.xAdvance() * scale; } return x; } public Texture getTexture() { - if (fontInfo != null) { - renderAndUploadAtlas(); + // flush updates + if (this.fileBuffer != null) { + this.upload(); + this.fileBuffer = null; } return this.texture; @@ -200,6 +224,7 @@ public Texture getTexture() { public void close() { this.texture.close(); + STBTruetype.stbtt_PackEnd(this.packContext); } private record CharData(float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float xAdvance) {} From 108369f42b5e6812049c83b59d58e07da1f76fc5 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Tue, 13 Jan 2026 18:45:27 -0500 Subject: [PATCH 49/72] weakref the file buffer --- .../meteorclient/renderer/text/Font.java | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java b/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java index 565002b165..16de5d125b 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java @@ -22,6 +22,7 @@ import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryUtil; +import java.lang.ref.WeakReference; import java.nio.ByteBuffer; import java.nio.IntBuffer; @@ -36,10 +37,12 @@ public class Font { private final STBTTPackContext packContext; private final ByteBuffer fontAtlasBuffer; private @Nullable ByteBuffer fileBuffer; + private WeakReference fileBufferRef; public Font(FontFace fontFace, @NotNull ByteBuffer buffer, int height) { this.fontFace = fontFace; this.fileBuffer = buffer; + this.fileBufferRef = new WeakReference<>(buffer); this.height = height; // allocate data @@ -76,11 +79,23 @@ private void upload() { GlStateManager._texSubImage2D(GlConst.GL_TEXTURE_2D, 0, 0, 0, size, size, GlConst.GL_RED, GlConst.GL_UNSIGNED_BYTE, MemoryUtil.memAddress0(this.fontAtlasBuffer)); } - // currently unused, but useful in the future hopefully - private void regenerateAtlas() { + private ByteBuffer getFileBuffer() { if (this.fileBuffer == null) { - this.fileBuffer = readFont(this.fontFace); + if (this.fileBufferRef.get() == null) { + ByteBuffer buffer = readFont(this.fontFace); + this.fileBufferRef = new WeakReference<>(buffer); + return this.fileBuffer = buffer; + } else { + return this.fileBuffer = this.fileBufferRef.get(); + } + } else { + return this.fileBuffer; } + } + + // currently unused, but useful in the future hopefully + private void regenerateAtlas() { + ByteBuffer fileBuffer = this.getFileBuffer(); // Allocate buffers int chars = charMap.size(); @@ -100,7 +115,7 @@ private void regenerateAtlas() { // create and initialise packing context // pack and upload - STBTruetype.stbtt_PackFontRanges(packContext, this.fileBuffer, 0, packRange); + STBTruetype.stbtt_PackFontRanges(packContext, fileBuffer, 0, packRange); this.upload(); @@ -136,9 +151,7 @@ private static ByteBuffer readFont(FontFace fontFace) { private CharData getCharData(int codepoint) { return charMap.computeIfAbsent(codepoint, c -> { - if (this.fileBuffer == null) { - this.fileBuffer = readFont(this.fontFace); - } + ByteBuffer fileBuffer = this.getFileBuffer(); // allocate buffers STBTTPackRange.Buffer packRange = STBTTPackRange.create(1); @@ -152,7 +165,7 @@ private CharData getCharData(int codepoint) { packRange.flip(); // pack and upload - STBTruetype.stbtt_PackFontRanges(packContext, this.fileBuffer, 0, packRange); + STBTruetype.stbtt_PackFontRanges(packContext, fileBuffer, 0, packRange); // update char data STBTTPackedchar packedChar = packedCharBuffer.get(0); From 4cd2c9524f30e593c7b973e50e489243aeefe298 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Wed, 14 Jan 2026 14:55:15 -0500 Subject: [PATCH 50/72] slight optimization --- .../meteorclient/renderer/text/Font.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java b/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java index 16de5d125b..30196b4f43 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java @@ -93,6 +93,11 @@ private ByteBuffer getFileBuffer() { } } + private static ByteBuffer readFont(FontFace fontFace) { + byte[] data = Utils.readBytes(fontFace.toStream()); + return BufferUtils.createByteBuffer(data.length).put(data).flip(); + } + // currently unused, but useful in the future hopefully private void regenerateAtlas() { ByteBuffer fileBuffer = this.getFileBuffer(); @@ -144,11 +149,6 @@ private void regenerateAtlas() { this.fileBuffer = null; } - private static ByteBuffer readFont(FontFace fontFace) { - byte[] data = Utils.readBytes(fontFace.toStream()); - return BufferUtils.createByteBuffer(data.length).put(data).flip(); - } - private CharData getCharData(int codepoint) { return charMap.computeIfAbsent(codepoint, c -> { ByteBuffer fileBuffer = this.getFileBuffer(); @@ -157,11 +157,7 @@ private CharData getCharData(int codepoint) { STBTTPackRange.Buffer packRange = STBTTPackRange.create(1); STBTTPackedchar.Buffer packedCharBuffer = STBTTPackedchar.create(1); - IntBuffer charBuffer = BufferUtils.createIntBuffer(1); - charBuffer.put(codepoint); - charBuffer.flip(); - - packRange.put(STBTTPackRange.create().set(height, 0, charBuffer, 1, packedCharBuffer, (byte) 0, (byte) 0)); + packRange.put(STBTTPackRange.create().set(height, codepoint, null, 1, packedCharBuffer, (byte) 0, (byte) 0)); packRange.flip(); // pack and upload From 4c42509a622da2e375ed64e84d6b7a5f06b6c10e Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Wed, 14 Jan 2026 14:57:04 -0500 Subject: [PATCH 51/72] correctly handle surrogate pairs Co-authored-by: Nora <50046813+noramibu@users.noreply.github.com> --- .../meteorclient/renderer/text/Font.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java b/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java index 30196b4f43..3df4180a64 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java @@ -186,10 +186,11 @@ private CharData getCharData(int codepoint) { public double getWidth(String string, int length) { double width = 0; - for (int i = 0; i < length; i++) { - int cp = string.charAt(i); + for (int i = 0; i < length;) { + int cp = string.codePointAt(i); CharData c = this.getCharData(cp); width += c.xAdvance(); + i += Character.charCount(cp); } return width; @@ -205,8 +206,8 @@ public double render(MeshBuilder mesh, String string, double x, double y, Color int length = string.length(); mesh.ensureCapacity(length * 4, length * 6); - for (int i = 0; i < length; i++) { - int cp = string.charAt(i); + for (int i = 0; i < length;) { + int cp = string.codePointAt(i); CharData c = this.getCharData(cp); mesh.quad( mesh.vec2(x + c.x0() * scale, y + c.y0() * scale).vec2(c.u0(), c.v0()).color(color).next(), @@ -216,6 +217,7 @@ public double render(MeshBuilder mesh, String string, double x, double y, Color ); x += c.xAdvance() * scale; + i += Character.charCount(cp); } return x; From 9c69beaa649874b529b0de83db4fade03b7c00b9 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Thu, 15 Jan 2026 15:46:33 -0500 Subject: [PATCH 52/72] use `NativeImage` for font atlas --- .../meteorclient/renderer/text/Font.java | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java b/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java index 3df4180a64..a15906244c 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java @@ -5,8 +5,7 @@ package meteordevelopment.meteorclient.renderer.text; -import com.mojang.blaze3d.opengl.GlConst; -import com.mojang.blaze3d.opengl.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.textures.FilterMode; import com.mojang.blaze3d.textures.TextureFormat; import it.unimi.dsi.fastutil.ints.*; @@ -14,7 +13,7 @@ import meteordevelopment.meteorclient.renderer.Texture; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.texture.GlTexture; +import net.minecraft.client.texture.NativeImage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.lwjgl.BufferUtils; @@ -35,7 +34,7 @@ public class Font { private final float ascent; private final Int2ObjectOpenHashMap charMap = new Int2ObjectOpenHashMap<>(); private final STBTTPackContext packContext; - private final ByteBuffer fontAtlasBuffer; + private final NativeImage fontAtlas; private @Nullable ByteBuffer fileBuffer; private WeakReference fileBufferRef; @@ -53,10 +52,10 @@ public Font(FontFace fontFace, @NotNull ByteBuffer buffer, int height) { scale = STBTruetype.stbtt_ScaleForPixelHeight(fontInfo, height); // initialize font info & zero out texture - fontAtlasBuffer = BufferUtils.createByteBuffer(size * size); + fontAtlas = new NativeImage(NativeImage.Format.LUMINANCE, size, size, false); packContext = STBTTPackContext.create(); - STBTruetype.stbtt_PackBegin(packContext, fontAtlasBuffer, size, size, 0 ,1); + STBTruetype.nstbtt_PackBegin(packContext.address(), fontAtlas.imageId(), size, size, 0, 1, MemoryUtil.NULL); // Get font vertical ascent try (MemoryStack stack = MemoryStack.stackPush()) { @@ -71,12 +70,7 @@ public Font(FontFace fontFace, int height) { } private void upload() { - GlStateManager._bindTexture(((GlTexture) this.texture.getGlTexture()).getGlId()); - GlStateManager._pixelStore(GlConst.GL_UNPACK_ROW_LENGTH, size); - GlStateManager._pixelStore(GlConst.GL_UNPACK_SKIP_PIXELS, 0); - GlStateManager._pixelStore(GlConst.GL_UNPACK_SKIP_ROWS, 0); - GlStateManager._pixelStore(GlConst.GL_UNPACK_ALIGNMENT, 1); - GlStateManager._texSubImage2D(GlConst.GL_TEXTURE_2D, 0, 0, 0, size, size, GlConst.GL_RED, GlConst.GL_UNSIGNED_BYTE, MemoryUtil.memAddress0(this.fontAtlasBuffer)); + RenderSystem.getDevice().createCommandEncoder().writeToTexture(this.texture.getGlTexture(), this.fontAtlas); } private ByteBuffer getFileBuffer() { @@ -235,6 +229,7 @@ public Texture getTexture() { public void close() { this.texture.close(); + this.fontAtlas.close(); STBTruetype.stbtt_PackEnd(this.packContext); } From ee4c613eb7def77d564ed4573066a1d1e0d18827 Mon Sep 17 00:00:00 2001 From: crosby-moe <32882447+crosby-moe@users.noreply.github.com> Date: Wed, 28 Jan 2026 13:57:30 -0500 Subject: [PATCH 53/72] map tab names --- .../meteordevelopment/meteorclient/gui/tabs/Tab.java | 9 +++++++-- .../meteorclient/gui/tabs/TabScreen.java | 2 +- .../meteorclient/gui/tabs/WindowTabScreen.java | 2 +- .../meteorclient/gui/tabs/builtin/ConfigTab.java | 2 +- .../meteorclient/gui/tabs/builtin/FriendsTab.java | 2 +- .../meteorclient/gui/tabs/builtin/GuiTab.java | 2 +- .../meteorclient/gui/tabs/builtin/HudTab.java | 2 +- .../meteorclient/gui/tabs/builtin/MacrosTab.java | 2 +- .../meteorclient/gui/tabs/builtin/ModulesTab.java | 2 +- .../meteorclient/gui/tabs/builtin/PathManagerTab.java | 2 +- .../meteorclient/gui/tabs/builtin/ProfilesTab.java | 2 +- .../meteorclient/gui/widgets/WTopBar.java | 4 ++-- .../resources/assets/meteor-client/language/en_us.json | 9 +++++++++ 13 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/Tab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/Tab.java index f7774038a1..85c20a9dc2 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/Tab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/Tab.java @@ -6,15 +6,16 @@ package meteordevelopment.meteorclient.gui.tabs; import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; import net.minecraft.client.gui.screen.Screen; import static meteordevelopment.meteorclient.MeteorClient.mc; public abstract class Tab { - public final String name; + private final String translationKey; public Tab(String name) { - this.name = name; + this.translationKey = "tab." + name; } public void openScreen(GuiTheme theme) { @@ -26,4 +27,8 @@ public void openScreen(GuiTheme theme) { public abstract TabScreen createScreen(GuiTheme theme); public abstract boolean isScreen(Screen screen); + + public String getTitle() { + return MeteorTranslations.translate(this.translationKey); + } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/TabScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/TabScreen.java index 56be6ba739..6994abd73e 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/TabScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/TabScreen.java @@ -14,7 +14,7 @@ public abstract class TabScreen extends WidgetScreen { public final Tab tab; public TabScreen(GuiTheme theme, Tab tab) { - super(theme, tab.name); + super(theme, tab.getTitle()); this.tab = tab; } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/WindowTabScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/WindowTabScreen.java index b87a6894a1..a0e2ea4895 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/WindowTabScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/WindowTabScreen.java @@ -16,7 +16,7 @@ public abstract class WindowTabScreen extends TabScreen { public WindowTabScreen(GuiTheme theme, Tab tab) { super(theme, tab); - window = super.add(theme.window(tab.name)).center().widget(); + window = super.add(theme.window(tab.getTitle())).center().widget(); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ConfigTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ConfigTab.java index 55d84c1f8d..8aa01729ec 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ConfigTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ConfigTab.java @@ -17,7 +17,7 @@ public class ConfigTab extends Tab { public ConfigTab() { - super("Config"); + super("config"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/FriendsTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/FriendsTab.java index aeaec4e1ed..b96a6b72a3 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/FriendsTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/FriendsTab.java @@ -24,7 +24,7 @@ public class FriendsTab extends Tab { public FriendsTab() { - super("Friends"); + super("friends"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/GuiTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/GuiTab.java index 35122c6551..6a028058f7 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/GuiTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/GuiTab.java @@ -21,7 +21,7 @@ public class GuiTab extends Tab { public GuiTab() { - super("GUI"); + super("gui"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/HudTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/HudTab.java index 326f49b29e..7fe6a4d2a4 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/HudTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/HudTab.java @@ -23,7 +23,7 @@ public class HudTab extends Tab { public HudTab() { - super("HUD"); + super("hud"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/MacrosTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/MacrosTab.java index 1ba286fd59..db833d53af 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/MacrosTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/MacrosTab.java @@ -24,7 +24,7 @@ public class MacrosTab extends Tab { public MacrosTab() { - super("Macros"); + super("macros"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ModulesTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ModulesTab.java index 093bbe2683..0c51eb1ca0 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ModulesTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ModulesTab.java @@ -13,7 +13,7 @@ public class ModulesTab extends Tab { public ModulesTab() { - super("Modules"); + super("modules"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/PathManagerTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/PathManagerTab.java index d2fd0ade51..65496af04a 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/PathManagerTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/PathManagerTab.java @@ -15,7 +15,7 @@ public class PathManagerTab extends Tab { public PathManagerTab() { - super(PathManagers.get().getName()); + super("pathing"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java index 680e21d48c..4140cef365 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java @@ -59,7 +59,7 @@ public class ProfilesTab extends Tab { } public ProfilesTab() { - super("Profiles"); + super("profiles"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WTopBar.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WTopBar.java index 5e20f5a3a5..1b5d1eb59e 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WTopBar.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WTopBar.java @@ -44,7 +44,7 @@ public WTopBarButton(Tab tab) { protected void onCalculateSize() { double pad = pad(); - width = pad + theme.textWidth(tab.name) + pad; + width = pad + theme.textWidth(tab.getTitle()) + pad; height = pad + theme.textHeight() + pad; } @@ -67,7 +67,7 @@ protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, doub Color color = getButtonColor(pressed || (mc.currentScreen instanceof TabScreen && ((TabScreen) mc.currentScreen).tab == tab), mouseOver); renderer.quad(x, y, width, height, color); - renderer.text(tab.name, x + pad, y + pad, getNameColor(), false); + renderer.text(tab.getTitle(), x + pad, y + pad, getNameColor(), false); } } } diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index bc9f17c8bd..4ff468a7c2 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -5,6 +5,15 @@ "meteor.key.open-commands": "Open Commands", "meteor.key.open-gui": "Open GUI", + "tab.config": "Config", + "tab.friends": "Friends", + "tab.gui": "GUI", + "tab.hud": "HUD", + "tab.macros": "Macros", + "tab.modules": "Modules", + "tab.pathing": "Pathing", + "tab.profiles": "Profiles", + "command.bind.description": "Binds a specified module to the next pressed key.", "command.binds.description": "List of all bound modules.", "command.commands.description": "List of all commands.", From 06e10f85ab2d823efbc0179e9f4bb9e1d536f1a3 Mon Sep 17 00:00:00 2001 From: crosby-moe <32882447+crosby-moe@users.noreply.github.com> Date: Wed, 28 Jan 2026 14:01:47 -0500 Subject: [PATCH 54/72] map chat feedback prefixes --- .../meteorclient/commands/Command.java | 11 ++++------ .../commands/commands/ModulesCommand.java | 2 +- .../commands/commands/ResetCommand.java | 6 +++--- .../systems/modules/Category.java | 2 +- .../meteorclient/systems/modules/Module.java | 20 +++++++++++-------- .../modules/misc/swarm/SwarmConnection.java | 8 ++++---- .../systems/modules/misc/swarm/SwarmHost.java | 8 ++++---- .../modules/misc/swarm/SwarmWorker.java | 12 +++++------ .../utils/misc/MeteorStarscript.java | 12 +++++------ .../meteorclient/utils/player/ChatUtils.java | 16 +++++++-------- .../assets/meteor-client/language/en_us.json | 4 +++- 11 files changed, 52 insertions(+), 49 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/Command.java b/src/main/java/meteordevelopment/meteorclient/commands/Command.java index 0809c14978..d6381b4ff7 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/Command.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/Command.java @@ -11,7 +11,6 @@ import com.mojang.brigadier.builder.RequiredArgumentBuilder; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.systems.config.Config; -import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.client.MinecraftClient; @@ -30,13 +29,11 @@ public abstract class Command { protected static final MinecraftClient mc = MeteorClient.mc; private final String name; - private final String title; private final List aliases; public final String translationKey; public Command(String name, String... aliases) { this.name = name; - this.title = Utils.nameToTitle(name); this.aliases = List.of(aliases); this.translationKey = "command." + name; } @@ -87,22 +84,22 @@ public String toString(String... args) { public void info(Text message) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.sendMsg(title, message); + ChatUtils.sendMsg(translationKey, message); } public void info(String message, Object... args) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.infoPrefix(title, MeteorTranslations.translate(translationKey + ".info." + message, message, args)); + ChatUtils.infoPrefix(translationKey, MeteorTranslations.translate(translationKey + ".info." + message, message, args)); // todo Textify body } public void warning(String message, Object... args) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.warningPrefix(title, MeteorTranslations.translate(translationKey + ".warning." + message, message, args)); + ChatUtils.warningPrefix(translationKey, MeteorTranslations.translate(translationKey + ".warning." + message, message, args)); // todo Textify body } public void error(String message, Object... args) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.errorPrefix(title, MeteorTranslations.translate(translationKey + ".error." + message, message, args)); + ChatUtils.errorPrefix(translationKey, MeteorTranslations.translate(translationKey + ".error." + message, message, args)); // todo Textify body } public MutableText translatable(String string, Object... args) { diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java index b3aaf85cf6..8910ee97fe 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java @@ -29,7 +29,7 @@ public void build(LiteralArgumentBuilder builder) { Modules.loopCategories().forEach(category -> { MutableText categoryMessage = Text.literal(""); Modules.get().getGroup(category).forEach(module -> categoryMessage.append(getModuleText(module))); - ChatUtils.sendMsg(category.getName(), categoryMessage); // todo + ChatUtils.sendMsg(category.translationKey, categoryMessage); }); return SINGLE_SUCCESS; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java index d5cd90994e..a9db13805e 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java @@ -33,7 +33,7 @@ public void build(LiteralArgumentBuilder builder) { })) .then(literal("all").executes(context -> { Modules.get().getAll().forEach(module -> module.settings.forEach(group -> group.forEach(Setting::reset))); - ChatUtils.infoPrefix("Modules", "Reset all module settings"); + ChatUtils.infoPrefix("tab.modules", "Reset all module settings"); return SINGLE_SUCCESS; })) ).then(literal("gui").executes(context -> { @@ -52,12 +52,12 @@ public void build(LiteralArgumentBuilder builder) { })) .then(literal("all").executes(context -> { Modules.get().getAll().forEach(module -> module.keybind.reset()); - ChatUtils.infoPrefix("Modules", "Reset all binds."); + ChatUtils.infoPrefix("tab.modules", "Reset all binds."); return SINGLE_SUCCESS; })) ).then(literal("hud").executes(context -> { Hud.get().resetToDefaultElements(); - ChatUtils.infoPrefix("HUD", "Reset all elements."); + ChatUtils.infoPrefix("tab.hud", "Reset all elements."); return SINGLE_SUCCESS; })); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Category.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Category.java index 69688550ab..1f5b863452 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Category.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Category.java @@ -11,7 +11,7 @@ public class Category { public final String name; - private final String translationKey; + public final String translationKey; public final ItemStack icon; private final int nameHash; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java index 9ac7b74004..444cc2f2e5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java @@ -124,22 +124,22 @@ public void sendToggledMsg() { public void info(Text message) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.sendMsg(null /* todo translatable Text */, message); + ChatUtils.sendMsg(this.getTranslationKey(), message); } public void info(String message, Object... args) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.infoPrefix(null /* todo translatable Text */, message, args); + ChatUtils.infoPrefix(this.getTranslationKey(), message, args); } public void warning(String message, Object... args) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.warningPrefix(null /* todo translatable Text */, message, args); + ChatUtils.warningPrefix(this.getTranslationKey(), message, args); } public void error(String message, Object... args) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.errorPrefix(null /* todo translatable Text */, message, args); + ChatUtils.errorPrefix(this.getTranslationKey(), message, args); } public boolean isActive() { @@ -150,20 +150,24 @@ public String getInfoString() { return null; } + public String getTranslationKey() { + return "module." + this.name; + } + public String getTitle() { - return MeteorTranslations.translate("module." + this.name); + return MeteorTranslations.translate(this.getTranslationKey()); } public MutableText getTitleText() { - return MeteorClient.translatable("module." + this.name); + return MeteorClient.translatable(this.getTranslationKey()); } public String getDescription() { - return MeteorTranslations.translate("module." + this.name + ".description"); + return MeteorTranslations.translate(this.getTranslationKey() + ".description"); } public MutableText getDescriptionText() { - return MeteorClient.translatable("module." + this.name + ".description"); + return MeteorClient.translatable(this.getTranslationKey() + ".description"); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmConnection.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmConnection.java index 0ba20420bf..79f4156e7a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmConnection.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmConnection.java @@ -22,7 +22,7 @@ public SwarmConnection(Socket socket) { @Override public void run() { - ChatUtils.infoPrefix("Swarm", "New worker connected on %s.", getIp(socket.getInetAddress().getHostAddress())); + ChatUtils.infoPrefix("module.swarm", "New worker connected on %s.", getIp(socket.getInetAddress().getHostAddress())); try { DataOutputStream out = new DataOutputStream(socket.getOutputStream()); @@ -33,7 +33,7 @@ public void run() { out.writeUTF(messageToSend); out.flush(); } catch (Exception e) { - ChatUtils.errorPrefix("Swarm", "Encountered error when sending command."); + ChatUtils.errorPrefix("module.swarm", "Encountered error when sending command."); e.printStackTrace(); } @@ -43,7 +43,7 @@ public void run() { out.close(); } catch (IOException e) { - ChatUtils.infoPrefix("Swarm", "Error creating a connection with %s on port %s.", getIp(socket.getInetAddress().getHostAddress()), socket.getPort()); + ChatUtils.infoPrefix("module.swarm", "Error creating a connection with %s on port %s.", getIp(socket.getInetAddress().getHostAddress()), socket.getPort()); e.printStackTrace(); } } @@ -55,7 +55,7 @@ public void disconnect() { e.printStackTrace(); } - ChatUtils.infoPrefix("Swarm", "Worker disconnected on ip: %s.", socket.getInetAddress().getHostAddress()); + ChatUtils.infoPrefix("module.swarm", "Worker disconnected on ip: %s.", socket.getInetAddress().getHostAddress()); interrupt(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmHost.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmHost.java index 6e645760a8..180c588669 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmHost.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmHost.java @@ -21,7 +21,7 @@ public SwarmHost(int port) { socket = new ServerSocket(port); } catch (IOException e) { socket = null; - ChatUtils.errorPrefix("Swarm", "Couldn't start a server on port %s.", port); + ChatUtils.errorPrefix("module.swarm", "Couldn't start a server on port %s.", port); e.printStackTrace(); } @@ -30,14 +30,14 @@ public SwarmHost(int port) { @Override public void run() { - ChatUtils.infoPrefix("Swarm", "Listening for incoming connections on port %s.", socket.getLocalPort()); + ChatUtils.infoPrefix("module.swarm", "Listening for incoming connections on port %s.", socket.getLocalPort()); while (!isInterrupted()) { try { Socket connection = socket.accept(); assignConnectionToSubServer(connection); } catch (IOException e) { - ChatUtils.errorPrefix("Swarm", "Error making a connection to worker."); + ChatUtils.errorPrefix("module.swarm", "Error making a connection to worker."); e.printStackTrace(); } } @@ -63,7 +63,7 @@ public void disconnect() { e.printStackTrace(); } - ChatUtils.infoPrefix("Swarm", "Server closed on port %s.", socket.getLocalPort()); + ChatUtils.infoPrefix("module.swarm", "Server closed on port %s.", socket.getLocalPort()); interrupt(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java index 5f4f419217..9b3e00e8ef 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java @@ -23,7 +23,7 @@ public SwarmWorker(String ip, int port) { socket = new Socket(ip, port); } catch (Exception e) { socket = null; - ChatUtils.warningPrefix("Swarm", "Server not found at %s on port %s.", ip, port); + ChatUtils.warningPrefix("module.swarm", "Server not found at %s on port %s.", ip, port); e.printStackTrace(); } @@ -32,7 +32,7 @@ public SwarmWorker(String ip, int port) { @Override public void run() { - ChatUtils.infoPrefix("Swarm", "Connected to Swarm host on at %s on port %s.", getIp(socket.getInetAddress().getHostAddress()), socket.getPort()); + ChatUtils.infoPrefix("module.swarm", "Connected to Swarm host on at %s on port %s.", getIp(socket.getInetAddress().getHostAddress()), socket.getPort()); try { DataInputStream in = new DataInputStream(socket.getInputStream()); @@ -42,12 +42,12 @@ public void run() { String read = in.readUTF(); if (read.startsWith("swarm")) { - ChatUtils.infoPrefix("Swarm", "Received command: (highlight)%s", read); + ChatUtils.infoPrefix("module.swarm", "Received command: (highlight)%s", read); try { Commands.dispatch(read); } catch (Exception e) { - ChatUtils.error("Error fetching command."); + ChatUtils.errorPrefix("module.swarm", "Error fetching command."); e.printStackTrace(); } } @@ -55,7 +55,7 @@ public void run() { in.close(); } catch (IOException e) { - ChatUtils.errorPrefix("Swarm", "Error in connection to host."); + ChatUtils.errorPrefix("module.swarm", "Error in connection to host."); e.printStackTrace(); disconnect(); } @@ -70,7 +70,7 @@ public void disconnect() { PathManagers.get().stop(); - ChatUtils.infoPrefix("Swarm", "Disconnected from host."); + ChatUtils.infoPrefix("module.swarm", "Disconnected from host."); interrupt(); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java index c6abd876b9..b510f82770 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java @@ -243,12 +243,12 @@ public static void printChatError(int i, Error error) { String caller = getCallerName(); if (caller != null) { - if (i != -1) ChatUtils.errorPrefix("Starscript", "%d, %d '%c': %s (from %s)", i, error.character, error.ch, error.message, caller); - else ChatUtils.errorPrefix("Starscript", "%d '%c': %s (from %s)", error.character, error.ch, error.message, caller); + if (i != -1) ChatUtils.errorPrefix("starscript.title", "%d, %d '%c': %s (from %s)", i, error.character, error.ch, error.message, caller); + else ChatUtils.errorPrefix("starscript.title", "%d '%c': %s (from %s)", error.character, error.ch, error.message, caller); } else { - if (i != -1) ChatUtils.errorPrefix("Starscript", "%d, %d '%c': %s", i, error.character, error.ch, error.message); - else ChatUtils.errorPrefix("Starscript", "%d '%c': %s", error.character, error.ch, error.message); + if (i != -1) ChatUtils.errorPrefix("starscript.title", "%d, %d '%c': %s", i, error.character, error.ch, error.message); + else ChatUtils.errorPrefix("starscript.title", "%d '%c': %s", error.character, error.ch, error.message); } } @@ -259,8 +259,8 @@ public static void printChatError(Error error) { public static void printChatError(StarscriptError e) { String caller = getCallerName(); - if (caller != null) ChatUtils.errorPrefix("Starscript", "%s (from %s)", e.getMessage(), caller); - else ChatUtils.errorPrefix("Starscript", "%s", e.getMessage()); + if (caller != null) ChatUtils.errorPrefix("starscript.title", "%s (from %s)", e.getMessage(), caller); + else ChatUtils.errorPrefix("starscript.title", "%s", e.getMessage()); } private static String getCallerName() { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java index c3e21511ad..d3fa35cefa 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java @@ -140,22 +140,22 @@ public static void sendMsg(int id, Formatting color, String message, Object... a sendMsg(id, null, null, color, message, args); } - public static void sendMsg(int id, @Nullable String prefixTitle, @Nullable Formatting prefixColor, Formatting messageColor, String messageContent, Object... args) { + public static void sendMsg(int id, @Nullable String prefixKey, @Nullable Formatting prefixColor, Formatting messageColor, String messageContent, Object... args) { MutableText message = formatMsg(String.format(messageContent, args), messageColor); - sendMsg(id, prefixTitle, prefixColor, message); + sendMsg(id, prefixKey, prefixColor, message); } - public static void sendMsg(int id, @Nullable String prefixTitle, @Nullable Formatting prefixColor, String messageContent, Formatting messageColor) { + public static void sendMsg(int id, @Nullable String prefixKey, @Nullable Formatting prefixColor, String messageContent, Formatting messageColor) { MutableText message = formatMsg(messageContent, messageColor); - sendMsg(id, prefixTitle, prefixColor, message); + sendMsg(id, prefixKey, prefixColor, message); } - public static void sendMsg(int id, @Nullable String prefixTitle, @Nullable Formatting prefixColor, Text msg) { + public static void sendMsg(int id, @Nullable String prefixKey, @Nullable Formatting prefixColor, Text msg) { if (mc.world == null) return; MutableText message = Text.empty(); message.append(getPrefix()); - if (prefixTitle != null) message.append(getCustomPrefix(prefixTitle, prefixColor)); + if (prefixKey != null) message.append(getCustomPrefix(prefixKey, prefixColor)); message.append(msg); if (!Config.get().deleteChatFeedback.get()) id = 0; @@ -164,13 +164,13 @@ public static void sendMsg(int id, @Nullable String prefixTitle, @Nullable Forma mc.execute(() -> ((IChatHud) mc.inGameHud.getChatHud()).meteor$add(message, finalId)); } - private static MutableText getCustomPrefix(String prefixTitle, Formatting prefixColor) { + private static MutableText getCustomPrefix(String prefixKey, Formatting prefixColor) { MutableText prefix = Text.empty(); prefix.setStyle(prefix.getStyle().withFormatting(Formatting.GRAY)); prefix.append("["); - MutableText moduleTitle = Text.literal(prefixTitle); + MutableText moduleTitle = MeteorClient.translatable(prefixKey); moduleTitle.setStyle(moduleTitle.getStyle().withFormatting(prefixColor)); prefix.append(moduleTitle); diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index 4ff468a7c2..36626bb1d6 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -4037,5 +4037,7 @@ "module.bow-aimbot.general.nametagged": "Nametagged", "module.bow-aimbot.general.nametagged.description": "Whether or not to attack mobs with a name tag.", "module.bow-aimbot.general.pause-on-combat": "Pause On Combat", - "module.bow-aimbot.general.pause-on-combat.description": "Freezes Baritone temporarily until you released the bow." + "module.bow-aimbot.general.pause-on-combat.description": "Freezes Baritone temporarily until you released the bow.", + + "starscript.title": "Starscript" } From ee7e199528dfb5ed1e16549136799befd32deb2e Mon Sep 17 00:00:00 2001 From: crosby-moe <32882447+crosby-moe@users.noreply.github.com> Date: Wed, 28 Jan 2026 14:11:32 -0500 Subject: [PATCH 55/72] add `ChatUtils` methods with translatable content support --- .../meteorclient/commands/Command.java | 27 +++++-- .../commands/commands/BindsCommand.java | 2 +- .../commands/commands/CommandsCommand.java | 2 +- .../commands/commands/FriendsCommand.java | 6 +- .../commands/commands/ModulesCommand.java | 2 +- .../commands/commands/ResetCommand.java | 8 +-- .../commands/commands/SwarmCommand.java | 4 +- .../meteorclient/mixin/BookScreenMixin.java | 2 +- .../mixin/ClientPlayNetworkHandlerMixin.java | 3 +- .../meteorclient/systems/modules/Module.java | 29 ++++++-- .../systems/modules/misc/Notifier.java | 8 +-- .../modules/misc/swarm/SwarmConnection.java | 8 +-- .../systems/modules/misc/swarm/SwarmHost.java | 8 +-- .../modules/misc/swarm/SwarmWorker.java | 12 ++-- .../utils/misc/MeteorStarscript.java | 12 ++-- .../meteorclient/utils/player/ChatUtils.java | 71 ++++++++++++++----- 16 files changed, 135 insertions(+), 69 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/Command.java b/src/main/java/meteordevelopment/meteorclient/commands/Command.java index d6381b4ff7..492c3964a9 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/Command.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/Command.java @@ -87,19 +87,34 @@ public void info(Text message) { ChatUtils.sendMsg(translationKey, message); } - public void info(String message, Object... args) { + public void info(String messageKey, Object... args) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.infoPrefix(translationKey, MeteorTranslations.translate(translationKey + ".info." + message, message, args)); // todo Textify body + ChatUtils.infoPrefix(translationKey, translationKey + ".info." + messageKey, args); } - public void warning(String message, Object... args) { + public void infoRaw(String message, Object... args) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.warningPrefix(translationKey, MeteorTranslations.translate(translationKey + ".warning." + message, message, args)); // todo Textify body + ChatUtils.infoPrefixRaw(translationKey, message, args); } - public void error(String message, Object... args) { + public void warning(String messageKey, Object... args) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.errorPrefix(translationKey, MeteorTranslations.translate(translationKey + ".error." + message, message, args)); // todo Textify body + ChatUtils.warningPrefix(translationKey, translationKey + ".warning." + messageKey, args); + } + + public void warningRaw(String message, Object... args) { + ChatUtils.forceNextPrefixClass(getClass()); + ChatUtils.warningPrefixRaw(translationKey, message, args); + } + + public void error(String messageKey, Object... args) { + ChatUtils.forceNextPrefixClass(getClass()); + ChatUtils.errorPrefix(translationKey, translationKey + ".error." + messageKey, args); + } + + public void errorRaw(String message, Object... args) { + ChatUtils.forceNextPrefixClass(getClass()); + ChatUtils.errorPrefixRaw(translationKey, message, args); } public MutableText translatable(String string, Object... args) { diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java index 76abdda30c..d1b8d42e39 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java @@ -31,7 +31,7 @@ public void build(LiteralArgumentBuilder builder) { .filter(module -> module.keybind.isSet()) .toList(); - ChatUtils.info("--- Bound Modules ((highlight)%d(default)) ---", modules.size()); + ChatUtils.infoRaw("--- Bound Modules ((highlight)%d(default)) ---", modules.size()); for (Module module : modules) { HoverEvent hoverEvent = new HoverEvent.ShowText(getTooltip(module)); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java index 6f0be6c8e1..76d0876c1a 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java @@ -26,7 +26,7 @@ public CommandsCommand() { @Override public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { - ChatUtils.info("--- Commands ((highlight)%d(default)) ---", Commands.COMMANDS.size()); + ChatUtils.infoRaw("--- Commands ((highlight)%d(default)) ---", Commands.COMMANDS.size()); MutableText commands = Text.literal(""); Commands.COMMANDS.forEach(command -> commands.append(getCommandText(command))); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java index 84d12f56c6..8f2840b0bd 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java @@ -30,7 +30,7 @@ public void build(LiteralArgumentBuilder builder) { Friend friend = new Friend(profile.name(), profile.id()); if (Friends.get().add(friend)) { - ChatUtils.sendMsg(friend.hashCode(), Formatting.GRAY, "Added (highlight)%s (default)to friends.".formatted(friend.getName())); + ChatUtils.sendMsgRaw(friend.hashCode(), Formatting.GRAY, "Added (highlight)%s (default)to friends.".formatted(friend.getName())); } else error("Already friends with that player."); @@ -49,7 +49,7 @@ public void build(LiteralArgumentBuilder builder) { } if (Friends.get().remove(friend)) { - ChatUtils.sendMsg(friend.hashCode(), Formatting.GRAY, "Removed (highlight)%s (default)from friends.".formatted(friend.getName())); + ChatUtils.sendMsgRaw(friend.hashCode(), Formatting.GRAY, "Removed (highlight)%s (default)from friends.".formatted(friend.getName())); } else error("Failed to remove that friend."); @@ -60,7 +60,7 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("list").executes(context -> { info("--- Friends ((highlight)%s(default)) ---", Friends.get().count()); - Friends.get().forEach(friend -> ChatUtils.info("(highlight)%s".formatted(friend.getName()))); + Friends.get().forEach(friend -> ChatUtils.infoRaw("(highlight)%s".formatted(friend.getName()))); return SINGLE_SUCCESS; }) ); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java index 8910ee97fe..b6d28610c4 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java @@ -24,7 +24,7 @@ public ModulesCommand() { @Override public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { - ChatUtils.info("--- Modules ((highlight)%d(default)) ---", Modules.get().getCount()); + ChatUtils.infoRaw("--- Modules ((highlight)%d(default)) ---", Modules.get().getCount()); Modules.loopCategories().forEach(category -> { MutableText categoryMessage = Text.literal(""); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java index a9db13805e..88fdc78e50 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java @@ -33,13 +33,13 @@ public void build(LiteralArgumentBuilder builder) { })) .then(literal("all").executes(context -> { Modules.get().getAll().forEach(module -> module.settings.forEach(group -> group.forEach(Setting::reset))); - ChatUtils.infoPrefix("tab.modules", "Reset all module settings"); + ChatUtils.infoPrefixRaw("tab.modules", "Reset all module settings"); return SINGLE_SUCCESS; })) ).then(literal("gui").executes(context -> { GuiThemes.get().clearWindowConfigs(); GuiThemes.get().settings.reset(); - ChatUtils.info("Reset all GUI settings."); + ChatUtils.infoRaw("Reset all GUI settings."); return SINGLE_SUCCESS; })).then(literal("bind") .then(argument("module", ModuleArgumentType.create()).executes(context -> { @@ -52,12 +52,12 @@ public void build(LiteralArgumentBuilder builder) { })) .then(literal("all").executes(context -> { Modules.get().getAll().forEach(module -> module.keybind.reset()); - ChatUtils.infoPrefix("tab.modules", "Reset all binds."); + ChatUtils.infoPrefixRaw("tab.modules", "Reset all binds."); return SINGLE_SUCCESS; })) ).then(literal("hud").executes(context -> { Hud.get().resetToDefaultElements(); - ChatUtils.infoPrefix("tab.hud", "Reset all elements."); + ChatUtils.infoPrefixRaw("tab.hud", "Reset all elements."); return SINGLE_SUCCESS; })); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java index d00b57f437..cc2281657b 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java @@ -111,11 +111,11 @@ public void build(LiteralArgumentBuilder builder) { if (swarm.isActive()) { if (swarm.isHost()) { if (swarm.host.getConnectionCount() > 0) { - ChatUtils.info("--- Swarm Connections (highlight)(%s/%s)(default) ---", swarm.host.getConnectionCount(), swarm.host.getConnections().length); + ChatUtils.infoRaw("--- Swarm Connections (highlight)(%s/%s)(default) ---", swarm.host.getConnectionCount(), swarm.host.getConnections().length); for (int i = 0; i < swarm.host.getConnections().length; i++) { SwarmConnection connection = swarm.host.getConnections()[i]; - if (connection != null) ChatUtils.info("(highlight)Worker %s(default): %s.", i, connection.getConnection()); + if (connection != null) ChatUtils.infoRaw("(highlight)Worker %s(default): %s.", i, connection.getConnection()); } } else { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java index 4da1997a8a..1936238b0f 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java @@ -73,7 +73,7 @@ private void onInit(CallbackInfo info) { long size = MemoryUtil.memLengthUTF8(encoded, true); if (size > available) { - ChatUtils.error("Could not copy to clipboard: Out of memory."); + ChatUtils.errorRaw("Could not copy to clipboard: Out of memory."); } else { GLFW.glfwSetClipboardString(mc.getWindow().getHandle(), encoded); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java index 876a80e776..3a7af0fe64 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java @@ -41,7 +41,6 @@ import net.minecraft.world.chunk.WorldChunk; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -151,7 +150,7 @@ private void onSendChatMessage(String message, CallbackInfo ci, @Local(argsOnly try { Commands.dispatch(message.substring(Config.get().prefix.get().length())); } catch (CommandSyntaxException e) { - ChatUtils.error(e.getMessage()); + ChatUtils.errorRaw(e.getMessage()); } client.inGameHud.getChatHud().addToMessageHistory(message); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java index 444cc2f2e5..fe201d007a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java @@ -118,7 +118,7 @@ public void disable() { public void sendToggledMsg() { if (Config.get().chatFeedback.get() && chatFeedback) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.sendMsg(this.hashCode(), Formatting.GRAY, "Toggled (highlight)%s(default) %s(default).", null /* todo translatable Text */, isActive() ? Formatting.GREEN + "on" : Formatting.RED + "off"); + ChatUtils.sendMsgRaw(this.hashCode(), Formatting.GRAY, "Toggled (highlight)%s(default) %s(default).", null /* todo translatable Text */, isActive() ? Formatting.GREEN + "on" : Formatting.RED + "off"); } } @@ -127,19 +127,34 @@ public void info(Text message) { ChatUtils.sendMsg(this.getTranslationKey(), message); } - public void info(String message, Object... args) { + public void info(String messageKey, Object... args) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.infoPrefix(this.getTranslationKey(), message, args); + ChatUtils.infoPrefix(this.getTranslationKey(), messageKey, args); } - public void warning(String message, Object... args) { + public void infoRaw(String message, Object... args) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.warningPrefix(this.getTranslationKey(), message, args); + ChatUtils.infoPrefixRaw(this.getTranslationKey(), message, args); } - public void error(String message, Object... args) { + public void warning(String messageKey, Object... args) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.errorPrefix(this.getTranslationKey(), message, args); + ChatUtils.warningPrefix(this.getTranslationKey(), messageKey, args); + } + + public void warningRaw(String message, Object... args) { + ChatUtils.forceNextPrefixClass(getClass()); + ChatUtils.warningPrefixRaw(this.getTranslationKey(), message, args); + } + + public void error(String messageKey, Object... args) { + ChatUtils.forceNextPrefixClass(getClass()); + ChatUtils.errorPrefix(this.getTranslationKey(), messageKey, args); + } + + public void errorRaw(String message, Object... args) { + ChatUtils.forceNextPrefixClass(getClass()); + ChatUtils.errorPrefixRaw(this.getTranslationKey(), message, args); } public boolean isActive() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java index a5dcf327c1..cc6dc6fd3e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java @@ -190,7 +190,7 @@ private void onEntityAdded(EntityAddedEvent event) { if (!event.entity.getUuid().equals(mc.player.getUuid()) && entities.get().contains(event.entity.getType()) && visualRange.get() && this.event.get() != Event.Despawn) { if (event.entity instanceof PlayerEntity) { if ((!visualRangeIgnoreFriends.get() || !Friends.get().isFriend(((PlayerEntity) event.entity))) && (!visualRangeIgnoreFakes.get() || !(event.entity instanceof FakePlayerEntity))) { - ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has entered your visual range!", event.entity.getName().getString()); + ChatUtils.sendMsgRaw(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has entered your visual range!", event.entity.getName().getString()); if (visualMakeSound.get()) mc.world.playSoundFromEntity(mc.player, mc.player, SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.AMBIENT, 3.0F, 1.0F); @@ -214,7 +214,7 @@ private void onEntityRemoved(EntityRemovedEvent event) { if (!event.entity.getUuid().equals(mc.player.getUuid()) && entities.get().contains(event.entity.getType()) && visualRange.get() && this.event.get() != Event.Spawn) { if (event.entity instanceof PlayerEntity) { if ((!visualRangeIgnoreFriends.get() || !Friends.get().isFriend(((PlayerEntity) event.entity))) && (!visualRangeIgnoreFakes.get() || !(event.entity instanceof FakePlayerEntity))) { - ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has left your visual range!", event.entity.getName().getString()); + ChatUtils.sendMsgRaw(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has left your visual range!", event.entity.getName().getString()); if (visualMakeSound.get()) mc.world.playSoundFromEntity(mc.player, mc.player, SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.AMBIENT, 3.0F, 1.0F); @@ -302,7 +302,7 @@ private void onReceivePacket(PacketEvent.Receive event) { double distance = PlayerUtils.distanceTo(entity); if (totemsDistanceCheck.get() && distance > totemsDistance.get()) return; - ChatUtils.sendMsg(getChatId(entity), Formatting.GRAY, "(highlight)%s (default)popped (highlight)%d (default)%s.", entity.getName().getString(), pops, pops == 1 ? "totem" : "totems"); + ChatUtils.sendMsgRaw(getChatId(entity), Formatting.GRAY, "(highlight)%s (default)popped (highlight)%d (default)%s.", entity.getName().getString(), pops, pops == 1 ? "totem" : "totems"); } } default -> {} @@ -331,7 +331,7 @@ private void onTick(TickEvent.Post event) { if (player.deathTime > 0 || player.getHealth() <= 0) { int pops = totemPopMap.removeInt(player.getUuid()); - ChatUtils.sendMsg(getChatId(player), Formatting.GRAY, "(highlight)%s (default)died after popping (highlight)%d (default)%s.", player.getName().getString(), pops, pops == 1 ? "totem" : "totems"); + ChatUtils.sendMsgRaw(getChatId(player), Formatting.GRAY, "(highlight)%s (default)died after popping (highlight)%d (default)%s.", player.getName().getString(), pops, pops == 1 ? "totem" : "totems"); chatIdMap.removeInt(player.getUuid()); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmConnection.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmConnection.java index 79f4156e7a..75e78ca881 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmConnection.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmConnection.java @@ -22,7 +22,7 @@ public SwarmConnection(Socket socket) { @Override public void run() { - ChatUtils.infoPrefix("module.swarm", "New worker connected on %s.", getIp(socket.getInetAddress().getHostAddress())); + ChatUtils.infoPrefixRaw("module.swarm", "New worker connected on %s.", getIp(socket.getInetAddress().getHostAddress())); try { DataOutputStream out = new DataOutputStream(socket.getOutputStream()); @@ -33,7 +33,7 @@ public void run() { out.writeUTF(messageToSend); out.flush(); } catch (Exception e) { - ChatUtils.errorPrefix("module.swarm", "Encountered error when sending command."); + ChatUtils.errorPrefixRaw("module.swarm", "Encountered error when sending command."); e.printStackTrace(); } @@ -43,7 +43,7 @@ public void run() { out.close(); } catch (IOException e) { - ChatUtils.infoPrefix("module.swarm", "Error creating a connection with %s on port %s.", getIp(socket.getInetAddress().getHostAddress()), socket.getPort()); + ChatUtils.infoPrefixRaw("module.swarm", "Error creating a connection with %s on port %s.", getIp(socket.getInetAddress().getHostAddress()), socket.getPort()); e.printStackTrace(); } } @@ -55,7 +55,7 @@ public void disconnect() { e.printStackTrace(); } - ChatUtils.infoPrefix("module.swarm", "Worker disconnected on ip: %s.", socket.getInetAddress().getHostAddress()); + ChatUtils.infoPrefixRaw("module.swarm", "Worker disconnected on ip: %s.", socket.getInetAddress().getHostAddress()); interrupt(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmHost.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmHost.java index 180c588669..89fe3a17f5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmHost.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmHost.java @@ -21,7 +21,7 @@ public SwarmHost(int port) { socket = new ServerSocket(port); } catch (IOException e) { socket = null; - ChatUtils.errorPrefix("module.swarm", "Couldn't start a server on port %s.", port); + ChatUtils.errorPrefixRaw("module.swarm", "Couldn't start a server on port %s.", port); e.printStackTrace(); } @@ -30,14 +30,14 @@ public SwarmHost(int port) { @Override public void run() { - ChatUtils.infoPrefix("module.swarm", "Listening for incoming connections on port %s.", socket.getLocalPort()); + ChatUtils.infoPrefixRaw("module.swarm", "Listening for incoming connections on port %s.", socket.getLocalPort()); while (!isInterrupted()) { try { Socket connection = socket.accept(); assignConnectionToSubServer(connection); } catch (IOException e) { - ChatUtils.errorPrefix("module.swarm", "Error making a connection to worker."); + ChatUtils.errorPrefixRaw("module.swarm", "Error making a connection to worker."); e.printStackTrace(); } } @@ -63,7 +63,7 @@ public void disconnect() { e.printStackTrace(); } - ChatUtils.infoPrefix("module.swarm", "Server closed on port %s.", socket.getLocalPort()); + ChatUtils.infoPrefixRaw("module.swarm", "Server closed on port %s.", socket.getLocalPort()); interrupt(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java index 9b3e00e8ef..249750cb07 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java @@ -23,7 +23,7 @@ public SwarmWorker(String ip, int port) { socket = new Socket(ip, port); } catch (Exception e) { socket = null; - ChatUtils.warningPrefix("module.swarm", "Server not found at %s on port %s.", ip, port); + ChatUtils.warningPrefixRaw("module.swarm", "Server not found at %s on port %s.", ip, port); e.printStackTrace(); } @@ -32,7 +32,7 @@ public SwarmWorker(String ip, int port) { @Override public void run() { - ChatUtils.infoPrefix("module.swarm", "Connected to Swarm host on at %s on port %s.", getIp(socket.getInetAddress().getHostAddress()), socket.getPort()); + ChatUtils.infoPrefixRaw("module.swarm", "Connected to Swarm host on at %s on port %s.", getIp(socket.getInetAddress().getHostAddress()), socket.getPort()); try { DataInputStream in = new DataInputStream(socket.getInputStream()); @@ -42,12 +42,12 @@ public void run() { String read = in.readUTF(); if (read.startsWith("swarm")) { - ChatUtils.infoPrefix("module.swarm", "Received command: (highlight)%s", read); + ChatUtils.infoPrefixRaw("module.swarm", "Received command: (highlight)%s", read); try { Commands.dispatch(read); } catch (Exception e) { - ChatUtils.errorPrefix("module.swarm", "Error fetching command."); + ChatUtils.errorPrefixRaw("module.swarm", "Error fetching command."); e.printStackTrace(); } } @@ -55,7 +55,7 @@ public void run() { in.close(); } catch (IOException e) { - ChatUtils.errorPrefix("module.swarm", "Error in connection to host."); + ChatUtils.errorPrefixRaw("module.swarm", "Error in connection to host."); e.printStackTrace(); disconnect(); } @@ -70,7 +70,7 @@ public void disconnect() { PathManagers.get().stop(); - ChatUtils.infoPrefix("module.swarm", "Disconnected from host."); + ChatUtils.infoPrefixRaw("module.swarm", "Disconnected from host."); interrupt(); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java index b510f82770..d521f11698 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java @@ -243,12 +243,12 @@ public static void printChatError(int i, Error error) { String caller = getCallerName(); if (caller != null) { - if (i != -1) ChatUtils.errorPrefix("starscript.title", "%d, %d '%c': %s (from %s)", i, error.character, error.ch, error.message, caller); - else ChatUtils.errorPrefix("starscript.title", "%d '%c': %s (from %s)", error.character, error.ch, error.message, caller); + if (i != -1) ChatUtils.errorPrefixRaw("starscript.title", "%d, %d '%c': %s (from %s)", i, error.character, error.ch, error.message, caller); + else ChatUtils.errorPrefixRaw("starscript.title", "%d '%c': %s (from %s)", error.character, error.ch, error.message, caller); } else { - if (i != -1) ChatUtils.errorPrefix("starscript.title", "%d, %d '%c': %s", i, error.character, error.ch, error.message); - else ChatUtils.errorPrefix("starscript.title", "%d '%c': %s", error.character, error.ch, error.message); + if (i != -1) ChatUtils.errorPrefixRaw("starscript.title", "%d, %d '%c': %s", i, error.character, error.ch, error.message); + else ChatUtils.errorPrefixRaw("starscript.title", "%d '%c': %s", error.character, error.ch, error.message); } } @@ -259,8 +259,8 @@ public static void printChatError(Error error) { public static void printChatError(StarscriptError e) { String caller = getCallerName(); - if (caller != null) ChatUtils.errorPrefix("starscript.title", "%s (from %s)", e.getMessage(), caller); - else ChatUtils.errorPrefix("starscript.title", "%s", e.getMessage()); + if (caller != null) ChatUtils.errorPrefixRaw("starscript.title", "%s (from %s)", e.getMessage(), caller); + else ChatUtils.errorPrefixRaw("starscript.title", "%s", e.getMessage()); } private static String getCallerName() { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java index d3fa35cefa..99e82aae7c 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java @@ -94,32 +94,56 @@ public static void sendPlayerMsg(String message, boolean addToHistory) { // Default - public static void info(String message, Object... args) { - sendMsg(Formatting.GRAY, message, args); + public static void info(String messageKey, Object... args) { + sendMsg(Formatting.GRAY, messageKey, args); } - public static void infoPrefix(String prefix, String message, Object... args) { - sendMsg(0, prefix, Formatting.LIGHT_PURPLE, Formatting.GRAY, message, args); + public static void infoRaw(String message, Object... args) { + sendMsgRaw(Formatting.GRAY, message, args); + } + + public static void infoPrefix(String prefix, String messageKey, Object... args) { + sendMsg(0, prefix, Formatting.LIGHT_PURPLE, Formatting.GRAY, messageKey, args); + } + + public static void infoPrefixRaw(String prefix, String message, Object... args) { + sendMsgRaw(0, prefix, Formatting.LIGHT_PURPLE, Formatting.GRAY, message, args); } // Warning - public static void warning(String message, Object... args) { - sendMsg(Formatting.YELLOW, message, args); + public static void warning(String messageKey, Object... args) { + sendMsg(Formatting.YELLOW, messageKey, args); + } + + public static void warningRaw(String message, Object... args) { + sendMsgRaw(Formatting.YELLOW, message, args); + } + + public static void warningPrefix(String prefix, String messageKey, Object... args) { + sendMsg(0, prefix, Formatting.LIGHT_PURPLE, Formatting.YELLOW, messageKey, args); } - public static void warningPrefix(String prefix, String message, Object... args) { - sendMsg(0, prefix, Formatting.LIGHT_PURPLE, Formatting.YELLOW, message, args); + public static void warningPrefixRaw(String prefix, String message, Object... args) { + sendMsgRaw(0, prefix, Formatting.LIGHT_PURPLE, Formatting.YELLOW, message, args); } // Error - public static void error(String message, Object... args) { - sendMsg(Formatting.RED, message, args); + public static void error(String messageKey, Object... args) { + sendMsg(Formatting.RED, messageKey, args); + } + + public static void errorRaw(String message, Object... args) { + sendMsgRaw(Formatting.RED, message, args); } - public static void errorPrefix(String prefix, String message, Object... args) { - sendMsg(0, prefix, Formatting.LIGHT_PURPLE, Formatting.RED, message, args); + public static void errorPrefix(String prefix, String messageKey, Object... args) { + sendMsg(0, prefix, Formatting.LIGHT_PURPLE, Formatting.RED, messageKey, args); + } + + public static void errorPrefixRaw(String prefix, String message, Object... args) { + sendMsgRaw(0, prefix, Formatting.LIGHT_PURPLE, Formatting.RED, message, args); } // Misc @@ -132,19 +156,32 @@ public static void sendMsg(String prefix, Text message) { sendMsg(0, prefix, Formatting.LIGHT_PURPLE, message); } - public static void sendMsg(Formatting color, String message, Object... args) { - sendMsg(0, null, null, color, message, args); + public static void sendMsg(Formatting color, String messageKey, Object... args) { + sendMsg(0, null, null, color, messageKey, args); } - public static void sendMsg(int id, Formatting color, String message, Object... args) { - sendMsg(id, null, null, color, message, args); + public static void sendMsgRaw(Formatting color, String message, Object... args) { + sendMsgRaw(0, null, null, color, message, args); } - public static void sendMsg(int id, @Nullable String prefixKey, @Nullable Formatting prefixColor, Formatting messageColor, String messageContent, Object... args) { + public static void sendMsg(int id, Formatting color, String messageKey, Object... args) { + sendMsg(id, null, null, color, messageKey, args); + } + + public static void sendMsgRaw(int id, Formatting color, String message, Object... args) { + sendMsgRaw(id, null, null, color, message, args); + } + + public static void sendMsgRaw(int id, @Nullable String prefixKey, @Nullable Formatting prefixColor, Formatting messageColor, String messageContent, Object... args) { MutableText message = formatMsg(String.format(messageContent, args), messageColor); sendMsg(id, prefixKey, prefixColor, message); } + public static void sendMsg(int id, @Nullable String prefixKey, @Nullable Formatting prefixColor, Formatting messageColor, String messageContentKey, Object... args) { + MutableText message = MeteorClient.translatable(messageContentKey, args).setStyle(Style.EMPTY.withFormatting(messageColor)); + sendMsg(id, prefixKey, prefixColor, message); + } + public static void sendMsg(int id, @Nullable String prefixKey, @Nullable Formatting prefixColor, String messageContent, Formatting messageColor) { MutableText message = formatMsg(messageContent, messageColor); sendMsg(id, prefixKey, prefixColor, message); From 479437ff634757398c2431226271eae0f3d6f075 Mon Sep 17 00:00:00 2001 From: crosby-moe <32882447+crosby-moe@users.noreply.github.com> Date: Wed, 28 Jan 2026 14:52:29 -0500 Subject: [PATCH 56/72] support for styled `Text` arguments --- .../utils/misc/MeteorTranslations.java | 16 ++- .../text/MeteorTranslatableTextComponent.java | 123 +++++++++++++++++- 2 files changed, 126 insertions(+), 13 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index 4424140ef7..32e312a3b9 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -110,25 +110,29 @@ public static void clearUnusedLanguages(String currentLanguageCode) { languages.keySet().removeIf(languageCode -> !languageCode.equals(EN_US_CODE) && !languageCode.equals(currentLanguageCode)); } - public static String translate(String key, Object... args) { + public static String translate(String key) { MeteorLanguage currentLang = getCurrentLanguage(); debug(currentLang, key); - String translated = currentLang.get(key, () -> getDefaultLanguage().get(key)); + return currentLang.get(key, () -> getDefaultLanguage().get(key)); + } + public static String translate(String key, Object... args) { try { - return String.format(translated, args); + return String.format(translate(key), args); } catch (IllegalFormatException e) { return key; } } - public static String translate(String key, String fallback, Object... args) { + public static String translate(String key, String fallback) { MeteorLanguage currentLang = getCurrentLanguage(); debug(currentLang, key); - String translated = currentLang.get(key, () -> getDefaultLanguage().get(key, fallback)); + return currentLang.get(key, () -> getDefaultLanguage().get(key, fallback)); + } + public static String translate(String key, String fallback, Object... args) { try { - return String.format(translated, args); + return String.format(translate(key, fallback), args); } catch (IllegalFormatException e) { return fallback; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java index 10f568660e..6962365a3c 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java @@ -5,16 +5,19 @@ package meteordevelopment.meteorclient.utils.misc.text; +import com.google.common.collect.ImmutableList; import com.mojang.serialization.MapCodec; import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; -import net.minecraft.text.StringVisitable; -import net.minecraft.text.Style; -import net.minecraft.text.TextContent; +import net.minecraft.text.*; import org.jetbrains.annotations.Nullable; import java.util.Arrays; +import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.function.Consumer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -23,14 +26,25 @@ public class MeteorTranslatableTextComponent implements TextContent { @Nullable private final String fallback; private final Object[] args; + private final boolean styledArgs; - private String translation; private String cachedLanguage; + private String translation; + private List translations = ImmutableList.of(); public MeteorTranslatableTextComponent(String key, @Nullable String fallback, Object... args) { this.key = key; this.fallback = fallback; this.args = args; + + boolean hasStyledArgs = false; + for (Object o : args) { + if (o instanceof Text) { + hasStyledArgs = true; + break; + } + } + this.styledArgs = hasStyledArgs; } public MeteorTranslatableTextComponent(String key, Object... args) { @@ -40,7 +54,19 @@ public MeteorTranslatableTextComponent(String key, Object... args) { private void updateTranslations() { if (!mc.options.language.equals(this.cachedLanguage)) { cachedLanguage = mc.options.language; - translation = fallback == null ? MeteorTranslations.translate(key, args) : MeteorTranslations.translate(key, fallback, args); + if (styledArgs) { + String template = fallback == null ? MeteorTranslations.translate(key) : MeteorTranslations.translate(key, fallback); + + try { + ImmutableList.Builder builder = ImmutableList.builder(); + this.forEachPart(template, builder::add); + this.translations = builder.build(); + } catch (TranslationException e) { + this.translations = ImmutableList.of(StringVisitable.plain(template)); + } + } else { + translation = fallback == null ? MeteorTranslations.translate(key, args) : MeteorTranslations.translate(key, fallback, args); + } } } @@ -48,14 +74,30 @@ private void updateTranslations() { public Optional visit(StringVisitable.StyledVisitor visitor, Style style) { updateTranslations(); - return visitor.accept(style, translation); + if (styledArgs) { + for (StringVisitable stringVisitable : translations) { + Optional result = stringVisitable.visit(visitor, style); + if (result.isPresent()) return result; + } + return Optional.empty(); + } else { + return visitor.accept(style, translation); + } } @Override public Optional visit(StringVisitable.Visitor visitor) { updateTranslations(); - return visitor.accept(translation); + if (styledArgs) { + for (StringVisitable stringVisitable : translations) { + Optional result = stringVisitable.visit(visitor); + if (result.isPresent()) return result; + } + return Optional.empty(); + } else { + return visitor.accept(translation); + } } @Override @@ -74,4 +116,71 @@ public boolean equals(@Nullable Object o) { public String toString() { return "MeteorTranslatableTextComponent[key=" + key + ", fallback=" + fallback + ", args=" + Arrays.toString(args) + "]"; } + + /// Bunch of bullshit from {@link net.minecraft.text.TranslatableTextContent} + private static final StringVisitable LITERAL_PERCENT_SIGN = StringVisitable.plain("%"); + private static final StringVisitable NULL_ARGUMENT = StringVisitable.plain("null"); + private static final Pattern ARG_FORMAT = Pattern.compile("%(?:(\\d+)\\$)?([A-Za-z%]|$)"); + + private void forEachPart(String translation, Consumer partsConsumer) { + Matcher matcher = ARG_FORMAT.matcher(translation); + + try { + int i = 0; + int j = 0; + + while (matcher.find(j)) { + int k = matcher.start(); + int l = matcher.end(); + if (k > j) { + String string = translation.substring(j, k); + if (string.indexOf(37) != -1) { + throw new IllegalArgumentException(); + } + + partsConsumer.accept(StringVisitable.plain(string)); + } + + String string = matcher.group(2); + String string2 = translation.substring(k, l); + if ("%".equals(string) && "%%".equals(string2)) { + partsConsumer.accept(LITERAL_PERCENT_SIGN); + } else { + if (!"s".equals(string)) { + throw new TranslationException(new TranslatableTextContent(this.key, this.fallback, this.args), "Unsupported format: '" + string2 + "'"); + } + + String string3 = matcher.group(1); + int m = string3 != null ? Integer.parseInt(string3) - 1 : i++; + partsConsumer.accept(this.getArg(m)); + } + + j = l; + } + + if (j < translation.length()) { + String string4 = translation.substring(j); + if (string4.indexOf(37) != -1) { + throw new IllegalArgumentException(); + } + + partsConsumer.accept(StringVisitable.plain(string4)); + } + } catch (IllegalArgumentException e) { + throw new TranslationException(new TranslatableTextContent(this.key, this.fallback, this.args), e); + } + } + + public final StringVisitable getArg(int index) { + if (index >= 0 && index < this.args.length) { + Object object = this.args[index]; + if (object instanceof Text text) { + return text; + } else { + return object == null ? NULL_ARGUMENT : StringVisitable.plain(object.toString()); + } + } else { + throw new TranslationException(new TranslatableTextContent(this.key, this.fallback, this.args), index); + } + } } From 2497b87694349650b1b03b47dd358bf8596bf8f0 Mon Sep 17 00:00:00 2001 From: crosby-moe <32882447+crosby-moe@users.noreply.github.com> Date: Fri, 30 Jan 2026 08:34:19 -0500 Subject: [PATCH 57/72] map some more command names --- .../meteorclient/commands/Command.java | 5 +- .../commands/commands/BindCommand.java | 6 +- .../commands/commands/BindsCommand.java | 2 +- .../commands/commands/CommandsCommand.java | 6 +- .../commands/commands/DamageCommand.java | 3 +- .../commands/commands/DisconnectCommand.java | 2 +- .../commands/commands/DropCommand.java | 4 +- .../commands/commands/EnchantCommand.java | 4 +- .../commands/commands/FakePlayerCommand.java | 2 +- .../commands/commands/FriendsCommand.java | 12 +- .../commands/commands/GiveCommand.java | 4 +- .../commands/commands/LocateCommand.java | 107 +++++++----------- .../commands/commands/NameHistoryCommand.java | 6 +- .../assets/meteor-client/language/en_us.json | 84 +++++++++++++- 14 files changed, 157 insertions(+), 90 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/Command.java b/src/main/java/meteordevelopment/meteorclient/commands/Command.java index 492c3964a9..76be9caabf 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/Command.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/Command.java @@ -11,7 +11,6 @@ import com.mojang.brigadier.builder.RequiredArgumentBuilder; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.systems.config.Config; -import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.client.MinecraftClient; import net.minecraft.command.CommandRegistryAccess; @@ -124,4 +123,8 @@ public MutableText translatable(String string, Object... args) { public MutableText translatable(String string, String fallback, Object... args) { return MeteorClient.translatable(translationKey + "." + string, fallback, args); } + + public MutableText getTitle() { + return MeteorClient.translatable(translationKey); + } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java index 98302c02fd..9556c94a4f 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java @@ -10,6 +10,7 @@ import meteordevelopment.meteorclient.commands.arguments.ModuleArgumentType; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.command.CommandSource; public class BindCommand extends Command { @@ -23,7 +24,10 @@ public void build(LiteralArgumentBuilder builder) { Module module = context.getArgument("module", Module.class); Modules.get().setModuleToBind(module); Modules.get().awaitKeyRelease(); - module.info("Press a key to bind the module to."); + + ChatUtils.forceNextPrefixClass(module.getClass()); + ChatUtils.infoPrefix(module.getTranslationKey(), this.translationKey + ".info.press_key"); + return SINGLE_SUCCESS; })); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java index d1b8d42e39..cbf7d79a13 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java @@ -31,7 +31,7 @@ public void build(LiteralArgumentBuilder builder) { .filter(module -> module.keybind.isSet()) .toList(); - ChatUtils.infoRaw("--- Bound Modules ((highlight)%d(default)) ---", modules.size()); + ChatUtils.info(translationKey + ".info.bound_modules", modules.size()); for (Module module : modules) { HoverEvent hoverEvent = new HoverEvent.ShowText(getTooltip(module)); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java index 76d0876c1a..ae3a44a070 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java @@ -26,7 +26,7 @@ public CommandsCommand() { @Override public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { - ChatUtils.infoRaw("--- Commands ((highlight)%d(default)) ---", Commands.COMMANDS.size()); + ChatUtils.info(translationKey + ".info.commands", Commands.COMMANDS.size()); MutableText commands = Text.literal(""); Commands.COMMANDS.forEach(command -> commands.append(getCommandText(command))); @@ -40,7 +40,7 @@ private MutableText getCommandText(Command command) { // Hover tooltip MutableText tooltip = Text.literal(""); - tooltip.append(Text.literal(Utils.nameToTitle(command.getName())).formatted(Formatting.BLUE, Formatting.BOLD)).append("\n"); + tooltip.append(command.getTitle().formatted(Formatting.BLUE, Formatting.BOLD)).append("\n"); MutableText aliases = Text.literal(Config.get().prefix.get() + command.getName()); if (!command.getAliases().isEmpty()) { @@ -56,7 +56,7 @@ private MutableText getCommandText(Command command) { tooltip.append(command.translatable("description")).formatted(Formatting.WHITE); // Text - MutableText text = Text.literal(Utils.nameToTitle(command.getName())); + MutableText text = command.getTitle(); if (command != Commands.COMMANDS.getLast()) text.append(Text.literal(", ").formatted(Formatting.GRAY)); text.setStyle(text diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DamageCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DamageCommand.java index 653f411b9e..005acc0d27 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DamageCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DamageCommand.java @@ -8,6 +8,7 @@ import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.NoFall; @@ -18,7 +19,7 @@ import net.minecraft.util.math.Vec3d; public class DamageCommand extends Command { - private final static SimpleCommandExceptionType INVULNERABLE = new SimpleCommandExceptionType(Text.literal("You are invulnerable.")); + private final static SimpleCommandExceptionType INVULNERABLE = new SimpleCommandExceptionType(MeteorClient.translatable("command.damage.exception.invulnerable")); public DamageCommand() { super("damage", "dmg"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java index 2cfa733b92..56d3244f20 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java @@ -21,7 +21,7 @@ public DisconnectCommand() { @Override public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { - mc.player.networkHandler.onDisconnect(new DisconnectS2CPacket(translatable("disconnection_message", Formatting.GRAY, Formatting.BLUE, Formatting.GRAY))); + mc.player.networkHandler.onDisconnect(new DisconnectS2CPacket(translatable("disconnection_message", this.getTitle().formatted(Formatting.BLUE)).formatted(Formatting.GRAY))); return SINGLE_SUCCESS; }); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java index e03c181216..1dc16bf880 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java @@ -22,8 +22,8 @@ import net.minecraft.item.Items; public class DropCommand extends Command { - private static final SimpleCommandExceptionType NOT_SPECTATOR = new SimpleCommandExceptionType(MeteorClient.translatable("meteor.command.drop.exception.not_spectator")); - private static final SimpleCommandExceptionType NO_SUCH_ITEM = new SimpleCommandExceptionType(MeteorClient.translatable("meteor.command.drop.exception.no_such_item")); + private static final SimpleCommandExceptionType NOT_SPECTATOR = new SimpleCommandExceptionType(MeteorClient.translatable("command.drop.exception.not_spectator")); + private static final SimpleCommandExceptionType NO_SUCH_ITEM = new SimpleCommandExceptionType(MeteorClient.translatable("command.drop.exception.no_such_item")); public DropCommand() { super("drop"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java index d9dc46cb3c..b00a5e91a2 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java @@ -24,8 +24,8 @@ import java.util.function.ToIntFunction; public class EnchantCommand extends Command { - private static final SimpleCommandExceptionType NOT_IN_CREATIVE = new SimpleCommandExceptionType(MeteorClient.translatable("meteor.command.enchant.exception.not_in_creative")); - private static final SimpleCommandExceptionType NOT_HOLDING_ITEM = new SimpleCommandExceptionType(MeteorClient.translatable("meteor.command.enchant.exception.not_holding_item")); + private static final SimpleCommandExceptionType NOT_IN_CREATIVE = new SimpleCommandExceptionType(MeteorClient.translatable("command.enchant.exception.not_in_creative")); + private static final SimpleCommandExceptionType NOT_HOLDING_ITEM = new SimpleCommandExceptionType(MeteorClient.translatable("command.enchant.exception.not_holding_item")); public EnchantCommand() { super("enchant"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java index 09dd5e3797..5418679c0d 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java @@ -63,7 +63,7 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("list") .executes(context -> { - info("--- Fake Players ((highlight)%s(default)) ---", FakePlayerManager.count()); + info("fake_players", FakePlayerManager.count()); FakePlayerManager.forEach(fp -> info("(highlight)%s".formatted(fp.getName().getString()))); return SINGLE_SUCCESS; }) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java index 8f2840b0bd..8660c3bba5 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java @@ -30,9 +30,9 @@ public void build(LiteralArgumentBuilder builder) { Friend friend = new Friend(profile.name(), profile.id()); if (Friends.get().add(friend)) { - ChatUtils.sendMsgRaw(friend.hashCode(), Formatting.GRAY, "Added (highlight)%s (default)to friends.".formatted(friend.getName())); + ChatUtils.sendMsg(friend.hashCode(), Formatting.GRAY, translationKey + ".info.added", friend.getName()); } - else error("Already friends with that player."); + else error("already_friends"); return SINGLE_SUCCESS; }) @@ -44,14 +44,14 @@ public void build(LiteralArgumentBuilder builder) { .executes(context -> { Friend friend = FriendArgumentType.get(context); if (friend == null) { - error("Not friends with that player."); + error("not_friends"); return SINGLE_SUCCESS; } if (Friends.get().remove(friend)) { - ChatUtils.sendMsgRaw(friend.hashCode(), Formatting.GRAY, "Removed (highlight)%s (default)from friends.".formatted(friend.getName())); + ChatUtils.sendMsg(friend.hashCode(), Formatting.GRAY, translationKey + ".info.removed", friend.getName()); } - else error("Failed to remove that friend."); + else error("failed"); return SINGLE_SUCCESS; }) @@ -59,7 +59,7 @@ public void build(LiteralArgumentBuilder builder) { ); builder.then(literal("list").executes(context -> { - info("--- Friends ((highlight)%s(default)) ---", Friends.get().count()); + info("friends", Friends.get().count()); Friends.get().forEach(friend -> ChatUtils.infoRaw("(highlight)%s".formatted(friend.getName()))); return SINGLE_SUCCESS; }) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java index 83b4e8bc12..4cf2d1c3bb 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java @@ -19,8 +19,8 @@ import net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket; public class GiveCommand extends Command { - private final static SimpleCommandExceptionType NOT_IN_CREATIVE = new SimpleCommandExceptionType(MeteorClient.translatable("meteor.command.give.exception.not_in_creative")); - private final static SimpleCommandExceptionType NO_SPACE = new SimpleCommandExceptionType(MeteorClient.translatable("meteor.command.give.exception.no_space")); + private final static SimpleCommandExceptionType NOT_IN_CREATIVE = new SimpleCommandExceptionType(MeteorClient.translatable("command.give.exception.not_in_creative")); + private final static SimpleCommandExceptionType NO_SPACE = new SimpleCommandExceptionType(MeteorClient.translatable("command.give.exception.no_space")); public GiveCommand() { super("give"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java index 32062c3935..da75d98264 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java @@ -79,28 +79,25 @@ public void build(LiteralArgumentBuilder builder) { if (stack.getItem() != Items.FILLED_MAP || stack.get(DataComponentTypes.ITEM_NAME) == null || !stack.get(DataComponentTypes.ITEM_NAME).getString().equals(Text.translatable("filled_map.buried_treasure").getString())) { - error("You need to hold a (highlight)buried treasure map(default)!"); + error("no_buried_treasure_map"); return SINGLE_SUCCESS; } MapDecorationsComponent mapDecorationsComponent = stack.get(DataComponentTypes.MAP_DECORATIONS); if (mapDecorationsComponent == null) { - error("Couldn't locate the map icons!"); + error("no_map_icons"); return SINGLE_SUCCESS; } for (MapDecorationsComponent.Decoration decoration : mapDecorationsComponent.decorations().values()) { if (decoration.type().value().assetId().toString().equals("minecraft:red_x")) { Vec3d coords = new Vec3d(decoration.x(), 62, decoration.z()); - MutableText text = Text.literal("Buried Treasure located at "); - text.append(ChatUtils.formatCoords(coords)); - text.append("."); - info(text); + info("buried_treasure", ChatUtils.formatCoords(coords)); return SINGLE_SUCCESS; } } - error("Couldn't locate the buried treasure!"); + error("cant_locate_buried_treasure"); return SINGLE_SUCCESS; })); @@ -109,28 +106,25 @@ public void build(LiteralArgumentBuilder builder) { if (stack.getItem() != Items.FILLED_MAP || stack.get(DataComponentTypes.ITEM_NAME) == null || !stack.get(DataComponentTypes.ITEM_NAME).getString().equals(Text.translatable("filled_map.mansion").getString())) { - error("You need to hold a (highlight)woodland explorer map(default)!"); + error("no_woodland_explorer_map"); return SINGLE_SUCCESS; } MapDecorationsComponent mapDecorationsComponent = stack.get(DataComponentTypes.MAP_DECORATIONS); if (mapDecorationsComponent == null) { - error("Couldn't locate the map icons!"); + error("no_map_icons"); return SINGLE_SUCCESS; } for (MapDecorationsComponent.Decoration decoration : mapDecorationsComponent.decorations().values()) { if (decoration.type().value().assetId().toString().equals("minecraft:woodland_mansion")) { Vec3d coords = new Vec3d(decoration.x(), 62, decoration.z()); - MutableText text = Text.literal("Mansion located at "); - text.append(ChatUtils.formatCoords(coords)); - text.append("."); - info(text); + info("mansion", ChatUtils.formatCoords(coords)); return SINGLE_SUCCESS; } } - error("Couldn't locate the mansion!"); + error("cant_locate_mansion"); return SINGLE_SUCCESS; })); @@ -142,22 +136,19 @@ public void build(LiteralArgumentBuilder builder) { MapDecorationsComponent mapDecorationsComponent = stack.get(DataComponentTypes.MAP_DECORATIONS); if (mapDecorationsComponent == null) { - error("Couldn't locate the map icons!"); + error("no_map_icons"); return SINGLE_SUCCESS; } for (MapDecorationsComponent.Decoration decoration : mapDecorationsComponent.decorations().values()) { if (decoration.type().value().assetId().toString().equals("minecraft:ocean_monument")) { Vec3d coords = new Vec3d(decoration.x(), 62, decoration.z()); - MutableText text = Text.literal("Monument located at "); - text.append(ChatUtils.formatCoords(coords)); - text.append("."); - info(text); + info("monument", ChatUtils.formatCoords(coords)); return SINGLE_SUCCESS; } } - error("Couldn't locate the monument!"); + error("cant_locate_monument"); return SINGLE_SUCCESS; } @@ -165,17 +156,14 @@ public void build(LiteralArgumentBuilder builder) { if (BaritoneUtils.IS_AVAILABLE) { Vec3d coords = findByBlockList(monumentBlocks); if (coords == null) { - error("No monument found. Try using an (highlight)ocean explorer map(default) for more success."); + error("no_monument_found"); return SINGLE_SUCCESS; } - MutableText text = Text.literal("Monument located at "); - text.append(ChatUtils.formatCoords(coords)); - text.append("."); - info(text); + info("monument", ChatUtils.formatCoords(coords)); return SINGLE_SUCCESS; } - error("Locating this structure without an (highlight)ocean explorer map(default) requires Baritone."); + error("ocean_explorer_no_baritone"); return SINGLE_SUCCESS; })); @@ -189,19 +177,16 @@ public void build(LiteralArgumentBuilder builder) { secondStart = null; secondEnd = null; MeteorClient.EVENT_BUS.subscribe(this); - info("Please throw the first Eye of Ender"); + info("first_eye"); } else if (BaritoneUtils.IS_AVAILABLE) { Vec3d coords = findByBlockList(strongholdBlocks); if (coords == null) { - error("No stronghold found nearby. You can use (highlight)Ender Eyes(default) for more success."); + error("no_stronghold_found"); return SINGLE_SUCCESS; } - MutableText text = Text.literal("Stronghold located at "); - text.append(ChatUtils.formatCoords(coords)); - text.append("."); - info(text); + info("stronghold", ChatUtils.formatCoords(coords)); } else { - error("No Eyes of Ender found in hotbar."); + error("no_eyes_of_ender"); } return SINGLE_SUCCESS; @@ -211,24 +196,22 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("nether_fortress").executes(s -> { if (mc.world.getRegistryKey() != World.NETHER) { - error("You need to be in the nether to locate a nether fortress."); + error("not_in_nether"); return SINGLE_SUCCESS; } if (!BaritoneUtils.IS_AVAILABLE) { - error("Locating this structure requires Baritone."); + error("no_baritone"); return SINGLE_SUCCESS; } Vec3d coords = findByBlockList(netherFortressBlocks); if (coords == null) { - error("No nether fortress found."); + error("cant_locate_nether_fortress"); return SINGLE_SUCCESS; } - MutableText text = Text.literal("Fortress located at "); - text.append(ChatUtils.formatCoords(coords)); - text.append("."); - info(text); + + info("nether_fortress", ChatUtils.formatCoords(coords)); return SINGLE_SUCCESS; })); @@ -236,24 +219,22 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("end_city").executes(s -> { if (mc.world.getRegistryKey() != World.END) { - error("You need to be in the end to locate an end city."); + error("not_in_end"); return SINGLE_SUCCESS; } if (!BaritoneUtils.IS_AVAILABLE) { - error("Locating this structure requires Baritone."); + error("no_baritone"); return SINGLE_SUCCESS; } Vec3d coords = findByBlockList(endCityBlocks); if (coords == null) { - error("No end city found."); + error("cant_locate_end_city"); return SINGLE_SUCCESS; } - MutableText text = Text.literal("End city located at "); - text.append(ChatUtils.formatCoords(coords)); - text.append("."); - info(text); + + info("end_city", ChatUtils.formatCoords(coords)); return SINGLE_SUCCESS; })); @@ -262,30 +243,28 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("lodestone").executes(s -> { ItemStack stack = mc.player.getInventory().getSelectedStack(); if (stack.getItem() != Items.COMPASS) { - error("You need to hold a (highlight)lodestone(default) compass!"); + error("no_lodestone_compass"); return SINGLE_SUCCESS; } ComponentMap components = stack.getComponents(); if (components == null) { - error("Couldn't get the components data. Are you holding a (highlight)lodestone(default) compass?"); + error("no_lodestone_compass_data"); return SINGLE_SUCCESS; } LodestoneTrackerComponent lodestoneTrackerComponent = components.get(DataComponentTypes.LODESTONE_TRACKER); if (lodestoneTrackerComponent == null) { - error("Couldn't get the components data. Are you holding a (highlight)lodestone(default) compass?"); + error("no_lodestone_compass_data"); return SINGLE_SUCCESS; } if (lodestoneTrackerComponent.target().isEmpty()) { - error("Couldn't get the lodestone's target!"); + error("no_lodestone"); return SINGLE_SUCCESS; } Vec3d coords = Vec3d.of(lodestoneTrackerComponent.target().get().pos()); - MutableText text = Text.literal("Lodestone located at "); - text.append(ChatUtils.formatCoords(coords)); - text.append("."); - info(text); + + info("lodestone", ChatUtils.formatCoords(coords)); return SINGLE_SUCCESS; })); @@ -296,7 +275,7 @@ public void build(LiteralArgumentBuilder builder) { } private void cancel() { - warning("Locate canceled"); + warning("canceled"); MeteorClient.EVENT_BUS.unsubscribe(this); } @@ -306,7 +285,7 @@ private void cancel() { return null; } if (posList.size() < 3) { - warning("Only %d block(s) found. This search might be a false positive.", posList.size()); + warning("false_positive", posList.size()); } return new Vec3d(posList.getFirst().getX(), posList.getFirst().getY(), posList.getFirst().getZ()); } @@ -335,11 +314,11 @@ private void firstPosition(double x, double y, double z) { } private void lastPosition(double x, double y, double z) { - info("%s Eye of Ender's trajectory saved.", (this.firstEnd == null) ? "First" : "Second"); + info(this.firstEnd == null ? "first_eye_saved" : "second_eye_saved"); Vec3d pos = new Vec3d(x, y, z); if (this.firstEnd == null) { this.firstEnd = pos; - info("Please throw the second Eye Of Ender from a different location."); + info("eye_different_location"); } else { this.secondEnd = pos; findStronghold(); @@ -350,7 +329,7 @@ private void findStronghold() { PathManagers.get().stop(); if (this.firstStart == null || this.firstEnd == null || this.secondStart == null || this.secondEnd == null) { - error("Missing position data"); + error("missing_position_data"); cancel(); return; } @@ -359,17 +338,15 @@ private void findStronghold() { final double[] end = new double[]{this.firstStart.x, this.firstStart.z, this.firstEnd.x, this.firstEnd.z}; final double[] intersection = calcIntersection(start, end); if (Double.isNaN(intersection[0]) || Double.isNaN(intersection[1]) || Double.isInfinite(intersection[0]) || Double.isInfinite(intersection[1])) { - error("Unable to calculate intersection."); + error("unable_to_calculate"); cancel(); return; } MeteorClient.EVENT_BUS.unsubscribe(this); Vec3d coords = new Vec3d(intersection[0], 0, intersection[1]); - MutableText text = Text.literal("Stronghold roughly located at "); - text.append(ChatUtils.formatCoords(coords)); - text.append("."); - info(text); + + info("stronghold", ChatUtils.formatCoords(coords)); } private double[] calcIntersection(double[] line, double[] line2) { diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java index ba5b8aea0c..306cd7fb74 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java @@ -60,20 +60,20 @@ public void build(LiteralArgumentBuilder builder) { ) ) .withHoverEvent(new HoverEvent.ShowText( - Text.literal("View on laby.net") + Text.literal("View on laby.net") // todo map .formatted(Formatting.YELLOW) .formatted(Formatting.ITALIC) )) ); - info(initial.append(Text.literal(" Username History:").formatted(Formatting.GRAY))); + info(initial.append(Text.literal(" Username History:").formatted(Formatting.GRAY))); // todo map for (Name entry : history.username_history) { MutableText nameText = Text.literal(entry.name); nameText.formatted(Formatting.AQUA); if (entry.changed_at != null && entry.changed_at.getTime() != 0) { - MutableText changed = Text.literal("Changed at: "); + MutableText changed = Text.literal("Changed at: "); // todo map changed.formatted(Formatting.GRAY); DateFormat formatter = new SimpleDateFormat("hh:mm:ss, dd/MM/yyyy"); diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index 36626bb1d6..a65ec99c1a 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -14,30 +14,57 @@ "tab.pathing": "Pathing", "tab.profiles": "Profiles", + "command.bind": "Bind", "command.bind.description": "Binds a specified module to the next pressed key.", + "command.bind.info.press_key": "Press a key to bind the module to.", + "command.binds": "Binds", "command.binds.description": "List of all bound modules.", + "command.binds.info.bound_modules": "--- Bound Modules ((highlight)%s(default)) ---", + "command.commands": "Commands", "command.commands.description": "List of all commands.", + "command.commands.info.commands": "--- Commands ((highlight)%s(default)) ----", + "command.damage": "Damage", "command.damage.description": "Damages self.", + "command.damage.exception.invulnerable": "You are invulnerable.", + "command.disconnect": "Disconnect", "command.disconnect.description": "Disconnect from the server", - "command.disconnect.disconnection_message": "%s[%sDisconnectCommand%s] Disconnected by user.", + "command.disconnect.disconnection_message": "[%1$s] Disconnected by user.", + "command.dismount": "Dismount", "command.dismount.description": "Dismounts you from entity you are riding.", + "command.drop": "Drop", "command.drop.description": "Automatically drops specified items.", "command.drop.exception.no_such_item": "Could not find an item with that name!", "command.drop.exception.not_spectator": "Can't drop items while in spectator.", + "command.enchant": "Enchant", "command.enchant.description": "Enchants the item in your hand. REQUIRES Creative mode.", "command.enchant.exception.not_holding_item": "You need to hold some item to enchant.", "command.enchant.exception.not_in_creative": "You must be in creative mode to use this.", + "command.ender-chest": "Ender Chest", "command.ender-chest.description": "Allows you to preview memory of your ender chest.", + "command.fake-player": "Fake Player", "command.fake-player.description": "Manages fake players that you can use for testing.", "command.fake-player.error.not_found": "Couldn't find a Fake Player with that name.", "command.fake-player.info.removed": "Removed Fake Player %s.", + "command.fake-player.info.fake_players": "--- Fake Players ((highlight)%s(default)) ---", + "command.fov": "FOV", "command.fov.description": "Changes your fov.", + "command.friends": "Friends", "command.friends.description": "Manages friends.", + "command.friends.error.already_friends": "Already friends with that player.", + "command.friends.error.failed": "Failed to remove that friend.", + "command.friends.error.not_friends": "Not friends with that player.", + "command.friends.info.added": "Added %s to friends.", + "command.friends.info.removed": "Removed %s from friends.", + "command.friends.info.friends": "--- Friends ((highlight)%s(default)) ---", + "command.gamemode": "Gamemode", "command.gamemode.description": "Changes your gamemode client-side.", + "command.give": "Give", "command.give.description": "Gives you any item.", "command.give.exception.not_in_creative": "You must be in creative mode to use this.", "command.give.exception.no_space": "No space in hotbar.", + "command.hclip": "H-Clip", "command.hclip.description": "Lets you clip through blocks horizontally.", + "command.input": "Input", "command.input.description": "Keyboard input simulation.", "command.input.info.cleared_handlers": "Cleared all keypress handlers.", "command.input.info.active_handlers": "Active keypress handlers: ", @@ -45,42 +72,97 @@ "command.input.info.removed_handler": "Removed keypress handler.", "command.input.warning.no_handlers": "No active keypress handlers.", "command.input.warning.out_of_range": "Index out of range.", + "command.inventory": "Inventory", "command.inventory.description": "Allows you to see parts of another player's inventory.", + "command.locate": "Locate", "command.locate.description": "Locates structures", + "command.locate.error.no_map_icons": "Couldn't locate the map icons!", + "command.locate.error.no_buried_treasure_map": "You need to hold a (highlight)buried treasure map(default)!", + "command.locate.error.cant_locate_buried_treasure": "Couldn't locate the buried treasure!", + "command.locate.error.no_woodland_explorer_map": "You need to hold a (highlight)woodland explorer map(default)!", + "command.locate.error.cant_locate_mansion": "Couldn't locate the mansion!", + "command.locate.error.cant_locate_monument": "Couldn't locate the monument!", + "command.locate.error.no_monument_found": "No monument found. Try using an (highlight)ocean explorer map(default) for more success.", + "command.locate.error.ocean_explorer_no_baritone": "Locating this structure without an (highlight)ocean explorer map(default) requires Baritone.", + "command.locate.error.no_stronghold_found": "No stronghold found nearby. You can use (highlight)Ender Eyes(default) for more success.", + "command.locate.error.no_eyes_of_ender": "No Eyes of Ender found in hotbar.", + "command.locate.error.not_in_nether": "You need to be in the nether to locate a nether fortress.", + "command.locate.error.no_baritone": "Locating this structure requires Baritone.", + "command.locate.error.cant_locate_nether_fortress": "No nether fortress found.", + "command.locate.error.not_in_end": "You need to be in the end to locate an end city.", + "command.locate.error.cant_locate_end_city": "No end city found.", + "command.locate.error.no_lodestone_compass": "You need to hold a (highlight)lodestone(default) compass!", + "command.locate.error.no_lodestone_compass_data": "Couldn't get the components data. Are you holding a (highlight)lodestone(default) compass?", + "command.locate.error.no_lodestone": "Couldn't get the lodestone's target!", + "command.locate.error.missing_position_data": "Missing position data", + "command.locate.error.unable_to_calculate": "Unable to calculate intersection.", + "command.locate.info.buried_treasure": "Buried Treasure located at %1$s.", + "command.locate.info.mansion": "Mansion located at %1$s.", + "command.locate.info.monument": "Monument located at %1$s.", + "command.locate.info.first_eye": "Please throw the first Eye of Ender.", + "command.locate.info.stronghold": "Stronghold located at %1$s.", + "command.locate.info.nether_fortress": "Fortress located at %1$s.", + "command.locate.info.end_city": "End city located at %1$s.", + "command.locate.info.lodestone": "Lodestone located at %1$s.", + "command.locate.info.first_eye_saved": "First Eye of Ender's trajectory saved.", + "command.locate.info.second_eye_saved": "Second Eye of Ender's trajectory saved.", + "command.locate.info.eye_different_location": "Please throw the second Eye Of Ender from a different location.", + "command.locate.warning.canceled": "Locate canceled", + "command.locate.warning.false_positive": "Only %d block(s) found. This search might be a false positive.", + "command.macro": "Macro", "command.macro.description": "Allows you to execute macros.", "command.macro.error.none_scheduled": "No macros are currently scheduled.", "command.macro.error.not_scheduled": "This macro is not currently scheduled.", "command.macro.info.cleared_all": "Cleared all scheduled macros.", "command.macro.info.cleared": "Cleared scheduled macro.", + "command.modules": "Modules", "command.modules.description": "Displays a list of all modules.", + "command.name-history": "Name History", "command.name-history.description": "Provides a list of a players previous names from the laby.net api", "command.name-history.error.error_fetching_name": "There was an error fetching that users name history.", "command.name-history.inaccurate": "This name history entry is not accurate according to laby.net", + "command.nbt": "NBT", "command.nbt.description": "Modifies NBT data for an item, example: .nbt add {display:{Name:'{\"text\":\"$cRed Name\"}'}}", + "command.notebot": "Notebot", "command.notebot.description": "Allows you load notebot files", + "command.peek": "Peek", "command.peek.description": "Lets you see what's inside storage block items.", + "command.profiles": "Profiles", "command.profiles.description": "Loads and saves profiles.", "command.profiles.info.loaded": "Loaded profile (highlight)%s(default).", "command.profiles.info.saved": "Saved profile (highlight)%s(default).", "command.profiles.info.deleted": "Deleted profile (highlight)%s(default).", + "command.reload": "Reload", "command.reload.description": "Reloads many systems.", "command.reload.warning.reloading": "Reloading systems, this may take a while.", + "command.reset": "Reset", "command.reset.description": "Resets specified settings.", + "command.rotation": "Rotation", "command.rotation.description": "Modifies your rotation.", + "command.save-map": "Save Map", "command.save-map.description": "Saves a map to an image.", "command.save-map.error.error_writing_texture": "Error writing map texture", "command.save-map.exception.map_not_found": "You must be holding a filled map.", "command.save-map.exception.oops": "Something went wrong.", + "command.say": "Say", "command.say.description": "Sends messages in chat.", + "command.server": "Server", "command.server.description": "Prints server information", + "command.settings": "Settings", "command.settings.description": "Allows you to view and change module settings.", + "command.spectate": "Spectate", "command.spectate.description": "Allows you to spectate nearby players", + "command.swarm": "Swarm", "command.swarm.description": "Sends commands to connected swarm workers.", + "command.toggle": "Toggle", "command.toggle.description": "Toggles a module.", + "command.vclip": "V-Clip", "command.vclip.description": "Lets you clip through blocks vertically.", + "command.wasp": "Wasp", "command.wasp.description": "Sets the auto wasp target.", "command.wasp.exception.cant_wasp_self": "You cannot target yourself!", "command.wasp.info.target": "%s set as target.", + "command.waypoint": "Waypoint", "command.waypoint.description": "Manages waypoints.", "config.visual.custom-font": "Custom Font", From d542241e2f10c95fb4fc7c76782a783c2374801c Mon Sep 17 00:00:00 2001 From: crosby-moe <32882447+crosby-moe@users.noreply.github.com> Date: Fri, 30 Jan 2026 09:35:55 -0500 Subject: [PATCH 58/72] complex translation argument formatting guh --- .../commands/commands/BindsCommand.java | 2 +- .../commands/commands/CommandsCommand.java | 3 +- .../commands/commands/FakePlayerCommand.java | 3 +- .../commands/commands/FriendsCommand.java | 2 +- .../commands/commands/InputCommand.java | 5 +- .../text/MeteorTranslatableTextComponent.java | 121 ++++++++++-------- .../meteorclient/utils/player/ChatUtils.java | 16 ++- .../assets/meteor-client/language/en_us.json | 10 +- 8 files changed, 89 insertions(+), 73 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java index cbf7d79a13..aa19887cf3 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java @@ -31,7 +31,7 @@ public void build(LiteralArgumentBuilder builder) { .filter(module -> module.keybind.isSet()) .toList(); - ChatUtils.info(translationKey + ".info.bound_modules", modules.size()); + ChatUtils.info(translationKey + ".info.bound_modules", ChatUtils.highlight(modules.size())); for (Module module : modules) { HoverEvent hoverEvent = new HoverEvent.ShowText(getTooltip(module)); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java index ae3a44a070..ca5e1de059 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java @@ -9,7 +9,6 @@ import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.commands.Commands; import meteordevelopment.meteorclient.systems.config.Config; -import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.command.CommandSource; import net.minecraft.text.ClickEvent; @@ -26,7 +25,7 @@ public CommandsCommand() { @Override public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { - ChatUtils.info(translationKey + ".info.commands", Commands.COMMANDS.size()); + ChatUtils.info(translationKey + ".info.commands", ChatUtils.highlight(Commands.COMMANDS.size())); MutableText commands = Text.literal(""); Commands.COMMANDS.forEach(command -> commands.append(getCommandText(command))); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java index 5418679c0d..8dd8213bc2 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java @@ -13,6 +13,7 @@ import meteordevelopment.meteorclient.systems.modules.player.FakePlayer; import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity; import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerManager; +import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.command.CommandSource; public class FakePlayerCommand extends Command { @@ -63,7 +64,7 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("list") .executes(context -> { - info("fake_players", FakePlayerManager.count()); + info("fake_players", ChatUtils.highlight(FakePlayerManager.count())); FakePlayerManager.forEach(fp -> info("(highlight)%s".formatted(fp.getName().getString()))); return SINGLE_SUCCESS; }) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java index 8660c3bba5..83d7ec38c7 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java @@ -59,7 +59,7 @@ public void build(LiteralArgumentBuilder builder) { ); builder.then(literal("list").executes(context -> { - info("friends", Friends.get().count()); + info("friends", ChatUtils.highlight(Friends.get().count())); Friends.get().forEach(friend -> ChatUtils.infoRaw("(highlight)%s".formatted(friend.getName()))); return SINGLE_SUCCESS; }) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java index c5e96ce16c..1a17bd4ebf 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java @@ -12,6 +12,7 @@ import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.mixin.KeyBindingAccessor; +import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.option.KeyBinding; import net.minecraft.client.resource.language.I18n; @@ -92,10 +93,10 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("list").executes(ctx -> { if (activeHandlers.isEmpty()) warning("no_handlers"); else { - info(""); + info("active_handlers"); for (int i = 0; i < activeHandlers.size(); i++) { KeypressHandler handler = activeHandlers.get(i); - info("keypress_handler", i, I18n.translate(handler.key.getId()), handler.ticks, handler.totalTicks); + info("keypress_handler", ChatUtils.highlight(i), ChatUtils.highlight(I18n.translate(handler.key.getId())), ChatUtils.highlight(handler.ticks), ChatUtils.highlight(handler.totalTicks)); } } return SINGLE_SUCCESS; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java index 6962365a3c..1f89367989 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java @@ -7,14 +7,14 @@ import com.google.common.collect.ImmutableList; import com.mojang.serialization.MapCodec; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; +import meteordevelopment.meteorclient.utils.player.ChatUtils; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.text.*; import org.jetbrains.annotations.Nullable; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.Optional; +import java.util.*; import java.util.function.Consumer; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -22,6 +22,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class MeteorTranslatableTextComponent implements TextContent { + private static final boolean DEBUG_MISSING_ENTRIES = FabricLoader.getInstance().isDevelopmentEnvironment() || Boolean.getBoolean("meteor.lang.debug"); private final String key; @Nullable private final String fallback; @@ -29,7 +30,6 @@ public class MeteorTranslatableTextComponent implements TextContent { private final boolean styledArgs; private String cachedLanguage; - private String translation; private List translations = ImmutableList.of(); public MeteorTranslatableTextComponent(String key, @Nullable String fallback, Object... args) { @@ -62,10 +62,15 @@ private void updateTranslations() { this.forEachPart(template, builder::add); this.translations = builder.build(); } catch (TranslationException e) { + if (DEBUG_MISSING_ENTRIES) { + MeteorClient.LOG.warn("Error translating text", e); + } this.translations = ImmutableList.of(StringVisitable.plain(template)); } } else { - translation = fallback == null ? MeteorTranslations.translate(key, args) : MeteorTranslations.translate(key, fallback, args); + String template = fallback == null ? MeteorTranslations.translate(key, args) : MeteorTranslations.translate(key, fallback, args); + + this.translations = ImmutableList.of(ChatUtils.formatMsg(template, Style.EMPTY)); } } } @@ -74,30 +79,22 @@ private void updateTranslations() { public Optional visit(StringVisitable.StyledVisitor visitor, Style style) { updateTranslations(); - if (styledArgs) { - for (StringVisitable stringVisitable : translations) { - Optional result = stringVisitable.visit(visitor, style); - if (result.isPresent()) return result; - } - return Optional.empty(); - } else { - return visitor.accept(style, translation); + for (StringVisitable stringVisitable : translations) { + Optional result = stringVisitable.visit(visitor, style); + if (result.isPresent()) return result; } + return Optional.empty(); } @Override public Optional visit(StringVisitable.Visitor visitor) { updateTranslations(); - if (styledArgs) { - for (StringVisitable stringVisitable : translations) { - Optional result = stringVisitable.visit(visitor); - if (result.isPresent()) return result; - } - return Optional.empty(); - } else { - return visitor.accept(translation); + for (StringVisitable stringVisitable : translations) { + Optional result = stringVisitable.visit(visitor); + if (result.isPresent()) return result; } + return Optional.empty(); } @Override @@ -117,49 +114,76 @@ public String toString() { return "MeteorTranslatableTextComponent[key=" + key + ", fallback=" + fallback + ", args=" + Arrays.toString(args) + "]"; } - /// Bunch of bullshit from {@link net.minecraft.text.TranslatableTextContent} + private static final StringVisitable LITERAL_PERCENT_SIGN = StringVisitable.plain("%"); private static final StringVisitable NULL_ARGUMENT = StringVisitable.plain("null"); - private static final Pattern ARG_FORMAT = Pattern.compile("%(?:(\\d+)\\$)?([A-Za-z%]|$)"); + // %, optional position argument (\d$), string format (s) || percent literal (%|$) || number format ([-+.]? \d* [df]) + @SuppressWarnings("RegExpRedundantEscape") // then why does it IllegalArgumentException when i remove it dipshit + private static final Pattern ARG_FORMAT = Pattern.compile("%(?:(\\d+)\\$)?([s%]|$|[-+\\.]?\\d*[df])"); private void forEachPart(String translation, Consumer partsConsumer) { Matcher matcher = ARG_FORMAT.matcher(translation); try { - int i = 0; - int j = 0; - - while (matcher.find(j)) { - int k = matcher.start(); - int l = matcher.end(); - if (k > j) { - String string = translation.substring(j, k); + int argPosition = 0; + int charIndex = 0; + + while (matcher.find(charIndex)) { + int start = matcher.start(); + int end = matcher.end(); + if (start > charIndex) { + String string = translation.substring(charIndex, start); if (string.indexOf(37) != -1) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException(string); } partsConsumer.accept(StringVisitable.plain(string)); } String string = matcher.group(2); - String string2 = translation.substring(k, l); + String string2 = translation.substring(start, end); if ("%".equals(string) && "%%".equals(string2)) { partsConsumer.accept(LITERAL_PERCENT_SIGN); } else { - if (!"s".equals(string)) { - throw new TranslationException(new TranslatableTextContent(this.key, this.fallback, this.args), "Unsupported format: '" + string2 + "'"); + String positionArgument = matcher.group(1); + int index = positionArgument != null ? Integer.parseInt(positionArgument) - 1 : argPosition++; + if (index < 0 || index >= this.args.length) { + throw new TranslationException(new TranslatableTextContent(this.key, this.fallback, this.args), index); } - String string3 = matcher.group(1); - int m = string3 != null ? Integer.parseInt(string3) - 1 : i++; - partsConsumer.accept(this.getArg(m)); + Object argument = this.args[index]; + + if (string.equals("s")) { // fast path + StringVisitable visitableArgument = argument instanceof StringVisitable visitable ? visitable + : argument == null ? NULL_ARGUMENT : StringVisitable.plain(argument.toString()); + + partsConsumer.accept(visitableArgument); + } else if (argument instanceof StringVisitable) { + if (argument instanceof MutableText mutableText && mutableText.getSiblings().isEmpty() && mutableText.getContent() instanceof PlainTextContent content) { + try { // attempt to use formatting + String format = "%" + string; + partsConsumer.accept(StringVisitable.styled(String.format(format, content.string()), mutableText.getStyle())); + } catch (IllegalFormatException e) { + throw new TranslationException(new TranslatableTextContent(this.key, this.fallback, this.args), index); + } + } else { // cant use format strings on non-constant/complex arguments + throw new TranslationException(new TranslatableTextContent(this.key, this.fallback, this.args), "Cant use complex format string with Text"); + } + } else { // attempt to use formatting + try { + String format = "%" + string; + partsConsumer.accept(StringVisitable.plain(String.format(format, argument))); + } catch (IllegalFormatException e) { + throw new TranslationException(new TranslatableTextContent(this.key, this.fallback, this.args), index); + } + } } - j = l; + charIndex = end; } - if (j < translation.length()) { - String string4 = translation.substring(j); + if (charIndex < translation.length()) { + String string4 = translation.substring(charIndex); if (string4.indexOf(37) != -1) { throw new IllegalArgumentException(); } @@ -170,17 +194,4 @@ private void forEachPart(String translation, Consumer partsCons throw new TranslationException(new TranslatableTextContent(this.key, this.fallback, this.args), e); } } - - public final StringVisitable getArg(int index) { - if (index >= 0 && index < this.args.length) { - Object object = this.args[index]; - if (object instanceof Text text) { - return text; - } else { - return object == null ? NULL_ARGUMENT : StringVisitable.plain(object.toString()); - } - } else { - throw new TranslationException(new TranslatableTextContent(this.key, this.fallback, this.args), index); - } - } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java index 99e82aae7c..dc0be270fc 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java @@ -173,7 +173,7 @@ public static void sendMsgRaw(int id, Formatting color, String message, Object.. } public static void sendMsgRaw(int id, @Nullable String prefixKey, @Nullable Formatting prefixColor, Formatting messageColor, String messageContent, Object... args) { - MutableText message = formatMsg(String.format(messageContent, args), messageColor); + MutableText message = formatMsg(String.format(messageContent, args), Style.EMPTY.withFormatting(messageColor)); sendMsg(id, prefixKey, prefixColor, message); } @@ -183,7 +183,7 @@ public static void sendMsg(int id, @Nullable String prefixKey, @Nullable Formatt } public static void sendMsg(int id, @Nullable String prefixKey, @Nullable Formatting prefixColor, String messageContent, Formatting messageColor) { - MutableText message = formatMsg(messageContent, messageColor); + MutableText message = formatMsg(messageContent, Style.EMPTY.withFormatting(messageColor)); sendMsg(id, prefixKey, prefixColor, message); } @@ -253,10 +253,10 @@ private static Text getPrefix() { return PREFIX; } - private static MutableText formatMsg(String message, Formatting defaultColor) { + public static MutableText formatMsg(String message, Style defaultStyle) { StringReader reader = new StringReader(message); MutableText text = Text.empty(); - Style style = Style.EMPTY.withFormatting(defaultColor); + Style style = defaultStyle; StringBuilder result = new StringBuilder(); boolean formatting = false; while (reader.canRead()) { @@ -272,7 +272,7 @@ private static MutableText formatMsg(String message, Formatting defaultColor) { if (formatting && c == ')') { switch (result.toString()) { case "(default)" -> { - style = style.withFormatting(defaultColor); + style = defaultStyle; result.setLength(0); } case "(highlight)" -> { @@ -298,9 +298,13 @@ private static MutableText formatMsg(String message, Formatting defaultColor) { return text; } + public static MutableText highlight(Object object) { + return Text.literal(String.valueOf(object)).formatted(Formatting.WHITE); + } + public static MutableText formatCoords(Vec3d pos) { String coordsString = String.format("(highlight)(underline)%.0f, %.0f, %.0f(default)", pos.x, pos.y, pos.z); - MutableText coordsText = formatMsg(coordsString, Formatting.GRAY); + MutableText coordsText = formatMsg(coordsString, Style.EMPTY.withFormatting(Formatting.GRAY)); if (BaritoneUtils.IS_AVAILABLE) { Style style = coordsText.getStyle().withFormatting(Formatting.BOLD) diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index a65ec99c1a..cff1d492e4 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -19,10 +19,10 @@ "command.bind.info.press_key": "Press a key to bind the module to.", "command.binds": "Binds", "command.binds.description": "List of all bound modules.", - "command.binds.info.bound_modules": "--- Bound Modules ((highlight)%s(default)) ---", + "command.binds.info.bound_modules": "--- Bound Modules (%s) ---", "command.commands": "Commands", "command.commands.description": "List of all commands.", - "command.commands.info.commands": "--- Commands ((highlight)%s(default)) ----", + "command.commands.info.commands": "--- Commands (%s) ----", "command.damage": "Damage", "command.damage.description": "Damages self.", "command.damage.exception.invulnerable": "You are invulnerable.", @@ -45,7 +45,7 @@ "command.fake-player.description": "Manages fake players that you can use for testing.", "command.fake-player.error.not_found": "Couldn't find a Fake Player with that name.", "command.fake-player.info.removed": "Removed Fake Player %s.", - "command.fake-player.info.fake_players": "--- Fake Players ((highlight)%s(default)) ---", + "command.fake-player.info.fake_players": "--- Fake Players (%s) ---", "command.fov": "FOV", "command.fov.description": "Changes your fov.", "command.friends": "Friends", @@ -55,7 +55,7 @@ "command.friends.error.not_friends": "Not friends with that player.", "command.friends.info.added": "Added %s to friends.", "command.friends.info.removed": "Removed %s from friends.", - "command.friends.info.friends": "--- Friends ((highlight)%s(default)) ---", + "command.friends.info.friends": "--- Friends (%s) ---", "command.gamemode": "Gamemode", "command.gamemode.description": "Changes your gamemode client-side.", "command.give": "Give", @@ -68,7 +68,7 @@ "command.input.description": "Keyboard input simulation.", "command.input.info.cleared_handlers": "Cleared all keypress handlers.", "command.input.info.active_handlers": "Active keypress handlers: ", - "command.input.info.keypress_handler": "(highlight)%d(default) - (highlight)%s %d(default) ticks left out of (highlight)%d(default).", + "command.input.info.keypress_handler": "%s - %s %s ticks left out of %s.", "command.input.info.removed_handler": "Removed keypress handler.", "command.input.warning.no_handlers": "No active keypress handlers.", "command.input.warning.out_of_range": "Index out of range.", From 9d575d15e3f563f9f5ba2903bc1f99d5d0e8d9dd Mon Sep 17 00:00:00 2001 From: crosby-moe <32882447+crosby-moe@users.noreply.github.com> Date: Thu, 5 Feb 2026 09:22:11 -0500 Subject: [PATCH 59/72] map more commands --- .../commands/commands/LocateCommand.java | 17 ++-- .../commands/commands/NbtCommand.java | 22 +++--- .../commands/commands/NotebotCommand.java | 16 ++-- .../commands/commands/PeekCommand.java | 4 +- .../commands/commands/ProfilesCommand.java | 7 +- .../commands/commands/ResetCommand.java | 14 ++-- .../commands/commands/SaveMapCommand.java | 4 +- .../commands/commands/ServerCommand.java | 77 +++++++++---------- .../assets/meteor-client/language/en_us.json | 77 ++++++++++++++----- 9 files changed, 140 insertions(+), 98 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java index da75d98264..b580a71c75 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java @@ -30,6 +30,7 @@ import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket; import net.minecraft.text.MutableText; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; @@ -79,7 +80,7 @@ public void build(LiteralArgumentBuilder builder) { if (stack.getItem() != Items.FILLED_MAP || stack.get(DataComponentTypes.ITEM_NAME) == null || !stack.get(DataComponentTypes.ITEM_NAME).getString().equals(Text.translatable("filled_map.buried_treasure").getString())) { - error("no_buried_treasure_map"); + error("no_buried_treasure_map", Text.translatable("filled_map.buried_treasure").formatted(Formatting.WHITE)); return SINGLE_SUCCESS; } @@ -106,7 +107,7 @@ public void build(LiteralArgumentBuilder builder) { if (stack.getItem() != Items.FILLED_MAP || stack.get(DataComponentTypes.ITEM_NAME) == null || !stack.get(DataComponentTypes.ITEM_NAME).getString().equals(Text.translatable("filled_map.mansion").getString())) { - error("no_woodland_explorer_map"); + error("no_woodland_explorer_map", Text.translatable("filled_map.mansion").formatted(Formatting.WHITE)); return SINGLE_SUCCESS; } @@ -156,14 +157,14 @@ public void build(LiteralArgumentBuilder builder) { if (BaritoneUtils.IS_AVAILABLE) { Vec3d coords = findByBlockList(monumentBlocks); if (coords == null) { - error("no_monument_found"); + error("no_monument_found", Text.translatable("filled_map.monument").formatted(Formatting.WHITE)); return SINGLE_SUCCESS; } info("monument", ChatUtils.formatCoords(coords)); return SINGLE_SUCCESS; } - error("ocean_explorer_no_baritone"); + error("ocean_explorer_no_baritone", Text.translatable("filled_map.monument").formatted(Formatting.WHITE)); return SINGLE_SUCCESS; })); @@ -181,7 +182,7 @@ public void build(LiteralArgumentBuilder builder) { } else if (BaritoneUtils.IS_AVAILABLE) { Vec3d coords = findByBlockList(strongholdBlocks); if (coords == null) { - error("no_stronghold_found"); + error("no_stronghold_found", Text.translatable("item.minecraft.ender_eye").formatted(Formatting.WHITE)); return SINGLE_SUCCESS; } info("stronghold", ChatUtils.formatCoords(coords)); @@ -243,17 +244,17 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("lodestone").executes(s -> { ItemStack stack = mc.player.getInventory().getSelectedStack(); if (stack.getItem() != Items.COMPASS) { - error("no_lodestone_compass"); + error("no_lodestone_compass", Text.translatable("item.minecraft.lodestone_compass").formatted(Formatting.WHITE)); return SINGLE_SUCCESS; } ComponentMap components = stack.getComponents(); if (components == null) { - error("no_lodestone_compass_data"); + error("no_lodestone_compass_data", Text.translatable("item.minecraft.lodestone_compass").formatted(Formatting.WHITE)); return SINGLE_SUCCESS; } LodestoneTrackerComponent lodestoneTrackerComponent = components.get(DataComponentTypes.LODESTONE_TRACKER); if (lodestoneTrackerComponent == null) { - error("no_lodestone_compass_data"); + error("no_lodestone_compass_data", Text.translatable("item.minecraft.lodestone_compass").formatted(Formatting.WHITE)); return SINGLE_SUCCESS; } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java index 667b28c421..507699acfe 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java @@ -10,6 +10,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import com.mojang.serialization.DataResult; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.commands.arguments.ComponentMapArgumentType; import meteordevelopment.meteorclient.utils.misc.text.MeteorClickEvent; @@ -42,12 +43,12 @@ public class NbtCommand extends Command { error -> Text.stringifiedTranslatable("arguments.item.malformed", error) ); private final Text copyButton = Text.literal("NBT").setStyle(Style.EMPTY - .withFormatting(Formatting.UNDERLINE) + .withFormatting(Formatting.UNDERLINE, Formatting.WHITE) .withClickEvent(new MeteorClickEvent( this.toString("copy") )) .withHoverEvent(new HoverEvent.ShowText( - Text.literal("Copy the NBT data to your clipboard.") + MeteorClient.translatable(translationKey + ".info.copy_tooltip") ))); public NbtCommand() { @@ -169,23 +170,20 @@ public void build(LiteralArgumentBuilder builder) { DataCommandObject dataCommandObject = new EntityDataObject(mc.player); NbtPathArgumentType.NbtPath handPath = NbtPathArgumentType.NbtPath.parse("SelectedItem"); - MutableText text = Text.empty().append(copyButton); + Text nbtText = Text.literal("{}").formatted(Formatting.WHITE); String nbt = "{}"; try { List nbtElement = handPath.get(dataCommandObject.getNbt()); if (!nbtElement.isEmpty()) { - text.append(" ").append(NbtHelper.toPrettyPrintedText(nbtElement.getFirst())); + nbtText = Text.empty().append(NbtHelper.toPrettyPrintedText(nbtElement.getFirst())).formatted(Formatting.WHITE); nbt = nbtElement.getFirst().toString(); } - } catch (CommandSyntaxException e) { - text.append("{}"); - } + } catch (CommandSyntaxException ignored) {} mc.keyboard.setClipboard(nbt); - text.append(" data copied!"); - info(text); + info("copy", copyButton, nbtText); return SINGLE_SUCCESS; })); @@ -197,7 +195,7 @@ public void build(LiteralArgumentBuilder builder) { int count = IntegerArgumentType.getInteger(context, "count"); stack.setCount(count); setStack(stack); - info("Set mainhand stack count to %s.", count); + info("count", count); } return SINGLE_SUCCESS; @@ -210,12 +208,12 @@ private void setStack(ItemStack stack) { private boolean validBasic(ItemStack stack) { if (!mc.player.getAbilities().creativeMode) { - error("Creative mode only."); + error("not_creative"); return false; } if (stack == ItemStack.EMPTY) { - error("You must hold an item in your main hand."); + error("no_item"); return false; } return true; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java index cf6822fb2e..6eba86f857 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java @@ -34,8 +34,8 @@ import java.util.Map; public class NotebotCommand extends Command { - private static final SimpleCommandExceptionType INVALID_SONG = new SimpleCommandExceptionType(Text.literal("Invalid song.")); - private static final DynamicCommandExceptionType INVALID_PATH = new DynamicCommandExceptionType(object -> Text.literal("'%s' is not a valid path.".formatted(object))); + private static final SimpleCommandExceptionType INVALID_SONG = new SimpleCommandExceptionType(MeteorClient.translatable("command.notebot.error.invalid_song")); + private static final DynamicCommandExceptionType INVALID_PATH = new DynamicCommandExceptionType(object -> MeteorClient.translatable("command.notebot.error.invalid_path", object)); int ticks = -1; private final Map> song = new HashMap<>(); // tick -> notes @@ -111,13 +111,13 @@ public void build(LiteralArgumentBuilder builder) { ticks = -1; song.clear(); MeteorClient.EVENT_BUS.subscribe(this); - info("Recording started"); + info("recording_started"); return SINGLE_SUCCESS; }))); builder.then(literal("record").then(literal("cancel").executes(ctx -> { MeteorClient.EVENT_BUS.unsubscribe(this); - info("Recording cancelled"); + info("recording_cancelled"); return SINGLE_SUCCESS; }))); @@ -176,9 +176,9 @@ private void saveRecording(Path path) { } file.close(); - info("Song saved."); + info("song_saved"); } catch (IOException e) { - info("Couldn't create the file."); + error("cant_create_file"); MeteorClient.EVENT_BUS.unsubscribe(this); } @@ -198,13 +198,13 @@ private Note getNote(PlaySoundS2CPacket soundPacket) { } if (noteLevel == -1) { - error("Error while bruteforcing a note level! Sound: " + soundPacket.getSound().value() + " Pitch: " + pitch); + error("bruteforce", soundPacket.getSound().value(), pitch); return null; } NoteBlockInstrument instrument = getInstrumentFromSound(soundPacket.getSound().value()); if (instrument == null) { - error("Can't find the instrument from sound! Sound: " + soundPacket.getSound().value()); + error("instrument", soundPacket.getSound().value()); return null; } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java index 77d2ac6dcf..b0e393daff 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java @@ -7,16 +7,16 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.utils.Utils; import net.minecraft.command.CommandSource; import net.minecraft.entity.decoration.ItemFrameEntity; import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; public class PeekCommand extends Command { private static final ItemStack[] ITEMS = new ItemStack[27]; - private static final SimpleCommandExceptionType CANT_PEEK = new SimpleCommandExceptionType(Text.literal("You must be holding a storage block or looking at an item frame.")); + private static final SimpleCommandExceptionType CANT_PEEK = new SimpleCommandExceptionType(MeteorClient.translatable("command.peek.error.cant_peek")); public PeekCommand() { super("peek"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java index f8b0b7c25d..c3237e36e6 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java @@ -10,6 +10,7 @@ import meteordevelopment.meteorclient.commands.arguments.ProfileArgumentType; import meteordevelopment.meteorclient.systems.profiles.Profile; import meteordevelopment.meteorclient.systems.profiles.Profiles; +import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.command.CommandSource; public class ProfilesCommand extends Command { @@ -25,7 +26,7 @@ public void build(LiteralArgumentBuilder builder) { if (profile != null) { profile.load(); - info("loaded", profile.name.get()); + info("loaded", ChatUtils.highlight(profile.name.get())); } return SINGLE_SUCCESS; @@ -36,7 +37,7 @@ public void build(LiteralArgumentBuilder builder) { if (profile != null) { profile.save(); - info("saved", profile.name.get()); + info("saved", ChatUtils.highlight(profile.name.get())); } return SINGLE_SUCCESS; @@ -47,7 +48,7 @@ public void build(LiteralArgumentBuilder builder) { if (profile != null) { Profiles.get().remove(profile); - info("deleted", profile.name.get()); + info("deleted", ChatUtils.highlight(profile.name.get())); } return SINGLE_SUCCESS; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java index 88fdc78e50..badda137ad 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java @@ -28,36 +28,38 @@ public void build(LiteralArgumentBuilder builder) { .then(argument("module", ModuleArgumentType.create()).executes(context -> { Module module = context.getArgument("module", Module.class); module.settings.forEach(group -> group.forEach(Setting::reset)); - module.info("Reset all settings."); + ChatUtils.forceNextPrefixClass(module.getClass()); + ChatUtils.infoPrefix(module.getTranslationKey(), "command.reset.info.module"); return SINGLE_SUCCESS; })) .then(literal("all").executes(context -> { Modules.get().getAll().forEach(module -> module.settings.forEach(group -> group.forEach(Setting::reset))); - ChatUtils.infoPrefixRaw("tab.modules", "Reset all module settings"); + ChatUtils.infoPrefix("tab.modules", "command.reset.info.modules"); return SINGLE_SUCCESS; })) ).then(literal("gui").executes(context -> { GuiThemes.get().clearWindowConfigs(); GuiThemes.get().settings.reset(); - ChatUtils.infoRaw("Reset all GUI settings."); + ChatUtils.info("command.reset.info.gui"); return SINGLE_SUCCESS; })).then(literal("bind") .then(argument("module", ModuleArgumentType.create()).executes(context -> { Module module = context.getArgument("module", Module.class); module.keybind.reset(); - module.info("Reset bind."); + ChatUtils.forceNextPrefixClass(module.getClass()); + ChatUtils.infoPrefix(module.getTranslationKey(), "command.reset.info.bind"); return SINGLE_SUCCESS; })) .then(literal("all").executes(context -> { Modules.get().getAll().forEach(module -> module.keybind.reset()); - ChatUtils.infoPrefixRaw("tab.modules", "Reset all binds."); + ChatUtils.infoPrefix("tab.modules", "command.reset.info.binds"); return SINGLE_SUCCESS; })) ).then(literal("hud").executes(context -> { Hud.get().resetToDefaultElements(); - ChatUtils.infoPrefixRaw("tab.hud", "Reset all elements."); + ChatUtils.infoPrefix("tab.hud", "command.reset.info.hud"); return SINGLE_SUCCESS; })); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java index 668893f56b..7f08e467bf 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java @@ -32,8 +32,8 @@ import java.nio.ByteBuffer; public class SaveMapCommand extends Command { - private static final SimpleCommandExceptionType MAP_NOT_FOUND = new SimpleCommandExceptionType(MeteorClient.translatable("meteor.command.save-map.exception.map_not_found")); - private static final SimpleCommandExceptionType OOPS = new SimpleCommandExceptionType(MeteorClient.translatable("meteor.command.save-map.exception.oops")); + private static final SimpleCommandExceptionType MAP_NOT_FOUND = new SimpleCommandExceptionType(MeteorClient.translatable("command.save-map.exception.map_not_found")); + private static final SimpleCommandExceptionType OOPS = new SimpleCommandExceptionType(MeteorClient.translatable("command.save-map.exception.oops")); private final PointerBuffer filters; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java index 746b2b91a7..a781970756 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java @@ -13,6 +13,7 @@ import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.mixin.ClientPlayNetworkHandlerAccessor; +import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.meteorclient.utils.world.TickRate; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.network.ServerAddress; @@ -24,11 +25,9 @@ import net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket; import net.minecraft.network.packet.s2c.play.CommandSuggestionsS2CPacket; import net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket; +import net.minecraft.screen.ScreenTexts; import net.minecraft.server.integrated.IntegratedServer; -import net.minecraft.text.ClickEvent; -import net.minecraft.text.HoverEvent; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; +import net.minecraft.text.*; import net.minecraft.util.Formatting; import net.minecraft.world.LocalDifficulty; import net.minecraft.world.attribute.EnvironmentAttributes; @@ -88,7 +87,7 @@ public void build(LiteralArgumentBuilder builder) { if (tps > 17.0f) color = Formatting.GREEN; else if (tps > 12.0f) color = Formatting.YELLOW; else color = Formatting.RED; - info("Current TPS: %s%.2f(default).", color, tps); + info("tps", Text.literal(String.format("%.2f", tps)).formatted(color)); return SINGLE_SUCCESS; })); } @@ -97,8 +96,8 @@ private void basicInfo() { if (mc.isIntegratedServerRunning()) { IntegratedServer server = mc.getServer(); - info("Singleplayer"); - if (server != null) info("Version: %s", server.getVersion()); + info("singleplayer"); + if (server != null) info("version", server.getVersion()); return; } @@ -106,7 +105,7 @@ private void basicInfo() { ServerInfo server = mc.getCurrentServerEntry(); if (server == null) { - info("Couldn't obtain any server information."); + error("cant_obtain_info"); return; } @@ -121,34 +120,31 @@ private void basicInfo() { ipText = Text.literal(Formatting.GRAY + server.address); ipText.setStyle(ipText.getStyle() .withClickEvent(new ClickEvent.CopyToClipboard(server.address)) - .withHoverEvent(new HoverEvent.ShowText(Text.literal("Copy to clipboard"))) + .withHoverEvent(new HoverEvent.ShowText(MeteorClient.translatable("command.server.info.copy"))) ); } else { ipText = Text.literal(Formatting.GRAY + server.address); ipText.setStyle(ipText.getStyle() .withClickEvent(new ClickEvent.CopyToClipboard(server.address)) - .withHoverEvent(new HoverEvent.ShowText(Text.literal("Copy to clipboard"))) + .withHoverEvent(new HoverEvent.ShowText(MeteorClient.translatable("command.server.info.copy"))) ); MutableText ipv4Text = Text.literal(String.format("%s (%s)", Formatting.GRAY, ipv4)); ipv4Text.setStyle(ipText.getStyle() .withClickEvent(new ClickEvent.CopyToClipboard(ipv4)) - .withHoverEvent(new HoverEvent.ShowText(Text.literal("Copy to clipboard"))) + .withHoverEvent(new HoverEvent.ShowText(MeteorClient.translatable("command.server.info.copy"))) ); ipText.append(ipv4Text); } - info( - Text.literal(String.format("%sIP: ", Formatting.GRAY)) - .append(ipText) - ); - - info("Port: %d", ServerAddress.parse(server.address).getPort()); - info("Type: %s", mc.getNetworkHandler().getBrand() != null ? mc.getNetworkHandler().getBrand() : "unknown"); - info("Motd: %s", server.label != null ? server.label.getString() : "unknown"); - info("Version: %s", server.version.getString()); - info("Protocol version: %d", server.protocolVersion); - info("Difficulty: %s (Local: %.2f)", - mc.world.getDifficulty().getTranslatableName().getString(), + info("ip", ipText); + + info("port", ServerAddress.parse(server.address).getPort()); + info("type", mc.getNetworkHandler().getBrand() != null ? mc.getNetworkHandler().getBrand() : MeteorClient.translatable("command.server.info.unknown")); + info("motd", server.label != null ? server.label.getString() : MeteorClient.translatable("command.server.info.unknown")); + info("version", server.version.getString()); + info("protocol_version", server.protocolVersion); + info("difficulty", + mc.world.getDifficulty().getTranslatableName(), new LocalDifficulty( mc.world.getDifficulty(), mc.world.getTimeOfDay(), @@ -156,18 +152,18 @@ private void basicInfo() { DimensionType.MOON_SIZES[mc.world.getEnvironmentAttributes().getAttributeValue(EnvironmentAttributes.MOON_PHASE_VISUAL, mc.player.getBlockPos()).getIndex()] // lol ).getLocalDifficulty() ); - info("Day: %d", mc.world.getTimeOfDay() / 24000L); - info("Permission level: %s", formatPerms()); + info("day", mc.world.getTimeOfDay() / 24000L); + info(formatPerms()); } public String formatPerms() { PermissionPredicate permissions = mc.player.getPermissions(); - if (permissions.hasPermission(DefaultPermissions.OWNERS)) return "4 (Owner)"; - else if (permissions.hasPermission(DefaultPermissions.ADMINS)) return "3 (Admin)"; - else if (permissions.hasPermission(DefaultPermissions.GAMEMASTERS)) return "2 (Gamemaster)"; - else if (permissions.hasPermission(DefaultPermissions.MODERATORS)) return "1 (Moderator)"; - else return "0 (No Perms)"; + if (permissions.hasPermission(DefaultPermissions.OWNERS)) return "permission_owner"; + else if (permissions.hasPermission(DefaultPermissions.ADMINS)) return "permission_admin"; + else if (permissions.hasPermission(DefaultPermissions.GAMEMASTERS)) return "permission_gamemaster"; + else if (permissions.hasPermission(DefaultPermissions.MODERATORS)) return "permission_moderator"; + else return "permission_player"; } @@ -175,12 +171,15 @@ public String formatPerms() { private void printPlugins() { plugins.sort(String.CASE_INSENSITIVE_ORDER); - plugins.replaceAll(this::formatName); + List pluginTexts = new ArrayList<>(); + for (String plugin : plugins) { + pluginTexts.add(formatName(plugin)); + } if (!plugins.isEmpty()) { - info("Plugins (%d): %s ", plugins.size(), String.join(", ", plugins)); + info("plugins", plugins.size(), Texts.join(pluginTexts, Texts.DEFAULT_SEPARATOR_TEXT)); } else { - error("No plugins found."); + error("no_plugins"); } tick = false; @@ -237,7 +236,7 @@ private void onReadPacket(PacketEvent.Receive event) { Suggestions matches = packet.getSuggestions(); if (matches.isEmpty()) { - error("An error occurred while trying to find plugins."); + error("plugins"); return; } @@ -249,18 +248,18 @@ private void onReadPacket(PacketEvent.Receive event) { printPlugins(); } } catch (Exception e) { - error("An error occurred while trying to find plugins."); + error("plugins"); } } - private String formatName(String name) { + private Text formatName(String name) { if (ANTICHEAT_LIST.contains(name.toLowerCase())) { - return String.format("%s%s(default)", Formatting.RED, name); + return Text.literal(name).formatted(Formatting.RED); } else if (Strings.CI.contains(name, "exploit") || Strings.CI.contains(name, "cheat") || Strings.CI.contains(name, "illegal")) { - return String.format("%s%s(default)", Formatting.RED, name); + return Text.literal(name).formatted(Formatting.RED); } - return String.format("(highlight)%s(default)", name); + return ChatUtils.highlight(name); } } diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index cff1d492e4..fd8518ab51 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -28,7 +28,7 @@ "command.damage.exception.invulnerable": "You are invulnerable.", "command.disconnect": "Disconnect", "command.disconnect.description": "Disconnect from the server", - "command.disconnect.disconnection_message": "[%1$s] Disconnected by user.", + "command.disconnect.disconnection_message": "[%s] Disconnected by user.", "command.dismount": "Dismount", "command.dismount.description": "Dismounts you from entity you are riding.", "command.drop": "Drop", @@ -77,33 +77,33 @@ "command.locate": "Locate", "command.locate.description": "Locates structures", "command.locate.error.no_map_icons": "Couldn't locate the map icons!", - "command.locate.error.no_buried_treasure_map": "You need to hold a (highlight)buried treasure map(default)!", + "command.locate.error.no_buried_treasure_map": "You need to hold a %s!", "command.locate.error.cant_locate_buried_treasure": "Couldn't locate the buried treasure!", - "command.locate.error.no_woodland_explorer_map": "You need to hold a (highlight)woodland explorer map(default)!", + "command.locate.error.no_woodland_explorer_map": "You need to hold a %s!", "command.locate.error.cant_locate_mansion": "Couldn't locate the mansion!", "command.locate.error.cant_locate_monument": "Couldn't locate the monument!", - "command.locate.error.no_monument_found": "No monument found. Try using an (highlight)ocean explorer map(default) for more success.", - "command.locate.error.ocean_explorer_no_baritone": "Locating this structure without an (highlight)ocean explorer map(default) requires Baritone.", - "command.locate.error.no_stronghold_found": "No stronghold found nearby. You can use (highlight)Ender Eyes(default) for more success.", + "command.locate.error.no_monument_found": "No monument found. Try using an %s for more success.", + "command.locate.error.ocean_explorer_no_baritone": "Locating this structure without an %s requires Baritone.", + "command.locate.error.no_stronghold_found": "No stronghold found nearby. You can use %s for more success.", "command.locate.error.no_eyes_of_ender": "No Eyes of Ender found in hotbar.", "command.locate.error.not_in_nether": "You need to be in the nether to locate a nether fortress.", "command.locate.error.no_baritone": "Locating this structure requires Baritone.", "command.locate.error.cant_locate_nether_fortress": "No nether fortress found.", "command.locate.error.not_in_end": "You need to be in the end to locate an end city.", "command.locate.error.cant_locate_end_city": "No end city found.", - "command.locate.error.no_lodestone_compass": "You need to hold a (highlight)lodestone(default) compass!", - "command.locate.error.no_lodestone_compass_data": "Couldn't get the components data. Are you holding a (highlight)lodestone(default) compass?", + "command.locate.error.no_lodestone_compass": "You need to hold a %s!", + "command.locate.error.no_lodestone_compass_data": "Couldn't get the components data. Are you holding a %s?", "command.locate.error.no_lodestone": "Couldn't get the lodestone's target!", "command.locate.error.missing_position_data": "Missing position data", "command.locate.error.unable_to_calculate": "Unable to calculate intersection.", - "command.locate.info.buried_treasure": "Buried Treasure located at %1$s.", - "command.locate.info.mansion": "Mansion located at %1$s.", - "command.locate.info.monument": "Monument located at %1$s.", + "command.locate.info.buried_treasure": "Buried Treasure located at %s.", + "command.locate.info.mansion": "Mansion located at %s.", + "command.locate.info.monument": "Monument located at %s.", "command.locate.info.first_eye": "Please throw the first Eye of Ender.", - "command.locate.info.stronghold": "Stronghold located at %1$s.", - "command.locate.info.nether_fortress": "Fortress located at %1$s.", - "command.locate.info.end_city": "End city located at %1$s.", - "command.locate.info.lodestone": "Lodestone located at %1$s.", + "command.locate.info.stronghold": "Stronghold located at %s.", + "command.locate.info.nether_fortress": "Fortress located at %s.", + "command.locate.info.end_city": "End city located at %s.", + "command.locate.info.lodestone": "Lodestone located at %s.", "command.locate.info.first_eye_saved": "First Eye of Ender's trajectory saved.", "command.locate.info.second_eye_saved": "Second Eye of Ender's trajectory saved.", "command.locate.info.eye_different_location": "Please throw the second Eye Of Ender from a different location.", @@ -123,20 +123,40 @@ "command.name-history.inaccurate": "This name history entry is not accurate according to laby.net", "command.nbt": "NBT", "command.nbt.description": "Modifies NBT data for an item, example: .nbt add {display:{Name:'{\"text\":\"$cRed Name\"}'}}", + "command.nbt.error.not_creative": "Creative mode only.", + "command.nbt.error.no_item": "You must hold an item in your main hand.", + "command.nbt.info.copy_tooltip": "Copy the NBT data to your clipboard.", + "command.nbt.info.copy": "%s %s data copied!", + "command.nbt.info.count": "Set mainhand stack count to %d.", "command.notebot": "Notebot", "command.notebot.description": "Allows you load notebot files", + "command.notebot.error.invalid_song": "Invalid song.", + "command.notebot.error.invalid_path": "'%s' is not a valid path.", + "command.notebot.error.cant_create_file": "Couldn't create the file.", + "command.notebot.error.bruteforce": "Error while bruteforcing a note level! Sound: %s Pitch: %.3f", + "command.notebot.error.instrument": "Can't find the instrument from sound! Sound: %s", + "command.notebot.info.recording_started": "Recording started", + "command.notebot.info.recording_cancelled": "Recording cancelled", + "command.notebot.info.song_saved": "Song saved.", "command.peek": "Peek", "command.peek.description": "Lets you see what's inside storage block items.", + "command.peek.error.cant_peek": "You must be holding a storage block or looking at an item frame.", "command.profiles": "Profiles", "command.profiles.description": "Loads and saves profiles.", - "command.profiles.info.loaded": "Loaded profile (highlight)%s(default).", - "command.profiles.info.saved": "Saved profile (highlight)%s(default).", - "command.profiles.info.deleted": "Deleted profile (highlight)%s(default).", + "command.profiles.info.loaded": "Loaded profile %s.", + "command.profiles.info.saved": "Saved profile %s.", + "command.profiles.info.deleted": "Deleted profile %s.", "command.reload": "Reload", "command.reload.description": "Reloads many systems.", "command.reload.warning.reloading": "Reloading systems, this may take a while.", "command.reset": "Reset", "command.reset.description": "Resets specified settings.", + "command.reset.info.module": "Reset all settings.", + "command.reset.info.modules": "Reset all module settings.", + "command.reset.info.gui": "Reset all GUI settings.", + "command.reset.info.bind": "Reset bind.", + "command.reset.info.binds": "Reset all binds.", + "command.reset.info.hud": "Reset all elements.", "command.rotation": "Rotation", "command.rotation.description": "Modifies your rotation.", "command.save-map": "Save Map", @@ -148,6 +168,27 @@ "command.say.description": "Sends messages in chat.", "command.server": "Server", "command.server.description": "Prints server information", + "command.server.error.cant_obtain_info": "Couldn't obtain any server information.", + "command.server.error.no_plugins": "No plugins found.", + "command.server.error.plugins": "An error occurred while trying to find plugins.", + "command.server.info.tps": "Current TPS: %s.", + "command.server.info.singleplayer": "Singleplayer", + "command.server.info.version": "Version: %s", + "command.server.info.copy": "Copy to clipboard", + "command.server.info.ip": "IP: %s", + "command.server.info.port": "Port: %d", + "command.server.info.type": "Type: %s", + "command.server.info.unknown": "unknown", + "command.server.info.motd": "Motd: %s", + "command.server.info.protocol_version": "Protocol version: %d", + "command.server.info.difficulty": "Difficulty: %s (Local: %.2f)", + "command.server.info.day": "Day: %d", + "command.server.info.permission_owner": "Permission level: 4 (Owner)", + "command.server.info.permission_admin": "Permission level: 3 (Admin)", + "command.server.info.permission_gamemaster": "Permission level: 2 (Gamemaster)", + "command.server.info.permission_moderator": "Permission level: 1 (Moderator)", + "command.server.info.permission_player": "Permission level: 0 (Player)", + "command.server.info.plugins": "Plugins (%d): %s", "command.settings": "Settings", "command.settings.description": "Allows you to view and change module settings.", "command.spectate": "Spectate", From b8b603e45c0566bba63a9bf0dc012947d57abf14 Mon Sep 17 00:00:00 2001 From: crosby-moe <32882447+crosby-moe@users.noreply.github.com> Date: Thu, 5 Feb 2026 10:03:01 -0500 Subject: [PATCH 60/72] map some modules --- .../meteorclient/systems/modules/Module.java | 8 ++--- .../systems/modules/combat/AnchorAura.java | 2 +- .../systems/modules/misc/BookBot.java | 14 +++----- .../systems/modules/misc/Notifier.java | 32 +++++++++++-------- .../modules/render/WaypointsModule.java | 5 +-- .../assets/meteor-client/language/en_us.json | 10 ++++++ 6 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java index fe201d007a..e33a4422d8 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java @@ -118,7 +118,7 @@ public void disable() { public void sendToggledMsg() { if (Config.get().chatFeedback.get() && chatFeedback) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.sendMsgRaw(this.hashCode(), Formatting.GRAY, "Toggled (highlight)%s(default) %s(default).", null /* todo translatable Text */, isActive() ? Formatting.GREEN + "on" : Formatting.RED + "off"); + ChatUtils.sendMsg(this.hashCode(), Formatting.GRAY, "module.base.toggled", this.getTitleText(), isActive() ? Text.literal("on").formatted(Formatting.GREEN) : Text.literal("off").formatted(Formatting.RED)); } } @@ -129,7 +129,7 @@ public void info(Text message) { public void info(String messageKey, Object... args) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.infoPrefix(this.getTranslationKey(), messageKey, args); + ChatUtils.infoPrefix(this.getTranslationKey(), this.getTranslationKey() + ".info." + messageKey, args); } public void infoRaw(String message, Object... args) { @@ -139,7 +139,7 @@ public void infoRaw(String message, Object... args) { public void warning(String messageKey, Object... args) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.warningPrefix(this.getTranslationKey(), messageKey, args); + ChatUtils.warningPrefix(this.getTranslationKey(), this.getTranslationKey() + ".warning." + messageKey, args); } public void warningRaw(String message, Object... args) { @@ -149,7 +149,7 @@ public void warningRaw(String message, Object... args) { public void error(String messageKey, Object... args) { ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.errorPrefix(this.getTranslationKey(), messageKey, args); + ChatUtils.errorPrefix(this.getTranslationKey(), this.getTranslationKey() + ".error." + messageKey, args); } public void errorRaw(String message, Object... args) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java index 4ec0336548..f905143086 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java @@ -251,7 +251,7 @@ public void onDeactivate() { @EventHandler private void onTick(TickEvent.Pre event) { if (mc.world.getRegistryKey() == World.NETHER) { - error("You can't blow up respawn anchors in this dimension, disabling."); + error("wrong_dimension"); toggle(); return; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java index 9e8734dc42..d963c0a1b7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java @@ -16,6 +16,7 @@ import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; import meteordevelopment.meteorclient.utils.player.FindItemResult; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.orbit.EventHandler; @@ -218,15 +219,10 @@ private void onTick(TickEvent.Post event) { // Handle the file being empty if (file.length() == 0) { - MutableText message = Text.literal(""); - message.append(Text.literal("The bookbot file is empty! ").formatted(Formatting.RED)); - message.append(Text.literal("Click here to edit it.") - .setStyle(Style.EMPTY - .withFormatting(Formatting.UNDERLINE, Formatting.RED) - .withClickEvent(new ClickEvent.OpenFile(file.getAbsolutePath())) - ) - ); - info(message); + error("file_empty", MeteorClient.translatable(this.getTranslationKey() + ".click_to_edit_file").setStyle(Style.EMPTY + .withFormatting(Formatting.UNDERLINE, Formatting.RED) + .withClickEvent(new ClickEvent.OpenFile(file.getAbsolutePath())) + )); toggle(); return; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java index cc6dc6fd3e..058604173a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java @@ -190,17 +190,17 @@ private void onEntityAdded(EntityAddedEvent event) { if (!event.entity.getUuid().equals(mc.player.getUuid()) && entities.get().contains(event.entity.getType()) && visualRange.get() && this.event.get() != Event.Despawn) { if (event.entity instanceof PlayerEntity) { if ((!visualRangeIgnoreFriends.get() || !Friends.get().isFriend(((PlayerEntity) event.entity))) && (!visualRangeIgnoreFakes.get() || !(event.entity instanceof FakePlayerEntity))) { - ChatUtils.sendMsgRaw(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has entered your visual range!", event.entity.getName().getString()); + ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, this.getTranslationKey() + ".info.entered_visual_range", event.entity.getName().getString()); if (visualMakeSound.get()) mc.world.playSoundFromEntity(mc.player, mc.player, SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.AMBIENT, 3.0F, 1.0F); } } else { - MutableText text = Text.literal(event.entity.getType().getName().getString()).formatted(Formatting.WHITE); - text.append(Text.literal(" has spawned at ").formatted(Formatting.GRAY)); - text.append(formatCoords(event.entity.getEntityPos())); - text.append(Text.literal(".").formatted(Formatting.GRAY)); - info(text); + info( + "spawned", + Text.literal(event.entity.getType().getName().getString()).formatted(Formatting.WHITE), + formatCoords(event.entity.getEntityPos()) + ); } } @@ -214,17 +214,17 @@ private void onEntityRemoved(EntityRemovedEvent event) { if (!event.entity.getUuid().equals(mc.player.getUuid()) && entities.get().contains(event.entity.getType()) && visualRange.get() && this.event.get() != Event.Spawn) { if (event.entity instanceof PlayerEntity) { if ((!visualRangeIgnoreFriends.get() || !Friends.get().isFriend(((PlayerEntity) event.entity))) && (!visualRangeIgnoreFakes.get() || !(event.entity instanceof FakePlayerEntity))) { - ChatUtils.sendMsgRaw(event.entity.getId() + 100, Formatting.GRAY, "(highlight)%s(default) has left your visual range!", event.entity.getName().getString()); + ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, this.getTranslationKey() + ".info.left_visual_range", event.entity.getName().getString()); if (visualMakeSound.get()) mc.world.playSoundFromEntity(mc.player, mc.player, SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.AMBIENT, 3.0F, 1.0F); } } else { - MutableText text = Text.literal(event.entity.getType().getName().getString()).formatted(Formatting.WHITE); - text.append(Text.literal(" has despawned at ").formatted(Formatting.GRAY)); - text.append(formatCoords(event.entity.getEntityPos())); - text.append(Text.literal(".").formatted(Formatting.GRAY)); - info(text); + info( + "despawned", + Text.literal(event.entity.getType().getName().getString()).formatted(Formatting.WHITE), + formatCoords(event.entity.getEntityPos()) + ); } } @@ -236,7 +236,13 @@ private void onEntityRemoved(EntityRemovedEvent event) { if (pearl.getOwner() != null && pearl.getOwner() instanceof PlayerEntity p) { double d = pearlStartPosMap.get(i).distanceTo(e.getEntityPos()); if ((!Friends.get().isFriend(p) || !pearlIgnoreFriends.get()) && (!p.equals(mc.player) || !pearlIgnoreOwn.get())) { - info("(highlight)%s's(default) pearl landed at %d, %d, %d (highlight)(%.1fm away, travelled %.1fm)(default).", pearl.getOwner().getName().getString(), pearl.getBlockPos().getX(), pearl.getBlockPos().getY(), pearl.getBlockPos().getZ(), pearl.distanceTo(mc.player), d); + info( + "pearl_landed", + Text.literal(pearl.getOwner().getName().getString()).formatted(Formatting.WHITE), + ChatUtils.formatCoords(pearl.getEntityPos()), + String.format("%.1f", pearl.distanceTo(mc.player)), + String.format("%.1f", d) + ); } } pearlStartPosMap.remove(i); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java index 2991aea436..075cb0e1a9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java @@ -171,10 +171,7 @@ private void onOpenScreen(OpenScreenEvent event) { public void addDeath(Vec3d deathPos) { String time = dateFormat.format(new Date()); if (dpChat.get()) { - MutableText text = Text.literal("Died at "); - text.append(formatCoords(deathPos)); - text.append(String.format(" on %s.", time)); - info(text); + info("death", formatCoords(deathPos), time); } // Create waypoint diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index fd8518ab51..715c07a8a0 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -835,6 +835,7 @@ "module.base.copy-config": "Copy config", "module.base.paste-config": "Paste config", "module.base.from": "From: ", + "module.base.toggled": "Toggled %1$s %2$s.", "module.air-jump": "Air Jump", "module.air-jump.description": "Lets you jump in the air.", @@ -1075,6 +1076,11 @@ "module.notifier.joins/leaves.notification-delay.description": "How long to wait in ticks before posting the next join/leave notification in your chat.", "module.notifier.joins/leaves.simple-notifications": "Simple Notifications", "module.notifier.joins/leaves.simple-notifications.description": "Display join/leave notifications without a prefix, to reduce chat clutter.", + "module.notifier.info.despawned": "%1$s has despawned at %2$.", + "module.notifier.info.spawned": "%1$s has spawned at %2$.", + "module.notifier.info.entered_visual_range": "%s has entered your visual range!", + "module.notifier.info.left_visual_range": "%s has left your visual range!", + "module.notifier.info.pearl_landed": "%1$s's pearl landed at %2$s (%3$sm away, travelled %4$sm).", "module.item-physics": "Item Physics", "module.item-physics.description": "Applies physics to items on the ground.", @@ -1357,6 +1363,8 @@ "module.book-bot.general.append-count.description": "Whether to append the number of the book to the title.", "module.book-bot.general.word-wrap": "Word Wrap", "module.book-bot.general.word-wrap.description": "Prevents words from being cut in the middle of lines.", + "module.book-bot.error.file_empty": "The bookbot file is empty!", + "module.book-bot.click_to_edit_file": "Click here to edit it.", "module.auto-gap": "Auto Gap", "module.auto-gap.description": "Automatically eats Gaps or E-Gaps.", @@ -3520,6 +3528,7 @@ "module.waypoints.death-position.max-death-positions.description": "The amount of death positions to save, 0 to disable", "module.waypoints.death-position.chat": "Chat", "module.waypoints.death-position.chat.description": "Send a chat message with your position once you die", + "module.waypoints.info.death": "Died at %1$s on %2$s.", "module.auto-web": "Auto Web", "module.auto-web.description": "Automatically places webs on other players.", @@ -3947,6 +3956,7 @@ "module.anchor-aura.render.side-color.description": "The side color for positions to be placed.", "module.anchor-aura.render.line-color": "Line Color", "module.anchor-aura.render.line-color.description": "The line color for positions to be placed.", + "module.anchor-aura.error.wrong_dimension": "You can't blow up respawn anchors in this dimension, disabling.", "module.anti-void": "Anti Void", "module.anti-void.description": "Attempts to prevent you from falling into the void.", From 77b8ef5c1d2b90a472f928c2508fe85d7f31976f Mon Sep 17 00:00:00 2001 From: crosby-moe <32882447+crosby-moe@users.noreply.github.com> Date: Thu, 5 Feb 2026 10:10:29 -0500 Subject: [PATCH 61/72] oops! wrong choice --- .../commands/commands/NotebotCommand.java | 2 +- .../commands/commands/ServerCommand.java | 4 +-- .../text/MeteorTranslatableTextComponent.java | 25 +++---------------- .../assets/meteor-client/language/en_us.json | 16 ++++++------ 4 files changed, 15 insertions(+), 32 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java index 6eba86f857..03c3537bd7 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java @@ -198,7 +198,7 @@ private Note getNote(PlaySoundS2CPacket soundPacket) { } if (noteLevel == -1) { - error("bruteforce", soundPacket.getSound().value(), pitch); + error("bruteforce", soundPacket.getSound().value(), String.format("%.3f", pitch)); return null; } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java index a781970756..1f87b249ad 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java @@ -145,12 +145,12 @@ private void basicInfo() { info("protocol_version", server.protocolVersion); info("difficulty", mc.world.getDifficulty().getTranslatableName(), - new LocalDifficulty( + String.format("%.2f", new LocalDifficulty( mc.world.getDifficulty(), mc.world.getTimeOfDay(), mc.world.getChunk(mc.player.getBlockPos()).getInhabitedTime(), DimensionType.MOON_SIZES[mc.world.getEnvironmentAttributes().getAttributeValue(EnvironmentAttributes.MOON_PHASE_VISUAL, mc.player.getBlockPos()).getIndex()] // lol - ).getLocalDifficulty() + ).getLocalDifficulty()) ); info("day", mc.world.getTimeOfDay() / 24000L); info(formatPerms()); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java index 1f89367989..f99b3ab4b5 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java @@ -117,9 +117,8 @@ public String toString() { private static final StringVisitable LITERAL_PERCENT_SIGN = StringVisitable.plain("%"); private static final StringVisitable NULL_ARGUMENT = StringVisitable.plain("null"); - // %, optional position argument (\d$), string format (s) || percent literal (%|$) || number format ([-+.]? \d* [df]) - @SuppressWarnings("RegExpRedundantEscape") // then why does it IllegalArgumentException when i remove it dipshit - private static final Pattern ARG_FORMAT = Pattern.compile("%(?:(\\d+)\\$)?([s%]|$|[-+\\.]?\\d*[df])"); + // %, optional position argument (\d$), string format (s) || percent literal (%|$) + private static final Pattern ARG_FORMAT = Pattern.compile("%(?:(\\d+)\\$)?([s%]|$)"); private void forEachPart(String translation, Consumer partsConsumer) { Matcher matcher = ARG_FORMAT.matcher(translation); @@ -158,24 +157,8 @@ private void forEachPart(String translation, Consumer partsCons : argument == null ? NULL_ARGUMENT : StringVisitable.plain(argument.toString()); partsConsumer.accept(visitableArgument); - } else if (argument instanceof StringVisitable) { - if (argument instanceof MutableText mutableText && mutableText.getSiblings().isEmpty() && mutableText.getContent() instanceof PlainTextContent content) { - try { // attempt to use formatting - String format = "%" + string; - partsConsumer.accept(StringVisitable.styled(String.format(format, content.string()), mutableText.getStyle())); - } catch (IllegalFormatException e) { - throw new TranslationException(new TranslatableTextContent(this.key, this.fallback, this.args), index); - } - } else { // cant use format strings on non-constant/complex arguments - throw new TranslationException(new TranslatableTextContent(this.key, this.fallback, this.args), "Cant use complex format string with Text"); - } - } else { // attempt to use formatting - try { - String format = "%" + string; - partsConsumer.accept(StringVisitable.plain(String.format(format, argument))); - } catch (IllegalFormatException e) { - throw new TranslationException(new TranslatableTextContent(this.key, this.fallback, this.args), index); - } + } else { + throw new TranslationException(new TranslatableTextContent(this.key, this.fallback, this.args), "Unsupported format: '" + string2 + "'"); } } diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index 715c07a8a0..8c987ee54e 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -108,7 +108,7 @@ "command.locate.info.second_eye_saved": "Second Eye of Ender's trajectory saved.", "command.locate.info.eye_different_location": "Please throw the second Eye Of Ender from a different location.", "command.locate.warning.canceled": "Locate canceled", - "command.locate.warning.false_positive": "Only %d block(s) found. This search might be a false positive.", + "command.locate.warning.false_positive": "Only %s block(s) found. This search might be a false positive.", "command.macro": "Macro", "command.macro.description": "Allows you to execute macros.", "command.macro.error.none_scheduled": "No macros are currently scheduled.", @@ -127,13 +127,13 @@ "command.nbt.error.no_item": "You must hold an item in your main hand.", "command.nbt.info.copy_tooltip": "Copy the NBT data to your clipboard.", "command.nbt.info.copy": "%s %s data copied!", - "command.nbt.info.count": "Set mainhand stack count to %d.", + "command.nbt.info.count": "Set mainhand stack count to %s.", "command.notebot": "Notebot", "command.notebot.description": "Allows you load notebot files", "command.notebot.error.invalid_song": "Invalid song.", "command.notebot.error.invalid_path": "'%s' is not a valid path.", "command.notebot.error.cant_create_file": "Couldn't create the file.", - "command.notebot.error.bruteforce": "Error while bruteforcing a note level! Sound: %s Pitch: %.3f", + "command.notebot.error.bruteforce": "Error while bruteforcing a note level! Sound: %1$s Pitch: %2$s", "command.notebot.error.instrument": "Can't find the instrument from sound! Sound: %s", "command.notebot.info.recording_started": "Recording started", "command.notebot.info.recording_cancelled": "Recording cancelled", @@ -176,19 +176,19 @@ "command.server.info.version": "Version: %s", "command.server.info.copy": "Copy to clipboard", "command.server.info.ip": "IP: %s", - "command.server.info.port": "Port: %d", + "command.server.info.port": "Port: %s", "command.server.info.type": "Type: %s", "command.server.info.unknown": "unknown", "command.server.info.motd": "Motd: %s", - "command.server.info.protocol_version": "Protocol version: %d", - "command.server.info.difficulty": "Difficulty: %s (Local: %.2f)", - "command.server.info.day": "Day: %d", + "command.server.info.protocol_version": "Protocol version: %s", + "command.server.info.difficulty": "Difficulty: %1$s (Local: %2$s)", + "command.server.info.day": "Day: %s", "command.server.info.permission_owner": "Permission level: 4 (Owner)", "command.server.info.permission_admin": "Permission level: 3 (Admin)", "command.server.info.permission_gamemaster": "Permission level: 2 (Gamemaster)", "command.server.info.permission_moderator": "Permission level: 1 (Moderator)", "command.server.info.permission_player": "Permission level: 0 (Player)", - "command.server.info.plugins": "Plugins (%d): %s", + "command.server.info.plugins": "Plugins (%1$s): %2$s", "command.settings": "Settings", "command.settings.description": "Allows you to view and change module settings.", "command.spectate": "Spectate", From c9c72cb1512d404fe21607a62c68d0dab284687f Mon Sep 17 00:00:00 2001 From: crosby-moe <32882447+crosby-moe@users.noreply.github.com> Date: Thu, 5 Feb 2026 10:11:22 -0500 Subject: [PATCH 62/72] 'TranslatableTextContent', not 'TranslatableTextComponent' --- .../java/meteordevelopment/meteorclient/MeteorClient.java | 6 +++--- ...tComponent.java => MeteorTranslatableTextContent.java} | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) rename src/main/java/meteordevelopment/meteorclient/utils/misc/text/{MeteorTranslatableTextComponent.java => MeteorTranslatableTextContent.java} (95%) diff --git a/src/main/java/meteordevelopment/meteorclient/MeteorClient.java b/src/main/java/meteordevelopment/meteorclient/MeteorClient.java index 65a16e6b19..4f97de9dd5 100644 --- a/src/main/java/meteordevelopment/meteorclient/MeteorClient.java +++ b/src/main/java/meteordevelopment/meteorclient/MeteorClient.java @@ -27,7 +27,7 @@ import meteordevelopment.meteorclient.utils.misc.Version; import meteordevelopment.meteorclient.utils.misc.input.KeyAction; import meteordevelopment.meteorclient.utils.misc.input.KeyBinds; -import meteordevelopment.meteorclient.utils.misc.text.MeteorTranslatableTextComponent; +import meteordevelopment.meteorclient.utils.misc.text.MeteorTranslatableTextContent; import meteordevelopment.meteorclient.utils.network.OnlinePlayers; import meteordevelopment.orbit.EventBus; import meteordevelopment.orbit.EventHandler; @@ -201,10 +201,10 @@ public static Identifier identifier(String path) { } public static MutableText translatable(String key, Object... args) { - return MutableText.of(new MeteorTranslatableTextComponent(key, args)); + return MutableText.of(new MeteorTranslatableTextContent(key, args)); } public static MutableText translatable(String key, String fallback, Object... args) { - return MutableText.of(new MeteorTranslatableTextComponent(key, fallback, args)); + return MutableText.of(new MeteorTranslatableTextContent(key, fallback, args)); } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextContent.java similarity index 95% rename from src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java rename to src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextContent.java index f99b3ab4b5..cd7cc39f9a 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextComponent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextContent.java @@ -21,7 +21,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; -public class MeteorTranslatableTextComponent implements TextContent { +public class MeteorTranslatableTextContent implements TextContent { private static final boolean DEBUG_MISSING_ENTRIES = FabricLoader.getInstance().isDevelopmentEnvironment() || Boolean.getBoolean("meteor.lang.debug"); private final String key; @Nullable @@ -32,7 +32,7 @@ public class MeteorTranslatableTextComponent implements TextContent { private String cachedLanguage; private List translations = ImmutableList.of(); - public MeteorTranslatableTextComponent(String key, @Nullable String fallback, Object... args) { + public MeteorTranslatableTextContent(String key, @Nullable String fallback, Object... args) { this.key = key; this.fallback = fallback; this.args = args; @@ -47,7 +47,7 @@ public MeteorTranslatableTextComponent(String key, @Nullable String fallback, Ob this.styledArgs = hasStyledArgs; } - public MeteorTranslatableTextComponent(String key, Object... args) { + public MeteorTranslatableTextContent(String key, Object... args) { this(key, null, args); } @@ -105,7 +105,7 @@ public MapCodec getCodec() { @Override public boolean equals(@Nullable Object o) { if (this == o) return true; - if (!(o instanceof MeteorTranslatableTextComponent component)) return false; + if (!(o instanceof MeteorTranslatableTextContent component)) return false; return Objects.equals(this.key, component.key) && Objects.equals(this.fallback, component.fallback) && Arrays.equals(this.args, component.args); } From f00a1cb2ff326cb5debb177b20deb49327cf071b Mon Sep 17 00:00:00 2001 From: crosby-moe <32882447+crosby-moe@users.noreply.github.com> Date: Thu, 5 Feb 2026 17:19:37 -0500 Subject: [PATCH 63/72] `MessageBuilder` initial impl --- .../meteorclient/gui/GuiTheme.java | 6 + .../meteorclient/gui/MessageFormatter.java | 28 +++ .../gui/themes/meteor/MeteorGuiTheme.java | 18 ++ .../themes/meteor/MeteorMessageFormatter.java | 92 +++++++ .../utils/misc/text/MessageBuilder.java | 27 ++ .../utils/misc/text/MessageBuilderImpl.java | 237 ++++++++++++++++++ .../utils/misc/text/MessageKind.java | 13 + .../text/MeteorTranslatableTextContent.java | 7 + .../meteorclient/utils/player/ChatUtils.java | 9 + 9 files changed, 437 insertions(+) create mode 100644 src/main/java/meteordevelopment/meteorclient/gui/MessageFormatter.java create mode 100644 src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorMessageFormatter.java create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageKind.java diff --git a/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java b/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java index 6481d0e6ee..8b4f3e5862 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java @@ -31,6 +31,8 @@ import net.minecraft.client.gui.screen.Screen; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; import java.util.HashMap; @@ -279,6 +281,10 @@ public WidgetScreen proxiesScreen() { public abstract TextRenderer textRenderer(); + public abstract MessageFormatter messageFormatter(); + + public abstract Text getChatPrefix(); + public abstract double scale(double value); public abstract boolean categoryIcons(); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/MessageFormatter.java b/src/main/java/meteordevelopment/meteorclient/gui/MessageFormatter.java new file mode 100644 index 0000000000..b53453e9bf --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/gui/MessageFormatter.java @@ -0,0 +1,28 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.gui; + +import meteordevelopment.meteorclient.utils.misc.text.MessageKind; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; + +public interface MessageFormatter { + Text formatPlayerName(PlayerEntity player); + Text formatEntityName(Entity entity); + + Text formatCoords(Vec3i blockPos); + Text formatCoords(Vec3d pos); + + Text formatHighlight(MutableText text); + Text formatDecimal(double decimal); + + Text formatPrefix(Text prefix); + Text formatMessage(MutableText message, MessageKind messageKind); +} diff --git a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java index 86b1819ed9..60578c6dda 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java @@ -5,8 +5,10 @@ package meteordevelopment.meteorclient.gui.themes.meteor; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.gui.DefaultSettingsWidgetFactory; import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.MessageFormatter; import meteordevelopment.meteorclient.gui.WidgetScreen; import meteordevelopment.meteorclient.gui.renderer.packer.GuiTexture; import meteordevelopment.meteorclient.gui.themes.meteor.widgets.*; @@ -31,6 +33,9 @@ import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import net.minecraft.client.util.MacWindowUtil; +import net.minecraft.text.Style; +import net.minecraft.text.Text; +import net.minecraft.text.TextColor; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -161,6 +166,9 @@ public class MeteorGuiTheme extends GuiTheme { private final Setting starscriptKeywords = color(sgStarscript, "starscript-keywords", new SettingColor(204, 120, 50)); private final Setting starscriptAccessedObjects = color(sgStarscript, "starscript-accessed-objects", new SettingColor(152, 118, 170)); + private final MessageFormatter messageFormatter = new MeteorMessageFormatter(); + private final Text chatPrefix = Text.literal(MeteorClient.NAME).setStyle(Style.EMPTY.withColor(TextColor.fromRgb(MeteorClient.ADDON.color.getPacked()))); + public MeteorGuiTheme() { super("Meteor"); @@ -361,6 +369,16 @@ public TextRenderer textRenderer() { return TextRenderer.get(); } + @Override + public MessageFormatter messageFormatter() { + return this.messageFormatter; + } + + @Override + public Text getChatPrefix() { + return this.chatPrefix; + } + @Override public double scale(double value) { double scaled = value * scale.get(); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorMessageFormatter.java b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorMessageFormatter.java new file mode 100644 index 0000000000..6ab7ffefe5 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorMessageFormatter.java @@ -0,0 +1,92 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.gui.themes.meteor; + +import meteordevelopment.meteorclient.gui.MessageFormatter; +import meteordevelopment.meteorclient.pathing.NopPathManager; +import meteordevelopment.meteorclient.pathing.PathManagers; +import meteordevelopment.meteorclient.utils.misc.text.MessageKind; +import meteordevelopment.meteorclient.utils.misc.text.RunnableClickEvent; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.text.HoverEvent; +import net.minecraft.text.MutableText; +import net.minecraft.text.Style; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; + +import java.text.DecimalFormat; + +public class MeteorMessageFormatter implements MessageFormatter { + private final DecimalFormat decimalFormat = new DecimalFormat("0.0##"); + + @Override + public Text formatPlayerName(PlayerEntity player) { + return player.getName(); + } + + @Override + public Text formatEntityName(Entity entity) { + return Text.literal(entity.getName().getString()); + } + + @Override + public Text formatCoords(Vec3i blockPos) { + return formatCoords(blockPos.getX(), blockPos.getY(), blockPos.getZ()); + } + + @Override + public Text formatCoords(Vec3d pos) { + return formatCoords((int) Math.round(pos.getX()), (int) Math.round(pos.getY()), (int) Math.round(pos.getZ())); + } + + private Text formatCoords(int x, int y, int z) { + Style style = Style.EMPTY.withFormatting(Formatting.WHITE).withUnderline(true); + + if (!(PathManagers.get() instanceof NopPathManager)) { + style = style.withBold(true) + .withHoverEvent(new HoverEvent.ShowText( + Text.literal("Set as pathing goal") + )) + .withClickEvent(new RunnableClickEvent( + () -> PathManagers.get().moveTo(new BlockPos(x, y, z)) + )); + } + + return Text.literal(x + ", " + y + ", " + z).setStyle(style); + } + + @Override + public Text formatHighlight(MutableText text) { + return text.formatted(Formatting.WHITE); + } + + @Override + public Text formatDecimal(double decimal) { + return Text.literal(this.decimalFormat.format(decimal)); + } + + @Override + public Text formatPrefix(Text prefix) { + return Text.empty().formatted(Formatting.GRAY) + .append("[") + .append(prefix) + .append("] "); + } + + @Override + public Text formatMessage(MutableText message, MessageKind messageKind) { + return switch (messageKind) { + case Passthrough -> message; + case Info -> message.formatted(Formatting.GRAY); + case Warning -> message.formatted(Formatting.YELLOW); + case Error -> message.formatted(Formatting.RED); + }; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java new file mode 100644 index 0000000000..8ed7d5a4aa --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java @@ -0,0 +1,27 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.misc.text; + +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +public interface MessageBuilder { + MessageBuilder setId(int id); + MessageBuilder setKind(MessageKind kind); + MessageBuilder overrideClientPrefix(Class holder); + + MessageBuilder prefix(MutableText prefix); + MessageBuilder prefix(String prefix); + MessageBuilder prefix(String prefix, Formatting prefixColor); + + MessageBuilder body(MutableText body); + MessageBuilder body(String body, Object... args); + MessageBuilder content(String translationKey, Object... args); + + Text build(); + void send(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java new file mode 100644 index 0000000000..3ad4e5bcc8 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java @@ -0,0 +1,237 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.misc.text; + +import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.GuiThemes; +import meteordevelopment.meteorclient.gui.MessageFormatter; +import meteordevelopment.meteorclient.mixininterface.IChatHud; +import meteordevelopment.meteorclient.systems.config.Config; +import meteordevelopment.meteorclient.utils.player.ChatUtils; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.text.MutableText; +import net.minecraft.text.StringVisitable; +import net.minecraft.text.Style; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.Pair; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.function.Supplier; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +public class MessageBuilderImpl implements MessageBuilder { + private final GuiTheme theme = GuiThemes.get(); + private final MessageFormatter formatter = this.theme.messageFormatter(); + + private int id = 0; + private MessageKind kind; + private @Nullable Class topLevelPrefix; + private @Nullable Text messagePrefix; + private @Nullable MutableText messageBody; + private Object[] args; + + private boolean hasStyledArgs = false; + private boolean closed = false; + + /* Builder functions */ + + @Override + public MessageBuilder setId(int id) { + assertOpen(); + this.id = id; + return this; + } + + @Override + public MessageBuilder setKind(MessageKind kind) { + assertOpen(); + this.kind = kind; + return this; + } + + @Override + public MessageBuilder overrideClientPrefix(Class holder) { + assertOpen(); + this.topLevelPrefix = holder; + return this; + } + + @Override + public MessageBuilder prefix(MutableText prefix) { + assertOpen(); + this.messagePrefix = prefix; + return this; + } + + @Override + public MessageBuilder prefix(String prefix) { + assertOpen(); + this.messagePrefix = Text.literal(prefix); + return this; + } + + @Override + public MessageBuilder prefix(String prefix, Formatting prefixColor) { + assertOpen(); + this.messagePrefix = Text.literal(prefix).formatted(prefixColor); + return this; + } + + @Override + public MessageBuilder body(MutableText body) { + assertOpen(); + this.messageBody = body; + return this; + } + + @Override + public MessageBuilder body(String body, Object... args) { + assertOpen(); + processArgs(args); + this.messageBody = Text.literal(String.format(body, args)); + return this; + } + + @Override + public MessageBuilder content(String translationKey, Object... args) { + assertOpen(); + processArgs(args); + this.messageBody = MutableText.of(new MeteorTranslatableTextContent( + translationKey, null, args, this.hasStyledArgs + )); + return this; + } + + /* Terminal Functions */ + + @Override + public Text build() { + closed = true; + if (this.messageBody == null) { + throw new IllegalArgumentException("Message body cannot be empty!"); + } else if (this.kind == null) { + throw new IllegalArgumentException("Message cannot have a kind!"); + } + + MutableText message = Text.empty() + .append(this.formatter.formatPrefix(this.getPrefix())); + + if (this.messagePrefix != null) { + message.append(this.formatter.formatPrefix(this.messagePrefix)); + } + + message.append(this.formatter.formatMessage(this.messageBody, this.kind)); + + return message; + } + + @Override + public void send() { + if (mc.world == null) return; + + Text message = this.build(); + int messageId = Config.get().deleteChatFeedback.get() ? this.id : 0; + + if (mc.isOnThread()) { + ((IChatHud) mc.inGameHud.getChatHud()).meteor$add(message, messageId); + } else { + mc.execute(() -> ((IChatHud) mc.inGameHud.getChatHud()).meteor$add(message, messageId)); + } + } + + /* Internal Functions */ + + private void processArgs(Object[] args) { + hasStyledArgs = false; + + for (int i = 0; i < args.length; i++) { + Object arg = args[i]; + args[i] = switch (arg) { + // theme-dependent formatting + case PlayerEntity player -> { hasStyledArgs = true; yield this.formatter.formatPlayerName(player); } + case Entity entity -> { hasStyledArgs = true; yield this.formatter.formatEntityName(entity); } + case Vec3i vec -> { hasStyledArgs = true; yield this.formatter.formatCoords(vec); } + case Vec3d vec -> { hasStyledArgs = true; yield this.formatter.formatCoords(vec); } + case Float f -> { hasStyledArgs = true; yield this.formatter.formatDecimal(f); } + case Double d -> { hasStyledArgs = true; yield this.formatter.formatDecimal(d); } + + // accept common objects as parameters + case StatusEffect statusEffect -> stripStyle(statusEffect.getName()); + case Item item -> stripStyle(item.getName()); + case Block block -> stripStyle(block.getName()); + case EntityType type -> stripStyle(type.getName()); + + case StringVisitable stringVisitable -> { hasStyledArgs = true; yield stringVisitable; } + default -> String.valueOf(arg); + }; + } + } + + private Text stripStyle(Text text) { + if (text instanceof MutableText mutable) { + mutable.setStyle(Style.EMPTY); + for (Text sibling : mutable.getSiblings()) { + stripStyle(sibling); + } + } + return text; + } + + private Text getPrefix() { + List>> customPrefixes = ChatUtils.getCustomPrefixes(); + if (customPrefixes.isEmpty()) { + return this.theme.getChatPrefix(); + } + + String className = null; + if (topLevelPrefix != null) { + className = topLevelPrefix.getName(); + } else { + boolean foundClass = false; + for (StackTraceElement element : Thread.currentThread().getStackTrace()) { + if (foundClass) { + if (!element.getClassName().equals(MessageBuilderImpl.class.getName())) { + className = element.getClassName(); + break; + } + } else { + if (element.getClassName().equals(MessageBuilderImpl.class.getName())) { + foundClass = true; + } + } + } + } + + if (className == null) { + return this.theme.getChatPrefix(); + } + + for (Pair> pair : customPrefixes) { + if (className.startsWith(pair.getLeft())) { + @Nullable Text prefix = pair.getRight().get(); + return prefix != null ? prefix : this.theme.getChatPrefix(); + } + } + + return this.theme.getChatPrefix(); + } + + private void assertOpen() { + if (this.closed) { + throw new IllegalStateException("Cannot use MessageBuilder after building message."); + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageKind.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageKind.java new file mode 100644 index 0000000000..cc408539bf --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageKind.java @@ -0,0 +1,13 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.misc.text; + +public enum MessageKind { + Passthrough, + Info, + Warning, + Error +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextContent.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextContent.java index cd7cc39f9a..d35960379c 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextContent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextContent.java @@ -51,6 +51,13 @@ public MeteorTranslatableTextContent(String key, Object... args) { this(key, null, args); } + public MeteorTranslatableTextContent(String key, @Nullable String fallback, Object[] args, boolean styledArgs) { + this.key = key; + this.fallback = fallback; + this.args = args; + this.styledArgs = styledArgs; + } + private void updateTranslations() { if (!mc.options.language.equals(this.cachedLanguage)) { cachedLanguage = mc.options.language; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java index dc0be270fc..f566e8b767 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java @@ -7,6 +7,7 @@ import com.mojang.brigadier.StringReader; import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.mixininterface.IChatHud; import meteordevelopment.meteorclient.pathing.BaritoneUtils; import meteordevelopment.meteorclient.systems.config.Config; @@ -42,6 +43,10 @@ public static void init() { .append("] "); } + /** + * @deprecated use {@link GuiTheme#getChatPrefix()} + */ + @Deprecated public static Text getMeteorPrefix() { return PREFIX; } @@ -73,6 +78,10 @@ public static void forceNextPrefixClass(Class klass) { forcedPrefixClassName = klass.getName(); } + public static List>> getCustomPrefixes() { + return customPrefixes; + } + // Player /** From d5ed3db48f0ec776b2917daaa97169c1adf15a4a Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Fri, 6 Feb 2026 22:29:45 -0500 Subject: [PATCH 64/72] the good, the bad and the ugly --- .../utils/misc/text/MessageBuilder.java | 8 ++- .../utils/misc/text/MessageBuilderImpl.java | 66 +++++++++++++------ .../utils/misc/text/MessageKind.java | 14 ++-- 3 files changed, 61 insertions(+), 27 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java index 8ed7d5a4aa..bd7e7a64fa 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java @@ -10,9 +10,14 @@ import net.minecraft.util.Formatting; public interface MessageBuilder { + static MessageBuilder create() { + return new MessageBuilderImpl(); + } + MessageBuilder setId(int id); MessageBuilder setKind(MessageKind kind); - MessageBuilder overrideClientPrefix(Class holder); + MessageBuilder setTranslationContext(String translationContext); + MessageBuilder setSource(Object source); MessageBuilder prefix(MutableText prefix); MessageBuilder prefix(String prefix); @@ -20,7 +25,6 @@ public interface MessageBuilder { MessageBuilder body(MutableText body); MessageBuilder body(String body, Object... args); - MessageBuilder content(String translationKey, Object... args); Text build(); void send(); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java index 3ad4e5bcc8..1feda4cfb5 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java @@ -10,6 +10,7 @@ import meteordevelopment.meteorclient.gui.MessageFormatter; import meteordevelopment.meteorclient.mixininterface.IChatHud; import meteordevelopment.meteorclient.systems.config.Config; +import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.block.Block; import net.minecraft.entity.Entity; @@ -37,12 +38,15 @@ public class MessageBuilderImpl implements MessageBuilder { private final MessageFormatter formatter = this.theme.messageFormatter(); private int id = 0; - private MessageKind kind; - private @Nullable Class topLevelPrefix; + private @Nullable MessageKind kind; + private @Nullable Object source; private @Nullable Text messagePrefix; - private @Nullable MutableText messageBody; + private @Nullable MutableText messageBodyText; + private @Nullable String messageBody; private Object[] args; + private @Nullable String translationContext; + private boolean hasStyledArgs = false; private boolean closed = false; @@ -63,9 +67,16 @@ public MessageBuilder setKind(MessageKind kind) { } @Override - public MessageBuilder overrideClientPrefix(Class holder) { + public MessageBuilder setTranslationContext(String translationContext) { + assertOpen(); + this.translationContext = translationContext; + return this; + } + + @Override + public MessageBuilder setSource(Object source) { assertOpen(); - this.topLevelPrefix = holder; + this.source = source; return this; } @@ -93,7 +104,7 @@ public MessageBuilder prefix(String prefix, Formatting prefixColor) { @Override public MessageBuilder body(MutableText body) { assertOpen(); - this.messageBody = body; + this.messageBodyText = body; return this; } @@ -101,17 +112,8 @@ public MessageBuilder body(MutableText body) { public MessageBuilder body(String body, Object... args) { assertOpen(); processArgs(args); - this.messageBody = Text.literal(String.format(body, args)); - return this; - } - - @Override - public MessageBuilder content(String translationKey, Object... args) { - assertOpen(); - processArgs(args); - this.messageBody = MutableText.of(new MeteorTranslatableTextContent( - translationKey, null, args, this.hasStyledArgs - )); + this.messageBody = body; + this.args = args; return this; } @@ -119,8 +121,10 @@ public MessageBuilder content(String translationKey, Object... args) { @Override public Text build() { + assertOpen(); closed = true; - if (this.messageBody == null) { + + if (this.messageBody == null || this.messageBodyText == null) { throw new IllegalArgumentException("Message body cannot be empty!"); } else if (this.kind == null) { throw new IllegalArgumentException("Message cannot have a kind!"); @@ -133,7 +137,8 @@ public Text build() { message.append(this.formatter.formatPrefix(this.messagePrefix)); } - message.append(this.formatter.formatMessage(this.messageBody, this.kind)); + MutableText bodyText = this.messageBodyText != null ? this.messageBodyText : this.createMessageBody(this.messageBody, this.kind); + message.append(this.formatter.formatMessage(bodyText, this.kind)); return message; } @@ -197,8 +202,8 @@ private Text getPrefix() { } String className = null; - if (topLevelPrefix != null) { - className = topLevelPrefix.getName(); + if (source != null) { + className = source.getClass().getName(); } else { boolean foundClass = false; for (StackTraceElement element : Thread.currentThread().getStackTrace()) { @@ -229,6 +234,25 @@ private Text getPrefix() { return this.theme.getChatPrefix(); } + private MutableText createMessageBody(String messageBody, MessageKind kind) { + MeteorTranslations.MeteorLanguage language = MeteorTranslations.getCurrentLanguage(); + + if (language.hasTranslation(messageBody)) { + return MutableText.of(new MeteorTranslatableTextContent( + messageBody, null, this.args, this.hasStyledArgs + )); + } else if (this.translationContext != null && kind != MessageKind.Passthrough) { + String computedTranslationKey = this.translationContext + "." + kind.key + "." + messageBody; + if (language.hasTranslation(computedTranslationKey)) { + return MutableText.of(new MeteorTranslatableTextContent( + computedTranslationKey, null, this.args, this.hasStyledArgs + )); + } + } + + return Text.literal(messageBody); + } + private void assertOpen() { if (this.closed) { throw new IllegalStateException("Cannot use MessageBuilder after building message."); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageKind.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageKind.java index cc408539bf..a7e0f0ae2c 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageKind.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageKind.java @@ -6,8 +6,14 @@ package meteordevelopment.meteorclient.utils.misc.text; public enum MessageKind { - Passthrough, - Info, - Warning, - Error + Passthrough(null), + Info("info"), + Warning("warning"), + Error("error"); + + public String key; + + MessageKind(String key) { + this.key = key; + } } From b8bde860d48ac20cadbf7013784d7e93e550bfb1 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Sat, 14 Feb 2026 01:32:40 -0500 Subject: [PATCH 65/72] huge module feedback update --- .../meteorclient/gui/MessageFormatter.java | 8 +- .../themes/meteor/MeteorMessageFormatter.java | 32 ++- .../meteorclient/systems/modules/Module.java | 52 ++-- .../utils/misc/text/MessageBuilder.java | 112 +++++++- .../utils/misc/text/MessageBuilderImpl.java | 142 ++++------- .../text/MeteorTranslatableTextContent.java | 154 +---------- .../utils/misc/text/RichPlainTextContent.java | 41 +++ .../utils/misc/text/RichTextContent.java | 152 +++++++++++ .../meteorclient/utils/player/ChatUtils.java | 240 ++---------------- 9 files changed, 440 insertions(+), 493 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/misc/text/RichPlainTextContent.java create mode 100644 src/main/java/meteordevelopment/meteorclient/utils/misc/text/RichTextContent.java diff --git a/src/main/java/meteordevelopment/meteorclient/gui/MessageFormatter.java b/src/main/java/meteordevelopment/meteorclient/gui/MessageFormatter.java index b53453e9bf..3e43722472 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/MessageFormatter.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/MessageFormatter.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.gui; +import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.misc.text.MessageKind; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; @@ -13,6 +14,8 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; +import java.util.Optional; + public interface MessageFormatter { Text formatPlayerName(PlayerEntity player); Text formatEntityName(Entity entity); @@ -20,9 +23,10 @@ public interface MessageFormatter { Text formatCoords(Vec3i blockPos); Text formatCoords(Vec3d pos); - Text formatHighlight(MutableText text); + Text formatHighlight(Text text); Text formatDecimal(double decimal); Text formatPrefix(Text prefix); - Text formatMessage(MutableText message, MessageKind messageKind); + Text formatToggleFeedback(Text clientPrefix, Text featurePrefix, Module module, boolean enabled); + Text formatMessage(Text clientPrefix, Optional featurePrefix, Text message, MessageKind messageKind); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorMessageFormatter.java b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorMessageFormatter.java index 6ab7ffefe5..e79e47e28a 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorMessageFormatter.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorMessageFormatter.java @@ -5,9 +5,11 @@ package meteordevelopment.meteorclient.gui.themes.meteor; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.gui.MessageFormatter; import meteordevelopment.meteorclient.pathing.NopPathManager; import meteordevelopment.meteorclient.pathing.PathManagers; +import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.misc.text.MessageKind; import meteordevelopment.meteorclient.utils.misc.text.RunnableClickEvent; import net.minecraft.entity.Entity; @@ -22,6 +24,7 @@ import net.minecraft.util.math.Vec3i; import java.text.DecimalFormat; +import java.util.Optional; public class MeteorMessageFormatter implements MessageFormatter { private final DecimalFormat decimalFormat = new DecimalFormat("0.0##"); @@ -63,8 +66,8 @@ private Text formatCoords(int x, int y, int z) { } @Override - public Text formatHighlight(MutableText text) { - return text.formatted(Formatting.WHITE); + public Text formatHighlight(Text text) { + return Text.empty().formatted(Formatting.WHITE).append(text); } @Override @@ -81,12 +84,27 @@ public Text formatPrefix(Text prefix) { } @Override - public Text formatMessage(MutableText message, MessageKind messageKind) { + public Text formatToggleFeedback(Text clientPrefix, Text featurePrefix, Module module, boolean enabled) { + Text feedback = MeteorClient.translatable( + "module.base.toggled", + module.getTitleText(), + enabled ? Text.literal("on").formatted(Formatting.GREEN) : Text.literal("off").formatted(Formatting.RED) + ); + + return this.formatMessage(clientPrefix, Optional.of(featurePrefix), feedback, MessageKind.Passthrough); + } + + @Override + public Text formatMessage(Text clientPrefix, Optional featurePrefix, Text message, MessageKind messageKind) { + MutableText formattedMessage = Text.empty().append(clientPrefix); + featurePrefix.ifPresent(formattedMessage::append); + formattedMessage.append(message); + return switch (messageKind) { - case Passthrough -> message; - case Info -> message.formatted(Formatting.GRAY); - case Warning -> message.formatted(Formatting.YELLOW); - case Error -> message.formatted(Formatting.RED); + case Passthrough -> formattedMessage; + case Info -> formattedMessage.formatted(Formatting.GRAY); + case Warning -> formattedMessage.formatted(Formatting.YELLOW); + case Error -> formattedMessage.formatted(Formatting.RED); }; } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java index e33a4422d8..58701f5916 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java @@ -9,6 +9,7 @@ import meteordevelopment.meteorclient.addons.AddonManager; import meteordevelopment.meteorclient.addons.MeteorAddon; import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.GuiThemes; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.Settings; import meteordevelopment.meteorclient.systems.config.Config; @@ -16,6 +17,8 @@ import meteordevelopment.meteorclient.utils.misc.ISerializable; import meteordevelopment.meteorclient.utils.misc.Keybind; import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; +import meteordevelopment.meteorclient.utils.misc.text.MessageKind; import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import net.minecraft.client.MinecraftClient; @@ -23,7 +26,6 @@ import net.minecraft.nbt.NbtElement; import net.minecraft.text.MutableText; import net.minecraft.text.Text; -import net.minecraft.util.Formatting; import org.jetbrains.annotations.NotNull; import java.util.Objects; @@ -117,44 +119,34 @@ public void disable() { public void sendToggledMsg() { if (Config.get().chatFeedback.get() && chatFeedback) { - ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.sendMsg(this.hashCode(), Formatting.GRAY, "module.base.toggled", this.getTitleText(), isActive() ? Text.literal("on").formatted(Formatting.GREEN) : Text.literal("off").formatted(Formatting.RED)); + GuiTheme theme = GuiThemes.get(); + ChatUtils.sendMsg(this.hashCode(), theme.messageFormatter().formatToggleFeedback( + theme.messageFormatter().formatPrefix(ChatUtils.getPrefix(this, theme)), + theme.messageFormatter().formatPrefix(this.getTitleText()), + this, + this.isActive() + )); } } - public void info(Text message) { - ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.sendMsg(this.getTranslationKey(), message); + public MessageBuilder info(Text message) { + return MessageBuilder.create().setSource(this).setTranslationContext(this.getTranslationKey()) + .body(message).setKind(MessageKind.Info); } - public void info(String messageKey, Object... args) { - ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.infoPrefix(this.getTranslationKey(), this.getTranslationKey() + ".info." + messageKey, args); + public MessageBuilder info(String message, Object... args) { + return MessageBuilder.create().setSource(this).setTranslationContext(this.getTranslationKey()) + .body(message, args).setKind(MessageKind.Info); } - public void infoRaw(String message, Object... args) { - ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.infoPrefixRaw(this.getTranslationKey(), message, args); + public MessageBuilder warning(String message, Object... args) { + return MessageBuilder.create().setSource(this).setTranslationContext(this.getTranslationKey()) + .body(message, args).setKind(MessageKind.Warning); } - public void warning(String messageKey, Object... args) { - ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.warningPrefix(this.getTranslationKey(), this.getTranslationKey() + ".warning." + messageKey, args); - } - - public void warningRaw(String message, Object... args) { - ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.warningPrefixRaw(this.getTranslationKey(), message, args); - } - - public void error(String messageKey, Object... args) { - ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.errorPrefix(this.getTranslationKey(), this.getTranslationKey() + ".error." + messageKey, args); - } - - public void errorRaw(String message, Object... args) { - ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.errorPrefixRaw(this.getTranslationKey(), message, args); + public MessageBuilder error(String message, Object... args) { + return MessageBuilder.create().setSource(this).setTranslationContext(this.getTranslationKey()) + .body(message, args).setKind(MessageKind.Error); } public boolean isActive() { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java index bd7e7a64fa..bfaf3e952d 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java @@ -5,27 +5,133 @@ package meteordevelopment.meteorclient.utils.misc.text; -import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import java.util.function.Supplier; + public interface MessageBuilder { static MessageBuilder create() { return new MessageBuilderImpl(); } + static Text highlight(Object argument) { + return MessageBuilderImpl.highlight(argument); + } + + /** + * Sets the id associated with this message. There can only be a single message with a given id in chat. + * + * @return this builder + * @throws IllegalStateException if this builder is already closed. + */ MessageBuilder setId(int id); + + /** + * Sets the kind of message you want to send, for use in styling. Use {@link MessageKind#Passthrough} to avoid + * the formatter to send the message body as-is, with no additional styling. + * + * @return this builder + * @throws IllegalStateException if this builder is already closed. + */ MessageBuilder setKind(MessageKind kind); + + /** + * Sets the context to be used for translation keys within this builder. If this is set, it will automatically + * attempt to resolve translations using the key {@code "${context}.${kind}.${body}"}. + * + * @return this builder + * @throws IllegalStateException if this builder is already closed. + */ MessageBuilder setTranslationContext(String translationContext); + + /** + * Sets the source of this builder. If set, the Meteor Client prefix will be replaced based on + * {@link meteordevelopment.meteorclient.utils.player.ChatUtils#registerCustomPrefix(String, Supplier)}. + * + * @return this builder + * @throws IllegalStateException if this builder is already closed. + */ MessageBuilder setSource(Object source); - MessageBuilder prefix(MutableText prefix); + /** + * Sets the prefix to show in front of the message. This can optionally be styled, but should not contain any + * decorations such as brackets as those will be added by the formatter. + * + * @return this builder + * @throws IllegalStateException if this builder is already closed. + */ + MessageBuilder prefix(Text prefix); + + /** + * Sets the prefix to show in front of the message. This should not contain any decorations such as brackets as + * those will be added by the formatter. + * + * @return this builder + * @throws IllegalStateException if this builder is already closed. + */ MessageBuilder prefix(String prefix); + + /** + * Sets the prefix to show in front of the message. This should not contain any decorations such as brackets as + * those will be added by the formatter. The prefix color is a suggestion, the formatter is allowed to override it. + * + * @return this builder + * @throws IllegalStateException if this builder is already closed. + */ MessageBuilder prefix(String prefix, Formatting prefixColor); - MessageBuilder body(MutableText body); + /** + * Sets the message body. + * + * @return this builder + * @throws IllegalStateException if this builder is already closed. + */ + MessageBuilder body(Text body); + + /** + * Sets the message body. + * + * @param body the message body. If this is a valid Meteor Client translation key, the message body will instead be + * the translated text. If {@link MessageBuilder#setTranslationContext(String)} is set and + * {@link MessageBuilder#setKind(MessageKind)} is not set to {@link MessageKind#Passthrough}, the + * message body will also attempt to resolve the key made using the format + * {@code "${context}.${kind}.${body}"}. For example, + * {@code builder.setKind(MessageKind.Info).setTranslationContext("example").body("test")} would result + * in the key {@code "example.info.test"}. Otherwise, the message body will simply be passed in plain + * text. + * @param args the arguments that will be used to replace the format specifiers in the body. This builder supports + * many special argument types:
    + *
  • {@link Text} — Keeps the styling.
  • + *
  • {@link net.minecraft.entity.player.PlayerEntity} — Uses the player's name.
  • + *
  • {@link net.minecraft.entity.Entity} — Uses the entity's display name.
  • + *
  • {@link net.minecraft.util.math.BlockPos} — Formatted coordinate display.
  • + *
  • {@link net.minecraft.util.math.Vec3d} — Formatted coordinate display.
  • + *
  • {@link Float} & {@link Double} — Truncates some decimals.
  • + *
  • {@link net.minecraft.entity.effect.StatusEffect} — Uses the status effect's display name.
  • + *
  • {@link net.minecraft.item.Item} — Uses the item's display name.
  • + *
  • {@link net.minecraft.block.Block} — Uses the block's display name.
  • + *
  • {@link net.minecraft.entity.EntityType} — Uses the entity type's display name.
  • + *
Otherwise the argument will be passed through {@link String#valueOf(Object)}. + * @return this builder + * @throws IllegalStateException if this builder is already closed. + */ MessageBuilder body(String body, Object... args); + /** + * Builds the message and closes this builder. + * + * @return the built message + * @throws IllegalArgumentException if the message has no body or no kind. + * @throws IllegalStateException if this builder is already closed. + */ Text build(); + + /** + * Sends the message in chat and closes this builder. + * + * @throws IllegalArgumentException if the message has no body or no kind. + * @throws IllegalStateException if this builder is already closed. + */ void send(); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java index 1feda4cfb5..4c8a68632f 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java @@ -8,7 +8,6 @@ import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.GuiThemes; import meteordevelopment.meteorclient.gui.MessageFormatter; -import meteordevelopment.meteorclient.mixininterface.IChatHud; import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; import meteordevelopment.meteorclient.utils.player.ChatUtils; @@ -19,19 +18,14 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.text.MutableText; -import net.minecraft.text.StringVisitable; import net.minecraft.text.Style; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import net.minecraft.util.Pair; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; import org.jetbrains.annotations.Nullable; -import java.util.List; -import java.util.function.Supplier; - -import static meteordevelopment.meteorclient.MeteorClient.mc; +import java.util.Optional; public class MessageBuilderImpl implements MessageBuilder { private final GuiTheme theme = GuiThemes.get(); @@ -41,13 +35,12 @@ public class MessageBuilderImpl implements MessageBuilder { private @Nullable MessageKind kind; private @Nullable Object source; private @Nullable Text messagePrefix; - private @Nullable MutableText messageBodyText; + private @Nullable Text messageBodyText; private @Nullable String messageBody; private Object[] args; private @Nullable String translationContext; - private boolean hasStyledArgs = false; private boolean closed = false; /* Builder functions */ @@ -81,7 +74,7 @@ public MessageBuilder setSource(Object source) { } @Override - public MessageBuilder prefix(MutableText prefix) { + public MessageBuilder prefix(Text prefix) { assertOpen(); this.messagePrefix = prefix; return this; @@ -102,7 +95,7 @@ public MessageBuilder prefix(String prefix, Formatting prefixColor) { } @Override - public MessageBuilder body(MutableText body) { + public MessageBuilder body(Text body) { assertOpen(); this.messageBodyText = body; return this; @@ -124,68 +117,66 @@ public Text build() { assertOpen(); closed = true; - if (this.messageBody == null || this.messageBodyText == null) { + if (this.messageBody == null && this.messageBodyText == null) { throw new IllegalArgumentException("Message body cannot be empty!"); } else if (this.kind == null) { throw new IllegalArgumentException("Message cannot have a kind!"); } - MutableText message = Text.empty() - .append(this.formatter.formatPrefix(this.getPrefix())); - - if (this.messagePrefix != null) { - message.append(this.formatter.formatPrefix(this.messagePrefix)); - } - - MutableText bodyText = this.messageBodyText != null ? this.messageBodyText : this.createMessageBody(this.messageBody, this.kind); - message.append(this.formatter.formatMessage(bodyText, this.kind)); + Text bodyText = this.messageBodyText != null ? this.messageBodyText : this.createMessageBody(this.messageBody, this.kind); - return message; + return this.formatter.formatMessage( + this.formatter.formatPrefix(ChatUtils.getPrefix(this.source, this.theme)), + Optional.ofNullable(this.messagePrefix).map(this.formatter::formatPrefix), + bodyText, + this.kind + ); } @Override public void send() { - if (mc.world == null) return; - Text message = this.build(); int messageId = Config.get().deleteChatFeedback.get() ? this.id : 0; - if (mc.isOnThread()) { - ((IChatHud) mc.inGameHud.getChatHud()).meteor$add(message, messageId); - } else { - mc.execute(() -> ((IChatHud) mc.inGameHud.getChatHud()).meteor$add(message, messageId)); - } + ChatUtils.sendMsg(messageId, message); } /* Internal Functions */ - private void processArgs(Object[] args) { - hasStyledArgs = false; + public static Text highlight(Object arg) { + MessageFormatter formatter = GuiThemes.get().messageFormatter(); + Text processed = processArg(formatter, arg); + return formatter.formatHighlight(processed); + } + private void processArgs(Object[] args) { for (int i = 0; i < args.length; i++) { - Object arg = args[i]; - args[i] = switch (arg) { - // theme-dependent formatting - case PlayerEntity player -> { hasStyledArgs = true; yield this.formatter.formatPlayerName(player); } - case Entity entity -> { hasStyledArgs = true; yield this.formatter.formatEntityName(entity); } - case Vec3i vec -> { hasStyledArgs = true; yield this.formatter.formatCoords(vec); } - case Vec3d vec -> { hasStyledArgs = true; yield this.formatter.formatCoords(vec); } - case Float f -> { hasStyledArgs = true; yield this.formatter.formatDecimal(f); } - case Double d -> { hasStyledArgs = true; yield this.formatter.formatDecimal(d); } - - // accept common objects as parameters - case StatusEffect statusEffect -> stripStyle(statusEffect.getName()); - case Item item -> stripStyle(item.getName()); - case Block block -> stripStyle(block.getName()); - case EntityType type -> stripStyle(type.getName()); - - case StringVisitable stringVisitable -> { hasStyledArgs = true; yield stringVisitable; } - default -> String.valueOf(arg); - }; + args[i] = processArg(this.formatter, args[i]); } } - private Text stripStyle(Text text) { + private static Text processArg(MessageFormatter formatter, Object arg) { + return switch (arg) { + // theme-dependent formatting + case PlayerEntity player -> formatter.formatPlayerName(player); + case Entity entity -> formatter.formatEntityName(entity); + case Vec3i vec -> formatter.formatCoords(vec); + case Vec3d vec -> formatter.formatCoords(vec); + case Float f -> formatter.formatDecimal(f); + case Double d -> formatter.formatDecimal(d); + + // accept common objects as parameters + case StatusEffect statusEffect -> stripStyle(statusEffect.getName()); + case Item item -> stripStyle(item.getName()); + case Block block -> stripStyle(block.getName()); + case EntityType type -> stripStyle(type.getName()); + + case Text text -> text; + default -> Text.literal(String.valueOf(arg)); + }; + } + + private static Text stripStyle(Text text) { if (text instanceof MutableText mutable) { mutable.setStyle(Style.EMPTY); for (Text sibling : mutable.getSiblings()) { @@ -195,62 +186,27 @@ private Text stripStyle(Text text) { return text; } - private Text getPrefix() { - List>> customPrefixes = ChatUtils.getCustomPrefixes(); - if (customPrefixes.isEmpty()) { - return this.theme.getChatPrefix(); - } - - String className = null; - if (source != null) { - className = source.getClass().getName(); - } else { - boolean foundClass = false; - for (StackTraceElement element : Thread.currentThread().getStackTrace()) { - if (foundClass) { - if (!element.getClassName().equals(MessageBuilderImpl.class.getName())) { - className = element.getClassName(); - break; - } - } else { - if (element.getClassName().equals(MessageBuilderImpl.class.getName())) { - foundClass = true; - } - } - } - } - - if (className == null) { - return this.theme.getChatPrefix(); - } - - for (Pair> pair : customPrefixes) { - if (className.startsWith(pair.getLeft())) { - @Nullable Text prefix = pair.getRight().get(); - return prefix != null ? prefix : this.theme.getChatPrefix(); - } - } - - return this.theme.getChatPrefix(); - } - private MutableText createMessageBody(String messageBody, MessageKind kind) { MeteorTranslations.MeteorLanguage language = MeteorTranslations.getCurrentLanguage(); if (language.hasTranslation(messageBody)) { return MutableText.of(new MeteorTranslatableTextContent( - messageBody, null, this.args, this.hasStyledArgs + messageBody, null, this.args )); } else if (this.translationContext != null && kind != MessageKind.Passthrough) { String computedTranslationKey = this.translationContext + "." + kind.key + "." + messageBody; if (language.hasTranslation(computedTranslationKey)) { return MutableText.of(new MeteorTranslatableTextContent( - computedTranslationKey, null, this.args, this.hasStyledArgs + computedTranslationKey, null, this.args )); } } - return Text.literal(messageBody); + if (this.args.length == 0) { + return Text.literal(messageBody); + } else { + return MutableText.of(new RichPlainTextContent(messageBody, this.args)); + } } private void assertOpen() { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextContent.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextContent.java index d35960379c..5f27f02e81 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextContent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MeteorTranslatableTextContent.java @@ -5,108 +5,44 @@ package meteordevelopment.meteorclient.utils.misc.text; -import com.google.common.collect.ImmutableList; -import com.mojang.serialization.MapCodec; -import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; -import meteordevelopment.meteorclient.utils.player.ChatUtils; -import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.text.*; import org.jetbrains.annotations.Nullable; -import java.util.*; -import java.util.function.Consumer; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import java.util.Arrays; +import java.util.Objects; import static meteordevelopment.meteorclient.MeteorClient.mc; -public class MeteorTranslatableTextContent implements TextContent { - private static final boolean DEBUG_MISSING_ENTRIES = FabricLoader.getInstance().isDevelopmentEnvironment() || Boolean.getBoolean("meteor.lang.debug"); +public class MeteorTranslatableTextContent extends RichTextContent { private final String key; - @Nullable - private final String fallback; - private final Object[] args; - private final boolean styledArgs; + private final @Nullable String fallback; private String cachedLanguage; - private List translations = ImmutableList.of(); public MeteorTranslatableTextContent(String key, @Nullable String fallback, Object... args) { + super(args); this.key = key; this.fallback = fallback; - this.args = args; - - boolean hasStyledArgs = false; - for (Object o : args) { - if (o instanceof Text) { - hasStyledArgs = true; - break; - } - } - this.styledArgs = hasStyledArgs; } public MeteorTranslatableTextContent(String key, Object... args) { this(key, null, args); } - public MeteorTranslatableTextContent(String key, @Nullable String fallback, Object[] args, boolean styledArgs) { - this.key = key; - this.fallback = fallback; - this.args = args; - this.styledArgs = styledArgs; - } - - private void updateTranslations() { - if (!mc.options.language.equals(this.cachedLanguage)) { - cachedLanguage = mc.options.language; - if (styledArgs) { - String template = fallback == null ? MeteorTranslations.translate(key) : MeteorTranslations.translate(key, fallback); - - try { - ImmutableList.Builder builder = ImmutableList.builder(); - this.forEachPart(template, builder::add); - this.translations = builder.build(); - } catch (TranslationException e) { - if (DEBUG_MISSING_ENTRIES) { - MeteorClient.LOG.warn("Error translating text", e); - } - this.translations = ImmutableList.of(StringVisitable.plain(template)); - } - } else { - String template = fallback == null ? MeteorTranslations.translate(key, args) : MeteorTranslations.translate(key, fallback, args); - - this.translations = ImmutableList.of(ChatUtils.formatMsg(template, Style.EMPTY)); - } - } - } - @Override - public Optional visit(StringVisitable.StyledVisitor visitor, Style style) { - updateTranslations(); - - for (StringVisitable stringVisitable : translations) { - Optional result = stringVisitable.visit(visitor, style); - if (result.isPresent()) return result; - } - return Optional.empty(); + protected boolean shouldUpdate() { + return !mc.options.language.equals(this.cachedLanguage); } @Override - public Optional visit(StringVisitable.Visitor visitor) { - updateTranslations(); - - for (StringVisitable stringVisitable : translations) { - Optional result = stringVisitable.visit(visitor); - if (result.isPresent()) return result; - } - return Optional.empty(); + protected void update(String template) { + cachedLanguage = mc.options.language; + super.update(template); } @Override - public MapCodec getCodec() { - return null; + protected String getTemplate() { + return fallback == null ? MeteorTranslations.translate(key) : MeteorTranslations.translate(key, fallback); } @Override @@ -118,70 +54,6 @@ public boolean equals(@Nullable Object o) { @Override public String toString() { - return "MeteorTranslatableTextComponent[key=" + key + ", fallback=" + fallback + ", args=" + Arrays.toString(args) + "]"; - } - - - private static final StringVisitable LITERAL_PERCENT_SIGN = StringVisitable.plain("%"); - private static final StringVisitable NULL_ARGUMENT = StringVisitable.plain("null"); - // %, optional position argument (\d$), string format (s) || percent literal (%|$) - private static final Pattern ARG_FORMAT = Pattern.compile("%(?:(\\d+)\\$)?([s%]|$)"); - - private void forEachPart(String translation, Consumer partsConsumer) { - Matcher matcher = ARG_FORMAT.matcher(translation); - - try { - int argPosition = 0; - int charIndex = 0; - - while (matcher.find(charIndex)) { - int start = matcher.start(); - int end = matcher.end(); - if (start > charIndex) { - String string = translation.substring(charIndex, start); - if (string.indexOf(37) != -1) { - throw new IllegalArgumentException(string); - } - - partsConsumer.accept(StringVisitable.plain(string)); - } - - String string = matcher.group(2); - String string2 = translation.substring(start, end); - if ("%".equals(string) && "%%".equals(string2)) { - partsConsumer.accept(LITERAL_PERCENT_SIGN); - } else { - String positionArgument = matcher.group(1); - int index = positionArgument != null ? Integer.parseInt(positionArgument) - 1 : argPosition++; - if (index < 0 || index >= this.args.length) { - throw new TranslationException(new TranslatableTextContent(this.key, this.fallback, this.args), index); - } - - Object argument = this.args[index]; - - if (string.equals("s")) { // fast path - StringVisitable visitableArgument = argument instanceof StringVisitable visitable ? visitable - : argument == null ? NULL_ARGUMENT : StringVisitable.plain(argument.toString()); - - partsConsumer.accept(visitableArgument); - } else { - throw new TranslationException(new TranslatableTextContent(this.key, this.fallback, this.args), "Unsupported format: '" + string2 + "'"); - } - } - - charIndex = end; - } - - if (charIndex < translation.length()) { - String string4 = translation.substring(charIndex); - if (string4.indexOf(37) != -1) { - throw new IllegalArgumentException(); - } - - partsConsumer.accept(StringVisitable.plain(string4)); - } - } catch (IllegalArgumentException e) { - throw new TranslationException(new TranslatableTextContent(this.key, this.fallback, this.args), e); - } + return "MeteorTranslatableTextContent[key=" + key + ", fallback=" + fallback + ", args=" + Arrays.toString(args) + "]"; } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/RichPlainTextContent.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/RichPlainTextContent.java new file mode 100644 index 0000000000..5a741411d7 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/RichPlainTextContent.java @@ -0,0 +1,41 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.misc.text; + +import java.util.Arrays; +import java.util.Objects; + +public class RichPlainTextContent extends RichTextContent { + private final String template; + + public RichPlainTextContent(String template, Object... args) { + super(args); + this.template = template; + this.update(template); + } + + @Override + protected boolean shouldUpdate() { + return false; + } + + @Override + protected String getTemplate() { + return this.template; + } + + @Override + public String toString() { + return "RichPlainTextContent[template=" + this.template + ", args=" + Arrays.toString(this.args) + "]"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof RichPlainTextContent component)) return false; + return Objects.equals(this.template, component.template) && Arrays.equals(this.args, component.args); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/RichTextContent.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/RichTextContent.java new file mode 100644 index 0000000000..1eac8ce06f --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/RichTextContent.java @@ -0,0 +1,152 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.utils.misc.text; + +import com.google.common.collect.ImmutableList; +import com.mojang.serialization.MapCodec; +import meteordevelopment.meteorclient.MeteorClient; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.text.*; + +import java.util.List; +import java.util.Locale; +import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public abstract class RichTextContent implements TextContent { + private static final boolean DEBUG_MISSING_ENTRIES = FabricLoader.getInstance().isDevelopmentEnvironment() || Boolean.getBoolean("meteor.lang.debug"); + protected final Object[] args; + + private List parts = ImmutableList.of(); + + protected RichTextContent(Object... args) { + this.args = args; + } + + protected abstract boolean shouldUpdate(); + + protected abstract String getTemplate(); + + protected void update(String template) { + try { + ImmutableList.Builder builder = ImmutableList.builder(); + this.forEachPart(template, builder); + this.parts = builder.build(); + } catch (IllegalArgumentException e) { + if (DEBUG_MISSING_ENTRIES) { + MeteorClient.LOG.warn("Error formatting text", e); + } + this.parts = ImmutableList.of(StringVisitable.plain(template)); + } + } + + @Override + public Optional visit(StringVisitable.StyledVisitor visitor, Style style) { + if (this.shouldUpdate()) { + this.update(this.getTemplate()); + } + + for (StringVisitable stringVisitable : this.parts) { + Optional result = stringVisitable.visit(visitor, style); + if (result.isPresent()) return result; + } + return Optional.empty(); + } + + @Override + public Optional visit(StringVisitable.Visitor visitor) { + if (this.shouldUpdate()) { + this.update(this.getTemplate()); + } + + for (StringVisitable stringVisitable : this.parts) { + Optional result = stringVisitable.visit(visitor); + if (result.isPresent()) return result; + } + return Optional.empty(); + } + + @Override + public MapCodec getCodec() { + return null; + } + + private static final StringVisitable LITERAL_PERCENT_SIGN = StringVisitable.plain("%"); + private static final StringVisitable NULL_ARGUMENT = StringVisitable.plain("null"); + // %, optional position argument (\d$), string format (s) || percent literal (%|$) + private static final Pattern ARG_FORMAT = Pattern.compile("%(?:(\\d+)\\$)?([s%]|$)"); + + private void forEachPart(String template, ImmutableList.Builder builder) { + Matcher matcher = ARG_FORMAT.matcher(template); + + try { + int argPosition = 0; + int charIndex = 0; + + while (matcher.find(charIndex)) { + int start = matcher.start(); + int end = matcher.end(); + if (start > charIndex) { + String string = template.substring(charIndex, start); + if (string.indexOf(37) != -1) { + throw new IllegalArgumentException(string); + } + + builder.add(StringVisitable.plain(string)); + } + + String string = matcher.group(2); + String format = template.substring(start, end); + if ("%".equals(string) && "%%".equals(format)) { + builder.add(LITERAL_PERCENT_SIGN); + } else { + String positionArgument = matcher.group(1); + int index = positionArgument != null ? Integer.parseInt(positionArgument) - 1 : argPosition++; + if (index < 0 || index >= this.args.length) { + throw exception(template, index); + } + + Object argument = this.args[index]; + + if (string.equals("s")) { + StringVisitable visitableArgument = argument instanceof StringVisitable visitable ? visitable + : argument == null ? NULL_ARGUMENT : StringVisitable.plain(argument.toString()); + + builder.add(visitableArgument); + } else { + throw exception(template, "Unsupported format: '" + format + "'"); + } + } + + charIndex = end; + } + + if (charIndex < template.length()) { + String rest = template.substring(charIndex); + if (rest.indexOf(37) != -1) { + throw new IllegalArgumentException(); + } + + builder.add(StringVisitable.plain(rest)); + } + } catch (IllegalArgumentException e) { + throw exception(template, e); + } + } + + private static IllegalArgumentException exception(String template, String cause) { + return new IllegalArgumentException(String.format(Locale.ROOT, "Error parsing: %s: %s", template, cause)); + } + + private static IllegalArgumentException exception(String template, int index) { + return new IllegalArgumentException(String.format(Locale.ROOT, "Invalid index %d requested for %s", index, template)); + } + + private static IllegalArgumentException exception(String template, Throwable cause) { + return new IllegalArgumentException(String.format(Locale.ROOT, "Error while parsing: %s", template), cause); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java index f566e8b767..b452fe5c86 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/ChatUtils.java @@ -5,18 +5,14 @@ package meteordevelopment.meteorclient.utils.player; -import com.mojang.brigadier.StringReader; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.mixininterface.IChatHud; -import meteordevelopment.meteorclient.pathing.BaritoneUtils; -import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.utils.PostInit; -import meteordevelopment.meteorclient.utils.misc.text.MeteorClickEvent; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilderImpl; import net.minecraft.text.*; import net.minecraft.util.Formatting; import net.minecraft.util.Pair; -import net.minecraft.util.math.Vec3d; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -27,7 +23,6 @@ public class ChatUtils { private static final List>> customPrefixes = new ArrayList<>(); - private static String forcedPrefixClassName; private static Text PREFIX; @@ -74,14 +69,6 @@ public static void unregisterCustomPrefix(String packageName) { customPrefixes.removeIf(pair -> pair.getLeft().equals(packageName)); } - public static void forceNextPrefixClass(Class klass) { - forcedPrefixClassName = klass.getName(); - } - - public static List>> getCustomPrefixes() { - return customPrefixes; - } - // Player /** @@ -101,232 +88,51 @@ public static void sendPlayerMsg(String message, boolean addToHistory) { else mc.player.networkHandler.sendChatMessage(message); } - // Default - - public static void info(String messageKey, Object... args) { - sendMsg(Formatting.GRAY, messageKey, args); - } - - public static void infoRaw(String message, Object... args) { - sendMsgRaw(Formatting.GRAY, message, args); - } - - public static void infoPrefix(String prefix, String messageKey, Object... args) { - sendMsg(0, prefix, Formatting.LIGHT_PURPLE, Formatting.GRAY, messageKey, args); - } - - public static void infoPrefixRaw(String prefix, String message, Object... args) { - sendMsgRaw(0, prefix, Formatting.LIGHT_PURPLE, Formatting.GRAY, message, args); - } - - // Warning - - public static void warning(String messageKey, Object... args) { - sendMsg(Formatting.YELLOW, messageKey, args); - } - - public static void warningRaw(String message, Object... args) { - sendMsgRaw(Formatting.YELLOW, message, args); - } - - public static void warningPrefix(String prefix, String messageKey, Object... args) { - sendMsg(0, prefix, Formatting.LIGHT_PURPLE, Formatting.YELLOW, messageKey, args); - } - - public static void warningPrefixRaw(String prefix, String message, Object... args) { - sendMsgRaw(0, prefix, Formatting.LIGHT_PURPLE, Formatting.YELLOW, message, args); - } - - // Error - - public static void error(String messageKey, Object... args) { - sendMsg(Formatting.RED, messageKey, args); - } - - public static void errorRaw(String message, Object... args) { - sendMsgRaw(Formatting.RED, message, args); - } - - public static void errorPrefix(String prefix, String messageKey, Object... args) { - sendMsg(0, prefix, Formatting.LIGHT_PURPLE, Formatting.RED, messageKey, args); - } - - public static void errorPrefixRaw(String prefix, String message, Object... args) { - sendMsgRaw(0, prefix, Formatting.LIGHT_PURPLE, Formatting.RED, message, args); - } - - // Misc - - public static void sendMsg(Text message) { - sendMsg(null, message); - } - - public static void sendMsg(String prefix, Text message) { - sendMsg(0, prefix, Formatting.LIGHT_PURPLE, message); - } - - public static void sendMsg(Formatting color, String messageKey, Object... args) { - sendMsg(0, null, null, color, messageKey, args); - } - - public static void sendMsgRaw(Formatting color, String message, Object... args) { - sendMsgRaw(0, null, null, color, message, args); - } - - public static void sendMsg(int id, Formatting color, String messageKey, Object... args) { - sendMsg(id, null, null, color, messageKey, args); - } - - public static void sendMsgRaw(int id, Formatting color, String message, Object... args) { - sendMsgRaw(id, null, null, color, message, args); - } - - public static void sendMsgRaw(int id, @Nullable String prefixKey, @Nullable Formatting prefixColor, Formatting messageColor, String messageContent, Object... args) { - MutableText message = formatMsg(String.format(messageContent, args), Style.EMPTY.withFormatting(messageColor)); - sendMsg(id, prefixKey, prefixColor, message); - } - - public static void sendMsg(int id, @Nullable String prefixKey, @Nullable Formatting prefixColor, Formatting messageColor, String messageContentKey, Object... args) { - MutableText message = MeteorClient.translatable(messageContentKey, args).setStyle(Style.EMPTY.withFormatting(messageColor)); - sendMsg(id, prefixKey, prefixColor, message); - } - - public static void sendMsg(int id, @Nullable String prefixKey, @Nullable Formatting prefixColor, String messageContent, Formatting messageColor) { - MutableText message = formatMsg(messageContent, Style.EMPTY.withFormatting(messageColor)); - sendMsg(id, prefixKey, prefixColor, message); - } - - public static void sendMsg(int id, @Nullable String prefixKey, @Nullable Formatting prefixColor, Text msg) { + public static void sendMsg(int id, Text message) { if (mc.world == null) return; - MutableText message = Text.empty(); - message.append(getPrefix()); - if (prefixKey != null) message.append(getCustomPrefix(prefixKey, prefixColor)); - message.append(msg); - - if (!Config.get().deleteChatFeedback.get()) id = 0; - - final int finalId = id; // Intellij copes about using non-final args in lambdas - mc.execute(() -> ((IChatHud) mc.inGameHud.getChatHud()).meteor$add(message, finalId)); - } - - private static MutableText getCustomPrefix(String prefixKey, Formatting prefixColor) { - MutableText prefix = Text.empty(); - prefix.setStyle(prefix.getStyle().withFormatting(Formatting.GRAY)); - - prefix.append("["); - - MutableText moduleTitle = MeteorClient.translatable(prefixKey); - moduleTitle.setStyle(moduleTitle.getStyle().withFormatting(prefixColor)); - prefix.append(moduleTitle); - - prefix.append("] "); - - return prefix; + if (mc.isOnThread()) { + ((IChatHud) mc.inGameHud.getChatHud()).meteor$add(message, id); + } else { + mc.execute(() -> ((IChatHud) mc.inGameHud.getChatHud()).meteor$add(message, id)); + } } - private static Text getPrefix() { + public static Text getPrefix(@Nullable Object source, GuiTheme theme) { if (customPrefixes.isEmpty()) { - forcedPrefixClassName = null; - return PREFIX; + return theme.getChatPrefix(); } - boolean foundChatUtils = false; String className = null; - - if (forcedPrefixClassName != null) { - className = forcedPrefixClassName; - forcedPrefixClassName = null; + if (source != null) { + className = source.getClass().getName(); } else { + boolean foundClass = false; for (StackTraceElement element : Thread.currentThread().getStackTrace()) { - if (foundChatUtils) { - if (!element.getClassName().equals(ChatUtils.class.getName())) { + if (foundClass) { + if (!element.getClassName().equals(MessageBuilderImpl.class.getName())) { className = element.getClassName(); break; } } else { - if (element.getClassName().equals(ChatUtils.class.getName())) foundChatUtils = true; + if (element.getClassName().equals(MessageBuilderImpl.class.getName())) { + foundClass = true; + } } } } - if (className == null) return PREFIX; + if (className == null) { + return theme.getChatPrefix(); + } for (Pair> pair : customPrefixes) { if (className.startsWith(pair.getLeft())) { - Text prefix = pair.getRight().get(); - return prefix != null ? prefix : PREFIX; - } - } - - return PREFIX; - } - - public static MutableText formatMsg(String message, Style defaultStyle) { - StringReader reader = new StringReader(message); - MutableText text = Text.empty(); - Style style = defaultStyle; - StringBuilder result = new StringBuilder(); - boolean formatting = false; - while (reader.canRead()) { - char c = reader.read(); - if (c == '(') { - text.append(Text.literal(result.toString()).setStyle(style)); - result.setLength(0); - result.append(c); - formatting = true; - } else { - result.append(c); - - if (formatting && c == ')') { - switch (result.toString()) { - case "(default)" -> { - style = defaultStyle; - result.setLength(0); - } - case "(highlight)" -> { - style = style.withFormatting(Formatting.WHITE); - result.setLength(0); - } - case "(underline)" -> { - style = style.withFormatting(Formatting.UNDERLINE); - result.setLength(0); - } - case "(bold)" -> { - style = style.withFormatting(Formatting.BOLD); - result.setLength(0); - } - } - formatting = false; - } + @Nullable Text prefix = pair.getRight().get(); + return prefix != null ? prefix : theme.getChatPrefix(); } } - if (!result.isEmpty()) text.append(Text.literal(result.toString()).setStyle(style)); - - return text; - } - - public static MutableText highlight(Object object) { - return Text.literal(String.valueOf(object)).formatted(Formatting.WHITE); - } - - public static MutableText formatCoords(Vec3d pos) { - String coordsString = String.format("(highlight)(underline)%.0f, %.0f, %.0f(default)", pos.x, pos.y, pos.z); - MutableText coordsText = formatMsg(coordsString, Style.EMPTY.withFormatting(Formatting.GRAY)); - - if (BaritoneUtils.IS_AVAILABLE) { - Style style = coordsText.getStyle().withFormatting(Formatting.BOLD) - .withHoverEvent(new HoverEvent.ShowText( - Text.literal("Set as Baritone goal") - )) - .withClickEvent(new MeteorClickEvent( - String.format("%sgoto %d %d %d", BaritoneUtils.getPrefix(), (int) pos.x, (int) pos.y, (int) pos.z) - )); - - coordsText.setStyle(style); - } - - return coordsText; + return theme.getChatPrefix(); } } From b72bff553293eaecd356f12ef757cd64ef6fec4d Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Sat, 14 Feb 2026 16:28:10 -0500 Subject: [PATCH 66/72] do some impl with new messagebuilder api --- .../meteorclient/commands/Command.java | 42 +++------ .../commands/commands/BindCommand.java | 4 +- .../commands/commands/BindsCommand.java | 6 +- .../commands/commands/CommandsCommand.java | 9 +- .../commands/commands/FakePlayerCommand.java | 10 +-- .../commands/commands/FriendsCommand.java | 20 ++--- .../commands/commands/InputCommand.java | 24 +++-- .../commands/commands/LocateCommand.java | 80 ++++++++--------- .../commands/commands/ModulesCommand.java | 11 +-- .../commands/commands/NameHistoryCommand.java | 6 +- .../commands/commands/ProfilesCommand.java | 7 +- .../commands/commands/ResetCommand.java | 16 ++-- .../commands/commands/ServerCommand.java | 43 +++++---- .../commands/commands/SwarmCommand.java | 26 +++--- .../meteorclient/mixin/BookScreenMixin.java | 4 +- .../mixin/ClientPlayNetworkHandlerMixin.java | 4 +- .../systems/modules/misc/BetterChat.java | 3 +- .../systems/modules/misc/Notifier.java | 90 +++++++++---------- .../modules/misc/swarm/SwarmConnection.java | 11 +-- .../systems/modules/misc/swarm/SwarmHost.java | 11 +-- .../modules/misc/swarm/SwarmWorker.java | 15 ++-- .../modules/render/WaypointsModule.java | 6 +- 22 files changed, 216 insertions(+), 232 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/Command.java b/src/main/java/meteordevelopment/meteorclient/commands/Command.java index 76be9caabf..f49260cb26 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/Command.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/Command.java @@ -11,7 +11,8 @@ import com.mojang.brigadier.builder.RequiredArgumentBuilder; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.systems.config.Config; -import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; +import meteordevelopment.meteorclient.utils.misc.text.MessageKind; import net.minecraft.client.MinecraftClient; import net.minecraft.command.CommandRegistryAccess; import net.minecraft.command.CommandSource; @@ -81,39 +82,24 @@ public String toString(String... args) { return base.toString(); } - public void info(Text message) { - ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.sendMsg(translationKey, message); + public MessageBuilder info(Text message) { + return MessageBuilder.create().setSource(this).setTranslationContext(this.translationKey) + .body(message).setKind(MessageKind.Info); } - public void info(String messageKey, Object... args) { - ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.infoPrefix(translationKey, translationKey + ".info." + messageKey, args); + public MessageBuilder info(String message, Object... args) { + return MessageBuilder.create().setSource(this).setTranslationContext(this.translationKey) + .body(message, args).setKind(MessageKind.Info); } - public void infoRaw(String message, Object... args) { - ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.infoPrefixRaw(translationKey, message, args); + public MessageBuilder warning(String message, Object... args) { + return MessageBuilder.create().setSource(this).setTranslationContext(this.translationKey) + .body(message, args).setKind(MessageKind.Warning); } - public void warning(String messageKey, Object... args) { - ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.warningPrefix(translationKey, translationKey + ".warning." + messageKey, args); - } - - public void warningRaw(String message, Object... args) { - ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.warningPrefixRaw(translationKey, message, args); - } - - public void error(String messageKey, Object... args) { - ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.errorPrefix(translationKey, translationKey + ".error." + messageKey, args); - } - - public void errorRaw(String message, Object... args) { - ChatUtils.forceNextPrefixClass(getClass()); - ChatUtils.errorPrefixRaw(translationKey, message, args); + public MessageBuilder error(String message, Object... args) { + return MessageBuilder.create().setSource(this).setTranslationContext(this.translationKey) + .body(message, args).setKind(MessageKind.Error); } public MutableText translatable(String string, Object... args) { diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java index 9556c94a4f..058b6ec40f 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java @@ -10,7 +10,6 @@ import meteordevelopment.meteorclient.commands.arguments.ModuleArgumentType; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.command.CommandSource; public class BindCommand extends Command { @@ -25,8 +24,7 @@ public void build(LiteralArgumentBuilder builder) { Modules.get().setModuleToBind(module); Modules.get().awaitKeyRelease(); - ChatUtils.forceNextPrefixClass(module.getClass()); - ChatUtils.infoPrefix(module.getTranslationKey(), this.translationKey + ".info.press_key"); + this.info("press_key").prefix(module.getTitleText()).send(); return SINGLE_SUCCESS; })); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java index aa19887cf3..2e289805ae 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java @@ -9,7 +9,7 @@ import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import net.minecraft.command.CommandSource; import net.minecraft.text.HoverEvent; import net.minecraft.text.MutableText; @@ -31,7 +31,7 @@ public void build(LiteralArgumentBuilder builder) { .filter(module -> module.keybind.isSet()) .toList(); - ChatUtils.info(translationKey + ".info.bound_modules", ChatUtils.highlight(modules.size())); + this.info("bound_modules", MessageBuilder.highlight(modules.size())).send(); for (Module module : modules) { HoverEvent hoverEvent = new HoverEvent.ShowText(getTooltip(module)); @@ -47,7 +47,7 @@ public void build(LiteralArgumentBuilder builder) { key.setStyle(key.getStyle().withHoverEvent(hoverEvent)); text.append(key.formatted(Formatting.GRAY)); - ChatUtils.sendMsg(text); + this.info(text).send(); } return SINGLE_SUCCESS; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java index ca5e1de059..82387ed49c 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java @@ -9,6 +9,7 @@ import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.commands.Commands; import meteordevelopment.meteorclient.systems.config.Config; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.command.CommandSource; import net.minecraft.text.ClickEvent; @@ -25,11 +26,11 @@ public CommandsCommand() { @Override public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { - ChatUtils.info(translationKey + ".info.commands", ChatUtils.highlight(Commands.COMMANDS.size())); + this.info("commands", MessageBuilder.highlight(Commands.COMMANDS.size())).send(); - MutableText commands = Text.literal(""); + MutableText commands = Text.empty(); Commands.COMMANDS.forEach(command -> commands.append(getCommandText(command))); - ChatUtils.sendMsg(commands); + this.info(commands).send(); return SINGLE_SUCCESS; }); @@ -37,7 +38,7 @@ public void build(LiteralArgumentBuilder builder) { private MutableText getCommandText(Command command) { // Hover tooltip - MutableText tooltip = Text.literal(""); + MutableText tooltip = Text.empty(); tooltip.append(command.getTitle().formatted(Formatting.BLUE, Formatting.BOLD)).append("\n"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java index 8dd8213bc2..fcf404ac34 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java @@ -13,7 +13,7 @@ import meteordevelopment.meteorclient.systems.modules.player.FakePlayer; import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity; import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerManager; -import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import net.minecraft.command.CommandSource; public class FakePlayerCommand extends Command { @@ -43,12 +43,12 @@ public void build(LiteralArgumentBuilder builder) { .executes(context -> { FakePlayerEntity fp = FakePlayerArgumentType.get(context); if (fp == null || !FakePlayerManager.contains(fp)) { - error("not_found"); + this.error("not_found").send(); return SINGLE_SUCCESS; } FakePlayerManager.remove(fp); - info("removed", fp.getName().getString()); + this.info("removed", MessageBuilder.highlight(fp)).send(); return SINGLE_SUCCESS; }) @@ -64,8 +64,8 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("list") .executes(context -> { - info("fake_players", ChatUtils.highlight(FakePlayerManager.count())); - FakePlayerManager.forEach(fp -> info("(highlight)%s".formatted(fp.getName().getString()))); + this.info("fake_players", MessageBuilder.highlight(FakePlayerManager.count())).send(); + FakePlayerManager.forEach(fp -> this.info(MessageBuilder.highlight(fp)).send()); return SINGLE_SUCCESS; }) ); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java index 83d7ec38c7..4eeac79c4a 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java @@ -12,9 +12,8 @@ import meteordevelopment.meteorclient.commands.arguments.PlayerListEntryArgumentType; import meteordevelopment.meteorclient.systems.friends.Friend; import meteordevelopment.meteorclient.systems.friends.Friends; -import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import net.minecraft.command.CommandSource; -import net.minecraft.util.Formatting; public class FriendsCommand extends Command { public FriendsCommand() { @@ -30,7 +29,7 @@ public void build(LiteralArgumentBuilder builder) { Friend friend = new Friend(profile.name(), profile.id()); if (Friends.get().add(friend)) { - ChatUtils.sendMsg(friend.hashCode(), Formatting.GRAY, translationKey + ".info.added", friend.getName()); + this.info("added", friend.getName()).setId(friend.hashCode()).send(); } else error("already_friends"); @@ -44,14 +43,14 @@ public void build(LiteralArgumentBuilder builder) { .executes(context -> { Friend friend = FriendArgumentType.get(context); if (friend == null) { - error("not_friends"); + this.error("not_friends").send(); return SINGLE_SUCCESS; } if (Friends.get().remove(friend)) { - ChatUtils.sendMsg(friend.hashCode(), Formatting.GRAY, translationKey + ".info.removed", friend.getName()); + this.info("removed", friend.getName()).setId(friend.hashCode()).send(); } - else error("failed"); + else this.error("failed").send(); return SINGLE_SUCCESS; }) @@ -59,10 +58,9 @@ public void build(LiteralArgumentBuilder builder) { ); builder.then(literal("list").executes(context -> { - info("friends", ChatUtils.highlight(Friends.get().count())); - Friends.get().forEach(friend -> ChatUtils.infoRaw("(highlight)%s".formatted(friend.getName()))); - return SINGLE_SUCCESS; - }) - ); + this.info("friends", MessageBuilder.highlight(Friends.get().count())).send(); + Friends.get().forEach(friend -> this.info(MessageBuilder.highlight(friend.getName())).send()); + return SINGLE_SUCCESS; + })); } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java index 1a17bd4ebf..01bdf65640 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java @@ -12,11 +12,11 @@ import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.mixin.KeyBindingAccessor; -import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.resource.language.I18n; import net.minecraft.command.CommandSource; +import net.minecraft.text.Text; import java.util.ArrayList; import java.util.List; @@ -81,9 +81,9 @@ public void build(LiteralArgumentBuilder builder) { } builder.then(literal("clear").executes(ctx -> { - if (activeHandlers.isEmpty()) warning("no_handlers"); + if (activeHandlers.isEmpty()) this.warning("no_handlers").send(); else { - info("cleared_handlers"); + this.info("cleared_handlers").send(); activeHandlers.forEach(MeteorClient.EVENT_BUS::unsubscribe); activeHandlers.clear(); } @@ -91,12 +91,18 @@ public void build(LiteralArgumentBuilder builder) { })); builder.then(literal("list").executes(ctx -> { - if (activeHandlers.isEmpty()) warning("no_handlers"); + if (activeHandlers.isEmpty()) this.warning("no_handlers").send(); else { - info("active_handlers"); + this.info("active_handlers").send(); for (int i = 0; i < activeHandlers.size(); i++) { KeypressHandler handler = activeHandlers.get(i); - info("keypress_handler", ChatUtils.highlight(i), ChatUtils.highlight(I18n.translate(handler.key.getId())), ChatUtils.highlight(handler.ticks), ChatUtils.highlight(handler.totalTicks)); + this.info( + "keypress_handler", + MessageBuilder.highlight(i), + MessageBuilder.highlight(Text.translatable(handler.key.getId())), + MessageBuilder.highlight(handler.ticks), + MessageBuilder.highlight(handler.key.getId()) + ).send(); } } return SINGLE_SUCCESS; @@ -104,9 +110,9 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("remove").then(argument("index", IntegerArgumentType.integer(0)).executes(ctx -> { int index = IntegerArgumentType.getInteger(ctx, "index"); - if (index >= activeHandlers.size()) warning("out_of_range"); + if (index >= activeHandlers.size()) this.warning("out_of_range").send(); else { - info("removed_handler"); + this.info("removed_handler").send(); MeteorClient.EVENT_BUS.unsubscribe(activeHandlers.get(index)); activeHandlers.remove(index); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java index b580a71c75..9d123b2f65 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java @@ -13,7 +13,7 @@ import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.pathing.BaritoneUtils; import meteordevelopment.meteorclient.pathing.PathManagers; -import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Block; @@ -28,9 +28,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket; -import net.minecraft.text.MutableText; import net.minecraft.text.Text; -import net.minecraft.util.Formatting; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; @@ -80,25 +78,25 @@ public void build(LiteralArgumentBuilder builder) { if (stack.getItem() != Items.FILLED_MAP || stack.get(DataComponentTypes.ITEM_NAME) == null || !stack.get(DataComponentTypes.ITEM_NAME).getString().equals(Text.translatable("filled_map.buried_treasure").getString())) { - error("no_buried_treasure_map", Text.translatable("filled_map.buried_treasure").formatted(Formatting.WHITE)); + this.error("no_buried_treasure_map", MessageBuilder.highlight(Text.translatable("filled_map.buried_treasure"))).send(); return SINGLE_SUCCESS; } MapDecorationsComponent mapDecorationsComponent = stack.get(DataComponentTypes.MAP_DECORATIONS); if (mapDecorationsComponent == null) { - error("no_map_icons"); + this.error("no_map_icons").send(); return SINGLE_SUCCESS; } for (MapDecorationsComponent.Decoration decoration : mapDecorationsComponent.decorations().values()) { if (decoration.type().value().assetId().toString().equals("minecraft:red_x")) { Vec3d coords = new Vec3d(decoration.x(), 62, decoration.z()); - info("buried_treasure", ChatUtils.formatCoords(coords)); + this.info("buried_treasure", coords).send(); return SINGLE_SUCCESS; } } - error("cant_locate_buried_treasure"); + this.error("cant_locate_buried_treasure").send(); return SINGLE_SUCCESS; })); @@ -107,25 +105,25 @@ public void build(LiteralArgumentBuilder builder) { if (stack.getItem() != Items.FILLED_MAP || stack.get(DataComponentTypes.ITEM_NAME) == null || !stack.get(DataComponentTypes.ITEM_NAME).getString().equals(Text.translatable("filled_map.mansion").getString())) { - error("no_woodland_explorer_map", Text.translatable("filled_map.mansion").formatted(Formatting.WHITE)); + this.error("no_woodland_explorer_map", MessageBuilder.highlight(Text.translatable("filled_map.mansion"))).send(); return SINGLE_SUCCESS; } MapDecorationsComponent mapDecorationsComponent = stack.get(DataComponentTypes.MAP_DECORATIONS); if (mapDecorationsComponent == null) { - error("no_map_icons"); + this.error("no_map_icons").send(); return SINGLE_SUCCESS; } for (MapDecorationsComponent.Decoration decoration : mapDecorationsComponent.decorations().values()) { if (decoration.type().value().assetId().toString().equals("minecraft:woodland_mansion")) { Vec3d coords = new Vec3d(decoration.x(), 62, decoration.z()); - info("mansion", ChatUtils.formatCoords(coords)); + this.info("mansion", coords).send(); return SINGLE_SUCCESS; } } - error("cant_locate_mansion"); + this.error("cant_locate_mansion").send(); return SINGLE_SUCCESS; })); @@ -137,19 +135,19 @@ public void build(LiteralArgumentBuilder builder) { MapDecorationsComponent mapDecorationsComponent = stack.get(DataComponentTypes.MAP_DECORATIONS); if (mapDecorationsComponent == null) { - error("no_map_icons"); + this.error("no_map_icons").send(); return SINGLE_SUCCESS; } for (MapDecorationsComponent.Decoration decoration : mapDecorationsComponent.decorations().values()) { if (decoration.type().value().assetId().toString().equals("minecraft:ocean_monument")) { Vec3d coords = new Vec3d(decoration.x(), 62, decoration.z()); - info("monument", ChatUtils.formatCoords(coords)); + this.info("monument", coords).send(); return SINGLE_SUCCESS; } } - error("cant_locate_monument"); + this.error("cant_locate_monument").send(); return SINGLE_SUCCESS; } @@ -157,14 +155,14 @@ public void build(LiteralArgumentBuilder builder) { if (BaritoneUtils.IS_AVAILABLE) { Vec3d coords = findByBlockList(monumentBlocks); if (coords == null) { - error("no_monument_found", Text.translatable("filled_map.monument").formatted(Formatting.WHITE)); + this.error("no_monument_found", MessageBuilder.highlight(Text.translatable("filled_map.monument"))).send(); return SINGLE_SUCCESS; } - info("monument", ChatUtils.formatCoords(coords)); + this.info("monument", coords).send(); return SINGLE_SUCCESS; } - error("ocean_explorer_no_baritone", Text.translatable("filled_map.monument").formatted(Formatting.WHITE)); + this.error("ocean_explorer_no_baritone", MessageBuilder.highlight(Text.translatable("filled_map.monument"))).send(); return SINGLE_SUCCESS; })); @@ -178,16 +176,16 @@ public void build(LiteralArgumentBuilder builder) { secondStart = null; secondEnd = null; MeteorClient.EVENT_BUS.subscribe(this); - info("first_eye"); + this.info("first_eye").send(); } else if (BaritoneUtils.IS_AVAILABLE) { Vec3d coords = findByBlockList(strongholdBlocks); if (coords == null) { - error("no_stronghold_found", Text.translatable("item.minecraft.ender_eye").formatted(Formatting.WHITE)); + this.error("no_stronghold_found", MessageBuilder.highlight(Text.translatable("item.minecraft.ender_eye"))).send(); return SINGLE_SUCCESS; } - info("stronghold", ChatUtils.formatCoords(coords)); + this.info("stronghold", coords).send(); } else { - error("no_eyes_of_ender"); + this.error("no_eyes_of_ender").send(); } return SINGLE_SUCCESS; @@ -197,22 +195,22 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("nether_fortress").executes(s -> { if (mc.world.getRegistryKey() != World.NETHER) { - error("not_in_nether"); + this.error("not_in_nether").send(); return SINGLE_SUCCESS; } if (!BaritoneUtils.IS_AVAILABLE) { - error("no_baritone"); + this.error("no_baritone").send(); return SINGLE_SUCCESS; } Vec3d coords = findByBlockList(netherFortressBlocks); if (coords == null) { - error("cant_locate_nether_fortress"); + this.error("cant_locate_nether_fortress").send(); return SINGLE_SUCCESS; } - info("nether_fortress", ChatUtils.formatCoords(coords)); + this.info("nether_fortress", coords).send(); return SINGLE_SUCCESS; })); @@ -220,22 +218,22 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("end_city").executes(s -> { if (mc.world.getRegistryKey() != World.END) { - error("not_in_end"); + this.error("not_in_end").send(); return SINGLE_SUCCESS; } if (!BaritoneUtils.IS_AVAILABLE) { - error("no_baritone"); + this.error("no_baritone").send(); return SINGLE_SUCCESS; } Vec3d coords = findByBlockList(endCityBlocks); if (coords == null) { - error("cant_locate_end_city"); + this.error("cant_locate_end_city").send(); return SINGLE_SUCCESS; } - info("end_city", ChatUtils.formatCoords(coords)); + this.info("end_city", coords).send(); return SINGLE_SUCCESS; })); @@ -244,28 +242,28 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("lodestone").executes(s -> { ItemStack stack = mc.player.getInventory().getSelectedStack(); if (stack.getItem() != Items.COMPASS) { - error("no_lodestone_compass", Text.translatable("item.minecraft.lodestone_compass").formatted(Formatting.WHITE)); + this.error("no_lodestone_compass", MessageBuilder.highlight(Text.translatable("item.minecraft.lodestone_compass"))).send(); return SINGLE_SUCCESS; } ComponentMap components = stack.getComponents(); if (components == null) { - error("no_lodestone_compass_data", Text.translatable("item.minecraft.lodestone_compass").formatted(Formatting.WHITE)); + this.error("no_lodestone_compass_data", MessageBuilder.highlight(Text.translatable("item.minecraft.lodestone_compass"))).send(); return SINGLE_SUCCESS; } LodestoneTrackerComponent lodestoneTrackerComponent = components.get(DataComponentTypes.LODESTONE_TRACKER); if (lodestoneTrackerComponent == null) { - error("no_lodestone_compass_data", Text.translatable("item.minecraft.lodestone_compass").formatted(Formatting.WHITE)); + this.error("no_lodestone_compass_data", MessageBuilder.highlight(Text.translatable("item.minecraft.lodestone_compass"))).send(); return SINGLE_SUCCESS; } if (lodestoneTrackerComponent.target().isEmpty()) { - error("no_lodestone"); + this.error("no_lodestone").send(); return SINGLE_SUCCESS; } Vec3d coords = Vec3d.of(lodestoneTrackerComponent.target().get().pos()); - info("lodestone", ChatUtils.formatCoords(coords)); + this.info("lodestone", coords).send(); return SINGLE_SUCCESS; })); @@ -276,7 +274,7 @@ public void build(LiteralArgumentBuilder builder) { } private void cancel() { - warning("canceled"); + this.warning("canceled").send(); MeteorClient.EVENT_BUS.unsubscribe(this); } @@ -286,7 +284,7 @@ private void cancel() { return null; } if (posList.size() < 3) { - warning("false_positive", posList.size()); + this.warning("false_positive", posList.size()).send(); } return new Vec3d(posList.getFirst().getX(), posList.getFirst().getY(), posList.getFirst().getZ()); } @@ -315,11 +313,11 @@ private void firstPosition(double x, double y, double z) { } private void lastPosition(double x, double y, double z) { - info(this.firstEnd == null ? "first_eye_saved" : "second_eye_saved"); + this.info(this.firstEnd == null ? "first_eye_saved" : "second_eye_saved").send(); Vec3d pos = new Vec3d(x, y, z); if (this.firstEnd == null) { this.firstEnd = pos; - info("eye_different_location"); + this.info("eye_different_location").send(); } else { this.secondEnd = pos; findStronghold(); @@ -330,7 +328,7 @@ private void findStronghold() { PathManagers.get().stop(); if (this.firstStart == null || this.firstEnd == null || this.secondStart == null || this.secondEnd == null) { - error("missing_position_data"); + this.error("missing_position_data").send(); cancel(); return; } @@ -339,7 +337,7 @@ private void findStronghold() { final double[] end = new double[]{this.firstStart.x, this.firstStart.z, this.firstEnd.x, this.firstEnd.z}; final double[] intersection = calcIntersection(start, end); if (Double.isNaN(intersection[0]) || Double.isNaN(intersection[1]) || Double.isInfinite(intersection[0]) || Double.isInfinite(intersection[1])) { - error("unable_to_calculate"); + this.error("unable_to_calculate").send(); cancel(); return; } @@ -347,7 +345,7 @@ private void findStronghold() { MeteorClient.EVENT_BUS.unsubscribe(this); Vec3d coords = new Vec3d(intersection[0], 0, intersection[1]); - info("stronghold", ChatUtils.formatCoords(coords)); + this.info("stronghold", coords).send(); } private double[] calcIntersection(double[] line, double[] line2) { diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java index b6d28610c4..8bb38fed64 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java @@ -6,10 +6,11 @@ package meteordevelopment.meteorclient.commands.commands; import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import net.minecraft.command.CommandSource; import net.minecraft.text.HoverEvent; import net.minecraft.text.MutableText; @@ -24,12 +25,12 @@ public ModulesCommand() { @Override public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { - ChatUtils.infoRaw("--- Modules ((highlight)%d(default)) ---", Modules.get().getCount()); + this.info("--- Modules (%s) ---", MessageBuilder.highlight(Modules.get().getCount())).send(); Modules.loopCategories().forEach(category -> { - MutableText categoryMessage = Text.literal(""); + MutableText categoryMessage = Text.empty(); Modules.get().getGroup(category).forEach(module -> categoryMessage.append(getModuleText(module))); - ChatUtils.sendMsg(category.translationKey, categoryMessage); + this.info(categoryMessage).prefix(MeteorClient.translatable(category.translationKey)).send(); }); return SINGLE_SUCCESS; @@ -38,7 +39,7 @@ public void build(LiteralArgumentBuilder builder) { private MutableText getModuleText(Module module) { // Hover tooltip - MutableText tooltip = Text.literal(""); + MutableText tooltip = Text.empty(); tooltip.append(module.getTitleText().formatted(Formatting.BLUE, Formatting.BOLD)).append("\n"); tooltip.append(Text.literal(module.name).formatted(Formatting.GRAY)).append("\n\n"); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java index 306cd7fb74..e855e13c29 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java @@ -44,7 +44,7 @@ public void build(LiteralArgumentBuilder builder) { if (history == null) { return; } else if (history.username_history == null || history.username_history.length == 0) { - error("error_fetching_name"); + this.error("error_fetching_name").send(); } String name = lookUpTarget.getProfile().name(); @@ -66,7 +66,7 @@ public void build(LiteralArgumentBuilder builder) { )) ); - info(initial.append(Text.literal(" Username History:").formatted(Formatting.GRAY))); // todo map + this.info(initial.append(Text.literal(" Username History:").formatted(Formatting.GRAY))).send(); // todo map for (Name entry : history.username_history) { MutableText nameText = Text.literal(entry.name); @@ -90,7 +90,7 @@ public void build(LiteralArgumentBuilder builder) { nameText.append(text); } - ChatUtils.sendMsg(nameText); + this.info(nameText).send(); } }); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java index c3237e36e6..2bdc0f180f 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java @@ -10,6 +10,7 @@ import meteordevelopment.meteorclient.commands.arguments.ProfileArgumentType; import meteordevelopment.meteorclient.systems.profiles.Profile; import meteordevelopment.meteorclient.systems.profiles.Profiles; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.command.CommandSource; @@ -26,7 +27,7 @@ public void build(LiteralArgumentBuilder builder) { if (profile != null) { profile.load(); - info("loaded", ChatUtils.highlight(profile.name.get())); + this.info("loaded", MessageBuilder.highlight(profile.name.get())).send(); } return SINGLE_SUCCESS; @@ -37,7 +38,7 @@ public void build(LiteralArgumentBuilder builder) { if (profile != null) { profile.save(); - info("saved", ChatUtils.highlight(profile.name.get())); + this.info("saved", MessageBuilder.highlight(profile.name.get())).send(); } return SINGLE_SUCCESS; @@ -48,7 +49,7 @@ public void build(LiteralArgumentBuilder builder) { if (profile != null) { Profiles.get().remove(profile); - info("deleted", ChatUtils.highlight(profile.name.get())); + this.info("deleted", MessageBuilder.highlight(profile.name.get())).send(); } return SINGLE_SUCCESS; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java index badda137ad..c029a10ffb 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java @@ -13,7 +13,7 @@ import meteordevelopment.meteorclient.systems.hud.Hud; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; import net.minecraft.command.CommandSource; public class ResetCommand extends Command { @@ -28,38 +28,36 @@ public void build(LiteralArgumentBuilder builder) { .then(argument("module", ModuleArgumentType.create()).executes(context -> { Module module = context.getArgument("module", Module.class); module.settings.forEach(group -> group.forEach(Setting::reset)); - ChatUtils.forceNextPrefixClass(module.getClass()); - ChatUtils.infoPrefix(module.getTranslationKey(), "command.reset.info.module"); + module.info("command.reset.info.module").send(); return SINGLE_SUCCESS; })) .then(literal("all").executes(context -> { Modules.get().getAll().forEach(module -> module.settings.forEach(group -> group.forEach(Setting::reset))); - ChatUtils.infoPrefix("tab.modules", "command.reset.info.modules"); + this.info("modules").prefix(MeteorTranslations.translate("tab.modules")).send(); // todo maybe auto-translate prefix too? return SINGLE_SUCCESS; })) ).then(literal("gui").executes(context -> { GuiThemes.get().clearWindowConfigs(); GuiThemes.get().settings.reset(); - ChatUtils.info("command.reset.info.gui"); + this.info("gui").send(); return SINGLE_SUCCESS; })).then(literal("bind") .then(argument("module", ModuleArgumentType.create()).executes(context -> { Module module = context.getArgument("module", Module.class); module.keybind.reset(); - ChatUtils.forceNextPrefixClass(module.getClass()); - ChatUtils.infoPrefix(module.getTranslationKey(), "command.reset.info.bind"); + module.info("command.reset.info.bind").send(); return SINGLE_SUCCESS; })) .then(literal("all").executes(context -> { Modules.get().getAll().forEach(module -> module.keybind.reset()); - ChatUtils.infoPrefix("tab.modules", "command.reset.info.binds"); + this.info("binds").prefix(MeteorTranslations.translate("tab.modules")).send(); return SINGLE_SUCCESS; })) ).then(literal("hud").executes(context -> { Hud.get().resetToDefaultElements(); - ChatUtils.infoPrefix("tab.hud", "command.reset.info.hud"); + this.info("hud").prefix(MeteorTranslations.translate("tab.hud")).send(); return SINGLE_SUCCESS; })); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java index 1f87b249ad..f714f62b0f 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java @@ -13,7 +13,7 @@ import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.mixin.ClientPlayNetworkHandlerAccessor; -import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import meteordevelopment.meteorclient.utils.world.TickRate; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.network.ServerAddress; @@ -25,7 +25,6 @@ import net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket; import net.minecraft.network.packet.s2c.play.CommandSuggestionsS2CPacket; import net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket; -import net.minecraft.screen.ScreenTexts; import net.minecraft.server.integrated.IntegratedServer; import net.minecraft.text.*; import net.minecraft.util.Formatting; @@ -87,7 +86,7 @@ public void build(LiteralArgumentBuilder builder) { if (tps > 17.0f) color = Formatting.GREEN; else if (tps > 12.0f) color = Formatting.YELLOW; else color = Formatting.RED; - info("tps", Text.literal(String.format("%.2f", tps)).formatted(color)); + this.info("tps", Text.literal(String.format("%.2f", tps)).formatted(color)).send(); return SINGLE_SUCCESS; })); } @@ -96,8 +95,8 @@ private void basicInfo() { if (mc.isIntegratedServerRunning()) { IntegratedServer server = mc.getServer(); - info("singleplayer"); - if (server != null) info("version", server.getVersion()); + this.info("singleplayer").send(); + if (server != null) this.info("version", server.getVersion()).send(); return; } @@ -105,7 +104,7 @@ private void basicInfo() { ServerInfo server = mc.getCurrentServerEntry(); if (server == null) { - error("cant_obtain_info"); + this.error("cant_obtain_info").send(); return; } @@ -136,14 +135,14 @@ private void basicInfo() { ); ipText.append(ipv4Text); } - info("ip", ipText); - - info("port", ServerAddress.parse(server.address).getPort()); - info("type", mc.getNetworkHandler().getBrand() != null ? mc.getNetworkHandler().getBrand() : MeteorClient.translatable("command.server.info.unknown")); - info("motd", server.label != null ? server.label.getString() : MeteorClient.translatable("command.server.info.unknown")); - info("version", server.version.getString()); - info("protocol_version", server.protocolVersion); - info("difficulty", + this.info("ip", ipText).send(); + + this.info("port", ServerAddress.parse(server.address).getPort()).send(); + this.info("type", mc.getNetworkHandler().getBrand() != null ? mc.getNetworkHandler().getBrand() : MeteorClient.translatable("command.server.info.unknown")).send(); + this.info("motd", server.label != null ? server.label.getString() : MeteorClient.translatable("command.server.info.unknown")).send(); + this.info("version", server.version.getString()).send(); + this.info("protocol_version", server.protocolVersion).send(); + this.info("difficulty", mc.world.getDifficulty().getTranslatableName(), String.format("%.2f", new LocalDifficulty( mc.world.getDifficulty(), @@ -151,9 +150,9 @@ private void basicInfo() { mc.world.getChunk(mc.player.getBlockPos()).getInhabitedTime(), DimensionType.MOON_SIZES[mc.world.getEnvironmentAttributes().getAttributeValue(EnvironmentAttributes.MOON_PHASE_VISUAL, mc.player.getBlockPos()).getIndex()] // lol ).getLocalDifficulty()) - ); - info("day", mc.world.getTimeOfDay() / 24000L); - info(formatPerms()); + ).send(); + this.info("day", mc.world.getTimeOfDay() / 24000L).send(); + this.info(formatPerms()).send(); } public String formatPerms() { @@ -177,9 +176,9 @@ private void printPlugins() { } if (!plugins.isEmpty()) { - info("plugins", plugins.size(), Texts.join(pluginTexts, Texts.DEFAULT_SEPARATOR_TEXT)); + this.info("plugins", plugins.size(), Texts.join(pluginTexts, Texts.DEFAULT_SEPARATOR_TEXT)).send(); } else { - error("no_plugins"); + this.error("no_plugins").send(); } tick = false; @@ -236,7 +235,7 @@ private void onReadPacket(PacketEvent.Receive event) { Suggestions matches = packet.getSuggestions(); if (matches.isEmpty()) { - error("plugins"); + this.error("plugins").send(); return; } @@ -248,7 +247,7 @@ private void onReadPacket(PacketEvent.Receive event) { printPlugins(); } } catch (Exception e) { - error("plugins"); + this.error("plugins").send(); } } @@ -260,6 +259,6 @@ else if (Strings.CI.contains(name, "exploit") || Strings.CI.contains(name, "chea return Text.literal(name).formatted(Formatting.RED); } - return ChatUtils.highlight(name); + return MessageBuilder.highlight(name); } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java index cc2281657b..fbf7678609 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java @@ -22,6 +22,7 @@ import meteordevelopment.meteorclient.systems.modules.misc.swarm.SwarmConnection; import meteordevelopment.meteorclient.systems.modules.misc.swarm.SwarmWorker; import meteordevelopment.meteorclient.systems.modules.world.InfinityMiner; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import meteordevelopment.meteorclient.utils.misc.text.MeteorClickEvent; import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.command.CommandSource; @@ -69,11 +70,11 @@ public void build(LiteralArgumentBuilder builder) { pendingConnection = new ObjectIntImmutablePair<>(ip, port); - info("Are you sure you want to connect to '%s:%s'?", ip, port); - info(Text.literal("Click here to confirm").setStyle(Style.EMPTY + this.info("Are you sure you want to connect to '%s:%s'?", ip, port).send(); + this.info(Text.literal("Click here to confirm").setStyle(Style.EMPTY .withFormatting(Formatting.UNDERLINE, Formatting.GREEN) .withClickEvent(new MeteorClickEvent(".swarm join confirm")) - )); + )).send(); return SINGLE_SUCCESS; }) @@ -81,7 +82,7 @@ public void build(LiteralArgumentBuilder builder) { ) .then(literal("confirm").executes(ctx -> { if (pendingConnection == null) { - error("No pending swarm connections."); + this.error("No pending swarm connections.").send(); return SINGLE_SUCCESS; } @@ -95,9 +96,9 @@ public void build(LiteralArgumentBuilder builder) { pendingConnection = null; try { - info("Connected to (highlight)%s.", swarm.worker.getConnection()); + this.info("Connected to %s.", MessageBuilder.highlight(swarm.worker.getConnection())).send(); } catch (NullPointerException e) { - error("Error connecting to swarm host."); + this.error("Error connecting to swarm host.").send(); swarm.close(); swarm.toggle(); } @@ -111,19 +112,22 @@ public void build(LiteralArgumentBuilder builder) { if (swarm.isActive()) { if (swarm.isHost()) { if (swarm.host.getConnectionCount() > 0) { - ChatUtils.infoRaw("--- Swarm Connections (highlight)(%s/%s)(default) ---", swarm.host.getConnectionCount(), swarm.host.getConnections().length); + + this.info("--- Swarm Connections (%s/%s) ---", MessageBuilder.highlight(swarm.host.getConnectionCount()), MessageBuilder.highlight(swarm.host.getConnections().length)).send(); for (int i = 0; i < swarm.host.getConnections().length; i++) { SwarmConnection connection = swarm.host.getConnections()[i]; - if (connection != null) ChatUtils.infoRaw("(highlight)Worker %s(default): %s.", i, connection.getConnection()); + if (connection != null) { + this.info("%s: %s.", MessageBuilder.highlight("Worker " + i), connection.getConnection()).send(); + } } } else { - warning("No active connections"); + this.warning("No active connections").send(); } } else if (swarm.isWorker()) { - info("Connected to (highlight)%s", swarm.worker.getConnection()); + this.info("Connected to %s.", MessageBuilder.highlight(swarm.worker.getConnection())).send(); } } else { @@ -140,7 +144,7 @@ else if (swarm.isWorker()) { swarm.host.sendMessage(context.getInput() + " " + mc.player.getName().getString()); } else if (swarm.isWorker()) { - error("The follow host command must be used by the host."); + this.error("The follow host command must be used by the host.").send(); } } else { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java index 1936238b0f..8112f2cb86 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java @@ -8,7 +8,7 @@ import it.unimi.dsi.fastutil.io.FastByteArrayOutputStream; import meteordevelopment.meteorclient.gui.GuiThemes; import meteordevelopment.meteorclient.gui.screens.EditBookTitleAndAuthorScreen; -import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.BookScreen; import net.minecraft.client.gui.widget.ButtonWidget; @@ -73,7 +73,7 @@ private void onInit(CallbackInfo info) { long size = MemoryUtil.memLengthUTF8(encoded, true); if (size > available) { - ChatUtils.errorRaw("Could not copy to clipboard: Out of memory."); + MessageBuilder.error("Could not copy to clipboard: Out of memory.").send(); } else { GLFW.glfwSetClipboardString(mc.getWindow().getHandle(), encoded); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java index 3a7af0fe64..9da04675a3 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java @@ -27,7 +27,7 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.Velocity; import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientCommonNetworkHandler; import net.minecraft.client.network.ClientConnectionState; @@ -150,7 +150,7 @@ private void onSendChatMessage(String message, CallbackInfo ci, @Local(argsOnly try { Commands.dispatch(message.substring(Config.get().prefix.get().length())); } catch (CommandSyntaxException e) { - ChatUtils.errorRaw(e.getMessage()); + MessageBuilder.error(e.getMessage()).send(); } client.inGameHud.getChatHud().addToMessageHistory(message); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index ac4f510c41..72e280f63d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -23,7 +23,6 @@ import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.text.MeteorClickEvent; import meteordevelopment.meteorclient.utils.misc.text.TextVisitor; -import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.gl.RenderPipelines; import net.minecraft.client.gui.DrawContext; @@ -296,7 +295,7 @@ private void onMessageSend(SendMessageEvent event) { MutableText sendButton = getSendButton(message); warningMessage.append(sendButton); - ChatUtils.sendMsg(warningMessage); + this.info(warningMessage).send(); event.cancel(); return; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java index 058604173a..459ce8682c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java @@ -18,7 +18,7 @@ import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity; -import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.network.PlayerListEntry; @@ -32,7 +32,6 @@ import net.minecraft.network.packet.s2c.play.PlayerRemoveS2CPacket; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; -import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.collection.ArrayListDeque; @@ -40,8 +39,6 @@ import java.util.*; -import static meteordevelopment.meteorclient.utils.player.ChatUtils.formatCoords; - public class Notifier extends Module { private final SettingGroup sgTotemPops = settings.createGroup("totem-pops"); private final SettingGroup sgVisualRange = settings.createGroup("visual-range"); @@ -175,7 +172,7 @@ public class Notifier extends Module { private final Object2IntMap totemPopMap = new Object2IntOpenHashMap<>(); private final Object2IntMap chatIdMap = new Object2IntOpenHashMap<>(); private final Map pearlStartPosMap = new HashMap<>(); - private final ArrayListDeque messageQueue = new ArrayListDeque<>(); + private final ArrayListDeque messageQueue = new ArrayListDeque<>(); private final Random random = new Random(); @@ -190,17 +187,17 @@ private void onEntityAdded(EntityAddedEvent event) { if (!event.entity.getUuid().equals(mc.player.getUuid()) && entities.get().contains(event.entity.getType()) && visualRange.get() && this.event.get() != Event.Despawn) { if (event.entity instanceof PlayerEntity) { if ((!visualRangeIgnoreFriends.get() || !Friends.get().isFriend(((PlayerEntity) event.entity))) && (!visualRangeIgnoreFakes.get() || !(event.entity instanceof FakePlayerEntity))) { - ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, this.getTranslationKey() + ".info.entered_visual_range", event.entity.getName().getString()); + this.info("entered_visual_range", event.entity).setId(event.entity.getId() + 100).send(); if (visualMakeSound.get()) mc.world.playSoundFromEntity(mc.player, mc.player, SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.AMBIENT, 3.0F, 1.0F); } } else { - info( + this.info( "spawned", - Text.literal(event.entity.getType().getName().getString()).formatted(Formatting.WHITE), - formatCoords(event.entity.getEntityPos()) - ); + MessageBuilder.highlight(event.entity.getType()), + event.entity.getEntityPos() + ).send(); } } @@ -214,17 +211,17 @@ private void onEntityRemoved(EntityRemovedEvent event) { if (!event.entity.getUuid().equals(mc.player.getUuid()) && entities.get().contains(event.entity.getType()) && visualRange.get() && this.event.get() != Event.Spawn) { if (event.entity instanceof PlayerEntity) { if ((!visualRangeIgnoreFriends.get() || !Friends.get().isFriend(((PlayerEntity) event.entity))) && (!visualRangeIgnoreFakes.get() || !(event.entity instanceof FakePlayerEntity))) { - ChatUtils.sendMsg(event.entity.getId() + 100, Formatting.GRAY, this.getTranslationKey() + ".info.left_visual_range", event.entity.getName().getString()); + this.info("left_visual_range", event.entity).setId(event.entity.getId() + 100).send(); if (visualMakeSound.get()) mc.world.playSoundFromEntity(mc.player, mc.player, SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.AMBIENT, 3.0F, 1.0F); } } else { - info( + this.info( "despawned", - Text.literal(event.entity.getType().getName().getString()).formatted(Formatting.WHITE), - formatCoords(event.entity.getEntityPos()) - ); + MessageBuilder.highlight(event.entity.getType()), + event.entity.getEntityPos() + ).send(); } } @@ -236,13 +233,13 @@ private void onEntityRemoved(EntityRemovedEvent event) { if (pearl.getOwner() != null && pearl.getOwner() instanceof PlayerEntity p) { double d = pearlStartPosMap.get(i).distanceTo(e.getEntityPos()); if ((!Friends.get().isFriend(p) || !pearlIgnoreFriends.get()) && (!p.equals(mc.player) || !pearlIgnoreOwn.get())) { - info( + this.info( "pearl_landed", - Text.literal(pearl.getOwner().getName().getString()).formatted(Formatting.WHITE), - ChatUtils.formatCoords(pearl.getEntityPos()), - String.format("%.1f", pearl.distanceTo(mc.player)), - String.format("%.1f", d) - ); + MessageBuilder.highlight(pearl.getOwner()), + pearl.getEntityPos(), + pearl.distanceTo(mc.player), + d + ).send(); } } pearlStartPosMap.remove(i); @@ -308,7 +305,11 @@ private void onReceivePacket(PacketEvent.Receive event) { double distance = PlayerUtils.distanceTo(entity); if (totemsDistanceCheck.get() && distance > totemsDistance.get()) return; - ChatUtils.sendMsgRaw(getChatId(entity), Formatting.GRAY, "(highlight)%s (default)popped (highlight)%d (default)%s.", entity.getName().getString(), pops, pops == 1 ? "totem" : "totems"); + if (pops == 1) { + this.info("popped_singular", MessageBuilder.highlight(entity)).setId(getChatId(entity)).send(); + } else { + this.info("popped_multiple", MessageBuilder.highlight(entity), MessageBuilder.highlight(pops)).setId(getChatId(entity)).send(); + } } } default -> {} @@ -322,9 +323,9 @@ private void onTick(TickEvent.Post event) { while (timer >= notificationDelay.get() && !messageQueue.isEmpty()) { timer = 0; if (simpleNotifications.get()) { - mc.player.sendMessage(messageQueue.removeFirst(), false); + mc.player.sendMessage(messageQueue.removeFirst().build(), false); // todo maybe remove client prefix? } else { - ChatUtils.sendMsg(messageQueue.removeFirst()); + messageQueue.removeFirst().send(); } } } @@ -337,7 +338,12 @@ private void onTick(TickEvent.Post event) { if (player.deathTime > 0 || player.getHealth() <= 0) { int pops = totemPopMap.removeInt(player.getUuid()); - ChatUtils.sendMsgRaw(getChatId(player), Formatting.GRAY, "(highlight)%s (default)died after popping (highlight)%d (default)%s.", player.getName().getString(), pops, pops == 1 ? "totem" : "totems"); + if (pops == 1) { + this.info("died_after_popping_singular", MessageBuilder.highlight(player)).setId(getChatId(player)).send(); + } else { + this.info("died_after_popping_multiple", MessageBuilder.highlight(player), MessageBuilder.highlight(pops)).setId(getChatId(player)).send(); + } + chatIdMap.removeInt(player.getUuid()); } } @@ -353,18 +359,13 @@ private void createJoinNotifications(PlayerListS2CPacket packet) { if (entry.profile() == null) continue; if (simpleNotifications.get()) { - messageQueue.addLast(Text.literal( - Formatting.GRAY + "[" - + Formatting.GREEN + "+" - + Formatting.GRAY + "] " - + entry.profile().name() - )); + messageQueue.addLast(this.info( + "[%s] %s", + Text.literal("+").formatted(Formatting.GREEN), + MessageBuilder.highlight(entry.profile().name()) + ).removePrefix()); } else { - messageQueue.addLast(Text.literal( - Formatting.WHITE - + entry.profile().name() - + Formatting.GRAY + " joined." - )); + messageQueue.addLast(this.info("joined", MessageBuilder.highlight(entry.profile().name()))); } } } @@ -377,18 +378,13 @@ private void createLeaveNotification(PlayerRemoveS2CPacket packet) { if (toRemove == null) continue; if (simpleNotifications.get()) { - messageQueue.addLast(Text.literal( - Formatting.GRAY + "[" - + Formatting.RED + "-" - + Formatting.GRAY + "] " - + toRemove.getProfile().name() - )); + messageQueue.addLast(this.info( + "[%s] %s", + Text.literal("-").formatted(Formatting.GREEN), + MessageBuilder.highlight(toRemove.getProfile().name()) + ).removePrefix()); } else { - messageQueue.addLast(Text.literal( - Formatting.WHITE - + toRemove.getProfile().name() - + Formatting.GRAY + " left." - )); + messageQueue.addLast(this.info("left", MessageBuilder.highlight(toRemove.getProfile().name()))); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmConnection.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmConnection.java index 75e78ca881..a4795dcd79 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmConnection.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmConnection.java @@ -5,7 +5,8 @@ package meteordevelopment.meteorclient.systems.modules.misc.swarm; -import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import java.io.DataOutputStream; import java.io.IOException; @@ -22,7 +23,7 @@ public SwarmConnection(Socket socket) { @Override public void run() { - ChatUtils.infoPrefixRaw("module.swarm", "New worker connected on %s.", getIp(socket.getInetAddress().getHostAddress())); + MessageBuilder.info("New worker connected on %s.", getIp(socket.getInetAddress().getHostAddress())).prefix(MeteorClient.translatable("module.swarm")).send(); try { DataOutputStream out = new DataOutputStream(socket.getOutputStream()); @@ -33,7 +34,7 @@ public void run() { out.writeUTF(messageToSend); out.flush(); } catch (Exception e) { - ChatUtils.errorPrefixRaw("module.swarm", "Encountered error when sending command."); + MessageBuilder.error("Encountered error when sending command.").prefix(MeteorClient.translatable("module.swarm")).send(); e.printStackTrace(); } @@ -43,7 +44,7 @@ public void run() { out.close(); } catch (IOException e) { - ChatUtils.infoPrefixRaw("module.swarm", "Error creating a connection with %s on port %s.", getIp(socket.getInetAddress().getHostAddress()), socket.getPort()); + MessageBuilder.info("Error creating a connection with %s on port %s.", getIp(socket.getInetAddress().getHostAddress()), socket.getPort()).prefix(MeteorClient.translatable("module.swarm")).send(); e.printStackTrace(); } } @@ -55,7 +56,7 @@ public void disconnect() { e.printStackTrace(); } - ChatUtils.infoPrefixRaw("module.swarm", "Worker disconnected on ip: %s.", socket.getInetAddress().getHostAddress()); + MessageBuilder.info("Worker disconnected on ip: %s.", socket.getInetAddress().getHostAddress()).prefix(MeteorClient.translatable("module.swarm")).send(); interrupt(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmHost.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmHost.java index 89fe3a17f5..1e25259758 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmHost.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmHost.java @@ -5,8 +5,9 @@ package meteordevelopment.meteorclient.systems.modules.misc.swarm; +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import meteordevelopment.meteorclient.utils.network.MeteorExecutor; -import meteordevelopment.meteorclient.utils.player.ChatUtils; import java.io.IOException; import java.net.ServerSocket; @@ -21,7 +22,7 @@ public SwarmHost(int port) { socket = new ServerSocket(port); } catch (IOException e) { socket = null; - ChatUtils.errorPrefixRaw("module.swarm", "Couldn't start a server on port %s.", port); + MessageBuilder.error("Couldn't start a server on port %s.", port).prefix(MeteorClient.translatable("module.swarm")).send(); e.printStackTrace(); } @@ -30,14 +31,14 @@ public SwarmHost(int port) { @Override public void run() { - ChatUtils.infoPrefixRaw("module.swarm", "Listening for incoming connections on port %s.", socket.getLocalPort()); + MessageBuilder.info("Listening for incoming connections on port %s.", socket.getLocalPort()).prefix(MeteorClient.translatable("module.swarm")).send(); while (!isInterrupted()) { try { Socket connection = socket.accept(); assignConnectionToSubServer(connection); } catch (IOException e) { - ChatUtils.errorPrefixRaw("module.swarm", "Error making a connection to worker."); + MessageBuilder.error("Error making a connection to worker.").prefix(MeteorClient.translatable("module.swarm")).send(); e.printStackTrace(); } } @@ -63,7 +64,7 @@ public void disconnect() { e.printStackTrace(); } - ChatUtils.infoPrefixRaw("module.swarm", "Server closed on port %s.", socket.getLocalPort()); + MessageBuilder.info("Server closed on port %s.", socket.getLocalPort()).prefix(MeteorClient.translatable("module.swarm")).send(); interrupt(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java index 249750cb07..9ec035b5b4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/SwarmWorker.java @@ -5,9 +5,10 @@ package meteordevelopment.meteorclient.systems.modules.misc.swarm; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Commands; import meteordevelopment.meteorclient.pathing.PathManagers; -import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import net.minecraft.block.Block; import java.io.DataInputStream; @@ -23,7 +24,7 @@ public SwarmWorker(String ip, int port) { socket = new Socket(ip, port); } catch (Exception e) { socket = null; - ChatUtils.warningPrefixRaw("module.swarm", "Server not found at %s on port %s.", ip, port); + MessageBuilder.warning("Server not found at %s on port %s.", ip, port).prefix(MeteorClient.translatable("module.swarm")).send(); e.printStackTrace(); } @@ -32,7 +33,7 @@ public SwarmWorker(String ip, int port) { @Override public void run() { - ChatUtils.infoPrefixRaw("module.swarm", "Connected to Swarm host on at %s on port %s.", getIp(socket.getInetAddress().getHostAddress()), socket.getPort()); + MessageBuilder.info("Connected to Swarm host on at %s on port %s.", getIp(socket.getInetAddress().getHostAddress()), socket.getPort()).prefix(MeteorClient.translatable("module.swarm")).send(); try { DataInputStream in = new DataInputStream(socket.getInputStream()); @@ -42,12 +43,12 @@ public void run() { String read = in.readUTF(); if (read.startsWith("swarm")) { - ChatUtils.infoPrefixRaw("module.swarm", "Received command: (highlight)%s", read); + MessageBuilder.info("Received command: %s", MessageBuilder.highlight(read)).prefix(MeteorClient.translatable("module.swarm")).send(); try { Commands.dispatch(read); } catch (Exception e) { - ChatUtils.errorPrefixRaw("module.swarm", "Error fetching command."); + MessageBuilder.error("Error fetching command.").prefix(MeteorClient.translatable("module.swarm")).send(); e.printStackTrace(); } } @@ -55,7 +56,7 @@ public void run() { in.close(); } catch (IOException e) { - ChatUtils.errorPrefixRaw("module.swarm", "Error in connection to host."); + MessageBuilder.error("Error in connection to host.").prefix(MeteorClient.translatable("module.swarm")).send(); e.printStackTrace(); disconnect(); } @@ -70,7 +71,7 @@ public void disconnect() { PathManagers.get().stop(); - ChatUtils.infoPrefixRaw("module.swarm", "Disconnected from host."); + MessageBuilder.info("Disconnected from host.").prefix(MeteorClient.translatable("module.swarm")).send(); interrupt(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java index 075cb0e1a9..4f00004e4b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java @@ -30,8 +30,6 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.DeathScreen; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import org.joml.Vector3d; @@ -41,8 +39,6 @@ import java.util.Date; import java.util.List; -import static meteordevelopment.meteorclient.utils.player.ChatUtils.formatCoords; - public class WaypointsModule extends Module { private static final Color GRAY = new Color(200, 200, 200); private static final Color TEXT = new Color(255, 255, 255); @@ -171,7 +167,7 @@ private void onOpenScreen(OpenScreenEvent event) { public void addDeath(Vec3d deathPos) { String time = dateFormat.format(new Date()); if (dpChat.get()) { - info("death", formatCoords(deathPos), time); + info("death", deathPos, time); } // Create waypoint From 9e6b62025abb2fe1920f710f3735c8252f71c5d6 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Mon, 16 Mar 2026 15:06:39 -0400 Subject: [PATCH 67/72] move thing around --- .../meteorclient/commands/Command.java | 9 +++---- .../meteorclient/systems/modules/Module.java | 9 +++---- .../systems/modules/misc/Notifier.java | 4 +-- .../systems/modules/world/HighwayBuilder.java | 25 +++++++++---------- .../systems/modules/world/StashFinder.java | 2 +- .../utils/misc/MeteorStarscript.java | 14 +++++------ .../utils/misc/text/MessageBuilder.java | 23 +++++++++++++++++ .../utils/misc/text/MessageBuilderImpl.java | 7 ++++++ 8 files changed, 58 insertions(+), 35 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/Command.java b/src/main/java/meteordevelopment/meteorclient/commands/Command.java index f49260cb26..d28f3f896f 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/Command.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/Command.java @@ -88,18 +88,15 @@ public MessageBuilder info(Text message) { } public MessageBuilder info(String message, Object... args) { - return MessageBuilder.create().setSource(this).setTranslationContext(this.translationKey) - .body(message, args).setKind(MessageKind.Info); + return MessageBuilder.info(message, args).setSource(this).setTranslationContext(this.translationKey); } public MessageBuilder warning(String message, Object... args) { - return MessageBuilder.create().setSource(this).setTranslationContext(this.translationKey) - .body(message, args).setKind(MessageKind.Warning); + return MessageBuilder.warning(message, args).setSource(this).setTranslationContext(this.translationKey); } public MessageBuilder error(String message, Object... args) { - return MessageBuilder.create().setSource(this).setTranslationContext(this.translationKey) - .body(message, args).setKind(MessageKind.Error); + return MessageBuilder.error(message, args).setSource(this).setTranslationContext(this.translationKey); } public MutableText translatable(String string, Object... args) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java index 58701f5916..f03b5c5e08 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java @@ -135,18 +135,15 @@ public MessageBuilder info(Text message) { } public MessageBuilder info(String message, Object... args) { - return MessageBuilder.create().setSource(this).setTranslationContext(this.getTranslationKey()) - .body(message, args).setKind(MessageKind.Info); + return MessageBuilder.info(message, args).setSource(this).setTranslationContext(this.getTranslationKey()); } public MessageBuilder warning(String message, Object... args) { - return MessageBuilder.create().setSource(this).setTranslationContext(this.getTranslationKey()) - .body(message, args).setKind(MessageKind.Warning); + return MessageBuilder.warning(message, args).setSource(this).setTranslationContext(this.getTranslationKey()); } public MessageBuilder error(String message, Object... args) { - return MessageBuilder.create().setSource(this).setTranslationContext(this.getTranslationKey()) - .body(message, args).setKind(MessageKind.Error); + return MessageBuilder.error(message, args).setSource(this).setTranslationContext(this.getTranslationKey()); } public boolean isActive() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java index 459ce8682c..78cf7ea516 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java @@ -363,7 +363,7 @@ private void createJoinNotifications(PlayerListS2CPacket packet) { "[%s] %s", Text.literal("+").formatted(Formatting.GREEN), MessageBuilder.highlight(entry.profile().name()) - ).removePrefix()); + ).withoutPrefix()); } else { messageQueue.addLast(this.info("joined", MessageBuilder.highlight(entry.profile().name()))); } @@ -382,7 +382,7 @@ private void createLeaveNotification(PlayerRemoveS2CPacket packet) { "[%s] %s", Text.literal("-").formatted(Formatting.GREEN), MessageBuilder.highlight(toRemove.getProfile().name()) - ).removePrefix()); + ).withoutPrefix()); } else { messageQueue.addLast(this.info("left", MessageBuilder.highlight(toRemove.getProfile().name()))); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java index fcf11bc3d1..e2b6481b85 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java @@ -476,9 +476,8 @@ public void onDeactivate() { } } - @Override - public void error(String message, Object... args) { - super.error(message, args); + private void errorLate(String message, Object... args) { + super.error(message, args).send(); toggle(); if (disconnectOnToggle.get()) { @@ -487,7 +486,7 @@ public void error(String message, Object... args) { } private void errorEarly(String message, Object... args) { - super.error(message, args); + super.error(message, args).send(); displayInfo = false; toggle(); @@ -1170,7 +1169,7 @@ else if (b.lastState == ThrowOutTrash) { } if (emptySlots == 0) { - b.error("No empty slots."); + b.errorLate("No empty slots."); return; } @@ -1255,7 +1254,7 @@ protected void tick(HighwayBuilder b) { // Mine ender chest int slot = findAndMoveBestToolToHotbar(b, blockState, true); if (slot == -1) { - b.error("Cannot find pickaxe without silk touch to mine ender chests."); + b.errorLate("Cannot find pickaxe without silk touch to mine ender chests."); return; } @@ -1398,7 +1397,7 @@ else if (b.lastState == Center) { if (restockOccurred) { b.setState(ThrowOutTrash, Forward); - } else b.error("Unable to perform restock for '" + b.restockTask.item() + "'."); + } else b.errorLate("Unable to perform restock for '" + b.restockTask.item() + "'."); return; } @@ -1409,7 +1408,7 @@ else if (b.lastState == Center) { } if (restockSlots <= 0) { - b.error("No empty slots for restocking items."); + b.errorLate("No empty slots for restocking items."); return; } @@ -1433,7 +1432,7 @@ else if (b.lastState == Center) { protected void tick(HighwayBuilder b) { // this should only tick if there's a valid slot we can restock from if (slot == -1) { - b.error("Invalid restocking action."); + b.errorLate("Invalid restocking action."); return; } @@ -1566,7 +1565,7 @@ protected void tick(HighwayBuilder b) { // the only valid blocks should be air, a shulker box, or an ender chest // if there is another type of block, assume something has gone wrong and error out (e.g. lava flowed in) - default -> b.error("Invalid block at container restocking position?"); + default -> b.errorLate("Invalid block at container restocking position?"); } } @@ -1999,7 +1998,7 @@ protected int findHotbarSlot(HighwayBuilder b, boolean replaceTools) { if (slotsWithBlocks > 0) return slotWithLeastBlocks; // No space found in hotbar - b.error("No empty space in hotbar."); + b.errorLate("No empty space in hotbar."); return -1; } @@ -2076,7 +2075,7 @@ protected int findAndMoveBestToolToHotbar(HighwayBuilder b, BlockState blockStat b.restockTask.setPickaxes(); } else { - b.error("Found less than the minimum amount of pickaxes required: " + count + "/" + (b.savePickaxes.get() + 1)); + b.errorLate("Found less than the minimum amount of pickaxes required: " + count + "/" + (b.savePickaxes.get() + 1)); } return -1; @@ -2111,7 +2110,7 @@ else if (b.searchEnderChest.get() || b.searchShulkers.get()) { b.restockTask.setMaterials(); } else { - b.error("Out of blocks to place."); + b.errorLate("Out of blocks to place."); } return -1; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java index 3bc9693430..55f14215b4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/StashFinder.java @@ -410,7 +410,7 @@ private void sendChatNotification(Chunk chunk) { .append(Text.literal("]").formatted(Formatting.GRAY)) .append(Text.literal(".").formatted(Formatting.GRAY)); - ChatUtils.sendMsg(message); + this.info(message).send(); } @EventHandler diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java index d521f11698..c49c30eac5 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorStarscript.java @@ -18,7 +18,7 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.utils.PreInit; import meteordevelopment.meteorclient.utils.Utils; -import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.meteorclient.utils.world.Dimension; import meteordevelopment.meteorclient.utils.world.TickRate; @@ -243,12 +243,12 @@ public static void printChatError(int i, Error error) { String caller = getCallerName(); if (caller != null) { - if (i != -1) ChatUtils.errorPrefixRaw("starscript.title", "%d, %d '%c': %s (from %s)", i, error.character, error.ch, error.message, caller); - else ChatUtils.errorPrefixRaw("starscript.title", "%d '%c': %s (from %s)", error.character, error.ch, error.message, caller); + if (i != 1) MessageBuilder.error("%d, %d '%c': %s (from %s)", i, error.character, error.ch, error.message, caller).prefix("starscript.title").send(); + else MessageBuilder.error("%d '%c': %s (from %s)", error.character, error.ch, error.message, caller).prefix("starscript.title").send(); } else { - if (i != -1) ChatUtils.errorPrefixRaw("starscript.title", "%d, %d '%c': %s", i, error.character, error.ch, error.message); - else ChatUtils.errorPrefixRaw("starscript.title", "%d '%c': %s", error.character, error.ch, error.message); + if (i != 1) MessageBuilder.error("%d, %d '%c': %s", i, error.character, error.ch, error.message).prefix("starscript.title").send(); + else MessageBuilder.error("%d '%c': %s", error.character, error.ch, error.message).prefix("starscript.title").send(); } } @@ -259,8 +259,8 @@ public static void printChatError(Error error) { public static void printChatError(StarscriptError e) { String caller = getCallerName(); - if (caller != null) ChatUtils.errorPrefixRaw("starscript.title", "%s (from %s)", e.getMessage(), caller); - else ChatUtils.errorPrefixRaw("starscript.title", "%s", e.getMessage()); + if (caller != null) MessageBuilder.error("%s (from %s)", e.getMessage(), caller).prefix("starscript.title").send(); + else MessageBuilder.error(e.getMessage()).prefix("starscript.title").send(); } private static String getCallerName() { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java index bfaf3e952d..027197682c 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java @@ -11,10 +11,25 @@ import java.util.function.Supplier; public interface MessageBuilder { + /** + * @return A new empty {@link MessageBuilder}. + */ static MessageBuilder create() { return new MessageBuilderImpl(); } + static MessageBuilder info(String body, Object... args) { + return create().setKind(MessageKind.Info).body(body, args); + } + + static MessageBuilder warning(String body, Object... args) { + return create().setKind(MessageKind.Warning).body(body, args); + } + + static MessageBuilder error(String body, Object... args) { + return create().setKind(MessageKind.Error).body(body, args); + } + static Text highlight(Object argument) { return MessageBuilderImpl.highlight(argument); } @@ -81,6 +96,14 @@ static Text highlight(Object argument) { */ MessageBuilder prefix(String prefix, Formatting prefixColor); + /** + * Removes the prefix that would be shown in front of the message. + * + * @return this builder + * @throws IllegalStateException if this builder is already closed. + */ + MessageBuilder withoutPrefix(); + /** * Sets the message body. * diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java index 4c8a68632f..1d5e02c997 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java @@ -94,6 +94,13 @@ public MessageBuilder prefix(String prefix, Formatting prefixColor) { return this; } + @Override + public MessageBuilder withoutPrefix() { + assertOpen(); + this.messagePrefix = null; + return this; + } + @Override public MessageBuilder body(Text body) { assertOpen(); From f75c50dd4eaa4ee7c3deba79d4b2e218a94f8b7e Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Mon, 16 Mar 2026 15:42:50 -0400 Subject: [PATCH 68/72] polish --- .../meteorclient/commands/Command.java | 8 ++--- .../themes/meteor/MeteorMessageFormatter.java | 8 ++--- .../meteorclient/systems/modules/Module.java | 8 ++--- .../utils/misc/text/MessageBuilder.java | 12 ++----- .../utils/misc/text/MessageBuilderImpl.java | 33 ++++++++++++++----- .../assets/meteor-client/language/en_us.json | 2 ++ 6 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/Command.java b/src/main/java/meteordevelopment/meteorclient/commands/Command.java index d28f3f896f..74a29abc67 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/Command.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/Command.java @@ -83,20 +83,20 @@ public String toString(String... args) { } public MessageBuilder info(Text message) { - return MessageBuilder.create().setSource(this).setTranslationContext(this.translationKey) + return MessageBuilder.create().setSource(this).setTranslationContext(this.translationKey).prefix(this) .body(message).setKind(MessageKind.Info); } public MessageBuilder info(String message, Object... args) { - return MessageBuilder.info(message, args).setSource(this).setTranslationContext(this.translationKey); + return MessageBuilder.info(message, args).setSource(this).setTranslationContext(this.translationKey).prefix(this); } public MessageBuilder warning(String message, Object... args) { - return MessageBuilder.warning(message, args).setSource(this).setTranslationContext(this.translationKey); + return MessageBuilder.warning(message, args).setSource(this).setTranslationContext(this.translationKey).prefix(this); } public MessageBuilder error(String message, Object... args) { - return MessageBuilder.error(message, args).setSource(this).setTranslationContext(this.translationKey); + return MessageBuilder.error(message, args).setSource(this).setTranslationContext(this.translationKey).prefix(this); } public MutableText translatable(String string, Object... args) { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorMessageFormatter.java b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorMessageFormatter.java index e79e47e28a..6ed71379dc 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorMessageFormatter.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorMessageFormatter.java @@ -79,16 +79,16 @@ public Text formatDecimal(double decimal) { public Text formatPrefix(Text prefix) { return Text.empty().formatted(Formatting.GRAY) .append("[") - .append(prefix) + .append(Text.empty().append(prefix).formatted(Formatting.LIGHT_PURPLE)) .append("] "); } @Override public Text formatToggleFeedback(Text clientPrefix, Text featurePrefix, Module module, boolean enabled) { Text feedback = MeteorClient.translatable( - "module.base.toggled", - module.getTitleText(), - enabled ? Text.literal("on").formatted(Formatting.GREEN) : Text.literal("off").formatted(Formatting.RED) + "module.base.toggled", module, + enabled ? MeteorClient.translatable("module.base.toggled.on").formatted(Formatting.GREEN) + : MeteorClient.translatable("module.base.toggled.off").formatted(Formatting.RED) ); return this.formatMessage(clientPrefix, Optional.of(featurePrefix), feedback, MessageKind.Passthrough); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java index f03b5c5e08..50c0cad5b9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Module.java @@ -130,20 +130,20 @@ public void sendToggledMsg() { } public MessageBuilder info(Text message) { - return MessageBuilder.create().setSource(this).setTranslationContext(this.getTranslationKey()) + return MessageBuilder.create().setSource(this).setTranslationContext(this.getTranslationKey()).prefix(this) .body(message).setKind(MessageKind.Info); } public MessageBuilder info(String message, Object... args) { - return MessageBuilder.info(message, args).setSource(this).setTranslationContext(this.getTranslationKey()); + return MessageBuilder.info(message, args).setSource(this).setTranslationContext(this.getTranslationKey()).prefix(this); } public MessageBuilder warning(String message, Object... args) { - return MessageBuilder.warning(message, args).setSource(this).setTranslationContext(this.getTranslationKey()); + return MessageBuilder.warning(message, args).setSource(this).setTranslationContext(this.getTranslationKey()).prefix(this); } public MessageBuilder error(String message, Object... args) { - return MessageBuilder.error(message, args).setSource(this).setTranslationContext(this.getTranslationKey()); + return MessageBuilder.error(message, args).setSource(this).setTranslationContext(this.getTranslationKey()).prefix(this); } public boolean isActive() { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java index 027197682c..3af685863c 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilder.java @@ -69,23 +69,15 @@ static Text highlight(Object argument) { */ MessageBuilder setSource(Object source); - /** - * Sets the prefix to show in front of the message. This can optionally be styled, but should not contain any - * decorations such as brackets as those will be added by the formatter. - * - * @return this builder - * @throws IllegalStateException if this builder is already closed. - */ - MessageBuilder prefix(Text prefix); - /** * Sets the prefix to show in front of the message. This should not contain any decorations such as brackets as * those will be added by the formatter. + * todo explain formatting * * @return this builder * @throws IllegalStateException if this builder is already closed. */ - MessageBuilder prefix(String prefix); + MessageBuilder prefix(Object source); /** * Sets the prefix to show in front of the message. This should not contain any decorations such as brackets as diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java index 1d5e02c997..3e83868785 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageBuilderImpl.java @@ -5,10 +5,12 @@ package meteordevelopment.meteorclient.utils.misc.text; +import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.GuiThemes; import meteordevelopment.meteorclient.gui.MessageFormatter; import meteordevelopment.meteorclient.systems.config.Config; +import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; import meteordevelopment.meteorclient.utils.player.ChatUtils; import net.minecraft.block.Block; @@ -74,16 +76,15 @@ public MessageBuilder setSource(Object source) { } @Override - public MessageBuilder prefix(Text prefix) { + public MessageBuilder prefix(Object source) { assertOpen(); - this.messagePrefix = prefix; - return this; - } - - @Override - public MessageBuilder prefix(String prefix) { - assertOpen(); - this.messagePrefix = Text.literal(prefix); + this.messagePrefix = switch (source) { + case Module m -> m.getTitleText(); + case Command c -> c.getTitle(); + case Text t -> t; + case String s -> createPrefix(s); + default -> Text.literal(String.valueOf(source)); + }; return this; } @@ -172,6 +173,10 @@ private static Text processArg(MessageFormatter formatter, Object arg) { case Float f -> formatter.formatDecimal(f); case Double d -> formatter.formatDecimal(d); + // accept meteor constructs as parameters + case Module m -> m.getTitleText(); + case Command c -> c.getTitle(); + // accept common objects as parameters case StatusEffect statusEffect -> stripStyle(statusEffect.getName()); case Item item -> stripStyle(item.getName()); @@ -216,6 +221,16 @@ private MutableText createMessageBody(String messageBody, MessageKind kind) { } } + private MutableText createPrefix(String prefix) { + MeteorTranslations.MeteorLanguage language = MeteorTranslations.getCurrentLanguage(); + + if (language.hasTranslation(prefix)) { + return MutableText.of(new MeteorTranslatableTextContent(prefix)); + } else { + return Text.literal(prefix); + } + } + private void assertOpen() { if (this.closed) { throw new IllegalStateException("Cannot use MessageBuilder after building message."); diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index 8c987ee54e..a396b446f7 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -836,6 +836,8 @@ "module.base.paste-config": "Paste config", "module.base.from": "From: ", "module.base.toggled": "Toggled %1$s %2$s.", + "module.base.toggled.on": "on", + "module.base.toggled.off": "off", "module.air-jump": "Air Jump", "module.air-jump.description": "Lets you jump in the air.", From 03b3665d16914c5db294e5516e4cfc79f3bef885 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Mon, 16 Mar 2026 17:55:29 -0400 Subject: [PATCH 69/72] big ol module changes yippee --- .../commands/commands/SettingCommand.java | 42 ++++++- .../gui/widgets/input/WBlockPosEdit.java | 6 +- .../meteorclient/systems/modules/Modules.java | 5 +- .../systems/modules/combat/AutoLog.java | 24 ++-- .../systems/modules/combat/Burrow.java | 10 +- .../systems/modules/combat/Surround.java | 2 +- .../systems/modules/misc/BookBot.java | 9 +- .../systems/modules/misc/Notebot.java | 65 +++++------ .../systems/modules/movement/AutoWalk.java | 2 +- .../systems/modules/movement/AutoWasp.java | 6 +- .../systems/modules/movement/LongJump.java | 6 +- .../systems/modules/player/AutoMend.java | 2 +- .../systems/modules/player/ChestSwap.java | 3 +- .../modules/player/MiddleClickExtra.java | 7 +- .../systems/modules/render/Freecam.java | 6 +- .../modules/render/WaypointsModule.java | 2 +- .../systems/modules/world/Excavator.java | 4 +- .../systems/modules/world/HighwayBuilder.java | 54 ++++----- .../systems/modules/world/InfinityMiner.java | 16 +-- .../systems/modules/world/Nuker.java | 6 +- .../assets/meteor-client/language/en_us.json | 103 +++++++++++++++++- 21 files changed, 260 insertions(+), 120 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java index 04fca1e192..ea92be4cc2 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.commands.commands; import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.commands.arguments.ModuleArgumentType; import meteordevelopment.meteorclient.commands.arguments.SettingArgumentType; @@ -16,9 +17,13 @@ import meteordevelopment.meteorclient.gui.tabs.Tabs; import meteordevelopment.meteorclient.gui.tabs.builtin.HudTab; import meteordevelopment.meteorclient.settings.Setting; +import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.meteorclient.settings.Settings; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import net.minecraft.command.CommandSource; +import org.jetbrains.annotations.Nullable; public class SettingCommand extends Command { public SettingCommand() { @@ -60,8 +65,18 @@ public void build(LiteralArgumentBuilder builder) { .executes(context -> { // Get setting value Setting setting = SettingArgumentType.get(context); + Module module = ModuleArgumentType.get(context); + Settings settings = module.settings; + SettingGroup settingGroup = findSettingGroup(settings, setting); - ModuleArgumentType.get(context).info("Setting (highlight)%s(default) is (highlight)%s(default).", setting.title, setting.get()); + if (settingGroup == null) { + throw new IllegalStateException(String.format("Cannot find setting '%s' in module '%s'.", setting.name, module.name)); + } + + String key = module.settings.baseTranslationKey + "." + settingGroup.translationKey + "." + setting.name; + + this.info("command.settings.info.get", MessageBuilder.highlight(MeteorClient.translatable(key)), MessageBuilder.highlight(setting.get())) + .prefix(module).setSource(module).send(); return SINGLE_SUCCESS; }) @@ -73,7 +88,18 @@ public void build(LiteralArgumentBuilder builder) { String value = SettingValueArgumentType.get(context); if (setting.parse(value)) { - ModuleArgumentType.get(context).info("Setting (highlight)%s(default) changed to (highlight)%s(default).", setting.title, value); + Module module = ModuleArgumentType.get(context); + Settings settings = module.settings; + SettingGroup settingGroup = findSettingGroup(settings, setting); + + if (settingGroup == null) { + throw new IllegalStateException(String.format("Cannot find setting '%s' in module '%s'.", setting.name, module.name)); + } + + String key = module.settings.baseTranslationKey + "." + settingGroup.translationKey + "." + setting.name; + + this.info("command.settings.info.set", MessageBuilder.highlight(MeteorClient.translatable(key)), MessageBuilder.highlight(setting.get())) + .prefix(module).setSource(module).send(); } return SINGLE_SUCCESS; @@ -82,4 +108,16 @@ public void build(LiteralArgumentBuilder builder) { ) ); } + + private static @Nullable SettingGroup findSettingGroup(Settings settings, Setting setting) { + for (SettingGroup sg : settings) { + for (Setting aSetting : sg) { + if (aSetting == setting) { + return sg; + } + } + } + + return null; + } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WBlockPosEdit.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WBlockPosEdit.java index ca1917fdd1..af8638615a 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WBlockPosEdit.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WBlockPosEdit.java @@ -10,9 +10,8 @@ import meteordevelopment.meteorclient.events.entity.player.StartBreakingBlockEvent; import meteordevelopment.meteorclient.gui.widgets.containers.WHorizontalList; import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.marker.Marker; import meteordevelopment.meteorclient.utils.Utils; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.gui.screen.Screen; import net.minecraft.util.hit.HitResult; @@ -44,8 +43,7 @@ public void init() { if (Utils.canUpdate()) { WButton click = add(theme.button("Click")).expandX().widget(); click.action = () -> { - String sb = "Click!\nRight click to pick a new position.\nLeft click to cancel."; - Modules.get().get(Marker.class).info(sb); + MessageBuilder.info("setting.blockpos.click").send(); clicking = true; MeteorClient.EVENT_BUS.subscribe(this); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index c5d7f10f18..a168481b89 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -37,6 +37,7 @@ import meteordevelopment.meteorclient.utils.misc.ValueComparableMap; import meteordevelopment.meteorclient.utils.misc.input.Input; import meteordevelopment.meteorclient.utils.misc.input.KeyAction; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventPriority; import net.minecraft.nbt.NbtCompound; @@ -250,11 +251,11 @@ private boolean onBinding(boolean isKey, int value, int modifiers) { if (moduleToBind.keybind.canBindTo(isKey, value, modifiers)) { moduleToBind.keybind.set(isKey, value, modifiers); - moduleToBind.info("Bound to (highlight)%s(default).", moduleToBind.keybind); + moduleToBind.info("module.base.bound", MessageBuilder.highlight(moduleToBind.keybind)).send(); } else if (value == GLFW.GLFW_KEY_ESCAPE) { moduleToBind.keybind.set(Keybind.none()); - moduleToBind.info("Removed bind."); + moduleToBind.info("module.base.unbound").send(); } else return false; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoLog.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoLog.java index 8914571a50..11bb1db26d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoLog.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoLog.java @@ -153,7 +153,7 @@ private void onReceivePacket(PacketEvent.Receive event) { pops++; if (totemPops.get() > 0 && pops >= totemPops.get()) { - disconnect("Popped " + pops + " totems."); + disconnect(MeteorClient.translatable(this.getTranslationKey() + ".reason.popped", pops)); if (toggleOff.get()) this.toggle(); } } @@ -166,7 +166,7 @@ private void onTick(TickEvent.Post event) { return; } if (playerHealth <= health.get()) { - disconnect("Health was lower than " + health.get() + "."); + disconnect(MeteorClient.translatable(this.getTranslationKey() + ".reason.health", health.get())); if (smartToggle.get()) { if (isActive()) this.toggle(); enableHealthListener(); @@ -175,7 +175,7 @@ private void onTick(TickEvent.Post event) { } if (smart.get() && playerHealth + mc.player.getAbsorptionAmount() - PlayerUtils.possibleHealthReductions() < health.get()) { - disconnect("Health was going to be lower than " + health.get() + "."); + disconnect(MeteorClient.translatable(this.getTranslationKey() + ".reason.health_predict", health.get())); if (toggleOff.get()) this.toggle(); return; } @@ -186,14 +186,14 @@ private void onTick(TickEvent.Post event) { for (Entity entity : mc.world.getEntities()) { if (entity instanceof PlayerEntity player && player.getUuid() != mc.player.getUuid()) { if (onlyTrusted.get() && player != mc.player && !Friends.get().isFriend(player)) { - disconnect(Text.literal("Non-trusted player '" + Formatting.RED + player.getName().getString() + Formatting.WHITE + "' appeared in your render distance.")); + disconnect(MeteorClient.translatable(this.getTranslationKey() + ".reason.non_trusted_player", Text.literal(player.getGameProfile().name()).formatted(Formatting.RED))); if (toggleOff.get()) this.toggle(); return; } if (instantDeath.get() && PlayerUtils.isWithin(entity, 8) && DamageUtils.getAttackDamage(player, mc.player) > playerHealth + mc.player.getAbsorptionAmount()) { - disconnect("Anti-32k measures."); + disconnect(MeteorClient.translatable(this.getTranslationKey() + ".reason.anti_32k")); if (toggleOff.get()) this.toggle(); return; } @@ -217,14 +217,14 @@ private void onTick(TickEvent.Post event) { } if (useTotalCount.get() && totalEntities >= combinedEntityThreshold.get()) { - disconnect("Total number of selected entities within range exceeded the limit."); + disconnect(MeteorClient.translatable(this.getTranslationKey() + ".reason.combined_entity_threshold")); if (toggleOff.get()) this.toggle(); } else if (!useTotalCount.get()) { // Check if the count of each entity type exceeds the specified limit for (Object2IntMap.Entry> entry : entityCounts.object2IntEntrySet()) { if (entry.getIntValue() >= individualEntityThreshold.get()) { - disconnect("Number of " + entry.getKey().getName().getString() + " within range exceeded the limit."); + disconnect(MeteorClient.translatable(this.getTranslationKey() + ".reason.single_entity_threshold", entry.getKey().getName().getString())); if (toggleOff.get()) this.toggle(); return; } @@ -233,17 +233,13 @@ else if (!useTotalCount.get()) { } } - private void disconnect(String reason) { - disconnect(Text.literal(reason)); - } - private void disconnect(Text reason) { - MutableText text = Text.literal("[AutoLog] "); + MutableText text = Text.literal("[").append(this.getTitleText()).append("] "); text.append(reason); AutoReconnect autoReconnect = Modules.get().get(AutoReconnect.class); if (autoReconnect.isActive() && toggleAutoReconnect.get()) { - text.append(Text.literal("\n\nINFO - AutoReconnect was disabled").withColor(Colors.GRAY)); + text.append(Text.literal("\n\n").append(this.getTranslationKey() + ".reason.header").withColor(Colors.GRAY)); autoReconnect.toggle(); } @@ -258,7 +254,7 @@ private void healthListener(TickEvent.Post event) { else if (Utils.canUpdate() && !mc.player.isDead() && mc.player.getHealth() > health.get()) { - info("Player health greater than minimum, re-enabling module."); + info("re-enable").send(); toggle(); disableHealthListener(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Burrow.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Burrow.java index f8367b35f0..a8f26aaa49 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Burrow.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Burrow.java @@ -106,19 +106,19 @@ public Burrow() { @Override public void onActivate() { if (!mc.world.getBlockState(mc.player.getBlockPos()).isReplaceable()) { - error("Already burrowed, disabling."); + error("already_burrowed").send(); toggle(); return; } if (!PlayerUtils.isInHole(false) && onlyInHole.get()) { - error("Not in a hole, disabling."); + error("not_in_hole").send(); toggle(); return; } if (!checkHead()) { - error("Not enough headroom to burrow, disabling."); + error("not_enough_headroom").send(); toggle(); return; } @@ -126,7 +126,7 @@ public void onActivate() { FindItemResult result = getItem(); if (!result.isHotbar() && !result.isOffhand()) { - error("No burrow block found, disabling."); + error("no_burrow_blocks").send(); toggle(); return; } @@ -141,7 +141,7 @@ public void onActivate() { if (instant.get()) shouldBurrow = true; else mc.player.jump(); } else { - info("Waiting for manual jump."); + info("waiting_for_jump").send(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java index a511033975..7c4ad5dc08 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java @@ -388,7 +388,7 @@ private void onPacketReceive(PacketEvent.Receive event) { Entity entity = mc.world.getEntityById(packet.playerId()); if (entity == mc.player && toggleOnDeath.get()) { toggle(); - info("Toggled off because you died."); + info("died").send(); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java index d963c0a1b7..6b9324eb6c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java @@ -16,7 +16,6 @@ import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; -import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; import meteordevelopment.meteorclient.utils.player.FindItemResult; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.orbit.EventHandler; @@ -157,7 +156,7 @@ public WWidget getWidget(GuiTheme theme) { @Override public void onActivate() { if ((file == null || !file.exists()) && mode.get() == Mode.File) { - info("No file selected, please select a file in the GUI."); + info("no_file_selected").send(); toggle(); return; } @@ -212,7 +211,7 @@ private void onTick(TickEvent.Post event) { } else if (mode.get() == Mode.File) { // Ignore if somehow the file got deleted if ((file == null || !file.exists()) && mode.get() == Mode.File) { - info("No file selected, please select a file in the GUI."); + info("no_file_selected").send(); toggle(); return; } @@ -222,7 +221,7 @@ private void onTick(TickEvent.Post event) { error("file_empty", MeteorClient.translatable(this.getTranslationKey() + ".click_to_edit_file").setStyle(Style.EMPTY .withFormatting(Formatting.UNDERLINE, Formatting.RED) .withClickEvent(new ClickEvent.OpenFile(file.getAbsolutePath())) - )); + )).send(); toggle(); return; } @@ -241,7 +240,7 @@ private void onTick(TickEvent.Post event) { // Write the file string to a book writeBook(file.toString().chars().iterator()); } catch (IOException ignored) { - error("Failed to read the file."); + error("failed_to_read_file").send(); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java index bb3b9435d9..604e0b9b2f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java @@ -21,6 +21,7 @@ import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; import meteordevelopment.meteorclient.utils.notebot.NotebotUtils; import meteordevelopment.meteorclient.utils.notebot.decoder.SongDecoder; import meteordevelopment.meteorclient.utils.notebot.decoder.SongDecoders; @@ -390,7 +391,7 @@ private void onTick(TickEvent.Pre event) { waitTicks--; if (waitTicks == 0) { waitTicks = -1; - info("Checking noteblocks again..."); + info("checking").send(); setupTuneHitsMap(); stage = Stage.Tune; @@ -399,14 +400,14 @@ private void onTick(TickEvent.Pre event) { else if (stage == Stage.SetUp) { scanForNoteblocks(); if (scannedNoteblocks.isEmpty()) { - error("Can't find any nearby noteblock!"); + error("cant_find_noteblocks").send(); stop(); return; } setupNoteblocksMap(); if (noteBlockPositions.isEmpty()) { - error("Can't find any valid noteblock to play song."); + error("cant_find_valid_noteblocks").send(); stop(); return; } @@ -428,7 +429,7 @@ else if (stage == Stage.Playing) { if (song.getNotesMap().containsKey(currentTick)) { if (playingMode == PlayingMode.Preview) onTickPreview(); else if (mc.player.getAbilities().creativeMode) { - error("You need to be in survival mode."); + error("not_in_survival_mode").send(); stop(); return; } @@ -507,9 +508,9 @@ private void setupNoteblocksMap() { if (!uniqueNotesToUse.isEmpty()) { for (Note note : uniqueNotesToUse) { - warning("Missing note: "+note.getInstrument()+", "+note.getNoteLevel()); + warning("missing_note", note.getInstrument(), note.getNoteLevel()).send(); } - warning(uniqueNotesToUse.size()+" missing notes!"); + warning("missing_notes", uniqueNotesToUse.size()).send(); } } @@ -540,13 +541,13 @@ public WWidget getWidget(GuiTheme theme) { WTable table = theme.table(); // Open Song GUI - WButton openSongGUI = table.add(theme.button("Open Song GUI")).expandX().minWidth(100).widget(); + WButton openSongGUI = table.add(theme.button(MeteorTranslations.translate(this.getTranslationKey() + ".gui.open_gui"))).expandX().minWidth(100).widget(); openSongGUI.action = () -> mc.setScreen(theme.notebotSongs()); table.row(); // Align Center - WButton alignCenter = table.add(theme.button("Align Center")).expandX().minWidth(100).widget(); + WButton alignCenter = table.add(theme.button(MeteorTranslations.translate(this.getTranslationKey() + ".gui.align_center"))).expandX().minWidth(100).widget(); alignCenter.action = () -> { if (mc.player == null) return; Vec3d pos = Vec3d.ofBottomCenter(mc.player.getBlockPos()); @@ -559,15 +560,15 @@ public WWidget getWidget(GuiTheme theme) { status = table.add(theme.label(getStatus())).expandCellX().widget(); // Pause - WButton pause = table.add(theme.button(isPlaying ? "Pause" : "Resume")).right().widget(); + WButton pause = table.add(theme.button(MeteorTranslations.translate(this.getTranslationKey() + (isPlaying ? ".gui.pause" : ".gui.resume")))).right().widget(); pause.action = () -> { pause(); - pause.set(isPlaying ? "Pause" : "Resume"); + pause.set(MeteorTranslations.translate(this.getTranslationKey() + (isPlaying ? ".gui.pause" : ".gui.resume"))); updateStatus(); }; // Stop - WButton stop = table.add(theme.button("Stop")).right().widget(); + WButton stop = table.add(theme.button(MeteorTranslations.translate(this.getTranslationKey() + ".gui.stop"))).right().widget(); stop.action = this::stop; return table; @@ -579,12 +580,12 @@ public WWidget getWidget(GuiTheme theme) { * @return A status */ public String getStatus() { - if (!this.isActive()) return "Module disabled."; - if (song == null) return "No song loaded."; - if (isPlaying) return String.format("Playing song. %d/%d", currentTick, song.getLastTick()); - if (stage == Stage.Playing) return "Ready to play."; - if (stage == Stage.SetUp || stage == Stage.Tune || stage == Stage.WaitingToCheckNoteblocks) return "Setting up the noteblocks."; - else return String.format("Stage: %s.", stage.toString()); + if (!this.isActive()) return MeteorTranslations.translate(this.getTranslationKey() + ".gui.status.disabled"); + if (song == null) return MeteorTranslations.translate(this.getTranslationKey() + ".gui.status.no_song_loaded"); + if (isPlaying) return MeteorTranslations.translate(this.getTranslationKey() + ".gui.status.playing_song", currentTick, song.getLastTick()); + if (stage == Stage.Playing) return MeteorTranslations.translate(this.getTranslationKey() + ".gui.status.ready"); + if (stage == Stage.SetUp || stage == Stage.Tune || stage == Stage.WaitingToCheckNoteblocks) return MeteorTranslations.translate(this.getTranslationKey() + ".gui.status.setup"); + else return MeteorTranslations.translate(this.getTranslationKey() + ".gui.status.other", stage.toString()); } /** @@ -593,28 +594,28 @@ public String getStatus() { public void play() { if (mc.player == null) return; if (mc.player.getAbilities().creativeMode && playingMode != PlayingMode.Preview) { - error("You need to be in survival mode."); + error("not_in_survival_mode").send(); } else if (stage == Stage.Playing) { isPlaying = true; - info("Playing."); + info("playing").send(); } else { - error("No song loaded."); + error("no_song_loaded").send(); } } public void pause() { enable(); if (isPlaying) { - info("Pausing."); + info("pausing").send(); isPlaying = false; } else { - info("Resuming."); + info("resuming").send(); isPlaying = true; } } public void stop() { - info("Stopping."); + info("stopping").send(); disableNotebot(); updateStatus(); } @@ -687,16 +688,16 @@ public void previewSong(File file) { */ public boolean loadFileToMap(File file, Runnable callback) { if (!file.exists() || !file.isFile()) { - error("File not found"); + error("file_not_found").send(); return false; } if (!SongDecoders.hasDecoder(file)) { - error("File is in wrong format. Decoder not found."); + error("file_wrong_format").send(); return false; } - info("Loading song \"%s\".", FilenameUtils.getBaseName(file.getName())); + info("loading", FilenameUtils.getBaseName(file.getName())).send(); // Start loading song loadingSongFuture = CompletableFuture.supplyAsync(() -> { @@ -714,7 +715,7 @@ public boolean loadFileToMap(File file, Runnable callback) { if (ex == null) { // Song is null only when it times out if (song == null) { - error("Loading song '" + FilenameUtils.getBaseName(file.getName()) + "' timed out."); + error("loading_timed_out", FilenameUtils.getBaseName(file.getName())).send(); onSongEnd(); return; } @@ -723,13 +724,13 @@ public boolean loadFileToMap(File file, Runnable callback) { long time2 = System.currentTimeMillis(); long diff = time2 - time1; - info("Song '" + FilenameUtils.getBaseName(file.getName()) + "' has been loaded to the memory! Took "+diff+"ms"); + info("loaded", FilenameUtils.getBaseName(file.getName()), diff).send(); callback.run(); } else { if (ex instanceof CancellationException) { - error("Loading song '" + FilenameUtils.getBaseName(file.getName()) + "' was cancelled."); + error("loading_cancelled", FilenameUtils.getBaseName(file.getName())).send(); } else { - error("An error occurred while loading song '" + FilenameUtils.getBaseName(file.getName()) + "'. See the logs for more details"); + error("loading_errored", FilenameUtils.getBaseName(file.getName())).send(); MeteorClient.LOG.error("An error occurred while loading song '{}'", FilenameUtils.getBaseName(file.getName()), ex); onSongEnd(); } @@ -789,10 +790,10 @@ private void tune() { waitTicks = checkNoteblocksAgainDelay.get(); stage = Stage.WaitingToCheckNoteblocks; - info("Delaying check for noteblocks"); + info("delaying_check").send(); } else { stage = Stage.Playing; - info("Loading done."); + info("loading_done").send(); play(); } return; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWalk.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWalk.java index d820efb792..624d9619e1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWalk.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWalk.java @@ -107,7 +107,7 @@ private void onTick(TickEvent.Pre event) { } } else { if (PathManagers.get() instanceof NopPathManager) { - info("Smart mode requires Baritone"); + info("smart_mode_unavailable").send(); toggle(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWasp.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWasp.java index 5a4f7cc852..348a1f313e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWasp.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/AutoWasp.java @@ -92,10 +92,10 @@ public void onActivate() { }, SortPriority.LowestDistance); if (target == null) { - error("No valid targets."); + error("no_valid_targets").send(); toggle(); return; - } else info(target.getName().getString() + " set as target."); + } else info("set_target", target.getName().getString()).send(); } jumpTimer = 0; @@ -110,7 +110,7 @@ public void onDeactivate() { @EventHandler private void onTick(TickEvent.Pre event) { if (target.isRemoved()) { - warning("Lost target!"); + warning("lost_target").send(); switch (action.get()) { case CHOOSE_NEW_TARGET -> onActivate(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/LongJump.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/LongJump.java index 111c5df1d9..3b22a10cb7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/LongJump.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/LongJump.java @@ -127,7 +127,7 @@ public void onDeactivate() { @EventHandler private void onPacketReceive(PacketEvent.Receive event) { if (event.packet instanceof PlayerPositionLookS2CPacket && disableOnRubberband.get()) { - info("Rubberband detected! Disabling..."); + info("rubberband").send(); toggle(); } } @@ -158,7 +158,7 @@ private void onPlayerMove(PlayerMoveEvent event) { if (jumping && (mc.player.getY() - (int) mc.player.getY() < 0.01)) { jumping = false; toggle(); - info("Disabling after jump."); + info("disabling").send(); } if (onlyOnGround.get() && !mc.player.isOnGround() && stage == 0) return; @@ -227,7 +227,7 @@ private void onTick(TickEvent.Pre event) { if (autoDisable.get() && jumped) { jumped = false; toggle(); - info("Disabling after jump."); + info("disabling").send(); } airTicks = 0; groundTicks += 1; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java index be6c795796..b81a6f7ec2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java @@ -62,7 +62,7 @@ private void onTick(TickEvent.Pre event) { if (slot == -1) { if (autoDisable.get()) { - info("Repaired all items, disabling"); + info("repaired_all").send(); if (didMove) { int emptySlot = getEmptySlot(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/ChestSwap.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/ChestSwap.java index adfed938bd..e441bc4e73 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/ChestSwap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/ChestSwap.java @@ -12,6 +12,7 @@ import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import meteordevelopment.meteorclient.utils.player.InvUtils; import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.EquipmentSlot; @@ -135,7 +136,7 @@ private void equip(int slot) { @Override public void sendToggledMsg() { if (stayOn.get()) super.sendToggledMsg(); - else if (Config.get().chatFeedback.get() && chatFeedback) info("Triggered (highlight)%s(default).", this.getTitle()); + else if (Config.get().chatFeedback.get() && chatFeedback) info("triggered", MessageBuilder.highlight(this.getTitleText())); } public enum Chestplate { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java index 75b059f9d5..c215d20249 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java @@ -16,6 +16,7 @@ import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.misc.input.KeyAction; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.meteorclient.utils.player.FindItemResult; import meteordevelopment.meteorclient.utils.player.InvUtils; @@ -106,7 +107,7 @@ private void onMouseClick(MouseClickEvent event) { if (!Friends.get().isFriend(player)) { Friends.get().add(new Friend(player)); - info("Added %s to friends", player.getName().getString()); + info("added_friend", MessageBuilder.highlight(player)).send(); if (message.get()) { String messageNotify = friendMessage.get().replace("%player", player.getName().getString()); ChatUtils.sendPlayerMsg(messageNotify); @@ -114,7 +115,7 @@ private void onMouseClick(MouseClickEvent event) { } else { Friends.get().remove(Friends.get().get(player)); - info("Removed %s from friends", player.getName().getString()); + info("removed_friend", MessageBuilder.highlight(player)).send(); } return; @@ -122,7 +123,7 @@ private void onMouseClick(MouseClickEvent event) { FindItemResult result = InvUtils.find(mode.get().item); if (!result.found() || !result.isHotbar() && !quickSwap.get()) { - if (notify.get()) warning("Unable to find specified item."); + if (notify.get()) warning("unable_to_find_item").send(); return; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java index 2472c05a4b..fff6386807 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java @@ -429,19 +429,19 @@ private void onPacketReceive(PacketEvent.Receive event) { Entity entity = mc.world.getEntityById(packet.playerId()); if (entity == mc.player && toggleOnDeath.get()) { toggle(); - info("Toggled off because you died."); + info("toggled_on_death").send(); } } else if (event.packet instanceof HealthUpdateS2CPacket packet) { if (mc.player.getHealth() - packet.getHealth() > 0 && toggleOnDamage.get()) { toggle(); - info("Toggled off because you took damage."); + info("toggled_on_damage").send(); } } else if (event.packet instanceof PlayerRespawnS2CPacket) { if (isActive()) { toggle(); - info("Toggled off because you changed dimensions."); + info("toggled_on_dimension_change").send(); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java index 4f00004e4b..93aea4f0d5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WaypointsModule.java @@ -167,7 +167,7 @@ private void onOpenScreen(OpenScreenEvent event) { public void addDeath(Vec3d deathPos) { String time = dateFormat.format(new Date()); if (dpChat.get()) { - info("death", deathPos, time); + info("death", deathPos, time).send(); } // Create waypoint diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java index f359176d50..6e6ea23266 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java @@ -109,13 +109,13 @@ private void selectCorners() { start = BetterBlockPos.from(result.getBlockPos()); status = Status.SEL_END; if (logSelection.get()) { - info("Start corner set: (%d, %d, %d)".formatted(start.getX(), start.getY(), start.getZ())); + info("start_corner", start.getX(), start.getY(), start.getZ()).send(); } } else if (status == Status.SEL_END) { end = BetterBlockPos.from(result.getBlockPos()); status = Status.WORKING; if (logSelection.get()) { - info("End corner set: (%d, %d, %d)".formatted(end.getX(), end.getY(), end.getZ())); + info("end_corner", end.getX(), end.getY(), end.getZ()).send(); } baritone.getSelectionManager().addSelection(start, end); baritone.getBuilderProcess().clearArea(start, end); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java index e2b6481b85..30bf3f3e3a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.systems.modules.world; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.game.GameLeftEvent; import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.render.Render2DEvent; @@ -25,6 +26,7 @@ import meteordevelopment.meteorclient.utils.entity.TargetUtils; import meteordevelopment.meteorclient.utils.misc.HorizontalDirection; import meteordevelopment.meteorclient.utils.misc.MBlockPos; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import meteordevelopment.meteorclient.utils.player.*; import meteordevelopment.meteorclient.utils.render.NametagUtils; import meteordevelopment.meteorclient.utils.render.RenderUtils; @@ -455,10 +457,10 @@ public void onActivate() { restockTask.complete(); - if (blocksPerTick.get() > 1 && rotation.get().mine) warning("With rotations enabled, you can break at most 1 block per tick."); - if (placementsPerTick.get() > 1 && rotation.get().place) warning("With rotations enabled, you can place at most 1 block per tick."); + if (blocksPerTick.get() > 1 && rotation.get().mine) warning("rotations_breaking_blocks_per_tick").send(); + if (placementsPerTick.get() > 1 && rotation.get().place) warning("rotations_placement_blocks_per_tick").send(); - if (Modules.get().get(InstantRebreak.class).isActive()) warning("It's recommended to disable the Instant Rebreak module and instead use the 'instantly-rebreak-echests' setting to avoid errors."); + if (Modules.get().get(InstantRebreak.class).isActive()) warning("instant_rebreak").send(); } @Override @@ -470,9 +472,9 @@ public void onDeactivate() { mc.options.useKey.setPressed(false); if (displayInfo) { - info("Distance: (highlight)%.0f", PlayerUtils.distanceTo(start)); - info("Blocks broken: (highlight)%d", blocksBroken); - info("Blocks placed: (highlight)%d", blocksPlaced); + info("distance", MessageBuilder.highlight(PlayerUtils.distanceTo(start))).send(); + info("blocks_broken", MessageBuilder.highlight(blocksBroken)).send(); + info("blocks_placed", MessageBuilder.highlight(blocksPlaced)).send(); } } @@ -508,7 +510,7 @@ private void onTick(TickEvent.Pre event) { } if (width.get() < 3 && dir.diagonal) { - errorEarly("Diagonal highways with width less than 3 are not supported."); + errorEarly("diagonal_too_small"); return; } @@ -678,10 +680,10 @@ private void disconnect(String message, Object... args) { } public MutableText getStatsText() { - MutableText text = Text.literal(String.format("%sDistance: %s%.0f\n", Formatting.GRAY, Formatting.WHITE, mc.player == null ? 0.0f : PlayerUtils.distanceTo(start))); - text.append(String.format("%sBlocks broken: %s%d\n", Formatting.GRAY, Formatting.WHITE, blocksBroken)); - text.append(String.format("%sBlocks placed: %s%d", Formatting.GRAY, Formatting.WHITE, blocksPlaced)); - + MutableText text = Text.empty(); + text.append(MessageBuilder.highlight(MeteorClient.translatable(this.getTranslationKey() + ".info.distance", mc.player == null ? 0.0f : PlayerUtils.distanceTo(start)))); + text.append(MessageBuilder.highlight(MeteorClient.translatable(this.getTranslationKey() + ".info.blocks_broken", blocksBroken))); + text.append(MessageBuilder.highlight(MeteorClient.translatable(this.getTranslationKey() + ".info.blocks_placed", blocksPlaced))); return text; } @@ -1169,7 +1171,7 @@ else if (b.lastState == ThrowOutTrash) { } if (emptySlots == 0) { - b.errorLate("No empty slots."); + b.errorLate("no_empty_slots"); return; } @@ -1254,7 +1256,7 @@ protected void tick(HighwayBuilder b) { // Mine ender chest int slot = findAndMoveBestToolToHotbar(b, blockState, true); if (slot == -1) { - b.errorLate("Cannot find pickaxe without silk touch to mine ender chests."); + b.errorLate("no_valid_pickaxe"); return; } @@ -1397,7 +1399,7 @@ else if (b.lastState == Center) { if (restockOccurred) { b.setState(ThrowOutTrash, Forward); - } else b.errorLate("Unable to perform restock for '" + b.restockTask.item() + "'."); + } else b.errorLate("unable_to_restock", MessageBuilder.highlight(b.restockTask.item())); return; } @@ -1408,7 +1410,7 @@ else if (b.lastState == Center) { } if (restockSlots <= 0) { - b.errorLate("No empty slots for restocking items."); + b.errorLate("no_restock_slots"); return; } @@ -1432,7 +1434,7 @@ else if (b.lastState == Center) { protected void tick(HighwayBuilder b) { // this should only tick if there's a valid slot we can restock from if (slot == -1) { - b.errorLate("Invalid restocking action."); + b.errorLate("invalid_restock"); return; } @@ -1565,7 +1567,7 @@ protected void tick(HighwayBuilder b) { // the only valid blocks should be air, a shulker box, or an ender chest // if there is another type of block, assume something has gone wrong and error out (e.g. lava flowed in) - default -> b.errorLate("Invalid block at container restocking position?"); + default -> b.errorLate("invalid_container_block"); } } @@ -1697,7 +1699,7 @@ protected void tick(HighwayBuilder b) { protected void start(HighwayBuilder b) { if (!InvUtils.find(Items.BOW).found() || (!InvUtils.find(itemStack -> itemStack.getItem() instanceof ArrowItem).found() && !b.mc.player.getAbilities().creativeMode)) { b.destroyCrystalTraps.set(false); - b.warning("No bow found to destroy crystal traps with. Toggling the setting off."); + b.warning("no_bow").send(); b.setState(Forward); } @@ -1726,7 +1728,7 @@ protected void tick(HighwayBuilder b) { int slot = findAndMoveToHotbar(b, itemStack -> itemStack.getItem() instanceof BowItem); if (slot == -1) { b.destroyCrystalTraps.set(false); - b.warning("No bow found to destroy crystal traps with. Toggling the setting off."); + b.warning("no_bow").send(); b.setState(Forward); b.mc.interactionManager.stopUsingItem(b.mc.player); b.drawingBow = false; @@ -1764,7 +1766,7 @@ protected void tick(HighwayBuilder b) { if (shots >= 3) { b.ignoreCrystals.add(target); - b.warning("Detected potential hangup on a crystal. Adding it to ignore list and continuing forward."); + b.warning("crystal_hangup").send(); b.setState(Forward); b.mc.interactionManager.stopUsingItem(b.mc.player); b.drawingBow = false; @@ -1998,7 +2000,7 @@ protected int findHotbarSlot(HighwayBuilder b, boolean replaceTools) { if (slotsWithBlocks > 0) return slotWithLeastBlocks; // No space found in hotbar - b.errorLate("No empty space in hotbar."); + b.errorLate("no_hotbar_slots"); return -1; } @@ -2075,7 +2077,7 @@ protected int findAndMoveBestToolToHotbar(HighwayBuilder b, BlockState blockStat b.restockTask.setPickaxes(); } else { - b.errorLate("Found less than the minimum amount of pickaxes required: " + count + "/" + (b.savePickaxes.get() + 1)); + b.errorLate("not_enough_pickaxes", count, b.savePickaxes.get() + 1); } return -1; @@ -2110,7 +2112,7 @@ else if (b.searchEnderChest.get() || b.searchShulkers.get()) { b.restockTask.setMaterials(); } else { - b.errorLate("Out of blocks to place."); + b.errorLate("out_of_blocks"); } return -1; @@ -2846,7 +2848,7 @@ private void setTask(@Range(from = 0, to = 2) int value) { } setState(State.Restock); - b.info("Starting new restock task for " + item()); + b.info("starting_restock", MessageBuilder.highlight(MeteorClient.translatable(b.getTranslationKey() + ".restock." + item()))).send(); } public void complete() { @@ -2860,10 +2862,10 @@ public boolean tasksInactive() { } public String item() { - if (materials) return "building materials"; + if (materials) return "materials"; if (pickaxes) return "pickaxes"; if (food) return "food"; - return "unknown"; + return "other"; } } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java index f30ada1fc7..df58249c63 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java @@ -11,6 +11,7 @@ import baritone.api.pathing.goals.GoalBlock; import baritone.api.process.ICustomGoalProcess; import baritone.api.process.IMineProcess; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; @@ -121,14 +122,14 @@ private void onTick(TickEvent.Post event) { if (isFull()) { if (walkHome.get()) { if (isBaritoneNotWalking()) { - info("Walking home."); + info("walking_home").send(); baritone.getCustomGoalProcess().setGoalAndPath(new GoalBlock(homePos)); } else if (mc.player.getBlockPos().equals(homePos) && logOut.get()) logOut(); } else if (logOut.get()) logOut(); else { - info("Inventory full, stopping process."); + info("inventory_full").send(); toggle(); } @@ -136,20 +137,20 @@ private void onTick(TickEvent.Post event) { } if (!findPickaxe()) { - error("Could not find a usable mending pickaxe."); + error("no_mending_pickaxe").send(); toggle(); return; } if (!checkThresholds()) { - error("Start mining value can't be lower than start repairing value."); + error("invalid_thresholds").send(); toggle(); return; } if (repairing) { if (!needsRepair()) { - warning("Finished repairing, going back to mining."); + info("finished_repairing").send(); repairing = false; baritoneSettings.mineScanDroppedItems.value = true; mineTargetBlocks(); @@ -160,7 +161,7 @@ private void onTick(TickEvent.Post event) { } else { if (needsRepair()) { - warning("Pickaxe needs repair, beginning repair process"); + info("beginning_repairing").send(); repairing = true; baritoneSettings.mineScanDroppedItems.value = false; mineRepairBlocks(); @@ -209,7 +210,8 @@ private void mineRepairBlocks() { private void logOut() { toggle(); - mc.player.networkHandler.sendPacket(new DisconnectS2CPacket(Text.literal("[Infinity Miner] Inventory is full."))); + Text message = Text.literal("[").append(this.getTitleText()).append("] ").append(MeteorClient.translatable(this.getTranslationKey() + ".disconnect.full_inventory")); + mc.player.networkHandler.sendPacket(new DisconnectS2CPacket(message)); } private boolean isBaritoneNotMining() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java index 481517600a..57b6adf485 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java @@ -17,8 +17,8 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.Keybind; -import meteordevelopment.meteorclient.utils.misc.Names; import meteordevelopment.meteorclient.utils.misc.input.KeyAction; +import meteordevelopment.meteorclient.utils.misc.text.MessageBuilder; import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.meteorclient.utils.player.Rotations; import meteordevelopment.meteorclient.utils.render.RenderUtils; @@ -507,10 +507,10 @@ private void addTargetedBlockToList() { if (list.contains(targetBlock)) { list.remove(targetBlock); - info("Removed " + Names.get(targetBlock) + " from " + modeName); + info("removed_block", MessageBuilder.highlight(targetBlock), MessageBuilder.highlight(modeName)).send(); } else { list.add(targetBlock); - info("Added " + Names.get(targetBlock) + " to " + modeName); + info("added_block", MessageBuilder.highlight(targetBlock), MessageBuilder.highlight(modeName)).send(); } } diff --git a/src/main/resources/assets/meteor-client/language/en_us.json b/src/main/resources/assets/meteor-client/language/en_us.json index a396b446f7..9c08f4faeb 100644 --- a/src/main/resources/assets/meteor-client/language/en_us.json +++ b/src/main/resources/assets/meteor-client/language/en_us.json @@ -191,6 +191,8 @@ "command.server.info.plugins": "Plugins (%1$s): %2$s", "command.settings": "Settings", "command.settings.description": "Allows you to view and change module settings.", + "command.settings.info.get": "Setting %1$s is %2$s.", + "command.settings.info.set": "Setting %1$s changed to %2$s.", "command.spectate": "Spectate", "command.spectate.description": "Allows you to spectate nearby players", "command.swarm": "Swarm", @@ -838,6 +840,8 @@ "module.base.toggled": "Toggled %1$s %2$s.", "module.base.toggled.on": "on", "module.base.toggled.off": "off", + "module.base.bound": "Bound to %s.", + "module.base.unbound": "Removed bind.", "module.air-jump": "Air Jump", "module.air-jump.description": "Lets you jump in the air.", @@ -1125,6 +1129,8 @@ "module.excavator.rendering.side-color.description": "The side color.", "module.excavator.rendering.line-color": "Line Color", "module.excavator.rendering.line-color.description": "The line color.", + "module.excavator.info.start_corner": "Start corner set: (%1$s, %2$s, %3$s)", + "module.excavator.info.end_corner": "End corner set: (%1$s, %2$s, %3$s)", "module.timer": "Timer", "module.timer.description": "Changes the speed of everything in your game.", @@ -1183,6 +1189,7 @@ "module.surround.render.unsafe-side-color.description": "The side color for unsafe blocks.", "module.surround.render.unsafe-line-color": "Unsafe Line Color", "module.surround.render.unsafe-line-color.description": "The line color for unsafe blocks.", + "module.surround.info.died": "Toggled off because you died.", "module.no-rotate": "No Rotate", "module.no-rotate.description": "Attempts to block rotations sent from server to client.", @@ -1209,6 +1216,8 @@ "module.long-jump.general.auto-disable.description": "Automatically disabled the module after jumping.", "module.long-jump.general.disable-on-rubberband": "Disable On Rubberband", "module.long-jump.general.disable-on-rubberband.description": "Disables the module when you get lagged back.", + "module.long-jump.info.rubberband": "Rubberband detected! Disabling...", + "module.long-jump.info.disabling": "Disabling after jump.", "module.trajectories": "Trajectories", "module.trajectories.description": "Predicts the trajectory of throwable items.", @@ -1328,6 +1337,9 @@ "module.freecam.pathing.click-to-path.description": "Sets a pathfinding goal to any block/entity you click at.", "module.freecam.pathing.double-click": "Double Click", "module.freecam.pathing.double-click.description": "Require two clicks to start pathing.", + "module.freecam.info.toggled_on_death": "Toggled off because you died.", + "module.freecam.info.toggled_on_damage": "Toggled off because you took damage.", + "module.freecam.info.toggled_on_dimension_change": "Toggled off because you changed dimensions.", "module.exp-thrower": "Exp Thrower", "module.exp-thrower.description": "Automatically throws XP bottles from your hotbar.", @@ -1365,8 +1377,10 @@ "module.book-bot.general.append-count.description": "Whether to append the number of the book to the title.", "module.book-bot.general.word-wrap": "Word Wrap", "module.book-bot.general.word-wrap.description": "Prevents words from being cut in the middle of lines.", + "module.book-bot.info.no_file_selected": "No file selected, please select a file in the GUI.", "module.book-bot.error.file_empty": "The bookbot file is empty!", "module.book-bot.click_to_edit_file": "Click here to edit it.", + "module.book-bot.error.failed_to_read_file": "Failed to read the file.", "module.auto-gap": "Auto Gap", "module.auto-gap.description": "Automatically eats Gaps or E-Gaps.", @@ -1409,6 +1423,9 @@ "module.middle-click-extra.general.disable-in-creative.description": "Middle click action is disabled in Creative mode.", "module.middle-click-extra.general.notify": "Notify", "module.middle-click-extra.general.notify.description": "Notifies you when you do not have the specified item in your hotbar.", + "module.middle-click-extra.info.added_friend": "Added %s to friends.", + "module.middle-click-extra.info.removed_friend": "Removed %s from friends.", + "module.middle-click-extra.warning.unable_to_find_item": "Unable to find specified item.", "module.logout-spots": "Logout Spots", "module.logout-spots.description": "Displays a box where another player has logged out at.", @@ -1517,6 +1534,8 @@ "module.nuker.render.breaking-side-color.description": "The side color of the target block rendering.", "module.nuker.render.breaking-line-color": "Breaking Line Color", "module.nuker.render.breaking-line-color.description": "The line color of the target block rendering.", + "module.nuker.info.added_block": "Added %1$s to %2$s.", + "module.nuker.info.removed_block": "Removed %1$s from %2$s.", "module.auto-trap": "Auto Trap", "module.auto-trap.description": "Traps people in a box to prevent them from moving.", @@ -1869,6 +1888,15 @@ "module.auto-log.entities.individual-entity-threshold.description": "The minimum number of entities individually that must be near you before disconnection occurs.", "module.auto-log.entities.range": "Range", "module.auto-log.entities.range.description": "How close an entity has to be to you before you disconnect.", + "module.auto-log.info.re-enable": "Player health greater than minimum, re-enabling module.", + "module.auto-log.reason.header": "INFO - AutoReconnect was disabled", + "module.auto-log.reason.popped": "Popped %s totems.", + "module.auto-log.reason.health": "Health was lower than %s.", + "module.auto-log.reason.health_predict": "Health was going to be lower than %s.", + "module.auto-log.reason.non_trusted_player": "Non-trusted player '%s' appeared in your render distance.", + "module.auto-log.reason.anti_32k": "Anti-32k measures.", + "module.auto-log.reason.combined_entity_threshold": "Total number of selected entities within range exceeded the limit.", + "module.auto-log.reason.single_entity_threshold": "Number of %s within range exceeded the limit.", "module.high-jump": "High Jump", "module.high-jump.description": "Makes you jump higher than normal.", @@ -2077,6 +2105,7 @@ "module.chest-swap.general.stay-on.description": "Stays on and activates when you turn it off.", "module.chest-swap.general.close-inventory": "Close Inventory", "module.chest-swap.general.close-inventory.description": "Sends inventory close after swap.", + "module.chest-swap.info.triggered": "Triggered %s.", "module.fast-use": "Fast Use", "module.fast-use.description": "Allows you to use items at very high speeds.", @@ -2191,6 +2220,29 @@ "module.highway-builder.render-paving.blocks-to-place-side-color.description": "Color of blocks to be placed.", "module.highway-builder.render-paving.blocks-to-place-line-color": "Blocks To Place Line Color", "module.highway-builder.render-paving.blocks-to-place-line-color.description": "Color of blocks to be placed.", + "module.highway-builder.warning.rotations_breaking_blocks_per_tick": "With rotations enabled, you can break at most 1 block per tick.", + "module.highway-builder.warning.rotations_placement_blocks_per_tick": "With rotations enabled, you can place at most 1 block per tick.", + "module.highway-builder.warning.instant_rebreak": "It's recommended to disable the Instant Rebreak module and instead use the 'instantly-rebreak-echests' setting to avoid errors.", + "module.highway-builder.info.distance": "Distance: %s", + "module.highway-builder.info.blocks_broken": "Blocks broken: %s", + "module.highway-builder.info.blocks_placed": "Blocks placed: %s", + "module.highway-builder.info.starting_restock": "Starting new restock task for %s.", + "module.highway-builder.error.diagonal_too_small": "Diagonal highways with width less than 3 are not supported.", + "module.highway-builder.error.no_empty_slots": "No empty slots.", + "module.highway-builder.error.no_valid_pickaxe": "Cannot find pickaxe without silk touch to mine ender chests.", + "module.highway-builder.error.unable_to_restock": "Unable to perform restock for '%s'.", + "module.highway-builder.error.no_restock_slots": "No empty slots for restocking items.", + "module.highway-builder.error.invalid_restock": "Invalid restocking action.", + "module.highway-builder.error.invalid_container_block": "Invalid block at container restocking position?", + "module.highway-builder.error.no_hotbar_slots": "No empty space in hotbar.", + "module.highway-builder.error.not_enough_pickaxes": "Found less than the minimum amount of pickaxes required: %1$s/%2$s", + "module.highway-builder.error.out_of_blocks": "Out of blocks to place.", + "module.highway-builder.warning.no_bow": "No bow found to destroy crystal traps with. Toggling the setting off.", + "module.highway-builder.warning.crystal_hangup": "Detected potential hangup on a crystal. Adding it to ignore list and continuing forward.", + "module.highway-builder.restock.materials": "building materials", + "module.highway-builder.restock.pickaxes": "pickaxes", + "module.highway-builder.restock.food": "food", + "module.highway-builder.restock.other": "other", "module.infinity-miner": "Infinity Miner", "module.infinity-miner.description": "Allows you to essentially mine forever by mining repair blocks when the durability gets low. Needs a mending pickaxe.", @@ -2209,6 +2261,13 @@ "module.infinity-miner.when-full.walk-home.description": "Will walk 'home' when your inventory is full.", "module.infinity-miner.when-full.log-out": "Log Out", "module.infinity-miner.when-full.log-out.description": "Logs out when your inventory is full. Will walk home FIRST if walk home is enabled.", + "module.infinity-miner.info.walking_home": "Walking home.", + "module.infinity-miner.info.inventory_full": "Inventory full, stopping process.", + "module.infinity-miner.info.finished_repairing": "Finished repairing, going back to mining.", + "module.infinity-miner.info.beginning_repairing": "Pickaxe needs repair, beginning repair process.", + "module.infinity-miner.error.no_mending_pickaxe": "Could not find a usable mending pickaxe.", + "module.infinity-miner.error.invalid_thresholds": "Start mining durability threshold can't be lower than start repairing durability threshold.", + "module.infinity-miner.disconnect.full_inventory": "Inventory is full.", "module.breadcrumbs": "Breadcrumbs", "module.breadcrumbs.description": "Displays a trail behind where you have walked.", @@ -2380,6 +2439,7 @@ "module.auto-mend.general.force.description": "Replaces item in offhand even if there is some other non-repairable item.", "module.auto-mend.general.auto-disable": "Auto Disable", "module.auto-mend.general.auto-disable.description": "Automatically disables when there are no more items to repair.", + "module.auto-mend.info.repaired_all": "Repaired all items, disabling.", "module.auto-anvil": "Auto Anvil", "module.auto-anvil.description": "Automatically places anvils above players to destroy helmets.", @@ -2420,6 +2480,11 @@ "module.burrow.general.center.description": "Centers you to the middle of the block before burrowing.", "module.burrow.general.rotate": "Rotate", "module.burrow.general.rotate.description": "Faces the block you place server-side.", + "module.burrow.info.waiting_for_jump": "Waiting for manual jump.", + "module.burrow.error.already_burrowed": "Already burrowed, disabling.", + "module.burrow.error.not_in_hole": "Not in a hole, disabling.", + "module.burrow.error.not_enough_headroom": "Not enough headroom to burrow, disabling.", + "module.burrow.error.no_burrow_blocks": "No burrow block found, disabling.", "module.auto-sign": "Auto Sign", "module.auto-sign.description": "Automatically writes signs. The first sign's text will be used.", @@ -2712,7 +2777,6 @@ "module.notebot.note-map.Bit": "Bit", "module.notebot.note-map.Banjo": "Banjo", "module.notebot.note-map.Pling": "Pling", - "module.notebot.render.render-text": "Render Text", "module.notebot.render.render-text.description": "Whether or not to render the text above noteblocks.", "module.notebot.render.render-boxes": "Render Boxes", @@ -2739,6 +2803,37 @@ "module.notebot.render.note-text-scale.description": "The scale.", "module.notebot.render.show-scanned-noteblocks": "Show Scanned Noteblocks", "module.notebot.render.show-scanned-noteblocks.description": "Show scanned Noteblocks", + "module.notebot.info.checking": "Checking noteblocks again...", + "module.notebot.info.playing": "Playing.", + "module.notebot.info.pausing": "Pausing.", + "module.notebot.info.resuming": "Resuming.", + "module.notebot.info.stopping": "Stopping.", + "module.notebot.info.loading": "Loading song '%s'.", + "module.notebot.info.loaded": "Song '%1$s' has been loaded to the memory! Took %2$sms", + "module.notebot.info.delaying_check": "Delaying check for noteblocks", + "module.notebot.info.loading_done": "Loading done.", + "module.notebot.error.cant_find_noteblocks": "Can't find any nearby noteblock!", + "module.notebot.error.cant_find_valid_noteblocks": "Can't find any valid noteblock to play song.", + "module.notebot.error.not_in_survival_mode": "You need to be in survival mode.", + "module.notebot.error.no_song_loaded": "No song loaded.", + "module.notebot.error.file_not_found": "File not found.", + "module.notebot.error.file_wrong_format": "File is in wrong format. Decoder not found.", + "module.notebot.error.loading_timed_out": "Loading song '%s' timed out.", + "module.notebot.error.loading_cancelled": "Loading song '%s' was cancelled.", + "module.notebot.error.loading_errored": "An error occurred while loading song '%s'. See the logs for more details", + "module.notebot.warning.missing_note": "Missing note: %1$s, %2$s", + "module.notebot.warning.missing_notes": "%s missing notes!", + "module.notebot.gui.open_gui": "Open Song GUI", + "module.notebot.gui.align_center": "Align Center", + "module.notebot.gui.pause": "Pause", + "module.notebot.gui.resume": "Resume", + "module.notebot.gui.stop": "Stop", + "module.notebot.gui.status.disabled": "Module disabled.", + "module.notebot.gui.status.no_song_loaded": "No song loaded.", + "module.notebot.gui.status.playing_song": "Playing song. %1$s/%2$s", + "module.notebot.gui.status.ready": "Ready to play.", + "module.notebot.gui.status.setup": "Setting up the noteblocks.", + "module.notebot.gui.status.other": "Stage: %s.", "module.item-highlight": "Item Highlight", "module.item-highlight.description": "Highlights selected items when in guis", @@ -2809,6 +2904,7 @@ "module.auto-walk.general.disable-on-y-change.description": "Disable module if player moves vertically", "module.auto-walk.general.no-unloaded-chunks": "No Unloaded Chunks", "module.auto-walk.general.no-unloaded-chunks.description": "Do not allow movement into unloaded chunks", + "module.auto-walk.info.smart_mode_unavailable": "Smart mode requires Baritone", "module.self-trap": "Self Trap", "module.self-trap.description": "Places blocks above your head.", @@ -2868,6 +2964,9 @@ "module.auto-wasp.general.action-on-target-loss.description": "What to do if you lose the target.", "module.auto-wasp.general.offset": "Offset", "module.auto-wasp.general.offset.description": "How many blocks offset to wasp at from the target.", + "module.auto-wasp.error.no_valid_targets": "No valid targets.", + "module.auto-wasp.info.set_target": "%s set as target.", + "module.auto-wasp.warning.lost_target": "Lost target!", "module.break-delay": "Break Delay", "module.break-delay.description": "Changes the delay between breaking blocks.", @@ -4174,5 +4273,7 @@ "module.bow-aimbot.general.pause-on-combat": "Pause On Combat", "module.bow-aimbot.general.pause-on-combat.description": "Freezes Baritone temporarily until you released the bow.", + "setting.blockpos.click": "Right click to pick a new position, left click to cancel.", + "starscript.title": "Starscript" } From 9f3c172a3a03c5fe17677d393f19e5b14f6a8fb0 Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Mon, 23 Mar 2026 23:03:31 +0000 Subject: [PATCH 70/72] Add Chinese module translations, courtesy of dingzhen-vape and Nippaku-Zanmu Translation keys were taken from https://github.com/Nippaku-Zanmu/meteor-translation-addon, reformatted to our current translation style and cleaned up --- .../assets/meteor-client/language/en_gb.json | 6 + .../assets/meteor-client/language/zh_cn.json | 2758 ++++++++++++++++- 2 files changed, 2762 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/meteor-client/language/en_gb.json b/src/main/resources/assets/meteor-client/language/en_gb.json index 7e700764dc..bc9f17c8bd 100644 --- a/src/main/resources/assets/meteor-client/language/en_gb.json +++ b/src/main/resources/assets/meteor-client/language/en_gb.json @@ -688,6 +688,12 @@ "setting.group.anchors": "Anchors", "setting.group.tracer": "Tracer", "setting.group.base": "Base", + "setting.group.strings": "Strings", + "setting.group.whole-numbers": "Whole Numbers", + "setting.group.numbers": "Numbers", + "setting.group.checkboxes": "Checkboxes", + "setting.group.block-lists": "Block Lists", + "setting.group.item-lists": "Item Lists", "module.base.bind": "Bind", "module.base.bind.bind": "Bind: ", diff --git a/src/main/resources/assets/meteor-client/language/zh_cn.json b/src/main/resources/assets/meteor-client/language/zh_cn.json index 1a3140f140..553410754c 100644 --- a/src/main/resources/assets/meteor-client/language/zh_cn.json +++ b/src/main/resources/assets/meteor-client/language/zh_cn.json @@ -1,6 +1,2760 @@ { - "meteor.lang.translators": "Wuqibor, Enaium", + "meteor.lang.translators": "Wuqibor, Enaium, dingzhen-vape, Nippaku-Zanmu", "meteor.key.open-gui": "打开GUI", - "meteor.key.open-commands": "输入命令" + "meteor.key.open-commands": "输入命令", + + "module.criticals": "刀爆", + "module.criticals.description": "当你击中目标时执行暴击攻击。", + "module.criticals.general.mode": "模式", + "module.criticals.general.mode.description": "关于Criticals如何运作的模式。", + "module.criticals.general.only-killaura": "仅Killaura", + "module.criticals.general.only-killaura.description": "仅在使用Killaura时执行暴击。", + "module.criticals.mace.smash-attack": "猛击攻击", + "module.criticals.mace.smash-attack.description": "使用重锤时将始终进行猛击。", + "module.criticals.mace.additional-height": "额外高度", + "module.criticals.mace.additional-height.description": "要伪装的额外高度。更多高度意味着更多伤害。", + "module.fast-climb": "快速爬行", + "module.fast-climb.description": "让你更快地爬行.", + "module.fast-climb.general.timer-mode": "timer模式", + "module.fast-climb.general.timer-mode.description": "使用timer.", + "module.fast-climb.general.climb-speed": "爬行速度", + "module.fast-climb.general.climb-speed.description": "你的爬行速度.", + "module.fast-climb.general.timer": "计时器", + "module.fast-climb.general.timer.description": "timer的值.", + "module.spider": "爬墙", + "module.spider.description": "让你像蜘蛛一样爬墙。", + "module.spider.general.climb-speed": "爬行速度", + "module.spider.general.climb-speed.description": "你上方块的速度。", + "module.auto-weapon": "自动武器", + "module.auto-weapon.description": "在你的快捷栏中找到最好的武器。", + "module.auto-weapon.general.weapon": "武器", + "module.auto-weapon.general.weapon.description": "使用什么类型的武器。", + "module.auto-weapon.general.threshold": "阈值", + "module.auto-weapon.general.threshold.description": "如果非首选武器产生的伤害达到这个值,将优先使用它而不是你的首选武器。", + "module.auto-weapon.general.anti-break": "防破", + "module.auto-weapon.general.anti-break.description": "防止你的武器破损。", + "module.entity-control": "实体控制", + "module.entity-control.description": "让你在没有鞍的情况下控制可骑乘的实体.", + "module.entity-control.general.max-jump": "最大跳跃", + "module.entity-control.general.max-jump.description": "将跳跃力设为最大.", + "module.server-spoof": "服务器欺骗", + "module.server-spoof.description": "伪装客户端版本、资源包和频道。", + "module.server-spoof.general.spoof-brand": "伪装版本", + "module.server-spoof.general.spoof-brand.description": "是否伪装版本欺骗服务器。", + "module.server-spoof.general.brand": "版本", + "module.server-spoof.general.brand.description": "自定义上报至服务器的版本。", + "module.server-spoof.general.resource-pack": "资源包", + "module.server-spoof.general.resource-pack.description": "欺骗接受服务器资源包。", + "module.server-spoof.general.block-channels": "拦截频道", + "module.server-spoof.general.block-channels.description": "是否拦截某些频道。", + "module.server-spoof.general.channels": "频道", + "module.server-spoof.general.channels.description": "如果频道包含关键词,则此出站频道将被拦截。", + "module.build-height": "建筑高度", + "module.build-height.description": "允许你在建筑限制处与物体互动。", + "module.spawn-proofer": "防止生成", + "module.spawn-proofer.description": "自动防止未照明的区域生成怪物。", + "module.spawn-proofer.general.place-delay": "放置延迟", + "module.spawn-proofer.general.place-delay.description": "放置方块之间的延迟,以刻为单位。", + "module.spawn-proofer.general.blocks": "方块", + "module.spawn-proofer.general.blocks.description": "用于防止生成的方块。", + "module.spawn-proofer.general.mode": "模式", + "module.spawn-proofer.general.mode.description": "应该防止哪些生成类型。", + "module.spawn-proofer.general.rotate": "旋转", + "module.spawn-proofer.general.rotate.description": "旋转向被放置的方块。", + "module.item-physics": "物品物理", + "module.item-physics.description": "为地面上的物品应用物理效果。", + "module.item-physics.general.random-rotation": "随机旋转", + "module.item-physics.general.random-rotation.description": "为每个物品添加一个随机旋转。", + "module.no-mining-trace": "不挖掘痕迹", + "module.no-mining-trace.description": "允许你通过实体挖掘方块。", + "module.no-mining-trace.general.blacklisted-entities": "黑名单实体", + "module.no-mining-trace.general.blacklisted-entities.description": "你将正常互动的实体。", + "module.no-mining-trace.general.only-when-holding-a-pickaxe": "仅持有镐时", + "module.no-mining-trace.general.only-when-holding-a-pickaxe.description": "是否仅在持有镐时工作。", + "module.auto-trap": "自动围人", + "module.auto-trap.description": "把敌人用方块困住以阻止它移动", + "module.auto-trap.general.whitelist": "方块白名单", + "module.auto-trap.general.whitelist.description": "要使用的方块。", + "module.auto-trap.general.target-priority": "目标优先级", + "module.auto-trap.general.target-priority.description": "如何选择要瞄准的玩家", + "module.auto-trap.general.target-range": "锁定距离", + "module.auto-trap.general.target-range.description": "进入该半径内的玩家将会被此模块锁定", + "module.auto-trap.general.place-delay": "放置延迟", + "module.auto-trap.general.place-delay.description": "方块放置之间的延迟", + "module.auto-trap.general.top-blocks": "顶部方块", + "module.auto-trap.general.top-blocks.description": "是否对目标的头顶放置方块", + "module.auto-trap.general.bottom-blocks": "底部方块", + "module.auto-trap.general.bottom-blocks.description": "是否对目标的脚旁边放置方块", + "module.auto-trap.general.self-toggle": "自动关闭", + "module.auto-trap.general.self-toggle.description": "放置所有方块后自动关闭。", + "module.auto-trap.general.rotate": "转头", + "module.auto-trap.general.rotate.description": "放置时向方块旋转视角。", + "module.auto-trap.render.render": "渲染", + "module.auto-trap.render.render.description": "是否渲染将要放置的方块的覆盖层。", + "module.auto-trap.render.shape-mode": "形状模式", + "module.auto-trap.render.shape-mode.description": "形状的渲染方式.", + "module.auto-trap.render.side-color": "侧面颜色", + "module.auto-trap.render.side-color.description": "目标方块渲染的侧面颜色。", + "module.auto-trap.render.line-color": "线条颜色", + "module.auto-trap.render.line-color.description": "目标方块渲染的线条颜色。", + "module.auto-trap.render.next-side-color": "下一个侧面颜色", + "module.auto-trap.render.next-side-color.description": "下一个要放置的方块的侧面颜色。", + "module.auto-trap.render.next-line-color": "下一个线条颜色", + "module.auto-trap.render.next-line-color.description": "下一个要放置的方块的线条颜色。", + "module.better-beacons": "更好的信标", + "module.better-beacons.description": "选择不受信标等级影响的效果。", + "module.hole-esp": "洞穴透视", + "module.hole-esp.description": "显示你会受到更少伤害的洞穴。", + "module.hole-esp.general.horizontal-radius": "水平搜索范围", + "module.hole-esp.general.horizontal-radius.description": "水平方向上搜索洞的半径。", + "module.hole-esp.general.vertical-radius": "垂直搜索范围", + "module.hole-esp.general.vertical-radius.description": "垂直搜索洞穴的范围。", + "module.hole-esp.general.min-height": "最低高度", + "module.hole-esp.general.min-height.description": "需要渲染的洞穴的最低高度。", + "module.hole-esp.general.doubles": "双重", + "module.hole-esp.general.doubles.description": "高亮可以横跨的双洞。", + "module.hole-esp.general.ignore-own": "忽略自己", + "module.hole-esp.general.ignore-own.description": "忽略渲染你当前站在的洞穴。", + "module.hole-esp.general.webs": "蜘蛛网", + "module.hole-esp.general.webs.description": "是否显示有蜘蛛网的洞穴。", + "module.hole-esp.render.shape-mode": "形状模式", + "module.hole-esp.render.shape-mode.description": "形状的渲染方式.", + "module.hole-esp.render.height": "高度", + "module.hole-esp.render.height.description": "渲染的高度。", + "module.hole-esp.render.top-quad": "顶部四边形", + "module.hole-esp.render.top-quad.description": "是否在洞穴的顶部渲染一个四边形。", + "module.hole-esp.render.bottom-quad": "底部四边形", + "module.hole-esp.render.bottom-quad.description": "是否在洞穴的底部渲染一个四边形。", + "module.hole-esp.render.bedrock-top": "基岩顶部", + "module.hole-esp.render.bedrock-top.description": "完全是基岩的洞穴的顶部颜色。", + "module.hole-esp.render.bedrock-bottom": "基岩底部", + "module.hole-esp.render.bedrock-bottom.description": "完全是基岩的洞穴的底部颜色。", + "module.hole-esp.render.obsidian-top": "黑曜石顶部", + "module.hole-esp.render.obsidian-top.description": "完全是黑曜石的洞穴的顶部颜色。", + "module.hole-esp.render.obsidian-bottom": "黑曜石底部", + "module.hole-esp.render.obsidian-bottom.description": "完全是黑曜石的洞穴的底部颜色。", + "module.hole-esp.render.mixed-top": "混合顶部", + "module.hole-esp.render.mixed-top.description": "有混合基岩和黑曜石的洞穴的顶部颜色。", + "module.hole-esp.render.mixed-bottom": "混合底部", + "module.hole-esp.render.mixed-bottom.description": "有混合基岩和黑曜石的洞穴的底部颜色。", + "module.break-delay": "破坏延迟", + "module.break-delay.description": "改变破坏方块之间的延迟。", + "module.break-delay.general.cooldown": "冷却", + "module.break-delay.general.cooldown.description": "破坏方块的冷却时间,以刻为单位。", + "module.break-delay.general.no-insta-break": "无瞬间破坏", + "module.break-delay.general.no-insta-break.description": "防止你瞬间破坏方块。", + "module.potion-saver": "药水节省", + "module.potion-saver.description": "当你站着不动时停止药水效果的计时。", + "module.potion-saver.general.effects": "效果", + "module.potion-saver.general.effects.description": "要保留的效果。", + "module.potion-saver.general.only-when-stationary": "仅静止时", + "module.potion-saver.general.only-when-stationary.description": "只有在你不动时才冻结效果。", + "module.velocity": "反击退", + "module.velocity.description": "防止你被外力移动。", + "module.velocity.general.knockback": "击退", + "module.velocity.general.knockback.description": "修改你从攻击中受到的击退量。", + "module.velocity.general.knockback-horizontal": "水平击退", + "module.velocity.general.knockback-horizontal.description": "你将承受多少水平击退。", + "module.velocity.general.knockback-vertical": "垂直击退", + "module.velocity.general.knockback-vertical.description": "你将承受多少垂直击退。", + "module.velocity.general.explosions": "爆炸", + "module.velocity.general.explosions.description": "修改你从爆炸中受到的击退。", + "module.velocity.general.explosions-horizontal": "爆炸水平", + "module.velocity.general.explosions-horizontal.description": "你将从爆炸中水平承受多少速度。", + "module.velocity.general.explosions-vertical": "爆炸垂直", + "module.velocity.general.explosions-vertical.description": "你将从爆炸中垂直承受多少速度。", + "module.velocity.general.liquids": "液体", + "module.velocity.general.liquids.description": "修改你被流动液体推动的量。", + "module.velocity.general.liquids-horizontal": "液体水平", + "module.velocity.general.liquids-horizontal.description": "你将从液体中水平承受多少速度。", + "module.velocity.general.liquids-vertical": "液体垂直", + "module.velocity.general.liquids-vertical.description": "你将从液体中垂直承受多少速度。", + "module.velocity.general.entity-push": "实体推动", + "module.velocity.general.entity-push.description": "修改你被实体推动的量。", + "module.velocity.general.entity-push-amount": "实体推动量", + "module.velocity.general.entity-push-amount.description": "你将被推动多少。", + "module.velocity.general.blocks": "方块", + "module.velocity.general.blocks.description": "防止你被推出方块。", + "module.velocity.general.sinking": "沉没", + "module.velocity.general.sinking.description": "防止你在液体中沉没。", + "module.velocity.general.fishing": "钓鱼", + "module.velocity.general.fishing.description": "防止你被钓鱼竿拉动。", + "module.notifier": "通知器", + "module.notifier.description": "通知你不同的事件。", + "module.notifier.totem-pops.totem-pops": "图腾弹出", + "module.notifier.totem-pops.totem-pops.description": "当玩家弹出图腾时通知你。", + "module.notifier.totem-pops.distance-check": "距离检测", + "module.notifier.totem-pops.distance-check.description": "限制检测弹出的距离。", + "module.notifier.totem-pops.player-radius": "玩家半径", + "module.notifier.totem-pops.player-radius.description": "记录图腾弹出的半径。", + "module.notifier.totem-pops.ignore-own": "忽略自己", + "module.notifier.totem-pops.ignore-own.description": "忽略你自己的图腾弹出。", + "module.notifier.totem-pops.ignore-friends": "忽略好友", + "module.notifier.totem-pops.ignore-friends.description": "忽略朋友的图腾弹出。", + "module.notifier.totem-pops.ignore-others": "忽略其他", + "module.notifier.totem-pops.ignore-others.description": "忽略其他玩家的图腾弹出。", + "module.notifier.visual-range.visual-range": "视觉范围", + "module.notifier.visual-range.visual-range.description": "当实体进入你的渲染范围时通知你。", + "module.notifier.visual-range.event": "事件", + "module.notifier.visual-range.event.description": "何时记录实体。", + "module.notifier.visual-range.entities": "实体", + "module.notifier.visual-range.entities.description": "要通知的实体。", + "module.notifier.visual-range.ignore-friends": "忽略好友", + "module.notifier.visual-range.ignore-friends.description": "忽略朋友。", + "module.notifier.visual-range.ignore-fake-players": "忽略假玩家", + "module.notifier.visual-range.ignore-fake-players.description": "忽略假玩家。", + "module.notifier.visual-range.sound": "声音", + "module.notifier.visual-range.sound.description": "进入/离开时发出声音效果", + "module.notifier.pearl.pearl": "珍珠", + "module.notifier.pearl.pearl.description": "当玩家使用末影珍珠传送时通知你。", + "module.notifier.pearl.ignore-own": "忽略自己", + "module.notifier.pearl.ignore-own.description": "忽略你自己的末影珍珠。", + "module.notifier.pearl.ignore-friends": "忽略好友", + "module.notifier.pearl.ignore-friends.description": "忽略朋友的末影珍珠。", + "module.notifier.joins/leaves.player-joins-leaves": "玩家加入离开", + "module.notifier.joins/leaves.player-joins-leaves.description": "如何处理玩家加入/离开通知。", + "module.notifier.joins/leaves.notification-delay": "通知延迟", + "module.notifier.joins/leaves.notification-delay.description": "等待多少tick后再发布下一条加入/离开通知到你的聊天。", + "module.notifier.joins/leaves.simple-notifications": "简化通知", + "module.notifier.joins/leaves.simple-notifications.description": "不带前缀显示加入/离开通知,以减少聊天杂乱。", + "module.no-ghost-blocks": "无幽灵方块", + "module.no-ghost-blocks.description": "尝试防止幽灵方块出现。", + "module.no-ghost-blocks.general.breaking": "破坏", + "module.no-ghost-blocks.general.breaking.description": "是否适用于方块破坏行为。", + "module.no-ghost-blocks.general.placing": "放置", + "module.no-ghost-blocks.general.placing.description": "是否适用于方块放置行为。", + "module.stash-finder": "储藏点寻找器", + "module.stash-finder.description": "搜索加载的区块中的存储方块。保存到<你的minecraft文件夹>/meteor-client", + "module.stash-finder.general.storage-blocks": "storage-blocks", + "module.stash-finder.general.storage-blocks.description": "选择要搜索的存储方块。", + "module.stash-finder.general.minimum-storage-count": "最小存储数量", + "module.stash-finder.general.minimum-storage-count.description": "一个区块中需要有的最小存储方块数量才能记录该区块。", + "module.stash-finder.general.minimum-distance": "最小距离", + "module.stash-finder.general.minimum-distance.description": "你必须离出生点多远才能记录某个区块。", + "module.stash-finder.general.notifications": "通知", + "module.stash-finder.general.notifications.description": "当发现新的储藏点时,发送Minecraft通知。", + "module.stash-finder.general.notification-mode": "通知模式", + "module.stash-finder.general.notification-mode.description": "通知使用的模式。", + "module.rotation": "旋转", + "module.rotation.description": "改变/锁定你的偏航和俯仰。", + "module.rotation.yaw.yaw-lock-mode": "偏航锁定模式", + "module.rotation.yaw.yaw-lock-mode.description": "锁定你的偏航的方式。", + "module.rotation.yaw.yaw-angle": "偏航角度", + "module.rotation.yaw.yaw-angle.description": "偏航角度,以度为单位。", + "module.rotation.pitch.pitch-lock-mode": "俯仰锁定模式", + "module.rotation.pitch.pitch-lock-mode.description": "锁定你的俯仰的方式。", + "module.rotation.pitch.pitch-angle": "俯仰角度", + "module.rotation.pitch.pitch-angle.description": "俯仰角度,以度为单位。", + "module.storage-esp": "容器透视", + "module.storage-esp.description": "渲染所有指定的存储方块。", + "module.storage-esp.general.mode": "模式", + "module.storage-esp.general.mode.description": "渲染模式。", + "module.storage-esp.general.storage-blocks": "存储容器", + "module.storage-esp.general.storage-blocks.description": "选择要显示的存储方块。", + "module.storage-esp.general.tracers": "追踪线", + "module.storage-esp.general.tracers.description": "绘制到存储方块的追踪线。", + "module.storage-esp.general.shape-mode": "形状模式", + "module.storage-esp.general.shape-mode.description": "形状的渲染方式.", + "module.storage-esp.general.fill-opacity": "填充不透明度", + "module.storage-esp.general.fill-opacity.description": "形状填充的不透明度。", + "module.storage-esp.general.width": "宽度", + "module.storage-esp.general.width.description": "着色器轮廓的宽度。", + "module.storage-esp.general.glow-multiplier": "发光倍数", + "module.storage-esp.general.glow-multiplier.description": "发光效果的倍数。", + "module.storage-esp.general.chest": "箱子", + "module.storage-esp.general.chest.description": "箱子的颜色。", + "module.storage-esp.general.trapped-chest": "陷阱箱", + "module.storage-esp.general.trapped-chest.description": "陷阱箱的颜色。", + "module.storage-esp.general.barrel": "桶", + "module.storage-esp.general.barrel.description": "桶的颜色。", + "module.storage-esp.general.shulker": "潜影盒", + "module.storage-esp.general.shulker.description": "潜影盒的颜色。", + "module.storage-esp.general.ender-chest": "末影箱", + "module.storage-esp.general.ender-chest.description": "末影箱的颜色。", + "module.storage-esp.general.other": "其他", + "module.storage-esp.general.other.description": "熔炉、发射器、投掷器和漏斗的颜色。", + "module.storage-esp.general.fade-distance": "淡出距离", + "module.storage-esp.general.fade-distance.description": "颜色将淡出的距离。", + "module.storage-esp.opened-rendering.hide-opened": "隐藏打开的", + "module.storage-esp.opened-rendering.hide-opened.description": "隐藏已打开的容器。", + "module.storage-esp.opened-rendering.opened-color": "打开的颜色", + "module.storage-esp.opened-rendering.opened-color.description": "可选设置,用于更改已打开箱子的颜色,而不是不渲染。在零不透明度时禁用。", + "module.auto-wasp.general.horizontal-speed": "水平速度", + "module.auto-wasp.general.horizontal-speed.description": "水平鞘翅速度。", + "module.auto-wasp.general.vertical-speed": "垂直速度", + "module.auto-wasp.general.vertical-speed.description": "垂直鞘翅速度。", + "module.auto-wasp.general.avoid-landing": "蜻蜓点水", + "module.auto-wasp.general.avoid-landing.description": "如果您的目标在地面上,将尝试避免着陆。", + "module.auto-wasp.general.predict-movement": "预测移动", + "module.auto-wasp.general.predict-movement.description": "尝试根据目标的移动预测目标位置。", + "module.auto-wasp.general.only-friends": "好人", + "module.auto-wasp.general.only-friends.description": "只会跟随朋友。", + "module.auto-wasp.general.action-on-target-loss": "丢失策略", + "module.auto-wasp.general.action-on-target-loss.description": "如果失去目标该怎么办。", + "module.auto-wasp.general.offset": "offset", + "module.auto-wasp.general.offset.description": "与目标之间的偏移量是多少。", + "module.middle-click-extra": "中键额外动作", + "module.middle-click-extra.description": "当你中键点击时,执行各种动作。", + "module.middle-click-extra.general.mode": "模式", + "module.middle-click-extra.general.mode.description": "当你中键点击时,使用哪种物品。", + "module.middle-click-extra.general.message": "消息", + "module.middle-click-extra.general.message.description": "当你把他们加为好友时,给玩家发送一条信息。", + "module.middle-click-extra.general.quick-swap": "快速切换", + "module.middle-click-extra.general.quick-swap.description": "允许你通过模拟快捷栏按键来使用你物品栏里的物品。可能会被反作弊检测。", + "module.middle-click-extra.general.swap-back": "切换回去", + "module.middle-click-extra.general.swap-back.description": "当你使用完一个物品时,切换回你原来的位置。", + "module.middle-click-extra.general.notify": "通知", + "module.middle-click-extra.general.notify.description": "当你在你的快捷栏里没有指定的物品时,通知你。", + "module.kill-aura": "杀戮光环", + "module.kill-aura.description": "攻击你周围的指定实体。", + "module.kill-aura.general.weapon": "武器", + "module.kill-aura.general.weapon.description": "只在手持指定的武器时攻击实体。", + "module.kill-aura.general.rotate": "旋转", + "module.kill-aura.general.rotate.description": "决定何时朝向目标旋转。", + "module.kill-aura.general.auto-switch": "自动切换", + "module.kill-aura.general.auto-switch.description": "攻击目标时切换到你选择的武器。", + "module.kill-aura.general.only-on-click": "仅点击", + "module.kill-aura.general.only-on-click.description": "只在按住左键时攻击。", + "module.kill-aura.general.only-on-look": "仅注视", + "module.kill-aura.general.only-on-look.description": "只在注视实体时攻击。", + "module.kill-aura.general.pause-baritone": "暂停巴音", + "module.kill-aura.general.pause-baritone.description": "暂时冻结巴音直到你攻击完实体。", + "module.kill-aura.general.shield-mode": "盾牌模式", + "module.kill-aura.general.shield-mode.description": "会尝试用斧头破坏目标的盾牌。", + "module.kill-aura.targeting.entities": "实体", + "module.kill-aura.targeting.entities.description": "要攻击的实体.", + "module.kill-aura.targeting.priority": "优先级", + "module.kill-aura.targeting.priority.description": "如何筛选范围内的目标。", + "module.kill-aura.targeting.max-targets": "最大目标", + "module.kill-aura.targeting.max-targets.description": "一次可以目标的实体数量。", + "module.kill-aura.targeting.range": "范围", + "module.kill-aura.targeting.range.description": "可以攻击实体的最大距离。", + "module.kill-aura.targeting.walls-range": "墙壁范围", + "module.kill-aura.targeting.walls-range.description": "可以穿墙攻击实体的最大距离。", + "module.kill-aura.targeting.mob-age-filter": "忽略幼体", + "module.kill-aura.targeting.mob-age-filter.description": "是否攻击实体的幼体变种。", + "module.kill-aura.targeting.ignore-named": "忽略命名", + "module.kill-aura.targeting.ignore-named.description": "是否攻击有名字的生物。", + "module.kill-aura.targeting.ignore-passive": "忽略被动", + "module.kill-aura.targeting.ignore-passive.description": "只在有时被动的生物攻击你时攻击它们。", + "module.kill-aura.targeting.ignore-tamed": "忽略驯服", + "module.kill-aura.targeting.ignore-tamed.description": "会避免攻击你驯服的生物。", + "module.kill-aura.timing.pause-on-lag": "卡顿时暂停", + "module.kill-aura.timing.pause-on-lag.description": "服务器卡顿时暂停。", + "module.kill-aura.timing.pause-on-use": "使用时暂停", + "module.kill-aura.timing.pause-on-use.description": "使用物品时不攻击。", + "module.kill-aura.timing.pause-on-ca": "暂停CA", + "module.kill-aura.timing.pause-on-ca.description": "CA放置时不攻击。", + "module.kill-aura.timing.tps-sync": "TPS同步", + "module.kill-aura.timing.tps-sync.description": "尝试将攻击延迟与服务器的TPS同步。", + "module.kill-aura.timing.custom-delay": "自定义延迟", + "module.kill-aura.timing.custom-delay.description": "使用自定义的延迟而不是原版的冷却。", + "module.kill-aura.timing.hit-delay": "攻击延迟", + "module.kill-aura.timing.hit-delay.description": "以刻为单位的攻击实体的速度。", + "module.kill-aura.timing.switch-delay": "切换延迟", + "module.kill-aura.timing.switch-delay.description": "切换快捷栏槽位后攻击实体前等待的刻数。", + "module.block-selection": "方块指标", + "module.block-selection.description": "修改你的方块选择的渲染方式。", + "module.block-selection.general.advanced": "轮廓", + "module.block-selection.general.advanced.description": "在不同类型的形状方块上显示更高级的轮廓。", + "module.block-selection.general.single-side": "优化渲染", + "module.block-selection.general.single-side.description": "只渲染你正在看的一面。", + "module.block-selection.general.shape-mode": "形状模式", + "module.block-selection.general.shape-mode.description": "形状的渲染方式.", + "module.block-selection.general.side-color": "侧面颜色", + "module.block-selection.general.side-color.description": "侧面的颜色。", + "module.block-selection.general.line-color": "线条颜色", + "module.block-selection.general.line-color.description": "线条的颜色。", + "module.block-selection.general.hide-when-inside-block.description": "当在目标方块内时隐藏选择。", + "module.better-chat": "更好的聊天", + "module.better-chat.description": "以各种方式改善你的聊天体验。", + "module.better-chat.general.annoy": "讨厌", + "module.better-chat.general.annoy.description": "让你的消息变得很烦人。", + "module.better-chat.general.fancy-chat": "花式聊天", + "module.better-chat.general.fancy-chat.description": "让你的消息变得很花哨!", + "module.better-chat.general.timestamps": "时间戳", + "module.better-chat.general.timestamps.description": "在聊天消息前添加客户端时间戳。", + "module.better-chat.general.player-heads": "玩家头像", + "module.better-chat.general.player-heads.description": "在玩家消息旁显示玩家头像。", + "module.better-chat.general.coords-protection": "坐标保护", + "module.better-chat.general.coords-protection.description": "防止你发送可能包含坐标的聊天消息。", + "module.better-chat.general.keep-history": "保留历史", + "module.better-chat.general.keep-history.description": "防止断开连接时清除聊天历史。", + "module.better-chat.filter.anti-spam": "反垃圾邮件", + "module.better-chat.filter.anti-spam.description": "阻止重复消息充斥聊天。", + "module.better-chat.filter.depth": "深度", + "module.better-chat.filter.depth.description": "要过滤的消息数量。", + "module.better-chat.filter.anti-clear": "反清除", + "module.better-chat.filter.anti-clear.description": "防止服务器清除聊天。", + "module.better-chat.filter.filter-regex": "正则过滤", + "module.better-chat.filter.filter-regex.description": "过滤掉与正则表达式匹配的聊天消息。", + "module.better-chat.filter.regex-filter": "正则过滤器", + "module.better-chat.filter.regex-filter.description": "用于过滤聊天消息的正则表达式过滤器。", + "module.better-chat.longer-chat.infinite-chat-box": "无限聊天框", + "module.better-chat.longer-chat.infinite-chat-box.description": "允许你输入无限长度的消息。", + "module.better-chat.longer-chat.longer-chat-history": "更长聊天历史", + "module.better-chat.longer-chat.longer-chat-history.description": "扩展聊天长度。", + "module.better-chat.longer-chat.extra-lines": "额外行数", + "module.better-chat.longer-chat.extra-lines.description": "额外聊天行数。", + "module.better-chat.prefix.prefix": "前缀", + "module.better-chat.prefix.prefix.description": "为你的聊天消息添加前缀。", + "module.better-chat.prefix.random": "随机", + "module.better-chat.prefix.random.description": "使用随机数作为你的前缀。", + "module.better-chat.prefix.text": "文本", + "module.better-chat.prefix.text.description": "作为前缀添加的文本。", + "module.better-chat.prefix.small-caps": "小型大写", + "module.better-chat.prefix.small-caps.description": "在前缀中使用小型大写字母。", + "module.better-chat.suffix.suffix": "后缀", + "module.better-chat.suffix.suffix.description": "为你的聊天消息添加后缀。", + "module.better-chat.suffix.random": "随机", + "module.better-chat.suffix.random.description": "使用随机数作为你的后缀。", + "module.better-chat.suffix.text": "文本", + "module.better-chat.suffix.text.description": "作为后缀添加的文本。", + "module.better-chat.suffix.small-caps": "小型大写", + "module.better-chat.suffix.small-caps.description": "在后缀中使用小型大写字母。", + "module.time-changer": "时间改变", + "module.time-changer.description": "让你能够设置自定义时间。", + "module.time-changer.general.time": "时间", + "module.time-changer.general.time.description": "要设置的自定义时间。", + "module.portals": "传送门", + "module.portals.description": "允许你在下界传送门里正常使用GUI。", + "module.sneak": "潜行", + "module.sneak.description": "一直潜行。", + "module.sneak.general.mode": "模式", + "module.sneak.general.mode.description": "潜行的方法。", + "module.auto-mount": "自动上马", + "module.auto-mount.description": "自动帮你骑上实体", + "module.auto-mount.general.check-saddle": "马鞍检测", + "module.auto-mount.general.check-saddle.description": "在上马前检测马有没有马鞍", + "module.auto-mount.general.rotate": "转头", + "module.auto-mount.general.rotate.description": "自动面向你骑上的实体。", + "module.auto-mount.general.entities": "实体", + "module.auto-mount.general.entities.description": "将会自动骑上去的实体", + "module.swarm": "远程控制", + "module.swarm.description": "让你从一个中心主机控制多个Meteor实例。", + "module.swarm.general.mode": "模式", + "module.swarm.general.mode.description": "要运行的客户端的类型。", + "module.swarm.general.ip.description": "主机服务器的IP地址。", + "module.swarm.general.port": "端口", + "module.swarm.general.port.description": "用于连接的端口。", + "module.bed-aura": "床光环", + "module.bed-aura.description": "在下界和末地自动放置和引爆床.", + "module.bed-aura.general.delay": "延迟", + "module.bed-aura.general.delay.description": "放置床之间的刻延迟.", + "module.bed-aura.general.strict-direction": "严格方向", + "module.bed-aura.general.strict-direction.description": "只在你面对的方向放置床.", + "module.bed-aura.targeting.target-range": "目标范围", + "module.bed-aura.targeting.target-range.description": "玩家可以被目标的范围.", + "module.bed-aura.targeting.target-priority": "目标优先级", + "module.bed-aura.targeting.target-priority.description": "如何筛选范围内的目标。", + "module.bed-aura.targeting.min-damage": "最小伤害", + "module.bed-aura.targeting.min-damage.description": "对你的目标造成的最小伤害.", + "module.bed-aura.targeting.max-self-damage": "最大自伤", + "module.bed-aura.targeting.max-self-damage.description": "对你自己造成的最大伤害.", + "module.bed-aura.targeting.anti-suicide": "防止自杀", + "module.bed-aura.targeting.anti-suicide.description": "如果会杀死你,就不会放置和炸掉床.", + "module.bed-aura.inventory.auto-move": "自动移动", + "module.bed-aura.inventory.auto-move.description": "将床移动到一个选定的物品栏槽.", + "module.bed-aura.inventory.auto-move-slot": "自动移动槽", + "module.bed-aura.inventory.auto-move-slot.description": "自动移动将床移动到的槽.", + "module.bed-aura.inventory.auto-switch": "自动切换", + "module.bed-aura.inventory.auto-switch.description": "自动切换到和离开床.", + "module.bed-aura.pause.pause-on-eat": "吃东西时暂停", + "module.bed-aura.pause.pause-on-eat.description": "吃东西时暂停.", + "module.bed-aura.pause.pause-on-drink": "喝药水时暂停", + "module.bed-aura.pause.pause-on-drink.description": "喝药水时暂停.", + "module.bed-aura.pause.pause-on-mine": "挖掘方块时暂停", + "module.bed-aura.pause.pause-on-mine.description": "挖掘方块时暂停.", + "module.bed-aura.render.swing": "摇摆", + "module.bed-aura.render.swing.description": "是否在客户端挥动手.", + "module.bed-aura.render.render": "渲染", + "module.bed-aura.render.render.description": "渲染放置床的方块.", + "module.bed-aura.render.shape-mode": "形状模式", + "module.bed-aura.render.shape-mode.description": "形状的渲染方式.", + "module.bed-aura.render.side-color": "侧面颜色", + "module.bed-aura.render.side-color.description": "要放置的位置的侧颜色.", + "module.bed-aura.render.line-color": "线条颜色", + "module.bed-aura.render.line-color.description": "要放置的位置的线颜色.", + "module.anti-void": "反虚空", + "module.anti-void.description": "试图防止你跌入虚空。", + "module.anti-void.general.mode": "模式", + "module.anti-void.general.mode.description": "防止你掉落到虚空的方法。", + "module.auto-respawn": "自动重生", + "module.auto-respawn.description": "当你满目疮痍时自动帮你开下一把", + "module.auto-log": "自动下线", + "module.auto-log.description": "满足条件时自动下线", + "module.auto-log.general.health": "生命值", + "module.auto-log.general.health.description": "当生命值低于或等于此值时,自动断开连接。", + "module.auto-log.general.predict-incoming-damage": "伤害预判", + "module.auto-log.general.predict-incoming-damage.description": "当检测到即将承受的伤害足以使生命值低于设定阈值时,自动断开连接", + "module.auto-log.general.totem-pops": "不死图腾限制", + "module.auto-log.general.totem-pops.description": "当使用次数大于或等于设定值时自动断开连接(0 为禁用)", + "module.auto-log.general.only-trusted": "社恐模式", + "module.auto-log.general.only-trusted.description": "当非好友的玩家出现在附近时自动断开连接", + "module.auto-log.general.32k": "32K", + "module.auto-log.general.32k.description": "当拿着32k武器的玩家在你旁边时自动下线", + "module.auto-log.general.smart-toggle": "智能开关", + "module.auto-log.general.smart-toggle.description": "因为低血量自动退出时自动禁用它 会在生命达到阈值时自动开启", + "module.auto-log.general.toggle-off": "自动禁用", + "module.auto-log.general.toggle-off.description": "自动断开连接后禁用此模块", + "module.auto-log.general.toggle-auto-reconnect": "自动重连", + "module.auto-log.general.toggle-auto-reconnect.description": "自动断开连接后,自动重新连接并禁用此模块", + "module.auto-log.entities.entities": "实体", + "module.auto-log.entities.entities.description": "当指定实体存在于指定范围内时断开连接。", + "module.auto-log.entities.use-total-count": "使用总数模式", + "module.auto-log.entities.use-total-count.description": "切换计算所有选定实体或每个实体的总数。", + "module.auto-log.entities.combined-entity-threshold": "实体组合阈值", + "module.auto-log.entities.combined-entity-threshold.description": "断线之前必须靠近您的单个实体的最小数量。", + "module.auto-log.entities.individual-entity-threshold": "实体阈值", + "module.auto-log.entities.individual-entity-threshold.description": "断线之前必须靠近您的单个实体的最小数量。", + "module.auto-log.entities.range": "半径", + "module.auto-log.entities.range.description": "在您断开连接之前,实体必须与您有多近。", + "module.highway-builder": "高速公路建造者", + "module.highway-builder.description": "自动建造高速公路。", + "module.highway-builder.general.width": "宽度", + "module.highway-builder.general.width.description": "高速公路的宽度。", + "module.highway-builder.general.height": "高度", + "module.highway-builder.general.height.description": "高速公路的高度。", + "module.highway-builder.general.floor": "地板", + "module.highway-builder.general.floor.description": "使用哪种楼层放置模式。", + "module.highway-builder.general.railings": "栏杆", + "module.highway-builder.general.railings.description": "在高速公路旁建造栏杆。", + "module.highway-builder.general.mine-above-railings": "在栏杆上挖矿", + "module.highway-builder.general.mine-above-railings.description": "挖掘栏杆上方的方块。", + "module.highway-builder.general.rotation": "旋转", + "module.highway-builder.general.rotation.description": "旋转模式。", + "module.highway-builder.general.disconnect-on-toggle": "切换时断开连接", + "module.highway-builder.general.disconnect-on-toggle.description": "当模块关闭时自动断开连接,例如当没有足够的方块时。", + "module.highway-builder.general.pause-on-lag": "卡顿时暂停", + "module.highway-builder.general.pause-on-lag.description": "当服务器停止响应时,暂停当前过程。", + "module.highway-builder.digging.dont-break-tools": "不损坏工具", + "module.highway-builder.digging.dont-break-tools.description": "不损坏工具。", + "module.highway-builder.digging.save-pickaxes": "保存镐子", + "module.highway-builder.digging.break-delay": "破坏延迟", + "module.highway-builder.digging.break-delay.description": "破坏方块之间的延迟。", + "module.highway-builder.digging.blocks-per-tick": "每刻放置", + "module.highway-builder.digging.blocks-per-tick.description": "每个刻中最多可以挖掘的方块数量。仅适用于可以立即破坏的方块。", + "module.highway-builder.paving.blocks-to-place": "可放置方块", + "module.highway-builder.paving.blocks-to-place.description": "允许放置的方块。", + "module.highway-builder.paving.place-delay": "放置延迟", + "module.highway-builder.paving.place-delay.description": "放置方块之间的延迟。", + "module.highway-builder.paving.placements-per-tick": "每个刻放置方块数", + "module.highway-builder.paving.placements-per-tick.description": "每个刻中最多可以放置的方块数量。", + "module.highway-builder.inventory.trash-items": "垃圾物品", + "module.highway-builder.inventory.trash-items.description": "被认为是垃圾的物品,可以丢弃。", + "module.highway-builder.inventory.mine-ender-chests": "挖掘末影箱", + "module.highway-builder.inventory.mine-ender-chests.description": "挖掘末影箱以获得黑曜石。", + "module.highway-builder.inventory.save-ender-chests": "保存末影箱", + "module.highway-builder.inventory.instantly-rebreak-echests": "即时重破末影箱", + "module.highway-builder.inventory.instantly-rebreak-echests.description": "是否使用即时重破漏洞来打破末影箱。", + "module.highway-builder.inventory.rebreak-delay": "重破延迟", + "module.highway-builder.inventory.rebreak-delay.description": "重破尝试之间的延迟。", + "module.highway-builder.render-digging.render-blocks-to-mine": "渲染待挖方块", + "module.highway-builder.render-digging.render-blocks-to-mine.description": "渲染待挖掘的方块。", + "module.highway-builder.render-digging.blocks-to-mine-shape-mode": "待挖方块的渲染模式", + "module.highway-builder.render-digging.blocks-to-mine-shape-mode.description": "待挖掘方块的渲染方式。", + "module.highway-builder.render-digging.blocks-to-mine-side-color": "待挖方块的侧面颜色", + "module.highway-builder.render-digging.blocks-to-mine-side-color.description": "待挖掘方块的颜色。", + "module.highway-builder.render-digging.blocks-to-mine-line-color": "待挖方块的线条颜色", + "module.highway-builder.render-digging.blocks-to-mine-line-color.description": "待挖掘方块的颜色。", + "module.highway-builder.render-paving.render-blocks-to-place": "渲染待放置方块", + "module.highway-builder.render-paving.render-blocks-to-place.description": "渲染待放置的方块。", + "module.highway-builder.render-paving.blocks-to-place-shape-mode": "待放置方块的渲染模式", + "module.highway-builder.render-paving.blocks-to-place-shape-mode.description": "待放置方块的渲染方式。", + "module.highway-builder.render-paving.blocks-to-place-side-color": "待放置方块的侧面颜色", + "module.highway-builder.render-paving.blocks-to-place-side-color.description": "待放置方块的颜色。", + "module.highway-builder.render-paving.blocks-to-place-line-color": "待放置方块的线条颜色", + "module.highway-builder.render-paving.blocks-to-place-line-color.description": "待放置方块的颜色。", + "module.no-interact": "无交互", + "module.no-interact.description": "阻止你与某些类型的输入交互。", + "module.no-interact.blocks.block-mine": "方块挖掘", + "module.no-interact.blocks.block-mine.description": "取消方块挖掘。", + "module.no-interact.blocks.block-mine-mode": "方块挖掘模式", + "module.no-interact.blocks.block-mine-mode.description": "方块挖掘的列表模式。", + "module.no-interact.blocks.block-interact": "方块交互", + "module.no-interact.blocks.block-interact.description": "取消方块交互。", + "module.no-interact.blocks.block-interact-mode": "方块交互模式", + "module.no-interact.blocks.block-interact-mode.description": "方块交互的列表模式。", + "module.no-interact.blocks.block-interact-hand": "方块交互手", + "module.no-interact.blocks.block-interact-hand.description": "如果是这只手,取消方块交互。", + "module.no-interact.entities.entity-hit": "实体攻击", + "module.no-interact.entities.entity-hit.description": "取消实体攻击。", + "module.no-interact.entities.entity-hit-mode": "实体攻击模式", + "module.no-interact.entities.entity-hit-mode.description": "实体攻击的列表模式。", + "module.no-interact.entities.entity-interact": "实体交互", + "module.no-interact.entities.entity-interact.description": "取消实体交互。", + "module.no-interact.entities.entity-interact-mode": "实体交互模式", + "module.no-interact.entities.entity-interact-mode.description": "实体交互的列表模式。", + "module.no-interact.entities.entity-interact-hand": "实体交互手", + "module.no-interact.entities.entity-interact-hand.description": "如果是这只手,取消实体交互。", + "module.no-interact.entities.friends": "朋友", + "module.no-interact.entities.friends.description": "好友取消模式。", + "module.no-interact.entities.babies": "幼体", + "module.no-interact.entities.babies.description": "婴儿实体取消模式。", + "module.no-interact.entities.nametagged": "命名", + "module.no-interact.entities.nametagged.description": "命名实体取消模式。", + "module.crystal-aura": "水晶光环", + "module.crystal-aura.description": "自动放置和攻击水晶。", + "module.crystal-aura.general.target-range": "目标范围", + "module.crystal-aura.general.target-range.description": "目标玩家的范围。", + "module.crystal-aura.general.predict-movement": "预测移动", + "module.crystal-aura.general.predict-movement.description": "预测目标的移动。", + "module.crystal-aura.general.min-damage": "最小伤害", + "module.crystal-aura.general.min-damage.description": "如果地形可以被末影水晶炸毁,就完全忽略它。", + "module.crystal-aura.general.max-damage": "最小伤害", + "module.crystal-aura.general.max-damage.description": "水晶对目标造成的最小伤害。", + "module.crystal-aura.general.anti-suicide": "防止自杀", + "module.crystal-aura.general.anti-suicide.description": "水晶对自己造成的最大伤害。", + "module.crystal-aura.general.ignore-nakeds": "防自杀", + "module.crystal-aura.general.ignore-nakeds.description": "如果水晶会杀死你,就不会放置和破坏水晶。", + "module.crystal-aura.general.rotate": "旋转", + "module.crystal-aura.general.rotate.description": "忽略没有物品的玩家。", + "module.crystal-aura.general.yaw-steps-mode": "旋转", + "module.crystal-aura.general.yaw-steps-mode.description": "服务器端旋转到被击中/放置的水晶的方向。", + "module.crystal-aura.general.yaw-steps": "偏航步骤模式", + "module.crystal-aura.general.yaw-steps.description": "何时运行偏航步骤检查。", + "module.crystal-aura.general.entities": "实体", + "module.crystal-aura.general.entities.description": "要攻击的实体.", + "module.crystal-aura.switch.auto-switch": "自动切换", + "module.crystal-aura.switch.auto-switch.description": "在找到目标后切换到热键栏中的水晶。", + "module.crystal-aura.switch.switch-delay": "切换延迟", + "module.crystal-aura.switch.switch-delay.description": "切换热键槽后等待破坏水晶的刻度延迟。", + "module.crystal-aura.switch.no-gap-switch": "无间隙切换", + "module.crystal-aura.switch.no-gap-switch.description": "如果你拿着金苹果,就不会自动切换。", + "module.crystal-aura.switch.no-bow-switch": "无弓切换", + "module.crystal-aura.switch.no-bow-switch.description": "如果你拿着弓,就不会自动切换。", + "module.crystal-aura.switch.anti-weakness": "防虚弱", + "module.crystal-aura.switch.anti-weakness.description": "切换到工具,以便在有虚弱效果时可以破坏水晶。", + "module.crystal-aura.place.place": "放置", + "module.crystal-aura.place.place.description": "是否应该放置水晶。", + "module.crystal-aura.place.place-delay": "放置延迟", + "module.crystal-aura.place.place-delay.description": "水晶爆炸后等待放置水晶的刻度延迟。", + "module.crystal-aura.place.place-range": "放置范围", + "module.crystal-aura.place.place-range.description": "放置水晶的范围。", + "module.crystal-aura.place.walls-range": "墙壁范围", + "module.crystal-aura.place.walls-range.description": "在方块后面放置水晶的范围。", + "module.crystal-aura.place.1-12-placement": "1.12放置", + "module.crystal-aura.place.1-12-placement.description": "使用1.12的水晶放置。", + "module.crystal-aura.place.support": "支持", + "module.crystal-aura.place.support.description": "如果没有找到其他位置,就在空中放置一个支持方块。", + "module.crystal-aura.place.support-delay": "支持延迟", + "module.crystal-aura.place.support-delay.description": "放置支持方块后的刻度延迟。", + "module.crystal-aura.face-place.face-place": "面向放置", + "module.crystal-aura.face-place.face-place.description": "当目标低于一定的生命值或护甲耐久度阈值时,会面向放置。", + "module.crystal-aura.face-place.face-place-health": "面向放置生命值", + "module.crystal-aura.face-place.face-place-health.description": "目标的生命值必须低于多少才能开始面向放置。", + "module.crystal-aura.face-place.face-place-durability": "面向放置耐久度", + "module.crystal-aura.face-place.face-place-durability.description": "能够面向放置的耐久度阈值百分比。", + "module.crystal-aura.face-place.face-place-missing-armor": "面向放置缺少护甲", + "module.crystal-aura.face-place.face-place-missing-armor.description": "当目标缺少一件护甲时,自动开始面向放置。", + "module.crystal-aura.face-place.force-face-place": "强制面向放置", + "module.crystal-aura.face-place.force-face-place.description": "按下这个按钮时开始面向放置。", + "module.crystal-aura.break.break": "破坏", + "module.crystal-aura.break.break.description": "是否应该破坏水晶。", + "module.crystal-aura.break.break-delay": "破坏延迟", + "module.crystal-aura.break.break-delay.description": "放置水晶后等待破坏水晶的刻度延迟。", + "module.crystal-aura.break.smart-delay": "智能延迟", + "module.crystal-aura.break.smart-delay.description": "只有当目标可以受到伤害时才破坏水晶。", + "module.crystal-aura.break.break-range": "破坏范围", + "module.crystal-aura.break.break-range.description": "破坏水晶的范围。", + "module.crystal-aura.break.walls-range": "墙壁范围", + "module.crystal-aura.break.walls-range.description": "在方块后面破坏水晶的范围。", + "module.crystal-aura.break.only-own": "只破坏自己的", + "module.crystal-aura.break.only-own.description": "只破坏自己的水晶。", + "module.crystal-aura.break.break-attempts": "破坏尝试", + "module.crystal-aura.break.break-attempts.description": "在停止目标之前,可以击中一个水晶的次数。", + "module.crystal-aura.break.ticks-existed": "存在刻度", + "module.crystal-aura.break.ticks-existed.description": "水晶需要存活的刻度数量,才能被水晶光环攻击。", + "module.crystal-aura.break.attack-frequency": "攻击频率", + "module.crystal-aura.break.attack-frequency.description": "每秒可以做的最大击打次数。", + "module.crystal-aura.break.fast-break": "快速破坏", + "module.crystal-aura.break.fast-break.description": "忽略破坏延迟,尽量在水晶出现在世界中时就破坏它。", + "module.crystal-aura.pause.pause-on-use": "使用时暂停", + "module.crystal-aura.pause.pause-on-use.description": "使用物品时应该暂停的过程。", + "module.crystal-aura.pause.pause-on-mine": "挖掘方块时暂停", + "module.crystal-aura.pause.pause-on-mine.description": "挖掘方块时应该暂停的过程。", + "module.crystal-aura.pause.pause-on-lag": "卡顿时暂停", + "module.crystal-aura.pause.pause-on-lag.description": "服务器没有响应时是否暂停。", + "module.crystal-aura.pause.pause-modules": "暂停模块", + "module.crystal-aura.pause.pause-modules.description": "当选中的任何模块激活时暂停。", + "module.crystal-aura.pause.pause-health": "暂停生命值", + "module.crystal-aura.pause.pause-health.description": "当你的生命值低于一定值时暂停。", + "module.crystal-aura.render.swing-mode": "挥动模式", + "module.crystal-aura.render.swing-mode.description": "放置时如何挥动。", + "module.crystal-aura.render.render-mode": "渲染模式", + "module.crystal-aura.render.render-mode.description": "渲染的模式。", + "module.crystal-aura.render.render-place": "渲染放置", + "module.crystal-aura.render.render-place.description": "在水晶放置的方块上渲染一个方块覆盖。", + "module.crystal-aura.render.place-time": "放置时间", + "module.crystal-aura.render.place-time.description": "渲染放置的时间。", + "module.crystal-aura.render.render-break": "渲染破坏", + "module.crystal-aura.render.render-break.description": "在水晶破坏的方块上渲染一个方块覆盖。", + "module.crystal-aura.render.break-time": "破坏时间", + "module.crystal-aura.render.break-time.description": "渲染破坏的时间。", + "module.crystal-aura.render.smoothness": "平滑度", + "module.crystal-aura.render.smoothness.description": "渲染应该如何平滑地移动。", + "module.crystal-aura.render.height": "高度", + "module.crystal-aura.render.height.description": "渐变的高度。", + "module.crystal-aura.render.render-time": "渲染时间", + "module.crystal-aura.render.render-time.description": "渲染放置的时间。", + "module.crystal-aura.render.shape-mode": "形状模式", + "module.crystal-aura.render.shape-mode.description": "形状的渲染方式.", + "module.crystal-aura.render.side-color": "侧面颜色", + "module.crystal-aura.render.side-color.description": "方块覆盖的侧面颜色。", + "module.crystal-aura.render.line-color": "线条颜色", + "module.crystal-aura.render.line-color.description": "方块覆盖的线条颜色。", + "module.crystal-aura.render.damage": "damage", + "module.crystal-aura.render.damage.description": "在方块覆盖中渲染水晶伤害文本。", + "module.crystal-aura.render.damage-color": "伤害颜色", + "module.crystal-aura.render.damage-color.description": "伤害文本的颜色。", + "module.crystal-aura.render.damage-scale": "伤害比例", + "module.crystal-aura.render.damage-scale.description": "伤害文本的大小。", + "module.self-trap": "自我困住", + "module.self-trap.description": "在你头上放置方块.", + "module.self-trap.general.whitelist": "白名单", + "module.self-trap.general.whitelist.description": "要使用的方块。", + "module.self-trap.general.top-mode": "上半部模式", + "module.self-trap.general.top-mode.description": "要在你上半身放置的位置.", + "module.self-trap.general.bottom-mode": "下半部模式", + "module.self-trap.general.bottom-mode.description": "要在你下半身放置的位置.", + "module.self-trap.general.place-delay": "放置延迟", + "module.self-trap.general.place-delay.description": "放置方块之间的延迟,以刻为单位。", + "module.self-trap.general.center": "居中", + "module.self-trap.general.center.description": "放置前将你居中到你站的方块上.", + "module.self-trap.general.turn-off": "关闭", + "module.self-trap.general.turn-off.description": "放置后关闭.", + "module.self-trap.general.rotate": "旋转", + "module.self-trap.general.rotate.description": "放置时向服务器发送旋转数据包.", + "module.self-trap.render.render": "渲染", + "module.self-trap.render.render.description": "渲染一个方块覆盖在要放置的方块上.", + "module.self-trap.render.shape-mode": "形状模式", + "module.self-trap.render.shape-mode.description": "形状的渲染方式.", + "module.self-trap.render.side-color": "侧面颜色", + "module.self-trap.render.side-color.description": "要渲染的方块的侧颜色.", + "module.self-trap.render.line-color": "线条颜色", + "module.self-trap.render.line-color.description": "要渲染的方块的线颜色.", + "module.anti-bed": "反床", + "module.anti-bed.description": "放置丝线以防止床被放置在您身上。", + "module.anti-bed.general.place-string-top": "在头上放置", + "module.anti-bed.general.place-string-top.description": "在您上方放置字符串。", + "module.anti-bed.general.place-string-middle": "在中间放置", + "module.anti-bed.general.place-string-middle.description": "将字符串放在您的上方碰撞箱中。", + "module.anti-bed.general.place-string-bottom": "在脚上放置", + "module.anti-bed.general.place-string-bottom.description": "将线条放在你的脚上。", + "module.anti-bed.general.only-in-hole": "仅在坑中", + "module.anti-bed.general.only-in-hole.description": "仅当你被黑曜石环绕时才能起作用。", + "module.boss-stack": "更好的boss条", + "module.boss-stack.description": "堆叠boss条,使你的HUD更清爽。", + "module.boss-stack.general.stack.description": "堆叠boss条并在文本中添加一个计数器。", + "module.boss-stack.general.hide-name": "隐藏名字", + "module.boss-stack.general.hide-name.description": "隐藏boss条的名字。", + "module.boss-stack.general.bar-spacing.description": "每个boss条之间的间距减少。", + "module.elytra-fly": "鞘翅飞行", + "module.elytra-fly.description": "让你对鞘翅有更多的控制。", + "module.elytra-fly.general.mode": "模式", + "module.elytra-fly.general.mode.description": "飞行的模式。", + "module.elytra-fly.general.auto-take-off": "自动起飞", + "module.elytra-fly.general.auto-take-off.description": "当你按住跳跃键时,自动起飞,无需双跳。", + "module.elytra-fly.general.fall-multiplier": "下降倍数", + "module.elytra-fly.general.fall-multiplier.description": "控制你自然下降的速度。", + "module.elytra-fly.general.horizontal-speed": "水平速度", + "module.elytra-fly.general.horizontal-speed.description": "你前后移动的速度。", + "module.elytra-fly.general.vertical-speed": "垂直速度", + "module.elytra-fly.general.vertical-speed.description": "你上下移动的速度。", + "module.elytra-fly.general.acceleration": "加速", + "module.elytra-fly.general.acceleration-step": "加速步长", + "module.elytra-fly.general.acceleration-start": "加速开始", + "module.elytra-fly.general.stop-in-water": "在水中停止", + "module.elytra-fly.general.stop-in-water.description": "在水中停止飞行。", + "module.elytra-fly.general.no-unloaded-chunks": "无未加载区块", + "module.elytra-fly.general.no-unloaded-chunks.description": "阻止你进入未加载的区块。", + "module.elytra-fly.general.auto-hover": "自动悬停", + "module.elytra-fly.general.auto-hover.description": "当你按住shift时,自动悬停在地面上0.3方块的高度。", + "module.elytra-fly.general.no-crash": "无撞车", + "module.elytra-fly.general.no-crash.description": "阻止你撞到墙壁。", + "module.elytra-fly.general.crash-look-ahead": "撞车预测", + "module.elytra-fly.general.crash-look-ahead.description": "飞行时向前看的距离。", + "module.elytra-fly.general.insta-drop": "瞬间下降", + "module.elytra-fly.general.insta-drop.description": "让你立刻退出飞行。", + "module.elytra-fly.general.pitch40-lower-bounds": "pitch40-下界界限", + "module.elytra-fly.general.pitch40-lower-bounds.description": "pitch40的下界界限。", + "module.elytra-fly.general.pitch40-upper-bounds": "pitch40-上界界限", + "module.elytra-fly.general.pitch40-upper-bounds.description": "pitch40的上界界限。", + "module.elytra-fly.general.pitch40-rotate-speed": "pitch40-旋转速度", + "module.elytra-fly.general.pitch40-rotate-speed.description": "pitch旋转的速度(每刻的角度)。", + "module.elytra-fly.general.auto-jump": "自动跳跃", + "module.elytra-fly.general.auto-jump.description": "自动为你跳跃。", + "module.elytra-fly.general.yaw-lock": "偏航锁定", + "module.elytra-fly.general.yaw-lock.description": "是否启用偏航锁定。", + "module.elytra-fly.general.yaw": "偏航", + "module.elytra-fly.general.yaw.description": "使用简单旋转锁定的弹跳模式时,要看的偏航角。", + "module.elytra-fly.general.pitch": "俯仰角", + "module.elytra-fly.general.pitch.description": "使用弹跳模式时,要看的俯仰角。", + "module.elytra-fly.general.restart": "重启", + "module.elytra-fly.general.restart.description": "当橡皮筋时,重启鞘翅飞行。", + "module.elytra-fly.general.restart-delay": "重启延迟", + "module.elytra-fly.general.restart-delay.description": "橡皮筋后再次重启鞘翅的等待刻数。", + "module.elytra-fly.inventory.elytra-replace": "鞘翅替换", + "module.elytra-fly.inventory.elytra-replace.description": "用新的鞘翅替换破损的鞘翅。", + "module.elytra-fly.inventory.replace-durability": "替换耐久度", + "module.elytra-fly.inventory.replace-durability.description": "你的鞘翅会在这个耐久度时被替换。", + "module.elytra-fly.inventory.chest-swap": "胸甲切换", + "module.elytra-fly.inventory.chest-swap.description": "在切换这个模块时,启用胸甲切换。", + "module.elytra-fly.inventory.replenish-fireworks": "补充烟花", + "module.elytra-fly.inventory.replenish-fireworks.description": "把烟花移动到一个选定的快捷栏位置。", + "module.elytra-fly.inventory.replenish-slot": "补充位置", + "module.elytra-fly.inventory.replenish-slot.description": "自动移动把烟花移动到的位置。", + "module.elytra-fly.autopilot.auto-pilot": "自动驾驶", + "module.elytra-fly.autopilot.auto-pilot.description": "鞘翅飞行时向前移动。", + "module.elytra-fly.autopilot.use-fireworks": "使用烟花", + "module.elytra-fly.autopilot.use-fireworks.description": "每隔你选择的秒数使用一次烟花。", + "module.elytra-fly.autopilot.firework-delay": "烟花延迟", + "module.elytra-fly.autopilot.firework-delay.description": "如果 \"Use Fireworks\" 启用,使用烟花之间的延迟秒数。", + "module.elytra-fly.autopilot.minimum-height": "最小高度", + "module.elytra-fly.autopilot.minimum-height.description": "自动驾驶的最小高度。", + "module.nuker": "核爆", + "module.nuker.description": "破坏你周围的方块。", + "module.nuker.general.shape": "形状", + "module.nuker.general.shape.description": "核爆算法的形状。", + "module.nuker.general.mode": "模式", + "module.nuker.general.mode.description": "破坏方块的方式。", + "module.nuker.general.range": "范围", + "module.nuker.general.range.description": "破坏范围。", + "module.nuker.general.up": "上", + "module.nuker.general.up.description": "破坏范围。", + "module.nuker.general.down": "下", + "module.nuker.general.down.description": "破坏范围。", + "module.nuker.general.left": "左", + "module.nuker.general.left.description": "破坏范围。", + "module.nuker.general.right": "右", + "module.nuker.general.right.description": "破坏范围。", + "module.nuker.general.forward": "前", + "module.nuker.general.forward.description": "破坏范围。", + "module.nuker.general.back": "后", + "module.nuker.general.back.description": "破坏范围。", + "module.nuker.general.delay": "延迟", + "module.nuker.general.delay.description": "破坏方块之间的延迟,以刻为单位。", + "module.nuker.general.max-blocks-per-tick": "每刻最大放置方块数", + "module.nuker.general.max-blocks-per-tick.description": "每刻尝试破坏的最大方块数。在瞬间挖掘时有用。", + "module.nuker.general.sort-mode": "排序模式", + "module.nuker.general.sort-mode.description": "你想要先挖掘的方块。", + "module.nuker.general.swing-hand": "挥动手", + "module.nuker.general.swing-hand.description": "客户端挥动手臂。", + "module.nuker.general.packet-mine": "渲染方块", + "module.nuker.general.packet-mine.description": "尝试一次性瞬间挖掘所有方块。", + "module.nuker.general.rotate": "旋转", + "module.nuker.general.rotate.description": "服务器端旋转到被挖掘的方块。", + "module.nuker.whitelist.list-mode": "列表模式", + "module.nuker.whitelist.list-mode.description": "选择模式。", + "module.nuker.whitelist.blacklist": "黑名单", + "module.nuker.whitelist.blacklist.description": "你不想挖掘的方块。", + "module.nuker.whitelist.whitelist": "白名单", + "module.nuker.whitelist.whitelist.description": "你想挖掘的方块。", + "module.nuker.render.bounding-box": "包围盒", + "module.nuker.render.bounding-box.description": "为立方体和均匀立方体启用包围盒渲染。", + "module.nuker.render.nuke-box-mode": "核爆盒模式", + "module.nuker.render.nuke-box-mode.description": "包围盒的形状渲染方式。", + "module.nuker.render.side-color": "侧面颜色", + "module.nuker.render.side-color.description": "目标方块渲染的侧面颜色。", + "module.nuker.render.line-color": "线条颜色", + "module.nuker.render.line-color.description": "目标方块渲染的线条颜色。", + "module.nuker.render.broken-blocks": "破坏的方块", + "module.nuker.render.broken-blocks.description": "为立方体和均匀立方体启用包围盒渲染。", + "module.nuker.render.nuke-block-mode": "核爆方块模式", + "module.nuker.render.nuke-block-mode.description": "破坏的方块的形状渲染方式。", + "module.trail": "拖尾", + "module.trail.description": "在你的玩家后面渲染一个可自定义的拖尾。", + "module.trail.general.particles": "粒子", + "module.trail.general.particles.description": "要绘制的粒子。", + "module.trail.general.pause-when-stationary": "静止时暂停", + "module.trail.general.pause-when-stationary.description": "当你不移动时是否添加粒子。", + "module.break-indicators": "破坏进度条", + "module.break-indicators.description": "渲染一个方块被破坏的进度。", + "module.break-indicators.general.shape-mode": "形状模式", + "module.break-indicators.general.shape-mode.description": "形状的渲染方式.", + "module.break-indicators.general.packet-mine": "渲染方块", + "module.break-indicators.general.packet-mine.description": "是否渲染正在被数据包挖掘的方块。", + "module.break-indicators.general.start-color": "为破坏的方块的颜色", + "module.break-indicators.general.start-color.description": "未破坏方块的颜色。", + "module.break-indicators.general.end-color": "结束破坏方块的颜色", + "module.break-indicators.general.end-color.description": "完全破坏方块的颜色。", + "module.trident-boost": "三叉戟提升", + "module.trident-boost.description": "使用三叉戟的激流时提升你。", + "module.trident-boost.general.boost": "提升", + "module.trident-boost.general.boost.description": "使用激流时你的速度乘以多少。", + "module.trident-boost.general.out-of-water": "离水", + "module.trident-boost.general.out-of-water.description": "是否让激流在水外也能工作", + "module.pop-chams": "图腾幽灵", + "module.pop-chams.description": "在玩家爆图腾的地方渲染幽灵。", + "module.pop-chams.general.only-one": "仅一", + "module.pop-chams.general.only-one.description": "每个玩家只允许一个幽灵。", + "module.pop-chams.general.render-time": "渲染时间", + "module.pop-chams.general.render-time.description": "以秒为单位的幽灵渲染时间。", + "module.pop-chams.general.y-modifier": "y-修正", + "module.pop-chams.general.y-modifier.description": "幽灵的Y轴位置每秒改变的量。", + "module.pop-chams.general.scale-modifier": "比例-修正", + "module.pop-chams.general.scale-modifier.description": "幽灵的比例每秒改变的量。", + "module.pop-chams.general.fade-out": "淡出", + "module.pop-chams.general.fade-out.description": "淡出颜色。", + "module.pop-chams.general.shape-mode": "形状模式", + "module.pop-chams.general.shape-mode.description": "形状的渲染方式.", + "module.pop-chams.general.side-color": "侧面颜色", + "module.pop-chams.general.side-color.description": "侧面的颜色。", + "module.pop-chams.general.line-color": "线条颜色", + "module.pop-chams.general.line-color.description": "线条的颜色。", + "module.elytra-boost": "鞘翅助推", + "module.elytra-boost.description": "增强你的鞘翅,就像你使用了烟花一样。", + "module.elytra-boost.general.anti-consume": "反消耗", + "module.elytra-boost.general.anti-consume.description": "在使用鞘翅助推时防止烟花被消耗。", + "module.elytra-boost.general.firework-duration": "烟花持续时间", + "module.elytra-boost.general.firework-duration.description": "烟花的持续时间。", + "module.elytra-boost.general.play-sound": "播放声音", + "module.elytra-boost.general.play-sound.description": "在触发助推时播放烟花声音。", + "module.elytra-boost.general.keybind": "快捷键", + "module.elytra-boost.general.keybind.description": "助推的键绑定。", + "module.liquid-interact": "液体交互", + "module.liquid-interact.description": "允许你与液体交互。", + "module.flight": "飞行", + "module.flight.description": "飞吧!建议与此模块一起使用无坠落。", + "module.flight.general.mode": "模式", + "module.flight.general.mode.description": "飞行的模式。", + "module.flight.general.speed": "速度", + "module.flight.general.speed.description": "你飞行时的速度。", + "module.flight.general.vertical-speed-match": "垂直速度匹配", + "module.flight.general.vertical-speed-match.description": "将你的垂直速度匹配到你的水平速度,否则使用原版比例。", + "module.flight.general.no-sneak": "无潜行", + "module.flight.general.no-sneak.description": "防止你在飞行时潜行。", + "module.flight.anti-kick.mode": "模式", + "module.flight.anti-kick.mode.description": "防踢的模式。", + "module.flight.anti-kick.delay": "延迟", + "module.flight.anti-kick.delay.description": "在稍微下降一点并返回原始位置之间的延迟时间,以滴答为单位。", + "module.flight.anti-kick.off-time": "关闭时间", + "module.flight.anti-kick.off-time.description": "稍微下降一点以重置浮动tick的延迟时间,以毫秒为单位。", + "module.sprint": "冲刺", + "module.sprint.description": "自动冲刺。", + "module.sprint.general.sprint-mode": "冲刺模式", + "module.sprint.general.sprint-mode.description": "奔跑模式。", + "module.sprint.general.keep-sprint": "跳跃修复", + "module.sprint.general.keep-sprint.description": "是否修正跳跃方向。", + "module.sprint.general.unsprint-on-hit": "保持冲刺", + "module.sprint.general.unsprint-on-hit.description": "攻击实体后是否保持冲刺状态。", + "module.sprint.general.unsprint-in-water": "攻击时停止冲刺", + "module.sprint.general.unsprint-in-water.description": "攻击时是否停止冲刺,以确保你能获得暴击和扫射攻击。", + "module.sprint.general.sprint-while-stationary": "水中停止冲刺", + "module.sprint.general.sprint-while-stationary.description": "是否在水中停止冲刺。", + "module.flamethrower": "火焰喷射器", + "module.flamethrower.description": "点燃每一只活着的食物。", + "module.flamethrower.general.distance": "距离", + "module.flamethrower.general.distance.description": "动物要被烤的最大距离。", + "module.flamethrower.general.anti-break": "防破", + "module.flamethrower.general.anti-break.description": "防止打火石被损坏。", + "module.flamethrower.general.put-out-fire": "扑灭火焰", + "module.flamethrower.general.put-out-fire.description": "尝试在动物血量低时扑灭火焰,这样物品就不会烧掉。", + "module.flamethrower.general.target-babies": "目标幼体", + "module.flamethrower.general.target-babies.description": "如果勾选,幼体也会被杀死。", + "module.flamethrower.general.tick-interval": "间隔刻", + "module.flamethrower.general.rotate": "旋转", + "module.flamethrower.general.rotate.description": "自动面向被烤的动物。", + "module.flamethrower.general.entities": "实体", + "module.flamethrower.general.entities.description": "要烹饪的实体。", + "module.sound-blocker": "声音屏蔽器", + "module.sound-blocker.description": "取消选中的声音。", + "module.sound-blocker.general.sounds": "声音", + "module.sound-blocker.general.sounds.description": "要屏蔽的声音。", + "module.liquid-filler": "液体填充器", + "module.liquid-filler.description": "在你周围的范围内,将方块放置在液体源方块中。", + "module.liquid-filler.general.place-in": "放置于", + "module.liquid-filler.general.place-in.description": "要放置于的液体类型。", + "module.liquid-filler.general.shape": "形状", + "module.liquid-filler.general.shape.description": "放置算法的形状。", + "module.liquid-filler.general.delay": "延迟", + "module.liquid-filler.general.delay.description": "每个动作之间的延迟,以刻为单位。", + "module.liquid-filler.general.max-blocks-per-tick": "每刻最大放置方块数", + "module.liquid-filler.general.max-blocks-per-tick.description": "每刻尝试放置的最大方块数。", + "module.liquid-filler.general.sort-mode": "排序模式", + "module.liquid-filler.general.sort-mode.description": "你想要先放置的方块。", + "module.liquid-filler.general.rotate": "旋转", + "module.liquid-filler.general.rotate.description": "自动旋转朝向要填充的空间。", + "module.liquid-filler.whitelist.list-mode": "列表模式", + "module.liquid-filler.whitelist.list-mode.description": "选择模式。", + "module.liquid-filler.whitelist.whitelist": "白名单", + "module.liquid-filler.whitelist.whitelist.description": "允许用来填充液体的方块。", + "module.liquid-filler.whitelist.blacklist": "黑名单", + "module.liquid-filler.whitelist.blacklist.description": "不允许用来填充液体的方块。", + "module.high-jump": "高跳", + "module.high-jump.description": "让你比正常跳得更高.", + "module.high-jump.general.jump-multiplier": "跳跃倍数", + "module.high-jump.general.jump-multiplier.description": "跳跃高度的倍数.", + "module.hole-filler": "洞填充", + "module.hole-filler.description": "用指定的方块填充洞。", + "module.hole-filler.general.blocks": "方块", + "module.hole-filler.general.blocks.description": "用来填充洞的方块。", + "module.hole-filler.general.search-radius": "搜索半径", + "module.hole-filler.general.search-radius.description": "水平方向上搜索洞的半径。", + "module.hole-filler.general.place-range": "放置范围", + "module.hole-filler.general.place-range.description": "离玩家多远可以放置方块。", + "module.hole-filler.general.doubles": "双重", + "module.hole-filler.general.doubles.description": "填充双洞。", + "module.hole-filler.general.rotate": "旋转", + "module.hole-filler.general.rotate.description": "自动朝向要填充的洞旋转。", + "module.hole-filler.general.place-delay": "放置延迟", + "module.hole-filler.general.place-delay.description": "放置之间的刻数延迟。", + "module.hole-filler.general.blocks-per-tick": "每刻放置", + "module.hole-filler.general.blocks-per-tick.description": "每刻放置的方块数量。", + "module.hole-filler.smart.smart": "智能", + "module.hole-filler.smart.smart.description": "在填充洞之前考虑更多的因素。", + "module.hole-filler.smart.force-fill": "强制填充", + "module.hole-filler.smart.force-fill.description": "无视目标检测,填充你周围的所有洞。", + "module.hole-filler.smart.ignore-safe": "忽略安全", + "module.hole-filler.smart.ignore-safe.description": "忽略在安全洞里的玩家。", + "module.hole-filler.smart.only-moving": "仅移动", + "module.hole-filler.smart.only-moving.description": "忽略站着不动的玩家。", + "module.hole-filler.smart.target-range": "目标范围", + "module.hole-filler.smart.target-range.description": "目标玩家的距离。", + "module.hole-filler.smart.feet-range": "脚部范围", + "module.hole-filler.smart.feet-range.description": "玩家的脚离洞多远才填充。", + "module.hole-filler.render.swing": "摇摆", + "module.hole-filler.render.swing.description": "放置时挥动玩家的手。", + "module.hole-filler.render.render": "渲染", + "module.hole-filler.render.render.description": "是否渲染将要放置的方块的覆盖层。", + "module.hole-filler.render.shape-mode": "形状模式", + "module.hole-filler.render.shape-mode.description": "形状的渲染方式.", + "module.hole-filler.render.side-color": "侧面颜色", + "module.hole-filler.render.side-color.description": "目标方块渲染的侧面颜色。", + "module.hole-filler.render.line-color": "线条颜色", + "module.hole-filler.render.line-color.description": "目标方块渲染的线条颜色。", + "module.hole-filler.render.next-side-color": "下一个侧面颜色", + "module.hole-filler.render.next-side-color.description": "下一个要放置的方块的侧面颜色。", + "module.hole-filler.render.next-line-color": "下一个线条颜色", + "module.hole-filler.render.next-line-color.description": "下一个要放置的方块的线条颜色。", + "module.packet-mine": "渲染方块", + "module.packet-mine.description": "发送包来挖掘方块,无需挖掘动画。", + "module.packet-mine.general.delay": "延迟", + "module.packet-mine.general.delay.description": "挖掘方块之间的延迟,以刻为单位。", + "module.packet-mine.general.rotate": "旋转", + "module.packet-mine.general.rotate.description": "挖掘时向服务器发送旋转包。", + "module.packet-mine.general.auto-switch": "自动切换", + "module.packet-mine.general.auto-switch.description": "当方块可以瞬间被挖掘时,自动切换到最佳工具。", + "module.packet-mine.general.not-on-use": "不在使用时", + "module.packet-mine.general.not-on-use.description": "如果你正在使用一个物品,不会自动切换。", + "module.packet-mine.render.render": "渲染", + "module.packet-mine.render.render.description": "是否渲染正在挖掘的方块。", + "module.packet-mine.render.shape-mode": "形状模式", + "module.packet-mine.render.shape-mode.description": "形状的渲染方式.", + "module.packet-mine.render.ready-side-color": "准备好的侧面颜色", + "module.packet-mine.render.ready-side-color.description": "可以被破坏的方块的侧面颜色。", + "module.packet-mine.render.ready-line-color": "准备好的线条颜色", + "module.packet-mine.render.ready-line-color.description": "可以被破坏的方块的线条颜色。", + "module.packet-mine.render.side-color": "侧面颜色", + "module.packet-mine.render.side-color.description": "要渲染的方块的侧颜色.", + "module.packet-mine.render.line-color": "线条颜色", + "module.packet-mine.render.line-color.description": "要渲染的方块的线颜色.", + "module.tracers": "追踪线", + "module.tracers.description": "向指定的实体画追踪线。", + "module.tracers.general.entities": "实体", + "module.tracers.general.entities.description": "选择特定的实体。", + "module.tracers.general.ignore-self": "忽略自己", + "module.tracers.general.ignore-self.description": "在第三人称或自由视角中不向自己画追踪线。", + "module.tracers.general.ignore-friends": "忽略好友", + "module.tracers.general.ignore-friends.description": "不向好友画追踪线。", + "module.tracers.general.show-invisible": "显示隐形", + "module.tracers.general.show-invisible.description": "显示隐形实体。", + "module.tracers.appearance.style": "样式", + "module.tracers.appearance.style.description": "应该使用什么显示模式。", + "module.tracers.appearance.target": "目标", + "module.tracers.appearance.target.description": "要目标的实体的部分。", + "module.tracers.appearance.stem": "茎", + "module.tracers.appearance.stem.description": "在追踪线目标的中心画一条线。", + "module.tracers.appearance.max-distance": "最大距离", + "module.tracers.appearance.max-distance.description": "追踪线显示的最大距离。", + "module.tracers.appearance.distance-offscreen": "屏幕外距离", + "module.tracers.appearance.distance-offscreen.description": "屏幕外的距离到中心。", + "module.tracers.appearance.size-offscreen": "屏幕外大小", + "module.tracers.appearance.size-offscreen.description": "屏幕外的大小。", + "module.tracers.appearance.blink-offscreen": "屏幕外闪烁", + "module.tracers.appearance.blink-offscreen.description": "让屏幕外闪烁。", + "module.tracers.appearance.blink-offscreen-speed": "屏幕外闪烁速度", + "module.tracers.appearance.blink-offscreen-speed.description": "屏幕外的闪烁速度。", + "module.tracers.colors.distance-colors": "距离颜色", + "module.tracers.colors.distance-colors.description": "根据距离改变追踪线的颜色。", + "module.tracers.colors.show-friend-colors": "显示好友颜色", + "module.tracers.colors.show-friend-colors.description": "是否用好友颜色覆盖好友的距离颜色。", + "module.tracers.colors.players-colors": "玩家颜色", + "module.tracers.colors.players-colors.description": "玩家的颜色。", + "module.tracers.colors.animals-color": "动物颜色", + "module.tracers.colors.animals-color.description": "动物的颜色。", + "module.tracers.colors.water-animals-color": "水生动物颜色", + "module.tracers.colors.water-animals-color.description": "水生动物的颜色。", + "module.tracers.colors.monsters-color": "怪物颜色", + "module.tracers.colors.monsters-color.description": "怪物的颜色。", + "module.tracers.colors.ambient-color": "环境颜色", + "module.tracers.colors.ambient-color.description": "环境的颜色。", + "module.tracers.colors.misc-color": "杂项颜色", + "module.tracers.colors.misc-color.description": "杂项的颜色。", + "module.discord-presence": "在Discord显示", + "module.discord-presence.description": "在Discord上显示Meteor作为你的状态。", + "module.discord-presence.line-1.line-1-messages": "第一行信息", + "module.discord-presence.line-1.line-1-messages.description": "用于第一行的消息。", + "module.discord-presence.line-1.line-1-update-delay": "第一行更新间隔", + "module.discord-presence.line-1.line-1-update-delay.description": "以刻为单位更新第一行的速度。", + "module.discord-presence.line-1.line-1-select-mode": "第一行消息模式", + "module.discord-presence.line-1.line-1-select-mode.description": "选择第一行消息的方式。", + "module.discord-presence.line-2.line-2-messages": "第二行信息", + "module.discord-presence.line-2.line-2-messages.description": "用于第二行的消息。", + "module.discord-presence.line-2.line-2-update-delay": "第二行更新间隔", + "module.discord-presence.line-2.line-2-update-delay.description": "以刻为单位更新第二行的速度。", + "module.discord-presence.line-2.line-2-select-mode": "第二行消息模式", + "module.discord-presence.line-2.line-2-select-mode.description": "选择第二行消息的方式。", + "module.timer": "计时器", + "module.timer.description": "改变你游戏中所有事物的速度。", + "module.timer.general.multiplier": "倍数", + "module.timer.general.multiplier.description": "timer的倍数。", + "module.anchor": "锚定器", + "module.anchor.description": "通过停止你在一个坑上的移动来帮助你进入坑位。", + "module.anchor.general.max-height": "最大高度", + "module.anchor.general.max-height.description": "最高的锚定高度", + "module.anchor.general.min-pitch": "最小角度", + "module.anchor.general.min-pitch.description": "锚定器工作的最小角度。", + "module.anchor.general.cancel-jump-in-hole": "在坑位中取消跳跃", + "module.anchor.general.cancel-jump-in-hole.description": "当锚定器启用且角度符合最小角度,您将无法跳跃。", + "module.anchor.general.pull": "拖拽强度", + "module.anchor.general.pull.description": "锚定器的拖拽强度。", + "module.anchor.general.pull-speed": "拖拽速度", + "module.anchor.general.pull-speed.description": "拖拽的速度(bps)", + "module.collisions": "碰撞", + "module.collisions.description": "给某些方块/区域添加碰撞箱。", + "module.collisions.general.blocks": "方块", + "module.collisions.general.blocks.description": "应该添加碰撞箱的方块。", + "module.collisions.general.magma": "岩浆", + "module.collisions.general.magma.description": "防止你走在岩浆方块上。", + "module.collisions.general.unloaded-chunks": "未加载的区块", + "module.collisions.general.unloaded-chunks.description": "阻止你进入未加载的区块。", + "module.collisions.general.ignore-border": "忽略边界", + "module.collisions.general.ignore-border.description": "移除世界边界的碰撞。", + "module.trajectories": "轨迹", + "module.trajectories.description": "预测可投掷物品的轨迹。", + "module.trajectories.general.items": "物品", + "module.trajectories.general.items.description": "要显示轨迹的物品。", + "module.trajectories.general.other-players": "其他玩家", + "module.trajectories.general.other-players.description": "计算其他玩家的轨迹。", + "module.trajectories.general.fired-projectiles": "已发射的投射物", + "module.trajectories.general.fired-projectiles.description": "计算已经发射的投射物的轨迹。", + "module.trajectories.general.accurate": "精确", + "module.trajectories.general.accurate.description": "是否要计算更精确的。", + "module.trajectories.general.simulation-steps": "模拟步数", + "module.trajectories.general.simulation-steps.description": "模拟投射物的步数。零表示没有限制", + "module.trajectories.render.shape-mode": "形状模式", + "module.trajectories.render.shape-mode.description": "形状的渲染方式.", + "module.trajectories.render.side-color": "侧面颜色", + "module.trajectories.render.side-color.description": "侧面的颜色。", + "module.trajectories.render.line-color": "线条颜色", + "module.trajectories.render.line-color.description": "线条的颜色。", + "module.trajectories.render.render-position-boxes": "渲染位置盒", + "module.trajectories.render.render-position-boxes.description": "在每个tick渲染投射物沿轨迹的实际位置。", + "module.trajectories.render.position-box-size": "位置盒大小", + "module.trajectories.render.position-box-size.description": "在模拟位置绘制的盒子的大小。", + "module.trajectories.render.position-side-color": "位置边侧颜色", + "module.trajectories.render.position-side-color.description": "侧面的颜色。", + "module.trajectories.render.position-line-color": "位置线条颜色", + "module.trajectories.render.position-line-color.description": "线条的颜色。", + "module.auto-clicker": "连点器", + "module.auto-clicker.description": "自动点击鼠标", + "module.auto-clicker.general.while-in-screens": "在屏幕打开时点击", + "module.auto-clicker.general.while-in-screens.description": "是否在屏幕打开时进行点击。", + "module.auto-clicker.general.mode-left": "左键模式", + "module.auto-clicker.general.mode-left.description": "点击左键的方式。", + "module.auto-clicker.general.delay-left": "左键延迟", + "module.auto-clicker.general.delay-left.description": "左键点击之间的延迟数量。", + "module.auto-clicker.general.mode-right": "右键模式", + "module.auto-clicker.general.mode-right.description": "点击右键的方式。", + "module.auto-clicker.general.delay-right": "点击右键的延迟", + "module.auto-clicker.general.delay-right.description": "右键点击之间的延迟数量。", + "module.vein-miner": "脉冲挖掘", + "module.vein-miner.description": "挖掘附近所有相同类型的方块", + "module.vein-miner.general.blocks": "方块", + "module.vein-miner.general.blocks.description": "要选择的方块。", + "module.vein-miner.general.mode": "模式", + "module.vein-miner.general.mode.description": "选择模式。", + "module.vein-miner.general.depth": "深度", + "module.vein-miner.general.depth.description": "扫描相似方块的迭代次数。", + "module.vein-miner.general.delay": "延迟", + "module.vein-miner.general.delay.description": "挖掘方块之间的延迟。", + "module.vein-miner.general.rotate": "旋转", + "module.vein-miner.general.rotate.description": "挖掘时向服务器发送旋转包。", + "module.vein-miner.render.swing-hand": "挥动手", + "module.vein-miner.render.swing-hand.description": "客户端挥手。", + "module.vein-miner.render.render": "渲染", + "module.vein-miner.render.render.description": "是否渲染正在挖掘的方块。", + "module.vein-miner.render.shape-mode": "形状模式", + "module.vein-miner.render.shape-mode.description": "形状的渲染方式.", + "module.vein-miner.render.side-color": "侧面颜色", + "module.vein-miner.render.side-color.description": "要渲染的方块的侧颜色.", + "module.vein-miner.render.line-color": "线条颜色", + "module.vein-miner.render.line-color.description": "要渲染的方块的线颜色.", + "module.auto-sign": "告示牌填充", + "module.auto-sign.description": "自动写告示牌。将使用第一个牌子里面的文本。", + "module.auto-shearer": "自动剪毛", + "module.auto-shearer.description": "自动给你的羊剃毛", + "module.auto-shearer.general.distance": "距离", + "module.auto-shearer.general.distance.description": "绵羊的最大触及距离。", + "module.auto-shearer.general.anti-break": "反损坏", + "module.auto-shearer.general.anti-break.description": "避免把你的剪刀用爆", + "module.auto-shearer.general.rotate": "转头", + "module.auto-shearer.general.rotate.description": "自动面向被剪毛的羊。", + "module.ambience": "自定义环境颜色", + "module.ambience.description": "更改各种环境的颜色。", + "module.ambience.sky.end-sky": "末地天空", + "module.ambience.sky.end-sky.description": "将天空变成末地天空", + "module.ambience.sky.custom-sky-color": "自定义天空颜色", + "module.ambience.sky.custom-sky-color.description": "是否修改天空颜色。", + "module.ambience.sky.overworld-sky-color": "主世界天空颜色", + "module.ambience.sky.overworld-sky-color.description": "主世界天空的颜色。", + "module.ambience.sky.nether-sky-color": "下界天空颜色", + "module.ambience.sky.nether-sky-color.description": "下界天空的颜色", + "module.ambience.sky.end-sky-color": "末地天空颜色", + "module.ambience.sky.end-sky-color.description": "末地天空的颜色", + "module.ambience.sky.custom-cloud-color": "自定义云颜色", + "module.ambience.sky.custom-cloud-color.description": "是否更改云颜色。", + "module.ambience.sky.cloud-color": "云颜色", + "module.ambience.sky.cloud-color.description": "云的颜色", + "module.ambience.sky.custom-lightning-color": "自定义闪电颜色", + "module.ambience.sky.custom-lightning-color.description": "是否更改闪电颜色。", + "module.ambience.sky.lightning-color": "闪电颜色", + "module.ambience.sky.lightning-color.description": "闪电的颜色。", + "module.ambience.world.custom-grass-color": "自定义草方块颜色", + "module.ambience.world.custom-grass-color.description": "草方块颜色是否应更改。", + "module.ambience.world.grass-color": "草方块颜色", + "module.ambience.world.grass-color.description": "草方块的颜色。", + "module.ambience.world.custom-foliage-color": "自定义树叶颜色", + "module.ambience.world.custom-foliage-color.description": "树叶颜色是否应更改。", + "module.ambience.world.foliage-color": "树叶颜色", + "module.ambience.world.foliage-color.description": "叶子的颜色", + "module.ambience.world.custom-water-color": "自定义水颜色", + "module.ambience.world.custom-water-color.description": "是否改变水的颜色", + "module.ambience.world.water-color": "水的颜色", + "module.ambience.world.water-color.description": "水的颜色。", + "module.ambience.world.custom-lava-color": "自定义岩浆颜色", + "module.ambience.world.custom-lava-color.description": "熔岩颜色是否应更改。", + "module.ambience.world.lava-color": "岩浆颜色", + "module.ambience.world.lava-color.description": "岩浆的颜色。", + "module.nametags": "名称标签", + "module.nametags.description": "在玩家上方显示可定制的名称标签.", + "module.nametags.general.entities": "实体", + "module.nametags.general.entities.description": "选择要绘制名称标签的实体.", + "module.nametags.general.scale": "比例", + "module.nametags.general.scale.description": "名称标签的比例.", + "module.nametags.general.ignore-self": "忽略自己", + "module.nametags.general.ignore-self.description": "在第三人称或自由视角时忽略自己.", + "module.nametags.general.ignore-friends": "忽略好友", + "module.nametags.general.ignore-friends.description": "忽略朋友的名称标签渲染.", + "module.nametags.general.ignore-bots": "忽略机器人", + "module.nametags.general.ignore-bots.description": "仅渲染非机器人的名称标签.", + "module.nametags.general.culling": "剔除", + "module.nametags.general.culling.description": "仅在一定距离内渲染一定数量的名称标签.", + "module.nametags.general.culling-range": "剔除范围", + "module.nametags.general.culling-range.description": "仅渲染在此距离内的名称标签.", + "module.nametags.general.culling-count": "剔除数量", + "module.nametags.general.culling-count.description": "仅渲染这么多的名称标签.", + "module.nametags.players.health": "生命值", + "module.nametags.players.health.description": "显示玩家的健康状况.", + "module.nametags.players.gamemode": "游戏模式", + "module.nametags.players.gamemode.description": "显示玩家的游戏模式.", + "module.nametags.players.distance": "距离", + "module.nametags.players.distance.description": "显示你与玩家之间的距离.", + "module.nametags.players.ping": "延迟", + "module.nametags.players.ping.description": "显示玩家的延迟.", + "module.nametags.players.items": "物品", + "module.nametags.players.items.description": "在名称标签上方显示护甲和手持物品.", + "module.nametags.players.item-spacing": "物品间距", + "module.nametags.players.item-spacing.description": "物品之间的间距.", + "module.nametags.players.ignore-empty-slots": "忽略空槽", + "module.nametags.players.ignore-empty-slots.description": "不在空物品堆的位置添加间距.", + "module.nametags.players.durability": "耐久度", + "module.nametags.players.durability.description": "以总数、百分比或不显示显示物品耐久度.", + "module.nametags.players.display-enchants": "显示附魔", + "module.nametags.players.display-enchants.description": "显示物品上的附魔.", + "module.nametags.players.shown-enchantments": "显示附魔", + "module.nametags.players.shown-enchantments.description": "在名称标签上显示的附魔.", + "module.nametags.players.enchantment-position": "附魔位置", + "module.nametags.players.enchantment-position.description": "附魔的渲染位置.", + "module.nametags.players.enchant-name-length": "附魔名称长度", + "module.nametags.players.enchant-name-length.description": "附魔名称的修剪长度.", + "module.nametags.players.enchant-text-scale": "附魔文本比例", + "module.nametags.players.enchant-text-scale.description": "附魔文本的比例.", + "module.nametags.items.show-count": "显示数量", + "module.nametags.items.show-count.description": "显示堆叠物品的数量.", + "module.nametags.render.background-color": "背景颜色", + "module.nametags.render.background-color.description": "名称标签背景的颜色.", + "module.nametags.render.name-color": "名字颜色", + "module.nametags.render.name-color.description": "名称标签名称的颜色.", + "module.nametags.render.ping-color": "延迟颜色", + "module.nametags.render.ping-color.description": "名称标签延迟的颜色.", + "module.nametags.render.gamemode-color": "游戏模式颜色", + "module.nametags.render.gamemode-color.description": "名称标签游戏模式的颜色.", + "module.nametags.render.distance-color-mode": "距离颜色模式", + "module.nametags.render.distance-color-mode.description": "名称标签距离的着色模式.", + "module.nametags.render.distance-color": "距离颜色", + "module.nametags.render.distance-color.description": "名称标签距离的颜色.", + "module.instant-rebreak": "瞬时破坏", + "module.instant-rebreak.description": "在相同位置瞬间重新破坏方块.", + "module.instant-rebreak.general.delay": "延迟", + "module.instant-rebreak.general.delay.description": "破坏尝试之间的延迟.", + "module.instant-rebreak.general.only-pick": "仅用镐", + "module.instant-rebreak.general.only-pick.description": "仅在拿着镐时尝试开采方块。", + "module.instant-rebreak.general.rotate": "旋转", + "module.instant-rebreak.general.rotate.description": "服务器端面向正在开采的方块。", + "module.instant-rebreak.render.render": "渲染", + "module.instant-rebreak.render.render.description": "渲染正在破坏的方块的覆盖层。", + "module.instant-rebreak.render.shape-mode": "形状模式", + "module.instant-rebreak.render.shape-mode.description": "形状的渲染方式.", + "module.instant-rebreak.render.side-color": "侧面颜色", + "module.instant-rebreak.render.side-color.description": "要渲染的方块的侧颜色.", + "module.instant-rebreak.render.line-color": "线条颜色", + "module.instant-rebreak.render.line-color.description": "要渲染的方块的线颜色.", + "module.no-fall": "无摔伤", + "module.no-fall.description": "试图防止你受到摔落伤害。", + "module.no-fall.general.mode": "模式", + "module.no-fall.general.mode.description": "你如何避免摔落伤害的方式。", + "module.no-fall.general.placed-item": "放置方块", + "module.no-fall.general.placed-item.description": "要放置的方块。", + "module.no-fall.general.air-place-mode": "放置模式", + "module.no-fall.general.air-place-mode.description": "放置模式是在你死亡前还是在你受伤前放置。", + "module.no-fall.general.anchor": "锚点", + "module.no-fall.general.anchor.description": "在使用水桶或空中放置模式时,将玩家居中并减少移动。", + "module.no-fall.general.anti-bounce": "禁用弹跳", + "module.no-fall.general.anti-bounce.description": "禁用在粘液块和床上着陆时的弹跳。", + "module.reach": "长臂猿", + "module.reach.description": "赋予你超长的手臂。", + "module.reach.general.extra-block-reach": "额外方块触及", + "module.reach.general.extra-block-reach.description": "增加到你方块触及的距离。。", + "module.reach.general.extra-entity-reach": "额外实体触及", + "module.reach.general.extra-entity-reach.description": "增加到你实体触及的距离。。", + "module.click-tp": "点击传送", + "module.click-tp.description": "将你传送到你点击的方块上.", + "module.click-tp.general.max-distance": "最大距离", + "module.click-tp.general.max-distance.description": "你可以传送的最大距离.", + "module.marker": "标记", + "module.marker.description": "渲染形状。适用于大规模的项目", + "module.breadcrumbs": "足迹", + "module.breadcrumbs.description": "显示你走过的地方的轨迹。", + "module.breadcrumbs.general.color": "颜色", + "module.breadcrumbs.general.color.description": "Breadcrumbs轨迹的颜色。", + "module.breadcrumbs.general.max-sections": "最大段数", + "module.breadcrumbs.general.max-sections.description": "最大的段数。", + "module.breadcrumbs.general.section-length": "每段长度", + "module.breadcrumbs.general.section-length.description": "每段的长度,以方块为单位。", + "module.air-place": "凭空放置", + "module.air-place.description": "在准心指向的位置放置一个方块", + "module.air-place.general.render": "渲染", + "module.air-place.general.render.description": "渲染方块的放置位置", + "module.air-place.general.shape-mode": "形状模式", + "module.air-place.general.shape-mode.description": "选择渲染的形状。", + "module.air-place.general.side-color": "边框颜色", + "module.air-place.general.side-color.description": "方块侧面渲染的颜色。", + "module.air-place.general.line-color": "边框颜色", + "module.air-place.general.line-color.description": "方块边框渲染的颜色", + "module.air-place.range.custom-range": "自定义范围", + "module.air-place.range.custom-range.description": "凭空放置的自定义范围", + "module.air-place.range.range": "距离", + "module.air-place.range.range.description": "放置的自定义距离。", + "module.arrow-dodge": "箭矢躲避", + "module.arrow-dodge.description": "自动尝试躲避将会命中你的箭矢", + "module.arrow-dodge.general.accurate": "精确度", + "module.arrow-dodge.general.accurate.description": "是否应用更加精确的计算", + "module.arrow-dodge.general.ground-check": "地面检测", + "module.arrow-dodge.general.ground-check.description": "尝试避免因为自动躲避导致的摔落死亡", + "module.arrow-dodge.general.all-projectiles": "全部弹射物", + "module.arrow-dodge.general.all-projectiles.description": "尝试躲避所有的弹射物 不仅仅是箭矢", + "module.arrow-dodge.general.ignore-own": "忽视自己发射的弹射物", + "module.arrow-dodge.general.ignore-own.description": "忽略你自己的投射物。", + "module.arrow-dodge.general.simulation-steps": "模拟步数", + "module.arrow-dodge.general.simulation-steps.description": "对弹射物路径模拟的步数 设为0以关闭步数上限", + "module.arrow-dodge.movement.move-type": "移动类型", + "module.arrow-dodge.movement.move-type.description": "这个模块移动您的方式。", + "module.arrow-dodge.movement.move-speed": "移动速度", + "module.arrow-dodge.movement.move-speed.description": "躲避箭矢的移动速度", + "module.arrow-dodge.movement.distance-check": "距离检查", + "module.arrow-dodge.movement.distance-check.description": "不触发检测的最小距离", + "module.reverse-step": "反向步行", + "module.reverse-step.description": "让你以更快的速度下落方块。", + "module.reverse-step.general.fall-speed": "下落速度", + "module.reverse-step.general.fall-speed.description": "以每秒多少方块的速度下落。", + "module.reverse-step.general.fall-distance": "下落距离", + "module.reverse-step.general.fall-distance.description": "这个设置会在最大下落距离时激活。", + "module.wall-hack": "透视墙壁", + "module.wall-hack.description": "使方块半透明。", + "module.wall-hack.general.opacity": "不透明度", + "module.wall-hack.general.opacity.description": "渲染方块的不透明度。", + "module.wall-hack.general.blocks": "方块", + "module.wall-hack.general.blocks.description": "透视墙壁的目标方块。", + "module.wall-hack.general.occlude-chunks": "遮挡区块", + "module.wall-hack.general.occlude-chunks.description": "是否让洞穴遮挡地下(开启时可能看起来很奇怪)。", + "module.packet-canceller": "数据包取消器", + "module.packet-canceller.description": "让你可以取消某些数据包。", + "module.packet-canceller.general.s2c-packets": "S2C-数据包", + "module.packet-canceller.general.s2c-packets.description": "要取消的服务器到客户端的数据包。", + "module.packet-canceller.general.c2s-packets": "C2S-数据包", + "module.packet-canceller.general.c2s-packets.description": "要取消的客户端到服务器的数据包。", + "module.inventory-tweaks": "物品栏调整", + "module.inventory-tweaks.description": "各种与物品栏相关的实用工具.", + "module.inventory-tweaks.general.mouse-drag-item-move": "鼠标拖动物品移动", + "module.inventory-tweaks.general.mouse-drag-item-move.description": "按住shift并移动鼠标到物品上会将它转移到另一个容器.", + "module.inventory-tweaks.general.anti-drop-items": "防止丢弃物品", + "module.inventory-tweaks.general.anti-drop-items.description": "防止丢弃的物品. 在创造模式物品栏界面不起作用.", + "module.inventory-tweaks.general.xcarry.description": "允许你在你的合成网格中存储四个额外的物品堆.", + "module.inventory-tweaks.general.armor-storage": "盔甲存储", + "module.inventory-tweaks.general.armor-storage.description": "允许你在你的盔甲槽中放置普通物品.", + "module.inventory-tweaks.sorting.sorting-enabled": "排序开启", + "module.inventory-tweaks.sorting.sorting-enabled.description": "自动在物品栏中排序物品堆.", + "module.inventory-tweaks.sorting.sorting-key": "排序键", + "module.inventory-tweaks.sorting.sorting-key.description": "触发排序的键.", + "module.inventory-tweaks.sorting.sorting-delay": "排序延迟", + "module.inventory-tweaks.sorting.sorting-delay.description": "排序时移动物品之间的刻延迟.", + "module.inventory-tweaks.auto-drop.auto-drop-items": "自动丢弃物品", + "module.inventory-tweaks.auto-drop.auto-drop-items.description": "要丢弃的物品.", + "module.inventory-tweaks.auto-drop.exclude-equipped": "排除装备", + "module.inventory-tweaks.auto-drop.exclude-equipped.description": "是否丢弃装备在盔甲槽中的物品.", + "module.inventory-tweaks.auto-drop.exclude-hotbar": "排除物品栏", + "module.inventory-tweaks.auto-drop.exclude-hotbar.description": "是否丢弃物品栏中的物品.", + "module.inventory-tweaks.auto-drop.only-full-stacks": "只丢满堆", + "module.inventory-tweaks.auto-drop.only-full-stacks.description": "只有当物品堆满时才丢弃物品.", + "module.inventory-tweaks.steal-and-dump.steal-screens": "偷取界面", + "module.inventory-tweaks.steal-and-dump.steal-screens.description": "选择要显示按钮和自动偷取的界面.", + "module.inventory-tweaks.steal-and-dump.inventory-buttons": "物品栏按钮", + "module.inventory-tweaks.steal-and-dump.inventory-buttons.description": "在容器界面中显示偷取和倾倒按钮.", + "module.inventory-tweaks.steal-and-dump.steal-drop": "偷取丢弃", + "module.inventory-tweaks.steal-and-dump.steal-drop.description": "将物品丢到地上而不是偷取它们.", + "module.inventory-tweaks.steal-and-dump.drop-backwards": "向后丢弃", + "module.inventory-tweaks.steal-and-dump.drop-backwards.description": "将物品丢到你身后.", + "module.inventory-tweaks.steal-and-dump.dump-filter": "倾倒过滤", + "module.inventory-tweaks.steal-and-dump.dump-filter.description": "倾倒模式.", + "module.inventory-tweaks.steal-and-dump.dump-items": "倾倒物品", + "module.inventory-tweaks.steal-and-dump.dump-items.description": "要倾倒的物品.", + "module.inventory-tweaks.steal-and-dump.steal-filter": "偷取过滤", + "module.inventory-tweaks.steal-and-dump.steal-filter.description": "偷取模式.", + "module.inventory-tweaks.steal-and-dump.steal-items": "偷取物品", + "module.inventory-tweaks.steal-and-dump.steal-items.description": "要偷取的物品.", + "module.inventory-tweaks.auto-steal.auto-steal": "自动偷取", + "module.inventory-tweaks.auto-steal.auto-steal.description": "当你打开一个容器时自动移除所有可能的物品.", + "module.inventory-tweaks.auto-steal.auto-dump": "自动倾倒", + "module.inventory-tweaks.auto-steal.auto-dump.description": "当你打开一个容器时自动倾倒所有可能的物品.", + "module.inventory-tweaks.auto-steal.delay": "延迟", + "module.inventory-tweaks.auto-steal.delay.description": "偷取下一个物品堆之间的最小毫秒延迟.", + "module.inventory-tweaks.auto-steal.initial-delay": "初始延迟", + "module.inventory-tweaks.auto-steal.initial-delay.description": "偷取前的初始毫秒延迟. 0表示使用正常延迟.", + "module.inventory-tweaks.auto-steal.random": "随机", + "module.inventory-tweaks.auto-steal.random.description": "随机增加一个最多指定时间的毫秒延迟.", + "module.mount-bypass": "坐骑绕过", + "module.mount-bypass.description": "允许你绕过IllegalStacks插件,将箱子放在实体上。", + "module.auto-smelter": "自动熔炼", + "module.auto-smelter.description": "自动熔炼你背包中的物品", + "module.auto-smelter.general.fuel-items": "燃料", + "module.auto-smelter.general.fuel-items.description": "用于燃料的物品", + "module.auto-smelter.general.smeltable-items": "熔炼的物品", + "module.auto-smelter.general.smeltable-items.description": "要熔炼的物品", + "module.auto-smelter.general.disable-when-out-of-items": "自动关闭", + "module.auto-smelter.general.disable-when-out-of-items.description": "东西烧完了自动给你关掉这个功能", + "module.auto-fish": "自动钓鱼", + "module.auto-fish.description": "帮你自动钓鱼", + "module.auto-fish.general.anti-break": "反破碎", + "module.auto-fish.general.anti-break.description": "防止把你的鱼竿用到彻底损坏", + "module.auto-fish.general.auto-cast": "自动抛竿", + "module.auto-fish.general.auto-cast.description": "当你没钓鱼时自动给你抛出浮漂", + "module.auto-fish.general.catch-delay": "捕捉延迟", + "module.auto-fish.general.catch-delay.description": "自动收鱼线之前要等待的ticks 数量。", + "module.better-tooltips": "更好的提示框", + "module.better-tooltips.description": "为某些物品显示更有用的提示框。", + "module.better-tooltips.general.display-when": "显示时机", + "module.better-tooltips.general.display-when.description": "何时显示预览。", + "module.better-tooltips.general.keybind": "快捷键", + "module.better-tooltips.general.keybind.description": "按键绑定模式的绑定键。", + "module.better-tooltips.general.middle-click-open": "中键点击打开", + "module.better-tooltips.general.middle-click-open.description": "当你中键点击物品时,打开一个带有存储方块或书籍物品栏的GUI窗口。", + "module.better-tooltips.general.pause-in-creative": "创意模式暂停", + "module.better-tooltips.general.pause-in-creative.description": "当玩家处于创意模式时,暂停中键点击打开。", + "module.better-tooltips.previews.containers": "容器", + "module.better-tooltips.previews.containers.description": "当将鼠标悬停在容器上时,在物品栏中显示该容器的预览。", + "module.better-tooltips.previews.compact-shulker-tooltip": "紧凑的末影箱提示", + "module.better-tooltips.previews.compact-shulker-tooltip.description": "紧凑化末影箱提示框中的行。", + "module.better-tooltips.previews.echests": "末影箱", + "module.better-tooltips.previews.echests.description": "当将鼠标悬停在末影箱上时,在物品栏中显示末影箱的预览。", + "module.better-tooltips.previews.maps": "地图", + "module.better-tooltips.previews.maps.description": "当将鼠标悬停在地图上时,在物品栏中显示地图的预览。", + "module.better-tooltips.previews.map-scale": "地图缩放", + "module.better-tooltips.previews.map-scale.description": "地图预览的缩放比例。", + "module.better-tooltips.previews.books": "书籍", + "module.better-tooltips.previews.books.description": "当将鼠标悬停在书籍上时,在物品栏中显示书籍的内容。", + "module.better-tooltips.previews.banners": "旗帜", + "module.better-tooltips.previews.banners.description": "当将鼠标悬停在旗帜上时,显示旗帜的图案。也适用于盾牌。", + "module.better-tooltips.previews.entities-in-buckets": "桶中的实体", + "module.better-tooltips.previews.entities-in-buckets.description": "当将鼠标悬停在桶中时,显示桶里的实体。", + "module.better-tooltips.other.byte-size": "字节大小", + "module.better-tooltips.other.byte-size.description": "显示物品大小(以字节为单位)在提示框中。", + "module.better-tooltips.other.status-effects": "状态效果", + "module.better-tooltips.other.status-effects.description": "在食物物品的提示框中添加状态效果列表。", + "module.better-tooltips.other.beehive": "蜂巢", + "module.better-tooltips.other.beehive.description": "显示蜂巢或蜂巢巢穴的信息。", + "module.better-tooltips.hide-flags.tooltip": "提示框", + "module.better-tooltips.hide-flags.tooltip.description": "显示提示框,即使它是隐藏的。", + "module.auto-nametag": "自动命名", + "module.auto-nametag.description": "在没有名称标签的实体上自动使用命名牌。是否在指定距离上命名所有实体。", + "module.auto-nametag.general.entities": "实体", + "module.auto-nametag.general.entities.description": "要命名的实体。", + "module.auto-nametag.general.range": "半径", + "module.auto-nametag.general.range.description": "在此半径内的实体会被自动命名", + "module.auto-nametag.general.priority": "优先级", + "module.auto-nametag.general.priority.description": "优先顺序", + "module.auto-nametag.general.renametag": "命名覆盖", + "module.auto-nametag.general.renametag.description": "允许重命名已命名的实体。", + "module.auto-nametag.general.rotate": "转头", + "module.auto-nametag.general.rotate.description": "自动面向被重命名的生物。", + "module.fast-use": "快速使用", + "module.fast-use.description": "允许你以非常高的速度使用物品。", + "module.fast-use.general.mode": "模式", + "module.fast-use.general.mode.description": "快速使用的物品。", + "module.fast-use.general.items": "物品", + "module.fast-use.general.items.description": "在 \"Some\" 模式下,快速放置的物品。", + "module.fast-use.general.blocks": "方块", + "module.fast-use.general.blocks.description": "如果模式是 \"Some\" 模式下,快速放置的物品。", + "module.fast-use.general.cooldown": "冷却", + "module.fast-use.general.cooldown.description": "快速使用的冷却时间,以刻为单位。", + "module.light-overlay": "光照覆盖", + "module.light-overlay.description": "显示怪物可以生成的方块。", + "module.light-overlay.general.horizontal-range": "水平范围", + "module.light-overlay.general.horizontal-range.description": "水平范围(以方块为单位)。", + "module.light-overlay.general.vertical-range": "垂直范围", + "module.light-overlay.general.vertical-range.description": "垂直范围(以方块为单位)。", + "module.light-overlay.general.see-through-blocks": "透视方块", + "module.light-overlay.general.see-through-blocks.description": "允许你透过方块看到线条。", + "module.light-overlay.colors.color": "颜色", + "module.light-overlay.colors.color.description": "怪物当前可以生成的地方的颜色。", + "module.light-overlay.colors.potential-color": "潜在颜色", + "module.light-overlay.colors.potential-color.description": "怪物潜在可以生成的地方的颜色(例如在夜晚)。", + "module.auto-mend": "自动修复", + "module.auto-mend.description": "在完全修复后自动将您的物品替换为下一个待修理的物品。", + "module.auto-mend.general.blacklist": "黑名单", + "module.auto-mend.general.blacklist.description": "物品黑名单.", + "module.auto-mend.general.force": "强制模式", + "module.auto-mend.general.force.description": "即使还有其他一些不可修理的物品,也要直接替换物品。", + "module.auto-mend.general.auto-disable": "自动禁用", + "module.auto-mend.general.auto-disable.description": "当没有更多要修复的物品时自动关闭此模块。", + "module.no-render": "不渲染", + "module.no-render.description": "禁用某些动画或覆盖的渲染。", + "module.no-render.overlay.portal-overlay": "传送门覆盖", + "module.no-render.overlay.portal-overlay.description": "禁用下界传送门覆盖的渲染。", + "module.no-render.overlay.spyglass-overlay": "望远镜覆盖", + "module.no-render.overlay.spyglass-overlay.description": "禁用望远镜覆盖的渲染。", + "module.no-render.overlay.nausea": "恶心", + "module.no-render.overlay.nausea.description": "禁用恶心覆盖的渲染。", + "module.no-render.overlay.pumpkin-overlay": "南瓜头覆盖", + "module.no-render.overlay.pumpkin-overlay.description": "禁用南瓜头覆盖的渲染。", + "module.no-render.overlay.powdered-snow-overlay": "粉雪覆盖", + "module.no-render.overlay.powdered-snow-overlay.description": "禁用粉雪覆盖的渲染。", + "module.no-render.overlay.fire-overlay": "火焰覆盖", + "module.no-render.overlay.fire-overlay.description": "禁用火焰覆盖的渲染。", + "module.no-render.overlay.liquid-overlay": "液体覆盖", + "module.no-render.overlay.liquid-overlay.description": "禁用液体覆盖的渲染。", + "module.no-render.overlay.in-wall-overlay": "墙内覆盖", + "module.no-render.overlay.in-wall-overlay.description": "禁用在方块内部时的覆盖渲染。", + "module.no-render.overlay.vignette": "暗角", + "module.no-render.overlay.vignette.description": "禁用暗角覆盖的渲染。", + "module.no-render.overlay.gui-background": "GUI背景", + "module.no-render.overlay.gui-background.description": "禁用GUI背景覆盖的渲染。", + "module.no-render.overlay.totem-animation": "图腾动画", + "module.no-render.overlay.totem-animation.description": "禁用图腾弹出时的动画渲染。", + "module.no-render.overlay.eating-particles": "吃东西粒子", + "module.no-render.overlay.eating-particles.description": "禁用吃东西粒子的渲染。", + "module.no-render.overlay.enchantment-glint": "附魔闪光", + "module.no-render.overlay.enchantment-glint.description": "禁用附魔闪光的渲染。", + "module.no-render.hud.boss-bar": "Boss条", + "module.no-render.hud.boss-bar.description": "禁用Boss条的渲染。", + "module.no-render.hud.scoreboard": "计分板", + "module.no-render.hud.scoreboard.description": "禁用计分板的渲染。", + "module.no-render.hud.crosshair": "十字准星", + "module.no-render.hud.crosshair.description": "禁用十字准星的渲染。", + "module.no-render.hud.title": "标题", + "module.no-render.hud.title.description": "禁用标题的渲染。", + "module.no-render.hud.held-item-name": "持有物品名称", + "module.no-render.hud.held-item-name.description": "禁用持有物品名称的渲染。", + "module.no-render.hud.obfuscation": "字符模糊", + "module.no-render.hud.obfuscation.description": "禁用字符的模糊样式。", + "module.no-render.hud.potion-icons": "药水图标", + "module.no-render.hud.potion-icons.description": "禁用状态效果图标的渲染。", + "module.no-render.hud.message-signature-indicator": "聊天消息签名指示器", + "module.no-render.hud.message-signature-indicator.description": "禁用消息左侧的聊天签名指示器。", + "module.no-render.world.weather": "天气", + "module.no-render.world.weather.description": "禁用天气的渲染。", + "module.no-render.world.blindness": "失明", + "module.no-render.world.blindness.description": "禁用失明的渲染。", + "module.no-render.world.darkness": "黑暗", + "module.no-render.world.darkness.description": "禁用黑暗的渲染。", + "module.no-render.world.fog": "雾气", + "module.no-render.world.fog.description": "禁用雾气的渲染。", + "module.no-render.world.enchantment-table-book": "附魔桌书籍", + "module.no-render.world.enchantment-table-book.description": "禁用附魔桌上方的书籍渲染。", + "module.no-render.world.sign-text": "告示牌文字", + "module.no-render.world.sign-text.description": "禁用告示牌上的文字渲染。", + "module.no-render.world.block-break-particles": "方块破坏粒子", + "module.no-render.world.block-break-particles.description": "禁用方块破坏粒子的渲染。", + "module.no-render.world.block-break-overlay": "方块破坏覆盖", + "module.no-render.world.block-break-overlay.description": "禁用方块破坏覆盖的渲染。", + "module.no-render.world.skylight-updates": "天光更新", + "module.no-render.world.skylight-updates.description": "禁用天光更新的渲染。", + "module.no-render.world.beacon-beams": "信标光束", + "module.no-render.world.beacon-beams.description": "禁用信标光束的渲染。", + "module.no-render.world.falling-blocks": "掉落方块", + "module.no-render.world.falling-blocks.description": "禁用掉落方块的渲染。", + "module.no-render.world.cave-culling": "洞穴剔除", + "module.no-render.world.cave-culling.description": "禁用Minecraft的洞穴剔除算法。", + "module.no-render.world.map-markers": "地图标记", + "module.no-render.world.map-markers.description": "禁用地图上的标记。", + "module.no-render.world.map-contents": "地图内容", + "module.no-render.world.map-contents.description": "禁用地图的渲染。", + "module.no-render.world.banners": "旗帜", + "module.no-render.world.banners.description": "更改旗帜的渲染。", + "module.no-render.world.firework-explosions": "烟花爆炸", + "module.no-render.world.firework-explosions.description": "禁用烟花爆炸的渲染。", + "module.no-render.world.particles": "粒子", + "module.no-render.world.particles.description": "禁用特定粒子的渲染。", + "module.no-render.world.barrier-invisibility": "屏障隐形", + "module.no-render.world.barrier-invisibility.description": "禁用当没有持有时屏障隐形。", + "module.no-render.world.texture-rotations": "纹理旋转", + "module.no-render.world.texture-rotations.description": "更改纹理旋转和模型偏移,使其使用常数值而不是方块位置。", + "module.no-render.world.block-entities": "方块实体", + "module.no-render.world.block-entities.description": "禁用方块实体(箱子、末影箱等)的渲染。", + "module.no-render.entity.entities": "实体", + "module.no-render.entity.entities.description": "禁用选定实体的渲染。", + "module.no-render.entity.drop-spawn-packets": "掉落生成数据包", + "module.no-render.entity.drop-spawn-packets.description": "警告!掉落所有在上述列表中选择的实体生成数据包。", + "module.no-render.entity.armor": "盔甲", + "module.no-render.entity.armor.description": "禁用实体盔甲的渲染。", + "module.no-render.entity.invisibility": "隐形", + "module.no-render.entity.invisibility.description": "显示隐形实体。", + "module.no-render.entity.glowing": "发光", + "module.no-render.entity.glowing.description": "禁用发光效果的渲染。", + "module.no-render.entity.spawner-entities": "生成器实体", + "module.no-render.entity.spawner-entities.description": "禁用生成器中的旋转怪物的渲染。", + "module.no-render.entity.dead-entities": "死亡实体", + "module.no-render.entity.dead-entities.description": "禁用死亡实体的渲染。", + "module.no-render.entity.nametags.description": "禁用实体名称标签的渲染。", + "module.auto-exp": "自动经验瓶", + "module.auto-exp.description": "在脾胃皮时自动使用附魔之瓶为你修装备", + "module.auto-exp.general.mode": "模式", + "module.auto-exp.general.mode.description": "要修理的物品。", + "module.auto-exp.general.replenish": "自动重装", + "module.auto-exp.general.replenish.description": "自动补充经验瓶到你指定的快捷栏位", + "module.auto-exp.general.exp-slot": "经验槽位", + "module.auto-exp.general.exp-slot.description": "自动补充经验瓶的快捷栏", + "module.auto-exp.general.min-threshold": "最小阈值", + "module.auto-exp.general.min-threshold.description": "一件物品需要修理的最低耐久百分比。", + "module.auto-exp.general.max-threshold": "最大阈值", + "module.auto-exp.general.max-threshold.description": "修复物品的最大耐久百分比。", + "module.gui-move": "界面移动", + "module.gui-move.description": "在界面中允许你执行各种动作.", + "module.gui-move.general.guis": "界面", + "module.gui-move.general.guis.description": "可以在其中移动的界面.", + "module.gui-move.general.jump.description": "在界面中允许你跳跃.", + "module.gui-move.general.sneak": "潜行", + "module.gui-move.general.sneak.description": "在界面中允许你潜行.", + "module.gui-move.general.sprint": "冲刺", + "module.gui-move.general.sprint.description": "在界面中允许你冲刺.", + "module.gui-move.general.arrows-rotate": "箭头旋转", + "module.gui-move.general.arrows-rotate.description": "在界面中允许你用箭头键旋转.", + "module.gui-move.general.rotate-speed": "旋转速度", + "module.gui-move.general.rotate-speed.description": "在界面中的旋转速度.", + "module.auto-web": "自动蜘蛛网", + "module.auto-web.description": "自动在其他玩家身上放置蜘蛛网。", + "module.auto-web.general.target-priority": "目标优先级", + "module.auto-web.general.target-priority.description": "如何筛选范围内的目标。", + "module.auto-web.general.target-range": "目标范围", + "module.auto-web.general.target-range.description": "目标玩家的最大距离。", + "module.auto-web.general.doubles": "双重", + "module.auto-web.general.doubles.description": "在目标的上半部分和下半部分都放置蜘蛛网。", + "module.auto-web.general.rotate": "旋转", + "module.auto-web.general.rotate.description": "放置蜘蛛网时朝向蜘蛛网。", + "module.auto-web.render.render": "渲染", + "module.auto-web.render.shape-mode": "形状模式", + "module.auto-web.render.side-color": "侧面颜色", + "module.auto-web.render.line-color": "线条颜色", + "module.xray": "透视", + "module.xray.description": "只渲染指定的方块。适合挖矿。", + "module.xray.general.whitelist": "白名单", + "module.xray.general.whitelist.description": "显示透视的方块。", + "module.xray.general.opacity": "不透明度", + "module.xray.general.opacity.description": "所有其他方块的不透明度。", + "module.xray.general.exposed-only": "仅暴露", + "module.xray.general.exposed-only.description": "仅显示暴露的矿石。", + "module.air-jump": "空中跳跃", + "module.air-jump.description": "让你在空气中跳跃", + "module.air-jump.general.maintain-level": "保持高度", + "module.air-jump.general.maintain-level.description": "按住跳跃键时保持您当前的高度。", + "module.jesus": "耶稣", + "module.jesus.description": "像耶稣一样在液体和粉雪上行走.", + "module.jesus.general.powder-snow": "粉雪", + "module.jesus.general.powder-snow.description": "在粉雪上行走.", + "module.jesus.water.mode": "模式", + "module.jesus.water.mode.description": "处理水的方式.", + "module.jesus.water.dip-if-burning": "燃烧时下沉", + "module.jesus.water.dip-if-burning.description": "当你着火时让你进入水中.", + "module.jesus.water.dip-on-sneak": "潜行时下沉", + "module.jesus.water.dip-on-sneak.description": "当你按住潜行键时让你进入水中.", + "module.jesus.water.dip-on-fall": "摔落时下沉", + "module.jesus.water.dip-on-fall.description": "当你从一定高度摔落时让你进入水中.", + "module.jesus.water.dip-fall-height": "摔落高度", + "module.jesus.water.dip-fall-height.description": "你会进入水中的摔落高度.", + "module.jesus.lava.mode": "模式", + "module.jesus.lava.mode.description": "处理岩浆的方式.", + "module.jesus.lava.dip-if-resistant": "有抗火时下沉", + "module.jesus.lava.dip-if-resistant.description": "如果你有抗火效果,就让你进入岩浆中.", + "module.jesus.lava.dip-on-sneak": "潜行时下沉", + "module.jesus.lava.dip-on-sneak.description": "当你按住潜行键时让你进入岩浆中.", + "module.jesus.lava.dip-on-fall": "摔落时下沉", + "module.jesus.lava.dip-on-fall.description": "当你从一定高度摔落时让你进入岩浆中.", + "module.jesus.lava.dip-fall-height": "摔落高度", + "module.jesus.lava.dip-fall-height.description": "你会进入岩浆中的摔落高度.", + "module.waypoints": "创建路标", + "module.waypoints.description": "允许你创建路标.", + "module.waypoints.general.text-render-distance": "文本渲染距离", + "module.waypoints.general.text-render-distance.description": "从屏幕中心渲染文本的最大距离.", + "module.waypoints.general.waypoint-fade-distance": "路标淡出距离", + "module.waypoints.general.waypoint-fade-distance.description": "开始淡出的路标距离.", + "module.waypoints.death-position.max-death-positions": "最大死亡位置", + "module.waypoints.death-position.max-death-positions.description": "保存的死亡位置数量, 0表示禁用", + "module.waypoints.death-position.chat": "聊天栏", + "module.waypoints.death-position.chat.description": "在你死亡时发送一个带有你位置的聊天消息", + "module.auto-replenish": "自动补货", + "module.auto-replenish.description": "自动补充快捷栏、主手或副手中的物品。", + "module.auto-replenish.general.delay": "延迟", + "module.auto-replenish.general.delay.description": "补充您的快捷栏中的物品的延迟。", + "module.auto-replenish.general.offhand": "副手", + "module.auto-replenish.general.offhand.description": "是否自动补充您的副手上的物品。", + "module.auto-replenish.general.unstackable": "不可堆叠补货", + "module.auto-replenish.general.unstackable.description": "补充不可堆叠的物品。", + "module.auto-replenish.general.search-hotbar": "搜索物品栏", + "module.auto-replenish.general.search-hotbar.description": "使用你的快捷栏中的物品补货,如果它们是唯一剩下的物品。", + "module.auto-replenish.general.excluded-items": "排除的物品", + "module.auto-replenish.general.excluded-items.description": "不需要自动进行补充的物品", + "module.self-web": "自我束缚", + "module.self-web.description": "自动在你身上放置蜘蛛网。", + "module.self-web.general.mode": "模式", + "module.self-web.general.mode.description": "自我束缚的使用模式。", + "module.self-web.general.range": "范围", + "module.self-web.general.range.description": "玩家离你多远时才放置网。需要模式为智能。", + "module.self-web.general.double-place": "双重放置", + "module.self-web.general.double-place.description": "也在你的上部碰撞箱放置网。", + "module.self-web.general.auto-toggle": "自动切换", + "module.self-web.general.auto-toggle.description": "放置网后切换关闭。", + "module.self-web.general.rotate": "旋转", + "module.self-web.general.rotate.description": "放置网时强制你向下旋转。", + "module.blur": "高斯模糊", + "module.blur.description": "在GUI屏幕中模糊背景。", + "module.blur.general.strength": "强度", + "module.blur.general.strength.description": "模糊的强度。", + "module.blur.general.fade-time": "出入时间", + "module.blur.general.fade-time.description": "淡入淡出的持续时间,以毫秒为单位。", + "module.blur.screens.meteor": "meteor", + "module.blur.screens.meteor.description": "对Meteor的屏幕应用模糊。", + "module.blur.screens.inventories": "背包", + "module.blur.screens.inventories.description": "对物品栏的屏幕应用模糊。", + "module.blur.screens.chat": "聊天栏", + "module.blur.screens.chat.description": "在聊天时应用模糊。", + "module.blur.screens.other": "其他", + "module.blur.screens.other.description": "对所有其他类型的屏幕应用模糊。", + "module.void-esp": "虚空透视", + "module.void-esp.description": "渲染通向虚空的基岩层的洞穴。", + "module.void-esp.general.air-only": "仅空气", + "module.void-esp.general.air-only.description": "只检查基岩层的空气方块。", + "module.void-esp.general.horizontal-radius": "水平搜索范围", + "module.void-esp.general.horizontal-radius.description": "水平方向上搜索洞的半径。", + "module.void-esp.general.hole-height": "洞穴高度", + "module.void-esp.general.hole-height.description": "需要渲染的洞穴的最小高度。", + "module.void-esp.general.nether-roof": "下界屋顶", + "module.void-esp.general.nether-roof.description": "检查下界屋顶的洞穴。", + "module.void-esp.render.shape-mode": "形状模式", + "module.void-esp.render.shape-mode.description": "形状的渲染方式.", + "module.void-esp.render.fill-color": "填充颜色", + "module.void-esp.render.fill-color.description": "填充虚空洞穴的颜色。", + "module.void-esp.render.line-color": "线条颜色", + "module.void-esp.render.line-color.description": "画虚空洞穴的线条的颜色。", + "module.entity-speed": "实体速度", + "module.entity-speed.description": "骑乘实体时让你更快.", + "module.entity-speed.general.speed": "速度", + "module.entity-speed.general.speed.description": "水平速度,单位为每秒方块数.", + "module.entity-speed.general.only-on-ground": "只在地面上", + "module.entity-speed.general.only-on-ground.description": "只有站在方块上时才使用速度.", + "module.entity-speed.general.in-water": "在水中", + "module.entity-speed.general.in-water.description": "在水中时使用速度.", + "module.auto-walk": "自动行走", + "module.auto-walk.description": "自动向前行走.", + "module.auto-walk.general.mode": "模式", + "module.auto-walk.general.mode.description": "行走模式.", + "module.auto-walk.general.simple-direction": "简单方向", + "module.auto-walk.general.simple-direction.description": "简单模式中行走的方向.", + "module.bow-aimbot": "弓箭自瞄", + "module.bow-aimbot.description": "自动为你瞄准弓箭.", + "module.bow-aimbot.general.range": "范围", + "module.bow-aimbot.general.range.description": "实体可以被瞄准的最大范围.", + "module.bow-aimbot.general.entities": "实体", + "module.bow-aimbot.general.entities.description": "要攻击的实体.", + "module.bow-aimbot.general.priority": "优先级", + "module.bow-aimbot.general.priority.description": "要目标的实体类型.", + "module.bow-aimbot.general.babies": "幼体", + "module.bow-aimbot.general.babies.description": "是否攻击实体的幼体变种.", + "module.bow-aimbot.general.nametagged": "命名", + "module.bow-aimbot.general.nametagged.description": "是否攻击有命名牌的生物.", + "module.bow-aimbot.general.pause-on-combat": "战斗时暂停", + "module.bow-aimbot.general.pause-on-combat.description": "暂时冻结Baritone,直到你释放弓.", + "module.bow-spam": "弓箭连射", + "module.bow-spam.description": "连射箭矢.", + "module.bow-spam.general.charge": "蓄力", + "module.bow-spam.general.charge.description": "释放弓箭前的刻蓄力时间.", + "module.bow-spam.general.when-holding-right-click": "按住右键时生效", + "module.bow-spam.general.when-holding-right-click.description": "只在按住右键时生效.", + "module.auto-armor": "自动盔甲", + "module.auto-armor.description": "自动装备盔甲", + "module.auto-armor.general.preferred-protection": "优先保护附魔", + "module.auto-armor.general.preferred-protection.description": "优先选择的保护附魔类型", + "module.auto-armor.general.swap-delay": "切换延迟", + "module.auto-armor.general.swap-delay.description": "装备盔甲的延迟。", + "module.auto-armor.general.avoided-enchantments": "避免的附魔", + "module.auto-armor.general.avoided-enchantments.description": "避免装备的附魔。", + "module.auto-armor.general.blast-prot-leggings": "爆保护腿优先", + "module.auto-armor.general.blast-prot-leggings.description": "优先考虑使用爆炸保护附魔的护腿", + "module.auto-armor.general.anti-break": "反破损", + "module.auto-armor.general.anti-break.description": "在盔甲破损前自动脱掉他", + "module.auto-armor.general.ignore-elytra": "忽略鞘翅", + "module.auto-armor.general.ignore-elytra.description": "当你装备了鞘翅,不自动更换它", + "module.echest-farmer": "末影箱农场", + "module.echest-farmer.description": "放置和破坏末影箱来挖掘黑曜石。", + "module.echest-farmer.general.self-toggle": "自动关闭", + "module.echest-farmer.general.self-toggle.description": "当你达到期望的黑曜石数量时禁用。", + "module.echest-farmer.general.ignore-existing": "忽略现有", + "module.echest-farmer.general.ignore-existing.description": "忽略你背包里已有的黑曜石,挖掘总目标数量。", + "module.echest-farmer.general.amount": "数量", + "module.echest-farmer.general.amount.description": "要挖掘的黑曜石数量。", + "module.echest-farmer.render.swing-hand": "挥动手", + "module.echest-farmer.render.swing-hand.description": "客户端挥手。", + "module.echest-farmer.render.render": "渲染", + "module.echest-farmer.render.render.description": "在黑曜石将被放置的地方渲染一个方块覆盖。", + "module.echest-farmer.render.shape-mode": "形状模式", + "module.echest-farmer.render.shape-mode.description": "形状的渲染方式.", + "module.echest-farmer.render.side-color": "侧面颜色", + "module.echest-farmer.render.side-color.description": "要渲染的方块的侧颜色.", + "module.echest-farmer.render.line-color": "线条颜色", + "module.echest-farmer.render.line-color.description": "要渲染的方块的线颜色.", + "module.chams": "变色渲染", + "module.chams.description": "调整实体的渲染。", + "module.chams.through-walls.entities": "实体", + "module.chams.through-walls.entities.description": "选择显示透过墙壁的实体。", + "module.chams.through-walls.shader": "着色器", + "module.chams.through-walls.shader.description": "在实体上渲染着色器。", + "module.chams.through-walls.color": "颜色", + "module.chams.through-walls.color.description": "着色器绘制的颜色。", + "module.chams.through-walls.ignore-self": "忽略自己", + "module.chams.through-walls.ignore-self.description": "忽略自己绘制玩家。", + "module.chams.players.players": "玩家", + "module.chams.players.players.description": "启用玩家模型调整。", + "module.chams.players.ignore-self": "忽略自己", + "module.chams.players.ignore-self.description": "调整玩家模型时忽略自己。", + "module.chams.players.texture": "纹理", + "module.chams.players.texture.description": "启用玩家模型纹理。", + "module.chams.players.color": "颜色", + "module.chams.players.color.description": "玩家模型的颜色。", + "module.chams.players.scale": "比例", + "module.chams.players.scale.description": "玩家的缩放比例。", + "module.chams.crystals.crystals": "水晶", + "module.chams.crystals.crystals.description": "启用水晶模型调整。", + "module.chams.crystals.scale": "比例", + "module.chams.crystals.scale.description": "水晶的缩放比例。", + "module.chams.crystals.bounce": "反弹", + "module.chams.crystals.bounce.description": "水晶的反弹高度。", + "module.chams.crystals.rotation-speed": "旋转速度", + "module.chams.crystals.rotation-speed.description": "水晶旋转速度的倍数。", + "module.chams.crystals.texture": "纹理", + "module.chams.crystals.texture.description": "是否渲染水晶模型纹理。", + "module.chams.crystals.crystal-color": "水晶颜色", + "module.chams.crystals.crystal-color.description": "水晶的颜色。", + "module.chams.hand.enabled": "启用", + "module.chams.hand.enabled.description": "启用手部渲染调整。", + "module.chams.hand.texture": "纹理", + "module.chams.hand.texture.description": "是否渲染手部纹理。", + "module.chams.hand.hand-color": "手部颜色", + "module.chams.hand.hand-color.description": "你手的颜色。", + "module.exp-thrower": "经验投掷器", + "module.exp-thrower.description": "自动从你的快捷栏扔经验瓶。", + "module.block-esp": "方块ESP", + "module.block-esp.description": "通过墙壁渲染指定的方块。", + "module.block-esp.general.blocks": "方块", + "module.block-esp.general.blocks.description": "要搜索的方块。", + "module.block-esp.general.default-block-config": "默认方块配置", + "module.block-esp.general.default-block-config.description": "默认方块配置。", + "module.block-esp.general.block-configs": "方块配置", + "module.block-esp.general.block-configs.description": "每个方块的配置。", + "module.block-esp.general.tracers": "追踪线", + "module.block-esp.general.tracers.description": "渲染追踪线。", + "module.better-tab": "更好的tablist", + "module.better-tab.description": "对tablist的各种改进。", + "module.better-tab.general.tablist-size": "Tab列表大小", + "module.better-tab.general.tablist-size.description": "在Tab列表中显示的玩家总数。", + "module.better-tab.general.column-height": "列高度", + "module.better-tab.general.column-height.description": "每列显示的玩家数。", + "module.better-tab.general.highlight-self": "高亮自己", + "module.better-tab.general.highlight-self.description": "在Tab列表中高亮自己。", + "module.better-tab.general.self-color": "自己颜色", + "module.better-tab.general.self-color.description": "高亮自己的名字的颜色。", + "module.better-tab.general.highlight-friends": "高亮好友", + "module.better-tab.general.highlight-friends.description": "在Tab列表中高亮好友。", + "module.better-tab.general.accurate-latency": "准确延迟", + "module.better-tab.general.accurate-latency.description": "在Tab列表中以数字显示延迟。", + "module.better-tab.general.gamemode": "游戏模式", + "module.better-tab.general.gamemode.description": "在昵称旁边显示游戏模式。", + "module.auto-brewer": "自动酿造", + "module.auto-brewer.description": "自动酿造指定的药水.", + "module.auto-brewer.general.potion": "药水", + "module.auto-brewer.general.potion.description": "要酿造的药水类型。", + "module.auto-city": "自动修脚", + "module.auto-city.description": "自动破坏敌人脚旁边的方块 用于水晶脾胃皮", + "module.auto-city.general.target-range": "锁定距离", + "module.auto-city.general.target-range.description": "玩家被锁定的半径", + "module.auto-city.general.break-range": "挖掘半径", + "module.auto-city.general.break-range.description": "自动挖掘的半径", + "module.auto-city.general.switch-mode": "切换模式", + "module.auto-city.general.switch-mode.description": "如何切换到稿子。", + "module.auto-city.general.support": "水晶支撑", + "module.auto-city.general.support.description": "如果被挖掘的方块的位置无法放置水晶,它将在挖掘前放置水晶的支撑方块。", + "module.auto-city.general.place-range": "放置半径", + "module.auto-city.general.place-range.description": "尝试放置一个方块的距离。", + "module.auto-city.general.rotate": "转头", + "module.auto-city.general.rotate.description": "把视角自动旋转到挖掘的方块上。", + "module.auto-city.general.chat-info": "聊天提示", + "module.auto-city.general.chat-info.description": "模块是否应该在聊天中发送消息。", + "module.auto-city.render.swing-hand": "摇手", + "module.auto-city.render.swing-hand.description": "是否渲染您的手摇动。", + "module.auto-city.render.render-block": "渲染挖掘位置", + "module.auto-city.render.render-block.description": "是否渲染被挖掘的方块。", + "module.auto-city.render.shape-mode": "形状模式", + "module.auto-city.render.shape-mode.description": "如何渲染形状。", + "module.auto-city.render.side-color": "侧边颜色", + "module.auto-city.render.side-color.description": "渲染的侧边颜色。", + "module.auto-city.render.line-color": "边框颜色", + "module.auto-city.render.line-color.description": "渲染的线条颜色。", + "module.name-protect": "名称保护", + "module.name-protect.description": "隐藏玩家的名称和皮肤.", + "module.name-protect.general.name-protect": "名称保护", + "module.name-protect.general.name-protect.description": "客户端隐藏你的名称.", + "module.name-protect.general.name.description": "要替换的名称.", + "module.name-protect.general.skin-protect": "皮肤保护", + "module.name-protect.general.skin-protect.description": "让玩家变成史蒂夫.", + "module.logout-spots": "登出点", + "module.logout-spots.description": "在其他玩家登出的地方显示一个方框。", + "module.logout-spots.general.scale": "比例", + "module.logout-spots.general.scale.description": "缩放。", + "module.logout-spots.general.full-height": "全高", + "module.logout-spots.general.full-height.description": "显示玩家的全高。", + "module.logout-spots.render.shape-mode": "形状模式", + "module.logout-spots.render.shape-mode.description": "形状的渲染方式.", + "module.logout-spots.render.side-color": "侧面颜色", + "module.logout-spots.render.side-color.description": "侧面的颜色。", + "module.logout-spots.render.line-color": "线条颜色", + "module.logout-spots.render.line-color.description": "线条的颜色。", + "module.logout-spots.render.name-color": "名字颜色", + "module.logout-spots.render.name-color.description": "名字的颜色。", + "module.logout-spots.render.name-background-color": "名字背景颜色", + "module.logout-spots.render.name-background-color.description": "名字的背景颜色。", + "module.self-anvil": "自动铁砧", + "module.self-anvil.description": "自动在你头上放置一个铁砧,防止其他玩家进入你的洞.", + "module.message-aura": "消息光环", + "module.message-aura.description": "给附近的所有玩家发送指定的消息", + "module.message-aura.general.message": "消息", + "module.message-aura.general.message.description": "发送给玩家的指定消息.", + "module.message-aura.general.ignore-friends": "忽略好友", + "module.message-aura.general.ignore-friends.description": "不会给好友发送任何消息.", + "module.book-bot": "书籍机器人", + "module.book-bot.description": "自动在书中写字。", + "module.book-bot.general.mode": "模式", + "module.book-bot.general.mode.description": "要写什么样的文本。", + "module.book-bot.general.pages": "页数", + "module.book-bot.general.pages.description": "每本书要写的页数。", + "module.book-bot.general.ascii-only": "仅限ASCII", + "module.book-bot.general.ascii-only.description": "仅使用ASCII字符集中的字符。", + "module.book-bot.general.delay": "延迟", + "module.book-bot.general.delay.description": "写书之间的延迟时间。", + "module.book-bot.general.sign": "签名", + "module.book-bot.general.sign.description": "是否签署书籍。", + "module.book-bot.general.name.description": "你想给你的书起的名字。", + "module.book-bot.general.append-count": "附加计数", + "module.book-bot.general.append-count.description": "是否在标题中附加书籍的编号。", + "module.no-slow": "无缓慢", + "module.no-slow.description": "让你在使用会减慢你的物品时正常移动。", + "module.no-slow.general.items": "物品", + "module.no-slow.general.items.description": "使用物品是否会减慢你。", + "module.no-slow.general.web": "蜘蛛网", + "module.no-slow.general.web.description": "蜘蛛网是否不会减慢你。", + "module.no-slow.general.web-timer": "蜘蛛网timer", + "module.no-slow.general.web-timer.description": "WebMode Timer的timer值。", + "module.no-slow.general.honey-block": "蜂蜜块", + "module.no-slow.general.honey-block.description": "蜂蜜块是否不会减慢你。", + "module.no-slow.general.soul-sand": "灵魂沙", + "module.no-slow.general.soul-sand.description": "灵魂沙是否不会减慢你。", + "module.no-slow.general.slime-block": "粘液块", + "module.no-slow.general.slime-block.description": "粘液块是否不会减慢你。", + "module.no-slow.general.berry-bush": "浆果丛", + "module.no-slow.general.berry-bush.description": "浆果丛是否不会减慢你。", + "module.no-slow.general.air-strict": "空中严格", + "module.no-slow.general.air-strict.description": "将尝试绕过像2b2t这样的反作弊。只有在空中时才起作用。", + "module.no-slow.general.fluid-drag": "流体阻力", + "module.no-slow.general.fluid-drag.description": "流体阻力是否不会减慢你。", + "module.no-slow.general.sneaking": "潜行", + "module.no-slow.general.sneaking.description": "潜行是否不会减慢你。", + "module.no-slow.general.hunger": "饥饿", + "module.no-slow.general.hunger.description": "饥饿是否不会减慢你。", + "module.no-slow.general.slowness": "缓慢", + "module.no-slow.general.slowness.description": "缓慢是否不会减慢你。", + "module.item-highlight": "物品高亮", + "module.item-highlight.description": "在GUI中高亮选中的物品。", + "module.item-highlight.general.items": "物品", + "module.item-highlight.general.items.description": "要高亮的物品。", + "module.item-highlight.general.color": "颜色", + "module.item-highlight.general.color.description": "高亮物品的颜色。", + "module.esp": "透视", + "module.esp.description": "透过墙壁渲染实体。", + "module.esp.general.mode": "模式", + "module.esp.general.mode.description": "渲染模式。", + "module.esp.general.outline-width": "轮廓宽度", + "module.esp.general.outline-width.description": "着色器轮廓的宽度。", + "module.esp.general.glow-multiplier": "发光倍数", + "module.esp.general.glow-multiplier.description": "发光效果的倍数。", + "module.esp.general.ignore-self": "忽略自己", + "module.esp.general.ignore-self.description": "不在着色器中绘制自己。", + "module.esp.general.shape-mode": "形状模式", + "module.esp.general.shape-mode.description": "形状的渲染方式.", + "module.esp.general.fill-opacity": "填充不透明度", + "module.esp.general.fill-opacity.description": "形状填充的不透明度。", + "module.esp.general.fade-distance": "淡出距离", + "module.esp.general.fade-distance.description": "实体离开颜色开始淡出的距离。", + "module.esp.general.entities": "实体", + "module.esp.general.entities.description": "选择特定的实体。", + "module.esp.colors.distance-colors": "距离颜色", + "module.esp.colors.distance-colors.description": "根据距离改变追踪线的颜色。", + "module.esp.colors.show-friend-colors": "显示好友颜色", + "module.esp.colors.show-friend-colors.description": "是否用好友颜色覆盖好友的距离颜色。", + "module.esp.colors.players-color": "玩家颜色", + "module.esp.colors.players-color.description": "其他玩家的颜色。", + "module.esp.colors.animals-color": "动物颜色", + "module.esp.colors.animals-color.description": "动物的颜色。", + "module.esp.colors.water-animals-color": "水生动物颜色", + "module.esp.colors.water-animals-color.description": "水生动物的颜色。", + "module.esp.colors.monsters-color": "怪物颜色", + "module.esp.colors.monsters-color.description": "怪物的颜色。", + "module.esp.colors.ambient-color": "环境颜色", + "module.esp.colors.ambient-color.description": "环境的颜色。", + "module.esp.colors.misc-color": "杂项颜色", + "module.esp.colors.misc-color.description": "杂项的颜色。", + "module.blink": "闪烁", + "module.blink.description": "允许你在暂停运动更新的同时基本上进行传送。", + "module.blink.general.render-original": "渲染原始", + "module.blink.general.render-original.description": "在原始位置渲染你的玩家模型。", + "module.blink.general.cancel-blink": "取消闪烁", + "module.blink.general.cancel-blink.description": "取消发送数据包并将你送回原始位置。", + "module.offhand-crash": "副手崩溃", + "module.offhand-crash.description": "一个利用漏洞,通过在主手和副手之间切换来崩溃其他玩家的功能。", + "module.offhand-crash.general.do-crash": "崩溃", + "module.offhand-crash.general.do-crash.description": "每刻向服务器发送X个副手切换声音包。", + "module.offhand-crash.general.speed": "速度", + "module.offhand-crash.general.speed.description": "以刻为单位的切换数量。", + "module.offhand-crash.general.anti-crash": "防崩溃", + "module.offhand-crash.general.anti-crash.description": "尝试防止你崩溃自己。", + "module.anti-afk": "反挂机踢出", + "module.anti-afk.description": "执行不同的动作以防止在挂机时被服务器踢出。", + "module.anti-afk.actions.jump": "跳跃", + "module.anti-afk.actions.jump.description": "随机跳跃。", + "module.anti-afk.actions.swing": "挥手", + "module.anti-afk.actions.swing.description": "把你的手摇动起来。", + "module.anti-afk.actions.sneak": "潜行", + "module.anti-afk.actions.sneak.description": "快速的蹲起", + "module.anti-afk.actions.sneak-time": "潜行时间", + "module.anti-afk.actions.sneak-time.description": "潜行状态保持的时间", + "module.anti-afk.actions.strafe": "左右摇摆", + "module.anti-afk.actions.strafe.description": "向右和向左平移。", + "module.anti-afk.actions.spin": "旋转", + "module.anti-afk.actions.spin.description": "让玩家转起来", + "module.anti-afk.actions.spin-mode": "旋转模式", + "module.anti-afk.actions.spin-mode.description": "旋转的方法。", + "module.anti-afk.actions.speed": "速度", + "module.anti-afk.actions.speed.description": "旋转的速度。", + "module.anti-afk.actions.pitch": "俯仰角", + "module.anti-afk.actions.pitch.description": "要发送到服务器的俯仰角。", + "module.anti-afk.messages.send-messages": "发送消息", + "module.anti-afk.messages.send-messages.description": "发送消息以防止被踢", + "module.anti-afk.messages.random": "随机", + "module.anti-afk.messages.random.description": "从您的消息列表中随机选择一条消息。", + "module.anti-afk.messages.delay": "延迟", + "module.anti-afk.messages.delay.description": "发送2条消息之间的延迟", + "module.anti-afk.messages.messages": "消息", + "module.anti-afk.messages.messages.description": "要从中选择的消息。", + "module.auto-breed": "自动繁殖", + "module.auto-breed.description": "自动繁殖指定的动物。", + "module.auto-breed.general.entities": "实体", + "module.auto-breed.general.entities.description": "需要繁殖的实体。", + "module.auto-breed.general.range": "半径", + "module.auto-breed.general.range.description": "繁殖距离你多远的动物。", + "module.auto-breed.general.hand-for-breeding": "繁殖使用的手", + "module.auto-breed.general.hand-for-breeding.description": "用于繁殖的手。", + "module.auto-breed.general.mob-age-filter": "生物年龄过滤", + "module.auto-breed.general.mob-age-filter.description": "需要繁殖生物的年龄(年幼、成年或两者)。", + "module.entity-owner": "实体名字", + "module.entity-owner.description": "显示你正在看的实体的拥有者的名字.", + "module.entity-owner.general.scale": "比例", + "module.entity-owner.general.scale.description": "文本的比例.", + "module.fullbright": "夜视", + "module.fullbright.description": "照亮你的世界!", + "module.fullbright.general.mode": "模式", + "module.fullbright.general.mode.description": "Fullbright的使用模式。", + "module.fullbright.general.light-type": "光源类型", + "module.fullbright.general.light-type.description": "Luminance模式使用的光源类型。", + "module.fullbright.general.minimum-light-level": "最低光照等级", + "module.fullbright.general.minimum-light-level.description": "使用Luminance模式时的最低光照等级。", + "module.long-jump": "远跳", + "module.long-jump.description": "让你跳得比正常更远。", + "module.long-jump.general.mode": "模式", + "module.long-jump.general.mode.description": "跳跃的方法.", + "module.long-jump.general.vanilla-boost-factor": "原版加速因子", + "module.long-jump.general.vanilla-boost-factor.description": "加速跳跃的程度。", + "module.long-jump.general.burst-initial-speed": "爆发初始速度", + "module.long-jump.general.burst-initial-speed.description": "跑步的初始速度。", + "module.long-jump.general.burst-boost-factor": "爆发加速因子", + "module.long-jump.general.burst-boost-factor.description": "加速跳跃的程度。", + "module.long-jump.general.only-on-ground": "只在地面上", + "module.long-jump.general.only-on-ground.description": "只有在地面上时才进行跳跃。", + "module.long-jump.general.on-jump": "跳跃", + "module.long-jump.general.on-jump.description": "玩家是否需要先跳跃。", + "module.long-jump.general.glide-multiplier": "滑翔倍数", + "module.long-jump.general.glide-multiplier.description": "滑翔速度的乘数。", + "module.long-jump.general.timer": "计时器", + "module.long-jump.general.timer.description": "timer覆盖.", + "module.long-jump.general.auto-disable": "自动禁用", + "module.long-jump.general.auto-disable.description": "跳跃后自动禁用模块。", + "module.long-jump.general.disable-on-rubberband": "橡皮筋检测", + "module.long-jump.general.disable-on-rubberband.description": "当你被拉回时禁用模块。", + "module.zoom": "缩放", + "module.zoom.description": "缩放你的视野.", + "module.zoom.general.zoom": "缩放", + "module.zoom.general.zoom.description": "缩放的倍数。", + "module.zoom.general.scroll-sensitivity": "滚动灵敏度", + "module.zoom.general.scroll-sensitivity.description": "允许您使用滚动轮来改变缩放值。0 表示禁用。", + "module.zoom.general.smooth": "平滑过渡", + "module.zoom.general.smooth.description": "平滑的过渡效果。", + "module.zoom.general.cinematic": "电影模式", + "module.zoom.general.cinematic.description": "启用电影模式摄像机。", + "module.zoom.general.hide-hud": "隐藏HUD", + "module.zoom.general.hide-hud.description": "是否隐藏Minecraft的HUD。", + "module.zoom.general.show-hands": "显示手", + "module.zoom.general.show-hands.description": "是否显示您的手。", + "module.speed-mine": "速度开采", + "module.speed-mine.description": "允许你快速挖掘方块。", + "module.speed-mine.general.mode": "模式", + "module.speed-mine.general.blocks": "方块", + "module.speed-mine.general.blocks.description": "选定的方块。", + "module.speed-mine.general.blocks-filter": "方块过滤器", + "module.speed-mine.general.blocks-filter.description": "如何使用方块设置。", + "module.speed-mine.general.modifier": "修饰符", + "module.speed-mine.general.modifier.description": "挖掘速度修饰符。额外值0.2相当于一个急迫等级(1.2 = 急迫1)。", + "module.speed-mine.general.haste-amplifier": "急迫放大器", + "module.speed-mine.general.haste-amplifier.description": "给你的急迫值。不推荐超过2。", + "module.speed-mine.general.instamine": "即时开采", + "module.speed-mine.general.instamine.description": "在某些条件下是否立即开采方块。", + "module.speed-mine.general.grim-bypass": "绕过反作弊", + "module.speed-mine.general.grim-bypass.description": "绕过反作弊的快速破坏检查,截至2.3.58版本有效", + "module.multitask": "多任务", + "module.multitask.description": "允许同时使用物品和攻击。", + "module.multitask.general.attacking-entities": "攻击实体", + "module.multitask.general.attacking-entities.description": "允许在使用物品时攻击实体。", + "module.auto-gap": "自动金苹果", + "module.auto-gap.description": "自动吃金林檎", + "module.auto-gap.general.allow-egap": "允许附魔金林檎", + "module.auto-gap.general.allow-egap.description": "如果找到的话,允许自动食用附魔金林檎", + "module.auto-gap.general.always": "一直吃", + "module.auto-gap.general.always.description": "一直吃金林檎", + "module.auto-gap.general.pause-auras": "暂停光环", + "module.auto-gap.general.pause-auras.description": "当干饭时暂停你的光环类功能", + "module.auto-gap.general.pause-baritone": "暂停男中音", + "module.auto-gap.general.pause-baritone.description": "干饭时自动暂停男中音机器人的操作", + "module.auto-gap.potions.potions-regeneration": "恢复药水效果检测", + "module.auto-gap.potions.potions-regeneration.description": "如果再生效果没了,就自动吃金林檎。", + "module.auto-gap.potions.potions-fire-resistance": "抗火检测", + "module.auto-gap.potions.potions-fire-resistance.description": "如果抗火效果没了自动吃 需要附魔金林檎", + "module.auto-gap.potions.potions-absorption": "抗性提升检测", + "module.auto-gap.potions.potions-absorption.description": "如果抗性提升效果没了自动吃 需要附魔金林檎", + "module.auto-gap.health.health-enabled": "启用生命值检测", + "module.auto-gap.health.health-enabled.description": "如果健康下降到临界值以下,自动吃金林檎", + "module.auto-gap.health.health-threshold": "健康阈值", + "module.auto-gap.health.health-threshold.description": "自动吃食物的健康阈值。伤害吸收效果的血量计入其中。", + "module.quiver": "射箭", + "module.quiver.description": "给自己射箭.", + "module.quiver.general.effects": "效果", + "module.quiver.general.effects.description": "要给你射出的效果.", + "module.quiver.general.cooldown": "冷却", + "module.quiver.general.cooldown.description": "射出效果之间的刻冷却时间 (NCP最低19).", + "module.quiver.general.check-effects": "检查效果", + "module.quiver.general.check-effects.description": "不会给你已经有的效果射箭.", + "module.quiver.general.silent-bow": "无声弓", + "module.quiver.general.silent-bow.description": "从你的物品栏拿出一把弓来射箭.", + "module.quiver.general.chat-info": "聊天信息", + "module.quiver.general.chat-info.description": "在聊天中发送射箭检查的信息.", + "module.quiver.safety.only-in-holes": "只在洞里", + "module.quiver.safety.only-in-holes.description": "只有在洞里时才射箭.", + "module.quiver.safety.only-on-ground": "只在地面上", + "module.quiver.safety.only-on-ground.description": "只有在地面上时才射箭.", + "module.quiver.safety.min-health": "最低生命值", + "module.quiver.safety.min-health.description": "你必须有多少生命值才能射箭.", + "module.surround": "包围", + "module.surround.description": "用方块包围你,以防止水晶造成巨大的伤害。", + "module.surround.general.blocks": "方块", + "module.surround.general.blocks.description": "用于包围的方块。", + "module.surround.general.delay": "延迟", + "module.surround.general.delay.description": "方块放置之间的延迟,以刻为单位。", + "module.surround.general.center": "居中", + "module.surround.general.center.description": "将你传送到方块的中心。", + "module.surround.general.double-height": "双重高度", + "module.surround.general.double-height.description": "在原始包围方块的上方放置黑曜石,以防止人们对着你放置。", + "module.surround.general.only-on-ground": "只在地面上", + "module.surround.general.only-on-ground.description": "只有当你站在方块上时才起作用。", + "module.surround.general.toggle-modules": "切换模块", + "module.surround.general.toggle-modules.description": "当包围被激活时关闭其他模块。", + "module.surround.general.toggle-back-on": "切换回开", + "module.surround.general.toggle-back-on.description": "当包围被停用时重新开启其他模块。", + "module.surround.general.modules": "modules", + "module.surround.general.modules.description": "激活时要禁用的模块。", + "module.surround.general.rotate": "旋转", + "module.surround.general.rotate.description": "自动朝向被放置的黑曜石。", + "module.surround.general.protect": "保护", + "module.surround.general.protect.description": "尝试破坏包围位置周围的水晶,以防止包围被破坏。", + "module.surround.toggles.toggle-on-y-change": "切换Y变化", + "module.surround.toggles.toggle-on-y-change.description": "当你的Y级别改变时(步行,跳跃等)自动停用。", + "module.surround.toggles.toggle-on-complete": "切换完成", + "module.surround.toggles.toggle-on-complete.description": "当所有方块都放置好时切换关闭。", + "module.surround.toggles.toggle-on-death": "切换死亡", + "module.surround.toggles.toggle-on-death.description": "当你死亡时切换关闭。", + "module.surround.render.swing": "摇摆", + "module.surround.render.swing.description": "当放置包围方块时渲染你的手摇摆。", + "module.surround.render.render": "渲染", + "module.surround.render.render.description": "在黑曜石将被放置的地方渲染一个方块覆盖。", + "module.surround.render.below": "下方", + "module.surround.render.below.description": "渲染你下方的方块。", + "module.surround.render.shape-mode": "形状模式", + "module.surround.render.shape-mode.description": "形状的渲染方式.", + "module.surround.render.safe-side-color": "安全侧颜色", + "module.surround.render.safe-side-color.description": "安全方块的侧面颜色。", + "module.surround.render.safe-line-color": "安全线颜色", + "module.surround.render.safe-line-color.description": "安全方块的线条颜色。", + "module.surround.render.normal-side-color": "正常侧颜色", + "module.surround.render.normal-side-color.description": "正常方块的侧面颜色。", + "module.surround.render.normal-line-color": "正常线颜色", + "module.surround.render.normal-line-color.description": "正常方块的线条颜色。", + "module.surround.render.unsafe-side-color": "不安全侧颜色", + "module.surround.render.unsafe-side-color.description": "不安全方块的侧面颜色。", + "module.surround.render.unsafe-line-color": "不安全线颜色", + "module.surround.render.unsafe-line-color.description": "不安全方块的线条颜色。", + "module.offhand": "副手", + "module.offhand.description": "让你在副手持有指定的物品.", + "module.offhand.combat.item-switch-delay": "物品切换延迟", + "module.offhand.combat.item-switch-delay.description": "槽位移动之间的刻延迟.", + "module.offhand.combat.item.description": "要在副手持有的物品.", + "module.offhand.combat.hotbar": "物品栏", + "module.offhand.combat.hotbar.description": "是否使用物品栏中的物品.", + "module.offhand.combat.right-gapple": "右键金苹果", + "module.offhand.combat.right-gapple.description": "按住右键时切换到金苹果.(不要和药水开启时一起使用)", + "module.offhand.combat.sword-gapple": "剑金苹果", + "module.offhand.combat.sword-gapple.description": "拿着剑并按住右键时切换到金苹果.", + "module.offhand.combat.always-gap-on-sword": "剑总是金苹果", + "module.offhand.combat.always-gap-on-sword.description": "拿着剑时总是持有附魔金苹果.", + "module.offhand.combat.always-pot-on-sword": "剑总是药水", + "module.offhand.combat.always-pot-on-sword.description": "拿着剑时切换到药水", + "module.offhand.combat.sword-pot": "剑药水", + "module.offhand.combat.sword-pot.description": "拿着剑并按住右键时切换到药水.", + "module.offhand.totem.min-health": "最低生命值", + "module.offhand.totem.min-health.description": "低于这个生命值时持有图腾.", + "module.offhand.totem.elytra": "鞘翅", + "module.offhand.totem.elytra.description": "飞行时总是持有图腾.", + "module.offhand.totem.falling": "下落", + "module.offhand.totem.falling.description": "如果摔落伤害能杀死你,就持有图腾.", + "module.offhand.totem.explosion": "爆炸", + "module.offhand.totem.explosion.description": "当爆炸伤害可能致死时持有图腾。", + "module.scaffold": "脚手架", + "module.scaffold.description": "自动在你下方放置方块。", + "module.scaffold.general.blocks": "方块", + "module.scaffold.general.blocks.description": "选定的方块。", + "module.scaffold.general.blocks-filter": "方块过滤器", + "module.scaffold.general.blocks-filter.description": "如何使用方块列表设置", + "module.scaffold.general.fast-tower": "快速塔", + "module.scaffold.general.fast-tower.description": "是否更快地向上搭建脚手架。", + "module.scaffold.general.tower-speed": "塔速度", + "module.scaffold.general.tower-speed.description": "塔的建造速度。", + "module.scaffold.general.while-moving": "边移动边建造", + "module.scaffold.general.while-moving.description": "允许你在移动时建造塔。", + "module.scaffold.general.only-on-click": "仅点击", + "module.scaffold.general.only-on-click.description": "仅在按住右键时放置方块。", + "module.scaffold.general.swing": "摇摆", + "module.scaffold.general.swing.description": "渲染你客户端的摆动。", + "module.scaffold.general.auto-switch": "自动切换", + "module.scaffold.general.auto-switch.description": "放置前自动切换到一个方块。", + "module.scaffold.general.rotate": "旋转", + "module.scaffold.general.rotate.description": "旋转向被放置的方块。", + "module.scaffold.general.air-place": "空中放置", + "module.scaffold.general.air-place.description": "允许空中放置。这也允许你修改脚手架半径。", + "module.scaffold.general.ahead-distance": "前方距离", + "module.scaffold.general.ahead-distance.description": "放置方块的前方距离。", + "module.scaffold.general.closest-block-range": "最近方块范围", + "module.scaffold.general.closest-block-range.description": "当你在空中时,脚手架可以放置方块的距离。", + "module.scaffold.general.radius": "半径", + "module.scaffold.general.radius.description": "脚手架半径。", + "module.scaffold.general.blocks-per-tick": "每刻放置", + "module.scaffold.general.blocks-per-tick.description": "每刻放置的方块数量。", + "module.scaffold.render.render": "渲染", + "module.scaffold.render.render.description": "是否渲染已放置的方块。", + "module.scaffold.render.shape-mode": "形状模式", + "module.scaffold.render.shape-mode.description": "形状的渲染方式.", + "module.scaffold.render.side-color": "侧面颜色", + "module.scaffold.render.side-color.description": "目标方块渲染的侧面颜色。", + "module.scaffold.render.line-color": "线条颜色", + "module.scaffold.render.line-color.description": "目标方块渲染的线条颜色。", + "module.spam": "垃圾邮件", + "module.spam.description": "在聊天中发送指定的垃圾邮件消息。", + "module.spam.general.messages.description": "用于垃圾邮件的消息。", + "module.spam.general.delay": "延迟", + "module.spam.general.delay.description": "指定消息之间的延迟,单位为tick。", + "module.spam.general.disable-on-leave": "离开时禁用", + "module.spam.general.disable-on-leave.description": "离开服务器时禁用垃圾邮件。", + "module.spam.general.disable-on-disconnect": "断开时禁用", + "module.spam.general.disable-on-disconnect.description": "从服务器断开时禁用垃圾邮件。", + "module.spam.general.randomise": "随机", + "module.spam.general.randomise.description": "从垃圾邮件消息列表中选择一条随机消息。", + "module.spam.general.auto-split-messages": "自动拆分消息", + "module.spam.general.auto-split-messages.description": "在一定长度后自动拆分大消息", + "module.spam.general.split-length": "拆分长度", + "module.spam.general.split-length.description": "拆分聊天消息的长度", + "module.spam.general.split-delay": "拆分延迟", + "module.spam.general.split-delay.description": "拆分消息之间的延迟,单位为tick。", + "module.spam.general.bypass": "绕过", + "module.spam.general.bypass.description": "在消息末尾添加随机文本,以尝试绕过反垃圾邮件。", + "module.spam.general.include-uppercase-characters": "包含大写字符", + "module.spam.general.include-uppercase-characters.description": "绕过文本是否应包含大写字符。", + "module.spam.general.length": "长度", + "module.spam.general.length.description": "用于绕过反垃圾邮件的字符数。", + "module.auto-reconnect": "自动重连", + "module.auto-reconnect.description": "与服务器断开连接时自动重新连接。", + "module.auto-reconnect.general.delay": "延迟", + "module.auto-reconnect.general.delay.description": "重新连接到服务器之前要等待的秒数。", + "module.auto-reconnect.general.hide-buttons": "隐藏按钮", + "module.auto-reconnect.general.hide-buttons.description": "是否隐藏与自动重连相关的按钮。", + "module.notebot": "音符盒机器人", + "module.notebot.description": "优美地播放音符块", + "module.notebot.general.tick-delay.description": "加载歌曲时的延迟。", + "module.notebot.general.concurrent-tune-blocks": "并发音符块", + "module.notebot.general.concurrent-tune-blocks.description": "同一时间可以调整多少个音符块。在Paper上建议设置为1以避免出现bug。", + "module.notebot.general.mode": "模式", + "module.notebot.general.mode.description": "选择音符机器的模式", + "module.notebot.general.instrument-detect-mode": "乐器检测模式", + "module.notebot.general.instrument-detect-mode.description": "选择一个乐器检测模式。当服务器有修改音符块状态的插件时(例如ItemsAdder),但音符块仍能播放正确的音符时,这个设置可能有用", + "module.notebot.general.polyphonic": "复音", + "module.notebot.general.polyphonic.description": "是否允许同时播放多个音符", + "module.notebot.general.auto-rotate": "自动旋转", + "module.notebot.general.auto-rotate.description": "客户端是否应该查看音符块,当它想要击打它时", + "module.notebot.general.auto-play": "自动播放", + "module.notebot.general.auto-play.description": "自动播放随机歌曲", + "module.notebot.general.round-out-of-range": "超出范围四舍五入", + "module.notebot.general.round-out-of-range.description": "将超出范围的音符四舍五入", + "module.notebot.general.swing-arm": "摆臂", + "module.notebot.general.swing-arm.description": "击打时是否摆动手臂", + "module.notebot.general.check-noteblocks-again-delay": "检查音符块再次延迟", + "module.notebot.general.check-noteblocks-again-delay.description": "调整和检查之间的延迟时间", + "module.notebot.note-map.harp": "竖琴", + "module.notebot.note-map.basedrum": "低音鼓", + "module.notebot.note-map.snare": "小鼓", + "module.notebot.note-map.hat": "钹", + "module.notebot.note-map.bass": "贝斯", + "module.notebot.note-map.flute": "长笛", + "module.notebot.note-map.bell": "钟", + "module.notebot.note-map.guitar": "吉他", + "module.notebot.note-map.chime": "管钟", + "module.notebot.note-map.xylophone": "木琴", + "module.notebot.note-map.ironxylophone": "铁木琴", + "module.notebot.note-map.cowbell": "牛铃", + "module.notebot.note-map.didgeridoo": "迪吉里杜管", + "module.notebot.note-map.banjo": "班卓琴", + "module.notebot.note-map.pling": " 叮当声", + "module.notebot.render.render-text": "渲染文本", + "module.notebot.render.render-text.description": "是否渲染音符块上方的文本。", + "module.notebot.render.render-boxes": "渲染盒子", + "module.notebot.render.render-boxes.description": "是否渲染音符块周围的轮廓。", + "module.notebot.render.shape-mode": "形状模式", + "module.notebot.render.shape-mode.description": "形状的渲染方式.", + "module.notebot.render.untuned-side-color": "未调整侧边颜色", + "module.notebot.render.untuned-side-color.description": "未调整块的侧边颜色。", + "module.notebot.render.untuned-line-color": "未调整线条颜色", + "module.notebot.render.untuned-line-color.description": "未调整块的线条颜色。", + "module.notebot.render.tuned-side-color": "已调整侧边颜色", + "module.notebot.render.tuned-side-color.description": "已调整块的侧边颜色。", + "module.notebot.render.tuned-line-color": "已调整线条颜色", + "module.notebot.render.tuned-line-color.description": "已调整块的线条颜色。", + "module.notebot.render.hit-side-color": "击打侧边颜色", + "module.notebot.render.hit-side-color.description": "音符块击打时渲染的侧边颜色。", + "module.notebot.render.hit-line-color": "击打线条颜色", + "module.notebot.render.hit-line-color.description": "音符块击打时渲染的线条颜色。", + "module.notebot.render.scanned-noteblock-side-color": "扫描音符块侧边颜色", + "module.notebot.render.scanned-noteblock-side-color.description": "扫描音符块渲染的侧边颜色。", + "module.notebot.render.scanned-noteblock-line-color": "扫描音符块线条颜色", + "module.notebot.render.scanned-noteblock-line-color.description": "扫描音符块渲染的线条颜色。", + "module.notebot.render.note-text-scale": "音符文本缩放", + "module.notebot.render.note-text-scale.description": "缩放。", + "module.notebot.render.show-scanned-noteblocks": "显示扫描音符块", + "module.notebot.render.show-scanned-noteblocks.description": "显示扫描的音符块", + "module.anti-packet-kick": "反数据包踢出", + "module.anti-packet-kick.description": "尝试防止您被过大的数据包断开连接。", + "module.anti-packet-kick.general.catch-exceptions": "捕获异常", + "module.anti-packet-kick.general.catch-exceptions.description": "丢弃损坏的数据包。", + "module.anti-packet-kick.general.log-exceptions": "输出至日志", + "module.anti-packet-kick.general.log-exceptions.description": "日志捕获异常。", + "module.auto-anvil": "自动铁砧", + "module.auto-anvil.description": "自动用铁砧破坏敌人的头盔", + "module.auto-anvil.general.target-range": "锁定距离", + "module.auto-anvil.general.target-range.description": "玩家被锁定的半径", + "module.auto-anvil.general.target-priority": "目标优先级", + "module.auto-anvil.general.target-priority.description": "如何选择要瞄准的玩家", + "module.auto-anvil.general.height": "高度", + "module.auto-anvil.general.height.description": "放置铁砧的高度", + "module.auto-anvil.general.delay": "延迟", + "module.auto-anvil.general.delay.description": "放置铁砧的延迟", + "module.auto-anvil.general.place-at-feet": "脚填充", + "module.auto-anvil.general.place-at-feet.description": "自动给敌人脚上放置压力板或按钮来破坏铁砧", + "module.auto-anvil.general.multi-place": "多重放置", + "module.auto-anvil.general.multi-place.description": "一次性放置多个铁砧", + "module.auto-anvil.general.toggle-on-break": "自动关闭", + "module.auto-anvil.general.toggle-on-break.description": "当敌人的头盔爆了后自动关闭此模块", + "module.auto-anvil.general.rotate": "转头", + "module.auto-anvil.general.rotate.description": "自动将视线移动到铁砧/压力板/按钮上。", + "module.enderman-look": "末影人观察", + "module.enderman-look.description": "要么观察所有末影人,要么防止你看向末影人。", + "module.enderman-look.general.look-mode": "观察模式", + "module.enderman-look.general.look-mode.description": "此模块的行为方式。", + "module.enderman-look.general.stun-hostiles": "眩晕敌对生物", + "module.enderman-look.general.stun-hostiles.description": "自动盯着敌对的末影人使它们定在原地。", + "module.ghost-hand": "幽灵手", + "module.ghost-hand.description": "通过墙壁打开容器。", + "module.tunnel-esp": "隧道透视", + "module.tunnel-esp.description": "高亮隧道。", + "module.tunnel-esp.general.height": "高度", + "module.tunnel-esp.general.height.description": "渲染的盒子的高度。", + "module.tunnel-esp.general.connected": "连接", + "module.tunnel-esp.general.connected.description": "是否连接相邻的洞。", + "module.tunnel-esp.general.shape-mode": "形状模式", + "module.tunnel-esp.general.shape-mode.description": "形状的渲染方式.", + "module.tunnel-esp.general.side-color": "侧面颜色", + "module.tunnel-esp.general.side-color.description": "侧面的颜色。", + "module.tunnel-esp.general.line-color": "线条颜色", + "module.tunnel-esp.general.line-color.description": "线条的颜色。", + "module.step": "步高", + "module.step.description": "让你可以立刻走上整个方块。", + "module.step.general.height": "高度", + "module.step.general.height.description": "步高。", + "module.step.general.active-when": "激活条件", + "module.step.general.active-when.description": "当你满足这些条件时,步高才会激活。", + "module.step.general.safe-step": "安全步高", + "module.step.general.safe-step.description": "如果你的生命值很低或者附近有水晶,就不会让你从洞里走出去。", + "module.step.general.step-health": "步高生命值", + "module.step.general.step-health.description": "你不能步高的生命值。", + "module.auto-jump": "自动跳跃", + "module.auto-jump.general.mode": "模式", + "module.auto-jump.general.mode.description": "跳跃的方法。", + "module.auto-jump.general.jump-if": "跳跃条件", + "module.auto-jump.general.jump-if.description": "触发自动跳跃的条件", + "module.auto-jump.general.velocity-height": "击退高度", + "module.auto-jump.general.velocity-height.description": "被击退的距离", + "module.boat-fly": "船飞", + "module.boat-fly.description": "将你的船变成飞机.", + "module.boat-fly.general.speed": "速度", + "module.boat-fly.general.speed.description": "水平速度,单位为每秒方块数.", + "module.boat-fly.general.vertical-speed": "垂直速度", + "module.boat-fly.general.vertical-speed.description": "垂直速度,单位为每秒方块数.", + "module.boat-fly.general.fall-speed": "下落速度", + "module.boat-fly.general.fall-speed.description": "你下落的速度,单位为每秒方块数.", + "module.boat-fly.general.cancel-server-packets": "取消服务器数据包", + "module.boat-fly.general.cancel-server-packets.description": "取消进来的船只移动数据包.", + "module.hand-view": "手部视图", + "module.hand-view.description": "改变你手中物品的渲染方式。", + "module.hand-view.general.server-rotations": "服务器旋转", + "module.hand-view.general.server-rotations.description": "使你的手跟随你的服务器端旋转。", + "module.hand-view.general.old-animations": "旧动画", + "module.hand-view.general.old-animations.description": "将击打动画改为类似1.8的动画", + "module.hand-view.general.disable-eating-animation": "禁用进食动画", + "module.hand-view.general.disable-eating-animation.description": "禁用进食动画。如果它会超出屏幕,可能是你想要的。", + "module.hand-view.general.swing-mode": "挥动模式", + "module.hand-view.general.swing-mode.description": "修改你的客户端和服务器端的手挥动。", + "module.hand-view.general.swing-speed": "挥动速度", + "module.hand-view.general.swing-speed.description": "你的手的挥动速度。", + "module.hand-view.general.main-hand-progress": "主手进度", + "module.hand-view.general.main-hand-progress.description": "你主手的挥动进度。", + "module.hand-view.general.off-hand-progress": "副手进度", + "module.hand-view.general.off-hand-progress.description": "你副手的挥动进度。", + "module.hand-view.main-hand.scale": "比例", + "module.hand-view.main-hand.scale.description": "你主手的比例。", + "module.hand-view.main-hand.position": "位置", + "module.hand-view.main-hand.position.description": "你主手的位置。", + "module.hand-view.main-hand.rotation": "旋转", + "module.hand-view.main-hand.rotation.description": "你主手的旋转。", + "module.hand-view.off-hand.scale": "比例", + "module.hand-view.off-hand.scale.description": "你副手的比例。", + "module.hand-view.off-hand.position": "位置", + "module.hand-view.off-hand.position.description": "你副手的位置。", + "module.hand-view.off-hand.rotation": "旋转", + "module.hand-view.off-hand.rotation.description": "你副手的旋转。", + "module.hand-view.arm.scale": "比例", + "module.hand-view.arm.position": "位置", + "module.hand-view.arm.rotation": "旋转", + "module.parkour": "跑酷", + "module.parkour.description": "在方块的边缘自动跳跃。", + "module.parkour.general.edge-distance": "边缘距离", + "module.parkour.general.edge-distance.description": "你应该距离边缘多远才能跳跃。", + "module.hitboxes": "碰撞箱", + "module.hitboxes.description": "扩展实体的碰撞箱。", + "module.hitboxes.general.entities": "实体", + "module.hitboxes.general.entities.description": "要目标的实体。", + "module.hitboxes.general.expand": "扩展", + "module.hitboxes.general.expand.description": "要扩展的实体的碰撞箱的大小。", + "module.hitboxes.general.ignore-friends": "忽略好友", + "module.hitboxes.general.ignore-friends.description": "不扩展好友的碰撞箱。", + "module.hitboxes.general.only-on-weapon": "仅在武器", + "module.hitboxes.general.only-on-weapon.description": "只在手持武器时修改碰撞箱。", + "module.auto-tool": "自动工具", + "module.auto-tool.description": "执行操作时自动切换最佳工具。", + "module.auto-tool.general.prefer": "魔咒偏好", + "module.auto-tool.general.prefer.description": "要么丝绸之触,时运,要么都不。", + "module.auto-tool.general.silk-touch-for-ender-chest": "精准采集末影箱", + "module.auto-tool.general.silk-touch-for-ender-chest.description": "仅使用精准采集稿子挖末影箱", + "module.auto-tool.general.fortune-for-ores-and-crops": "使用时运工具挖矿/农作物", + "module.auto-tool.general.fortune-for-ores-and-crops.description": "挖矿石/庄稼使用带有时运的工具", + "module.auto-tool.general.anti-break": "反破损", + "module.auto-tool.general.anti-break.description": "不自动切换即将损坏的工具", + "module.auto-tool.general.anti-break-percentage": "反破损百分比", + "module.auto-tool.general.anti-break-percentage.description": "停止使用工具的耐久百分比。", + "module.auto-tool.general.switch-back": "回切", + "module.auto-tool.general.switch-back.description": "当你松开挖掘键时切换回原来的快捷栏", + "module.auto-tool.general.switch-delay": "切换延迟", + "module.auto-tool.general.switch-delay.description": "在切换工具前的延迟。", + "module.auto-tool.whitelist.list-mode": "列表模式", + "module.auto-tool.whitelist.list-mode.description": "选择模式。", + "module.auto-tool.whitelist.whitelist": "白名单", + "module.auto-tool.whitelist.whitelist.description": "你想用的工具", + "module.auto-tool.whitelist.blacklist": "黑名单", + "module.auto-tool.whitelist.blacklist.description": "您不想使用的工具。", + "module.slippy": "滑冰", + "module.slippy.description": "改变方块的基础摩擦水平。", + "module.slippy.general.friction": "摩擦", + "module.slippy.general.friction.description": "基础摩擦水平。", + "module.slippy.general.list-mode": "列表模式", + "module.slippy.general.list-mode.description": "选择方块的方式。", + "module.slippy.general.ignored-blocks": "忽略的方块", + "module.slippy.general.ignored-blocks.description": "决定哪些方块不会滑动", + "module.slippy.general.allowed-blocks": "允许的方块", + "module.slippy.general.allowed-blocks.description": "决定哪些方块会滑动", + "module.free-look": "自由视角", + "module.free-look.description": "在第三人称中允许更多的旋转选项。", + "module.free-look.general.mode": "模式", + "module.free-look.general.mode.description": "要旋转的实体。", + "module.free-look.general.toggle-perspective": "切换视角", + "module.free-look.general.toggle-perspective.description": "切换时改变你的视角。", + "module.free-look.general.camera-sensitivity": "摄像机灵敏度", + "module.free-look.general.camera-sensitivity.description": "摄像机模式下摄像机移动的速度。", + "module.free-look.arrows.arrows-control-opposite": "箭头控制相反", + "module.free-look.arrows.arrows-control-opposite.description": "允许你用箭头键控制其他实体的旋转。", + "module.free-look.arrows.arrow-speed": "箭头速度", + "module.free-look.arrows.arrow-speed.description": "用箭头键旋转的速度。", + "module.no-status-effects": "禁用状态效果", + "module.no-status-effects.description": "禁用指定的状态效果", + "module.auto-eat": "自动进食", + "module.auto-eat.description": "自动干饭", + "module.auto-eat.general.blacklist": "黑名单", + "module.auto-eat.general.blacklist.description": "不吃的东西", + "module.auto-eat.general.pause-auras": "暂停光环", + "module.auto-eat.general.pause-auras.description": "当干饭时暂停你的光环类功能", + "module.auto-eat.general.pause-baritone": "暂停男中音", + "module.auto-eat.general.pause-baritone.description": "干饭时自动暂停男中音机器人的操作", + "module.auto-eat.threshold.threshold-mode": "阈值模式", + "module.auto-eat.threshold.threshold-mode.description": "自动干饭的阈值", + "module.auto-eat.threshold.health-threshold": "健康阈值", + "module.auto-eat.threshold.health-threshold.description": "干饭的生命阈值(低于则自动干饭)", + "module.auto-eat.threshold.hunger-threshold": "饥饿阈值", + "module.auto-eat.threshold.hunger-threshold.description": "干饭的饥饿阈值(低于则自动干饭)", + "module.safe-walk": "安全行走", + "module.safe-walk.description": "防止你从方块上走下来。", + "module.freecam": "自由相机", + "module.freecam.description": "让摄像机从玩家分离。", + "module.freecam.general.speed": "速度", + "module.freecam.general.speed.description": "在自由视角中的速度。", + "module.freecam.general.speed-scroll-sensitivity": "速度滚轮灵敏度", + "module.freecam.general.speed-scroll-sensitivity.description": "允许你用滚轮改变速度值。0为关闭。", + "module.freecam.general.toggle-on-damage": "受伤时关闭", + "module.freecam.general.toggle-on-damage.description": "受伤时关闭自由视角。", + "module.freecam.general.toggle-on-death": "切换死亡", + "module.freecam.general.toggle-on-death.description": "死亡时关闭自由视角。", + "module.freecam.general.toggle-on-log": "断开时关闭", + "module.freecam.general.toggle-on-log.description": "从服务器断开时关闭自由视角。", + "module.freecam.general.reload-chunks": "重载区块", + "module.freecam.general.reload-chunks.description": "关闭洞穴剔除。", + "module.freecam.general.show-hands": "显示手", + "module.freecam.general.show-hands.description": "是否在自由视角中渲染你的手。", + "module.freecam.general.rotate": "旋转", + "module.freecam.general.rotate.description": "旋转到你看的方块或实体。", + "module.freecam.general.static": "静态", + "module.freecam.general.static.description": "关闭移动视角的设置。", + "module.city-esp": "挖脚-ESP", + "module.city-esp.description": "显示另一个玩家脚底的可以被破坏的方块。", + "module.city-esp.render.shape-mode": "形状模式", + "module.city-esp.render.shape-mode.description": "形状的渲染方式.", + "module.city-esp.render.side-color": "侧面颜色", + "module.city-esp.render.side-color.description": "渲染的侧面颜色。", + "module.city-esp.render.line-color": "线条颜色", + "module.city-esp.render.line-color.description": "渲染的线条颜色。", + "module.camera-tweaks": "相机微调", + "module.camera-tweaks.description": "允许修改第三人称相机。", + "module.camera-tweaks.general.clip": "剪辑", + "module.camera-tweaks.general.clip.description": "允许相机穿透方块。", + "module.camera-tweaks.general.camera-distance": "相机距离", + "module.camera-tweaks.general.camera-distance.description": "第三人称相机距离玩家的距离。", + "module.camera-tweaks.scrolling.scrolling": "滚动启用", + "module.camera-tweaks.scrolling.scrolling.description": "允许你滚动来改变相机距离。", + "module.camera-tweaks.scrolling.bind": "滚动灵敏度", + "module.camera-tweaks.scrolling.bind.description": "改变相机距离时的滚动灵敏度。0为禁用。", + "module.camera-tweaks.scrolling.sensitivity": "滚动按键绑定", + "module.camera-tweaks.scrolling.sensitivity.description": "需要按下一个按键才能使滚动生效。", + "module.anti-anvil": "反铁砧", + "module.anti-anvil.description": "自动通过放置方块在你和铁砧之间从而阻止自动铁砧", + "module.anti-anvil.general.swing": "挥手", + "module.anti-anvil.general.swing.description": "放置时自动摆动你的手臂", + "module.anti-anvil.general.rotate": "转头", + "module.anti-anvil.general.rotate.description": "放置时旋转视角。", + "module.chest-swap": "胸甲切换", + "module.chest-swap.description": "自动在胸甲和鞘翅之间切换。", + "module.chest-swap.general.chestplate": "胸甲", + "module.chest-swap.general.chestplate.description": "要切换到哪种类型的胸甲。", + "module.chest-swap.general.stay-on": "保持开启", + "module.chest-swap.general.stay-on.description": "保持开启并在你关闭时激活。", + "module.chest-swap.general.close-inventory": "关闭库存", + "module.chest-swap.general.close-inventory.description": "在切换后发送库存关闭。", + "module.burrow": "埋身", + "module.burrow.description": "尝试将你卡进方块里.", + "module.burrow.general.block-to-use": "使用方块", + "module.burrow.general.block-to-use.description": "用于埋身的方块.", + "module.burrow.general.instant": "瞬间", + "module.burrow.general.instant.description": "用数据包跳跃而不是原版跳跃.", + "module.burrow.general.automatic": "自动", + "module.burrow.general.automatic.description": "激活后自动埋身而不是等待跳跃.", + "module.burrow.general.trigger-height": "触发高度", + "module.burrow.general.trigger-height.description": "跳跃多高才触发橡皮筋.", + "module.burrow.general.rubberband-height": "橡皮筋高度", + "module.burrow.general.rubberband-height.description": "尝试造成橡皮筋的距离.", + "module.burrow.general.timer": "计时器", + "module.burrow.general.timer.description": "timer覆盖.", + "module.burrow.general.only-in-holes": "只在洞里", + "module.burrow.general.only-in-holes.description": "不在洞里时停止埋身.", + "module.burrow.general.center": "居中", + "module.burrow.general.center.description": "埋身前将你居中到方块的中间.", + "module.burrow.general.rotate": "旋转", + "module.burrow.general.rotate.description": "服务器端面向你放置的方块.", + "module.no-rotate": "无旋转", + "module.no-rotate.description": "尝试阻止服务器发送到客户端的旋转。", + "module.fake-player": "假玩家", + "module.fake-player.description": "生成一个客户端的假玩家用于测试用途。无需激活。", + "module.fake-player.general.name.description": "假玩家的名字。", + "module.fake-player.general.copy-inv": "复制物品栏", + "module.fake-player.general.copy-inv.description": "复制你的物品栏到假玩家。", + "module.fake-player.general.health": "生命值", + "module.fake-player.general.health.description": "假玩家的默认生命值。", + "module.anti-hunger": "反饥饿", + "module.anti-hunger.description": "减少(不排除)饥饿消耗。", + "module.anti-hunger.general.sprint": "疾跑", + "module.anti-hunger.general.sprint.description": "欺骗疾跑数据包", + "module.anti-hunger.general.on-ground": "地面", + "module.anti-hunger.general.on-ground.description": "伪造触地状态", + "module.anchor-aura": "重生锚光环", + "module.anchor-aura.description": "自动放置并破坏重生锚以伤害实体。", + "module.anchor-aura.general.target-range": "锁定距离", + "module.anchor-aura.general.target-range.description": "玩家被锁定的半径", + "module.anchor-aura.general.target-priority": "目标优先级", + "module.anchor-aura.general.target-priority.description": "如何选择要瞄准的玩家", + "module.anchor-aura.general.rotation-mode": "转头模式", + "module.anchor-aura.general.rotation-mode.description": "转头的模式", + "module.anchor-aura.general.max-self-damage": "最大自伤害", + "module.anchor-aura.general.max-self-damage.description": "允许的最大对自身的伤害。", + "module.anchor-aura.general.min-health": "安全阈值", + "module.anchor-aura.general.min-health.description": "允许攻击的最低生命值 低于此值不会攻击", + "module.anchor-aura.place.place": "放置", + "module.anchor-aura.place.place.description": "允许自动放置重生锚", + "module.anchor-aura.place.place-delay": "放置延迟", + "module.anchor-aura.place.place-delay.description": "放置重生锚的延迟(tick)", + "module.anchor-aura.place.place-mode": "放置模式", + "module.anchor-aura.place.place-mode.description": "允许将锚点放在你附近。", + "module.anchor-aura.place.place-range": "放置半径", + "module.anchor-aura.place.place-range.description": "锚放置的半径。", + "module.anchor-aura.place.placement-positions": "放置位置", + "module.anchor-aura.place.placement-positions.description": "在何种情况下将把锚放在实体身上。", + "module.anchor-aura.break.break-delay": "引爆延迟", + "module.anchor-aura.break.break-delay.description": "引爆重生锚的延迟(tick)", + "module.anchor-aura.break.break-mode": "引爆模式", + "module.anchor-aura.break.break-mode.description": "允许破坏你周围的重生锚", + "module.anchor-aura.break.break-range": "引爆半径", + "module.anchor-aura.break.break-range.description": "锚引爆的半径。", + "module.anchor-aura.pause.pause-on-eat": "在进食时停止", + "module.anchor-aura.pause.pause-on-eat.description": "进食时暂停。", + "module.anchor-aura.pause.pause-on-drink": "喝药时暂停", + "module.anchor-aura.pause.pause-on-drink.description": "喝药剂时暂停。", + "module.anchor-aura.pause.pause-on-mine": "在挖掘时暂停", + "module.anchor-aura.pause.pause-on-mine.description": "当挖掘方块时暂停此模块", + "module.anchor-aura.render.shape-mode": "形状模式", + "module.anchor-aura.render.shape-mode.description": "如何渲染形状。", + "module.anchor-aura.render.render-place": "渲染放置位置", + "module.anchor-aura.render.render-place.description": "渲染重生锚放置的位置", + "module.anchor-aura.render.place-side-color": "放置渲染的面颜色", + "module.anchor-aura.render.place-side-color.description": "放置位置的侧面颜色。", + "module.anchor-aura.render.place-line-color": "放置渲染的边框颜色", + "module.anchor-aura.render.place-line-color.description": "放置位置的边框颜色。", + "module.anchor-aura.render.render-break": "渲染引爆位置", + "module.anchor-aura.render.render-break.description": "渲染重生锚引爆的位置", + "module.anchor-aura.render.break-side-color": "引爆侧面颜色", + "module.anchor-aura.render.break-side-color.description": "引爆位置的侧面颜色。", + "module.anchor-aura.render.break-line-color": "引爆边框颜色", + "module.anchor-aura.render.break-line-color.description": "引爆位置的边框颜色。", + "module.auto-totem": "自动图腾", + "module.auto-totem.description": "自动给你的副手装备不死图腾", + "module.auto-totem.general.mode": "模式", + "module.auto-totem.general.mode.description": "确定何时装备不死图腾,严格模式将始终装备不死图腾。", + "module.auto-totem.general.delay": "延迟", + "module.auto-totem.general.delay.description": "补充图腾的延迟", + "module.auto-totem.general.health": "生命值", + "module.auto-totem.general.health.description": "装备图腾的生命阈值", + "module.auto-totem.general.elytra": "鞘翅", + "module.auto-totem.general.elytra.description": "当装备鞘翅时总是装备图腾。", + "module.auto-totem.general.fall": "摔落", + "module.auto-totem.general.fall.description": "在快要摔死时装备图腾逃离死神", + "module.auto-totem.general.explosion": "爆炸", + "module.auto-totem.general.explosion.description": "在快要被炸死时装备图腾逃离死神", + "module.speed": "速度", + "module.speed.description": "在地面上移动时修改你的移动速度。", + "module.speed.general.mode": "模式", + "module.speed.general.mode.description": "应用速度的方法。", + "module.speed.general.vanilla-speed": "原版速度", + "module.speed.general.vanilla-speed.description": "以每秒方块数为单位的速度。", + "module.speed.general.strafe-speed": "扫射速度", + "module.speed.general.strafe-speed.description": "速度。", + "module.speed.general.speed-limit": "速度限制", + "module.speed.general.speed-limit.description": "在有非常严格的反作弊的服务器上限制你的速度。", + "module.speed.general.timer": "计时器", + "module.speed.general.timer.description": "timer覆盖.", + "module.speed.general.in-liquids": "在液体中", + "module.speed.general.in-liquids.description": "在岩浆或水中使用速度。", + "module.speed.general.when-sneaking": "潜行时", + "module.speed.general.when-sneaking.description": "潜行时使用速度。", + "module.speed.general.only-on-ground": "只在地面上", + "module.speed.general.only-on-ground.description": "只在站在方块上时使用速度。" } From 4326bd1fb7b6d2bbb4f74c9ed30146ad33d0c2b5 Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Mon, 23 Mar 2026 23:14:24 +0000 Subject: [PATCH 71/72] Create some mixins to help navigating the language selection screen --- .../mixin/LanguageEntryMixin.java | 25 +++++++++++++++++++ .../LanguageSelectionListWidgetMixin.java | 22 ++++++++++++++++ src/main/resources/meteor-client.mixins.json | 2 ++ 3 files changed, 49 insertions(+) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/LanguageEntryMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/LanguageSelectionListWidgetMixin.java diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LanguageEntryMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LanguageEntryMixin.java new file mode 100644 index 0000000000..de8af65c35 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LanguageEntryMixin.java @@ -0,0 +1,25 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(targets = "net.minecraft.client.gui.screen.option.LanguageOptionsScreen$LanguageSelectionListWidget$LanguageEntry", remap = false) +public class LanguageEntryMixin { + @Shadow + @Final + String languageCode; + + @ModifyExpressionValue(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resource/language/LanguageDefinition;getDisplayText()Lnet/minecraft/text/Text;")) + private Text modifyDisplayText(Text original) { + return original.copy().append(" (" + languageCode + ")"); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LanguageSelectionListWidgetMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LanguageSelectionListWidgetMixin.java new file mode 100644 index 0000000000..a5e677a58b --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LanguageSelectionListWidgetMixin.java @@ -0,0 +1,22 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import net.minecraft.client.resource.language.LanguageDefinition; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.Locale; +import java.util.Map; + +@Mixin(targets = "net.minecraft.client.gui.screen.option.LanguageOptionsScreen$LanguageSelectionListWidget", remap = false) +public class LanguageSelectionListWidgetMixin { + @ModifyReturnValue(method = "method_76282", at = @At("RETURN")) + private static boolean modifySearch(boolean original, String string, Map.Entry entry) { + return original || entry.getKey().toLowerCase(Locale.ROOT).contains(string.toLowerCase(Locale.ROOT)); + } +} diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index a5020beab0..80fd83b5db 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -124,7 +124,9 @@ "KeyBindingCategoryMixin", "KeyboardInputMixin", "KeyboardMixin", + "LanguageEntryMixin", "LanguageManagerMixin", + "LanguageSelectionListWidgetMixin", "LayerRenderStateAccessor", "LightmapTextureManagerMixin", "LightningEntityRendererMixin", From 9227ab6a5f611e8f50d095d650c9b2646cf1aa31 Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Wed, 25 Mar 2026 22:14:13 +0000 Subject: [PATCH 72/72] Add translation specification file. Still probably needs more cleanup but acceptable for now. --- README.md | 3 + TRANSLATION_SPEC.md | 435 ++++++++++++++++++ .../utils/misc/MeteorTranslations.java | 7 +- .../utils/misc/text/MessageKind.java | 2 +- 4 files changed, 444 insertions(+), 3 deletions(-) create mode 100644 TRANSLATION_SPEC.md diff --git a/README.md b/README.md index 07237743e4..a2b88cc6ba 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,9 @@ We will review and help with all reasonable pull requests as long as the guideli - Favour readability over compactness. - If you need help, check out the [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html) for a reference. +## Translations +- Read our [translation specification](https://github.com/MeteorDevelopment/meteor-client/blob/master/TRANSLATION_SPEC.md) + ## Bugs and Suggestions Bug reports and suggestions should be made in this repo's [issue tracker](https://github.com/MeteorDevelopment/meteor-client/issues) using the templates provided. Please provide as much information as you can to best help us understand your issue and give a better chance of it being resolved. diff --git a/TRANSLATION_SPEC.md b/TRANSLATION_SPEC.md new file mode 100644 index 0000000000..a9b27050a1 --- /dev/null +++ b/TRANSLATION_SPEC.md @@ -0,0 +1,435 @@ +# Meteor Client Translation Key Specification + +--- + +## Overview + +Our translation system uses hierarchical, dot-separated keys to organize translatable strings across commands, modules, +UI, and configuration. Keys follow a deterministic structure that enables both core and addon developers to maintain +consistency while avoiding hardcoded strings. + +See PR [#6029](https://github.com/MeteorDevelopment/meteor-client/pull/6029) for the implementation and complete +migration from the old hardcoded format. + +## Motivation + +The primary motivation was to finally allow Meteor to be properly localised. We have fixed errors in the font system +to allow it to render arbitrary Unicode characters, added a language engine and refactored almost all user-facing parts +of the codebase to accept translatable strings instead of hardcoded ones. + +It also comes with the benefit of patching the translation exploit, which allowed servers to detect that players were +using meteor, even with no modules enabled. [See here](https://wurst.wiki/sign_translation_vulnerability) for more +information. + +--- + +## Key Format + +### General Structure + +``` +{namespace}.{entity}[.{sub-entity}] +``` + +All segments use **kebab-case** (hyphens between words, no underscores except where noted). + +### Namespace Categories + +| Namespace | Purpose | Examples | +|--------------|---------------------------------------|--------------------------------------------------| +| `meteor` | Core system (keybinds, language info) | `meteor.key.open-gui`, `meteor.lang.translators` | +| `command` | Commands and CLI features | `command.friends`, `command.give` | +| `module` | Gameplay/visual modules | `module.auto-fish`, `module.esp` | +| `category` | Module classification | `category.combat`, `category.render` | +| `config` | Configuration section headers | `config.chat`, `config.modules` | +| `hud` | HUD widget settings and labels | `hud.armor`, `hud.potion-timers` | +| `tab` | UI tab names | `tab.config`, `tab.modules` | +| `profile` | Profile system strings | `profile.general`, `profile.save` | +| `proxy` | Proxy configuration | `proxy.general`, `proxy.optional` | +| `setting` | Generic setting types | `setting.blockpos`, `setting.group` | +| `marker` | Marker types (visual aids) | `marker.cuboid`, `marker.sphere-2d` | +| `waypoint` | Waypoint system | `waypoint.position`, `waypoint.visual` | +| `macro` | Macro system | `macro.general` | +| `text` | UI text/labels | `text.*` | +| `theme` | UI themes | `theme.meteor` | +| `starscript` | Starscript system | `starscript.title` | + +### Prefix Behavior + +Keys are looked up as-is, with no automatic prefix modification: + +```java +MeteorTranslations.translate("module.auto-fish"); // looks up "module.auto-fish" +MeteorTranslations.translate("command.friends"); // looks up "command.friends" +MeteorTranslations.translate("meteor.key.open-gui"); // looks up "meteor.key.open-gui" +``` + +The namespace prefix is part of the key itself. Choose consistent prefixes based on context: `meteor.*`, `command.*`, +`module.*`, etc. + +--- + +## Entity and Sub-Entity Naming + +### Command Keys + +``` +command.{name} // Command name/title +command.{name}.description // Short description (shown in help) +command.{name}.error.{error-name} // Error messages used in the provided error method +command.{name}.warning.{warning-name} // Warning messages used in the provided warning method +command.{name}.info.{info-type} // Info messages used in the provided info method +command.{name}.exception.{exception-name} // Command exceptions +``` + +**Examples:** +``` +command.friends +command.friends.description +command.give.exception.no_space +``` + +### Module Keys + +``` +module.{name} // Module name/title +module.{name}.description // Brief description of module +module.{name}.{category}.{setting-name} // Setting within a category +module.{name}.{category}.{setting-name}.description // Setting description +``` + +**Examples:** +``` +module.auto-fish +module.auto-fish.description +module.auto-fish.general.auto-switch +module.auto-fish.general.auto-switch.description +module.auto-fish.general.cast-delay +``` + +### Base Module Keys + +The `module.base` namespace contains keys shared across all modules: + +``` +module.base.bind // Keybinding control label +module.base.bind.bind // Keybind assignment option +module.base.bind.toggle-on-release // Toggle behavior option +module.base.bind.chat-feedback // Option: show feedback in chat +module.base.active // "Active" label +module.base.toggled.on // Display when module is on +module.base.toggled.off // Display when module is off +module.base.bound // "Bound to [key]" indicator +module.base.unbound // "Not bound" indicator +module.base.copy-config // Button: copy configuration +module.base.paste-config // Button: paste configuration +module.base.from // "Pasted from..." label +``` + +### Category Keys + +Module categories for organization: + +``` +category.combat +category.movement +category.player +category.misc +category.render +category.world +``` + +Each should map to a human-readable category name in the translation file. + +--- + +## Keybinding Keys + +Keybindings use the `meteor.key` namespace: + +``` +meteor.key.category // Category name for key group (e.g., "Meteor Client") +meteor.key.{action} // Keybind display name +``` + +**Examples:** +```json +{ + "meteor.key.category": "Meteor Client", + "meteor.key.open-gui": "Open GUI", + "meteor.key.open-commands": "Open Commands" +} +``` + +These map to Minecraft's `KeyBinding` system and are translated via the `KeyBindingCategoryMixin` and +`ControlListWidgetMixin`. + +--- + +## Language Metadata + +``` +meteor.lang.translators // Credit line for translation contributors +``` + +**Example:** +```json +{ + "meteor.lang.translators": "MeteorDevelopment" +} +``` + +--- + +## Using `MeteorTranslations.translate()` + +```java +import meteordevelopment.meteorclient.utils.misc.MeteorTranslations; + +// Basic translation +String msg = MeteorTranslations.translate("module.auto-fish"); + +// With String.format-style arguments +String msg = MeteorTranslations.translate("command.friends.info.added", playerName); + +// With explicit String fallback +String msg = MeteorTranslations.translate("custom.key", "Default text"); + +// With String fallback and arguments +String msg = MeteorTranslations.translate( + "command.locate.info.mansion", + "Unknown location", + x, y, z +); + +// With lazy-evaluated fallback (Supplier) +String msg = MeteorTranslations.translate( + "module.custom.setting", + () -> "Computed default: " + computeDefault(), + args +); +``` + +Fallback chain: current language -> en_us -> explicit fallback (if provided) + +--- + +## Addon Developer Guidelines + +### Loading Addon Language Files + +Addon language files are automatically discovered and loaded. Place them at: + +`src/main/resources/assets/{addon-id}/language/{lang_code}.json` + +Example structure: +``` +my-addon/ + src/main/resources/assets/my-addon/language/ + en_us.json + de_de.json + fr_fr.json +``` + +Contents of `en_us.json`: +```json +{ + "module.custom-esp": "Custom ESP", + "module.custom-esp.description": "Advanced ESP renderer.", + "module.custom-esp.general.range": "Render Distance" +} +``` + +--- + +## Formatting and Style + +### Key Naming Rules + +1. **Use kebab-case for multi-word segments** + - YES: `auto-fish`, `toggle-on-release`, `cast-delay` + - NO: `auto_fish`, `toggleOnRelease`, `castdelay` + +2. **Use consistent entity names** + - Match the actual command/module name in code + - If module is `AutoFish`, key is `module.auto-fish` + +3. **Keep keys hierarchically shallow** (3-5 levels typical) + - YES: `module.auto-fish.general.cast-delay` + - NO: `module.auto-fish.settings.general.behavior.timing.cast.delay` + +### Value Guidelines + +1. **Descriptions** (tooltip-style): Keep under 100 characters; be precise. +2. **Messages**: Use `%s` for placeholders (Minecraft-style formatting). +3. **Consistency**: Reuse standard terms across keys (e.g., "Range", "Distance"). + +**Example values:** +```json +{ + "module.auto-fish.description": "Automatically casts and catches fish.", + "module.auto-fish.general.cast-delay": "Cast Delay", + "module.auto-fish.general.cast-delay.description": "Delay in ms before casting.", + "command.friends.info.added": "Added %s to friends.", + "command.locate.error.cant_locate_monument": "Couldn't locate the monument!" +} +``` + +--- + +## Language File Structure + +### File Location + +``` +src/main/resources/assets/meteor-client/language/{lang_code}.json +``` + +Language codes follow Minecraft's convention: `en_us`, `en_gb`, `fr_fr`, `de_de`, `zh_cn`, etc. + +### File Format + +A flat JSON object mapping keys to translated strings: + +```json +{ + "meteor.key.category": "Meteor Client", + "meteor.key.open-gui": "Open GUI", + "module.auto-fish": "Auto Fish", + "module.auto-fish.description": "Automatically casts and catches fish.", + "command.friends": "Friends", + "command.friends.description": "Manages friends.", + "command.friends.error.already_friends": "Already friends with that player." +} +``` + +### Best Practices + +- **Keep keys sorted** (e.g., within namespace groups for readability). +- **Ensure complete coverage** of keys for `en_us` (fallback language). +- **Validate JSON** before committing. + +--- + +## Fallback Behavior + +The translation system follows this resolution chain: + +1. **Current language** (user's selected locale) + - Check if key exists in current language map +2. **Default language** (always `en_us`) + - Check if key exists in en_us map +3. **Explicit fallback** (if provided) + - Return the provided fallback String or call Supplier +4. **Last resort**: Return the translation key itself + +**Code reference:** +```java +public static String translate(String key) { + MeteorLanguage currentLang = getCurrentLanguage(); + return currentLang.get(key, () -> getDefaultLanguage().get(key)); +} + +// With explicit fallback: +public static String translate(String key, String fallback) { + MeteorLanguage currentLang = getCurrentLanguage(); + return currentLang.get(key, () -> getDefaultLanguage().get(key, fallback)); +} +``` + +--- + +## Validation Checklist + +Before submitting PR or release: + +- All keys follow `{namespace}.{entity}[.{sub}]` pattern +- Keys use kebab-case for multi-word segments +- `en_us.json` is 100% complete (all keys present) +- No hardcoded English strings in source (use `MeteorTranslations.translate()`) +- New modules/commands documented in translation file +- JSON is valid and properly formatted + +--- + +## Examples + +### Full Command Example + +```java +// Code: Command with arguments +public class FriendsCommand extends Command { + private static final SimpleCommandExceptionType FRIEND_EXCEPTION = + new SimpleCommandExceptionType(MeteorClient.translatable("command.friends.exception.oops")); + + public FriendsCommand() { + super("friends"); + } + + public void addFriend(String playerName) { + info("added", playerName).send(); + + if (!logic()) throw FRIEND_EXCEPTION.create(); + } +} + +// JSON keys: +"command.friends": "Friends", +"command.friends.description": "Manages friends.", + +"command.friends.error.already_friends": "Already friends with that player.", +"command.friends.error.failed": "Failed to remove that friend.", +"command.friends.error.not_friends": "Not friends with that player.", +"command.friends.info.added": "Added %s to friends.", +"command.friends.info.removed": "Removed %s from friends.", +"command.friends.info.friends": "--- Friends (%s) ---", + +"command.friends.exception.oops": "Something went wrong.", +``` + +### Full Module Example + +```java +// Code: Module with settings +public class ExampleModule extends Module { + private final SettingGroup sgExample = settings.createGroup("example-setting-group"); + + public Setting value = sgExample.add(new IntSetting.Builder() + .name("value") + .min(1) + .defaultValue(10) + .build() + ); + + public ExampleModule() { + super("example-module"); + } + + @EventHandler + private void onTick(TickEvent.Pre event) { + info("random", value.get(), Math.random() * value.get()); + } +} + +// JSON keys: +"setting.group.example-setting-group": "Example Setting Group", + +"module.example-module": "Example Module", +"module.example-module.description": "Example module for the translations specification.", + +"module.example-module.example-setting-group.value": "Value", +"module.example-module.example-setting-group.value.description": "Example value.", + +"module.example-module.info.random": "The random value between 0 and %s is %s" +``` + +--- + +## See Also + +- PR #6029 - https://github.com/MeteorDevelopment/meteor-client/pull/6029 - Complete implementation and translation + format migration +- `MeteorTranslations.java` - Core translation system implementation +- `LanguageManagerMixin.java` - Minecraft language integration +- `KeyBindingCategoryMixin.java` - Keybind category translation +- `ControlListWidgetMixin.java` - Control widget translation override diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java index 32e312a3b9..3bb2c0b29d 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/MeteorTranslations.java @@ -28,7 +28,10 @@ import java.io.InputStreamReader; import java.io.Reader; import java.nio.charset.StandardCharsets; -import java.util.*; +import java.util.ArrayList; +import java.util.IllegalFormatException; +import java.util.List; +import java.util.Map; import java.util.function.Supplier; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -172,7 +175,7 @@ public static MeteorLanguage getDefaultLanguage() { * @return what percentage of the current language has been localised compared to the default language */ public static double percentLocalised() { - // Right now there aren't enough differences between the english dialects to justify each having their own + // Right now there aren't enough differences between the English dialects to justify each having their own // translation. Maybe that will change in the future. if (isEnglish()) return 100; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageKind.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageKind.java index a7e0f0ae2c..9bb97516c3 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageKind.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/text/MessageKind.java @@ -11,7 +11,7 @@ public enum MessageKind { Warning("warning"), Error("error"); - public String key; + public final String key; MessageKind(String key) { this.key = key;