[Fix] Default World-Type on World creation screen does not include modded dimension data (#20)

This commit is contained in:
Frank 2022-07-09 00:17:17 +02:00
parent 13acf48894
commit e7df54bb5b
2 changed files with 47 additions and 1 deletions

View file

@ -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<Holder<WorldPreset>> 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<Holder<WorldPreset>> bcl_SortLists(List<Holder<WorldPreset>> list) {
final Predicate<Holder<WorldPreset>> 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<WorldPreset> 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<WorldPreset> key = p.unwrapKey().orElseThrow();
if (key.location().equals(WorldPresets.NORMAL.location())) {
ImmutableMap.Builder<ResourceKey<LevelStem>, LevelStem> map = ImmutableMap.builder();
for (Map.Entry<ResourceKey<LevelStem>, 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;
}

View file

@ -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<ResourceKey<LevelStem>, LevelStem> bcl_getDimensions();
@Accessor("dimensions")
@Mutable
void bcl_setDimensions(Map<ResourceKey<LevelStem>, LevelStem> map);
}