Updated to 1.2.4
This commit is contained in:
		@@ -24,9 +24,6 @@ import org.bukkit.entity.Player;
 | 
				
			|||||||
import org.bukkit.plugin.PluginDescriptionFile;
 | 
					import org.bukkit.plugin.PluginDescriptionFile;
 | 
				
			||||||
import org.bukkit.plugin.PluginManager;
 | 
					import org.bukkit.plugin.PluginManager;
 | 
				
			||||||
import org.bukkit.plugin.java.JavaPlugin;
 | 
					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
 | 
					 * Open other player's inventory
 | 
				
			||||||
@@ -36,26 +33,12 @@ import org.bukkit.plugin.Plugin;
 | 
				
			|||||||
public class OpenInv extends JavaPlugin {
 | 
					public class OpenInv extends JavaPlugin {
 | 
				
			||||||
	private final OpenInvPlayerListener playerListener = new OpenInvPlayerListener(this);
 | 
						private final OpenInvPlayerListener playerListener = new OpenInvPlayerListener(this);
 | 
				
			||||||
	private final OpenInvEntityListener entityListener = new OpenInvEntityListener(this);
 | 
						private final OpenInvEntityListener entityListener = new OpenInvEntityListener(this);
 | 
				
			||||||
	//private final OpenInvInventoryListener inventoryListener = new OpenInvInventoryListener(this);
 | 
					 | 
				
			||||||
    public static PermissionHandler permissionHandler;
 | 
					 | 
				
			||||||
	public static OpenInv mainPlugin;
 | 
						public static OpenInv mainPlugin;
 | 
				
			||||||
	private static Metrics metrics;
 | 
						private static Metrics metrics;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
    public void onDisable() {
 | 
					    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() {
 | 
					    public void onEnable() {
 | 
				
			||||||
    	mainPlugin = this;
 | 
					    	mainPlugin = this;
 | 
				
			||||||
    	mainPlugin.getConfig().addDefault("ItemOpenInvItemID", 280);
 | 
					    	mainPlugin.getConfig().addDefault("ItemOpenInvItemID", 280);
 | 
				
			||||||
@@ -65,7 +48,6 @@ public class OpenInv extends JavaPlugin {
 | 
				
			|||||||
		PluginManager pm = getServer().getPluginManager();
 | 
							PluginManager pm = getServer().getPluginManager();
 | 
				
			||||||
		pm.registerEvents(playerListener, this);
 | 
							pm.registerEvents(playerListener, this);
 | 
				
			||||||
		pm.registerEvents(entityListener, this);
 | 
							pm.registerEvents(entityListener, this);
 | 
				
			||||||
    	setupPermissions();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        getCommand("openinv").setExecutor(new OpenInvPluginCommand(this));
 | 
					        getCommand("openinv").setExecutor(new OpenInvPluginCommand(this));
 | 
				
			||||||
@@ -77,8 +59,8 @@ public class OpenInv extends JavaPlugin {
 | 
				
			|||||||
		//Metrics
 | 
							//Metrics
 | 
				
			||||||
		try
 | 
							try
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			metrics = new Metrics();
 | 
								metrics = new Metrics(this);
 | 
				
			||||||
			metrics.beginMeasuringPlugin(this);
 | 
								metrics.start();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		catch(Exception e){ e.printStackTrace(); }
 | 
							catch(Exception e){ e.printStackTrace(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,7 +46,7 @@ public class OpenInvEntityListener implements Listener{
 | 
				
			|||||||
    		
 | 
					    		
 | 
				
			||||||
    		if(!(player.getItemInHand().getType().getId() == OpenInv.GetItemOpenInvItem())
 | 
					    		if(!(player.getItemInHand().getType().getId() == OpenInv.GetItemOpenInvItem())
 | 
				
			||||||
    				|| (!OpenInv.GetPlayerItemOpenInvStatus(player.getName()))
 | 
					    				|| (!OpenInv.GetPlayerItemOpenInvStatus(player.getName()))
 | 
				
			||||||
    				|| !PermissionRelay.hasPermission(player, "openinv"))
 | 
					    				|| !player.hasPermission("OpenInv.openinv"))
 | 
				
			||||||
    		{
 | 
					    		{
 | 
				
			||||||
    			return;
 | 
					    			return;
 | 
				
			||||||
    		}
 | 
					    		}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -81,12 +81,12 @@ public class OpenInvPlayerListener implements Listener{
 | 
				
			|||||||
			int y = event.getClickedBlock().getY();
 | 
								int y = event.getClickedBlock().getY();
 | 
				
			||||||
			int z = event.getClickedBlock().getZ();
 | 
								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;
 | 
									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
 | 
									try
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
@@ -179,7 +179,7 @@ public class OpenInvPlayerListener implements Listener{
 | 
				
			|||||||
			Player player = event.getPlayer();
 | 
								Player player = event.getPlayer();
 | 
				
			||||||
			try{
 | 
								try{
 | 
				
			||||||
				Sign sign = ((Sign)event.getClickedBlock().getState());
 | 
									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();
 | 
										String text = sign.getLine(1).trim() + sign.getLine(2).trim() + sign.getLine(3).trim();
 | 
				
			||||||
					player.performCommand("openinv " + text);
 | 
										player.performCommand("openinv " + text);
 | 
				
			||||||
@@ -198,7 +198,7 @@ public class OpenInvPlayerListener implements Listener{
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			if(!(player.getItemInHand().getType().getId() == OpenInv.GetItemOpenInvItem())
 | 
								if(!(player.getItemInHand().getType().getId() == OpenInv.GetItemOpenInvItem())
 | 
				
			||||||
    				|| (!OpenInv.GetPlayerItemOpenInvStatus(player.getName()))
 | 
					    				|| (!OpenInv.GetPlayerItemOpenInvStatus(player.getName()))
 | 
				
			||||||
					|| !PermissionRelay.hasPermission(player, "openinv"))
 | 
										|| !player.hasPermission("OpenInv.openinv"))
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				return;
 | 
									return;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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 <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -16,7 +16,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
package lishid.openinv.commands;
 | 
					package lishid.openinv.commands;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import lishid.openinv.PermissionRelay;
 | 
					 | 
				
			||||||
import lishid.openinv.OpenInv;
 | 
					import lishid.openinv.OpenInv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.bukkit.ChatColor;
 | 
					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.");
 | 
					            sender.sendMessage(ChatColor.RED + "You can't use this from the console.");
 | 
				
			||||||
    		return true;
 | 
					    		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.");
 | 
					            sender.sendMessage(ChatColor.RED + "You do not have permission to use anychest.");
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,6 @@ package lishid.openinv.commands;
 | 
				
			|||||||
import java.io.File;
 | 
					import java.io.File;
 | 
				
			||||||
import java.util.HashMap;
 | 
					import java.util.HashMap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import lishid.openinv.PermissionRelay;
 | 
					 | 
				
			||||||
import lishid.openinv.OpenInv;
 | 
					import lishid.openinv.OpenInv;
 | 
				
			||||||
import lishid.openinv.utils.PlayerInventoryChest;
 | 
					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.");
 | 
					            sender.sendMessage(ChatColor.RED + "You can't use this from the console.");
 | 
				
			||||||
    		return true;
 | 
					    		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");
 | 
					            sender.sendMessage(ChatColor.RED + "You do not have permission to access player inventories");
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -145,12 +144,12 @@ public class OpenInvPluginCommand implements CommandExecutor {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		//Permissions checks
 | 
							//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!");
 | 
					            sender.sendMessage(ChatColor.RED + target.getDisplayName() + "'s inventory is protected!");
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		if((!PermissionRelay.hasPermission(player, "crossworld") && !PermissionRelay.hasPermission(player, "override")) && 
 | 
							if((!player.hasPermission("OpenInv.crossworld") && !player.hasPermission("OpenInv.override")) && 
 | 
				
			||||||
				target.getWorld() != player.getWorld()){
 | 
									target.getWorld() != player.getWorld()){
 | 
				
			||||||
			sender.sendMessage(ChatColor.RED + target.getDisplayName() + " is not in your world!");
 | 
								sender.sendMessage(ChatColor.RED + target.getDisplayName() + " is not in your world!");
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,7 +16,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
package lishid.openinv.commands;
 | 
					package lishid.openinv.commands;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import lishid.openinv.PermissionRelay;
 | 
					 | 
				
			||||||
import lishid.openinv.OpenInv;
 | 
					import lishid.openinv.OpenInv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.bukkit.ChatColor;
 | 
					import org.bukkit.ChatColor;
 | 
				
			||||||
@@ -36,7 +35,7 @@ public class SearchInvPluginCommand implements CommandExecutor {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    	if(sender instanceof Player)
 | 
					    	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");
 | 
					                sender.sendMessage(ChatColor.RED + "You do not have permission to access player inventories");
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,7 +16,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
package lishid.openinv.commands;
 | 
					package lishid.openinv.commands;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import lishid.openinv.PermissionRelay;
 | 
					 | 
				
			||||||
import lishid.openinv.OpenInv;
 | 
					import lishid.openinv.OpenInv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.bukkit.ChatColor;
 | 
					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.");
 | 
					            sender.sendMessage(ChatColor.RED + "You can't use this from the console.");
 | 
				
			||||||
    		return true;
 | 
					    		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.");
 | 
					            sender.sendMessage(ChatColor.RED + "You do not have permission to use silent chest.");
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,7 +17,6 @@
 | 
				
			|||||||
package lishid.openinv.commands;
 | 
					package lishid.openinv.commands;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import lishid.openinv.OpenInv;
 | 
					import lishid.openinv.OpenInv;
 | 
				
			||||||
import lishid.openinv.PermissionRelay;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.bukkit.ChatColor;
 | 
					import org.bukkit.ChatColor;
 | 
				
			||||||
import org.bukkit.Material;
 | 
					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.");
 | 
					            sender.sendMessage(ChatColor.RED + "You can't use this from the console.");
 | 
				
			||||||
    		return true;
 | 
					    		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");
 | 
					            sender.sendMessage(ChatColor.RED + "You do not have permission to access player inventories");
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,5 @@
 | 
				
			|||||||
 | 
					package lishid.openinv.utils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright 2011 Tyler Blair. All rights reserved.
 | 
					 * Copyright 2011 Tyler Blair. All rights reserved.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
@@ -26,11 +28,10 @@
 | 
				
			|||||||
 * either expressed or implied, of anybody else.
 | 
					 * either expressed or implied, of anybody else.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package lishid.openinv.utils;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					import org.bukkit.Bukkit;
 | 
				
			||||||
import org.bukkit.configuration.file.YamlConfiguration;
 | 
					import org.bukkit.configuration.file.YamlConfiguration;
 | 
				
			||||||
import org.bukkit.plugin.Plugin;
 | 
					import org.bukkit.plugin.Plugin;
 | 
				
			||||||
 | 
					import org.bukkit.plugin.PluginDescriptionFile;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.BufferedReader;
 | 
					import java.io.BufferedReader;
 | 
				
			||||||
import java.io.File;
 | 
					import java.io.File;
 | 
				
			||||||
@@ -38,67 +39,36 @@ import java.io.IOException;
 | 
				
			|||||||
import java.io.InputStreamReader;
 | 
					import java.io.InputStreamReader;
 | 
				
			||||||
import java.io.OutputStreamWriter;
 | 
					import java.io.OutputStreamWriter;
 | 
				
			||||||
import java.io.UnsupportedEncodingException;
 | 
					import java.io.UnsupportedEncodingException;
 | 
				
			||||||
 | 
					import java.net.Proxy;
 | 
				
			||||||
import java.net.URL;
 | 
					import java.net.URL;
 | 
				
			||||||
import java.net.URLConnection;
 | 
					import java.net.URLConnection;
 | 
				
			||||||
import java.net.URLEncoder;
 | 
					import java.net.URLEncoder;
 | 
				
			||||||
import java.util.Collections;
 | 
					import java.util.Collections;
 | 
				
			||||||
import java.util.HashMap;
 | 
					import java.util.HashSet;
 | 
				
			||||||
 | 
					import java.util.Iterator;
 | 
				
			||||||
import java.util.LinkedHashSet;
 | 
					import java.util.LinkedHashSet;
 | 
				
			||||||
import java.util.Map;
 | 
					 | 
				
			||||||
import java.util.Set;
 | 
					import java.util.Set;
 | 
				
			||||||
import java.util.UUID;
 | 
					import java.util.UUID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Tooling to post to metrics.griefcraft.com
 | 
					 * <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(Metrics.Plotter plotter); <br/>
 | 
				
			||||||
 | 
					 * void start(); <br/>
 | 
				
			||||||
 | 
					 * </code>
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
public class Metrics {
 | 
					public class Metrics {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Interface used to collect custom data for a plugin
 | 
					     * The current revision number
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public static abstract class Plotter {
 | 
					    private final static int REVISION = 5;
 | 
				
			||||||
 | 
					 | 
				
			||||||
        /**
 | 
					 | 
				
			||||||
         * 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;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * The base url of the metrics domain
 | 
					     * The base url of the metrics domain
 | 
				
			||||||
@@ -116,14 +86,30 @@ public class Metrics {
 | 
				
			|||||||
    private static final String CONFIG_FILE = "plugins/PluginMetrics/config.yml";
 | 
					    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;
 | 
					    private final static int PING_INTERVAL = 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * A map of the custom data plotters for plugins
 | 
					     * The plugin this metrics submits for
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private Map<Plugin, Set<Plotter>> customData = Collections.synchronizedMap(new HashMap<Plugin, Set<Plotter>>());
 | 
					    private final Plugin plugin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 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
 | 
					     * The plugin configuration file
 | 
				
			||||||
@@ -133,9 +119,15 @@ public class Metrics {
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Unique server id
 | 
					     * 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
 | 
					        // load the config
 | 
				
			||||||
        File file = new File(CONFIG_FILE);
 | 
					        File file = new File(CONFIG_FILE);
 | 
				
			||||||
        configuration = YamlConfiguration.loadConfiguration(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 name
 | 
				
			||||||
     * @param plotter
 | 
					     * @return Graph object created. Will never return NULL under normal circumstances unless bad parameters are given
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public void addCustomData(Plugin plugin, Plotter plotter) {
 | 
					    public Graph createGraph(String name) {
 | 
				
			||||||
        Set<Plotter> plotters = customData.get(plugin);
 | 
					        if (name == null) {
 | 
				
			||||||
 | 
					            throw new IllegalArgumentException("Graph name cannot be null");
 | 
				
			||||||
        if (plotters == null) {
 | 
					 | 
				
			||||||
            plotters = Collections.synchronizedSet(new LinkedHashSet<Plotter>());
 | 
					 | 
				
			||||||
            customData.put(plugin, plotters);
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        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?
 | 
					        // Did we opt out?
 | 
				
			||||||
        if (configuration.getBoolean("opt-out", false)) {
 | 
					        if (configuration.getBoolean("opt-out", false)) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // First tell the server about us
 | 
					        // Begin hitting the server with glorious data
 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            postPlugin(plugin, false);
 | 
					 | 
				
			||||||
        } catch (Exception e) {
 | 
					 | 
				
			||||||
            System.out.println("[Metrics] " + e.getMessage());
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // Ping the server in intervals
 | 
					 | 
				
			||||||
        plugin.getServer().getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable() {
 | 
					        plugin.getServer().getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable() {
 | 
				
			||||||
 | 
					            private boolean firstPost = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            public void run() {
 | 
					            public void run() {
 | 
				
			||||||
                try {
 | 
					                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) {
 | 
					                } 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
 | 
					     * 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
 | 
					        // Construct the post data
 | 
				
			||||||
        String response = "ERR No response";
 | 
					 | 
				
			||||||
        String data = encode("guid") + '=' + encode(guid)
 | 
					        String data = encode("guid") + '=' + encode(guid)
 | 
				
			||||||
                + '&' + encode("version") + '=' + encode(plugin.getDescription().getVersion())
 | 
					                + encodeDataPair("version", description.getVersion())
 | 
				
			||||||
                + '&' + encode("server") + '=' + encode(Bukkit.getVersion())
 | 
					                + encodeDataPair("server", Bukkit.getVersion())
 | 
				
			||||||
                + '&' + encode("players") + '=' + encode(String.valueOf(Bukkit.getServer().getOnlinePlayers().length))
 | 
					                + encodeDataPair("players", Integer.toString(Bukkit.getServer().getOnlinePlayers().length))
 | 
				
			||||||
                + '&' + encode("revision") + '=' + encode(REVISION + "");
 | 
					                + encodeDataPair("revision", String.valueOf(REVISION));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // If we're pinging, append it
 | 
					        // If we're pinging, append it
 | 
				
			||||||
        if (isPing) {
 | 
					        if (isPing) {
 | 
				
			||||||
            data += '&' + encode("ping") + '=' + encode("true");
 | 
					            data += encodeDataPair("ping", "true");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Add any custom data (if applicable)
 | 
					        // Acquire a lock on the graphs, which lets us make the assumption we also lock everything
 | 
				
			||||||
        Set<Plotter> plotters = customData.get(plugin);
 | 
					        // inside of the graph (e.g plotters)
 | 
				
			||||||
 | 
					        synchronized (graphs) {
 | 
				
			||||||
 | 
					            Iterator<Graph> iter = graphs.iterator();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (plotters != null) {
 | 
					            while (iter.hasNext()) {
 | 
				
			||||||
            for (Plotter plotter : plotters) {
 | 
					                Graph graph = iter.next();
 | 
				
			||||||
                data += "&" + encode ("Custom" + plotter.getColumnName())
 | 
					
 | 
				
			||||||
                        + "=" + encode(Integer.toString(plotter.getValue()));
 | 
					                // 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
 | 
					        // 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
 | 
					        // 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);
 | 
					        connection.setDoOutput(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Write the data
 | 
					        // Write the data
 | 
				
			||||||
@@ -244,7 +287,7 @@ public class Metrics {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        // Now read the response
 | 
					        // Now read the response
 | 
				
			||||||
        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
 | 
					        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
 | 
				
			||||||
        response = reader.readLine();
 | 
					        String response = reader.readLine();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // close resources
 | 
					        // close resources
 | 
				
			||||||
        writer.close();
 | 
					        writer.close();
 | 
				
			||||||
@@ -255,16 +298,51 @@ public class Metrics {
 | 
				
			|||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            // Is this the first update this hour?
 | 
					            // Is this the first update this hour?
 | 
				
			||||||
            if (response.contains("OK This is your first update this hour")) {
 | 
					            if (response.contains("OK This is your first update this hour")) {
 | 
				
			||||||
                if (plotters != null) {
 | 
					                synchronized (graphs) {
 | 
				
			||||||
                    for (Plotter plotter : plotters) {
 | 
					                    Iterator<Graph> iter = graphs.iterator();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    while (iter.hasNext()) {
 | 
				
			||||||
 | 
					                        Graph graph = iter.next();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        for (Plotter plotter : graph.getPlotters()) {
 | 
				
			||||||
                            plotter.reset();
 | 
					                            plotter.reset();
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        //if (response.startsWith("OK")) - We should get "OK" followed by an optional description if everything goes right
 | 
					        //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;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * <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>
 | 
				
			||||||
 | 
					     * String httpData = encode("guid") + '=' + encode("1234") + encodeDataPair("authors") + "..";
 | 
				
			||||||
 | 
					     * </code>
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @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
 | 
					     * Encode text as UTF-8
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
@@ -275,4 +353,140 @@ public class Metrics {
 | 
				
			|||||||
        return URLEncoder.encode(text, "UTF-8");
 | 
					        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(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 <b>unmodifiable</b> set of the plotter objects in the graph
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * @return
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        public Set<Plotter> 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();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -40,6 +40,7 @@ public class PlayerInventoryChest implements IInventory
 | 
				
			|||||||
    private ItemStack[] items = new ItemStack[36];
 | 
					    private ItemStack[] items = new ItemStack[36];
 | 
				
			||||||
    private ItemStack[] armor = new ItemStack[4];
 | 
					    private ItemStack[] armor = new ItemStack[4];
 | 
				
			||||||
    private ItemStack[] extra = new ItemStack[5];
 | 
					    private ItemStack[] extra = new ItemStack[5];
 | 
				
			||||||
 | 
					    private int maxStack = MAX_STACK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public PlayerInventoryChest(PlayerInventory inventory, EntityPlayer entityplayer)
 | 
					    public PlayerInventoryChest(PlayerInventory inventory, EntityPlayer entityplayer)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -196,6 +197,8 @@ public class PlayerInventoryChest implements IInventory
 | 
				
			|||||||
            i = getReversedArmorSlotNum(i);
 | 
					            i = getReversedArmorSlotNum(i);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        /*
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        //Effects
 | 
					        //Effects
 | 
				
			||||||
        if(is == this.extra)
 | 
					        if(is == this.extra)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -203,7 +206,7 @@ public class PlayerInventoryChest implements IInventory
 | 
				
			|||||||
        	{
 | 
					        	{
 | 
				
			||||||
        		itemstack.setData(0);
 | 
					        		itemstack.setData(0);
 | 
				
			||||||
        	}
 | 
					        	}
 | 
				
			||||||
        }
 | 
					        }*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        is[i] = itemstack;
 | 
					        is[i] = itemstack;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -231,7 +234,7 @@ public class PlayerInventoryChest implements IInventory
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    public int getMaxStackSize()
 | 
					    public int getMaxStackSize()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return 64;
 | 
					        return maxStack;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public boolean a(EntityHuman entityhuman)
 | 
					    public boolean a(EntityHuman entityhuman)
 | 
				
			||||||
@@ -282,4 +285,9 @@ public class PlayerInventoryChest implements IInventory
 | 
				
			|||||||
	public InventoryHolder getOwner() {
 | 
						public InventoryHolder getOwner() {
 | 
				
			||||||
		return null;
 | 
							return null;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
					    public void setMaxStackSize(int size) {
 | 
				
			||||||
 | 
					        maxStack = size;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -16,7 +16,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
package lishid.openinv.utils;
 | 
					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 class SilentContainerChest extends ContainerChest {
 | 
				
			||||||
	public IInventory inv;
 | 
						public IInventory inv;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
name: OpenInv
 | 
					name: OpenInv
 | 
				
			||||||
main: lishid.openinv.OpenInv
 | 
					main: lishid.openinv.OpenInv
 | 
				
			||||||
version: 1.8.1
 | 
					version: 1.8.4
 | 
				
			||||||
author: lishid
 | 
					author: lishid
 | 
				
			||||||
website: http://forums.bukkit.org/threads/15379/
 | 
					website: http://forums.bukkit.org/threads/15379/
 | 
				
			||||||
description: >
 | 
					description: >
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user