diff --git a/src/main/java/org/betterx/worlds/together/mixin/client/WorldGenSettingsComponentMixin.java b/src/main/java/org/betterx/worlds/together/mixin/client/WorldGenSettingsComponentMixin.java index 943c84b5..69e7e821 100644 --- a/src/main/java/org/betterx/worlds/together/mixin/client/WorldGenSettingsComponentMixin.java +++ b/src/main/java/org/betterx/worlds/together/mixin/client/WorldGenSettingsComponentMixin.java @@ -1,18 +1,28 @@ package org.betterx.worlds.together.mixin.client; +import org.betterx.worlds.together.mixin.common.WorldPresetAccessor; +import org.betterx.worlds.together.world.event.WorldBootstrap; import org.betterx.worlds.together.worldPreset.WorldGenSettingsComponentAccessor; +import net.minecraft.client.gui.screens.worldselection.WorldCreationContext; import net.minecraft.client.gui.screens.worldselection.WorldGenSettingsComponent; import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.levelgen.presets.WorldPreset; +import net.minecraft.world.level.levelgen.presets.WorldPresets; +import com.google.common.collect.ImmutableMap; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -27,6 +37,9 @@ public abstract class WorldGenSettingsComponentMixin implements WorldGenSettings @Accessor("preset") public abstract void bcl_setPreset(Optional> preset); + @Shadow + private WorldCreationContext settings; + @ModifyArg(method = "init", index = 0, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/components/CycleButton$Builder;withValues(Ljava/util/List;Ljava/util/List;)Lnet/minecraft/client/gui/components/CycleButton$Builder;")) public List> bcl_SortLists(List> list) { final Predicate> vanilla = (p -> p.unwrapKey() @@ -38,7 +51,35 @@ public abstract class WorldGenSettingsComponentMixin implements WorldGenSettings .stream() .filter(p -> !vanilla.test(p)) .collect(Collectors.toCollection(LinkedList::new)); - custom.addAll(list.stream().filter(vanilla).toList()); + + Registry registry = settings.registryAccess().registryOrThrow(Registry.WORLD_PRESET_REGISTRY); + + custom.addAll(list + .stream() + .filter(vanilla) + // this code will inject the original vanilla default dimensions into the WorldPreset list that is + // used on the world type selection button. This is supposed to mitigate the issue described + // here: https://github.com/quiqueck/BCLib/issues/20 + // it may be removed once this behaviour is fixed in either fabric or vanilla + .map(p -> { + if (WorldBootstrap.getDefaultCreateWorldPresetSettings() != null) { + ResourceKey key = p.unwrapKey().orElseThrow(); + if (key.location().equals(WorldPresets.NORMAL.location())) { + ImmutableMap.Builder, LevelStem> map = ImmutableMap.builder(); + for (Map.Entry, LevelStem> entry : WorldBootstrap.getDefaultCreateWorldPresetSettings() + .dimensions() + .entrySet()) { + map.put(entry.getKey(), entry.getValue()); + } + + if (p.value() instanceof WorldPresetAccessor ax) { + ax.bcl_setDimensions(map.build()); + } + } + } + return p; + }) + .toList()); return custom; } diff --git a/src/main/java/org/betterx/worlds/together/mixin/common/WorldPresetAccessor.java b/src/main/java/org/betterx/worlds/together/mixin/common/WorldPresetAccessor.java index 53fab46e..ff7ce286 100644 --- a/src/main/java/org/betterx/worlds/together/mixin/common/WorldPresetAccessor.java +++ b/src/main/java/org/betterx/worlds/together/mixin/common/WorldPresetAccessor.java @@ -5,6 +5,7 @@ import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.levelgen.presets.WorldPreset; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.gen.Accessor; import java.util.Map; @@ -13,4 +14,8 @@ import java.util.Map; public interface WorldPresetAccessor { @Accessor("dimensions") Map, LevelStem> bcl_getDimensions(); + + @Accessor("dimensions") + @Mutable + void bcl_setDimensions(Map, LevelStem> map); }