Skip to content

Commit b1f5758

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. (cherry picked from commit a749f2a)
1 parent 9d36c45 commit b1f5758

3 files changed

Lines changed: 49 additions & 13 deletions

File tree

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

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,36 @@ private static SodiumExtraGameOptions.AtmosphericFogSettings createDimensionFogS
217217
return settings;
218218
}
219219

220+
private static List<ResourceLocation> getDimensionFogEffectIds(SodiumExtraGameOptions.FogSettings fogSettings) {
221+
Set<ResourceLocation> identifiers = new LinkedHashSet<>();
222+
WorldDimensions.keysInOrder(Stream.empty())
223+
.map(dim -> dim.location())
224+
.forEach(identifiers::add);
225+
addKnownWorldDimensionEffectIds(identifiers);
226+
identifiers.addAll(fogSettings.dimensionOverrides.keySet());
227+
228+
identifiers.forEach(identifier -> fogSettings.dimensionOverrides.computeIfAbsent(identifier, ignored -> createDimensionFogSettings()));
229+
230+
return identifiers.stream()
231+
.sorted(Comparator.comparing(ResourceLocation::toString))
232+
.toList();
233+
}
234+
235+
private static void addKnownWorldDimensionEffectIds(Set<ResourceLocation> identifiers) {
236+
Minecraft minecraft = Minecraft.getInstance();
237+
if (minecraft == null) {
238+
return;
239+
}
240+
241+
if (minecraft.level != null) {
242+
identifiers.add(minecraft.level.dimensionType().effectsLocation());
243+
}
244+
245+
if (minecraft.getSingleplayerServer() != null) {
246+
minecraft.getSingleplayerServer().getAllLevels().forEach(level -> identifiers.add(level.dimensionType().effectsLocation()));
247+
}
248+
}
249+
220250
private static void setAtmosphericFogStart(int value) {
221251
SodiumExtraGameOptions.FogSettings fogSettings = fogSettings();
222252
int clampedValue = Math.max(0, Math.min(value, 100));
@@ -515,10 +545,7 @@ private OptionPageBuilder createRenderPage(ConfigBuilder builder) {
515545
.setName(Component.translatable("sodium-extra.option.render"));
516546

517547
SodiumExtraGameOptions.FogSettings fogSettings = fogSettings();
518-
WorldDimensions.keysInOrder(Stream.empty())
519-
.map(dim -> dim.location())
520-
.filter(identifier -> !fogSettings.dimensionOverrides.containsKey(identifier))
521-
.forEach(identifier -> fogSettings.dimensionOverrides.put(identifier, createDimensionFogSettings()));
548+
List<ResourceLocation> dimensionFogEffectIds = getDimensionFogEffectIds(fogSettings);
522549

523550
page.addOptionGroup(builder.createOptionGroup()
524551
.addOption(builder.createBooleanOption(ADVANCED_FOG_OPTION_ID)
@@ -606,9 +633,7 @@ private OptionPageBuilder createRenderPage(ConfigBuilder builder) {
606633
);
607634

608635
OptionGroupBuilder dimensionFogGroup = builder.createOptionGroup();
609-
fogSettings.dimensionOverrides.keySet().stream()
610-
.sorted(Comparator.comparing(ResourceLocation::toString))
611-
.forEach(identifier -> dimensionFogGroup.addOption(builder.createIntegerOption(id("fog." + identifier.toLanguageKey("options.dimensions")))
636+
dimensionFogEffectIds.forEach(identifier -> dimensionFogGroup.addOption(builder.createIntegerOption(id("fog." + identifier.toLanguageKey("options.dimensions")))
612637
.setEnabledProvider(
613638
SodiumExtraConfig::isDimensionFogOptionEnabled,
614639
ADVANCED_FOG_OPTION_ID,
@@ -626,7 +651,9 @@ private OptionPageBuilder createRenderPage(ConfigBuilder builder) {
626651
)
627652
.setDefaultValue(0)
628653
));
629-
page.addOptionGroup(dimensionFogGroup);
654+
if (!dimensionFogEffectIds.isEmpty()) {
655+
page.addOptionGroup(dimensionFogGroup);
656+
}
630657

631658
page.addOptionGroup(builder.createOptionGroup()
632659
.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
@@ -351,14 +351,23 @@ public void sanitize() {
351351
if (this.dimensionOverrides == null) {
352352
this.dimensionOverrides = new Object2ObjectArrayMap<>();
353353
}
354-
this.dimensionOverrides.replaceAll((identifier, settings) -> {
354+
355+
Map<ResourceLocation, AtmosphericFogSettings> sanitizedDimensionOverrides = new Object2ObjectArrayMap<>(this.dimensionOverrides.size());
356+
for (Map.Entry<ResourceLocation, AtmosphericFogSettings> entry : this.dimensionOverrides.entrySet()) {
357+
ResourceLocation identifier = entry.getKey();
358+
if (identifier == null) {
359+
continue;
360+
}
361+
362+
AtmosphericFogSettings settings = entry.getValue();
355363
if (settings == null) {
356364
settings = new AtmosphericFogSettings();
357365
}
358366

359367
settings.sanitize();
360-
return settings;
361-
});
368+
sanitizedDimensionOverrides.put(identifier, settings);
369+
}
370+
this.dimensionOverrides = sanitizedDimensionOverrides;
362371

363372
if (this.protectedGameplay == null) {
364373
this.protectedGameplay = new ProtectedFogSettings();

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ private FogDistanceHelper() {
4343

4444
public static SodiumExtraGameOptions.AtmosphericFogSettings getAtmosphericSettings(ClientLevel level) {
4545
SodiumExtraGameOptions.FogSettings fogSettings = getFogSettings();
46-
ResourceLocation dimensionId = level.dimension().location();
47-
return fogSettings.getAtmospheric(dimensionId);
46+
ResourceLocation dimensionEffectsId = level.dimensionType().effectsLocation();
47+
return fogSettings.getAtmospheric(dimensionEffectsId);
4848
}
4949

5050
public static int normalizeFogDistance(int fogDistance) {

0 commit comments

Comments
 (0)