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 ced5f7e5d..b276882b0 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 @@ -80,7 +80,8 @@ public class FullDataPointIdMap // getters // //=========// - private Entry getEntry(int id) + /** @throws IndexOutOfBoundsException if the given ID isn't in the {@link FullDataPointIdMap#entryList} */ + private Entry getEntry(int id) throws IndexOutOfBoundsException { try { @@ -92,8 +93,7 @@ public class FullDataPointIdMap } catch (IndexOutOfBoundsException e) { - LOGGER.error("FullData ID Map out of sync for pos: " + this.pos + ". ID: [" + id + "] greater than the number of known ID's: [" + this.entryList.size() + "]."); - throw e; + throw new IndexOutOfBoundsException("FullData ID Map out of sync for pos: "+this.pos+". ID: ["+id+"] greater than the number of known ID's: ["+this.entryList.size()+"]."); } return entry; @@ -104,8 +104,16 @@ public class FullDataPointIdMap } } - public IBiomeWrapper getBiomeWrapper(int id) { return this.getEntry(id).biome; } - public IBlockStateWrapper getBlockStateWrapper(int id) { return this.getEntry(id).blockState; } + /** @see FullDataPointIdMap#getEntry(int) */ + public IBiomeWrapper getBiomeWrapper(int id) throws IndexOutOfBoundsException { return this.getEntry(id).biome; } + /** @see FullDataPointIdMap#getEntry(int) */ + public IBlockStateWrapper getBlockStateWrapper(int id) throws IndexOutOfBoundsException { return this.getEntry(id).blockState; } + + + /** @return -1 if the list is empty */ + public int getMaxValidId() { return this.entryList.size() - 1; } + + public DhSectionPos getPos() { return this.pos; } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/accessor/SingleColumnFullDataAccessor.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/accessor/SingleColumnFullDataAccessor.java index 236959cdb..c26c4f23e 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/accessor/SingleColumnFullDataAccessor.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/accessor/SingleColumnFullDataAccessor.java @@ -143,7 +143,8 @@ public class SingleColumnFullDataAccessor implements IFullDataAccessor { int[] remappedEntryIds = target.mapping.mergeAndReturnRemappedEntityIds(this.mapping); long[] sourceData = this.dataArrays[this.dataArrayIndex]; - if (sourceData != null) + // FIXME sourceData.length != 0 may not be a good solution and may end up breaking issues down the line, but fixes exceptions being fired here + if (sourceData != null && sourceData.length != 0) { long[] newData = new long[sourceData.length]; for (int i = 0; i < newData.length; i++) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java index 7d5f28923..f3d34615a 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java @@ -21,7 +21,6 @@ package com.seibel.distanthorizons.core.dataObjects.transformers; import com.seibel.distanthorizons.api.enums.config.EBlocksToAvoid; import com.seibel.distanthorizons.core.config.Config; -import com.seibel.distanthorizons.core.config.listeners.ConfigChangeListener; import com.seibel.distanthorizons.core.dataObjects.fullData.FullDataPointIdMap; import com.seibel.distanthorizons.core.dataObjects.fullData.accessor.ChunkSizedFullDataAccessor; import com.seibel.distanthorizons.core.dataObjects.fullData.accessor.SingleColumnFullDataAccessor; @@ -29,7 +28,6 @@ import com.seibel.distanthorizons.core.dataObjects.fullData.sources.CompleteFull import com.seibel.distanthorizons.core.dataObjects.fullData.sources.interfaces.IFullDataSource; import com.seibel.distanthorizons.core.dataObjects.fullData.sources.interfaces.IIncompleteFullDataSource; import com.seibel.distanthorizons.core.dataObjects.render.ColumnRenderSource; -import com.seibel.distanthorizons.core.dataObjects.render.bufferBuilding.ColumnRenderBufferBuilder; import com.seibel.distanthorizons.core.dataObjects.render.columnViews.ColumnArrayView; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.level.IDhClientLevel; @@ -39,7 +37,6 @@ import com.seibel.distanthorizons.core.pos.DhSectionPos; import com.seibel.distanthorizons.core.util.FullDataPointUtil; import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.util.RenderDataPointUtil; -import com.seibel.distanthorizons.core.util.ThreadUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory; import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; @@ -47,8 +44,6 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper; import org.apache.logging.log4j.Logger; import java.util.HashSet; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; /** * Handles converting {@link ChunkSizedFullDataAccessor}, {@link IIncompleteFullDataSource}, @@ -230,6 +225,8 @@ public class FullDataToRenderDataTransformer } } + private static HashSet brokenPos = new HashSet<>(); + // TODO what does this mean? private static void iterateAndConvert(IDhClientLevel level, int blockX, int blockZ, int genMode, ColumnArrayView column, SingleColumnFullDataAccessor data) @@ -252,8 +249,28 @@ public class FullDataToRenderDataTransformer int blockHeight = FullDataPointUtil.getHeight(fullData); int id = FullDataPointUtil.getId(fullData); int light = FullDataPointUtil.getLight(fullData); - IBiomeWrapper biome = fullDataMapping.getBiomeWrapper(id); - IBlockStateWrapper block = fullDataMapping.getBlockStateWrapper(id); + + IBiomeWrapper biome; + IBlockStateWrapper block; + try + { + biome = fullDataMapping.getBiomeWrapper(id); + block = fullDataMapping.getBlockStateWrapper(id); + } + catch (IndexOutOfBoundsException e) + { + // FIXME sometimes the data map has a length of 0 + if (!brokenPos.contains(fullDataMapping.getPos())) + { + brokenPos.add(fullDataMapping.getPos()); + String dimName = level.getLevelWrapper().getDimensionType().getDimensionName(); + LOGGER.warn("Unable to get data point with id ["+id+"] (Max possible ID: ["+fullDataMapping.getMaxValidId()+"]) for pos ["+fullDataMapping.getPos()+"] in dimension ["+dimName+"]. Error: ["+e.getMessage()+"]. Further errors for this position won't be logged."); + } + + // skip rendering broken data + continue; + } + if (blockStatesToIgnore.contains(block)) {