Skip to content

Commit a749f2a

Browse files
committed
fix: deduplicate fog options by dimension effects
Sanitize fog distance overrides, skip empty dimension option groups, include known custom dimensions, and key fog overrides by dimension effects id so equivalent dimensions share one option.
1 parent 45437ad commit a749f2a

3 files changed

Lines changed: 53 additions & 13 deletions

File tree

common/src/main/java/me/flashyreese/mods/sodiumextra/client/config/SodiumExtraConfig.java

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ private static Identifier id(String path) {
4747
private static final Identifier SODIUM_FULLSCREEN_MODE_OPTION_ID = Identifier.parse("sodium:general.fullscreen_mode");
4848
private static final Identifier SODIUM_FULLSCREEN_RESOLUTION_OPTION_ID = Identifier.parse("sodium:general.fullscreen_resolution");
4949
private static final Identifier SODIUM_VSYNC_OPTION_ID = Identifier.parse("sodium:general.vsync");
50-
private static final List<Identifier> DEFAULT_DIMENSION_IDS = List.of(
50+
private static final List<Identifier> DEFAULT_DIMENSION_EFFECT_IDS = List.of(
5151
Level.OVERWORLD.identifier(),
5252
Level.NETHER.identifier(),
5353
Level.END.identifier()
@@ -108,6 +108,36 @@ private static SodiumExtraGameOptions.AtmosphericFogSettings createDimensionFogS
108108
return settings;
109109
}
110110

111+
private static List<Identifier> getDimensionFogEffectIds(SodiumExtraGameOptions.FogSettings fogSettings) {
112+
Set<Identifier> identifiers = new LinkedHashSet<>(DEFAULT_DIMENSION_EFFECT_IDS);
113+
addKnownWorldDimensionEffectIds(identifiers);
114+
identifiers.addAll(fogSettings.dimensionOverrides.keySet());
115+
116+
identifiers.forEach(identifier -> fogSettings.dimensionOverrides.computeIfAbsent(identifier, ignored -> createDimensionFogSettings()));
117+
118+
return identifiers.stream()
119+
.sorted(Comparator.comparing(Identifier::toString))
120+
.toList();
121+
}
122+
123+
private static void addKnownWorldDimensionEffectIds(Set<Identifier> identifiers) {
124+
Minecraft minecraft = Minecraft.getInstance();
125+
if (minecraft == null) {
126+
return;
127+
}
128+
129+
if (minecraft.level != null) {
130+
identifiers.add(getDimensionFogEffectId(minecraft.level));
131+
}
132+
}
133+
134+
private static Identifier getDimensionFogEffectId(Level level) {
135+
return level.dimensionTypeRegistration()
136+
.unwrapKey()
137+
.map(key -> key.identifier())
138+
.orElseGet(() -> level.dimension().identifier());
139+
}
140+
111141
private static void setAtmosphericFogStart(int value) {
112142
SodiumExtraGameOptions.FogSettings fogSettings = fogSettings();
113143
int clampedValue = Math.clamp(value, 0, 100);
@@ -518,9 +548,7 @@ private OptionPageBuilder createRenderPage(ConfigBuilder builder) {
518548
.setName(Component.translatable("sodium-extra.option.render"));
519549

520550
SodiumExtraGameOptions.FogSettings fogSettings = fogSettings();
521-
DEFAULT_DIMENSION_IDS.stream()
522-
.filter(identifier -> !fogSettings.dimensionOverrides.containsKey(identifier))
523-
.forEach(identifier -> fogSettings.dimensionOverrides.put(identifier, createDimensionFogSettings()));
551+
List<Identifier> dimensionFogEffectIds = getDimensionFogEffectIds(fogSettings);
524552

525553
page.addOptionGroup(builder.createOptionGroup()
526554
.addOption(builder.createBooleanOption(ADVANCED_FOG_OPTION_ID)
@@ -608,9 +636,7 @@ private OptionPageBuilder createRenderPage(ConfigBuilder builder) {
608636
);
609637

610638
OptionGroupBuilder dimensionFogGroup = builder.createOptionGroup();
611-
fogSettings.dimensionOverrides.keySet().stream()
612-
.sorted(Comparator.comparing(Identifier::toString))
613-
.forEach(identifier -> dimensionFogGroup.addOption(builder.createIntegerOption(id("fog." + identifier.toLanguageKey("options.dimensions")))
639+
dimensionFogEffectIds.forEach(identifier -> dimensionFogGroup.addOption(builder.createIntegerOption(id("fog." + identifier.toLanguageKey("options.dimensions")))
614640
.setEnabledProvider(
615641
SodiumExtraConfig::isDimensionFogOptionEnabled,
616642
ADVANCED_FOG_OPTION_ID,
@@ -628,7 +654,9 @@ private OptionPageBuilder createRenderPage(ConfigBuilder builder) {
628654
)
629655
.setDefaultValue(0)
630656
));
631-
page.addOptionGroup(dimensionFogGroup);
657+
if (!dimensionFogEffectIds.isEmpty()) {
658+
page.addOptionGroup(dimensionFogGroup);
659+
}
632660

633661
page.addOptionGroup(builder.createOptionGroup()
634662
.addOption(builder.createBooleanOption(PROTECTED_GAMEPLAY_FOG_OPTION_ID)

common/src/main/java/me/flashyreese/mods/sodiumextra/client/config/SodiumExtraGameOptions.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -363,14 +363,23 @@ public void sanitize() {
363363
if (this.dimensionOverrides == null) {
364364
this.dimensionOverrides = new Object2ObjectArrayMap<>();
365365
}
366-
this.dimensionOverrides.replaceAll((identifier, settings) -> {
366+
367+
Map<Identifier, AtmosphericFogSettings> sanitizedDimensionOverrides = new Object2ObjectArrayMap<>(this.dimensionOverrides.size());
368+
for (Map.Entry<Identifier, AtmosphericFogSettings> entry : this.dimensionOverrides.entrySet()) {
369+
Identifier identifier = entry.getKey();
370+
if (identifier == null) {
371+
continue;
372+
}
373+
374+
AtmosphericFogSettings settings = entry.getValue();
367375
if (settings == null) {
368376
settings = new AtmosphericFogSettings();
369377
}
370378

371379
settings.sanitize();
372-
return settings;
373-
});
380+
sanitizedDimensionOverrides.put(identifier, settings);
381+
}
382+
this.dimensionOverrides = sanitizedDimensionOverrides;
374383

375384
if (this.protectedGameplay == null) {
376385
this.protectedGameplay = new ProtectedFogSettings();

common/src/main/java/me/flashyreese/mods/sodiumextra/client/fog/FogDistanceHelper.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,11 @@ public enum ProtectedFogType {
4242

4343
public static SodiumExtraGameOptions.AtmosphericFogSettings getAtmosphericSettings(ClientLevel level) {
4444
SodiumExtraGameOptions.FogSettings fogSettings = getFogSettings();
45-
Identifier dimensionId = level.dimension().identifier();
46-
return fogSettings.getAtmospheric(dimensionId);
45+
Identifier dimensionEffectsId = level.dimensionTypeRegistration()
46+
.unwrapKey()
47+
.map(key -> key.identifier())
48+
.orElseGet(() -> level.dimension().identifier());
49+
return fogSettings.getAtmospheric(dimensionEffectsId);
4750
}
4851

4952
public static int getFogDistance(ClientLevel level) {

0 commit comments

Comments
 (0)