diff --git a/DynmapCore/src/main/resources/extracted/web/standalone/MySQL_markers.php b/DynmapCore/src/main/resources/extracted/web/standalone/MySQL_markers.php
index 688ebe6d..cfa55921 100644
--- a/DynmapCore/src/main/resources/extracted/web/standalone/MySQL_markers.php
+++ b/DynmapCore/src/main/resources/extracted/web/standalone/MySQL_markers.php
@@ -19,7 +19,7 @@ if (strcmp($userid, '-guest-')) {
$loggedin = true;
}
-$path = $_REQUEST['marker'];
+$path = htmlspecialchars($_REQUEST['marker']);
if ((!isset($path)) || strstr($path, "..")) {
header('HTTP/1.0 500 Error');
echo "
500 Error
";
diff --git a/DynmapCore/src/main/resources/extracted/web/standalone/MySQL_tiles.php b/DynmapCore/src/main/resources/extracted/web/standalone/MySQL_tiles.php
index 51699bc1..00c3af2b 100644
--- a/DynmapCore/src/main/resources/extracted/web/standalone/MySQL_tiles.php
+++ b/DynmapCore/src/main/resources/extracted/web/standalone/MySQL_tiles.php
@@ -19,7 +19,7 @@ if (strcmp($userid, '-guest-')) {
$loggedin = true;
}
-$path = $_REQUEST['tile'];
+$path = htmlspecialchars($_REQUEST['tile']);
if ((!isset($path)) || strstr($path, "..")) {
header('HTTP/1.0 500 Error');
echo "500 Error
";
diff --git a/DynmapCore/src/main/resources/extracted/web/standalone/PostgreSQL_markers.php b/DynmapCore/src/main/resources/extracted/web/standalone/PostgreSQL_markers.php
index 76beb457..98fc1cb3 100644
--- a/DynmapCore/src/main/resources/extracted/web/standalone/PostgreSQL_markers.php
+++ b/DynmapCore/src/main/resources/extracted/web/standalone/PostgreSQL_markers.php
@@ -19,7 +19,7 @@ if (strcmp($userid, '-guest-')) {
$loggedin = true;
}
-$path = $_REQUEST['marker'];
+$path = htmlspecialchars($_REQUEST['marker']);
if ((!isset($path)) || strstr($path, "..")) {
header('HTTP/1.0 500 Error');
echo "500 Error
";
diff --git a/DynmapCore/src/main/resources/extracted/web/standalone/PostgreSQL_tiles.php b/DynmapCore/src/main/resources/extracted/web/standalone/PostgreSQL_tiles.php
index b95d00cd..c2e1fb65 100644
--- a/DynmapCore/src/main/resources/extracted/web/standalone/PostgreSQL_tiles.php
+++ b/DynmapCore/src/main/resources/extracted/web/standalone/PostgreSQL_tiles.php
@@ -19,7 +19,7 @@ if (strcmp($userid, '-guest-')) {
$loggedin = true;
}
-$path = $_REQUEST['tile'];
+$path = htmlspecialchars($_REQUEST['tile']);
if ((!isset($path)) || strstr($path, "..")) {
header('HTTP/1.0 500 Error');
echo "500 Error
";
diff --git a/DynmapCore/src/main/resources/extracted/web/standalone/SQLite_markers.php b/DynmapCore/src/main/resources/extracted/web/standalone/SQLite_markers.php
index 769f2562..7707bc9a 100644
--- a/DynmapCore/src/main/resources/extracted/web/standalone/SQLite_markers.php
+++ b/DynmapCore/src/main/resources/extracted/web/standalone/SQLite_markers.php
@@ -17,7 +17,7 @@ if (strcmp($userid, '-guest-')) {
$loggedin = true;
}
-$path = $_REQUEST['marker'];
+$path = htmlspecialchars($_REQUEST['marker']);
if ((!isset($path)) || strstr($path, "..")) {
header('HTTP/1.0 500 Error');
echo "500 Error
";
diff --git a/DynmapCore/src/main/resources/extracted/web/standalone/SQLite_tiles.php b/DynmapCore/src/main/resources/extracted/web/standalone/SQLite_tiles.php
index 83cfaf29..9feea7fb 100644
--- a/DynmapCore/src/main/resources/extracted/web/standalone/SQLite_tiles.php
+++ b/DynmapCore/src/main/resources/extracted/web/standalone/SQLite_tiles.php
@@ -17,7 +17,7 @@ if (strcmp($userid, '-guest-')) {
$loggedin = true;
}
-$path = $_REQUEST['tile'];
+$path = htmlspecialchars($_REQUEST['tile']);
if ((!isset($path)) || strstr($path, "..")) {
header('HTTP/1.0 500 Error');
echo "500 Error
";
diff --git a/DynmapCore/src/main/resources/extracted/web/standalone/markers.php b/DynmapCore/src/main/resources/extracted/web/standalone/markers.php
index 795ef8de..541e0ebc 100644
--- a/DynmapCore/src/main/resources/extracted/web/standalone/markers.php
+++ b/DynmapCore/src/main/resources/extracted/web/standalone/markers.php
@@ -24,7 +24,7 @@ if (strcmp($userid, '-guest-')) {
$loggedin = true;
}
-$path = $_REQUEST['marker'];
+$path = htmlspecialchars($_REQUEST['marker']);
if ((!isset($path)) || strstr($path, "..")) {
header('HTTP/1.0 500 Error');
echo "500 Error
";
diff --git a/DynmapCore/src/main/resources/extracted/web/standalone/tiles.php b/DynmapCore/src/main/resources/extracted/web/standalone/tiles.php
index fdcf8c6d..11e46df4 100644
--- a/DynmapCore/src/main/resources/extracted/web/standalone/tiles.php
+++ b/DynmapCore/src/main/resources/extracted/web/standalone/tiles.php
@@ -24,7 +24,7 @@ if (strcmp($userid, '-guest-')) {
$loggedin = true;
}
-$path = $_REQUEST['tile'];
+$path = htmlspecialchars($_REQUEST['tile']);
if ((!isset($path)) || strstr($path, "..")) {
header('HTTP/1.0 500 Error');
echo "500 Error
";
diff --git a/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/AsyncChunkProvider118_2.java b/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/AsyncChunkProvider118_2.java
index 745527e6..03e831f7 100644
--- a/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/AsyncChunkProvider118_2.java
+++ b/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/AsyncChunkProvider118_2.java
@@ -93,6 +93,9 @@ public class AsyncChunkProvider118_2 {
}
//prepare data synchronously
CompletableFuture> future = CompletableFuture.supplyAsync(() -> {
+ //Null will mean that we save with spigot methods, which may be risky on async
+ //Since we're not in main thread, it now refuses new tasks because of shutdown, the risk is lower
+ if (!Bukkit.isPrimaryThread()) return null;
try {
return getAsyncSaveData.invoke(null, world.getHandle(), c);
} catch (IllegalAccessException | InvocationTargetException e) {
@@ -103,15 +106,21 @@ public class AsyncChunkProvider118_2 {
if (++currChunks > MapManager.mapman.getMaxChunkLoadsPerTick()) {
try {
Thread.sleep(25); //hold the lock so other threads also won't stress main thread
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
+ } catch (InterruptedException ignored) {}
}
//save data asynchronously
return () -> {
+ Object o = null;
try {
- return (NBTTagCompound) save.invoke(null, world.getHandle(), c, future.get());
- } catch (ReflectiveOperationException | ExecutionException | InterruptedException e) {
+ o = future.get();
+ return (NBTTagCompound) save.invoke(null, world.getHandle(), c, o);
+ } catch (InterruptedException e) {
+ return null;
+ } catch (InvocationTargetException e) {
+ //We tried to use simple spigot methods at shutdown and failed, hopes for reading from disk
+ if (o == null) return null;
+ throw new RuntimeException(e);
+ } catch (ReflectiveOperationException | ExecutionException e) {
throw new RuntimeException(e);
}
};
diff --git a/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/MapChunkCache118_2.java b/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/MapChunkCache118_2.java
index c96b6670..21b94ea3 100644
--- a/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/MapChunkCache118_2.java
+++ b/bukkit-helper-118-2/src/main/java/org/dynmap/bukkit/helper/v118_2/MapChunkCache118_2.java
@@ -22,7 +22,7 @@ import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.ExecutionException;
import java.util.function.Supplier;
/**
@@ -61,7 +61,14 @@ public class MapChunkCache118_2 extends GenericMapChunkCache {
try {
CompletableFuture nbt = provider.getChunk(((CraftWorld) w).getHandle(), chunk.x, chunk.z);
return () -> {
- NBTTagCompound compound = nbt.join();
+ NBTTagCompound compound;
+ try {
+ compound = nbt.get();
+ } catch (InterruptedException e) {
+ return null;
+ } catch (ExecutionException e) {
+ throw new RuntimeException(e);
+ }
return compound == null ? null : parseChunkFromNBT(new NBT.NBTCompound(compound));
};
} catch (InvocationTargetException | IllegalAccessException ignored) {
diff --git a/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/AsyncChunkProvider119.java b/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/AsyncChunkProvider119.java
index ac93ee97..eef534b0 100644
--- a/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/AsyncChunkProvider119.java
+++ b/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/AsyncChunkProvider119.java
@@ -92,6 +92,9 @@ public class AsyncChunkProvider119 {
}
//prepare data synchronously
CompletableFuture> future = CompletableFuture.supplyAsync(() -> {
+ //Null will mean that we save with spigot methods, which may be risky on async
+ //Since we're not in main thread, it now refuses new tasks because of shutdown, the risk is lower
+ if (!Bukkit.isPrimaryThread()) return null;
try {
return getAsyncSaveData.invoke(null, world.getHandle(), c);
} catch (ReflectiveOperationException e) {
@@ -102,15 +105,21 @@ public class AsyncChunkProvider119 {
if (++currChunks > MapManager.mapman.getMaxChunkLoadsPerTick()) {
try {
Thread.sleep(25); //hold the lock so other threads also won't stress main thread
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
+ } catch (InterruptedException ignored) {}
}
//save data asynchronously
return () -> {
+ Object o = null;
try {
- return (NBTTagCompound) save.invoke(null, world.getHandle(), c, future.get());
- } catch (ReflectiveOperationException | ExecutionException | InterruptedException e) {
+ o = future.get();
+ return (NBTTagCompound) save.invoke(null, world.getHandle(), c, o);
+ } catch (InterruptedException e) {
+ return null;
+ } catch (InvocationTargetException e) {
+ //We tried to use simple spigot methods at shutdown and failed, hopes for reading from disk
+ if (o == null) return null;
+ throw new RuntimeException(e);
+ } catch (ReflectiveOperationException | ExecutionException e) {
throw new RuntimeException(e);
}
};
diff --git a/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/MapChunkCache119.java b/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/MapChunkCache119.java
index a94c0898..5ecbc277 100644
--- a/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/MapChunkCache119.java
+++ b/bukkit-helper-119/src/main/java/org/dynmap/bukkit/helper/v119/MapChunkCache119.java
@@ -19,6 +19,7 @@ import java.util.List;
import java.util.NoSuchElementException;
import java.util.concurrent.CancellationException;
import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
import java.util.function.Supplier;
/**
@@ -58,7 +59,14 @@ public class MapChunkCache119 extends GenericMapChunkCache {
try {
CompletableFuture nbt = provider.getChunk(((CraftWorld) w).getHandle(), chunk.x, chunk.z);
return () -> {
- NBTTagCompound compound = nbt.join();
+ NBTTagCompound compound;
+ try {
+ compound = nbt.get();
+ } catch (InterruptedException e) {
+ return null;
+ } catch (ExecutionException e) {
+ throw new RuntimeException(e);
+ }
return compound == null ? null : parseChunkFromNBT(new NBT.NBTCompound(compound));
};
} catch (InvocationTargetException | IllegalAccessException ignored) {
diff --git a/bukkit-helper/build.gradle b/bukkit-helper/build.gradle
index 83ece802..cece8590 100644
--- a/bukkit-helper/build.gradle
+++ b/bukkit-helper/build.gradle
@@ -11,6 +11,6 @@ description = 'bukkit-helper'
dependencies {
implementation project(':dynmap-api')
implementation project(path: ':DynmapCore', configuration: 'shadow')
- implementation group: 'org.bukkit', name: 'bukkit', version:'1.7.10-R0.1-SNAPSHOT'
+ implementation group: 'org.bukkit', name: 'bukkit', version:'1.10.2-R0.1-SNAPSHOT'
implementation group: 'com.google.code.gson', name: 'gson', version:'2.8.9'
}
diff --git a/fabric-1.16.4/src/main/resources/fabric.mod.json b/fabric-1.16.4/src/main/resources/fabric.mod.json
index 24d80f15..2a6863f6 100644
--- a/fabric-1.16.4/src/main/resources/fabric.mod.json
+++ b/fabric-1.16.4/src/main/resources/fabric.mod.json
@@ -28,6 +28,6 @@
"depends": {
"fabricloader": ">=0.12.12",
"fabric": ">=0.17.0",
- "minecraft": "1.16.x"
+ "minecraft": ["1.16.4", "1.16.5"]
}
}
diff --git a/fabric-1.18.2/src/main/resources/fabric.mod.json b/fabric-1.18.2/src/main/resources/fabric.mod.json
index 3abb52b0..3ccd3cfb 100644
--- a/fabric-1.18.2/src/main/resources/fabric.mod.json
+++ b/fabric-1.18.2/src/main/resources/fabric.mod.json
@@ -28,6 +28,6 @@
"depends": {
"fabricloader": ">=0.13.3",
"fabric": ">=0.47.8",
- "minecraft": ">=1.18.2"
+ "minecraft": "1.18.2"
}
}
diff --git a/fabric-1.19.1/src/main/resources/fabric.mod.json b/fabric-1.19.1/src/main/resources/fabric.mod.json
index 5aa6d270..67bb8404 100644
--- a/fabric-1.19.1/src/main/resources/fabric.mod.json
+++ b/fabric-1.19.1/src/main/resources/fabric.mod.json
@@ -28,6 +28,6 @@
"depends": {
"fabricloader": ">=0.14.8",
"fabric": ">=0.58.5",
- "minecraft": ">=1.19.1"
+ "minecraft": ["1.19.1", "1.19.2"]
}
}
diff --git a/fabric-1.19/src/main/resources/fabric.mod.json b/fabric-1.19/src/main/resources/fabric.mod.json
index 83e56af5..074ab540 100644
--- a/fabric-1.19/src/main/resources/fabric.mod.json
+++ b/fabric-1.19/src/main/resources/fabric.mod.json
@@ -28,6 +28,6 @@
"depends": {
"fabricloader": ">=0.14.6",
"fabric": ">=0.55.2",
- "minecraft": "1.19.x"
+ "minecraft": "1.19"
}
}
diff --git a/spigot/build.gradle b/spigot/build.gradle
index b84c5169..8f1da35a 100644
--- a/spigot/build.gradle
+++ b/spigot/build.gradle
@@ -17,12 +17,12 @@ repositories {
}
dependencies {
- implementation group: 'org.bukkit', name: 'bukkit', version: '1.7.10-R0.1-SNAPSHOT'
+ implementation group: 'org.bukkit', name: 'bukkit', version: '1.10.2-R0.1-SNAPSHOT'
implementation 'com.nijikokun.bukkit:Permissions:3.1.6'
implementation 'me.lucko.luckperms:luckperms-api:4.3'
implementation 'net.luckperms:api:5.0'
implementation('com.github.MilkBowl:VaultAPI:1.7') { transitive = false }
- compileOnly 'net.skinsrestorer:skinsrestorer-api:14.1.+'
+ compileOnly 'net.skinsrestorer:skinsrestorer-api:14.2.+'
implementation project(":dynmap-api")
implementation project(path: ":DynmapCore", configuration: "shadow")
implementation group: 'ru.tehkode', name: 'PermissionsEx', version: '1.19.1'
diff --git a/spigot/src/main/java/org/dynmap/bukkit/Armor.java b/spigot/src/main/java/org/dynmap/bukkit/Armor.java
deleted file mode 100644
index edd4bd3c..00000000
--- a/spigot/src/main/java/org/dynmap/bukkit/Armor.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.dynmap.bukkit;
-
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.PlayerInventory;
-
-public class Armor {
- /**
- * http://www.minecraftwiki.net/wiki/Item_Durability#Armor_durability
- * We rely on getArmorContents() to return 4 armor pieces in the order
- * of: boots, pants, chest, helmet
- */
- private static final int armorPoints[] = {3, 6, 8, 3};
-
- public static final int getArmorPoints(Player player) {
- int currentDurability = 0;
- int baseDurability = 0;
- int baseArmorPoints = 0;
- ItemStack[] itm = new ItemStack[4];
- PlayerInventory inv = player.getInventory();
- itm[0] = inv.getBoots();
- itm[1]= inv.getLeggings();
- itm[2] = inv.getChestplate();
- itm[3] = inv.getHelmet();
- for(int i = 0; i < 4; i++) {
- if(itm[i] == null) continue;
- int dur = itm[i].getDurability();
- int max = itm[i].getType().getMaxDurability();
- if(max <= 0) continue;
- if(i == 2)
- max = max + 1; /* Always 1 too low for chestplate */
- else
- max = max - 3; /* Always 3 too high, versus how client calculates it */
- baseDurability += max;
- currentDurability += max - dur;
- baseArmorPoints += armorPoints[i];
- }
- int ap = 0;
- if(baseDurability > 0)
- ap = ((baseArmorPoints - 1) * currentDurability) / baseDurability + 1;
- return ap;
- }
-}
diff --git a/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java b/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java
index a426a840..c4f6c3cf 100644
--- a/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java
+++ b/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java
@@ -30,6 +30,7 @@ import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
+import org.bukkit.attribute.Attribute;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
@@ -728,7 +729,7 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI {
@Override
public int getArmorPoints() {
if(player != null)
- return Armor.getArmorPoints(player);
+ return (int) player.getAttribute(Attribute.GENERIC_ARMOR).getValue();
else
return 0;
}