diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java index b6264192f..fa604be6f 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java @@ -57,6 +57,7 @@ import java.nio.file.Path; #endif import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.Nullable; public class ServerLevelWrapper implements IServerLevelWrapper { @@ -71,6 +72,9 @@ public class ServerLevelWrapper implements IServerLevelWrapper @Deprecated // TODO circular references are bad private IDhLevel parentDhLevel; + @Nullable + private String worldFolderName = null; + //==============// @@ -115,12 +119,33 @@ public class ServerLevelWrapper implements IServerLevelWrapper @Override public String getWorldFolderName() { - #if MC_VER >= MC_1_17_1 - return this.level.getServer().getWorldScreenshotFile().get().getParent().getFileName().toString(); - #else // <= 1.16.5 - return this.level.getServer().getWorldScreenshotFile().getParentFile().getName(); - #endif + // there's a bug with Forge 1.20.1 where the screenshot folder can be null + // hopefully the first time we get this it will be valid so any changes afterwards can be ignored + // TODO can we just replace this with getMcSaveFolder()? Why are we using the screenshot file anyway? + if (this.worldFolderName == null) + { + this.worldFolderName = this.tryGetWorldFolderName(); + } + + return this.worldFolderName; } + @Nullable + private String tryGetWorldFolderName() + { + try + { + #if MC_VER >= MC_1_17_1 + return this.level.getServer().getWorldScreenshotFile().get().getParent().getFileName().toString(); + #else // <= 1.16.5 + return this.level.getServer().getWorldScreenshotFile().getParentFile().getName(); + #endif + } + catch (Exception e) + { + return null; + } + } + @Override public DimensionTypeWrapper getDimensionType() { return DimensionTypeWrapper.getDimensionTypeWrapper(this.level.dimensionType()); }