From 32f9d53d0c67881541703fde64fd2fa2d3ad3f0f Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Thu, 17 Jul 2025 17:06:23 -0400 Subject: [PATCH 01/14] move abstract setting screens to `base` package --- .../gui/screens/settings/BlockListSettingScreen.java | 1 + .../gui/screens/settings/EnchantmentListSettingScreen.java | 1 + .../gui/screens/settings/ItemListSettingScreen.java | 1 + .../gui/screens/settings/ModuleListSettingScreen.java | 1 + .../gui/screens/settings/PacketBoolSettingScreen.java | 1 + .../gui/screens/settings/ParticleTypeListSettingScreen.java | 1 + .../gui/screens/settings/ScreenHandlerSettingScreen.java | 1 + .../gui/screens/settings/SoundEventListSettingScreen.java | 1 + .../gui/screens/settings/StatusEffectListSettingScreen.java | 1 + .../gui/screens/settings/StorageBlockListSettingScreen.java | 1 + .../settings/{ => base}/CollectionListSettingScreen.java | 2 +- .../settings/{ => base}/DynamicRegistryListSettingScreen.java | 2 +- 12 files changed, 12 insertions(+), 2 deletions(-) rename src/main/java/meteordevelopment/meteorclient/gui/screens/settings/{ => base}/CollectionListSettingScreen.java (98%) rename src/main/java/meteordevelopment/meteorclient/gui/screens/settings/{ => base}/DynamicRegistryListSettingScreen.java (99%) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java index 88000a2602..da1d70f35c 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.gui.screens.settings; import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionListSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.mixin.IdentifierAccessor; import meteordevelopment.meteorclient.settings.BlockListSetting; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EnchantmentListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EnchantmentListSettingScreen.java index 7ffdddd6bc..0d8a84f39a 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EnchantmentListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EnchantmentListSettingScreen.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.gui.screens.settings; import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.screens.settings.base.DynamicRegistryListSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.utils.misc.Names; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java index b73d6950da..b67cfc60db 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.gui.screens.settings; import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionListSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.ItemListSetting; import meteordevelopment.meteorclient.utils.misc.Names; 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 e00d03f37a..8a41985ca3 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ModuleListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ModuleListSettingScreen.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.gui.screens.settings; import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionListSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.systems.modules.Module; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PacketBoolSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PacketBoolSettingScreen.java index c4398694b1..6705918a5e 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PacketBoolSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PacketBoolSettingScreen.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.gui.screens.settings; import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionListSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.PacketListSetting; import meteordevelopment.meteorclient.settings.Setting; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ParticleTypeListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ParticleTypeListSettingScreen.java index a44f6c6823..b8064517e3 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ParticleTypeListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ParticleTypeListSettingScreen.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.gui.screens.settings; import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionListSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.utils.misc.Names; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ScreenHandlerSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ScreenHandlerSettingScreen.java index 75f6b1e53c..130abe4ecd 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ScreenHandlerSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ScreenHandlerSettingScreen.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.gui.screens.settings; import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionListSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.Setting; import net.minecraft.registry.Registries; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/SoundEventListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/SoundEventListSettingScreen.java index d28f1056bb..66fb50d7c9 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/SoundEventListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/SoundEventListSettingScreen.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.gui.screens.settings; import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionListSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.Setting; import net.minecraft.registry.Registries; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectListSettingScreen.java index 10bd546e28..b5e6788e9a 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectListSettingScreen.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.gui.screens.settings; import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionListSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.utils.misc.Names; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StorageBlockListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StorageBlockListSettingScreen.java index 5a0d50aaf6..acbc84addf 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StorageBlockListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StorageBlockListSettingScreen.java @@ -7,6 +7,7 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionListSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.StorageBlockListSetting; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/CollectionListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java similarity index 98% rename from src/main/java/meteordevelopment/meteorclient/gui/screens/settings/CollectionListSettingScreen.java rename to src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java index 70511658bf..a328b24dd9 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/CollectionListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java @@ -3,7 +3,7 @@ * Copyright (c) Meteor Development. */ -package meteordevelopment.meteorclient.gui.screens.settings; +package meteordevelopment.meteorclient.gui.screens.settings.base; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.WindowScreen; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/DynamicRegistryListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/DynamicRegistryListSettingScreen.java similarity index 99% rename from src/main/java/meteordevelopment/meteorclient/gui/screens/settings/DynamicRegistryListSettingScreen.java rename to src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/DynamicRegistryListSettingScreen.java index a0d13065c4..334c0bce9c 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/DynamicRegistryListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/DynamicRegistryListSettingScreen.java @@ -3,7 +3,7 @@ * Copyright (c) Meteor Development. */ -package meteordevelopment.meteorclient.gui.screens.settings; +package meteordevelopment.meteorclient.gui.screens.settings.base; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.WindowScreen; From 147ea815579e12a54598456af64f28ecfe3ae81c Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Thu, 17 Jul 2025 17:39:13 -0400 Subject: [PATCH 02/14] make `DynamicRegistryListSettingScreen` a subclass of `CollectionListSettingScreen` --- .../EnchantmentListSettingScreen.java | 1 + .../base/CollectionListSettingScreen.java | 54 +++--- .../DynamicRegistryListSettingScreen.java | 159 +++--------------- 3 files changed, 49 insertions(+), 165 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EnchantmentListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EnchantmentListSettingScreen.java index 0d8a84f39a..e4308f850c 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EnchantmentListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EnchantmentListSettingScreen.java @@ -26,6 +26,7 @@ protected WWidget getValueWidget(RegistryKey value) { return theme.label(getValueName(value)); } + // todo add internal names to search filters @Override protected String getValueName(RegistryKey value) { return Names.get(value); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java index a328b24dd9..21c91d63a4 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java @@ -49,15 +49,15 @@ public void initWidgets() { filterText = filter.get().trim(); table.clear(); - initWidgets(registry); + initTables(); }; table = add(theme.table()).expandX().widget(); - initWidgets(registry); + initTables(); } - private void initWidgets(Iterable registry) { + private void initTables() { // Left (all) WTable left = abc(pairs -> registry.forEach(t -> { if (skipValue(t) || collection.contains(t)) return; @@ -66,16 +66,16 @@ private void initWidgets(Iterable registry) { int diff = Utils.searchLevenshteinDefault(getValueName(t), filterText, false); if (words > 0 || diff <= getValueName(t).length() / 2) pairs.add(new Pair<>(t, -diff)); }), true, t -> { - addValue(registry, t); + addValue(t); T v = getAdditionalValue(t); - if (v != null) addValue(registry, v); + if (v != null) addValue(v); }); if (!left.cells.isEmpty()) table.add(theme.verticalSeparator()).expandWidgetY(); // Right (selected) - abc(pairs -> { + WTable right = abc(pairs -> { for (T value : collection) { if (skipValue(value)) continue; @@ -84,29 +84,13 @@ private void initWidgets(Iterable registry) { if (words > 0 || diff <= getValueName(value).length() / 2) pairs.add(new Pair<>(value, -diff)); } }, false, t -> { - removeValue(registry, t); + removeValue(t); T v = getAdditionalValue(t); - if (v != null) removeValue(registry, v); + if (v != null) removeValue(v); }); - } - - private void addValue(Iterable registry, T value) { - if (!collection.contains(value)) { - collection.add(value); - - setting.onChanged(); - table.clear(); - initWidgets(registry); - } - } - private void removeValue(Iterable registry, T value) { - if (collection.remove(value)) { - setting.onChanged(); - table.clear(); - initWidgets(registry); - } + postWidgets(left, right); } private WTable abc(Consumer>> addValues, boolean isLeft, Consumer buttonAction) { @@ -136,6 +120,26 @@ private WTable abc(Consumer>> addValues, boolean isLeft, C return table; } + protected void addValue(T value) { + if (!collection.contains(value)) { + collection.add(value); + + setting.onChanged(); + table.clear(); + initWidgets(); + } + } + + protected void removeValue(T value) { + if (collection.remove(value)) { + setting.onChanged(); + table.clear(); + initWidgets(); + } + } + + protected void postWidgets(WTable left, WTable right) {} + protected boolean includeValue(T value) { return true; } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/DynamicRegistryListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/DynamicRegistryListSettingScreen.java index 334c0bce9c..f151dddea3 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/DynamicRegistryListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/DynamicRegistryListSettingScreen.java @@ -5,86 +5,44 @@ package meteordevelopment.meteorclient.gui.screens.settings.base; +import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; import meteordevelopment.meteorclient.gui.GuiTheme; -import meteordevelopment.meteorclient.gui.WindowScreen; -import meteordevelopment.meteorclient.gui.utils.Cell; -import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.gui.widgets.containers.WHorizontalList; import meteordevelopment.meteorclient.gui.widgets.containers.WTable; import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; -import meteordevelopment.meteorclient.gui.widgets.pressable.WPressable; import meteordevelopment.meteorclient.settings.Setting; -import meteordevelopment.meteorclient.utils.Utils; import net.minecraft.client.MinecraftClient; -import net.minecraft.registry.Registry; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.registry.*; import net.minecraft.util.Identifier; import net.minecraft.util.InvalidIdentifierException; -import net.minecraft.util.Pair; -import java.util.*; -import java.util.function.Consumer; +import java.util.Collection; +import java.util.Optional; +import java.util.Set; -public abstract class DynamicRegistryListSettingScreen extends WindowScreen { - protected final Setting setting; - protected final Collection> collection; - private final RegistryKey> registryKey; - private final Optional> registry; +public abstract class DynamicRegistryListSettingScreen extends CollectionListSettingScreen> { + protected final RegistryKey> registryKey; - private WTextBox filter; - private String filterText = ""; - - private WTable table; - - public DynamicRegistryListSettingScreen(GuiTheme theme, String title, Setting setting, Collection> collection, RegistryKey> registryKey) { - super(theme, title); + public DynamicRegistryListSettingScreen(GuiTheme theme, String title, Setting setting, Collection> collection, RegistryKey> registryKey) { + super(theme, title, setting, collection, createUniverse(collection, registryKey)); this.registryKey = registryKey; - this.registry = Optional.ofNullable(MinecraftClient.getInstance().getNetworkHandler()) - .flatMap(networkHandler -> networkHandler.getRegistryManager().getOptional(registryKey)); - this.setting = setting; - this.collection = collection; } - @Override - public void initWidgets() { - // Filter - filter = add(theme.textBox("")).minWidth(400).expandX().widget(); - filter.setFocused(true); - filter.action = () -> { - filterText = filter.get().trim(); - - table.clear(); - generateWidgets(); - }; + private static Iterable> createUniverse(Collection> collection, RegistryKey> registryKey) { + Set> set = new ReferenceOpenHashSet<>(collection); - table = add(theme.table()).expandX().widget(); + Optional.ofNullable(MinecraftClient.getInstance().getNetworkHandler()) + .map(networkHandler -> (RegistryWrapper.WrapperLookup) networkHandler.getRegistryManager()) + .orElseGet(BuiltinRegistries::createWrapperLookup) + .getOptional(registryKey) + .ifPresent(registry -> registry.streamKeys().forEach(set::add)); - generateWidgets(); + return set; } - private void generateWidgets() { - // Left (all) - WTable left = abc(pairs -> registry.ifPresent(registry -> { - registry.streamEntries() - .map(RegistryEntry.Reference::getKey) - .filter(Optional::isPresent) - .map(Optional::get).forEach(t -> { - if (skipValue(t) || collection.contains(t)) return; - - int words = Utils.searchInWords(getValueName(t), filterText); - int diff = Utils.searchLevenshteinDefault(getValueName(t), filterText, false); - if (words > 0 || diff <= getValueName(t).length() / 2) pairs.add(new Pair<>(t, -diff)); - }); - }), true, t -> { - addValue(t); - - RegistryKey v = getAdditionalValue(t); - if (v != null) addValue(v); - } - ); - + @Override + protected void postWidgets(WTable left, WTable right) { if (!left.cells.isEmpty()) { left.add(theme.horizontalSeparator()).expandX(); left.row(); @@ -99,84 +57,5 @@ private void generateWidgets() { addValue(RegistryKey.of(registryKey, id)); } catch (InvalidIdentifierException ignored) {} }; - - table.add(theme.verticalSeparator()).expandWidgetY(); - - // Right (selected) - abc(pairs -> { - for (RegistryKey value : collection) { - if (skipValue(value)) continue; - - int words = Utils.searchInWords(getValueName(value), filterText); - int diff = Utils.searchLevenshteinDefault(getValueName(value), filterText, false); - if (words > 0 || diff <= getValueName(value).length() / 2) pairs.add(new Pair<>(value, -diff)); - } - }, false, t -> { - removeValue(t); - - RegistryKey v = getAdditionalValue(t); - if (v != null) removeValue(v); - }); - } - - private void addValue(RegistryKey value) { - if (!collection.contains(value)) { - collection.add(value); - - setting.onChanged(); - table.clear(); - generateWidgets(); - } - } - - private void removeValue(RegistryKey value) { - if (collection.remove(value)) { - setting.onChanged(); - table.clear(); - generateWidgets(); - } - } - - private WTable abc(Consumer, Integer>>> addValues, boolean isLeft, Consumer> buttonAction) { - // Create - Cell cell = this.table.add(theme.table()).top(); - WTable table = cell.widget(); - - Consumer> forEach = t -> { - if (!includeValue(t)) return; - - table.add(getValueWidget(t)); - - WPressable button = table.add(isLeft ? theme.plus() : theme.minus()).expandCellX().right().widget(); - button.action = () -> buttonAction.accept(t); - - table.row(); - }; - - // Sort - List, Integer>> values = new ArrayList<>(); - addValues.accept(values); - if (!filterText.isEmpty()) values.sort(Comparator.comparingInt(value -> -value.getRight())); - for (Pair, Integer> pair : values) forEach.accept(pair.getLeft()); - - if (!table.cells.isEmpty()) cell.expandX(); - - return table; - } - - protected boolean includeValue(RegistryKey value) { - return true; - } - - protected abstract WWidget getValueWidget(RegistryKey value); - - protected abstract String getValueName(RegistryKey value); - - protected boolean skipValue(RegistryKey value) { - return false; - } - - protected RegistryKey getAdditionalValue(RegistryKey value) { - return null; } } From 646b2a32c9a8db3d562b02bdb69c463809a5f9b2 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Thu, 17 Jul 2025 19:03:40 -0400 Subject: [PATCH 03/14] add `BlockDataSettingScreen` abstraction --- .../gui/DefaultSettingsWidgetFactory.java | 2 +- .../settings/BlockDataSettingScreen.java | 90 +++++------------ .../base/CollectionMapSettingScreen.java | 99 +++++++++++++++++++ 3 files changed, 122 insertions(+), 69 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java diff --git a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java index 457e28e319..d1214aabe4 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java @@ -337,7 +337,7 @@ private void screenHandlerListW(WTable table, ScreenHandlerListSetting setting) private void blockDataW(WTable table, BlockDataSetting setting) { WButton button = table.add(theme.button(GuiRenderer.EDIT)).expandCellX().widget(); - button.action = () -> mc.setScreen(new BlockDataSettingScreen(theme, setting)); + button.action = () -> mc.setScreen(new BlockDataSettingScreen<>(theme, setting)); reset(table, setting, null); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java index f9896d0699..a40285e4b2 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java @@ -6,10 +6,9 @@ package meteordevelopment.meteorclient.gui.screens.settings; import meteordevelopment.meteorclient.gui.GuiTheme; -import meteordevelopment.meteorclient.gui.WindowScreen; import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; -import meteordevelopment.meteorclient.gui.widgets.containers.WTable; -import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; +import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionMapSettingScreen; +import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; import meteordevelopment.meteorclient.settings.BlockDataSetting; import meteordevelopment.meteorclient.settings.IBlockData; @@ -19,83 +18,38 @@ import meteordevelopment.meteorclient.utils.misc.Names; import net.minecraft.block.Block; import net.minecraft.registry.Registries; -import org.apache.commons.lang3.StringUtils; - -import java.util.ArrayList; -import java.util.List; +import org.jetbrains.annotations.Nullable; import static meteordevelopment.meteorclient.MeteorClient.mc; -public class BlockDataSettingScreen extends WindowScreen { - private static final List BLOCKS = new ArrayList<>(100); - - private final BlockDataSetting setting; - - private WTable table; - private String filterText = ""; +public class BlockDataSettingScreen & ISerializable & IChangeable & IBlockData> extends CollectionMapSettingScreen { + private final BlockDataSetting setting; - public BlockDataSettingScreen(GuiTheme theme, BlockDataSetting setting) { - super(theme, "Configure Blocks"); + public BlockDataSettingScreen(GuiTheme theme, BlockDataSetting setting) { + super(theme, "Configure Blocks", setting, setting.get(), Registries.BLOCK); this.setting = setting; } @Override - public void initWidgets() { - WTextBox filter = add(theme.textBox("")).minWidth(400).expandX().widget(); - filter.setFocused(true); - filter.action = () -> { - filterText = filter.get().trim(); - - table.clear(); - initTable(); - }; - - table = add(theme.table()).expandX().widget(); - - initTable(); + protected WWidget getValueWidget(Block block) { + return theme.itemWithLabel(block.asItem().getDefaultStack(), Names.get(block)); } - @SuppressWarnings("unchecked") - public & ISerializable & IChangeable & IBlockData> void initTable() { - for (Block block : Registries.BLOCK) { - T blockData = (T) setting.get().get(block); - - if (blockData != null && blockData.isChanged()) BLOCKS.addFirst(block); - else BLOCKS.add(block); - } - - for (Block block : BLOCKS) { - String name = Names.get(block); - if (!StringUtils.containsIgnoreCase(name, filterText)) continue; - - T blockData = (T) setting.get().get(block); - - table.add(theme.itemWithLabel(block.asItem().getDefaultStack(), Names.get(block))).expandCellX(); - table.add(theme.label((blockData != null && blockData.isChanged()) ? "*" : " ")); - - WButton edit = table.add(theme.button(GuiRenderer.EDIT)).widget(); - edit.action = () -> { - T data = blockData; - if (data == null) data = (T) setting.defaultData.get().copy(); - - mc.setScreen(data.createScreen(theme, block, (BlockDataSetting) setting)); - }; - - WButton reset = table.add(theme.button(GuiRenderer.RESET)).widget(); - reset.action = () -> { - setting.get().remove(block); - setting.onChanged(); - - if (blockData != null && blockData.isChanged()) { - table.clear(); - initTable(); - } - }; + @Override + protected WWidget getDataWidget(Block block, @Nullable T blockData) { + WButton edit = theme.button(GuiRenderer.EDIT); + edit.action = () -> { + T data = blockData; + if (data == null) data = setting.defaultData.get().copy(); - table.row(); - } + mc.setScreen(data.createScreen(theme, block, setting)); + }; + return edit; + } - BLOCKS.clear(); + @Override + protected String getValueName(Block block) { + return Names.get(block); } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java new file mode 100644 index 0000000000..5044b3a40c --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java @@ -0,0 +1,99 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.gui.screens.settings.base; + +import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.WindowScreen; +import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; +import meteordevelopment.meteorclient.gui.widgets.WWidget; +import meteordevelopment.meteorclient.gui.widgets.containers.WTable; +import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; +import meteordevelopment.meteorclient.settings.Setting; +import meteordevelopment.meteorclient.utils.Utils; +import meteordevelopment.meteorclient.utils.misc.IChangeable; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; + +public abstract class CollectionMapSettingScreen extends WindowScreen { + private final Setting setting; + protected final Map map; + private final Iterable registry; + + private WTable table; + private String filterText = ""; + + public CollectionMapSettingScreen(GuiTheme theme, String title, Setting setting, Map map, Iterable registry) { + super(theme, title); + + this.setting = setting; + this.map = map; + this.registry = registry; + } + + @Override + public void initWidgets() { + // Filter + WTextBox filter = add(theme.textBox("")).minWidth(400).expandX().widget(); + filter.setFocused(true); + filter.action = () -> { + filterText = filter.get().trim(); + + table.clear(); + initTable(); + }; + + table = add(theme.table()).expandX().widget(); + + initTable(); + } + + private void initTable() { + registry.forEach(t -> { // todo sorting + if (skipValue(t) || !includeValue(t)) return; // todo redundancy + + String name = getValueName(t); + int words = Utils.searchInWords(name, filterText); + int diff = Utils.searchLevenshteinDefault(name, filterText, false); + if (words <= 0 && diff > name.length() / 2) return; + + @Nullable V data = map.get(t); + boolean isChanged = data instanceof IChangeable changeable && changeable.isChanged(); + + table.add(getValueWidget(t)).expandCellX(); + table.add(theme.label(isChanged ? "*" : " ")); + table.add(getDataWidget(t, data)); + + table.add(theme.button(GuiRenderer.RESET)).widget().action = () -> { + removeValue(t); + }; + + table.row(); + }); + } + + protected void removeValue(K value) { + if (map.remove(value) != null) { + setting.onChanged(); + table.clear(); + initWidgets(); + } + } + + protected boolean includeValue(K value) { + return true; + } + + protected abstract WWidget getValueWidget(K value); + + protected abstract WWidget getDataWidget(K value, @Nullable V data); + + protected abstract String getValueName(K value); + + protected boolean skipValue(K value) { + return false; + } +} From 780a61d03e01c0fc2bd16aa1a1a21b84735e8371 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Thu, 17 Jul 2025 20:45:37 -0400 Subject: [PATCH 04/14] remove redundant filtering --- .../gui/screens/settings/BlockListSettingScreen.java | 9 ++++----- .../settings/ParticleTypeListSettingScreen.java | 10 +++++----- .../settings/base/CollectionListSettingScreen.java | 10 ++-------- .../settings/base/CollectionMapSettingScreen.java | 6 +----- 4 files changed, 12 insertions(+), 23 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java index da1d70f35c..dc62b48c16 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java @@ -29,6 +29,10 @@ public BlockListSettingScreen(GuiTheme theme, Setting> setting) { @Override protected boolean includeValue(Block value) { + if (Registries.BLOCK.getId(value).getPath().endsWith("_wall_banner")) { + return false; + } + Predicate filter = ((BlockListSetting) setting).filter; if (filter == null) return value != Blocks.AIR; @@ -45,11 +49,6 @@ protected String getValueName(Block value) { return Names.get(value); } - @Override - protected boolean skipValue(Block value) { - return Registries.BLOCK.getId(value).getPath().endsWith("_wall_banner"); - } - @Override protected Block getAdditionalValue(Block value) { String path = Registries.BLOCK.getId(value).getPath(); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ParticleTypeListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ParticleTypeListSettingScreen.java index b8064517e3..3a9dc8c3b8 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ParticleTypeListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ParticleTypeListSettingScreen.java @@ -21,6 +21,11 @@ public ParticleTypeListSettingScreen(GuiTheme theme, Setting value) { + return value instanceof ParticleEffect; + } + @Override protected WWidget getValueWidget(ParticleType value) { return theme.label(getValueName(value)); @@ -30,9 +35,4 @@ protected WWidget getValueWidget(ParticleType value) { protected String getValueName(ParticleType value) { return Names.get(value); } - - @Override - protected boolean skipValue(ParticleType value) { - return !(value instanceof ParticleEffect); - } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java index 21c91d63a4..4db424cf0e 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java @@ -60,7 +60,7 @@ public void initWidgets() { private void initTables() { // Left (all) WTable left = abc(pairs -> registry.forEach(t -> { - if (skipValue(t) || collection.contains(t)) return; + if ((!includeValue(t)) || collection.contains(t)) return; int words = Utils.searchInWords(getValueName(t), filterText); int diff = Utils.searchLevenshteinDefault(getValueName(t), filterText, false); @@ -77,7 +77,7 @@ private void initTables() { // Right (selected) WTable right = abc(pairs -> { for (T value : collection) { - if (skipValue(value)) continue; + if (!includeValue(value)) continue; int words = Utils.searchInWords(getValueName(value), filterText); int diff = Utils.searchLevenshteinDefault(getValueName(value), filterText, false); @@ -99,8 +99,6 @@ private WTable abc(Consumer>> addValues, boolean isLeft, C WTable table = cell.widget(); Consumer forEach = t -> { - if (!includeValue(t)) return; - table.add(getValueWidget(t)); WPressable button = table.add(isLeft ? theme.plus() : theme.minus()).expandCellX().right().widget(); @@ -148,10 +146,6 @@ protected boolean includeValue(T value) { protected abstract String getValueName(T value); - protected boolean skipValue(T value) { - return false; - } - protected T getAdditionalValue(T value) { return null; } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java index 5044b3a40c..681262ab25 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java @@ -53,7 +53,7 @@ public void initWidgets() { private void initTable() { registry.forEach(t -> { // todo sorting - if (skipValue(t) || !includeValue(t)) return; // todo redundancy + if (!includeValue(t)) return; String name = getValueName(t); int words = Utils.searchInWords(name, filterText); @@ -92,8 +92,4 @@ protected boolean includeValue(K value) { protected abstract WWidget getDataWidget(K value, @Nullable V data); protected abstract String getValueName(K value); - - protected boolean skipValue(K value) { - return false; - } } From 9280c23f056c764dcc1b2a9d358ffb1fc1f1952d Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Thu, 17 Jul 2025 22:06:25 -0400 Subject: [PATCH 05/14] improve sorting --- .../base/CollectionListSettingScreen.java | 43 ++---- .../base/CollectionMapSettingScreen.java | 12 +- .../screens/settings/base/SortingHelper.java | 135 ++++++++++++++++++ 3 files changed, 152 insertions(+), 38 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java index 4db424cf0e..eea38760f3 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java @@ -13,14 +13,10 @@ import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; import meteordevelopment.meteorclient.gui.widgets.pressable.WPressable; import meteordevelopment.meteorclient.settings.Setting; -import meteordevelopment.meteorclient.utils.Utils; -import net.minecraft.util.Pair; -import java.util.ArrayList; import java.util.Collection; -import java.util.Comparator; -import java.util.List; import java.util.function.Consumer; +import java.util.function.Predicate; public abstract class CollectionListSettingScreen extends WindowScreen { protected final Setting setting; @@ -59,13 +55,7 @@ public void initWidgets() { private void initTables() { // Left (all) - WTable left = abc(pairs -> registry.forEach(t -> { - if ((!includeValue(t)) || collection.contains(t)) return; - - int words = Utils.searchInWords(getValueName(t), filterText); - int diff = Utils.searchLevenshteinDefault(getValueName(t), filterText, false); - if (words > 0 || diff <= getValueName(t).length() / 2) pairs.add(new Pair<>(t, -diff)); - }), true, t -> { + WTable left = abc(registry, true, t -> { addValue(t); T v = getAdditionalValue(t); @@ -75,15 +65,7 @@ private void initTables() { if (!left.cells.isEmpty()) table.add(theme.verticalSeparator()).expandWidgetY(); // Right (selected) - WTable right = abc(pairs -> { - for (T value : collection) { - if (!includeValue(value)) continue; - - int words = Utils.searchInWords(getValueName(value), filterText); - int diff = Utils.searchLevenshteinDefault(getValueName(value), filterText, false); - if (words > 0 || diff <= getValueName(value).length() / 2) pairs.add(new Pair<>(value, -diff)); - } - }, false, t -> { + WTable right = abc(collection, false, t -> { removeValue(t); T v = getAdditionalValue(t); @@ -93,25 +75,26 @@ private void initTables() { postWidgets(left, right); } - private WTable abc(Consumer>> addValues, boolean isLeft, Consumer buttonAction) { + private WTable abc(Iterable iterable, boolean isLeft, Consumer buttonAction) { // Create Cell cell = this.table.add(theme.table()).top(); WTable table = cell.widget(); - Consumer forEach = t -> { + // Sort + Predicate predicate = isLeft + ? value -> this.includeValue(value) && !collection.contains(value) + : this::includeValue; + + Iterable sorted = SortingHelper.sort(iterable, predicate, this::getValueName, filterText); + + sorted.forEach(t -> { table.add(getValueWidget(t)); WPressable button = table.add(isLeft ? theme.plus() : theme.minus()).expandCellX().right().widget(); button.action = () -> buttonAction.accept(t); table.row(); - }; - - // Sort - List> values = new ArrayList<>(); - addValues.accept(values); - if (!filterText.isEmpty()) values.sort(Comparator.comparingInt(value -> -value.getRight())); - for (Pair pair : values) forEach.accept(pair.getLeft()); + }); if (!table.cells.isEmpty()) cell.expandX(); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java index 681262ab25..9911b9e1cc 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java @@ -12,10 +12,10 @@ import meteordevelopment.meteorclient.gui.widgets.containers.WTable; import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; import meteordevelopment.meteorclient.settings.Setting; -import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.IChangeable; import org.jetbrains.annotations.Nullable; +import java.util.Comparator; import java.util.Map; public abstract class CollectionMapSettingScreen extends WindowScreen { @@ -52,14 +52,10 @@ public void initWidgets() { } private void initTable() { - registry.forEach(t -> { // todo sorting - if (!includeValue(t)) return; - - String name = getValueName(t); - int words = Utils.searchInWords(name, filterText); - int diff = Utils.searchLevenshteinDefault(name, filterText, false); - if (words <= 0 && diff > name.length() / 2) return; + Comparator prioritizeChanged = Comparator.comparing(key -> map.get(key) instanceof IChangeable changeable && changeable.isChanged()); + Iterable sorted = SortingHelper.sortWithPriority(registry, this::includeValue, this::getValueName, filterText, prioritizeChanged); + sorted.forEach(t -> { @Nullable V data = map.get(t); boolean isChanged = data instanceof IChangeable changeable && changeable.isChanged(); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java new file mode 100644 index 0000000000..f143662de5 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java @@ -0,0 +1,135 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.gui.screens.settings.base; + +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import meteordevelopment.meteorclient.utils.Utils; +import net.minecraft.util.collection.IndexedIterable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Predicate; + +public final class SortingHelper { + private static final Comparator> FILTER_COMPARATOR = Comparator.comparingInt(Entry::distance); + + private SortingHelper() {} + + public static Iterable sort(Iterable registry, Predicate filter, Function nameFunction, String filterText) { + return sortInternal(registry, filter, nameFunction, filterText, null); + } + + public static Iterable sortWithPriority(Iterable registry, Predicate filter, Function nameFunction, String filterText, Comparator comparator) { + return sortInternal(registry, filter, nameFunction, filterText, comparator); + } + + private static Iterable sortInternal(Iterable registry, Predicate filter, Function nameFunction, String filterText, @Nullable Comparator comparator) { + if (filterText.isBlank()) { + if (comparator == null) { + return filtering(registry, filter); + } else { + List list = createList(registry); + + for (T value : registry) { + if (filter.test(value)) { + list.add(value); + } + } + + list.sort(comparator); + + return list; + } + } else { + List> list = createList(registry); + + for (T value : registry) { + if (!filter.test(value)) { + continue; + } + + String name = nameFunction.apply(value); + int words = Utils.searchInWords(name, filterText); + int distance = Utils.searchLevenshteinDefault(name, filterText, false); + if (words > 0 || distance <= name.length() / 2) { + list.add(new Entry<>(value, distance)); + } + } + + Comparator> entryComparator = comparator != null + ? Comparator., T>comparing(Entry::value, comparator).thenComparing(filterComparator()) + : filterComparator(); + + list.sort(entryComparator); + + return iterate(list); + } + } + + private static List createList(Iterable iterable) { + if (iterable instanceof IndexedIterable indexed) { + return new ObjectArrayList<>(indexed.size()); + } else if (iterable instanceof Collection collection) { + return new ObjectArrayList<>(collection.size()); + } else { + return new ObjectArrayList<>(); + } + } + + @SuppressWarnings("unchecked") + private static Comparator> filterComparator() { + return (Comparator>) (Object) FILTER_COMPARATOR; + } + + private static Iterable iterate(List> sortedList) { + return new Iterable<>() { + @NotNull + @Override + public Iterator iterator() { + return new Iterator<>() { + private final Iterator> it = sortedList.iterator(); + + @Override + public boolean hasNext() { + return it.hasNext(); + } + + @Override + public T next() { + return it.next().value(); + } + }; + } + }; + } + + private static Iterable filtering(Iterable iterable, Predicate filter) { + return new Iterable<>() { + @NotNull + @Override + public Iterator iterator() { + throw new UnsupportedOperationException("Iterator not supported by this Iterable."); + } + + @Override + public void forEach(Consumer action) { + for (T value : iterable) { + if (filter.test(value)) { + action.accept(value); + } + } + } + }; + } + + public record Entry(T value, int distance) {} +} From 318e5876cf22e3bd2b34a7cb8587aca518dbed00 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Thu, 17 Jul 2025 22:38:34 -0400 Subject: [PATCH 06/14] add internal names & module aliases to list setting filtering --- .../settings/BlockDataSettingScreen.java | 7 ++++-- .../settings/BlockListSettingScreen.java | 9 ++++--- .../EnchantmentListSettingScreen.java | 10 +++++--- .../settings/ItemListSettingScreen.java | 7 ++++-- .../settings/ModuleListSettingScreen.java | 9 ++++--- .../settings/PacketBoolSettingScreen.java | 9 ++++--- .../ParticleTypeListSettingScreen.java | 9 ++++--- .../settings/ScreenHandlerSettingScreen.java | 10 ++++++-- .../settings/SoundEventListSettingScreen.java | 10 +++++--- .../StatusEffectListSettingScreen.java | 9 ++++--- .../StorageBlockListSettingScreen.java | 12 ++++++--- .../base/CollectionListSettingScreen.java | 4 +-- .../base/CollectionMapSettingScreen.java | 4 +-- .../screens/settings/base/SortingHelper.java | 25 +++++++++++++------ 14 files changed, 90 insertions(+), 44 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java index a40285e4b2..7543638047 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java @@ -49,7 +49,10 @@ protected WWidget getDataWidget(Block block, @Nullable T blockData) { } @Override - protected String getValueName(Block block) { - return Names.get(block); + protected String[] getValueNames(Block block) { + return new String[]{ + Names.get(block), + Registries.BLOCK.getId(block).toString() + }; } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java index dc62b48c16..adb63f959e 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java @@ -41,12 +41,15 @@ protected boolean includeValue(Block value) { @Override protected WWidget getValueWidget(Block value) { - return theme.itemWithLabel(value.asItem().getDefaultStack(), getValueName(value)); + return theme.itemWithLabel(value.asItem().getDefaultStack(), Names.get(value)); } @Override - protected String getValueName(Block value) { - return Names.get(value); + protected String[] getValueNames(Block value) { + return new String[]{ + Names.get(value), + Registries.BLOCK.getId(value).toString() + }; } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EnchantmentListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EnchantmentListSettingScreen.java index e4308f850c..f6dad94ea0 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EnchantmentListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EnchantmentListSettingScreen.java @@ -23,12 +23,14 @@ public EnchantmentListSettingScreen(GuiTheme theme, Setting value) { - return theme.label(getValueName(value)); + return theme.label(Names.get(value)); } - // todo add internal names to search filters @Override - protected String getValueName(RegistryKey value) { - return Names.get(value); + protected String[] getValueNames(RegistryKey value) { + return new String[]{ + Names.get(value), + value.getValue().toString() + }; } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java index b67cfc60db..3e58d7d70f 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java @@ -35,7 +35,10 @@ protected WWidget getValueWidget(Item value) { } @Override - protected String getValueName(Item value) { - return Names.get(value); + protected String[] getValueNames(Item value) { + return new String[]{ + Names.get(value), + Registries.ITEM.getId(value).toString() + }; } } 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 8a41985ca3..b8b3ab4fbf 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ModuleListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ModuleListSettingScreen.java @@ -21,11 +21,14 @@ public ModuleListSettingScreen(GuiTheme theme, Setting> setting) { @Override protected WWidget getValueWidget(Module value) { - return theme.label(getValueName(value)); + return theme.label(value.title); } @Override - protected String getValueName(Module value) { - return value.title; + 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; + return names; } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PacketBoolSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PacketBoolSettingScreen.java index 6705918a5e..ee765c1dc0 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PacketBoolSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PacketBoolSettingScreen.java @@ -31,11 +31,14 @@ protected boolean includeValue(Class> value) { @Override protected WWidget getValueWidget(Class> value) { - return theme.label(getValueName(value)); + return theme.label(PacketUtils.getName(value)); } @Override - protected String getValueName(Class> value) { - return PacketUtils.getName(value); + protected String[] getValueNames(Class> value) { + return new String[]{ + PacketUtils.getName(value), + value.getSimpleName() + }; } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ParticleTypeListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ParticleTypeListSettingScreen.java index 3a9dc8c3b8..ae2cc22806 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ParticleTypeListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ParticleTypeListSettingScreen.java @@ -28,11 +28,14 @@ protected boolean includeValue(ParticleType value) { @Override protected WWidget getValueWidget(ParticleType value) { - return theme.label(getValueName(value)); + return theme.label(Names.get(value)); } @Override - protected String getValueName(ParticleType value) { - return Names.get(value); + protected String[] getValueNames(ParticleType value) { + return new String[]{ + Names.get(value), + Registries.PARTICLE_TYPE.getId(value).toString() + }; } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ScreenHandlerSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ScreenHandlerSettingScreen.java index 130abe4ecd..c779f4b37a 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ScreenHandlerSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ScreenHandlerSettingScreen.java @@ -21,11 +21,17 @@ public ScreenHandlerSettingScreen(GuiTheme theme, Setting value) { - return theme.label(getValueName(value)); + return theme.label(getName(value)); } @Override - protected String getValueName(ScreenHandlerType type) { + protected String[] getValueNames(ScreenHandlerType type) { + return new String[]{ + getName(type) + }; + } + + private static String getName(ScreenHandlerType type) { return Registries.SCREEN_HANDLER.getId(type).toString(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/SoundEventListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/SoundEventListSettingScreen.java index 66fb50d7c9..f94bdbfd15 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/SoundEventListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/SoundEventListSettingScreen.java @@ -9,6 +9,7 @@ import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionListSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.Setting; +import net.minecraft.client.resource.language.I18n; import net.minecraft.registry.Registries; import net.minecraft.sound.SoundEvent; @@ -21,11 +22,14 @@ public SoundEventListSettingScreen(GuiTheme theme, Setting> set @Override protected WWidget getValueWidget(SoundEvent value) { - return theme.label(getValueName(value)); + return theme.label(value.id().getPath()); } @Override - protected String getValueName(SoundEvent value) { - return value.id().getPath(); + protected String[] getValueNames(SoundEvent value) { + return new String[]{ + value.id().toString(), + I18n.translate("subtitles." + value.id().getPath()) + }; } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectListSettingScreen.java index b5e6788e9a..608c035a6b 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectListSettingScreen.java @@ -27,12 +27,15 @@ public StatusEffectListSettingScreen(GuiTheme theme, Setting> @Override protected WWidget getValueWidget(StatusEffect value) { - return theme.itemWithLabel(getPotionStack(value), getValueName(value)); + return theme.itemWithLabel(getPotionStack(value), Names.get(value)); } @Override - protected String getValueName(StatusEffect value) { - return Names.get(value); + protected String[] getValueNames(StatusEffect value) { + return new String[]{ + Names.get(value), + Registries.STATUS_EFFECT.getId(value).toString() + }; } private ItemStack getPotionStack(StatusEffect effect) { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StorageBlockListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StorageBlockListSettingScreen.java index acbc84addf..f73d2cfb9e 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StorageBlockListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StorageBlockListSettingScreen.java @@ -14,6 +14,7 @@ import net.minecraft.block.entity.BlockEntityType; import net.minecraft.item.Item; import net.minecraft.item.Items; +import net.minecraft.registry.Registries; import java.util.List; import java.util.Map; @@ -48,13 +49,16 @@ public StorageBlockListSettingScreen(GuiTheme theme, Setting value) { - Item item = BLOCK_ENTITY_TYPE_INFO_MAP.getOrDefault(value, UNKNOWN).item(); - return theme.itemWithLabel(item.getDefaultStack(), getValueName(value)); + BlockEntityTypeInfo info = BLOCK_ENTITY_TYPE_INFO_MAP.getOrDefault(value, UNKNOWN); + return theme.itemWithLabel(info.item().getDefaultStack(), info.name()); } @Override - protected String getValueName(BlockEntityType value) { - return BLOCK_ENTITY_TYPE_INFO_MAP.getOrDefault(value, UNKNOWN).name(); + protected String[] getValueNames(BlockEntityType value) { + return new String[]{ + BLOCK_ENTITY_TYPE_INFO_MAP.getOrDefault(value, UNKNOWN).name(), + Registries.BLOCK_ENTITY_TYPE.getId(value).toString() + }; } private record BlockEntityTypeInfo(Item item, String name) {} diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java index eea38760f3..ecf4a02840 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java @@ -85,7 +85,7 @@ private WTable abc(Iterable iterable, boolean isLeft, Consumer buttonActio ? value -> this.includeValue(value) && !collection.contains(value) : this::includeValue; - Iterable sorted = SortingHelper.sort(iterable, predicate, this::getValueName, filterText); + Iterable sorted = SortingHelper.sort(iterable, predicate, this::getValueNames, filterText); sorted.forEach(t -> { table.add(getValueWidget(t)); @@ -127,7 +127,7 @@ protected boolean includeValue(T value) { protected abstract WWidget getValueWidget(T value); - protected abstract String getValueName(T value); + protected abstract String[] getValueNames(T value); protected T getAdditionalValue(T value) { return null; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java index 9911b9e1cc..c541efe7ad 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java @@ -53,7 +53,7 @@ public void initWidgets() { private void initTable() { Comparator prioritizeChanged = Comparator.comparing(key -> map.get(key) instanceof IChangeable changeable && changeable.isChanged()); - Iterable sorted = SortingHelper.sortWithPriority(registry, this::includeValue, this::getValueName, filterText, prioritizeChanged); + Iterable sorted = SortingHelper.sortWithPriority(registry, this::includeValue, this::getValueNames, filterText, prioritizeChanged); sorted.forEach(t -> { @Nullable V data = map.get(t); @@ -87,5 +87,5 @@ protected boolean includeValue(K value) { protected abstract WWidget getDataWidget(K value, @Nullable V data); - protected abstract String getValueName(K value); + protected abstract String[] getValueNames(K value); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java index f143662de5..5231262c30 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java @@ -24,15 +24,15 @@ public final class SortingHelper { private SortingHelper() {} - public static Iterable sort(Iterable registry, Predicate filter, Function nameFunction, String filterText) { + public static Iterable sort(Iterable registry, Predicate filter, Function nameFunction, String filterText) { return sortInternal(registry, filter, nameFunction, filterText, null); } - public static Iterable sortWithPriority(Iterable registry, Predicate filter, Function nameFunction, String filterText, Comparator comparator) { + public static Iterable sortWithPriority(Iterable registry, Predicate filter, Function nameFunction, String filterText, Comparator comparator) { return sortInternal(registry, filter, nameFunction, filterText, comparator); } - private static Iterable sortInternal(Iterable registry, Predicate filter, Function nameFunction, String filterText, @Nullable Comparator comparator) { + private static Iterable sortInternal(Iterable registry, Predicate filter, Function nameFunction, String filterText, @Nullable Comparator comparator) { if (filterText.isBlank()) { if (comparator == null) { return filtering(registry, filter); @@ -57,11 +57,20 @@ private static Iterable sortInternal(Iterable registry, Predicate f continue; } - String name = nameFunction.apply(value); - int words = Utils.searchInWords(name, filterText); - int distance = Utils.searchLevenshteinDefault(name, filterText, false); - if (words > 0 || distance <= name.length() / 2) { - list.add(new Entry<>(value, distance)); + String[] names = nameFunction.apply(value); + int bestWords = 0; + int bestDistance = Integer.MAX_VALUE; + float relevancy = 0; + for (String name : names) { + int words = Utils.searchInWords(name, filterText); + int distance = Utils.searchLevenshteinDefault(name, filterText, false); + bestWords = Math.max(bestWords, words); + bestDistance = Math.min(bestDistance, distance); + relevancy = Math.max(relevancy, distance / (name.length() / 2f)); + } + + if (bestWords > 0 || relevancy >= 0.5f) { + list.add(new Entry<>(value, bestDistance)); } } From 708190f50eb42cc3d65af8b0c3f4b82bbacf0575 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Thu, 17 Jul 2025 22:45:56 -0400 Subject: [PATCH 07/14] consistency --- .../settings/base/CollectionListSettingScreen.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java index ecf4a02840..cf846c58d8 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java @@ -23,10 +23,8 @@ public abstract class CollectionListSettingScreen extends WindowScreen { protected final Collection collection; private final Iterable registry; - private WTextBox filter; - private String filterText = ""; - private WTable table; + private String filterText = ""; public CollectionListSettingScreen(GuiTheme theme, String title, Setting setting, Collection collection, Iterable registry) { super(theme, title); @@ -39,21 +37,21 @@ public CollectionListSettingScreen(GuiTheme theme, String title, Setting sett @Override public void initWidgets() { // Filter - filter = add(theme.textBox("")).minWidth(400).expandX().widget(); + WTextBox filter = add(theme.textBox("")).minWidth(400).expandX().widget(); filter.setFocused(true); filter.action = () -> { filterText = filter.get().trim(); table.clear(); - initTables(); + initTable(); }; table = add(theme.table()).expandX().widget(); - initTables(); + initTable(); } - private void initTables() { + private void initTable() { // Left (all) WTable left = abc(registry, true, t -> { addValue(t); From 7e6983ae603a4c3e8d2620fc4bab98cccd4bab96 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Thu, 17 Jul 2025 22:54:18 -0400 Subject: [PATCH 08/14] fix map setting & block data showing air --- .../gui/screens/settings/BlockDataSettingScreen.java | 6 ++++++ .../screens/settings/base/CollectionMapSettingScreen.java | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java index 7543638047..23b86b2f6b 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java @@ -17,6 +17,7 @@ import meteordevelopment.meteorclient.utils.misc.ISerializable; import meteordevelopment.meteorclient.utils.misc.Names; import net.minecraft.block.Block; +import net.minecraft.block.Blocks; import net.minecraft.registry.Registries; import org.jetbrains.annotations.Nullable; @@ -31,6 +32,11 @@ public BlockDataSettingScreen(GuiTheme theme, BlockDataSetting setting) { this.setting = setting; } + @Override + protected boolean includeValue(Block value) { + return value != Blocks.AIR; + } + @Override protected WWidget getValueWidget(Block block) { return theme.itemWithLabel(block.asItem().getDefaultStack(), Names.get(block)); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java index c541efe7ad..5ca289a35b 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java @@ -52,7 +52,7 @@ public void initWidgets() { } private void initTable() { - Comparator prioritizeChanged = Comparator.comparing(key -> map.get(key) instanceof IChangeable changeable && changeable.isChanged()); + Comparator prioritizeChanged = Comparator.comparing(key -> !(map.get(key) instanceof IChangeable changeable && changeable.isChanged())); Iterable sorted = SortingHelper.sortWithPriority(registry, this::includeValue, this::getValueNames, filterText, prioritizeChanged); sorted.forEach(t -> { From 53c5a396cc20a460b985daef252caf426c4d84ef Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Thu, 17 Jul 2025 23:00:36 -0400 Subject: [PATCH 09/14] fix filtering name relevancy --- .../meteorclient/gui/screens/settings/base/SortingHelper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java index 5231262c30..c078c14545 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java @@ -60,13 +60,13 @@ private static Iterable sortInternal(Iterable registry, Predicate f String[] names = nameFunction.apply(value); int bestWords = 0; int bestDistance = Integer.MAX_VALUE; - float relevancy = 0; + float relevancy = 0f; for (String name : names) { int words = Utils.searchInWords(name, filterText); int distance = Utils.searchLevenshteinDefault(name, filterText, false); bestWords = Math.max(bestWords, words); bestDistance = Math.min(bestDistance, distance); - relevancy = Math.max(relevancy, distance / (name.length() / 2f)); + relevancy = Math.max(relevancy, 1f - (float) distance / name.length()); } if (bestWords > 0 || relevancy >= 0.5f) { From 0af3bddc0ade44f25c60f5fa5863394e5e8f680d Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Thu, 17 Jul 2025 23:04:10 -0400 Subject: [PATCH 10/14] improve `BlockListSettingScreen` --- .../settings/BlockListSettingScreen.java | 10 ++-------- .../screens/settings/base/SortingHelper.java | 2 +- .../meteorclient/mixin/IdentifierAccessor.java | 18 ------------------ src/main/resources/meteor-client.mixins.json | 1 - 4 files changed, 3 insertions(+), 28 deletions(-) delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/IdentifierAccessor.java diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java index adb63f959e..d0309ce85b 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java @@ -8,22 +8,17 @@ import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionListSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; -import meteordevelopment.meteorclient.mixin.IdentifierAccessor; import meteordevelopment.meteorclient.settings.BlockListSetting; -import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.utils.misc.Names; import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; -import java.util.List; import java.util.function.Predicate; public class BlockListSettingScreen extends CollectionListSettingScreen { - private static final Identifier ID = Identifier.of("minecraft", ""); - - public BlockListSettingScreen(GuiTheme theme, Setting> setting) { + public BlockListSettingScreen(GuiTheme theme, BlockListSetting setting) { super(theme, "Select Blocks", setting, setting.get(), Registries.BLOCK); } @@ -57,7 +52,6 @@ protected Block getAdditionalValue(Block value) { String path = Registries.BLOCK.getId(value).getPath(); if (!path.endsWith("_banner")) return null; - ((IdentifierAccessor) (Object) ID).setPath(path.substring(0, path.length() - 6) + "wall_banner"); - return Registries.BLOCK.get(ID); + return Registries.BLOCK.get(Identifier.ofVanilla(path.substring(0, path.length() - 6) + "wall_banner")); } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java index c078c14545..ed0b9be450 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java @@ -126,7 +126,7 @@ private static Iterable filtering(Iterable iterable, Predicate filt @NotNull @Override public Iterator iterator() { - throw new UnsupportedOperationException("Iterator not supported by this Iterable."); + throw new UnsupportedOperationException("iterator() not supported by this Iterable, use forEach() instead."); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/IdentifierAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/IdentifierAccessor.java deleted file mode 100644 index 9c91897b9c..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/IdentifierAccessor.java +++ /dev/null @@ -1,18 +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 net.minecraft.util.Identifier; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(Identifier.class) -public interface IdentifierAccessor { - @Mutable - @Accessor - void setPath(String path); -} diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index f124d1e770..891af51395 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -102,7 +102,6 @@ "HeadFeatureRendererMixin", "HeldItemRendererMixin", "HorseScreenHandlerAccessor", - "IdentifierAccessor", "InGameHudMixin", "InGameOverlayRendererMixin", "ItemEntityRendererMixin", From d0692ded304e656d2bf5997a3608eacbd81c7b18 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Wed, 23 Jul 2025 18:49:45 -0400 Subject: [PATCH 11/14] fix multiple filter inputs --- .../screens/settings/base/CollectionListSettingScreen.java | 4 ++-- .../gui/screens/settings/base/CollectionMapSettingScreen.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java index cf846c58d8..80ab96978e 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java @@ -105,7 +105,7 @@ protected void addValue(T value) { setting.onChanged(); table.clear(); - initWidgets(); + initTable(); } } @@ -113,7 +113,7 @@ protected void removeValue(T value) { if (collection.remove(value)) { setting.onChanged(); table.clear(); - initWidgets(); + initTable(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java index 5ca289a35b..5ed1032224 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java @@ -75,7 +75,7 @@ protected void removeValue(K value) { if (map.remove(value) != null) { setting.onChanged(); table.clear(); - initWidgets(); + initTable(); } } From 961679a2a0524d03766c50068cadf2c66fe8d684 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Wed, 23 Jul 2025 20:19:59 -0400 Subject: [PATCH 12/14] properly propagate setting changes --- .../gui/screens/settings/BlockDataSettingScreen.java | 11 +++++++++++ .../settings/base/CollectionListSettingScreen.java | 12 +++++++----- .../settings/base/CollectionMapSettingScreen.java | 8 ++++++-- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java index 23b86b2f6b..edae8bff8f 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java @@ -18,6 +18,7 @@ import meteordevelopment.meteorclient.utils.misc.Names; import net.minecraft.block.Block; import net.minecraft.block.Blocks; +import net.minecraft.client.gui.DrawContext; import net.minecraft.registry.Registries; import org.jetbrains.annotations.Nullable; @@ -25,6 +26,7 @@ public class BlockDataSettingScreen & ISerializable & IChangeable & IBlockData> extends CollectionMapSettingScreen { private final BlockDataSetting setting; + private boolean invalidate; public BlockDataSettingScreen(GuiTheme theme, BlockDataSetting setting) { super(theme, "Configure Blocks", setting, setting.get(), Registries.BLOCK); @@ -50,10 +52,19 @@ protected WWidget getDataWidget(Block block, @Nullable T blockData) { if (data == null) data = setting.defaultData.get().copy(); mc.setScreen(data.createScreen(theme, block, setting)); + invalidate = true; }; return edit; } + @Override + protected void onRenderBefore(DrawContext drawContext, float delta) { + if (invalidate) { + this.invalidateTable(); + invalidate = false; + } + } + @Override protected String[] getValueNames(Block block) { return new String[]{ diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java index 80ab96978e..831dfbff0e 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionListSettingScreen.java @@ -99,21 +99,23 @@ private WTable abc(Iterable iterable, boolean isLeft, Consumer buttonActio return table; } + protected void invalidateTable() { + table.clear(); + initTable(); + } + protected void addValue(T value) { if (!collection.contains(value)) { collection.add(value); - setting.onChanged(); - table.clear(); - initTable(); + invalidateTable(); } } protected void removeValue(T value) { if (collection.remove(value)) { setting.onChanged(); - table.clear(); - initTable(); + invalidateTable(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java index 5ed1032224..e59e63d111 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/CollectionMapSettingScreen.java @@ -71,11 +71,15 @@ private void initTable() { }); } + protected void invalidateTable() { + table.clear(); + initTable(); + } + protected void removeValue(K value) { if (map.remove(value) != null) { setting.onChanged(); - table.clear(); - initTable(); + invalidateTable(); } } From 11ac6bdadecc335d97b27603f84b65ca9f0aec6f Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Wed, 23 Jul 2025 20:25:39 -0400 Subject: [PATCH 13/14] fix `ESPBlockData` wrongly marked as changed --- .../render/blockesp/ESPBlockDataScreen.java | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) 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 2686b88b6d..dc4cfcdc1b 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 @@ -37,8 +37,10 @@ public void initWidgets() { .defaultValue(ShapeMode.Lines) .onModuleActivated(shapeModeSetting -> shapeModeSetting.set(blockData.shapeMode)) .onChanged(shapeMode -> { - blockData.shapeMode = shapeMode; - changed(blockData, block, setting); + if (blockData.shapeMode != shapeMode) { + blockData.shapeMode = shapeMode; + onChanged(); + } }) .build() ); @@ -49,8 +51,10 @@ public void initWidgets() { .defaultValue(new SettingColor(0, 255, 200)) .onModuleActivated(settingColorSetting -> settingColorSetting.set(blockData.lineColor)) .onChanged(settingColor -> { - blockData.lineColor.set(settingColor); - changed(blockData, block, setting); + if (!blockData.lineColor.equals(settingColor)) { + blockData.lineColor.set(settingColor); + onChanged(); + } }) .build() ); @@ -61,8 +65,10 @@ public void initWidgets() { .defaultValue(new SettingColor(0, 255, 200, 25)) .onModuleActivated(settingColorSetting -> settingColorSetting.set(blockData.sideColor)) .onChanged(settingColor -> { - blockData.sideColor.set(settingColor); - changed(blockData, block, setting); + if (!blockData.sideColor.equals(settingColor)) { + blockData.sideColor.set(settingColor); + onChanged(); + } }) .build() ); @@ -73,8 +79,10 @@ public void initWidgets() { .defaultValue(true) .onModuleActivated(booleanSetting -> booleanSetting.set(blockData.tracer)) .onChanged(aBoolean -> { - blockData.tracer = aBoolean; - changed(blockData, block, setting); + if (blockData.tracer != aBoolean) { + blockData.tracer = aBoolean; + onChanged(); + } }) .build() ); @@ -85,8 +93,10 @@ public void initWidgets() { .defaultValue(new SettingColor(0, 255, 200, 125)) .onModuleActivated(settingColorSetting -> settingColorSetting.set(blockData.tracerColor)) .onChanged(settingColor -> { - blockData.tracerColor = settingColor; - changed(blockData, block, setting); + if (!blockData.tracerColor.equals(settingColor)) { + blockData.tracerColor.set(settingColor); + onChanged(); + } }) .build() ); @@ -95,7 +105,7 @@ public void initWidgets() { add(theme.settings(settings)).expandX(); } - private void changed(ESPBlockData blockData, Block block, BlockDataSetting setting) { + private void onChanged() { if (!blockData.isChanged() && block != null && setting != null) { setting.get().put(block, blockData); setting.onChanged(); From ebc04a8da957816caa5c2a17ec61c1a5c2ff51b6 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Thu, 24 Jul 2025 18:04:10 -0400 Subject: [PATCH 14/14] fix colour settings --- .../systems/modules/render/blockesp/ESPBlockDataScreen.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 dc4cfcdc1b..0dce2a3ade 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 @@ -49,7 +49,7 @@ public void initWidgets() { .name("line-color") .description("Color of lines.") .defaultValue(new SettingColor(0, 255, 200)) - .onModuleActivated(settingColorSetting -> settingColorSetting.set(blockData.lineColor)) + .onModuleActivated(settingColorSetting -> settingColorSetting.get().set(blockData.lineColor)) .onChanged(settingColor -> { if (!blockData.lineColor.equals(settingColor)) { blockData.lineColor.set(settingColor); @@ -63,7 +63,7 @@ public void initWidgets() { .name("side-color") .description("Color of sides.") .defaultValue(new SettingColor(0, 255, 200, 25)) - .onModuleActivated(settingColorSetting -> settingColorSetting.set(blockData.sideColor)) + .onModuleActivated(settingColorSetting -> settingColorSetting.get().set(blockData.sideColor)) .onChanged(settingColor -> { if (!blockData.sideColor.equals(settingColor)) { blockData.sideColor.set(settingColor); @@ -91,7 +91,7 @@ public void initWidgets() { .name("tracer-color") .description("Color of tracer line.") .defaultValue(new SettingColor(0, 255, 200, 125)) - .onModuleActivated(settingColorSetting -> settingColorSetting.set(blockData.tracerColor)) + .onModuleActivated(settingColorSetting -> settingColorSetting.get().set(blockData.tracerColor)) .onChanged(settingColor -> { if (!blockData.tracerColor.equals(settingColor)) { blockData.tracerColor.set(settingColor);