Revert "Remove metrics now to avoid issues later on. TODO: Make own metrics."
This reverts commit 00dea91d64
.
Dieser Commit ist enthalten in:
Ursprung
00dea91d64
Commit
941af38ac7
692
CraftBukkit-Patches/0022-Metrics.patch
Normale Datei
692
CraftBukkit-Patches/0022-Metrics.patch
Normale Datei
@ -0,0 +1,692 @@
|
||||
From 9b4f7770cae78ac23e89a6cb92bfcdac3517da6c Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Sat, 23 Feb 2013 08:58:35 +1100
|
||||
Subject: [PATCH] Metrics
|
||||
|
||||
|
||||
diff --git a/src/main/java/org/spigotmc/Metrics.java b/src/main/java/org/spigotmc/Metrics.java
|
||||
new file mode 100644
|
||||
index 0000000..f1690a2
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/org/spigotmc/Metrics.java
|
||||
@@ -0,0 +1,645 @@
|
||||
+/*
|
||||
+ * Copyright 2011-2013 Tyler Blair. All rights reserved.
|
||||
+ *
|
||||
+ * Redistribution and use in source and binary forms, with or without modification, are
|
||||
+ * permitted provided that the following conditions are met:
|
||||
+ *
|
||||
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
+ * conditions and the following disclaimer.
|
||||
+ *
|
||||
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
+ * of conditions and the following disclaimer in the documentation and/or other materials
|
||||
+ * provided with the distribution.
|
||||
+ *
|
||||
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR
|
||||
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
+ *
|
||||
+ * The views and conclusions contained in the software and documentation are those of the
|
||||
+ * authors and contributors and should not be interpreted as representing official policies,
|
||||
+ * either expressed or implied, of anybody else.
|
||||
+ */
|
||||
+package org.spigotmc;
|
||||
+
|
||||
+import org.bukkit.Bukkit;
|
||||
+import org.bukkit.configuration.file.YamlConfiguration;
|
||||
+import org.bukkit.configuration.InvalidConfigurationException;
|
||||
+import org.bukkit.plugin.Plugin;
|
||||
+import org.bukkit.plugin.PluginDescriptionFile;
|
||||
+import org.bukkit.scheduler.BukkitTask;
|
||||
+
|
||||
+import java.io.BufferedReader;
|
||||
+import java.io.File;
|
||||
+import java.io.IOException;
|
||||
+import java.io.InputStreamReader;
|
||||
+import java.io.OutputStreamWriter;
|
||||
+import java.io.UnsupportedEncodingException;
|
||||
+import java.net.Proxy;
|
||||
+import java.net.URL;
|
||||
+import java.net.URLConnection;
|
||||
+import java.net.URLEncoder;
|
||||
+import java.util.Collections;
|
||||
+import java.util.HashSet;
|
||||
+import java.util.Iterator;
|
||||
+import java.util.LinkedHashSet;
|
||||
+import java.util.Set;
|
||||
+import java.util.Timer;
|
||||
+import java.util.TimerTask;
|
||||
+import java.util.UUID;
|
||||
+import java.util.concurrent.TimeUnit;
|
||||
+import java.util.logging.Level;
|
||||
+import net.minecraft.server.MinecraftServer;
|
||||
+
|
||||
+/**
|
||||
+ * <p> The metrics class obtains data about a plugin and submits statistics about it to the metrics backend. </p> <p>
|
||||
+ * Public methods provided by this class: </p>
|
||||
+ * <code>
|
||||
+ * Graph createGraph(String name); <br/>
|
||||
+ * void addCustomData(BukkitMetrics.Plotter plotter); <br/>
|
||||
+ * void start(); <br/>
|
||||
+ * </code>
|
||||
+ */
|
||||
+public class Metrics {
|
||||
+
|
||||
+ /**
|
||||
+ * The current revision number
|
||||
+ */
|
||||
+ private final static int REVISION = 6;
|
||||
+ /**
|
||||
+ * The base url of the metrics domain
|
||||
+ */
|
||||
+ private static final String BASE_URL = "http://mcstats.org";
|
||||
+ /**
|
||||
+ * The url used to report a server's status
|
||||
+ */
|
||||
+ private static final String REPORT_URL = "/report/%s";
|
||||
+ /**
|
||||
+ * The separator to use for custom data. This MUST NOT change unless you are hosting your own version of metrics and
|
||||
+ * want to change it.
|
||||
+ */
|
||||
+ private static final String CUSTOM_DATA_SEPARATOR = "~~";
|
||||
+ /**
|
||||
+ * Interval of time to ping (in minutes)
|
||||
+ */
|
||||
+ private static final int PING_INTERVAL = 10;
|
||||
+ /**
|
||||
+ * All of the custom graphs to submit to metrics
|
||||
+ */
|
||||
+ private final Set<Graph> graphs = Collections.synchronizedSet(new HashSet<Graph>());
|
||||
+ /**
|
||||
+ * The default graph, used for addCustomData when you don't want a specific graph
|
||||
+ */
|
||||
+ private final Graph defaultGraph = new Graph("Default");
|
||||
+ /**
|
||||
+ * The plugin configuration file
|
||||
+ */
|
||||
+ private final YamlConfiguration configuration;
|
||||
+ /**
|
||||
+ * The plugin configuration file
|
||||
+ */
|
||||
+ private final File configurationFile;
|
||||
+ /**
|
||||
+ * Unique server id
|
||||
+ */
|
||||
+ private final String guid;
|
||||
+ /**
|
||||
+ * Debug mode
|
||||
+ */
|
||||
+ private final boolean debug;
|
||||
+ /**
|
||||
+ * Lock for synchronization
|
||||
+ */
|
||||
+ private final Object optOutLock = new Object();
|
||||
+ /**
|
||||
+ * The scheduled task
|
||||
+ */
|
||||
+ private volatile Timer task = null;
|
||||
+
|
||||
+ public Metrics() throws IOException {
|
||||
+ // load the config
|
||||
+ configurationFile = getConfigFile();
|
||||
+ configuration = YamlConfiguration.loadConfiguration(configurationFile);
|
||||
+
|
||||
+ // add some defaults
|
||||
+ configuration.addDefault("opt-out", false);
|
||||
+ configuration.addDefault("guid", UUID.randomUUID().toString());
|
||||
+ configuration.addDefault("debug", false);
|
||||
+
|
||||
+ // Do we need to create the file?
|
||||
+ if (configuration.get("guid", null) == null) {
|
||||
+ configuration.options().header("http://mcstats.org").copyDefaults(true);
|
||||
+ configuration.save(configurationFile);
|
||||
+ }
|
||||
+
|
||||
+ // Load the guid then
|
||||
+ guid = configuration.getString("guid");
|
||||
+ debug = configuration.getBoolean("debug", false);
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Construct and create a Graph that can be used to separate specific plotters to their own graphs on the metrics
|
||||
+ * website. Plotters can be added to the graph object returned.
|
||||
+ *
|
||||
+ * @param name The name of the graph
|
||||
+ * @return Graph object created. Will never return NULL under normal circumstances unless bad parameters are given
|
||||
+ */
|
||||
+ public Graph createGraph(final String name) {
|
||||
+ if (name == null) {
|
||||
+ throw new IllegalArgumentException("Graph name cannot be null");
|
||||
+ }
|
||||
+
|
||||
+ // Construct the graph object
|
||||
+ final Graph graph = new Graph(name);
|
||||
+
|
||||
+ // Now we can add our graph
|
||||
+ graphs.add(graph);
|
||||
+
|
||||
+ // and return back
|
||||
+ return graph;
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Add a Graph object to BukkitMetrics that represents data for the plugin that should be sent to the backend
|
||||
+ *
|
||||
+ * @param graph The name of the graph
|
||||
+ */
|
||||
+ public void addGraph(final Graph graph) {
|
||||
+ if (graph == null) {
|
||||
+ throw new IllegalArgumentException("Graph cannot be null");
|
||||
+ }
|
||||
+
|
||||
+ graphs.add(graph);
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Adds a custom data plotter to the default graph
|
||||
+ *
|
||||
+ * @param plotter The plotter to use to plot custom data
|
||||
+ */
|
||||
+ public void addCustomData(final Plotter plotter) {
|
||||
+ if (plotter == null) {
|
||||
+ throw new IllegalArgumentException("Plotter cannot be null");
|
||||
+ }
|
||||
+
|
||||
+ // Add the plotter to the graph o/
|
||||
+ defaultGraph.addPlotter(plotter);
|
||||
+
|
||||
+ // Ensure the default graph is included in the submitted graphs
|
||||
+ graphs.add(defaultGraph);
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Start measuring statistics. This will immediately create an async repeating task as the plugin and send the
|
||||
+ * initial data to the metrics backend, and then after that it will post in increments of PING_INTERVAL * 1200
|
||||
+ * ticks.
|
||||
+ *
|
||||
+ * @return True if statistics measuring is running, otherwise false.
|
||||
+ */
|
||||
+ public boolean start() {
|
||||
+ synchronized (optOutLock) {
|
||||
+ // Did we opt out?
|
||||
+ if (isOptOut()) {
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ // Is metrics already running?
|
||||
+ if (task != null) {
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ // Begin hitting the server with glorious data
|
||||
+ task = new Timer("Spigot Metrics Thread", true);
|
||||
+
|
||||
+ task.scheduleAtFixedRate(new TimerTask() {
|
||||
+ private boolean firstPost = true;
|
||||
+
|
||||
+ public void run() {
|
||||
+ try {
|
||||
+ // This has to be synchronized or it can collide with the disable method.
|
||||
+ synchronized (optOutLock) {
|
||||
+ // Disable Task, if it is running and the server owner decided to opt-out
|
||||
+ if (isOptOut() && task != null) {
|
||||
+ task.cancel();
|
||||
+ task = null;
|
||||
+ // Tell all plotters to stop gathering information.
|
||||
+ for (Graph graph : graphs) {
|
||||
+ graph.onOptOut();
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ // We use the inverse of firstPost because if it is the first time we are posting,
|
||||
+ // it is not a interval ping, so it evaluates to FALSE
|
||||
+ // Each time thereafter it will evaluate to TRUE, i.e PING!
|
||||
+ postPlugin(!firstPost);
|
||||
+
|
||||
+ // After the first post we set firstPost to false
|
||||
+ // Each post thereafter will be a ping
|
||||
+ firstPost = false;
|
||||
+ } catch (IOException e) {
|
||||
+ if (debug) {
|
||||
+ Bukkit.getLogger().log(Level.INFO, "[Metrics] " + e.getMessage());
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }, 0, TimeUnit.MINUTES.toMillis(PING_INTERVAL));
|
||||
+
|
||||
+ return true;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Has the server owner denied plugin metrics?
|
||||
+ *
|
||||
+ * @return true if metrics should be opted out of it
|
||||
+ */
|
||||
+ public boolean isOptOut() {
|
||||
+ synchronized (optOutLock) {
|
||||
+ try {
|
||||
+ // Reload the metrics file
|
||||
+ configuration.load(getConfigFile());
|
||||
+ } catch (IOException ex) {
|
||||
+ if (debug) {
|
||||
+ Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage());
|
||||
+ }
|
||||
+ return true;
|
||||
+ } catch (InvalidConfigurationException ex) {
|
||||
+ if (debug) {
|
||||
+ Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage());
|
||||
+ }
|
||||
+ return true;
|
||||
+ }
|
||||
+ return configuration.getBoolean("opt-out", false);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Enables metrics for the server by setting "opt-out" to false in the config file and starting the metrics task.
|
||||
+ *
|
||||
+ * @throws java.io.IOException
|
||||
+ */
|
||||
+ public void enable() throws IOException {
|
||||
+ // This has to be synchronized or it can collide with the check in the task.
|
||||
+ synchronized (optOutLock) {
|
||||
+ // Check if the server owner has already set opt-out, if not, set it.
|
||||
+ if (isOptOut()) {
|
||||
+ configuration.set("opt-out", false);
|
||||
+ configuration.save(configurationFile);
|
||||
+ }
|
||||
+
|
||||
+ // Enable Task, if it is not running
|
||||
+ if (task == null) {
|
||||
+ start();
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Disables metrics for the server by setting "opt-out" to true in the config file and canceling the metrics task.
|
||||
+ *
|
||||
+ * @throws java.io.IOException
|
||||
+ */
|
||||
+ public void disable() throws IOException {
|
||||
+ // This has to be synchronized or it can collide with the check in the task.
|
||||
+ synchronized (optOutLock) {
|
||||
+ // Check if the server owner has already set opt-out, if not, set it.
|
||||
+ if (!isOptOut()) {
|
||||
+ configuration.set("opt-out", true);
|
||||
+ configuration.save(configurationFile);
|
||||
+ }
|
||||
+
|
||||
+ // Disable Task, if it is running
|
||||
+ if (task != null) {
|
||||
+ task.cancel();
|
||||
+ task = null;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Gets the File object of the config file that should be used to store data such as the GUID and opt-out status
|
||||
+ *
|
||||
+ * @return the File object for the config file
|
||||
+ */
|
||||
+ public File getConfigFile() {
|
||||
+ // I believe the easiest way to get the base folder (e.g craftbukkit set via -P) for plugins to use
|
||||
+ // is to abuse the plugin object we already have
|
||||
+ // plugin.getDataFolder() => base/plugins/PluginA/
|
||||
+ // pluginsFolder => base/plugins/
|
||||
+ // The base is not necessarily relative to the startup directory.
|
||||
+ // File pluginsFolder = plugin.getDataFolder().getParentFile();
|
||||
+
|
||||
+ // return => base/plugins/PluginMetrics/config.yml
|
||||
+ return new File(new File((File) MinecraftServer.getServer().options.valueOf("plugins"), "PluginMetrics"), "config.yml");
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Generic method that posts a plugin to the metrics website
|
||||
+ */
|
||||
+ private void postPlugin(final boolean isPing) throws IOException {
|
||||
+ // Server software specific section
|
||||
+ String pluginName = "Spigot";
|
||||
+ boolean onlineMode = Bukkit.getServer().getOnlineMode(); // TRUE if online mode is enabled
|
||||
+ String pluginVersion = (Metrics.class.getPackage().getImplementationVersion() != null) ? Metrics.class.getPackage().getImplementationVersion() : "unknown";
|
||||
+ String serverVersion = Bukkit.getVersion();
|
||||
+ int playersOnline = Bukkit.getServer().getOnlinePlayers().length;
|
||||
+
|
||||
+ // END server software specific section -- all code below does not use any code outside of this class / Java
|
||||
+
|
||||
+ // Construct the post data
|
||||
+ final StringBuilder data = new StringBuilder();
|
||||
+
|
||||
+ // The plugin's description file containg all of the plugin data such as name, version, author, etc
|
||||
+ data.append(encode("guid")).append('=').append(encode(guid));
|
||||
+ encodeDataPair(data, "version", pluginVersion);
|
||||
+ encodeDataPair(data, "server", serverVersion);
|
||||
+ encodeDataPair(data, "players", Integer.toString(playersOnline));
|
||||
+ encodeDataPair(data, "revision", String.valueOf(REVISION));
|
||||
+
|
||||
+ // New data as of R6
|
||||
+ String osname = System.getProperty("os.name");
|
||||
+ String osarch = System.getProperty("os.arch");
|
||||
+ String osversion = System.getProperty("os.version");
|
||||
+ String java_version = System.getProperty("java.version");
|
||||
+ int coreCount = Runtime.getRuntime().availableProcessors();
|
||||
+
|
||||
+ // normalize os arch .. amd64 -> x86_64
|
||||
+ if (osarch.equals("amd64")) {
|
||||
+ osarch = "x86_64";
|
||||
+ }
|
||||
+
|
||||
+ encodeDataPair(data, "osname", osname);
|
||||
+ encodeDataPair(data, "osarch", osarch);
|
||||
+ encodeDataPair(data, "osversion", osversion);
|
||||
+ encodeDataPair(data, "cores", Integer.toString(coreCount));
|
||||
+ encodeDataPair(data, "online-mode", Boolean.toString(onlineMode));
|
||||
+ encodeDataPair(data, "java_version", java_version);
|
||||
+
|
||||
+ // If we're pinging, append it
|
||||
+ if (isPing) {
|
||||
+ encodeDataPair(data, "ping", "true");
|
||||
+ }
|
||||
+
|
||||
+ // Acquire a lock on the graphs, which lets us make the assumption we also lock everything
|
||||
+ // inside of the graph (e.g plotters)
|
||||
+ synchronized (graphs) {
|
||||
+ final Iterator<Graph> iter = graphs.iterator();
|
||||
+
|
||||
+ while (iter.hasNext()) {
|
||||
+ final Graph graph = iter.next();
|
||||
+
|
||||
+ for (Plotter plotter : graph.getPlotters()) {
|
||||
+ // The key name to send to the metrics server
|
||||
+ // The format is C-GRAPHNAME-PLOTTERNAME where separator - is defined at the top
|
||||
+ // Legacy (R4) submitters use the format Custom%s, or CustomPLOTTERNAME
|
||||
+ final String key = String.format("C%s%s%s%s", CUSTOM_DATA_SEPARATOR, graph.getName(), CUSTOM_DATA_SEPARATOR, plotter.getColumnName());
|
||||
+
|
||||
+ // The value to send, which for the foreseeable future is just the string
|
||||
+ // value of plotter.getValue()
|
||||
+ final String value = Integer.toString(plotter.getValue());
|
||||
+
|
||||
+ // Add it to the http post data :)
|
||||
+ encodeDataPair(data, key, value);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ // Create the url
|
||||
+ URL url = new URL(BASE_URL + String.format(REPORT_URL, encode(pluginName)));
|
||||
+
|
||||
+ // Connect to the website
|
||||
+ URLConnection connection;
|
||||
+
|
||||
+ // Mineshafter creates a socks proxy, so we can safely bypass it
|
||||
+ // It does not reroute POST requests so we need to go around it
|
||||
+ if (isMineshafterPresent()) {
|
||||
+ connection = url.openConnection(Proxy.NO_PROXY);
|
||||
+ } else {
|
||||
+ connection = url.openConnection();
|
||||
+ }
|
||||
+
|
||||
+ connection.setDoOutput(true);
|
||||
+
|
||||
+ // Write the data
|
||||
+ final OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
|
||||
+ writer.write(data.toString());
|
||||
+ writer.flush();
|
||||
+
|
||||
+ // Now read the response
|
||||
+ final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
||||
+ final String response = reader.readLine();
|
||||
+
|
||||
+ // close resources
|
||||
+ writer.close();
|
||||
+ reader.close();
|
||||
+
|
||||
+ if (response == null || response.startsWith("ERR")) {
|
||||
+ throw new IOException(response); //Throw the exception
|
||||
+ } else {
|
||||
+ // Is this the first update this hour?
|
||||
+ if (response.contains("OK This is your first update this hour")) {
|
||||
+ synchronized (graphs) {
|
||||
+ final Iterator<Graph> iter = graphs.iterator();
|
||||
+
|
||||
+ while (iter.hasNext()) {
|
||||
+ final Graph graph = iter.next();
|
||||
+
|
||||
+ for (Plotter plotter : graph.getPlotters()) {
|
||||
+ plotter.reset();
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Check if mineshafter is present. If it is, we need to bypass it to send POST requests
|
||||
+ *
|
||||
+ * @return true if mineshafter is installed on the server
|
||||
+ */
|
||||
+ private boolean isMineshafterPresent() {
|
||||
+ try {
|
||||
+ Class.forName("mineshafter.MineServer");
|
||||
+ return true;
|
||||
+ } catch (Exception e) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * <p>Encode a key/value data pair to be used in a HTTP post request. This INCLUDES a & so the first key/value pair
|
||||
+ * MUST be included manually, e.g:</p>
|
||||
+ * <code>
|
||||
+ * StringBuffer data = new StringBuffer();
|
||||
+ * data.append(encode("guid")).append('=').append(encode(guid));
|
||||
+ * encodeDataPair(data, "version", description.getVersion());
|
||||
+ * </code>
|
||||
+ *
|
||||
+ * @param buffer the stringbuilder to append the data pair onto
|
||||
+ * @param key the key value
|
||||
+ * @param value the value
|
||||
+ */
|
||||
+ private static void encodeDataPair(final StringBuilder buffer, final String key, final String value) throws UnsupportedEncodingException {
|
||||
+ buffer.append('&').append(encode(key)).append('=').append(encode(value));
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Encode text as UTF-8
|
||||
+ *
|
||||
+ * @param text the text to encode
|
||||
+ * @return the encoded text, as UTF-8
|
||||
+ */
|
||||
+ private static String encode(final String text) throws UnsupportedEncodingException {
|
||||
+ return URLEncoder.encode(text, "UTF-8");
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Represents a custom graph on the website
|
||||
+ */
|
||||
+ public static class Graph {
|
||||
+
|
||||
+ /**
|
||||
+ * The graph's name, alphanumeric and spaces only :) If it does not comply to the above when submitted, it is
|
||||
+ * rejected
|
||||
+ */
|
||||
+ private final String name;
|
||||
+ /**
|
||||
+ * The set of plotters that are contained within this graph
|
||||
+ */
|
||||
+ private final Set<Plotter> plotters = new LinkedHashSet<Plotter>();
|
||||
+
|
||||
+ private Graph(final String name) {
|
||||
+ this.name = name;
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Gets the graph's name
|
||||
+ *
|
||||
+ * @return the Graph's name
|
||||
+ */
|
||||
+ public String getName() {
|
||||
+ return name;
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Add a plotter to the graph, which will be used to plot entries
|
||||
+ *
|
||||
+ * @param plotter the plotter to add to the graph
|
||||
+ */
|
||||
+ public void addPlotter(final Plotter plotter) {
|
||||
+ plotters.add(plotter);
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Remove a plotter from the graph
|
||||
+ *
|
||||
+ * @param plotter the plotter to remove from the graph
|
||||
+ */
|
||||
+ public void removePlotter(final Plotter plotter) {
|
||||
+ plotters.remove(plotter);
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Gets an <b>unmodifiable</b> set of the plotter objects in the graph
|
||||
+ *
|
||||
+ * @return an unmodifiable {@link java.util.Set} of the plotter objects
|
||||
+ */
|
||||
+ public Set<Plotter> getPlotters() {
|
||||
+ return Collections.unmodifiableSet(plotters);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public int hashCode() {
|
||||
+ return name.hashCode();
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean equals(final Object object) {
|
||||
+ if (!(object instanceof Graph)) {
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ final Graph graph = (Graph) object;
|
||||
+ return graph.name.equals(name);
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Called when the server owner decides to opt-out of BukkitMetrics while the server is running.
|
||||
+ */
|
||||
+ protected void onOptOut() {
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Interface used to collect custom data for a plugin
|
||||
+ */
|
||||
+ public static abstract class Plotter {
|
||||
+
|
||||
+ /**
|
||||
+ * The plot's name
|
||||
+ */
|
||||
+ private final String name;
|
||||
+
|
||||
+ /**
|
||||
+ * Construct a plotter with the default plot name
|
||||
+ */
|
||||
+ public Plotter() {
|
||||
+ this("Default");
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Construct a plotter with a specific plot name
|
||||
+ *
|
||||
+ * @param name the name of the plotter to use, which will show up on the website
|
||||
+ */
|
||||
+ public Plotter(final String name) {
|
||||
+ this.name = name;
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Get the current value for the plotted point. Since this function defers to an external function it may or may
|
||||
+ * not return immediately thus cannot be guaranteed to be thread friendly or safe. This function can be called
|
||||
+ * from any thread so care should be taken when accessing resources that need to be synchronized.
|
||||
+ *
|
||||
+ * @return the current value for the point to be plotted.
|
||||
+ */
|
||||
+ public abstract int getValue();
|
||||
+
|
||||
+ /**
|
||||
+ * Get the column name for the plotted point
|
||||
+ *
|
||||
+ * @return the plotted point's column name
|
||||
+ */
|
||||
+ public String getColumnName() {
|
||||
+ return name;
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Called after the website graphs have been updated
|
||||
+ */
|
||||
+ public void reset() {
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public int hashCode() {
|
||||
+ return getColumnName().hashCode();
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean equals(final Object object) {
|
||||
+ if (!(object instanceof Plotter)) {
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ final Plotter plotter = (Plotter) object;
|
||||
+ return plotter.name.equals(name) && plotter.getValue() == getValue();
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
\ No newline at end of file
|
||||
diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
index f97a80b..b11499b 100644
|
||||
--- a/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
+++ b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
@@ -36,6 +36,7 @@ public class SpigotConfig
|
||||
static int version;
|
||||
static Map<String, Command> commands;
|
||||
/*========================================================================*/
|
||||
+ private static Metrics metrics;
|
||||
|
||||
public static void init()
|
||||
{
|
||||
@@ -56,6 +57,18 @@ public class SpigotConfig
|
||||
{
|
||||
MinecraftServer.getServer().server.getCommandMap().register( entry.getKey(), "Spigot", entry.getValue() );
|
||||
}
|
||||
+
|
||||
+ if ( metrics == null )
|
||||
+ {
|
||||
+ try
|
||||
+ {
|
||||
+ metrics = new Metrics();
|
||||
+ metrics.start();
|
||||
+ } catch ( IOException ex )
|
||||
+ {
|
||||
+ Bukkit.getServer().getLogger().log( Level.SEVERE, "Could not start metrics service", ex );
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
static void readConfig(Class<?> clazz, Object instance)
|
||||
--
|
||||
1.8.1.2
|
||||
|
@ -1,11 +1,11 @@
|
||||
From 85747b37e553c92f3ca9c954b5e5ea299e1dbdeb Mon Sep 17 00:00:00 2001
|
||||
From 3cd709b7763070249f9d6c8c7c805a227de91696 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Sat, 23 Feb 2013 12:33:20 +1100
|
||||
Subject: [PATCH] Watchdog Thread.
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
index dec46bd..aeac6e9 100644
|
||||
index fba219f..e5b8391 100644
|
||||
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
@@ -415,6 +415,7 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo
|
||||
@ -142,10 +142,10 @@ index 0000000..c8125c2
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
index 693518d..01daf6d 100644
|
||||
index 8ef108d..8499c7f 100644
|
||||
--- a/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
+++ b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
@@ -129,4 +129,16 @@ public class SpigotConfig
|
||||
@@ -142,4 +142,16 @@ public class SpigotConfig
|
||||
{
|
||||
commands.put( "tps", new TicksPerSecondCommand( "tps" ) );
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
From 3e9c07b33591057a144c397cf6ae7846ee661fcc Mon Sep 17 00:00:00 2001
|
||||
From d4c1e16d482be2abb1bf40a1afeb6f958fca4b84 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Tue, 2 Jul 2013 09:06:29 +1000
|
||||
Subject: [PATCH] Netty
|
||||
@ -160,7 +160,7 @@ index 2a96168..6ffc927 100644
|
||||
this.b = true;
|
||||
} catch (Exception exception) {
|
||||
diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
index 01daf6d..d3e99eb 100644
|
||||
index 8499c7f..e5a09b3 100644
|
||||
--- a/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
+++ b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
@@ -6,6 +6,8 @@ import java.io.IOException;
|
||||
@ -172,7 +172,7 @@ index 01daf6d..d3e99eb 100644
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -141,4 +143,62 @@ public class SpigotConfig
|
||||
@@ -154,4 +156,62 @@ public class SpigotConfig
|
||||
commands.put( "restart", new RestartCommand( "restart" ) );
|
||||
WatchdogThread.doStart( timeoutTime, restartOnCrash );
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
From f5b77aef74fa67ef756b0e895e542cc7c4662b73 Mon Sep 17 00:00:00 2001
|
||||
From b9aa8fd32c77972fef5c23f0bae3cee24e821e2c Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Mon, 4 Mar 2013 18:45:52 +1100
|
||||
Subject: [PATCH] PlayerItemDamageEvent
|
@ -1,4 +1,4 @@
|
||||
From 23395a04973bd00cd9382f03c36eda33e7fd4019 Mon Sep 17 00:00:00 2001
|
||||
From 7037c64aaf24c9f00e85103e34312652e09cb091 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Sun, 17 Mar 2013 19:02:50 +1100
|
||||
Subject: [PATCH] Faster UUID for entities
|
||||
@ -6,7 +6,7 @@ Subject: [PATCH] Faster UUID for entities
|
||||
It is overkill to create a new SecureRandom on each entity create and then use it to make a new Entity ID for every entity instance created. Instead we will just use a pseudo random UUID based off the random instance we already have.
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
|
||||
index 4183297..852dfd3 100644
|
||||
index 4a769ed..d4bd4ed 100644
|
||||
--- a/src/main/java/net/minecraft/server/Entity.java
|
||||
+++ b/src/main/java/net/minecraft/server/Entity.java
|
||||
@@ -132,7 +132,7 @@ public abstract class Entity {
|
@ -1,4 +1,4 @@
|
||||
From 3eabd77133ecb78f4f5bb6246acfb147f47bd4f6 Mon Sep 17 00:00:00 2001
|
||||
From 958dd4fae14a9cb51416e08d6a30f658a62265d2 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Mon, 18 Mar 2013 20:01:44 +1100
|
||||
Subject: [PATCH] Prevent NPE in CraftSign
|
@ -1,4 +1,4 @@
|
||||
From 8408828d617feff163f5f340c0c1d6a4850145db Mon Sep 17 00:00:00 2001
|
||||
From f60e231ba77aaf5929d124c1d1e67e3d5d2329a7 Mon Sep 17 00:00:00 2001
|
||||
From: Aikar <aikar@aikar.co>
|
||||
Date: Wed, 20 Feb 2013 11:58:47 -0500
|
||||
Subject: [PATCH] Entity Tracking Ranges
|
||||
@ -12,7 +12,7 @@ This has multiple benefits:
|
||||
4) Less client lag - Not trying to render distant item frames and paintings and entities will reduce entity count on the client, which is major for shop/town worlds which may use tons of item frames.
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/EntityTracker.java b/src/main/java/net/minecraft/server/EntityTracker.java
|
||||
index ebbef6a..e833454 100644
|
||||
index 7f23f71..7bb153c 100644
|
||||
--- a/src/main/java/net/minecraft/server/EntityTracker.java
|
||||
+++ b/src/main/java/net/minecraft/server/EntityTracker.java
|
||||
@@ -88,6 +88,7 @@ public class EntityTracker {
|
@ -1,4 +1,4 @@
|
||||
From c0dda8d1d5bd1dc0f9b9009213437584c1717cd9 Mon Sep 17 00:00:00 2001
|
||||
From 79f9e280ee27db93df6aa9911cd3fa09f9e93c0b Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Sat, 23 Mar 2013 11:15:11 +1100
|
||||
Subject: [PATCH] BungeeCord Support
|
||||
@ -75,7 +75,7 @@ index 20be022..e242f7d 100644
|
||||
|
||||
public Player.Spigot spigot()
|
||||
diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
index d3e99eb..eaf1b91 100644
|
||||
index e5a09b3..a598954 100644
|
||||
--- a/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
+++ b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
@@ -7,6 +7,7 @@ import java.lang.reflect.InvocationTargetException;
|
||||
@ -86,7 +86,7 @@ index d3e99eb..eaf1b91 100644
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@@ -201,4 +202,14 @@ public class SpigotConfig
|
||||
@@ -214,4 +215,14 @@ public class SpigotConfig
|
||||
|
||||
nettyThreads = getInt( "settings.netty-threads", 3 );
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
From 33a6525ac1ebb91432bf78ffb080c5cd0e4e3b8e Mon Sep 17 00:00:00 2001
|
||||
From fd8e7a05c6826d07b7f98b8c2e7eba5d2dbbb935 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Sat, 23 Mar 2013 19:08:41 +1100
|
||||
Subject: [PATCH] Limit Custom Map Rendering
|
@ -1,4 +1,4 @@
|
||||
From 28b133a39fb446af8473153da5f1216266c49af7 Mon Sep 17 00:00:00 2001
|
||||
From 28a5c1180a8392cb0c4b5686cee3e605311beb35 Mon Sep 17 00:00:00 2001
|
||||
From: Aikar <aikar@aikar.co>
|
||||
Date: Sun, 24 Feb 2013 20:45:20 +1100
|
||||
Subject: [PATCH] Enable Improved Ping Sending
|
@ -1,4 +1,4 @@
|
||||
From 57f5dde7b29dcadacb2644c674597db06a5fe8e7 Mon Sep 17 00:00:00 2001
|
||||
From af158b963d4d6ed7fd45b5dd918ce3364ec07f7c Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Thu, 25 Jul 2013 17:06:02 +1000
|
||||
Subject: [PATCH] Filter Invalid Names
|
@ -1,4 +1,4 @@
|
||||
From bedcd995c35ffe467ae207b4bbb67e34d5bbe2b8 Mon Sep 17 00:00:00 2001
|
||||
From a621a7f48c384ee6ec697abe87822fd4ad4bd6c5 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Tue, 23 Apr 2013 11:50:27 +1000
|
||||
Subject: [PATCH] Thread Naming and Tweaks
|
||||
@ -6,7 +6,7 @@ Subject: [PATCH] Thread Naming and Tweaks
|
||||
Removes the sleep forever thread and adds useful names for debugging to all staged thread files.
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java
|
||||
index 4759f6a..32f0e75 100644
|
||||
index fa02974..a534bbd 100644
|
||||
--- a/src/main/java/net/minecraft/server/DedicatedServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/DedicatedServer.java
|
||||
@@ -34,7 +34,7 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
|
@ -1,4 +1,4 @@
|
||||
From d089449fc802537a9b3a72b7671a49bdefb224b6 Mon Sep 17 00:00:00 2001
|
||||
From a6d2fbd57b8702a43a660b1360d0c3f442c02816 Mon Sep 17 00:00:00 2001
|
||||
From: Antony Riley <antony@cyberiantiger.org>
|
||||
Date: Wed, 27 Mar 2013 01:41:54 +0200
|
||||
Subject: [PATCH] Close Unloaded Save Files
|
||||
@ -18,7 +18,7 @@ index 900ed68..829f4a3 100644
|
||||
public static synchronized RegionFile a(File file1, int i, int j) {
|
||||
File file2 = new File(file1, "region");
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
index acd5b42..84ff542 100644
|
||||
index 44af717..e65c752 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
@@ -37,6 +37,8 @@ import net.minecraft.server.MinecraftServer;
|
@ -1,4 +1,4 @@
|
||||
From 006f61a5723c39a11339cde3b34dee9d34004bd9 Mon Sep 17 00:00:00 2001
|
||||
From d608b1e2af6bc1d8e853aff5c466138653bb7ef2 Mon Sep 17 00:00:00 2001
|
||||
From: Mike Primm <mike@primmhome.com>
|
||||
Date: Wed, 24 Apr 2013 01:43:33 -0500
|
||||
Subject: [PATCH] Improve NextTickList Performance
|
||||
@ -20,7 +20,7 @@ index acf8838..1e3e0f8 100644
|
||||
|
||||
public NextTickListEntry a(long i) {
|
||||
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
|
||||
index c1239f1..588c630 100644
|
||||
index db0345d..1f864a2 100644
|
||||
--- a/src/main/java/net/minecraft/server/WorldServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/WorldServer.java
|
||||
@@ -25,8 +25,8 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
|
@ -1,4 +1,4 @@
|
||||
From 4420798c1058398652d1f839a82a7272ea3cacde Mon Sep 17 00:00:00 2001
|
||||
From 42ff63133d4fb993c1242d0db04e02c23dd9f3a9 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Sun, 19 May 2013 18:29:48 +1000
|
||||
Subject: [PATCH] Remove -o Option
|
@ -1,4 +1,4 @@
|
||||
From d6209872ddd1537bda02b822695acf42c93aa5fd Mon Sep 17 00:00:00 2001
|
||||
From 7ba25a1242facf33a7617b62a35823d88d7e2942 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Sat, 1 Jun 2013 16:34:38 +1000
|
||||
Subject: [PATCH] Recipe Deconstruction
|
@ -1,4 +1,4 @@
|
||||
From 16435527875119524c17d1c28dc3b6159e68e619 Mon Sep 17 00:00:00 2001
|
||||
From 93a420b1b2fa6da25a0f38fca8dcba69f2e39365 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Sun, 2 Jun 2013 15:16:05 +1000
|
||||
Subject: [PATCH] Implement Arrow API
|
@ -1,4 +1,4 @@
|
||||
From 572360b2e29d974a9579b004f04329ad889e805c Mon Sep 17 00:00:00 2001
|
||||
From b23f908193514fa253e4c41dc3db750f66f2f7ec Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Sun, 2 Jun 2013 16:14:30 +1000
|
||||
Subject: [PATCH] Particle API
|
||||
@ -152,7 +152,7 @@ index 7601fb5..6d22e82 100644
|
||||
|
||||
public Spigot spigot()
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||
index e242f7d..4bae056 100644
|
||||
index aa49c6c..9da9863 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||
@@ -277,13 +277,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
@ -1,4 +1,4 @@
|
||||
From a579e4ccd6d56147027daa5d6e2da5b0974e60fa Mon Sep 17 00:00:00 2001
|
||||
From 5eb857158aa0a6114412d88e26a3434b2b556d7e Mon Sep 17 00:00:00 2001
|
||||
From: erocs <github@erocs.org>
|
||||
Date: Sun, 8 Sep 2013 12:06:15 -0700
|
||||
Subject: [PATCH] Hopper Cooldowns
|
@ -1,4 +1,4 @@
|
||||
From d2e06bf405211ba93cf4b794ae72a4441eede009 Mon Sep 17 00:00:00 2001
|
||||
From 0dc0c332b02bfa4d76bc029e89a6c59f28b13198 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Tue, 11 Jun 2013 11:54:32 +1000
|
||||
Subject: [PATCH] Prevent Shutdown Hang
|
@ -1,4 +1,4 @@
|
||||
From 90e0c1be471f60565eecd27da71c24293e7e2e0f Mon Sep 17 00:00:00 2001
|
||||
From 5007d731040f3c02b189a979c40c961f27e3e16b Mon Sep 17 00:00:00 2001
|
||||
From: Andy Shulman <andy.shulman@hotmail.com>
|
||||
Date: Mon, 15 Apr 2013 20:06:37 -0500
|
||||
Subject: [PATCH] Implement SpawnerSpawnEvent.
|
@ -1,4 +1,4 @@
|
||||
From 03d78c25411477aaddcf93486541cf53de365e35 Mon Sep 17 00:00:00 2001
|
||||
From 8ab517d12c2b337416c664f3760130263bbcf0dd Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Sat, 15 Jun 2013 21:34:48 +1000
|
||||
Subject: [PATCH] Firework Meta Crash Fix
|
@ -1,4 +1,4 @@
|
||||
From a19b21282cabde789f68538318f8c65cd833f8a7 Mon Sep 17 00:00:00 2001
|
||||
From ba298d9ef487cec55284286782d87dcba11a9f05 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Sun, 16 Jun 2013 08:20:26 +1000
|
||||
Subject: [PATCH] Do Not Search for Offline Players
|
@ -1,4 +1,4 @@
|
||||
From 18da9bb5d4437c65a00c95ad9bcd1bc496776b78 Mon Sep 17 00:00:00 2001
|
||||
From 7397a685fe0b5034c6d10f2759092803aeed0443 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Fri, 21 Jun 2013 17:53:03 +1000
|
||||
Subject: [PATCH] Enable Foreign Language Signs
|
@ -1,4 +1,4 @@
|
||||
From c47fe3abb8b8f16916b84c9c3da0621983b90fec Mon Sep 17 00:00:00 2001
|
||||
From 6d6b2f23bb555609d07998469e3c6b3c85b8c463 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Fri, 21 Jun 2013 17:59:22 +1000
|
||||
Subject: [PATCH] Spam Filter Exclusions
|
||||
@ -28,10 +28,10 @@ index 3437f98..fd6995d 100644
|
||||
Waitable waitable = new Waitable() {
|
||||
@Override
|
||||
diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
index eaf1b91..208a2b7 100644
|
||||
index a598954..710d12c 100644
|
||||
--- a/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
+++ b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
@@ -212,4 +212,13 @@ public class SpigotConfig
|
||||
@@ -225,4 +225,13 @@ public class SpigotConfig
|
||||
bungeeAddresses = getList( "settings.bungeecord-addresses", bungeeAddresses );
|
||||
bungee = getBoolean( "settings.bungeecord", true );
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
From 22d1e54d62a247be1b4942ccc8b8116afad878e8 Mon Sep 17 00:00:00 2001
|
||||
From 7c64c6398ff05841f10215cdf719539dd258d358 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Fri, 21 Jun 2013 18:01:29 +1000
|
||||
Subject: [PATCH] Allow Disabling of Command Logging
|
||||
@ -23,10 +23,10 @@ index fd6995d..3c03d5a 100644
|
||||
org.bukkit.craftbukkit.SpigotTimings.playerCommandTimer.stopTiming(); // Spigot
|
||||
return;
|
||||
diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
index 208a2b7..26db8a2 100644
|
||||
index 710d12c..a1fb71f 100644
|
||||
--- a/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
+++ b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
@@ -221,4 +221,10 @@ public class SpigotConfig
|
||||
@@ -234,4 +234,10 @@ public class SpigotConfig
|
||||
"/skill"
|
||||
} ) );
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
From 2ce0804a434868588a6f06f5dce4619d4059e704 Mon Sep 17 00:00:00 2001
|
||||
From 31f79e7e3a92d88ec1e3290104c71311d20b5d93 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Fri, 21 Jun 2013 18:05:54 +1000
|
||||
Subject: [PATCH] Allow Disabling of Command TabComplete
|
||||
@ -18,10 +18,10 @@ index c127f2a..0fa69ea 100644
|
||||
player.sendMessage(ChatColor.RED + "An internal error occurred while attempting to tab-complete this command");
|
||||
getLogger().log(Level.SEVERE, "Exception when " + player.getName() + " attempted to tab complete " + message, ex);
|
||||
diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
index 26db8a2..00a31c2 100644
|
||||
index a1fb71f..85369ed 100644
|
||||
--- a/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
+++ b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
@@ -227,4 +227,10 @@ public class SpigotConfig
|
||||
@@ -240,4 +240,10 @@ public class SpigotConfig
|
||||
{
|
||||
logCommands = getBoolean( "commands.log", true );
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
From a0c9e0379a6b84d924badc322b1de26732cb6f32 Mon Sep 17 00:00:00 2001
|
||||
From 3038b2cfba13c9f0bad651f6097d123ab7b02da7 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Fri, 21 Jun 2013 19:21:58 +1000
|
||||
Subject: [PATCH] Configurable Messages
|
||||
@ -60,7 +60,7 @@ index 0fa69ea..404a626 100644
|
||||
return false;
|
||||
}
|
||||
diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
index 00a31c2..568aa95 100644
|
||||
index 85369ed..53c66fc 100644
|
||||
--- a/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
+++ b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
@@ -15,6 +15,7 @@ import java.util.Map;
|
||||
@ -71,7 +71,7 @@ index 00a31c2..568aa95 100644
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.craftbukkit.command.TicksPerSecondCommand;
|
||||
@@ -233,4 +234,22 @@ public class SpigotConfig
|
||||
@@ -246,4 +247,22 @@ public class SpigotConfig
|
||||
{
|
||||
tabComplete = getBoolean( "commands.tab-complete", true );
|
||||
}
|
@ -1,11 +1,11 @@
|
||||
From 5e62e35a6c9c792ae4e6d9b25e507b0a1998e31c Mon Sep 17 00:00:00 2001
|
||||
From fd3eff3029737a3cd8ef22f73e64402a412f3119 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Sat, 22 Jun 2013 16:12:02 +1000
|
||||
Subject: [PATCH] Allow Disabling of Random Lighting Updates
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
||||
index 51a8d58..84ee535 100644
|
||||
index 211127b..8bd7876 100644
|
||||
--- a/src/main/java/net/minecraft/server/World.java
|
||||
+++ b/src/main/java/net/minecraft/server/World.java
|
||||
@@ -2103,7 +2103,7 @@ public abstract class World implements IBlockAccess {
|
@ -1,4 +1,4 @@
|
||||
From 5372056b283910e459c509b877e719eb92c41deb Mon Sep 17 00:00:00 2001
|
||||
From afad711eee092e4bb80ae47517977f66e2d4aaef Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Sat, 22 Jun 2013 16:40:11 +1000
|
||||
Subject: [PATCH] Add Log Filtering
|
||||
@ -35,7 +35,7 @@ index 0000000..aa7e9ab
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
index 568aa95..a18b498 100644
|
||||
index 53c66fc..296c581 100644
|
||||
--- a/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
+++ b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
@@ -13,6 +13,8 @@ import java.util.HashMap;
|
||||
@ -47,7 +47,7 @@ index 568aa95..a18b498 100644
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
@@ -252,4 +254,27 @@ public class SpigotConfig
|
||||
@@ -265,4 +267,27 @@ public class SpigotConfig
|
||||
outdatedClientMessage = transform( getString( "messages.outdated-client", "Outdated client!" ) );
|
||||
outdatedServerMessage = transform( getString( "messages.outdated-server", "Outdated server!" ) );
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
From 64b4a4ce82cbee14d1279a18813480d56154ec3c Mon Sep 17 00:00:00 2001
|
||||
From f9097217bea43bfd7fa6ee74b96f9c9a7d006a6e Mon Sep 17 00:00:00 2001
|
||||
From: Andre LeBlanc <andre@norcode.com>
|
||||
Date: Sat, 6 Apr 2013 12:00:31 -0400
|
||||
Subject: [PATCH] Make AnvilInventory.getItem() use both containers. Fixes
|
@ -1,4 +1,4 @@
|
||||
From f01242f936f1ae3498efc995c928b60f4cbd2120 Mon Sep 17 00:00:00 2001
|
||||
From edf843cfae42c688f7003f0aeb4aacd081d0ac0a Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Tue, 25 Jun 2013 18:09:26 +1000
|
||||
Subject: [PATCH] Always Fire PreLoginEvent
|
@ -1,4 +1,4 @@
|
||||
From dc1c55ca2a986658ed9c24679099ece2862f95aa Mon Sep 17 00:00:00 2001
|
||||
From 24d31e902cd21b4851964186fefa7f4b6ded271e Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Thu, 27 Jun 2013 17:26:09 +1000
|
||||
Subject: [PATCH] Properly Close Inventories
|
||||
@ -6,7 +6,7 @@ Subject: [PATCH] Properly Close Inventories
|
||||
Properly close inventories when unloading and switching worlds.
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
||||
index 8665ef2..8c98f3e 100644
|
||||
index c353b29..dc20587 100644
|
||||
--- a/src/main/java/net/minecraft/server/Chunk.java
|
||||
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
||||
@@ -704,6 +704,15 @@ public class Chunk {
|
@ -1,4 +1,4 @@
|
||||
From 4e0a2bb87e18f9d8850701ab6f7bdd9acc6ed8ef Mon Sep 17 00:00:00 2001
|
||||
From 8d414631b4347cfcf8ac81810462f80147f1a8d2 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Fri, 28 Jun 2013 19:52:54 +1000
|
||||
Subject: [PATCH] Disallow Interaction With Self
|
@ -1,4 +1,4 @@
|
||||
From 0d991c2de2d9b984eb2402c465496ebfe9416e7c Mon Sep 17 00:00:00 2001
|
||||
From 765fe6a0c96ce22e609bff4ad366faf54812396f Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Tue, 2 Jul 2013 09:07:54 +1000
|
||||
Subject: [PATCH] Lower Chunk Compression
|
@ -1,11 +1,11 @@
|
||||
From 19063549ea06342bc6d9137f425940fae1e8c173 Mon Sep 17 00:00:00 2001
|
||||
From b77192c2e8533c8be00f0beeb661b62849c35110 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Tue, 2 Jul 2013 20:32:49 +1000
|
||||
Subject: [PATCH] Entity Mount and Dismount Events
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
|
||||
index 852dfd3..92d7dc4 100644
|
||||
index fe856fc..60c2221 100644
|
||||
--- a/src/main/java/net/minecraft/server/Entity.java
|
||||
+++ b/src/main/java/net/minecraft/server/Entity.java
|
||||
@@ -1427,6 +1427,7 @@ public abstract class Entity {
|
||||
@ -35,7 +35,7 @@ index 852dfd3..92d7dc4 100644
|
||||
if (this.vehicle != null) {
|
||||
this.vehicle.passenger = null;
|
||||
diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java
|
||||
index e4fe770..8c5a8ba 100644
|
||||
index e1a3ca1..adb27d8 100644
|
||||
--- a/src/main/java/net/minecraft/server/EntityHuman.java
|
||||
+++ b/src/main/java/net/minecraft/server/EntityHuman.java
|
||||
@@ -304,6 +304,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen
|
@ -1,11 +1,11 @@
|
||||
From 26e9323ab6a8b867a0981070e7e6d854df509292 Mon Sep 17 00:00:00 2001
|
||||
From 3e3ad5a9e5de8bd5cd84d5d478c0b8ac8b2b7333 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Thu, 4 Jul 2013 10:11:46 +1000
|
||||
Subject: [PATCH] Colour Console Messages
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
index aeac6e9..3c9cf29 100644
|
||||
index e5b8391..e8e3c9e 100644
|
||||
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
@@ -919,7 +919,7 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo
|
@ -1,4 +1,4 @@
|
||||
From 7ffd444f40c4cd4b127151e6a81ce713d41fdad1 Mon Sep 17 00:00:00 2001
|
||||
From 43da205a1bc25ac30b44a6367b7d7f35ebe90818 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Ciuba <alexciuba@gmail.com>
|
||||
Date: Mon, 10 Jun 2013 16:04:38 -0400
|
||||
Subject: [PATCH] Properly Consume Bonemeal in Dispensers
|
@ -1,4 +1,4 @@
|
||||
From 8dff082d1de9429d714b1069a413423246399ebd Mon Sep 17 00:00:00 2001
|
||||
From 3d38cee38e3984d42237d7353b000051be2be0c6 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Ciuba <alexciuba@gmail.com>
|
||||
Date: Tue, 11 Jun 2013 15:23:03 -0400
|
||||
Subject: [PATCH] Prevent Ghost Players Caused by Plugins
|
@ -1,4 +1,4 @@
|
||||
From 0364e5efc23a634a5a5bf28f287952ae508c0116 Mon Sep 17 00:00:00 2001
|
||||
From ea70179245470f2baf92f73a45c87e36e654edbc Mon Sep 17 00:00:00 2001
|
||||
From: Ammar Askar <ammar@ammaraskar.com>
|
||||
Date: Tue, 16 Jul 2013 03:32:32 +0500
|
||||
Subject: [PATCH] Entity ticking chunk caching
|
||||
@ -6,7 +6,7 @@ Subject: [PATCH] Entity ticking chunk caching
|
||||
Cache known loaded chunks so we avoid making a potentially expensive contains call for every single entity in exchange for some simple arithmetic. Best case scenario, this cuts down contains call to once per chunk, worst case it adds on some simple arithmetic operations
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
||||
index 84ee535..06759cd 100644
|
||||
index 8bd7876..ba1c1ca 100644
|
||||
--- a/src/main/java/net/minecraft/server/World.java
|
||||
+++ b/src/main/java/net/minecraft/server/World.java
|
||||
@@ -1221,6 +1221,7 @@ public abstract class World implements IBlockAccess {
|
@ -1,4 +1,4 @@
|
||||
From bc957797b53181de21a4e8775ff19524edbff467 Mon Sep 17 00:00:00 2001
|
||||
From e5bd78ed743866ec5f4f420dd52958e0f282c92e Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Sat, 3 Aug 2013 19:02:59 +1000
|
||||
Subject: [PATCH] Plug World Unload Memory Leak
|
@ -1,4 +1,4 @@
|
||||
From fe4fad88f5d1e8afcc3c158fd1b160f58c55c59d Mon Sep 17 00:00:00 2001
|
||||
From 36ad0071b43b9043ad4f0490d4ea33b2f2706d65 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Sat, 3 Aug 2013 19:27:07 +1000
|
||||
Subject: [PATCH] Player Collision API
|
@ -1,11 +1,11 @@
|
||||
From 07cbb080563ba1ea7a0bfd6dfe0162a761b1c94b Mon Sep 17 00:00:00 2001
|
||||
From 7b6f20a1b6e3ed59aeb5e458a9c9ff676fbb2df2 Mon Sep 17 00:00:00 2001
|
||||
From: agentk20 <agentkid20@gmail.com>
|
||||
Date: Sat, 3 Aug 2013 19:28:48 +1000
|
||||
Subject: [PATCH] Fully Disable Snooper When Not Required
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
index 3c9cf29..fb8bc87 100644
|
||||
index e8e3c9e..4a72f2c 100644
|
||||
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
@@ -500,11 +500,11 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo
|
@ -1,4 +1,4 @@
|
||||
From eda99a5cfa88916585dfb3ca301f7bdb2dfd0894 Mon Sep 17 00:00:00 2001
|
||||
From 8a9ef0403468ad7597e4b0e70ae3a61a18bf88b0 Mon Sep 17 00:00:00 2001
|
||||
From: DerFlash <bte@freenet.de>
|
||||
Date: Sat, 3 Aug 2013 19:53:48 +1000
|
||||
Subject: [PATCH] Add Getter for Entity Invulnerability
|
@ -1,11 +1,11 @@
|
||||
From d52b2472e42eb743873629aedbaa402a4d4bc9fc Mon Sep 17 00:00:00 2001
|
||||
From 284f5650477cb3ccaedd228fbaa6439e8a8e8bd9 Mon Sep 17 00:00:00 2001
|
||||
From: Ammar Askar <ammar@ammaraskar.com>
|
||||
Date: Sat, 3 Aug 2013 21:42:00 +0500
|
||||
Subject: [PATCH] Guard entity list
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
||||
index 06759cd..cb21133 100644
|
||||
index ba1c1ca..c03e274 100644
|
||||
--- a/src/main/java/net/minecraft/server/World.java
|
||||
+++ b/src/main/java/net/minecraft/server/World.java
|
||||
@@ -29,7 +29,25 @@ import org.bukkit.event.weather.ThunderChangeEvent;
|
@ -1,11 +1,11 @@
|
||||
From 505f91d303c1862761df05b23a67ce1878fd1c45 Mon Sep 17 00:00:00 2001
|
||||
From d11fddbdd62a2be3e66fc9623661403ffcd17faf Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Mon, 5 Aug 2013 20:17:20 +1000
|
||||
Subject: [PATCH] Cap Minimum Player Speed
|
||||
|
||||
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||
index e7ea9b4..33674b1 100644
|
||||
index 654c3c9..6ee31d9 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||
@@ -952,7 +952,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
@ -1,4 +1,4 @@
|
||||
From a38166af9bc62d32ef87fdf7808cefc601835bf8 Mon Sep 17 00:00:00 2001
|
||||
From 4715cecf8a6aca768fa90a38c78469cf1016eb6b Mon Sep 17 00:00:00 2001
|
||||
From: Chad Waters <authorblues@gmail.com>
|
||||
Date: Tue, 26 Mar 2013 07:47:43 -0400
|
||||
Subject: [PATCH] Update Physics When Updating Attachables
|
@ -1,11 +1,11 @@
|
||||
From 06218458dc727b2cc7d6f7eb0c420f0dc2dd2151 Mon Sep 17 00:00:00 2001
|
||||
From 24b94662ec7f7cc5a9f7d953494ecfbbdb391035 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Sat, 14 Sep 2013 10:16:38 +1000
|
||||
Subject: [PATCH] Update Inventory and Health for PlayerConsumeItemEvent
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java
|
||||
index b180933..36eca0f 100644
|
||||
index 0a35df8..e3c4d8c 100644
|
||||
--- a/src/main/java/net/minecraft/server/EntityHuman.java
|
||||
+++ b/src/main/java/net/minecraft/server/EntityHuman.java
|
||||
@@ -258,6 +258,10 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen
|
@ -1,4 +1,4 @@
|
||||
From feb2123552d4e4676471fb2130a1d26fc72e6e9e Mon Sep 17 00:00:00 2001
|
||||
From 6649bf8e5ea40c1620570364905bb6d8deabbfa8 Mon Sep 17 00:00:00 2001
|
||||
From: Dylan Xaldin <Puremin0rez515@gmail.com>
|
||||
Date: Sat, 14 Sep 2013 11:02:34 +1000
|
||||
Subject: [PATCH] Nerf Zombie Lag Issues
|
@ -1,4 +1,4 @@
|
||||
From 5142db3b8fef6932beaf6832a8299cddd7a6da38 Mon Sep 17 00:00:00 2001
|
||||
From cacda76247284c121897d7db87e42868b7cf5377 Mon Sep 17 00:00:00 2001
|
||||
From: BlackHole <black-hole@live.com>
|
||||
Date: Tue, 16 Jul 2013 22:34:50 +0200
|
||||
Subject: [PATCH] Call EntityChangeBlockEvent for Fire Arrows hitting TNT
|
@ -1,4 +1,4 @@
|
||||
From ba1e8251fe01a17473721f484f6f28204615b486 Mon Sep 17 00:00:00 2001
|
||||
From 79440ab42fc945d2efec96be6ec3bb7667c18e71 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Sat, 21 Sep 2013 12:33:09 +1000
|
||||
Subject: [PATCH] Allow Disabling of 1.6.3 Structure Saving
|
@ -1,4 +1,4 @@
|
||||
From eabce6e178ee73363104fb3e85d6c9961a29ecf7 Mon Sep 17 00:00:00 2001
|
||||
From a506a78c0160d17ca9b1a9e8fcaa17718a2e7678 Mon Sep 17 00:00:00 2001
|
||||
From: md_5 <md_5@live.com.au>
|
||||
Date: Sun, 22 Sep 2013 19:10:53 +1000
|
||||
Subject: [PATCH] Item Despawn Rate
|
In neuem Issue referenzieren
Einen Benutzer sperren