From 7f9b0356658e412db3d93c63c5350d6fe132efd4 Mon Sep 17 00:00:00 2001 From: TomTheFurry Date: Wed, 30 Mar 2022 18:38:48 +0800 Subject: [PATCH] Fix race & stuck playerData in sub-dim, add dataPoint verify --- .../bufferBuilding/CubicLodTemplate.java | 4 ++++ .../lod/core/handlers/LodDimensionFinder.java | 19 +++++++-------- .../seibel/lod/core/util/DataPointUtil.java | 23 ++++++++++++++++++- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/seibel/lod/core/builders/lodBuilding/bufferBuilding/CubicLodTemplate.java b/src/main/java/com/seibel/lod/core/builders/lodBuilding/bufferBuilding/CubicLodTemplate.java index 29ed3d288..3454c2e49 100644 --- a/src/main/java/com/seibel/lod/core/builders/lodBuilding/bufferBuilding/CubicLodTemplate.java +++ b/src/main/java/com/seibel/lod/core/builders/lodBuilding/bufferBuilding/CubicLodTemplate.java @@ -51,6 +51,10 @@ public class CubicLodTemplate short dy = (short) (DataPointUtil.getHeight(data) - y); if (dy == 0) return; + if (dy < 0) + { + throw new IllegalArgumentException("Negative y size for the data! Data: " + DataPointUtil.toString(data)); + } int color; if (debugging != DebugMode.OFF && debugging != DebugMode.SHOW_WIREFRAME) diff --git a/src/main/java/com/seibel/lod/core/handlers/LodDimensionFinder.java b/src/main/java/com/seibel/lod/core/handlers/LodDimensionFinder.java index d05f8f2ed..462448229 100644 --- a/src/main/java/com/seibel/lod/core/handlers/LodDimensionFinder.java +++ b/src/main/java/com/seibel/lod/core/handlers/LodDimensionFinder.java @@ -29,6 +29,7 @@ import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.util.UUID; +import java.util.concurrent.atomic.AtomicBoolean; /** * Used to guess the world folder for the player's current dimension. @@ -56,7 +57,7 @@ public class LodDimensionFinder private volatile LodDimension foundLodDimension = null; /** If true the LodDimensionFileHelper is attempting to determine the folder for this dimension */ - private boolean determiningWorldFolder = false; + private AtomicBoolean determiningWorldFolder = new AtomicBoolean(false); @@ -88,11 +89,11 @@ public class LodDimensionFinder public void AttemptToDetermineSubDimensionAsync(IDimensionTypeWrapper dimensionTypeWrapper) { // prevent multiple threads running at the same time - if (determiningWorldFolder && !isDone()) + boolean v = determiningWorldFolder.getAndSet(true); + if (v) { return; - determiningWorldFolder = true; - - + } + // run asynchronously since this could take a while Thread thread = new Thread(() -> { @@ -127,7 +128,7 @@ public class LodDimensionFinder finally { // make sure we unlock this method - determiningWorldFolder = false; + determiningWorldFolder.set(false); } }); thread.setName(THREAD_NAME); @@ -151,7 +152,7 @@ public class LodDimensionFinder } // relevant positions - AbstractChunkPosWrapper playerChunkPos = FACTORY.createChunkPos(firstSeenPlayerData.playerBlockPos); + AbstractChunkPosWrapper playerChunkPos = FACTORY.createChunkPos(playerData.playerBlockPos); int startingBlockPosX = playerChunkPos.getMinBlockX(); int startingBlockPosZ = playerChunkPos.getMinBlockZ(); RegionPos playerRegionPos = new RegionPos(playerChunkPos); @@ -177,7 +178,7 @@ public class LodDimensionFinder // log the start of this attempt LOGGER.info("Attempting to determine sub-dimension for [" + MC.getCurrentDimension().getDimensionName() + "]"); - LOGGER.info("First seen player block pos in dimension: [" + firstSeenPlayerData.playerBlockPos.getX() + "," + firstSeenPlayerData.playerBlockPos.getY() + "," + firstSeenPlayerData.playerBlockPos.getZ() + "]"); + LOGGER.info("Player block pos in dimension: [" + playerData.playerBlockPos.getX() + "," + playerData.playerBlockPos.getY() + "," + playerData.playerBlockPos.getZ() + "]"); // new chunk data @@ -269,7 +270,7 @@ public class LodDimensionFinder LOGGER.info("Last known player pos: [" + testPlayerData.playerBlockPos.getX() + "," + testPlayerData.playerBlockPos.getY() + "," + testPlayerData.playerBlockPos.getZ() + "]"); // check if the block positions are close - int playerBlockDist = testPlayerData.playerBlockPos.getManhattanDistance(firstSeenPlayerData.playerBlockPos); + int playerBlockDist = testPlayerData.playerBlockPos.getManhattanDistance(playerData.playerBlockPos); ApiShared.LOGGER.info("Player block position distance between saved sub dimension and first seen is [" + playerBlockDist + "]"); diff --git a/src/main/java/com/seibel/lod/core/util/DataPointUtil.java b/src/main/java/com/seibel/lod/core/util/DataPointUtil.java index c07b5bb4f..8ad212421 100644 --- a/src/main/java/com/seibel/lod/core/util/DataPointUtil.java +++ b/src/main/java/com/seibel/lod/core/util/DataPointUtil.java @@ -108,6 +108,27 @@ public class DataPointUtil { if (generationMode == 0) throw new IllegalArgumentException("Trying to create datapoint with genMode 0, which is NOT allowed in DataPoint version 10!"); + if (height < 0 || height > 4096) + throw new IllegalArgumentException("Height must be between 0 and 4096!"); + if (depth < 0 || depth > 4096) + throw new IllegalArgumentException("Depth must be between 0 and 4096!"); + if (lightSky < 0 || lightSky > 15) + throw new IllegalArgumentException("Sky light must be between 0 and 15!"); + if (lightBlock < 0 || lightBlock > 15) + throw new IllegalArgumentException("Block light must be between 0 and 15!"); + if (alpha < 0 || alpha > 255) + throw new IllegalArgumentException("Alpha must be between 0 and 255!"); + if (red < 0 || red > 255) + throw new IllegalArgumentException("Red must be between 0 and 255!"); + if (green < 0 || green > 255) + throw new IllegalArgumentException("Green must be between 0 and 255!"); + if (blue < 0 || blue > 255) + throw new IllegalArgumentException("Blue must be between 0 and 255!"); + if (generationMode < 0 || generationMode > 7) + throw new IllegalArgumentException("Generation mode must be between 0 and 7!"); + if (depth > height) + throw new IllegalArgumentException("Depth must be less than or equal to height!"); + return (long) (alpha >>> ALPHA_DOWNSIZE_SHIFT) << ALPHA_SHIFT | (red & RED_MASK) << RED_SHIFT | (green & GREEN_MASK) << GREEN_SHIFT @@ -249,7 +270,7 @@ public class DataPointUtil arraySize *= packetSize; //remove comment to not leave garbage at the end //array[start + packetSize + i] = 0; - if (arraySize - start >= 0) System.arraycopy(array, start + length + 0, array, start + 0, arraySize - start); + if (arraySize - start >= 0) System.arraycopy(array, start + length, array, start, arraySize - start); } public static void extendArray(short[] array, int packetSize, int start, int length, int arraySize)