From 9736a874f1a4d71c72080dd234994b9dc40ce0a1 Mon Sep 17 00:00:00 2001 From: Matt Sturgeon Date: Tue, 28 Nov 2023 17:31:04 +0000 Subject: [PATCH 1/2] Cleanup translatable config enums --- .../net/xolt/freecam/config/ModConfig.java | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/common/src/main/java/net/xolt/freecam/config/ModConfig.java b/common/src/main/java/net/xolt/freecam/config/ModConfig.java index 74ed45f85..5fb59e450 100644 --- a/common/src/main/java/net/xolt/freecam/config/ModConfig.java +++ b/common/src/main/java/net/xolt/freecam/config/ModConfig.java @@ -121,49 +121,52 @@ public static class NotificationConfig { } public enum FlightMode implements SelectionListEntry.Translatable { - CREATIVE("text.autoconfig.freecam.option.movement.flightMode.creative"), - DEFAULT("text.autoconfig.freecam.option.movement.flightMode.default"); + CREATIVE("creative"), + DEFAULT("default"); - private final String name; + private final String key; FlightMode(String name) { - this.name = name; + this.key = "text.autoconfig.freecam.option.movement.flightMode." + name; } - public String getKey() { - return name; + @Override + public @NotNull String getKey() { + return key; } } public enum InteractionMode implements SelectionListEntry.Translatable { - CAMERA("text.autoconfig.freecam.option.utility.interactionMode.camera"), - PLAYER("text.autoconfig.freecam.option.utility.interactionMode.player"); + CAMERA("camera"), + PLAYER("player"); - private final String name; + private final String key; InteractionMode(String name) { - this.name = name; + this.key = "text.autoconfig.freecam.option.utility.interactionMode." + name; } - public String getKey() { - return name; + @Override + public @NotNull String getKey() { + return key; } } public enum Perspective implements SelectionListEntry.Translatable { - FIRST_PERSON("text.autoconfig.freecam.option.visual.perspective.firstPerson"), - THIRD_PERSON("text.autoconfig.freecam.option.visual.perspective.thirdPerson"), - THIRD_PERSON_MIRROR("text.autoconfig.freecam.option.visual.perspective.thirdPersonMirror"), - INSIDE("text.autoconfig.freecam.option.visual.perspective.inside"); + FIRST_PERSON("firstPerson"), + THIRD_PERSON("thirdPerson"), + THIRD_PERSON_MIRROR("thirdPersonMirror"), + INSIDE("inside"); - private final String name; + private final String key; Perspective(String name) { - this.name = name; + this.key = "text.autoconfig.freecam.option.visual.perspective." + name; } - public String getKey() { - return name; + @Override + public @NotNull String getKey() { + return key; } } } From 46a15c97080d2fcee90f2fbb73fdc80e905dfb63 Mon Sep 17 00:00:00 2001 From: Matt Sturgeon Date: Sun, 3 Dec 2023 01:17:49 +0000 Subject: [PATCH 2/2] Disable redundant collision settings When "Ignore All Collision" is `ON`, "Ignore Transparent" and "Ignore Openable" will be disabled using the experimental Cloth Config requirements API. --- CHANGELOG.md | 1 + .../net/xolt/freecam/config/ModConfig.java | 4 +- .../config/gui/AutoConfigExtensions.java | 1 + .../xolt/freecam/config/gui/Requirements.java | 67 +++++++++++++++++++ 4 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 common/src/main/java/net/xolt/freecam/config/gui/Requirements.java diff --git a/CHANGELOG.md b/CHANGELOG.md index ac6f0c780..b14f2b32b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and Freecam's versioning is based on [Semantic Versioning](https://semver.org/sp ### Changed - Movement speed options now use sliders instead of text fields ([#190](https://github.com/MinecraftFreecam/Freecam/pull/190)). +- Redundant collision options are now dynamically hidden ([#121](https://github.com/MinecraftFreecam/Freecam/pull/121)). ### Removed diff --git a/common/src/main/java/net/xolt/freecam/config/ModConfig.java b/common/src/main/java/net/xolt/freecam/config/ModConfig.java index 5fb59e450..0fe50e1f9 100644 --- a/common/src/main/java/net/xolt/freecam/config/ModConfig.java +++ b/common/src/main/java/net/xolt/freecam/config/ModConfig.java @@ -55,10 +55,10 @@ public static class MovementConfig { public CollisionConfig collision = new CollisionConfig(); public static class CollisionConfig { @ConfigEntry.Gui.Tooltip - public boolean ignoreTransparent = true; + public boolean ignoreTransparent = false; @ConfigEntry.Gui.Tooltip - public boolean ignoreOpenable = true; + public boolean ignoreOpenable = false; @VariantTooltip(variant = "normal", count = 2) @VariantTooltip(variant = "modrinth", count = 3) diff --git a/common/src/main/java/net/xolt/freecam/config/gui/AutoConfigExtensions.java b/common/src/main/java/net/xolt/freecam/config/gui/AutoConfigExtensions.java index 03a3cafb8..3cb927d93 100644 --- a/common/src/main/java/net/xolt/freecam/config/gui/AutoConfigExtensions.java +++ b/common/src/main/java/net/xolt/freecam/config/gui/AutoConfigExtensions.java @@ -22,6 +22,7 @@ private AutoConfigExtensions() {} public static void apply(Class configClass) { GuiRegistry registry = AutoConfig.getGuiRegistry(configClass); + Requirements.apply(registry); ModBindingsConfigImpl.apply(registry); VariantTooltipImpl.apply(registry); BoundedContinuousImpl.apply(registry); diff --git a/common/src/main/java/net/xolt/freecam/config/gui/Requirements.java b/common/src/main/java/net/xolt/freecam/config/gui/Requirements.java new file mode 100644 index 000000000..19c64f331 --- /dev/null +++ b/common/src/main/java/net/xolt/freecam/config/gui/Requirements.java @@ -0,0 +1,67 @@ +package net.xolt.freecam.config.gui; + +import me.shedaniel.autoconfig.gui.registry.GuiRegistry; +import me.shedaniel.clothconfig2.api.ValueHolder; +import me.shedaniel.clothconfig2.gui.entries.BooleanListEntry; +import net.xolt.freecam.variant.api.BuildVariant; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.List; + +import static java.lang.Boolean.FALSE; + +@SuppressWarnings("UnstableApiUsage") +class Requirements { + + private static final Logger LOGGER = LogManager.getLogger(); + private static ValueHolder ignoreAllWidget; + + private Requirements() {} + + static void apply(GuiRegistry guiRegistry) { + // FIXME These transformers assume that no subsequent GUI transformers will replace + // the widgets. That's fine, so long as nothing changes, however a dedicated + // AutoConfig requirements API would be better. + // + // NOTE The Cloth Config Requirements API is currently marked "unstable", although + // significant changes seem unlikely. + + // Register a transformer to capture the ignoreAll GUI + guiRegistry.registerPredicateTransformer((guis, i18n, field, config, defaults, registry) -> { + // Filter out unrelated widgets, such as PrefixText. + // Also allows us to safely cast. + List widgets = guis.stream() + .filter(BooleanListEntry.class::isInstance) + .map(BooleanListEntry.class::cast) + .toList(); + if (widgets.isEmpty()) { + LOGGER.error("Unable to find ignoreAll widget."); + return guis; + } + if (widgets.size() > 1) { + LOGGER.warn("Multiple ignoreAll widgets, choosing first."); + } + ignoreAllWidget = widgets.get(0); + return guis; + }, field -> field.getName().equals("ignoreAll")); + + // Register a transformer to set requirements for ignoreTransparent & ignoreOpenable + guiRegistry.registerPredicateTransformer((guis, i18n, field, config, defaults, registry) -> { + if (BuildVariant.getInstance().name().equals("modrinth")) { + // Disabling doesn't make sense on the modrinth build + return guis; + } + guis.stream() + .filter(BooleanListEntry.class::isInstance) + .map(BooleanListEntry.class::cast) + .forEach(gui -> gui.setRequirement(Requirements::notIgnoreAll)); + return guis; + }, field -> List.of("ignoreTransparent", "ignoreOpenable").contains(field.getName())); + } + + // Requirement handler: require ignoreAll is set to "No" + private static boolean notIgnoreAll() { + return ignoreAllWidget == null || FALSE.equals(ignoreAllWidget.getValue()); + } +}