From eab9947aa9b06dbbe9a34a2a75b8e56e0097b19d Mon Sep 17 00:00:00 2001 From: Forwolk Date: Sat, 4 Aug 2018 14:31:43 +0300 Subject: [PATCH] Checking on unloading --- core/src/main/java/mc/core/Location.java | 8 +++++++- .../mc/core/exception/McCoreUncheckedException.java | 12 ++++++++++++ .../mc/core/exception/ResourceUnloadException.java | 8 ++++++++ .../mc/world/generated_world/chunk/ChunkImpl.java | 7 ++++++- .../mc/world/generated_world/region/RegionImpl.java | 7 ++++++- 5 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 core/src/main/java/mc/core/exception/McCoreUncheckedException.java create mode 100644 core/src/main/java/mc/core/exception/ResourceUnloadException.java diff --git a/core/src/main/java/mc/core/Location.java b/core/src/main/java/mc/core/Location.java index fc7ea47..2816f25 100644 --- a/core/src/main/java/mc/core/Location.java +++ b/core/src/main/java/mc/core/Location.java @@ -5,15 +5,17 @@ package mc.core; import lombok.Data; +import mc.core.exception.ResourceUnloadException; import mc.core.world.World; import java.io.Serializable; +import java.lang.ref.Reference; import java.lang.ref.WeakReference; @Data public class Location implements Serializable{ private double x, y, z; - private WeakReference world; + private Reference world; private static int floor_double(double value) { int i = (int)value; @@ -53,6 +55,7 @@ public class Location implements Serializable{ public Location(long compactValue, World world) { set(compactValue); + this.world = new WeakReference<>(world); } public void set(Location location) { @@ -95,6 +98,9 @@ public class Location implements Serializable{ } public World getWorld () { + if (world.get() == null) { + throw new ResourceUnloadException("You're trying to get unloaded world"); + } return this.world.get(); } diff --git a/core/src/main/java/mc/core/exception/McCoreUncheckedException.java b/core/src/main/java/mc/core/exception/McCoreUncheckedException.java new file mode 100644 index 0000000..15313f3 --- /dev/null +++ b/core/src/main/java/mc/core/exception/McCoreUncheckedException.java @@ -0,0 +1,12 @@ +package mc.core.exception; + +public abstract class McCoreUncheckedException extends RuntimeException { + + public McCoreUncheckedException() { + super(); + } + + public McCoreUncheckedException(String msg) { + super(msg); + } +} diff --git a/core/src/main/java/mc/core/exception/ResourceUnloadException.java b/core/src/main/java/mc/core/exception/ResourceUnloadException.java new file mode 100644 index 0000000..b277411 --- /dev/null +++ b/core/src/main/java/mc/core/exception/ResourceUnloadException.java @@ -0,0 +1,8 @@ +package mc.core.exception; + +public class ResourceUnloadException extends McCoreUncheckedException { + + public ResourceUnloadException(String msg) { + super(msg); + } +} diff --git a/generated_world/src/main/java/mc/world/generated_world/chunk/ChunkImpl.java b/generated_world/src/main/java/mc/world/generated_world/chunk/ChunkImpl.java index fad881c..5dd5951 100644 --- a/generated_world/src/main/java/mc/world/generated_world/chunk/ChunkImpl.java +++ b/generated_world/src/main/java/mc/world/generated_world/chunk/ChunkImpl.java @@ -3,11 +3,13 @@ package mc.world.generated_world.chunk; import lombok.Getter; import mc.core.block.Block; import mc.core.block.BlockType; +import mc.core.exception.ResourceUnloadException; import mc.core.world.Biome; import mc.core.world.Chunk; import mc.core.world.Region; import mc.core.world.World; +import java.lang.ref.Reference; import java.lang.ref.WeakReference; import static mc.world.generated_world.WorldConstants.WORLD_CHUNK_SIZE; @@ -20,7 +22,7 @@ public class ChunkImpl implements Chunk{ @Getter private final int z; private final Block[][][] blocks = new Block[WORLD_CHUNK_SIZE][WORLD_CHUNK_SIZE][WORLD_CHUNK_SIZE]; - private final transient WeakReference region; + private final transient Reference region; public ChunkImpl(int x, int y, int z, Region region) { this.x = x; @@ -109,6 +111,9 @@ public class ChunkImpl implements Chunk{ @Override public Region getRegion() { + if (region.get() == null) { + throw new ResourceUnloadException("Region is unloaded"); + } return region.get(); } diff --git a/generated_world/src/main/java/mc/world/generated_world/region/RegionImpl.java b/generated_world/src/main/java/mc/world/generated_world/region/RegionImpl.java index 643644d..c5aea75 100644 --- a/generated_world/src/main/java/mc/world/generated_world/region/RegionImpl.java +++ b/generated_world/src/main/java/mc/world/generated_world/region/RegionImpl.java @@ -3,6 +3,7 @@ package mc.world.generated_world.region; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import mc.core.exception.ResourceUnloadException; import mc.core.serialization.IRegionReaderWriter; import mc.core.serialization.Serializer; import mc.core.world.*; @@ -14,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.lang.ref.Reference; import java.lang.ref.WeakReference; import java.text.MessageFormat; @@ -27,7 +29,7 @@ public class RegionImpl implements Region{ private final int z; private final ChunkProxy[][][] chunks = new ChunkProxy[WORLD_REGION_SIZE/WORLD_CHUNK_SIZE][WORLD_REGION_SIZE/WORLD_CHUNK_SIZE][WORLD_REGION_SIZE/WORLD_CHUNK_SIZE]; private final Biome[][] biomes = new Biome[WORLD_REGION_SIZE][WORLD_REGION_SIZE]; - private final transient WeakReference world; + private final transient Reference world; @Autowired private ChunkLoader chunkLoader; @@ -79,6 +81,9 @@ public class RegionImpl implements Region{ @Override public World getWorld() { + if (world.get() == null) { + throw new ResourceUnloadException("World is unloaded"); + } return world.get(); }