42433c2626
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 09f10fd9 SPIGOT-5950: Add PrepareSmithingEvent event CraftBukkit Changes: 7c03d257 SPIGOT-6011: End Gateways do not work on Non-Main End Worlds d492e363 SPIGOT-6015: Small Armor Stand doesn't drop items 5db13eea SPIGOT-5950: Add PrepareSmithingEvent event
89 lines
4.8 KiB
Diff
89 lines
4.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Joseph Hirschfeld <joe@ibj.io>
|
|
Date: Thu, 3 Mar 2016 02:48:12 -0600
|
|
Subject: [PATCH] Add velocity warnings
|
|
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
index dbc2fa67426794d7c023c5c984ca165d734652be..b2524582a59939aa0a4569bfbb03eb1cc64c3cab 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
@@ -262,6 +262,7 @@ public final class CraftServer implements Server {
|
|
public boolean ignoreVanillaPermissions = false;
|
|
private final List<CraftPlayer> playerView;
|
|
public int reloadCount;
|
|
+ public static Exception excessiveVelEx; // Paper - Velocity warnings
|
|
|
|
static {
|
|
ConfigurationSerialization.registerClass(CraftOfflinePlayer.class);
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
|
index 19669d7354d8cfa723e614ac3b471e703ee7feee..613081685e233074728366b9ff16642c04774c91 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
|
@@ -416,10 +416,41 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
|
|
public void setVelocity(Vector velocity) {
|
|
Preconditions.checkArgument(velocity != null, "velocity");
|
|
velocity.checkFinite();
|
|
+ // Paper start - Warn server owners when plugins try to set super high velocities
|
|
+ if (!(this instanceof org.bukkit.entity.Projectile) && isUnsafeVelocity(velocity)) {
|
|
+ CraftServer.excessiveVelEx = new Exception("Excessive velocity set detected: tried to set velocity of entity " + entity.getName() + " id #" + getEntityId() + " to (" + velocity.getX() + "," + velocity.getY() + "," + velocity.getZ() + ").");
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
entity.setMot(CraftVector.toNMS(velocity));
|
|
entity.velocityChanged = true;
|
|
}
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Checks if the given velocity is not necessarily safe in all situations.
|
|
+ * This function returning true does not mean the velocity is dangerous or to be avoided, only that it may be
|
|
+ * a detriment to performance on the server.
|
|
+ *
|
|
+ * It is not to be used as a hard rule of any sort.
|
|
+ * Paper only uses it to warn server owners in watchdog crashes.
|
|
+ *
|
|
+ * @param vel incoming velocity to check
|
|
+ * @return if the velocity has the potential to be a performance detriment
|
|
+ */
|
|
+ private static boolean isUnsafeVelocity(Vector vel) {
|
|
+ final double x = vel.getX();
|
|
+ final double y = vel.getY();
|
|
+ final double z = vel.getZ();
|
|
+
|
|
+ if (x > 4 || x < -4 || y > 4 || y < -4 || z > 4 || z < -4) {
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ return false;
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
@Override
|
|
public double getHeight() {
|
|
return getHandle().getHeight();
|
|
diff --git a/src/main/java/org/spigotmc/WatchdogThread.java b/src/main/java/org/spigotmc/WatchdogThread.java
|
|
index 73fa74e3cc0239a38cd2ba41b3e9e991a5c4ebf9..d9610006113e5f67c2feeea332b2920230822d41 100644
|
|
--- a/src/main/java/org/spigotmc/WatchdogThread.java
|
|
+++ b/src/main/java/org/spigotmc/WatchdogThread.java
|
|
@@ -76,7 +76,19 @@ public class WatchdogThread extends Thread
|
|
log.log( Level.SEVERE, "During the run of the server, a physics stackoverflow was supressed" );
|
|
log.log( Level.SEVERE, "near " + net.minecraft.server.World.lastPhysicsProblem );
|
|
}
|
|
- //
|
|
+ // Paper start - Warn in watchdog if an excessive velocity was ever set
|
|
+ if ( org.bukkit.craftbukkit.CraftServer.excessiveVelEx != null )
|
|
+ {
|
|
+ log.log( Level.SEVERE, "------------------------------" );
|
|
+ log.log( Level.SEVERE, "During the run of the server, a plugin set an excessive velocity on an entity" );
|
|
+ log.log( Level.SEVERE, "This may be the cause of the issue, or it may be entirely unrelated" );
|
|
+ log.log( Level.SEVERE, org.bukkit.craftbukkit.CraftServer.excessiveVelEx.getMessage());
|
|
+ for ( StackTraceElement stack : org.bukkit.craftbukkit.CraftServer.excessiveVelEx.getStackTrace() )
|
|
+ {
|
|
+ log.log( Level.SEVERE, "\t\t" + stack );
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
log.log( Level.SEVERE, "------------------------------" );
|
|
log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Paper!):" ); // Paper
|
|
dumpThread( ManagementFactory.getThreadMXBean().getThreadInfo( MinecraftServer.getServer().serverThread.getId(), Integer.MAX_VALUE ), log );
|