From 2502eeceb92e0171d27a1ddbe6b97acdf1d94f9e Mon Sep 17 00:00:00 2001 From: lishid Date: Sun, 25 Mar 2012 23:59:23 -0400 Subject: [PATCH] Updated to 1.2.4 --- src/lishid/openinv/OpenInv.java | 22 +- src/lishid/openinv/OpenInvEntityListener.java | 2 +- src/lishid/openinv/OpenInvPlayerListener.java | 8 +- src/lishid/openinv/PermissionRelay.java | 38 -- .../commands/AnyChestPluginCommand.java | 3 +- .../commands/OpenInvPluginCommand.java | 7 +- .../commands/SearchInvPluginCommand.java | 3 +- .../commands/SilentChestPluginCommand.java | 3 +- .../commands/ToggleOpenInvPluginCommand.java | 3 +- src/lishid/openinv/utils/Metrics.java | 414 +++++++++++++----- .../openinv/utils/PlayerInventoryChest.java | 12 +- .../openinv/utils/SilentContainerChest.java | 4 +- src/plugin.yml | 2 +- 13 files changed, 342 insertions(+), 179 deletions(-) delete mode 100644 src/lishid/openinv/PermissionRelay.java diff --git a/src/lishid/openinv/OpenInv.java b/src/lishid/openinv/OpenInv.java index 0ac9cf9..57c46e1 100644 --- a/src/lishid/openinv/OpenInv.java +++ b/src/lishid/openinv/OpenInv.java @@ -24,9 +24,6 @@ import org.bukkit.entity.Player; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; -import com.nijiko.permissions.PermissionHandler; -import com.nijikokun.bukkit.Permissions.Permissions; -import org.bukkit.plugin.Plugin; /** * Open other player's inventory @@ -36,25 +33,11 @@ import org.bukkit.plugin.Plugin; public class OpenInv extends JavaPlugin { private final OpenInvPlayerListener playerListener = new OpenInvPlayerListener(this); private final OpenInvEntityListener entityListener = new OpenInvEntityListener(this); - //private final OpenInvInventoryListener inventoryListener = new OpenInvInventoryListener(this); - public static PermissionHandler permissionHandler; public static OpenInv mainPlugin; private static Metrics metrics; public void onDisable() { } - - private void setupPermissions() { - Plugin permissionsPlugin = this.getServer().getPluginManager().getPlugin("Permissions"); - - if (permissionHandler == null) { - if (permissionsPlugin != null) { - permissionHandler = ((Permissions) permissionsPlugin).getHandler(); - } else { - //log.info("Permission system not detected, defaulting to OP"); - } - } - } public void onEnable() { mainPlugin = this; @@ -65,7 +48,6 @@ public class OpenInv extends JavaPlugin { PluginManager pm = getServer().getPluginManager(); pm.registerEvents(playerListener, this); pm.registerEvents(entityListener, this); - setupPermissions(); getCommand("openinv").setExecutor(new OpenInvPluginCommand(this)); @@ -77,8 +59,8 @@ public class OpenInv extends JavaPlugin { //Metrics try { - metrics = new Metrics(); - metrics.beginMeasuringPlugin(this); + metrics = new Metrics(this); + metrics.start(); } catch(Exception e){ e.printStackTrace(); } diff --git a/src/lishid/openinv/OpenInvEntityListener.java b/src/lishid/openinv/OpenInvEntityListener.java index b806fcd..9d3bac9 100644 --- a/src/lishid/openinv/OpenInvEntityListener.java +++ b/src/lishid/openinv/OpenInvEntityListener.java @@ -46,7 +46,7 @@ public class OpenInvEntityListener implements Listener{ if(!(player.getItemInHand().getType().getId() == OpenInv.GetItemOpenInvItem()) || (!OpenInv.GetPlayerItemOpenInvStatus(player.getName())) - || !PermissionRelay.hasPermission(player, "openinv")) + || !player.hasPermission("OpenInv.openinv")) { return; } diff --git a/src/lishid/openinv/OpenInvPlayerListener.java b/src/lishid/openinv/OpenInvPlayerListener.java index 439c8f4..e741339 100644 --- a/src/lishid/openinv/OpenInvPlayerListener.java +++ b/src/lishid/openinv/OpenInvPlayerListener.java @@ -81,12 +81,12 @@ public class OpenInvPlayerListener implements Listener{ int y = event.getClickedBlock().getY(); int z = event.getClickedBlock().getZ(); - if(PermissionRelay.hasPermission(event.getPlayer(), "silent") && OpenInv.GetPlayerSilentChestStatus(event.getPlayer().getName())) + if(event.getPlayer().hasPermission("OpenInv.silent") && OpenInv.GetPlayerSilentChestStatus(event.getPlayer().getName())) { silentchest = true; } - if(PermissionRelay.hasPermission(event.getPlayer(), "anychest") && OpenInv.GetPlayerAnyChestStatus(event.getPlayer().getName())) + if(event.getPlayer().hasPermission("OpenInv.anychest") && OpenInv.GetPlayerAnyChestStatus(event.getPlayer().getName())) { try { @@ -179,7 +179,7 @@ public class OpenInvPlayerListener implements Listener{ Player player = event.getPlayer(); try{ Sign sign = ((Sign)event.getClickedBlock().getState()); - if (PermissionRelay.hasPermission(player, "openinv") && sign.getLine(0).equalsIgnoreCase("[openinv]")) + if (player.hasPermission("OpenInv.openinv") && sign.getLine(0).equalsIgnoreCase("[openinv]")) { String text = sign.getLine(1).trim() + sign.getLine(2).trim() + sign.getLine(3).trim(); player.performCommand("openinv " + text); @@ -198,7 +198,7 @@ public class OpenInvPlayerListener implements Listener{ if(!(player.getItemInHand().getType().getId() == OpenInv.GetItemOpenInvItem()) || (!OpenInv.GetPlayerItemOpenInvStatus(player.getName())) - || !PermissionRelay.hasPermission(player, "openinv")) + || !player.hasPermission("OpenInv.openinv")) { return; } diff --git a/src/lishid/openinv/PermissionRelay.java b/src/lishid/openinv/PermissionRelay.java deleted file mode 100644 index 604543d..0000000 --- a/src/lishid/openinv/PermissionRelay.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2011-2012 lishid. All rights reserved. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package lishid.openinv; - -import org.bukkit.entity.Player; - - -public class PermissionRelay { - public static boolean hasPermission(Player player, String permission) - { - if(hasPermission2(player, "*") || hasPermission2(player, "OpenInv.*")) - return true; - return hasPermission2(player, "OpenInv." + permission); - } - - public static boolean hasPermission2(Player player, String permission) - { - if (OpenInv.permissionHandler == null) { - return player.isOp() ? true : player.hasPermission(permission); - }else{ - return OpenInv.permissionHandler.has(player, permission); - } - } -} diff --git a/src/lishid/openinv/commands/AnyChestPluginCommand.java b/src/lishid/openinv/commands/AnyChestPluginCommand.java index 287cb28..8e22ba9 100644 --- a/src/lishid/openinv/commands/AnyChestPluginCommand.java +++ b/src/lishid/openinv/commands/AnyChestPluginCommand.java @@ -16,7 +16,6 @@ package lishid.openinv.commands; -import lishid.openinv.PermissionRelay; import lishid.openinv.OpenInv; import org.bukkit.ChatColor; @@ -36,7 +35,7 @@ public class AnyChestPluginCommand implements CommandExecutor { sender.sendMessage(ChatColor.RED + "You can't use this from the console."); return true; } - if (!PermissionRelay.hasPermission((Player) sender, "anychest")) { + if (!sender.hasPermission("OpenInv.anychest")) { sender.sendMessage(ChatColor.RED + "You do not have permission to use anychest."); return true; } diff --git a/src/lishid/openinv/commands/OpenInvPluginCommand.java b/src/lishid/openinv/commands/OpenInvPluginCommand.java index a7f47ea..eaa21e4 100644 --- a/src/lishid/openinv/commands/OpenInvPluginCommand.java +++ b/src/lishid/openinv/commands/OpenInvPluginCommand.java @@ -19,7 +19,6 @@ package lishid.openinv.commands; import java.io.File; import java.util.HashMap; -import lishid.openinv.PermissionRelay; import lishid.openinv.OpenInv; import lishid.openinv.utils.PlayerInventoryChest; @@ -50,7 +49,7 @@ public class OpenInvPluginCommand implements CommandExecutor { sender.sendMessage(ChatColor.RED + "You can't use this from the console."); return true; } - if (!PermissionRelay.hasPermission((Player)sender, "openinv")) { + if (!sender.hasPermission("OpenInv.openinv")) { sender.sendMessage(ChatColor.RED + "You do not have permission to access player inventories"); return true; } @@ -145,12 +144,12 @@ public class OpenInvPluginCommand implements CommandExecutor { } //Permissions checks - if (!PermissionRelay.hasPermission(player, "override") && PermissionRelay.hasPermission(target, "exempt")) { + if (!player.hasPermission("OpenInv.override") && target.hasPermission("OpenInv.exempt")) { sender.sendMessage(ChatColor.RED + target.getDisplayName() + "'s inventory is protected!"); return true; } - if((!PermissionRelay.hasPermission(player, "crossworld") && !PermissionRelay.hasPermission(player, "override")) && + if((!player.hasPermission("OpenInv.crossworld") && !player.hasPermission("OpenInv.override")) && target.getWorld() != player.getWorld()){ sender.sendMessage(ChatColor.RED + target.getDisplayName() + " is not in your world!"); return true; diff --git a/src/lishid/openinv/commands/SearchInvPluginCommand.java b/src/lishid/openinv/commands/SearchInvPluginCommand.java index 11a9dd1..63cc5f8 100644 --- a/src/lishid/openinv/commands/SearchInvPluginCommand.java +++ b/src/lishid/openinv/commands/SearchInvPluginCommand.java @@ -16,7 +16,6 @@ package lishid.openinv.commands; -import lishid.openinv.PermissionRelay; import lishid.openinv.OpenInv; import org.bukkit.ChatColor; @@ -36,7 +35,7 @@ public class SearchInvPluginCommand implements CommandExecutor { if(sender instanceof Player) { - if (!PermissionRelay.hasPermission((Player) sender, "search")) { + if (!sender.hasPermission("OpenInv.search")) { sender.sendMessage(ChatColor.RED + "You do not have permission to access player inventories"); return true; } diff --git a/src/lishid/openinv/commands/SilentChestPluginCommand.java b/src/lishid/openinv/commands/SilentChestPluginCommand.java index 20346ac..71a25e7 100644 --- a/src/lishid/openinv/commands/SilentChestPluginCommand.java +++ b/src/lishid/openinv/commands/SilentChestPluginCommand.java @@ -16,7 +16,6 @@ package lishid.openinv.commands; -import lishid.openinv.PermissionRelay; import lishid.openinv.OpenInv; import org.bukkit.ChatColor; @@ -36,7 +35,7 @@ public class SilentChestPluginCommand implements CommandExecutor { sender.sendMessage(ChatColor.RED + "You can't use this from the console."); return true; } - if (!PermissionRelay.hasPermission((Player) sender, "silent")) { + if (!sender.hasPermission("OpenInv.silent")) { sender.sendMessage(ChatColor.RED + "You do not have permission to use silent chest."); return true; } diff --git a/src/lishid/openinv/commands/ToggleOpenInvPluginCommand.java b/src/lishid/openinv/commands/ToggleOpenInvPluginCommand.java index 4659b6d..302b1c3 100644 --- a/src/lishid/openinv/commands/ToggleOpenInvPluginCommand.java +++ b/src/lishid/openinv/commands/ToggleOpenInvPluginCommand.java @@ -17,7 +17,6 @@ package lishid.openinv.commands; import lishid.openinv.OpenInv; -import lishid.openinv.PermissionRelay; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -34,7 +33,7 @@ public class ToggleOpenInvPluginCommand implements CommandExecutor { sender.sendMessage(ChatColor.RED + "You can't use this from the console."); return true; } - if (!PermissionRelay.hasPermission((Player)sender, "openinv")) { + if (!sender.hasPermission("OpenInv.openinv")) { sender.sendMessage(ChatColor.RED + "You do not have permission to access player inventories"); return true; } diff --git a/src/lishid/openinv/utils/Metrics.java b/src/lishid/openinv/utils/Metrics.java index c45b427..364cc43 100644 --- a/src/lishid/openinv/utils/Metrics.java +++ b/src/lishid/openinv/utils/Metrics.java @@ -1,3 +1,5 @@ +package lishid.openinv.utils; + /* * Copyright 2011 Tyler Blair. All rights reserved. * @@ -26,11 +28,10 @@ * either expressed or implied, of anybody else. */ -package lishid.openinv.utils; - import org.bukkit.Bukkit; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginDescriptionFile; import java.io.BufferedReader; import java.io.File; @@ -38,67 +39,36 @@ 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.HashMap; +import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedHashSet; -import java.util.Map; import java.util.Set; import java.util.UUID; /** - * Tooling to post to metrics.griefcraft.com + *

+ * The metrics class obtains data about a plugin and submits statistics about it to the metrics backend. + *

+ *

+ * Public methods provided by this class: + *

+ * + * Graph createGraph(String name);
+ * void addCustomData(Metrics.Plotter plotter);
+ * void start();
+ *
*/ public class Metrics { /** - * Interface used to collect custom data for a plugin + * The current revision number */ - public static abstract class Plotter { - - /** - * Get the column name for the plotted point - * - * @return the plotted point's column name - */ - public abstract String getColumnName(); - - /** - * Get the current value for the plotted point - * - * @return - */ - public abstract int getValue(); - - /** - * Called after the website graphs have been updated - */ - public void reset() { - } - - @Override - public int hashCode() { - return getColumnName().hashCode() + getValue(); - } - - @Override - public boolean equals(Object object) { - if (!(object instanceof Plotter)) { - return false; - } - - Plotter plotter = (Plotter) object; - return plotter.getColumnName().equals(getColumnName()) && plotter.getValue() == getValue(); - } - - } - - /** - * The metrics revision number - */ - private final static int REVISION = 4; + private final static int REVISION = 5; /** * The base url of the metrics domain @@ -116,14 +86,30 @@ public class Metrics { private static final String CONFIG_FILE = "plugins/PluginMetrics/config.yml"; /** - * Interval of time to ping in minutes + * 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 final static int PING_INTERVAL = 10; /** - * A map of the custom data plotters for plugins + * The plugin this metrics submits for */ - private Map> customData = Collections.synchronizedMap(new HashMap>()); + private final Plugin plugin; + + /** + * All of the custom graphs to submit to metrics + */ + private final Set graphs = Collections.synchronizedSet(new HashSet()); + + /** + * 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 @@ -133,9 +119,15 @@ public class Metrics { /** * Unique server id */ - private String guid; + private final String guid; + + public Metrics(Plugin plugin) throws IOException { + if (plugin == null) { + throw new IllegalArgumentException("Plugin cannot be null"); + } + + this.plugin = plugin; - public Metrics() throws IOException { // load the config File file = new File(CONFIG_FILE); configuration = YamlConfiguration.loadConfiguration(file); @@ -155,86 +147,137 @@ public class Metrics { } /** - * Adds a custom data plotter for a given plugin + * 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 plugin - * @param plotter + * @param name + * @return Graph object created. Will never return NULL under normal circumstances unless bad parameters are given */ - public void addCustomData(Plugin plugin, Plotter plotter) { - Set plotters = customData.get(plugin); - - if (plotters == null) { - plotters = Collections.synchronizedSet(new LinkedHashSet()); - customData.put(plugin, plotters); + public Graph createGraph(String name) { + if (name == null) { + throw new IllegalArgumentException("Graph name cannot be null"); } - plotters.add(plotter); + // Construct the graph object + Graph graph = new Graph(name); + + // Now we can add our graph + graphs.add(graph); + + // and return back + return graph; } /** - * Begin measuring a plugin + * Adds a custom data plotter to the default graph * - * @param plugin + * @param plotter */ - public void beginMeasuringPlugin(final Plugin plugin) throws IOException { + public void addCustomData(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. + */ + public void start() { // Did we opt out? if (configuration.getBoolean("opt-out", false)) { return; } - // First tell the server about us - try { - postPlugin(plugin, false); - } catch (Exception e) { - System.out.println("[Metrics] " + e.getMessage()); - } - - // Ping the server in intervals + // Begin hitting the server with glorious data plugin.getServer().getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable() { + private boolean firstPost = true; + public void run() { try { - postPlugin(plugin, true); + // 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 (Exception e) { - System.out.println("[Metrics] " + e.getMessage()); + System.err.println("[Metrics] " + e.getMessage()); } } - }, PING_INTERVAL * 1200, PING_INTERVAL * 1200); + }, 0, PING_INTERVAL * 1200); } /** * Generic method that posts a plugin to the metrics website - * - * @param plugin */ - private void postPlugin(Plugin plugin, boolean isPing) throws IOException { + private void postPlugin(boolean isPing) throws IOException { + // The plugin's description file containg all of the plugin data such as name, version, author, etc + PluginDescriptionFile description = plugin.getDescription(); + // Construct the post data - String response = "ERR No response"; String data = encode("guid") + '=' + encode(guid) - + '&' + encode("version") + '=' + encode(plugin.getDescription().getVersion()) - + '&' + encode("server") + '=' + encode(Bukkit.getVersion()) - + '&' + encode("players") + '=' + encode(String.valueOf(Bukkit.getServer().getOnlinePlayers().length)) - + '&' + encode("revision") + '=' + encode(REVISION + ""); + + encodeDataPair("version", description.getVersion()) + + encodeDataPair("server", Bukkit.getVersion()) + + encodeDataPair("players", Integer.toString(Bukkit.getServer().getOnlinePlayers().length)) + + encodeDataPair("revision", String.valueOf(REVISION)); // If we're pinging, append it if (isPing) { - data += '&' + encode("ping") + '=' + encode("true"); + data += encodeDataPair("ping", "true"); } - // Add any custom data (if applicable) - Set plotters = customData.get(plugin); + // 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) { + Iterator iter = graphs.iterator(); - if (plotters != null) { - for (Plotter plotter : plotters) { - data += "&" + encode ("Custom" + plotter.getColumnName()) - + "=" + encode(Integer.toString(plotter.getValue())); + while (iter.hasNext()) { + Graph graph = iter.next(); + + // Because we have a lock on the graphs set already, it is reasonable to assume + // that our lock transcends down to the individual plotters in the graphs also. + // Because our methods are private, no one but us can reasonably access this list + // without reflection so this is a safe assumption without adding more code. + 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 + 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() + String value = Integer.toString(plotter.getValue()); + + // Add it to the http post data :) + data += encodeDataPair(key, value); + } } } // Create the url - URL url = new URL(BASE_URL + String.format(REPORT_URL, plugin.getDescription().getName())); + URL url = new URL(BASE_URL + String.format(REPORT_URL, description.getName())); // Connect to the website - URLConnection connection = url.openConnection(); + 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 @@ -244,20 +287,26 @@ public class Metrics { // Now read the response BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); - response = reader.readLine(); + String response = reader.readLine(); // close resources writer.close(); reader.close(); - if (response.startsWith("ERR")){ + if (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")) { - if (plotters != null) { - for (Plotter plotter : plotters) { - plotter.reset(); + synchronized (graphs) { + Iterator iter = graphs.iterator(); + + while (iter.hasNext()) { + Graph graph = iter.next(); + + for (Plotter plotter : graph.getPlotters()) { + plotter.reset(); + } } } } @@ -265,6 +314,35 @@ public class Metrics { //if (response.startsWith("OK")) - We should get "OK" followed by an optional description if everything goes right } + /** + * Check if mineshafter is present. If it is, we need to bypass it to send POST requests + * + * @return + */ + private boolean isMineshafterPresent() { + try { + Class.forName("mineshafter.MineServer"); + return true; + } catch (Exception e) { + return false; + } + } + + /** + *

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:

+ * + * String httpData = encode("guid") + '=' + encode("1234") + encodeDataPair("authors") + ".."; + * + * + * @param key + * @param value + * @return + */ + private static String encodeDataPair(String key, String value) throws UnsupportedEncodingException { + return '&' + encode(key) + '=' + encode(value); + } + /** * Encode text as UTF-8 * @@ -275,4 +353,140 @@ public class Metrics { 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 plotters = new LinkedHashSet(); + + private Graph(String name) { + this.name = name; + } + + /** + * Gets the graph's name + * + * @return + */ + public String getName() { + return name; + } + + /** + * Add a plotter to the graph, which will be used to plot entries + * + * @param plotter + */ + public void addPlotter(Plotter plotter) { + plotters.add(plotter); + } + + /** + * Remove a plotter from the graph + * + * @param plotter + */ + public void removePlotter(Plotter plotter) { + plotters.remove(plotter); + } + + /** + * Gets an unmodifiable set of the plotter objects in the graph + * + * @return + */ + public Set getPlotters() { + return Collections.unmodifiableSet(plotters); + } + + @Override + public int hashCode() { + return name.hashCode(); + } + + @Override + public boolean equals(Object object) { + if (!(object instanceof Graph)) { + return false; + } + + Graph graph = (Graph) object; + return graph.name.equals(name); + } + + } + + /** + * 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 + */ + public Plotter(String name) { + this.name = name; + } + + /** + * Get the current value for the plotted point + * + * @return + */ + 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() + getValue(); + } + + @Override + public boolean equals(Object object) { + if (!(object instanceof Plotter)) { + return false; + } + + Plotter plotter = (Plotter) object; + return plotter.name.equals(name) && plotter.getValue() == getValue(); + } + } } \ No newline at end of file diff --git a/src/lishid/openinv/utils/PlayerInventoryChest.java b/src/lishid/openinv/utils/PlayerInventoryChest.java index 6a1d682..7eb1944 100644 --- a/src/lishid/openinv/utils/PlayerInventoryChest.java +++ b/src/lishid/openinv/utils/PlayerInventoryChest.java @@ -40,6 +40,7 @@ public class PlayerInventoryChest implements IInventory private ItemStack[] items = new ItemStack[36]; private ItemStack[] armor = new ItemStack[4]; private ItemStack[] extra = new ItemStack[5]; + private int maxStack = MAX_STACK; public PlayerInventoryChest(PlayerInventory inventory, EntityPlayer entityplayer) { @@ -196,6 +197,8 @@ public class PlayerInventoryChest implements IInventory i = getReversedArmorSlotNum(i); } + /* + //Effects if(is == this.extra) { @@ -203,7 +206,7 @@ public class PlayerInventoryChest implements IInventory { itemstack.setData(0); } - } + }*/ is[i] = itemstack; } @@ -231,7 +234,7 @@ public class PlayerInventoryChest implements IInventory public int getMaxStackSize() { - return 64; + return maxStack; } public boolean a(EntityHuman entityhuman) @@ -282,4 +285,9 @@ public class PlayerInventoryChest implements IInventory public InventoryHolder getOwner() { return null; } + + @Override + public void setMaxStackSize(int size) { + maxStack = size; + } } \ No newline at end of file diff --git a/src/lishid/openinv/utils/SilentContainerChest.java b/src/lishid/openinv/utils/SilentContainerChest.java index aac4a42..6136144 100644 --- a/src/lishid/openinv/utils/SilentContainerChest.java +++ b/src/lishid/openinv/utils/SilentContainerChest.java @@ -16,7 +16,9 @@ package lishid.openinv.utils; -import net.minecraft.server.* ; +import net.minecraft.server.ContainerChest; +import net.minecraft.server.EntityHuman; +import net.minecraft.server.IInventory; public class SilentContainerChest extends ContainerChest { public IInventory inv; diff --git a/src/plugin.yml b/src/plugin.yml index b456b12..5f1014b 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: OpenInv main: lishid.openinv.OpenInv -version: 1.8.1 +version: 1.8.4 author: lishid website: http://forums.bukkit.org/threads/15379/ description: >