3
0
Mirror von https://github.com/PaperMC/Paper.git synchronisiert 2024-12-18 04:20:08 +01:00

chore: cleanup annotations in api adventure patch

Dieser Commit ist enthalten in:
Riley Park 2023-03-23 09:49:24 -07:00
Ursprung 92f872c146
Commit 9087a644a3
67 geänderte Dateien mit 1427 neuen und 1365 gelöschten Zeilen

Datei anzeigen

@ -8,6 +8,7 @@ Subject: [PATCH] Test changes
- Ignore package-private methods for nullability annotations - Ignore package-private methods for nullability annotations
- Add excludes for classes which don't pass - Add excludes for classes which don't pass
Co-authored-by: Riley Park <rileysebastianpark@gmail.com>
Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com> Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com>
diff --git a/build.gradle.kts b/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts
@ -143,10 +144,25 @@ index 0000000000000000000000000000000000000000..756acf231b1b076b08046d86992ba7ce
+ +
+} +}
diff --git a/src/test/java/org/bukkit/AnnotationTest.java b/src/test/java/org/bukkit/AnnotationTest.java diff --git a/src/test/java/org/bukkit/AnnotationTest.java b/src/test/java/org/bukkit/AnnotationTest.java
index 4ac3dd977e75cd8464163351d306e037ee32cb48..8f35cda0d67ec66646c6096a5bf1c84891b8b0fd 100644 index 4ac3dd977e75cd8464163351d306e037ee32cb48..c26ea217927ba77611e6ae93f8df50a83bceb3dd 100644
--- a/src/test/java/org/bukkit/AnnotationTest.java --- a/src/test/java/org/bukkit/AnnotationTest.java
+++ b/src/test/java/org/bukkit/AnnotationTest.java +++ b/src/test/java/org/bukkit/AnnotationTest.java
@@ -40,7 +40,17 @@ public class AnnotationTest { @@ -29,7 +29,13 @@ public class AnnotationTest {
"Lorg/jetbrains/annotations/Nullable;",
"Lorg/jetbrains/annotations/NotNull;",
"Lorg/jetbrains/annotations/Contract;",
- "Lorg/bukkit/UndefinedNullability;"
+ "Lorg/bukkit/UndefinedNullability;",
+ // Paper start
+ "Lorg/checkerframework/checker/nullness/qual/MonotonicNonNull;",
+ "Lorg/checkerframework/checker/nullness/qual/NonNull;",
+ "Lorg/checkerframework/checker/nullness/qual/Nullable;",
+ "Lorg/checkerframework/checker/nullness/qual/PolyNull;",
+ // Paper end
};
private static final String[] EXCLUDED_CLASSES = {
@@ -40,7 +46,17 @@ public class AnnotationTest {
"org/bukkit/util/io/Wrapper", "org/bukkit/util/io/Wrapper",
"org/bukkit/plugin/java/PluginClassLoader", "org/bukkit/plugin/java/PluginClassLoader",
// Generic functional interface // Generic functional interface
@ -165,7 +181,7 @@ index 4ac3dd977e75cd8464163351d306e037ee32cb48..8f35cda0d67ec66646c6096a5bf1c848
}; };
@Test @Test
@@ -67,14 +77,40 @@ public class AnnotationTest { @@ -67,14 +83,40 @@ public class AnnotationTest {
} }
if (mustBeAnnotated(Type.getReturnType(method.desc)) && !isWellAnnotated(method.invisibleAnnotations)) { if (mustBeAnnotated(Type.getReturnType(method.desc)) && !isWellAnnotated(method.invisibleAnnotations)) {
@ -176,7 +192,7 @@ index 4ac3dd977e75cd8464163351d306e037ee32cb48..8f35cda0d67ec66646c6096a5bf1c848
+ } else if (method.invisibleTypeAnnotations != null) { + } else if (method.invisibleTypeAnnotations != null) {
+ dance: for (final org.objectweb.asm.tree.TypeAnnotationNode invisibleTypeAnnotation : method.invisibleTypeAnnotations) { + dance: for (final org.objectweb.asm.tree.TypeAnnotationNode invisibleTypeAnnotation : method.invisibleTypeAnnotations) {
+ final org.objectweb.asm.TypeReference ref = new org.objectweb.asm.TypeReference(invisibleTypeAnnotation.typeRef); + final org.objectweb.asm.TypeReference ref = new org.objectweb.asm.TypeReference(invisibleTypeAnnotation.typeRef);
+ if (ref.getSort() == org.objectweb.asm.TypeReference.METHOD_RETURN && java.util.Arrays.binarySearch(ACCEPTED_ANNOTATIONS, invisibleTypeAnnotation.desc) >= 0) { + if (ref.getSort() == org.objectweb.asm.TypeReference.METHOD_RETURN && java.util.Arrays.asList(ACCEPTED_ANNOTATIONS).contains(invisibleTypeAnnotation.desc)) {
+ warn = false; + warn = false;
+ break dance; // cha cha real smooth + break dance; // cha cha real smooth
+ } + }
@ -197,7 +213,7 @@ index 4ac3dd977e75cd8464163351d306e037ee32cb48..8f35cda0d67ec66646c6096a5bf1c848
+ if (method.invisibleTypeAnnotations != null) { + if (method.invisibleTypeAnnotations != null) {
+ for (final org.objectweb.asm.tree.TypeAnnotationNode invisibleTypeAnnotation : method.invisibleTypeAnnotations) { + for (final org.objectweb.asm.tree.TypeAnnotationNode invisibleTypeAnnotation : method.invisibleTypeAnnotations) {
+ final org.objectweb.asm.TypeReference ref = new org.objectweb.asm.TypeReference(invisibleTypeAnnotation.typeRef); + final org.objectweb.asm.TypeReference ref = new org.objectweb.asm.TypeReference(invisibleTypeAnnotation.typeRef);
+ if (ref.getSort() == org.objectweb.asm.TypeReference.METHOD_FORMAL_PARAMETER && ref.getTypeParameterIndex() == i && java.util.Arrays.binarySearch(ACCEPTED_ANNOTATIONS, invisibleTypeAnnotation.desc) >= 0) { + if (ref.getSort() == org.objectweb.asm.TypeReference.METHOD_FORMAL_PARAMETER && ref.getTypeParameterIndex() == i && java.util.Arrays.asList(ACCEPTED_ANNOTATIONS).contains(invisibleTypeAnnotation.desc)) {
+ continue dancing; + continue dancing;
+ } + }
+ } + }
@ -206,7 +222,7 @@ index 4ac3dd977e75cd8464163351d306e037ee32cb48..8f35cda0d67ec66646c6096a5bf1c848
ParameterNode paramNode = parameters == null ? null : parameters.get(i); ParameterNode paramNode = parameters == null ? null : parameters.get(i);
String paramName = paramNode == null ? null : paramNode.name; String paramName = paramNode == null ? null : paramNode.name;
@@ -91,13 +127,18 @@ public class AnnotationTest { @@ -91,13 +133,18 @@ public class AnnotationTest {
Collections.sort(errors); Collections.sort(errors);
@ -229,7 +245,7 @@ index 4ac3dd977e75cd8464163351d306e037ee32cb48..8f35cda0d67ec66646c6096a5bf1c848
} }
private static void collectClasses(@NotNull File from, @NotNull Map<String, ClassNode> to) throws IOException { private static void collectClasses(@NotNull File from, @NotNull Map<String, ClassNode> to) throws IOException {
@@ -140,6 +181,11 @@ public class AnnotationTest { @@ -140,6 +187,11 @@ public class AnnotationTest {
// Exceptions are excluded // Exceptions are excluded
return false; return false;
} }
@ -241,7 +257,7 @@ index 4ac3dd977e75cd8464163351d306e037ee32cb48..8f35cda0d67ec66646c6096a5bf1c848
for (String excludedClass : EXCLUDED_CLASSES) { for (String excludedClass : EXCLUDED_CLASSES) {
if (excludedClass.equals(clazz.name)) { if (excludedClass.equals(clazz.name)) {
@@ -152,7 +198,7 @@ public class AnnotationTest { @@ -152,7 +204,7 @@ public class AnnotationTest {
private static boolean isMethodIncluded(@NotNull ClassNode clazz, @NotNull MethodNode method, @NotNull Map<String, ClassNode> allClasses) { private static boolean isMethodIncluded(@NotNull ClassNode clazz, @NotNull MethodNode method, @NotNull Map<String, ClassNode> allClasses) {
// Exclude private, synthetic and deprecated methods // Exclude private, synthetic and deprecated methods
@ -250,7 +266,7 @@ index 4ac3dd977e75cd8464163351d306e037ee32cb48..8f35cda0d67ec66646c6096a5bf1c848
return false; return false;
} }
@@ -170,11 +216,30 @@ public class AnnotationTest { @@ -170,11 +222,30 @@ public class AnnotationTest {
if ("<init>".equals(method.name) && isAnonymous(clazz)) { if ("<init>".equals(method.name) && isAnonymous(clazz)) {
return false; return false;
} }
@ -272,12 +288,12 @@ index 4ac3dd977e75cd8464163351d306e037ee32cb48..8f35cda0d67ec66646c6096a5bf1c848
+ return true; + return true;
+ } + }
+ } + }
+
- private static boolean isWellAnnotated(@Nullable List<AnnotationNode> annotations) {
+ return false; + return false;
+ } + }
+ // Paper end + // Paper end
+
- private static boolean isWellAnnotated(@Nullable List<AnnotationNode> annotations) {
+ private static boolean isWellAnnotated(@Nullable List<? extends AnnotationNode> annotations) { // Paper + private static boolean isWellAnnotated(@Nullable List<? extends AnnotationNode> annotations) { // Paper
if (annotations == null) { if (annotations == null) {
return false; return false;

Datei-Diff unterdrückt, da er zu groß ist Diff laden

Datei anzeigen

@ -2194,7 +2194,7 @@ index 2f74ec96ece706de23156ebabfe493211bc05391..302319acbc257a075adfb78d9f5c49fd
- javaPlugin.init(loader, loader.server, description, dataFolder, file, this); - javaPlugin.init(loader, loader.server, description, dataFolder, file, this);
+ javaPlugin.init(null, org.bukkit.Bukkit.getServer(), description, dataFolder, file, this); // Paper + javaPlugin.init(null, org.bukkit.Bukkit.getServer(), description, dataFolder, file, this); // Paper
+ } }
+ +
+ // Paper start + // Paper start
+ @Override + @Override
@ -2219,7 +2219,7 @@ index 2f74ec96ece706de23156ebabfe493211bc05391..302319acbc257a075adfb78d9f5c49fd
+ Class<? extends org.bukkit.configuration.serialization.ConfigurationSerializable> serializable = clazz.asSubclass(org.bukkit.configuration.serialization.ConfigurationSerializable.class); + Class<? extends org.bukkit.configuration.serialization.ConfigurationSerializable> serializable = clazz.asSubclass(org.bukkit.configuration.serialization.ConfigurationSerializable.class);
+ org.bukkit.configuration.serialization.ConfigurationSerialization.unregisterClass(serializable); + org.bukkit.configuration.serialization.ConfigurationSerialization.unregisterClass(serializable);
+ } + }
} + }
+ +
+ @Override + @Override
+ public @Nullable io.papermc.paper.plugin.provider.classloader.PluginClassLoaderGroup getGroup() { + public @Nullable io.papermc.paper.plugin.provider.classloader.PluginClassLoaderGroup getGroup() {

Datei anzeigen

@ -2791,7 +2791,7 @@ index 0000000000000000000000000000000000000000..5989ee21297935651b0edd44b8239e65
+ } + }
+} +}
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
index 0084898567e8bb74fa271b65b56523a5c26d387c..e24589a4cb42b0163e4a1455b8b11d7130b5cd41 100644 index 16ec0cd908659d6d53e565281b8db9f81951277d..92b3c40959eac827ed8861fec8658e57f2910628 100644
--- a/src/main/java/org/bukkit/Bukkit.java --- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java
@@ -802,7 +802,6 @@ public final class Bukkit { @@ -802,7 +802,6 @@ public final class Bukkit {
@ -2803,7 +2803,7 @@ index 0084898567e8bb74fa271b65b56523a5c26d387c..e24589a4cb42b0163e4a1455b8b11d71
/** /**
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index 892e03189957b0072827be4fd485dd98352334e8..ac087402c90dad4b3c499fcf8507e50e9099cea5 100644 index 0a333c1439b3623d38029b88ce6d5ff159ae1ddd..bce277cd3a452769cd86dc017a2e548a170d6acc 100644
--- a/src/main/java/org/bukkit/Server.java --- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java
@@ -1768,6 +1768,26 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi @@ -1768,6 +1768,26 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@ -2886,7 +2886,7 @@ index 0000000000000000000000000000000000000000..f9a00aecca5ec41b460bf41dfe1c6969
+ } + }
+} +}
diff --git a/src/main/java/org/bukkit/command/Command.java b/src/main/java/org/bukkit/command/Command.java diff --git a/src/main/java/org/bukkit/command/Command.java b/src/main/java/org/bukkit/command/Command.java
index caa29be46e8541b69ec47c181eb3320d6515b544..6fd341482d5250ad814e870360e40b52427f799a 100644 index 75759131bd94b672bec4cd8e271ebff1ad391cba..5cfd88eec9bf02e83d77b6fce1a5c14b7687f48b 100644
--- a/src/main/java/org/bukkit/command/Command.java --- a/src/main/java/org/bukkit/command/Command.java
+++ b/src/main/java/org/bukkit/command/Command.java +++ b/src/main/java/org/bukkit/command/Command.java
@@ -33,7 +33,8 @@ public abstract class Command { @@ -33,7 +33,8 @@ public abstract class Command {
@ -3392,7 +3392,7 @@ index 516d7fc7812aac343782861d0d567f54aa578c2a..00000000000000000000000000000000
- // Spigot end - // Spigot end
-} -}
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
index baf0887ec941533f8007f2c7f7ab78f16b45bd74..8d8a540c844e5365eed75a87db197a8fd4249bcd 100644 index fbf56bcc4540f7f1a8ced7cc2cd96e291c1ac273..8602b96bfc860ff1fea4c1c7a3655ce3a9516cf4 100644
--- a/src/main/java/org/bukkit/entity/Player.java --- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java
@@ -2077,7 +2077,14 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -2077,7 +2077,14 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
@ -3400,12 +3400,12 @@ index baf0887ec941533f8007f2c7f7ab78f16b45bd74..8d8a540c844e5365eed75a87db197a8f
public void sendMessage(@NotNull net.md_5.bungee.api.ChatMessageType position, @Nullable java.util.UUID sender, @NotNull net.md_5.bungee.api.chat.BaseComponent... components) { public void sendMessage(@NotNull net.md_5.bungee.api.ChatMessageType position, @Nullable java.util.UUID sender, @NotNull net.md_5.bungee.api.chat.BaseComponent... components) {
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
+ +
+ } }
+ +
+ // Paper start + // Paper start
+ public int getPing() { + public int getPing() {
+ throw new UnsupportedOperationException( "Not supported yet." ); + throw new UnsupportedOperationException( "Not supported yet." );
} + }
+ // Paper end + // Paper end
} }
@ -3611,7 +3611,8 @@ index 44badfedcc3fdc26bdc293b85d8c781d6f659faa..123647bb10fc89508437d7a0bd3fd31d
public CustomTimingsHandler(@NotNull String name) { public CustomTimingsHandler(@NotNull String name) {
- this(name, null); - this(name, null);
- } - }
- + Timing timing;
- public CustomTimingsHandler(@NotNull String name, @Nullable CustomTimingsHandler parent) { - public CustomTimingsHandler(@NotNull String name, @Nullable CustomTimingsHandler parent) {
- this.name = name; - this.name = name;
- this.parent = parent; - this.parent = parent;
@ -3634,7 +3635,16 @@ index 44badfedcc3fdc26bdc293b85d8c781d6f659faa..123647bb10fc89508437d7a0bd3fd31d
- long avg = time / count; - long avg = time / count;
- -
- printStream.println(" " + timings.name + " Time: " + time + " Count: " + count + " Avg: " + avg + " Violations: " + timings.violations); - printStream.println(" " + timings.name + " Time: " + time + " Count: " + count + " Avg: " + avg + " Violations: " + timings.violations);
- } + new AuthorNagException("Deprecated use of CustomTimingsHandler. Please Switch to Timings.of ASAP").printStackTrace();
+ try {
+ final Method ofSafe = TimingsManager.class.getDeclaredMethod("getHandler", String.class, String.class, Timing.class);
+ ofSafe.setAccessible(true);
+ timing = (Timing) ofSafe.invoke(null,"Minecraft", "(Deprecated API) " + name, null);
+ } catch (Exception e) {
+ e.printStackTrace();
+ Bukkit.getLogger().log(Level.SEVERE, "This handler could not be registered");
+ timing = Timings.NULL_HANDLER;
}
- printStream.println("# Version " + Bukkit.getVersion()); - printStream.println("# Version " + Bukkit.getVersion());
- int entities = 0; - int entities = 0;
- int livingEntities = 0; - int livingEntities = 0;
@ -3644,8 +3654,9 @@ index 44badfedcc3fdc26bdc293b85d8c781d6f659faa..123647bb10fc89508437d7a0bd3fd31d
- } - }
- printStream.println("# Entities " + entities); - printStream.println("# Entities " + entities);
- printStream.println("# LivingEntities " + livingEntities); - printStream.println("# LivingEntities " + livingEntities);
- } + handler = timing;
- }
- /** - /**
- * Resets all timings. - * Resets all timings.
- */ - */
@ -3657,7 +3668,9 @@ index 44badfedcc3fdc26bdc293b85d8c781d6f659faa..123647bb10fc89508437d7a0bd3fd31d
- } - }
- TimingsCommand.timingStart = System.nanoTime(); - TimingsCommand.timingStart = System.nanoTime();
- } - }
- + public void startTiming() { handler.startTiming(); }
+ public void stopTiming() { handler.stopTiming(); }
- /** - /**
- * Ticked every tick by CraftBukkit to count the number of times a timer - * Ticked every tick by CraftBukkit to count the number of times a timer
- * caused TPS loss. - * caused TPS loss.
@ -3673,8 +3686,7 @@ index 44badfedcc3fdc26bdc293b85d8c781d6f659faa..123647bb10fc89508437d7a0bd3fd31d
- } - }
- } - }
- } - }
+ Timing timing; -
- /** - /**
- * Starts timing to track a section of code. - * Starts timing to track a section of code.
- */ - */
@ -3685,19 +3697,9 @@ index 44badfedcc3fdc26bdc293b85d8c781d6f659faa..123647bb10fc89508437d7a0bd3fd31d
- if (parent != null && ++parent.timingDepth == 1) { - if (parent != null && ++parent.timingDepth == 1) {
- parent.start = start; - parent.start = start;
- } - }
+ new AuthorNagException("Deprecated use of CustomTimingsHandler. Please Switch to Timings.of ASAP").printStackTrace(); - }
+ try { - }
+ final Method ofSafe = TimingsManager.class.getDeclaredMethod("getHandler", String.class, String.class, Timing.class); -
+ ofSafe.setAccessible(true);
+ timing = (Timing) ofSafe.invoke(null,"Minecraft", "(Deprecated API) " + name, null);
+ } catch (Exception e) {
+ e.printStackTrace();
+ Bukkit.getLogger().log(Level.SEVERE, "This handler could not be registered");
+ timing = Timings.NULL_HANDLER;
}
+ handler = timing;
}
- /** - /**
- * Stops timing a section of code. - * Stops timing a section of code.
- */ - */
@ -3716,9 +3718,7 @@ index 44badfedcc3fdc26bdc293b85d8c781d6f659faa..123647bb10fc89508437d7a0bd3fd31d
- } - }
- } - }
- } - }
+ public void startTiming() { handler.startTiming(); } -
+ public void stopTiming() { handler.stopTiming(); }
- /** - /**
- * Reset this timer, setting all values to zero. - * Reset this timer, setting all values to zero.
- */ - */

Datei anzeigen

@ -8,7 +8,7 @@ diff --git a/src/main/java/org/bukkit/event/entity/EntityRegainHealthEvent.java
index 8feb6698f9630f099be99e52d1149cd6bc615197..d51d2ec1d04d9ea8a25a70d0d856f2355ebfcb4a 100644 index 8feb6698f9630f099be99e52d1149cd6bc615197..d51d2ec1d04d9ea8a25a70d0d856f2355ebfcb4a 100644
--- a/src/main/java/org/bukkit/event/entity/EntityRegainHealthEvent.java --- a/src/main/java/org/bukkit/event/entity/EntityRegainHealthEvent.java
+++ b/src/main/java/org/bukkit/event/entity/EntityRegainHealthEvent.java +++ b/src/main/java/org/bukkit/event/entity/EntityRegainHealthEvent.java
@@ -13,12 +13,31 @@ public class EntityRegainHealthEvent extends EntityEvent implements Cancellable @@ -13,13 +13,32 @@ public class EntityRegainHealthEvent extends EntityEvent implements Cancellable
private boolean cancelled; private boolean cancelled;
private double amount; private double amount;
private final RegainReason regainReason; private final RegainReason regainReason;
@ -25,8 +25,8 @@ index 8feb6698f9630f099be99e52d1149cd6bc615197..d51d2ec1d04d9ea8a25a70d0d856f235
this.amount = amount; this.amount = amount;
this.regainReason = regainReason; this.regainReason = regainReason;
+ this.isFastRegen = isFastRegen; // Paper + this.isFastRegen = isFastRegen; // Paper
+ } }
+
+ // Paper start - Add getter for isFastRegen + // Paper start - Add getter for isFastRegen
+ /** + /**
+ * Is this event a result of the fast regeneration mechanic + * Is this event a result of the fast regeneration mechanic
@ -35,8 +35,9 @@ index 8feb6698f9630f099be99e52d1149cd6bc615197..d51d2ec1d04d9ea8a25a70d0d856f235
+ */ + */
+ public boolean isFastRegen() { + public boolean isFastRegen() {
+ return isFastRegen; + return isFastRegen;
} + }
+ // Paper end + // Paper end
+
/** /**
* Gets the amount of regained health * Gets the amount of regained health
*

Datei anzeigen

@ -32,11 +32,11 @@ index af4a7ce37eb10bab06eadb6583c7894b3ec55ae6..159e5a908b35b84b7fabc36581e093d9
// Paper end // Paper end
} }
diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java
index 9da047582e9648d84875b6d3c136960bbb97b70e..87f7942082ad943a97058f58c09ea2fe9caf5bfe 100644 index 9d327f0832c40d4a8d212346284274f6cf78834f..09a36df6edce2a283df80c67d5ef62da7ff73555 100644
--- a/src/main/java/org/bukkit/inventory/ItemStack.java --- a/src/main/java/org/bukkit/inventory/ItemStack.java
+++ b/src/main/java/org/bukkit/inventory/ItemStack.java +++ b/src/main/java/org/bukkit/inventory/ItemStack.java
@@ -618,5 +618,20 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat @@ -618,5 +618,20 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
public @NotNull net.kyori.adventure.text.Component displayName() { public net.kyori.adventure.text.@NotNull Component displayName() {
return Bukkit.getServer().getItemFactory().displayName(this); return Bukkit.getServer().getItemFactory().displayName(this);
} }
+ +

Datei anzeigen

@ -578,7 +578,7 @@ index 270e6d8ad4358baa256cee5f16cff281f063ce3b..4a3451af454295ac3e1b688e6665cad9
@Override @Override
diff --git a/src/test/java/org/bukkit/AnnotationTest.java b/src/test/java/org/bukkit/AnnotationTest.java diff --git a/src/test/java/org/bukkit/AnnotationTest.java b/src/test/java/org/bukkit/AnnotationTest.java
index 9825db30d42701aad5d9970bbb989fbff0142fb1..2cb81e6d253d70388da15c9d07b630277d486c70 100644 index c26ea217927ba77611e6ae93f8df50a83bceb3dd..06e96e5c98f1a7a68c8b4b5e527314c1aa774e38 100644
--- a/src/test/java/org/bukkit/AnnotationTest.java --- a/src/test/java/org/bukkit/AnnotationTest.java
+++ b/src/test/java/org/bukkit/AnnotationTest.java +++ b/src/test/java/org/bukkit/AnnotationTest.java
@@ -48,6 +48,8 @@ public class AnnotationTest { @@ -48,6 +48,8 @@ public class AnnotationTest {

Datei anzeigen

@ -10,7 +10,7 @@ of giving the player experience points.
Both an API To standalone mend, and apply mending logic to .giveExp has been added. Both an API To standalone mend, and apply mending logic to .giveExp has been added.
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
index 2f2cce2a8b4b26fbe85da10f55f7313112b05435..af92443e50b66e526d382c820e1b2e27c6e1b461 100644 index dbe15267053cfd6bdac093f798dda1cb5aff02c4..95130fde38e7fcec4139fac97df25d82e0a79587 100644
--- a/src/main/java/org/bukkit/entity/Player.java --- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java
@@ -1128,12 +1128,33 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -1128,12 +1128,33 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
@ -18,21 +18,21 @@ index 2f2cce2a8b4b26fbe85da10f55f7313112b05435..af92443e50b66e526d382c820e1b2e27
public void resetPlayerWeather(); public void resetPlayerWeather();
+ // Paper start + // Paper start
+ /**
+ * Gives the player the amount of experience specified.
+ *
+ * @param amount Exp amount to give
+ */
+ public default void giveExp(int amount) {
+ giveExp(amount, false);
+ }
/** /**
* Gives the player the amount of experience specified. * Gives the player the amount of experience specified.
* *
* @param amount Exp amount to give * @param amount Exp amount to give
+ * @param applyMending Mend players items with mending, with same behavior as picking up orbs. calls {@link #applyMending(int)}
*/ */
- public void giveExp(int amount); - public void giveExp(int amount);
+ public default void giveExp(int amount) {
+ giveExp(amount, false);
+ }
+ /**
+ * Gives the player the amount of experience specified.
+ *
+ * @param amount Exp amount to give
+ * @param applyMending Mend players items with mending, with same behavior as picking up orbs. calls {@link #applyMending(int)}
+ */
+ public void giveExp(int amount, boolean applyMending); + public void giveExp(int amount, boolean applyMending);
+ +
+ /** + /**

Datei anzeigen

@ -18,7 +18,7 @@ index d4d7ad9c3c953680342c121f39ddaef476549047..719d0d878320c1903b44076053989ba9
+ public void setConsumeArrow(boolean consumeArrow) { + public void setConsumeArrow(boolean consumeArrow) {
+ this.setConsumeItem(consumeArrow); + this.setConsumeItem(consumeArrow);
+ } + }
+
+ @Deprecated + @Deprecated
+ public boolean getConsumeArrow() { + public boolean getConsumeArrow() {
+ return this.shouldConsumeItem(); + return this.shouldConsumeItem();
@ -33,7 +33,7 @@ index d4d7ad9c3c953680342c121f39ddaef476549047..719d0d878320c1903b44076053989ba9
+ public EntityShootBowEvent(@NotNull final LivingEntity shooter, @Nullable final ItemStack bow, @NotNull final Entity projectile, final float force) { + public EntityShootBowEvent(@NotNull final LivingEntity shooter, @Nullable final ItemStack bow, @NotNull final Entity projectile, final float force) {
+ this(shooter, bow, new ItemStack(org.bukkit.Material.AIR), projectile, force); + this(shooter, bow, new ItemStack(org.bukkit.Material.AIR), projectile, force);
+ } + }
+
+ @Deprecated + @Deprecated
+ public EntityShootBowEvent(@NotNull final LivingEntity shooter, @Nullable final ItemStack bow, @NotNull ItemStack arrowItem, @NotNull final Entity projectile, final float force) { + public EntityShootBowEvent(@NotNull final LivingEntity shooter, @Nullable final ItemStack bow, @NotNull ItemStack arrowItem, @NotNull final Entity projectile, final float force) {
+ this(shooter, bow, arrowItem, projectile, EquipmentSlot.HAND, force, true); + this(shooter, bow, arrowItem, projectile, EquipmentSlot.HAND, force, true);

Datei anzeigen

@ -8,7 +8,7 @@ diff --git a/src/main/java/org/bukkit/inventory/Inventory.java b/src/main/java/o
index 5576a6a8df8c95164bf2dde45d756ce8b7ec957a..f1a48eab1a357ae64545e1f1dc941c383cff8707 100644 index 5576a6a8df8c95164bf2dde45d756ce8b7ec957a..f1a48eab1a357ae64545e1f1dc941c383cff8707 100644
--- a/src/main/java/org/bukkit/inventory/Inventory.java --- a/src/main/java/org/bukkit/inventory/Inventory.java
+++ b/src/main/java/org/bukkit/inventory/Inventory.java +++ b/src/main/java/org/bukkit/inventory/Inventory.java
@@ -104,7 +104,9 @@ public interface Inventory extends Iterable<ItemStack> { @@ -104,7 +104,37 @@ public interface Inventory extends Iterable<ItemStack> {
public HashMap<Integer, ItemStack> addItem(@NotNull ItemStack... items) throws IllegalArgumentException; public HashMap<Integer, ItemStack> addItem(@NotNull ItemStack... items) throws IllegalArgumentException;
/** /**
@ -16,25 +16,6 @@ index 5576a6a8df8c95164bf2dde45d756ce8b7ec957a..f1a48eab1a357ae64545e1f1dc941c38
+ * Removes the given ItemStacks from the storage contents of the inventory. + * Removes the given ItemStacks from the storage contents of the inventory.
+ * For removing ItemStacks from the inventories that have other content groups, + * For removing ItemStacks from the inventories that have other content groups,
+ * like Player inventories, see {@link #removeItemAnySlot(ItemStack...)}. + * like Player inventories, see {@link #removeItemAnySlot(ItemStack...)}.
* <p>
* It will try to remove 'as much as possible' from the types and amounts
* you give as arguments.
@@ -121,10 +123,39 @@ public interface Inventory extends Iterable<ItemStack> {
* @param items The ItemStacks to remove
* @return A HashMap containing items that couldn't be removed.
* @throws IllegalArgumentException if items is null
+ * @see #removeItemAnySlot(ItemStack...)
*/
@NotNull
public HashMap<Integer, ItemStack> removeItem(@NotNull ItemStack... items) throws IllegalArgumentException;
+ // Paper start
+ /**
+ * Searches all possible inventory slots in order to remove the given ItemStacks.
+ * <p>
+ * Similar to {@link Inventory#removeItem(ItemStack...)} in behavior, except this
+ * method will check all possible slots in the inventory, rather than just the main
+ * storage contents.
+ * <p> + * <p>
+ * It will try to remove 'as much as possible' from the types and amounts + * It will try to remove 'as much as possible' from the types and amounts
+ * you give as arguments. + * you give as arguments.
@ -51,11 +32,28 @@ index 5576a6a8df8c95164bf2dde45d756ce8b7ec957a..f1a48eab1a357ae64545e1f1dc941c38
+ * @param items The ItemStacks to remove + * @param items The ItemStacks to remove
+ * @return A HashMap containing items that couldn't be removed. + * @return A HashMap containing items that couldn't be removed.
+ * @throws IllegalArgumentException if items is null + * @throws IllegalArgumentException if items is null
+ * @see #removeItemAnySlot(ItemStack...)
+ */ + */
+ @NotNull + @NotNull
+ public HashMap<Integer, ItemStack> removeItem(@NotNull ItemStack... items) throws IllegalArgumentException;
+
+ // Paper start
+ /**
+ * Searches all possible inventory slots in order to remove the given ItemStacks.
+ * <p>
+ * Similar to {@link Inventory#removeItem(ItemStack...)} in behavior, except this
+ * method will check all possible slots in the inventory, rather than just the main
+ * storage contents.
* <p>
* It will try to remove 'as much as possible' from the types and amounts
* you give as arguments.
@@ -123,7 +153,8 @@ public interface Inventory extends Iterable<ItemStack> {
* @throws IllegalArgumentException if items is null
*/
@NotNull
- public HashMap<Integer, ItemStack> removeItem(@NotNull ItemStack... items) throws IllegalArgumentException;
+ public HashMap<Integer, ItemStack> removeItemAnySlot(@NotNull ItemStack... items) throws IllegalArgumentException; + public HashMap<Integer, ItemStack> removeItemAnySlot(@NotNull ItemStack... items) throws IllegalArgumentException;
+ // Paper end + // Paper end
+
/** /**
* Returns all ItemStacks from the inventory * Returns all ItemStacks from the inventory
*

Datei anzeigen

@ -5,7 +5,7 @@ Subject: [PATCH] Expand world key API
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
index ceb8d207843df5ddc852d44928286648a652eedb..197cf8cdd3d51c3e01ec737981601f37764315c6 100644 index 95a981218615b9ed167a317aaa5224e9613aa42a..244c836dd24cb49f6219634e3f323befcd68d9da 100644
--- a/src/main/java/org/bukkit/Bukkit.java --- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java
@@ -811,6 +811,18 @@ public final class Bukkit { @@ -811,6 +811,18 @@ public final class Bukkit {
@ -56,7 +56,7 @@ index 2fa3de66107162ccaa158b369e2c4a926ecaff92..aa534b1a9a1fb84a2fbd4b372f313bb4
// Paper end // Paper end
} }
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index 02b898d441c42771903d5839c3cde544b1a25778..1a3b4f20c7126caf8a34040028f735083bf47150 100644 index 3327810c2ae80b47f6ccbc5b2034b880a774879f..8390b1d4718a4c67d222e19609462d20c36506b7 100644
--- a/src/main/java/org/bukkit/Server.java --- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java
@@ -671,6 +671,17 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi @@ -671,6 +671,17 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@ -104,16 +104,20 @@ index cbe6b3a1ba7b04826d97c3558e8eb4e5ba11f92f..cbdcac688afb7c13dd7058fa522bbd2c
private final String name; private final String name;
private long seed; private long seed;
private World.Environment environment = World.Environment.NORMAL; private World.Environment environment = World.Environment.NORMAL;
@@ -28,13 +29,80 @@ public class WorldCreator { @@ -28,14 +29,81 @@ public class WorldCreator {
* @param name Name of the world that will be created * @param name Name of the world that will be created
*/ */
public WorldCreator(@NotNull String name) { public WorldCreator(@NotNull String name) {
- if (name == null) { - if (name == null) {
- throw new IllegalArgumentException("World name cannot be null"); - throw new IllegalArgumentException("World name cannot be null");
- }
-
- this.name = name;
- this.seed = (new Random()).nextLong();
+ // Paper start + // Paper start
+ this(name, getWorldKey(name)); + this(name, getWorldKey(name));
+ } }
+
+ private static NamespacedKey getWorldKey(String name) { + private static NamespacedKey getWorldKey(String name) {
+ final String mainLevelName = Bukkit.getUnsafe().getMainLevelName(); + final String mainLevelName = Bukkit.getUnsafe().getMainLevelName();
+ if (name.equals(mainLevelName)) { + if (name.equals(mainLevelName)) {
@ -124,10 +128,9 @@ index cbe6b3a1ba7b04826d97c3558e8eb4e5ba11f92f..cbdcac688afb7c13dd7058fa522bbd2c
+ return NamespacedKey.minecraft("the_end"); + return NamespacedKey.minecraft("the_end");
+ } else { + } else {
+ return NamespacedKey.minecraft(name.toLowerCase(java.util.Locale.ENGLISH).replace(" ", "_")); + return NamespacedKey.minecraft(name.toLowerCase(java.util.Locale.ENGLISH).replace(" ", "_"));
}
+ } + }
+ }
- this.name = name; +
+ /** + /**
+ * Creates an empty WorldCreator for the given world name and key + * Creates an empty WorldCreator for the given world name and key
+ * + *
@ -139,7 +142,7 @@ index cbe6b3a1ba7b04826d97c3558e8eb4e5ba11f92f..cbdcac688afb7c13dd7058fa522bbd2c
+ throw new IllegalArgumentException("World name and key cannot be null"); + throw new IllegalArgumentException("World name and key cannot be null");
+ } + }
+ this.name = levelName; + this.name = levelName;
this.seed = (new Random()).nextLong(); + this.seed = (new Random()).nextLong();
+ this.key = worldKey; + this.key = worldKey;
+ } + }
+ +
@ -183,8 +186,9 @@ index cbe6b3a1ba7b04826d97c3558e8eb4e5ba11f92f..cbdcac688afb7c13dd7058fa522bbd2c
+ @NotNull + @NotNull
+ public static WorldCreator ofKey(@NotNull NamespacedKey worldKey) { + public static WorldCreator ofKey(@NotNull NamespacedKey worldKey) {
+ return new WorldCreator(worldKey); + return new WorldCreator(worldKey);
} + }
+ // Paper end + // Paper end
+
/** /**
* Copies the options from the specified world * Copies the options from the specified world
*

Datei anzeigen

@ -35,7 +35,7 @@ index 0000000000000000000000000000000000000000..e6a40c1fcea761bd66743b50e3da3d14
+ } + }
+} +}
diff --git a/src/main/java/org/bukkit/enchantments/Enchantment.java b/src/main/java/org/bukkit/enchantments/Enchantment.java diff --git a/src/main/java/org/bukkit/enchantments/Enchantment.java b/src/main/java/org/bukkit/enchantments/Enchantment.java
index 0264c2f9a3977b6d47994b1e1b0240b312e5bf65..69a048eb4e48c92db70c3d6b6aa4ae96326b9705 100644 index 1b6f42ff632b1f3f5034c825e99b72f389a890b4..4cfe8501368f601fdd4203570f4e6a8f6f9685e6 100644
--- a/src/main/java/org/bukkit/enchantments/Enchantment.java --- a/src/main/java/org/bukkit/enchantments/Enchantment.java
+++ b/src/main/java/org/bukkit/enchantments/Enchantment.java +++ b/src/main/java/org/bukkit/enchantments/Enchantment.java
@@ -273,11 +273,7 @@ public abstract class Enchantment implements Keyed, net.kyori.adventure.translat @@ -273,11 +273,7 @@ public abstract class Enchantment implements Keyed, net.kyori.adventure.translat
@ -53,7 +53,7 @@ index 0264c2f9a3977b6d47994b1e1b0240b312e5bf65..69a048eb4e48c92db70c3d6b6aa4ae96
@@ -311,6 +307,46 @@ public abstract class Enchantment implements Keyed, net.kyori.adventure.translat @@ -311,6 +307,46 @@ public abstract class Enchantment implements Keyed, net.kyori.adventure.translat
* @return the name of the enchantment with {@code level} applied * @return the name of the enchantment with {@code level} applied
*/ */
public abstract @NotNull net.kyori.adventure.text.Component displayName(int level); public abstract net.kyori.adventure.text.@NotNull Component displayName(int level);
+ +
+ /** + /**
+ * Checks if this enchantment can be found in villager trades. + * Checks if this enchantment can be found in villager trades.

Datei anzeigen

@ -1,11 +1,11 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Riley Park <riley.park@meino.net> From: Riley Park <rileysebastianpark@gmail.com>
Date: Sun, 23 May 2021 05:04:28 -0700 Date: Sun, 23 May 2021 05:04:28 -0700
Subject: [PATCH] ItemStack#editMeta Subject: [PATCH] ItemStack#editMeta
diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java
index b731ac4f6cd82d8476e4040a2204f58b0f63a0d3..84ea952cdee1eaec5572641e09fdd85930ddeb47 100644 index ffde4d11d4d5e783afb77bc2e96cf71113b2eb25..c5579710f73e9b8d407d5b8d698d2543a25a752d 100644
--- a/src/main/java/org/bukkit/inventory/ItemStack.java --- a/src/main/java/org/bukkit/inventory/ItemStack.java
+++ b/src/main/java/org/bukkit/inventory/ItemStack.java +++ b/src/main/java/org/bukkit/inventory/ItemStack.java
@@ -547,6 +547,50 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat @@ -547,6 +547,50 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat

Datei anzeigen

@ -5,13 +5,13 @@ Subject: [PATCH] Add PlayerKickEvent causes
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
index 6c4d148202c3378e361fd8068c00cc0b67d6dc1e..b834537b1fa7ee349d10fe1ac5aa7e7dca4e35f7 100644 index b49620af0edcf10e7f74d616dcb4fb775308308f..bf5eeaffb7983c6a849ee80df0b78230d3cce42b 100644
--- a/src/main/java/org/bukkit/entity/Player.java --- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java
@@ -249,6 +249,14 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -249,6 +249,14 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* @param message kick message * @param message kick message
*/ */
void kick(final @Nullable net.kyori.adventure.text.Component message); void kick(final net.kyori.adventure.text.@Nullable Component message);
+ +
+ /** + /**
+ * Kicks player with custom kick message and cause. + * Kicks player with custom kick message and cause.
@ -19,12 +19,12 @@ index 6c4d148202c3378e361fd8068c00cc0b67d6dc1e..b834537b1fa7ee349d10fe1ac5aa7e7d
+ * @param message kick message + * @param message kick message
+ * @param cause kick cause + * @param cause kick cause
+ */ + */
+ void kick(final @Nullable net.kyori.adventure.text.Component message, @NotNull org.bukkit.event.player.PlayerKickEvent.Cause cause); + void kick(final net.kyori.adventure.text.@Nullable Component message, org.bukkit.event.player.PlayerKickEvent.@NotNull Cause cause);
// Paper end // Paper end
/** /**
diff --git a/src/main/java/org/bukkit/event/player/PlayerKickEvent.java b/src/main/java/org/bukkit/event/player/PlayerKickEvent.java diff --git a/src/main/java/org/bukkit/event/player/PlayerKickEvent.java b/src/main/java/org/bukkit/event/player/PlayerKickEvent.java
index efbf4b657c99ce3a5096d041d275af9ccaea7911..5c968a0867223925b7eb5d6e04dbc33c41b7be6b 100644 index 997b06c19a5277656521e0e298f2958c209f1da1..2eb13c049fa917d41fa9ad17fdec9ec4c33701a8 100644
--- a/src/main/java/org/bukkit/event/player/PlayerKickEvent.java --- a/src/main/java/org/bukkit/event/player/PlayerKickEvent.java
+++ b/src/main/java/org/bukkit/event/player/PlayerKickEvent.java +++ b/src/main/java/org/bukkit/event/player/PlayerKickEvent.java
@@ -12,6 +12,7 @@ public class PlayerKickEvent extends PlayerEvent implements Cancellable { @@ -12,6 +12,7 @@ public class PlayerKickEvent extends PlayerEvent implements Cancellable {

Datei anzeigen

@ -194,8 +194,12 @@ index 17527c2f7bd5b8a5528388a53f2472bc1869c7f3..3f6b9e59c2ea38031ca74962e02d710f
+ * recipes. + * recipes.
* *
- * This includes it's name, description and other visible tags. - * This includes it's name, description and other visible tags.
- *
- * @return a AdvancementDisplay object, or null if not set.
+ * @return the display info + * @return the display info
+ */ */
- @Nullable
- AdvancementDisplay getDisplay();
+ @org.jetbrains.annotations.Nullable + @org.jetbrains.annotations.Nullable
+ io.papermc.paper.advancement.AdvancementDisplay getDisplay(); + io.papermc.paper.advancement.AdvancementDisplay getDisplay();
+ +
@ -205,13 +209,10 @@ index 17527c2f7bd5b8a5528388a53f2472bc1869c7f3..3f6b9e59c2ea38031ca74962e02d710f
+ * completes the advancement. Will return the same as + * completes the advancement. Will return the same as
+ * {@link io.papermc.paper.advancement.AdvancementDisplay#displayName()} when an + * {@link io.papermc.paper.advancement.AdvancementDisplay#displayName()} when an
+ * {@link io.papermc.paper.advancement.AdvancementDisplay} is present. + * {@link io.papermc.paper.advancement.AdvancementDisplay} is present.
* + *
- * @return a AdvancementDisplay object, or null if not set.
+ * @return the display name + * @return the display name
+ * @see io.papermc.paper.advancement.AdvancementDisplay#displayName() + * @see io.papermc.paper.advancement.AdvancementDisplay#displayName()
*/ + */
- @Nullable
- AdvancementDisplay getDisplay();
+ @NotNull net.kyori.adventure.text.Component displayName(); + @NotNull net.kyori.adventure.text.Component displayName();
+ +
+ /** + /**

Datei anzeigen

@ -8,7 +8,7 @@ diff --git a/src/main/java/org/bukkit/event/entity/EntityDamageByEntityEvent.jav
index 869bad7405ec7fa67728e90d8b9f2e11b542611f..7ce8f1a26c1b33dd0eb6e6435952fd73abf49879 100644 index 869bad7405ec7fa67728e90d8b9f2e11b542611f..7ce8f1a26c1b33dd0eb6e6435952fd73abf49879 100644
--- a/src/main/java/org/bukkit/event/entity/EntityDamageByEntityEvent.java --- a/src/main/java/org/bukkit/event/entity/EntityDamageByEntityEvent.java
+++ b/src/main/java/org/bukkit/event/entity/EntityDamageByEntityEvent.java +++ b/src/main/java/org/bukkit/event/entity/EntityDamageByEntityEvent.java
@@ -11,15 +11,40 @@ import org.jetbrains.annotations.NotNull; @@ -11,16 +11,41 @@ import org.jetbrains.annotations.NotNull;
public class EntityDamageByEntityEvent extends EntityDamageEvent { public class EntityDamageByEntityEvent extends EntityDamageEvent {
private final Entity damager; private final Entity damager;
@ -32,8 +32,8 @@ index 869bad7405ec7fa67728e90d8b9f2e11b542611f..7ce8f1a26c1b33dd0eb6e6435952fd73
this.damager = damager; this.damager = damager;
+ // Paper start - add critical damage API + // Paper start - add critical damage API
+ this.critical = critical; + this.critical = critical;
+ } }
+
+ /** + /**
+ * Shows this damage instance was critical. + * Shows this damage instance was critical.
+ * The damage instance can be critical if the attacking player met the respective conditions. + * The damage instance can be critical if the attacking player met the respective conditions.
@ -44,8 +44,9 @@ index 869bad7405ec7fa67728e90d8b9f2e11b542611f..7ce8f1a26c1b33dd0eb6e6435952fd73
+ */ + */
+ public boolean isCritical() { + public boolean isCritical() {
+ return this.critical; + return this.critical;
} + }
+ // Paper end + // Paper end
+
/** /**
* Returns the entity that damaged the defender. * Returns the entity that damaged the defender.
*

Datei anzeigen

@ -8,7 +8,7 @@ diff --git a/src/main/java/org/bukkit/event/entity/EntityPortalEvent.java b/src/
index 67fb9d93e808e907fa980f3004d415ae5d0a53fc..97e36c7f6e09276fbae20eaeee0965566332ca46 100644 index 67fb9d93e808e907fa980f3004d415ae5d0a53fc..97e36c7f6e09276fbae20eaeee0965566332ca46 100644
--- a/src/main/java/org/bukkit/event/entity/EntityPortalEvent.java --- a/src/main/java/org/bukkit/event/entity/EntityPortalEvent.java
+++ b/src/main/java/org/bukkit/event/entity/EntityPortalEvent.java +++ b/src/main/java/org/bukkit/event/entity/EntityPortalEvent.java
@@ -15,15 +15,58 @@ import org.jetbrains.annotations.Nullable; @@ -15,16 +15,59 @@ import org.jetbrains.annotations.Nullable;
public class EntityPortalEvent extends EntityTeleportEvent { public class EntityPortalEvent extends EntityTeleportEvent {
private static final HandlerList handlers = new HandlerList(); private static final HandlerList handlers = new HandlerList();
private int searchRadius = 128; private int searchRadius = 128;
@ -23,8 +23,8 @@ index 67fb9d93e808e907fa980f3004d415ae5d0a53fc..97e36c7f6e09276fbae20eaeee096556
super(entity, from, to); super(entity, from, to);
this.searchRadius = searchRadius; this.searchRadius = searchRadius;
+ this.type = org.bukkit.PortalType.CUSTOM; // Paper + this.type = org.bukkit.PortalType.CUSTOM; // Paper
+ } }
+
+ // Paper start + // Paper start
+ public EntityPortalEvent(@NotNull Entity entity, @NotNull Location from, @Nullable Location to, int searchRadius, final @NotNull org.bukkit.PortalType portalType) { + public EntityPortalEvent(@NotNull Entity entity, @NotNull Location from, @Nullable Location to, int searchRadius, final @NotNull org.bukkit.PortalType portalType) {
+ super(entity, from, to); + super(entity, from, to);
@ -63,11 +63,12 @@ index 67fb9d93e808e907fa980f3004d415ae5d0a53fc..97e36c7f6e09276fbae20eaeee096556
+ @Override + @Override
+ public void setTo(@Nullable final Location to) { + public void setTo(@Nullable final Location to) {
+ super.setTo(to); + super.setTo(to);
} + }
+ // Paper end + // Paper end
+
/** /**
* Set the Block radius to search in for available portals. * Set the Block radius to search in for available portals.
*
diff --git a/src/main/java/org/bukkit/event/player/PlayerPortalEvent.java b/src/main/java/org/bukkit/event/player/PlayerPortalEvent.java diff --git a/src/main/java/org/bukkit/event/player/PlayerPortalEvent.java b/src/main/java/org/bukkit/event/player/PlayerPortalEvent.java
index 57eeeafae84f83a939925820e827769749ff27ec..929a997671de8202efb9da97fbf9b4a0bf7c37e8 100644 index 57eeeafae84f83a939925820e827769749ff27ec..929a997671de8202efb9da97fbf9b4a0bf7c37e8 100644
--- a/src/main/java/org/bukkit/event/player/PlayerPortalEvent.java --- a/src/main/java/org/bukkit/event/player/PlayerPortalEvent.java

Datei anzeigen

@ -7674,12 +7674,12 @@ index d2026d218405a40a6949c5f491c04704811b72b5..629178347039893fb9de710810fe8112
+ public ChunkAccess getChunkIfLoadedImmediately(int x, int z) { + public ChunkAccess getChunkIfLoadedImmediately(int x, int z) {
+ throw new UnsupportedOperationException("Not supported yet."); + throw new UnsupportedOperationException("Not supported yet.");
+ } + }
+
+ @Override + @Override
+ public BlockState getBlockStateIfLoaded(BlockPos blockposition) { + public BlockState getBlockStateIfLoaded(BlockPos blockposition) {
+ throw new UnsupportedOperationException("Not supported yet."); + throw new UnsupportedOperationException("Not supported yet.");
+ } + }
+
+ @Override + @Override
+ public FluidState getFluidIfLoaded(BlockPos blockposition) { + public FluidState getFluidIfLoaded(BlockPos blockposition) {
+ throw new UnsupportedOperationException("Not supported yet."); + throw new UnsupportedOperationException("Not supported yet.");

Datei anzeigen

@ -1,5 +1,5 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Riley Park <riley.park@meino.net> From: Riley Park <rileysebastianpark@gmail.com>
Date: Fri, 29 Jan 2021 17:54:03 +0100 Date: Fri, 29 Jan 2021 17:54:03 +0100
Subject: [PATCH] Adventure Subject: [PATCH] Adventure
@ -2322,13 +2322,14 @@ index 000fd11480d783eab80a93fedde48f66e6b1298b..b3b6121dcfb6451d177431d51fa8a3e0
- @Deprecated - @Deprecated
- public void disconnect(Component reason) { - public void disconnect(Component reason) {
- this.disconnect(CraftChatMessage.fromComponent(reason)); - this.disconnect(CraftChatMessage.fromComponent(reason));
+ public void disconnect(String s) { - }
- // CraftBukkit end
-
public void disconnect(String s) {
+ // Paper start + // Paper start
+ this.disconnect(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(s)); + this.disconnect(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(s));
} + }
- // CraftBukkit end +
- public void disconnect(String s) {
+ public void disconnect(final Component reason) { + public void disconnect(final Component reason) {
+ this.disconnect(PaperAdventure.asAdventure(reason)); + this.disconnect(PaperAdventure.asAdventure(reason));
+ } + }
@ -2809,13 +2810,13 @@ index 059ba63319f6ca04750a7d6b095e6179cae68b4f..cb2dc6db887856c5f60d127f5999a078
} }
+ // Paper start + // Paper start
+ @Override @Override
+ public net.kyori.adventure.text.Component shutdownMessage() { + public net.kyori.adventure.text.Component shutdownMessage() {
+ String msg = getShutdownMessage(); + String msg = getShutdownMessage();
+ return msg != null ? net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(msg) : null; + return msg != null ? net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(msg) : null;
+ } + }
+ // Paper end + // Paper end
@Override + @Override
+ @Deprecated // Paper + @Deprecated // Paper
public String getShutdownMessage() { public String getShutdownMessage() {
return this.configuration.getString("settings.shutdown-message"); return this.configuration.getString("settings.shutdown-message");
@ -2892,12 +2893,12 @@ index 059ba63319f6ca04750a7d6b095e6179cae68b4f..cb2dc6db887856c5f60d127f5999a078
} }
+ // Paper start + // Paper start
+ @Override @Override
+ public Merchant createMerchant(net.kyori.adventure.text.Component title) { + public Merchant createMerchant(net.kyori.adventure.text.Component title) {
+ return new org.bukkit.craftbukkit.inventory.CraftMerchantCustom(title == null ? InventoryType.MERCHANT.defaultTitle() : title); + return new org.bukkit.craftbukkit.inventory.CraftMerchantCustom(title == null ? InventoryType.MERCHANT.defaultTitle() : title);
+ } + }
+ // Paper end + // Paper end
@Override + @Override
+ @Deprecated // Paper + @Deprecated // Paper
public Merchant createMerchant(String title) { public Merchant createMerchant(String title) {
return new CraftMerchantCustom(title == null ? InventoryType.MERCHANT.getDefaultTitle() : title); return new CraftMerchantCustom(title == null ? InventoryType.MERCHANT.getDefaultTitle() : title);
@ -2963,7 +2964,7 @@ index 3b9e42adb657d0feb99de4b55dc0c628e9cd5afd..253f965e52cd488af88d55cdd09f1bad
// Paper end // Paper end
} }
diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
index 7fc066ee281662192aad826840573e4181f5ceff..6569c9db3fa026ee4fbfaceac0e4f6a15c1fbe16 100644 index fe726771b76cabcb58bf624969490d9595965082..e16a458a708080ff5321362cba440fa465dba7d6 100644
--- a/src/main/java/org/bukkit/craftbukkit/Main.java --- a/src/main/java/org/bukkit/craftbukkit/Main.java
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java
@@ -20,6 +20,12 @@ public class Main { @@ -20,6 +20,12 @@ public class Main {
@ -3949,7 +3950,7 @@ index b7f54a7d90a2a34e641f152eb8f5c3c62033e511..2d04443a9efd6e4b5eb1e360a727d849
@Override @Override
public int getLineWidth() { public int getLineWidth() {
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
index f9499aa8fc5443b54617c8e84011af5d0325bd45..2c3518ea974be5fce424093e9b710c853fd52a7a 100644 index 5e02ea662a1307b2718811bab98ed0d6d17edd87..54a9a630ca1aa3cabc9aa29ba7d9e516c0f88a00 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -820,9 +820,9 @@ public class CraftEventFactory { @@ -820,9 +820,9 @@ public class CraftEventFactory {

Datei anzeigen

@ -1,8 +1,9 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Zach Brown <zach.brown@destroystokyo.com> From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
Date: Mon, 29 Feb 2016 21:02:09 -0600 Date: Mon, 29 Feb 2016 21:02:09 -0600
Subject: [PATCH] Paper command Subject: [PATCH] Paper command
Co-authored-by: Zach Brown <zach.brown@destroystokyo.com>
diff --git a/src/main/java/io/papermc/paper/command/CommandUtil.java b/src/main/java/io/papermc/paper/command/CommandUtil.java diff --git a/src/main/java/io/papermc/paper/command/CommandUtil.java b/src/main/java/io/papermc/paper/command/CommandUtil.java
new file mode 100644 new file mode 100644

Datei anzeigen

@ -4545,13 +4545,13 @@ index 5b238e41ffa3e374b52ee955cb39087571c6ffc2..275b7f7dd36a2073a3eb9f89f4c83283
+ this.hasSkyLight = hasBlockLight; // Nice variable name. + this.hasSkyLight = hasBlockLight; // Nice variable name.
+ this.theLightEngine = new ca.spottedleaf.starlight.common.light.StarLightInterface(chunkProvider, this.hasSkyLight, this.hasBlockLight, this); + this.theLightEngine = new ca.spottedleaf.starlight.common.light.StarLightInterface(chunkProvider, this.hasSkyLight, this.hasBlockLight, this);
+ // Paper end - replace light engine impl + // Paper end - replace light engine impl
+ } }
+
+ // Paper start - replace light engine impl + // Paper start - replace light engine impl
+ protected final ChunkAccess getChunk(final int chunkX, final int chunkZ) { + protected final ChunkAccess getChunk(final int chunkX, final int chunkZ) {
+ return ((ServerLevel)this.theLightEngine.getWorld()).getChunkSource().getChunkAtImmediately(chunkX, chunkZ); + return ((ServerLevel)this.theLightEngine.getWorld()).getChunkSource().getChunkAtImmediately(chunkX, chunkZ);
} + }
+
+ protected long relightCounter; + protected long relightCounter;
+ +
+ public int relight(java.util.Set<ChunkPos> chunks_param, + public int relight(java.util.Set<ChunkPos> chunks_param,
@ -5167,13 +5167,13 @@ index aa4f2dc63dd79e6c3d7594d2fd63fa0091df5f53..bca8084f7e76d036378705aa802217cc
+ } else if (flag1) { + } else if (flag1) {
+ skyNibbles[y - minSection] = new ca.spottedleaf.starlight.common.light.SWMRNibbleArray(null, sectionData.getInt(SKYLIGHT_STATE_TAG)); + skyNibbles[y - minSection] = new ca.spottedleaf.starlight.common.light.SWMRNibbleArray(null, sectionData.getInt(SKYLIGHT_STATE_TAG));
+ // Paper end - rewrite the light engine + // Paper end - rewrite the light engine
+ } }
+ +
+ // Paper start - rewrite the light engine + // Paper start - rewrite the light engine
+ } catch (Exception ex) { + } catch (Exception ex) {
+ LOGGER.warn("Failed to load light data for chunk " + chunkPos + " in world '" + world.getWorld().getName() + "', light will be regenerated", ex); + LOGGER.warn("Failed to load light data for chunk " + chunkPos + " in world '" + world.getWorld().getName() + "', light will be regenerated", ex);
+ flag = false; + flag = false;
} + }
+ // Paper end - rewrite light engine + // Paper end - rewrite light engine
} }
} }

Datei anzeigen

@ -13176,16 +13176,6 @@ index 30e330cc3a2f51e4ec9555671e3eeb7bb14bdfa3..214e0657035f82e5266de06e31975d6b
- entityplayer.connection.send(packet); - entityplayer.connection.send(packet);
- }); - });
- } - }
-
- public CompletableFuture<Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure>> getOrScheduleFuture(ChunkStatus targetStatus, ChunkMap chunkStorage) {
- int i = targetStatus.getIndex();
- CompletableFuture<Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure>> completablefuture = (CompletableFuture) this.futures.get(i);
-
- if (completablefuture != null) {
- Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure> either = (Either) completablefuture.getNow(ChunkHolder.NOT_DONE_YET);
-
- if (either == null) {
- String s = "value in future for status: " + targetStatus + " was incorrectly set to null at chunk: " + this.pos;
+ // Paper start - per player view distance + // Paper start - per player view distance
+ // there can be potential desync with player's last mapped section and the view distance map, so use the + // there can be potential desync with player's last mapped section and the view distance map, so use the
+ // view distance map here. + // view distance map here.
@ -13195,6 +13185,16 @@ index 30e330cc3a2f51e4ec9555671e3eeb7bb14bdfa3..214e0657035f82e5266de06e31975d6b
+ return; + return;
+ } + }
- public CompletableFuture<Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure>> getOrScheduleFuture(ChunkStatus targetStatus, ChunkMap chunkStorage) {
- int i = targetStatus.getIndex();
- CompletableFuture<Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure>> completablefuture = (CompletableFuture) this.futures.get(i);
-
- if (completablefuture != null) {
- Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure> either = (Either) completablefuture.getNow(ChunkHolder.NOT_DONE_YET);
-
- if (either == null) {
- String s = "value in future for status: " + targetStatus + " was incorrectly set to null at chunk: " + this.pos;
-
- throw chunkStorage.debugFuturesAndCreateReportedException(new IllegalStateException("null value previously set for chunk status"), s); - throw chunkStorage.debugFuturesAndCreateReportedException(new IllegalStateException("null value previously set for chunk status"), s);
+ Object[] backingSet = players.getBackingSet(); + Object[] backingSet = players.getBackingSet();
+ for (int i = 0, len = backingSet.length; i < len; ++i) { + for (int i = 0, len = backingSet.length; i < len; ++i) {
@ -13258,8 +13258,9 @@ index 30e330cc3a2f51e4ec9555671e3eeb7bb14bdfa3..214e0657035f82e5266de06e31975d6b
public final int getTicketLevel() { // Paper - final for inline public final int getTicketLevel() { // Paper - final for inline
- return this.ticketLevel; - return this.ticketLevel;
- } + return this.newChunkHolder.getTicketLevel(); // Paper - rewrite chunk system
- }
- public int getQueueLevel() { - public int getQueueLevel() {
- return this.queueLevel; - return this.queueLevel;
- } - }
@ -13285,9 +13286,8 @@ index 30e330cc3a2f51e4ec9555671e3eeb7bb14bdfa3..214e0657035f82e5266de06e31975d6b
- completablefuture1.complete(null); // CraftBukkit - decompile error - completablefuture1.complete(null); // CraftBukkit - decompile error
- }); - });
- }); - });
+ return this.newChunkHolder.getTicketLevel(); // Paper - rewrite chunk system - }
} -
- private void demoteFullChunk(ChunkMap playerchunkmap, ChunkHolder.FullChunkStatus playerchunk_state) { - private void demoteFullChunk(ChunkMap playerchunkmap, ChunkHolder.FullChunkStatus playerchunk_state) {
- this.pendingFullStateConfirmation.cancel(false); - this.pendingFullStateConfirmation.cancel(false);
- playerchunkmap.onFullChunkStatusChange(this.pos, playerchunk_state); - playerchunkmap.onFullChunkStatusChange(this.pos, playerchunk_state);
@ -13823,15 +13823,16 @@ index 578849f64de38dc75cdefeb243422c4c89a5c69c..9246ce9f654ad4db6155b026778a83d4
- } finally { - } finally {
- super.close(); - super.close();
- } - }
-
+ throw new UnsupportedOperationException("Use ServerChunkCache#close"); // Paper - rewrite chunk system + throw new UnsupportedOperationException("Use ServerChunkCache#close"); // Paper - rewrite chunk system
+ } }
+ // Paper start - rewrite chunk system + // Paper start - rewrite chunk system
+ protected void saveIncrementally() { + protected void saveIncrementally() {
+ this.level.chunkTaskScheduler.chunkHolderManager.autoSave(); // Paper - rewrite chunk system + this.level.chunkTaskScheduler.chunkHolderManager.autoSave(); // Paper - rewrite chunk system
} + }
+ // Paper end - - rewrite chunk system + // Paper end - - rewrite chunk system
+
protected void saveAllChunks(boolean flush) { protected void saveAllChunks(boolean flush) {
- if (flush) { - if (flush) {
- List<ChunkHolder> list = (List) io.papermc.paper.chunk.system.ChunkSystem.getVisibleChunkHolders(this.level).stream().filter(ChunkHolder::wasAccessibleSinceLastSave).peek(ChunkHolder::refreshAccessibility).collect(Collectors.toList()); // Paper - List<ChunkHolder> list = (List) io.papermc.paper.chunk.system.ChunkSystem.getVisibleChunkHolders(this.level).stream().filter(ChunkHolder::wasAccessibleSinceLastSave).peek(ChunkHolder::refreshAccessibility).collect(Collectors.toList()); // Paper
@ -14491,21 +14492,25 @@ index 578849f64de38dc75cdefeb243422c4c89a5c69c..9246ce9f654ad4db6155b026778a83d4
- Set<ServerPlayer> set = this.playerMap.getPlayers(chunkPos.toLong()); - Set<ServerPlayer> set = this.playerMap.getPlayers(chunkPos.toLong());
- Builder<ServerPlayer> builder = ImmutableList.builder(); - Builder<ServerPlayer> builder = ImmutableList.builder();
- Iterator iterator = set.iterator(); - Iterator iterator = set.iterator();
-
- while (iterator.hasNext()) {
- ServerPlayer entityplayer = (ServerPlayer) iterator.next();
- SectionPos sectionposition = entityplayer.getLastSectionPos();
-
- if (onlyOnWatchDistanceEdge && ChunkMap.isChunkOnRangeBorder(chunkPos.x, chunkPos.z, sectionposition.x(), sectionposition.z(), this.viewDistance) || !onlyOnWatchDistanceEdge && ChunkMap.isChunkInRange(chunkPos.x, chunkPos.z, sectionposition.x(), sectionposition.z(), this.viewDistance)) {
- builder.add(entityplayer);
- }
+ // Paper start - per player view distance + // Paper start - per player view distance
+ // there can be potential desync with player's last mapped section and the view distance map, so use the + // there can be potential desync with player's last mapped section and the view distance map, so use the
+ // view distance map here. + // view distance map here.
+ com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<ServerPlayer> players = this.playerChunkManager.broadcastMap.getObjectsInRange(chunkPos); + com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<ServerPlayer> players = this.playerChunkManager.broadcastMap.getObjectsInRange(chunkPos);
+ if (players == null) { + if (players == null) {
+ return java.util.Collections.emptyList(); + return java.util.Collections.emptyList();
+ } }
- while (iterator.hasNext()) { - return builder.build();
- ServerPlayer entityplayer = (ServerPlayer) iterator.next();
- SectionPos sectionposition = entityplayer.getLastSectionPos();
+ List<ServerPlayer> ret = new java.util.ArrayList<>(players.size()); + List<ServerPlayer> ret = new java.util.ArrayList<>(players.size());
+
- if (onlyOnWatchDistanceEdge && ChunkMap.isChunkOnRangeBorder(chunkPos.x, chunkPos.z, sectionposition.x(), sectionposition.z(), this.viewDistance) || !onlyOnWatchDistanceEdge && ChunkMap.isChunkInRange(chunkPos.x, chunkPos.z, sectionposition.x(), sectionposition.z(), this.viewDistance)) {
- builder.add(entityplayer);
+ Object[] backingSet = players.getBackingSet(); + Object[] backingSet = players.getBackingSet();
+ for (int i = 0, len = backingSet.length; i < len; ++i) { + for (int i = 0, len = backingSet.length; i < len; ++i) {
+ if (!(backingSet[i] instanceof ServerPlayer player)) { + if (!(backingSet[i] instanceof ServerPlayer player)) {
@ -14513,11 +14518,10 @@ index 578849f64de38dc75cdefeb243422c4c89a5c69c..9246ce9f654ad4db6155b026778a83d4
+ } + }
+ if (!this.playerChunkManager.isChunkSent(player, chunkPos.x, chunkPos.z, onlyOnWatchDistanceEdge)) { + if (!this.playerChunkManager.isChunkSent(player, chunkPos.x, chunkPos.z, onlyOnWatchDistanceEdge)) {
+ continue; + continue;
} + }
+ ret.add(player); + ret.add(player);
} + }
+
- return builder.build();
+ return ret; + return ret;
+ // Paper end - per player view distance + // Paper end - per player view distance
} }
@ -14883,7 +14887,8 @@ index d38ad1b1eee92a6dbd2b79b4fcdb8959cdb4007d..ffa1e457decf8502c3283352bf5be94d
- private void dumpTickets(String path) { - private void dumpTickets(String path) {
- try { - try {
- FileOutputStream fileoutputstream = new FileOutputStream(new File(path)); - FileOutputStream fileoutputstream = new FileOutputStream(new File(path));
- + // Paper - rewrite chunk system
- try { - try {
- ObjectIterator objectiterator = this.tickets.long2ObjectEntrySet().iterator(); - ObjectIterator objectiterator = this.tickets.long2ObjectEntrySet().iterator();
- -
@ -14904,8 +14909,7 @@ index d38ad1b1eee92a6dbd2b79b4fcdb8959cdb4007d..ffa1e457decf8502c3283352bf5be94d
- } catch (Throwable throwable1) { - } catch (Throwable throwable1) {
- throwable.addSuppressed(throwable1); - throwable.addSuppressed(throwable1);
- } - }
+ // Paper - rewrite chunk system -
- throw throwable; - throw throwable;
- } - }
- -
@ -15125,29 +15129,23 @@ index 28c8a3ba1caddf0ea334a6ef43cae25f982743e4..80d108ae7faf3fdcb024931e93032215
- ChunkHolder.FullChunkStatus oldChunkState = ChunkHolder.getFullChunkStatus(playerchunk.oldTicketLevel); - ChunkHolder.FullChunkStatus oldChunkState = ChunkHolder.getFullChunkStatus(playerchunk.oldTicketLevel);
- ChunkHolder.FullChunkStatus currentChunkState = ChunkHolder.getFullChunkStatus(playerchunk.getTicketLevel()); - ChunkHolder.FullChunkStatus currentChunkState = ChunkHolder.getFullChunkStatus(playerchunk.getTicketLevel());
- currentlyUnloading = (oldChunkState.isOrAfter(ChunkHolder.FullChunkStatus.BORDER) && !currentChunkState.isOrAfter(ChunkHolder.FullChunkStatus.BORDER)); - currentlyUnloading = (oldChunkState.isOrAfter(ChunkHolder.FullChunkStatus.BORDER) && !currentChunkState.isOrAfter(ChunkHolder.FullChunkStatus.BORDER));
- } + boolean needsFullScheduling = leastStatus == ChunkStatus.FULL && (chunkHolder == null || !chunkHolder.getChunkStatus().isOrAfter(ChunkHolder.FullChunkStatus.BORDER));
+
+ if ((chunkHolder == null || chunkHolder.getTicketLevel() > minLevel || needsFullScheduling) && !create) {
+ return ChunkHolder.UNLOADED_CHUNK_FUTURE;
}
- if (create && !currentlyUnloading) { - if (create && !currentlyUnloading) {
- // CraftBukkit end - // CraftBukkit end
- this.distanceManager.addTicket(TicketType.UNKNOWN, chunkcoordintpair, l, chunkcoordintpair); - this.distanceManager.addTicket(TicketType.UNKNOWN, chunkcoordintpair, l, chunkcoordintpair);
- if (this.chunkAbsent(playerchunk, l)) { - if (this.chunkAbsent(playerchunk, l)) {
- ProfilerFiller gameprofilerfiller = this.level.getProfiler(); - ProfilerFiller gameprofilerfiller = this.level.getProfiler();
-
- gameprofilerfiller.push("chunkLoad"); - gameprofilerfiller.push("chunkLoad");
- this.runDistanceManagerUpdates(); - this.runDistanceManagerUpdates();
- playerchunk = this.getVisibleChunkIfPresent(k); - playerchunk = this.getVisibleChunkIfPresent(k);
- gameprofilerfiller.pop(); - gameprofilerfiller.pop();
- if (this.chunkAbsent(playerchunk, l)) { - if (this.chunkAbsent(playerchunk, l)) {
- throw (IllegalStateException) Util.pauseInIde(new IllegalStateException("No chunk holder after ticket has been added")); - throw (IllegalStateException) Util.pauseInIde(new IllegalStateException("No chunk holder after ticket has been added"));
- }
- }
+ boolean needsFullScheduling = leastStatus == ChunkStatus.FULL && (chunkHolder == null || !chunkHolder.getChunkStatus().isOrAfter(ChunkHolder.FullChunkStatus.BORDER));
+
+ if ((chunkHolder == null || chunkHolder.getTicketLevel() > minLevel || needsFullScheduling) && !create) {
+ return ChunkHolder.UNLOADED_CHUNK_FUTURE;
}
- return this.chunkAbsent(playerchunk, l) ? ChunkHolder.UNLOADED_CHUNK_FUTURE : playerchunk.getOrScheduleFuture(leastStatus, this.chunkMap);
- }
+ io.papermc.paper.chunk.system.scheduling.NewChunkHolder.ChunkCompletion chunkCompletion = chunkHolder == null ? null : chunkHolder.getLastChunkCompletion(); + io.papermc.paper.chunk.system.scheduling.NewChunkHolder.ChunkCompletion chunkCompletion = chunkHolder == null ? null : chunkHolder.getLastChunkCompletion();
+ if (needsFullScheduling || chunkCompletion == null || !chunkCompletion.genStatus().isOrAfter(leastStatus)) { + if (needsFullScheduling || chunkCompletion == null || !chunkCompletion.genStatus().isOrAfter(leastStatus)) {
+ // schedule + // schedule
@ -15157,11 +15155,10 @@ index 28c8a3ba1caddf0ea334a6ef43cae25f982743e4..80d108ae7faf3fdcb024931e93032215
+ ret.complete(Either.right(ChunkHolder.ChunkLoadingFailure.UNLOADED)); + ret.complete(Either.right(ChunkHolder.ChunkLoadingFailure.UNLOADED));
+ } else { + } else {
+ ret.complete(Either.left(chunk)); + ret.complete(Either.left(chunk));
+ } }
- }
+ }; + };
+
- private boolean chunkAbsent(@Nullable ChunkHolder holder, int maxLevel) {
- return holder == null || holder.oldTicketLevel > maxLevel; // CraftBukkit using oldTicketLevel for isLoaded checks
+ this.level.chunkTaskScheduler.scheduleChunkLoad( + this.level.chunkTaskScheduler.scheduleChunkLoad(
+ chunkX, chunkZ, leastStatus, true, + chunkX, chunkZ, leastStatus, true,
+ isUrgent ? ca.spottedleaf.concurrentutil.executor.standard.PrioritisedExecutor.Priority.BLOCKING : ca.spottedleaf.concurrentutil.executor.standard.PrioritisedExecutor.Priority.NORMAL, + isUrgent ? ca.spottedleaf.concurrentutil.executor.standard.PrioritisedExecutor.Priority.BLOCKING : ca.spottedleaf.concurrentutil.executor.standard.PrioritisedExecutor.Priority.NORMAL,
@ -15172,12 +15169,17 @@ index 28c8a3ba1caddf0ea334a6ef43cae25f982743e4..80d108ae7faf3fdcb024931e93032215
+ } else { + } else {
+ // can return now + // can return now
+ return CompletableFuture.completedFuture(Either.left(chunkCompletion.chunk())); + return CompletableFuture.completedFuture(Either.left(chunkCompletion.chunk()));
+ } }
-
- return this.chunkAbsent(playerchunk, l) ? ChunkHolder.UNLOADED_CHUNK_FUTURE : playerchunk.getOrScheduleFuture(leastStatus, this.chunkMap);
+ // Paper end - rewrite chunk system + // Paper end - rewrite chunk system
} }
- private boolean chunkAbsent(@Nullable ChunkHolder holder, int maxLevel) {
- return holder == null || holder.oldTicketLevel > maxLevel; // CraftBukkit using oldTicketLevel for isLoaded checks
- }
+ // Paper - rewrite chunk system + // Paper - rewrite chunk system
+
@Override @Override
public boolean hasChunk(int x, int z) { public boolean hasChunk(int x, int z) {
- ChunkHolder playerchunk = this.getVisibleChunkIfPresent((new ChunkPos(x, z)).toLong()); - ChunkHolder playerchunk = this.getVisibleChunkIfPresent((new ChunkPos(x, z)).toLong());
@ -16532,7 +16534,21 @@ index 69f55f7207b8c03ca886947c57c9d13a8e8eb576..0517c0932b79db1a0e27673654ae8bb5
- if (result.size() >= limit) { - if (result.size() >= limit) {
- return AbortableIterationConsumer.Continuation.ABORT; - return AbortableIterationConsumer.Continuation.ABORT;
- } - }
- } + // Paper start - optimise this call
+ //TODO use limit
+ if (filter instanceof net.minecraft.world.entity.EntityType entityTypeTest) {
+ ((ServerLevel) this).getEntityLookup().getEntities(entityTypeTest, box, result, predicate);
+ } else {
+ Predicate<? super T> test = (obj) -> {
+ return filter.tryCast(obj) != null;
+ };
+ predicate = predicate == null ? test : test.and((Predicate) predicate);
+ Class base;
+ if (filter == null || (base = filter.getBaseClass()) == null || base == Entity.class) {
+ ((ServerLevel) this).getEntityLookup().getEntities((Entity) null, box, (List) result, (Predicate)predicate);
+ } else {
+ ((ServerLevel) this).getEntityLookup().getEntities(base, null, box, (List) result, (Predicate)predicate); // Paper - optimise this call
}
- -
- if (entity instanceof EnderDragon) { - if (entity instanceof EnderDragon) {
- EnderDragon entityenderdragon = (EnderDragon) entity; - EnderDragon entityenderdragon = (EnderDragon) entity;
@ -16550,21 +16566,7 @@ index 69f55f7207b8c03ca886947c57c9d13a8e8eb576..0517c0932b79db1a0e27673654ae8bb5
- } - }
- } - }
- } - }
+ // Paper start - optimise this call - }
+ //TODO use limit
+ if (filter instanceof net.minecraft.world.entity.EntityType entityTypeTest) {
+ ((ServerLevel) this).getEntityLookup().getEntities(entityTypeTest, box, result, predicate);
+ } else {
+ Predicate<? super T> test = (obj) -> {
+ return filter.tryCast(obj) != null;
+ };
+ predicate = predicate == null ? test : test.and((Predicate) predicate);
+ Class base;
+ if (filter == null || (base = filter.getBaseClass()) == null || base == Entity.class) {
+ ((ServerLevel) this).getEntityLookup().getEntities((Entity) null, box, (List) result, (Predicate)predicate);
+ } else {
+ ((ServerLevel) this).getEntityLookup().getEntities(base, null, box, (List) result, (Predicate)predicate); // Paper - optimise this call
}
- -
- return AbortableIterationConsumer.Continuation.CONTINUE; - return AbortableIterationConsumer.Continuation.CONTINUE;
- }); - });
@ -16966,15 +16968,15 @@ index bca8084f7e76d036378705aa802217cc1bfdbc7d..f9dd2d9312297a727344d43150c5cab7
} else { } else {
ProtoChunk protochunk1 = (ProtoChunk) object1; ProtoChunk protochunk1 = (ProtoChunk) object1;
@@ -362,9 +388,41 @@ public class ChunkSerializer { @@ -362,10 +388,42 @@ public class ChunkSerializer {
protochunk1.setCarvingMask(worldgenstage_features, new CarvingMask(nbttagcompound4.getLongArray(s1), ((ChunkAccess) object1).getMinBuildHeight())); protochunk1.setCarvingMask(worldgenstage_features, new CarvingMask(nbttagcompound4.getLongArray(s1), ((ChunkAccess) object1).getMinBuildHeight()));
} }
- return protochunk1; - return protochunk1;
+ return new InProgressChunkHolder(protochunk1, tasksToExecuteOnMain); // Paper - Async chunk loading + return new InProgressChunkHolder(protochunk1, tasksToExecuteOnMain); // Paper - Async chunk loading
+ } }
+ } }
+
+ // Paper start - async chunk save for unload + // Paper start - async chunk save for unload
+ public record AsyncSaveData( + public record AsyncSaveData(
+ Tag blockTickList, // non-null if we had to go to the server's tick list + Tag blockTickList, // non-null if we had to go to the server's tick list
@ -16996,7 +16998,7 @@ index bca8084f7e76d036378705aa802217cc1bfdbc7d..f9dd2d9312297a727344d43150c5cab7
+ if (blockEntityNbt != null) { + if (blockEntityNbt != null) {
+ blockEntitiesSerialized.add(blockEntityNbt); + blockEntitiesSerialized.add(blockEntityNbt);
+ } + }
} + }
+ +
+ return new AsyncSaveData( + return new AsyncSaveData(
+ tickLists.get(BLOCK_TICKS_TAG), + tickLists.get(BLOCK_TICKS_TAG),
@ -17004,11 +17006,12 @@ index bca8084f7e76d036378705aa802217cc1bfdbc7d..f9dd2d9312297a727344d43150c5cab7
+ blockEntitiesSerialized, + blockEntitiesSerialized,
+ world.getGameTime() + world.getGameTime()
+ ); + );
} + }
+ // Paper end + // Paper end
+
private static void logErrors(ChunkPos chunkPos, int y, String message) { private static void logErrors(ChunkPos chunkPos, int y, String message) {
ChunkSerializer.LOGGER.error("Recoverable errors when loading section [" + chunkPos.x + ", " + y + ", " + chunkPos.z + "]: " + message); ChunkSerializer.LOGGER.error("Recoverable errors when loading section [" + chunkPos.x + ", " + y + ", " + chunkPos.z + "]: " + message);
}
@@ -381,6 +439,11 @@ public class ChunkSerializer { @@ -381,6 +439,11 @@ public class ChunkSerializer {
// CraftBukkit end // CraftBukkit end
@ -17148,11 +17151,11 @@ index ba267f3082607669282a61f013991e1c391a3f09..0747d2d411a85a26bfea08cc1dd29df6
+ } catch (Throwable thr) { + } catch (Throwable thr) {
+ return CompletableFuture.failedFuture(thr); + return CompletableFuture.failedFuture(thr);
+ } + }
+ } }
+ @Nullable + @Nullable
+ public CompoundTag readSync(ChunkPos chunkPos) throws IOException { + public CompoundTag readSync(ChunkPos chunkPos) throws IOException {
+ return this.regionFileCache.read(chunkPos); + return this.regionFileCache.read(chunkPos);
} + }
+ // Paper end - async chunk io + // Paper end - async chunk io
- public void write(ChunkPos chunkPos, CompoundTag nbt) { - public void write(ChunkPos chunkPos, CompoundTag nbt) {
@ -17239,17 +17242,17 @@ index 98b3909b536f11eda9c481ffd74066ad0cdb0ebc..0ec0be22f7292d57c40da6f1f4575bde
- } - }
- }, this.entityDeserializerQueue::tell); - }, this.entityDeserializerQueue::tell);
+ throw new UnsupportedOperationException(); // Paper - rewrite chunk system - copy out read logic into readEntities + throw new UnsupportedOperationException(); // Paper - rewrite chunk system - copy out read logic into readEntities
+ } }
+
- private static ChunkPos readChunkPos(CompoundTag chunkNbt) {
+ // Paper start - rewrite chunk system + // Paper start - rewrite chunk system
+ public static List<Entity> readEntities(ServerLevel level, CompoundTag compoundTag) { + public static List<Entity> readEntities(ServerLevel level, CompoundTag compoundTag) {
+ ListTag listTag = compoundTag.getList("Entities", 10); + ListTag listTag = compoundTag.getList("Entities", 10);
+ List<Entity> list = EntityType.loadEntitiesRecursive(listTag, level).collect(ImmutableList.toImmutableList()); + List<Entity> list = EntityType.loadEntitiesRecursive(listTag, level).collect(ImmutableList.toImmutableList());
+ return list; + return list;
} + }
+ // Paper end - rewrite chunk system + // Paper end - rewrite chunk system
+
- private static ChunkPos readChunkPos(CompoundTag chunkNbt) {
+ public static ChunkPos readChunkPos(CompoundTag chunkNbt) { // Paper - public + public static ChunkPos readChunkPos(CompoundTag chunkNbt) { // Paper - public
int[] is = chunkNbt.getIntArray("Position"); int[] is = chunkNbt.getIntArray("Position");
return new ChunkPos(is[0], is[1]); return new ChunkPos(is[0], is[1]);
@ -17291,6 +17294,10 @@ index 98b3909b536f11eda9c481ffd74066ad0cdb0ebc..0ec0be22f7292d57c40da6f1f4575bde
} }
} }
- @Override
- public void flush(boolean sync) {
- this.worker.synchronize(sync).join();
- this.entityDeserializerQueue.runAll();
+ // Paper start - rewrite chunk system + // Paper start - rewrite chunk system
+ public static void copyEntities(final CompoundTag from, final CompoundTag into) { + public static void copyEntities(final CompoundTag from, final CompoundTag into) {
+ if (from == null) { + if (from == null) {
@ -17304,8 +17311,9 @@ index 98b3909b536f11eda9c481ffd74066ad0cdb0ebc..0ec0be22f7292d57c40da6f1f4575bde
+ final ListTag entitiesInto = into.getList("Entities", net.minecraft.nbt.Tag.TAG_COMPOUND); + final ListTag entitiesInto = into.getList("Entities", net.minecraft.nbt.Tag.TAG_COMPOUND);
+ into.put("Entities", entitiesInto); // this is in case into doesn't have any entities + into.put("Entities", entitiesInto); // this is in case into doesn't have any entities
+ entitiesInto.addAll(0, entitiesFrom.copy()); // need to copy, this is coming from the save thread + entitiesInto.addAll(0, entitiesFrom.copy()); // need to copy, this is coming from the save thread
+ } }
+
- private CompoundTag upgradeChunkTag(CompoundTag chunkNbt) {
+ public static CompoundTag saveEntityChunk(List<Entity> entities, ChunkPos chunkPos, ServerLevel level) { + public static CompoundTag saveEntityChunk(List<Entity> entities, ChunkPos chunkPos, ServerLevel level) {
+ return saveEntityChunk0(entities, chunkPos, level, false); + return saveEntityChunk0(entities, chunkPos, level, false);
+ } + }
@ -17331,14 +17339,11 @@ index 98b3909b536f11eda9c481ffd74066ad0cdb0ebc..0ec0be22f7292d57c40da6f1f4575bde
+ } + }
+ // Paper end - rewrite chunk system + // Paper end - rewrite chunk system
+ +
@Override + @Override
public void flush(boolean sync) { + public void flush(boolean sync) {
- this.worker.synchronize(sync).join();
- this.entityDeserializerQueue.runAll();
+ throw new UnsupportedOperationException(); // Paper - rewrite chunk system + throw new UnsupportedOperationException(); // Paper - rewrite chunk system
} + }
+
- private CompoundTag upgradeChunkTag(CompoundTag chunkNbt) {
+ public static CompoundTag upgradeChunkTag(CompoundTag chunkNbt) { // Paper - public and static + public static CompoundTag upgradeChunkTag(CompoundTag chunkNbt) { // Paper - public and static
int i = NbtUtils.getDataVersion(chunkNbt, -1); int i = NbtUtils.getDataVersion(chunkNbt, -1);
return ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.ENTITY_CHUNK, chunkNbt, i, net.minecraft.SharedConstants.getCurrentVersion().getDataVersion().getVersion()); // Paper - route to new converter system return ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.ENTITY_CHUNK, chunkNbt, i, net.minecraft.SharedConstants.getCurrentVersion().getDataVersion().getVersion()); // Paper - route to new converter system
@ -17996,7 +18001,7 @@ index 253f965e52cd488af88d55cdd09f1bad0ddbeb56..30137f60a3796cf845e8fd7bd3c291be
// Spigot start // Spigot start
private final org.bukkit.World.Spigot spigot = new org.bukkit.World.Spigot() private final org.bukkit.World.Spigot spigot = new org.bukkit.World.Spigot()
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 12e7a0a24fe2aa6e7af97ad7d50d81e5c7b26663..d60dc99e2b926847f42a32e9d093a31556d179d8 100644 index 7c9f1b998ea5447d6ff29cdbb9e3cee0ba1c7c99..7b57298ee6c9422fa10dde9cf9441ea10b3443e4 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -177,6 +177,81 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -177,6 +177,81 @@ public class CraftPlayer extends CraftHumanEntity implements Player {

Datei anzeigen

@ -21,7 +21,7 @@ index 5c3b11f738c1ea19981cc878aa6c2323497391a0..6fd874a83a248e6a7d427d18d11fc608
public static Predicate<Entity> withinDistance(double x, double y, double z, double max) { public static Predicate<Entity> withinDistance(double x, double y, double z, double max) {
double d4 = max * max; double d4 = max * max;
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
index f74e1788692c3f9b291e6ba5043944a3179b97e1..eee466e718f52329f8200ff830f5f1e44cda3e7e 100644 index 9feb422045c5c47bbf48a5f75f437e51f19e1595..e06dc3f6c03276afb2ab3e0ec24cba707e09a24e 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java --- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -837,7 +837,7 @@ public abstract class Mob extends LivingEntity implements Targeting { @@ -837,7 +837,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
@ -137,7 +137,7 @@ index be6e3e21ad62da01e5e2dd78e300cbc8efdbeb42..ea98625fe7c00743b8df74a24e6d4b75
for(Player player : this.players()) { for(Player player : this.players()) {
if (EntitySelector.NO_SPECTATORS.test(player) && EntitySelector.LIVING_ENTITY_STILL_ALIVE.test(player)) { if (EntitySelector.NO_SPECTATORS.test(player) && EntitySelector.LIVING_ENTITY_STILL_ALIVE.test(player)) {
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index d60dc99e2b926847f42a32e9d093a31556d179d8..aa8f41ac360592a37306e439c85dda81acaaa6dc 100644 index 7b57298ee6c9422fa10dde9cf9441ea10b3443e4..f9cf8b94890be80e383d1e24671aa8b10f54f1b6 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -2187,8 +2187,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -2187,8 +2187,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@ -145,13 +145,13 @@ index d60dc99e2b926847f42a32e9d093a31556d179d8..aa8f41ac360592a37306e439c85dda81
public String getLocale() { public String getLocale() {
return this.getHandle().locale; return this.getHandle().locale;
+ +
+ } }
+
+ // Paper start + // Paper start
+ public void setAffectsSpawning(boolean affects) { + public void setAffectsSpawning(boolean affects) {
+ this.getHandle().affectsSpawning = affects; + this.getHandle().affectsSpawning = affects;
} + }
+
+ @Override + @Override
+ public boolean getAffectsSpawning() { + public boolean getAffectsSpawning() {
+ return this.getHandle().affectsSpawning; + return this.getHandle().affectsSpawning;

Datei anzeigen

@ -12,7 +12,7 @@ Previous implementation did not calculate TPS correctly.
Switch to a realistic rolling average and factor in std deviation as an extra reporting variable Switch to a realistic rolling average and factor in std deviation as an extra reporting variable
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 23181f54828410d78cae56fed226bea5de4be5ff..19d7a4da730cf260407d6216b8dbba958ec8f84c 100644 index 8cd3ad2601df5a604de904304ae3f603a471dfee..846dc9b607f40f1af3b4b7c7bbfe3c0803c0ad39 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java --- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -284,7 +284,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa @@ -284,7 +284,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@ -185,7 +185,10 @@ index 4ab81a99f906e3f28e026d0e50b5b943c1bdcfb5..9bede6a26c08ede063c7a38f1149c811
+ +
+ for ( int i = 0; i < tps.length; i++) { + for ( int i = 0; i < tps.length; i++) {
+ tpsAvg[i] = TicksPerSecondCommand.format( tps[i] ); + tpsAvg[i] = TicksPerSecondCommand.format( tps[i] );
+ } }
- sender.sendMessage( sb.substring( 0, sb.length() - 2 ) );
- sender.sendMessage(ChatColor.GOLD + "Current Memory Usage: " + ChatColor.GREEN + ((Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024 * 1024)) + "/" + (Runtime.getRuntime().totalMemory() / (1024 * 1024)) + " mb (Max: "
- + (Runtime.getRuntime().maxMemory() / (1024 * 1024)) + " mb)");
+ sender.sendMessage(ChatColor.GOLD + "TPS from last 1m, 5m, 15m: " + org.apache.commons.lang.StringUtils.join(tpsAvg, ", ")); + sender.sendMessage(ChatColor.GOLD + "TPS from last 1m, 5m, 15m: " + org.apache.commons.lang.StringUtils.join(tpsAvg, ", "));
+ if (args.length > 0 && args[0].equals("mem") && sender.hasPermission("bukkit.command.tpsmemory")) { + if (args.length > 0 && args[0].equals("mem") && sender.hasPermission("bukkit.command.tpsmemory")) {
+ sender.sendMessage(ChatColor.GOLD + "Current Memory Usage: " + ChatColor.GREEN + ((Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024 * 1024)) + "/" + (Runtime.getRuntime().totalMemory() / (1024 * 1024)) + " mb (Max: " + (Runtime.getRuntime().maxMemory() / (1024 * 1024)) + " mb)"); + sender.sendMessage(ChatColor.GOLD + "Current Memory Usage: " + ChatColor.GREEN + ((Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024 * 1024)) + "/" + (Runtime.getRuntime().totalMemory() / (1024 * 1024)) + " mb (Max: " + (Runtime.getRuntime().maxMemory() / (1024 * 1024)) + " mb)");
@ -193,10 +196,7 @@ index 4ab81a99f906e3f28e026d0e50b5b943c1bdcfb5..9bede6a26c08ede063c7a38f1149c811
+ sender.sendMessage(ChatColor.RED + "Warning: " + ChatColor.GOLD + " Memory usage on modern garbage collectors is not a stable value and it is perfectly normal to see it reach max. Please do not pay it much attention."); + sender.sendMessage(ChatColor.RED + "Warning: " + ChatColor.GOLD + " Memory usage on modern garbage collectors is not a stable value and it is perfectly normal to see it reach max. Please do not pay it much attention.");
+ hasShownMemoryWarning = true; + hasShownMemoryWarning = true;
+ } + }
} + }
- sender.sendMessage( sb.substring( 0, sb.length() - 2 ) );
- sender.sendMessage(ChatColor.GOLD + "Current Memory Usage: " + ChatColor.GREEN + ((Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024 * 1024)) + "/" + (Runtime.getRuntime().totalMemory() / (1024 * 1024)) + " mb (Max: "
- + (Runtime.getRuntime().maxMemory() / (1024 * 1024)) + " mb)");
+ // Paper end + // Paper end
return true; return true;

Datei anzeigen

@ -37,12 +37,12 @@ index 969fbf3959733200b1dfb98a8520465e358018c5..3cc8426283f68db0a4cbda6934aa6bfd
+ private org.bukkit.util.Vector origin; + private org.bukkit.util.Vector origin;
+ @javax.annotation.Nullable + @javax.annotation.Nullable
+ private UUID originWorld; + private UUID originWorld;
+
+ public void setOrigin(@javax.annotation.Nonnull Location location) { + public void setOrigin(@javax.annotation.Nonnull Location location) {
+ this.origin = location.toVector(); + this.origin = location.toVector();
+ this.originWorld = location.getWorld().getUID(); + this.originWorld = location.getWorld().getUID();
+ } + }
+
+ @javax.annotation.Nullable + @javax.annotation.Nullable
+ public org.bukkit.util.Vector getOriginVector() { + public org.bukkit.util.Vector getOriginVector() {
+ return this.origin != null ? this.origin.clone() : null; + return this.origin != null ? this.origin.clone() : null;

Datei anzeigen

@ -130,7 +130,14 @@ index 1e5ec95e19aca0530c141b6415fe6daca4f2d066..da5e660860a46227c59567f6458a9cf4
- ListTag list = CraftItemStack.getEnchantmentList(this.handle), listCopy; - ListTag list = CraftItemStack.getEnchantmentList(this.handle), listCopy;
- if (list == null) { - if (list == null) {
- return 0; - return 0;
- } + // Paper start - replace entire method
+ int level = getEnchantmentLevel(ench);
+ if (level > 0) {
+ final ItemMeta itemMeta = this.getItemMeta();
+ if (itemMeta == null) return 0;
+ itemMeta.removeEnchant(ench);
+ this.setItemMeta(itemMeta);
}
- int index = Integer.MIN_VALUE; - int index = Integer.MIN_VALUE;
- int level = Integer.MIN_VALUE; - int level = Integer.MIN_VALUE;
- int size = list.size(); - int size = list.size();
@ -162,14 +169,7 @@ index 1e5ec95e19aca0530c141b6415fe6daca4f2d066..da5e660860a46227c59567f6458a9cf4
- if (i != index) { - if (i != index) {
- listCopy.add(list.get(i)); - listCopy.add(list.get(i));
- } - }
+ // Paper start - replace entire method - }
+ int level = getEnchantmentLevel(ench);
+ if (level > 0) {
+ final ItemMeta itemMeta = this.getItemMeta();
+ if (itemMeta == null) return 0;
+ itemMeta.removeEnchant(ench);
+ this.setItemMeta(itemMeta);
}
- this.handle.getTag().put(ENCHANTMENTS.NBT, listCopy); - this.handle.getTag().put(ENCHANTMENTS.NBT, listCopy);
+ // Paper end + // Paper end
@ -184,7 +184,7 @@ index 1e5ec95e19aca0530c141b6415fe6daca4f2d066..da5e660860a46227c59567f6458a9cf4
static Map<Enchantment, Integer> getEnchantments(net.minecraft.world.item.ItemStack item) { static Map<Enchantment, Integer> getEnchantments(net.minecraft.world.item.ItemStack item) {
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
index 78029398774f1060e3522e4613259be894d68c22..9823ddae9edb40be805332ca1ef4325f9c1df14b 100644 index 69f71bf44bbc66a38a877c660c8dbc493a0a8327..82cfd1354929f415c74132b7e2bbbfabd9f18758 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
@@ -6,6 +6,7 @@ import com.google.common.collect.ImmutableList; @@ -6,6 +6,7 @@ import com.google.common.collect.ImmutableList;

Datei anzeigen

@ -103,7 +103,7 @@ index 58048d90a66cf3291a31d7c1f13ae66eac04ed64..8775163c42d639516a533559eaf312ee
- int k = pos.getZ(); - int k = pos.getZ();
+ return this.getBlockStateFinal(pos.getX(), pos.getY(), pos.getZ()); + return this.getBlockStateFinal(pos.getX(), pos.getY(), pos.getZ());
+ } + }
+
+ @Override + @Override
+ public BlockState getBlockState(final int x, final int y, final int z) { + public BlockState getBlockState(final int x, final int y, final int z) {
+ return this.getBlockStateFinal(x, y, z); + return this.getBlockStateFinal(x, y, z);
@ -116,7 +116,7 @@ index 58048d90a66cf3291a31d7c1f13ae66eac04ed64..8775163c42d639516a533559eaf312ee
+ } + }
+ // Inlined ChunkSection.getType() and DataPaletteBlock.a(int,int,int) + // Inlined ChunkSection.getType() and DataPaletteBlock.a(int,int,int)
+ return this.sections[i].states.get((y & 15) << 8 | (z & 15) << 4 | x & 15); + return this.sections[i].states.get((y & 15) << 8 | (z & 15) << 4 | x & 15);
+
+ } + }
+ +
+ public BlockState getBlockState_unused(int i, int j, int k) { + public BlockState getBlockState_unused(int i, int j, int k) {

Datei anzeigen

@ -22,10 +22,10 @@ index a5d57cc862036012d83b090bb1b3ccf4115a88b3..21068f766b75c414d5818073b7dca083
static final ServerboundInteractPacket.Action ATTACK_ACTION = new ServerboundInteractPacket.Action() { static final ServerboundInteractPacket.Action ATTACK_ACTION = new ServerboundInteractPacket.Action() {
@Override @Override
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
index f5b8da00f641a401d7ff4641908dd7de55cbe683..76f7ddbbba4be5c31d70ce9af9e041e69ee31662 100644 index cf905220ac5bbce62e5e061f0dfc96906fc29328..dfff872200195b90c51b05188b4a3c53e799249d 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -2534,8 +2534,37 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -2534,9 +2534,38 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
}); });
} }
} }
@ -48,8 +48,8 @@ index f5b8da00f641a401d7ff4641908dd7de55cbe683..76f7ddbbba4be5c31d70ce9af9e041e6
+ } + }
+ }); + });
+ } + }
+
+ } }
+ private void callPlayerUseUnknownEntityEvent(ServerboundInteractPacket packet, InteractionHand hand) { + private void callPlayerUseUnknownEntityEvent(ServerboundInteractPacket packet, InteractionHand hand) {
+ this.cserver.getPluginManager().callEvent(new com.destroystokyo.paper.event.player.PlayerUseUnknownEntityEvent( + this.cserver.getPluginManager().callEvent(new com.destroystokyo.paper.event.player.PlayerUseUnknownEntityEvent(
@ -58,8 +58,9 @@ index f5b8da00f641a401d7ff4641908dd7de55cbe683..76f7ddbbba4be5c31d70ce9af9e041e6
+ packet.getActionType() == ServerboundInteractPacket.ActionType.ATTACK, + packet.getActionType() == ServerboundInteractPacket.ActionType.ATTACK,
+ hand == InteractionHand.MAIN_HAND ? EquipmentSlot.HAND : EquipmentSlot.OFF_HAND + hand == InteractionHand.MAIN_HAND ? EquipmentSlot.HAND : EquipmentSlot.OFF_HAND
+ )); + ));
} + }
+ // Paper end + // Paper end
+
@Override @Override
public void handleClientCommand(ServerboundClientCommandPacket packet) { public void handleClientCommand(ServerboundClientCommandPacket packet) {
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel());

Datei anzeigen

@ -32,7 +32,7 @@ index 5a79b49e321cba352d8e4189dfbfdd0506ec3e5a..f9488311524bb8ff8a5686763973c9ae
+ public java.util.UUID sourceEntityId; + public java.util.UUID sourceEntityId;
+ public java.util.UUID triggerEntityId; + public java.util.UUID triggerEntityId;
+ public org.bukkit.entity.ExperienceOrb.SpawnReason spawnReason = org.bukkit.entity.ExperienceOrb.SpawnReason.UNKNOWN; + public org.bukkit.entity.ExperienceOrb.SpawnReason spawnReason = org.bukkit.entity.ExperienceOrb.SpawnReason.UNKNOWN;
+
+ private void loadPaperNBT(CompoundTag nbttagcompound) { + private void loadPaperNBT(CompoundTag nbttagcompound) {
+ if (!nbttagcompound.contains("Paper.ExpData", 10)) { // 10 = compound + if (!nbttagcompound.contains("Paper.ExpData", 10)) { // 10 = compound
+ return; + return;
@ -66,7 +66,7 @@ index 5a79b49e321cba352d8e4189dfbfdd0506ec3e5a..f9488311524bb8ff8a5686763973c9ae
+ } + }
+ nbttagcompound.put("Paper.ExpData", comp); + nbttagcompound.put("Paper.ExpData", comp);
+ } + }
+
+ @io.papermc.paper.annotation.DoNotUse + @io.papermc.paper.annotation.DoNotUse
+ @Deprecated + @Deprecated
public ExperienceOrb(Level world, double x, double y, double z, int amount) { public ExperienceOrb(Level world, double x, double y, double z, int amount) {
@ -131,7 +131,7 @@ index 5a79b49e321cba352d8e4189dfbfdd0506ec3e5a..f9488311524bb8ff8a5686763973c9ae
@Override @Override
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
index d0d38e39010ba3398a0b8960bc674c39d9a9ff51..e004dffee9f1efe44c78f9b2e938b98cc4b2b847 100644 index 46701f9c30c5b85b49311ad15da7e1fe2993c789..08087527293c5137af078fa17b6c0f219eab15d0 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -1716,7 +1716,8 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -1716,7 +1716,8 @@ public abstract class LivingEntity extends Entity implements Attackable {

Datei anzeigen

@ -30,7 +30,7 @@ will have plugins and worlds saving to the disk has a high potential to result
in corruption/dataloss. in corruption/dataloss.
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index e7b8e53a8709babb147a1ee3f375e96638f425a4..24f9d7314ab6c70fec42150e6065a7546c5de828 100644 index 776f7a27c4e85e713863f8fd0d37fc61e2bb0e49..b248a4ab47728c078dbc922896964e0e893fc255 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java --- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -236,6 +236,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa @@ -236,6 +236,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@ -98,24 +98,10 @@ index 94d8ba376cd1f024b244654cac9bb62bb19e3060..a142a56a920e153ed84c08cece993f10
+ if ( isRestarting ) + if ( isRestarting )
{ {
- System.out.println( "Attempting to restart with " + restartScript ); - System.out.println( "Attempting to restart with " + restartScript );
+ System.out.println( "Attempting to restart with " + SpigotConfig.restartScript ); -
+ } else
+ {
+ System.out.println( "Startup script '" + SpigotConfig.restartScript + "' does not exist! Stopping server." );
+ }
+ // Stop the watchdog
+ WatchdogThread.doStop();
- // Disable Watchdog - // Disable Watchdog
- WatchdogThread.doStop(); - WatchdogThread.doStop();
+ shutdownServer( isRestarting ); -
+ // Paper end
+ } catch ( Exception ex )
+ {
+ ex.printStackTrace();
+ }
+ }
- // Kick all players - // Kick all players
- for ( ServerPlayer p : (List<ServerPlayer>) MinecraftServer.getServer().getPlayerList().players ) - for ( ServerPlayer p : (List<ServerPlayer>) MinecraftServer.getServer().getPlayerList().players )
- { - {
@ -130,6 +116,73 @@ index 94d8ba376cd1f024b244654cac9bb62bb19e3060..a142a56a920e153ed84c08cece993f10
- } - }
- // Close the socket so we can rebind with the new process - // Close the socket so we can rebind with the new process
- MinecraftServer.getServer().getConnection().stop(); - MinecraftServer.getServer().getConnection().stop();
-
- // Give time for it to kick in
- try
- {
- Thread.sleep( 100 );
- } catch ( InterruptedException ex )
- {
- }
-
- // Actually shutdown
- try
- {
- MinecraftServer.getServer().close();
- } catch ( Throwable t )
- {
- }
-
- // This will be done AFTER the server has completely halted
- Thread shutdownHook = new Thread()
- {
- @Override
- public void run()
- {
- try
- {
- String os = System.getProperty( "os.name" ).toLowerCase(java.util.Locale.ENGLISH);
- if ( os.contains( "win" ) )
- {
- Runtime.getRuntime().exec( "cmd /c start " + restartScript );
- } else
- {
- Runtime.getRuntime().exec( "sh " + restartScript );
- }
- } catch ( Exception e )
- {
- e.printStackTrace();
- }
- }
- };
-
- shutdownHook.setDaemon( true );
- Runtime.getRuntime().addShutdownHook( shutdownHook );
+ System.out.println( "Attempting to restart with " + SpigotConfig.restartScript );
} else
{
System.out.println( "Startup script '" + SpigotConfig.restartScript + "' does not exist! Stopping server." );
-
- // Actually shutdown
- try
- {
- MinecraftServer.getServer().close();
- } catch ( Throwable t )
- {
- }
}
- System.exit( 0 );
+ // Stop the watchdog
+ WatchdogThread.doStop();
+
+ shutdownServer( isRestarting );
+ // Paper end
} catch ( Exception ex )
{
ex.printStackTrace();
}
}
+
+ // Paper start - sync copied from above with minor changes, async added + // Paper start - sync copied from above with minor changes, async added
+ private static void shutdownServer(boolean isRestarting) + private static void shutdownServer(boolean isRestarting)
+ { + {
@ -147,23 +200,9 @@ index 94d8ba376cd1f024b244654cac9bb62bb19e3060..a142a56a920e153ed84c08cece993f10
+ } catch ( InterruptedException ex ) + } catch ( InterruptedException ex )
+ { + {
+ } + }
+
- // Give time for it to kick in
- try
- {
- Thread.sleep( 100 );
- } catch ( InterruptedException ex )
- {
- }
+ closeSocket(); + closeSocket();
+
- // Actually shutdown
- try
- {
- MinecraftServer.getServer().close();
- } catch ( Throwable t )
- {
- }
+ // Actually shutdown + // Actually shutdown
+ try + try
+ { + {
@ -174,9 +213,7 @@ index 94d8ba376cd1f024b244654cac9bb62bb19e3060..a142a56a920e153ed84c08cece993f10
+ +
+ // Actually stop the JVM + // Actually stop the JVM
+ System.exit( 0 ); + System.exit( 0 );
+
- // This will be done AFTER the server has completely halted
- Thread shutdownHook = new Thread()
+ } else + } else
+ { + {
+ // Mark the server to shutdown at the end of the tick + // Mark the server to shutdown at the end of the tick
@ -228,63 +265,32 @@ index 94d8ba376cd1f024b244654cac9bb62bb19e3060..a142a56a920e153ed84c08cece993f10
+ { + {
+ @Override + @Override
+ public void run() + public void run()
{ + {
- @Override
- public void run()
+ try + try
{ + {
- try
+ String os = System.getProperty( "os.name" ).toLowerCase(java.util.Locale.ENGLISH); + String os = System.getProperty( "os.name" ).toLowerCase(java.util.Locale.ENGLISH);
+ if ( os.contains( "win" ) ) + if ( os.contains( "win" ) )
{ + {
- String os = System.getProperty( "os.name" ).toLowerCase(java.util.Locale.ENGLISH);
- if ( os.contains( "win" ) )
- {
- Runtime.getRuntime().exec( "cmd /c start " + restartScript );
- } else
- {
- Runtime.getRuntime().exec( "sh " + restartScript );
- }
- } catch ( Exception e )
+ Runtime.getRuntime().exec( "cmd /c start " + restartScript ); + Runtime.getRuntime().exec( "cmd /c start " + restartScript );
+ } else + } else
{ + {
- e.printStackTrace();
+ Runtime.getRuntime().exec( "sh " + restartScript ); + Runtime.getRuntime().exec( "sh " + restartScript );
} + }
+ } catch ( Exception e ) + } catch ( Exception e )
+ { + {
+ e.printStackTrace(); + e.printStackTrace();
} + }
- }; + }
-
- shutdownHook.setDaemon( true );
- Runtime.getRuntime().addShutdownHook( shutdownHook );
- } else
- {
- System.out.println( "Startup script '" + SpigotConfig.restartScript + "' does not exist! Stopping server." );
-
- // Actually shutdown
- try
- {
- MinecraftServer.getServer().close();
- } catch ( Throwable t )
- {
}
- }
- System.exit( 0 );
- } catch ( Exception ex )
+ }; + };
+ +
+ shutdownHook.setDaemon( true ); + shutdownHook.setDaemon( true );
+ Runtime.getRuntime().addShutdownHook( shutdownHook ); + Runtime.getRuntime().addShutdownHook( shutdownHook );
+ return true; + return true;
+ } else + } else
{ + {
- ex.printStackTrace();
+ return false; + return false;
} + }
} + }
+ // Paper end + // Paper end
+ +
} }

Datei anzeigen

@ -262,7 +262,7 @@ index 3aabd7aaad60c157740d12932d0cb071ae259c21..8aaba38c7f4dc17c8536a0049be8bdea
@Override @Override
public PluginCommand getPluginCommand(String name) { public PluginCommand getPluginCommand(String name) {
diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
index 34dc3555dbff9942a3ee39b27da44831f280b5a8..a736afdd6671ad36157d1d0c908b6ccb37f602b6 100644 index 288b3afe6c7e0c93234f43f864e37d167500dd0e..ebf561bce1b442f2b3a138d4ba0ed252e4ba3207 100644
--- a/src/main/java/org/bukkit/craftbukkit/Main.java --- a/src/main/java/org/bukkit/craftbukkit/Main.java
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java
@@ -13,7 +13,6 @@ import java.util.logging.Logger; @@ -13,7 +13,6 @@ import java.util.logging.Logger;
@ -397,8 +397,9 @@ index 0b4c62387c1093652ac15b64a8703249de4cf088..b996fde481cebbbcce80a6c267591136
if (offers == null) { if (offers == null) {
- return cursor; - return cursor;
+ return; // Paper - Method returns void + return; // Paper - Method returns void
+ } }
+ - candidates.addAll(offers);
+ // Paper start - JLine update + // Paper start - JLine update
+ for (String completion : offers) { + for (String completion : offers) {
+ if (completion.isEmpty()) { + if (completion.isEmpty()) {
@ -406,10 +407,9 @@ index 0b4c62387c1093652ac15b64a8703249de4cf088..b996fde481cebbbcce80a6c267591136
+ } + }
+ +
+ candidates.add(new Candidate(completion)); + candidates.add(new Candidate(completion));
} + }
- candidates.addAll(offers);
+ // Paper end + // Paper end
+
+ // Paper start - JLine handles cursor now + // Paper start - JLine handles cursor now
+ /* + /*
final int lastSpace = buffer.lastIndexOf(' '); final int lastSpace = buffer.lastIndexOf(' ');

Datei anzeigen

@ -49,12 +49,6 @@ index bc72f5380c49c0d389e53d270165d4108a3bb901..ec1aa8d5fbfdafc35948a04f4d8d65e8
if (stringreader.canRead() && stringreader.peek() == '/') { if (stringreader.canRead() && stringreader.peek() == '/') {
stringreader.skip(); stringreader.skip();
} }
-
- ParseResults<CommandSourceStack> parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack());
-
- this.server.getCommands().getDispatcher().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> {
- if (suggestions.isEmpty()) return; // CraftBukkit - don't send through empty suggestions - prevents [<args>] from showing for plugins with nothing more to offer
- this.connection.send(new ClientboundCommandSuggestionsPacket(packet.getId(), suggestions));
+ final String command = packet.getCommand(); + final String command = packet.getCommand();
+ final com.destroystokyo.paper.event.server.AsyncTabCompleteEvent event = new com.destroystokyo.paper.event.server.AsyncTabCompleteEvent(this.getCraftPlayer(), command, true, null); + final com.destroystokyo.paper.event.server.AsyncTabCompleteEvent event = new com.destroystokyo.paper.event.server.AsyncTabCompleteEvent(this.getCraftPlayer(), command, true, null);
+ event.callEvent(); + event.callEvent();
@ -62,10 +56,14 @@ index bc72f5380c49c0d389e53d270165d4108a3bb901..ec1aa8d5fbfdafc35948a04f4d8d65e8
+ // If the event isn't handled, we can assume that we have no completions, and so we'll ask the server + // If the event isn't handled, we can assume that we have no completions, and so we'll ask the server
+ if (!event.isHandled()) { + if (!event.isHandled()) {
+ if (!event.isCancelled()) { + if (!event.isCancelled()) {
+
- ParseResults<CommandSourceStack> parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack());
+ this.server.scheduleOnMain(() -> { // This needs to be on main + this.server.scheduleOnMain(() -> { // This needs to be on main
+ ParseResults<CommandSourceStack> parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack()); + ParseResults<CommandSourceStack> parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack());
+
- this.server.getCommands().getDispatcher().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> {
- if (suggestions.isEmpty()) return; // CraftBukkit - don't send through empty suggestions - prevents [<args>] from showing for plugins with nothing more to offer
- this.connection.send(new ClientboundCommandSuggestionsPacket(packet.getId(), suggestions));
+ this.server.getCommands().getDispatcher().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> { + this.server.getCommands().getDispatcher().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> {
+ if (suggestions.isEmpty()) return; // CraftBukkit - don't send through empty suggestions - prevents [<args>] from showing for plugins with nothing more to offer + if (suggestions.isEmpty()) return; // CraftBukkit - don't send through empty suggestions - prevents [<args>] from showing for plugins with nothing more to offer
+ this.connection.send(new ClientboundCommandSuggestionsPacket(packet.getId(), suggestions)); + this.connection.send(new ClientboundCommandSuggestionsPacket(packet.getId(), suggestions));

Datei anzeigen

@ -55,7 +55,7 @@ index e7442952ef1f03969949014492a7ddc6d0796ba5..69a1852905dd4724c30ac8ab88c14251
public Server getServer() { public Server getServer() {
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index a1ab7a666e429f0ac9afc1bd8a65866364655b70..2dd0e3272587697b52f75e851f26bb818f25c6aa 100644 index 39ecd1161b2f2636197eaa157a765cfe5d6f6405..5b2322389c2c2f5277a8891c857ba04f8d347e4d 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -82,6 +82,7 @@ import net.minecraft.world.entity.ai.attributes.Attributes; @@ -82,6 +82,7 @@ import net.minecraft.world.entity.ai.attributes.Attributes;
@ -127,11 +127,11 @@ index a1ab7a666e429f0ac9afc1bd8a65866364655b70..2dd0e3272587697b52f75e851f26bb81
+ bukkitPlayer.unregisterEntity(self); + bukkitPlayer.unregisterEntity(self);
+ } + }
+ } + }
+
+ // Set the game profile here, we should have unregistered the entity via iterating all player entities above.
+ self.gameProfile = gameProfile;
- server.getPluginManager().callEvent(new PlayerShowEntityEvent(this, entity)); - server.getPluginManager().callEvent(new PlayerShowEntityEvent(this, entity));
+ // Set the game profile here, we should have unregistered the entity via iterating all player entities above.
+ self.gameProfile = gameProfile;
+
+ // Re-register the game profile for all players + // Re-register the game profile for all players
+ for (ServerPlayer player : players) { + for (ServerPlayer player : players) {
+ CraftPlayer bukkitPlayer = player.getBukkitEntity(); + CraftPlayer bukkitPlayer = player.getBukkitEntity();

Datei anzeigen

@ -70,7 +70,7 @@ index dad0368c8b55be018167bd8b113a80b7508647f1..77a74d41679e88d748d903295ac4f455
} }
} }
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
index d29519bd75e6e5a97b06aae86c485b49c4415fb8..73cefc7ec582cb0fbfcff32cb9311f34ec2f31f0 100644 index 7c0e1963383a1a2862930cf77844e5c8c80e70e3..4c1992bcffd629ef53f14c5a0146eab2ddcb563c 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -258,6 +258,7 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -258,6 +258,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
@ -119,8 +119,13 @@ index d29519bd75e6e5a97b06aae86c485b49c4415fb8..73cefc7ec582cb0fbfcff32cb9311f34
+ // Paper - moved into if below + // Paper - moved into if below
if (this.level instanceof ServerLevel) { if (this.level instanceof ServerLevel) {
- if (entity == null || entity.wasKilled((ServerLevel) this.level, this)) { - if (entity == null || entity.wasKilled((ServerLevel) this.level, this)) {
- this.gameEvent(GameEvent.ENTITY_DIE);
- this.dropAllDeathLoot(damageSource);
- this.createWitherRose(entityliving);
- }
+ // Paper - move below into if for onKill + // Paper - move below into if for onKill
+
- this.level.broadcastEntityEvent(this, (byte) 3);
+ // Paper start + // Paper start
+ org.bukkit.event.entity.EntityDeathEvent deathEvent = this.dropAllDeathLoot(damageSource); + org.bukkit.event.entity.EntityDeathEvent deathEvent = this.dropAllDeathLoot(damageSource);
+ if (deathEvent == null || !deathEvent.isCancelled()) { + if (deathEvent == null || !deathEvent.isCancelled()) {
@ -148,15 +153,11 @@ index d29519bd75e6e5a97b06aae86c485b49c4415fb8..73cefc7ec582cb0fbfcff32cb9311f34
+ if (entity != null) { + if (entity != null) {
+ entity.wasKilled((ServerLevel) this.level, this); + entity.wasKilled((ServerLevel) this.level, this);
+ } + }
this.gameEvent(GameEvent.ENTITY_DIE); + this.gameEvent(GameEvent.ENTITY_DIE);
- this.dropAllDeathLoot(damageSource);
- this.createWitherRose(entityliving);
+ } else { + } else {
+ this.dead = false; + this.dead = false;
+ this.setHealth((float) deathEvent.getReviveHealth()); + this.setHealth((float) deathEvent.getReviveHealth());
} + }
-
- this.level.broadcastEntityEvent(this, (byte) 3);
+ // Paper end + // Paper end
+ this.createWitherRose(entityliving); + this.createWitherRose(entityliving);
} }
@ -220,7 +221,7 @@ index d29519bd75e6e5a97b06aae86c485b49c4415fb8..73cefc7ec582cb0fbfcff32cb9311f34
// CraftBukkit start // CraftBukkit start
public int getExpReward() { public int getExpReward() {
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
index e818687adf432e7ff47c8442ed2ea32d41c06b64..60d833bf8b7dcee046da9712a2dc809b05a31b42 100644 index 984a33d5e1f790a9c78ba57f2dc21fb072a44b3d..dbf442e9686e59723ed0456f97e472cc663f8cc7 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java --- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -1065,7 +1065,13 @@ public abstract class Mob extends LivingEntity implements Targeting { @@ -1065,7 +1065,13 @@ public abstract class Mob extends LivingEntity implements Targeting {
@ -352,7 +353,7 @@ index e38cbdff34479673f1640c46d727f1a807a609c7..dbb4bfb3d1f1ce2e435ca531be36ea44
this.gameEvent(GameEvent.ENTITY_DIE); this.gameEvent(GameEvent.ENTITY_DIE);
} }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 2d704af9491bec382e00a40fde36c6e01c8484f2..e3239cfb4237163389313f88496ad5e69b891c86 100644 index 6b1b1b49b1b070dab106e9712d66c3916f0a7797..3a4a1f32409d7dddd30a643017da9bc6f6694187 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -2262,7 +2262,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -2262,7 +2262,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@ -372,7 +373,7 @@ index 2d704af9491bec382e00a40fde36c6e01c8484f2..e3239cfb4237163389313f88496ad5e6
public void injectScaledMaxHealth(Collection<AttributeInstance> collection, boolean force) { public void injectScaledMaxHealth(Collection<AttributeInstance> collection, boolean force) {
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
index c24e84e07f3f0d93da079ddf73e0e67b7d58fe8b..bdd4572489cd12ea19560fe82006e3fe4db29b50 100644 index ea385119db05699e355411e779f4464067f923f1..ea83f115d96302731ee7576b682bee95259422de 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -806,9 +806,16 @@ public class CraftEventFactory { @@ -806,9 +806,16 @@ public class CraftEventFactory {

Datei anzeigen

@ -58,15 +58,14 @@ index f809a19afdfdb7df439e907531f54b2df1baf08c..00516a230073391b31795ec5af2aa7aa
short short0 = FlowingFluid.getCacheKey(pos, blockposition1); short short0 = FlowingFluid.getCacheKey(pos, blockposition1);
- Pair<BlockState, FluidState> pair = (Pair) short2objectmap.computeIfAbsent(short0, (short1) -> { - Pair<BlockState, FluidState> pair = (Pair) short2objectmap.computeIfAbsent(short0, (short1) -> {
- BlockState iblockdata1 = world.getBlockState(blockposition1); - BlockState iblockdata1 = world.getBlockState(blockposition1);
-
- return Pair.of(iblockdata1, iblockdata1.getFluidState());
- });
+ // Paper start + // Paper start
+ Pair pair = (Pair) short2objectmap.get(short0); + Pair pair = (Pair) short2objectmap.get(short0);
+ if (pair == null) { + if (pair == null) {
+ BlockState iblockdatax = world.getBlockStateIfLoaded(blockposition1); + BlockState iblockdatax = world.getBlockStateIfLoaded(blockposition1);
+ if (iblockdatax == null) continue; + if (iblockdatax == null) continue;
+
- return Pair.of(iblockdata1, iblockdata1.getFluidState());
- });
+ pair = Pair.of(iblockdatax, iblockdatax.getFluidState()); + pair = Pair.of(iblockdatax, iblockdatax.getFluidState());
+ short2objectmap.put(short0, pair); + short2objectmap.put(short0, pair);
+ } + }

Datei anzeigen

@ -39,9 +39,9 @@ index abbb077281eb8fc7961cf97ff23bb9822f2727f0..096546d7a97f031060bda7545aa620d5
- if (!this.isSilent()) { - if (!this.isSilent()) {
- this.level.playSound((Player) null, this.getX(), this.getY(), this.getZ(), SoundEvents.WITCH_DRINK, this.getSoundSource(), 1.0F, 0.8F + this.random.nextFloat() * 0.4F); - this.level.playSound((Player) null, this.getX(), this.getY(), this.getZ(), SoundEvents.WITCH_DRINK, this.getSoundSource(), 1.0F, 0.8F + this.random.nextFloat() * 0.4F);
- } - }
-
- AttributeInstance attributemodifiable = this.getAttribute(Attributes.MOVEMENT_SPEED);
- AttributeInstance attributemodifiable = this.getAttribute(Attributes.MOVEMENT_SPEED);
-
- attributemodifiable.removeModifier(Witch.SPEED_MODIFIER_DRINKING); - attributemodifiable.removeModifier(Witch.SPEED_MODIFIER_DRINKING);
- attributemodifiable.addTransientModifier(Witch.SPEED_MODIFIER_DRINKING); - attributemodifiable.addTransientModifier(Witch.SPEED_MODIFIER_DRINKING);
} }

Datei anzeigen

@ -107,21 +107,22 @@ index 62ee5e32ac0f5d244fa55f9fe45d34cf4d2becaa..184f36a137ed5e5cd20797e131801bc2
public void send(Packet<?> packet, @Nullable PacketSendListener callbacks) { public void send(Packet<?> packet, @Nullable PacketSendListener callbacks) {
- if (this.isConnected()) { - if (this.isConnected()) {
- this.flushQueue(); - this.flushQueue();
- this.sendPacket(packet, callbacks);
- } else {
- this.queue.add(new Connection.PacketHolder(packet, callbacks));
+ // Paper start - handle oversized packets better + // Paper start - handle oversized packets better
+ boolean connected = this.isConnected(); + boolean connected = this.isConnected();
+ if (!connected && !preparing) { + if (!connected && !preparing) {
+ return; // Do nothing + return; // Do nothing
+ } }
+ packet.onPacketDispatch(getPlayer()); + packet.onPacketDispatch(getPlayer());
+ if (connected && (InnerUtil.canSendImmediate(this, packet) || ( + if (connected && (InnerUtil.canSendImmediate(this, packet) || (
+ io.papermc.paper.util.MCUtil.isMainThread() && packet.isReady() && this.queue.isEmpty() && + io.papermc.paper.util.MCUtil.isMainThread() && packet.isReady() && this.queue.isEmpty() &&
+ (packet.getExtraPackets() == null || packet.getExtraPackets().isEmpty()) + (packet.getExtraPackets() == null || packet.getExtraPackets().isEmpty())
+ ))) { + ))) {
this.sendPacket(packet, callbacks); + this.sendPacket(packet, callbacks);
- } else {
- this.queue.add(new Connection.PacketHolder(packet, callbacks));
+ return; + return;
} + }
+ // write the packets to the queue, then flush - antixray hooks there already + // write the packets to the queue, then flush - antixray hooks there already
+ java.util.List<Packet> extraPackets = InnerUtil.buildExtraPackets(packet); + java.util.List<Packet> extraPackets = InnerUtil.buildExtraPackets(packet);
+ boolean hasExtraPackets = extraPackets != null && !extraPackets.isEmpty(); + boolean hasExtraPackets = extraPackets != null && !extraPackets.isEmpty();
@ -184,6 +185,10 @@ index 62ee5e32ac0f5d244fa55f9fe45d34cf4d2becaa..184f36a137ed5e5cd20797e131801bc2
} }
- private void flushQueue() { - private void flushQueue() {
- try { // Paper - add pending task queue
- if (this.channel != null && this.channel.isOpen()) {
- Queue queue = this.queue;
-
+ // Paper start - rewrite this to be safer if ran off main thread + // Paper start - rewrite this to be safer if ran off main thread
+ private boolean flushQueue() { // void -> boolean + private boolean flushQueue() { // void -> boolean
+ if (!isConnected()) { + if (!isConnected()) {
@ -193,16 +198,20 @@ index 62ee5e32ac0f5d244fa55f9fe45d34cf4d2becaa..184f36a137ed5e5cd20797e131801bc2
+ return processQueue(); + return processQueue();
+ } else if (isPending) { + } else if (isPending) {
+ // Should only happen during login/status stages + // Should only happen during login/status stages
+ synchronized (this.queue) { synchronized (this.queue) {
- Connection.PacketHolder networkmanager_queuedpacket;
-
- while ((networkmanager_queuedpacket = (Connection.PacketHolder) this.queue.poll()) != null) {
- this.sendPacket(networkmanager_queuedpacket.packet, networkmanager_queuedpacket.listener);
- }
-
+ return this.processQueue(); + return this.processQueue();
+ } }
+ } }
+ return false; + return false;
+ } + }
+ private boolean processQueue() { + private boolean processQueue() {
try { // Paper - add pending task queue + try { // Paper - add pending task queue
- if (this.channel != null && this.channel.isOpen()) {
- Queue queue = this.queue;
+ if (this.queue.isEmpty()) return true; + if (this.queue.isEmpty()) return true;
+ // If we are on main, we are safe here in that nothing else should be processing queue off main anymore + // If we are on main, we are safe here in that nothing else should be processing queue off main anymore
+ // But if we are not on main due to login/status, the parent is synchronized on packetQueue + // But if we are not on main due to login/status, the parent is synchronized on packetQueue
@ -214,17 +223,13 @@ index 62ee5e32ac0f5d244fa55f9fe45d34cf4d2becaa..184f36a137ed5e5cd20797e131801bc2
+ if (queued == null) { + if (queued == null) {
+ return true; + return true;
+ } + }
+
- synchronized (this.queue) {
- Connection.PacketHolder networkmanager_queuedpacket;
+ // Paper start - checking isConsumed flag and skipping packet sending + // Paper start - checking isConsumed flag and skipping packet sending
+ if (queued.isConsumed()) { + if (queued.isConsumed()) {
+ continue; + continue;
+ } + }
+ // Paper end - checking isConsumed flag and skipping packet sending + // Paper end - checking isConsumed flag and skipping packet sending
+
- while ((networkmanager_queuedpacket = (Connection.PacketHolder) this.queue.poll()) != null) {
- this.sendPacket(networkmanager_queuedpacket.packet, networkmanager_queuedpacket.listener);
+ Packet<?> packet = queued.packet; + Packet<?> packet = queued.packet;
+ if (!packet.isReady()) { + if (!packet.isReady()) {
+ return false; + return false;
@ -232,10 +237,9 @@ index 62ee5e32ac0f5d244fa55f9fe45d34cf4d2becaa..184f36a137ed5e5cd20797e131801bc2
+ iterator.remove(); + iterator.remove();
+ if (queued.tryMarkConsumed()) { // Paper - try to mark isConsumed flag for de-duplicating packet + if (queued.tryMarkConsumed()) { // Paper - try to mark isConsumed flag for de-duplicating packet
+ this.sendPacket(packet, queued.listener); + this.sendPacket(packet, queued.listener);
} + }
- + }
} + }
}
+ return true; + return true;
} finally { // Paper start - add pending task queue } finally { // Paper start - add pending task queue
Runnable r; Runnable r;

Datei anzeigen

@ -6,7 +6,7 @@ Subject: [PATCH] Configurable Keep Spawn Loaded range per world
This lets you disable it for some worlds and lower it for others. This lets you disable it for some worlds and lower it for others.
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 9d2186655ae03022ddeaf078028570ef9118fb06..fe8c0ba8864afd582c5e1c9d310cff99ef4dbff6 100644 index cbac51a99885f963feede3563b6b2714a4096022..f62cbd8eddee7ea6997797271ce37d31b8dd3aaa 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java --- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -739,31 +739,34 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa @@ -739,31 +739,34 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@ -31,19 +31,18 @@ index 9d2186655ae03022ddeaf078028570ef9118fb06..fe8c0ba8864afd582c5e1c9d310cff99
- // CraftBukkit start - // CraftBukkit start
- if (worldserver.getWorld().getKeepSpawnInMemory()) { - if (worldserver.getWorld().getKeepSpawnInMemory()) {
- chunkproviderserver.addRegionTicket(TicketType.START, new ChunkPos(blockposition), 11, Unit.INSTANCE); - chunkproviderserver.addRegionTicket(TicketType.START, new ChunkPos(blockposition), 11, Unit.INSTANCE);
-
- while (chunkproviderserver.getTickingGenerated() != 441) {
- // this.nextTickTime = SystemUtils.getMillis() + 10L;
- this.executeModerately();
- }
- }
+ // Paper start - configurable spawn reason + // Paper start - configurable spawn reason
+ int radiusBlocks = worldserver.paperConfig().spawn.keepSpawnLoadedRange * 16; + int radiusBlocks = worldserver.paperConfig().spawn.keepSpawnLoadedRange * 16;
+ int radiusChunks = radiusBlocks / 16 + ((radiusBlocks & 15) != 0 ? 1 : 0); + int radiusChunks = radiusBlocks / 16 + ((radiusBlocks & 15) != 0 ? 1 : 0);
+ int totalChunks = ((radiusChunks) * 2 + 1); + int totalChunks = ((radiusChunks) * 2 + 1);
+ totalChunks *= totalChunks; + totalChunks *= totalChunks;
+ worldloadlistener.setChunkRadius(radiusBlocks / 16); + worldloadlistener.setChunkRadius(radiusBlocks / 16);
+
- while (chunkproviderserver.getTickingGenerated() != 441) {
- // this.nextTickTime = SystemUtils.getMillis() + 10L;
- this.executeModerately();
- }
- }
+ worldserver.addTicketsForSpawn(radiusBlocks, blockposition); + worldserver.addTicketsForSpawn(radiusBlocks, blockposition);
+ // Paper end + // Paper end

Datei anzeigen

@ -197,7 +197,6 @@ index ba6d74692039c39660ed5e1d960cb090553a82f0..19f711f82386aaa731699f60ddb95ac2
- if (chunk instanceof ImposterProtoChunk) { - if (chunk instanceof ImposterProtoChunk) {
- // We then cycle through again to get the full chunk immediately, rather than after the ticket addition - // We then cycle through again to get the full chunk immediately, rather than after the ticket addition
- chunk = this.world.getChunkSource().getChunk(x, z, ChunkStatus.FULL, true); - chunk = this.world.getChunkSource().getChunk(x, z, ChunkStatus.FULL, true);
- }
+ if (!generate) { + if (!generate) {
+ ChunkAccess immediate = world.getChunkSource().getChunkAtImmediately(x, z); + ChunkAccess immediate = world.getChunkSource().getChunkAtImmediately(x, z);
+ if (immediate == null) { + if (immediate == null) {
@ -211,10 +210,7 @@ index ba6d74692039c39660ed5e1d960cb090553a82f0..19f711f82386aaa731699f60ddb95ac2
+ world.getChunk(x, z); // make sure we're at ticket level 32 or lower + world.getChunk(x, z); // make sure we're at ticket level 32 or lower
+ return true; + return true;
+ } + }
+
- if (chunk instanceof net.minecraft.world.level.chunk.LevelChunk) {
- this.world.getChunkSource().addRegionTicket(TicketType.PLUGIN, new ChunkPos(x, z), 1, Unit.INSTANCE);
- return true;
+ net.minecraft.world.level.chunk.storage.RegionFile file; + net.minecraft.world.level.chunk.storage.RegionFile file;
+ try { + try {
+ file = world.getChunkSource().chunkMap.regionFileCache.getRegionFile(chunkPos, false); + file = world.getChunkSource().chunkMap.regionFileCache.getRegionFile(chunkPos, false);
@ -236,6 +232,11 @@ index ba6d74692039c39660ed5e1d960cb090553a82f0..19f711f82386aaa731699f60ddb95ac2
+ // we do this so we do not re-read the chunk data on disk + // we do this so we do not re-read the chunk data on disk
} }
- if (chunk instanceof net.minecraft.world.level.chunk.LevelChunk) {
- this.world.getChunkSource().addRegionTicket(TicketType.PLUGIN, new ChunkPos(x, z), 1, Unit.INSTANCE);
- return true;
- }
-
- return false; - return false;
+ world.getChunkSource().addRegionTicket(TicketType.PLUGIN, chunkPos, 1, Unit.INSTANCE); + world.getChunkSource().addRegionTicket(TicketType.PLUGIN, chunkPos, 1, Unit.INSTANCE);
+ world.getChunkSource().getChunk(x, z, ChunkStatus.FULL, true); + world.getChunkSource().getChunk(x, z, ChunkStatus.FULL, true);

Datei anzeigen

@ -148,7 +148,7 @@ index 80806cd557a481ffbfa9b26e84d1ab1bcba0543f..a0dbb02019d31b890a450d0ffe2197fc
movement = this.maybeBackOffFromEdge(movement, movementType); movement = this.maybeBackOffFromEdge(movement, movementType);
Vec3 vec3d1 = this.collide(movement); Vec3 vec3d1 = this.collide(movement);
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
index 60d833bf8b7dcee046da9712a2dc809b05a31b42..56cfdf15cf2fd0b88d4d68d0b537da4bf323474f 100644 index dbf442e9686e59723ed0456f97e472cc663f8cc7..fa9cc50488d5044e13a97fb4aa9269fec999ad88 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java --- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -215,6 +215,19 @@ public abstract class Mob extends LivingEntity implements Targeting { @@ -215,6 +215,19 @@ public abstract class Mob extends LivingEntity implements Targeting {
@ -264,14 +264,14 @@ index caab72b733eabfe6a78c2a75e252817def49cbd0..ece23ee7812ca62ff8e763ffc29cda27
+ // Paper start + // Paper start
+ if (this.getUnhappyCounter() > 0) { + if (this.getUnhappyCounter() > 0) {
+ this.setUnhappyCounter(this.getUnhappyCounter() - 1); + this.setUnhappyCounter(this.getUnhappyCounter() - 1);
+ } }
+ if (this.isEffectiveAi()) { + if (this.isEffectiveAi()) {
+ if (level.spigotConfig.tickInactiveVillagers) { + if (level.spigotConfig.tickInactiveVillagers) {
+ this.customServerAiStep(); + this.customServerAiStep();
+ } else { + } else {
+ this.mobTick(true); + this.mobTick(true);
+ } + }
} + }
+ maybeDecayGossip(); + maybeDecayGossip();
+ // Paper end + // Paper end
+ +
@ -569,12 +569,16 @@ index 08bf9f85fe02a3f89640a2f3ae23089a119a394a..f158fc8a151272428a33dc5f6e174287
- public static boolean checkEntityImmunities(Entity entity) - public static boolean checkEntityImmunities(Entity entity)
+ public static int checkEntityImmunities(Entity entity) // Paper - return # of ticks to get immunity + public static int checkEntityImmunities(Entity entity) // Paper - return # of ticks to get immunity
{ {
- // quick checks.
- if ( entity.wasTouchingWater || entity.remainingFireTicks > 0 )
- {
- return true;
+ // Paper start + // Paper start
+ SpigotWorldConfig config = entity.level.spigotConfig; + SpigotWorldConfig config = entity.level.spigotConfig;
+ int inactiveWakeUpImmunity = checkInactiveWakeup(entity); + int inactiveWakeUpImmunity = checkInactiveWakeup(entity);
+ if (inactiveWakeUpImmunity > -1) { + if (inactiveWakeUpImmunity > -1) {
+ return inactiveWakeUpImmunity; + return inactiveWakeUpImmunity;
+ } }
+ if (entity.remainingFireTicks > 0) { + if (entity.remainingFireTicks > 0) {
+ return 2; + return 2;
+ } + }
@ -583,18 +587,16 @@ index 08bf9f85fe02a3f89640a2f3ae23089a119a394a..f158fc8a151272428a33dc5f6e174287
+ } + }
+ long inactiveFor = MinecraftServer.currentTick - entity.activatedTick; + long inactiveFor = MinecraftServer.currentTick - entity.activatedTick;
+ // Paper end + // Paper end
// quick checks. + // quick checks.
- if ( entity.wasTouchingWater || entity.remainingFireTicks > 0 )
+ if ( (entity.activationType != ActivationType.WATER && entity.wasTouchingWater && entity.isPushedByFluid()) ) // Paper + if ( (entity.activationType != ActivationType.WATER && entity.wasTouchingWater && entity.isPushedByFluid()) ) // Paper
{ + {
- return true;
+ return 100; // Paper + return 100; // Paper
+ } + }
+ // Paper start + // Paper start
+ if ( !entity.isOnGround() || entity.getDeltaMovement().horizontalDistanceSqr() > 9.999999747378752E-6D ) + if ( !entity.isOnGround() || entity.getDeltaMovement().horizontalDistanceSqr() > 9.999999747378752E-6D )
+ { + {
+ return 100; + return 100;
} + }
+ // Paper end + // Paper end
if ( !( entity instanceof AbstractArrow ) ) if ( !( entity instanceof AbstractArrow ) )
{ {
@ -624,7 +626,8 @@ index 08bf9f85fe02a3f89640a2f3ae23089a119a394a..f158fc8a151272428a33dc5f6e174287
{ {
- return true; - return true;
+ return 20; // Paper + return 20; // Paper
+ } }
- if ( entity instanceof Villager && ( (Villager) entity ).canBreed() )
+ // Paper start + // Paper start
+ if (entity instanceof Bee) { + if (entity instanceof Bee) {
+ Bee bee = (Bee)entity; + Bee bee = (Bee)entity;
@ -652,8 +655,7 @@ index 08bf9f85fe02a3f89640a2f3ae23089a119a394a..f158fc8a151272428a33dc5f6e174287
+ return config.villagersWorkImmunityFor; + return config.villagersWorkImmunityFor;
+ } + }
+ } + }
} + }
- if ( entity instanceof Villager && ( (Villager) entity ).canBreed() )
+ if ( entity instanceof Llama && ( (Llama) entity ).inCaravan() ) + if ( entity instanceof Llama && ( (Llama) entity ).inCaravan() )
{ {
- return true; - return true;
@ -677,11 +679,11 @@ index 08bf9f85fe02a3f89640a2f3ae23089a119a394a..f158fc8a151272428a33dc5f6e174287
if (entity instanceof Creeper && ((Creeper) entity).isIgnited()) { // isExplosive if (entity instanceof Creeper && ((Creeper) entity).isIgnited()) { // isExplosive
- return true; - return true;
+ return 20; // Paper + return 20; // Paper
+ } }
+ // Paper start + // Paper start
+ if (entity instanceof Mob && ((Mob) entity).targetSelector.hasTasks() ) { + if (entity instanceof Mob && ((Mob) entity).targetSelector.hasTasks() ) {
+ return 0; + return 0;
} + }
+ if (entity instanceof Pillager) { + if (entity instanceof Pillager) {
+ Pillager pillager = (Pillager) entity; + Pillager pillager = (Pillager) entity;
+ // TODO:? + // TODO:?

Datei anzeigen

@ -1367,7 +1367,7 @@ index cd82985b0aa821dccc0484f328407381d58ec81f..34804dc42c7a18108126c14c1b5f3d5a
this.strategy = paletteProvider; this.strategy = paletteProvider;
this.registry = idList; this.registry = idList;
this.data = this.createOrReuseData((PalettedContainer.Data<T>)null, 0); this.data = this.createOrReuseData((PalettedContainer.Data<T>)null, 0);
@@ -92,11 +131,33 @@ public class PalettedContainer<T> implements PaletteResize<T>, PalettedContainer @@ -92,12 +131,34 @@ public class PalettedContainer<T> implements PaletteResize<T>, PalettedContainer
@Override @Override
public int onResize(int newBits, T object) { public int onResize(int newBits, T object) {
PalettedContainer.Data<T> data = this.data; PalettedContainer.Data<T> data = this.data;
@ -1388,8 +1388,8 @@ index cd82985b0aa821dccc0484f328407381d58ec81f..34804dc42c7a18108126c14c1b5f3d5a
+ this.addPresetValues(); + this.addPresetValues();
+ return object == null ? -1 : data2.palette.idFor(object); + return object == null ? -1 : data2.palette.idFor(object);
+ // Paper end + // Paper end
+ } }
+
+ // Paper start - Anti-Xray - Add preset values + // Paper start - Anti-Xray - Add preset values
+ private void addPresetValues() { + private void addPresetValues() {
+ if (this.presetValues != null && this.data.configuration().factory() != PalettedContainer.Strategy.GLOBAL_PALETTE_FACTORY) { + if (this.presetValues != null && this.data.configuration().factory() != PalettedContainer.Strategy.GLOBAL_PALETTE_FACTORY) {
@ -1397,11 +1397,12 @@ index cd82985b0aa821dccc0484f328407381d58ec81f..34804dc42c7a18108126c14c1b5f3d5a
+ this.data.palette.idFor(presetValue); + this.data.palette.idFor(presetValue);
+ } + }
+ } + }
} + }
+ // Paper end + // Paper end
+
public T getAndSet(int x, int y, int z, T value) { public T getAndSet(int x, int y, int z, T value) {
this.acquire(); this.acquire();
@@ -166,25 +227,36 @@ public class PalettedContainer<T> implements PaletteResize<T>, PalettedContainer @@ -166,25 +227,36 @@ public class PalettedContainer<T> implements PaletteResize<T>, PalettedContainer
data.palette.read(buf); data.palette.read(buf);
buf.readLongArray(data.storage.getRaw()); buf.readLongArray(data.storage.getRaw());
@ -1414,10 +1415,10 @@ index cd82985b0aa821dccc0484f328407381d58ec81f..34804dc42c7a18108126c14c1b5f3d5a
} }
+ // Paper start - Anti-Xray - Add chunk packet info + // Paper start - Anti-Xray - Add chunk packet info
+ @Override
+ @Deprecated @io.papermc.paper.annotation.DoNotUse public void write(FriendlyByteBuf buf) { this.write(buf, null, 0); }
@Override @Override
- public void write(FriendlyByteBuf buf) { - public void write(FriendlyByteBuf buf) {
+ @Deprecated @io.papermc.paper.annotation.DoNotUse public void write(FriendlyByteBuf buf) { this.write(buf, null, 0); }
+ @Override
+ public void write(FriendlyByteBuf buf, @Nullable com.destroystokyo.paper.antixray.ChunkPacketInfo<T> chunkPacketInfo, int bottomBlockY) { + public void write(FriendlyByteBuf buf, @Nullable com.destroystokyo.paper.antixray.ChunkPacketInfo<T> chunkPacketInfo, int bottomBlockY) {
this.acquire(); this.acquire();

Datei anzeigen

@ -44,7 +44,7 @@ index e5918fa3be107ac3a2fc8831fd78733a7506730a..a908652f1ebb426d265ef614746f70cd
+ // Random player selection moved up for per player spawning and configuration + // Random player selection moved up for per player spawning and configuration
+ int j = world.players().size(); + int j = world.players().size();
+ if (j < 1) { + if (j < 1) {
return 0; + return 0;
+ } + }
+ +
+ net.minecraft.server.level.ServerPlayer entityhuman = world.players().get(randomsource.nextInt(j)); + net.minecraft.server.level.ServerPlayer entityhuman = world.players().get(randomsource.nextInt(j));
@ -56,16 +56,16 @@ index e5918fa3be107ac3a2fc8831fd78733a7506730a..a908652f1ebb426d265ef614746f70cd
+ if (world.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.perPlayer) { + if (world.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.perPlayer) {
+ --entityhuman.patrolSpawnDelay; + --entityhuman.patrolSpawnDelay;
+ patrolSpawnDelay = entityhuman.patrolSpawnDelay; + patrolSpawnDelay = entityhuman.patrolSpawnDelay;
} else { + } else {
- this.nextTick += 12000 + randomsource.nextInt(1200);
- long i = world.getDayTime() / 24000L;
+ this.nextTick--; + this.nextTick--;
+ patrolSpawnDelay = this.nextTick; + patrolSpawnDelay = this.nextTick;
+ } + }
+ +
+ if (patrolSpawnDelay > 0) { + if (patrolSpawnDelay > 0) {
+ return 0; return 0;
+ } else { } else {
- this.nextTick += 12000 + randomsource.nextInt(1200);
- long i = world.getDayTime() / 24000L;
+ long days; + long days;
+ if (world.paperConfig().entities.behavior.pillagerPatrols.start.perPlayer) { + if (world.paperConfig().entities.behavior.pillagerPatrols.start.perPlayer) {
+ days = entityhuman.getStats().getValue(net.minecraft.stats.Stats.CUSTOM.get(net.minecraft.stats.Stats.PLAY_TIME)) / 24000L; // PLAY_ONE_MINUTE is actually counting in ticks, a misnomer by Mojang + days = entityhuman.getStats().getValue(net.minecraft.stats.Stats.CUSTOM.get(net.minecraft.stats.Stats.PLAY_TIME)) / 24000L; // PLAY_ONE_MINUTE is actually counting in ticks, a misnomer by Mojang

Datei anzeigen

@ -74,26 +74,27 @@ index e5995d0db5dcfba59a873ff439601894fdacd556..b738ee2d3801fadfd09313f05ae24593
- this.availableGoals.removeIf((wrappedGoal) -> { - this.availableGoals.removeIf((wrappedGoal) -> {
- return wrappedGoal.getGoal() == goal; - return wrappedGoal.getGoal() == goal;
- }); - });
- }
-
- private static boolean goalContainsAnyFlags(WrappedGoal goal, EnumSet<Goal.Flag> controls) {
- for(Goal.Flag flag : goal.getFlags()) {
- if (controls.contains(flag)) {
- return true;
+ // Paper start - remove streams from pathfindergoalselector + // Paper start - remove streams from pathfindergoalselector
+ for (java.util.Iterator<WrappedGoal> iterator = this.availableGoals.iterator(); iterator.hasNext();) { + for (java.util.Iterator<WrappedGoal> iterator = this.availableGoals.iterator(); iterator.hasNext();) {
+ WrappedGoal goalWrapped = iterator.next(); + WrappedGoal goalWrapped = iterator.next();
+ if (goalWrapped.getGoal() != goal) { + if (goalWrapped.getGoal() != goal) {
+ continue; + continue;
} + }
+ if (goalWrapped.isRunning()) { + if (goalWrapped.isRunning()) {
+ goalWrapped.stop(); + goalWrapped.stop();
+ } + }
+ iterator.remove(); + iterator.remove();
}
+ // Paper end - remove streams from pathfindergoalselector
+ } + }
+ // Paper end - remove streams from pathfindergoalselector
}
- private static boolean goalContainsAnyFlags(WrappedGoal goal, EnumSet<Goal.Flag> controls) {
- for(Goal.Flag flag : goal.getFlags()) {
- if (controls.contains(flag)) {
- return true;
- }
- }
-
- return false; - return false;
+ private static boolean goalContainsAnyFlags(WrappedGoal goal, com.destroystokyo.paper.util.set.OptimizedSmallEnumSet<Goal.Flag> controls) { + private static boolean goalContainsAnyFlags(WrappedGoal goal, com.destroystokyo.paper.util.set.OptimizedSmallEnumSet<Goal.Flag> controls) {
+ return goal.getFlags().hasCommonElements(controls); // Paper + return goal.getFlags().hasCommonElements(controls); // Paper

Datei anzeigen

@ -318,7 +318,7 @@ index 39defceb694875322b3433a3ad4bb16256413ea8..86f19b7ed15c2029c5483f21b44895d8
final String msg = String.format("BlockEntity threw exception at %s:%s,%s,%s", LevelChunk.this.getLevel().getWorld().getName(), this.getPos().getX(), this.getPos().getY(), this.getPos().getZ()); final String msg = String.format("BlockEntity threw exception at %s:%s,%s,%s", LevelChunk.this.getLevel().getWorld().getName(), this.getPos().getX(), this.getPos().getY(), this.getPos().getZ());
net.minecraft.server.MinecraftServer.LOGGER.error(msg, throwable); net.minecraft.server.MinecraftServer.LOGGER.error(msg, throwable);
diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
index 8b03be6babe3052ab351061c0c206c84e26ef705..7f85bc8e8a666a32e392fa57418bf0d479e758d0 100644 index 7a0adf528be779241759d1efd818b0e57454a258..d7a98afeadc090281fdb24b27619536f318c2383 100644
--- a/src/main/java/org/bukkit/craftbukkit/Main.java --- a/src/main/java/org/bukkit/craftbukkit/Main.java
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java
@@ -178,6 +178,36 @@ public class Main { @@ -178,6 +178,36 @@ public class Main {
@ -358,7 +358,7 @@ index 8b03be6babe3052ab351061c0c206c84e26ef705..7f85bc8e8a666a32e392fa57418bf0d4
try { try {
options = parser.parse(args); options = parser.parse(args);
} catch (joptsimple.OptionException ex) { } catch (joptsimple.OptionException ex) {
@@ -273,8 +303,64 @@ public class Main { @@ -273,9 +303,65 @@ public class Main {
} catch (Throwable t) { } catch (Throwable t) {
t.printStackTrace(); t.printStackTrace();
} }
@ -405,9 +405,9 @@ index 8b03be6babe3052ab351061c0c206c84e26ef705..7f85bc8e8a666a32e392fa57418bf0d4
+ tryPreloadClass(net.minecraft.world.level.lighting.LayerLightEventListener.class.getName()); + tryPreloadClass(net.minecraft.world.level.lighting.LayerLightEventListener.class.getName());
+ tryPreloadClass(net.minecraft.util.ExceptionCollector.class.getName()); + tryPreloadClass(net.minecraft.util.ExceptionCollector.class.getName());
+ // Paper end + // Paper end
+ } }
+ } }
+
+ // Paper start + // Paper start
+ private static void tryPreloadClass(String className) { + private static void tryPreloadClass(String className) {
+ tryPreloadClass(className, true); + tryPreloadClass(className, true);
@ -417,12 +417,13 @@ index 8b03be6babe3052ab351061c0c206c84e26ef705..7f85bc8e8a666a32e392fa57418bf0d4
+ Class.forName(className); + Class.forName(className);
+ } catch (ClassNotFoundException e) { + } catch (ClassNotFoundException e) {
+ if (printError) System.err.println("An expected class " + className + " was not found for preloading: " + e.getMessage()); + if (printError) System.err.println("An expected class " + className + " was not found for preloading: " + e.getMessage());
} + }
} + }
+ // Paper end + // Paper end
+
private static List<String> asList(String... params) { private static List<String> asList(String... params) {
return Arrays.asList(params); return Arrays.asList(params);
}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java b/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java diff --git a/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java b/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java
index b4a19d80bbf71591f25729fd0e98590350cb31d0..e948ec5a573b22645664eb53bc3e9932246544e4 100644 index b4a19d80bbf71591f25729fd0e98590350cb31d0..e948ec5a573b22645664eb53bc3e9932246544e4 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java --- a/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java

Datei anzeigen

@ -136,17 +136,17 @@ index 1c638f65d33e5890a7a32bf7e89d484ae2afc093..4b7c39595302a738e6d4a1749473ef9c
- int chunkRange = level.spigotConfig.mobSpawnRange; - int chunkRange = level.spigotConfig.mobSpawnRange;
- chunkRange = (chunkRange > level.spigotConfig.viewDistance) ? (byte) level.spigotConfig.viewDistance : chunkRange; - chunkRange = (chunkRange > level.spigotConfig.viewDistance) ? (byte) level.spigotConfig.viewDistance : chunkRange;
- chunkRange = (chunkRange > 8) ? 8 : chunkRange; - chunkRange = (chunkRange > 8) ? 8 : chunkRange;
-
- final int finalChunkRange = chunkRange; // Paper for lambda below
- //double blockRange = (reducedRange) ? Math.pow(chunkRange << 4, 2) : 16384.0D; // Paper - use from event
- double blockRange = 16384.0D; // Paper
- // Spigot end
- long i = chunkcoordintpair.toLong();
+ // Paper start - optimise anyPlayerCloseEnoughForSpawning + // Paper start - optimise anyPlayerCloseEnoughForSpawning
+ final boolean anyPlayerCloseEnoughForSpawning(ChunkPos chunkcoordintpair, boolean reducedRange) { + final boolean anyPlayerCloseEnoughForSpawning(ChunkPos chunkcoordintpair, boolean reducedRange) {
+ return this.anyPlayerCloseEnoughForSpawning(this.getUpdatingChunkIfPresent(chunkcoordintpair.toLong()), chunkcoordintpair, reducedRange); + return this.anyPlayerCloseEnoughForSpawning(this.getUpdatingChunkIfPresent(chunkcoordintpair.toLong()), chunkcoordintpair, reducedRange);
+ } + }
- final int finalChunkRange = chunkRange; // Paper for lambda below
- //double blockRange = (reducedRange) ? Math.pow(chunkRange << 4, 2) : 16384.0D; // Paper - use from event
- double blockRange = 16384.0D; // Paper
- // Spigot end
- long i = chunkcoordintpair.toLong();
-
- if (!this.distanceManager.hasPlayersNearby(i)) { - if (!this.distanceManager.hasPlayersNearby(i)) {
+ final boolean anyPlayerCloseEnoughForSpawning(ChunkHolder playerchunk, ChunkPos chunkcoordintpair, boolean reducedRange) { + final boolean anyPlayerCloseEnoughForSpawning(ChunkHolder playerchunk, ChunkPos chunkcoordintpair, boolean reducedRange) {
+ // this function is so hot that removing the map lookup call can have an order of magnitude impact on its performance + // this function is so hot that removing the map lookup call can have an order of magnitude impact on its performance
@ -158,18 +158,11 @@ index 1c638f65d33e5890a7a32bf7e89d484ae2afc093..4b7c39595302a738e6d4a1749473ef9c
- Iterator iterator = this.playerMap.getPlayers(i).iterator(); - Iterator iterator = this.playerMap.getPlayers(i).iterator();
- -
- ServerPlayer entityplayer; - ServerPlayer entityplayer;
+ } -
+ Object[] backingSet = playersInRange.getBackingSet();
- do { - do {
- if (!iterator.hasNext()) { - if (!iterator.hasNext()) {
- return false; - return false;
+ if (reducedRange) { - }
+ for (int i = 0, len = backingSet.length; i < len; ++i) {
+ Object raw = backingSet[i];
+ if (!(raw instanceof ServerPlayer player)) {
+ continue;
}
- -
- entityplayer = (ServerPlayer) iterator.next(); - entityplayer = (ServerPlayer) iterator.next();
- // Paper start - add PlayerNaturallySpawnCreaturesEvent - // Paper start - add PlayerNaturallySpawnCreaturesEvent
@ -179,14 +172,24 @@ index 1c638f65d33e5890a7a32bf7e89d484ae2afc093..4b7c39595302a738e6d4a1749473ef9c
- event = entityplayer.playerNaturallySpawnedEvent; - event = entityplayer.playerNaturallySpawnedEvent;
- if (event == null || event.isCancelled()) return false; - if (event == null || event.isCancelled()) return false;
- blockRange = (double) ((event.getSpawnRadius() << 4) * (event.getSpawnRadius() << 4)); - blockRange = (double) ((event.getSpawnRadius() << 4) * (event.getSpawnRadius() << 4));
+ // don't check spectator and whatnot, already handled by mob spawn map update - }
+ if (euclideanDistanceSquared(chunkcoordintpair, player) < player.lastEntitySpawnRadiusSquared) {
+ return true; // in range
}
- // Paper end - // Paper end
- } while (!this.playerIsCloseEnoughForSpawning(entityplayer, chunkcoordintpair, blockRange)); // Spigot - } while (!this.playerIsCloseEnoughForSpawning(entityplayer, chunkcoordintpair, blockRange)); // Spigot
- -
- return true; - return true;
}
+ Object[] backingSet = playersInRange.getBackingSet();
+
+ if (reducedRange) {
+ for (int i = 0, len = backingSet.length; i < len; ++i) {
+ Object raw = backingSet[i];
+ if (!(raw instanceof ServerPlayer player)) {
+ continue;
+ }
+ // don't check spectator and whatnot, already handled by mob spawn map update
+ if (euclideanDistanceSquared(chunkcoordintpair, player) < player.lastEntitySpawnRadiusSquared) {
+ return true; // in range
+ }
+ } + }
+ } else { + } else {
+ final double range = (DistanceManager.MOB_SPAWN_RANGE * 16) * (DistanceManager.MOB_SPAWN_RANGE * 16); + final double range = (DistanceManager.MOB_SPAWN_RANGE * 16) * (DistanceManager.MOB_SPAWN_RANGE * 16);
@ -201,7 +204,7 @@ index 1c638f65d33e5890a7a32bf7e89d484ae2afc093..4b7c39595302a738e6d4a1749473ef9c
+ return true; // in range + return true; // in range
+ } + }
+ } + }
} + }
+ // no players in range + // no players in range
+ return false; + return false;
+ // Paper end - optimise anyPlayerCloseEnoughForSpawning + // Paper end - optimise anyPlayerCloseEnoughForSpawning

Datei anzeigen

@ -22,7 +22,7 @@ wants it to collect even faster, they can restore that setting back to 1 instead
Not adding it to .getType() though to keep behavior consistent with vanilla for performance reasons. Not adding it to .getType() though to keep behavior consistent with vanilla for performance reasons.
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 82b594729e595bfd7011334a27bdd3e427d2f903..2f978b0c5721b0cf145d324e6c7551d8f0c1eccf 100644 index 5b29bdd8c39bcdec81ed58b8e06ec6b6940363ab..fb98133b733b86596272609533d311633cbf9231 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -369,7 +369,7 @@ public final class CraftServer implements Server { @@ -369,7 +369,7 @@ public final class CraftServer implements Server {
@ -47,7 +47,7 @@ diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/jav
index efa01ad6ac0757da033f2bdf7729717239e474f2..977004b4b5a294c4eab2995777df6fb1faff4625 100644 index efa01ad6ac0757da033f2bdf7729717239e474f2..977004b4b5a294c4eab2995777df6fb1faff4625 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -281,8 +281,21 @@ public class CraftWorld extends CraftRegionAccessor implements World { @@ -281,9 +281,22 @@ public class CraftWorld extends CraftRegionAccessor implements World {
@Override @Override
public Chunk getChunkAt(int x, int z) { public Chunk getChunkAt(int x, int z) {
@ -60,16 +60,17 @@ index efa01ad6ac0757da033f2bdf7729717239e474f2..977004b4b5a294c4eab2995777df6fb1
+ } + }
+ return chunk.bukkitChunk; + return chunk.bukkitChunk;
+ // Paper end + // Paper end
+ } }
+
+ // Paper start + // Paper start
+ private void addTicket(int x, int z) { + private void addTicket(int x, int z) {
+ io.papermc.paper.util.MCUtil.MAIN_EXECUTOR.execute(() -> world.getChunkSource().addRegionTicket(TicketType.PLUGIN, new ChunkPos(x, z), 0, Unit.INSTANCE)); // Paper + io.papermc.paper.util.MCUtil.MAIN_EXECUTOR.execute(() -> world.getChunkSource().addRegionTicket(TicketType.PLUGIN, new ChunkPos(x, z), 0, Unit.INSTANCE)); // Paper
} + }
+ // Paper end + // Paper end
+
@Override @Override
public Chunk getChunkAt(Block block) { public Chunk getChunkAt(Block block) {
Preconditions.checkArgument(block != null, "null block");
@@ -349,7 +362,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @@ -349,7 +362,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
public boolean unloadChunkRequest(int x, int z) { public boolean unloadChunkRequest(int x, int z) {
org.spigotmc.AsyncCatcher.catchOp("chunk unload"); // Spigot org.spigotmc.AsyncCatcher.catchOp("chunk unload"); // Spigot

Datei anzeigen

@ -271,13 +271,12 @@ index 59d2af9f883541518c203302257f03dbe957aa0b..e6c857c8b4e4e65e3cf6a75ce6d844ff
protected static final class SkyDataLayerStorageMap extends DataLayerStorageMap<SkyLightSectionStorage.SkyDataLayerStorageMap> { protected static final class SkyDataLayerStorageMap extends DataLayerStorageMap<SkyLightSectionStorage.SkyDataLayerStorageMap> {
int currentLowestY; int currentLowestY;
- final Long2IntOpenHashMap topSections; - final Long2IntOpenHashMap topSections;
- + private final com.destroystokyo.paper.util.map.QueuedChangesMapLong2Int otherData; // Paper - avoid copying light data
- public SkyDataLayerStorageMap(Long2ObjectOpenHashMap<DataLayer> arrays, Long2IntOpenHashMap columnToTopSection, int minSectionY) { - public SkyDataLayerStorageMap(Long2ObjectOpenHashMap<DataLayer> arrays, Long2IntOpenHashMap columnToTopSection, int minSectionY) {
- super(arrays); - super(arrays);
- this.topSections = columnToTopSection; - this.topSections = columnToTopSection;
- columnToTopSection.defaultReturnValue(minSectionY); - columnToTopSection.defaultReturnValue(minSectionY);
+ private final com.destroystokyo.paper.util.map.QueuedChangesMapLong2Int otherData; // Paper - avoid copying light data
+
+ // Paper start - avoid copying light data + // Paper start - avoid copying light data
+ public SkyDataLayerStorageMap(com.destroystokyo.paper.util.map.QueuedChangesMapLong2Object<DataLayer> arrays, com.destroystokyo.paper.util.map.QueuedChangesMapLong2Int columnToTopSection, int minSectionY, boolean isVisible) { + public SkyDataLayerStorageMap(com.destroystokyo.paper.util.map.QueuedChangesMapLong2Object<DataLayer> arrays, com.destroystokyo.paper.util.map.QueuedChangesMapLong2Int columnToTopSection, int minSectionY, boolean isVisible) {
+ super(arrays, isVisible); + super(arrays, isVisible);

Datei anzeigen

@ -27,14 +27,13 @@ index ed16292b121aeaee5ad439176af57841281e293d..459403f9c8a784c3911d5ba163a2c90e
double d8 = d5 - this.vehicleFirstGoodZ; double d8 = d5 - this.vehicleFirstGoodZ;
double d9 = entity.getDeltaMovement().lengthSqr(); double d9 = entity.getDeltaMovement().lengthSqr();
- double d10 = d6 * d6 + d7 * d7 + d8 * d8; - double d10 = d6 * d6 + d7 * d7 + d8 * d8;
-
+ // Paper start - fix large move vectors killing the server + // Paper start - fix large move vectors killing the server
+ double currDeltaX = toX - fromX; + double currDeltaX = toX - fromX;
+ double currDeltaY = toY - fromY; + double currDeltaY = toY - fromY;
+ double currDeltaZ = toZ - fromZ; + double currDeltaZ = toZ - fromZ;
+ double d10 = Math.max(d6 * d6 + d7 * d7 + d8 * d8, (currDeltaX * currDeltaX + currDeltaY * currDeltaY + currDeltaZ * currDeltaZ) - 1); + double d10 = Math.max(d6 * d6 + d7 * d7 + d8 * d8, (currDeltaX * currDeltaX + currDeltaY * currDeltaY + currDeltaZ * currDeltaZ) - 1);
+ // Paper end - fix large move vectors killing the server + // Paper end - fix large move vectors killing the server
+
+ // Paper start - fix large move vectors killing the server + // Paper start - fix large move vectors killing the server
+ double otherFieldX = d3 - this.vehicleLastGoodX; + double otherFieldX = d3 - this.vehicleLastGoodX;
+ double otherFieldY = d4 - this.vehicleLastGoodY - 1.0E-6D; + double otherFieldY = d4 - this.vehicleLastGoodY - 1.0E-6D;

Datei anzeigen

@ -25,10 +25,10 @@ index 1ee1b757b90ae0d080aa57f4186228a6f4279c1f..abd13cefd3d8409e1ef8ea70d92877f7
+ //this.level.setBlockAndUpdate(this.level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, EndPodiumFeature.END_PODIUM_LOCATION), Blocks.DRAGON_EGG.defaultBlockState()); + //this.level.setBlockAndUpdate(this.level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, EndPodiumFeature.END_PODIUM_LOCATION), Blocks.DRAGON_EGG.defaultBlockState());
+ } else { + } else {
+ eggEvent.setCancelled(true); + eggEvent.setCancelled(true);
+ } }
+ if (eggEvent.callEvent()) { + if (eggEvent.callEvent()) {
+ eggEvent.getNewState().update(true); + eggEvent.getNewState().update(true);
} + }
+ // Paper end - DragonEggFormEvent + // Paper end - DragonEggFormEvent
this.previouslyKilled = true; this.previouslyKilled = true;

Datei anzeigen

@ -5,7 +5,7 @@ Subject: [PATCH] Allow adding items to BlockDropItemEvent
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
index d347b109f046ad633cb2b361fbe47e67595843f5..d39a4e21fa2da3fec535ca62028f1c5ac92e8c96 100644 index 15b4be18064137d21565434adae97883fb0a8d6a..451fee716b07c8daadcffc9b87973a56641e8198 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -399,13 +399,30 @@ public class CraftEventFactory { @@ -399,13 +399,30 @@ public class CraftEventFactory {
@ -31,13 +31,13 @@ index d347b109f046ad633cb2b361fbe47e67595843f5..d39a4e21fa2da3fec535ca62028f1c5a
+ Entity item = ((org.bukkit.craftbukkit.entity.CraftItem) bukkit).getHandle(); + Entity item = ((org.bukkit.craftbukkit.entity.CraftItem) bukkit).getHandle();
+ item.level.addFreshEntity(item); + item.level.addFreshEntity(item);
+ } + }
+ } }
+ } else { + } else {
+ for (Item bukkit : list) { + for (Item bukkit : list) {
+ if (bukkit.isValid()) { + if (bukkit.isValid()) {
+ bukkit.remove(); + bukkit.remove();
+ } + }
} + }
+ // Paper end + // Paper end
} }
} }

Datei anzeigen

@ -26,7 +26,7 @@ index 98a3f6388712fab9012210241b84def3aca712e2..f2094c52196b45adfd51d8aebcc4c46b
if (flag) { if (flag) {
ItemStack itemstack = this.getItemBySlot(EquipmentSlot.HEAD); ItemStack itemstack = this.getItemBySlot(EquipmentSlot.HEAD);
@@ -228,7 +234,20 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo @@ -228,8 +234,21 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo
public void readAdditionalSaveData(CompoundTag nbt) { public void readAdditionalSaveData(CompoundTag nbt) {
super.readAdditionalSaveData(nbt); super.readAdditionalSaveData(nbt);
this.reassessWeaponGoal(); this.reassessWeaponGoal();
@ -35,18 +35,19 @@ index 98a3f6388712fab9012210241b84def3aca712e2..f2094c52196b45adfd51d8aebcc4c46b
+ this.shouldBurnInDay = nbt.getBoolean("Paper.ShouldBurnInDay"); + this.shouldBurnInDay = nbt.getBoolean("Paper.ShouldBurnInDay");
+ } + }
+ // Paper end + // Paper end
+ } }
+
+ // Paper start + // Paper start
+ @Override + @Override
+ public void addAdditionalSaveData(CompoundTag nbt) { + public void addAdditionalSaveData(CompoundTag nbt) {
+ super.addAdditionalSaveData(nbt); + super.addAdditionalSaveData(nbt);
+ nbt.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); + nbt.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay);
} + }
+ // Paper end + // Paper end
+
@Override @Override
public void setItemSlot(EquipmentSlot slot, ItemStack stack) { public void setItemSlot(EquipmentSlot slot, ItemStack stack) {
super.setItemSlot(slot, stack);
diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java
index 0ada1ba6774e3d0514afb946fd0f104004cc020d..97fb1d2110a51498f6419841081b500b3f190370 100644 index 0ada1ba6774e3d0514afb946fd0f104004cc020d..97fb1d2110a51498f6419841081b500b3f190370 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java

Datei anzeigen

@ -1,5 +1,5 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Riley Park <riley.park@meino.net> From: Riley Park <rileysebastianpark@gmail.com>
Date: Mon, 17 May 2021 00:34:55 -0700 Date: Mon, 17 May 2021 00:34:55 -0700
Subject: [PATCH] Add environment variable to disable server gui Subject: [PATCH] Add environment variable to disable server gui

Datei anzeigen

@ -36,7 +36,7 @@ index b5f54ee82905e3e6ab5bfde35ab625f5feeb1393..c0a80824a0307ea673805015119cc834
public boolean shouldDisconnect() { public boolean shouldDisconnect() {
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index b9ef06e2ba2e9842a0b4d66976b703918f585752..4c61e7c5e38f6d1e4e1301a5d65b57c19a3b3a58 100644 index 1874354a04a1e7ad86f2c438c7526da94b9b9e6a..abd2ca040779e651ba01cbb6426b8c997303ccf3 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java --- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -2151,7 +2151,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa @@ -2151,7 +2151,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@ -146,13 +146,13 @@ index c5788a4f0acdd44d55446fd729311db7e72c0d86..db44aa972afa0e6d65c54c35382235c3
public void disconnect(final Component reason) { public void disconnect(final Component reason) {
- this.disconnect(PaperAdventure.asAdventure(reason)); - this.disconnect(PaperAdventure.asAdventure(reason));
+ this.disconnect(PaperAdventure.asAdventure(reason), org.bukkit.event.player.PlayerKickEvent.Cause.UNKNOWN); + this.disconnect(PaperAdventure.asAdventure(reason), org.bukkit.event.player.PlayerKickEvent.Cause.UNKNOWN);
+ }
+
+ public void disconnect(final Component reason, PlayerKickEvent.Cause cause) {
+ this.disconnect(PaperAdventure.asAdventure(reason), cause);
} }
- public void disconnect(net.kyori.adventure.text.Component reason) { - public void disconnect(net.kyori.adventure.text.Component reason) {
+ public void disconnect(final Component reason, PlayerKickEvent.Cause cause) {
+ this.disconnect(PaperAdventure.asAdventure(reason), cause);
+ }
+
+ public void disconnect(net.kyori.adventure.text.Component reason, org.bukkit.event.player.PlayerKickEvent.Cause cause) { + public void disconnect(net.kyori.adventure.text.Component reason, org.bukkit.event.player.PlayerKickEvent.Cause cause) {
// Paper end // Paper end
// CraftBukkit start - fire PlayerKickEvent // CraftBukkit start - fire PlayerKickEvent
@ -491,7 +491,7 @@ index a24e7a66d52eddbdad8db71cf5e45f1a458c389f..e1c13ac7b11fb0080435fc34502208c8
} }
} }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 1fd9bceff4a37eedfd84f0a8624435dc3359b4c4..3632756c7e3db14669fe3957a74b2af4b94bd7ac 100644 index 10656ace14424000b9a60ef4af1fd494a21ded33..8a0c0c9298f6505bca4d996621fc3899ee6123ae 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -600,7 +600,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -600,7 +600,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {

Datei anzeigen

@ -5,7 +5,7 @@ Subject: [PATCH] Stinger API
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
index 0f6239cf279ca1a45dd9f48179cee8f66a05ef8d..1a2ea36994175c690c62aa8bc70201d8845c9209 100644 index f217df2d3c7a53b72418fab63cef06dbc107fe0d..cbb6b437358823cd52518682f32dd597c9aeb85a 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
@@ -340,7 +340,28 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { @@ -340,7 +340,28 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
@ -17,12 +17,12 @@ index 0f6239cf279ca1a45dd9f48179cee8f66a05ef8d..1a2ea36994175c690c62aa8bc70201d8
+ public int getBeeStingerCooldown() { + public int getBeeStingerCooldown() {
+ return getHandle().removeStingerTime; + return getHandle().removeStingerTime;
+ } + }
+
+ @Override + @Override
+ public void setBeeStingerCooldown(int ticks) { + public void setBeeStingerCooldown(int ticks) {
+ getHandle().removeStingerTime = ticks; + getHandle().removeStingerTime = ticks;
+ } + }
+
+ @Override + @Override
+ public int getBeeStingersInBody() { + public int getBeeStingersInBody() {
+ return getHandle().getStingerCount(); + return getHandle().getStingerCount();

Datei anzeigen

@ -137,9 +137,12 @@ index c47cae84f3b6970247d78382f48ae8ddbc202b59..1435251a4fb721b800e6a1f07b50c5f7
- public AdvancementDisplay getDisplay() { - public AdvancementDisplay getDisplay() {
- if (this.handle.getDisplay() == null) { - if (this.handle.getDisplay() == null) {
- return null; - return null;
- }
-
- return new CraftAdvancementDisplay(this.handle.getDisplay());
+ public io.papermc.paper.advancement.AdvancementDisplay getDisplay() { + public io.papermc.paper.advancement.AdvancementDisplay getDisplay() {
+ return this.handle.getDisplay() == null ? null : this.handle.getDisplay().paper; + return this.handle.getDisplay() == null ? null : this.handle.getDisplay().paper;
+ } }
+ +
+ @Deprecated @io.papermc.paper.annotation.DoNotUse + @Deprecated @io.papermc.paper.annotation.DoNotUse
+ public AdvancementDisplay getDisplay0() { // May be called by plugins via Commodore + public AdvancementDisplay getDisplay0() { // May be called by plugins via Commodore
@ -161,11 +164,10 @@ index c47cae84f3b6970247d78382f48ae8ddbc202b59..1435251a4fb721b800e6a1f07b50c5f7
+ final var children = com.google.common.collect.ImmutableList.<org.bukkit.advancement.Advancement>builder(); + final var children = com.google.common.collect.ImmutableList.<org.bukkit.advancement.Advancement>builder();
+ for (Advancement advancement : this.handle.getChildren()) { + for (Advancement advancement : this.handle.getChildren()) {
+ children.add(advancement.bukkit); + children.add(advancement.bukkit);
} + }
+ return children.build(); + return children.build();
+ } + }
+
- return new CraftAdvancementDisplay(this.handle.getDisplay());
+ @Override + @Override
+ public org.bukkit.advancement.Advancement getRoot() { + public org.bukkit.advancement.Advancement getRoot() {
+ Advancement advancement = this.handle; + Advancement advancement = this.handle;
@ -173,7 +175,7 @@ index c47cae84f3b6970247d78382f48ae8ddbc202b59..1435251a4fb721b800e6a1f07b50c5f7
+ advancement = advancement.getParent(); + advancement = advancement.getParent();
+ } + }
+ return advancement.bukkit; + return advancement.bukkit;
} + }
+ // Paper end + // Paper end
} }
diff --git a/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancementDisplay.java b/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancementDisplay.java diff --git a/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancementDisplay.java b/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancementDisplay.java

Datei anzeigen

@ -105,15 +105,15 @@ index 2456edc11b29a92b1648937cd3dd6a9a05706803..b48650c38751a925b83fb4c19ac02f87
jsonarray.add(GameProfileCache.writeGameProfile(usercache_usercacheentry, dateformat)); jsonarray.add(GameProfileCache.writeGameProfile(usercache_usercacheentry, dateformat));
}); });
String s = this.gson.toJson(jsonarray); String s = this.gson.toJson(jsonarray);
@@ -332,8 +349,19 @@ public class GameProfileCache { @@ -332,9 +349,20 @@ public class GameProfileCache {
} }
private Stream<GameProfileCache.GameProfileInfo> getTopMRUProfiles(int limit) { private Stream<GameProfileCache.GameProfileInfo> getTopMRUProfiles(int limit) {
- return ImmutableList.copyOf(this.profilesByUUID.values()).stream().sorted(Comparator.comparing(GameProfileCache.GameProfileInfo::getLastAccess).reversed()).limit((long) limit); - return ImmutableList.copyOf(this.profilesByUUID.values()).stream().sorted(Comparator.comparing(GameProfileCache.GameProfileInfo::getLastAccess).reversed()).limit((long) limit);
+ // Paper start - allow better concurrency + // Paper start - allow better concurrency
+ return this.listTopMRUProfiles(limit).stream(); + return this.listTopMRUProfiles(limit).stream();
+ } }
+
+ private List<GameProfileCache.GameProfileInfo> listTopMRUProfiles(int limit) { + private List<GameProfileCache.GameProfileInfo> listTopMRUProfiles(int limit) {
+ try { + try {
+ this.stateLock.lock(); + this.stateLock.lock();
@ -121,8 +121,9 @@ index 2456edc11b29a92b1648937cd3dd6a9a05706803..b48650c38751a925b83fb4c19ac02f87
+ } finally { + } finally {
+ this.stateLock.unlock(); + this.stateLock.unlock();
+ } + }
} + }
+ // Paper end + // Paper end
+
private static JsonElement writeGameProfile(GameProfileCache.GameProfileInfo entry, DateFormat dateFormat) { private static JsonElement writeGameProfile(GameProfileCache.GameProfileInfo entry, DateFormat dateFormat) {
JsonObject jsonobject = new JsonObject(); JsonObject jsonobject = new JsonObject();

Datei anzeigen

@ -170,13 +170,13 @@ index d1652c237b2b272f0dfe80f774cff16056f39046..b768767b92bf7691a6e57627c69818a1
} }
+ // Paper start - optimise chunk tick iteration + // Paper start - optimise chunk tick iteration
+ } + }
+ } }
+ +
+ } finally { + } finally {
+ if (iterator1 instanceof io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet.Iterator safeIterator) { + if (iterator1 instanceof io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet.Iterator safeIterator) {
+ safeIterator.finishedIterating(); + safeIterator.finishedIterating();
+ } + }
} + }
+ // Paper end - optimise chunk tick iteration + // Paper end - optimise chunk tick iteration
this.level.timings.chunkTicks.stopTiming(); // Paper this.level.timings.chunkTicks.stopTiming(); // Paper
gameprofilerfiller.popPush("customSpawners"); gameprofilerfiller.popPush("customSpawners");
@ -186,15 +186,15 @@ index d1652c237b2b272f0dfe80f774cff16056f39046..b768767b92bf7691a6e57627c69818a1
} // Paper - timings } // Paper - timings
} }
- -
- gameprofilerfiller.popPush("broadcast"); + gameprofilerfiller.pop();
+ // Paper start - use set of chunks requiring updates, rather than iterating every single one loaded
gameprofilerfiller.popPush("broadcast");
- list.forEach((chunkproviderserver_a1) -> { - list.forEach((chunkproviderserver_a1) -> {
- this.level.timings.broadcastChunkUpdates.startTiming(); // Paper - timing - this.level.timings.broadcastChunkUpdates.startTiming(); // Paper - timing
- chunkproviderserver_a1.holder.broadcastChanges(chunkproviderserver_a1.chunk); - chunkproviderserver_a1.holder.broadcastChanges(chunkproviderserver_a1.chunk);
- this.level.timings.broadcastChunkUpdates.stopTiming(); // Paper - timing - this.level.timings.broadcastChunkUpdates.stopTiming(); // Paper - timing
- }); - });
gameprofilerfiller.pop(); - gameprofilerfiller.pop();
+ // Paper start - use set of chunks requiring updates, rather than iterating every single one loaded
+ gameprofilerfiller.popPush("broadcast");
+ this.level.timings.broadcastChunkUpdates.startTiming(); // Paper - timing + this.level.timings.broadcastChunkUpdates.startTiming(); // Paper - timing
+ if (!this.chunkMap.needsChangeBroadcasting.isEmpty()) { + if (!this.chunkMap.needsChangeBroadcasting.isEmpty()) {
+ ReferenceOpenHashSet<ChunkHolder> copy = this.chunkMap.needsChangeBroadcasting.clone(); + ReferenceOpenHashSet<ChunkHolder> copy = this.chunkMap.needsChangeBroadcasting.clone();

Datei anzeigen

@ -10,7 +10,7 @@ hoping that at least then we don't swap chunks, and maybe recover
them all. them all.
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java
index 9981bbfd846a5380b99f0d894b121db554d03028..f7c7c351d99890adfa25e0a1368229e5cba37f98 100644 index f0f38f1a7603cd06aba6adefd370d40b97f2e5b8..34a1976699571608ae19e20dc1b6020759dad909 100644
--- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java --- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java +++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java
@@ -70,6 +70,18 @@ import net.minecraft.world.ticks.ProtoChunkTicks; @@ -70,6 +70,18 @@ import net.minecraft.world.ticks.ProtoChunkTicks;
@ -42,7 +42,7 @@ index 9981bbfd846a5380b99f0d894b121db554d03028..f7c7c351d99890adfa25e0a1368229e5
nbttagcompound.putString("Status", chunk.getStatus().getName()); nbttagcompound.putString("Status", chunk.getStatus().getName());
BlendingData blendingdata = chunk.getBlendingData(); BlendingData blendingdata = chunk.getBlendingData();
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
index 10603eebf36caca7870e9cf087e99d529550ad3e..2b7c41a176f354001bc9f2e1a08a4e3d1dc547b3 100644 index e9b13e4f70d9a556e6a7d022a952085051c1819d..71abf1c82ee4f5530bd29b3a97dec9fdb7705779 100644
--- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java --- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java +++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
@@ -41,7 +41,7 @@ public class ChunkStorage implements AutoCloseable { @@ -41,7 +41,7 @@ public class ChunkStorage implements AutoCloseable {
@ -509,7 +509,7 @@ index cda87a66fe80bf910f629c64e36c1fecbad81d77..9bae47f99336c377beb72c4b50b7f01c
} else { } else {
- this.usedSectors.force(i1, j1); - this.usedSectors.force(i1, j1);
+ //this.usedSectors.force(i1, j1); // Paper - move this down so we can check if it fails to allocate + //this.usedSectors.force(i1, j1); // Paper - move this down so we can check if it fails to allocate
+ } }
+ // Paper start - recalculate header on header corruption + // Paper start - recalculate header on header corruption
+ if (offset < 2 || sectorLength <= 0 || ((long)offset * 4096L) > regionFileSize) { + if (offset < 2 || sectorLength <= 0 || ((long)offset * 4096L) > regionFileSize) {
+ if (canRecalcHeader) { + if (canRecalcHeader) {
@ -532,7 +532,7 @@ index cda87a66fe80bf910f629c64e36c1fecbad81d77..9bae47f99336c377beb72c4b50b7f01c
+ boolean failedToAllocate = !this.usedSectors.tryAllocate(offset, sectorLength); + boolean failedToAllocate = !this.usedSectors.tryAllocate(offset, sectorLength);
+ if (failedToAllocate) { + if (failedToAllocate) {
+ LOGGER.error("Overlapping allocation by local chunk (" + (headerLocation & 31) + "," + (headerLocation >>> 5) + ") in regionfile " + this.regionFile.toAbsolutePath()); + LOGGER.error("Overlapping allocation by local chunk (" + (headerLocation & 31) + "," + (headerLocation >>> 5) + ") in regionfile " + this.regionFile.toAbsolutePath());
} + }
+ if (failedToAllocate & !canRecalcHeader) { + if (failedToAllocate & !canRecalcHeader) {
+ // location = chunkX | (chunkZ << 5); + // location = chunkX | (chunkZ << 5);
+ LOGGER.error("Detected invalid header for regionfile " + this.regionFile.toAbsolutePath() + + LOGGER.error("Detected invalid header for regionfile " + this.regionFile.toAbsolutePath() +

Datei anzeigen

@ -15,17 +15,16 @@ index e0aa9a57d6a5993d7333b7685b6fa1b50bc11ea0..34d744837e599633a3c2c0b72f253bb0
private static boolean isNearWater(LevelReader world, BlockPos pos) { private static boolean isNearWater(LevelReader world, BlockPos pos) {
- Iterator iterator = BlockPos.betweenClosed(pos.offset(-4, 0, -4), pos.offset(4, 1, 4)).iterator(); - Iterator iterator = BlockPos.betweenClosed(pos.offset(-4, 0, -4), pos.offset(4, 1, 4)).iterator();
- + // Paper start - remove abstract block iteration
+ int xOff = pos.getX();
+ int yOff = pos.getY();
+ int zOff = pos.getZ();
- BlockPos blockposition1; - BlockPos blockposition1;
- -
- do { - do {
- if (!iterator.hasNext()) { - if (!iterator.hasNext()) {
- return false; - return false;
+ // Paper start - remove abstract block iteration
+ int xOff = pos.getX();
+ int yOff = pos.getY();
+ int zOff = pos.getZ();
+
+ for (int dz = -4; dz <= 4; ++dz) { + for (int dz = -4; dz <= 4; ++dz) {
+ int z = dz + zOff; + int z = dz + zOff;
+ for (int dx = -4; dx <= 4; ++dx) { + for (int dx = -4; dx <= 4; ++dx) {

Datei anzeigen

@ -173,7 +173,14 @@ index 1f683d734b9e272c8f4c48d922f3dcd12d0ffd1a..9523f6acd2c86892b390e14aaab628b4
if (randomTickSpeed > 0) { if (randomTickSpeed > 0) {
- LevelChunkSection[] achunksection = chunk.getSections(); - LevelChunkSection[] achunksection = chunk.getSections();
- int j1 = achunksection.length; - int j1 = achunksection.length;
- + LevelChunkSection[] sections = chunk.getSections();
+ int minSection = io.papermc.paper.util.WorldUtil.getMinSection(this);
+ for (int sectionIndex = 0; sectionIndex < sections.length; ++sectionIndex) {
+ LevelChunkSection section = sections[sectionIndex];
+ if (section == null || section.tickingList.size() == 0) {
+ continue;
+ }
- for (int k1 = 0; k1 < j1; ++k1) { - for (int k1 = 0; k1 < j1; ++k1) {
- LevelChunkSection chunksection = achunksection[k1]; - LevelChunkSection chunksection = achunksection[k1];
- -
@ -185,40 +192,35 @@ index 1f683d734b9e272c8f4c48d922f3dcd12d0ffd1a..9523f6acd2c86892b390e14aaab628b4
- -
- gameprofilerfiller.push("randomTick"); - gameprofilerfiller.push("randomTick");
- BlockState iblockdata3 = chunksection.getBlockState(blockposition2.getX() - j, blockposition2.getY() - l1, blockposition2.getZ() - k); - BlockState iblockdata3 = chunksection.getBlockState(blockposition2.getX() - j, blockposition2.getY() - l1, blockposition2.getZ() - k);
+ LevelChunkSection[] sections = chunk.getSections(); -
+ int minSection = io.papermc.paper.util.WorldUtil.getMinSection(this);
+ for (int sectionIndex = 0; sectionIndex < sections.length; ++sectionIndex) {
+ LevelChunkSection section = sections[sectionIndex];
+ if (section == null || section.tickingList.size() == 0) {
+ continue;
+ }
- if (iblockdata3.isRandomlyTicking()) { - if (iblockdata3.isRandomlyTicking()) {
- iblockdata3.randomTick(this, blockposition2, this.random); - iblockdata3.randomTick(this, blockposition2, this.random);
- } - }
-
- FluidState fluid = iblockdata3.getFluidState();
-
- if (fluid.isRandomlyTicking()) {
- fluid.randomTick(this, blockposition2, this.random);
- }
-
- gameprofilerfiller.pop();
+ int yPos = (sectionIndex + minSection) << 4; + int yPos = (sectionIndex + minSection) << 4;
+ for (int a = 0; a < randomTickSpeed; ++a) { + for (int a = 0; a < randomTickSpeed; ++a) {
+ int tickingBlocks = section.tickingList.size(); + int tickingBlocks = section.tickingList.size();
+ int index = this.randomTickRandom.nextInt(16 * 16 * 16); + int index = this.randomTickRandom.nextInt(16 * 16 * 16);
+ if (index >= tickingBlocks) { + if (index >= tickingBlocks) {
+ continue; + continue;
+ } }
+
- FluidState fluid = iblockdata3.getFluidState();
+ long raw = section.tickingList.getRaw(index); + long raw = section.tickingList.getRaw(index);
+ int location = com.destroystokyo.paper.util.maplist.IBlockDataList.getLocationFromRaw(raw); + int location = com.destroystokyo.paper.util.maplist.IBlockDataList.getLocationFromRaw(raw);
+ int randomX = location & 15; + int randomX = location & 15;
+ int randomY = ((location >>> (4 + 4)) & 255) | yPos; + int randomY = ((location >>> (4 + 4)) & 255) | yPos;
+ int randomZ = (location >>> 4) & 15; + int randomZ = (location >>> 4) & 15;
+
- if (fluid.isRandomlyTicking()) {
- fluid.randomTick(this, blockposition2, this.random);
- }
+ BlockPos blockposition2 = blockposition.set(j + randomX, randomY, k + randomZ); + BlockPos blockposition2 = blockposition.set(j + randomX, randomY, k + randomZ);
+ BlockState iblockdata = com.destroystokyo.paper.util.maplist.IBlockDataList.getBlockDataFromRaw(raw); + BlockState iblockdata = com.destroystokyo.paper.util.maplist.IBlockDataList.getBlockDataFromRaw(raw);
+
- gameprofilerfiller.pop();
- }
+ iblockdata.randomTick(this, blockposition2, this.randomTickRandom); + iblockdata.randomTick(this, blockposition2, this.randomTickRandom);
+ // We drop the fluid tick since LAVA is ALREADY TICKED by the above method (See LiquidBlock). + // We drop the fluid tick since LAVA is ALREADY TICKED by the above method (See LiquidBlock).
+ // TODO CHECK ON UPDATE (ping the Canadian) + // TODO CHECK ON UPDATE (ping the Canadian)
@ -377,7 +379,14 @@ index 8c8445af8a2fe684fdbb468f8d8605d44a803758..c7e2796e136ee8fb7d7e438a7fc59826
public void recalcBlockCounts() { public void recalcBlockCounts() {
- class a implements PalettedContainer.CountConsumer<BlockState> { - class a implements PalettedContainer.CountConsumer<BlockState> {
- + // Paper start - unfuck this
+ this.tickingList.clear();
+ this.nonEmptyBlockCount = 0;
+ this.tickingBlockCount = 0;
+ this.tickingFluidCount = 0;
+ this.states.forEachLocation((BlockState iblockdata, int i) -> {
+ FluidState fluid = iblockdata.getFluidState();
- public int nonEmptyBlockCount; - public int nonEmptyBlockCount;
- public int tickingBlockCount; - public int tickingBlockCount;
- public int tickingFluidCount; - public int tickingFluidCount;
@ -392,38 +401,31 @@ index 8c8445af8a2fe684fdbb468f8d8605d44a803758..c7e2796e136ee8fb7d7e438a7fc59826
- if (iblockdata.isRandomlyTicking()) { - if (iblockdata.isRandomlyTicking()) {
- this.tickingBlockCount += i; - this.tickingBlockCount += i;
- } - }
+ // Paper start - unfuck this
+ this.tickingList.clear();
+ this.nonEmptyBlockCount = 0;
+ this.tickingBlockCount = 0;
+ this.tickingFluidCount = 0;
+ this.states.forEachLocation((BlockState iblockdata, int i) -> {
+ FluidState fluid = iblockdata.getFluidState();
+
+ if (!iblockdata.isAir()) { + if (!iblockdata.isAir()) {
+ this.nonEmptyBlockCount = (short) (this.nonEmptyBlockCount + 1); + this.nonEmptyBlockCount = (short) (this.nonEmptyBlockCount + 1);
+ if (iblockdata.isRandomlyTicking()) { + if (iblockdata.isRandomlyTicking()) {
+ this.tickingBlockCount = (short)(this.tickingBlockCount + 1); + this.tickingBlockCount = (short)(this.tickingBlockCount + 1);
+ this.tickingList.add(i, iblockdata); + this.tickingList.add(i, iblockdata);
} }
+ } -
- if (!fluid.isEmpty()) { - if (!fluid.isEmpty()) {
- this.nonEmptyBlockCount += i; - this.nonEmptyBlockCount += i;
- if (fluid.isRandomlyTicking()) { - if (fluid.isRandomlyTicking()) {
- this.tickingFluidCount += i; - this.tickingFluidCount += i;
- } - }
+ if (!fluid.isEmpty()) { - }
+ this.nonEmptyBlockCount = (short) (this.nonEmptyBlockCount + 1);
+ if (fluid.isRandomlyTicking()) {
+ this.tickingFluidCount = (short) (this.tickingFluidCount + 1);
}
- -
} }
- } - }
- a a0 = new a(); - a a0 = new a();
- + if (!fluid.isEmpty()) {
+ this.nonEmptyBlockCount = (short) (this.nonEmptyBlockCount + 1);
+ if (fluid.isRandomlyTicking()) {
+ this.tickingFluidCount = (short) (this.tickingFluidCount + 1);
+ }
+ }
- this.states.count(a0); - this.states.count(a0);
- this.nonEmptyBlockCount = (short) a0.nonEmptyBlockCount; - this.nonEmptyBlockCount = (short) a0.nonEmptyBlockCount;
- this.tickingBlockCount = (short) a0.tickingBlockCount; - this.tickingBlockCount = (short) a0.tickingBlockCount;

Datei anzeigen

@ -328,21 +328,21 @@ index cf76ca2ebead64d194ce03ee024085d32d02077a..1caa329567b50a962c54bb00c79cc98e
private static <T extends BlockEntity, B extends CraftBlockEntityState<T>> void register( private static <T extends BlockEntity, B extends CraftBlockEntityState<T>> void register(
- Material blockType, - Material blockType,
- Class<B> blockStateType,
- BiFunction<World, T, B> blockStateConstructor,
- BiFunction<BlockPos, net.minecraft.world.level.block.state.BlockState, T> tileEntityConstructor
- ) {
- CraftBlockStates.register(Collections.singletonList(blockType), blockStateType, blockStateConstructor, tileEntityConstructor);
- }
-
- private static <T extends BlockEntity, B extends CraftBlockEntityState<T>> void register(
- List<Material> blockTypes,
+ net.minecraft.world.level.block.entity.BlockEntityType<? extends T> blockEntityType, // Paper + net.minecraft.world.level.block.entity.BlockEntityType<? extends T> blockEntityType, // Paper
Class<B> blockStateType, Class<B> blockStateType,
- BiFunction<World, T, B> blockStateConstructor, - BiFunction<World, T, B> blockStateConstructor,
- BiFunction<BlockPos, net.minecraft.world.level.block.state.BlockState, T> tileEntityConstructor - BiFunction<BlockPos, net.minecraft.world.level.block.state.BlockState, T> tileEntityConstructor
+ BiFunction<World, T, B> blockStateConstructor // Paper + BiFunction<World, T, B> blockStateConstructor // Paper
) { ) {
- CraftBlockStates.register(Collections.singletonList(blockType), blockStateType, blockStateConstructor, tileEntityConstructor);
- }
-
- private static <T extends BlockEntity, B extends CraftBlockEntityState<T>> void register(
- List<Material> blockTypes,
- Class<B> blockStateType,
- BiFunction<World, T, B> blockStateConstructor,
- BiFunction<BlockPos, net.minecraft.world.level.block.state.BlockState, T> tileEntityConstructor
- ) {
- BlockStateFactory<B> factory = new BlockEntityStateFactory<>(blockStateType, blockStateConstructor, tileEntityConstructor); - BlockStateFactory<B> factory = new BlockEntityStateFactory<>(blockStateType, blockStateConstructor, tileEntityConstructor);
- for (Material blockType : blockTypes) { - for (Material blockType : blockTypes) {
- CraftBlockStates.register(blockType, factory); - CraftBlockStates.register(blockType, factory);

Datei anzeigen

@ -8,7 +8,7 @@ Chunks not marked as lit will always go through the light engine,
so they should always have their block sources parsed. so they should always have their block sources parsed.
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java
index f7c7c351d99890adfa25e0a1368229e5cba37f98..887378de7a0673e929a6dcfb30c87a097d12a402 100644 index 34a1976699571608ae19e20dc1b6020759dad909..0ec80b83a99bfdb1f985045d98a81905a8a5a3ac 100644
--- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java --- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java +++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java
@@ -327,16 +327,33 @@ public class ChunkSerializer { @@ -327,16 +327,33 @@ public class ChunkSerializer {
@ -21,10 +21,14 @@ index f7c7c351d99890adfa25e0a1368229e5cba37f98..887378de7a0673e929a6dcfb30c87a09
+ // Paper start - let's make sure the implementation isn't as slow as possible + // Paper start - let's make sure the implementation isn't as slow as possible
+ int offX = chunkPos.x << 4; + int offX = chunkPos.x << 4;
+ int offZ = chunkPos.z << 4; + int offZ = chunkPos.z << 4;
+
- while (iterator.hasNext()) {
- BlockPos blockposition = (BlockPos) iterator.next();
+ int minChunkSection = io.papermc.paper.util.WorldUtil.getMinSection(world); + int minChunkSection = io.papermc.paper.util.WorldUtil.getMinSection(world);
+ int maxChunkSection = io.papermc.paper.util.WorldUtil.getMaxSection(world); + int maxChunkSection = io.papermc.paper.util.WorldUtil.getMaxSection(world);
+
- if (((ChunkAccess) object1).getBlockState(blockposition).getLightEmission() != 0) {
- protochunk.addLight(blockposition);
+ LevelChunkSection[] sections = achunksection; + LevelChunkSection[] sections = achunksection;
+ for (int sectionY = minChunkSection; sectionY <= maxChunkSection; ++sectionY) { + for (int sectionY = minChunkSection; sectionY <= maxChunkSection; ++sectionY) {
+ LevelChunkSection section = sections[sectionY - minChunkSection]; + LevelChunkSection section = sections[sectionY - minChunkSection];
@ -33,16 +37,12 @@ index f7c7c351d99890adfa25e0a1368229e5cba37f98..887378de7a0673e929a6dcfb30c87a09
+ continue; + continue;
+ } + }
+ int offY = sectionY << 4; + int offY = sectionY << 4;
+
- while (iterator.hasNext()) {
- BlockPos blockposition = (BlockPos) iterator.next();
+ for (int index = 0; index < (16 * 16 * 16); ++index) { + for (int index = 0; index < (16 * 16 * 16); ++index) {
+ if (section.states.get(index).getLightEmission() <= 0) { + if (section.states.get(index).getLightEmission() <= 0) {
+ continue; + continue;
+ } + }
+
- if (((ChunkAccess) object1).getBlockState(blockposition).getLightEmission() != 0) {
- protochunk.addLight(blockposition);
+ // index = x | (z << 4) | (y << 8) + // index = x | (z << 4) | (y << 8)
+ protochunk.addLight(new BlockPos(offX | (index & 15), offY | (index >>> 8), offZ | ((index >>> 4) & 15))); + protochunk.addLight(new BlockPos(offX | (index & 15), offY | (index >>> 8), offZ | ((index >>> 4) & 15)));
} }

Datei anzeigen

@ -24,7 +24,7 @@ index be668387f65a633c6ac497fca632a4767a1bf3a2..e08f4e39db4ee3fed62e37364d17dcc5
+ // Paper start - optimise collisions + // Paper start - optimise collisions
+ static final UnsafeList<AABB> TEMP_COLLISION_LIST = new UnsafeList<>(1024); + static final UnsafeList<AABB> TEMP_COLLISION_LIST = new UnsafeList<>(1024);
+ static boolean tempCollisionListInUse; + static boolean tempCollisionListInUse;
+
+ public static UnsafeList<AABB> getTempCollisionList() { + public static UnsafeList<AABB> getTempCollisionList() {
+ if (!Bukkit.isPrimaryThread() || tempCollisionListInUse) { + if (!Bukkit.isPrimaryThread() || tempCollisionListInUse) {
+ return new UnsafeList<>(16); + return new UnsafeList<>(16);
@ -40,7 +40,7 @@ index be668387f65a633c6ac497fca632a4767a1bf3a2..e08f4e39db4ee3fed62e37364d17dcc5
+ ((UnsafeList)list).setSize(0); + ((UnsafeList)list).setSize(0);
+ tempCollisionListInUse = false; + tempCollisionListInUse = false;
+ } + }
+
+ static final UnsafeList<Entity> TEMP_GET_ENTITIES_LIST = new UnsafeList<>(1024); + static final UnsafeList<Entity> TEMP_GET_ENTITIES_LIST = new UnsafeList<>(1024);
+ static boolean tempGetEntitiesListInUse; + static boolean tempGetEntitiesListInUse;
+ +
@ -1277,29 +1277,26 @@ index 73d475788e23d371c79908c792d8d4dd0ba770ab..182e443e4cd114edeb0c0c6be5dda76d
- boolean flag1 = movement.y != vec3d1.y; - boolean flag1 = movement.y != vec3d1.y;
- boolean flag2 = movement.z != vec3d1.z; - boolean flag2 = movement.z != vec3d1.z;
- boolean flag3 = this.onGround || flag1 && movement.y < 0.0D; - boolean flag3 = this.onGround || flag1 && movement.y < 0.0D;
-
- if (this.maxUpStep() > 0.0F && flag3 && (flag || flag2)) {
- Vec3 vec3d2 = Entity.collideBoundingBox(this, new Vec3(movement.x, (double) this.maxUpStep(), movement.z), axisalignedbb, this.level, list);
- Vec3 vec3d3 = Entity.collideBoundingBox(this, new Vec3(0.0D, (double) this.maxUpStep(), 0.0D), axisalignedbb.expandTowards(movement.x, 0.0D, movement.z), this.level, list);
-
- if (vec3d3.y < (double) this.maxUpStep()) {
- Vec3 vec3d4 = Entity.collideBoundingBox(this, new Vec3(movement.x, 0.0D, movement.z), axisalignedbb.move(vec3d3), this.level, list).add(vec3d3);
-
- if (vec3d4.horizontalDistanceSqr() > vec3d2.horizontalDistanceSqr()) {
- vec3d2 = vec3d4;
+ // Paper start - optimise collisions + // Paper start - optimise collisions
+ // This is a copy of vanilla's except that it uses strictly AABB math + // This is a copy of vanilla's except that it uses strictly AABB math
+ if (movement.x == 0.0 && movement.y == 0.0 && movement.z == 0.0) { + if (movement.x == 0.0 && movement.y == 0.0 && movement.z == 0.0) {
+ return movement; + return movement;
+ } + }
+
- if (this.maxUpStep() > 0.0F && flag3 && (flag || flag2)) {
- Vec3 vec3d2 = Entity.collideBoundingBox(this, new Vec3(movement.x, (double) this.maxUpStep(), movement.z), axisalignedbb, this.level, list);
- Vec3 vec3d3 = Entity.collideBoundingBox(this, new Vec3(0.0D, (double) this.maxUpStep(), 0.0D), axisalignedbb.expandTowards(movement.x, 0.0D, movement.z), this.level, list);
+ final Level world = this.level; + final Level world = this.level;
+ final AABB currBoundingBox = this.getBoundingBox(); + final AABB currBoundingBox = this.getBoundingBox();
+
- if (vec3d3.y < (double) this.maxUpStep()) {
- Vec3 vec3d4 = Entity.collideBoundingBox(this, new Vec3(movement.x, 0.0D, movement.z), axisalignedbb.move(vec3d3), this.level, list).add(vec3d3);
+ if (io.papermc.paper.util.CollisionUtil.isEmpty(currBoundingBox)) { + if (io.papermc.paper.util.CollisionUtil.isEmpty(currBoundingBox)) {
+ return movement; + return movement;
+ } + }
+
- if (vec3d4.horizontalDistanceSqr() > vec3d2.horizontalDistanceSqr()) {
- vec3d2 = vec3d4;
+ final List<AABB> potentialCollisions = io.papermc.paper.util.CachedLists.getTempCollisionList(); + final List<AABB> potentialCollisions = io.papermc.paper.util.CachedLists.getTempCollisionList();
+ try { + try {
+ final double stepHeight = (double)this.maxUpStep(); + final double stepHeight = (double)this.maxUpStep();
@ -1326,15 +1323,16 @@ index 73d475788e23d371c79908c792d8d4dd0ba770ab..182e443e4cd114edeb0c0c6be5dda76d
- if (vec3d2.horizontalDistanceSqr() > vec3d1.horizontalDistanceSqr()) { - if (vec3d2.horizontalDistanceSqr() > vec3d1.horizontalDistanceSqr()) {
- return vec3d2.add(Entity.collideBoundingBox(this, new Vec3(0.0D, -vec3d2.y + movement.y, 0.0D), axisalignedbb.move(vec3d2), this.level, list)); - return vec3d2.add(Entity.collideBoundingBox(this, new Vec3(0.0D, -vec3d2.y + movement.y, 0.0D), axisalignedbb.move(vec3d2), this.level, list));
- }
- }
+ io.papermc.paper.util.CollisionUtil.getCollisions(world, this, collisionBox, potentialCollisions, false, this.level.paperConfig().chunks.preventMovingIntoUnloadedChunks, + io.papermc.paper.util.CollisionUtil.getCollisions(world, this, collisionBox, potentialCollisions, false, this.level.paperConfig().chunks.preventMovingIntoUnloadedChunks,
+ false, false, null, null); + false, false, null, null);
+
+ if (io.papermc.paper.util.CollisionUtil.isCollidingWithBorderEdge(world.getWorldBorder(), collisionBox)) {
+ io.papermc.paper.util.CollisionUtil.addBoxesToIfIntersects(world.getWorldBorder().getCollisionShape(), collisionBox, potentialCollisions);
}
- }
- return vec3d1; - return vec3d1;
+ if (io.papermc.paper.util.CollisionUtil.isCollidingWithBorderEdge(world.getWorldBorder(), collisionBox)) {
+ io.papermc.paper.util.CollisionUtil.addBoxesToIfIntersects(world.getWorldBorder().getCollisionShape(), collisionBox, potentialCollisions);
+ }
+
+ final Vec3 limitedMoveVector = io.papermc.paper.util.CollisionUtil.performCollisions(movement, currBoundingBox, potentialCollisions); + final Vec3 limitedMoveVector = io.papermc.paper.util.CollisionUtil.performCollisions(movement, currBoundingBox, potentialCollisions);
+ +
+ if (stepHeight > 0.0 + if (stepHeight > 0.0

Datei anzeigen

@ -6,7 +6,7 @@ Subject: [PATCH] Implement regenerateChunk
Co-authored-by: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Co-authored-by: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
index 5086fcbbd908f5759653ce44b8524345b479d2b8..e52008c574d1f8738c02848c98aee12dd5fb30ab 100644 index 8fcc553b6f1bf62fb9febb46402940039c37606a..eeeaaf379c7273c276e1faac5d6c55730d5b51bc 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -138,6 +138,7 @@ import org.bukkit.util.Vector; @@ -138,6 +138,7 @@ import org.bukkit.util.Vector;
@ -25,10 +25,6 @@ index 5086fcbbd908f5759653ce44b8524345b479d2b8..e52008c574d1f8738c02848c98aee12d
- /* - /*
- if (!unloadChunk0(x, z, false)) { - if (!unloadChunk0(x, z, false)) {
- return false; - return false;
- }
-
- final long chunkKey = ChunkCoordIntPair.pair(x, z);
- world.getChunkProvider().unloadQueue.remove(chunkKey);
+ // Paper start - implement regenerateChunk method + // Paper start - implement regenerateChunk method
+ final ServerLevel serverLevel = this.world; + final ServerLevel serverLevel = this.world;
+ final net.minecraft.server.level.ServerChunkCache serverChunkCache = serverLevel.getChunkSource(); + final net.minecraft.server.level.ServerChunkCache serverChunkCache = serverLevel.getChunkSource();
@ -37,8 +33,10 @@ index 5086fcbbd908f5759653ce44b8524345b479d2b8..e52008c574d1f8738c02848c98aee12d
+ for (final BlockPos blockPos : BlockPos.betweenClosed(chunkPos.getMinBlockX(), serverLevel.getMinBuildHeight(), chunkPos.getMinBlockZ(), chunkPos.getMaxBlockX(), serverLevel.getMaxBuildHeight() - 1, chunkPos.getMaxBlockZ())) { + for (final BlockPos blockPos : BlockPos.betweenClosed(chunkPos.getMinBlockX(), serverLevel.getMinBuildHeight(), chunkPos.getMinBlockZ(), chunkPos.getMaxBlockX(), serverLevel.getMaxBuildHeight() - 1, chunkPos.getMaxBlockZ())) {
+ levelChunk.removeBlockEntity(blockPos); + levelChunk.removeBlockEntity(blockPos);
+ serverLevel.setBlock(blockPos, net.minecraft.world.level.block.Blocks.AIR.defaultBlockState(), 16); + serverLevel.setBlock(blockPos, net.minecraft.world.level.block.Blocks.AIR.defaultBlockState(), 16);
+ } }
+
- final long chunkKey = ChunkCoordIntPair.pair(x, z);
- world.getChunkProvider().unloadQueue.remove(chunkKey);
+ for (final ChunkStatus chunkStatus : REGEN_CHUNK_STATUSES) { + for (final ChunkStatus chunkStatus : REGEN_CHUNK_STATUSES) {
+ final List<ChunkAccess> list = new ArrayList<>(); + final List<ChunkAccess> list = new ArrayList<>();
+ final int range = Math.max(1, chunkStatus.getRange()); + final int range = Math.max(1, chunkStatus.getRange());

Datei anzeigen

@ -55,14 +55,14 @@ index 7df1eebce5b62214943e55314e9ec98f056fa330..2aee8aacd50431c18ff28af678348ec2
+ if (flagSet.contains(io.papermc.paper.entity.TeleportFlag.EntityState.RETAIN_PASSENGERS) && this.entity.isVehicle() && location.getWorld() != this.getWorld()) { + if (flagSet.contains(io.papermc.paper.entity.TeleportFlag.EntityState.RETAIN_PASSENGERS) && this.entity.isVehicle() && location.getWorld() != this.getWorld()) {
+ return false; + return false;
+ } + }
+
- if (this.entity.isVehicle() || this.entity.isRemoved()) {
+ // Don't allow to teleport between worlds if remaining on vehicle + // Don't allow to teleport between worlds if remaining on vehicle
+ if (!dismount && this.entity.isPassenger() && location.getWorld() != this.getWorld()) { + if (!dismount && this.entity.isPassenger() && location.getWorld() != this.getWorld()) {
+ return false; + return false;
+ } + }
+ // Paper end + // Paper end
+
- if (this.entity.isVehicle() || this.entity.isRemoved()) {
+ if ((!ignorePassengers && this.entity.isVehicle()) || this.entity.isRemoved()) { // Paper - Teleport passenger API + if ((!ignorePassengers && this.entity.isVehicle()) || this.entity.isRemoved()) { // Paper - Teleport passenger API
return false; return false;
} }
@ -74,7 +74,7 @@ index 7df1eebce5b62214943e55314e9ec98f056fa330..2aee8aacd50431c18ff28af678348ec2
// Let the server handle cross world teleports // Let the server handle cross world teleports
if (location.getWorld() != null && !location.getWorld().equals(this.getWorld())) { if (location.getWorld() != null && !location.getWorld().equals(this.getWorld())) {
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 8e16fc9263cfd43bb85d368b0a6f36624a6ebf91..0a32183038420823811d8a5ae5eadeef73304296 100644 index 89d9c6c1e1b9cee8a20a657ab47dd5620e7f395f..ad7d009188f2c54926cdee589c7d92e7e6a967f4 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -1231,13 +1231,100 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -1231,13 +1231,100 @@ public class CraftPlayer extends CraftHumanEntity implements Player {

Datei anzeigen

@ -6,7 +6,7 @@ Subject: [PATCH] Stop large look changes from crashing the server
Co-authored-by: Jaren Knodel <Jaren@Knodel.com> Co-authored-by: Jaren Knodel <Jaren@Knodel.com>
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
index 4e27d0e537a0d813ab81d3bc6524ad038047a0a1..590a14cd045baa892119505df1063b18c6f1fd71 100644 index 6b1c5b51693b8ae9ece498d4711b4493d0f5543a..80970c877b9e729fc88451745a490f0b80a7c1b6 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -2996,37 +2996,15 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -2996,37 +2996,15 @@ public abstract class LivingEntity extends Entity implements Attackable {
@ -16,17 +16,18 @@ index 4e27d0e537a0d813ab81d3bc6524ad038047a0a1..590a14cd045baa892119505df1063b18
- while (this.getYRot() - this.yRotO < -180.0F) { - while (this.getYRot() - this.yRotO < -180.0F) {
- this.yRotO -= 360.0F; - this.yRotO -= 360.0F;
- } - }
- + // Paper start - stop large pitch and yaw changes from crashing the server
+ this.yRotO += Math.round((this.getYRot() - this.yRotO) / 360.0F) * 360.0F;
- while (this.getYRot() - this.yRotO >= 180.0F) { - while (this.getYRot() - this.yRotO >= 180.0F) {
- this.yRotO += 360.0F; - this.yRotO += 360.0F;
- } - }
+ // Paper start - stop large pitch and yaw changes from crashing the server + this.yBodyRotO += Math.round((this.yBodyRot - this.yBodyRotO) / 360.0F) * 360.0F;
+ this.yRotO += Math.round((this.getYRot() - this.yRotO) / 360.0F) * 360.0F;
- while (this.yBodyRot - this.yBodyRotO < -180.0F) { - while (this.yBodyRot - this.yBodyRotO < -180.0F) {
- this.yBodyRotO -= 360.0F; - this.yBodyRotO -= 360.0F;
- } - }
+ this.yBodyRotO += Math.round((this.yBodyRot - this.yBodyRotO) / 360.0F) * 360.0F; + this.xRotO += Math.round((this.getXRot() - this.xRotO) / 360.0F) * 360.0F;
- while (this.yBodyRot - this.yBodyRotO >= 180.0F) { - while (this.yBodyRot - this.yBodyRotO >= 180.0F) {
- this.yBodyRotO += 360.0F; - this.yBodyRotO += 360.0F;
@ -35,8 +36,7 @@ index 4e27d0e537a0d813ab81d3bc6524ad038047a0a1..590a14cd045baa892119505df1063b18
- while (this.getXRot() - this.xRotO < -180.0F) { - while (this.getXRot() - this.xRotO < -180.0F) {
- this.xRotO -= 360.0F; - this.xRotO -= 360.0F;
- } - }
+ this.xRotO += Math.round((this.getXRot() - this.xRotO) / 360.0F) * 360.0F; -
- while (this.getXRot() - this.xRotO >= 180.0F) { - while (this.getXRot() - this.xRotO >= 180.0F) {
- this.xRotO += 360.0F; - this.xRotO += 360.0F;
- } - }

Datei anzeigen

@ -13,7 +13,7 @@ Subject: [PATCH] Optimize Hoppers
* Remove Streams from Item Suck In and restore restore 1.12 AABB checks which is simpler and no voxel allocations (was doing TWO Item Suck ins) * Remove Streams from Item Suck In and restore restore 1.12 AABB checks which is simpler and no voxel allocations (was doing TWO Item Suck ins)
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 081871412e92ce909ad9c51a8d18ede53596c049..e67c4a7aaa11f5c67f926f92e0a174af526c2ec3 100644 index 2e2cc6647a4c5acc8495b1c7ad6df3a49c94ac6d..4450d825a5474da211f0e83f845d8c7129fa08aa 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java --- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -1524,6 +1524,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa @@ -1524,6 +1524,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@ -281,10 +281,18 @@ index 789e5458f4a137694563a22612455506807de51b..cba114f554644a37339c93026630c66c
- if (!iinventory.getItem(i).isEmpty()) { - if (!iinventory.getItem(i).isEmpty()) {
- ItemStack itemstack = iinventory.getItem(i).copy(); - ItemStack itemstack = iinventory.getItem(i).copy();
- // ItemStack itemstack1 = addItem(iinventory, iinventory1, iinventory.removeItem(i, 1), enumdirection); - // ItemStack itemstack1 = addItem(iinventory, iinventory1, iinventory.removeItem(i, 1), enumdirection);
- + // Paper start - replace logic; MAKE SURE TO CHECK FOR DIFFS ON UPDATES
+ return hopperPush(world, iinventory1, enumdirection, hopper);
+ // for (int i = 0; i < iinventory.getContainerSize(); ++i) {
+ // if (!iinventory.getItem(i).isEmpty()) {
+ // ItemStack itemstack = iinventory.getItem(i).copy();
+ // // ItemStack itemstack1 = addItem(iinventory, iinventory1, iinventory.removeItem(i, 1), enumdirection);
- // CraftBukkit start - Call event when pushing items into other inventories - // CraftBukkit start - Call event when pushing items into other inventories
- CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.removeItem(i, world.spigotConfig.hopperAmount)); // Spigot - CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.removeItem(i, world.spigotConfig.hopperAmount)); // Spigot
- + // // CraftBukkit start - Call event when pushing items into other inventories
+ // CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.removeItem(i, world.spigotConfig.hopperAmount)); // Spigot
- Inventory destinationInventory; - Inventory destinationInventory;
- // Have to special case large chests as they work oddly - // Have to special case large chests as they work oddly
- if (iinventory1 instanceof CompoundContainer) { - if (iinventory1 instanceof CompoundContainer) {
@ -294,26 +302,6 @@ index 789e5458f4a137694563a22612455506807de51b..cba114f554644a37339c93026630c66c
- } else { - } else {
- destinationInventory = new CraftInventory(iinventory); - destinationInventory = new CraftInventory(iinventory);
- } - }
-
- InventoryMoveItemEvent event = new InventoryMoveItemEvent(iinventory.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true);
- world.getCraftServer().getPluginManager().callEvent(event);
- if (event.isCancelled()) {
- hopper.setItem(i, itemstack);
- hopper.setCooldown(world.spigotConfig.hopperTransfer); // Spigot
- return false;
- }
- int origCount = event.getItem().getAmount(); // Spigot
- ItemStack itemstack1 = HopperBlockEntity.addItem(iinventory, iinventory1, CraftItemStack.asNMSCopy(event.getItem()), enumdirection);
+ // Paper start - replace logic; MAKE SURE TO CHECK FOR DIFFS ON UPDATES
+ return hopperPush(world, iinventory1, enumdirection, hopper);
+ // for (int i = 0; i < iinventory.getContainerSize(); ++i) {
+ // if (!iinventory.getItem(i).isEmpty()) {
+ // ItemStack itemstack = iinventory.getItem(i).copy();
+ // // ItemStack itemstack1 = addItem(iinventory, iinventory1, iinventory.removeItem(i, 1), enumdirection);
+
+ // // CraftBukkit start - Call event when pushing items into other inventories
+ // CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.removeItem(i, world.spigotConfig.hopperAmount)); // Spigot
+
+ // Inventory destinationInventory; + // Inventory destinationInventory;
+ // // Have to special case large chests as they work oddly + // // Have to special case large chests as they work oddly
+ // if (iinventory1 instanceof CompoundContainer) { + // if (iinventory1 instanceof CompoundContainer) {
@ -323,7 +311,16 @@ index 789e5458f4a137694563a22612455506807de51b..cba114f554644a37339c93026630c66c
+ // } else { + // } else {
+ // destinationInventory = new CraftInventory(iinventory); + // destinationInventory = new CraftInventory(iinventory);
+ // } + // }
+
- InventoryMoveItemEvent event = new InventoryMoveItemEvent(iinventory.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true);
- world.getCraftServer().getPluginManager().callEvent(event);
- if (event.isCancelled()) {
- hopper.setItem(i, itemstack);
- hopper.setCooldown(world.spigotConfig.hopperTransfer); // Spigot
- return false;
- }
- int origCount = event.getItem().getAmount(); // Spigot
- ItemStack itemstack1 = HopperBlockEntity.addItem(iinventory, iinventory1, CraftItemStack.asNMSCopy(event.getItem()), enumdirection);
+ // InventoryMoveItemEvent event = new InventoryMoveItemEvent(iinventory.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true); + // InventoryMoveItemEvent event = new InventoryMoveItemEvent(iinventory.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true);
+ // world.getCraftServer().getPluginManager().callEvent(event); + // world.getCraftServer().getPluginManager().callEvent(event);
+ // if (event.isCancelled()) { + // if (event.isCancelled()) {
@ -411,7 +408,14 @@ index 789e5458f4a137694563a22612455506807de51b..cba114f554644a37339c93026630c66c
- // ItemStack itemstack2 = addItem(iinventory, ihopper, iinventory.removeItem(i, 1), (EnumDirection) null); - // ItemStack itemstack2 = addItem(iinventory, ihopper, iinventory.removeItem(i, 1), (EnumDirection) null);
- // CraftBukkit start - Call event on collection of items from inventories into the hopper - // CraftBukkit start - Call event on collection of items from inventories into the hopper
- CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.removeItem(i, world.spigotConfig.hopperAmount)); // Spigot - CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.removeItem(i, world.spigotConfig.hopperAmount)); // Spigot
- + // Paper start - replace pull logic; MAKE SURE TO CHECK FOR DIFFS WHEN UPDATING
+ if (!itemstack.isEmpty() && HopperBlockEntity.canTakeItemFromContainer(ihopper, iinventory, itemstack, i, enumdirection)) { // If this logic changes, update above. this is left unused incase reflective plugins
+ return hopperPull(world, ihopper, iinventory, itemstack, i);
+ // ItemStack itemstack1 = itemstack.copy();
+ // // ItemStack itemstack2 = addItem(iinventory, ihopper, iinventory.removeItem(i, 1), (EnumDirection) null);
+ // // CraftBukkit start - Call event on collection of items from inventories into the hopper
+ // CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.removeItem(i, world.spigotConfig.hopperAmount)); // Spigot
- Inventory sourceInventory; - Inventory sourceInventory;
- // Have to special case large chests as they work oddly - // Have to special case large chests as they work oddly
- if (iinventory instanceof CompoundContainer) { - if (iinventory instanceof CompoundContainer) {
@ -421,38 +425,6 @@ index 789e5458f4a137694563a22612455506807de51b..cba114f554644a37339c93026630c66c
- } else { - } else {
- sourceInventory = new CraftInventory(iinventory); - sourceInventory = new CraftInventory(iinventory);
- } - }
-
- InventoryMoveItemEvent event = new InventoryMoveItemEvent(sourceInventory, oitemstack.clone(), ihopper.getOwner().getInventory(), false);
-
- Bukkit.getServer().getPluginManager().callEvent(event);
- if (event.isCancelled()) {
- iinventory.setItem(i, itemstack1);
-
- if (ihopper instanceof HopperBlockEntity) {
- ((HopperBlockEntity) ihopper).setCooldown(world.spigotConfig.hopperTransfer); // Spigot
- }
-
- return false;
- }
- int origCount = event.getItem().getAmount(); // Spigot
- ItemStack itemstack2 = HopperBlockEntity.addItem(iinventory, ihopper, CraftItemStack.asNMSCopy(event.getItem()), null);
- // CraftBukkit end
-
- if (itemstack2.isEmpty()) {
- iinventory.setChanged();
- return true;
- }
-
- itemstack1.shrink(origCount - itemstack2.getCount()); // Spigot
- iinventory.setItem(i, itemstack1);
+ // Paper start - replace pull logic; MAKE SURE TO CHECK FOR DIFFS WHEN UPDATING
+ if (!itemstack.isEmpty() && HopperBlockEntity.canTakeItemFromContainer(ihopper, iinventory, itemstack, i, enumdirection)) { // If this logic changes, update above. this is left unused incase reflective plugins
+ return hopperPull(world, ihopper, iinventory, itemstack, i);
+ // ItemStack itemstack1 = itemstack.copy();
+ // // ItemStack itemstack2 = addItem(iinventory, ihopper, iinventory.removeItem(i, 1), (EnumDirection) null);
+ // // CraftBukkit start - Call event on collection of items from inventories into the hopper
+ // CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.removeItem(i, world.spigotConfig.hopperAmount)); // Spigot
+
+ // Inventory sourceInventory; + // Inventory sourceInventory;
+ // // Have to special case large chests as they work oddly + // // Have to special case large chests as they work oddly
+ // if (iinventory instanceof CompoundContainer) { + // if (iinventory instanceof CompoundContainer) {
@ -462,28 +434,46 @@ index 789e5458f4a137694563a22612455506807de51b..cba114f554644a37339c93026630c66c
+ // } else { + // } else {
+ // sourceInventory = new CraftInventory(iinventory); + // sourceInventory = new CraftInventory(iinventory);
+ // } + // }
+
- InventoryMoveItemEvent event = new InventoryMoveItemEvent(sourceInventory, oitemstack.clone(), ihopper.getOwner().getInventory(), false);
+ // InventoryMoveItemEvent event = new InventoryMoveItemEvent(sourceInventory, oitemstack.clone(), ihopper.getOwner().getInventory(), false); + // InventoryMoveItemEvent event = new InventoryMoveItemEvent(sourceInventory, oitemstack.clone(), ihopper.getOwner().getInventory(), false);
+
- Bukkit.getServer().getPluginManager().callEvent(event);
- if (event.isCancelled()) {
- iinventory.setItem(i, itemstack1);
+ // Bukkit.getServer().getPluginManager().callEvent(event); + // Bukkit.getServer().getPluginManager().callEvent(event);
+ // if (event.isCancelled()) { + // if (event.isCancelled()) {
+ // iinventory.setItem(i, itemstack1); + // iinventory.setItem(i, itemstack1);
+
- if (ihopper instanceof HopperBlockEntity) {
- ((HopperBlockEntity) ihopper).setCooldown(world.spigotConfig.hopperTransfer); // Spigot
- }
+ // if (ihopper instanceof HopperBlockEntity) { + // if (ihopper instanceof HopperBlockEntity) {
+ // ((HopperBlockEntity) ihopper).setCooldown(world.spigotConfig.hopperTransfer); // Spigot + // ((HopperBlockEntity) ihopper).setCooldown(world.spigotConfig.hopperTransfer); // Spigot
+ // } + // }
+
- return false;
- }
- int origCount = event.getItem().getAmount(); // Spigot
- ItemStack itemstack2 = HopperBlockEntity.addItem(iinventory, ihopper, CraftItemStack.asNMSCopy(event.getItem()), null);
- // CraftBukkit end
+ // return false; + // return false;
+ // } + // }
+ // int origCount = event.getItem().getAmount(); // Spigot + // int origCount = event.getItem().getAmount(); // Spigot
+ // ItemStack itemstack2 = HopperBlockEntity.addItem(iinventory, ihopper, CraftItemStack.asNMSCopy(event.getItem()), null); + // ItemStack itemstack2 = HopperBlockEntity.addItem(iinventory, ihopper, CraftItemStack.asNMSCopy(event.getItem()), null);
+ // // CraftBukkit end + // // CraftBukkit end
+
- if (itemstack2.isEmpty()) {
- iinventory.setChanged();
- return true;
- }
+ // if (itemstack2.isEmpty()) { + // if (itemstack2.isEmpty()) {
+ // iinventory.setChanged(); + // iinventory.setChanged();
+ // return true; + // return true;
+ // } + // }
+
- itemstack1.shrink(origCount - itemstack2.getCount()); // Spigot
- iinventory.setItem(i, itemstack1);
+ // itemstack1.shrink(origCount - itemstack2.getCount()); // Spigot + // itemstack1.shrink(origCount - itemstack2.getCount()); // Spigot
+ // iinventory.setItem(i, itemstack1); + // iinventory.setItem(i, itemstack1);
+ // Paper end + // Paper end