From 7257008fa3f84448c00828cefee805cc36763f32 Mon Sep 17 00:00:00 2001 From: chri-k Date: Sat, 4 Oct 2025 09:33:38 +0300 Subject: [PATCH 01/15] [intermediary] --- .../commands/commands/SwarmCommand.java | 7 +- .../settings/BlockListSettingScreen.java | 9 +- .../settings/ItemListSettingScreen.java | 11 +- .../base/GroupedListSettingScreen.java | 267 +++++++++++++++ .../gui/widgets/WItemWithLabel.java | 9 + .../pathing/BaritoneSettings.java | 50 +-- .../settings/BlockListSetting.java | 131 +++++--- .../settings/GroupedListSetting.java | 307 ++++++++++++++++++ .../settings/ItemListSetting.java | 124 ++++--- .../settings/groups/GroupedList.java | 200 ++++++++++++ .../settings/groups/ListGroup.java | 117 +++++++ .../settings/groups/ListGroupTracker.java | 11 + .../systems/hud/elements/HoleHud.java | 5 +- .../systems/modules/combat/AutoTrap.java | 3 +- .../systems/modules/combat/HoleFiller.java | 3 +- .../systems/modules/combat/SelfTrap.java | 3 +- .../systems/modules/combat/Surround.java | 3 +- .../systems/modules/misc/InventoryTweaks.java | 9 +- .../systems/modules/movement/Scaffold.java | 3 +- .../systems/modules/movement/Slippy.java | 7 +- .../systems/modules/player/AutoEat.java | 3 +- .../systems/modules/player/AutoMend.java | 10 +- .../systems/modules/player/AutoReplenish.java | 6 +- .../systems/modules/player/AutoTool.java | 6 +- .../systems/modules/player/FastUse.java | 5 +- .../systems/modules/player/NoInteract.java | 6 +- .../systems/modules/player/SpeedMine.java | 5 +- .../systems/modules/render/ItemHighlight.java | 10 +- .../systems/modules/render/NoRender.java | 3 +- .../systems/modules/render/Trajectories.java | 3 +- .../systems/modules/render/WallHack.java | 6 +- .../systems/modules/render/Xray.java | 3 +- .../modules/render/blockesp/BlockESP.java | 6 +- .../systems/modules/world/AutoSmelter.java | 16 +- .../systems/modules/world/Collisions.java | 10 +- .../systems/modules/world/HighwayBuilder.java | 6 +- .../systems/modules/world/InfinityMiner.java | 12 +- .../systems/modules/world/LiquidFiller.java | 16 +- .../systems/modules/world/Nuker.java | 13 +- .../systems/modules/world/SpawnProofer.java | 3 +- .../systems/modules/world/VeinMiner.java | 5 +- 41 files changed, 1194 insertions(+), 238 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java create mode 100644 src/main/java/meteordevelopment/meteorclient/settings/GroupedListSetting.java create mode 100644 src/main/java/meteordevelopment/meteorclient/settings/groups/GroupedList.java create mode 100644 src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroup.java create mode 100644 src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroupTracker.java diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java index 555b73793d..7b1413967e 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java @@ -16,6 +16,7 @@ import meteordevelopment.meteorclient.commands.arguments.ModuleArgumentType; import meteordevelopment.meteorclient.commands.arguments.PlayerArgumentType; import meteordevelopment.meteorclient.pathing.PathManagers; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.swarm.Swarm; @@ -212,7 +213,7 @@ else if (swarm.isWorker()) { swarm.host.sendMessage(context.getInput()); } else if (swarm.isWorker()) { - Modules.get().get(InfinityMiner.class).targetBlocks.set(List.of(context.getArgument("target", BlockStateArgument.class).getBlockState().getBlock())); + Modules.get().get(InfinityMiner.class).targetBlocks.set(new GroupedList<>(List.of(context.getArgument("target", BlockStateArgument.class).getBlockState().getBlock()))); runInfinityMiner(); } } @@ -228,8 +229,8 @@ else if (swarm.isWorker()) { swarm.host.sendMessage(context.getInput()); } else if (swarm.isWorker()) { - Modules.get().get(InfinityMiner.class).targetBlocks.set(List.of(context.getArgument("target", BlockStateArgument.class).getBlockState().getBlock())); - Modules.get().get(InfinityMiner.class).repairBlocks.set(List.of(context.getArgument("repair", BlockStateArgument.class).getBlockState().getBlock())); + Modules.get().get(InfinityMiner.class).targetBlocks.set(new GroupedList<>(List.of(context.getArgument("target", BlockStateArgument.class).getBlockState().getBlock()))); + Modules.get().get(InfinityMiner.class).repairBlocks.set(new GroupedList<>(List.of(context.getArgument("repair", BlockStateArgument.class).getBlockState().getBlock()))); runInfinityMiner(); } } 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 d0309ce85b..4f338e3c3d 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java @@ -7,6 +7,7 @@ import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionListSettingScreen; +import meteordevelopment.meteorclient.gui.screens.settings.base.GroupedListSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.BlockListSetting; import meteordevelopment.meteorclient.utils.misc.Names; @@ -17,9 +18,9 @@ import java.util.function.Predicate; -public class BlockListSettingScreen extends CollectionListSettingScreen { +public class BlockListSettingScreen extends GroupedListSettingScreen { public BlockListSettingScreen(GuiTheme theme, BlockListSetting setting) { - super(theme, "Select Blocks", setting, setting.get(), Registries.BLOCK); + super(theme, "Select Blocks", setting, Registries.BLOCK); } @Override @@ -28,7 +29,7 @@ protected boolean includeValue(Block value) { return false; } - Predicate filter = ((BlockListSetting) setting).filter; + Predicate filter = setting.filter; if (filter == null) return value != Blocks.AIR; return filter.test(value); @@ -36,7 +37,7 @@ protected boolean includeValue(Block value) { @Override protected WWidget getValueWidget(Block value) { - return theme.itemWithLabel(value.asItem().getDefaultStack(), Names.get(value)); + return theme.itemWithLabel(value.asItem().getDefaultStack(), Names.get(value)).color(includeValue(value) ? theme.textColor() : theme.textSecondaryColor()); } @Override 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 3e58d7d70f..8556288fc5 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java @@ -7,7 +7,9 @@ import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionListSettingScreen; +import meteordevelopment.meteorclient.gui.screens.settings.base.GroupedListSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; +import meteordevelopment.meteorclient.settings.GroupedListSetting; import meteordevelopment.meteorclient.settings.ItemListSetting; import meteordevelopment.meteorclient.utils.misc.Names; import net.minecraft.item.Item; @@ -16,22 +18,21 @@ import java.util.function.Predicate; -public class ItemListSettingScreen extends CollectionListSettingScreen { +public class ItemListSettingScreen extends GroupedListSettingScreen { public ItemListSettingScreen(GuiTheme theme, ItemListSetting setting) { - super(theme, "Select Items", setting, setting.get(), Registries.ITEM); + super(theme, "Select Items", setting, Registries.ITEM); } @Override protected boolean includeValue(Item value) { - Predicate filter = ((ItemListSetting) setting).filter; + Predicate filter = setting.filter; if (filter != null && !filter.test(value)) return false; return value != Items.AIR; } @Override - protected WWidget getValueWidget(Item value) { - return theme.itemWithLabel(value.getDefaultStack()); + protected WWidget getValueWidget(Item value) { return theme.itemWithLabel(value.getDefaultStack(), Names.get(value)).color(includeValue(value) ? theme.textColor() : theme.textSecondaryColor()); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java new file mode 100644 index 0000000000..e0b0eca99e --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java @@ -0,0 +1,267 @@ +/* + * 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.MeteorClient; +import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.WindowScreen; +import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; +import meteordevelopment.meteorclient.gui.screens.EditSystemScreen; +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.containers.WVerticalList; +import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; +import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; +import meteordevelopment.meteorclient.gui.widgets.pressable.WPressable; +import meteordevelopment.meteorclient.settings.BlockListSetting; +import meteordevelopment.meteorclient.settings.GroupedListSetting; +import meteordevelopment.meteorclient.settings.Settings; +import meteordevelopment.meteorclient.utils.render.color.Color; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Predicate; + +public abstract class GroupedListSettingScreen> extends WindowScreen { + protected final S setting; + private final Iterable registry; + + private WTable table; + private String filterText = ""; + + private GroupedListSetting.Group expanded; + + public GroupedListSettingScreen(GuiTheme theme, String title, S setting, Iterable registry) { + super(theme, title); + + this.registry = registry; + this.setting = setting; + + MeteorClient.LOG.info("GroupedListSettingScreen@ BlockListSetting.ORES contains {} items", BlockListSetting.ORES.get().size()); + } + + @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() { + + List list = new ArrayList<>(setting.groups().values().stream().map(s -> { + MeteorClient.LOG.info("GroupedListSettingScreen@initTable {} contains {} items", s.name, s.get().size()); + return new ItemUnion(s); + }).toList()); + + registry.forEach((t) -> list.add(new ItemUnion(t))); + + // Left (all) + WTable left = abc(list, true, t -> { + addValue(t); + + if (t.t != null) { + T v = getAdditionalValue(t.t); + if (v != null) addValue(t); + } + }); + + if (!left.cells.isEmpty()) table.add(theme.verticalSeparator()).expandWidgetY(); + + list.clear(); + list.addAll(setting.get().getIncludedGroups().stream().map(ItemUnion::new).toList()); + + setting.get().getDirectlyIncludedItems().forEach((t) -> list.add(new ItemUnion(t))); + + // Right (selected) + WTable right = abc(list, false, t -> { + removeValue(t); + + if (t.t != null) { + T v = getAdditionalValue(t.t); + if (v != null) removeValue(t); + } + }); + + postWidgets(left, right); + } + + private WWidget groupLabel(GroupedListSetting.Group s) { + if (s.showIcon.get()) return theme.itemWithLabel(s.icon.get().asItem().getDefaultStack(), "@"+s.name.get()).color(Color.ORANGE); + else return theme.label(" @"+s.name.get()).color(Color.ORANGE); + } + + private WTable abc(Iterable iterable, boolean isLeft, Consumer buttonAction) { + // Create + Cell cell = this.table.add(theme.table()).top(); + WTable table = cell.widget(); + + + // Sort + Predicate predicate = isLeft + ? v -> Boolean.TRUE.equals(v.map( + t -> this.includeValue(t) && !setting.get().getDirectlyIncludedItems().contains(t), + s -> !setting.get().getIncludedGroups().contains(s))) + : v -> Boolean.TRUE.equals(v.map(this::includeValue, s -> true)); + + Iterable sorted = SortingHelper.sort(iterable, predicate, v -> v.map(this::getValueNames, s -> new String[]{"@"+s.name.get()}), filterText); + + sorted.forEach(v -> { + table.add(v.map(this::getValueWidget, s -> { + + WVerticalList vlist = theme.verticalList(); + WTable hlist = vlist.add(theme.table()).widget(); + + boolean e = expanded == s; + + WButton expand = hlist.add(theme.button(e ? GuiRenderer.TRIANGLE : GuiRenderer.CIRCLE)).widget(); + expand.action = () -> { + expanded = e ? null : s; + reload(); + }; + + hlist.add(groupLabel(s)); + + WTable subtable = vlist.add(theme.table()).widget(); + + if (e) { + for (GroupedListSetting.Group inc : s.getGroups()) { + subtable.add(theme.label(" -> ")); + subtable.add(groupLabel(inc)); + subtable.row(); + } + + Iterable subitems = SortingHelper.sortWithPriority(s.get(), (t)->true, this::getValueNames, "", (T a, T b) -> includeValue(a) == includeValue(b) ? 0 : includeValue(a) ? -1 : 1); + + subitems.forEach(t -> { + subtable.add(theme.label(" -> ")); + subtable.add(getValueWidget(t)); + subtable.row(); + }); + } + + return vlist; + })); + + if (v.s != null) { + WButton edit = table.add(theme.button(GuiRenderer.EDIT)).right().top().widget(); + edit.action = () -> MeteorClient.mc.setScreen(new EditListGroupScreen(theme, v.s, () -> { + invalidateTable(); + reload(); + })); + } + + WPressable button = table.add(isLeft ? theme.plus() : theme.minus()).expandCellX().right().top().widget(); + button.action = () -> buttonAction.accept(v); + + table.row(); + }); + + if (!table.cells.isEmpty()) cell.expandX(); + + return table; + } + + protected void invalidateTable() { + table.clear(); + initTable(); + } + + protected void addValue(ItemUnion value) { + if (value.t != null) { + setting.get().add(value.t); + setting.onChanged(); + invalidateTable(); + } else if (value.s != null) { + setting.get().add(value.s); + setting.onChanged(); + invalidateTable(); + } + } + + protected void removeValue(ItemUnion value) { + if (value.t != null) { + setting.get().remove(value.t); + setting.onChanged(); + invalidateTable(); + } else if (value.s != null) { + setting.get().remove(value.s); + setting.onChanged(); + invalidateTable(); + } + } + + protected void postWidgets(WTable left, WTable right) {} + + protected boolean includeValue(T value) { + return true; + } + + protected abstract WWidget getValueWidget(T value); + + protected abstract String[] getValueNames(T value); + + protected T getAdditionalValue(T value) { + return null; + } + + protected class ItemUnion { + private final T t; + private final GroupedListSetting.Group s; + + public ItemUnion(T t) { + this.s = null; + this.t = t; + } + + public ItemUnion(GroupedListSetting.Group s) { + this.s = s; + this.t = null; + } + + public R map(Function a, Function.Group, R> b) { + if (t != null) return a.apply(t); + else if (s != null) return b.apply(s); + return null; + } + } + + public class EditListGroupScreen extends EditSystemScreen.Group> { + public EditListGroupScreen(GuiTheme theme, GroupedListSetting.Group value, Runnable reload) { + super(theme, value, reload); + } + + @Override + public GroupedListSetting.Group create() { + return null; + } + + @Override + public boolean save() { + value.builtin = false; + return true; + } + + @Override + public Settings getSettings() { + return value.settings; + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java index cd7b4decfc..33ef90a751 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java @@ -7,6 +7,7 @@ import meteordevelopment.meteorclient.gui.widgets.containers.WHorizontalList; import meteordevelopment.meteorclient.utils.misc.Names; +import meteordevelopment.meteorclient.utils.render.color.Color; import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffectUtil; @@ -24,6 +25,8 @@ public class WItemWithLabel extends WHorizontalList { private WItem item; private WLabel label; + private Color color; + public WItemWithLabel(ItemStack itemStack, String name) { this.itemStack = itemStack; this.name = name; @@ -33,6 +36,7 @@ public WItemWithLabel(ItemStack itemStack, String name) { public void init() { item = add(theme.item(itemStack)).widget(); label = add(theme.label(name + getStringToAppend())).widget(); + if (color != null) label.color(color); } private String getStringToAppend() { @@ -61,6 +65,11 @@ public void set(ItemStack itemStack) { label.set(name + getStringToAppend()); } + public WItemWithLabel color(Color color) { + this.color = color; + return this; + } + public String getLabelText() { return label == null ? name : label.get(); } diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java index 8294edaa12..7f26beb6f0 100644 --- a/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java +++ b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java @@ -180,31 +180,31 @@ else if (value instanceof Color) { .build() ); } - else if (value instanceof List) { - Type listType = ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0]; - Type type = ((ParameterizedType) listType).getActualTypeArguments()[0]; - - if (type == Block.class) { - sgBlockLists.add(new BlockListSetting.Builder() - .name(setting.getName()) - .description(getDescription(setting.getName())) - .defaultValue((List) setting.defaultValue) - .onChanged(blockList -> setting.value = blockList) - .onModuleActivated(blockListSetting -> blockListSetting.set((List) setting.value)) - .build() - ); - } - else if (type == Item.class) { - sgItemLists.add(new ItemListSetting.Builder() - .name(setting.getName()) - .description(getDescription(setting.getName())) - .defaultValue((List) setting.defaultValue) - .onChanged(itemList -> setting.value = itemList) - .onModuleActivated(itemListSetting -> itemListSetting.set((List) setting.value)) - .build() - ); - } - } +// else if (value instanceof List) { +// Type listType = ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0]; +// Type type = ((ParameterizedType) listType).getActualTypeArguments()[0]; +// +// if (type == Block.class) { +// sgBlockLists.add(new BlockListSetting.Builder() +// .name(setting.getName()) +// .description(getDescription(setting.getName())) +// .defaultValue((List) setting.defaultValue) +// .onChanged(blockList -> setting.value = blockList) +// .onModuleActivated(blockListSetting -> blockListSetting.set((List) setting.value)) +// .build() +// ); +// } +// else if (type == Item.class) { +// sgItemLists.add(new ItemListSetting.Builder() +// .name(setting.getName()) +// .description(getDescription(setting.getName())) +// .defaultValue((List) setting.defaultValue) +// .onChanged(itemList -> setting.value = itemList) +// .onModuleActivated(itemListSetting -> itemListSetting.set((List) setting.value)) +// .build() +// ); +// } +// } } } catch (IllegalAccessException e) { diff --git a/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java index 5d49ac76dd..a9705a1acd 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java @@ -5,93 +5,102 @@ package meteordevelopment.meteorclient.settings; +import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.ListGroupTracker; +import meteordevelopment.meteorclient.systems.modules.render.Xray; import net.minecraft.block.Block; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.block.Blocks; +import net.minecraft.item.Items; import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; import net.minecraft.nbt.NbtString; import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; import java.util.function.Consumer; import java.util.function.Predicate; -public class BlockListSetting extends Setting> { - public final Predicate filter; +public class BlockListSetting extends GroupedListSetting { - public BlockListSetting(String name, String description, List defaultValue, Consumer> onChanged, Consumer>> onModuleActivated, Predicate filter, IVisible visible) { + private final static Map GROUPS = new HashMap<>(); + + public BlockListSetting(String name, String description, GroupedList defaultValue, Consumer> onChanged, Consumer>> onModuleActivated, Predicate filter, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); + if (GROUPS.isEmpty()) initGroups(); + this.filter = filter; } @Override - public void resetImpl() { - value = new ArrayList<>(defaultValue); + public Block parseItem(String str) { + Block block = parseId(Registries.BLOCK, str); + if (block != null && (filter == null || filter.test(block))) return block; + return null; } @Override - protected List parseImpl(String str) { - String[] values = str.split(","); - List blocks = new ArrayList<>(values.length); - - try { - for (String value : values) { - Block block = parseId(Registries.BLOCK, value); - if (block != null && (filter == null || filter.test(block))) blocks.add(block); - } - } catch (Exception ignored) {} - - return blocks; + public NbtElement itemToNbt(Block block) { + return NbtString.of(Registries.BLOCK.getId(block).toString()); } @Override - protected boolean isValueValid(List value) { - return true; + public Block itemFromNbt(NbtElement e) { + Block block = Registries.BLOCK.get(Identifier.of(e.asString().orElse(""))); + if (filter == null || filter.test(block)) return block; + return null; } @Override - public Iterable getIdentifierSuggestions() { - return Registries.BLOCK.getIds(); + public Map.Group> groups() { + return GROUPS; } - @Override - protected NbtCompound save(NbtCompound tag) { - NbtList valueTag = new NbtList(); - for (Block block : get()) { - valueTag.add(NbtString.of(Registries.BLOCK.getId(block).toString())); - } - tag.put("value", valueTag); + private final static ListGroupTracker tracker = new ListGroupTracker(); - return tag; + @Override + protected ListGroupTracker tracker() { + return tracker; } @Override - protected List load(NbtCompound tag) { - get().clear(); - - NbtList valueTag = tag.getListOrEmpty("value"); - for (NbtElement tagI : valueTag) { - Block block = Registries.BLOCK.get(Identifier.of(tagI.asString().orElse(""))); - - if (filter == null || filter.test(block)) get().add(block); - } - - return get(); + public Iterable getIdentifierSuggestions() { + return Registries.BLOCK.getIds(); } - public static class Builder extends SettingBuilder, BlockListSetting> { + public static class Builder extends SettingBuilder, BlockListSetting> { private Predicate filter; public Builder() { - super(new ArrayList<>(0)); + super(new GroupedList<>()); + } + + public Builder defaultValue(Collection defaults) { + if (defaultValue == null) + return defaultValue(defaults != null ? new GroupedList<>(defaults) : new GroupedList<>()); + defaultValue.addAll(defaults); + return this; } public Builder defaultValue(Block... defaults) { - return defaultValue(defaults != null ? Arrays.asList(defaults) : new ArrayList<>()); + if (defaultValue == null) + return defaultValue(defaults != null ? new GroupedList<>(Arrays.asList(defaults)) : new GroupedList<>()); + defaultValue.addAll(Arrays.asList(defaults)); + return this; + } + + @SafeVarargs + public final Builder defaultGroups(Group... defaults) { + List groups = null; + + if (defaults != null) + groups = Arrays.stream(defaults).filter(g -> g.trackerIs(tracker)).toList(); + + if (defaultValue == null) + return defaultValue(groups != null ? new GroupedList<>(null, groups) : new GroupedList<>()); + + if (groups != null) defaultValue.addAllGroups(groups); + return this; } public Builder filter(Predicate filter) { @@ -104,4 +113,30 @@ public BlockListSetting build() { return new BlockListSetting(name, description, defaultValue, onChanged, onModuleActivated, filter, visible); } } + + public static Group ORES, DIRTS, SANDS, STONES, STONES_ALL, TERRAIN, TERRAIN_ALL; + + private void initGroups() { + ORES = builtin("Ores", Items.DIAMOND_ORE) + .items(Xray.ORES).get(); + DIRTS = builtin("Dirt", Items.DIRT) + .items(Blocks.DIRT, Blocks.GRASS_BLOCK, Blocks.DIRT_PATH, Blocks.PODZOL, Blocks.COARSE_DIRT, Blocks.CLAY) + .get(); + SANDS = builtin("Sand", Items.SAND) + .items(Blocks.SAND, Blocks.RED_SAND, Blocks.GRAVEL) + .get(); + STONES = builtin("Stone", Items.STONE) + .items(Blocks.STONE, Blocks.DEEPSLATE, Blocks.NETHERRACK, Blocks.SANDSTONE, Blocks.TUFF, Blocks.BASALT) + .get(); + STONES_ALL = builtin("Stone-all", Items.DIORITE) + .items(Blocks.ANDESITE, Blocks.DIORITE, Blocks.GRANITE, Blocks.BLACKSTONE, Blocks.CALCITE) + .include(STONES) + .get(); + TERRAIN = builtin("Terrain", Items.GRASS_BLOCK) + .include(STONES, DIRTS, SANDS) + .get(); + TERRAIN_ALL = builtin("Terrain-all", Items.GRASS_BLOCK) + .include(STONES_ALL, DIRTS, SANDS) + .get(); + } } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/GroupedListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/GroupedListSetting.java new file mode 100644 index 0000000000..da987d5df3 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/settings/GroupedListSetting.java @@ -0,0 +1,307 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.settings; + +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.ListGroup; +import meteordevelopment.meteorclient.settings.groups.ListGroupTracker; +import meteordevelopment.meteorclient.utils.Utils; +import meteordevelopment.meteorclient.utils.misc.ISerializable; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; +import net.minecraft.nbt.NbtList; +import net.minecraft.nbt.NbtString; +import net.minecraft.registry.Registries; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.Unmodifiable; + +import java.util.*; +import java.util.function.Consumer; +import java.util.function.Predicate; + +public abstract class GroupedListSetting extends Setting.Group>> { + + public GroupedListSetting(String name, String description, GroupedList defaultValue, Consumer> onChanged, Consumer>> onModuleActivated, IVisible visible) { + super(name, description, defaultValue, onChanged, onModuleActivated, visible); + } + + abstract public T parseItem(String str); + + abstract public NbtElement itemToNbt(T t); + abstract public T itemFromNbt(NbtElement e); + + abstract public Map groups(); + abstract protected ListGroupTracker tracker(); + + public Predicate filter = null; + + protected Group getGroup(String name) { + return groups().get(name.toUpperCase()); + } + + @Override + public GroupedList get() { + return value; + } + + @Override + public boolean set(GroupedList o) { + if (value == null) { + value = new GroupedList<>(); + value.tracker = tracker(); + } + value.set(o); + onChanged(); + return true; + } + + @Override + protected void resetImpl() { + set(defaultValue); + } + + @Override + protected GroupedList parseImpl(String str) { + + GroupedList list = new GroupedList<>(); + list.tracker = tracker(); + + String[] values = str.split(","); + + try { + for (String value : values) { + value = value.trim(); + Group group = null; + + if (value.startsWith("@")) { + group = getGroup(value.substring(1)); + } + + if (group != null) { + list.add(group); + continue; + } + + T item = parseItem(value); + + if (item != null) list.add(item); + } + } catch (Exception ignored) {} + + return list; + } + + @Override + protected boolean isValueValid(GroupedList value) { + return true; + } + + @Override + final protected NbtCompound save(NbtCompound tag) { + NbtList groupsTag = new NbtList(); + + for (Group g : groups().values()) if (!g.builtin) groupsTag.add(g.toTag()); + tag.put("groups", groupsTag); + + NbtList direct = new NbtList(); + value.getDirectlyIncludedItems().stream().map(this::itemToNbt).forEach(direct::add); + + tag.put("direct", direct); + + NbtList include = new NbtList(); + value.getIncludedGroups().stream().map((g) -> NbtString.of(g.internalName)).forEach(direct::add); + + tag.put("include", include); + + return tag; + } + + @Override + final protected GroupedList load(NbtCompound tag) { + return null; + } + + final public class GroupBuilder { + + private Group g; + + public GroupBuilder(String name) { + g = new Group(name); + } + + public GroupBuilder(String name, Item icon) { + g = new Group(name); + g.icon.set(icon); + g.showIcon.set(true); + } + + private GroupBuilder builtin() { + g.builtin = true; + return this; + } + + @SafeVarargs + public final GroupBuilder items(T... of) { + g.addAll(Arrays.asList(of)); + return this; + } + + @SafeVarargs + public final GroupBuilder include(Group... of) { + g.addAllGroups(Arrays.asList(of)); + return this; + } + + public GroupBuilder items(Collection of) { + g.addAll(of); + return this; + } + + public GroupBuilder include(Collection of) { + g.addAllGroups(of); + return this; + } + + public Group get() { + groups().put(g.internalName.toUpperCase(), g); + Group w = g; + g = null; + return w; + } + } + + protected GroupBuilder builtin(String name) { + return new GroupBuilder(name).builtin(); + } + + protected GroupBuilder builtin(String name, Item icon) { + return new GroupBuilder(name, icon).builtin(); + } + + public GroupBuilder newGroup(String name) { + return new GroupBuilder(name); + } + + public GroupBuilder newGroup(String name, Item icon) { + return new GroupBuilder(name, icon); + } + + + public class Group extends ListGroup implements ISerializable { + public boolean builtin; + + public Settings settings = new Settings(); + public SettingGroup sg = settings.getDefaultGroup(); + + private String internalName; + + public Setting name = sg.add(new StringSetting.Builder() + .name("name") + .description("the name of the group") + .onChanged(this::changeName) + .filter(Utils::nameFilter) + .build() + ); + + public Setting showIcon = sg.add(new BoolSetting.Builder() + .name("show-icon") + .description("don't show an icon") + .defaultValue(false) + .build() + ); + + public Setting icon = sg.add(new ItemSetting.Builder() + .name("icon") + .description("item to use as icon in list") + .defaultValue(Items.NETHER_STAR) + .visible(showIcon::get) + .build() + ); + + public boolean checkName(String v) { + Group other = groups().get(v.toUpperCase()); + return other == this || other == null; + } + + private void changeName(String v) { + if (v.equals(internalName)) return; + + Group other = groups().get(v.toUpperCase()); + if (other == this) { + internalName = v; + return; + } + if (other != null) { + name.set(internalName); + } + else { + groups().remove(internalName.toUpperCase()); + groups().put(v.toUpperCase(), this); + } + } + + + private Group(String name) + { + super(tracker()); + + MeteorClient.LOG.info("GroupedListSetting.Group@ \"{}\" in {}", internalName, tracker().hashCode()); + + internalName = name; + this.name.set(name); + } + + @Override + @Unmodifiable + public List get() { + MeteorClient.LOG.info("GroupedListSetting.get@ \"{}\" ({} before filter)", internalName, direct.size()); + if (filter == null) return direct; + return direct.stream().filter(filter).toList(); + } + + @Override + public NbtCompound toTag() { + NbtCompound tag = new NbtCompound(); + tag.putString("name", internalName); + tag.put("icon", Identifier.CODEC, Registries.ITEM.getId(icon.get())); + + NbtList d = new NbtList(); + direct.forEach((t) -> d.add(itemToNbt(t))); + + NbtList i = new NbtList(); + include.forEach((g) -> i.add(NbtString.of(g.internalName))); + + tag.put("direct", d); + tag.put("include", i); + return tag; + } + + @Override + public Group fromTag(NbtCompound tag) { + String name = tag.getString("name", null); + if (name == null) return null; + + Group g = groups().get(name.toUpperCase()); + if (g == null) g = this; + + g.internalName = name; + g.name.set(name); + g.icon.set(tag.get("item", Identifier.CODEC).map(Registries.ITEM::get).orElse(null)); + + g.direct = tag.getListOrEmpty("direct").stream().map(GroupedListSetting.this::itemFromNbt).toList(); + g.include = tag.getListOrEmpty("include").stream().map(NbtElement::asString) + .filter(Optional::isPresent).map(Optional::get).map(String::toUpperCase).map((s) -> { + if (groups().containsKey(s)) return groups().get(s); + return groups().put(s, newGroup(s).get()); + }).toList(); + + return g; + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java index 89da126639..ebc1da581d 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java @@ -5,7 +5,11 @@ package meteordevelopment.meteorclient.settings; +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.ListGroupTracker; import net.minecraft.item.Item; +import net.minecraft.item.Items; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtList; @@ -13,103 +17,117 @@ import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; import java.util.function.Consumer; import java.util.function.Predicate; -public class ItemListSetting extends Setting> { - public final Predicate filter; +public class ItemListSetting extends GroupedListSetting { + + private final static Map GROUPS = new HashMap<>(); + private final static ListGroupTracker tracker = new ListGroupTracker(); + private final boolean bypassFilterWhenSavingAndLoading; - public ItemListSetting(String name, String description, List defaultValue, Consumer> onChanged, Consumer>> onModuleActivated, IVisible visible, Predicate filter, boolean bypassFilterWhenSavingAndLoading) { + public ItemListSetting(String name, String description, GroupedList.Group> defaultValue, Consumer.Group>> onChanged, Consumer.Group>>> onModuleActivated, IVisible visible, Predicate filter, boolean bypassFilterWhenSavingAndLoading) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); + if (GROUPS.isEmpty()) initGroups(); + this.filter = filter; this.bypassFilterWhenSavingAndLoading = bypassFilterWhenSavingAndLoading; } @Override - protected List parseImpl(String str) { - String[] values = str.split(","); - List items = new ArrayList<>(values.length); - - try { - for (String value : values) { - Item item = parseId(Registries.ITEM, value); - if (item != null && (filter == null || filter.test(item))) items.add(item); - } - } catch (Exception ignored) {} - - return items; + public Item parseItem(String str) { + Item item = parseId(Registries.ITEM, str); + if (item != null && (filter == null || filter.test(item))) return item; + return null; } @Override - public void resetImpl() { - value = new ArrayList<>(defaultValue); + public NbtElement itemToNbt(Item item) { + return NbtString.of(Registries.ITEM.getId(item).toString()); } @Override - protected boolean isValueValid(List value) { - return true; + public Item itemFromNbt(NbtElement e) { + return Registries.ITEM.get(Identifier.of(e.asString().orElse(""))); } @Override - public Iterable getIdentifierSuggestions() { - return Registries.ITEM.getIds(); + public Map.Group> groups() { + return GROUPS; } @Override - public NbtCompound save(NbtCompound tag) { - NbtList valueTag = new NbtList(); - for (Item item : get()) { - if (bypassFilterWhenSavingAndLoading || (filter == null || filter.test(item))) valueTag.add(NbtString.of(Registries.ITEM.getId(item).toString())); - } - tag.put("value", valueTag); - - return tag; + protected ListGroupTracker tracker() { + return tracker; } @Override - public List load(NbtCompound tag) { - get().clear(); - - NbtList valueTag = tag.getListOrEmpty("value"); - for (NbtElement tagI : valueTag) { - Item item = Registries.ITEM.get(Identifier.of(tagI.asString().orElse(""))); - - if (bypassFilterWhenSavingAndLoading || (filter == null || filter.test(item))) get().add(item); - } - - return get(); + public Iterable getIdentifierSuggestions() { + return Registries.ITEM.getIds(); } - public static class Builder extends SettingBuilder, ItemListSetting> { - private Predicate filter; - private boolean bypassFilterWhenSavingAndLoading; + public static class Builder extends SettingBuilder, ItemListSetting> { + private Predicate filter = null; + private boolean bypass = false; public Builder() { - super(new ArrayList<>(0)); + super(new GroupedList<>()); + } + + public Builder defaultValue(Collection defaults) { + if (defaultValue == null) + return defaultValue(defaults != null ? new GroupedList<>(defaults) : new GroupedList<>()); + defaultValue.addAll(defaults); + return this; } public Builder defaultValue(Item... defaults) { - return defaultValue(defaults != null ? Arrays.asList(defaults) : new ArrayList<>()); + if (defaultValue == null) + return defaultValue(defaults != null ? new GroupedList<>(Arrays.asList(defaults)) : new GroupedList<>()); + defaultValue.addAll(Arrays.asList(defaults)); + return this; } - public Builder filter(Predicate filter) { - this.filter = filter; + @SafeVarargs + public final Builder defaultGroups(Group... defaults) { + List groups = null; + + if (defaults != null) + groups = Arrays.stream(defaults).filter(g -> g.trackerIs(tracker)).toList(); + + if (defaultValue == null) + return defaultValue(groups != null ? new GroupedList<>(null, groups) : new GroupedList<>()); + + if (groups != null) defaultValue.addAllGroups(groups); return this; } - public Builder bypassFilterWhenSavingAndLoading() { - this.bypassFilterWhenSavingAndLoading = true; + public Builder filter(Predicate filter) { + this.filter = filter; return this; } @Override public ItemListSetting build() { - return new ItemListSetting(name, description, defaultValue, onChanged, onModuleActivated, visible, filter, bypassFilterWhenSavingAndLoading); + return new ItemListSetting(name, description, defaultValue, onChanged, onModuleActivated, visible, filter, bypass); } } + public static Group TEST; + + private void initGroups() { + + MeteorClient.LOG.info("initGroups@ creating TEST"); + + TEST = builtin("TEST", Items.DIAMOND_AXE) + .items(Items.DIAMOND_AXE, Items.DRAGON_EGG).get(); + + MeteorClient.LOG.info("initGroups@ created TEST with {} items", TEST.get().size()); + + TEST.add(Items.RED_BUNDLE); + + MeteorClient.LOG.info("initGroups@ added item to TEST, now {} items", TEST.get().size()); + } } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupedList.java b/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupedList.java new file mode 100644 index 0000000000..e403b36e0e --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupedList.java @@ -0,0 +1,200 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.settings.groups; + +import meteordevelopment.meteorclient.MeteorClient; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Unmodifiable; + +import java.util.*; + +public class GroupedList> implements Iterable { + private List cached; + private List include; + private List direct; + + public ListGroupTracker tracker = null; + long version; + + private boolean isValid() { + if (cached == null) return false; + if (tracker == null) return false; + return version == tracker.get(); + } + + public GroupedList() { + cached = null; + include = new ArrayList<>(); + direct = new ArrayList<>(); + } + + public GroupedList(@NotNull Collection d) { + cached = new ArrayList<>(d); + include = new ArrayList<>(); + direct = new ArrayList<>(d); + } + + public GroupedList(Collection d, @NotNull Collection g) { + cached = null; + include = new ArrayList<>(g); + direct = d == null ? new ArrayList<>() : new ArrayList<>(d); + } + + public boolean add(T t) { + if (!direct.contains(t)) { + direct.add(t); + if (isValid() && !cached.contains(t)) cached.add(t); + return true; + } + return false; + } + + public boolean add(G g) { + if (!include.contains(g)) { + include.add(g); + cached = null; + return true; + } + return false; + } + + public boolean remove(G g) { + if (include.remove(g)) { + cached = null; + return true; + } + return false; + } + + public boolean remove(T t) { + if (direct.remove(t)) { + cached = null; + return true; + } + return false; + } + + public void invalidate() { + cached = null; + } + + @Unmodifiable + public List get() { + + if (isValid()) return cached; + + if (tracker != null) version = tracker.get(); + else if (cached != null && !cached.isEmpty()) MeteorClient.LOG.warn("Rebuild of GroupedList with tracker == null"); + + MeteorClient.LOG.info("Rebuild {} direct, {} groups.", direct.size(), include.size()); + + List> indirect = new ArrayList<>(include); + Set set = new HashSet<>(direct); + List> groups = new ArrayList<>(); + + for (int i = 0; i < indirect.size(); i++) { + ListGroup g = indirect.get(i); + + if (groups.contains(g)) continue; + groups.add(g); + + List items = g.get(); + + if (items != null) set.addAll(items); + + if (g.getGroups() != null) indirect.addAll(g.getGroups()); + } + + if (cached != null) cached.clear(); + else cached = new ArrayList<>(); + cached.addAll(set); + + return cached; + } + + public void set(GroupedList other) { + cached = null; + if (other.isValid()) { + cached = new ArrayList<>(other.cached); + version = tracker.get(); + } + include = new ArrayList<>(other.include); + direct = new ArrayList<>(other.direct); + } + + public void clear() { + cached.clear(); + include.clear(); + direct.clear(); + } + + @Unmodifiable + public List getDirectlyIncludedItems() { + return direct; + } + + @Unmodifiable + public List getIncludedGroups() { + return include; + } + + public boolean containsAll(@NotNull Collection collection) { + get(); + for (T t : collection) if (!cached.contains(t)) return false; + return true; + } + + public boolean addAll(@NotNull Collection collection) { + boolean modified = false; + for (T t : collection) { + if (!direct.contains(t)) { + direct.add(t); + modified = true; + } + } + if (modified) cached = null; + return modified; + } + + public boolean addAllGroups(Collection collection) { + boolean modified = false; + for (G g : collection) { + if (!include.contains(g)) { + include.add(g); + modified = true; + } + } + if (modified) cached = null; + return modified; + } + + public boolean removeAll(@NotNull Collection collection) { + cached = null; + return direct.removeAll(collection); + } + + public boolean removeAllGroups(@NotNull Collection collection) { + cached = null; + return include.removeAll(collection); + } + + public int size() { + return get().size(); + } + + public boolean isEmpty() { + return get().isEmpty(); + } + + public boolean contains(Object o) { + return get().contains(o); + } + + @Override + public @NotNull Iterator iterator() { + return get().iterator(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroup.java b/src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroup.java new file mode 100644 index 0000000000..77d36ffac8 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroup.java @@ -0,0 +1,117 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.settings.groups; + +import meteordevelopment.meteorclient.MeteorClient; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Unmodifiable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public abstract class ListGroup> { + protected List direct = new ArrayList<>(); + protected List include = new ArrayList<>(); + + final protected ListGroupTracker tracker; + + public boolean trackerIs(ListGroupTracker o) { return tracker == o; }; + + @Unmodifiable + public List get() { + return direct; + } + + @Unmodifiable + final public List getAll() { + return direct; + } + + @Unmodifiable + public List getGroups() { + return include; + } + + public boolean add(T t) { + if (!direct.contains(t)) { + MeteorClient.LOG.info("ListGroup.add@ had {}", direct.size()); + direct.add(t); + tracker.invalidate(); + return true; + } + MeteorClient.LOG.info("ListGroup.add@ duplicate item"); + return false; + } + + public boolean add(G g) { + if (!include.contains(g)) { + include.add(g); + tracker.invalidate(); + return true; + } + return false; + } + + public boolean remove(G g) { + if (include.remove(g)) { + tracker.invalidate(); + return true; + } + return false; + } + + public boolean remove(T t) { + if (direct.remove(t)) { + tracker.invalidate(); + return true; + } + return false; + } + + public boolean addAll(@NotNull Collection collection) { + boolean modified = false; + for (T t : collection) { + MeteorClient.LOG.info("ListGroup.addAll@ had {}", direct.size()); + if (!direct.contains(t)) { + direct.add(t); + modified = true; + } + MeteorClient.LOG.info("ListGroup.addAll@ has {}", direct.size()); + } + if (modified) tracker.invalidate(); + return modified; + } + + public boolean addAllGroups(Collection collection) { + boolean modified = false; + for (G g : collection) { + if (!include.contains(g)) { + include.add(g); + modified = true; + } + } + if (modified) tracker.invalidate();; + return modified; + } + + public boolean removeAll(@NotNull Collection collection) { + tracker.invalidate(); + return direct.removeAll(collection); + } + + public boolean removeAllGroups(@NotNull Collection collection) { + tracker.invalidate(); + return include.removeAll(collection); + } + + public ListGroup(ListGroupTracker t) { tracker = t; } + + @Override + public boolean equals(Object obj) { + return this == obj; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroupTracker.java b/src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroupTracker.java new file mode 100644 index 0000000000..606477b21c --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroupTracker.java @@ -0,0 +1,11 @@ +package meteordevelopment.meteorclient.settings.groups; + +public class ListGroupTracker { + + long a = 0; + + public long get() { return a; } + + public void invalidate() { a++; } + +} 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..67dfc1b806 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/HoleHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/HoleHud.java @@ -7,6 +7,7 @@ import meteordevelopment.meteorclient.mixin.WorldRendererAccessor; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.hud.Hud; import meteordevelopment.meteorclient.systems.hud.HudElement; import meteordevelopment.meteorclient.systems.hud.HudElementInfo; @@ -18,8 +19,6 @@ import net.minecraft.util.math.Direction; import net.minecraft.util.math.MathHelper; -import java.util.List; - import static meteordevelopment.meteorclient.MeteorClient.mc; public class HoleHud extends HudElement { @@ -31,7 +30,7 @@ public class HoleHud extends HudElement { // General - public final Setting> safe = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> 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) 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..fd0e6f05cc 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java @@ -9,6 +9,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -43,7 +44,7 @@ public class AutoTrap extends Module { // General - private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("whitelist") .description("Which blocks to use.") .defaultValue(Blocks.OBSIDIAN, Blocks.CRYING_OBSIDIAN) 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 907b8e2347..1d1196117f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java @@ -10,6 +10,7 @@ import meteordevelopment.meteorclient.mixin.DirectionAccessor; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -42,7 +43,7 @@ public class HoleFiller extends Module { private final SettingGroup sgSmart = settings.createGroup("Smart"); private final SettingGroup sgRender = settings.createGroup("Render"); - private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Which blocks can be used to fill holes.") .defaultValue( 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..4f1a9ee9cb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java @@ -9,6 +9,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.player.FindItemResult; @@ -43,7 +44,7 @@ public enum BottomMode { // General - private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("whitelist") .description("Which blocks to use.") .defaultValue(Blocks.OBSIDIAN, Blocks.NETHERITE_BLOCK) 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 3afdf2ff99..639861e003 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java @@ -12,6 +12,7 @@ import meteordevelopment.meteorclient.mixin.WorldRendererAccessor; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.entity.DamageUtils; @@ -49,7 +50,7 @@ public class Surround extends Module { // General - private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("What blocks to use for surround.") .defaultValue(Blocks.OBSIDIAN, Blocks.CRYING_OBSIDIAN, Blocks.NETHERITE_BLOCK) 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 d9b4106e49..323ba499b3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java @@ -17,6 +17,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.mixin.HandledScreenAccessor; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -106,7 +107,7 @@ public class InventoryTweaks extends Module { // Anti drop - private final Setting> antiDropItems = sgAntiDrop.add(new ItemListSetting.Builder() + private final Setting.Group>> antiDropItems = sgAntiDrop.add(new ItemListSetting.Builder() .name("anti-drop-items") .description("Items to prevent dropping. Doesn't work in creative inventory screen.") .build() @@ -127,7 +128,7 @@ public class InventoryTweaks extends Module { // Auto Drop - private final Setting> autoDropItems = sgAutoDrop.add(new ItemListSetting.Builder() + private final Setting.Group>> autoDropItems = sgAutoDrop.add(new ItemListSetting.Builder() .name("auto-drop-items") .description("Items to drop.") .build() @@ -192,7 +193,7 @@ public class InventoryTweaks extends Module { .build() ); - private final Setting> dumpItems = sgStealDump.add(new ItemListSetting.Builder() + private final Setting.Group>> dumpItems = sgStealDump.add(new ItemListSetting.Builder() .name("dump-items") .description("Items to dump.") .build() @@ -205,7 +206,7 @@ public class InventoryTweaks extends Module { .build() ); - private final Setting> stealItems = sgStealDump.add(new ItemListSetting.Builder() + private final Setting.Group>> stealItems = sgStealDump.add(new ItemListSetting.Builder() .name("steal-items") .description("Items to steal.") .build() 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 1427b9e01c..d891f004df 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java @@ -9,6 +9,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.player.FindItemResult; @@ -34,7 +35,7 @@ public class Scaffold extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgRender = settings.createGroup("Render"); - private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Selected blocks.") .build() 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..d44c7f646a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Slippy.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Slippy.java @@ -6,12 +6,11 @@ package meteordevelopment.meteorclient.systems.modules.movement; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import net.minecraft.block.Block; -import java.util.List; - public class Slippy extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -31,14 +30,14 @@ public class Slippy extends Module { .build() ); - public final Setting> ignoredBlocks = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> 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() + public final Setting.Group>> allowedBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("allowed-blocks") .description("Decide which blocks to slip on") .visible(() -> listMode.get() == ListMode.Whitelist) 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 26dec3ad27..6db3e044b4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java @@ -9,6 +9,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; @@ -39,7 +40,7 @@ public class AutoEat extends Module { private final SettingGroup sgThreshold = settings.createGroup("Threshold"); // General - public final Setting> blacklist = sgGeneral.add(new ItemListSetting.Builder() + public final Setting.Group>> blacklist = sgGeneral.add(new ItemListSetting.Builder() .name("blacklist") .description("Which items to not eat.") .defaultValue( 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..766a537418 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java @@ -6,10 +6,8 @@ package meteordevelopment.meteorclient.systems.modules.player; import meteordevelopment.meteorclient.events.world.TickEvent; -import meteordevelopment.meteorclient.settings.BoolSetting; -import meteordevelopment.meteorclient.settings.ItemListSetting; -import meteordevelopment.meteorclient.settings.Setting; -import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -20,12 +18,10 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import java.util.List; - public class AutoMend extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting> blacklist = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> blacklist = sgGeneral.add(new ItemListSetting.Builder() .name("blacklist") .description("Item blacklist.") .filter(item -> item.getComponents().get(DataComponentTypes.DAMAGE) != null) 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..d6450a02c2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java @@ -7,6 +7,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; @@ -19,7 +20,6 @@ import net.minecraft.item.Items; import java.util.Arrays; -import java.util.List; public class AutoReplenish extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -70,7 +70,7 @@ public class AutoReplenish extends Module { .build() ); - private final Setting> excludedItems = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> excludedItems = sgGeneral.add(new ItemListSetting.Builder() .name("excluded-items") .description("Items that won't be replenished.") .build() @@ -131,7 +131,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/AutoTool.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java index fdc6774c86..d1c2290f50 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java @@ -9,6 +9,7 @@ import meteordevelopment.meteorclient.events.entity.player.StartBreakingBlockEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; @@ -28,7 +29,6 @@ import net.minecraft.registry.tag.BlockTags; import net.minecraft.registry.tag.ItemTags; -import java.util.List; import java.util.function.Predicate; public class AutoTool extends Module { @@ -98,7 +98,7 @@ public class AutoTool extends Module { .build() ); - private final Setting> whitelist = sgWhitelist.add(new ItemListSetting.Builder() + private final Setting.Group>> whitelist = sgWhitelist.add(new ItemListSetting.Builder() .name("whitelist") .description("The tools you want to use.") .visible(() -> listMode.get() == ListMode.Whitelist) @@ -106,7 +106,7 @@ public class AutoTool extends Module { .build() ); - private final Setting> blacklist = sgWhitelist.add(new ItemListSetting.Builder() + private final Setting.Group>> blacklist = sgWhitelist.add(new ItemListSetting.Builder() .name("blacklist") .description("The tools you don't want to use.") .visible(() -> listMode.get() == ListMode.Blacklist) 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..b44036721c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FastUse.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FastUse.java @@ -6,14 +6,13 @@ package meteordevelopment.meteorclient.systems.modules.player; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import java.util.List; - public class FastUse extends Module { public enum Mode { All, @@ -29,7 +28,7 @@ public enum Mode { .build() ); - private final Setting> items = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> items = sgGeneral.add(new ItemListSetting.Builder() .name("items") .description("Which items should fast place work on in \"Some\" mode.") .visible(() -> mode.get() == Mode.Some) 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..2b270def10 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoInteract.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoInteract.java @@ -10,6 +10,7 @@ import meteordevelopment.meteorclient.events.entity.player.InteractEntityEvent; import meteordevelopment.meteorclient.events.entity.player.StartBreakingBlockEvent; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -24,7 +25,6 @@ import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; -import java.util.List; import java.util.Set; public class NoInteract extends Module { @@ -33,7 +33,7 @@ public class NoInteract extends Module { // Blocks - private final Setting> blockMine = sgBlocks.add(new BlockListSetting.Builder() + private final Setting.Group>> blockMine = sgBlocks.add(new BlockListSetting.Builder() .name("block-mine") .description("Cancels block mining.") .build() @@ -46,7 +46,7 @@ public class NoInteract extends Module { .build() ); - private final Setting> blockInteract = sgBlocks.add(new BlockListSetting.Builder() + private final Setting.Group>> blockInteract = sgBlocks.add(new BlockListSetting.Builder() .name("block-interact") .description("Cancels block interaction.") .build() 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..5eb43418fd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java @@ -9,6 +9,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.mixin.ClientPlayerInteractionManagerAccessor; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -18,8 +19,6 @@ import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket; import net.minecraft.util.math.BlockPos; -import java.util.List; - import static net.minecraft.entity.effect.StatusEffects.HASTE; public class SpeedMine extends Module { @@ -32,7 +31,7 @@ public class SpeedMine extends Module { .build() ); - private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Selected blocks.") .filter(block -> block.getHardness() > 0) 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..fe3a61bc9f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemHighlight.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemHighlight.java @@ -5,22 +5,18 @@ package meteordevelopment.meteorclient.systems.modules.render; -import meteordevelopment.meteorclient.settings.ColorSetting; -import meteordevelopment.meteorclient.settings.ItemListSetting; -import meteordevelopment.meteorclient.settings.Setting; -import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import java.util.List; - public class ItemHighlight extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting> items = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> items = sgGeneral.add(new ItemListSetting.Builder() .name("items") .description("Items to highlight.") .build() 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 a6503f91ce..b52e19cf40 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java @@ -9,6 +9,7 @@ import meteordevelopment.meteorclient.events.world.ChunkOcclusionEvent; import meteordevelopment.meteorclient.events.world.ParticleEvent; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.orbit.EventHandler; @@ -322,7 +323,7 @@ public class NoRender extends Module { .build() ); - private final Setting> blockEntities = sgWorld.add(new BlockListSetting.Builder() + private final Setting.Group>> 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)) 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 373344d28e..d20820a399 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java @@ -8,6 +8,7 @@ import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -38,7 +39,7 @@ public class Trajectories extends Module { // General - private final Setting> items = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> items = sgGeneral.add(new ItemListSetting.Builder() .name("items") .description("Items to display trajectories for.") .defaultValue(getDefaultItems()) 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..d35a27c647 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WallHack.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WallHack.java @@ -10,14 +10,13 @@ import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.orbit.EventHandler; import net.irisshaders.iris.api.v0.IrisApi; import net.minecraft.block.Block; -import java.util.List; - public class WallHack extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -35,10 +34,9 @@ public class WallHack extends Module { .build() ); - public final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> 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(); }) 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 4664987c29..e5aba7a77f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java @@ -12,6 +12,7 @@ import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; @@ -32,7 +33,7 @@ public class Xray extends Module { public static final List ORES = List.of(Blocks.COAL_ORE, Blocks.DEEPSLATE_COAL_ORE, Blocks.IRON_ORE, Blocks.DEEPSLATE_IRON_ORE, Blocks.GOLD_ORE, Blocks.DEEPSLATE_GOLD_ORE, Blocks.LAPIS_ORE, Blocks.DEEPSLATE_LAPIS_ORE, Blocks.REDSTONE_ORE, Blocks.DEEPSLATE_REDSTONE_ORE, Blocks.DIAMOND_ORE, Blocks.DEEPSLATE_DIAMOND_ORE, Blocks.EMERALD_ORE, Blocks.DEEPSLATE_EMERALD_ORE, Blocks.COPPER_ORE, Blocks.DEEPSLATE_COPPER_ORE, Blocks.NETHER_GOLD_ORE, Blocks.NETHER_QUARTZ_ORE, Blocks.ANCIENT_DEBRIS); - private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("whitelist") .description("Which blocks to show x-rayed.") .defaultValue(ORES) 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..e683fb44eb 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 @@ -14,6 +14,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -27,7 +28,6 @@ import net.minecraft.world.dimension.DimensionType; import java.util.Iterator; -import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutorService; @@ -38,7 +38,7 @@ public class BlockESP extends Module { // General - private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Blocks to search for.") .onChanged(blocks1 -> { @@ -161,7 +161,7 @@ private void onChunkData(ChunkDataEvent event) { private void searchChunk(Chunk chunk) { workerThread.submit(() -> { if (!isActive()) return; - ESPChunk schunk = ESPChunk.searchChunk(chunk, blocks.get()); + ESPChunk schunk = ESPChunk.searchChunk(chunk, blocks.get().get()); if (schunk.size() > 0) { synchronized (chunks) { 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..43f21e83be 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java @@ -6,10 +6,8 @@ package meteordevelopment.meteorclient.systems.modules.world; import meteordevelopment.meteorclient.mixininterface.IAbstractFurnaceScreenHandler; -import meteordevelopment.meteorclient.settings.BoolSetting; -import meteordevelopment.meteorclient.settings.ItemListSetting; -import meteordevelopment.meteorclient.settings.Setting; -import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -20,26 +18,24 @@ import net.minecraft.recipe.RecipePropertySet; import net.minecraft.screen.AbstractFurnaceScreenHandler; -import java.util.List; - public class AutoSmelter extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting> fuelItems = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> fuelItems = sgGeneral.add(new ItemListSetting.Builder() .name("fuel-items") .description("Items to use as fuel") .defaultValue(Items.COAL, Items.CHARCOAL) .filter(this::fuelItemFilter) - .bypassFilterWhenSavingAndLoading() + //.bypassFilterWhenSavingAndLoading() .build() ); - private final Setting> smeltableItems = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> 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() + //.bypassFilterWhenSavingAndLoading() .build() ); 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..b1af2b3482 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Collisions.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Collisions.java @@ -9,10 +9,8 @@ import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.world.CollisionShapeEvent; import meteordevelopment.meteorclient.mixininterface.IVec3d; -import meteordevelopment.meteorclient.settings.BlockListSetting; -import meteordevelopment.meteorclient.settings.BoolSetting; -import meteordevelopment.meteorclient.settings.Setting; -import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.orbit.EventHandler; @@ -21,12 +19,10 @@ import net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket; import net.minecraft.util.shape.VoxelShapes; -import java.util.List; - public class Collisions extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - public final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("What blocks should be added collision box.") .filter(this::blockFilter) 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 fb1b42267d..35388defcf 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java @@ -15,6 +15,7 @@ import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.renderer.text.TextRenderer; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; @@ -71,7 +72,6 @@ import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Iterator; -import java.util.List; import java.util.function.Predicate; @SuppressWarnings("ConstantConditions") @@ -254,7 +254,7 @@ public enum BlockadeType { // Paving - public final Setting> blocksToPlace = sgPaving.add(new BlockListSetting.Builder() + public final Setting.Group>> blocksToPlace = sgPaving.add(new BlockListSetting.Builder() .name("blocks-to-place") .description("Blocks it is allowed to place.") .defaultValue(Blocks.OBSIDIAN) @@ -288,7 +288,7 @@ public enum BlockadeType { // Inventory - private final Setting> trashItems = sgInventory.add(new ItemListSetting.Builder() + private final Setting.Group>> trashItems = sgInventory.add(new ItemListSetting.Builder() .name("trash-items") .description("Items that are considered trash and can be thrown out.") .defaultValue( 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..3afa3c38e6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java @@ -13,6 +13,7 @@ import baritone.api.process.IMineProcess; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -31,7 +32,6 @@ import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; -import java.util.List; import java.util.function.Predicate; public class InfinityMiner extends Module { @@ -40,7 +40,7 @@ public class InfinityMiner extends Module { // General - public final Setting> targetBlocks = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> targetBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("target-blocks") .description("The target blocks to mine.") .defaultValue(Blocks.DIAMOND_ORE, Blocks.DEEPSLATE_DIAMOND_ORE) @@ -48,14 +48,14 @@ public class InfinityMiner extends Module { .build() ); - public final Setting> targetItems = sgGeneral.add(new ItemListSetting.Builder() + public final Setting.Group>> 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() + public final Setting.Group>> 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) @@ -204,14 +204,14 @@ private void mineTargetBlocks() { Block[] array = new Block[targetBlocks.get().size()]; baritone.getPathingBehavior().cancelEverything(); - baritone.getMineProcess().mine(targetBlocks.get().toArray(array)); + baritone.getMineProcess().mine(targetBlocks.get().get().toArray(array)); } private void mineRepairBlocks() { Block[] array = new Block[repairBlocks.get().size()]; baritone.getPathingBehavior().cancelEverything(); - baritone.getMineProcess().mine(repairBlocks.get().toArray(array)); + baritone.getMineProcess().mine(repairBlocks.get().get().toArray(array)); } private void logOut() { 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..a83a9e9ba6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/LiquidFiller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/LiquidFiller.java @@ -7,6 +7,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -105,23 +106,16 @@ public class LiquidFiller extends Module { .build() ); - private final Setting> whitelist = sgWhitelist.add(new BlockListSetting.Builder() + private final Setting.Group>> 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, - Blocks.STONE, - Blocks.NETHERRACK, - Blocks.DIORITE, - Blocks.GRANITE, - Blocks.ANDESITE - ) + .defaultValue(Blocks.COBBLESTONE, Blocks.COBBLED_DEEPSLATE) + .defaultGroups(BlockListSetting.TERRAIN_ALL) .visible(() -> listMode.get() == ListMode.Whitelist) .build() ); - private final Setting> blacklist = sgWhitelist.add(new BlockListSetting.Builder() + private final Setting.Group>> 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) 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 8b074df53b..9855542952 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java @@ -13,6 +13,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -196,14 +197,14 @@ public class Nuker extends Module { .build() ); - private final Setting> blacklist = sgWhitelist.add(new BlockListSetting.Builder() + private final Setting.Group>> 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() + private final Setting.Group>> whitelist = sgWhitelist.add(new BlockListSetting.Builder() .name("whitelist") .description("The blocks you want to mine.") .visible(() -> listMode.get() == ListMode.Whitelist) @@ -532,12 +533,16 @@ private void addTargetedBlockToList() { BlockPos pos = ((BlockHitResult) hitResult).getBlockPos(); Block targetBlock = mc.world.getBlockState(pos).getBlock(); - List list = listMode.get() == ListMode.Whitelist ? whitelist.get() : blacklist.get(); + GroupedList.Group> list = listMode.get() == ListMode.Whitelist ? whitelist.get() : blacklist.get(); String modeName = listMode.get().name(); if (list.contains(targetBlock)) { list.remove(targetBlock); - info("Removed " + Names.get(targetBlock) + " from " + modeName); + if (list.contains(targetBlock)) { + info("Removed " + Names.get(targetBlock) + " from " + modeName + ", but it is also included by a group"); + } else { + info("Removed " + Names.get(targetBlock) + " from " + modeName); + } } else { list.add(targetBlock); info("Added " + Names.get(targetBlock) + " to " + modeName); 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 5cb8b9df3e..e0e818a119 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java @@ -7,6 +7,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.misc.Pool; @@ -72,7 +73,7 @@ public class SpawnProofer extends Module { .build() ); - private final Setting> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Block to use for spawn proofing.") .defaultValue(Blocks.TORCH, Blocks.STONE_BUTTON, Blocks.STONE_SLAB) 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 7dc22f6cf0..6acceb4117 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java @@ -10,6 +10,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -52,10 +53,10 @@ public class VeinMiner extends Module { // General - private final Setting> selectedBlocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> selectedBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Which blocks to select.") - .defaultValue(Blocks.STONE, Blocks.DIRT, Blocks.GRASS_BLOCK) + .defaultGroups(BlockListSetting.TERRAIN) .build() ); From 52415951aa6fd958f16b6acfef2c65664a2eeabd Mon Sep 17 00:00:00 2001 From: chri-k Date: Tue, 7 Oct 2025 22:43:18 +0300 Subject: [PATCH 02/15] [intermediary] unabstract --- .../settings/BlockListSettingScreen.java | 4 +- .../settings/ItemListSettingScreen.java | 4 +- .../base/GroupedListSettingScreen.java | 45 +-- .../settings/BlockListSetting.java | 48 +-- .../settings/GroupedListSetting.java | 348 +++++++++--------- .../settings/ItemListSetting.java | 88 +++-- .../settings/groups/GroupedList.java | 43 ++- .../settings/groups/ListGroup.java | 42 ++- .../settings/groups/ListGroupTracker.java | 2 +- .../systems/hud/elements/HoleHud.java | 2 +- .../systems/modules/combat/AutoTrap.java | 2 +- .../systems/modules/combat/HoleFiller.java | 2 +- .../systems/modules/combat/SelfTrap.java | 2 +- .../systems/modules/combat/Surround.java | 2 +- .../systems/modules/misc/InventoryTweaks.java | 8 +- .../systems/modules/movement/Scaffold.java | 2 +- .../systems/modules/movement/Slippy.java | 4 +- .../systems/modules/player/AutoEat.java | 2 +- .../systems/modules/player/AutoMend.java | 2 +- .../systems/modules/player/AutoReplenish.java | 2 +- .../systems/modules/player/AutoTool.java | 4 +- .../systems/modules/player/FastUse.java | 2 +- .../systems/modules/player/NoInteract.java | 4 +- .../systems/modules/player/SpeedMine.java | 2 +- .../systems/modules/render/ItemHighlight.java | 2 +- .../systems/modules/render/NoRender.java | 2 +- .../systems/modules/render/Trajectories.java | 2 +- .../systems/modules/render/WallHack.java | 2 +- .../systems/modules/render/Xray.java | 2 +- .../modules/render/blockesp/BlockESP.java | 2 +- .../systems/modules/world/AutoSmelter.java | 4 +- .../systems/modules/world/Collisions.java | 2 +- .../systems/modules/world/HighwayBuilder.java | 4 +- .../systems/modules/world/InfinityMiner.java | 6 +- .../systems/modules/world/LiquidFiller.java | 4 +- .../systems/modules/world/Nuker.java | 6 +- .../systems/modules/world/SpawnProofer.java | 2 +- .../systems/modules/world/VeinMiner.java | 2 +- 38 files changed, 392 insertions(+), 316 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 4f338e3c3d..445623c15f 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java @@ -20,7 +20,7 @@ public class BlockListSettingScreen extends GroupedListSettingScreen { public BlockListSettingScreen(GuiTheme theme, BlockListSetting setting) { - super(theme, "Select Blocks", setting, Registries.BLOCK); + super(theme, "Select Blocks", setting, BlockListSetting.GROUPS, Registries.BLOCK); } @Override @@ -29,7 +29,7 @@ protected boolean includeValue(Block value) { return false; } - Predicate filter = setting.filter; + Predicate filter = setting.getFilter(); if (filter == null) return value != Blocks.AIR; return filter.test(value); 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 8556288fc5..dcc7d09959 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java @@ -20,12 +20,12 @@ public class ItemListSettingScreen extends GroupedListSettingScreen { public ItemListSettingScreen(GuiTheme theme, ItemListSetting setting) { - super(theme, "Select Items", setting, Registries.ITEM); + super(theme, "Select Items", setting, ItemListSetting.GROUPS, Registries.ITEM); } @Override protected boolean includeValue(Item value) { - Predicate filter = setting.filter; + Predicate filter = setting.getFilter(); if (filter != null && !filter.test(value)) return false; return value != Items.AIR; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java index e0b0eca99e..8a38e08e01 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java @@ -12,7 +12,6 @@ import meteordevelopment.meteorclient.gui.screens.EditSystemScreen; 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.containers.WVerticalList; import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; @@ -32,19 +31,21 @@ public abstract class GroupedListSettingScreen> extends WindowScreen { protected final S setting; private final Iterable registry; + private final GroupedListSetting.Groups groups; private WTable table; private String filterText = ""; - private GroupedListSetting.Group expanded; + private GroupedListSetting.Groups.Group expanded; - public GroupedListSettingScreen(GuiTheme theme, String title, S setting, Iterable registry) { + public GroupedListSettingScreen(GuiTheme theme, String title, S setting, GroupedListSetting.Groups groups, Iterable registry) { super(theme, title); this.registry = registry; this.setting = setting; + this.groups = groups; - MeteorClient.LOG.info("GroupedListSettingScreen@ BlockListSetting.ORES contains {} items", BlockListSetting.ORES.get().size()); + MeteorClient.LOG.info("GroupedListSettingScreen@ BlockListSetting.ORES contains {} items", BlockListSetting.ORES.getImmediate().size()); } @Override @@ -66,10 +67,7 @@ public void initWidgets() { private void initTable() { - List list = new ArrayList<>(setting.groups().values().stream().map(s -> { - MeteorClient.LOG.info("GroupedListSettingScreen@initTable {} contains {} items", s.name, s.get().size()); - return new ItemUnion(s); - }).toList()); + List list = new ArrayList<>(groups.getAll().stream().map(ItemUnion::new).toList()); registry.forEach((t) -> list.add(new ItemUnion(t))); @@ -103,9 +101,10 @@ private void initTable() { postWidgets(left, right); } - private WWidget groupLabel(GroupedListSetting.Group s) { - if (s.showIcon.get()) return theme.itemWithLabel(s.icon.get().asItem().getDefaultStack(), "@"+s.name.get()).color(Color.ORANGE); - else return theme.label(" @"+s.name.get()).color(Color.ORANGE); + private WWidget groupLabel(GroupedListSetting.Groups.Group s) { + Color color = entireGroupExcluded(s) ? new Color(200, 100, 10) : Color.ORANGE; + if (s.showIcon.get()) return theme.itemWithLabel(s.icon.get().asItem().getDefaultStack(), "@"+s.name.get()).color(color); + else return theme.label(" @"+s.name.get()).color(color); } private WTable abc(Iterable iterable, boolean isLeft, Consumer buttonAction) { @@ -118,8 +117,8 @@ private WTable abc(Iterable iterable, boolean isLeft, Consumer predicate = isLeft ? v -> Boolean.TRUE.equals(v.map( t -> this.includeValue(t) && !setting.get().getDirectlyIncludedItems().contains(t), - s -> !setting.get().getIncludedGroups().contains(s))) - : v -> Boolean.TRUE.equals(v.map(this::includeValue, s -> true)); + s -> !entireGroupExcluded(s) && !setting.get().getIncludedGroups().contains(s))) + : v -> true; Iterable sorted = SortingHelper.sort(iterable, predicate, v -> v.map(this::getValueNames, s -> new String[]{"@"+s.name.get()}), filterText); @@ -142,13 +141,13 @@ private WTable abc(Iterable iterable, boolean isLeft, Consumer.Group inc : s.getGroups()) { + for (GroupedListSetting.Groups.Group inc : s.getGroups()) { subtable.add(theme.label(" -> ")); subtable.add(groupLabel(inc)); subtable.row(); } - Iterable subitems = SortingHelper.sortWithPriority(s.get(), (t)->true, this::getValueNames, "", (T a, T b) -> includeValue(a) == includeValue(b) ? 0 : includeValue(a) ? -1 : 1); + Iterable subitems = SortingHelper.sortWithPriority(s.getImmediate(), (t)->true, this::getValueNames, "", (T a, T b) -> includeValue(a) == includeValue(b) ? 0 : includeValue(a) ? -1 : 1); subitems.forEach(t -> { subtable.add(theme.label(" -> ")); @@ -179,6 +178,10 @@ private WTable abc(Iterable iterable, boolean isLeft, Consumer.Group s) { + return !s.anyMatch(this::includeValue); + } + protected void invalidateTable() { table.clear(); initTable(); @@ -224,32 +227,32 @@ protected T getAdditionalValue(T value) { protected class ItemUnion { private final T t; - private final GroupedListSetting.Group s; + private final GroupedListSetting.Groups.Group s; public ItemUnion(T t) { this.s = null; this.t = t; } - public ItemUnion(GroupedListSetting.Group s) { + public ItemUnion(GroupedListSetting.Groups.Group s) { this.s = s; this.t = null; } - public R map(Function a, Function.Group, R> b) { + public R map(Function a, Function.Group, R> b) { if (t != null) return a.apply(t); else if (s != null) return b.apply(s); return null; } } - public class EditListGroupScreen extends EditSystemScreen.Group> { - public EditListGroupScreen(GuiTheme theme, GroupedListSetting.Group value, Runnable reload) { + public class EditListGroupScreen extends EditSystemScreen.Group> { + public EditListGroupScreen(GuiTheme theme, GroupedListSetting.Groups.Group value, Runnable reload) { super(theme, value, reload); } @Override - public GroupedListSetting.Group create() { + public GroupedListSetting.Groups.Group create() { return null; } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java index a9705a1acd..2bbc48e0e1 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java @@ -6,7 +6,6 @@ package meteordevelopment.meteorclient.settings; import meteordevelopment.meteorclient.settings.groups.GroupedList; -import meteordevelopment.meteorclient.settings.groups.ListGroupTracker; import meteordevelopment.meteorclient.systems.modules.render.Xray; import net.minecraft.block.Block; import net.minecraft.block.Blocks; @@ -22,14 +21,8 @@ public class BlockListSetting extends GroupedListSetting { - private final static Map GROUPS = new HashMap<>(); - - public BlockListSetting(String name, String description, GroupedList defaultValue, Consumer> onChanged, Consumer>> onModuleActivated, Predicate filter, IVisible visible) { - super(name, description, defaultValue, onChanged, onModuleActivated, visible); - - if (GROUPS.isEmpty()) initGroups(); - - this.filter = filter; + public BlockListSetting(String name, String description, GroupedList.Group> defaultValue, Consumer.Group>> onChanged, Consumer.Group>>> onModuleActivated, Predicate filter, IVisible visible) { + super(name, description, defaultValue, filter, onChanged, onModuleActivated, visible); } @Override @@ -51,16 +44,11 @@ public Block itemFromNbt(NbtElement e) { return null; } - @Override - public Map.Group> groups() { - return GROUPS; - } - - private final static ListGroupTracker tracker = new ListGroupTracker(); + public static final Groups GROUPS = new Groups<>(); @Override - protected ListGroupTracker tracker() { - return tracker; + protected Groups groups() { + return GROUPS; } @Override @@ -68,7 +56,7 @@ public Iterable getIdentifierSuggestions() { return Registries.BLOCK.getIds(); } - public static class Builder extends SettingBuilder, BlockListSetting> { + public static class Builder extends SettingBuilder.Group>, BlockListSetting> { private Predicate filter; public Builder() { @@ -90,11 +78,11 @@ public Builder defaultValue(Block... defaults) { } @SafeVarargs - public final Builder defaultGroups(Group... defaults) { - List groups = null; + public final Builder defaultGroups(Groups.Group... defaults) { + List.Group> groups = null; if (defaults != null) - groups = Arrays.stream(defaults).filter(g -> g.trackerIs(tracker)).toList(); + groups = Arrays.stream(defaults).filter(g -> g.trackerIs(GROUPS)).toList(); if (defaultValue == null) return defaultValue(groups != null ? new GroupedList<>(null, groups) : new GroupedList<>()); @@ -114,28 +102,28 @@ public BlockListSetting build() { } } - public static Group ORES, DIRTS, SANDS, STONES, STONES_ALL, TERRAIN, TERRAIN_ALL; + public static Groups.Group ORES, DIRTS, SANDS, STONES, STONES_ALL, TERRAIN, TERRAIN_ALL; - private void initGroups() { - ORES = builtin("Ores", Items.DIAMOND_ORE) + static { + ORES = GROUPS.builtin("ores", Items.DIAMOND_ORE) .items(Xray.ORES).get(); - DIRTS = builtin("Dirt", Items.DIRT) + DIRTS = GROUPS.builtin("dirt", Items.DIRT) .items(Blocks.DIRT, Blocks.GRASS_BLOCK, Blocks.DIRT_PATH, Blocks.PODZOL, Blocks.COARSE_DIRT, Blocks.CLAY) .get(); - SANDS = builtin("Sand", Items.SAND) + SANDS = GROUPS.builtin("sand", Items.SAND) .items(Blocks.SAND, Blocks.RED_SAND, Blocks.GRAVEL) .get(); - STONES = builtin("Stone", Items.STONE) + STONES = GROUPS.builtin("stone", Items.STONE) .items(Blocks.STONE, Blocks.DEEPSLATE, Blocks.NETHERRACK, Blocks.SANDSTONE, Blocks.TUFF, Blocks.BASALT) .get(); - STONES_ALL = builtin("Stone-all", Items.DIORITE) + STONES_ALL = GROUPS.builtin("stone-all", Items.DIORITE) .items(Blocks.ANDESITE, Blocks.DIORITE, Blocks.GRANITE, Blocks.BLACKSTONE, Blocks.CALCITE) .include(STONES) .get(); - TERRAIN = builtin("Terrain", Items.GRASS_BLOCK) + TERRAIN = GROUPS.builtin("terrain", Items.GRASS_BLOCK) .include(STONES, DIRTS, SANDS) .get(); - TERRAIN_ALL = builtin("Terrain-all", Items.GRASS_BLOCK) + TERRAIN_ALL = GROUPS.builtin("terrain-all", Items.GRASS_BLOCK) .include(STONES_ALL, DIRTS, SANDS) .get(); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/GroupedListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/GroupedListSetting.java index da987d5df3..91cf3745e7 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/GroupedListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/GroupedListSetting.java @@ -5,12 +5,10 @@ package meteordevelopment.meteorclient.settings; -import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.settings.groups.GroupedList; import meteordevelopment.meteorclient.settings.groups.ListGroup; import meteordevelopment.meteorclient.settings.groups.ListGroupTracker; import meteordevelopment.meteorclient.utils.Utils; -import meteordevelopment.meteorclient.utils.misc.ISerializable; import net.minecraft.item.Item; import net.minecraft.item.Items; import net.minecraft.nbt.NbtCompound; @@ -19,16 +17,19 @@ import net.minecraft.nbt.NbtString; import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; -import org.jetbrains.annotations.Unmodifiable; import java.util.*; import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Predicate; -public abstract class GroupedListSetting extends Setting.Group>> { +public abstract class GroupedListSetting extends Setting.Group>> { - public GroupedListSetting(String name, String description, GroupedList defaultValue, Consumer> onChanged, Consumer>> onModuleActivated, IVisible visible) { + protected Predicate filter; + + public GroupedListSetting(String name, String description, GroupedList.Group> defaultValue, Predicate filter, Consumer.Group>> onChanged, Consumer.Group>>> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); + this.filter = filter; } abstract public T parseItem(String str); @@ -36,25 +37,23 @@ public GroupedListSetting(String name, String description, GroupedList abstract public NbtElement itemToNbt(T t); abstract public T itemFromNbt(NbtElement e); - abstract public Map groups(); - abstract protected ListGroupTracker tracker(); - - public Predicate filter = null; - - protected Group getGroup(String name) { - return groups().get(name.toUpperCase()); - } + abstract protected Groups groups(); @Override - public GroupedList get() { + public GroupedList.Group> get() { return value; } + public Predicate getFilter() { + return filter; + } + @Override - public boolean set(GroupedList o) { + public boolean set(GroupedList.Group> o) { if (value == null) { value = new GroupedList<>(); - value.tracker = tracker(); + value.tracker = groups(); + value.setFilter(filter); } value.set(o); onChanged(); @@ -67,20 +66,20 @@ protected void resetImpl() { } @Override - protected GroupedList parseImpl(String str) { + protected GroupedList.Group> parseImpl(String str) { - GroupedList list = new GroupedList<>(); - list.tracker = tracker(); + GroupedList.Group> list = new GroupedList<>(); + list.tracker = groups(); String[] values = str.split(","); try { for (String value : values) { value = value.trim(); - Group group = null; + Groups.Group group = null; if (value.startsWith("@")) { - group = getGroup(value.substring(1)); + group = groups().get(value.substring(1)); } if (group != null) { @@ -98,7 +97,7 @@ protected GroupedList parseImpl(String str) { } @Override - protected boolean isValueValid(GroupedList value) { + protected boolean isValueValid(GroupedList.Group> value) { return true; } @@ -106,7 +105,9 @@ protected boolean isValueValid(GroupedList value) { final protected NbtCompound save(NbtCompound tag) { NbtList groupsTag = new NbtList(); - for (Group g : groups().values()) if (!g.builtin) groupsTag.add(g.toTag()); + // this does duplicate the contents of all groups into the config of every setting, however this is + // necessary for copy/paste to be able to share the complete config + for (Groups.Group g : groups().GROUPS.values()) if (!g.builtin) groupsTag.add(g.toTag(this::itemToNbt)); tag.put("groups", groupsTag); NbtList direct = new NbtList(); @@ -123,185 +124,202 @@ final protected NbtCompound save(NbtCompound tag) { } @Override - final protected GroupedList load(NbtCompound tag) { - return null; - } + final protected GroupedList.Group> load(NbtCompound tag) { + tag.getListOrEmpty("groups").forEach(el -> el.asCompound().ifPresent(t -> groups().fromTag(t, this::itemFromNbt))); - final public class GroupBuilder { + value.clear(); - private Group g; + value.addAll(tag.getListOrEmpty("direct").stream().map(this::itemFromNbt).filter(Objects::nonNull).toList()); + value.addAllGroups(tag.getListOrEmpty("include").stream().map(NbtElement::asString).filter(Optional::isPresent).map(o -> groups().get(o.get())).toList()); - public GroupBuilder(String name) { - g = new Group(name); - } - - public GroupBuilder(String name, Item icon) { - g = new Group(name); - g.icon.set(icon); - g.showIcon.set(true); - } - - private GroupBuilder builtin() { - g.builtin = true; - return this; - } - - @SafeVarargs - public final GroupBuilder items(T... of) { - g.addAll(Arrays.asList(of)); - return this; - } + return value; + } - @SafeVarargs - public final GroupBuilder include(Group... of) { - g.addAllGroups(Arrays.asList(of)); - return this; - } + static final public class Groups extends ListGroupTracker { - public GroupBuilder items(Collection of) { - g.addAll(of); - return this; - } + Map GROUPS = new HashMap<>(); - public GroupBuilder include(Collection of) { - g.addAllGroups(of); - return this; + public Groups.Group get(String name) { + return GROUPS.get(name.toUpperCase()); } - public Group get() { - groups().put(g.internalName.toUpperCase(), g); - Group w = g; - g = null; - return w; + public Collection getAll() { + return GROUPS.values(); } - } - protected GroupBuilder builtin(String name) { - return new GroupBuilder(name).builtin(); - } + public class GroupBuilder { - protected GroupBuilder builtin(String name, Item icon) { - return new GroupBuilder(name, icon).builtin(); - } + private Group g; - public GroupBuilder newGroup(String name) { - return new GroupBuilder(name); - } + public GroupBuilder(String name) { + g = new Group(name); + } - public GroupBuilder newGroup(String name, Item icon) { - return new GroupBuilder(name, icon); - } + public GroupBuilder(String name, Item icon) { + g = new Group(name); + g.icon.set(icon); + g.showIcon.set(true); + } + private GroupBuilder builtin() { + g.builtin = true; + return this; + } - public class Group extends ListGroup implements ISerializable { - public boolean builtin; - - public Settings settings = new Settings(); - public SettingGroup sg = settings.getDefaultGroup(); - - private String internalName; - - public Setting name = sg.add(new StringSetting.Builder() - .name("name") - .description("the name of the group") - .onChanged(this::changeName) - .filter(Utils::nameFilter) - .build() - ); - - public Setting showIcon = sg.add(new BoolSetting.Builder() - .name("show-icon") - .description("don't show an icon") - .defaultValue(false) - .build() - ); - - public Setting icon = sg.add(new ItemSetting.Builder() - .name("icon") - .description("item to use as icon in list") - .defaultValue(Items.NETHER_STAR) - .visible(showIcon::get) - .build() - ); - - public boolean checkName(String v) { - Group other = groups().get(v.toUpperCase()); - return other == this || other == null; - } + @SafeVarargs + public final GroupBuilder items(T... of) { + g.addAll(Arrays.asList(of)); + return this; + } - private void changeName(String v) { - if (v.equals(internalName)) return; + @SafeVarargs + public final GroupBuilder include(Group... of) { + g.addAllGroups(Arrays.asList(of)); + return this; + } - Group other = groups().get(v.toUpperCase()); - if (other == this) { - internalName = v; - return; + public GroupBuilder items(Collection of) { + g.addAll(of); + return this; } - if (other != null) { - name.set(internalName); + + public GroupBuilder include(Collection of) { + g.addAllGroups(of); + return this; } - else { - groups().remove(internalName.toUpperCase()); - groups().put(v.toUpperCase(), this); + + public Group get() { + GROUPS.put(g.internalName.toUpperCase(), g); + Group w = g; + g = null; + return w; } } + protected GroupBuilder builtin(String name) { + return new GroupBuilder(name).builtin(); + } - private Group(String name) - { - super(tracker()); + protected GroupBuilder builtin(String name, Item icon) { + return new GroupBuilder(name, icon).builtin(); + } - MeteorClient.LOG.info("GroupedListSetting.Group@ \"{}\" in {}", internalName, tracker().hashCode()); + public GroupBuilder builder(String name) { + return new GroupBuilder(name); + } - internalName = name; - this.name.set(name); + public GroupBuilder builder(String name, Item icon) { + return new GroupBuilder(name, icon); } - @Override - @Unmodifiable - public List get() { - MeteorClient.LOG.info("GroupedListSetting.get@ \"{}\" ({} before filter)", internalName, direct.size()); - if (filter == null) return direct; - return direct.stream().filter(filter).toList(); + public Group fromTag(NbtCompound tag, Function itemFromNbt) { + return new Group(tag, itemFromNbt); } - @Override - public NbtCompound toTag() { - NbtCompound tag = new NbtCompound(); - tag.putString("name", internalName); - tag.put("icon", Identifier.CODEC, Registries.ITEM.getId(icon.get())); + public class Group extends ListGroup { + public boolean builtin; + + public Settings settings = new Settings(); + public SettingGroup sg = settings.getDefaultGroup(); + + private String internalName; + + public Setting name = sg.add(new StringSetting.Builder() + .name("name") + .description("the name of the group") + .onChanged(this::changeName) + .filter(Utils::nameFilter) + .build() + ); + + public Setting showIcon = sg.add(new BoolSetting.Builder() + .name("show-icon") + .description("don't show an icon") + .defaultValue(false) + .build() + ); + + public Setting icon = sg.add(new ItemSetting.Builder() + .name("icon") + .description("item to use as icon in list") + .defaultValue(Items.NETHER_STAR) + .visible(showIcon::get) + .build() + ); + + public boolean checkName(String v) { + Group other = GROUPS.get(v.toUpperCase()); + return other == this || other == null; + } - NbtList d = new NbtList(); - direct.forEach((t) -> d.add(itemToNbt(t))); + private void changeName(String v) { + if (v.equals(internalName)) return; - NbtList i = new NbtList(); - include.forEach((g) -> i.add(NbtString.of(g.internalName))); + Group other = GROUPS.get(v.toUpperCase()); + if (other == this) { + internalName = v; + return; + } + if (other != null) { + name.set(internalName); + } + else { + GROUPS.remove(internalName.toUpperCase()); + GROUPS.put(v.toUpperCase(), this); + } + } - tag.put("direct", d); - tag.put("include", i); - return tag; - } - @Override - public Group fromTag(NbtCompound tag) { - String name = tag.getString("name", null); - if (name == null) return null; + private Group(String name) + { + super(Groups.this); - Group g = groups().get(name.toUpperCase()); - if (g == null) g = this; + internalName = name; + this.name.set(name); + } + + private Group(NbtCompound tag, Function itemFromNbt) + { + super(Groups.this); + fromTag(tag, itemFromNbt); + } + + public NbtCompound toTag(Function itemToNbt) { + NbtCompound tag = new NbtCompound(); + tag.putString("name", internalName); + tag.put("icon", Identifier.CODEC, Registries.ITEM.getId(icon.get())); - g.internalName = name; - g.name.set(name); - g.icon.set(tag.get("item", Identifier.CODEC).map(Registries.ITEM::get).orElse(null)); + NbtList d = new NbtList(); + direct.forEach((t) -> d.add(itemToNbt.apply(t))); + + NbtList i = new NbtList(); + include.forEach((g) -> i.add(NbtString.of(g.internalName))); + + tag.put("direct", d); + tag.put("include", i); + return tag; + } - g.direct = tag.getListOrEmpty("direct").stream().map(GroupedListSetting.this::itemFromNbt).toList(); - g.include = tag.getListOrEmpty("include").stream().map(NbtElement::asString) - .filter(Optional::isPresent).map(Optional::get).map(String::toUpperCase).map((s) -> { - if (groups().containsKey(s)) return groups().get(s); - return groups().put(s, newGroup(s).get()); - }).toList(); + public Group fromTag(NbtCompound tag, Function itemFromNbt) { + String name = tag.getString("name", null); + if (name == null) return null; - return g; + this.name.set(name); + this.icon.set(tag.get("item", Identifier.CODEC).map(Registries.ITEM::get).orElse(null)); + + this.direct = tag.getListOrEmpty("direct").stream().map(itemFromNbt).toList(); + this.include = tag.getListOrEmpty("include").stream().map(NbtElement::asString) + .filter(Optional::isPresent).map(Optional::get).map(String::toUpperCase).map((s) -> { + if (GROUPS.containsKey(s)) return GROUPS.get(s); + return GROUPS.put(s, builder(s).get()); + }).toList(); + + if (internalName == null) this.name.set(String.format("group%d", hashCode())); + + return this; + } } } + + } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java index ebc1da581d..08587c961a 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java @@ -7,12 +7,12 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.settings.groups.GroupedList; -import meteordevelopment.meteorclient.settings.groups.ListGroupTracker; +import meteordevelopment.meteorclient.systems.modules.player.AutoEat; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.ConsumableComponents; import net.minecraft.item.Item; import net.minecraft.item.Items; -import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; import net.minecraft.nbt.NbtString; import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; @@ -23,17 +23,13 @@ public class ItemListSetting extends GroupedListSetting { - private final static Map GROUPS = new HashMap<>(); - private final static ListGroupTracker tracker = new ListGroupTracker(); + public static final Groups GROUPS = new Groups<>(); private final boolean bypassFilterWhenSavingAndLoading; - public ItemListSetting(String name, String description, GroupedList.Group> defaultValue, Consumer.Group>> onChanged, Consumer.Group>>> onModuleActivated, IVisible visible, Predicate filter, boolean bypassFilterWhenSavingAndLoading) { - super(name, description, defaultValue, onChanged, onModuleActivated, visible); + public ItemListSetting(String name, String description, GroupedList.Group> defaultValue, Consumer.Group>> onChanged, Consumer.Group>>> onModuleActivated, IVisible visible, Predicate filter, boolean bypassFilterWhenSavingAndLoading) { + super(name, description, defaultValue, filter, onChanged, onModuleActivated, visible); - if (GROUPS.isEmpty()) initGroups(); - - this.filter = filter; this.bypassFilterWhenSavingAndLoading = bypassFilterWhenSavingAndLoading; } @@ -55,21 +51,16 @@ public Item itemFromNbt(NbtElement e) { } @Override - public Map.Group> groups() { + protected Groups groups() { return GROUPS; } - @Override - protected ListGroupTracker tracker() { - return tracker; - } - @Override public Iterable getIdentifierSuggestions() { return Registries.ITEM.getIds(); } - public static class Builder extends SettingBuilder, ItemListSetting> { + public static class Builder extends SettingBuilder.Group>, ItemListSetting> { private Predicate filter = null; private boolean bypass = false; @@ -92,11 +83,11 @@ public Builder defaultValue(Item... defaults) { } @SafeVarargs - public final Builder defaultGroups(Group... defaults) { - List groups = null; + public final Builder defaultGroups(Groups.Group... defaults) { + List.Group> groups = null; if (defaults != null) - groups = Arrays.stream(defaults).filter(g -> g.trackerIs(tracker)).toList(); + groups = Arrays.stream(defaults).filter(g -> g.trackerIs(GROUPS)).toList(); if (defaultValue == null) return defaultValue(groups != null ? new GroupedList<>(null, groups) : new GroupedList<>()); @@ -115,19 +106,60 @@ public ItemListSetting build() { return new ItemListSetting(name, description, defaultValue, onChanged, onModuleActivated, visible, filter, bypass); } } - public static Group TEST; - private void initGroups() { + // these are just for UI testing, they are not necessarily good ones to have + public static Groups.Group FOOD, AXES, PICKAXES, SWORDS, HOES, TOOLS, TOOLS_STRICT, HELMETS, CHESTPLATES, LEGGINGS, BOOTS, ARMOR; + static { + + FOOD = GROUPS.builtin("food-all", Items.APPLE) + .items(Registries.ITEM.stream().filter(i -> i.getComponents().get(DataComponentTypes.FOOD) != null).toList()) + .get(); + + TOOLS_STRICT = GROUPS.builtin("tools-all", Items.GOLDEN_AXE) + .items(Registries.ITEM.stream().filter(i -> i.getComponents().get(DataComponentTypes.TOOL) != null).toList()) + .get(); + + PICKAXES = GROUPS.builtin("picks", Items.IRON_PICKAXE) + .items(Items.WOODEN_HOE, Items.STONE_HOE, Items.IRON_HOE, Items.GOLDEN_HOE, Items.DIAMOND_HOE, Items.NETHERITE_HOE) + .get(); + + AXES = GROUPS.builtin("axes", Items.IRON_AXE) + .items(Items.WOODEN_HOE, Items.STONE_HOE, Items.IRON_HOE, Items.GOLDEN_HOE, Items.DIAMOND_HOE, Items.NETHERITE_HOE) + .get(); + + SWORDS = GROUPS.builtin("swords", Items.IRON_SWORD) + .items(Items.WOODEN_HOE, Items.STONE_HOE, Items.IRON_HOE, Items.GOLDEN_HOE, Items.DIAMOND_HOE, Items.NETHERITE_HOE) + .get(); + + HOES = GROUPS.builtin("hoes", Items.IRON_HOE) + .items(Items.WOODEN_HOE, Items.STONE_HOE, Items.IRON_HOE, Items.GOLDEN_HOE, Items.DIAMOND_HOE, Items.NETHERITE_HOE) + .get(); + + TOOLS = GROUPS.builtin("tools", Items.DIAMOND_AXE) + .items(Items.SHEARS, Items.FLINT_AND_STEEL) + .include(PICKAXES, AXES, HOES) + .get(); + + HELMETS = GROUPS.builtin("hoes", Items.IRON_HELMET) + .items(Items.TURTLE_HELMET, Items.CHAINMAIL_HELMET, Items.IRON_HELMET, Items.GOLDEN_HELMET, Items.DIAMOND_HELMET, Items.NETHERITE_HELMET) + .get(); + + CHESTPLATES = GROUPS.builtin("chestplates", Items.IRON_CHESTPLATE) + .items(Items.CHAINMAIL_CHESTPLATE, Items.IRON_CHESTPLATE, Items.GOLDEN_CHESTPLATE, Items.DIAMOND_CHESTPLATE, Items.NETHERITE_CHESTPLATE) + .get(); - MeteorClient.LOG.info("initGroups@ creating TEST"); + LEGGINGS = GROUPS.builtin("leggings", Items.IRON_LEGGINGS) + .items(Items.CHAINMAIL_LEGGINGS, Items.IRON_LEGGINGS, Items.GOLDEN_LEGGINGS, Items.DIAMOND_LEGGINGS, Items.NETHERITE_LEGGINGS) + .get(); - TEST = builtin("TEST", Items.DIAMOND_AXE) - .items(Items.DIAMOND_AXE, Items.DRAGON_EGG).get(); + BOOTS = GROUPS.builtin("boots", Items.IRON_BOOTS) + .items(Items.CHAINMAIL_BOOTS, Items.IRON_BOOTS, Items.GOLDEN_BOOTS, Items.DIAMOND_BOOTS, Items.NETHERITE_BOOTS) + .get(); - MeteorClient.LOG.info("initGroups@ created TEST with {} items", TEST.get().size()); + ARMOR = GROUPS.builtin("armor", Items.DIAMOND_CHESTPLATE) + .include(HELMETS, CHESTPLATES, LEGGINGS, BOOTS) + .get(); - TEST.add(Items.RED_BUNDLE); - MeteorClient.LOG.info("initGroups@ added item to TEST, now {} items", TEST.get().size()); } } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupedList.java b/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupedList.java index e403b36e0e..1d6622bc8f 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupedList.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupedList.java @@ -10,19 +10,22 @@ import org.jetbrains.annotations.Unmodifiable; import java.util.*; +import java.util.function.Predicate; public class GroupedList> implements Iterable { private List cached; private List include; private List direct; + private Predicate filter; + public ListGroupTracker tracker = null; long version; private boolean isValid() { if (cached == null) return false; if (tracker == null) return false; - return version == tracker.get(); + return version == tracker.getVersion(); } public GroupedList() { @@ -81,36 +84,40 @@ public void invalidate() { cached = null; } + public void setFilter(Predicate filter) { + this.filter = filter; + cached = null; + } + + public boolean testFilter(T t) { + return filter.test(t); + } + @Unmodifiable public List get() { if (isValid()) return cached; - if (tracker != null) version = tracker.get(); + if (tracker != null) version = tracker.getVersion(); else if (cached != null && !cached.isEmpty()) MeteorClient.LOG.warn("Rebuild of GroupedList with tracker == null"); MeteorClient.LOG.info("Rebuild {} direct, {} groups.", direct.size(), include.size()); - List> indirect = new ArrayList<>(include); Set set = new HashSet<>(direct); - List> groups = new ArrayList<>(); - - for (int i = 0; i < indirect.size(); i++) { - ListGroup g = indirect.get(i); + List> seen = new ArrayList<>(); + List> next = new ArrayList<>(); - if (groups.contains(g)) continue; - groups.add(g); - - List items = g.get(); - - if (items != null) set.addAll(items); - - if (g.getGroups() != null) indirect.addAll(g.getGroups()); + for (ListGroup g : include) { + g.internalGetAll(set, seen, next); } + if (cached != null) cached.clear(); else cached = new ArrayList<>(); - cached.addAll(set); + + for (T t : set) { + if (filter == null || filter.test(t)) cached.add(t); + } return cached; } @@ -119,14 +126,14 @@ public void set(GroupedList other) { cached = null; if (other.isValid()) { cached = new ArrayList<>(other.cached); - version = tracker.get(); + version = tracker.getVersion(); } include = new ArrayList<>(other.include); direct = new ArrayList<>(other.direct); } public void clear() { - cached.clear(); + if (cached != null) cached.clear(); include.clear(); direct.clear(); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroup.java b/src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroup.java index 77d36ffac8..52ba56ad9f 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroup.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroup.java @@ -9,9 +9,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Unmodifiable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; +import java.util.function.Predicate; public abstract class ListGroup> { protected List direct = new ArrayList<>(); @@ -22,13 +21,42 @@ public abstract class ListGroup> { public boolean trackerIs(ListGroupTracker o) { return tracker == o; }; @Unmodifiable - public List get() { + public List getImmediate() { return direct; } - @Unmodifiable - final public List getAll() { - return direct; + public List getAll() { + Set set = new HashSet<>(); + List> seen = new ArrayList<>(); + List> next = new ArrayList<>(); + internalGetAll(set, seen, next); + return new ArrayList<>(set); + } + + public void internalGetAll(Collection to, Collection> seen, List> next) { + next.clear(); + next.add(this); + for (int i = 0; i < next.size(); i++) { + ListGroup g = next.get(i); + if (seen.contains(g)) continue; + to.addAll(g.direct); + next.addAll(g.include); + seen.add(g); + } + } + + public boolean anyMatch(Predicate predicate) { + List> seen = new ArrayList<>(); + List> next = new ArrayList<>(); + next.add(this); + for (int i = 0; i < next.size(); i++) { + ListGroup g = next.get(i); + if (seen.contains(g)) continue; + if (g.direct.stream().anyMatch(predicate)) return true; + next.addAll(g.include); + seen.add(g); + } + return false; } @Unmodifiable diff --git a/src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroupTracker.java b/src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroupTracker.java index 606477b21c..5d7d555ed9 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroupTracker.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroupTracker.java @@ -4,7 +4,7 @@ public class ListGroupTracker { long a = 0; - public long get() { return a; } + public long getVersion() { return a; } public void invalidate() { a++; } 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 67dfc1b806..9accb981dc 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/HoleHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/HoleHud.java @@ -30,7 +30,7 @@ public class HoleHud extends HudElement { // General - public final Setting.Group>> safe = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> 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) 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 fd0e6f05cc..6e65fc6768 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java @@ -44,7 +44,7 @@ public class AutoTrap extends Module { // General - private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("whitelist") .description("Which blocks to use.") .defaultValue(Blocks.OBSIDIAN, Blocks.CRYING_OBSIDIAN) 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 1d1196117f..b5de696f24 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java @@ -43,7 +43,7 @@ public class HoleFiller extends Module { private final SettingGroup sgSmart = settings.createGroup("Smart"); private final SettingGroup sgRender = settings.createGroup("Render"); - private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Which blocks can be used to fill holes.") .defaultValue( 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 4f1a9ee9cb..fd320eee83 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java @@ -44,7 +44,7 @@ public enum BottomMode { // General - private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("whitelist") .description("Which blocks to use.") .defaultValue(Blocks.OBSIDIAN, Blocks.NETHERITE_BLOCK) 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 639861e003..37fe3bf7ca 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java @@ -50,7 +50,7 @@ public class Surround extends Module { // General - private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("What blocks to use for surround.") .defaultValue(Blocks.OBSIDIAN, Blocks.CRYING_OBSIDIAN, Blocks.NETHERITE_BLOCK) 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 323ba499b3..08d8e0ed66 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java @@ -107,7 +107,7 @@ public class InventoryTweaks extends Module { // Anti drop - private final Setting.Group>> antiDropItems = sgAntiDrop.add(new ItemListSetting.Builder() + private final Setting.Group>> antiDropItems = sgAntiDrop.add(new ItemListSetting.Builder() .name("anti-drop-items") .description("Items to prevent dropping. Doesn't work in creative inventory screen.") .build() @@ -128,7 +128,7 @@ public class InventoryTweaks extends Module { // Auto Drop - private final Setting.Group>> autoDropItems = sgAutoDrop.add(new ItemListSetting.Builder() + private final Setting.Group>> autoDropItems = sgAutoDrop.add(new ItemListSetting.Builder() .name("auto-drop-items") .description("Items to drop.") .build() @@ -193,7 +193,7 @@ public class InventoryTweaks extends Module { .build() ); - private final Setting.Group>> dumpItems = sgStealDump.add(new ItemListSetting.Builder() + private final Setting.Group>> dumpItems = sgStealDump.add(new ItemListSetting.Builder() .name("dump-items") .description("Items to dump.") .build() @@ -206,7 +206,7 @@ public class InventoryTweaks extends Module { .build() ); - private final Setting.Group>> stealItems = sgStealDump.add(new ItemListSetting.Builder() + private final Setting.Group>> stealItems = sgStealDump.add(new ItemListSetting.Builder() .name("steal-items") .description("Items to steal.") .build() 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 d891f004df..6fc9dddfd8 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java @@ -35,7 +35,7 @@ public class Scaffold extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgRender = settings.createGroup("Render"); - private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Selected blocks.") .build() 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 d44c7f646a..a58c686622 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Slippy.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Slippy.java @@ -30,14 +30,14 @@ public class Slippy extends Module { .build() ); - public final Setting.Group>> ignoredBlocks = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> 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.Group>> allowedBlocks = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> allowedBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("allowed-blocks") .description("Decide which blocks to slip on") .visible(() -> listMode.get() == ListMode.Whitelist) 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 6db3e044b4..ef2f375104 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java @@ -40,7 +40,7 @@ public class AutoEat extends Module { private final SettingGroup sgThreshold = settings.createGroup("Threshold"); // General - public final Setting.Group>> blacklist = sgGeneral.add(new ItemListSetting.Builder() + public final Setting.Group>> blacklist = sgGeneral.add(new ItemListSetting.Builder() .name("blacklist") .description("Which items to not eat.") .defaultValue( 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 766a537418..e66af42736 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java @@ -21,7 +21,7 @@ public class AutoMend extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting.Group>> blacklist = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> blacklist = sgGeneral.add(new ItemListSetting.Builder() .name("blacklist") .description("Item blacklist.") .filter(item -> item.getComponents().get(DataComponentTypes.DAMAGE) != null) 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 d6450a02c2..0c3a8ad2ed 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java @@ -70,7 +70,7 @@ public class AutoReplenish extends Module { .build() ); - private final Setting.Group>> excludedItems = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> excludedItems = sgGeneral.add(new ItemListSetting.Builder() .name("excluded-items") .description("Items that won't be replenished.") .build() 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 d1c2290f50..b1af61cef9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java @@ -98,7 +98,7 @@ public class AutoTool extends Module { .build() ); - private final Setting.Group>> whitelist = sgWhitelist.add(new ItemListSetting.Builder() + private final Setting.Group>> whitelist = sgWhitelist.add(new ItemListSetting.Builder() .name("whitelist") .description("The tools you want to use.") .visible(() -> listMode.get() == ListMode.Whitelist) @@ -106,7 +106,7 @@ public class AutoTool extends Module { .build() ); - private final Setting.Group>> blacklist = sgWhitelist.add(new ItemListSetting.Builder() + private final Setting.Group>> blacklist = sgWhitelist.add(new ItemListSetting.Builder() .name("blacklist") .description("The tools you don't want to use.") .visible(() -> listMode.get() == ListMode.Blacklist) 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 b44036721c..e7439769cb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FastUse.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FastUse.java @@ -28,7 +28,7 @@ public enum Mode { .build() ); - private final Setting.Group>> items = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> items = sgGeneral.add(new ItemListSetting.Builder() .name("items") .description("Which items should fast place work on in \"Some\" mode.") .visible(() -> mode.get() == Mode.Some) 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 2b270def10..4c9ac97f7e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoInteract.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoInteract.java @@ -33,7 +33,7 @@ public class NoInteract extends Module { // Blocks - private final Setting.Group>> blockMine = sgBlocks.add(new BlockListSetting.Builder() + private final Setting.Group>> blockMine = sgBlocks.add(new BlockListSetting.Builder() .name("block-mine") .description("Cancels block mining.") .build() @@ -46,7 +46,7 @@ public class NoInteract extends Module { .build() ); - private final Setting.Group>> blockInteract = sgBlocks.add(new BlockListSetting.Builder() + private final Setting.Group>> blockInteract = sgBlocks.add(new BlockListSetting.Builder() .name("block-interact") .description("Cancels block interaction.") .build() 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 5eb43418fd..b9f2af04f8 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java @@ -31,7 +31,7 @@ public class SpeedMine extends Module { .build() ); - private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Selected blocks.") .filter(block -> block.getHardness() > 0) 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 fe3a61bc9f..8b91ae0f5b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemHighlight.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemHighlight.java @@ -16,7 +16,7 @@ public class ItemHighlight extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting.Group>> items = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> items = sgGeneral.add(new ItemListSetting.Builder() .name("items") .description("Items to highlight.") .build() 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 b52e19cf40..a80f2b7296 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java @@ -323,7 +323,7 @@ public class NoRender extends Module { .build() ); - private final Setting.Group>> blockEntities = sgWorld.add(new BlockListSetting.Builder() + private final Setting.Group>> 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)) 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 d20820a399..499817185c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java @@ -39,7 +39,7 @@ public class Trajectories extends Module { // General - private final Setting.Group>> items = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> items = sgGeneral.add(new ItemListSetting.Builder() .name("items") .description("Items to display trajectories for.") .defaultValue(getDefaultItems()) 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 d35a27c647..de040d750d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WallHack.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WallHack.java @@ -34,7 +34,7 @@ public class WallHack extends Module { .build() ); - public final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("What blocks should be targeted for Wall Hack.") .onChanged(onChanged -> { 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 e5aba7a77f..1c266af5cc 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java @@ -33,7 +33,7 @@ public class Xray extends Module { public static final List ORES = List.of(Blocks.COAL_ORE, Blocks.DEEPSLATE_COAL_ORE, Blocks.IRON_ORE, Blocks.DEEPSLATE_IRON_ORE, Blocks.GOLD_ORE, Blocks.DEEPSLATE_GOLD_ORE, Blocks.LAPIS_ORE, Blocks.DEEPSLATE_LAPIS_ORE, Blocks.REDSTONE_ORE, Blocks.DEEPSLATE_REDSTONE_ORE, Blocks.DIAMOND_ORE, Blocks.DEEPSLATE_DIAMOND_ORE, Blocks.EMERALD_ORE, Blocks.DEEPSLATE_EMERALD_ORE, Blocks.COPPER_ORE, Blocks.DEEPSLATE_COPPER_ORE, Blocks.NETHER_GOLD_ORE, Blocks.NETHER_QUARTZ_ORE, Blocks.ANCIENT_DEBRIS); - private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("whitelist") .description("Which blocks to show x-rayed.") .defaultValue(ORES) 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 e683fb44eb..97c9dc3d1e 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 @@ -38,7 +38,7 @@ public class BlockESP extends Module { // General - private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Blocks to search for.") .onChanged(blocks1 -> { 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 43f21e83be..a133248ab0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java @@ -21,7 +21,7 @@ public class AutoSmelter extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting.Group>> fuelItems = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> fuelItems = sgGeneral.add(new ItemListSetting.Builder() .name("fuel-items") .description("Items to use as fuel") .defaultValue(Items.COAL, Items.CHARCOAL) @@ -30,7 +30,7 @@ public class AutoSmelter extends Module { .build() ); - private final Setting.Group>> smeltableItems = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> 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) 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 b1af2b3482..481216e580 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Collisions.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Collisions.java @@ -22,7 +22,7 @@ public class Collisions extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - public final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("What blocks should be added collision box.") .filter(this::blockFilter) 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 35388defcf..63ee6cfeda 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java @@ -254,7 +254,7 @@ public enum BlockadeType { // Paving - public final Setting.Group>> blocksToPlace = sgPaving.add(new BlockListSetting.Builder() + public final Setting.Group>> blocksToPlace = sgPaving.add(new BlockListSetting.Builder() .name("blocks-to-place") .description("Blocks it is allowed to place.") .defaultValue(Blocks.OBSIDIAN) @@ -288,7 +288,7 @@ public enum BlockadeType { // Inventory - private final Setting.Group>> trashItems = sgInventory.add(new ItemListSetting.Builder() + private final Setting.Group>> trashItems = sgInventory.add(new ItemListSetting.Builder() .name("trash-items") .description("Items that are considered trash and can be thrown out.") .defaultValue( 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 3afa3c38e6..4729b0fa87 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java @@ -40,7 +40,7 @@ public class InfinityMiner extends Module { // General - public final Setting.Group>> targetBlocks = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> targetBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("target-blocks") .description("The target blocks to mine.") .defaultValue(Blocks.DIAMOND_ORE, Blocks.DEEPSLATE_DIAMOND_ORE) @@ -48,14 +48,14 @@ public class InfinityMiner extends Module { .build() ); - public final Setting.Group>> targetItems = sgGeneral.add(new ItemListSetting.Builder() + public final Setting.Group>> targetItems = sgGeneral.add(new ItemListSetting.Builder() .name("target-items") .description("The target items to collect.") .defaultValue(Items.DIAMOND) .build() ); - public final Setting.Group>> repairBlocks = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> 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) 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 a83a9e9ba6..a8a7cad16f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/LiquidFiller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/LiquidFiller.java @@ -106,7 +106,7 @@ public class LiquidFiller extends Module { .build() ); - private final Setting.Group>> whitelist = sgWhitelist.add(new BlockListSetting.Builder() + private final Setting.Group>> whitelist = sgWhitelist.add(new BlockListSetting.Builder() .name("whitelist") .description("The allowed blocks that it will use to fill up the liquid.") .defaultValue(Blocks.COBBLESTONE, Blocks.COBBLED_DEEPSLATE) @@ -115,7 +115,7 @@ public class LiquidFiller extends Module { .build() ); - private final Setting.Group>> blacklist = sgWhitelist.add(new BlockListSetting.Builder() + private final Setting.Group>> 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) 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 9855542952..989e558cb4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java @@ -197,14 +197,14 @@ public class Nuker extends Module { .build() ); - private final Setting.Group>> blacklist = sgWhitelist.add(new BlockListSetting.Builder() + private final Setting.Group>> 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.Group>> whitelist = sgWhitelist.add(new BlockListSetting.Builder() + private final Setting.Group>> whitelist = sgWhitelist.add(new BlockListSetting.Builder() .name("whitelist") .description("The blocks you want to mine.") .visible(() -> listMode.get() == ListMode.Whitelist) @@ -533,7 +533,7 @@ private void addTargetedBlockToList() { BlockPos pos = ((BlockHitResult) hitResult).getBlockPos(); Block targetBlock = mc.world.getBlockState(pos).getBlock(); - GroupedList.Group> list = listMode.get() == ListMode.Whitelist ? whitelist.get() : blacklist.get(); + GroupedList.Group> list = listMode.get() == ListMode.Whitelist ? whitelist.get() : blacklist.get(); String modeName = listMode.get().name(); if (list.contains(targetBlock)) { 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 e0e818a119..4036c274ed 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java @@ -73,7 +73,7 @@ public class SpawnProofer extends Module { .build() ); - private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Block to use for spawn proofing.") .defaultValue(Blocks.TORCH, Blocks.STONE_BUTTON, Blocks.STONE_SLAB) 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 6acceb4117..e908ab5fa7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java @@ -53,7 +53,7 @@ public class VeinMiner extends Module { // General - private final Setting.Group>> selectedBlocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> selectedBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Which blocks to select.") .defaultGroups(BlockListSetting.TERRAIN) From 8c81d3041118ee2708053f119146d89faef82cfa Mon Sep 17 00:00:00 2001 From: chri-k Date: Tue, 7 Oct 2025 23:38:10 +0300 Subject: [PATCH 03/15] switch to Set --- .../commands/commands/SwarmCommand.java | 8 +- .../settings/ItemListSettingScreen.java | 2 - .../base/GroupedListSettingScreen.java | 36 +++--- .../settings/BlockListSetting.java | 18 +-- ...istSetting.java => GroupedSetSetting.java} | 56 ++++----- .../settings/ItemListSetting.java | 21 ++-- .../{GroupedList.java => GroupSet.java} | 115 +++++++++--------- .../groups/{ListGroup.java => SetGroup.java} | 75 ++++++------ ...pTracker.java => SetGroupEnumeration.java} | 2 +- .../systems/hud/elements/HoleHud.java | 4 +- .../systems/modules/combat/AutoTrap.java | 4 +- .../systems/modules/combat/HoleFiller.java | 4 +- .../systems/modules/combat/SelfTrap.java | 4 +- .../systems/modules/combat/Surround.java | 4 +- .../systems/modules/misc/InventoryTweaks.java | 10 +- .../systems/modules/movement/Scaffold.java | 4 +- .../systems/modules/movement/Slippy.java | 6 +- .../systems/modules/player/AutoEat.java | 4 +- .../systems/modules/player/AutoMend.java | 4 +- .../systems/modules/player/AutoReplenish.java | 4 +- .../systems/modules/player/AutoTool.java | 6 +- .../systems/modules/player/FastUse.java | 4 +- .../systems/modules/player/NoInteract.java | 6 +- .../systems/modules/player/SpeedMine.java | 4 +- .../systems/modules/render/ItemHighlight.java | 4 +- .../systems/modules/render/NoRender.java | 4 +- .../systems/modules/render/Trajectories.java | 4 +- .../systems/modules/render/WallHack.java | 4 +- .../systems/modules/render/Xray.java | 4 +- .../modules/render/blockesp/BlockESP.java | 4 +- .../modules/render/blockesp/ESPChunk.java | 3 +- .../systems/modules/world/AutoSmelter.java | 6 +- .../systems/modules/world/Collisions.java | 4 +- .../systems/modules/world/HighwayBuilder.java | 6 +- .../systems/modules/world/InfinityMiner.java | 8 +- .../systems/modules/world/LiquidFiller.java | 6 +- .../systems/modules/world/Nuker.java | 8 +- .../systems/modules/world/SpawnProofer.java | 4 +- .../systems/modules/world/VeinMiner.java | 5 +- 39 files changed, 237 insertions(+), 242 deletions(-) rename src/main/java/meteordevelopment/meteorclient/settings/{GroupedListSetting.java => GroupedSetSetting.java} (82%) rename src/main/java/meteordevelopment/meteorclient/settings/groups/{GroupedList.java => GroupSet.java} (54%) rename src/main/java/meteordevelopment/meteorclient/settings/groups/{ListGroup.java => SetGroup.java} (55%) rename src/main/java/meteordevelopment/meteorclient/settings/groups/{ListGroupTracker.java => SetGroupEnumeration.java} (82%) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java index 7b1413967e..164e095fb6 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java @@ -16,7 +16,7 @@ import meteordevelopment.meteorclient.commands.arguments.ModuleArgumentType; import meteordevelopment.meteorclient.commands.arguments.PlayerArgumentType; import meteordevelopment.meteorclient.pathing.PathManagers; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.swarm.Swarm; @@ -213,7 +213,7 @@ else if (swarm.isWorker()) { swarm.host.sendMessage(context.getInput()); } else if (swarm.isWorker()) { - Modules.get().get(InfinityMiner.class).targetBlocks.set(new GroupedList<>(List.of(context.getArgument("target", BlockStateArgument.class).getBlockState().getBlock()))); + Modules.get().get(InfinityMiner.class).targetBlocks.set(new GroupSet<>(List.of(context.getArgument("target", BlockStateArgument.class).getBlockState().getBlock()))); runInfinityMiner(); } } @@ -229,8 +229,8 @@ else if (swarm.isWorker()) { swarm.host.sendMessage(context.getInput()); } else if (swarm.isWorker()) { - Modules.get().get(InfinityMiner.class).targetBlocks.set(new GroupedList<>(List.of(context.getArgument("target", BlockStateArgument.class).getBlockState().getBlock()))); - Modules.get().get(InfinityMiner.class).repairBlocks.set(new GroupedList<>(List.of(context.getArgument("repair", BlockStateArgument.class).getBlockState().getBlock()))); + Modules.get().get(InfinityMiner.class).targetBlocks.set(new GroupSet<>(List.of(context.getArgument("target", BlockStateArgument.class).getBlockState().getBlock()))); + Modules.get().get(InfinityMiner.class).repairBlocks.set(new GroupSet<>(List.of(context.getArgument("repair", BlockStateArgument.class).getBlockState().getBlock()))); runInfinityMiner(); } } 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 dcc7d09959..b7d715ffa4 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java @@ -6,10 +6,8 @@ package meteordevelopment.meteorclient.gui.screens.settings; import meteordevelopment.meteorclient.gui.GuiTheme; -import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionListSettingScreen; import meteordevelopment.meteorclient.gui.screens.settings.base.GroupedListSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; -import meteordevelopment.meteorclient.settings.GroupedListSetting; import meteordevelopment.meteorclient.settings.ItemListSetting; import meteordevelopment.meteorclient.utils.misc.Names; import net.minecraft.item.Item; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java index 8a38e08e01..d48b97b2c1 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java @@ -18,7 +18,7 @@ import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; import meteordevelopment.meteorclient.gui.widgets.pressable.WPressable; import meteordevelopment.meteorclient.settings.BlockListSetting; -import meteordevelopment.meteorclient.settings.GroupedListSetting; +import meteordevelopment.meteorclient.settings.GroupedSetSetting; import meteordevelopment.meteorclient.settings.Settings; import meteordevelopment.meteorclient.utils.render.color.Color; @@ -28,17 +28,17 @@ import java.util.function.Function; import java.util.function.Predicate; -public abstract class GroupedListSettingScreen> extends WindowScreen { +public abstract class GroupedListSettingScreen> extends WindowScreen { protected final S setting; private final Iterable registry; - private final GroupedListSetting.Groups groups; + private final GroupedSetSetting.Groups groups; private WTable table; private String filterText = ""; - private GroupedListSetting.Groups.Group expanded; + private GroupedSetSetting.Groups.Group expanded; - public GroupedListSettingScreen(GuiTheme theme, String title, S setting, GroupedListSetting.Groups groups, Iterable registry) { + public GroupedListSettingScreen(GuiTheme theme, String title, S setting, GroupedSetSetting.Groups groups, Iterable registry) { super(theme, title); this.registry = registry; @@ -84,9 +84,9 @@ private void initTable() { if (!left.cells.isEmpty()) table.add(theme.verticalSeparator()).expandWidgetY(); list.clear(); - list.addAll(setting.get().getIncludedGroups().stream().map(ItemUnion::new).toList()); + list.addAll(setting.get().getGroups().stream().map(ItemUnion::new).toList()); - setting.get().getDirectlyIncludedItems().forEach((t) -> list.add(new ItemUnion(t))); + setting.get().getImmediate().forEach((t) -> list.add(new ItemUnion(t))); // Right (selected) WTable right = abc(list, false, t -> { @@ -101,7 +101,7 @@ private void initTable() { postWidgets(left, right); } - private WWidget groupLabel(GroupedListSetting.Groups.Group s) { + private WWidget groupLabel(GroupedSetSetting.Groups.Group s) { Color color = entireGroupExcluded(s) ? new Color(200, 100, 10) : Color.ORANGE; if (s.showIcon.get()) return theme.itemWithLabel(s.icon.get().asItem().getDefaultStack(), "@"+s.name.get()).color(color); else return theme.label(" @"+s.name.get()).color(color); @@ -116,8 +116,8 @@ private WTable abc(Iterable iterable, boolean isLeft, Consumer predicate = isLeft ? v -> Boolean.TRUE.equals(v.map( - t -> this.includeValue(t) && !setting.get().getDirectlyIncludedItems().contains(t), - s -> !entireGroupExcluded(s) && !setting.get().getIncludedGroups().contains(s))) + t -> this.includeValue(t) && !setting.get().getImmediate().contains(t), + s -> !entireGroupExcluded(s) && !setting.get().getGroups().contains(s))) : v -> true; Iterable sorted = SortingHelper.sort(iterable, predicate, v -> v.map(this::getValueNames, s -> new String[]{"@"+s.name.get()}), filterText); @@ -141,7 +141,7 @@ private WTable abc(Iterable iterable, boolean isLeft, Consumer.Group inc : s.getGroups()) { + for (GroupedSetSetting.Groups.Group inc : s.getGroups()) { subtable.add(theme.label(" -> ")); subtable.add(groupLabel(inc)); subtable.row(); @@ -178,7 +178,7 @@ private WTable abc(Iterable iterable, boolean isLeft, Consumer.Group s) { + private boolean entireGroupExcluded(GroupedSetSetting.Groups.Group s) { return !s.anyMatch(this::includeValue); } @@ -227,32 +227,32 @@ protected T getAdditionalValue(T value) { protected class ItemUnion { private final T t; - private final GroupedListSetting.Groups.Group s; + private final GroupedSetSetting.Groups.Group s; public ItemUnion(T t) { this.s = null; this.t = t; } - public ItemUnion(GroupedListSetting.Groups.Group s) { + public ItemUnion(GroupedSetSetting.Groups.Group s) { this.s = s; this.t = null; } - public R map(Function a, Function.Group, R> b) { + public R map(Function a, Function.Group, R> b) { if (t != null) return a.apply(t); else if (s != null) return b.apply(s); return null; } } - public class EditListGroupScreen extends EditSystemScreen.Group> { - public EditListGroupScreen(GuiTheme theme, GroupedListSetting.Groups.Group value, Runnable reload) { + public class EditListGroupScreen extends EditSystemScreen.Group> { + public EditListGroupScreen(GuiTheme theme, GroupedSetSetting.Groups.Group value, Runnable reload) { super(theme, value, reload); } @Override - public GroupedListSetting.Groups.Group create() { + public GroupedSetSetting.Groups.Group create() { return null; } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java index 2bbc48e0e1..1d49cc699c 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.settings; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.render.Xray; import net.minecraft.block.Block; import net.minecraft.block.Blocks; @@ -19,9 +19,9 @@ import java.util.function.Consumer; import java.util.function.Predicate; -public class BlockListSetting extends GroupedListSetting { +public class BlockListSetting extends GroupedSetSetting { - public BlockListSetting(String name, String description, GroupedList.Group> defaultValue, Consumer.Group>> onChanged, Consumer.Group>>> onModuleActivated, Predicate filter, IVisible visible) { + public BlockListSetting(String name, String description, GroupSet.Group> defaultValue, Consumer.Group>> onChanged, Consumer.Group>>> onModuleActivated, Predicate filter, IVisible visible) { super(name, description, defaultValue, filter, onChanged, onModuleActivated, visible); } @@ -56,23 +56,23 @@ public Iterable getIdentifierSuggestions() { return Registries.BLOCK.getIds(); } - public static class Builder extends SettingBuilder.Group>, BlockListSetting> { + public static class Builder extends SettingBuilder.Group>, BlockListSetting> { private Predicate filter; public Builder() { - super(new GroupedList<>()); + super(new GroupSet<>()); } public Builder defaultValue(Collection defaults) { if (defaultValue == null) - return defaultValue(defaults != null ? new GroupedList<>(defaults) : new GroupedList<>()); + return defaultValue(defaults != null ? new GroupSet<>(defaults) : new GroupSet<>()); defaultValue.addAll(defaults); return this; } public Builder defaultValue(Block... defaults) { if (defaultValue == null) - return defaultValue(defaults != null ? new GroupedList<>(Arrays.asList(defaults)) : new GroupedList<>()); + return defaultValue(defaults != null ? new GroupSet<>(Arrays.asList(defaults)) : new GroupSet<>()); defaultValue.addAll(Arrays.asList(defaults)); return this; } @@ -82,10 +82,10 @@ public final Builder defaultGroups(Groups.Group... defaults) { List.Group> groups = null; if (defaults != null) - groups = Arrays.stream(defaults).filter(g -> g.trackerIs(GROUPS)).toList(); + groups = Arrays.stream(defaults).filter(g -> g.isOf(GROUPS)).toList(); if (defaultValue == null) - return defaultValue(groups != null ? new GroupedList<>(null, groups) : new GroupedList<>()); + return defaultValue(groups != null ? new GroupSet<>(null, groups) : new GroupSet<>()); if (groups != null) defaultValue.addAllGroups(groups); return this; diff --git a/src/main/java/meteordevelopment/meteorclient/settings/GroupedListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/GroupedSetSetting.java similarity index 82% rename from src/main/java/meteordevelopment/meteorclient/settings/GroupedListSetting.java rename to src/main/java/meteordevelopment/meteorclient/settings/GroupedSetSetting.java index 91cf3745e7..6afd569f7b 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/GroupedListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/GroupedSetSetting.java @@ -5,9 +5,9 @@ package meteordevelopment.meteorclient.settings; -import meteordevelopment.meteorclient.settings.groups.GroupedList; -import meteordevelopment.meteorclient.settings.groups.ListGroup; -import meteordevelopment.meteorclient.settings.groups.ListGroupTracker; +import meteordevelopment.meteorclient.settings.groups.GroupSet; +import meteordevelopment.meteorclient.settings.groups.SetGroup; +import meteordevelopment.meteorclient.settings.groups.SetGroupEnumeration; import meteordevelopment.meteorclient.utils.Utils; import net.minecraft.item.Item; import net.minecraft.item.Items; @@ -22,12 +22,13 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; +import java.util.stream.Collectors; -public abstract class GroupedListSetting extends Setting.Group>> { +public abstract class GroupedSetSetting extends Setting.Group>> { protected Predicate filter; - public GroupedListSetting(String name, String description, GroupedList.Group> defaultValue, Predicate filter, Consumer.Group>> onChanged, Consumer.Group>>> onModuleActivated, IVisible visible) { + public GroupedSetSetting(String name, String description, GroupSet.Group> defaultValue, Predicate filter, Consumer.Group>> onChanged, Consumer.Group>>> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); this.filter = filter; } @@ -40,7 +41,7 @@ public GroupedListSetting(String name, String description, GroupedList groups(); @Override - public GroupedList.Group> get() { + public GroupSet.Group> get() { return value; } @@ -49,11 +50,11 @@ public Predicate getFilter() { } @Override - public boolean set(GroupedList.Group> o) { + public boolean set(GroupSet.Group> o) { if (value == null) { - value = new GroupedList<>(); - value.tracker = groups(); - value.setFilter(filter); + value = new GroupSet<>(); + value.enumeration = groups(); + value.setIncludeCondition(filter); } value.set(o); onChanged(); @@ -66,10 +67,9 @@ protected void resetImpl() { } @Override - protected GroupedList.Group> parseImpl(String str) { - - GroupedList.Group> list = new GroupedList<>(); - list.tracker = groups(); + protected GroupSet.Group> parseImpl(String str) { + GroupSet.Group> list = new GroupSet<>(); + list.enumeration = groups(); String[] values = str.split(","); @@ -97,7 +97,7 @@ protected GroupedList.Group> parseImpl(String str) { } @Override - protected boolean isValueValid(GroupedList.Group> value) { + protected boolean isValueValid(GroupSet.Group> value) { return true; } @@ -111,12 +111,12 @@ final protected NbtCompound save(NbtCompound tag) { tag.put("groups", groupsTag); NbtList direct = new NbtList(); - value.getDirectlyIncludedItems().stream().map(this::itemToNbt).forEach(direct::add); + value.getImmediate().stream().map(this::itemToNbt).forEach(direct::add); tag.put("direct", direct); NbtList include = new NbtList(); - value.getIncludedGroups().stream().map((g) -> NbtString.of(g.internalName)).forEach(direct::add); + value.getGroups().stream().map((g) -> NbtString.of(g.internalName)).forEach(direct::add); tag.put("include", include); @@ -124,7 +124,7 @@ final protected NbtCompound save(NbtCompound tag) { } @Override - final protected GroupedList.Group> load(NbtCompound tag) { + final protected GroupSet.Group> load(NbtCompound tag) { tag.getListOrEmpty("groups").forEach(el -> el.asCompound().ifPresent(t -> groups().fromTag(t, this::itemFromNbt))); value.clear(); @@ -135,7 +135,7 @@ final protected GroupedList.Group> load(NbtCompound tag) { return value; } - static final public class Groups extends ListGroupTracker { + static final public class Groups extends SetGroupEnumeration { Map GROUPS = new HashMap<>(); @@ -216,7 +216,7 @@ public Group fromTag(NbtCompound tag, Function itemFromNbt) { return new Group(tag, itemFromNbt); } - public class Group extends ListGroup { + public class Group extends SetGroup { public boolean builtin; public Settings settings = new Settings(); @@ -247,14 +247,12 @@ public class Group extends ListGroup { .build() ); - public boolean checkName(String v) { - Group other = GROUPS.get(v.toUpperCase()); - return other == this || other == null; - } - private void changeName(String v) { if (v.equals(internalName)) return; + // this should never happen + if (internalName == null) internalName = "_group" + hashCode(); + Group other = GROUPS.get(v.toUpperCase()); if (other == this) { internalName = v; @@ -262,14 +260,12 @@ private void changeName(String v) { } if (other != null) { name.set(internalName); - } - else { + } else { GROUPS.remove(internalName.toUpperCase()); GROUPS.put(v.toUpperCase(), this); } } - private Group(String name) { super(Groups.this); @@ -290,7 +286,7 @@ public NbtCompound toTag(Function itemToNbt) { tag.put("icon", Identifier.CODEC, Registries.ITEM.getId(icon.get())); NbtList d = new NbtList(); - direct.forEach((t) -> d.add(itemToNbt.apply(t))); + immediate.forEach((t) -> d.add(itemToNbt.apply(t))); NbtList i = new NbtList(); include.forEach((g) -> i.add(NbtString.of(g.internalName))); @@ -307,7 +303,7 @@ public Group fromTag(NbtCompound tag, Function itemFromNbt) { this.name.set(name); this.icon.set(tag.get("item", Identifier.CODEC).map(Registries.ITEM::get).orElse(null)); - this.direct = tag.getListOrEmpty("direct").stream().map(itemFromNbt).toList(); + this.immediate = tag.getListOrEmpty("direct").stream().map(itemFromNbt).collect(Collectors.toSet()); this.include = tag.getListOrEmpty("include").stream().map(NbtElement::asString) .filter(Optional::isPresent).map(Optional::get).map(String::toUpperCase).map((s) -> { if (GROUPS.containsKey(s)) return GROUPS.get(s); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java index 08587c961a..90552c91f5 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java @@ -5,11 +5,8 @@ package meteordevelopment.meteorclient.settings; -import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.settings.groups.GroupedList; -import meteordevelopment.meteorclient.systems.modules.player.AutoEat; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.ConsumableComponents; import net.minecraft.item.Item; import net.minecraft.item.Items; import net.minecraft.nbt.NbtElement; @@ -21,13 +18,13 @@ import java.util.function.Consumer; import java.util.function.Predicate; -public class ItemListSetting extends GroupedListSetting { +public class ItemListSetting extends GroupedSetSetting { public static final Groups GROUPS = new Groups<>(); private final boolean bypassFilterWhenSavingAndLoading; - public ItemListSetting(String name, String description, GroupedList.Group> defaultValue, Consumer.Group>> onChanged, Consumer.Group>>> onModuleActivated, IVisible visible, Predicate filter, boolean bypassFilterWhenSavingAndLoading) { + public ItemListSetting(String name, String description, GroupSet.Group> defaultValue, Consumer.Group>> onChanged, Consumer.Group>>> onModuleActivated, IVisible visible, Predicate filter, boolean bypassFilterWhenSavingAndLoading) { super(name, description, defaultValue, filter, onChanged, onModuleActivated, visible); this.bypassFilterWhenSavingAndLoading = bypassFilterWhenSavingAndLoading; @@ -60,24 +57,24 @@ public Iterable getIdentifierSuggestions() { return Registries.ITEM.getIds(); } - public static class Builder extends SettingBuilder.Group>, ItemListSetting> { + public static class Builder extends SettingBuilder.Group>, ItemListSetting> { private Predicate filter = null; private boolean bypass = false; public Builder() { - super(new GroupedList<>()); + super(new GroupSet<>()); } public Builder defaultValue(Collection defaults) { if (defaultValue == null) - return defaultValue(defaults != null ? new GroupedList<>(defaults) : new GroupedList<>()); + return defaultValue(defaults != null ? new GroupSet<>(defaults) : new GroupSet<>()); defaultValue.addAll(defaults); return this; } public Builder defaultValue(Item... defaults) { if (defaultValue == null) - return defaultValue(defaults != null ? new GroupedList<>(Arrays.asList(defaults)) : new GroupedList<>()); + return defaultValue(defaults != null ? new GroupSet<>(Arrays.asList(defaults)) : new GroupSet<>()); defaultValue.addAll(Arrays.asList(defaults)); return this; } @@ -87,10 +84,10 @@ public final Builder defaultGroups(Groups.Group... defaults) { List.Group> groups = null; if (defaults != null) - groups = Arrays.stream(defaults).filter(g -> g.trackerIs(GROUPS)).toList(); + groups = Arrays.stream(defaults).filter(g -> g.isOf(GROUPS)).toList(); if (defaultValue == null) - return defaultValue(groups != null ? new GroupedList<>(null, groups) : new GroupedList<>()); + return defaultValue(groups != null ? new GroupSet<>(null, groups) : new GroupSet<>()); if (groups != null) defaultValue.addAllGroups(groups); return this; diff --git a/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupedList.java b/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupSet.java similarity index 54% rename from src/main/java/meteordevelopment/meteorclient/settings/groups/GroupedList.java rename to src/main/java/meteordevelopment/meteorclient/settings/groups/GroupSet.java index 1d6622bc8f..7edec847ab 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupedList.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupSet.java @@ -5,51 +5,54 @@ package meteordevelopment.meteorclient.settings.groups; +import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; import meteordevelopment.meteorclient.MeteorClient; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Unmodifiable; +import javax.print.attribute.UnmodifiableSetException; import java.util.*; import java.util.function.Predicate; -public class GroupedList> implements Iterable { - private List cached; +@Unmodifiable +public class GroupSet> implements Iterable { + private Set cached; + private Set immediate; private List include; - private List direct; - private Predicate filter; + private Predicate includeIf; - public ListGroupTracker tracker = null; + public SetGroupEnumeration enumeration = null; long version; private boolean isValid() { if (cached == null) return false; - if (tracker == null) return false; - return version == tracker.getVersion(); + if (enumeration == null) return false; + return version == enumeration.getVersion(); } - public GroupedList() { + public GroupSet() { cached = null; include = new ArrayList<>(); - direct = new ArrayList<>(); + immediate = new ReferenceOpenHashSet<>(); } - public GroupedList(@NotNull Collection d) { - cached = new ArrayList<>(d); + public GroupSet(@NotNull Collection d) { + cached = new ReferenceOpenHashSet<>(d); include = new ArrayList<>(); - direct = new ArrayList<>(d); + immediate = new ReferenceOpenHashSet<>(cached); } - public GroupedList(Collection d, @NotNull Collection g) { + public GroupSet(Collection d, @NotNull Collection g) { cached = null; include = new ArrayList<>(g); - direct = d == null ? new ArrayList<>() : new ArrayList<>(d); + immediate = d == null ? new ReferenceOpenHashSet<>() : new ReferenceOpenHashSet<>(d); } public boolean add(T t) { - if (!direct.contains(t)) { - direct.add(t); - if (isValid() && !cached.contains(t)) cached.add(t); + if (!immediate.contains(t)) { + immediate.add(t); + if (isValid()) cached.add(t); return true; } return false; @@ -64,16 +67,16 @@ public boolean add(G g) { return false; } - public boolean remove(G g) { - if (include.remove(g)) { + public boolean remove(T t) { + if (immediate.remove(t)) { cached = null; return true; } return false; } - public boolean remove(T t) { - if (direct.remove(t)) { + public boolean remove(G g) { + if (include.remove(g)) { cached = null; return true; } @@ -84,68 +87,60 @@ public void invalidate() { cached = null; } - public void setFilter(Predicate filter) { - this.filter = filter; + public void setIncludeCondition(Predicate includeIf) { + this.includeIf = includeIf; cached = null; } - public boolean testFilter(T t) { - return filter.test(t); - } - @Unmodifiable - public List get() { + public Set get() { if (isValid()) return cached; - if (tracker != null) version = tracker.getVersion(); - else if (cached != null && !cached.isEmpty()) MeteorClient.LOG.warn("Rebuild of GroupedList with tracker == null"); + if (enumeration != null) version = enumeration.getVersion(); + else if (cached != null && !cached.isEmpty()) MeteorClient.LOG.warn("Rebuild of GroupSet with tracker == null"); - MeteorClient.LOG.info("Rebuild {} direct, {} groups.", direct.size(), include.size()); + MeteorClient.LOG.info("Rebuild {} direct, {} groups.", immediate.size(), include.size()); - Set set = new HashSet<>(direct); - List> seen = new ArrayList<>(); - List> next = new ArrayList<>(); + Set set = new ReferenceOpenHashSet<>(immediate); + List> seen = new ArrayList<>(); + List> next = new ArrayList<>(); - for (ListGroup g : include) { + for (SetGroup g : include) { g.internalGetAll(set, seen, next); } + if (includeIf != null) set.removeIf((t) -> !includeIf.test(t)); - if (cached != null) cached.clear(); - else cached = new ArrayList<>(); - - for (T t : set) { - if (filter == null || filter.test(t)) cached.add(t); - } + cached = set; - return cached; + return Collections.unmodifiableSet(cached); } - public void set(GroupedList other) { + public void set(GroupSet other) { cached = null; if (other.isValid()) { - cached = new ArrayList<>(other.cached); - version = tracker.getVersion(); + cached = new ReferenceOpenHashSet<>(other.cached); + version = enumeration.getVersion(); } include = new ArrayList<>(other.include); - direct = new ArrayList<>(other.direct); + immediate = new ReferenceOpenHashSet<>(other.immediate); } public void clear() { if (cached != null) cached.clear(); include.clear(); - direct.clear(); + immediate.clear(); } @Unmodifiable - public List getDirectlyIncludedItems() { - return direct; + public Set getImmediate() { + return Collections.unmodifiableSet(immediate); } @Unmodifiable - public List getIncludedGroups() { - return include; + public List getGroups() { + return Collections.unmodifiableList(include); } public boolean containsAll(@NotNull Collection collection) { @@ -154,11 +149,11 @@ public boolean containsAll(@NotNull Collection collection) { return true; } - public boolean addAll(@NotNull Collection collection) { + public boolean addAll(@NotNull Collection collection) { boolean modified = false; for (T t : collection) { - if (!direct.contains(t)) { - direct.add(t); + if (!immediate.contains(t)) { + immediate.add(t); modified = true; } } @@ -166,7 +161,7 @@ public boolean addAll(@NotNull Collection collection) { return modified; } - public boolean addAllGroups(Collection collection) { + public boolean addAllGroups(@NotNull Collection collection) { boolean modified = false; for (G g : collection) { if (!include.contains(g)) { @@ -180,7 +175,7 @@ public boolean addAllGroups(Collection collection) { public boolean removeAll(@NotNull Collection collection) { cached = null; - return direct.removeAll(collection); + return immediate.removeAll(collection); } public boolean removeAllGroups(@NotNull Collection collection) { @@ -204,4 +199,12 @@ public boolean contains(Object o) { public @NotNull Iterator iterator() { return get().iterator(); } + + public @NotNull Object[] toArray() { + return get().toArray(); + } + + public @NotNull T1[] toArray(@NotNull T1[] t1s) { + return get().toArray(t1s); + } } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroup.java b/src/main/java/meteordevelopment/meteorclient/settings/groups/SetGroup.java similarity index 55% rename from src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroup.java rename to src/main/java/meteordevelopment/meteorclient/settings/groups/SetGroup.java index 52ba56ad9f..cd0af51263 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroup.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/groups/SetGroup.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.settings.groups; +import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; import meteordevelopment.meteorclient.MeteorClient; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Unmodifiable; @@ -12,47 +13,47 @@ import java.util.*; import java.util.function.Predicate; -public abstract class ListGroup> { - protected List direct = new ArrayList<>(); +public abstract class SetGroup> { + protected Set immediate = new ReferenceOpenHashSet<>(); protected List include = new ArrayList<>(); - final protected ListGroupTracker tracker; + final protected SetGroupEnumeration enumeration; - public boolean trackerIs(ListGroupTracker o) { return tracker == o; }; + public boolean isOf(SetGroupEnumeration of) { return enumeration == of; }; @Unmodifiable - public List getImmediate() { - return direct; + public Set getImmediate() { + return immediate; } - public List getAll() { - Set set = new HashSet<>(); - List> seen = new ArrayList<>(); - List> next = new ArrayList<>(); + public Set getAll() { + Set set = new ReferenceOpenHashSet<>(); + List> seen = new ArrayList<>(); + List> next = new ArrayList<>(); internalGetAll(set, seen, next); - return new ArrayList<>(set); + return set; } - public void internalGetAll(Collection to, Collection> seen, List> next) { + public void internalGetAll(Collection to, Collection> seen, List> next) { next.clear(); next.add(this); for (int i = 0; i < next.size(); i++) { - ListGroup g = next.get(i); + SetGroup g = next.get(i); if (seen.contains(g)) continue; - to.addAll(g.direct); + to.addAll(g.immediate); next.addAll(g.include); seen.add(g); } } public boolean anyMatch(Predicate predicate) { - List> seen = new ArrayList<>(); - List> next = new ArrayList<>(); + List> seen = new ArrayList<>(); + List> next = new ArrayList<>(); next.add(this); for (int i = 0; i < next.size(); i++) { - ListGroup g = next.get(i); + SetGroup g = next.get(i); if (seen.contains(g)) continue; - if (g.direct.stream().anyMatch(predicate)) return true; + if (g.immediate.stream().anyMatch(predicate)) return true; next.addAll(g.include); seen.add(g); } @@ -65,20 +66,20 @@ public List getGroups() { } public boolean add(T t) { - if (!direct.contains(t)) { - MeteorClient.LOG.info("ListGroup.add@ had {}", direct.size()); - direct.add(t); - tracker.invalidate(); + if (!immediate.contains(t)) { + MeteorClient.LOG.info("SetGroup.add@ had {}", immediate.size()); + immediate.add(t); + enumeration.invalidate(); return true; } - MeteorClient.LOG.info("ListGroup.add@ duplicate item"); + MeteorClient.LOG.info("SetGroup.add@ duplicate item"); return false; } public boolean add(G g) { if (!include.contains(g)) { include.add(g); - tracker.invalidate(); + enumeration.invalidate(); return true; } return false; @@ -86,15 +87,15 @@ public boolean add(G g) { public boolean remove(G g) { if (include.remove(g)) { - tracker.invalidate(); + enumeration.invalidate(); return true; } return false; } public boolean remove(T t) { - if (direct.remove(t)) { - tracker.invalidate(); + if (immediate.remove(t)) { + enumeration.invalidate(); return true; } return false; @@ -103,14 +104,14 @@ public boolean remove(T t) { public boolean addAll(@NotNull Collection collection) { boolean modified = false; for (T t : collection) { - MeteorClient.LOG.info("ListGroup.addAll@ had {}", direct.size()); - if (!direct.contains(t)) { - direct.add(t); + MeteorClient.LOG.info("SetGroup.addAll@ had {}", immediate.size()); + if (!immediate.contains(t)) { + immediate.add(t); modified = true; } - MeteorClient.LOG.info("ListGroup.addAll@ has {}", direct.size()); + MeteorClient.LOG.info("SetGroup.addAll@ has {}", immediate.size()); } - if (modified) tracker.invalidate(); + if (modified) enumeration.invalidate(); return modified; } @@ -122,21 +123,21 @@ public boolean addAllGroups(Collection collection) { modified = true; } } - if (modified) tracker.invalidate();; + if (modified) enumeration.invalidate();; return modified; } public boolean removeAll(@NotNull Collection collection) { - tracker.invalidate(); - return direct.removeAll(collection); + enumeration.invalidate(); + return immediate.removeAll(collection); } public boolean removeAllGroups(@NotNull Collection collection) { - tracker.invalidate(); + enumeration.invalidate(); return include.removeAll(collection); } - public ListGroup(ListGroupTracker t) { tracker = t; } + public SetGroup(SetGroupEnumeration t) { enumeration = t; } @Override public boolean equals(Object obj) { diff --git a/src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroupTracker.java b/src/main/java/meteordevelopment/meteorclient/settings/groups/SetGroupEnumeration.java similarity index 82% rename from src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroupTracker.java rename to src/main/java/meteordevelopment/meteorclient/settings/groups/SetGroupEnumeration.java index 5d7d555ed9..e3aab8b1b5 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/groups/ListGroupTracker.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/groups/SetGroupEnumeration.java @@ -1,6 +1,6 @@ package meteordevelopment.meteorclient.settings.groups; -public class ListGroupTracker { +public class SetGroupEnumeration { long a = 0; 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 9accb981dc..448723c383 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/HoleHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/HoleHud.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.mixin.WorldRendererAccessor; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.hud.Hud; import meteordevelopment.meteorclient.systems.hud.HudElement; import meteordevelopment.meteorclient.systems.hud.HudElementInfo; @@ -30,7 +30,7 @@ public class HoleHud extends HudElement { // General - public final Setting.Group>> safe = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> 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) 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 6e65fc6768..b1f934a501 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoTrap.java @@ -9,7 +9,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -44,7 +44,7 @@ public class AutoTrap extends Module { // General - private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("whitelist") .description("Which blocks to use.") .defaultValue(Blocks.OBSIDIAN, Blocks.CRYING_OBSIDIAN) 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 b5de696f24..4da7081e7a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java @@ -10,7 +10,7 @@ import meteordevelopment.meteorclient.mixin.DirectionAccessor; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -43,7 +43,7 @@ public class HoleFiller extends Module { private final SettingGroup sgSmart = settings.createGroup("Smart"); private final SettingGroup sgRender = settings.createGroup("Render"); - private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Which blocks can be used to fill holes.") .defaultValue( 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 fd320eee83..812d8091ce 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/SelfTrap.java @@ -9,7 +9,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.player.FindItemResult; @@ -44,7 +44,7 @@ public enum BottomMode { // General - private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("whitelist") .description("Which blocks to use.") .defaultValue(Blocks.OBSIDIAN, Blocks.NETHERITE_BLOCK) 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 37fe3bf7ca..6209da616f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java @@ -12,7 +12,7 @@ import meteordevelopment.meteorclient.mixin.WorldRendererAccessor; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.entity.DamageUtils; @@ -50,7 +50,7 @@ public class Surround extends Module { // General - private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("What blocks to use for surround.") .defaultValue(Blocks.OBSIDIAN, Blocks.CRYING_OBSIDIAN, Blocks.NETHERITE_BLOCK) 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 08d8e0ed66..30297153b7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java @@ -17,7 +17,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.mixin.HandledScreenAccessor; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -107,7 +107,7 @@ public class InventoryTweaks extends Module { // Anti drop - private final Setting.Group>> antiDropItems = sgAntiDrop.add(new ItemListSetting.Builder() + private final Setting.Group>> antiDropItems = sgAntiDrop.add(new ItemListSetting.Builder() .name("anti-drop-items") .description("Items to prevent dropping. Doesn't work in creative inventory screen.") .build() @@ -128,7 +128,7 @@ public class InventoryTweaks extends Module { // Auto Drop - private final Setting.Group>> autoDropItems = sgAutoDrop.add(new ItemListSetting.Builder() + private final Setting.Group>> autoDropItems = sgAutoDrop.add(new ItemListSetting.Builder() .name("auto-drop-items") .description("Items to drop.") .build() @@ -193,7 +193,7 @@ public class InventoryTweaks extends Module { .build() ); - private final Setting.Group>> dumpItems = sgStealDump.add(new ItemListSetting.Builder() + private final Setting.Group>> dumpItems = sgStealDump.add(new ItemListSetting.Builder() .name("dump-items") .description("Items to dump.") .build() @@ -206,7 +206,7 @@ public class InventoryTweaks extends Module { .build() ); - private final Setting.Group>> stealItems = sgStealDump.add(new ItemListSetting.Builder() + private final Setting.Group>> stealItems = sgStealDump.add(new ItemListSetting.Builder() .name("steal-items") .description("Items to steal.") .build() 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 6fc9dddfd8..ec61bda8fa 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java @@ -9,7 +9,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.player.FindItemResult; @@ -35,7 +35,7 @@ public class Scaffold extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgRender = settings.createGroup("Render"); - private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Selected blocks.") .build() 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 a58c686622..ded90999d8 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Slippy.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Slippy.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.systems.modules.movement; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import net.minecraft.block.Block; @@ -30,14 +30,14 @@ public class Slippy extends Module { .build() ); - public final Setting.Group>> ignoredBlocks = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> 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.Group>> allowedBlocks = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> allowedBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("allowed-blocks") .description("Decide which blocks to slip on") .visible(() -> listMode.get() == ListMode.Whitelist) 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 ef2f375104..655be57a5b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java @@ -9,7 +9,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; @@ -40,7 +40,7 @@ public class AutoEat extends Module { private final SettingGroup sgThreshold = settings.createGroup("Threshold"); // General - public final Setting.Group>> blacklist = sgGeneral.add(new ItemListSetting.Builder() + public final Setting.Group>> blacklist = sgGeneral.add(new ItemListSetting.Builder() .name("blacklist") .description("Which items to not eat.") .defaultValue( 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 e66af42736..26ca33eedd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -21,7 +21,7 @@ public class AutoMend extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting.Group>> blacklist = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> blacklist = sgGeneral.add(new ItemListSetting.Builder() .name("blacklist") .description("Item blacklist.") .filter(item -> item.getComponents().get(DataComponentTypes.DAMAGE) != null) 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 0c3a8ad2ed..292908685a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; @@ -70,7 +70,7 @@ public class AutoReplenish extends Module { .build() ); - private final Setting.Group>> excludedItems = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> excludedItems = sgGeneral.add(new ItemListSetting.Builder() .name("excluded-items") .description("Items that won't be replenished.") .build() 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 b1af61cef9..a23e05ee5d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java @@ -9,7 +9,7 @@ import meteordevelopment.meteorclient.events.entity.player.StartBreakingBlockEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; @@ -98,7 +98,7 @@ public class AutoTool extends Module { .build() ); - private final Setting.Group>> whitelist = sgWhitelist.add(new ItemListSetting.Builder() + private final Setting.Group>> whitelist = sgWhitelist.add(new ItemListSetting.Builder() .name("whitelist") .description("The tools you want to use.") .visible(() -> listMode.get() == ListMode.Whitelist) @@ -106,7 +106,7 @@ public class AutoTool extends Module { .build() ); - private final Setting.Group>> blacklist = sgWhitelist.add(new ItemListSetting.Builder() + private final Setting.Group>> blacklist = sgWhitelist.add(new ItemListSetting.Builder() .name("blacklist") .description("The tools you don't want to use.") .visible(() -> listMode.get() == ListMode.Blacklist) 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 e7439769cb..fd16c1ffde 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FastUse.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FastUse.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.systems.modules.player; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import net.minecraft.item.BlockItem; @@ -28,7 +28,7 @@ public enum Mode { .build() ); - private final Setting.Group>> items = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> items = sgGeneral.add(new ItemListSetting.Builder() .name("items") .description("Which items should fast place work on in \"Some\" mode.") .visible(() -> mode.get() == Mode.Some) 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 4c9ac97f7e..1c11d246be 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoInteract.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoInteract.java @@ -10,7 +10,7 @@ import meteordevelopment.meteorclient.events.entity.player.InteractEntityEvent; import meteordevelopment.meteorclient.events.entity.player.StartBreakingBlockEvent; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -33,7 +33,7 @@ public class NoInteract extends Module { // Blocks - private final Setting.Group>> blockMine = sgBlocks.add(new BlockListSetting.Builder() + private final Setting.Group>> blockMine = sgBlocks.add(new BlockListSetting.Builder() .name("block-mine") .description("Cancels block mining.") .build() @@ -46,7 +46,7 @@ public class NoInteract extends Module { .build() ); - private final Setting.Group>> blockInteract = sgBlocks.add(new BlockListSetting.Builder() + private final Setting.Group>> blockInteract = sgBlocks.add(new BlockListSetting.Builder() .name("block-interact") .description("Cancels block interaction.") .build() 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 b9f2af04f8..6c8a4fde59 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/SpeedMine.java @@ -9,7 +9,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.mixin.ClientPlayerInteractionManagerAccessor; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -31,7 +31,7 @@ public class SpeedMine extends Module { .build() ); - private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Selected blocks.") .filter(block -> block.getHardness() > 0) 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 8b91ae0f5b..6a6b855472 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemHighlight.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemHighlight.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.systems.modules.render; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.render.color.SettingColor; @@ -16,7 +16,7 @@ public class ItemHighlight extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting.Group>> items = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> items = sgGeneral.add(new ItemListSetting.Builder() .name("items") .description("Items to highlight.") .build() 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 a80f2b7296..ec33aa216b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java @@ -9,7 +9,7 @@ import meteordevelopment.meteorclient.events.world.ChunkOcclusionEvent; import meteordevelopment.meteorclient.events.world.ParticleEvent; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.orbit.EventHandler; @@ -323,7 +323,7 @@ public class NoRender extends Module { .build() ); - private final Setting.Group>> blockEntities = sgWorld.add(new BlockListSetting.Builder() + private final Setting.Group>> 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)) 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 499817185c..61b3080e71 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java @@ -8,7 +8,7 @@ import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -39,7 +39,7 @@ public class Trajectories extends Module { // General - private final Setting.Group>> items = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> items = sgGeneral.add(new ItemListSetting.Builder() .name("items") .description("Items to display trajectories for.") .defaultValue(getDefaultItems()) 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 de040d750d..e75b9ecbaf 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WallHack.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/WallHack.java @@ -10,7 +10,7 @@ import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.orbit.EventHandler; @@ -34,7 +34,7 @@ public class WallHack extends Module { .build() ); - public final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("What blocks should be targeted for Wall Hack.") .onChanged(onChanged -> { 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 1c266af5cc..8fc13c9dc0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Xray.java @@ -12,7 +12,7 @@ import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; @@ -33,7 +33,7 @@ public class Xray extends Module { public static final List ORES = List.of(Blocks.COAL_ORE, Blocks.DEEPSLATE_COAL_ORE, Blocks.IRON_ORE, Blocks.DEEPSLATE_IRON_ORE, Blocks.GOLD_ORE, Blocks.DEEPSLATE_GOLD_ORE, Blocks.LAPIS_ORE, Blocks.DEEPSLATE_LAPIS_ORE, Blocks.REDSTONE_ORE, Blocks.DEEPSLATE_REDSTONE_ORE, Blocks.DIAMOND_ORE, Blocks.DEEPSLATE_DIAMOND_ORE, Blocks.EMERALD_ORE, Blocks.DEEPSLATE_EMERALD_ORE, Blocks.COPPER_ORE, Blocks.DEEPSLATE_COPPER_ORE, Blocks.NETHER_GOLD_ORE, Blocks.NETHER_QUARTZ_ORE, Blocks.ANCIENT_DEBRIS); - private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("whitelist") .description("Which blocks to show x-rayed.") .defaultValue(ORES) 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 97c9dc3d1e..3c7c5e3506 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 @@ -14,7 +14,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -38,7 +38,7 @@ public class BlockESP extends Module { // General - private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Blocks to search for.") .onChanged(blocks1 -> { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPChunk.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPChunk.java index 0fac693cf3..7449b9f7a2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPChunk.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPChunk.java @@ -15,6 +15,7 @@ import net.minecraft.world.Heightmap; import net.minecraft.world.chunk.Chunk; +import java.util.Collection; import java.util.List; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -86,7 +87,7 @@ public void render(Render3DEvent event) { } - public static ESPChunk searchChunk(Chunk chunk, List blocks) { + public static ESPChunk searchChunk(Chunk chunk, Collection blocks) { ESPChunk schunk = new ESPChunk(chunk.getPos().x, chunk.getPos().z); if (schunk.shouldBeDeleted()) return schunk; 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 a133248ab0..03f394cfeb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.mixininterface.IAbstractFurnaceScreenHandler; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -21,7 +21,7 @@ public class AutoSmelter extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting.Group>> fuelItems = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> fuelItems = sgGeneral.add(new ItemListSetting.Builder() .name("fuel-items") .description("Items to use as fuel") .defaultValue(Items.COAL, Items.CHARCOAL) @@ -30,7 +30,7 @@ public class AutoSmelter extends Module { .build() ); - private final Setting.Group>> smeltableItems = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> 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) 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 481216e580..8e547686e4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Collisions.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Collisions.java @@ -10,7 +10,7 @@ import meteordevelopment.meteorclient.events.world.CollisionShapeEvent; import meteordevelopment.meteorclient.mixininterface.IVec3d; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.orbit.EventHandler; @@ -22,7 +22,7 @@ public class Collisions extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - public final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("What blocks should be added collision box.") .filter(this::blockFilter) 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 63ee6cfeda..b0270a5db4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java @@ -15,7 +15,7 @@ import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.renderer.text.TextRenderer; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; @@ -254,7 +254,7 @@ public enum BlockadeType { // Paving - public final Setting.Group>> blocksToPlace = sgPaving.add(new BlockListSetting.Builder() + public final Setting.Group>> blocksToPlace = sgPaving.add(new BlockListSetting.Builder() .name("blocks-to-place") .description("Blocks it is allowed to place.") .defaultValue(Blocks.OBSIDIAN) @@ -288,7 +288,7 @@ public enum BlockadeType { // Inventory - private final Setting.Group>> trashItems = sgInventory.add(new ItemListSetting.Builder() + private final Setting.Group>> trashItems = sgInventory.add(new ItemListSetting.Builder() .name("trash-items") .description("Items that are considered trash and can be thrown out.") .defaultValue( 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 4729b0fa87..badab8bcb5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java @@ -13,7 +13,7 @@ import baritone.api.process.IMineProcess; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -40,7 +40,7 @@ public class InfinityMiner extends Module { // General - public final Setting.Group>> targetBlocks = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> targetBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("target-blocks") .description("The target blocks to mine.") .defaultValue(Blocks.DIAMOND_ORE, Blocks.DEEPSLATE_DIAMOND_ORE) @@ -48,14 +48,14 @@ public class InfinityMiner extends Module { .build() ); - public final Setting.Group>> targetItems = sgGeneral.add(new ItemListSetting.Builder() + public final Setting.Group>> targetItems = sgGeneral.add(new ItemListSetting.Builder() .name("target-items") .description("The target items to collect.") .defaultValue(Items.DIAMOND) .build() ); - public final Setting.Group>> repairBlocks = sgGeneral.add(new BlockListSetting.Builder() + public final Setting.Group>> 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) 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 a8a7cad16f..848dfa6813 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/LiquidFiller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/LiquidFiller.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -106,7 +106,7 @@ public class LiquidFiller extends Module { .build() ); - private final Setting.Group>> whitelist = sgWhitelist.add(new BlockListSetting.Builder() + private final Setting.Group>> whitelist = sgWhitelist.add(new BlockListSetting.Builder() .name("whitelist") .description("The allowed blocks that it will use to fill up the liquid.") .defaultValue(Blocks.COBBLESTONE, Blocks.COBBLED_DEEPSLATE) @@ -115,7 +115,7 @@ public class LiquidFiller extends Module { .build() ); - private final Setting.Group>> blacklist = sgWhitelist.add(new BlockListSetting.Builder() + private final Setting.Group>> 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) 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 989e558cb4..49aac8836c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java @@ -13,7 +13,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -197,14 +197,14 @@ public class Nuker extends Module { .build() ); - private final Setting.Group>> blacklist = sgWhitelist.add(new BlockListSetting.Builder() + private final Setting.Group>> 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.Group>> whitelist = sgWhitelist.add(new BlockListSetting.Builder() + private final Setting.Group>> whitelist = sgWhitelist.add(new BlockListSetting.Builder() .name("whitelist") .description("The blocks you want to mine.") .visible(() -> listMode.get() == ListMode.Whitelist) @@ -533,7 +533,7 @@ private void addTargetedBlockToList() { BlockPos pos = ((BlockHitResult) hitResult).getBlockPos(); Block targetBlock = mc.world.getBlockState(pos).getBlock(); - GroupedList.Group> list = listMode.get() == ListMode.Whitelist ? whitelist.get() : blacklist.get(); + GroupSet.Group> list = listMode.get() == ListMode.Whitelist ? whitelist.get() : blacklist.get(); String modeName = listMode.get().name(); if (list.contains(targetBlock)) { 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 4036c274ed..78cd693bd6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/SpawnProofer.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.misc.Pool; @@ -73,7 +73,7 @@ public class SpawnProofer extends Module { .build() ); - private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> blocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Block to use for spawn proofing.") .defaultValue(Blocks.TORCH, Blocks.STONE_BUTTON, Blocks.STONE_SLAB) 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 e908ab5fa7..80a5dd3258 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java @@ -10,7 +10,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.settings.groups.GroupedList; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; @@ -21,7 +21,6 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; import net.minecraft.item.Item; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; @@ -53,7 +52,7 @@ public class VeinMiner extends Module { // General - private final Setting.Group>> selectedBlocks = sgGeneral.add(new BlockListSetting.Builder() + private final Setting.Group>> selectedBlocks = sgGeneral.add(new BlockListSetting.Builder() .name("blocks") .description("Which blocks to select.") .defaultGroups(BlockListSetting.TERRAIN) From 08a1abdac40999dde5e1b76be486281d1e2835cc Mon Sep 17 00:00:00 2001 From: chri-k Date: Wed, 8 Oct 2025 10:37:57 +0300 Subject: [PATCH 04/15] clean debug statements --- .../gui/screens/settings/base/GroupedListSettingScreen.java | 2 -- .../meteorclient/settings/groups/GroupSet.java | 5 ++--- .../meteorclient/settings/groups/SetGroup.java | 4 ---- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java index d48b97b2c1..5388307128 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java @@ -44,8 +44,6 @@ public GroupedListSettingScreen(GuiTheme theme, String title, S setting, Grouped this.registry = registry; this.setting = setting; this.groups = groups; - - MeteorClient.LOG.info("GroupedListSettingScreen@ BlockListSetting.ORES contains {} items", BlockListSetting.ORES.getImmediate().size()); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupSet.java b/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupSet.java index 7edec847ab..a41b8692a8 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupSet.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupSet.java @@ -98,9 +98,8 @@ public Set get() { if (isValid()) return cached; if (enumeration != null) version = enumeration.getVersion(); - else if (cached != null && !cached.isEmpty()) MeteorClient.LOG.warn("Rebuild of GroupSet with tracker == null"); - - MeteorClient.LOG.info("Rebuild {} direct, {} groups.", immediate.size(), include.size()); + // debug statement + else if (cached != null && !cached.isEmpty()) MeteorClient.LOG.warn("Rebuild of temporary GroupSet"); Set set = new ReferenceOpenHashSet<>(immediate); List> seen = new ArrayList<>(); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/groups/SetGroup.java b/src/main/java/meteordevelopment/meteorclient/settings/groups/SetGroup.java index cd0af51263..66dee75e7d 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/groups/SetGroup.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/groups/SetGroup.java @@ -67,12 +67,10 @@ public List getGroups() { public boolean add(T t) { if (!immediate.contains(t)) { - MeteorClient.LOG.info("SetGroup.add@ had {}", immediate.size()); immediate.add(t); enumeration.invalidate(); return true; } - MeteorClient.LOG.info("SetGroup.add@ duplicate item"); return false; } @@ -104,12 +102,10 @@ public boolean remove(T t) { public boolean addAll(@NotNull Collection collection) { boolean modified = false; for (T t : collection) { - MeteorClient.LOG.info("SetGroup.addAll@ had {}", immediate.size()); if (!immediate.contains(t)) { immediate.add(t); modified = true; } - MeteorClient.LOG.info("SetGroup.addAll@ has {}", immediate.size()); } if (modified) enumeration.invalidate(); return modified; From 8c7a210126bcef2ecd88fecf1d4df8b3a1bc6fda Mon Sep 17 00:00:00 2001 From: chri-k Date: Wed, 8 Oct 2025 10:40:33 +0300 Subject: [PATCH 05/15] more cleanup --- .../meteorclient/gui/DefaultSettingsWidgetFactory.java | 4 ++-- ...ckListSettingScreen.java => BlockSetSettingScreen.java} | 7 +++---- ...temListSettingScreen.java => ItemSetSettingScreen.java} | 6 +++--- ...ListSettingScreen.java => GroupedSetSettingScreen.java} | 5 ++--- .../meteorclient/settings/BlockListSetting.java | 4 +++- .../meteorclient/settings/ItemListSetting.java | 4 +++- .../meteorclient/settings/groups/GroupSet.java | 1 - .../meteorclient/settings/groups/SetGroup.java | 6 ++++-- .../systems/modules/render/blockesp/ESPChunk.java | 1 - 9 files changed, 20 insertions(+), 18 deletions(-) rename src/main/java/meteordevelopment/meteorclient/gui/screens/settings/{BlockListSettingScreen.java => BlockSetSettingScreen.java} (86%) rename src/main/java/meteordevelopment/meteorclient/gui/screens/settings/{ItemListSettingScreen.java => ItemSetSettingScreen.java} (87%) rename src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/{GroupedListSettingScreen.java => GroupedSetSettingScreen.java} (96%) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java index 54898c2217..b5a45bd2f8 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java @@ -273,7 +273,7 @@ private void blockPosW(WTable table, BlockPosSetting setting) { } private void blockListW(WTable table, BlockListSetting setting) { - selectW(table, setting, () -> mc.setScreen(new BlockListSettingScreen(theme, setting))); + selectW(table, setting, () -> mc.setScreen(new BlockSetSettingScreen(theme, setting))); } private void itemW(WTable table, ItemSetting setting) { @@ -293,7 +293,7 @@ private void itemW(WTable table, ItemSetting setting) { } private void itemListW(WTable table, ItemListSetting setting) { - selectW(table, setting, () -> mc.setScreen(new ItemListSettingScreen(theme, setting))); + selectW(table, setting, () -> mc.setScreen(new ItemSetSettingScreen(theme, setting))); } private void entityTypeListW(WTable table, EntityTypeListSetting setting) { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockSetSettingScreen.java similarity index 86% rename from src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java rename to src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockSetSettingScreen.java index 445623c15f..bccf295b9e 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockSetSettingScreen.java @@ -6,8 +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.screens.settings.base.GroupedListSettingScreen; +import meteordevelopment.meteorclient.gui.screens.settings.base.GroupedSetSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.BlockListSetting; import meteordevelopment.meteorclient.utils.misc.Names; @@ -18,8 +17,8 @@ import java.util.function.Predicate; -public class BlockListSettingScreen extends GroupedListSettingScreen { - public BlockListSettingScreen(GuiTheme theme, BlockListSetting setting) { +public class BlockSetSettingScreen extends GroupedSetSettingScreen { + public BlockSetSettingScreen(GuiTheme theme, BlockListSetting setting) { super(theme, "Select Blocks", setting, BlockListSetting.GROUPS, Registries.BLOCK); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemSetSettingScreen.java similarity index 87% rename from src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java rename to src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemSetSettingScreen.java index b7d715ffa4..9df430a4e3 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemSetSettingScreen.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.gui.screens.settings; import meteordevelopment.meteorclient.gui.GuiTheme; -import meteordevelopment.meteorclient.gui.screens.settings.base.GroupedListSettingScreen; +import meteordevelopment.meteorclient.gui.screens.settings.base.GroupedSetSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.ItemListSetting; import meteordevelopment.meteorclient.utils.misc.Names; @@ -16,8 +16,8 @@ import java.util.function.Predicate; -public class ItemListSettingScreen extends GroupedListSettingScreen { - public ItemListSettingScreen(GuiTheme theme, ItemListSetting setting) { +public class ItemSetSettingScreen extends GroupedSetSettingScreen { + public ItemSetSettingScreen(GuiTheme theme, ItemListSetting setting) { super(theme, "Select Items", setting, ItemListSetting.GROUPS, Registries.ITEM); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedSetSettingScreen.java similarity index 96% rename from src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java rename to src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedSetSettingScreen.java index 5388307128..85a4527082 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedSetSettingScreen.java @@ -17,7 +17,6 @@ import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; import meteordevelopment.meteorclient.gui.widgets.pressable.WPressable; -import meteordevelopment.meteorclient.settings.BlockListSetting; import meteordevelopment.meteorclient.settings.GroupedSetSetting; import meteordevelopment.meteorclient.settings.Settings; import meteordevelopment.meteorclient.utils.render.color.Color; @@ -28,7 +27,7 @@ import java.util.function.Function; import java.util.function.Predicate; -public abstract class GroupedListSettingScreen> extends WindowScreen { +public abstract class GroupedSetSettingScreen> extends WindowScreen { protected final S setting; private final Iterable registry; private final GroupedSetSetting.Groups groups; @@ -38,7 +37,7 @@ public abstract class GroupedListSettingScreen private GroupedSetSetting.Groups.Group expanded; - public GroupedListSettingScreen(GuiTheme theme, String title, S setting, GroupedSetSetting.Groups groups, Iterable registry) { + public GroupedSetSettingScreen(GuiTheme theme, String title, S setting, GroupedSetSetting.Groups groups, Iterable registry) { super(theme, title); this.registry = registry; diff --git a/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java index 1d49cc699c..db04eac44c 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java @@ -15,7 +15,9 @@ import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; -import java.util.*; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; import java.util.function.Consumer; import java.util.function.Predicate; diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java index 90552c91f5..984c63845e 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java @@ -14,7 +14,9 @@ import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; -import java.util.*; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; import java.util.function.Consumer; import java.util.function.Predicate; diff --git a/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupSet.java b/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupSet.java index a41b8692a8..e3210c39e3 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupSet.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupSet.java @@ -10,7 +10,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Unmodifiable; -import javax.print.attribute.UnmodifiableSetException; import java.util.*; import java.util.function.Predicate; diff --git a/src/main/java/meteordevelopment/meteorclient/settings/groups/SetGroup.java b/src/main/java/meteordevelopment/meteorclient/settings/groups/SetGroup.java index 66dee75e7d..27084fcff5 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/groups/SetGroup.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/groups/SetGroup.java @@ -6,11 +6,13 @@ package meteordevelopment.meteorclient.settings.groups; import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; -import meteordevelopment.meteorclient.MeteorClient; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Unmodifiable; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Set; import java.util.function.Predicate; public abstract class SetGroup> { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPChunk.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPChunk.java index 7449b9f7a2..f116134dc7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPChunk.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/blockesp/ESPChunk.java @@ -16,7 +16,6 @@ import net.minecraft.world.chunk.Chunk; import java.util.Collection; -import java.util.List; import static meteordevelopment.meteorclient.MeteorClient.mc; import static meteordevelopment.meteorclient.utils.Utils.getRenderDistance; From a220937d387386cdb8e24f0cba6d66635b283daa Mon Sep 17 00:00:00 2001 From: chri-k Date: Wed, 8 Oct 2025 10:47:39 +0300 Subject: [PATCH 06/15] add TODO lines --- .../meteorclient/commands/commands/SwarmCommand.java | 2 ++ .../meteorclient/pathing/BaritoneSettings.java | 3 +++ .../meteorclient/settings/ItemListSetting.java | 1 + 3 files changed, 6 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java index 164e095fb6..06568124a1 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java @@ -213,6 +213,7 @@ else if (swarm.isWorker()) { swarm.host.sendMessage(context.getInput()); } else if (swarm.isWorker()) { + // TODO: resolve Modules.get().get(InfinityMiner.class).targetBlocks.set(new GroupSet<>(List.of(context.getArgument("target", BlockStateArgument.class).getBlockState().getBlock()))); runInfinityMiner(); } @@ -229,6 +230,7 @@ else if (swarm.isWorker()) { swarm.host.sendMessage(context.getInput()); } else if (swarm.isWorker()) { + // TODO: resolve Modules.get().get(InfinityMiner.class).targetBlocks.set(new GroupSet<>(List.of(context.getArgument("target", BlockStateArgument.class).getBlockState().getBlock()))); Modules.get().get(InfinityMiner.class).repairBlocks.set(new GroupSet<>(List.of(context.getArgument("repair", BlockStateArgument.class).getBlockState().getBlock()))); runInfinityMiner(); diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java index 7f26beb6f0..a029b84558 100644 --- a/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java +++ b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java @@ -180,6 +180,9 @@ else if (value instanceof Color) { .build() ); } + + // TODO: resolve + // else if (value instanceof List) { // Type listType = ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0]; // Type type = ((ParameterizedType) listType).getActualTypeArguments()[0]; diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java index 984c63845e..9e9934f475 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java @@ -24,6 +24,7 @@ public class ItemListSetting extends GroupedSetSetting { public static final Groups GROUPS = new Groups<>(); + // TODO: resolve this (used in AutoSmelter) private final boolean bypassFilterWhenSavingAndLoading; public ItemListSetting(String name, String description, GroupSet.Group> defaultValue, Consumer.Group>> onChanged, Consumer.Group>>> onModuleActivated, IVisible visible, Predicate filter, boolean bypassFilterWhenSavingAndLoading) { From 42bacd74ea41e03893b1c93889a60c70a6c7b0d4 Mon Sep 17 00:00:00 2001 From: chri-k Date: Wed, 8 Oct 2025 12:23:05 +0300 Subject: [PATCH 07/15] (partially) make entities a GroupSet too --- .../{EntityTypeListSetting.java => EntityTypeSetSetting.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/meteordevelopment/meteorclient/settings/{EntityTypeListSetting.java => EntityTypeSetSetting.java} (100%) diff --git a/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeSetSetting.java similarity index 100% rename from src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java rename to src/main/java/meteordevelopment/meteorclient/settings/EntityTypeSetSetting.java From 9df36f82cdb9c244ac016b1e180c056166e05b6b Mon Sep 17 00:00:00 2001 From: chri-k Date: Wed, 8 Oct 2025 12:23:22 +0300 Subject: [PATCH 08/15] (partially) make entities a GroupSet too --- .../gui/DefaultSettingsWidgetFactory.java | 4 +- .../settings/EntityTypeListSettingScreen.java | 6 +- .../settings/BlockListSetting.java | 5 +- .../settings/EntityTypeSetSetting.java | 129 ++++++------------ .../settings/GroupedSetSetting.java | 53 ++++++- .../settings/ItemListSetting.java | 7 +- .../systems/modules/combat/AutoLog.java | 2 +- .../systems/modules/combat/BowAimbot.java | 2 +- .../systems/modules/combat/CrystalAura.java | 2 +- .../systems/modules/combat/Hitboxes.java | 2 +- .../systems/modules/combat/KillAura.java | 2 +- .../systems/modules/misc/Notifier.java | 2 +- .../systems/modules/player/NoInteract.java | 4 +- .../systems/modules/player/NoMiningTrace.java | 4 +- .../systems/modules/render/Chams.java | 2 +- .../systems/modules/render/ESP.java | 2 +- .../systems/modules/render/Nametags.java | 2 +- .../systems/modules/render/NoRender.java | 2 +- .../systems/modules/render/Tracers.java | 2 +- .../systems/modules/world/AutoBreed.java | 2 +- .../systems/modules/world/AutoMount.java | 4 +- .../systems/modules/world/AutoNametag.java | 2 +- .../systems/modules/world/Flamethrower.java | 2 +- 23 files changed, 126 insertions(+), 118 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java index b5a45bd2f8..a02dfa23bd 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java @@ -54,7 +54,7 @@ public DefaultSettingsWidgetFactory(GuiTheme theme) { factories.put(BlockListSetting.class, (table, setting) -> blockListW(table, (BlockListSetting) setting)); factories.put(ItemSetting.class, (table, setting) -> itemW(table, (ItemSetting) setting)); factories.put(ItemListSetting.class, (table, setting) -> itemListW(table, (ItemListSetting) setting)); - factories.put(EntityTypeListSetting.class, (table, setting) -> entityTypeListW(table, (EntityTypeListSetting) setting)); + factories.put(EntityTypeSetSetting.class, (table, setting) -> entityTypeListW(table, (EntityTypeSetSetting) setting)); factories.put(EnchantmentListSetting.class, (table, setting) -> enchantmentListW(table, (EnchantmentListSetting) setting)); factories.put(ModuleListSetting.class, (table, setting) -> moduleListW(table, (ModuleListSetting) setting)); factories.put(PacketListSetting.class, (table, setting) -> packetListW(table, (PacketListSetting) setting)); @@ -296,7 +296,7 @@ private void itemListW(WTable table, ItemListSetting setting) { selectW(table, setting, () -> mc.setScreen(new ItemSetSettingScreen(theme, setting))); } - private void entityTypeListW(WTable table, EntityTypeListSetting setting) { + private void entityTypeListW(WTable table, EntityTypeSetSetting setting) { selectW(table, setting, () -> mc.setScreen(new EntityTypeListSettingScreen(theme, setting))); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeListSettingScreen.java index c6399c7975..0433d992cf 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeListSettingScreen.java @@ -14,7 +14,7 @@ import meteordevelopment.meteorclient.gui.widgets.containers.WVerticalList; import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; import meteordevelopment.meteorclient.gui.widgets.pressable.WCheckbox; -import meteordevelopment.meteorclient.settings.EntityTypeListSetting; +import meteordevelopment.meteorclient.settings.EntityTypeSetSetting; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.Names; import net.minecraft.entity.EntityType; @@ -27,7 +27,7 @@ import java.util.function.Consumer; public class EntityTypeListSettingScreen extends WindowScreen { - private final EntityTypeListSetting setting; + private final EntityTypeSetSetting setting; private WVerticalList list; private final WTextBox filter; @@ -38,7 +38,7 @@ public class EntityTypeListSettingScreen extends WindowScreen { private WTable animalsT, waterAnimalsT, monstersT, ambientT, miscT; int hasAnimal = 0, hasWaterAnimal = 0, hasMonster = 0, hasAmbient = 0, hasMisc = 0; - public EntityTypeListSettingScreen(GuiTheme theme, EntityTypeListSetting setting) { + public EntityTypeListSettingScreen(GuiTheme theme, EntityTypeSetSetting setting) { super(theme, "Select entities"); this.setting = setting; diff --git a/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java index db04eac44c..6d6fe207a2 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java @@ -13,6 +13,7 @@ import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtString; import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; import net.minecraft.util.Identifier; import java.util.Arrays; @@ -54,8 +55,8 @@ protected Groups groups() { } @Override - public Iterable getIdentifierSuggestions() { - return Registries.BLOCK.getIds(); + protected Registry suggestRegistry() { + return Registries.BLOCK; } public static class Builder extends SettingBuilder.Group>, BlockListSetting> { diff --git a/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeSetSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeSetSetting.java index b716b4c219..abca8b4747 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeSetSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeSetSetting.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.settings; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.utils.entity.EntityUtils; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; @@ -17,121 +18,56 @@ import net.minecraft.util.Identifier; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; -public class EntityTypeListSetting extends Setting>> { - public final Predicate> filter; - private List suggestions; - private final static List groups = List.of("animal", "wateranimal", "monster", "ambient", "misc"); +public class EntityTypeSetSetting extends GroupedSetSetting> { - public EntityTypeListSetting(String name, String description, Set> defaultValue, Consumer>> onChanged, Consumer>>> onModuleActivated, IVisible visible, Predicate> filter) { - super(name, description, defaultValue, onChanged, onModuleActivated, visible); + public static Groups> GROUPS = new Groups<>(); - this.filter = filter; + public EntityTypeSetSetting(String name, String description, GroupSet, Groups>.Group> defaultValue, Predicate> filter, Consumer, Groups>.Group>> onChanged, Consumer, Groups>.Group>>> onModuleActivated, IVisible visible) { + super(name, description, defaultValue, filter, onChanged, onModuleActivated, visible); } @Override - public void resetImpl() { - value = new ObjectOpenHashSet<>(defaultValue); + public EntityType parseItem(String str) { + return parseId(Registries.ENTITY_TYPE, str); } @Override - protected Set> parseImpl(String str) { - String[] values = str.split(","); - Set> entities = new ObjectOpenHashSet<>(values.length); - - try { - for (String value : values) { - EntityType entity = parseId(Registries.ENTITY_TYPE, value); - if (entity != null) entities.add(entity); - else { - String lowerValue = value.trim().toLowerCase(); - if (!groups.contains(lowerValue)) continue; - - for (EntityType entityType : Registries.ENTITY_TYPE) { - if (filter != null && !filter.test(entityType)) continue; - - switch (lowerValue) { - case "animal" -> { - if (entityType.getSpawnGroup() == SpawnGroup.CREATURE) entities.add(entityType); - } - case "wateranimal" -> { - if (entityType.getSpawnGroup() == SpawnGroup.WATER_AMBIENT - || entityType.getSpawnGroup() == SpawnGroup.WATER_CREATURE - || entityType.getSpawnGroup() == SpawnGroup.UNDERGROUND_WATER_CREATURE - || entityType.getSpawnGroup() == SpawnGroup.AXOLOTLS) entities.add(entityType); - } - case "monster" -> { - if (entityType.getSpawnGroup() == SpawnGroup.MONSTER) entities.add(entityType); - } - case "ambient" -> { - if (entityType.getSpawnGroup() == SpawnGroup.AMBIENT) entities.add(entityType); - } - case "misc" -> { - if (entityType.getSpawnGroup() == SpawnGroup.MISC) entities.add(entityType); - } - } - } - } - } - } catch (Exception ignored) {} - - return entities; + public NbtElement itemToNbt(EntityType entityType) { + return NbtString.of(Registries.ENTITY_TYPE.getId(entityType).toString()); } @Override - protected boolean isValueValid(Set> value) { - return true; + public EntityType itemFromNbt(NbtElement e) { + return Registries.ENTITY_TYPE.get(Identifier.of(e.asString().orElse(""))); } @Override - public List getSuggestions() { - if (suggestions == null) { - suggestions = new ArrayList<>(groups); - for (EntityType entityType : Registries.ENTITY_TYPE) { - if (filter == null || filter.test(entityType)) suggestions.add(Registries.ENTITY_TYPE.getId(entityType).toString()); - } - } - - return suggestions; - } - - @Override - public NbtCompound save(NbtCompound tag) { - NbtList valueTag = new NbtList(); - for (EntityType entityType : get()) { - valueTag.add(NbtString.of(Registries.ENTITY_TYPE.getId(entityType).toString())); - } - tag.put("value", valueTag); - - return tag; + protected Groups> groups() { + return GROUPS; } @Override - public Set> load(NbtCompound tag) { - get().clear(); - - NbtList valueTag = tag.getListOrEmpty("value"); - for (NbtElement tagI : valueTag) { - EntityType type = Registries.ENTITY_TYPE.get(Identifier.of(tagI.asString().orElse(""))); - if (filter == null || filter.test(type)) get().add(type); + public void buildSuggestions(List to) { + for (EntityType entityType : Registries.ENTITY_TYPE) { + if (filter == null || filter.test(entityType)) to.add(Registries.ENTITY_TYPE.getId(entityType).toString()); } - - return get(); } - public static class Builder extends SettingBuilder>, EntityTypeListSetting> { + public static class Builder extends SettingBuilder, Groups>.Group>, EntityTypeSetSetting> { private Predicate> filter; public Builder() { - super(new ObjectOpenHashSet<>(0)); + super(new GroupSet<>()); } public Builder defaultValue(EntityType... defaults) { - return defaultValue(defaults != null ? new ObjectOpenHashSet<>(defaults) : new ObjectOpenHashSet<>(0)); + return defaultValue(defaults != null ? new GroupSet<>(Arrays.asList(defaults)) : new GroupSet<>()); } public Builder onlyAttackable() { @@ -145,8 +81,29 @@ public Builder filter(Predicate> filter){ } @Override - public EntityTypeListSetting build() { - return new EntityTypeListSetting(name, description, defaultValue, onChanged, onModuleActivated, visible, filter); + public EntityTypeSetSetting build() { + return new EntityTypeSetSetting(name, description, defaultValue, filter, onChanged, onModuleActivated, visible); + } + } + + static Groups>.Group ANIMAL, WATER_ANIMAL, MONSTER, AMBIENT, MISC; + + static { + ANIMAL = GROUPS.dynamic("animals").get(); + WATER_ANIMAL = GROUPS.dynamic("water-animals").get(); + MONSTER = GROUPS.dynamic("monsters").get(); + AMBIENT = GROUPS.dynamic("ambient").get(); + MISC = GROUPS.dynamic("misc").get(); + + for (EntityType entityType : Registries.ENTITY_TYPE) { + if (entityType.getSpawnGroup() == SpawnGroup.CREATURE) ANIMAL.add(entityType); + if (entityType.getSpawnGroup() == SpawnGroup.MONSTER) MONSTER.add(entityType); + if (entityType.getSpawnGroup() == SpawnGroup.AMBIENT) AMBIENT.add(entityType); + if (entityType.getSpawnGroup() == SpawnGroup.MISC) MISC.add(entityType); + if (entityType.getSpawnGroup() == SpawnGroup.WATER_AMBIENT + || entityType.getSpawnGroup() == SpawnGroup.WATER_CREATURE + || entityType.getSpawnGroup() == SpawnGroup.UNDERGROUND_WATER_CREATURE + || entityType.getSpawnGroup() == SpawnGroup.AXOLOTLS) WATER_ANIMAL.add(entityType); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/GroupedSetSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/GroupedSetSetting.java index 6afd569f7b..83b0f4db14 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/GroupedSetSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/GroupedSetSetting.java @@ -16,6 +16,7 @@ import net.minecraft.nbt.NbtList; import net.minecraft.nbt.NbtString; import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; import net.minecraft.util.Identifier; import java.util.*; @@ -28,6 +29,8 @@ public abstract class GroupedSetSetting extends Setting filter; + private List suggestions; + public GroupedSetSetting(String name, String description, GroupSet.Group> defaultValue, Predicate filter, Consumer.Group>> onChanged, Consumer.Group>>> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); this.filter = filter; @@ -39,6 +42,16 @@ public GroupedSetSetting(String name, String description, GroupSet. abstract public T itemFromNbt(NbtElement e); abstract protected Groups groups(); + long version = -1; + + protected void buildSuggestions(List to) + { + Registry registry = suggestRegistry(); + for (Identifier id : registry.getIds()) { + if (filter == null || filter.test(registry.get(id))) to.add(id.toString()); + } + } + protected Registry suggestRegistry() { return null; } @Override public GroupSet.Group> get() { @@ -135,8 +148,29 @@ final protected GroupSet.Group> load(NbtCompound tag) { return value; } - static final public class Groups extends SetGroupEnumeration { + public void invalidateSuggestions() { + suggestions = null; + } + + @Override + final public Iterable getIdentifierSuggestions() { + return null; + } + + @Override + final public List getSuggestions() { + if (suggestions == null || groups().getVersion() != version) { + version = groups().getVersion(); + + suggestions = new ArrayList<>(groups().GROUPS.size()); + groups().GROUPS.forEach((_1, v)-> suggestions.add("@" + v.internalName)); + buildSuggestions(suggestions); + } + return suggestions; + } + + static final public class Groups extends SetGroupEnumeration { Map GROUPS = new HashMap<>(); public Groups.Group get(String name) { @@ -166,6 +200,12 @@ private GroupBuilder builtin() { return this; } + private GroupBuilder dynamic() { + g.builtin = true; + g.dynamic = true; + return this; + } + @SafeVarargs public final GroupBuilder items(T... of) { g.addAll(Arrays.asList(of)); @@ -204,6 +244,14 @@ protected GroupBuilder builtin(String name, Item icon) { return new GroupBuilder(name, icon).builtin(); } + protected GroupBuilder dynamic(String name) { + return new GroupBuilder(name).dynamic(); + } + + protected GroupBuilder dynamic(String name, Item icon) { + return new GroupBuilder(name, icon).builtin(); + } + public GroupBuilder builder(String name) { return new GroupBuilder(name); } @@ -217,7 +265,8 @@ public Group fromTag(NbtCompound tag, Function itemFromNbt) { } public class Group extends SetGroup { - public boolean builtin; + public boolean builtin; // will not be saved to config + public boolean dynamic; // cannot be modified through config public Settings settings = new Settings(); public SettingGroup sg = settings.getDefaultGroup(); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java index 9e9934f475..7707593850 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java @@ -12,6 +12,7 @@ import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtString; import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; import net.minecraft.util.Identifier; import java.util.Arrays; @@ -56,11 +57,11 @@ protected Groups groups() { } @Override - public Iterable getIdentifierSuggestions() { - return Registries.ITEM.getIds(); + protected Registry suggestRegistry() { + return Registries.ITEM; } - public static class Builder extends SettingBuilder.Group>, ItemListSetting> { + public static class Builder extends SettingBuilder.Group>, ItemListSetting> { private Predicate filter = null; private boolean bypass = 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 a7245f206e..de7dd65488 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoLog.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoLog.java @@ -98,7 +98,7 @@ public class AutoLog extends Module { // Entities - private final Setting>> entities = sgEntities.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgEntities.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Disconnects when a specified entity is present within a specified range.") .defaultValue(EntityType.END_CRYSTAL) 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 26c5104288..df6eac50cb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java @@ -42,7 +42,7 @@ public class BowAimbot extends Module { .build() ); - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Entities to attack.") .onlyAttackable() 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 5a071de88b..613d6aaaf4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java @@ -148,7 +148,7 @@ public class CrystalAura extends Module { .build() ); - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Entities to attack.") .onlyAttackable() 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 e93622a24c..38ea76eab1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Hitboxes.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Hitboxes.java @@ -22,7 +22,7 @@ public class Hitboxes extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgWeapon = settings.createGroup("Weapon Options"); - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Which entities to target.") .defaultValue(EntityType.PLAYER) 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 82a9de0644..42b93844d0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java @@ -116,7 +116,7 @@ public class KillAura extends Module { // Targeting - private final Setting>> entities = sgTargeting.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgTargeting.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Entities to attack.") .onlyAttackable() 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 70f4156986..bc8796b8c6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java @@ -112,7 +112,7 @@ public class Notifier extends Module { .build() ); - private final Setting>> entities = sgVisualRange.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgVisualRange.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Which entities to notify about.") .defaultValue(EntityType.PLAYER) 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 1c11d246be..c8e221f640 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoInteract.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoInteract.java @@ -68,7 +68,7 @@ public class NoInteract extends Module { // Entities - private final Setting>> entityHit = sgEntities.add(new EntityTypeListSetting.Builder() + private final Setting>> entityHit = sgEntities.add(new EntityTypeSetSetting.Builder() .name("entity-hit") .description("Cancel entity hitting.") .onlyAttackable() @@ -82,7 +82,7 @@ public class NoInteract extends Module { .build() ); - private final Setting>> entityInteract = sgEntities.add(new EntityTypeListSetting.Builder() + private final Setting>> entityInteract = sgEntities.add(new EntityTypeSetSetting.Builder() .name("entity-interact") .description("Cancel entity interaction.") .onlyAttackable() 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..0badb8f0fd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoMiningTrace.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoMiningTrace.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.systems.modules.player; import meteordevelopment.meteorclient.settings.BoolSetting; -import meteordevelopment.meteorclient.settings.EntityTypeListSetting; +import meteordevelopment.meteorclient.settings.EntityTypeSetSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Categories; @@ -20,7 +20,7 @@ public class NoMiningTrace extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("blacklisted-entities") .description("Entities you will interact with as normal.") .defaultValue() 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 c6280df9cc..be34980f32 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Chams.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Chams.java @@ -26,7 +26,7 @@ public class Chams extends Module { // Through walls - public final Setting>> entities = sgThroughWalls.add(new EntityTypeListSetting.Builder() + public final Setting>> entities = sgThroughWalls.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Select entities to show through walls.") .onlyAttackable() 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 7556793c49..4068d73bc2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java @@ -114,7 +114,7 @@ public class ESP extends Module { .build() ); - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Select specific entities.") .defaultValue(EntityType.PLAYER) 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 7de7594abf..076c6a04ab 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java @@ -55,7 +55,7 @@ public class Nametags extends Module { // General - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Select entities to draw nametags on.") .defaultValue(EntityType.PLAYER, EntityType.ITEM) 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 ec33aa216b..9ad85fbe09 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java @@ -332,7 +332,7 @@ public class NoRender extends Module { // Entity - private final Setting>> entities = sgEntity.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgEntity.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Disables rendering of selected entities.") .build() 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 30c98d8757..7e64b70396 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java @@ -45,7 +45,7 @@ public enum TracerStyle { // General - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Select specific entities.") .defaultValue(EntityType.PLAYER) 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 1aab0f9a7c..8ee88c7c37 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java @@ -24,7 +24,7 @@ public class AutoBreed extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Entities to breed.") .defaultValue(EntityType.HORSE, EntityType.DONKEY, EntityType.COW, 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 4198ec67f0..b3248e65ce 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoMount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoMount.java @@ -9,7 +9,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.BoolSetting; -import meteordevelopment.meteorclient.settings.EntityTypeListSetting; +import meteordevelopment.meteorclient.settings.EntityTypeSetSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Categories; @@ -44,7 +44,7 @@ public class AutoMount extends Module { .build() ); - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Rideable entities.") .filter(EntityUtils::isRideable) 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 3444077d42..4693a952d1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java @@ -29,7 +29,7 @@ public class AutoNametag extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Which entities to nametag.") .build() 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 e8603f326b..80f642378b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java @@ -73,7 +73,7 @@ public class Flamethrower extends Module { .build() ); - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Entities to cook.") .defaultValue( From b55f6c6c33761950f43daf7d97f7b3dc6af0ce59 Mon Sep 17 00:00:00 2001 From: chri-k Date: Wed, 8 Oct 2025 12:43:49 +0300 Subject: [PATCH 09/15] more cleanup --- .../meteorclient/gui/DefaultSettingsWidgetFactory.java | 4 ++-- .../gui/screens/settings/ItemSetSettingScreen.java | 8 ++++---- .../meteorclient/pathing/BaritoneSettings.java | 2 +- .../meteorclient/settings/EntityTypeSetSetting.java | 6 ------ .../{ItemListSetting.java => ItemSetSetting.java} | 10 +++++----- .../systems/modules/misc/InventoryTweaks.java | 8 ++++---- .../meteorclient/systems/modules/player/AutoEat.java | 2 +- .../meteorclient/systems/modules/player/AutoMend.java | 2 +- .../systems/modules/player/AutoReplenish.java | 2 +- .../meteorclient/systems/modules/player/AutoTool.java | 4 ++-- .../meteorclient/systems/modules/player/FastUse.java | 2 +- .../systems/modules/render/ItemHighlight.java | 2 +- .../systems/modules/render/Trajectories.java | 2 +- .../systems/modules/world/AutoSmelter.java | 4 ++-- .../systems/modules/world/HighwayBuilder.java | 2 +- .../systems/modules/world/InfinityMiner.java | 2 +- 16 files changed, 28 insertions(+), 34 deletions(-) rename src/main/java/meteordevelopment/meteorclient/settings/{ItemListSetting.java => ItemSetSetting.java} (90%) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java index a02dfa23bd..8cf91235a5 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java @@ -53,7 +53,7 @@ public DefaultSettingsWidgetFactory(GuiTheme theme) { factories.put(BlockSetting.class, (table, setting) -> blockW(table, (BlockSetting) setting)); factories.put(BlockListSetting.class, (table, setting) -> blockListW(table, (BlockListSetting) setting)); factories.put(ItemSetting.class, (table, setting) -> itemW(table, (ItemSetting) setting)); - factories.put(ItemListSetting.class, (table, setting) -> itemListW(table, (ItemListSetting) setting)); + factories.put(ItemSetSetting.class, (table, setting) -> itemListW(table, (ItemSetSetting) setting)); factories.put(EntityTypeSetSetting.class, (table, setting) -> entityTypeListW(table, (EntityTypeSetSetting) setting)); factories.put(EnchantmentListSetting.class, (table, setting) -> enchantmentListW(table, (EnchantmentListSetting) setting)); factories.put(ModuleListSetting.class, (table, setting) -> moduleListW(table, (ModuleListSetting) setting)); @@ -292,7 +292,7 @@ private void itemW(WTable table, ItemSetting setting) { reset(table, setting, () -> item.set(setting.get().getDefaultStack())); } - private void itemListW(WTable table, ItemListSetting setting) { + private void itemListW(WTable table, ItemSetSetting setting) { selectW(table, setting, () -> mc.setScreen(new ItemSetSettingScreen(theme, setting))); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemSetSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemSetSettingScreen.java index 9df430a4e3..72212d4b06 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemSetSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemSetSettingScreen.java @@ -8,7 +8,7 @@ import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.screens.settings.base.GroupedSetSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; -import meteordevelopment.meteorclient.settings.ItemListSetting; +import meteordevelopment.meteorclient.settings.ItemSetSetting; import meteordevelopment.meteorclient.utils.misc.Names; import net.minecraft.item.Item; import net.minecraft.item.Items; @@ -16,9 +16,9 @@ import java.util.function.Predicate; -public class ItemSetSettingScreen extends GroupedSetSettingScreen { - public ItemSetSettingScreen(GuiTheme theme, ItemListSetting setting) { - super(theme, "Select Items", setting, ItemListSetting.GROUPS, Registries.ITEM); +public class ItemSetSettingScreen extends GroupedSetSettingScreen { + public ItemSetSettingScreen(GuiTheme theme, ItemSetSetting setting) { + super(theme, "Select Items", setting, ItemSetSetting.GROUPS, Registries.ITEM); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java index a029b84558..63c62d4d62 100644 --- a/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java +++ b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java @@ -198,7 +198,7 @@ else if (value instanceof Color) { // ); // } // else if (type == Item.class) { -// sgItemLists.add(new ItemListSetting.Builder() +// sgItemLists.add(new ItemSetSetting.Builder() // .name(setting.getName()) // .description(getDescription(setting.getName())) // .defaultValue((List) setting.defaultValue) diff --git a/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeSetSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeSetSetting.java index abca8b4747..59ee673839 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeSetSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeSetSetting.java @@ -5,27 +5,21 @@ package meteordevelopment.meteorclient.settings; -import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.utils.entity.EntityUtils; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; -import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; import net.minecraft.nbt.NbtString; import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; public class EntityTypeSetSetting extends GroupedSetSetting> { - public static Groups> GROUPS = new Groups<>(); public EntityTypeSetSetting(String name, String description, GroupSet, Groups>.Group> defaultValue, Predicate> filter, Consumer, Groups>.Group>> onChanged, Consumer, Groups>.Group>>> onModuleActivated, IVisible visible) { diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ItemSetSetting.java similarity index 90% rename from src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java rename to src/main/java/meteordevelopment/meteorclient/settings/ItemSetSetting.java index 7707593850..a92016c510 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ItemListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ItemSetSetting.java @@ -21,14 +21,14 @@ import java.util.function.Consumer; import java.util.function.Predicate; -public class ItemListSetting extends GroupedSetSetting { +public class ItemSetSetting extends GroupedSetSetting { public static final Groups GROUPS = new Groups<>(); // TODO: resolve this (used in AutoSmelter) private final boolean bypassFilterWhenSavingAndLoading; - public ItemListSetting(String name, String description, GroupSet.Group> defaultValue, Consumer.Group>> onChanged, Consumer.Group>>> onModuleActivated, IVisible visible, Predicate filter, boolean bypassFilterWhenSavingAndLoading) { + public ItemSetSetting(String name, String description, GroupSet.Group> defaultValue, Consumer.Group>> onChanged, Consumer.Group>>> onModuleActivated, IVisible visible, Predicate filter, boolean bypassFilterWhenSavingAndLoading) { super(name, description, defaultValue, filter, onChanged, onModuleActivated, visible); this.bypassFilterWhenSavingAndLoading = bypassFilterWhenSavingAndLoading; @@ -61,7 +61,7 @@ protected Registry suggestRegistry() { return Registries.ITEM; } - public static class Builder extends SettingBuilder.Group>, ItemListSetting> { + public static class Builder extends SettingBuilder.Group>, ItemSetSetting> { private Predicate filter = null; private boolean bypass = false; @@ -103,8 +103,8 @@ public Builder filter(Predicate filter) { } @Override - public ItemListSetting build() { - return new ItemListSetting(name, description, defaultValue, onChanged, onModuleActivated, visible, filter, bypass); + public ItemSetSetting build() { + return new ItemSetSetting(name, description, defaultValue, onChanged, onModuleActivated, visible, filter, bypass); } } 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 30297153b7..0e15a843c2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java @@ -107,7 +107,7 @@ public class InventoryTweaks extends Module { // Anti drop - private final Setting.Group>> antiDropItems = sgAntiDrop.add(new ItemListSetting.Builder() + private final Setting.Group>> antiDropItems = sgAntiDrop.add(new ItemSetSetting.Builder() .name("anti-drop-items") .description("Items to prevent dropping. Doesn't work in creative inventory screen.") .build() @@ -128,7 +128,7 @@ public class InventoryTweaks extends Module { // Auto Drop - private final Setting.Group>> autoDropItems = sgAutoDrop.add(new ItemListSetting.Builder() + private final Setting.Group>> autoDropItems = sgAutoDrop.add(new ItemSetSetting.Builder() .name("auto-drop-items") .description("Items to drop.") .build() @@ -193,7 +193,7 @@ public class InventoryTweaks extends Module { .build() ); - private final Setting.Group>> dumpItems = sgStealDump.add(new ItemListSetting.Builder() + private final Setting.Group>> dumpItems = sgStealDump.add(new ItemSetSetting.Builder() .name("dump-items") .description("Items to dump.") .build() @@ -206,7 +206,7 @@ public class InventoryTweaks extends Module { .build() ); - private final Setting.Group>> stealItems = sgStealDump.add(new ItemListSetting.Builder() + private final Setting.Group>> stealItems = sgStealDump.add(new ItemSetSetting.Builder() .name("steal-items") .description("Items to steal.") .build() 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 655be57a5b..0ec6bb761a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoEat.java @@ -40,7 +40,7 @@ public class AutoEat extends Module { private final SettingGroup sgThreshold = settings.createGroup("Threshold"); // General - public final Setting.Group>> blacklist = sgGeneral.add(new ItemListSetting.Builder() + public final Setting.Group>> blacklist = sgGeneral.add(new ItemSetSetting.Builder() .name("blacklist") .description("Which items to not eat.") .defaultValue( 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 26ca33eedd..e3161ab1bf 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoMend.java @@ -21,7 +21,7 @@ public class AutoMend extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting.Group>> blacklist = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> blacklist = sgGeneral.add(new ItemSetSetting.Builder() .name("blacklist") .description("Item blacklist.") .filter(item -> item.getComponents().get(DataComponentTypes.DAMAGE) != null) 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 292908685a..055dd973bc 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoReplenish.java @@ -70,7 +70,7 @@ public class AutoReplenish extends Module { .build() ); - private final Setting.Group>> excludedItems = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> excludedItems = sgGeneral.add(new ItemSetSetting.Builder() .name("excluded-items") .description("Items that won't be replenished.") .build() 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 a23e05ee5d..98227ae4fe 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java @@ -98,7 +98,7 @@ public class AutoTool extends Module { .build() ); - private final Setting.Group>> whitelist = sgWhitelist.add(new ItemListSetting.Builder() + private final Setting.Group>> whitelist = sgWhitelist.add(new ItemSetSetting.Builder() .name("whitelist") .description("The tools you want to use.") .visible(() -> listMode.get() == ListMode.Whitelist) @@ -106,7 +106,7 @@ public class AutoTool extends Module { .build() ); - private final Setting.Group>> blacklist = sgWhitelist.add(new ItemListSetting.Builder() + private final Setting.Group>> blacklist = sgWhitelist.add(new ItemSetSetting.Builder() .name("blacklist") .description("The tools you don't want to use.") .visible(() -> listMode.get() == ListMode.Blacklist) 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 fd16c1ffde..df451e0a58 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FastUse.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/FastUse.java @@ -28,7 +28,7 @@ public enum Mode { .build() ); - private final Setting.Group>> items = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> items = sgGeneral.add(new ItemSetSetting.Builder() .name("items") .description("Which items should fast place work on in \"Some\" mode.") .visible(() -> mode.get() == Mode.Some) 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 6a6b855472..6c929c10fa 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemHighlight.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemHighlight.java @@ -16,7 +16,7 @@ public class ItemHighlight extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting.Group>> items = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> items = sgGeneral.add(new ItemSetSetting.Builder() .name("items") .description("Items to highlight.") .build() 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 61b3080e71..1bdd5df437 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Trajectories.java @@ -39,7 +39,7 @@ public class Trajectories extends Module { // General - private final Setting.Group>> items = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> items = sgGeneral.add(new ItemSetSetting.Builder() .name("items") .description("Items to display trajectories for.") .defaultValue(getDefaultItems()) 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 03f394cfeb..509869339d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java @@ -21,7 +21,7 @@ public class AutoSmelter extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting.Group>> fuelItems = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> fuelItems = sgGeneral.add(new ItemSetSetting.Builder() .name("fuel-items") .description("Items to use as fuel") .defaultValue(Items.COAL, Items.CHARCOAL) @@ -30,7 +30,7 @@ public class AutoSmelter extends Module { .build() ); - private final Setting.Group>> smeltableItems = sgGeneral.add(new ItemListSetting.Builder() + private final Setting.Group>> smeltableItems = sgGeneral.add(new ItemSetSetting.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) 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 b0270a5db4..9f9c783442 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java @@ -288,7 +288,7 @@ public enum BlockadeType { // Inventory - private final Setting.Group>> trashItems = sgInventory.add(new ItemListSetting.Builder() + private final Setting.Group>> trashItems = sgInventory.add(new ItemSetSetting.Builder() .name("trash-items") .description("Items that are considered trash and can be thrown out.") .defaultValue( 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 badab8bcb5..0ce29d8ed8 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java @@ -48,7 +48,7 @@ public class InfinityMiner extends Module { .build() ); - public final Setting.Group>> targetItems = sgGeneral.add(new ItemListSetting.Builder() + public final Setting.Group>> targetItems = sgGeneral.add(new ItemSetSetting.Builder() .name("target-items") .description("The target items to collect.") .defaultValue(Items.DIAMOND) From ee13cf42f3b8d2f89efe599547b3da66cb5beeed Mon Sep 17 00:00:00 2001 From: chri-k Date: Wed, 8 Oct 2025 13:28:03 +0300 Subject: [PATCH 10/15] make entities a GroupSet too --- .../gui/DefaultSettingsWidgetFactory.java | 2 +- .../settings/EntityTypeListSettingScreen.java | 282 ------------------ .../settings/EntityTypeSetSettingScreen.java | 38 +++ .../base/GroupedSetSettingScreen.java | 1 + .../systems/modules/combat/AutoLog.java | 5 +- .../systems/modules/combat/BowAimbot.java | 5 +- .../systems/modules/combat/CrystalAura.java | 4 +- .../systems/modules/combat/Hitboxes.java | 5 +- .../systems/modules/combat/KillAura.java | 4 +- .../systems/modules/misc/Notifier.java | 3 +- .../systems/modules/player/NoInteract.java | 6 +- .../systems/modules/player/NoMiningTrace.java | 10 +- .../systems/modules/render/Chams.java | 5 +- .../systems/modules/render/ESP.java | 5 +- .../systems/modules/render/Nametags.java | 3 +- .../systems/modules/render/NoRender.java | 3 +- .../systems/modules/render/Tracers.java | 4 +- .../systems/modules/world/AutoBreed.java | 4 +- .../systems/modules/world/AutoMount.java | 10 +- .../systems/modules/world/AutoNametag.java | 4 +- .../systems/modules/world/Flamethrower.java | 5 +- 21 files changed, 75 insertions(+), 333 deletions(-) delete mode 100644 src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeListSettingScreen.java create mode 100644 src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeSetSettingScreen.java diff --git a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java index 8cf91235a5..cffa75519f 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java @@ -297,7 +297,7 @@ private void itemListW(WTable table, ItemSetSetting setting) { } private void entityTypeListW(WTable table, EntityTypeSetSetting setting) { - selectW(table, setting, () -> mc.setScreen(new EntityTypeListSettingScreen(theme, setting))); + selectW(table, setting, () -> mc.setScreen(new EntityTypeSetSettingScreen(theme, setting))); } private void enchantmentListW(WTable table, EnchantmentListSetting setting) { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeListSettingScreen.java deleted file mode 100644 index 0433d992cf..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeListSettingScreen.java +++ /dev/null @@ -1,282 +0,0 @@ -/* - * 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; - -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.WSection; -import meteordevelopment.meteorclient.gui.widgets.containers.WTable; -import meteordevelopment.meteorclient.gui.widgets.containers.WVerticalList; -import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; -import meteordevelopment.meteorclient.gui.widgets.pressable.WCheckbox; -import meteordevelopment.meteorclient.settings.EntityTypeSetSetting; -import meteordevelopment.meteorclient.utils.Utils; -import meteordevelopment.meteorclient.utils.misc.Names; -import net.minecraft.entity.EntityType; -import net.minecraft.registry.Registries; -import net.minecraft.util.Pair; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.function.Consumer; - -public class EntityTypeListSettingScreen extends WindowScreen { - private final EntityTypeSetSetting setting; - - private WVerticalList list; - private final WTextBox filter; - - private String filterText = ""; - - private WSection animals, waterAnimals, monsters, ambient, misc; - private WTable animalsT, waterAnimalsT, monstersT, ambientT, miscT; - int hasAnimal = 0, hasWaterAnimal = 0, hasMonster = 0, hasAmbient = 0, hasMisc = 0; - - public EntityTypeListSettingScreen(GuiTheme theme, EntityTypeSetSetting setting) { - super(theme, "Select entities"); - this.setting = setting; - - // Filter - filter = super.add(theme.textBox("")).minWidth(400).expandX().widget(); - filter.setFocused(true); - filter.action = () -> { - filterText = filter.get().trim(); - - list.clear(); - initWidgets(); - }; - - list = super.add(theme.verticalList()).expandX().widget(); - - } - - @Override - public Cell add(W widget) { - return list.add(widget); - } - - @Override - public void initWidgets() { - hasAnimal = hasWaterAnimal = hasMonster = hasAmbient = hasMisc = 0; - - for (EntityType entityType : setting.get()) { - if (setting.filter == null || setting.filter.test(entityType)) { - switch (entityType.getSpawnGroup()) { - case CREATURE -> hasAnimal++; - case WATER_AMBIENT, WATER_CREATURE, UNDERGROUND_WATER_CREATURE, AXOLOTLS -> hasWaterAnimal++; - case MONSTER -> hasMonster++; - case AMBIENT -> hasAmbient++; - case MISC -> hasMisc++; - } - } - } - - boolean first = animals == null; - - // Animals - List> animalsE = new ArrayList<>(); - WCheckbox animalsC = theme.checkbox(hasAnimal > 0); - - animals = theme.section("Animals", animals != null && animals.isExpanded(), animalsC); - animalsC.action = () -> tableChecked(animalsE, animalsC.checked); - - Cell animalsCell = add(animals).expandX(); - animalsT = animals.add(theme.table()).expandX().widget(); - - // Water animals - List> waterAnimalsE = new ArrayList<>(); - WCheckbox waterAnimalsC = theme.checkbox(hasWaterAnimal > 0); - - waterAnimals = theme.section("Water Animals", waterAnimals != null && waterAnimals.isExpanded(), waterAnimalsC); - waterAnimalsC.action = () -> tableChecked(waterAnimalsE, waterAnimalsC.checked); - - Cell waterAnimalsCell = add(waterAnimals).expandX(); - waterAnimalsT = waterAnimals.add(theme.table()).expandX().widget(); - - // Monsters - List> monstersE = new ArrayList<>(); - WCheckbox monstersC = theme.checkbox(hasMonster > 0); - - monsters = theme.section("Monsters", monsters != null && monsters.isExpanded(), monstersC); - monstersC.action = () -> tableChecked(monstersE, monstersC.checked); - - Cell monstersCell = add(monsters).expandX(); - monstersT = monsters.add(theme.table()).expandX().widget(); - - // Ambient - List> ambientE = new ArrayList<>(); - WCheckbox ambientC = theme.checkbox(hasAmbient > 0); - - ambient = theme.section("Ambient", ambient != null && ambient.isExpanded(), ambientC); - ambientC.action = () -> tableChecked(ambientE, ambientC.checked); - - Cell ambientCell = add(ambient).expandX(); - ambientT = ambient.add(theme.table()).expandX().widget(); - - // Misc - List> miscE = new ArrayList<>(); - WCheckbox miscC = theme.checkbox(hasMisc > 0); - - misc = theme.section("Misc", misc != null && misc.isExpanded(), miscC); - miscC.action = () -> tableChecked(miscE, miscC.checked); - - Cell miscCell = add(misc).expandX(); - miscT = misc.add(theme.table()).expandX().widget(); - - Consumer> entityTypeForEach = entityType -> { - if (setting.filter == null || setting.filter.test(entityType)) { - switch (entityType.getSpawnGroup()) { - case CREATURE -> { - animalsE.add(entityType); - addEntityType(animalsT, animalsC, entityType); - } - case WATER_AMBIENT, WATER_CREATURE, UNDERGROUND_WATER_CREATURE, AXOLOTLS -> { - waterAnimalsE.add(entityType); - addEntityType(waterAnimalsT, waterAnimalsC, entityType); - } - case MONSTER -> { - monstersE.add(entityType); - addEntityType(monstersT, monstersC, entityType); - } - case AMBIENT -> { - ambientE.add(entityType); - addEntityType(ambientT, ambientC, entityType); - } - case MISC -> { - miscE.add(entityType); - addEntityType(miscT, miscC, entityType); - } - } - } - }; - - // Sort all entities - if (filterText.isEmpty()) { - Registries.ENTITY_TYPE.forEach(entityTypeForEach); - } else { - List, Integer>> entities = new ArrayList<>(); - Registries.ENTITY_TYPE.forEach(entity -> { - int words = Utils.searchInWords(Names.get(entity), filterText); - int diff = Utils.searchLevenshteinDefault(Names.get(entity), filterText, false); - - if (words > 0 || diff < Names.get(entity).length() / 2) entities.add(new Pair<>(entity, -diff)); - }); - entities.sort(Comparator.comparingInt(value -> -value.getRight())); - for (Pair, Integer> pair : entities) entityTypeForEach.accept(pair.getLeft()); - } - - if (animalsT.cells.isEmpty()) list.cells.remove(animalsCell); - if (waterAnimalsT.cells.isEmpty()) list.cells.remove(waterAnimalsCell); - if (monstersT.cells.isEmpty()) list.cells.remove(monstersCell); - if (ambientT.cells.isEmpty()) list.cells.remove(ambientCell); - if (miscT.cells.isEmpty()) list.cells.remove(miscCell); - - if (first) { - int totalCount = (hasWaterAnimal + waterAnimals.cells.size() + monsters.cells.size() + ambient.cells.size() + misc.cells.size()) / 2; - - if (totalCount <= 20) { - if (!animalsT.cells.isEmpty()) animals.setExpanded(true); - if (!waterAnimalsT.cells.isEmpty()) waterAnimals.setExpanded(true); - if (!monstersT.cells.isEmpty()) monsters.setExpanded(true); - if (!ambientT.cells.isEmpty()) ambient.setExpanded(true); - if (!miscT.cells.isEmpty()) misc.setExpanded(true); - } - else { - if (!animalsT.cells.isEmpty()) animals.setExpanded(false); - if (!waterAnimalsT.cells.isEmpty()) waterAnimals.setExpanded(false); - if (!monstersT.cells.isEmpty()) monsters.setExpanded(false); - if (!ambientT.cells.isEmpty()) ambient.setExpanded(false); - if (!miscT.cells.isEmpty()) misc.setExpanded(false); - } - } - } - - private void tableChecked(List> entityTypes, boolean checked) { - boolean changed = false; - - for (EntityType entityType : entityTypes) { - if (checked) { - setting.get().add(entityType); - changed = true; - } else { - if (setting.get().remove(entityType)) { - changed = true; - } - } - } - - if (changed) { - list.clear(); - initWidgets(); - setting.onChanged(); - } - } - - private void addEntityType(WTable table, WCheckbox tableCheckbox, EntityType entityType) { - table.add(theme.label(Names.get(entityType))); - - WCheckbox a = table.add(theme.checkbox(setting.get().contains(entityType))).expandCellX().right().widget(); - a.action = () -> { - if (a.checked) { - setting.get().add(entityType); - switch (entityType.getSpawnGroup()) { - case CREATURE -> { - if (hasAnimal == 0) tableCheckbox.checked = true; - hasAnimal++; - } - case WATER_AMBIENT, WATER_CREATURE, UNDERGROUND_WATER_CREATURE, AXOLOTLS -> { - if (hasWaterAnimal == 0) tableCheckbox.checked = true; - hasWaterAnimal++; - } - case MONSTER -> { - if (hasMonster == 0) tableCheckbox.checked = true; - hasMonster++; - } - case AMBIENT -> { - if (hasAmbient == 0) tableCheckbox.checked = true; - hasAmbient++; - } - case MISC -> { - if (hasMisc == 0) tableCheckbox.checked = true; - hasMisc++; - } - } - } else { - if (setting.get().remove(entityType)) { - switch (entityType.getSpawnGroup()) { - case CREATURE -> { - hasAnimal--; - if (hasAnimal == 0) tableCheckbox.checked = false; - } - case WATER_AMBIENT, WATER_CREATURE, UNDERGROUND_WATER_CREATURE, AXOLOTLS -> { - hasWaterAnimal--; - if (hasWaterAnimal == 0) tableCheckbox.checked = false; - } - case MONSTER -> { - hasMonster--; - if (hasMonster == 0) tableCheckbox.checked = false; - } - case AMBIENT -> { - hasAmbient--; - if (hasAmbient == 0) tableCheckbox.checked = false; - } - case MISC -> { - hasMisc--; - if (hasMisc == 0) tableCheckbox.checked = false; - } - } - } - } - - setting.onChanged(); - }; - - table.row(); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeSetSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeSetSettingScreen.java new file mode 100644 index 0000000000..aeeba567b0 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeSetSettingScreen.java @@ -0,0 +1,38 @@ +/* + * 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; + +import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.screens.settings.base.GroupedSetSettingScreen; +import meteordevelopment.meteorclient.gui.widgets.WWidget; +import meteordevelopment.meteorclient.settings.EntityTypeSetSetting; +import meteordevelopment.meteorclient.utils.misc.Names; +import net.minecraft.entity.EntityType; +import net.minecraft.registry.Registries; + +public class EntityTypeSetSettingScreen extends GroupedSetSettingScreen, EntityTypeSetSetting> { + + public EntityTypeSetSettingScreen(GuiTheme theme, EntityTypeSetSetting setting) { + super(theme, "Select Entities", setting, EntityTypeSetSetting.GROUPS, Registries.ENTITY_TYPE); + } + + @Override + protected boolean includeValue(EntityType value) { + return setting.getFilter().test(value); + } + + @Override + protected WWidget getValueWidget(EntityType value) { + return theme.label(Names.get(value)).color(includeValue(value) ? theme.textColor() : theme.textSecondaryColor()); + } + + protected String[] getValueNames(EntityType value) { + return new String[]{ + Names.get(value), + Registries.ENTITY_TYPE.getId(value).toString() + }; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedSetSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedSetSettingScreen.java index 85a4527082..27937bee06 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedSetSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedSetSettingScreen.java @@ -16,6 +16,7 @@ import meteordevelopment.meteorclient.gui.widgets.containers.WVerticalList; import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; +import meteordevelopment.meteorclient.gui.widgets.pressable.WCheckbox; import meteordevelopment.meteorclient.gui.widgets.pressable.WPressable; import meteordevelopment.meteorclient.settings.GroupedSetSetting; import meteordevelopment.meteorclient.settings.Settings; 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 de7dd65488..4e1bade15d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoLog.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoLog.java @@ -11,6 +11,7 @@ import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -31,8 +32,6 @@ import net.minecraft.util.Colors; import net.minecraft.util.Formatting; -import java.util.Set; - public class AutoLog extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgEntities = settings.createGroup("Entities"); @@ -98,7 +97,7 @@ public class AutoLog extends Module { // Entities - private final Setting>> entities = sgEntities.add(new EntityTypeSetSetting.Builder() + private final Setting, GroupedSetSetting.Groups>.Group>> entities = sgEntities.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Disconnects when a specified entity is present within a specified range.") .defaultValue(EntityType.END_CRYSTAL) 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 df6eac50cb..f797608fbd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BowAimbot.java @@ -8,6 +8,7 @@ import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -28,8 +29,6 @@ import net.minecraft.item.Items; import net.minecraft.util.math.Vec3d; -import java.util.Set; - public class BowAimbot extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -42,7 +41,7 @@ public class BowAimbot extends Module { .build() ); - private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() + private final Setting, GroupedSetSetting.Groups>.Group>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Entities to attack.") .onlyAttackable() 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 613d6aaaf4..a81ccdb7c9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java @@ -19,6 +19,7 @@ import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.renderer.text.TextRenderer; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -62,7 +63,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; @@ -148,7 +148,7 @@ public class CrystalAura extends Module { .build() ); - private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() + private final Setting, GroupedSetSetting.Groups>.Group>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Entities to attack.") .onlyAttackable() 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 38ea76eab1..7cb1ee4de2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Hitboxes.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Hitboxes.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.systems.modules.combat; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -16,13 +17,11 @@ import net.minecraft.item.MaceItem; import net.minecraft.registry.tag.ItemTags; -import java.util.Set; - public class Hitboxes extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgWeapon = settings.createGroup("Weapon Options"); - private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() + private final Setting, GroupedSetSetting.Groups>.Group>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Which entities to target.") .defaultValue(EntityType.PLAYER) 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 42b93844d0..d6805c3681 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java @@ -9,6 +9,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -46,7 +47,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Set; import java.util.function.Predicate; public class KillAura extends Module { @@ -116,7 +116,7 @@ public class KillAura extends Module { // Targeting - private final Setting>> entities = sgTargeting.add(new EntityTypeSetSetting.Builder() + private final Setting, GroupedSetSetting.Groups>.Group>> entities = sgTargeting.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Entities to attack.") .onlyAttackable() 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 bc8796b8c6..8686654522 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notifier.java @@ -14,6 +14,7 @@ import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; @@ -112,7 +113,7 @@ public class Notifier extends Module { .build() ); - private final Setting>> entities = sgVisualRange.add(new EntityTypeSetSetting.Builder() + private final Setting, GroupedSetSetting.Groups>.Group>> entities = sgVisualRange.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Which entities to notify about.") .defaultValue(EntityType.PLAYER) 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 c8e221f640..ab3d8ad2ec 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoInteract.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoInteract.java @@ -25,8 +25,6 @@ import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; -import java.util.Set; - public class NoInteract extends Module { private final SettingGroup sgBlocks = settings.createGroup("Blocks"); private final SettingGroup sgEntities = settings.createGroup("Entities"); @@ -68,7 +66,7 @@ public class NoInteract extends Module { // Entities - private final Setting>> entityHit = sgEntities.add(new EntityTypeSetSetting.Builder() + private final Setting, GroupedSetSetting.Groups>.Group>> entityHit = sgEntities.add(new EntityTypeSetSetting.Builder() .name("entity-hit") .description("Cancel entity hitting.") .onlyAttackable() @@ -82,7 +80,7 @@ public class NoInteract extends Module { .build() ); - private final Setting>> entityInteract = sgEntities.add(new EntityTypeSetSetting.Builder() + private final Setting, GroupedSetSetting.Groups>.Group>> entityInteract = sgEntities.add(new EntityTypeSetSetting.Builder() .name("entity-interact") .description("Cancel entity interaction.") .onlyAttackable() 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 0badb8f0fd..0bff72f605 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoMiningTrace.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/NoMiningTrace.java @@ -5,22 +5,18 @@ package meteordevelopment.meteorclient.systems.modules.player; -import meteordevelopment.meteorclient.settings.BoolSetting; -import meteordevelopment.meteorclient.settings.EntityTypeSetSetting; -import meteordevelopment.meteorclient.settings.Setting; -import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.registry.tag.ItemTags; -import java.util.Set; - public class NoMiningTrace extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() + private final Setting, GroupedSetSetting.Groups>.Group>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("blacklisted-entities") .description("Entities you will interact with as normal.") .defaultValue() 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 be34980f32..61bc45fed0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Chams.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Chams.java @@ -8,6 +8,7 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.renderer.MeteorRenderPipelines; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.render.color.SettingColor; @@ -16,8 +17,6 @@ import net.minecraft.entity.EntityType; import net.minecraft.util.Identifier; -import java.util.Set; - public class Chams extends Module { private final SettingGroup sgThroughWalls = settings.createGroup("Through Walls"); private final SettingGroup sgPlayers = settings.createGroup("Players"); @@ -26,7 +25,7 @@ public class Chams extends Module { // Through walls - public final Setting>> entities = sgThroughWalls.add(new EntityTypeSetSetting.Builder() + public final Setting, GroupedSetSetting.Groups>.Group>> entities = sgThroughWalls.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Select entities to show through walls.") .onlyAttackable() 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 4068d73bc2..ff9c44b54b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java @@ -10,6 +10,7 @@ import meteordevelopment.meteorclient.renderer.Renderer2D; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; @@ -29,8 +30,6 @@ import net.minecraft.util.math.MathHelper; import org.joml.Vector3d; -import java.util.Set; - public class ESP extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgColors = settings.createGroup("Colors"); @@ -114,7 +113,7 @@ public class ESP extends Module { .build() ); - private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() + private final Setting, GroupedSetSetting.Groups>.Group>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Select specific entities.") .defaultValue(EntityType.PLAYER) 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 076c6a04ab..9888cfcea1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Nametags.java @@ -13,6 +13,7 @@ import meteordevelopment.meteorclient.renderer.Renderer2D; import meteordevelopment.meteorclient.renderer.text.TextRenderer; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; @@ -55,7 +56,7 @@ public class Nametags extends Module { // General - private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() + private final Setting, GroupedSetSetting.Groups>.Group>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Select entities to draw nametags on.") .defaultValue(EntityType.PLAYER, EntityType.ITEM) 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 9ad85fbe09..868863e119 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/NoRender.java @@ -22,7 +22,6 @@ import net.minecraft.particle.ParticleTypes; import java.util.List; -import java.util.Set; public class NoRender extends Module { private final SettingGroup sgOverlay = settings.createGroup("Overlay"); @@ -332,7 +331,7 @@ public class NoRender extends Module { // Entity - private final Setting>> entities = sgEntity.add(new EntityTypeSetSetting.Builder() + private final Setting, GroupedSetSetting.Groups>.Group>> entities = sgEntity.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Disables rendering of selected entities.") .build() 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 7e64b70396..35938c5361 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Tracers.java @@ -9,6 +9,7 @@ import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.renderer.Renderer2D; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; @@ -31,7 +32,6 @@ import java.time.Duration; import java.time.Instant; -import java.util.Set; public class Tracers extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -45,7 +45,7 @@ public enum TracerStyle { // General - private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() + private final Setting, GroupedSetSetting.Groups>.Group>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Select specific entities.") .defaultValue(EntityType.PLAYER) 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 8ee88c7c37..02899718b6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java @@ -7,6 +7,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.player.PlayerUtils; @@ -19,12 +20,11 @@ import java.util.ArrayList; import java.util.List; -import java.util.Set; public class AutoBreed extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() + private final Setting, GroupedSetSetting.Groups>.Group>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Entities to breed.") .defaultValue(EntityType.HORSE, EntityType.DONKEY, EntityType.COW, 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 b3248e65ce..7d645a5b30 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoMount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoMount.java @@ -8,10 +8,8 @@ //Created by squidoodly 16/07/2020 import meteordevelopment.meteorclient.events.world.TickEvent; -import meteordevelopment.meteorclient.settings.BoolSetting; -import meteordevelopment.meteorclient.settings.EntityTypeSetSetting; -import meteordevelopment.meteorclient.settings.Setting; -import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.entity.EntityUtils; @@ -25,8 +23,6 @@ import net.minecraft.item.SpawnEggItem; import net.minecraft.util.Hand; -import java.util.Set; - public class AutoMount extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -44,7 +40,7 @@ public class AutoMount extends Module { .build() ); - private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() + private final Setting, GroupedSetSetting.Groups>.Group>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Rideable entities.") .filter(EntityUtils::isRideable) 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 4693a952d1..a91609fc30 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoNametag.java @@ -9,6 +9,7 @@ import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.entity.SortPriority; @@ -24,12 +25,11 @@ import net.minecraft.util.Hand; import java.util.Iterator; -import java.util.Set; public class AutoNametag extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() + private final Setting, GroupedSetSetting.Groups>.Group>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Which entities to nametag.") .build() 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 80f642378b..09e15a4681 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Flamethrower.java @@ -7,6 +7,7 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.settings.groups.GroupSet; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.misc.HorizontalDirection; @@ -26,8 +27,6 @@ import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; -import java.util.Set; - public class Flamethrower extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -73,7 +72,7 @@ public class Flamethrower extends Module { .build() ); - private final Setting>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() + private final Setting, GroupedSetSetting.Groups>.Group>> entities = sgGeneral.add(new EntityTypeSetSetting.Builder() .name("entities") .description("Entities to cook.") .defaultValue( From adb4bd81cccffebd0b8be3d7f67b333092069c6c Mon Sep 17 00:00:00 2001 From: chri-k Date: Wed, 8 Oct 2025 20:32:49 +0300 Subject: [PATCH 11/15] add list suggestions --- .../arguments/SettingValueArgumentType.java | 10 +-- .../settings/AbstractCollectionSetting.java | 65 +++++++++++++++++++ .../settings/GroupedSetSetting.java | 2 +- .../meteorclient/settings/Setting.java | 13 ++++ 4 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/settings/AbstractCollectionSetting.java diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingValueArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingValueArgumentType.java index e7267dce71..f391313852 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingValueArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingValueArgumentType.java @@ -12,8 +12,6 @@ import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import meteordevelopment.meteorclient.settings.Setting; -import net.minecraft.command.CommandSource; -import net.minecraft.util.Identifier; import java.util.concurrent.CompletableFuture; @@ -39,6 +37,7 @@ public String parse(StringReader reader) throws CommandSyntaxException { @Override public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { + Setting setting; try { @@ -47,11 +46,6 @@ public CompletableFuture listSuggestions(CommandContext cont return Suggestions.empty(); } - Iterable identifiers = setting.getIdentifierSuggestions(); - if (identifiers != null) { - return CommandSource.suggestIdentifiers(identifiers, builder); - } - - return CommandSource.suggestMatching(setting.getSuggestions(), builder); + return setting.buildSuggestions(builder); } } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/AbstractCollectionSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/AbstractCollectionSetting.java new file mode 100644 index 0000000000..d545cdb328 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/settings/AbstractCollectionSetting.java @@ -0,0 +1,65 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.settings; + + +import com.mojang.brigadier.Message; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import net.minecraft.command.CommandSource; +import net.minecraft.util.Identifier; +import net.minecraft.util.Pair; + +import java.util.Iterator; +import java.util.Locale; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; + +public abstract class AbstractCollectionSetting extends Setting { + public AbstractCollectionSetting(String name, String description, T defaultValue, Consumer onChanged, Consumer> onModuleActivated, IVisible visible) { + super(name, description, defaultValue, onChanged, onModuleActivated, visible); + } + + protected String[] components(String value) { + return value.split(","); + } + + @Override + public CompletableFuture buildSuggestions(SuggestionsBuilder builder) { + String given = builder.getInput().substring(builder.getStart()); + + String[] components = components(given); + + if (components.length == 0) return builder.buildFuture(); + + String last = components[components.length - 1]; + + last = last.trim(); + + Iterable identifiers = getIdentifierSuggestions(); + + builder = builder.createOffset(builder.getStart() + given.length() - last.length()); + SuggestionsBuilder builderDuplicatedDueToArbitraryLambdaCaptureRestrictions = builder; + + if (identifiers != null) { + CommandSource.forEachMatching(identifiers, last, id -> id, id -> builderDuplicatedDueToArbitraryLambdaCaptureRestrictions.suggest(id.toString())); + return builderDuplicatedDueToArbitraryLambdaCaptureRestrictions.buildFuture(); + } + + Iterable suggestions = getSuggestions(); + + if (suggestions != null) { + for(String s : suggestions) { + if (CommandSource.shouldSuggest(last, s.toLowerCase(Locale.ROOT))) { + builderDuplicatedDueToArbitraryLambdaCaptureRestrictions.suggest(s); + } + } + } + + return builderDuplicatedDueToArbitraryLambdaCaptureRestrictions.buildFuture(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/settings/GroupedSetSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/GroupedSetSetting.java index 83b0f4db14..7f76430f4c 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/GroupedSetSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/GroupedSetSetting.java @@ -25,7 +25,7 @@ import java.util.function.Predicate; import java.util.stream.Collectors; -public abstract class GroupedSetSetting extends Setting.Group>> { +public abstract class GroupedSetSetting extends AbstractCollectionSetting.Group>> { protected Predicate filter; diff --git a/src/main/java/meteordevelopment/meteorclient/settings/Setting.java b/src/main/java/meteordevelopment/meteorclient/settings/Setting.java index 443fe390fe..311e9adee0 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/Setting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/Setting.java @@ -5,10 +5,14 @@ package meteordevelopment.meteorclient.settings; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.IGetter; import meteordevelopment.meteorclient.utils.misc.ISerializable; +import net.minecraft.command.CommandSource; import net.minecraft.nbt.NbtCompound; import net.minecraft.registry.Registry; import net.minecraft.util.Identifier; @@ -17,6 +21,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; public abstract class Setting implements IGetter, ISerializable { @@ -164,6 +169,14 @@ public static T parseId(Registry registry, String name) { return null; } + public CompletableFuture buildSuggestions(SuggestionsBuilder builder) { + Iterable identifiers = getIdentifierSuggestions(); + if (identifiers != null) { + return CommandSource.suggestIdentifiers(identifiers, builder); + } + return CommandSource.suggestMatching(getSuggestions(), builder); + } + @SuppressWarnings("unchecked") public abstract static class SettingBuilder { protected String name = "undefined", description = ""; From cffb504820af82dc4a3f0ca39913052fc9b99e57 Mon Sep 17 00:00:00 2001 From: chri-k Date: Wed, 8 Oct 2025 20:39:22 +0300 Subject: [PATCH 12/15] use list suggestions --- .../meteorclient/settings/ColorListSetting.java | 2 +- .../meteorclient/settings/EnchantmentListSetting.java | 2 +- .../meteorclient/settings/ModuleListSetting.java | 2 +- .../meteorclient/settings/PacketListSetting.java | 2 +- .../meteorclient/settings/ParticleTypeListSetting.java | 2 +- .../meteorclient/settings/ScreenHandlerListSetting.java | 2 +- .../meteorclient/settings/SoundEventListSetting.java | 2 +- .../meteorclient/settings/StatusEffectAmplifierMapSetting.java | 2 +- .../meteorclient/settings/StatusEffectListSetting.java | 2 +- .../meteorclient/settings/StorageBlockListSetting.java | 2 +- .../meteorclient/settings/StringListSetting.java | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ColorListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ColorListSetting.java index 1726463c57..3282ed7e5c 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ColorListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ColorListSetting.java @@ -14,7 +14,7 @@ import java.util.List; import java.util.function.Consumer; -public class ColorListSetting extends Setting> { +public class ColorListSetting extends AbstractCollectionSetting> { public ColorListSetting(String name, String description, List defaultValue, Consumer> onChanged, Consumer>> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/EnchantmentListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/EnchantmentListSetting.java index e56565df17..96ba4ab99e 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/EnchantmentListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/EnchantmentListSetting.java @@ -23,7 +23,7 @@ import java.util.function.Consumer; import java.util.stream.Collectors; -public class EnchantmentListSetting extends Setting>> { +public class EnchantmentListSetting extends AbstractCollectionSetting>> { public EnchantmentListSetting(String name, String description, Set> defaultValue, Consumer>> onChanged, Consumer>>> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ModuleListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ModuleListSetting.java index 6000407ca4..63f0bd2dcb 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ModuleListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ModuleListSetting.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.function.Consumer; -public class ModuleListSetting extends Setting> { +public class ModuleListSetting extends AbstractCollectionSetting> { private static List suggestions; public ModuleListSetting(String name, String description, List defaultValue, Consumer> onChanged, Consumer>> onModuleActivated, IVisible visible) { diff --git a/src/main/java/meteordevelopment/meteorclient/settings/PacketListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/PacketListSetting.java index a0197e0f4f..0675c3eafd 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/PacketListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/PacketListSetting.java @@ -19,7 +19,7 @@ import java.util.function.Consumer; import java.util.function.Predicate; -public class PacketListSetting extends Setting>>> { +public class PacketListSetting extends AbstractCollectionSetting>>> { public final Predicate>> filter; private static List suggestions; diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ParticleTypeListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ParticleTypeListSetting.java index 6767344ede..bbfe2566ab 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ParticleTypeListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ParticleTypeListSetting.java @@ -19,7 +19,7 @@ import java.util.List; import java.util.function.Consumer; -public class ParticleTypeListSetting extends Setting>> { +public class ParticleTypeListSetting extends AbstractCollectionSetting>> { public ParticleTypeListSetting(String name, String description, List> defaultValue, Consumer>> onChanged, Consumer>>> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ScreenHandlerListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ScreenHandlerListSetting.java index 1d597c604f..2d101e7f5b 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ScreenHandlerListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ScreenHandlerListSetting.java @@ -18,7 +18,7 @@ import java.util.List; import java.util.function.Consumer; -public class ScreenHandlerListSetting extends Setting>> { +public class ScreenHandlerListSetting extends AbstractCollectionSetting>> { public ScreenHandlerListSetting(String name, String description, List> defaultValue, Consumer>> onChanged, Consumer>>> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/SoundEventListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/SoundEventListSetting.java index f516843a4c..0074c01a0c 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/SoundEventListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/SoundEventListSetting.java @@ -18,7 +18,7 @@ import java.util.List; import java.util.function.Consumer; -public class SoundEventListSetting extends Setting> { +public class SoundEventListSetting extends AbstractCollectionSetting> { public SoundEventListSetting(String name, String description, List defaultValue, Consumer> onChanged, Consumer>> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectAmplifierMapSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectAmplifierMapSetting.java index bfb06f5ea8..8448cb0bb7 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectAmplifierMapSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectAmplifierMapSetting.java @@ -15,7 +15,7 @@ import java.util.function.Consumer; -public class StatusEffectAmplifierMapSetting extends Setting> { +public class StatusEffectAmplifierMapSetting extends AbstractCollectionSetting> { public static final Reference2IntMap EMPTY_STATUS_EFFECT_MAP = createStatusEffectMap(); public StatusEffectAmplifierMapSetting(String name, String description, Reference2IntMap defaultValue, Consumer> onChanged, Consumer>> onModuleActivated, IVisible visible) { diff --git a/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectListSetting.java index e4335ca2d8..eed009f8f2 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectListSetting.java @@ -18,7 +18,7 @@ import java.util.List; import java.util.function.Consumer; -public class StatusEffectListSetting extends Setting> { +public class StatusEffectListSetting extends AbstractCollectionSetting> { public StatusEffectListSetting(String name, String description, List defaultValue, Consumer> onChanged, Consumer>> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/StorageBlockListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/StorageBlockListSetting.java index 8b35872aae..4d7796aab0 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/StorageBlockListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/StorageBlockListSetting.java @@ -27,7 +27,7 @@ import java.util.function.Consumer; import java.util.stream.Stream; -public class StorageBlockListSetting extends Setting>> { +public class StorageBlockListSetting extends AbstractCollectionSetting>> { public static final BlockEntityType[] STORAGE_BLOCKS = new BlockEntityType[]{ BlockEntityType.BARREL, BlockEntityType.BLAST_FURNACE, diff --git a/src/main/java/meteordevelopment/meteorclient/settings/StringListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/StringListSetting.java index d5f03502cb..dd9b1aa972 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/StringListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/StringListSetting.java @@ -22,7 +22,7 @@ import java.util.List; import java.util.function.Consumer; -public class StringListSetting extends Setting>{ +public class StringListSetting extends AbstractCollectionSetting>{ public final Class renderer; public final CharFilter filter; From 7427fb55dead1c39fb1832bf0d5514f7c0f40861 Mon Sep 17 00:00:00 2001 From: chri-k Date: Sun, 16 Nov 2025 01:26:44 +0200 Subject: [PATCH 13/15] [feat] GuiIcon --- .../meteorclient/gui/GuiIcon.java | 35 ++++++++++++++++++ .../meteorclient/gui/GuiTheme.java | 17 ++++++--- .../gui/renderer/GuiRenderer.java | 10 +++++ .../gui/renderer/packer/GuiTexture.java | 19 ++++++++++ .../settings/EntityTypeSetSettingScreen.java | 5 ++- .../base/GroupedSetSettingScreen.java | 2 +- .../gui/themes/meteor/MeteorGuiTheme.java | 9 +++-- .../widgets/pressable/WMeteorButton.java | 8 ++-- .../pressable/WMeteorConfirmedButton.java | 8 ++-- .../gui/widgets/pressable/WButton.java | 8 ++-- .../widgets/pressable/WConfirmedButton.java | 5 ++- .../textures/icons/gui/arrowhead.png | Bin 0 -> 403 bytes .../textures/icons/gui/double-arrowhead.png | Bin 0 -> 467 bytes 13 files changed, 100 insertions(+), 26 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/gui/GuiIcon.java create mode 100644 src/main/resources/assets/meteor-client/textures/icons/gui/arrowhead.png create mode 100644 src/main/resources/assets/meteor-client/textures/icons/gui/double-arrowhead.png diff --git a/src/main/java/meteordevelopment/meteorclient/gui/GuiIcon.java b/src/main/java/meteordevelopment/meteorclient/gui/GuiIcon.java new file mode 100644 index 0000000000..d83d8c33ec --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/gui/GuiIcon.java @@ -0,0 +1,35 @@ +/* + * 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.gui.renderer.packer.GuiTexture; +import meteordevelopment.meteorclient.utils.render.color.Color; + +import javax.annotation.Nullable; + +public class GuiIcon { + + public GuiTexture texture; + public double rotation; + public @Nullable Color color; + + public GuiIcon(GuiTexture texture, double rotation, @Nullable Color color) { + this.texture = texture; + this.rotation = rotation; + this.color = color; + } + public GuiIcon(GuiTexture texture) { + this(texture, 0, null); + } + + public GuiIcon(GuiTexture texture, double rotation) { + this(texture, rotation, null); + } + + public GuiIcon(GuiTexture texture, Color color) { + this(texture, 0, color); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java b/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java index f353ff5d09..bf1f038fc5 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java @@ -80,22 +80,27 @@ public WHorizontalSeparator horizontalSeparator() { } public abstract WVerticalSeparator verticalSeparator(); - protected abstract WButton button(String text, GuiTexture texture); + protected abstract WButton button(String text, GuiIcon icon); public WButton button(String text) { return button(text, null); } - public WButton button(GuiTexture texture) { - return button(null, texture); + public WButton button(GuiIcon icon) { + return button(null, icon); } - protected abstract WConfirmedButton confirmedButton(String text, String confirmText, GuiTexture texture); + + protected abstract WConfirmedButton confirmedButton(String text, String confirmText, GuiIcon icon); public WConfirmedButton confirmedButton(String text, String confirmText) { return confirmedButton(text, confirmText, null); } - public WConfirmedButton confirmedButton(GuiTexture texture) { - return confirmedButton(null, null, texture); + public WConfirmedButton confirmedButton(GuiIcon icon) { + return confirmedButton(null, null, icon); } + // for compatibility + final public WButton button(GuiTexture texture) { return button(null, texture.icon()); } + final public WButton confirmedButton(GuiTexture texture) { return confirmedButton(null, null, texture.icon()); } + public abstract WMinus minus(); public abstract WConfirmedMinus confirmedMinus(); public abstract WPlus plus(); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java b/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java index 93a3cbef31..901c2e1237 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.gui.renderer; import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.gui.GuiIcon; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.renderer.operations.TextOperation; import meteordevelopment.meteorclient.gui.renderer.packer.GuiTexture; @@ -38,6 +39,7 @@ public class GuiRenderer { public static GuiTexture CIRCLE; public static GuiTexture TRIANGLE; + public static GuiTexture ARROWHEAD, ARROWHEAD_DOUBLE; public static GuiTexture EDIT; public static GuiTexture RESET; public static GuiTexture FAVORITE_NO, FAVORITE_YES; @@ -70,6 +72,9 @@ public static GuiTexture addTexture(Identifier id) { public static void init() { CIRCLE = addTexture(MeteorClient.identifier("textures/icons/gui/circle.png")); TRIANGLE = addTexture(MeteorClient.identifier("textures/icons/gui/triangle.png")); + ARROWHEAD = addTexture(MeteorClient.identifier("textures/icons/gui/arrowhead.png")); + ARROWHEAD_DOUBLE = addTexture(MeteorClient.identifier("textures/icons/gui/double-arrowhead.png")); + FAVORITE_YES = addTexture(MeteorClient.identifier("textures/icons/gui/triangle.png")); EDIT = addTexture(MeteorClient.identifier("textures/icons/gui/edit.png")); RESET = addTexture(MeteorClient.identifier("textures/icons/gui/reset.png")); FAVORITE_NO = addTexture(MeteorClient.identifier("textures/icons/gui/favorite_no.png")); @@ -234,6 +239,11 @@ public void rotatedQuad(double x, double y, double width, double height, double rTex.texQuad(x, y, width, height, rotation, texture.get(width, height), color); } + public void iconQuad(double x, double y, double width, double height, GuiIcon icon, Color defaultColor) { + if (icon.color != null) defaultColor = icon.color; + rotatedQuad(x, y, width, height, icon.rotation, icon.texture, defaultColor); + } + public void triangle(double x1, double y1, double x2, double y2, double x3, double y3, Color color) { r.triangle(x1, y1, x2, y2, x3, y3 ,color); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/renderer/packer/GuiTexture.java b/src/main/java/meteordevelopment/meteorclient/gui/renderer/packer/GuiTexture.java index 424e838853..eb50ed55d7 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/renderer/packer/GuiTexture.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/renderer/packer/GuiTexture.java @@ -5,6 +5,9 @@ package meteordevelopment.meteorclient.gui.renderer.packer; +import meteordevelopment.meteorclient.gui.GuiIcon; +import meteordevelopment.meteorclient.utils.render.color.Color; + import java.util.ArrayList; import java.util.List; @@ -32,4 +35,20 @@ public TextureRegion get(double width, double height) { return closestRegion; } + + public GuiIcon icon() { + return new GuiIcon(this); + } + + public GuiIcon icon(double rotation) { + return new GuiIcon(this, rotation); + } + + public GuiIcon icon(Color color) { + return new GuiIcon(this, color); + } + + public GuiIcon icon(double rotation, Color color) { + return new GuiIcon(this, rotation, color); + } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeSetSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeSetSettingScreen.java index aeeba567b0..18e86c2f32 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeSetSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeSetSettingScreen.java @@ -13,6 +13,8 @@ import net.minecraft.entity.EntityType; import net.minecraft.registry.Registries; +import java.util.function.Predicate; + public class EntityTypeSetSettingScreen extends GroupedSetSettingScreen, EntityTypeSetSetting> { public EntityTypeSetSettingScreen(GuiTheme theme, EntityTypeSetSetting setting) { @@ -21,7 +23,8 @@ public EntityTypeSetSettingScreen(GuiTheme theme, EntityTypeSetSetting setting) @Override protected boolean includeValue(EntityType value) { - return setting.getFilter().test(value); + Predicate> filter = setting.getFilter(); + return filter == null || filter.test(value); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedSetSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedSetSettingScreen.java index 27937bee06..6162516a85 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedSetSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedSetSettingScreen.java @@ -128,7 +128,7 @@ private WTable abc(Iterable iterable, boolean isLeft, Consumer { expanded = e ? null : s; reload(); 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 7b28053be4..aaa89a9392 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.gui.themes.meteor; import meteordevelopment.meteorclient.gui.DefaultSettingsWidgetFactory; +import meteordevelopment.meteorclient.gui.GuiIcon; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.WidgetScreen; import meteordevelopment.meteorclient.gui.renderer.packer.GuiTexture; @@ -206,13 +207,13 @@ public WVerticalSeparator verticalSeparator() { } @Override - protected WButton button(String text, GuiTexture texture) { - return w(new WMeteorButton(text, texture)); + protected WButton button(String text, GuiIcon icon) { + return w(new WMeteorButton(text, icon)); } @Override - protected WConfirmedButton confirmedButton(String text, String confirmText, GuiTexture texture) { - return w(new WMeteorConfirmedButton(text, confirmText, texture)); + protected WConfirmedButton confirmedButton(String text, String confirmText, GuiIcon icon) { + return w(new WMeteorConfirmedButton(text, confirmText, icon)); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/pressable/WMeteorButton.java b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/pressable/WMeteorButton.java index 3dafe58034..abb9727243 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/pressable/WMeteorButton.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/pressable/WMeteorButton.java @@ -5,15 +5,15 @@ package meteordevelopment.meteorclient.gui.themes.meteor.widgets.pressable; +import meteordevelopment.meteorclient.gui.GuiIcon; import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; -import meteordevelopment.meteorclient.gui.renderer.packer.GuiTexture; import meteordevelopment.meteorclient.gui.themes.meteor.MeteorGuiTheme; import meteordevelopment.meteorclient.gui.themes.meteor.MeteorWidget; import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; public class WMeteorButton extends WButton implements MeteorWidget { - public WMeteorButton(String text, GuiTexture texture) { - super(text, texture); + public WMeteorButton(String text, GuiIcon icon) { + super(text, icon); } @Override @@ -28,7 +28,7 @@ protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, doub } else { double ts = theme.textHeight(); - renderer.quad(x + width / 2 - ts / 2, y + pad, ts, ts, texture, theme.textColor.get()); + renderer.iconQuad(x + width / 2 - ts / 2, y + pad, ts, ts, icon, theme.textColor.get()); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/pressable/WMeteorConfirmedButton.java b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/pressable/WMeteorConfirmedButton.java index 57b92c801d..d3d8e51fa4 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/pressable/WMeteorConfirmedButton.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/pressable/WMeteorConfirmedButton.java @@ -5,17 +5,17 @@ package meteordevelopment.meteorclient.gui.themes.meteor.widgets.pressable; +import meteordevelopment.meteorclient.gui.GuiIcon; import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; import meteordevelopment.meteorclient.gui.renderer.packer.GuiTexture; import meteordevelopment.meteorclient.gui.themes.meteor.MeteorGuiTheme; import meteordevelopment.meteorclient.gui.themes.meteor.MeteorWidget; -import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; import meteordevelopment.meteorclient.gui.widgets.pressable.WConfirmedButton; import meteordevelopment.meteorclient.utils.render.color.Color; public class WMeteorConfirmedButton extends WConfirmedButton implements MeteorWidget { - public WMeteorConfirmedButton(String text, String confirmText, GuiTexture texture) { - super(text, confirmText, texture); + public WMeteorConfirmedButton(String text, String confirmText, GuiIcon icon) { + super(text, confirmText, icon); } @Override @@ -36,7 +36,7 @@ protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, doub } else { double ts = theme.textHeight(); - renderer.quad(x + width / 2 - ts / 2, y + pad, ts, ts, texture, fg); + renderer.iconQuad(x + width / 2 - ts / 2, y + pad, ts, ts, icon, fg); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WButton.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WButton.java index f740c6ec95..f21b648d2d 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WButton.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WButton.java @@ -5,17 +5,17 @@ package meteordevelopment.meteorclient.gui.widgets.pressable; -import meteordevelopment.meteorclient.gui.renderer.packer.GuiTexture; +import meteordevelopment.meteorclient.gui.GuiIcon; public abstract class WButton extends WPressable { protected String text; protected double textWidth; - protected GuiTexture texture; + protected GuiIcon icon; - public WButton(String text, GuiTexture texture) { + public WButton(String text, GuiIcon icon) { this.text = text; - this.texture = texture; + this.icon = icon; if (text == null) instantTooltips = true; } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WConfirmedButton.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WConfirmedButton.java index 1aec3b10c4..534b6df504 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WConfirmedButton.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WConfirmedButton.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.gui.widgets.pressable; +import meteordevelopment.meteorclient.gui.GuiIcon; import meteordevelopment.meteorclient.gui.renderer.packer.GuiTexture; public abstract class WConfirmedButton extends WButton { @@ -12,8 +13,8 @@ public abstract class WConfirmedButton extends WButton { protected boolean pressedOnce = false; protected String confirmText; - public WConfirmedButton(String text, String confirmText, GuiTexture texture) { - super(text, texture); + public WConfirmedButton(String text, String confirmText, GuiIcon icon) { + super(text, icon); this.confirmText = confirmText; } diff --git a/src/main/resources/assets/meteor-client/textures/icons/gui/arrowhead.png b/src/main/resources/assets/meteor-client/textures/icons/gui/arrowhead.png new file mode 100644 index 0000000000000000000000000000000000000000..75f095f291671b1d65581f8f867fea517a895ecf GIT binary patch literal 403 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zeLYF3^TdrC#^)Xm5J>Y0iW&kk?s$1Oc%ftTo9}r}4XOLkmU_oW%b#0h_CAPT#()^?A zm3lAo^(1dyI`P&WpGQgynWrd}FwB+T68A{oxbwgB)$RpPb@MAvN8kH2ZTlWD)Be}Z z@MMU{dPh02@7yg@^moQTm@W5%DUNeP>#{HD9|JxGlB)U literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/meteor-client/textures/icons/gui/double-arrowhead.png b/src/main/resources/assets/meteor-client/textures/icons/gui/double-arrowhead.png new file mode 100644 index 0000000000000000000000000000000000000000..ec15768a2023f96787c9fe091f889620929b43de GIT binary patch literal 467 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zdp%toLn`LH zoqe&e*+9T$x=4fc0nr@`LME&Va+E4$eR)9dz=Z?Pm@ADwO7tw*E$w^bJLlo5a>ExsR)vxmtH#Vfa<9Hyv*^^-gLk+`@E3>{_Ti=x8 z|H?ghZ?_Am%%ynT&ov8}@r049#X=;1F7FR^?s5@|f>(7dOh7YU{A~G&T*Bg7Y z?m2WjC4$qNwP%L;lESAqr6%9|Rk|i8==_Pe&G&w(t!QDGtflC1pJl2*LXaxUi`ff= zw0yQL%5VBU`_naZM^%;?A)Jg@lwHW;ytgykcb+HTykFnbz3scxCmxFtKa;#ZTzUQ0 znT<>B8Wu1`sV!l!lW)=6n3|TbP~Q2a+R^_TIJZgFt*#U0TK@qJ>AnbG2o~Ev`@_ix zxBmZJeYW!T^MInb2j@5*a6ORy=^nG^t9kIR$UC=VJSrBv+0)Q!ng7=+%uI8#>C3hA l55Ma_`}W_1B?8vZ*%SMxF-t`LO9jRfgQu&X%Q~loCIBXi)n@ Date: Sun, 16 Nov 2025 15:05:41 +0200 Subject: [PATCH 14/15] [feat] complete UI --- .../base/GroupedSetSettingScreen.java | 238 ++++++++++++------ .../settings/GroupedSetSetting.java | 12 +- .../settings/groups/GroupSet.java | 66 +++-- .../meteorclient/settings/groups/IGroup.java | 59 +++++ .../settings/groups/SetGroup.java | 26 +- .../modules/render/blockesp/BlockESP.java | 2 +- .../systems/modules/world/InfinityMiner.java | 4 +- 7 files changed, 300 insertions(+), 107 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/settings/groups/IGroup.java diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedSetSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedSetSettingScreen.java index 6162516a85..443abf16b2 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedSetSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/GroupedSetSettingScreen.java @@ -9,17 +9,15 @@ import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.WindowScreen; import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; -import meteordevelopment.meteorclient.gui.screens.EditSystemScreen; import meteordevelopment.meteorclient.gui.utils.Cell; import meteordevelopment.meteorclient.gui.widgets.WWidget; +import meteordevelopment.meteorclient.gui.widgets.containers.WContainer; import meteordevelopment.meteorclient.gui.widgets.containers.WTable; -import meteordevelopment.meteorclient.gui.widgets.containers.WVerticalList; import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; -import meteordevelopment.meteorclient.gui.widgets.pressable.WCheckbox; import meteordevelopment.meteorclient.gui.widgets.pressable.WPressable; import meteordevelopment.meteorclient.settings.GroupedSetSetting; -import meteordevelopment.meteorclient.settings.Settings; +import meteordevelopment.meteorclient.settings.groups.IGroup; import meteordevelopment.meteorclient.utils.render.color.Color; import java.util.ArrayList; @@ -33,11 +31,6 @@ public abstract class GroupedSetSettingScreen> private final Iterable registry; private final GroupedSetSetting.Groups groups; - private WTable table; - private String filterText = ""; - - private GroupedSetSetting.Groups.Group expanded; - public GroupedSetSettingScreen(GuiTheme theme, String title, S setting, GroupedSetSetting.Groups groups, Iterable registry) { super(theme, title); @@ -46,53 +39,70 @@ public GroupedSetSettingScreen(GuiTheme theme, String title, S setting, GroupedS this.groups = groups; } - @Override - public void initWidgets() { + protected final class Context { + private WTable table; + private String filterText = ""; + private GroupedSetSetting.Groups.Group expanded = null; + private GroupedSetSetting.Groups.Group beingEdited = null; + private IGroup.Group> source; + private Runnable reload; + } + + private final Context ctx = new Context(); + + private void createWidgets(WindowScreen root, Context ctx) { // Filter - WTextBox filter = add(theme.textBox("")).minWidth(400).expandX().widget(); + WTextBox filter = root.add(theme.textBox("")).minWidth(400).expandX().widget(); filter.setFocused(true); + + ctx.table = root.add(theme.table()).expandX().widget(); + filter.action = () -> { - filterText = filter.get().trim(); + ctx.filterText = filter.get().trim(); - table.clear(); - initTable(); + ctx.table.clear(); + initTable(ctx); }; - table = add(theme.table()).expandX().widget(); + initTable(ctx); + } - initTable(); + @Override + public void initWidgets() { + this.ctx.source = this.setting.get(); + this.ctx.reload = this::reload; + createWidgets(this, this.ctx); } - private void initTable() { + private void initTable(Context ctx) { List list = new ArrayList<>(groups.getAll().stream().map(ItemUnion::new).toList()); registry.forEach((t) -> list.add(new ItemUnion(t))); // Left (all) - WTable left = abc(list, true, t -> { - addValue(t); + WTable left = abc(ctx, list, true, t -> { + addValue(ctx, t); if (t.t != null) { T v = getAdditionalValue(t.t); - if (v != null) addValue(t); + if (v != null) addValue(ctx, t); } }); - if (!left.cells.isEmpty()) table.add(theme.verticalSeparator()).expandWidgetY(); + if (!left.cells.isEmpty()) ctx.table.add(theme.verticalSeparator()).expandWidgetY(); list.clear(); - list.addAll(setting.get().getGroups().stream().map(ItemUnion::new).toList()); - - setting.get().getImmediate().forEach((t) -> list.add(new ItemUnion(t))); + list.addAll(ctx.source.getGroups().stream().map(ItemUnion::new).toList()); + ctx.source.getImmediate().forEach((t) -> list.add(new ItemUnion(t))); // Right (selected) - WTable right = abc(list, false, t -> { - removeValue(t); + WTable right = abc(ctx, list, false, t -> { + removeValue(ctx, t); if (t.t != null) { T v = getAdditionalValue(t.t); - if (v != null) removeValue(t); + if (v != null) removeValue(ctx, t); } }); @@ -105,67 +115,112 @@ private WWidget groupLabel(GroupedSetSetting.Groups.Group s) { else return theme.label(" @"+s.name.get()).color(color); } - private WTable abc(Iterable iterable, boolean isLeft, Consumer buttonAction) { + private void addGroupTransferButton(Context ctx, WTable table,GroupedSetSetting.Groups.Group g) { + if (ctx.source.getImmediate().containsAll(g.getAllMatching(setting.getFilter()))) { + table.add(theme.button(GuiRenderer.ARROWHEAD_DOUBLE.icon(180, Color.RED))).right().top().widget().action = () -> { + ctx.source.removeAll(g.getAll()); + invalidateTable(ctx); + }; + } else { + table.add(theme.button(GuiRenderer.ARROWHEAD_DOUBLE.icon(Color.CYAN))).right().top().widget().action = () -> { + ctx.source.addAll(g.getAll()); + invalidateTable(ctx); + }; + } + } + + private void addTransferButton(Context ctx, WTable table, T t) { + if (ctx.source.getImmediate().contains(t)) { + table.add(theme.button(GuiRenderer.ARROWHEAD.icon(180, Color.RED))).right().top().widget().action = () -> { + ctx.source.remove(t); + invalidateTable(ctx); + }; + } else { + table.add(theme.button(GuiRenderer.ARROWHEAD.icon(Color.ORANGE))).right().top().widget().action = () -> { + ctx.source.add(t); + invalidateTable(ctx); + }; + } + } + + private WTable abc(Context ctx, Iterable iterable, boolean isLeft, Consumer buttonAction) { // Create - Cell cell = this.table.add(theme.table()).top(); + Cell cell = ctx.table.add(theme.table()).top(); WTable table = cell.widget(); - // Sort Predicate predicate = isLeft ? v -> Boolean.TRUE.equals(v.map( - t -> this.includeValue(t) && !setting.get().getImmediate().contains(t), - s -> !entireGroupExcluded(s) && !setting.get().getGroups().contains(s))) + t -> this.includeValue(t) && !ctx.source.getImmediate().contains(t), + s -> !entireGroupExcluded(s) && !ctx.source.getGroups().contains(s) && s != ctx.beingEdited)) : v -> true; - Iterable sorted = SortingHelper.sort(iterable, predicate, v -> v.map(this::getValueNames, s -> new String[]{"@"+s.name.get()}), filterText); + Iterable sorted = SortingHelper.sort(iterable, predicate, v -> v.map(this::getValueNames, s -> new String[]{"@"+s.name.get()}), ctx.filterText); sorted.forEach(v -> { - table.add(v.map(this::getValueWidget, s -> { - WVerticalList vlist = theme.verticalList(); - WTable hlist = vlist.add(theme.table()).widget(); + WTable buttons = theme.table(); - boolean e = expanded == s; + if (v.s == null) { + table.add(getValueWidget(v.t)); + table.add(buttons).right(); + } else { + GroupedSetSetting.Groups.Group s = v.s; - WButton expand = hlist.add(theme.button(GuiRenderer.TRIANGLE.icon(e ? 0 : -90))).widget(); + WTable header = table.add(theme.table()).widget(); + + boolean e = ctx.expanded == s; + + WButton expand = header.add(theme.button(GuiRenderer.TRIANGLE.icon(e ? 0 : -90))).widget(); expand.action = () -> { - expanded = e ? null : s; - reload(); + ctx.expanded = e ? null : s; + ctx.reload.run(); }; - hlist.add(groupLabel(s)); + header.add(groupLabel(s)); + + // Recursive editing is confusing + if (ctx.beingEdited == null) { + WButton edit = buttons.add(theme.button(GuiRenderer.EDIT)).right().top().widget(); + edit.action = () -> MeteorClient.mc.setScreen(new EditListGroupScreen(theme, s, () -> { + invalidateTable(ctx); + ctx.reload.run(); + })); + } + + addGroupTransferButton(ctx, buttons, s); - WTable subtable = vlist.add(theme.table()).widget(); + table.add(buttons).right(); if (e) { for (GroupedSetSetting.Groups.Group inc : s.getGroups()) { - subtable.add(theme.label(" -> ")); - subtable.add(groupLabel(inc)); - subtable.row(); + table.row(); + + WTable label = theme.table(); + label.add(theme.label(" -> ")); + label.add(groupLabel(inc)); + table.add(label); + + addGroupTransferButton(ctx, table, inc); } Iterable subitems = SortingHelper.sortWithPriority(s.getImmediate(), (t)->true, this::getValueNames, "", (T a, T b) -> includeValue(a) == includeValue(b) ? 0 : includeValue(a) ? -1 : 1); subitems.forEach(t -> { - subtable.add(theme.label(" -> ")); - subtable.add(getValueWidget(t)); - subtable.row(); + table.row(); + + WTable label = theme.table(); + label.add(theme.label(" -> ")); + label.add(getValueWidget(t)); + table.add(label); + + addTransferButton(ctx, table, t); }); } - return vlist; - })); - - if (v.s != null) { - WButton edit = table.add(theme.button(GuiRenderer.EDIT)).right().top().widget(); - edit.action = () -> MeteorClient.mc.setScreen(new EditListGroupScreen(theme, v.s, () -> { - invalidateTable(); - reload(); - })); } - WPressable button = table.add(isLeft ? theme.plus() : theme.minus()).expandCellX().right().top().widget(); + WPressable button = buttons.add(isLeft ? theme.plus() : theme.minus()).expandCellX().right().top().widget(); button.action = () -> buttonAction.accept(v); table.row(); @@ -180,32 +235,32 @@ private boolean entireGroupExcluded(GroupedSetSetting.Groups.Group s) { return !s.anyMatch(this::includeValue); } - protected void invalidateTable() { - table.clear(); - initTable(); + protected void invalidateTable(Context ctx) { + ctx.table.clear(); + initTable(ctx); } - protected void addValue(ItemUnion value) { + protected void addValue(Context ctx, ItemUnion value) { if (value.t != null) { - setting.get().add(value.t); + ctx.source.add(value.t); setting.onChanged(); - invalidateTable(); + invalidateTable(ctx); } else if (value.s != null) { - setting.get().add(value.s); + ctx.source.add(value.s); setting.onChanged(); - invalidateTable(); + invalidateTable(ctx); } } - protected void removeValue(ItemUnion value) { + protected void removeValue(Context ctx, ItemUnion value) { if (value.t != null) { - setting.get().remove(value.t); + ctx.source.remove(value.t); setting.onChanged(); - invalidateTable(); + invalidateTable(ctx); } else if (value.s != null) { - setting.get().remove(value.s); + ctx.source.remove(value.s); setting.onChanged(); - invalidateTable(); + invalidateTable(ctx); } } @@ -244,25 +299,46 @@ public R map(Function a, Function.Group, R } } - public class EditListGroupScreen extends EditSystemScreen.Group> { + public class EditListGroupScreen extends WindowScreen { + + private final GroupedSetSetting.Groups.Group value; + private final Runnable reload; + + private final Context ctx = new Context(); + + private WContainer container; + public EditListGroupScreen(GuiTheme theme, GroupedSetSetting.Groups.Group value, Runnable reload) { - super(theme, value, reload); + super(theme, "Editing Group"); + + this.value = value == null ? setting.createGroup("new-group") : value; + this.reload = reload; + this.value.builtin = false; + + GroupedSetSettingScreen.this.setting.set(GroupedSetSettingScreen.this.setting.get()); } @Override - public GroupedSetSetting.Groups.Group create() { - return null; + public void initWidgets() { + container = add(theme.verticalList()).expandX().minWidth(400).padTop(4).widget(); + container.add(theme.settings(value.settings)).expandX().padBottom(4); + + add(theme.horizontalSeparator("Contents")).expandX().padBottom(4); + + this.ctx.source = value; + this.ctx.reload = this::reload; + this.ctx.beingEdited = value; + createWidgets(this, this.ctx); } @Override - public boolean save() { - value.builtin = false; - return true; + protected void onClosed() { + this.reload.run(); } @Override - public Settings getSettings() { - return value.settings; + public void tick() { + value.settings.tick(container, theme); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/GroupedSetSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/GroupedSetSetting.java index 7f76430f4c..b6a24e7749 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/GroupedSetSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/GroupedSetSetting.java @@ -44,6 +44,10 @@ public GroupedSetSetting(String name, String description, GroupSet. abstract protected Groups groups(); long version = -1; + public Groups.Group createGroup(String name) { + return groups().builder(name).get(); + } + protected void buildSuggestions(List to) { Registry registry = suggestRegistry(); @@ -350,14 +354,14 @@ public Group fromTag(NbtCompound tag, Function itemFromNbt) { if (name == null) return null; this.name.set(name); - this.icon.set(tag.get("item", Identifier.CODEC).map(Registries.ITEM::get).orElse(null)); + this.icon.set(tag.get("item", Identifier.CODEC).map(Registries.ITEM::get).orElse(Items.NETHER_STAR)); - this.immediate = tag.getListOrEmpty("direct").stream().map(itemFromNbt).collect(Collectors.toSet()); - this.include = tag.getListOrEmpty("include").stream().map(NbtElement::asString) + this.immediate.addAll(tag.getListOrEmpty("direct").stream().map(itemFromNbt).toList()); + this.include.addAll(tag.getListOrEmpty("include").stream().map(NbtElement::asString) .filter(Optional::isPresent).map(Optional::get).map(String::toUpperCase).map((s) -> { if (GROUPS.containsKey(s)) return GROUPS.get(s); return GROUPS.put(s, builder(s).get()); - }).toList(); + }).toList()); if (internalName == null) this.name.set(String.format("group%d", hashCode())); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupSet.java b/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupSet.java index e3210c39e3..33a5e93f3b 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupSet.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/groups/GroupSet.java @@ -10,11 +10,13 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Unmodifiable; +import javax.annotation.Nullable; import java.util.*; import java.util.function.Predicate; +import java.util.stream.Collectors; @Unmodifiable -public class GroupSet> implements Iterable { +public class GroupSet> implements Iterable, IGroup { private Set cached; private Set immediate; private List include; @@ -48,6 +50,7 @@ public GroupSet(Collection d, @NotNull Collection g) { immediate = d == null ? new ReferenceOpenHashSet<>() : new ReferenceOpenHashSet<>(d); } + @Override public boolean add(T t) { if (!immediate.contains(t)) { immediate.add(t); @@ -57,6 +60,7 @@ public boolean add(T t) { return false; } + @Override public boolean add(G g) { if (!include.contains(g)) { include.add(g); @@ -66,6 +70,7 @@ public boolean add(G g) { return false; } + @Override public boolean remove(T t) { if (immediate.remove(t)) { cached = null; @@ -74,6 +79,7 @@ public boolean remove(T t) { return false; } + @Override public boolean remove(G g) { if (include.remove(g)) { cached = null; @@ -91,10 +97,20 @@ public void setIncludeCondition(Predicate includeIf) { cached = null; } + @Override + @Unmodifiable + public Set getAll() { + return getAllMatching(null); + } + + @Override @Unmodifiable - public Set get() { + public Set getAllMatching(@Nullable Predicate predicate) { - if (isValid()) return cached; + if (isValid()) { + if (predicate == null) return cached; + return cached.stream().filter(predicate).collect(Collectors.toUnmodifiableSet()); + } if (enumeration != null) version = enumeration.getVersion(); // debug statement @@ -105,7 +121,7 @@ public Set get() { List> next = new ArrayList<>(); for (SetGroup g : include) { - g.internalGetAll(set, seen, next); + g.internalGetAll(set, seen, next, predicate); } if (includeIf != null) set.removeIf((t) -> !includeIf.test(t)); @@ -115,6 +131,11 @@ public Set get() { return Collections.unmodifiableSet(cached); } + @Override + public boolean anyMatch(Predicate predicate) { + return false; + } + public void set(GroupSet other) { cached = null; if (other.isValid()) { @@ -131,23 +152,37 @@ public void clear() { immediate.clear(); } + @Override @Unmodifiable public Set getImmediate() { return Collections.unmodifiableSet(immediate); } + @Override @Unmodifiable public List getGroups() { return Collections.unmodifiableList(include); } + @Override + public boolean isEmpty() { + return getAll().isEmpty(); + } + + @Override + public boolean contains(Object o) { + return getAll().contains(o); + } + + @Override public boolean containsAll(@NotNull Collection collection) { - get(); + getAll(); for (T t : collection) if (!cached.contains(t)) return false; return true; } - public boolean addAll(@NotNull Collection collection) { + @Override + public boolean addAll(@NotNull Collection collection) { boolean modified = false; for (T t : collection) { if (!immediate.contains(t)) { @@ -159,6 +194,7 @@ public boolean addAll(@NotNull Collection collection) { return modified; } + @Override public boolean addAllGroups(@NotNull Collection collection) { boolean modified = false; for (G g : collection) { @@ -171,38 +207,32 @@ public boolean addAllGroups(@NotNull Collection collection) { return modified; } + @Override public boolean removeAll(@NotNull Collection collection) { cached = null; return immediate.removeAll(collection); } + @Override public boolean removeAllGroups(@NotNull Collection collection) { cached = null; return include.removeAll(collection); } public int size() { - return get().size(); - } - - public boolean isEmpty() { - return get().isEmpty(); - } - - public boolean contains(Object o) { - return get().contains(o); + return getAll().size(); } @Override public @NotNull Iterator iterator() { - return get().iterator(); + return getAll().iterator(); } public @NotNull Object[] toArray() { - return get().toArray(); + return getAll().toArray(); } public @NotNull T1[] toArray(@NotNull T1[] t1s) { - return get().toArray(t1s); + return getAll().toArray(t1s); } } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/groups/IGroup.java b/src/main/java/meteordevelopment/meteorclient/settings/groups/IGroup.java new file mode 100644 index 0000000000..51231ac6a9 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/settings/groups/IGroup.java @@ -0,0 +1,59 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.settings.groups; + + +import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Unmodifiable; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.function.Predicate; + + +public interface IGroup> { + @Unmodifiable + Set getImmediate(); + + @Unmodifiable + Set getAll(); + @Unmodifiable + Set getAllMatching(Predicate predicate); + + boolean anyMatch(Predicate predicate); + + @Unmodifiable + List getGroups(); + + boolean add(T t); + boolean add(G g); + + boolean remove(G g); + boolean remove(T t); + + boolean addAll(@NotNull Collection collection); + + boolean addAllGroups(Collection collection); + boolean removeAll(@NotNull Collection collection); + boolean removeAllGroups(@NotNull Collection collection); + + default boolean containsAll(@NotNull Collection collection) { + return getAll().containsAll(collection); + } + + default boolean isEmpty() { + return getAll().isEmpty(); + } + + default boolean contains(Object o) { + return getAll().contains(o); + } + +} diff --git a/src/main/java/meteordevelopment/meteorclient/settings/groups/SetGroup.java b/src/main/java/meteordevelopment/meteorclient/settings/groups/SetGroup.java index 27084fcff5..be29975336 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/groups/SetGroup.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/groups/SetGroup.java @@ -9,13 +9,14 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Unmodifiable; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; import java.util.function.Predicate; -public abstract class SetGroup> { +public abstract class SetGroup> implements IGroup { protected Set immediate = new ReferenceOpenHashSet<>(); protected List include = new ArrayList<>(); @@ -36,6 +37,29 @@ public Set getAll() { return set; } + public Set getAllMatching(Predicate predicate) { + Set set = new ReferenceOpenHashSet<>(); + List> seen = new ArrayList<>(); + List> next = new ArrayList<>(); + if (predicate == null) internalGetAll(set, seen, next); + else internalGetAll(set, seen, next, predicate); + return set; + } + + public void internalGetAll(Collection to, Collection> seen, List> next, Predicate predicate) { + next.clear(); + next.add(this); + for (int i = 0; i < next.size(); i++) { + SetGroup g = next.get(i); + if (seen.contains(g)) continue; + for (T t : g.immediate) { + if (predicate.test(t)) to.add(t); + } + next.addAll(g.include); + seen.add(g); + } + } + public void internalGetAll(Collection to, Collection> seen, List> next) { next.clear(); next.add(this); 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 3c7c5e3506..657d6d0fb9 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 @@ -161,7 +161,7 @@ private void onChunkData(ChunkDataEvent event) { private void searchChunk(Chunk chunk) { workerThread.submit(() -> { if (!isActive()) return; - ESPChunk schunk = ESPChunk.searchChunk(chunk, blocks.get().get()); + ESPChunk schunk = ESPChunk.searchChunk(chunk, blocks.get().getAll()); if (schunk.size() > 0) { synchronized (chunks) { 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 0ce29d8ed8..d59a1c5827 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/InfinityMiner.java @@ -204,14 +204,14 @@ private void mineTargetBlocks() { Block[] array = new Block[targetBlocks.get().size()]; baritone.getPathingBehavior().cancelEverything(); - baritone.getMineProcess().mine(targetBlocks.get().get().toArray(array)); + baritone.getMineProcess().mine(targetBlocks.get().getAll().toArray(array)); } private void mineRepairBlocks() { Block[] array = new Block[repairBlocks.get().size()]; baritone.getPathingBehavior().cancelEverything(); - baritone.getMineProcess().mine(repairBlocks.get().get().toArray(array)); + baritone.getMineProcess().mine(repairBlocks.get().getAll().toArray(array)); } private void logOut() { From d062bece7d188e7f45c9db0e36002111bf79e677 Mon Sep 17 00:00:00 2001 From: chri-k Date: Sun, 16 Nov 2025 18:30:18 +0200 Subject: [PATCH 15/15] [chg] debug --- .../settings/BlockListSetting.java | 14 +++------- .../meteorclient/settings/ItemSetSetting.java | 28 ++----------------- .../systems/modules/world/LiquidFiller.java | 2 +- 3 files changed, 8 insertions(+), 36 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java index 6d6fe207a2..bdf439f02e 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java @@ -105,8 +105,8 @@ public BlockListSetting build() { } } - public static Groups.Group ORES, DIRTS, SANDS, STONES, STONES_ALL, TERRAIN, TERRAIN_ALL; - + // These are just for testing + public static Groups.Group ORES, DIRTS, SANDS, STONES, TERRAIN; static { ORES = GROUPS.builtin("ores", Items.DIAMOND_ORE) .items(Xray.ORES).get(); @@ -117,17 +117,11 @@ public BlockListSetting build() { .items(Blocks.SAND, Blocks.RED_SAND, Blocks.GRAVEL) .get(); STONES = GROUPS.builtin("stone", Items.STONE) - .items(Blocks.STONE, Blocks.DEEPSLATE, Blocks.NETHERRACK, Blocks.SANDSTONE, Blocks.TUFF, Blocks.BASALT) - .get(); - STONES_ALL = GROUPS.builtin("stone-all", Items.DIORITE) - .items(Blocks.ANDESITE, Blocks.DIORITE, Blocks.GRANITE, Blocks.BLACKSTONE, Blocks.CALCITE) - .include(STONES) + .items(Blocks.STONE, Blocks.DEEPSLATE, Blocks.NETHERRACK, Blocks.SANDSTONE, Blocks.TUFF, Blocks.BASALT, + Blocks.ANDESITE, Blocks.DIORITE, Blocks.GRANITE, Blocks.BLACKSTONE, Blocks.CALCITE) .get(); TERRAIN = GROUPS.builtin("terrain", Items.GRASS_BLOCK) .include(STONES, DIRTS, SANDS) .get(); - TERRAIN_ALL = GROUPS.builtin("terrain-all", Items.GRASS_BLOCK) - .include(STONES_ALL, DIRTS, SANDS) - .get(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ItemSetSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ItemSetSetting.java index a92016c510..16dd421af1 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ItemSetSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ItemSetSetting.java @@ -121,15 +121,15 @@ public ItemSetSetting build() { .get(); PICKAXES = GROUPS.builtin("picks", Items.IRON_PICKAXE) - .items(Items.WOODEN_HOE, Items.STONE_HOE, Items.IRON_HOE, Items.GOLDEN_HOE, Items.DIAMOND_HOE, Items.NETHERITE_HOE) + .items(Items.NETHERITE_PICKAXE, Items.NETHERITE_PICKAXE, Items.NETHERITE_PICKAXE, Items.NETHERITE_PICKAXE, Items.NETHERITE_PICKAXE, Items.NETHERITE_PICKAXE) .get(); AXES = GROUPS.builtin("axes", Items.IRON_AXE) - .items(Items.WOODEN_HOE, Items.STONE_HOE, Items.IRON_HOE, Items.GOLDEN_HOE, Items.DIAMOND_HOE, Items.NETHERITE_HOE) + .items(Items.WOODEN_AXE, Items.STONE_AXE, Items.IRON_AXE, Items.GOLDEN_AXE, Items.DIAMOND_AXE, Items.NETHERITE_AXE) .get(); SWORDS = GROUPS.builtin("swords", Items.IRON_SWORD) - .items(Items.WOODEN_HOE, Items.STONE_HOE, Items.IRON_HOE, Items.GOLDEN_HOE, Items.DIAMOND_HOE, Items.NETHERITE_HOE) + .items(Items.WOODEN_SWORD, Items.STONE_SWORD, Items.IRON_SWORD, Items.GOLDEN_SWORD, Items.DIAMOND_SWORD, Items.NETHERITE_SWORD) .get(); HOES = GROUPS.builtin("hoes", Items.IRON_HOE) @@ -140,27 +140,5 @@ public ItemSetSetting build() { .items(Items.SHEARS, Items.FLINT_AND_STEEL) .include(PICKAXES, AXES, HOES) .get(); - - HELMETS = GROUPS.builtin("hoes", Items.IRON_HELMET) - .items(Items.TURTLE_HELMET, Items.CHAINMAIL_HELMET, Items.IRON_HELMET, Items.GOLDEN_HELMET, Items.DIAMOND_HELMET, Items.NETHERITE_HELMET) - .get(); - - CHESTPLATES = GROUPS.builtin("chestplates", Items.IRON_CHESTPLATE) - .items(Items.CHAINMAIL_CHESTPLATE, Items.IRON_CHESTPLATE, Items.GOLDEN_CHESTPLATE, Items.DIAMOND_CHESTPLATE, Items.NETHERITE_CHESTPLATE) - .get(); - - LEGGINGS = GROUPS.builtin("leggings", Items.IRON_LEGGINGS) - .items(Items.CHAINMAIL_LEGGINGS, Items.IRON_LEGGINGS, Items.GOLDEN_LEGGINGS, Items.DIAMOND_LEGGINGS, Items.NETHERITE_LEGGINGS) - .get(); - - BOOTS = GROUPS.builtin("boots", Items.IRON_BOOTS) - .items(Items.CHAINMAIL_BOOTS, Items.IRON_BOOTS, Items.GOLDEN_BOOTS, Items.DIAMOND_BOOTS, Items.NETHERITE_BOOTS) - .get(); - - ARMOR = GROUPS.builtin("armor", Items.DIAMOND_CHESTPLATE) - .include(HELMETS, CHESTPLATES, LEGGINGS, BOOTS) - .get(); - - } } 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 848dfa6813..44df7ae9fb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/LiquidFiller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/LiquidFiller.java @@ -110,7 +110,7 @@ public class LiquidFiller extends Module { .name("whitelist") .description("The allowed blocks that it will use to fill up the liquid.") .defaultValue(Blocks.COBBLESTONE, Blocks.COBBLED_DEEPSLATE) - .defaultGroups(BlockListSetting.TERRAIN_ALL) + .defaultGroups(BlockListSetting.TERRAIN) .visible(() -> listMode.get() == ListMode.Whitelist) .build() );