[Feature] Build for 1.19.4

This commit is contained in:
Frank 2023-04-08 12:53:46 +02:00
parent 8a8e73348c
commit 55930d73d5
55 changed files with 380 additions and 304 deletions

View file

@ -3,15 +3,15 @@ package org.betterx.worlds.together.mixin.client;
import org.betterx.worlds.together.world.event.WorldBootstrap;
import org.betterx.worlds.together.worldPreset.WorldPresets;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.worldselection.CreateWorldScreen;
import net.minecraft.client.gui.screens.worldselection.WorldGenSettingsComponent;
import net.minecraft.client.gui.screens.worldselection.WorldCreationContext;
import net.minecraft.client.gui.screens.worldselection.WorldCreationUiState;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.WorldDataConfiguration;
import net.minecraft.world.level.levelgen.presets.WorldPreset;
import net.minecraft.world.level.storage.LevelStorageSource;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
@ -21,26 +21,27 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.Optional;
import java.util.OptionalLong;
@Mixin(CreateWorldScreen.class)
public class CreateWorldScreen_Mixin {
public abstract class CreateWorldScreen_Mixin {
@Shadow
@Final
public WorldGenSettingsComponent worldGenSettingsComponent;
public abstract WorldCreationUiState getUiState();
@Inject(method = "<init>", at = @At("TAIL"))
private void wt_init(
Minecraft minecraft,
Screen screen,
WorldDataConfiguration worldDataConfiguration,
WorldGenSettingsComponent worldGenSettingsComponent,
WorldCreationContext worldCreationContext,
Optional optional,
OptionalLong optionalLong,
CallbackInfo ci
) {
//WorldBootstrap.InGUI.registryReadyOnNewWorld(worldGenSettingsComponent);
}
//Change the WorldPreset that is selected by default on the Create World Screen
@ModifyArg(method = "openFresh", index = 1, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/worldselection/WorldGenSettingsComponent;<init>(Lnet/minecraft/client/gui/screens/worldselection/WorldCreationContext;Ljava/util/Optional;Ljava/util/OptionalLong;)V"))
@ModifyArg(method = "openFresh", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/worldselection/CreateWorldScreen;<init>(Lnet/minecraft/client/Minecraft;Lnet/minecraft/client/gui/screens/Screen;Lnet/minecraft/client/gui/screens/worldselection/WorldCreationContext;Ljava/util/Optional;Ljava/util/OptionalLong;)V"))
private static Optional<ResourceKey<WorldPreset>> wt_NewDefault(Optional<ResourceKey<WorldPreset>> preset) {
return Optional.of(WorldPresets.getDEFAULT());
}
@ -48,7 +49,7 @@ public class CreateWorldScreen_Mixin {
//this is called when a new world is first created
@Inject(method = "createNewWorldDirectory", at = @At("RETURN"))
void wt_createNewWorld(CallbackInfoReturnable<Optional<LevelStorageSource.LevelStorageAccess>> cir) {
WorldBootstrap.InGUI.registryReadyOnNewWorld(this.worldGenSettingsComponent);
WorldBootstrap.InGUI.setupNewWorld(cir.getReturnValue(), this.worldGenSettingsComponent);
WorldBootstrap.InGUI.registryReadyOnNewWorld(this.getUiState().getSettings());
WorldBootstrap.InGUI.setupNewWorld(cir.getReturnValue(), this.getUiState());
}
}

View file

@ -1,78 +0,0 @@
package org.betterx.worlds.together.mixin.client;
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.world.level.levelgen.presets.WorldPreset;
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.Inject;
import org.spongepowered.asm.mixin.injection.ModifyArg;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import java.util.OptionalLong;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@Mixin(WorldGenSettingsComponent.class)
public abstract class WorldGenSettingsComponentMixin implements WorldGenSettingsComponentAccessor {
@Override
@Accessor("preset")
public abstract Optional<Holder<WorldPreset>> bcl_getPreset();
@Override
@Accessor("preset")
public abstract void bcl_setPreset(Optional<Holder<WorldPreset>> preset);
@Shadow
private WorldCreationContext settings;
@Shadow
public abstract void updateSettings(WorldCreationContext.DimensionsUpdater dimensionsUpdater);
@Shadow
private Optional<Holder<WorldPreset>> preset;
@Inject(method = "<init>", at = @At("TAIL"))
public void wt_init(
WorldCreationContext worldCreationContext,
Optional worldPreset,
OptionalLong seed,
CallbackInfo ci
) {
if (this.preset.isPresent()) {
//make sure the initial dimensions are in sync with the selected World Preset
this.updateSettings((frozen, worldDimensions) -> this.preset.get().value().createWorldDimensions());
}
}
@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()
.orElseThrow()
.location()
.getNamespace()
.equals("minecraft"));
List<Holder<WorldPreset>> custom = list
.stream()
.filter(p -> !vanilla.test(p))
.collect(Collectors.toCollection(LinkedList::new));
custom.addAll(list
.stream()
.filter(vanilla)
.toList());
return custom;
}
}

View file

@ -4,10 +4,8 @@ import net.minecraft.core.Holder;
import net.minecraft.world.level.levelgen.WorldDimensions;
import net.minecraft.world.level.levelgen.presets.WorldPreset;
import java.util.Optional;
public class AdaptWorldPresetSettingEvent extends EventImpl<OnAdaptWorldPresetSettings> {
public Optional<Holder<WorldPreset>> emit(Optional<Holder<WorldPreset>> start, WorldDimensions worldDims) {
public Holder<WorldPreset> emit(Holder<WorldPreset> start, WorldDimensions worldDims) {
for (OnAdaptWorldPresetSettings a : handlers) {
start = a.adapt(start, worldDims);
}

View file

@ -4,12 +4,10 @@ import net.minecraft.core.Holder;
import net.minecraft.world.level.levelgen.WorldDimensions;
import net.minecraft.world.level.levelgen.presets.WorldPreset;
import java.util.Optional;
@FunctionalInterface
public interface OnAdaptWorldPresetSettings {
Optional<Holder<WorldPreset>> adapt(
Optional<Holder<WorldPreset>> currentPreset,
Holder<WorldPreset> adapt(
Holder<WorldPreset> currentPreset,
WorldDimensions worldDims
);
}

View file

@ -9,10 +9,10 @@ import org.betterx.worlds.together.mixin.common.WorldPresetAccessor;
import org.betterx.worlds.together.surfaceRules.SurfaceRuleUtil;
import org.betterx.worlds.together.world.WorldConfig;
import org.betterx.worlds.together.worldPreset.TogetherWorldPreset;
import org.betterx.worlds.together.worldPreset.WorldGenSettingsComponentAccessor;
import org.betterx.worlds.together.worldPreset.WorldPresets;
import net.minecraft.client.gui.screens.worldselection.WorldGenSettingsComponent;
import net.minecraft.client.gui.screens.worldselection.WorldCreationContext;
import net.minecraft.client.gui.screens.worldselection.WorldCreationUiState;
import net.minecraft.core.Holder;
import net.minecraft.core.LayeredRegistryAccess;
import net.minecraft.core.Registry;
@ -94,14 +94,14 @@ public class WorldBootstrap {
return dimensions;
}
private static Optional<Holder<WorldPreset>> presetFromDatapack(Optional<Holder<WorldPreset>> currentPreset) {
if (currentPreset.isPresent() && LAST_REGISTRY_ACCESS != null) {
var presetKey = currentPreset.get().unwrapKey();
private static Holder<WorldPreset> presetFromDatapack(Holder<WorldPreset> currentPreset) {
if (currentPreset != null && LAST_REGISTRY_ACCESS != null) {
Optional<ResourceKey<WorldPreset>> presetKey = currentPreset.unwrapKey();
if (presetKey.isPresent()) {
Optional<Holder.Reference<WorldPreset>> newPreset = LAST_REGISTRY_ACCESS
.registryOrThrow(Registries.WORLD_PRESET)
.getHolder(presetKey.get());
if (newPreset.isPresent()) currentPreset = (Optional<Holder<WorldPreset>>) (Optional<?>) newPreset;
currentPreset = newPreset.orElse(null);
}
}
return currentPreset;
@ -126,7 +126,7 @@ public class WorldBootstrap {
true, true
);
Optional<Holder<WorldPreset>> currentPreset = Optional.of(Helpers.defaultServerPreset());
Holder<WorldPreset> currentPreset = Helpers.defaultServerPreset();
writeWorldPresets(dimensions, currentPreset);
finishedWorldLoad();
} else {
@ -155,8 +155,8 @@ public class WorldBootstrap {
}
public static class InGUI {
public static void registryReadyOnNewWorld(WorldGenSettingsComponent worldGenSettingsComponent) {
Helpers.onRegistryReady(worldGenSettingsComponent.registryHolder());
public static void registryReadyOnNewWorld(WorldCreationContext worldGenSettingsComponent) {
Helpers.onRegistryReady(worldGenSettingsComponent.worldgenLoadContext());
}
public static void registryReady(RegistryAccess access) {
@ -165,22 +165,19 @@ public class WorldBootstrap {
public static void setupNewWorld(
Optional<LevelStorageSource.LevelStorageAccess> levelStorageAccess,
WorldGenSettingsComponent worldGenSettingsComponent
WorldCreationUiState uiState
) {
if (levelStorageAccess.isPresent()) {
if (worldGenSettingsComponent instanceof WorldGenSettingsComponentAccessor acc) {
Optional<Holder<WorldPreset>> currentPreset = acc.bcl_getPreset();
currentPreset = Helpers.presetFromDatapack(currentPreset);
Optional<Holder<WorldPreset>> newPreset = setupNewWorldCommon(
levelStorageAccess.get(),
currentPreset,
worldGenSettingsComponent.settings().selectedDimensions()
);
if (newPreset != currentPreset) {
acc.bcl_setPreset(newPreset);
}
} else {
WorldsTogether.LOGGER.error("Unable to access WorldGenSettingsComponent.");
Holder<WorldPreset> currentPreset = uiState.getWorldType().preset();
currentPreset = Helpers.presetFromDatapack(currentPreset);
Holder<WorldPreset> newPreset = setupNewWorldCommon(
levelStorageAccess.get(),
currentPreset,
uiState.getSettings().selectedDimensions()
);
if (newPreset != null && newPreset != currentPreset) {
uiState.setWorldType(new WorldCreationUiState.WorldTypeEntry(newPreset));
}
} else {
WorldsTogether.LOGGER.error("Unable to access Level Folder.");
@ -188,13 +185,13 @@ public class WorldBootstrap {
}
static Optional<Holder<WorldPreset>> setupNewWorldCommon(
static Holder<WorldPreset> setupNewWorldCommon(
LevelStorageSource.LevelStorageAccess levelStorageAccess,
Optional<Holder<WorldPreset>> currentPreset,
Holder<WorldPreset> currentPreset,
WorldDimensions worldDims
) {
final WorldDimensions dimensions;
if (currentPreset.map(Holder::value).orElse(null) instanceof TogetherWorldPreset t) {
if (currentPreset.value() instanceof TogetherWorldPreset t) {
dimensions = t.getWorldDimensions();
} else {
dimensions = TogetherWorldPreset.getWorldDimensions(net.minecraft.world.level.levelgen.presets.WorldPresets.NORMAL);
@ -251,7 +248,7 @@ public class WorldBootstrap {
String levelID,
WorldDimensions worldDims,
LevelStorageSource levelSource,
Optional<Holder<WorldPreset>> worldPreset
Holder<WorldPreset> worldPreset
) {
try {
var levelStorageAccess = levelSource.createAccess(levelID);
@ -280,10 +277,10 @@ public class WorldBootstrap {
}
}
private static void writeWorldPresets(WorldDimensions dimensions, Optional<Holder<WorldPreset>> currentPreset) {
private static void writeWorldPresets(WorldDimensions dimensions, Holder<WorldPreset> currentPreset) {
currentPreset = WorldEventsImpl.ADAPT_WORLD_PRESET.emit(currentPreset, dimensions);
if (currentPreset.map(Holder::value).orElse(null) instanceof WorldPresetAccessor acc) {
if (currentPreset != null && currentPreset.value() instanceof WorldPresetAccessor acc) {
TogetherWorldPreset.writeWorldPresetSettings(acc.bcl_getDimensions());
} else {
WorldsTogether.LOGGER.error("Failed writing together File");

View file

@ -1,11 +0,0 @@
package org.betterx.worlds.together.worldPreset;
import net.minecraft.core.Holder;
import net.minecraft.world.level.levelgen.presets.WorldPreset;
import java.util.Optional;
public interface WorldGenSettingsComponentAccessor {
Optional<Holder<WorldPreset>> bcl_getPreset();
void bcl_setPreset(Optional<Holder<WorldPreset>> preset);
}

View file

@ -11,10 +11,7 @@ import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeSource;
import net.minecraft.world.level.biome.MultiNoiseBiomeSource;
import net.minecraft.world.level.biome.TheEndBiomeSource;
import net.minecraft.world.level.biome.*;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.dimension.BuiltinDimensionTypes;
import net.minecraft.world.level.dimension.DimensionType;
@ -69,7 +66,10 @@ public class WorldPresets {
public final WorldGenUtil.Context netherContext;
public final WorldGenUtil.Context endContext;
public final HolderGetter<MultiNoiseBiomeSourceParameterList> parameterLists;
public BootstrapData(BootstapContext<WorldPreset> bootstapContext) {
this.parameterLists = bootstapContext.lookup(Registries.MULTI_NOISE_BIOME_SOURCE_PARAMETER_LIST);
final HolderGetter<DimensionType> dimensionTypes = bootstapContext.lookup(Registries.DIMENSION_TYPE);
this.noiseSettings = bootstapContext.lookup(Registries.NOISE_SETTINGS);
@ -78,16 +78,20 @@ public class WorldPresets {
this.structureSets = bootstapContext.lookup(Registries.STRUCTURE_SET);
this.overworldDimensionType = dimensionTypes.getOrThrow(BuiltinDimensionTypes.OVERWORLD);
MultiNoiseBiomeSource overworldBiomeSource = MultiNoiseBiomeSource.Preset.OVERWORLD.biomeSource(this.biomes);
Holder.Reference<MultiNoiseBiomeSourceParameterList> overworldParameters = parameterLists
.getOrThrow(MultiNoiseBiomeSourceParameterLists.OVERWORLD);
MultiNoiseBiomeSource overworldBiomeSource = MultiNoiseBiomeSource.createFromPreset(overworldParameters);
Holder<NoiseGeneratorSettings> defaultOverworldNoise = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.OVERWORLD);
this.overworldStem = makeNoiseBasedOverworld(overworldBiomeSource, defaultOverworldNoise);
this.netherDimensionType = dimensionTypes.getOrThrow(BuiltinDimensionTypes.NETHER);
Holder.Reference<MultiNoiseBiomeSourceParameterList> netherParameters = parameterLists
.getOrThrow(MultiNoiseBiomeSourceParameterLists.NETHER);
Holder<NoiseGeneratorSettings> defaultNetherNoise = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.NETHER);
this.netherStem = new LevelStem(
netherDimensionType,
new NoiseBasedChunkGenerator(
MultiNoiseBiomeSource.Preset.NETHER.biomeSource(this.biomes),
MultiNoiseBiomeSource.createFromPreset(netherParameters),
defaultNetherNoise
)
);