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;
+ }
+ }
+ }
}
}