[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 Holder<WorldPreset> configuredPreset = acc.getWorldType().preset();
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(
worldPreset.withDimensions(
createWorldScreen
.getUiState()
.getSettings()
.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 final WorldDimensions worldDimensions;
@Nullable
public final ResourceKey<WorldPreset> parentKey;
public TogetherWorldPreset(
Map<ResourceKey<LevelStem>, LevelStem> map,
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(
Map<ResourceKey<LevelStem>, LevelStem> map,
int sortOrder
) {
this(map, sortOrder, null);
}
public TogetherWorldPreset(
Map<ResourceKey<LevelStem>, LevelStem> map,
int sortOrder,
@Nullable ResourceKey<WorldPreset> parentKey
) {
super(map);
this.sortOrder = sortOrder;
this.worldDimensions = buildWorldDimensions(map);
this.parentKey = parentKey;
}
public static WorldDimensions buildWorldDimensions(Map<ResourceKey<LevelStem>, LevelStem> map) {
@ -67,14 +85,17 @@ public class TogetherWorldPreset extends WorldPreset {
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<>();
for (var entry : dimensions.entrySet()) {
ResourceKey<LevelStem> key = entry.getKey();
LevelStem stem = entry.getValue();
map.put(key, stem);
}
return new TogetherWorldPreset(map, sortOrder);
return new TogetherWorldPreset(map, sortOrder, parentKey);
}
private Map<ResourceKey<LevelStem>, LevelStem> getDimensions() {

View file

@ -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<Optional<ResourceKey<WorldPreset>>, PresetEditor> EDITORS = new HashMap<>();
public static void registerCustomizeUI(ResourceKey<WorldPreset> key, PresetEditor setupScreen) {
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() {
}
}

View file

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