From 15fbf88147973f6471307ce0374fb434a73c1c3a Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 14 Jun 2023 20:25:55 +0200 Subject: [PATCH] [Fix] World Recreation crashes for worlds with betterx customizations --- .../mixin/client/CreateWorldScreen_Mixin.java | 5 ++++- .../together/world/event/WorldBootstrap.java | 15 ++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/betterx/worlds/together/mixin/client/CreateWorldScreen_Mixin.java b/src/main/java/org/betterx/worlds/together/mixin/client/CreateWorldScreen_Mixin.java index d83e376c..7db40886 100644 --- a/src/main/java/org/betterx/worlds/together/mixin/client/CreateWorldScreen_Mixin.java +++ b/src/main/java/org/betterx/worlds/together/mixin/client/CreateWorldScreen_Mixin.java @@ -28,6 +28,9 @@ public abstract class CreateWorldScreen_Mixin { @Shadow public abstract WorldCreationUiState getUiState(); + @Shadow + private boolean recreated; + @Inject(method = "", at = @At("TAIL")) private void wt_init( Minecraft minecraft, @@ -50,6 +53,6 @@ public abstract class CreateWorldScreen_Mixin { @Inject(method = "createNewWorldDirectory", at = @At("RETURN")) void wt_createNewWorld(CallbackInfoReturnable> cir) { WorldBootstrap.InGUI.registryReadyOnNewWorld(this.getUiState().getSettings()); - WorldBootstrap.InGUI.setupNewWorld(cir.getReturnValue(), this.getUiState()); + WorldBootstrap.InGUI.setupNewWorld(cir.getReturnValue(), this.getUiState(), this.recreated); } } diff --git a/src/main/java/org/betterx/worlds/together/world/event/WorldBootstrap.java b/src/main/java/org/betterx/worlds/together/world/event/WorldBootstrap.java index eda408a0..8d0b3e44 100644 --- a/src/main/java/org/betterx/worlds/together/world/event/WorldBootstrap.java +++ b/src/main/java/org/betterx/worlds/together/world/event/WorldBootstrap.java @@ -163,7 +163,8 @@ public class WorldBootstrap { public static void setupNewWorld( Optional levelStorageAccess, - WorldCreationUiState uiState + WorldCreationUiState uiState, + boolean recreated ) { if (levelStorageAccess.isPresent()) { @@ -172,7 +173,8 @@ public class WorldBootstrap { Holder newPreset = setupNewWorldCommon( levelStorageAccess.get(), currentPreset, - uiState.getSettings().selectedDimensions() + uiState.getSettings().selectedDimensions(), + recreated ); if (newPreset != null && newPreset != currentPreset) { uiState.setWorldType(new WorldCreationUiState.WorldTypeEntry(newPreset)); @@ -186,11 +188,14 @@ public class WorldBootstrap { static Holder setupNewWorldCommon( LevelStorageSource.LevelStorageAccess levelStorageAccess, Holder currentPreset, - WorldDimensions worldDims + WorldDimensions worldDims, + boolean recreated ) { final WorldDimensions dimensions; - if (currentPreset.value() instanceof TogetherWorldPreset t) { + if (currentPreset != null && currentPreset.value() instanceof TogetherWorldPreset t) { dimensions = t.getWorldDimensions(); + } else if (recreated) { + dimensions = worldDims; } else { dimensions = TogetherWorldPreset.getWorldDimensions(net.minecraft.world.level.levelgen.presets.WorldPresets.NORMAL); } @@ -250,7 +255,7 @@ public class WorldBootstrap { ) { try { var levelStorageAccess = levelSource.createAccess(levelID); - InGUI.setupNewWorldCommon(levelStorageAccess, worldPreset, worldDims); + InGUI.setupNewWorldCommon(levelStorageAccess, worldPreset, worldDims, false); levelStorageAccess.close(); } catch (Exception e) { WorldsTogether.LOGGER.error("Failed to initialize data in world", e);