work
This commit is contained in:
@@ -17,5 +17,5 @@ purpurBranch = ver/1.20.6
|
|||||||
pufferfishBranch = ver/1.20
|
pufferfishBranch = ver/1.20
|
||||||
usePufferfish = false
|
usePufferfish = false
|
||||||
|
|
||||||
paperCommit = 25e44bc63b467c19fe63ad6edfd8981d127f7f44
|
paperCommit = 4ea67abd46ecbfb501ed2e0f13d494635972bfa0
|
||||||
purpurCommit = 6b1ee98f813ee19f8046b3c528feeee61840a35b
|
purpurCommit = b02dc7ac072ffbffa0e47c78b20cc51e752c68a6
|
||||||
|
|||||||
@@ -1,527 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Kevin Raneri <kevin.raneri@gmail.com>
|
|
||||||
Date: Tue, 9 Nov 2021 14:01:56 -0500
|
|
||||||
Subject: [PATCH] Pufferfish API Changes
|
|
||||||
|
|
||||||
Pufferfish
|
|
||||||
Copyright (C) 2024 Pufferfish Studios LLC
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
diff --git a/build.gradle.kts b/build.gradle.kts
|
|
||||||
index 04853c43b99951bf0d4c96ef73724625bdaf018f..9164120d299d062c62529a7ef74eac0ded367993 100644
|
|
||||||
--- a/build.gradle.kts
|
|
||||||
+++ b/build.gradle.kts
|
|
||||||
@@ -51,6 +51,7 @@ dependencies {
|
|
||||||
apiAndDocs("net.kyori:adventure-text-logger-slf4j")
|
|
||||||
api("org.apache.logging.log4j:log4j-api:$log4jVersion")
|
|
||||||
api("org.slf4j:slf4j-api:$slf4jVersion")
|
|
||||||
+ api("io.sentry:sentry:5.4.0") // Pufferfish
|
|
||||||
|
|
||||||
implementation("org.ow2.asm:asm:9.7")
|
|
||||||
implementation("org.ow2.asm:asm-commons:9.7")
|
|
||||||
@@ -109,6 +110,13 @@ val generateApiVersioningFile by tasks.registering {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+// Pufferfish Start
|
|
||||||
+tasks.withType<JavaCompile> {
|
|
||||||
+ val compilerArgs = options.compilerArgs
|
|
||||||
+ compilerArgs.add("--add-modules=jdk.incubator.vector")
|
|
||||||
+}
|
|
||||||
+// Pufferfish End
|
|
||||||
+
|
|
||||||
tasks.jar {
|
|
||||||
from(generateApiVersioningFile.map { it.outputs.files.singleFile }) {
|
|
||||||
into("META-INF/maven/${project.group}/${project.name}")
|
|
||||||
diff --git a/src/main/java/gg/pufferfish/pufferfish/sentry/SentryContext.java b/src/main/java/gg/pufferfish/pufferfish/sentry/SentryContext.java
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000000000000000000000000000000000..10310fdd53de28efb8a8250f6d3b0c8eb08fb68a
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/src/main/java/gg/pufferfish/pufferfish/sentry/SentryContext.java
|
|
||||||
@@ -0,0 +1,161 @@
|
|
||||||
+package gg.pufferfish.pufferfish.sentry;
|
|
||||||
+
|
|
||||||
+import com.google.gson.Gson;
|
|
||||||
+import java.lang.reflect.Field;
|
|
||||||
+import java.lang.reflect.Modifier;
|
|
||||||
+import java.util.Map;
|
|
||||||
+import java.util.TreeMap;
|
|
||||||
+import org.apache.logging.log4j.ThreadContext;
|
|
||||||
+import org.bukkit.command.Command;
|
|
||||||
+import org.bukkit.command.CommandSender;
|
|
||||||
+import org.bukkit.entity.Player;
|
|
||||||
+import org.bukkit.event.Event;
|
|
||||||
+import org.bukkit.event.player.PlayerEvent;
|
|
||||||
+import org.bukkit.plugin.Plugin;
|
|
||||||
+import org.bukkit.plugin.RegisteredListener;
|
|
||||||
+import org.jetbrains.annotations.Nullable;
|
|
||||||
+
|
|
||||||
+public class SentryContext {
|
|
||||||
+
|
|
||||||
+ private static final Gson GSON = new Gson();
|
|
||||||
+
|
|
||||||
+ public static void setPluginContext(@Nullable Plugin plugin) {
|
|
||||||
+ if (plugin != null) {
|
|
||||||
+ ThreadContext.put("pufferfishsentry_pluginname", plugin.getName());
|
|
||||||
+ ThreadContext.put("pufferfishsentry_pluginversion", plugin.getDescription().getVersion());
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public static void removePluginContext() {
|
|
||||||
+ ThreadContext.remove("pufferfishsentry_pluginname");
|
|
||||||
+ ThreadContext.remove("pufferfishsentry_pluginversion");
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public static void setSenderContext(@Nullable CommandSender sender) {
|
|
||||||
+ if (sender != null) {
|
|
||||||
+ ThreadContext.put("pufferfishsentry_playername", sender.getName());
|
|
||||||
+ if (sender instanceof Player player) {
|
|
||||||
+ ThreadContext.put("pufferfishsentry_playerid", player.getUniqueId().toString());
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public static void removeSenderContext() {
|
|
||||||
+ ThreadContext.remove("pufferfishsentry_playername");
|
|
||||||
+ ThreadContext.remove("pufferfishsentry_playerid");
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public static void setEventContext(Event event, RegisteredListener registration) {
|
|
||||||
+ setPluginContext(registration.getPlugin());
|
|
||||||
+
|
|
||||||
+ try {
|
|
||||||
+ // Find the player that was involved with this event
|
|
||||||
+ Player player = null;
|
|
||||||
+ if (event instanceof PlayerEvent) {
|
|
||||||
+ player = ((PlayerEvent) event).getPlayer();
|
|
||||||
+ } else {
|
|
||||||
+ Class<? extends Event> eventClass = event.getClass();
|
|
||||||
+
|
|
||||||
+ Field playerField = null;
|
|
||||||
+
|
|
||||||
+ for (Field field : eventClass.getDeclaredFields()) {
|
|
||||||
+ if (field.getType().equals(Player.class)) {
|
|
||||||
+ playerField = field;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (playerField != null) {
|
|
||||||
+ playerField.setAccessible(true);
|
|
||||||
+ player = (Player) playerField.get(event);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (player != null) {
|
|
||||||
+ setSenderContext(player);
|
|
||||||
+ }
|
|
||||||
+ } catch (Exception e) {} // We can't really safely log exceptions.
|
|
||||||
+
|
|
||||||
+ ThreadContext.put("pufferfishsentry_eventdata", GSON.toJson(serializeFields(event)));
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public static void removeEventContext() {
|
|
||||||
+ removePluginContext();
|
|
||||||
+ removeSenderContext();
|
|
||||||
+ ThreadContext.remove("pufferfishsentry_eventdata");
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ private static Map<String, String> serializeFields(Object object) {
|
|
||||||
+ Map<String, String> fields = new TreeMap<>();
|
|
||||||
+ fields.put("_class", object.getClass().getName());
|
|
||||||
+ for (Field declaredField : object.getClass().getDeclaredFields()) {
|
|
||||||
+ try {
|
|
||||||
+ if (Modifier.isStatic(declaredField.getModifiers())) {
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ String fieldName = declaredField.getName();
|
|
||||||
+ if (fieldName.equals("handlers")) {
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+ declaredField.setAccessible(true);
|
|
||||||
+ Object value = declaredField.get(object);
|
|
||||||
+ if (value != null) {
|
|
||||||
+ fields.put(fieldName, value.toString());
|
|
||||||
+ } else {
|
|
||||||
+ fields.put(fieldName, "<null>");
|
|
||||||
+ }
|
|
||||||
+ } catch (Exception e) {} // We can't really safely log exceptions.
|
|
||||||
+ }
|
|
||||||
+ return fields;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public static class State {
|
|
||||||
+
|
|
||||||
+ private Plugin plugin;
|
|
||||||
+ private Command command;
|
|
||||||
+ private String commandLine;
|
|
||||||
+ private Event event;
|
|
||||||
+ private RegisteredListener registeredListener;
|
|
||||||
+
|
|
||||||
+ public Plugin getPlugin() {
|
|
||||||
+ return plugin;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public void setPlugin(Plugin plugin) {
|
|
||||||
+ this.plugin = plugin;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public Command getCommand() {
|
|
||||||
+ return command;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public void setCommand(Command command) {
|
|
||||||
+ this.command = command;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public String getCommandLine() {
|
|
||||||
+ return commandLine;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public void setCommandLine(String commandLine) {
|
|
||||||
+ this.commandLine = commandLine;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public Event getEvent() {
|
|
||||||
+ return event;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public void setEvent(Event event) {
|
|
||||||
+ this.event = event;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public RegisteredListener getRegisteredListener() {
|
|
||||||
+ return registeredListener;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public void setRegisteredListener(RegisteredListener registeredListener) {
|
|
||||||
+ this.registeredListener = registeredListener;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
diff --git a/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000000000000000000000000000000000..ab5fea0b03224bf249352ce340e94704ff713345
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java
|
|
||||||
@@ -0,0 +1,40 @@
|
|
||||||
+package gg.pufferfish.pufferfish.simd;
|
|
||||||
+
|
|
||||||
+import java.util.logging.Level;
|
|
||||||
+import java.util.logging.Logger;
|
|
||||||
+import jdk.incubator.vector.FloatVector;
|
|
||||||
+import jdk.incubator.vector.IntVector;
|
|
||||||
+import jdk.incubator.vector.VectorSpecies;
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * Basically, java is annoying and we have to push this out to its own class.
|
|
||||||
+ */
|
|
||||||
+@Deprecated
|
|
||||||
+public class SIMDChecker {
|
|
||||||
+
|
|
||||||
+ @Deprecated
|
|
||||||
+ public static boolean canEnable(Logger logger) {
|
|
||||||
+ try {
|
|
||||||
+ if (SIMDDetection.getJavaVersion() != 17 && SIMDDetection.getJavaVersion() != 18 && SIMDDetection.getJavaVersion() != 19) {
|
|
||||||
+ return false;
|
|
||||||
+ } else {
|
|
||||||
+ SIMDDetection.testRun = true;
|
|
||||||
+
|
|
||||||
+ VectorSpecies<Integer> ISPEC = IntVector.SPECIES_PREFERRED;
|
|
||||||
+ VectorSpecies<Float> FSPEC = FloatVector.SPECIES_PREFERRED;
|
|
||||||
+
|
|
||||||
+ logger.log(Level.INFO, "Max SIMD vector size on this system is " + ISPEC.vectorBitSize() + " bits (int)");
|
|
||||||
+ logger.log(Level.INFO, "Max SIMD vector size on this system is " + FSPEC.vectorBitSize() + " bits (float)");
|
|
||||||
+
|
|
||||||
+ if (ISPEC.elementSize() < 2 || FSPEC.elementSize() < 2) {
|
|
||||||
+ logger.log(Level.WARNING, "SIMD is not properly supported on this system!");
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return true;
|
|
||||||
+ }
|
|
||||||
+ } catch (NoClassDefFoundError | Exception ignored) {} // Basically, we don't do anything. This lets us detect if it's not functional and disable it.
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+}
|
|
||||||
diff --git a/src/main/java/gg/pufferfish/pufferfish/simd/SIMDDetection.java b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDDetection.java
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000000000000000000000000000000000..a84889d3e9cfc4d7ab5f867820a6484c6070711b
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDDetection.java
|
|
||||||
@@ -0,0 +1,35 @@
|
|
||||||
+package gg.pufferfish.pufferfish.simd;
|
|
||||||
+
|
|
||||||
+import java.util.logging.Logger;
|
|
||||||
+
|
|
||||||
+@Deprecated
|
|
||||||
+public class SIMDDetection {
|
|
||||||
+
|
|
||||||
+ public static boolean isEnabled = false;
|
|
||||||
+ public static boolean versionLimited = false;
|
|
||||||
+ public static boolean testRun = false;
|
|
||||||
+
|
|
||||||
+ @Deprecated
|
|
||||||
+ public static boolean canEnable(Logger logger) {
|
|
||||||
+ try {
|
|
||||||
+ return SIMDChecker.canEnable(logger);
|
|
||||||
+ } catch (NoClassDefFoundError | Exception ignored) {
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ @Deprecated
|
|
||||||
+ public static int getJavaVersion() {
|
|
||||||
+ // https://stackoverflow.com/a/2591122
|
|
||||||
+ String version = System.getProperty("java.version");
|
|
||||||
+ if(version.startsWith("1.")) {
|
|
||||||
+ version = version.substring(2, 3);
|
|
||||||
+ } else {
|
|
||||||
+ int dot = version.indexOf(".");
|
|
||||||
+ if(dot != -1) { version = version.substring(0, dot); }
|
|
||||||
+ }
|
|
||||||
+ version = version.split("-")[0]; // Azul is stupid
|
|
||||||
+ return Integer.parseInt(version);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+}
|
|
||||||
diff --git a/src/main/java/gg/pufferfish/pufferfish/simd/VectorMapPalette.java b/src/main/java/gg/pufferfish/pufferfish/simd/VectorMapPalette.java
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000000000000000000000000000000000..ae2464920c9412ac90b819a540ee58be0741465f
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/src/main/java/gg/pufferfish/pufferfish/simd/VectorMapPalette.java
|
|
||||||
@@ -0,0 +1,83 @@
|
|
||||||
+package gg.pufferfish.pufferfish.simd;
|
|
||||||
+
|
|
||||||
+import java.awt.Color;
|
|
||||||
+import jdk.incubator.vector.FloatVector;
|
|
||||||
+import jdk.incubator.vector.IntVector;
|
|
||||||
+import jdk.incubator.vector.VectorMask;
|
|
||||||
+import jdk.incubator.vector.VectorSpecies;
|
|
||||||
+import org.bukkit.map.MapPalette;
|
|
||||||
+
|
|
||||||
+@Deprecated
|
|
||||||
+public class VectorMapPalette {
|
|
||||||
+
|
|
||||||
+ private static final VectorSpecies<Integer> I_SPEC = IntVector.SPECIES_PREFERRED;
|
|
||||||
+ private static final VectorSpecies<Float> F_SPEC = FloatVector.SPECIES_PREFERRED;
|
|
||||||
+
|
|
||||||
+ @Deprecated
|
|
||||||
+ public static void matchColorVectorized(int[] in, byte[] out) {
|
|
||||||
+ int speciesLength = I_SPEC.length();
|
|
||||||
+ int i;
|
|
||||||
+ for (i = 0; i < in.length - speciesLength; i += speciesLength) {
|
|
||||||
+ float[] redsArr = new float[speciesLength];
|
|
||||||
+ float[] bluesArr = new float[speciesLength];
|
|
||||||
+ float[] greensArr = new float[speciesLength];
|
|
||||||
+ int[] alphasArr = new int[speciesLength];
|
|
||||||
+
|
|
||||||
+ for (int j = 0; j < speciesLength; j++) {
|
|
||||||
+ alphasArr[j] = (in[i + j] >> 24) & 0xFF;
|
|
||||||
+ redsArr[j] = (in[i + j] >> 16) & 0xFF;
|
|
||||||
+ greensArr[j] = (in[i + j] >> 8) & 0xFF;
|
|
||||||
+ bluesArr[j] = (in[i + j] >> 0) & 0xFF;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ IntVector alphas = IntVector.fromArray(I_SPEC, alphasArr, 0);
|
|
||||||
+ FloatVector reds = FloatVector.fromArray(F_SPEC, redsArr, 0);
|
|
||||||
+ FloatVector greens = FloatVector.fromArray(F_SPEC, greensArr, 0);
|
|
||||||
+ FloatVector blues = FloatVector.fromArray(F_SPEC, bluesArr, 0);
|
|
||||||
+ IntVector resultIndex = IntVector.zero(I_SPEC);
|
|
||||||
+ VectorMask<Integer> modificationMask = VectorMask.fromLong(I_SPEC, 0xffffffff);
|
|
||||||
+
|
|
||||||
+ modificationMask = modificationMask.and(alphas.lt(128).not());
|
|
||||||
+ FloatVector bestDistances = FloatVector.broadcast(F_SPEC, Float.MAX_VALUE);
|
|
||||||
+
|
|
||||||
+ for (int c = 4; c < MapPalette.colors.length; c++) {
|
|
||||||
+ // We're using 32-bit floats here because it's 2x faster and nobody will know the difference.
|
|
||||||
+ // For correctness, the original algorithm uses 64-bit floats instead. Completely unnecessary.
|
|
||||||
+ FloatVector compReds = FloatVector.broadcast(F_SPEC, MapPalette.colors[c].getRed());
|
|
||||||
+ FloatVector compGreens = FloatVector.broadcast(F_SPEC, MapPalette.colors[c].getGreen());
|
|
||||||
+ FloatVector compBlues = FloatVector.broadcast(F_SPEC, MapPalette.colors[c].getBlue());
|
|
||||||
+
|
|
||||||
+ FloatVector rMean = reds.add(compReds).div(2.0f);
|
|
||||||
+ FloatVector rDiff = reds.sub(compReds);
|
|
||||||
+ FloatVector gDiff = greens.sub(compGreens);
|
|
||||||
+ FloatVector bDiff = blues.sub(compBlues);
|
|
||||||
+
|
|
||||||
+ FloatVector weightR = rMean.div(256.0f).add(2);
|
|
||||||
+ FloatVector weightG = FloatVector.broadcast(F_SPEC, 4.0f);
|
|
||||||
+ FloatVector weightB = FloatVector.broadcast(F_SPEC, 255.0f).sub(rMean).div(256.0f).add(2.0f);
|
|
||||||
+
|
|
||||||
+ FloatVector distance = weightR.mul(rDiff).mul(rDiff).add(weightG.mul(gDiff).mul(gDiff)).add(weightB.mul(bDiff).mul(bDiff));
|
|
||||||
+
|
|
||||||
+ // Now we compare to the best distance we've found.
|
|
||||||
+ // This mask contains a "1" if better, and a "0" otherwise.
|
|
||||||
+ VectorMask<Float> bestDistanceMask = distance.lt(bestDistances);
|
|
||||||
+ bestDistances = bestDistances.blend(distance, bestDistanceMask); // Update the best distances
|
|
||||||
+
|
|
||||||
+ // Update the result array
|
|
||||||
+ // We also AND with the modification mask because we don't want to interfere if the alpha value isn't large enough.
|
|
||||||
+ resultIndex = resultIndex.blend(c, bestDistanceMask.cast(I_SPEC).and(modificationMask)); // Update the results
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ for (int j = 0; j < speciesLength; j++) {
|
|
||||||
+ int index = resultIndex.lane(j);
|
|
||||||
+ out[i + j] = (byte) (index < 128 ? index : -129 + (index - 127));
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ // For the final ones, fall back to the regular method
|
|
||||||
+ for (; i < in.length; i++) {
|
|
||||||
+ out[i] = MapPalette.matchColor(new Color(in[i], true));
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+}
|
|
||||||
diff --git a/src/main/java/org/bukkit/map/MapPalette.java b/src/main/java/org/bukkit/map/MapPalette.java
|
|
||||||
index c80faa079eca1564847070f0338fc98024639829..e632d51d3487eb4807243b6705999ad124466bf5 100644
|
|
||||||
--- a/src/main/java/org/bukkit/map/MapPalette.java
|
|
||||||
+++ b/src/main/java/org/bukkit/map/MapPalette.java
|
|
||||||
@@ -1,6 +1,7 @@
|
|
||||||
package org.bukkit.map;
|
|
||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
|
||||||
+import gg.pufferfish.pufferfish.simd.SIMDDetection; // Pufferfish
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.Graphics2D;
|
|
||||||
import java.awt.Image;
|
|
||||||
@@ -40,7 +41,7 @@ public final class MapPalette {
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
- static final Color[] colors = {
|
|
||||||
+ public static final Color[] colors = { // Pufferfish - public access
|
|
||||||
c(0, 0, 0, 0), c(0, 0, 0, 0), c(0, 0, 0, 0), c(0, 0, 0, 0),
|
|
||||||
c(89, 125, 39), c(109, 153, 48), c(127, 178, 56), c(67, 94, 29),
|
|
||||||
c(174, 164, 115), c(213, 201, 140), c(247, 233, 163), c(130, 123, 86),
|
|
||||||
@@ -211,9 +212,15 @@ public final class MapPalette {
|
|
||||||
temp.getRGB(0, 0, temp.getWidth(), temp.getHeight(), pixels, 0, temp.getWidth());
|
|
||||||
|
|
||||||
byte[] result = new byte[temp.getWidth() * temp.getHeight()];
|
|
||||||
+ // Pufferfish start
|
|
||||||
+ if (!SIMDDetection.isEnabled) {
|
|
||||||
for (int i = 0; i < pixels.length; i++) {
|
|
||||||
result[i] = matchColor(new Color(pixels[i], true));
|
|
||||||
}
|
|
||||||
+ } else {
|
|
||||||
+ gg.pufferfish.pufferfish.simd.VectorMapPalette.matchColorVectorized(pixels, result);
|
|
||||||
+ }
|
|
||||||
+ // Pufferfish end
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
|
|
||||||
index fc2dae69165776d08274e34a69962cc70445f411..899d67fa782fac639fe7fb096e05c551d75bd647 100644
|
|
||||||
--- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java
|
|
||||||
+++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
|
|
||||||
@@ -584,7 +584,9 @@ public final class SimplePluginManager implements PluginManager {
|
|
||||||
|
|
||||||
// Paper start
|
|
||||||
private void handlePluginException(String msg, Throwable ex, Plugin plugin) {
|
|
||||||
+ gg.pufferfish.pufferfish.sentry.SentryContext.setPluginContext(plugin); // Pufferfish
|
|
||||||
server.getLogger().log(Level.SEVERE, msg, ex);
|
|
||||||
+ gg.pufferfish.pufferfish.sentry.SentryContext.removePluginContext(); // Pufferfish
|
|
||||||
callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerPluginEnableDisableException(msg, ex, plugin)));
|
|
||||||
}
|
|
||||||
// Paper end
|
|
||||||
@@ -654,9 +656,11 @@ public final class SimplePluginManager implements PluginManager {
|
|
||||||
));
|
|
||||||
}
|
|
||||||
} catch (Throwable ex) {
|
|
||||||
+ gg.pufferfish.pufferfish.sentry.SentryContext.setEventContext(event, registration); // Pufferfish
|
|
||||||
// Paper start - error reporting
|
|
||||||
String msg = "Could not pass event " + event.getEventName() + " to " + registration.getPlugin().getDescription().getFullName();
|
|
||||||
server.getLogger().log(Level.SEVERE, msg, ex);
|
|
||||||
+ gg.pufferfish.pufferfish.sentry.SentryContext.removeEventContext(); // Pufferfish
|
|
||||||
if (!(event instanceof com.destroystokyo.paper.event.server.ServerExceptionEvent)) { // We don't want to cause an endless event loop
|
|
||||||
callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerEventException(msg, ex, registration.getPlugin(), registration.getListener(), event)));
|
|
||||||
}
|
|
||||||
diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
|
||||||
index eaefbb00e9993d54906cc8cf35cf753c0d6c7707..301e82369603f3dd6e6c1bd380da4bacacd7ef6c 100644
|
|
||||||
--- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
|
||||||
+++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
|
||||||
@@ -336,7 +336,13 @@ public final class JavaPluginLoader implements PluginLoader {
|
|
||||||
try {
|
|
||||||
jPlugin.setEnabled(true);
|
|
||||||
} catch (Throwable ex) {
|
|
||||||
+ gg.pufferfish.pufferfish.sentry.SentryContext.setPluginContext(plugin); // Pufferfish
|
|
||||||
server.getLogger().log(Level.SEVERE, "Error occurred while enabling " + plugin.getDescription().getFullName() + " (Is it up to date?)", ex);
|
|
||||||
+ gg.pufferfish.pufferfish.sentry.SentryContext.removePluginContext(); // Pufferfish
|
|
||||||
+ // Paper start - Disable plugins that fail to load
|
|
||||||
+ this.server.getPluginManager().disablePlugin(jPlugin);
|
|
||||||
+ return;
|
|
||||||
+ // Paper end
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perhaps abort here, rather than continue going, but as it stands,
|
|
||||||
@@ -361,7 +367,9 @@ public final class JavaPluginLoader implements PluginLoader {
|
|
||||||
try {
|
|
||||||
jPlugin.setEnabled(false);
|
|
||||||
} catch (Throwable ex) {
|
|
||||||
+ gg.pufferfish.pufferfish.sentry.SentryContext.setPluginContext(plugin); // Pufferfish
|
|
||||||
server.getLogger().log(Level.SEVERE, "Error occurred while disabling " + plugin.getDescription().getFullName() + " (Is it up to date?)", ex);
|
|
||||||
+ gg.pufferfish.pufferfish.sentry.SentryContext.removePluginContext(); // Pufferfish
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cloader instanceof PluginClassLoader) {
|
|
||||||
diff --git a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
|
|
||||||
index 7e4f7cb2afbc145e532285c793573ad107bc3033..12449e18180d604e9cbbc744da74a8b222a18e1f 100644
|
|
||||||
--- a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
|
|
||||||
+++ b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
|
|
||||||
@@ -50,6 +50,8 @@ public final class PluginClassLoader extends URLClassLoader implements io.paperm
|
|
||||||
private io.papermc.paper.plugin.provider.classloader.PluginClassLoaderGroup classLoaderGroup; // Paper
|
|
||||||
public io.papermc.paper.plugin.provider.entrypoint.DependencyContext dependencyContext; // Paper
|
|
||||||
|
|
||||||
+ private boolean closed = false; // Pufferfish
|
|
||||||
+
|
|
||||||
static {
|
|
||||||
ClassLoader.registerAsParallelCapable();
|
|
||||||
}
|
|
||||||
@@ -197,6 +199,7 @@ public final class PluginClassLoader extends URLClassLoader implements io.paperm
|
|
||||||
throw new ClassNotFoundException(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ public boolean _airplane_hasClass(@NotNull String name) { return this.classes.containsKey(name); } // Pufferfish
|
|
||||||
@Override
|
|
||||||
protected Class<?> findClass(String name) throws ClassNotFoundException {
|
|
||||||
if (name.startsWith("org.bukkit.") || name.startsWith("net.minecraft.")) {
|
|
||||||
@@ -204,7 +207,7 @@ public final class PluginClassLoader extends URLClassLoader implements io.paperm
|
|
||||||
}
|
|
||||||
Class<?> result = classes.get(name);
|
|
||||||
|
|
||||||
- if (result == null) {
|
|
||||||
+ if (result == null && !this.closed) { // Pufferfish
|
|
||||||
String path = name.replace('.', '/').concat(".class");
|
|
||||||
JarEntry entry = jar.getJarEntry(path);
|
|
||||||
|
|
||||||
@@ -251,6 +254,7 @@ public final class PluginClassLoader extends URLClassLoader implements io.paperm
|
|
||||||
this.setClass(name, result); // Paper
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (result == null) throw new ClassNotFoundException(name); // Pufferfish
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -265,6 +269,7 @@ public final class PluginClassLoader extends URLClassLoader implements io.paperm
|
|
||||||
// Paper end
|
|
||||||
super.close();
|
|
||||||
} finally {
|
|
||||||
+ this.closed = true; // Pufferfish
|
|
||||||
jar.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,34 +1,14 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
From: granny <contact@granny.dev>
|
From: AlphaKR93 <dev@alpha93.kr>
|
||||||
Date: Fri, 26 Apr 2024 18:07:21 +0900
|
Date: Tue, 30 Apr 2024 23:08:38 +0900
|
||||||
Subject: [PATCH] Purpur API Changes
|
Subject: [PATCH] Purpur API Patches
|
||||||
|
|
||||||
PurpurMC
|
|
||||||
Copyright (C) 2024 PurpurMC
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
diff --git a/build.gradle.kts b/build.gradle.kts
|
diff --git a/build.gradle.kts b/build.gradle.kts
|
||||||
index 9164120d299d062c62529a7ef74eac0ded367993..09e541dcbbb43699b4402036b8a3cc86a0ac9aad 100644
|
index 65e67b8726f1e19a6bcb1fe2f448e4ab68df11d1..892e78b1d2d29dc54def03fcb6d85a93ad56d84c 100644
|
||||||
--- a/build.gradle.kts
|
--- a/build.gradle.kts
|
||||||
+++ b/build.gradle.kts
|
+++ b/build.gradle.kts
|
||||||
@@ -129,6 +129,8 @@ tasks.jar {
|
@@ -121,6 +121,8 @@ tasks.jar {
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType<Javadoc> {
|
tasks.withType<Javadoc> {
|
||||||
@@ -185,24 +165,11 @@ index a736d7bcdc5861a01b66ba36158db1c716339346..22fc165fd9c95f0f3ae1be7a0857e48c
|
|||||||
class DummyVersionFetcher implements VersionFetcher {
|
class DummyVersionFetcher implements VersionFetcher {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
diff --git a/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java
|
|
||||||
index ab5fea0b03224bf249352ce340e94704ff713345..3441cdad70da1bd523c5933b1a914688718c2657 100644
|
|
||||||
--- a/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java
|
|
||||||
+++ b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java
|
|
||||||
@@ -15,7 +15,7 @@ public class SIMDChecker {
|
|
||||||
@Deprecated
|
|
||||||
public static boolean canEnable(Logger logger) {
|
|
||||||
try {
|
|
||||||
- if (SIMDDetection.getJavaVersion() != 17 && SIMDDetection.getJavaVersion() != 18 && SIMDDetection.getJavaVersion() != 19) {
|
|
||||||
+ if (SIMDDetection.getJavaVersion() < 17 || SIMDDetection.getJavaVersion() > 21) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
SIMDDetection.testRun = true;
|
|
||||||
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 9a428153f34291bdc026a71f7e60e285b7794b0c..53ce0fb2dac9c22680ab934f535b5a2037139445 100644
|
index 687bd8f54c9bfb5f5ab1f7ad9d232daf2433cc76..60de2456d00e85ac5ec5c4549198429aea87bc6d 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
|
||||||
@@ -2884,4 +2884,127 @@ public final class Bukkit {
|
@@ -2907,4 +2907,127 @@ public final class Bukkit {
|
||||||
public static Server.Spigot spigot() {
|
public static Server.Spigot spigot() {
|
||||||
return server.spigot();
|
return server.spigot();
|
||||||
}
|
}
|
||||||
@@ -421,10 +388,10 @@ index 918a045165cdcde264bc24082b7afebb407271de..687d11619379aead7f665d4a5f8f8bcc
|
|||||||
+ // Purpur end
|
+ // Purpur end
|
||||||
}
|
}
|
||||||
diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/Material.java
|
diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/Material.java
|
||||||
index ec117c47401ea1a04beb0e5ee9d4d394db7c5c4e..5b058d709751a5b720e209931774e09fcc9c960c 100644
|
index 82d009c0bbe4b3026a535e02d6e0ed20c7bd525d..0366400fe6dea7af40badaa3335b49ff5992a516 100644
|
||||||
--- a/src/main/java/org/bukkit/Material.java
|
--- a/src/main/java/org/bukkit/Material.java
|
||||||
+++ b/src/main/java/org/bukkit/Material.java
|
+++ b/src/main/java/org/bukkit/Material.java
|
||||||
@@ -11559,4 +11559,40 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
|
@@ -11653,4 +11653,40 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
|
||||||
public boolean isEnabledByFeature(@NotNull World world) {
|
public boolean isEnabledByFeature(@NotNull World world) {
|
||||||
return Bukkit.getDataPackManager().isEnabledByFeature(this, world);
|
return Bukkit.getDataPackManager().isEnabledByFeature(this, world);
|
||||||
}
|
}
|
||||||
@@ -577,10 +544,10 @@ index 30298a629b39bd43ce14b414fc697b2dfcbea89c..ce00af9121de7a910aaea4e0685a06d4
|
|||||||
+ // Purpur end - OfflinePlayer API
|
+ // Purpur end - OfflinePlayer API
|
||||||
}
|
}
|
||||||
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 4ff1b38eb65f97344257204cf018f176f247ed36..c15b0b05870a469ea5d314c9fac6a57a045f463c 100644
|
index 27084402cf0e46dcd171074629b7c4156e48aa44..a15d0ed710ff261f203d7e355e7d532f2e68abc9 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
|
||||||
@@ -2235,6 +2235,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
|
@@ -2254,6 +2254,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
|
||||||
}
|
}
|
||||||
// Paper end
|
// Paper end
|
||||||
|
|
||||||
@@ -599,7 +566,7 @@ index 4ff1b38eb65f97344257204cf018f176f247ed36..c15b0b05870a469ea5d314c9fac6a57a
|
|||||||
/**
|
/**
|
||||||
* Sends the component to the player
|
* Sends the component to the player
|
||||||
*
|
*
|
||||||
@@ -2518,4 +2530,105 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
|
@@ -2537,4 +2549,105 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
|
||||||
*/
|
*/
|
||||||
boolean isOwnedByCurrentRegion(@NotNull Entity entity);
|
boolean isOwnedByCurrentRegion(@NotNull Entity entity);
|
||||||
// Paper end - Folia region threading API
|
// Paper end - Folia region threading API
|
||||||
@@ -706,10 +673,10 @@ index 4ff1b38eb65f97344257204cf018f176f247ed36..c15b0b05870a469ea5d314c9fac6a57a
|
|||||||
+ // Purpur end
|
+ // Purpur end
|
||||||
}
|
}
|
||||||
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
|
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
|
||||||
index e6f66d70d024cf4f0536a5bf8e51bf7b306335df..07e75978b4fc0e446e8aa46a40be5e371dc1c11b 100644
|
index 97f97ea5c6aa513c439f86a9c82821e0f7d9cd1e..83a5b68c785a88594e6e3824ed282844086f7f1a 100644
|
||||||
--- a/src/main/java/org/bukkit/World.java
|
--- a/src/main/java/org/bukkit/World.java
|
||||||
+++ b/src/main/java/org/bukkit/World.java
|
+++ b/src/main/java/org/bukkit/World.java
|
||||||
@@ -4233,6 +4233,86 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
|
@@ -4249,6 +4249,86 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
|
||||||
@Nullable
|
@Nullable
|
||||||
public DragonBattle getEnderDragonBattle();
|
public DragonBattle getEnderDragonBattle();
|
||||||
|
|
||||||
@@ -959,10 +926,10 @@ index 138d2530de2410f4a9424dabd3e5ce0cd1c1dcd2..10a8d64ad2da0be2c14f34c3e7d1957c
|
|||||||
// Paper start
|
// Paper start
|
||||||
/**
|
/**
|
||||||
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
|
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
|
||||||
index 23def071492ccd715693d534cc506936e18f0f46..706096924ffd3b578866693e2937de4182fad554 100644
|
index 62e3793903905b94eb1a120345015149abb33713..07b8c0dd049ff783fd2e408be634642479bf8b1e 100644
|
||||||
--- a/src/main/java/org/bukkit/entity/Entity.java
|
--- a/src/main/java/org/bukkit/entity/Entity.java
|
||||||
+++ b/src/main/java/org/bukkit/entity/Entity.java
|
+++ b/src/main/java/org/bukkit/entity/Entity.java
|
||||||
@@ -1144,4 +1144,55 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
|
@@ -1155,4 +1155,55 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
|
||||||
*/
|
*/
|
||||||
@NotNull String getScoreboardEntryName();
|
@NotNull String getScoreboardEntryName();
|
||||||
// Paper end - entity scoreboard name
|
// Paper end - entity scoreboard name
|
||||||
@@ -1111,30 +1078,16 @@ index bcc6ba95bd21c7972865838c636a03f50b6c1f1a..c3fcd8dd7dbb1e1a18e17c014c1e6411
|
|||||||
+ // Purpur end
|
+ // Purpur end
|
||||||
}
|
}
|
||||||
diff --git a/src/main/java/org/bukkit/entity/LivingEntity.java b/src/main/java/org/bukkit/entity/LivingEntity.java
|
diff --git a/src/main/java/org/bukkit/entity/LivingEntity.java b/src/main/java/org/bukkit/entity/LivingEntity.java
|
||||||
index 65112eae8b92344796850b1e4c89e75443eab2fe..5369d802d37863a1efc0c031520147ceedcadc78 100644
|
index b777e530122549455dcce6fac8d4a151c1c0af42..61a046584acf48693489ff551a0dd4c4b16af9ff 100644
|
||||||
--- a/src/main/java/org/bukkit/entity/LivingEntity.java
|
--- a/src/main/java/org/bukkit/entity/LivingEntity.java
|
||||||
+++ b/src/main/java/org/bukkit/entity/LivingEntity.java
|
+++ b/src/main/java/org/bukkit/entity/LivingEntity.java
|
||||||
@@ -1445,4 +1445,41 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource
|
@@ -1447,4 +1447,27 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource
|
||||||
*/
|
*/
|
||||||
void setBodyYaw(float bodyYaw);
|
void setBodyYaw(float bodyYaw);
|
||||||
// Paper end - body yaw API
|
// Paper end - body yaw API
|
||||||
+
|
+
|
||||||
+ // Purpur start
|
+ // Purpur start
|
||||||
+ /**
|
+ /**
|
||||||
+ * Gets the distance (in blocks) this entity can safely fall without taking damage
|
|
||||||
+ *
|
|
||||||
+ * @return Safe fall distance
|
|
||||||
+ */
|
|
||||||
+ float getSafeFallDistance();
|
|
||||||
+
|
|
||||||
+ /**
|
|
||||||
+ * Set the distance (in blocks) this entity can safely fall without taking damage
|
|
||||||
+ *
|
|
||||||
+ * @param safeFallDistance Safe fall distance
|
|
||||||
+ */
|
|
||||||
+ void setSafeFallDistance(float safeFallDistance);
|
|
||||||
+
|
|
||||||
+ /**
|
|
||||||
+ * Play item break animation for the item in specified equipment slot
|
+ * Play item break animation for the item in specified equipment slot
|
||||||
+ *
|
+ *
|
||||||
+ * @param slot Equipment slot to play break animation for
|
+ * @param slot Equipment slot to play break animation for
|
||||||
@@ -1182,10 +1135,10 @@ index bc84b892cae5fe7019a3ad481e9da79956efa1fe..48eb5b00c460cccde29d327cef1d63fc
|
|||||||
+ // Purpur end
|
+ // Purpur 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 d048ae07cc33fd77d128cc1ebf88b0804969fa3c..8bbbdad40bc6a1932d8f79ec95c0a92037b3dac5 100644
|
index 8a1e39474af88188f2e1765731b57d349f0ee645..b76adf4370555b02b891a49f8019b4e152c002c2 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
|
||||||
@@ -3752,4 +3752,123 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
@@ -3796,4 +3796,123 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
||||||
@Override
|
@Override
|
||||||
Spigot spigot();
|
Spigot spigot();
|
||||||
// Spigot end
|
// Spigot end
|
||||||
@@ -1379,13 +1332,13 @@ index 14543c2238b45c526dd9aebea2aa5c22f5df54dc..5312daf33405704c74e2c9e109754285
|
|||||||
+ // Purpur end
|
+ // Purpur end
|
||||||
}
|
}
|
||||||
diff --git a/src/main/java/org/bukkit/entity/Wolf.java b/src/main/java/org/bukkit/entity/Wolf.java
|
diff --git a/src/main/java/org/bukkit/entity/Wolf.java b/src/main/java/org/bukkit/entity/Wolf.java
|
||||||
index 84db38388bf7a58e66d6cd29620b4fe64b0a897e..82ebd99549ce9f9e6427a50cef424e9007735708 100644
|
index 4b84c04675775e2a606630b00de8afe51665cebc..ccbaf40a3131f477b4be2264401ad893725c1162 100644
|
||||||
--- a/src/main/java/org/bukkit/entity/Wolf.java
|
--- a/src/main/java/org/bukkit/entity/Wolf.java
|
||||||
+++ b/src/main/java/org/bukkit/entity/Wolf.java
|
+++ b/src/main/java/org/bukkit/entity/Wolf.java
|
||||||
@@ -69,4 +69,20 @@ public interface Wolf extends Tameable, Sittable, io.papermc.paper.entity.Collar
|
@@ -112,4 +112,20 @@ public interface Wolf extends Tameable, Sittable, io.papermc.paper.entity.Collar
|
||||||
* @param interested Whether the wolf is interested
|
return variant;
|
||||||
*/
|
}
|
||||||
public void setInterested(boolean interested);
|
}
|
||||||
+
|
+
|
||||||
+ // Purpur start
|
+ // Purpur start
|
||||||
+ /**
|
+ /**
|
||||||
@@ -1435,10 +1388,10 @@ index c9f395064656dd0126410eb3c6e197baa450c063..13156a12e5df50cdc1e465dc0bd9d941
|
|||||||
* When a player gets bad omen after killing a patrol captain.
|
* When a player gets bad omen after killing a patrol captain.
|
||||||
*/
|
*/
|
||||||
diff --git a/src/main/java/org/bukkit/event/inventory/InventoryType.java b/src/main/java/org/bukkit/event/inventory/InventoryType.java
|
diff --git a/src/main/java/org/bukkit/event/inventory/InventoryType.java b/src/main/java/org/bukkit/event/inventory/InventoryType.java
|
||||||
index daa1306a7324d946d66ad5a674bbc84371d8d4d6..f3b2d7b6fda051211add2b3215f120fb6911aeed 100644
|
index 59b375569a75cb1e1f7c610f96078e102ec0d3ed..a3f74891abbdc51dbbddaeb511f2754e0603c904 100644
|
||||||
--- a/src/main/java/org/bukkit/event/inventory/InventoryType.java
|
--- a/src/main/java/org/bukkit/event/inventory/InventoryType.java
|
||||||
+++ b/src/main/java/org/bukkit/event/inventory/InventoryType.java
|
+++ b/src/main/java/org/bukkit/event/inventory/InventoryType.java
|
||||||
@@ -165,7 +165,7 @@ public enum InventoryType {
|
@@ -166,7 +166,7 @@ public enum InventoryType {
|
||||||
SMITHING_NEW(4, "Upgrade Gear"),
|
SMITHING_NEW(4, "Upgrade Gear"),
|
||||||
;
|
;
|
||||||
|
|
||||||
@@ -1464,32 +1417,13 @@ index c60be4fd24c7fdf65251dd6169e5e1ac3b588d95..569deccd2f1cf21da9b5906433ac493c
|
|||||||
+ boolean canDoUnsafeEnchants();
|
+ boolean canDoUnsafeEnchants();
|
||||||
+
|
+
|
||||||
+ void setDoUnsafeEnchants(boolean canDoUnsafeEnchants);
|
+ void setDoUnsafeEnchants(boolean canDoUnsafeEnchants);
|
||||||
+ // Purpur end
|
|
||||||
}
|
|
||||||
diff --git a/src/main/java/org/bukkit/inventory/ItemFactory.java b/src/main/java/org/bukkit/inventory/ItemFactory.java
|
|
||||||
index f680545b6b59bf8d2ad154b0472dda4cba42a162..58a62ba0635f9158bf18043da89aba7521e0e2e1 100644
|
|
||||||
--- a/src/main/java/org/bukkit/inventory/ItemFactory.java
|
|
||||||
+++ b/src/main/java/org/bukkit/inventory/ItemFactory.java
|
|
||||||
@@ -353,4 +353,14 @@ public interface ItemFactory {
|
|
||||||
*/
|
|
||||||
@NotNull ItemStack enchantWithLevels(@NotNull ItemStack itemStack, @org.jetbrains.annotations.Range(from = 1, to = 30) int levels, boolean allowTreasure, @NotNull java.util.Random random);
|
|
||||||
// Paper end - enchantWithLevels API
|
|
||||||
+
|
|
||||||
+ // Purpur start
|
|
||||||
+ /**
|
|
||||||
+ * Returns the lines of text shown when hovering over an item
|
|
||||||
+ * @param itemStack The ItemStack
|
|
||||||
+ * @param advanced Whether advanced tooltips are shown
|
|
||||||
+ * @return the list of Components
|
|
||||||
+ */
|
|
||||||
+ @NotNull java.util.List<net.kyori.adventure.text.@NotNull Component> getHoverLines(@NotNull ItemStack itemStack, boolean advanced);
|
|
||||||
+ // Purpur end
|
+ // Purpur 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 7414b4fa690d393a8e9557cc1fd1ce12fa426940..591759aef6c7c3333cbdab596c6619af9185c3c2 100644
|
index 84a7bf0936d35bf42b5ed038d295d5c31740f472..6e9b4cbc81878616b1c48add5db534286d267b05 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
|
||||||
@@ -17,6 +17,18 @@ import org.bukkit.inventory.meta.ItemMeta;
|
@@ -17,6 +17,17 @@ import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.bukkit.material.MaterialData;
|
import org.bukkit.material.MaterialData;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@@ -1503,12 +1437,11 @@ index 7414b4fa690d393a8e9557cc1fd1ce12fa426940..591759aef6c7c3333cbdab596c6619af
|
|||||||
+import org.bukkit.inventory.meta.Repairable;
|
+import org.bukkit.inventory.meta.Repairable;
|
||||||
+import org.bukkit.persistence.PersistentDataContainer;
|
+import org.bukkit.persistence.PersistentDataContainer;
|
||||||
+import org.bukkit.persistence.PersistentDataHolder;
|
+import org.bukkit.persistence.PersistentDataHolder;
|
||||||
+import com.destroystokyo.paper.Namespaced;
|
|
||||||
+// Purpur end
|
+// Purpur end
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a stack of items.
|
* Represents a stack of items.
|
||||||
@@ -1061,4 +1073,635 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
@@ -1073,4 +1084,565 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||||
return Bukkit.getUnsafe().computeTooltipLines(this, tooltipContext, player);
|
return Bukkit.getUnsafe().computeTooltipLines(this, tooltipContext, player);
|
||||||
}
|
}
|
||||||
// Paper end - expose itemstack tooltip lines
|
// Paper end - expose itemstack tooltip lines
|
||||||
@@ -1993,67 +1926,6 @@ index 7414b4fa690d393a8e9557cc1fd1ce12fa426940..591759aef6c7c3333cbdab596c6619af
|
|||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ /**
|
+ /**
|
||||||
+ * Gets the collection of namespaced keys that the item can destroy in {@link org.bukkit.GameMode#ADVENTURE}
|
|
||||||
+ *
|
|
||||||
+ * @return Set of {@link com.destroystokyo.paper.Namespaced}
|
|
||||||
+ */
|
|
||||||
+ @NotNull
|
|
||||||
+ public java.util.Set<Namespaced> getDestroyableKeys() {
|
|
||||||
+ return getItemMeta().getDestroyableKeys();
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /**
|
|
||||||
+ * Sets the collection of namespaced keys that the item can destroy in {@link org.bukkit.GameMode#ADVENTURE}
|
|
||||||
+ *
|
|
||||||
+ * @param canDestroy Collection of {@link com.destroystokyo.paper.Namespaced}
|
|
||||||
+ */
|
|
||||||
+ public void setDestroyableKeys(@NotNull Collection<Namespaced> canDestroy) {
|
|
||||||
+ ItemMeta itemMeta = getItemMeta();
|
|
||||||
+ itemMeta.setDestroyableKeys(canDestroy);
|
|
||||||
+ setItemMeta(itemMeta);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /**
|
|
||||||
+ * Gets the collection of namespaced keys that the item can be placed on in {@link org.bukkit.GameMode#ADVENTURE}
|
|
||||||
+ *
|
|
||||||
+ * @return Set of {@link com.destroystokyo.paper.Namespaced}
|
|
||||||
+ */
|
|
||||||
+ @NotNull
|
|
||||||
+ public java.util.Set<Namespaced> getPlaceableKeys() {
|
|
||||||
+ return getItemMeta().getPlaceableKeys();
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /**
|
|
||||||
+ * Sets the set of namespaced keys that the item can be placed on in {@link org.bukkit.GameMode#ADVENTURE}
|
|
||||||
+ *
|
|
||||||
+ * @param canPlaceOn Collection of {@link com.destroystokyo.paper.Namespaced}
|
|
||||||
+ */
|
|
||||||
+ @NotNull
|
|
||||||
+ public void setPlaceableKeys(@NotNull Collection<Namespaced> canPlaceOn) {
|
|
||||||
+ ItemMeta itemMeta = getItemMeta();
|
|
||||||
+ itemMeta.setPlaceableKeys(canPlaceOn);
|
|
||||||
+ setItemMeta(itemMeta);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /**
|
|
||||||
+ * Checks for the existence of any keys that the item can be placed on
|
|
||||||
+ *
|
|
||||||
+ * @return true if this item has placeable keys
|
|
||||||
+ */
|
|
||||||
+ public boolean hasPlaceableKeys() {
|
|
||||||
+ return hasItemMeta() && getItemMeta().hasPlaceableKeys();
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /**
|
|
||||||
+ * Checks for the existence of any keys that the item can destroy
|
|
||||||
+ *
|
|
||||||
+ * @return true if this item has destroyable keys
|
|
||||||
+ */
|
|
||||||
+ public boolean hasDestroyableKeys() {
|
|
||||||
+ return hasItemMeta() && getItemMeta().hasDestroyableKeys();
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /**
|
|
||||||
+ * Repairs this item by 1 durability
|
+ * Repairs this item by 1 durability
|
||||||
+ */
|
+ */
|
||||||
+ public void repair() {
|
+ public void repair() {
|
||||||
@@ -2098,7 +1970,7 @@ index 7414b4fa690d393a8e9557cc1fd1ce12fa426940..591759aef6c7c3333cbdab596c6619af
|
|||||||
+ public boolean damage(int amount, boolean ignoreUnbreaking) {
|
+ public boolean damage(int amount, boolean ignoreUnbreaking) {
|
||||||
+ Damageable damageable = (Damageable) getItemMeta();
|
+ Damageable damageable = (Damageable) getItemMeta();
|
||||||
+ if (amount > 0) {
|
+ if (amount > 0) {
|
||||||
+ int unbreaking = getEnchantLevel(Enchantment.DURABILITY);
|
+ int unbreaking = getEnchantLevel(Enchantment.UNBREAKING);
|
||||||
+ int reduce = 0;
|
+ int reduce = 0;
|
||||||
+ for (int i = 0; unbreaking > 0 && i < amount; ++i) {
|
+ for (int i = 0; unbreaking > 0 && i < amount; ++i) {
|
||||||
+ if (reduceDamage(java.util.concurrent.ThreadLocalRandom.current(), unbreaking)) {
|
+ if (reduceDamage(java.util.concurrent.ThreadLocalRandom.current(), unbreaking)) {
|
||||||
@@ -2133,15 +2005,6 @@ index 7414b4fa690d393a8e9557cc1fd1ce12fa426940..591759aef6c7c3333cbdab596c6619af
|
|||||||
+ }
|
+ }
|
||||||
+ return random.nextInt(unbreaking + 1) > 0;
|
+ return random.nextInt(unbreaking + 1) > 0;
|
||||||
+ }
|
+ }
|
||||||
+
|
|
||||||
+ /**
|
|
||||||
+ * Returns the lines of text shown when hovering over the item
|
|
||||||
+ * @param advanced Whether advanced tooltips are shown
|
|
||||||
+ * @return the list of Components
|
|
||||||
+ */
|
|
||||||
+ public @NotNull List<net.kyori.adventure.text.@NotNull Component> getHoverLines(boolean advanced) {
|
|
||||||
+ return Bukkit.getItemFactory().getHoverLines(this, advanced);
|
|
||||||
+ }
|
|
||||||
+ // Purpur end
|
+ // Purpur end
|
||||||
}
|
}
|
||||||
diff --git a/src/main/java/org/bukkit/inventory/RecipeChoice.java b/src/main/java/org/bukkit/inventory/RecipeChoice.java
|
diff --git a/src/main/java/org/bukkit/inventory/RecipeChoice.java b/src/main/java/org/bukkit/inventory/RecipeChoice.java
|
||||||
@@ -2230,7 +2093,7 @@ index cd3296fea01648592d2af89b3d80135acb6d0958..45797a6fbae1d8edc4211cb30def24ad
|
|||||||
|
|
||||||
permissions.put(lname, new PermissionAttachmentInfo(parent, lname, attachment, value));
|
permissions.put(lname, new PermissionAttachmentInfo(parent, lname, attachment, value));
|
||||||
diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
||||||
index 301e82369603f3dd6e6c1bd380da4bacacd7ef6c..0c6ca7588fb3d6b6497ddf032fe75e5c6c9719e5 100644
|
index eaefbb00e9993d54906cc8cf35cf753c0d6c7707..f1e58639213be0c43cd2ff090b625e7d0a67e8be 100644
|
||||||
--- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
--- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
||||||
+++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
+++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
||||||
@@ -55,6 +55,7 @@ public final class JavaPluginLoader implements PluginLoader {
|
@@ -55,6 +55,7 @@ public final class JavaPluginLoader implements PluginLoader {
|
||||||
@@ -2242,10 +2105,10 @@ index 301e82369603f3dd6e6c1bd380da4bacacd7ef6c..0c6ca7588fb3d6b6497ddf032fe75e5c
|
|||||||
/**
|
/**
|
||||||
* This class was not meant to be constructed explicitly
|
* This class was not meant to be constructed explicitly
|
||||||
diff --git a/src/main/java/org/bukkit/plugin/java/LibraryLoader.java b/src/main/java/org/bukkit/plugin/java/LibraryLoader.java
|
diff --git a/src/main/java/org/bukkit/plugin/java/LibraryLoader.java b/src/main/java/org/bukkit/plugin/java/LibraryLoader.java
|
||||||
index 653135352c104a6ddeb74a1b6d4916c6952d6271..46b0d02aa759b3735e6ac811523d459cf263aa8b 100644
|
index 8e1b6be2462aaa692efa1f72986921a6dc357196..b6e18b12fd4d61ce92203582906d24b4d14e6cc5 100644
|
||||||
--- a/src/main/java/org/bukkit/plugin/java/LibraryLoader.java
|
--- a/src/main/java/org/bukkit/plugin/java/LibraryLoader.java
|
||||||
+++ b/src/main/java/org/bukkit/plugin/java/LibraryLoader.java
|
+++ b/src/main/java/org/bukkit/plugin/java/LibraryLoader.java
|
||||||
@@ -66,6 +66,7 @@ public class LibraryLoader
|
@@ -68,6 +68,7 @@ public class LibraryLoader
|
||||||
@Override
|
@Override
|
||||||
public void transferStarted(@NotNull TransferEvent event) throws TransferCancelledException
|
public void transferStarted(@NotNull TransferEvent event) throws TransferCancelledException
|
||||||
{
|
{
|
||||||
@@ -2253,7 +2116,7 @@ index 653135352c104a6ddeb74a1b6d4916c6952d6271..46b0d02aa759b3735e6ac811523d459c
|
|||||||
logger.log( Level.INFO, "Downloading {0}", event.getResource().getRepositoryUrl() + event.getResource().getResourceName() );
|
logger.log( Level.INFO, "Downloading {0}", event.getResource().getRepositoryUrl() + event.getResource().getResourceName() );
|
||||||
}
|
}
|
||||||
} );
|
} );
|
||||||
@@ -81,6 +82,7 @@ public class LibraryLoader
|
@@ -88,6 +89,7 @@ public class LibraryLoader
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -2261,7 +2124,7 @@ index 653135352c104a6ddeb74a1b6d4916c6952d6271..46b0d02aa759b3735e6ac811523d459c
|
|||||||
logger.log( Level.INFO, "[{0}] Loading {1} libraries... please wait", new Object[]
|
logger.log( Level.INFO, "[{0}] Loading {1} libraries... please wait", new Object[]
|
||||||
{
|
{
|
||||||
java.util.Objects.requireNonNullElseGet(desc.getPrefix(), desc::getName), desc.getLibraries().size() // Paper - use configured log prefix
|
java.util.Objects.requireNonNullElseGet(desc.getPrefix(), desc::getName), desc.getLibraries().size() // Paper - use configured log prefix
|
||||||
@@ -119,6 +121,7 @@ public class LibraryLoader
|
@@ -135,6 +137,7 @@ public class LibraryLoader
|
||||||
}
|
}
|
||||||
|
|
||||||
jarFiles.add( url );
|
jarFiles.add( url );
|
||||||
@@ -2269,204 +2132,6 @@ index 653135352c104a6ddeb74a1b6d4916c6952d6271..46b0d02aa759b3735e6ac811523d459c
|
|||||||
logger.log( Level.INFO, "[{0}] Loaded library {1}", new Object[]
|
logger.log( Level.INFO, "[{0}] Loaded library {1}", new Object[]
|
||||||
{
|
{
|
||||||
java.util.Objects.requireNonNullElseGet(desc.getPrefix(), desc::getName), file // Paper - use configured log prefix
|
java.util.Objects.requireNonNullElseGet(desc.getPrefix(), desc::getName), file // Paper - use configured log prefix
|
||||||
diff --git a/src/main/java/org/bukkit/potion/PotionEffect.java b/src/main/java/org/bukkit/potion/PotionEffect.java
|
|
||||||
index c8ab330ef171795d08fa201cf8320703c7f1c66b..93e2ea220dc03c122f82af65d5e9fda5b582290c 100644
|
|
||||||
--- a/src/main/java/org/bukkit/potion/PotionEffect.java
|
|
||||||
+++ b/src/main/java/org/bukkit/potion/PotionEffect.java
|
|
||||||
@@ -33,6 +33,7 @@ public class PotionEffect implements ConfigurationSerializable {
|
|
||||||
private static final String AMBIENT = "ambient";
|
|
||||||
private static final String PARTICLES = "has-particles";
|
|
||||||
private static final String ICON = "has-icon";
|
|
||||||
+ private static final String KEY = "namespacedKey"; // Purpur
|
|
||||||
private final int amplifier;
|
|
||||||
private final int duration;
|
|
||||||
private final PotionEffectType type;
|
|
||||||
@@ -40,6 +41,7 @@ public class PotionEffect implements ConfigurationSerializable {
|
|
||||||
private final boolean particles;
|
|
||||||
private final boolean icon;
|
|
||||||
private final PotionEffect hiddenEffect; // Paper
|
|
||||||
+ @Nullable private final NamespacedKey key; // Purpur
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a potion effect.
|
|
||||||
@@ -50,11 +52,12 @@ public class PotionEffect implements ConfigurationSerializable {
|
|
||||||
* @param ambient the ambient status, see {@link PotionEffect#isAmbient()}
|
|
||||||
* @param particles the particle status, see {@link PotionEffect#hasParticles()}
|
|
||||||
* @param icon the icon status, see {@link PotionEffect#hasIcon()}
|
|
||||||
+ * @param key the namespacedKey, see {@link PotionEffect#getKey()}
|
|
||||||
* @param hiddenEffect the hidden PotionEffect
|
|
||||||
* @hidden Internal-- hidden effects are only shown internally
|
|
||||||
*/
|
|
||||||
@org.jetbrains.annotations.ApiStatus.Internal // Paper
|
|
||||||
- public PotionEffect(@NotNull PotionEffectType type, int duration, int amplifier, boolean ambient, boolean particles, boolean icon, @Nullable PotionEffect hiddenEffect) { // Paper
|
|
||||||
+ public PotionEffect(@NotNull PotionEffectType type, int duration, int amplifier, boolean ambient, boolean particles, boolean icon, @Nullable PotionEffect hiddenEffect, @Nullable NamespacedKey key) { // Paper // Purpur
|
|
||||||
Preconditions.checkArgument(type != null, "effect type cannot be null");
|
|
||||||
this.type = type;
|
|
||||||
this.duration = duration;
|
|
||||||
@@ -62,6 +65,7 @@ public class PotionEffect implements ConfigurationSerializable {
|
|
||||||
this.ambient = ambient;
|
|
||||||
this.particles = particles;
|
|
||||||
this.icon = icon;
|
|
||||||
+ this.key = key; // Purpur
|
|
||||||
// Paper start
|
|
||||||
this.hiddenEffect = hiddenEffect;
|
|
||||||
}
|
|
||||||
@@ -77,10 +81,27 @@ public class PotionEffect implements ConfigurationSerializable {
|
|
||||||
* @param icon the icon status, see {@link PotionEffect#hasIcon()}
|
|
||||||
*/
|
|
||||||
public PotionEffect(@NotNull PotionEffectType type, int duration, int amplifier, boolean ambient, boolean particles, boolean icon) {
|
|
||||||
- this(type, duration, amplifier, ambient, particles, icon, null);
|
|
||||||
+ this(type, duration, amplifier, ambient, particles, icon, null, null); // Purpur
|
|
||||||
// Paper end
|
|
||||||
}
|
|
||||||
|
|
||||||
+ // Purpur start
|
|
||||||
+ /**
|
|
||||||
+ * Creates a potion effect.
|
|
||||||
+ * @param type effect type
|
|
||||||
+ * @param duration measured in ticks, see {@link
|
|
||||||
+ * PotionEffect#getDuration()}
|
|
||||||
+ * @param amplifier the amplifier, see {@link PotionEffect#getAmplifier()}
|
|
||||||
+ * @param ambient the ambient status, see {@link PotionEffect#isAmbient()}
|
|
||||||
+ * @param particles the particle status, see {@link PotionEffect#hasParticles()}
|
|
||||||
+ * @param icon the icon status, see {@link PotionEffect#hasIcon()}
|
|
||||||
+ * @param key the namespacedKey, see {@link PotionEffect#getKey()}
|
|
||||||
+ */
|
|
||||||
+ public PotionEffect(@NotNull PotionEffectType type, int duration, int amplifier, boolean ambient, boolean particles, boolean icon, @Nullable NamespacedKey key) {
|
|
||||||
+ this(type, duration, amplifier, ambient, particles, icon, null, key);
|
|
||||||
+ }
|
|
||||||
+ // Purpur end
|
|
||||||
+
|
|
||||||
/**
|
|
||||||
* Creates a potion effect with no defined color.
|
|
||||||
*
|
|
||||||
@@ -126,33 +147,33 @@ public class PotionEffect implements ConfigurationSerializable {
|
|
||||||
* @param map the map to deserialize from
|
|
||||||
*/
|
|
||||||
public PotionEffect(@NotNull Map<String, Object> map) {
|
|
||||||
- this(getEffectType(map), getInt(map, DURATION), getInt(map, AMPLIFIER), getBool(map, AMBIENT, false), getBool(map, PARTICLES, true), getBool(map, ICON, getBool(map, PARTICLES, true)), (PotionEffect) map.get(HIDDEN_EFFECT)); // Paper
|
|
||||||
+ this(getEffectType(map), getInt(map, DURATION), getInt(map, AMPLIFIER), getBool(map, AMBIENT, false), getBool(map, PARTICLES, true), getBool(map, ICON, getBool(map, PARTICLES, true)), (PotionEffect) map.get(HIDDEN_EFFECT), getKey(map)); // Paper // Purpur - getKey
|
|
||||||
}
|
|
||||||
|
|
||||||
// Paper start
|
|
||||||
@NotNull
|
|
||||||
public PotionEffect withType(@NotNull PotionEffectType type) {
|
|
||||||
- return new PotionEffect(type, duration, amplifier, ambient, particles, icon);
|
|
||||||
+ return new PotionEffect(type, duration, amplifier, ambient, particles, icon, key); // Purpur - add key
|
|
||||||
}
|
|
||||||
@NotNull
|
|
||||||
public PotionEffect withDuration(int duration) {
|
|
||||||
- return new PotionEffect(this.type, duration, amplifier, ambient, particles, icon);
|
|
||||||
+ return new PotionEffect(this.type, duration, amplifier, ambient, particles, icon, key); // Purpur - add key
|
|
||||||
}
|
|
||||||
@NotNull
|
|
||||||
public PotionEffect withAmplifier(int amplifier) {
|
|
||||||
- return new PotionEffect(this.type, duration, amplifier, ambient, particles, icon);
|
|
||||||
+ return new PotionEffect(this.type, duration, amplifier, ambient, particles, icon, key); // Purpur - add key
|
|
||||||
}
|
|
||||||
@NotNull
|
|
||||||
public PotionEffect withAmbient(boolean ambient) {
|
|
||||||
- return new PotionEffect(this.type, duration, amplifier, ambient, particles, icon);
|
|
||||||
+ return new PotionEffect(this.type, duration, amplifier, ambient, particles, icon, key); // Purpur - add key
|
|
||||||
}
|
|
||||||
@NotNull
|
|
||||||
public PotionEffect withParticles(boolean particles) {
|
|
||||||
- return new PotionEffect(this.type, duration, amplifier, ambient, particles, icon);
|
|
||||||
+ return new PotionEffect(this.type, duration, amplifier, ambient, particles, icon, key); // Purpur - add key
|
|
||||||
}
|
|
||||||
@NotNull
|
|
||||||
public PotionEffect withIcon(boolean icon) {
|
|
||||||
- return new PotionEffect(this.type, duration, amplifier, ambient, particles, icon);
|
|
||||||
+ return new PotionEffect(this.type, duration, amplifier, ambient, particles, icon, key); // Purpur - add key
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@@ -169,6 +190,13 @@ public class PotionEffect implements ConfigurationSerializable {
|
|
||||||
}
|
|
||||||
// Paper end
|
|
||||||
|
|
||||||
+ // Purpur start
|
|
||||||
+ @NotNull
|
|
||||||
+ public PotionEffect withKey(@Nullable NamespacedKey key) {
|
|
||||||
+ return new PotionEffect(this.type, duration, amplifier, ambient, particles, icon, key);
|
|
||||||
+ }
|
|
||||||
+ // Purpur end
|
|
||||||
+
|
|
||||||
@NotNull
|
|
||||||
private static PotionEffectType getEffectType(@NotNull Map<?, ?> map) {
|
|
||||||
PotionEffectType effect;
|
|
||||||
@@ -201,6 +229,17 @@ public class PotionEffect implements ConfigurationSerializable {
|
|
||||||
return def;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ // Purpur start
|
|
||||||
+ @Nullable
|
|
||||||
+ private static NamespacedKey getKey(@NotNull Map<?, ?> map) {
|
|
||||||
+ Object key = map.get(KEY);
|
|
||||||
+ if (key instanceof String stringKey) {
|
|
||||||
+ return NamespacedKey.fromString(stringKey);
|
|
||||||
+ }
|
|
||||||
+ return null;
|
|
||||||
+ }
|
|
||||||
+ // Purpur end
|
|
||||||
+
|
|
||||||
@Override
|
|
||||||
@NotNull
|
|
||||||
public Map<String, Object> serialize() {
|
|
||||||
@@ -215,6 +254,11 @@ public class PotionEffect implements ConfigurationSerializable {
|
|
||||||
if (this.hiddenEffect != null) {
|
|
||||||
builder.put(HIDDEN_EFFECT, this.hiddenEffect);
|
|
||||||
}
|
|
||||||
+ // Purpur start
|
|
||||||
+ if (key != null) {
|
|
||||||
+ builder.put(KEY, key.toString());
|
|
||||||
+ }
|
|
||||||
+ // Purpur end
|
|
||||||
return builder.build();
|
|
||||||
// Paper end
|
|
||||||
}
|
|
||||||
@@ -243,7 +287,7 @@ public class PotionEffect implements ConfigurationSerializable {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
PotionEffect that = (PotionEffect) obj;
|
|
||||||
- return this.type.equals(that.type) && this.ambient == that.ambient && this.amplifier == that.amplifier && this.duration == that.duration && this.particles == that.particles && this.icon == that.icon && java.util.Objects.equals(this.hiddenEffect, that.hiddenEffect); // Paper
|
|
||||||
+ return this.type.equals(that.type) && this.ambient == that.ambient && this.amplifier == that.amplifier && this.duration == that.duration && this.particles == that.particles && this.icon == that.icon && java.util.Objects.equals(this.hiddenEffect, that.hiddenEffect) && this.key == that.key; // Paper // Purpur - add key
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@@ -339,6 +383,24 @@ public class PotionEffect implements ConfigurationSerializable {
|
|
||||||
return icon;
|
|
||||||
}
|
|
||||||
|
|
||||||
+
|
|
||||||
+ // Purpur start
|
|
||||||
+ /**
|
|
||||||
+ * @return if the key isn't the default namespacedKey
|
|
||||||
+ */
|
|
||||||
+ public boolean hasKey() {
|
|
||||||
+ return key != null;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /**
|
|
||||||
+ * @return the key attached to the potion
|
|
||||||
+ */
|
|
||||||
+ @Nullable
|
|
||||||
+ public NamespacedKey getKey() {
|
|
||||||
+ return key;
|
|
||||||
+ }
|
|
||||||
+ // Purpur end
|
|
||||||
+
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
int hash = 1;
|
|
||||||
@@ -354,6 +416,6 @@ public class PotionEffect implements ConfigurationSerializable {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
- return "PotionEffect{" + "amplifier=" + amplifier + ", duration=" + duration + ", type=" + type + ", ambient=" + ambient + ", particles=" + particles + ", icon=" + icon + ", hiddenEffect=" + hiddenEffect + '}'; // Paper
|
|
||||||
+ return "PotionEffect{" + "amplifier=" + amplifier + ", duration=" + duration + ", type=" + type + ", ambient=" + ambient + ", particles=" + particles + ", icon=" + icon + ", hiddenEffect=" + hiddenEffect + ", key=" + key + '}'; // Paper // Purpur - add key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
diff --git a/src/main/java/org/bukkit/util/permissions/CommandPermissions.java b/src/main/java/org/bukkit/util/permissions/CommandPermissions.java
|
diff --git a/src/main/java/org/bukkit/util/permissions/CommandPermissions.java b/src/main/java/org/bukkit/util/permissions/CommandPermissions.java
|
||||||
index 7763d6101ac61900db1e2310966b99584539fd0e..d5a42707d365ffd72532bbb1a59a1ca7145f9918 100644
|
index 7763d6101ac61900db1e2310966b99584539fd0e..d5a42707d365ffd72532bbb1a59a1ca7145f9918 100644
|
||||||
--- a/src/main/java/org/bukkit/util/permissions/CommandPermissions.java
|
--- a/src/main/java/org/bukkit/util/permissions/CommandPermissions.java
|
||||||
@@ -2993,10 +2658,10 @@ index 0000000000000000000000000000000000000000..519809eab5d926dc7b0a7bad5d446d0d
|
|||||||
+}
|
+}
|
||||||
diff --git a/src/main/java/org/purpurmc/purpur/event/PreBlockExplodeEvent.java b/src/main/java/org/purpurmc/purpur/event/PreBlockExplodeEvent.java
|
diff --git a/src/main/java/org/purpurmc/purpur/event/PreBlockExplodeEvent.java b/src/main/java/org/purpurmc/purpur/event/PreBlockExplodeEvent.java
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000000000000000000000000000000000000..32602b398ede24a35ed8a996faa2b23455615a7b
|
index 0000000000000000000000000000000000000000..8ea97ddceedb7c719e8a50a0dd8f3f0919ca1647
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/src/main/java/org/purpurmc/purpur/event/PreBlockExplodeEvent.java
|
+++ b/src/main/java/org/purpurmc/purpur/event/PreBlockExplodeEvent.java
|
||||||
@@ -0,0 +1,54 @@
|
@@ -0,0 +1,53 @@
|
||||||
+package org.purpurmc.purpur.event;
|
+package org.purpurmc.purpur.event;
|
||||||
+
|
+
|
||||||
+import org.bukkit.block.Block;
|
+import org.bukkit.block.Block;
|
||||||
@@ -3005,7 +2670,6 @@ index 0000000000000000000000000000000000000000..32602b398ede24a35ed8a996faa2b234
|
|||||||
+import org.bukkit.event.HandlerList;
|
+import org.bukkit.event.HandlerList;
|
||||||
+import org.bukkit.event.block.BlockExplodeEvent;
|
+import org.bukkit.event.block.BlockExplodeEvent;
|
||||||
+import org.jetbrains.annotations.NotNull;
|
+import org.jetbrains.annotations.NotNull;
|
||||||
+import org.jetbrains.annotations.Nullable;
|
|
||||||
+import java.util.Collections;
|
+import java.util.Collections;
|
||||||
+
|
+
|
||||||
+/**
|
+/**
|
||||||
@@ -3016,8 +2680,8 @@ index 0000000000000000000000000000000000000000..32602b398ede24a35ed8a996faa2b234
|
|||||||
+ private boolean cancelled;
|
+ private boolean cancelled;
|
||||||
+ private final float yield;
|
+ private final float yield;
|
||||||
+
|
+
|
||||||
+ public PreBlockExplodeEvent(@NotNull final Block what, final float yield, @Nullable BlockState explodedBlockState) {
|
+ public PreBlockExplodeEvent(@NotNull final Block what, final float yield, @NotNull BlockState explodedBlockState) {
|
||||||
+ super(what, Collections.emptyList(), yield, explodedBlockState);
|
+ super(what, explodedBlockState, Collections.emptyList(), yield);
|
||||||
+ this.yield = yield;
|
+ this.yield = yield;
|
||||||
+ this.cancelled = false;
|
+ this.cancelled = false;
|
||||||
+ }
|
+ }
|
||||||
@@ -3918,60 +3582,6 @@ index 0000000000000000000000000000000000000000..eebb5d124456b8209d1b8e8cc4cb772d
|
|||||||
+ return handlers;
|
+ return handlers;
|
||||||
+ }
|
+ }
|
||||||
+}
|
+}
|
||||||
diff --git a/src/main/java/org/purpurmc/purpur/event/packet/NetworkItemSerializeEvent.java b/src/main/java/org/purpurmc/purpur/event/packet/NetworkItemSerializeEvent.java
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000000000000000000000000000000000..c0da73d2ea83a6055e34894ba1c7506fc8667712
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/src/main/java/org/purpurmc/purpur/event/packet/NetworkItemSerializeEvent.java
|
|
||||||
@@ -0,0 +1,48 @@
|
|
||||||
+package org.purpurmc.purpur.event.packet;
|
|
||||||
+
|
|
||||||
+import org.bukkit.event.Event;
|
|
||||||
+import org.bukkit.event.HandlerList;
|
|
||||||
+import org.bukkit.inventory.ItemStack;
|
|
||||||
+import org.jetbrains.annotations.NotNull;
|
|
||||||
+import org.jetbrains.annotations.Nullable;
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * Called when an item is about to be written to a packet.
|
|
||||||
+ */
|
|
||||||
+public class NetworkItemSerializeEvent extends Event {
|
|
||||||
+ private ItemStack itemStack;
|
|
||||||
+
|
|
||||||
+ public NetworkItemSerializeEvent(@NotNull ItemStack itemStack) {
|
|
||||||
+ super(!org.bukkit.Bukkit.isPrimaryThread());
|
|
||||||
+ this.itemStack = itemStack;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /**
|
|
||||||
+ * @return The item that is about to be serialized. Not mutable
|
|
||||||
+ */
|
|
||||||
+ @NotNull
|
|
||||||
+ public ItemStack getItemStack() {
|
|
||||||
+ return itemStack;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /**
|
|
||||||
+ * Sets the item that will be serialized.
|
|
||||||
+ *
|
|
||||||
+ * @param itemStack The item
|
|
||||||
+ */
|
|
||||||
+ public void setItemStack(@Nullable ItemStack itemStack) {
|
|
||||||
+ this.itemStack = itemStack;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ private static final HandlerList handlers = new HandlerList();
|
|
||||||
+
|
|
||||||
+ @NotNull
|
|
||||||
+ public HandlerList getHandlers() {
|
|
||||||
+ return handlers;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ @NotNull
|
|
||||||
+ public static HandlerList getHandlerList() {
|
|
||||||
+ return handlers;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
diff --git a/src/main/java/org/purpurmc/purpur/event/player/PlayerBookTooLargeEvent.java b/src/main/java/org/purpurmc/purpur/event/player/PlayerBookTooLargeEvent.java
|
diff --git a/src/main/java/org/purpurmc/purpur/event/player/PlayerBookTooLargeEvent.java b/src/main/java/org/purpurmc/purpur/event/player/PlayerBookTooLargeEvent.java
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000000000000000000000000000000000000..c88394336bc9ab0f66a2af24d393f4a176a234d5
|
index 0000000000000000000000000000000000000000..c88394336bc9ab0f66a2af24d393f4a176a234d5
|
||||||
@@ -4123,18 +3733,3 @@ index 12946bd55fcf7c40d39081779a7fa30049ee6165..9c2d605c50cbf9aefa56ec209df9f6ce
|
|||||||
+ public void stopTiming() { /*handler.stopTiming();*/ } // Purpur
|
+ public void stopTiming() { /*handler.stopTiming();*/ } // Purpur
|
||||||
|
|
||||||
}
|
}
|
||||||
diff --git a/src/test/java/org/bukkit/AnnotationTest.java b/src/test/java/org/bukkit/AnnotationTest.java
|
|
||||||
index 88f1ca89fa640a686231b8eec87e70419b2d73ef..d6b91c49a267c89d7df2ddee7ccfe64675d117be 100644
|
|
||||||
--- a/src/test/java/org/bukkit/AnnotationTest.java
|
|
||||||
+++ b/src/test/java/org/bukkit/AnnotationTest.java
|
|
||||||
@@ -47,6 +47,10 @@ public class AnnotationTest {
|
|
||||||
"org/bukkit/plugin/java/PluginClassLoader",
|
|
||||||
// Generic functional interface
|
|
||||||
"org/bukkit/util/Consumer",
|
|
||||||
+ // Purpur start
|
|
||||||
+ "gg/pufferfish/pufferfish/sentry/SentryContext",
|
|
||||||
+ "gg/pufferfish/pufferfish/sentry/SentryContext$State",
|
|
||||||
+ // Purpur end
|
|
||||||
// Paper start
|
|
||||||
"io/papermc/paper/util/TransformingRandomAccessList",
|
|
||||||
"io/papermc/paper/util/TransformingRandomAccessList$TransformedListIterator",
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user