[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;
|
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 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.client.gui.screens.worldselection.WorldGenSettingsComponent;
|
||||||
import net.minecraft.core.Holder;
|
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.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.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.ModifyArg;
|
import org.spongepowered.asm.mixin.injection.ModifyArg;
|
||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
@ -27,6 +37,9 @@ public abstract class WorldGenSettingsComponentMixin implements WorldGenSettings
|
||||||
@Accessor("preset")
|
@Accessor("preset")
|
||||||
public abstract void bcl_setPreset(Optional<Holder<WorldPreset>> 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;"))
|
@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) {
|
public List<Holder<WorldPreset>> bcl_SortLists(List<Holder<WorldPreset>> list) {
|
||||||
final Predicate<Holder<WorldPreset>> vanilla = (p -> p.unwrapKey()
|
final Predicate<Holder<WorldPreset>> vanilla = (p -> p.unwrapKey()
|
||||||
|
@ -38,7 +51,35 @@ public abstract class WorldGenSettingsComponentMixin implements WorldGenSettings
|
||||||
.stream()
|
.stream()
|
||||||
.filter(p -> !vanilla.test(p))
|
.filter(p -> !vanilla.test(p))
|
||||||
.collect(Collectors.toCollection(LinkedList::new));
|
.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;
|
return custom;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import net.minecraft.world.level.dimension.LevelStem;
|
||||||
import net.minecraft.world.level.levelgen.presets.WorldPreset;
|
import net.minecraft.world.level.levelgen.presets.WorldPreset;
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Mutable;
|
||||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -13,4 +14,8 @@ import java.util.Map;
|
||||||
public interface WorldPresetAccessor {
|
public interface WorldPresetAccessor {
|
||||||
@Accessor("dimensions")
|
@Accessor("dimensions")
|
||||||
Map<ResourceKey<LevelStem>, LevelStem> bcl_getDimensions();
|
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