From 7cfcfb0695cae172df7ec48e0bb30cc57246fa3f Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 9 May 2024 19:45:54 -0500 Subject: [PATCH] Handle missing/corrupted block/biome ID's in the full data --- .../fullData/FullDataPointIdMap.java | 4 +-- .../wrapperInterfaces/IWrapperFactory.java | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/FullDataPointIdMap.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/FullDataPointIdMap.java index 0cb0df50f..229fbbea7 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/FullDataPointIdMap.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/FullDataPointIdMap.java @@ -545,8 +545,8 @@ public class FullDataPointIdMap throw new DataCorruptedException("Failed to deserialize BiomeBlockStateEntry"); } - IBiomeWrapper biome = WRAPPER_FACTORY.deserializeBiomeWrapper(stringArray[0], levelWrapper); - IBlockStateWrapper blockState = WRAPPER_FACTORY.deserializeBlockStateWrapper(stringArray[1], levelWrapper); + IBiomeWrapper biome = WRAPPER_FACTORY.deserializeBiomeWrapperOrGetDefault(stringArray[0], levelWrapper); + IBlockStateWrapper blockState = WRAPPER_FACTORY.deserializeBlockStateWrapperOrGetDefault(stringArray[1], levelWrapper); return Entry.getEntry(biome, blockState); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/IWrapperFactory.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/IWrapperFactory.java index 651b9a231..139949cc4 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/IWrapperFactory.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/IWrapperFactory.java @@ -40,9 +40,43 @@ import java.util.HashSet; public interface IWrapperFactory extends IDhApiWrapperFactory, IBindable { AbstractBatchGenerationEnvironmentWrapper createBatchGenerator(IDhLevel targetLevel); + IBiomeWrapper deserializeBiomeWrapper(String str, ILevelWrapper levelWrapper) throws IOException; + IBiomeWrapper getPlainsBiomeWrapper(ILevelWrapper levelWrapper); // TODO it would be nice to remove the level wrapper if possible to put this in line with getAirBlockStateWrapper() but it isn't necessary + default IBiomeWrapper deserializeBiomeWrapperOrGetDefault(String str, ILevelWrapper levelWrapper) + { + IBiomeWrapper biome; + try + { + biome = this.deserializeBiomeWrapper(str, levelWrapper); + } + catch (IOException e) + { + biome = this.getPlainsBiomeWrapper(levelWrapper); + } + + return biome; + } + + IBlockStateWrapper deserializeBlockStateWrapper(String str, ILevelWrapper levelWrapper) throws IOException; IBlockStateWrapper getAirBlockStateWrapper(); + default IBlockStateWrapper deserializeBlockStateWrapperOrGetDefault(String str, ILevelWrapper levelWrapper) + { + IBlockStateWrapper blockState; + try + { + blockState = this.deserializeBlockStateWrapper(str, levelWrapper); + } + catch (IOException e) + { + blockState = this.getAirBlockStateWrapper(); + } + + return blockState; + } + + /** * Returns the set of {@link IBlockStateWrapper}'s that shouldn't be rendered.
* Generally this contains blocks like: air, barriers, light blocks, etc.