[Change] Made World Customization Screen more compatible with other Mods. (#93)
This commit is contained in:
parent
dbd6db0f86
commit
c0c35ed81e
6 changed files with 84 additions and 32 deletions
|
@ -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
|
||||||
)
|
)
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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() {
|
||||||
|
|
|
@ -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() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
"LevelRendererMixin",
|
"LevelRendererMixin",
|
||||||
"MinecraftMixin",
|
"MinecraftMixin",
|
||||||
"ModelManagerMixin",
|
"ModelManagerMixin",
|
||||||
"PresetEditorMixin",
|
"WorldCreationUIStateMixin",
|
||||||
"boat.BoatRendererMixin"
|
"boat.BoatRendererMixin"
|
||||||
],
|
],
|
||||||
"injectors": {
|
"injectors": {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue