Implement metrics

This commit is contained in:
William Blake Galbreath
2019-07-11 21:43:54 -05:00
parent 8fec9216db
commit 02e31ae620
17 changed files with 720 additions and 68 deletions

View File

@@ -1,21 +1,41 @@
From b1ad4714c121f84b34a056cb3954ed0960487200 Mon Sep 17 00:00:00 2001
From e76332348871976aff4c44c7f305d75c7603ed39 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Thu, 9 May 2019 18:09:43 -0500
Subject: [PATCH] Purpur config files
---
.../net/minecraft/server/DedicatedServer.java | 9 ++
.../com/destroystokyo/paper/PaperConfig.java | 2 +
.../net/minecraft/server/DedicatedServer.java | 9 +
src/main/java/net/minecraft/server/World.java | 3 +
.../java/net/pl3x/purpur/PurpurCommand.java | 59 ++++++++
.../java/net/pl3x/purpur/PurpurConfig.java | 127 ++++++++++++++++++
.../net/pl3x/purpur/PurpurWorldConfig.java | 63 +++++++++
.../org/bukkit/craftbukkit/CraftServer.java | 2 +
.../java/org/bukkit/craftbukkit/Main.java | 8 ++
7 files changed, 271 insertions(+)
src/main/java/net/pl3x/purpur/Metrics.java | 612 ++++++++++++++++++
.../java/net/pl3x/purpur/PurpurCommand.java | 59 ++
.../java/net/pl3x/purpur/PurpurConfig.java | 133 ++++
.../net/pl3x/purpur/PurpurWorldConfig.java | 63 ++
.../org/bukkit/craftbukkit/CraftServer.java | 3 +
.../java/org/bukkit/craftbukkit/Main.java | 8 +
9 files changed, 892 insertions(+)
create mode 100644 src/main/java/net/pl3x/purpur/Metrics.java
create mode 100644 src/main/java/net/pl3x/purpur/PurpurCommand.java
create mode 100644 src/main/java/net/pl3x/purpur/PurpurConfig.java
create mode 100644 src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
index 5942c3438..750ca9727 100644
--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
@@ -96,10 +96,12 @@ public class PaperConfig {
MinecraftServer.getServer().server.getCommandMap().register(entry.getKey(), "Paper", entry.getValue());
}
+ /* // Purpur - Replace with our own
if (!metricsStarted) {
Metrics.PaperMetrics.startMetrics();
metricsStarted = true;
}
+ */ // Purpur end
}
static void readConfig(Class<?> clazz, Object instance) {
diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java
index c1473330f..f438323be 100644
--- a/src/main/java/net/minecraft/server/DedicatedServer.java
@@ -57,6 +77,624 @@ index ee6474b18..c86c9d1ec 100644
this.generator = gen;
this.world = new CraftWorld((WorldServer) this, gen, env);
this.ticksPerAnimalSpawns = this.getServer().getTicksPerAnimalSpawns(); // CraftBukkit
diff --git a/src/main/java/net/pl3x/purpur/Metrics.java b/src/main/java/net/pl3x/purpur/Metrics.java
new file mode 100644
index 000000000..98727df67
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/Metrics.java
@@ -0,0 +1,612 @@
+package net.pl3x.purpur;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import net.minecraft.server.MinecraftServer;
+import org.bukkit.Bukkit;
+import org.bukkit.configuration.file.YamlConfiguration;
+
+import javax.net.ssl.HttpsURLConnection;
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.UUID;
+import java.util.concurrent.Callable;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.zip.GZIPOutputStream;
+
+/**
+ * bStats collects some data for plugin authors.
+ * <p>
+ * Check out https://bStats.org/ to learn more about bStats!
+ */
+public class Metrics {
+ public static final int B_STATS_VERSION = 1;
+ private static final String URL = "https://bStats.org/submitData/server-implementation";
+ private static boolean logFailedRequests = false;
+ private static Logger logger = Logger.getLogger("bStats");
+ private final String name;
+ private final String serverUUID;
+ private final List<CustomChart> charts = new ArrayList<>();
+
+ /**
+ * Class constructor.
+ *
+ * @param name The name of the server software.
+ * @param serverUUID The uuid of the server.
+ * @param logFailedRequests Whether failed requests should be logged or not.
+ * @param logger The logger for the failed requests.
+ */
+ public Metrics(String name, String serverUUID, boolean logFailedRequests, Logger logger) {
+ this.name = name;
+ this.serverUUID = serverUUID;
+ Metrics.logFailedRequests = logFailedRequests;
+ Metrics.logger = logger;
+
+ startSubmitting();
+ }
+
+ /**
+ * Adds a custom chart.
+ *
+ * @param chart The chart to add.
+ */
+ public void addCustomChart(CustomChart chart) {
+ if (chart == null) {
+ throw new IllegalArgumentException("Chart cannot be null!");
+ }
+ charts.add(chart);
+ }
+
+ /**
+ * Starts the Scheduler which submits our data every 30 minutes.
+ */
+ private void startSubmitting() {
+ final Timer timer = new Timer(true);
+ timer.scheduleAtFixedRate(new TimerTask() {
+ @Override
+ public void run() {
+ submitData();
+ }
+ }, 1000 * 60 * 5, 1000 * 60 * 30);
+ // Submit the data every 30 minutes, first time after 5 minutes to give other plugins enough time to start
+ // WARNING: Changing the frequency has no effect but your plugin WILL be blocked/deleted!
+ // WARNING: Just don't do it!
+ }
+
+ /**
+ * Gets the plugin specific data.
+ * This method is called using Reflection.
+ *
+ * @return The plugin specific data.
+ */
+ public JsonObject getPluginData() {
+ JsonObject data = new JsonObject();
+
+ data.addProperty("pluginName", name); // Append the name of the plugin
+
+ JsonArray customCharts = new JsonArray();
+ for (CustomChart customChart : charts) {
+ JsonObject chart = customChart.getRequestJsonObject();
+ if (chart != null) {
+ customCharts.add(chart);
+ }
+ }
+ data.add("customCharts", customCharts);
+
+ return data;
+ }
+
+ /**
+ * Gets the server specific data.
+ *
+ * @return The server specific data.
+ */
+ private JsonObject getServerData() {
+ JsonObject data = new JsonObject();
+
+ data.addProperty("serverUUID", serverUUID);
+
+ data.addProperty("osName", System.getProperty("os.name"));
+ data.addProperty("osArch", System.getProperty("os.arch"));
+ data.addProperty("osVersion", System.getProperty("os.version"));
+ data.addProperty("coreCount", Runtime.getRuntime().availableProcessors());
+
+ return data;
+ }
+
+ /**
+ * Collects the data and sends it afterwards.
+ */
+ private void submitData() {
+ final JsonObject data = getServerData();
+
+ JsonArray pluginData = new JsonArray();
+ pluginData.add(getPluginData());
+ data.add("plugins", pluginData);
+
+ try {
+ sendData(data);
+ } catch (Exception e) {
+ if (logFailedRequests) {
+ logger.log(Level.WARNING, "Could not submit plugin stats of " + name, e);
+ }
+ }
+ }
+
+ /**
+ * Sends the data to the bStats server.
+ *
+ * @param data The data to send.
+ * @throws Exception If the request failed.
+ */
+ private static void sendData(JsonObject data) throws Exception {
+ if (data == null) {
+ throw new IllegalArgumentException("Data cannot be null!");
+ }
+ HttpsURLConnection connection = (HttpsURLConnection) new URL(URL).openConnection();
+
+ // Compress the data to save bandwidth
+ byte[] compressedData = compress(data.toString());
+
+ // Add headers
+ connection.setRequestMethod("POST");
+ connection.addRequestProperty("Accept", "application/json");
+ connection.addRequestProperty("Connection", "close");
+ connection.addRequestProperty("Content-Encoding", "gzip"); // We gzip our request
+ connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length));
+ connection.setRequestProperty("Content-Type", "application/json"); // We send our data in JSON format
+ connection.setRequestProperty("User-Agent", "MC-Server/" + B_STATS_VERSION);
+
+ // Send data
+ connection.setDoOutput(true);
+ DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
+ outputStream.write(compressedData);
+ outputStream.flush();
+ outputStream.close();
+
+ //connection.getInputStream().close();
+
+ InputStream inputStream = connection.getInputStream();
+ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
+
+ StringBuilder builder = new StringBuilder();
+ String line;
+ while ((line = bufferedReader.readLine()) != null) {
+ builder.append(line);
+ }
+ bufferedReader.close();
+ logger.info("Sent data to bStats and received response: " + builder.toString());
+ }
+
+ /**
+ * Gzips the given String.
+ *
+ * @param str The string to gzip.
+ * @return The gzipped String.
+ * @throws IOException If the compression failed.
+ */
+ private static byte[] compress(final String str) throws IOException {
+ if (str == null) {
+ return null;
+ }
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ GZIPOutputStream gzip = new GZIPOutputStream(outputStream);
+ gzip.write(str.getBytes(StandardCharsets.UTF_8));
+ gzip.close();
+ return outputStream.toByteArray();
+ }
+
+ /**
+ * Represents a custom chart.
+ */
+ public static abstract class CustomChart {
+
+ // The id of the chart
+ final String chartId;
+
+ /**
+ * Class constructor.
+ *
+ * @param chartId The id of the chart.
+ */
+ CustomChart(String chartId) {
+ if (chartId == null || chartId.isEmpty()) {
+ throw new IllegalArgumentException("ChartId cannot be null or empty!");
+ }
+ this.chartId = chartId;
+ }
+
+ private JsonObject getRequestJsonObject() {
+ JsonObject chart = new JsonObject();
+ chart.addProperty("chartId", chartId);
+ try {
+ JsonObject data = getChartData();
+ if (data == null) {
+ // If the data is null we don't send the chart.
+ return null;
+ }
+ chart.add("data", data);
+ } catch (Throwable t) {
+ if (logFailedRequests) {
+ Bukkit.getLogger().log(Level.WARNING, "Failed to get data for custom chart with id " + chartId, t);
+ }
+ return null;
+ }
+ return chart;
+ }
+
+ protected abstract JsonObject getChartData() throws Exception;
+
+ }
+
+ /**
+ * Represents a custom simple pie.
+ */
+ public static class SimplePie extends CustomChart {
+
+ private final Callable<String> callable;
+
+ /**
+ * Class constructor.
+ *
+ * @param chartId The id of the chart.
+ * @param callable The callable which is used to request the chart data.
+ */
+ public SimplePie(String chartId, Callable<String> callable) {
+ super(chartId);
+ this.callable = callable;
+ }
+
+ @Override
+ protected JsonObject getChartData() throws Exception {
+ JsonObject data = new JsonObject();
+ String value = callable.call();
+ if (value == null || value.isEmpty()) {
+ // Null = skip the chart
+ return null;
+ }
+ data.addProperty("value", value);
+ return data;
+ }
+ }
+
+ /**
+ * Represents a custom advanced pie.
+ */
+ public static class AdvancedPie extends CustomChart {
+
+ private final Callable<Map<String, Integer>> callable;
+
+ /**
+ * Class constructor.
+ *
+ * @param chartId The id of the chart.
+ * @param callable The callable which is used to request the chart data.
+ */
+ public AdvancedPie(String chartId, Callable<Map<String, Integer>> callable) {
+ super(chartId);
+ this.callable = callable;
+ }
+
+ @Override
+ protected JsonObject getChartData() throws Exception {
+ JsonObject data = new JsonObject();
+ JsonObject values = new JsonObject();
+ Map<String, Integer> map = callable.call();
+ if (map == null || map.isEmpty()) {
+ // Null = skip the chart
+ return null;
+ }
+ boolean allSkipped = true;
+ for (Map.Entry<String, Integer> entry : map.entrySet()) {
+ if (entry.getValue() == 0) {
+ continue; // Skip this invalid
+ }
+ allSkipped = false;
+ values.addProperty(entry.getKey(), entry.getValue());
+ }
+ if (allSkipped) {
+ // Null = skip the chart
+ return null;
+ }
+ data.add("values", values);
+ return data;
+ }
+ }
+
+ /**
+ * Represents a custom drilldown pie.
+ */
+ public static class DrilldownPie extends CustomChart {
+
+ private final Callable<Map<String, Map<String, Integer>>> callable;
+
+ /**
+ * Class constructor.
+ *
+ * @param chartId The id of the chart.
+ * @param callable The callable which is used to request the chart data.
+ */
+ public DrilldownPie(String chartId, Callable<Map<String, Map<String, Integer>>> callable) {
+ super(chartId);
+ this.callable = callable;
+ }
+
+ @Override
+ public JsonObject getChartData() throws Exception {
+ JsonObject data = new JsonObject();
+ JsonObject values = new JsonObject();
+ Map<String, Map<String, Integer>> map = callable.call();
+ if (map == null || map.isEmpty()) {
+ // Null = skip the chart
+ return null;
+ }
+ boolean reallyAllSkipped = true;
+ for (Map.Entry<String, Map<String, Integer>> entryValues : map.entrySet()) {
+ JsonObject value = new JsonObject();
+ boolean allSkipped = true;
+ for (Map.Entry<String, Integer> valueEntry : map.get(entryValues.getKey()).entrySet()) {
+ value.addProperty(valueEntry.getKey(), valueEntry.getValue());
+ allSkipped = false;
+ }
+ if (!allSkipped) {
+ reallyAllSkipped = false;
+ values.add(entryValues.getKey(), value);
+ }
+ }
+ if (reallyAllSkipped) {
+ // Null = skip the chart
+ return null;
+ }
+ data.add("values", values);
+ return data;
+ }
+ }
+
+ /**
+ * Represents a custom single line chart.
+ */
+ public static class SingleLineChart extends CustomChart {
+
+ private final Callable<Integer> callable;
+
+ /**
+ * Class constructor.
+ *
+ * @param chartId The id of the chart.
+ * @param callable The callable which is used to request the chart data.
+ */
+ public SingleLineChart(String chartId, Callable<Integer> callable) {
+ super(chartId);
+ this.callable = callable;
+ }
+
+ @Override
+ protected JsonObject getChartData() throws Exception {
+ JsonObject data = new JsonObject();
+ int value = callable.call();
+ if (value == 0) {
+ // Null = skip the chart
+ return null;
+ }
+ data.addProperty("value", value);
+ return data;
+ }
+
+ }
+
+ /**
+ * Represents a custom multi line chart.
+ */
+ public static class MultiLineChart extends CustomChart {
+
+ private final Callable<Map<String, Integer>> callable;
+
+ /**
+ * Class constructor.
+ *
+ * @param chartId The id of the chart.
+ * @param callable The callable which is used to request the chart data.
+ */
+ public MultiLineChart(String chartId, Callable<Map<String, Integer>> callable) {
+ super(chartId);
+ this.callable = callable;
+ }
+
+ @Override
+ protected JsonObject getChartData() throws Exception {
+ JsonObject data = new JsonObject();
+ JsonObject values = new JsonObject();
+ Map<String, Integer> map = callable.call();
+ if (map == null || map.isEmpty()) {
+ // Null = skip the chart
+ return null;
+ }
+ boolean allSkipped = true;
+ for (Map.Entry<String, Integer> entry : map.entrySet()) {
+ if (entry.getValue() == 0) {
+ continue; // Skip this invalid
+ }
+ allSkipped = false;
+ values.addProperty(entry.getKey(), entry.getValue());
+ }
+ if (allSkipped) {
+ // Null = skip the chart
+ return null;
+ }
+ data.add("values", values);
+ return data;
+ }
+
+ }
+
+ /**
+ * Represents a custom simple bar chart.
+ */
+ public static class SimpleBarChart extends CustomChart {
+
+ private final Callable<Map<String, Integer>> callable;
+
+ /**
+ * Class constructor.
+ *
+ * @param chartId The id of the chart.
+ * @param callable The callable which is used to request the chart data.
+ */
+ public SimpleBarChart(String chartId, Callable<Map<String, Integer>> callable) {
+ super(chartId);
+ this.callable = callable;
+ }
+
+ @Override
+ protected JsonObject getChartData() throws Exception {
+ JsonObject data = new JsonObject();
+ JsonObject values = new JsonObject();
+ Map<String, Integer> map = callable.call();
+ if (map == null || map.isEmpty()) {
+ // Null = skip the chart
+ return null;
+ }
+ for (Map.Entry<String, Integer> entry : map.entrySet()) {
+ JsonArray categoryValues = new JsonArray();
+ categoryValues.add(entry.getValue());
+ values.add(entry.getKey(), categoryValues);
+ }
+ data.add("values", values);
+ return data;
+ }
+
+ }
+
+ /**
+ * Represents a custom advanced bar chart.
+ */
+ public static class AdvancedBarChart extends CustomChart {
+
+ private final Callable<Map<String, int[]>> callable;
+
+ /**
+ * Class constructor.
+ *
+ * @param chartId The id of the chart.
+ * @param callable The callable which is used to request the chart data.
+ */
+ public AdvancedBarChart(String chartId, Callable<Map<String, int[]>> callable) {
+ super(chartId);
+ this.callable = callable;
+ }
+
+ @Override
+ protected JsonObject getChartData() throws Exception {
+ JsonObject data = new JsonObject();
+ JsonObject values = new JsonObject();
+ Map<String, int[]> map = callable.call();
+ if (map == null || map.isEmpty()) {
+ // Null = skip the chart
+ return null;
+ }
+ boolean allSkipped = true;
+ for (Map.Entry<String, int[]> entry : map.entrySet()) {
+ if (entry.getValue().length == 0) {
+ continue; // Skip this invalid
+ }
+ allSkipped = false;
+ JsonArray categoryValues = new JsonArray();
+ for (int categoryValue : entry.getValue()) {
+ categoryValues.add(categoryValue);
+ }
+ values.add(entry.getKey(), categoryValues);
+ }
+ if (allSkipped) {
+ // Null = skip the chart
+ return null;
+ }
+ data.add("values", values);
+ return data;
+ }
+ }
+
+ static class PurpurMetrics {
+ static void startMetrics() {
+ File configFile = new File(new File((File) MinecraftServer.getServer().options.valueOf("plugins"), "bStats"), "config.yml");
+ YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile);
+ if (!config.isSet("serverUuid")) {
+ config.addDefault("enabled", true);
+ config.addDefault("serverUuid", UUID.randomUUID().toString());
+ config.addDefault("logFailedRequests", false);
+ config.options().header(
+ "bStats collects some data for plugin authors like how many servers are using their plugins.\n" +
+ "To honor their work, you should not disable it.\n" +
+ "This has nearly no effect on the server performance!\n" +
+ "Check out https://bStats.org/ to learn more :)"
+ ).copyDefaults(true);
+ try {
+ config.save(configFile);
+ } catch (IOException ignored) {
+ }
+ }
+ String serverUUID = config.getString("serverUuid");
+ boolean logFailedRequests = config.getBoolean("logFailedRequests", false);
+ if (config.getBoolean("enabled", true)) {
+ Metrics metrics = new Metrics("Purpur", serverUUID, logFailedRequests, Bukkit.getLogger());
+
+ metrics.addCustomChart(new Metrics.SimplePie("minecraft_version", () -> {
+ String minecraftVersion = Bukkit.getVersion();
+ minecraftVersion = minecraftVersion.substring(minecraftVersion.indexOf("MC: ") + 4, minecraftVersion.length() - 1);
+ return minecraftVersion;
+ }));
+
+ metrics.addCustomChart(new Metrics.SingleLineChart("players", () -> Bukkit.getOnlinePlayers().size()));
+ metrics.addCustomChart(new Metrics.SimplePie("online_mode", () -> Bukkit.getOnlineMode() ? "online" : "offline"));
+ metrics.addCustomChart(new Metrics.SimplePie("purpur_version", () -> (Metrics.class.getPackage().getImplementationVersion() != null) ? Metrics.class.getPackage().getImplementationVersion() : "unknown"));
+
+ metrics.addCustomChart(new Metrics.DrilldownPie("java_version", () -> {
+ Map<String, Map<String, Integer>> map = new HashMap<>();
+ String javaVersion = System.getProperty("java.version");
+ Map<String, Integer> entry = new HashMap<>();
+ entry.put(javaVersion, 1);
+
+ // http://openjdk.java.net/jeps/223
+ // Java decided to change their versioning scheme and in doing so modified the java.version system
+ // property to return $major[.$minor][.$secuity][-ea], as opposed to 1.$major.0_$identifier
+ // we can handle pre-9 by checking if the "major" is equal to "1", otherwise, 9+
+ String majorVersion = javaVersion.split("\\.")[0];
+ String release;
+
+ int indexOf = javaVersion.lastIndexOf('.');
+
+ if (majorVersion.equals("1")) {
+ release = "Java " + javaVersion.substring(0, indexOf);
+ } else {
+ // of course, it really wouldn't be all that simple if they didn't add a quirk, now would it
+ // valid strings for the major may potentially include values such as -ea to deannotate a pre release
+ Matcher versionMatcher = Pattern.compile("\\d+").matcher(majorVersion);
+ if (versionMatcher.find()) {
+ majorVersion = versionMatcher.group(0);
+ }
+ release = "Java " + majorVersion;
+ }
+ map.put(release, entry);
+
+ return map;
+ }));
+ }
+ }
+ }
+}
diff --git a/src/main/java/net/pl3x/purpur/PurpurCommand.java b/src/main/java/net/pl3x/purpur/PurpurCommand.java
new file mode 100644
index 000000000..293ed7da5
@@ -124,10 +762,10 @@ index 000000000..293ed7da5
+}
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
new file mode 100644
index 000000000..2f87a929c
index 000000000..b0f0040a4
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -0,0 +1,127 @@
@@ -0,0 +1,133 @@
+package net.pl3x.purpur;
+
+import com.google.common.base.Throwables;
@@ -163,6 +801,7 @@ index 000000000..2f87a929c
+ static Map<String, Command> commands;
+ private static int version;
+ private static boolean verbose;
+ private static boolean metricsStarted;
+
+ public static void init(File configFile) {
+ CONFIG_FILE = configFile;
@@ -201,6 +840,11 @@ index 000000000..2f87a929c
+ for (Map.Entry<String, Command> entry : commands.entrySet()) {
+ MinecraftServer.getServer().server.getCommandMap().register(entry.getKey(), "Purpur", entry.getValue());
+ }
+
+ if (!metricsStarted) {
+ Metrics.PurpurMetrics.startMetrics();
+ metricsStarted = true;
+ }
+ }
+
+ static void readConfig(Class<?> clazz, Object instance) {
@@ -325,7 +969,7 @@ index 000000000..30f11fe26
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 6dfdc9813..6a9786eb9 100644
index 6dfdc9813..ae290996d 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -793,6 +793,7 @@ public final class CraftServer implements Server {
@@ -344,6 +988,14 @@ index 6dfdc9813..6a9786eb9 100644
}
Plugin[] pluginClone = pluginManager.getPlugins().clone(); // Paper
@@ -827,6 +829,7 @@ public final class CraftServer implements Server {
reloadData();
org.spigotmc.SpigotConfig.registerCommands(); // Spigot
com.destroystokyo.paper.PaperConfig.registerCommands(); // Paper
+ net.pl3x.purpur.PurpurConfig.registerCommands(); // Purpur
overrideAllCommandBlockCommands = commandsConfiguration.getStringList("command-block-overrides").contains("*");
ignoreVanillaPermissions = commandsConfiguration.getBoolean("ignore-vanilla-permissions");
diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
index 405ea5c46..2d60e7588 100644
--- a/src/main/java/org/bukkit/craftbukkit/Main.java

View File

@@ -1,4 +1,4 @@
From 5c6fa6e2f30756c23b1e2998a4978e934fcc9e3a Mon Sep 17 00:00:00 2001
From d81500d5df09102a2ad579f7a97e75b131868bce Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sat, 4 May 2019 01:10:30 -0500
Subject: [PATCH] cows to mooshroom when fed mushrooms
@@ -146,10 +146,10 @@ index d44ea9ec5..84bc1a629 100644
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index 2f87a929c..3a1a6b967 100644
index b0f0040a4..d433eca03 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -124,4 +124,9 @@ public class PurpurConfig {
@@ -130,4 +130,9 @@ public class PurpurConfig {
config.addDefault(path, def);
return config.getString(path, config.getString(path));
}

View File

@@ -1,4 +1,4 @@
From 6f98e087a81f0c88afc5a0d57ffaccfaa69ffc4e Mon Sep 17 00:00:00 2001
From f35349a7b5b61f0bf0f18310d6272b9877ddf1d8 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Fri, 3 May 2019 23:58:44 -0500
Subject: [PATCH] Snowman set pumpkin on/off by player interaction
@@ -53,10 +53,10 @@ index fe1381cc1..1fed1d6e7 100644
return super.a(entityhuman, enumhand);
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index 3a1a6b967..166641278 100644
index d433eca03..7faa0c6ac 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -129,4 +129,11 @@ public class PurpurConfig {
@@ -135,4 +135,11 @@ public class PurpurConfig {
private static void cowsSettings() {
feedMushroomsToCows = getInt("settings.mobs.cow.feed-mushrooms-for-mooshroom", feedMushroomsToCows);
}

View File

@@ -1,4 +1,4 @@
From ec10b4fae72d2d0ad626d5f6a8b8d7638e73d6cc Mon Sep 17 00:00:00 2001
From 902abbbaa4d70696b4632d176da085a41bdb4728 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Tue, 30 Apr 2019 19:17:21 -0500
Subject: [PATCH] Integrate ridables
@@ -4110,10 +4110,10 @@ index a2fc2cd80..8f064526b 100644
return (d0 * d0 >= 0.029999999329447746D || this.b.pitch == 0.0F || Math.abs(this.b.pitch) >= 10.0F || !this.b.isInWater()) && !this.b.onGround;
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index 166641278..1fe54bb16 100644
index 7faa0c6ac..8bf8384a2 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -125,6 +125,11 @@ public class PurpurConfig {
@@ -131,6 +131,11 @@ public class PurpurConfig {
return config.getString(path, config.getString(path));
}
@@ -4125,7 +4125,7 @@ index 166641278..1fe54bb16 100644
public static int feedMushroomsToCows = 5;
private static void cowsSettings() {
feedMushroomsToCows = getInt("settings.mobs.cow.feed-mushrooms-for-mooshroom", feedMushroomsToCows);
@@ -136,4 +141,117 @@ public class PurpurConfig {
@@ -142,4 +147,117 @@ public class PurpurConfig {
snowmanDropsPumpkin = getBoolean("settings.mobs.snow_golem.drops-pumpkin-when-sheared", snowmanDropsPumpkin);
snowmanPumpkinPutBack = getBoolean("settings.mobs.snow_golem.pumpkin-can-be-added-back", snowmanPumpkinPutBack);
}

View File

@@ -1,4 +1,4 @@
From 7d7ad4d46769d70175c9b069b31524b787683cf0 Mon Sep 17 00:00:00 2001
From e769430304cb6645c09200ebfa17f11c8e94d0e7 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sun, 12 May 2019 00:43:12 -0500
Subject: [PATCH] Make giants naturally spawn and have AI
@@ -102,10 +102,10 @@ index b7e2022b1..e69e7a456 100644
}
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index 1fe54bb16..162ab011e 100644
index 8bf8384a2..bb91a4a67 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -135,6 +135,13 @@ public class PurpurConfig {
@@ -141,6 +141,13 @@ public class PurpurConfig {
feedMushroomsToCows = getInt("settings.mobs.cow.feed-mushrooms-for-mooshroom", feedMushroomsToCows);
}

View File

@@ -1,4 +1,4 @@
From 9e356f5a39c2f99c1ed2457c98d15aa535883f9e Mon Sep 17 00:00:00 2001
From cc91c03268f5753eb1f251dffedb615b4c019240 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Wed, 22 May 2019 22:30:08 -0500
Subject: [PATCH] Tick loop config options
@@ -9,7 +9,7 @@ Subject: [PATCH] Tick loop config options
2 files changed, 28 insertions(+), 10 deletions(-)
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 5ec9a980c9..0324a90ca5 100644
index 5ec9a980c..0324a90ca 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -868,16 +868,21 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
@@ -59,10 +59,10 @@ index 5ec9a980c9..0324a90ca5 100644
this.methodProfiler.exit();
this.methodProfiler.b();
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index 162ab011ea..442e37752f 100644
index bb91a4a67..cbb163c0d 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -125,6 +125,13 @@ public class PurpurConfig {
@@ -131,6 +131,13 @@ public class PurpurConfig {
return config.getString(path, config.getString(path));
}

View File

@@ -1,4 +1,4 @@
From 020ef00e027d3e9df7d21966eb2bf34780961a69 Mon Sep 17 00:00:00 2001
From 8dc2ee35820c0782581ad1fb5f17927d63a7ad79 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Thu, 23 May 2019 21:50:37 -0500
Subject: [PATCH] Packed Barrels
@@ -9,7 +9,7 @@ Subject: [PATCH] Packed Barrels
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/main/java/net/minecraft/server/TileEntityBarrel.java b/src/main/java/net/minecraft/server/TileEntityBarrel.java
index 76f298336a..befb47d4dd 100644
index 76f298336..befb47d4d 100644
--- a/src/main/java/net/minecraft/server/TileEntityBarrel.java
+++ b/src/main/java/net/minecraft/server/TileEntityBarrel.java
@@ -56,7 +56,7 @@ public class TileEntityBarrel extends TileEntityLootable {
@@ -39,10 +39,10 @@ index 76f298336a..befb47d4dd 100644
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index 442e37752f..5ebce40027 100644
index cbb163c0d..0b4a0f4b8 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -156,6 +156,11 @@ public class PurpurConfig {
@@ -162,6 +162,11 @@ public class PurpurConfig {
snowmanPumpkinPutBack = getBoolean("settings.mobs.snow_golem.pumpkin-can-be-added-back", snowmanPumpkinPutBack);
}

View File

@@ -1,4 +1,4 @@
From d72e9dd07cc8f5ffe7b34d8fae1c86187c90b661 Mon Sep 17 00:00:00 2001
From c488ed44e41728d9dc7187efbc5d16abfa2235da Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sun, 26 May 2019 15:19:14 -0500
Subject: [PATCH] Bring back server name
@@ -21,10 +21,10 @@ index fb092a941..54c0b4247 100644
public final boolean spawnNpcs = this.getBoolean("spawn-npcs", true);
public final boolean pvp = this.getBoolean("pvp", true);
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 6a9786eb9..182235a92 100644
index ae290996d..875c16688 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -2163,4 +2163,11 @@ public final class CraftServer implements Server {
@@ -2164,4 +2164,11 @@ public final class CraftServer implements Server {
return new com.destroystokyo.paper.profile.CraftPlayerProfile(uuid, name);
}
// Paper end

View File

@@ -1,4 +1,4 @@
From 56241bb04ea8cb1494e462fc42f11515301913d4 Mon Sep 17 00:00:00 2001
From 00ac20d89cee1272dafa6fdf3fae0ea034e93d6f Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sat, 1 Jun 2019 01:16:35 -0500
Subject: [PATCH] Always place dragon egg when dragon is killed
@@ -9,7 +9,7 @@ Subject: [PATCH] Always place dragon egg when dragon is killed
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/main/java/net/minecraft/server/EnderDragonBattle.java b/src/main/java/net/minecraft/server/EnderDragonBattle.java
index 6700c8c658..f0c77eb6c1 100644
index 6700c8c65..f0c77eb6c 100644
--- a/src/main/java/net/minecraft/server/EnderDragonBattle.java
+++ b/src/main/java/net/minecraft/server/EnderDragonBattle.java
@@ -13,6 +13,8 @@ import java.util.Set;
@@ -31,10 +31,10 @@ index 6700c8c658..f0c77eb6c1 100644
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index 5ebce40027..5e066f7253 100644
index 0b4a0f4b8..48c8da91e 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -161,6 +161,11 @@ public class PurpurConfig {
@@ -167,6 +167,11 @@ public class PurpurConfig {
packedBarrels = getBoolean("settings.packed-barrels", packedBarrels);
}

View File

@@ -1,4 +1,4 @@
From e364713b50306d38da22b851676b656a5057a8be Mon Sep 17 00:00:00 2001
From 7d030363a5743c15c3e5dd3f9fed242f1607e0bb Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sat, 15 Jun 2019 03:12:15 -0500
Subject: [PATCH] Make Iron Golems Swim
@@ -9,7 +9,7 @@ Subject: [PATCH] Make Iron Golems Swim
2 files changed, 6 insertions(+)
diff --git a/src/main/java/net/minecraft/server/EntityIronGolem.java b/src/main/java/net/minecraft/server/EntityIronGolem.java
index fd6a926cae..fd7972289c 100644
index fd6a926ca..fd7972289 100644
--- a/src/main/java/net/minecraft/server/EntityIronGolem.java
+++ b/src/main/java/net/minecraft/server/EntityIronGolem.java
@@ -14,6 +14,7 @@ public class EntityIronGolem extends EntityGolem {
@@ -21,10 +21,10 @@ index fd6a926cae..fd7972289c 100644
this.goalSelector.a(2, new PathfinderGoalMoveTowardsTarget(this, 0.9D, 32.0F));
this.goalSelector.a(2, new PathfinderGoalStrollVillage(this, 0.6D));
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index 5e066f7253..703fbab6e6 100644
index 48c8da91e..ad373d20c 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -149,6 +149,11 @@ public class PurpurConfig {
@@ -155,6 +155,11 @@ public class PurpurConfig {
giantsHaveAI = getBoolean("settings.mobs.giant.have-ai", giantsHaveAI);
}

View File

@@ -1,4 +1,4 @@
From 8d3470ef8929a26859c9cdc01999b1a411006bd2 Mon Sep 17 00:00:00 2001
From 1d912562ca7ded8150831918d533b2b0d83878cd Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Thu, 20 Jun 2019 18:48:58 -0500
Subject: [PATCH] Phantoms spawn naturally in the end
@@ -28,7 +28,7 @@ index 6592d1529..67cb1520b 100644
}
}
diff --git a/src/main/java/net/minecraft/server/EntityPhantom.java b/src/main/java/net/minecraft/server/EntityPhantom.java
index 7f414aee9..924358157 100644
index 008f5c6fa..149c64b44 100644
--- a/src/main/java/net/minecraft/server/EntityPhantom.java
+++ b/src/main/java/net/minecraft/server/EntityPhantom.java
@@ -25,6 +25,12 @@ public class EntityPhantom extends EntityFlying implements IMonster {
@@ -71,10 +71,10 @@ index b442e09eb..3e16cb2bc 100644
EntityPositionTypes.Surface entitypositiontypes_surface = EntityPositionTypes.a(entitytypes);
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index 703fbab6e..542ac964a 100644
index ad373d20c..233805175 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -154,6 +154,11 @@ public class PurpurConfig {
@@ -160,6 +160,11 @@ public class PurpurConfig {
ironGolemSwims = getBoolean("settings.mobs.iron_golem.swims", ironGolemSwims);
}

View File

@@ -1,4 +1,4 @@
From bee972ac008843d0bb783f1f0a73c0112074dbe9 Mon Sep 17 00:00:00 2001
From edf6ac3246ffab78012b980495f40f203a84d5c7 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sun, 23 Jun 2019 17:01:26 -0500
Subject: [PATCH] Add large sized ender chests
@@ -10,7 +10,7 @@ Subject: [PATCH] Add large sized ender chests
3 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/main/java/net/minecraft/server/BlockEnderChest.java b/src/main/java/net/minecraft/server/BlockEnderChest.java
index 4b72902385..fc52276836 100644
index 4b7290238..fc5227683 100644
--- a/src/main/java/net/minecraft/server/BlockEnderChest.java
+++ b/src/main/java/net/minecraft/server/BlockEnderChest.java
@@ -46,6 +46,7 @@ public class BlockEnderChest extends BlockTileEntity implements IBlockWaterlogge
@@ -22,7 +22,7 @@ index 4b72902385..fc52276836 100644
}, BlockEnderChest.d));
entityhuman.a(StatisticList.OPEN_ENDERCHEST);
diff --git a/src/main/java/net/minecraft/server/InventoryEnderChest.java b/src/main/java/net/minecraft/server/InventoryEnderChest.java
index fd31b9a6dc..49b369236d 100644
index fd31b9a6d..49b369236 100644
--- a/src/main/java/net/minecraft/server/InventoryEnderChest.java
+++ b/src/main/java/net/minecraft/server/InventoryEnderChest.java
@@ -20,7 +20,7 @@ public class InventoryEnderChest extends InventorySubcontainer {
@@ -35,10 +35,10 @@ index fd31b9a6dc..49b369236d 100644
// CraftBukkit end
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index 542ac964a8..448d21d9e1 100644
index 233805175..a86b3fc9c 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -166,6 +166,11 @@ public class PurpurConfig {
@@ -172,6 +172,11 @@ public class PurpurConfig {
snowmanPumpkinPutBack = getBoolean("settings.mobs.snow_golem.pumpkin-can-be-added-back", snowmanPumpkinPutBack);
}

View File

@@ -1,4 +1,4 @@
From de829105f192e14335e96997d068ec083916f599 Mon Sep 17 00:00:00 2001
From ad2037fa2e77e678c33d9b5ae04401be4fe5559a Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sat, 29 Jun 2019 02:32:40 -0500
Subject: [PATCH] Controllable Minecarts
@@ -111,7 +111,7 @@ index 764427456..456eced16 100644
}
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index 448d21d9e..8f5316941 100644
index a86b3fc9c..99c13caee 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -1,9 +1,13 @@
@@ -128,7 +128,7 @@ index 448d21d9e..8f5316941 100644
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
@@ -293,4 +297,30 @@ public class PurpurConfig {
@@ -299,4 +303,30 @@ public class PurpurConfig {
ridableZombiePigman = getBoolean("settings.ridable.zombie_pigman", ridableZombiePigman);
ridableZombieVillager = getBoolean("settings.ridable.zombie_villager", ridableZombieVillager);
}

View File

@@ -1,4 +1,4 @@
From 506787fba7dcb7fa1f77a9492d8649df5f7f9f50 Mon Sep 17 00:00:00 2001
From 87e1f98c33d608083081aee10c11fcbb2d714d00 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Wed, 3 Jul 2019 23:58:31 -0500
Subject: [PATCH] Disable loot drops on death by cramming
@@ -9,7 +9,7 @@ Subject: [PATCH] Disable loot drops on death by cramming
2 files changed, 7 insertions(+)
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
index 1704609a7..54b81110b 100644
index 53cf6fc39..c00918a7a 100644
--- a/src/main/java/net/minecraft/server/EntityLiving.java
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
@@ -1420,8 +1420,10 @@ public abstract class EntityLiving extends Entity {
@@ -24,10 +24,10 @@ index 1704609a7..54b81110b 100644
deathEvent = CraftEventFactory.callEntityDeathEvent(this, this.drops); // Paper
if (!deathEvent.isCancelled()) this.drops = new ArrayList<org.bukkit.inventory.ItemStack>(); // Paper
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index 0d378830e..a6f90105f 100644
index 99c13caee..f7c63ef91 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -136,6 +136,11 @@ public class PurpurConfig {
@@ -142,6 +142,11 @@ public class PurpurConfig {
enableTPSCatchup = getBoolean("settings.enable-tps-catchup", enableTPSCatchup);
}

View File

@@ -1,4 +1,4 @@
From de0894c8d4724da12f1af6da50757e75a815487f Mon Sep 17 00:00:00 2001
From 6a6aa821f7e6fb1d2ae2b46ca3ce0c64dce1f489 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Fri, 5 Jul 2019 11:09:25 -0500
Subject: [PATCH] Make illusioners naturally spawn
@@ -38,10 +38,10 @@ index 3f7f7a2de..38284a62b 100644
private static void addSpawn(String biome, EnumCreatureType ct, EntityTypes et, int weight, int min_group, int max_group) {
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index a6f90105f..b4f8cca53 100644
index f7c63ef91..bbec3faaa 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -158,6 +158,11 @@ public class PurpurConfig {
@@ -164,6 +164,11 @@ public class PurpurConfig {
giantsHaveAI = getBoolean("settings.mobs.giant.have-ai", giantsHaveAI);
}

View File

@@ -1,4 +1,4 @@
From f3cdef46566d4a050797c9032b9e077fed7b993e Mon Sep 17 00:00:00 2001
From 5e072a93830368611f80eac1cb8a681596c1e378 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sat, 6 Jul 2019 17:00:04 -0500
Subject: [PATCH] Dont send useless entity packets
@@ -66,10 +66,10 @@ index 1a9802e75..4c5a52c80 100644
protected boolean h;
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index b4f8cca53..c0ae6accd 100644
index bbec3faaa..c60f00a55 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -141,6 +141,11 @@ public class PurpurConfig {
@@ -147,6 +147,11 @@ public class PurpurConfig {
disableDropsOnCrammingDeath = getBoolean("settings.disable-drops-on-cramming-death", disableDropsOnCrammingDeath);
}

View File

@@ -1,4 +1,4 @@
From a6ddcee433c98172297a637065c877177be2105d Mon Sep 17 00:00:00 2001
From 15774d3db02243b018c5f30667d24054caa08c27 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sat, 6 Jul 2019 21:12:58 -0500
Subject: [PATCH] Fix item position desync (MC-4)
@@ -44,10 +44,10 @@ index 4c5a52c80..9ec3495d5 100644
return (new Vec3D((double) i, (double) j, (double) k)).a(2.44140625E-4D);
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index c0ae6accd..c0f02edce 100644
index c60f00a55..8001ecaab 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -146,6 +146,11 @@ public class PurpurConfig {
@@ -152,6 +152,11 @@ public class PurpurConfig {
dontSendUselessEntityPackets = getBoolean("settings.dont-send-useless-entity-packets", dontSendUselessEntityPackets);
}