Skip to content

Commit ee3c73c

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 35378bb commit ee3c73c

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
@@ -45,7 +45,7 @@ private static Identifier id(String path) {
4545
private static final Identifier SODIUM_FULLSCREEN_OPTION_ID = Identifier.parse("sodium:general.fullscreen");
4646
private static final Identifier SODIUM_FULLSCREEN_RESOLUTION_OPTION_ID = Identifier.parse("sodium:general.fullscreen_resolution");
4747
private static final Identifier SODIUM_VSYNC_OPTION_ID = Identifier.parse("sodium:general.vsync");
48-
private static final List<Identifier> DEFAULT_DIMENSION_IDS = List.of(
48+
private static final List<Identifier> DEFAULT_DIMENSION_EFFECT_IDS = List.of(
4949
Level.OVERWORLD.identifier(),
5050
Level.NETHER.identifier(),
5151
Level.END.identifier()
@@ -105,6 +105,36 @@ private static SodiumExtraGameOptions.AtmosphericFogSettings createDimensionFogS
105105
return settings;
106106
}
107107

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

515545
SodiumExtraGameOptions.FogSettings fogSettings = fogSettings();
516-
DEFAULT_DIMENSION_IDS.stream()
517-
.filter(identifier -> !fogSettings.dimensionOverrides.containsKey(identifier))
518-
.forEach(identifier -> fogSettings.dimensionOverrides.put(identifier, createDimensionFogSettings()));
546+
List<Identifier> dimensionFogEffectIds = getDimensionFogEffectIds(fogSettings);
519547

520548
page.addOptionGroup(builder.createOptionGroup()
521549
.addOption(builder.createBooleanOption(ADVANCED_FOG_OPTION_ID)
@@ -603,9 +631,7 @@ private OptionPageBuilder createRenderPage(ConfigBuilder builder) {
603631
);
604632

605633
OptionGroupBuilder dimensionFogGroup = builder.createOptionGroup();
606-
fogSettings.dimensionOverrides.keySet().stream()
607-
.sorted(Comparator.comparing(Identifier::toString))
608-
.forEach(identifier -> dimensionFogGroup.addOption(builder.createIntegerOption(id("fog." + identifier.toLanguageKey("options.dimensions")))
634+
dimensionFogEffectIds.forEach(identifier -> dimensionFogGroup.addOption(builder.createIntegerOption(id("fog." + identifier.toLanguageKey("options.dimensions")))
609635
.setEnabledProvider(
610636
SodiumExtraConfig::isDimensionFogOptionEnabled,
611637
ADVANCED_FOG_OPTION_ID,
@@ -623,7 +649,9 @@ private OptionPageBuilder createRenderPage(ConfigBuilder builder) {
623649
)
624650
.setDefaultValue(0)
625651
));
626-
page.addOptionGroup(dimensionFogGroup);
652+
if (!dimensionFogEffectIds.isEmpty()) {
653+
page.addOptionGroup(dimensionFogGroup);
654+
}
627655

628656
page.addOptionGroup(builder.createOptionGroup()
629657
.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<Identifier, AtmosphericFogSettings> sanitizedDimensionOverrides = new Object2ObjectArrayMap<>(this.dimensionOverrides.size());
356+
for (Map.Entry<Identifier, AtmosphericFogSettings> entry : this.dimensionOverrides.entrySet()) {
357+
Identifier 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: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,11 @@ public enum ProtectedFogType {
4141

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

4851
public static int getFogDistance(ClientLevel level) {

0 commit comments

Comments
 (0)