[Change] Made World Customization Screen more compatible with other Mods. (#93)

This commit is contained in:
Frank 2023-06-18 17:11:58 +02:00
parent dbd6db0f86
commit c0c35ed81e
6 changed files with 84 additions and 32 deletions

View file

@ -301,13 +301,17 @@ public class WorldSetupScreen extends LayoutScreen {
final WorldCreationUiState acc = createWorldScreen.getUiState(); final WorldCreationUiState acc = createWorldScreen.getUiState();
final Holder<WorldPreset> configuredPreset = acc.getWorldType().preset(); final Holder<WorldPreset> configuredPreset = acc.getWorldType().preset();
if (configuredPreset != null && configuredPreset.value() instanceof TogetherWorldPreset worldPreset) { if (configuredPreset != null && configuredPreset.value() instanceof TogetherWorldPreset worldPreset) {
ResourceKey<WorldPreset> key = configuredPreset.unwrapKey().orElse(null);
if (key == null) key = worldPreset.parentKey;
acc.setWorldType(new WorldCreationUiState.WorldTypeEntry(Holder.direct( acc.setWorldType(new WorldCreationUiState.WorldTypeEntry(Holder.direct(
worldPreset.withDimensions( worldPreset.withDimensions(
createWorldScreen createWorldScreen
.getUiState() .getUiState()
.getSettings() .getSettings()
.selectedDimensions() .selectedDimensions()
.dimensions() .dimensions(),
key
) )
))); )));
} }

View file

@ -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 = "<clinit>", 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 <K, V> Map<K, V> bcl_foo(K k1, V v1, K k2, V v2) {
Map<K, V> a = Maps.newHashMap();
a.put(k1, v1);
a.put(k2, v2);
return a;
}
}

View file

@ -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<PresetEditor> cir) {
final PresetEditor editor = WorldPresetsClient.getSetupScreenForPreset(this.getWorldType().preset());
if (editor != null) cir.setReturnValue(editor);
}
}

View file

@ -36,22 +36,40 @@ public class TogetherWorldPreset extends WorldPreset {
private static int NEXT_IN_SORT_ORDER = 1000; private static int NEXT_IN_SORT_ORDER = 1000;
private final WorldDimensions worldDimensions; private final WorldDimensions worldDimensions;
@Nullable
public final ResourceKey<WorldPreset> parentKey;
public TogetherWorldPreset( public TogetherWorldPreset(
Map<ResourceKey<LevelStem>, LevelStem> map, Map<ResourceKey<LevelStem>, LevelStem> map,
Optional<Integer> sortOrder Optional<Integer> sortOrder
) { ) {
this(map, sortOrder.orElse(NEXT_IN_SORT_ORDER++)); this(map, sortOrder.orElse(NEXT_IN_SORT_ORDER++), null);
}
public TogetherWorldPreset(
Map<ResourceKey<LevelStem>, LevelStem> map,
Optional<Integer> sortOrder,
@Nullable ResourceKey<WorldPreset> parentKey
) {
this(map, sortOrder.orElse(NEXT_IN_SORT_ORDER++), parentKey);
} }
public TogetherWorldPreset( public TogetherWorldPreset(
Map<ResourceKey<LevelStem>, LevelStem> map, Map<ResourceKey<LevelStem>, LevelStem> map,
int sortOrder int sortOrder
) {
this(map, sortOrder, null);
}
public TogetherWorldPreset(
Map<ResourceKey<LevelStem>, LevelStem> map,
int sortOrder,
@Nullable ResourceKey<WorldPreset> parentKey
) { ) {
super(map); super(map);
this.sortOrder = sortOrder; this.sortOrder = sortOrder;
this.worldDimensions = buildWorldDimensions(map); this.worldDimensions = buildWorldDimensions(map);
this.parentKey = parentKey;
} }
public static WorldDimensions buildWorldDimensions(Map<ResourceKey<LevelStem>, LevelStem> map) { public static WorldDimensions buildWorldDimensions(Map<ResourceKey<LevelStem>, LevelStem> map) {
@ -67,14 +85,17 @@ public class TogetherWorldPreset extends WorldPreset {
return this.worldDimensions; return this.worldDimensions;
} }
public TogetherWorldPreset withDimensions(Registry<LevelStem> dimensions) { public TogetherWorldPreset withDimensions(
Registry<LevelStem> dimensions,
@Nullable ResourceKey<WorldPreset> parentKey
) {
Map<ResourceKey<LevelStem>, LevelStem> map = new HashMap<>(); Map<ResourceKey<LevelStem>, LevelStem> map = new HashMap<>();
for (var entry : dimensions.entrySet()) { for (var entry : dimensions.entrySet()) {
ResourceKey<LevelStem> key = entry.getKey(); ResourceKey<LevelStem> key = entry.getKey();
LevelStem stem = entry.getValue(); LevelStem stem = entry.getValue();
map.put(key, stem); map.put(key, stem);
} }
return new TogetherWorldPreset(map, sortOrder); return new TogetherWorldPreset(map, sortOrder, parentKey);
} }
private Map<ResourceKey<LevelStem>, LevelStem> getDimensions() { private Map<ResourceKey<LevelStem>, LevelStem> getDimensions() {

View file

@ -1,22 +1,46 @@
package org.betterx.worlds.together.worldPreset.client; 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.client.gui.screens.worldselection.PresetEditor;
import net.minecraft.core.Holder;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.levelgen.presets.WorldPreset; import net.minecraft.world.level.levelgen.presets.WorldPreset;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
public class WorldPresetsClient { public class WorldPresetsClient {
private static final Map<Optional<ResourceKey<WorldPreset>>, PresetEditor> EDITORS = new HashMap<>();
public static void registerCustomizeUI(ResourceKey<WorldPreset> key, PresetEditor setupScreen) { public static void registerCustomizeUI(ResourceKey<WorldPreset> key, PresetEditor setupScreen) {
if (setupScreen != null) { if (setupScreen != null) {
PresetEditor.EDITORS.put(Optional.of(key), setupScreen); EDITORS.put(Optional.of(key), setupScreen);
} }
} }
public static PresetEditor getSetupScreenForPreset(Holder<WorldPreset> 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() { public static void setupClientside() {
} }
} }

View file

@ -13,7 +13,7 @@
"LevelRendererMixin", "LevelRendererMixin",
"MinecraftMixin", "MinecraftMixin",
"ModelManagerMixin", "ModelManagerMixin",
"PresetEditorMixin", "WorldCreationUIStateMixin",
"boat.BoatRendererMixin" "boat.BoatRendererMixin"
], ],
"injectors": { "injectors": {