Skip to content

Commit eb3125f

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 1dfbe1f commit eb3125f

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
@@ -46,7 +46,7 @@ private static Identifier id(String path) {
4646
private static final Identifier SODIUM_FULLSCREEN_MODE_OPTION_ID = Identifier.parse("sodium:general.fullscreen_mode");
4747
private static final Identifier SODIUM_FULLSCREEN_RESOLUTION_OPTION_ID = Identifier.parse("sodium:general.fullscreen_resolution");
4848
private static final Identifier SODIUM_VSYNC_OPTION_ID = Identifier.parse("sodium:general.vsync");
49-
private static final List<Identifier> DEFAULT_DIMENSION_IDS = List.of(
49+
private static final List<Identifier> DEFAULT_DIMENSION_EFFECT_IDS = List.of(
5050
Level.OVERWORLD.identifier(),
5151
Level.NETHER.identifier(),
5252
Level.END.identifier()
@@ -107,6 +107,36 @@ private static SodiumExtraGameOptions.AtmosphericFogSettings createDimensionFogS
107107
return settings;
108108
}
109109

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

519549
SodiumExtraGameOptions.FogSettings fogSettings = fogSettings();
520-
DEFAULT_DIMENSION_IDS.stream()
521-
.filter(identifier -> !fogSettings.dimensionOverrides.containsKey(identifier))
522-
.forEach(identifier -> fogSettings.dimensionOverrides.put(identifier, createDimensionFogSettings()));
550+
List<Identifier> dimensionFogEffectIds = getDimensionFogEffectIds(fogSettings);
523551

524552
page.addOptionGroup(builder.createOptionGroup()
525553
.addOption(builder.createBooleanOption(ADVANCED_FOG_OPTION_ID)
@@ -607,9 +635,7 @@ private OptionPageBuilder createRenderPage(ConfigBuilder builder) {
607635
);
608636

609637
OptionGroupBuilder dimensionFogGroup = builder.createOptionGroup();
610-
fogSettings.dimensionOverrides.keySet().stream()
611-
.sorted(Comparator.comparing(Identifier::toString))
612-
.forEach(identifier -> dimensionFogGroup.addOption(builder.createIntegerOption(id("fog." + identifier.toLanguageKey("options.dimensions")))
638+
dimensionFogEffectIds.forEach(identifier -> dimensionFogGroup.addOption(builder.createIntegerOption(id("fog." + identifier.toLanguageKey("options.dimensions")))
613639
.setEnabledProvider(
614640
SodiumExtraConfig::isDimensionFogOptionEnabled,
615641
ADVANCED_FOG_OPTION_ID,
@@ -627,7 +653,9 @@ private OptionPageBuilder createRenderPage(ConfigBuilder builder) {
627653
)
628654
.setDefaultValue(0)
629655
));
630-
page.addOptionGroup(dimensionFogGroup);
656+
if (!dimensionFogEffectIds.isEmpty()) {
657+
page.addOptionGroup(dimensionFogGroup);
658+
}
631659

632660
page.addOptionGroup(builder.createOptionGroup()
633661
.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
@@ -353,14 +353,23 @@ public void sanitize() {
353353
if (this.dimensionOverrides == null) {
354354
this.dimensionOverrides = new Object2ObjectArrayMap<>();
355355
}
356-
this.dimensionOverrides.replaceAll((identifier, settings) -> {
356+
357+
Map<Identifier, AtmosphericFogSettings> sanitizedDimensionOverrides = new Object2ObjectArrayMap<>(this.dimensionOverrides.size());
358+
for (Map.Entry<Identifier, AtmosphericFogSettings> entry : this.dimensionOverrides.entrySet()) {
359+
Identifier identifier = entry.getKey();
360+
if (identifier == null) {
361+
continue;
362+
}
363+
364+
AtmosphericFogSettings settings = entry.getValue();
357365
if (settings == null) {
358366
settings = new AtmosphericFogSettings();
359367
}
360368

361369
settings.sanitize();
362-
return settings;
363-
});
370+
sanitizedDimensionOverrides.put(identifier, settings);
371+
}
372+
this.dimensionOverrides = sanitizedDimensionOverrides;
364373

365374
if (this.protectedGameplay == null) {
366375
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)