From c0c35ed81ee1d12a991b350749a11ea847909ebc Mon Sep 17 00:00:00 2001 From: Frank Date: Sun, 18 Jun 2023 17:11:58 +0200 Subject: [PATCH] [Change] Made World Customization Screen more compatible with other Mods. (#93) --- .../client/gui/screens/WorldSetupScreen.java | 6 +++- .../bclib/mixin/client/PresetEditorMixin.java | 25 ---------------- .../client/WorldCreationUIStateMixin.java | 28 ++++++++++++++++++ .../worldPreset/TogetherWorldPreset.java | 29 ++++++++++++++++--- .../client/WorldPresetsClient.java | 26 ++++++++++++++++- src/main/resources/bclib.mixins.client.json | 2 +- 6 files changed, 84 insertions(+), 32 deletions(-) delete mode 100644 src/main/java/org/betterx/bclib/mixin/client/PresetEditorMixin.java create mode 100644 src/main/java/org/betterx/bclib/mixin/client/WorldCreationUIStateMixin.java diff --git a/src/main/java/org/betterx/bclib/client/gui/screens/WorldSetupScreen.java b/src/main/java/org/betterx/bclib/client/gui/screens/WorldSetupScreen.java index 4eb72fd7..16f7dae8 100644 --- a/src/main/java/org/betterx/bclib/client/gui/screens/WorldSetupScreen.java +++ b/src/main/java/org/betterx/bclib/client/gui/screens/WorldSetupScreen.java @@ -301,13 +301,17 @@ public class WorldSetupScreen extends LayoutScreen { final WorldCreationUiState acc = createWorldScreen.getUiState(); final Holder configuredPreset = acc.getWorldType().preset(); if (configuredPreset != null && configuredPreset.value() instanceof TogetherWorldPreset worldPreset) { + ResourceKey key = configuredPreset.unwrapKey().orElse(null); + if (key == null) key = worldPreset.parentKey; + acc.setWorldType(new WorldCreationUiState.WorldTypeEntry(Holder.direct( worldPreset.withDimensions( createWorldScreen .getUiState() .getSettings() .selectedDimensions() - .dimensions() + .dimensions(), + key ) ))); } diff --git a/src/main/java/org/betterx/bclib/mixin/client/PresetEditorMixin.java b/src/main/java/org/betterx/bclib/mixin/client/PresetEditorMixin.java deleted file mode 100644 index 694741e8..00000000 --- a/src/main/java/org/betterx/bclib/mixin/client/PresetEditorMixin.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.betterx.bclib.mixin.client; - -import net.minecraft.client.gui.screens.worldselection.PresetEditor; - -import com.google.common.collect.Maps; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -import java.util.Map; - - -@Mixin(PresetEditor.class) -interface PresetEditorMixin { - //Make Sure the PresetEditor.EDITORS Field is a mutable List. Allows us to add new Custom WorldPreset UIs in - //WorldPresetsUI - @Redirect(method = "", at = @At(value = "INVOKE", target = "Ljava/util/Map;of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;")) - private static Map bcl_foo(K k1, V v1, K k2, V v2) { - Map a = Maps.newHashMap(); - a.put(k1, v1); - a.put(k2, v2); - return a; - } - -} \ No newline at end of file diff --git a/src/main/java/org/betterx/bclib/mixin/client/WorldCreationUIStateMixin.java b/src/main/java/org/betterx/bclib/mixin/client/WorldCreationUIStateMixin.java new file mode 100644 index 00000000..30e33926 --- /dev/null +++ b/src/main/java/org/betterx/bclib/mixin/client/WorldCreationUIStateMixin.java @@ -0,0 +1,28 @@ +package org.betterx.bclib.mixin.client; + +import org.betterx.worlds.together.worldPreset.client.WorldPresetsClient; + +import net.minecraft.client.gui.screens.worldselection.PresetEditor; +import net.minecraft.client.gui.screens.worldselection.WorldCreationUiState; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Environment(EnvType.CLIENT) +@Mixin(WorldCreationUiState.class) +public abstract class WorldCreationUIStateMixin { + @Shadow + public abstract WorldCreationUiState.WorldTypeEntry getWorldType(); + + @Inject(method = "getPresetEditor", at = @At("HEAD"), cancellable = true) + private void bclib_getPresetEditor(CallbackInfoReturnable cir) { + final PresetEditor editor = WorldPresetsClient.getSetupScreenForPreset(this.getWorldType().preset()); + if (editor != null) cir.setReturnValue(editor); + } +} diff --git a/src/main/java/org/betterx/worlds/together/worldPreset/TogetherWorldPreset.java b/src/main/java/org/betterx/worlds/together/worldPreset/TogetherWorldPreset.java index 77b4110f..d535446c 100644 --- a/src/main/java/org/betterx/worlds/together/worldPreset/TogetherWorldPreset.java +++ b/src/main/java/org/betterx/worlds/together/worldPreset/TogetherWorldPreset.java @@ -36,22 +36,40 @@ public class TogetherWorldPreset extends WorldPreset { private static int NEXT_IN_SORT_ORDER = 1000; private final WorldDimensions worldDimensions; - + @Nullable + public final ResourceKey parentKey; public TogetherWorldPreset( Map, LevelStem> map, Optional sortOrder ) { - this(map, sortOrder.orElse(NEXT_IN_SORT_ORDER++)); + this(map, sortOrder.orElse(NEXT_IN_SORT_ORDER++), null); + } + + public TogetherWorldPreset( + Map, LevelStem> map, + Optional sortOrder, + @Nullable ResourceKey parentKey + ) { + this(map, sortOrder.orElse(NEXT_IN_SORT_ORDER++), parentKey); } public TogetherWorldPreset( Map, LevelStem> map, int sortOrder + ) { + this(map, sortOrder, null); + } + + public TogetherWorldPreset( + Map, LevelStem> map, + int sortOrder, + @Nullable ResourceKey parentKey ) { super(map); this.sortOrder = sortOrder; this.worldDimensions = buildWorldDimensions(map); + this.parentKey = parentKey; } public static WorldDimensions buildWorldDimensions(Map, LevelStem> map) { @@ -67,14 +85,17 @@ public class TogetherWorldPreset extends WorldPreset { return this.worldDimensions; } - public TogetherWorldPreset withDimensions(Registry dimensions) { + public TogetherWorldPreset withDimensions( + Registry dimensions, + @Nullable ResourceKey parentKey + ) { Map, LevelStem> map = new HashMap<>(); for (var entry : dimensions.entrySet()) { ResourceKey key = entry.getKey(); LevelStem stem = entry.getValue(); map.put(key, stem); } - return new TogetherWorldPreset(map, sortOrder); + return new TogetherWorldPreset(map, sortOrder, parentKey); } private Map, LevelStem> getDimensions() { diff --git a/src/main/java/org/betterx/worlds/together/worldPreset/client/WorldPresetsClient.java b/src/main/java/org/betterx/worlds/together/worldPreset/client/WorldPresetsClient.java index e65a8803..ed5b437c 100644 --- a/src/main/java/org/betterx/worlds/together/worldPreset/client/WorldPresetsClient.java +++ b/src/main/java/org/betterx/worlds/together/worldPreset/client/WorldPresetsClient.java @@ -1,22 +1,46 @@ package org.betterx.worlds.together.worldPreset.client; +import org.betterx.worlds.together.worldPreset.TogetherWorldPreset; + import net.minecraft.client.gui.screens.worldselection.PresetEditor; +import net.minecraft.core.Holder; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.levelgen.presets.WorldPreset; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import java.util.HashMap; +import java.util.Map; import java.util.Optional; @Environment(EnvType.CLIENT) public class WorldPresetsClient { + private static final Map>, PresetEditor> EDITORS = new HashMap<>(); + public static void registerCustomizeUI(ResourceKey key, PresetEditor setupScreen) { if (setupScreen != null) { - PresetEditor.EDITORS.put(Optional.of(key), setupScreen); + EDITORS.put(Optional.of(key), setupScreen); } } + public static PresetEditor getSetupScreenForPreset(Holder holder) { + if (holder != null) { + PresetEditor editor = EDITORS.get(holder.unwrapKey()); + + if (editor == null + && holder.isBound() + && holder.value() instanceof TogetherWorldPreset preset + && preset.parentKey != null + ) { + editor = EDITORS.get(Optional.of(preset.parentKey)); + } + + return editor; + } + return null; + } + public static void setupClientside() { } } diff --git a/src/main/resources/bclib.mixins.client.json b/src/main/resources/bclib.mixins.client.json index 8bd09e53..25c8491d 100644 --- a/src/main/resources/bclib.mixins.client.json +++ b/src/main/resources/bclib.mixins.client.json @@ -13,7 +13,7 @@ "LevelRendererMixin", "MinecraftMixin", "ModelManagerMixin", - "PresetEditorMixin", + "WorldCreationUIStateMixin", "boat.BoatRendererMixin" ], "injectors": {