[Fix] Default World-Type on World creation screen does not include modded dimension data (#20)
This commit is contained in:
parent
13acf48894
commit
e7df54bb5b
2 changed files with 47 additions and 1 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue