diff --git a/pom.xml b/pom.xml index f992871..a1c60b5 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ io.josemmo.bukkit.plugin YamipaPlugin - 1.3.0 + 1.3.1 8 @@ -97,7 +97,7 @@ com.github.TechFortress GriefPrevention - 16.18.1 + 16.18.2 provided @@ -105,7 +105,7 @@ com.github.TownyAdvanced towny - 0.100.0.9 + 0.100.1.17 provided @@ -113,7 +113,7 @@ com.github.angeschossen LandsAPI - 6.42.0 + 6.44.10 provided diff --git a/src/main/java/io/josemmo/bukkit/plugin/renderer/WorldAreaId.java b/src/main/java/io/josemmo/bukkit/plugin/renderer/WorldAreaId.java index 9c44a86..76ded50 100644 --- a/src/main/java/io/josemmo/bukkit/plugin/renderer/WorldAreaId.java +++ b/src/main/java/io/josemmo/bukkit/plugin/renderer/WorldAreaId.java @@ -76,99 +76,68 @@ public WorldAreaId(@NotNull World world, int x, int z) { return distance / 4; }); - // Size 3 (16-chunks radius) - // ···XXX··· - // ·XXXXXXX· - // ·XXXXXXX· - // XXXXXXXXX - // XXXXOXXXX - // XXXXXXXXX - // ·XXXXXXX· - // ·XXXXXXX· - // ···XXX··· - if (size == 3) { + // Size 0 (1+1+1=3) + // ·|· + // XOX + // ·|· + if (size == 0) { neighborhood = new WorldAreaId[]{ - new WorldAreaId(world, x-1, z-4), - new WorldAreaId(world, x, z-4), - new WorldAreaId(world, x+1, z-4), + new WorldAreaId(world, x, z-1), - new WorldAreaId(world, x-3, z-3), - new WorldAreaId(world, x-2, z-3), - new WorldAreaId(world, x-1, z-3), - new WorldAreaId(world, x, z-3), - new WorldAreaId(world, x+1, z-3), - new WorldAreaId(world, x+2, z-3), - new WorldAreaId(world, x+3, z-3), + new WorldAreaId(world, x-1, z), + this, + new WorldAreaId(world, x+1, z), - new WorldAreaId(world, x-3, z-2), - new WorldAreaId(world, x-2, z-2), + new WorldAreaId(world, x, z+1), + }; + return neighborhood; + } + + // Size 1 (2+1+2=5) + // ·X|X· + // XX|XX + // XXOXX + // XX|XX + // ·X|X· + if (size == 1) { + neighborhood = new WorldAreaId[]{ new WorldAreaId(world, x-1, z-2), new WorldAreaId(world, x, z-2), new WorldAreaId(world, x+1, z-2), - new WorldAreaId(world, x+2, z-2), - new WorldAreaId(world, x+3, z-2), - new WorldAreaId(world, x-4, z-1), - new WorldAreaId(world, x-3, z-1), new WorldAreaId(world, x-2, z-1), new WorldAreaId(world, x-1, z-1), new WorldAreaId(world, x, z-1), new WorldAreaId(world, x+1, z-1), new WorldAreaId(world, x+2, z-1), - new WorldAreaId(world, x+3, z-1), - new WorldAreaId(world, x+4, z-1), - new WorldAreaId(world, x-4, z), - new WorldAreaId(world, x-3, z), new WorldAreaId(world, x-2, z), new WorldAreaId(world, x-1, z), this, new WorldAreaId(world, x+1, z), new WorldAreaId(world, x+2, z), - new WorldAreaId(world, x+3, z), - new WorldAreaId(world, x+4, z), - new WorldAreaId(world, x-4, z+1), - new WorldAreaId(world, x-3, z+1), new WorldAreaId(world, x-2, z+1), new WorldAreaId(world, x-1, z+1), new WorldAreaId(world, x, z+1), new WorldAreaId(world, x+1, z+1), new WorldAreaId(world, x+2, z+1), - new WorldAreaId(world, x+3, z+1), - new WorldAreaId(world, x+4, z+1), - new WorldAreaId(world, x-3, z+2), - new WorldAreaId(world, x-2, z+2), new WorldAreaId(world, x-1, z+2), new WorldAreaId(world, x, z+2), new WorldAreaId(world, x+1, z+2), - new WorldAreaId(world, x+2, z+2), - new WorldAreaId(world, x+3, z+2), - - new WorldAreaId(world, x-3, z+3), - new WorldAreaId(world, x-2, z+3), - new WorldAreaId(world, x-1, z+3), - new WorldAreaId(world, x, z+3), - new WorldAreaId(world, x+1, z+3), - new WorldAreaId(world, x+2, z+3), - new WorldAreaId(world, x+3, z+3), - - new WorldAreaId(world, x-1, z+4), - new WorldAreaId(world, x, z+4), - new WorldAreaId(world, x+1, z+4), }; return neighborhood; } - // Size 2 (12-chunks radius) - // ··XXX·· - // ·XXXXX· - // XXXXXXX + // Size 2 (3+1+3=7) + // ··X|X·· + // ·XX|XX· + // XXX|XXX // XXXOXXX - // XXXXXXX - // ·XXXXX· - // ··XXX·· + // XXX|XXX + // ·XX|XX· + // ··X|X·· if (size == 2) { neighborhood = new WorldAreaId[]{ new WorldAreaId(world, x-1, z-3), @@ -218,55 +187,211 @@ public WorldAreaId(@NotNull World world, int x, int z) { return neighborhood; } - //// Size 1 (8-chunks radius) - // ·XXX· - // XXXXX - // XXOXX - // XXXXX - // ·XXX· - if (size == 1) { + // Size 3 (4+1+4=9) + // ···X|X··· + // ·XXX|XXX· + // ·XXX|XXX· + // XXXX|XXXX + // XXXXOXXXX + // XXXX|XXXX + // ·XXX|XXX· + // ·XXX|XXX· + // ···X|X··· + if (size == 3) { neighborhood = new WorldAreaId[]{ + new WorldAreaId(world, x-1, z-4), + new WorldAreaId(world, x, z-4), + new WorldAreaId(world, x+1, z-4), + + new WorldAreaId(world, x-3, z-3), + new WorldAreaId(world, x-2, z-3), + new WorldAreaId(world, x-1, z-3), + new WorldAreaId(world, x, z-3), + new WorldAreaId(world, x+1, z-3), + new WorldAreaId(world, x+2, z-3), + new WorldAreaId(world, x+3, z-3), + + new WorldAreaId(world, x-3, z-2), + new WorldAreaId(world, x-2, z-2), new WorldAreaId(world, x-1, z-2), new WorldAreaId(world, x, z-2), new WorldAreaId(world, x+1, z-2), + new WorldAreaId(world, x+2, z-2), + new WorldAreaId(world, x+3, z-2), + new WorldAreaId(world, x-4, z-1), + new WorldAreaId(world, x-3, z-1), new WorldAreaId(world, x-2, z-1), new WorldAreaId(world, x-1, z-1), new WorldAreaId(world, x, z-1), new WorldAreaId(world, x+1, z-1), new WorldAreaId(world, x+2, z-1), + new WorldAreaId(world, x+3, z-1), + new WorldAreaId(world, x+4, z-1), + new WorldAreaId(world, x-4, z), + new WorldAreaId(world, x-3, z), new WorldAreaId(world, x-2, z), new WorldAreaId(world, x-1, z), this, new WorldAreaId(world, x+1, z), new WorldAreaId(world, x+2, z), + new WorldAreaId(world, x+3, z), + new WorldAreaId(world, x+4, z), + new WorldAreaId(world, x-4, z+1), + new WorldAreaId(world, x-3, z+1), new WorldAreaId(world, x-2, z+1), new WorldAreaId(world, x-1, z+1), new WorldAreaId(world, x, z+1), new WorldAreaId(world, x+1, z+1), new WorldAreaId(world, x+2, z+1), + new WorldAreaId(world, x+3, z+1), + new WorldAreaId(world, x+4, z+1), + new WorldAreaId(world, x-3, z+2), + new WorldAreaId(world, x-2, z+2), new WorldAreaId(world, x-1, z+2), new WorldAreaId(world, x, z+2), new WorldAreaId(world, x+1, z+2), + new WorldAreaId(world, x+2, z+2), + new WorldAreaId(world, x+3, z+2), + + new WorldAreaId(world, x-3, z+3), + new WorldAreaId(world, x-2, z+3), + new WorldAreaId(world, x-1, z+3), + new WorldAreaId(world, x, z+3), + new WorldAreaId(world, x+1, z+3), + new WorldAreaId(world, x+2, z+3), + new WorldAreaId(world, x+3, z+3), + + new WorldAreaId(world, x-1, z+4), + new WorldAreaId(world, x, z+4), + new WorldAreaId(world, x+1, z+4), }; return neighborhood; } - //// Size 0 (4x4 chunks) - // ·X· - // XOX - // ·X· + // Size ≥4 (5+1+5=11) + // ···XX|XX··· + // ··XXX|XXX·· + // ·XXXX|XXXX· + // XXXXX|XXXXX + // XXXXX|XXXXX + // XXXXXOXXXXX + // XXXXX|XXXXX + // XXXXX|XXXXX + // ·XXXX|XXXX· + // ··XXX|XXX·· + // ···XX|XX··· neighborhood = new WorldAreaId[]{ + new WorldAreaId(world, x-2, z-5), + new WorldAreaId(world, x-1, z-5), + new WorldAreaId(world, x, z-5), + new WorldAreaId(world, x+1, z-5), + new WorldAreaId(world, x+2, z-5), + + new WorldAreaId(world, x-3, z-4), + new WorldAreaId(world, x-2, z-4), + new WorldAreaId(world, x-1, z-4), + new WorldAreaId(world, x, z-4), + new WorldAreaId(world, x+1, z-4), + new WorldAreaId(world, x+2, z-4), + new WorldAreaId(world, x+3, z-4), + + new WorldAreaId(world, x-4, z-3), + new WorldAreaId(world, x-3, z-3), + new WorldAreaId(world, x-2, z-3), + new WorldAreaId(world, x-1, z-3), + new WorldAreaId(world, x, z-3), + new WorldAreaId(world, x+1, z-3), + new WorldAreaId(world, x+2, z-3), + new WorldAreaId(world, x+3, z-3), + new WorldAreaId(world, x+4, z-3), + + new WorldAreaId(world, x-5, z-2), + new WorldAreaId(world, x-4, z-2), + new WorldAreaId(world, x-3, z-2), + new WorldAreaId(world, x-2, z-2), + new WorldAreaId(world, x-1, z-2), + new WorldAreaId(world, x, z-2), + new WorldAreaId(world, x+1, z-2), + new WorldAreaId(world, x+2, z-2), + new WorldAreaId(world, x+3, z-2), + new WorldAreaId(world, x+4, z-2), + new WorldAreaId(world, x+5, z-2), + + new WorldAreaId(world, x-5, z-1), + new WorldAreaId(world, x-4, z-1), + new WorldAreaId(world, x-3, z-1), + new WorldAreaId(world, x-2, z-1), + new WorldAreaId(world, x-1, z-1), new WorldAreaId(world, x, z-1), - + new WorldAreaId(world, x+1, z-1), + new WorldAreaId(world, x+2, z-1), + new WorldAreaId(world, x+3, z-1), + new WorldAreaId(world, x+4, z-1), + new WorldAreaId(world, x+5, z-1), + + new WorldAreaId(world, x-5, z), + new WorldAreaId(world, x-4, z), + new WorldAreaId(world, x-3, z), + new WorldAreaId(world, x-2, z), new WorldAreaId(world, x-1, z), this, new WorldAreaId(world, x+1, z), - + new WorldAreaId(world, x+2, z), + new WorldAreaId(world, x+3, z), + new WorldAreaId(world, x+4, z), + new WorldAreaId(world, x+5, z), + + new WorldAreaId(world, x-5, z+1), + new WorldAreaId(world, x-4, z+1), + new WorldAreaId(world, x-3, z+1), + new WorldAreaId(world, x-2, z+1), + new WorldAreaId(world, x-1, z+1), new WorldAreaId(world, x, z+1), + new WorldAreaId(world, x+1, z+1), + new WorldAreaId(world, x+2, z+1), + new WorldAreaId(world, x+3, z+1), + new WorldAreaId(world, x+4, z+1), + new WorldAreaId(world, x+5, z+1), + + new WorldAreaId(world, x-5, z+2), + new WorldAreaId(world, x-4, z+2), + new WorldAreaId(world, x-3, z+2), + new WorldAreaId(world, x-2, z+2), + new WorldAreaId(world, x-1, z+2), + new WorldAreaId(world, x, z+2), + new WorldAreaId(world, x+1, z+2), + new WorldAreaId(world, x+2, z+2), + new WorldAreaId(world, x+3, z+2), + new WorldAreaId(world, x+4, z+2), + new WorldAreaId(world, x+5, z+2), + + new WorldAreaId(world, x-4, z+3), + new WorldAreaId(world, x-3, z+3), + new WorldAreaId(world, x-2, z+3), + new WorldAreaId(world, x-1, z+3), + new WorldAreaId(world, x, z+3), + new WorldAreaId(world, x+1, z+3), + new WorldAreaId(world, x+2, z+3), + new WorldAreaId(world, x+3, z+3), + new WorldAreaId(world, x+4, z+3), + + new WorldAreaId(world, x-3, z+4), + new WorldAreaId(world, x-2, z+4), + new WorldAreaId(world, x-1, z+4), + new WorldAreaId(world, x, z+4), + new WorldAreaId(world, x+1, z+4), + new WorldAreaId(world, x+2, z+4), + new WorldAreaId(world, x+3, z+4), + + new WorldAreaId(world, x-2, z+5), + new WorldAreaId(world, x-1, z+5), + new WorldAreaId(world, x, z+5), + new WorldAreaId(world, x+1, z+5), + new WorldAreaId(world, x+2, z+5), }; return neighborhood; } diff --git a/src/main/java/io/josemmo/bukkit/plugin/storage/CachedMapsFile.java b/src/main/java/io/josemmo/bukkit/plugin/storage/CachedMapsFile.java index 8207f14..8307eae 100644 --- a/src/main/java/io/josemmo/bukkit/plugin/storage/CachedMapsFile.java +++ b/src/main/java/io/josemmo/bukkit/plugin/storage/CachedMapsFile.java @@ -114,6 +114,7 @@ public int getDelay() { private void load() { // Try to load maps from disk if (exists() && getLastModified() > imageFile.getLastModified()) { + LOGGER.fine("Found warm cache file \"" + path + "\""); try { loadFromDisk(); return; @@ -125,6 +126,7 @@ private void load() { } // Generate maps from image file + LOGGER.fine("Missed cache file \"" + path + "\""); try { generateFromImage(); tryToWriteToDisk(); diff --git a/src/main/java/io/josemmo/bukkit/plugin/storage/SynchronizedFileStream.java b/src/main/java/io/josemmo/bukkit/plugin/storage/SynchronizedFileStream.java index 7410d16..2b1260e 100644 --- a/src/main/java/io/josemmo/bukkit/plugin/storage/SynchronizedFileStream.java +++ b/src/main/java/io/josemmo/bukkit/plugin/storage/SynchronizedFileStream.java @@ -4,6 +4,9 @@ import org.jetbrains.annotations.NotNull; import java.io.IOException; import java.io.RandomAccessFile; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; +import java.nio.channels.OverlappingFileLockException; import java.nio.file.Path; /** @@ -17,10 +20,29 @@ public class SynchronizedFileStream extends RandomAccessFile { * @param readOnly Whether to open stream in read-only mode * @throws IOException if failed to acquire lock */ - @Blocking public SynchronizedFileStream(@NotNull Path path, boolean readOnly) throws IOException { super(path.toFile(), readOnly ? "r" : "rw"); - //noinspection ResultOfMethodCallIgnored - getChannel().lock(0L, Long.MAX_VALUE, readOnly); + waitForLock(readOnly); + } + + /** + * Wait for lock to be released + * @param readOnly Whether to acquire read-only (shared) lock + */ + @Blocking + private void waitForLock(boolean readOnly) throws IOException { + FileChannel channel = getChannel(); + FileLock lock = null; + while (lock == null) { + try { + lock = channel.lock(0L, Long.MAX_VALUE, readOnly); + } catch (OverlappingFileLockException e) { + try { + Thread.sleep(20); + } catch (InterruptedException __) { + throw e; + } + } + } } }