Ver código fonte

Merge branch 'master' of github.com:mcMMO-Dev/mcMMO

Conflicts:
	Changelog.txt
nossr50 13 anos atrás
pai
commit
1107e9f36a

+ 6 - 2
Changelog.txt

@@ -13,10 +13,14 @@ Version 2.0.00-dev
  + Added offline user functionality to mmoedit
  + Added bookshelves to list of blocks that don't trigger abilities.
  = Fixed ClassCastException from Taming preventDamage checks
- = Fixed issue with Blast Mining not seeing TNT for detonation due to snow
- ! Changed mmoedit to save a profile when used (this will make mctop update)
+ = Fixed issue with Blast Mining not seeing TNT for detonation due to snow
+ = Fixed issue with block interaction returning NPEs
+ = Fixed issue where every block broken had a mining check applied
+ = Fixed issue where every block broken had a herbalism check applied
+ = Fixed issue where blocks weren't being removed from the watchlist
  ! Changed Call of the Wild to activate on left-click rather than right-click
  ! Changed Blast Mining to track based on Entity ID vs. Location
+ ! Changed mmoedit to save a profile when used (this will make mctop update)
 
 Version 1.3.02
  + Added in game guides for Mining, Excavation, and Acrobatics. Simply type /skillname ? to access them

+ 161 - 0
src/main/java/com/gmail/nossr50/BlockChecks.java

@@ -0,0 +1,161 @@
+package com.gmail.nossr50;
+
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+
+import com.gmail.nossr50.config.LoadProperties;
+
+public class BlockChecks {
+
+    /**
+     * Checks to see if a block type awards XP.
+     *
+     * @param material The type of Block to check
+     * @return true if the block type awards XP, false otherwise
+     */
+    public static boolean shouldBeWatched(Material material) {
+        switch (material) {
+        case BROWN_MUSHROOM:
+        case CACTUS:
+        case CLAY:
+        case COAL_ORE:
+        case DIAMOND_ORE:
+        case DIRT:
+        case ENDER_STONE:
+        case GLOWING_REDSTONE_ORE:
+        case GLOWSTONE:
+        case GOLD_ORE:
+        case GRASS:
+        case GRAVEL:
+        case IRON_ORE:
+        case JACK_O_LANTERN:
+        case LAPIS_ORE:
+        case LOG:
+        case MELON_BLOCK:
+        case MOSSY_COBBLESTONE:
+        case MYCEL:
+        case NETHERRACK:
+        case OBSIDIAN:
+        case PUMPKIN:
+        case RED_MUSHROOM:
+        case RED_ROSE:
+        case REDSTONE_ORE:
+        case SAND:
+        case SANDSTONE:
+        case SOUL_SAND:
+        case STONE:
+        case SUGAR_CANE_BLOCK:
+        case VINE:
+        case WATER_LILY:
+        case YELLOW_FLOWER:
+            return true;
+
+        default:
+            return false;
+        }
+    }
+
+    /**
+     * Check if a block should allow for the activation of abilities.
+     *
+     * @param material The type of Block to check
+     * @return true if the block should allow ability activation, false otherwise
+     */
+    public static boolean abilityBlockCheck(Material material) {
+        switch (material) {
+        case BED_BLOCK:
+        case BREWING_STAND:
+        case BOOKSHELF:
+        case BURNING_FURNACE:
+        case CAKE_BLOCK:
+        case CHEST:
+        case DISPENSER:
+        case ENCHANTMENT_TABLE:
+        case FENCE_GATE:
+        case FURNACE:
+        case IRON_DOOR_BLOCK:
+        case JUKEBOX:
+        case LEVER:
+        case NOTE_BLOCK:
+        case STONE_BUTTON:
+        case TRAP_DOOR:
+        case WALL_SIGN:
+        case WOODEN_DOOR:
+        case WORKBENCH:
+            return false;
+
+        default:
+            break;
+        }
+
+        if (Material.getMaterial(LoadProperties.anvilID).equals(material)) {
+            return false;
+        }
+        else {
+            return true;
+        }
+    }
+
+    /**
+     * Check if a block type is an ore.
+     *
+     * @param material The type of Block to check
+     * @return true if the Block is an ore, false otherwise
+     */
+    public static boolean isOre(Material material) {
+        switch (material) {
+        case COAL_ORE:
+        case DIAMOND_ORE:
+        case GLOWING_REDSTONE_ORE:
+        case GOLD_ORE:
+        case IRON_ORE:
+        case LAPIS_ORE:
+        case REDSTONE_ORE:
+            return true;
+
+        default:
+            return false;
+        }
+    }
+
+    /**
+     * Adds the block the the appropriate watchlist.
+     *
+     * @param material the type of Block to watch
+     * @param block the Block to watch
+     * @param plugin mcMMO plugin instance
+     */
+    public static void watchBlock(Material material, Block block, mcMMO plugin) {
+
+        boolean addToChangeQueue = true;
+        
+        switch (material) {
+        case CACTUS:
+        case GLOWING_REDSTONE_ORE:
+        case JACK_O_LANTERN:
+        case LOG:
+        case PUMPKIN:
+        case REDSTONE_ORE:
+        case SUGAR_CANE_BLOCK:
+        case VINE:
+            addToChangeQueue = false; //We don't want these added to changeQueue - these use their data
+            plugin.misc.blockWatchList.add(block);
+            break;
+
+        case BROWN_MUSHROOM:
+        case RED_MUSHROOM:
+        case RED_ROSE:
+        case YELLOW_FLOWER:
+        case WATER_LILY:
+            addToChangeQueue = false; //We don't want these added to chaneQueue - they're already being added to the fast queue
+            plugin.fastChangeQueue.push(block);
+            break;
+
+        default:
+            break;
+        }
+
+        if(addToChangeQueue)
+            plugin.changeQueue.push(block);
+    }
+}

+ 6 - 6
src/main/java/com/gmail/nossr50/Combat.java

@@ -84,7 +84,7 @@ public class Combat {
             }
             else if (itemInHand.getType().equals(Material.AIR) && mcPermissions.getInstance().unarmed(attacker)) {
                 Unarmed.unarmedBonus(attacker, event);
-                
+
                 if (PPa.getBerserkMode()) {
                     event.setDamage(damage + (damage / 2));
                 }
@@ -99,16 +99,16 @@ public class Combat {
             }
             else if (itemInHand.getType().equals(Material.BONE) && mcPermissions.getInstance().taming(attacker) && targetType.equals(EntityType.WOLF)) {
                 Wolf wolf = (Wolf) target;
-                String message = "Combat.BeastLore" + " ";
+                String message = mcLocale.getString("Combat.BeastLore") + " ";
                 int health = wolf.getHealth();
                 event.setCancelled(true);
 
                 if (wolf.isTamed()) {
-                    message.concat(mcLocale.getString("Combat.BeastLoreOwner", new Object[] {Taming.getOwnerName(wolf)}) + " ");
-                    message.concat(mcLocale.getString("Combat.BeastLoreHealthWolfTamed", new Object[] {health}));
+                    message = message.concat(mcLocale.getString("Combat.BeastLoreOwner", new Object[] {Taming.getOwnerName(wolf)}) + " ");
+                    message = message.concat(mcLocale.getString("Combat.BeastLoreHealthWolfTamed", new Object[] {health}));
                 }
                 else {
-                    message.concat(mcLocale.getString("Combat.BeastLoreHealthWolf", new Object[] {health}));
+                    message = message.concat(mcLocale.getString("Combat.BeastLoreHealthWolf", new Object[] {health}));
                 }
 
                 attacker.sendMessage(message);
@@ -187,7 +187,7 @@ public class Combat {
                 else if (Math.random() * 1000 <= (PPd.getSkillLevel(SkillType.UNARMED) / 2)) {
                     deflect = true;
                 }
-                
+
                 if (deflect) {
                     event.setCancelled(true);
                     defender.sendMessage(mcLocale.getString("Combat.ArrowDeflect"));

+ 102 - 80
src/main/java/com/gmail/nossr50/Users.java

@@ -1,114 +1,136 @@
 package com.gmail.nossr50;
 
 import java.io.*;
-import java.util.Properties;
 import java.util.logging.Logger;
 import java.util.HashMap;
 
-import org.bukkit.entity.*;
+import org.bukkit.entity.Player;
 import com.gmail.nossr50.datatypes.PlayerProfile;
 
-
 public class Users {
     private static volatile Users instance;
     protected static final Logger log = Logger.getLogger("Minecraft");
+
     String location = "plugins/mcMMO/FlatFileStuff/mcmmo.users";
     String directory = "plugins/mcMMO/FlatFileStuff/";
     String directoryb = "plugins/mcMMO/FlatFileStuff/Leaderboards/";
-    
-    //public static ArrayList<PlayerProfile> players;
+
     public static HashMap<Player, PlayerProfile> players = new HashMap<Player, PlayerProfile>();
-    private Properties properties = new Properties();
-    
-    //To load
-    public void load() throws IOException {
-        properties.load(new FileInputStream(location));
-    }
-    //To save
-    public void save() 
-    {
-        try 
-        {
-	        properties.store(new FileOutputStream(location), null);
-	        }catch(IOException ex) {
-	        }
-    }
-    
-    public void loadUsers()
-    {
-    	new File(directory).mkdir();
-    	new File(directoryb).mkdir();
+
+    /**
+     * Load users.
+     */
+    public void loadUsers() {
+        new File(directory).mkdir();
+        new File(directoryb).mkdir();
         File theDir = new File(location);
-		if(!theDir.exists())
-		{
-			try {
-				FileWriter writer = new FileWriter(theDir);
-				writer.close();
-			} catch (IOException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
-			}
-		}
+
+        if (!theDir.exists()) {
+            try {
+                FileWriter writer = new FileWriter(theDir);
+                writer.close();
+            }
+            catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
     }
 
-	
-    public static void addUser(Player player)
-    {
-    	if(!players.containsKey(player)) 
-    		players.put(player, new PlayerProfile(player.getName()));
+    /**
+     * Add a new user.
+     *
+     * @param player The player to create a user record for
+     */
+    public static void addUser(Player player) {
+        if (!players.containsKey(player)) {
+            players.put(player, new PlayerProfile(player.getName()));
+        }
     }
-    public static void clearUsers()
-    {
-    	players.clear();
+
+    /**
+     * Clear all users.
+     */
+    public static void clearUsers() {
+        players.clear();
     }
-    public static HashMap<Player, PlayerProfile> getProfiles(){
-    	return players;
+
+    /**
+     * Get all PlayerProfiles.
+     *
+     * @return a HashMap containing the PlayerProfile of everyone in the database
+     */
+    public static HashMap<Player, PlayerProfile> getProfiles() {
+        return players;
     }
-    
-    public static void removeUser(Player player)
-    {    	
-    	//Only remove PlayerProfile if user is offline and we have it in memory
-    	if(!player.isOnline() && players.containsKey(player))
-    	{
-	    	players.get(player).save();
-	    	players.remove(player);
-    	}
+
+    /**
+     * Remove a user from the database.
+     *
+     * @param player The player to remove
+     */
+    public static void removeUser(Player player) {
+
+        //Only remove PlayerProfile if user is offline and we have it in memory
+        if (!player.isOnline() && players.containsKey(player)) {
+            players.get(player).save();
+            players.remove(player);
+        }
     }
-    
-    public static void removeUserByName(String playerName)
-    {
+
+    /**
+     * Remove a user from the DB by name.
+     *
+     * @param playerName The name of the player to remove
+     */
+    public static void removeUserByName(String playerName) {
         Player target = null;
-        for(Player player : players.keySet())
-        {
+
+        for (Player player : players.keySet()) {
             PlayerProfile PP = players.get(player);
-            if(PP.getPlayerName().equals(playerName))
-            {
+
+            if (PP.getPlayerName().equals(playerName)) {
                 target = player;
             }
         }
-        
+
         players.remove(target);
     }
 
-    public static PlayerProfile getProfile(Player player){
-    	if(players.get(player) != null)
-    		return players.get(player);
-    	else
-    	{
-    		players.put(player, new PlayerProfile(player.getName()));
-    		return players.get(player);
-    	}
+    /**
+     * Get the profile of an online player.
+     *
+     * @param player The player whose profile to retrieve
+     * @return the player's profile
+     */
+    public static PlayerProfile getProfile(Player player) {
+        if(players.get(player) != null) {
+            return players.get(player);
+        }
+        else {
+            players.put(player, new PlayerProfile(player.getName()));
+            return players.get(player);
+        }
     }
-    
-    public static PlayerProfile getOfflineProfile(String playerName){
+
+    /**
+     * Get the profile of an offline player.
+     *
+     * @param playerName Name of the player whose profile to retrieve
+     * @return the player's profile
+     */
+    public static PlayerProfile getOfflineProfile(String playerName) {
         return new PlayerProfile(playerName, false);
     }
-    
-    public static Users getInstance() {
-		if (instance == null) {
-			instance = new Users();
-		}
-		return instance;
-	}
 
-}
+    /**
+     * Get an instance of this class.
+     *
+     * @return an instance of this class
+     */
+    public static Users getInstance() {
+        if (instance == null) {
+            instance = new Users();
+        }
+        return instance;
+    }
+}

+ 244 - 252
src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java

@@ -1,5 +1,6 @@
 package com.gmail.nossr50.listeners;
 
+import com.gmail.nossr50.BlockChecks;
 import com.gmail.nossr50.ItemChecks;
 import com.gmail.nossr50.Users;
 import com.gmail.nossr50.m;
@@ -30,269 +31,260 @@ import com.gmail.nossr50.locale.mcLocale;
 import com.gmail.nossr50.skills.*;
 import com.gmail.nossr50.events.FakeBlockBreakEvent;
 
-public class mcBlockListener implements Listener 
-{
+public class mcBlockListener implements Listener {
     private final mcMMO plugin;
 
-    public mcBlockListener(final mcMMO plugin) 
-    {
+    public mcBlockListener(final mcMMO plugin) {
         this.plugin = plugin;
     }
-    
+
+    /**
+     * Monitor BlockPlace events.
+     *
+     * @param event The event to monitor
+     */
     @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
-    public void onBlockPlace(BlockPlaceEvent event) 
-    {
-    	//Setup some basic variables
-    	Block block;
-    	Player player = event.getPlayer();
-    	
-    	//When blocks are placed on snow this event reports the wrong block.
-    	if (event.getBlockReplacedState() != null && event.getBlockReplacedState().getType().equals(Material.SNOW)) 
-    		block = event.getBlockAgainst();
-    	else 
-    		block = event.getBlock();
-    	
-    	int id = block.getTypeId();
-    	Material mat = block.getType();
-    	
-    	//Check if the blocks placed should be monitored so they do not give out XP in the future
-    	if(m.shouldBeWatched(mat))
-    	{	
-    		//Only needed for blocks that use their block data (wood, pumpkins, etc.)
-    	    boolean shouldBeChanged = true;
-    	    
-    		switch(mat)
-    		{
-    		case CACTUS:
-    		case GLOWING_REDSTONE_ORE:
-    		case JACK_O_LANTERN:
-    		case LOG:
-    		case PUMPKIN:
-    		case REDSTONE_ORE:
-    		case SUGAR_CANE_BLOCK:
-    		case VINE:
-    		    shouldBeChanged = false; //We don't want these added to changeQueue
-    			plugin.misc.blockWatchList.add(block);
-    			break;
-    		case BROWN_MUSHROOM:
-    		case RED_MUSHROOM:
-    		case RED_ROSE:
-    		case YELLOW_FLOWER:
-    		case WATER_LILY:
-    			plugin.fastChangeQueue.push(block);
-    			break;
-    		}
-    		
-    		if(shouldBeChanged)
-    		    plugin.changeQueue.push(block); 			
-    	}
-    	
-    	if(id == LoadProperties.anvilID && LoadProperties.anvilmessages)
-    	{
-    		PlayerProfile PP = Users.getProfile(player);
-    		if(!PP.getPlacedAnvil())
-    		{
-    			if(LoadProperties.spoutEnabled)
-    			{
-    				SpoutPlayer sPlayer = SpoutManager.getPlayer(player);
-    				if(sPlayer.isSpoutCraftEnabled())
-    					sPlayer.sendNotification("[mcMMO] Anvil Placed", "Right click to repair!", Material.IRON_BLOCK);
-	    		}
-	    		else
-	    			event.getPlayer().sendMessage(mcLocale.getString("mcBlockListener.PlacedAnvil")); //$NON-NLS-1$
-    			
-    			PP.togglePlacedAnvil();
-    		}
-    	}
+    public void onBlockPlace(BlockPlaceEvent event) {
+        Block block;
+        Player player = event.getPlayer();
+
+        //When blocks are placed on snow this event reports the wrong block.
+        if (event.getBlockReplacedState() != null && event.getBlockReplacedState().getType().equals(Material.SNOW)) {
+            block = event.getBlockAgainst();
+        }
+        else {
+            block = event.getBlock();
+        }
+
+        int id = block.getTypeId();
+        Material mat = block.getType();
+
+        //Check if the blocks placed should be monitored so they do not give out XP in the future
+        if (BlockChecks.shouldBeWatched(mat)) {
+            BlockChecks.watchBlock(mat, block, plugin);
+        }
+
+        if (id == LoadProperties.anvilID && LoadProperties.anvilmessages) {
+            PlayerProfile PP = Users.getProfile(player);
+
+            if (!PP.getPlacedAnvil()) {
+                if (LoadProperties.spoutEnabled) {
+                    SpoutPlayer sPlayer = SpoutManager.getPlayer(player);
+
+                    if (sPlayer.isSpoutCraftEnabled()) {
+                        sPlayer.sendNotification("[mcMMO] Anvil Placed", "Right click to repair!", Material.getMaterial(id));
+                    }
+                }
+                else {
+                    event.getPlayer().sendMessage(mcLocale.getString("mcBlockListener.PlacedAnvil"));
+                }
+
+                PP.togglePlacedAnvil();
+            }
+        }
     }
 
+    /**
+     * Monitor BlockBreak events.
+     *
+     * @param event The event to monitor
+     */
     @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
-    public void onBlockBreak(BlockBreakEvent event) 
-    {
-    	Player player = event.getPlayer();
-    	PlayerProfile PP = Users.getProfile(player);
-    	Block block = event.getBlock();
-    	int id = block.getTypeId();
-    	ItemStack inhand = player.getItemInHand();
-    	
-    	if(event instanceof FakeBlockBreakEvent) 
-    		return;
-    	
-    	/*
-    	 * HERBALISM
-    	 */
-    	
-    	//Green Terra
-   		if(PP.getHoePreparationMode() && mcPermissions.getInstance().herbalismAbility(player) && ((id == 59 && block.getData() == (byte) 0x07) || Herbalism.canBeGreenTerra(block)))
-   			Skills.abilityCheck(player, SkillType.HERBALISM);
-   		
-   		//Wheat && Triple drops
-   		if(PP.getGreenTerraMode() && Herbalism.canBeGreenTerra(block))
-   			Herbalism.herbalismProcCheck(block, player, event, plugin);
-    	
-    	if(mcPermissions.getInstance().herbalism(player) && block.getData() != (byte) 5)
-			Herbalism.herbalismProcCheck(block, player, event, plugin);
-    	
-    	/*
-    	 * MINING
-    	 */
-    	if(mcPermissions.getInstance().mining(player))
-    	{
-    		if(LoadProperties.miningrequirespickaxe && ItemChecks.isMiningPick(inhand))
-    			Mining.miningBlockCheck(player, block, plugin);
-    		else if(!LoadProperties.miningrequirespickaxe)
-    			Mining.miningBlockCheck(player, block, plugin);
-    	}
-    	
-    	/*
-   		 * WOOD CUTTING
-   		 */
-    	
-   		if(mcPermissions.getInstance().woodcutting(player) && id == 17)
-   		{
-   			if(LoadProperties.woodcuttingrequiresaxe && ItemChecks.isAxe(inhand))
-				WoodCutting.woodcuttingBlockCheck(player, block, plugin);
-   			else if(!LoadProperties.woodcuttingrequiresaxe)
-    			WoodCutting.woodcuttingBlockCheck(player, block, plugin);
-   			
-   			if(PP.getTreeFellerMode())
-   			    WoodCutting.treeFeller(event, plugin);
-    	}
-   		
-    	/*
-    	 * EXCAVATION
-    	 */
-    	if(Excavation.canBeGigaDrillBroken(block) && mcPermissions.getInstance().excavation(player) && block.getData() != (byte) 5)
-    	{
-    		if(LoadProperties.excavationRequiresShovel && ItemChecks.isShovel(inhand))
-    			Excavation.excavationProcCheck(block, player);
-    		else if(!LoadProperties.excavationRequiresShovel)
-    			Excavation.excavationProcCheck(block, player);
-    	}
-    	
-    	//Change the byte back when broken
-    	if(block.getData() == 5 && m.shouldBeWatched(block.getType()))
-    	{
-    		block.setData((byte) 0);
-    		if(plugin.misc.blockWatchList.contains(block))
-    			plugin.misc.blockWatchList.remove(block);
-    	}
+    public void onBlockBreak(BlockBreakEvent event) {
+        Player player = event.getPlayer();
+        PlayerProfile PP = Users.getProfile(player);
+        Block block = event.getBlock();
+        Material mat = block.getType();
+        ItemStack inhand = player.getItemInHand();
+
+        if(event instanceof FakeBlockBreakEvent) {
+            return;
+        }
+
+        /*
+         * HERBALISM
+         */
+
+        //Green Terra
+        if (PP.getHoePreparationMode() && mcPermissions.getInstance().herbalismAbility(player) && ((mat.equals(Material.CROPS) && block.getData() == (byte) 0x7) || Herbalism.canBeGreenTerra(block))) {
+            Skills.abilityCheck(player, SkillType.HERBALISM);
+        }
+
+        //Wheat && Triple drops
+        if (PP.getGreenTerraMode() && Herbalism.canBeGreenTerra(block)) {
+            Herbalism.herbalismProcCheck(block, player, event, plugin);
+        }
+
+        if (mcPermissions.getInstance().herbalism(player) && block.getData() != (byte) 0x5 && Herbalism.canBeGreenTerra(block)) {
+            Herbalism.herbalismProcCheck(block, player, event, plugin);
+        }
+
+        /*
+         * MINING
+         */
+
+        if (mcPermissions.getInstance().mining(player) && Mining.canBeSuperBroken(block)) {
+            if (LoadProperties.miningrequirespickaxe && ItemChecks.isMiningPick(inhand)) {
+                Mining.miningBlockCheck(player, block, plugin);
+            }
+            else if (!LoadProperties.miningrequirespickaxe) {
+                Mining.miningBlockCheck(player, block, plugin);
+            }
+        }
+
+        /*
+         * WOOD CUTTING
+         */
+
+        if(mcPermissions.getInstance().woodcutting(player) && mat.equals(Material.LOG)) {
+            if (LoadProperties.woodcuttingrequiresaxe && ItemChecks.isAxe(inhand)) {
+                WoodCutting.woodcuttingBlockCheck(player, block, plugin);
+            }
+            else if (!LoadProperties.woodcuttingrequiresaxe) {
+                WoodCutting.woodcuttingBlockCheck(player, block, plugin);
+            }
+
+            if (PP.getTreeFellerMode()) {
+                WoodCutting.treeFeller(event, plugin);
+            }
+        }
+
+        /*
+         * EXCAVATION
+         */
+
+        if (Excavation.canBeGigaDrillBroken(block) && mcPermissions.getInstance().excavation(player) && block.getData() != (byte) 0x5) {
+            if(LoadProperties.excavationRequiresShovel && ItemChecks.isShovel(inhand)) {
+                Excavation.excavationProcCheck(block, player);
+            }
+            else if(!LoadProperties.excavationRequiresShovel) {
+                Excavation.excavationProcCheck(block, player);
+            }
+        }
+
+        //Change the byte back when broken
+        if (block.getData() == (byte) 0x5 && BlockChecks.shouldBeWatched(mat)) {
+            block.setData((byte) 0x0);
+        }
+        else if(plugin.misc.blockWatchList.contains(block)) {
+            plugin.misc.blockWatchList.remove(block);
+        }
     }
 
     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
     public void onBlockDamage(BlockDamageEvent event) 
     {
-    	Player player = event.getPlayer();
-    	PlayerProfile PP = Users.getProfile(player);
-    	ItemStack inhand = player.getItemInHand();
-    	Block block = event.getBlock();
-    	int id = block.getTypeId();
-    	Material mat = block.getType();
+        Player player = event.getPlayer();
+        PlayerProfile PP = Users.getProfile(player);
+        ItemStack inhand = player.getItemInHand();
+        Block block = event.getBlock();
+        int id = block.getTypeId();
+        Material mat = block.getType();
 
-    	/*
-    	 * ABILITY PREPARATION CHECKS
-    	 */
-    	if(m.abilityBlockCheck(mat))
-    	{
-	   		if(PP.getHoePreparationMode() && Herbalism.canBeGreenTerra(block))
-	   			Skills.abilityCheck(player, SkillType.HERBALISM);
-	    	if(PP.getAxePreparationMode() && mat.equals(Material.LOG) && mcPermissions.getInstance().woodCuttingAbility(player))
-	    		Skills.abilityCheck(player, SkillType.WOODCUTTING);
-	    	if(PP.getPickaxePreparationMode() && Mining.canBeSuperBroken(block))
-	    		Skills.abilityCheck(player, SkillType.MINING);
-	    	if(PP.getShovelPreparationMode() && Excavation.canBeGigaDrillBroken(block))
-	    		Skills.abilityCheck(player, SkillType.EXCAVATION);
-    	}
-    	
-    	if(PP.getFistsPreparationMode() && (Excavation.canBeGigaDrillBroken(block) || mat.equals(Material.SNOW)))
-    		Skills.abilityCheck(player, SkillType.UNARMED);
-    	
-    	/*
-    	 * TREE FELLER STUFF
-    	 */
-    	if(LoadProperties.spoutEnabled && mat.equals(Material.LOG) && PP.getTreeFellerMode())
-    		SpoutStuff.playSoundForPlayer(SoundEffect.FIZZ, player, block.getLocation());
-    	
-    	/*
-    	 * GREEN TERRA STUFF
-    	 */
-    	if(PP.getGreenTerraMode() && mcPermissions.getInstance().herbalismAbility(player))
-   			Herbalism.greenTerra(player, block);
-    	
-    	/*
-    	 * GIGA DRILL BREAKER CHECKS
-    	 */
-    	if(PP.getGigaDrillBreakerMode() && Excavation.canBeGigaDrillBroken(block) && m.blockBreakSimulate(block, player, true) && mcPermissions.getInstance().excavationAbility(player))
-    	{	
-    		if(LoadProperties.excavationRequiresShovel && ItemChecks.isShovel(inhand))
-    		{
-    			event.setInstaBreak(true);
-    			Excavation.gigaDrillBreaker(player, block);
-    		}
-    		else if(!LoadProperties.excavationRequiresShovel)
-    		{
-    			event.setInstaBreak(true);
-    			Excavation.gigaDrillBreaker(player, block);
-    		}
-    	}
-    	/*
-    	 * BERSERK MODE CHECKS
-    	 */
-    	if(PP.getBerserkMode() 
-    		&& m.blockBreakSimulate(block, player, true) 
-    		&& player.getItemInHand().getTypeId() == 0 
-    		&& (Excavation.canBeGigaDrillBroken(block) || id == 78)
-    		&& mcPermissions.getInstance().unarmedAbility(player))
-    	{
-    		event.setInstaBreak(true);
-			
-    		if(LoadProperties.spoutEnabled)
-    			SpoutStuff.playSoundForPlayer(SoundEffect.POP, player, block.getLocation());
-    	}
-    	
-    	/*
-    	 * SUPER BREAKER CHECKS
-    	 */
-    	if(PP.getSuperBreakerMode() 
-    		&& Mining.canBeSuperBroken(block)
-    		&& m.blockBreakSimulate(block, player, true)
-    		&& mcPermissions.getInstance().miningAbility(player))
-    	{
-    		if(LoadProperties.miningrequirespickaxe)
-    		{
-    			if(ItemChecks.isMiningPick(inhand)){
-    			    
-    				event.setInstaBreak(true);
-    				Mining.SuperBreakerBlockCheck(player, block, plugin);
-    			}
-    		} else {
-    			event.setInstaBreak(true);
-    			Mining.SuperBreakerBlockCheck(player, block, plugin);
-    		}
-    	}
-    	
-    	/*
-    	 * LEAF BLOWER CHECKS
-    	 */
-    	if(id == 18 
-    		&& mcPermissions.getInstance().woodCuttingAbility(player) 
-    		&& PP.getSkillLevel(SkillType.WOODCUTTING) >= 100 
-    		&& m.blockBreakSimulate(block, player, true))
-    	{	
-    		if(LoadProperties.woodcuttingrequiresaxe)
-    		{
-    			if(ItemChecks.isAxe(inhand)){
-    				event.setInstaBreak(true);
-    				WoodCutting.leafBlower(player, block);
-    			}
-    		}
-    		else if(inhand.getTypeId() != 359)
-    		{
-    			event.setInstaBreak(true);
-    			WoodCutting.leafBlower(player, block);
-    		}
-    		
-    	}
+        /*
+         * ABILITY PREPARATION CHECKS
+         */
+        if(BlockChecks.abilityBlockCheck(mat))
+        {
+               if(PP.getHoePreparationMode() && Herbalism.canBeGreenTerra(block))
+                   Skills.abilityCheck(player, SkillType.HERBALISM);
+            if(PP.getAxePreparationMode() && mat.equals(Material.LOG) && mcPermissions.getInstance().woodCuttingAbility(player))
+                Skills.abilityCheck(player, SkillType.WOODCUTTING);
+            if(PP.getPickaxePreparationMode() && Mining.canBeSuperBroken(block))
+                Skills.abilityCheck(player, SkillType.MINING);
+            if(PP.getShovelPreparationMode() && Excavation.canBeGigaDrillBroken(block))
+                Skills.abilityCheck(player, SkillType.EXCAVATION);
+        }
+        
+        if(PP.getFistsPreparationMode() && (Excavation.canBeGigaDrillBroken(block) || mat.equals(Material.SNOW)))
+            Skills.abilityCheck(player, SkillType.UNARMED);
+        
+        /*
+         * TREE FELLER STUFF
+         */
+        if(LoadProperties.spoutEnabled && mat.equals(Material.LOG) && PP.getTreeFellerMode())
+            SpoutStuff.playSoundForPlayer(SoundEffect.FIZZ, player, block.getLocation());
+        
+        /*
+         * GREEN TERRA STUFF
+         */
+        if(PP.getGreenTerraMode() && mcPermissions.getInstance().herbalismAbility(player))
+               Herbalism.greenTerra(player, block);
+        
+        /*
+         * GIGA DRILL BREAKER CHECKS
+         */
+        if(PP.getGigaDrillBreakerMode() && Excavation.canBeGigaDrillBroken(block) && m.blockBreakSimulate(block, player, true) && mcPermissions.getInstance().excavationAbility(player))
+        {    
+            if(LoadProperties.excavationRequiresShovel && ItemChecks.isShovel(inhand))
+            {
+                event.setInstaBreak(true);
+                Excavation.gigaDrillBreaker(player, block);
+            }
+            else if(!LoadProperties.excavationRequiresShovel)
+            {
+                event.setInstaBreak(true);
+                Excavation.gigaDrillBreaker(player, block);
+            }
+        }
+        /*
+         * BERSERK MODE CHECKS
+         */
+        if(PP.getBerserkMode() 
+            && m.blockBreakSimulate(block, player, true) 
+            && player.getItemInHand().getTypeId() == 0 
+            && (Excavation.canBeGigaDrillBroken(block) || id == 78)
+            && mcPermissions.getInstance().unarmedAbility(player))
+        {
+            event.setInstaBreak(true);
+            
+            if(LoadProperties.spoutEnabled)
+                SpoutStuff.playSoundForPlayer(SoundEffect.POP, player, block.getLocation());
+        }
+        
+        /*
+         * SUPER BREAKER CHECKS
+         */
+        if(PP.getSuperBreakerMode() 
+            && Mining.canBeSuperBroken(block)
+            && m.blockBreakSimulate(block, player, true)
+            && mcPermissions.getInstance().miningAbility(player))
+        {
+            if(LoadProperties.miningrequirespickaxe)
+            {
+                if(ItemChecks.isMiningPick(inhand)){
+                    
+                    event.setInstaBreak(true);
+                    Mining.SuperBreakerBlockCheck(player, block, plugin);
+                }
+            } else {
+                event.setInstaBreak(true);
+                Mining.SuperBreakerBlockCheck(player, block, plugin);
+            }
+        }
+        
+        /*
+         * LEAF BLOWER CHECKS
+         */
+        if(id == 18 
+            && mcPermissions.getInstance().woodCuttingAbility(player) 
+            && PP.getSkillLevel(SkillType.WOODCUTTING) >= 100 
+            && m.blockBreakSimulate(block, player, true))
+        {    
+            if(LoadProperties.woodcuttingrequiresaxe)
+            {
+                if(ItemChecks.isAxe(inhand)){
+                    event.setInstaBreak(true);
+                    WoodCutting.leafBlower(player, block);
+                }
+            }
+            else if(inhand.getTypeId() != 359)
+            {
+                event.setInstaBreak(true);
+                WoodCutting.leafBlower(player, block);
+            }
+            
+        }
     }
     
     @EventHandler
@@ -300,7 +292,7 @@ public class mcBlockListener implements Listener
     {
         Block blockFrom = event.getBlock();
         Block blockTo = event.getToBlock();
-        if(m.shouldBeWatched(blockFrom.getType()) && blockFrom.getData() == (byte)5)
-        	blockTo.setData((byte)5);
-    }    
+        if(BlockChecks.shouldBeWatched(blockFrom.getType()) && blockFrom.getData() == (byte)5)
+            blockTo.setData((byte)5);
+    }
 }

+ 7 - 3
src/main/java/com/gmail/nossr50/listeners/mcEntityListener.java

@@ -60,8 +60,10 @@ public class mcEntityListener implements Listener
 		{
 			if(!defender.getWorld().getPVP())
 				return;
-			if(Party.getInstance().inSameParty((Player)defender, (Player)attacker))
+			if(Party.getInstance().inSameParty((Player)defender, (Player)attacker)) {
 				event.setCancelled(true);
+				return;
+			}
 		}
 		
 		//Make sure defender is not invincible
@@ -91,8 +93,10 @@ public class mcEntityListener implements Listener
     		 */
     		Player player = (Player) entity;
     		PlayerProfile PP = Users.getProfile(player);
-    		if(PP.getGodMode())
-    			event.setCancelled(true);
+            if(PP.getGodMode()) {
+                event.setCancelled(true);
+                return;
+            }
     		
     		if(!m.isInvincible(player, event))
     		{

+ 11 - 4
src/main/java/com/gmail/nossr50/listeners/mcPlayerListener.java

@@ -28,6 +28,7 @@ import org.bukkit.event.player.PlayerPickupItemEvent;
 import org.bukkit.event.player.PlayerQuitEvent;
 import org.bukkit.inventory.ItemStack;
 
+import com.gmail.nossr50.BlockChecks;
 import com.gmail.nossr50.Combat;
 import com.gmail.nossr50.Item;
 import com.gmail.nossr50.ItemChecks;
@@ -156,7 +157,13 @@ public class mcPlayerListener implements Listener
 		Action action = event.getAction();
 		Block block = event.getClickedBlock();
 		ItemStack is = player.getItemInHand();
-		Material mat = block.getType();
+		Material mat;
+        if (block == null) {
+            mat = Material.AIR;
+        }
+        else {
+            mat = block.getType();
+        }
 		
 		/*
 		 * Ability checks
@@ -171,7 +178,7 @@ public class mcPlayerListener implements Listener
 				player.updateInventory();
 			}
 
-			if(LoadProperties.enableAbilities && m.abilityBlockCheck(mat))
+			if(LoadProperties.enableAbilities && BlockChecks.abilityBlockCheck(mat))
 			{
 				if(block != null && ItemChecks.isHoe(is) && !mat.equals(Material.DIRT) && !mat.equals(Material.GRASS) && !mat.equals(Material.SOIL))
 					Skills.activationCheck(player, SkillType.HERBALISM);
@@ -241,7 +248,7 @@ public class mcPlayerListener implements Listener
 		 */
 		if(action == Action.RIGHT_CLICK_AIR)
 			Item.itemchecks(player);
-		if(action == Action.RIGHT_CLICK_BLOCK && m.abilityBlockCheck(mat))
+		if(action == Action.RIGHT_CLICK_BLOCK && BlockChecks.abilityBlockCheck(mat))
 			Item.itemchecks(player);
 		
 		if(player.isSneaking() && mcPermissions.getInstance().taming(player) && (action == Action.LEFT_CLICK_AIR || action == Action.LEFT_CLICK_BLOCK))
@@ -331,4 +338,4 @@ public class mcPlayerListener implements Listener
 			event.getPlayer().chat(message.replaceFirst(command, plugin.aliasMap.get(command)));
 		}
 	}
-}
+}

+ 219 - 184
src/main/java/com/gmail/nossr50/m.java

@@ -7,7 +7,6 @@ import java.util.logging.Logger;
 
 import org.bukkit.Bukkit;
 import org.bukkit.Location;
-import org.bukkit.Material;
 import org.bukkit.block.Block;
 import org.bukkit.entity.*;
 import org.bukkit.event.entity.EntityDamageEvent;
@@ -73,54 +72,6 @@ public class m {
         }
     }
 
-    /**
-     * Checks to see if a block type awards XP.
-     *
-     * @param material Block type to check
-     * @return true if the block type awards XP, false otherwise
-     */
-    public static boolean shouldBeWatched(Material material) {
-        switch (material) {
-        case BROWN_MUSHROOM:
-        case CACTUS:
-        case CLAY:
-        case COAL_ORE:
-        case DIAMOND_ORE:
-        case DIRT:
-        case ENDER_STONE:
-        case GLOWING_REDSTONE_ORE:
-        case GLOWSTONE:
-        case GOLD_ORE:
-        case GRASS:
-        case GRAVEL:
-        case IRON_ORE:
-        case JACK_O_LANTERN:
-        case LAPIS_ORE:
-        case LOG:
-        case MELON_BLOCK:
-        case MOSSY_COBBLESTONE:
-        case MYCEL:
-        case NETHERRACK:
-        case OBSIDIAN:
-        case PUMPKIN:
-        case RED_MUSHROOM:
-        case RED_ROSE:
-        case REDSTONE_ORE:
-        case SAND:
-        case SANDSTONE:
-        case SOUL_SAND:
-        case STONE:
-        case SUGAR_CANE_BLOCK:
-        case VINE:
-        case WATER_LILY:
-        case YELLOW_FLOWER:
-            return true;
-
-        default:
-            return false;
-        }
-    }
-
     /**
      * Gets the power level of a player.
      *
@@ -173,199 +124,282 @@ public class m {
      * @param inHand The item to check the tier of
      * @return the tier of the item
      */
-    public static Integer getTier(ItemStack inHand)
-    {
-        if(Repair.isWoodTools(inHand))
-            return 1;
-        if(Repair.isStoneTools(inHand))
-            return 2;
-        if(Repair.isIronTools(inHand))
-            return 3;
-        if(Repair.isGoldTools(inHand))
-            return 1;
-        if(Repair.isDiamondTools(inHand))
-            return 4;
-        
-        return 1;
+    public static Integer getTier(ItemStack inHand) {
+        int tier = 0;
+
+        if (Repair.isWoodTools(inHand)) {
+            tier = 1;
+        }
+        else if (Repair.isStoneTools(inHand)) {
+            tier = 2;
+        }
+        else if (Repair.isIronTools(inHand)) {
+            tier = 3;
+        }
+        else if(Repair.isGoldTools(inHand)) {
+            tier = 1;
+        }
+        else if(Repair.isDiamondTools(inHand))
+            tier = 4;
+
+        return tier;
     }
-    
+
+    /**
+     * Determine if two locations are near each other.
+     *
+     * @param first The first location
+     * @param second The second location
+     * @param maxDistance The max distance apart
+     * @return true if the distance between <code>first</code> and <code>second</code> is less than <code>maxDistance</code>, false otherwise
+     */
     public static boolean isNear(Location first, Location second, int maxDistance) {
         double relX = first.getX() - second.getX();
         double relY = first.getY() - second.getY();
         double relZ = first.getZ() - second.getZ();
-        double dist = relX * relX + relY * relY + relZ * relZ;
-        
-        if (dist < maxDistance * maxDistance)
+        double dist = (relX * relX) + (relY * relY) + (relZ * relZ);
+
+        if (dist < maxDistance * maxDistance) {
             return true;
-        
-        return false;
-    }
-    
-    public static boolean abilityBlockCheck(Material material)
-    {
-        switch(material){
-        case BED_BLOCK:
-        case BREWING_STAND:
-        case BOOKSHELF:
-        case BURNING_FURNACE:
-        case CAKE_BLOCK:
-        case CHEST:
-        case DISPENSER:
-        case ENCHANTMENT_TABLE:
-        case FENCE_GATE:
-        case FURNACE:
-        case IRON_DOOR_BLOCK:
-        case JUKEBOX:
-        case LEVER:
-        case NOTE_BLOCK:
-        case STONE_BUTTON:
-        case TRAP_DOOR:
-        case WALL_SIGN:
-        case WOODEN_DOOR:
-        case WORKBENCH:
-            return false;
         }
-        
-        if(Material.getMaterial(LoadProperties.anvilID).equals(material))
+        else {
             return false;
-        
-        return true;
+        }
     }
-    
-    public static boolean isInt(String string)
-    {
-        try 
-        {
+
+    /**
+     * Determine if a string represents an Integer
+     *
+     * @param string String to check
+     * @return true if the string is an Integer, false otherwise
+     */
+    public static boolean isInt(String string) {
+        try {
             Integer.parseInt(string);
+            return true;
         }
-        catch(NumberFormatException nFE) 
-        {
+        catch (NumberFormatException nFE) {
             return false;
         }
-        return true;
     }
-    
-    public static void mcDropItems(Location location, ItemStack is, int quantity)
-    {
-        for(int i = 0; i < quantity; i++)
+
+    /**
+     * Drop items at a given location.
+     *
+     * @param location The location to drop the items at
+     * @param is The items to drop
+     * @param quantity The amount of items to drop
+     */
+    public static void mcDropItems(Location location, ItemStack is, int quantity) {
+        for (int i = 0; i < quantity; i++) {
             mcDropItem(location, is);
+        }
     }
-    
-    public static void mcRandomDropItem(Location location, ItemStack is, int chance)
-    {
-        if(Math.random() * 100 < chance)
+
+    /**
+     * Randomly drop an item at a given location.
+     *
+     * @param location The location to drop the items at
+     * @param is The item to drop
+     * @param chance The percentage chance for the item to drop
+     */
+    public static void mcRandomDropItem(Location location, ItemStack is, double chance) {
+        if (Math.random() * 100 < chance) {
             mcDropItem(location, is);
+        }
     }
-    
-    public static void mcRandomDropItems(Location location, ItemStack is, int chance, int quantity)
-    {
-        for(int i = 0; i < quantity; i++)
+
+    /**
+     * Randomly drop items at a given location.
+     *
+     * @param location The location to drop the items at
+     * @param is The item to drop
+     * @param chance The percentage chance for the item to drop
+     * @param quantity The amount of items to drop
+     */
+    public static void mcRandomDropItems(Location location, ItemStack is, int chance, int quantity) {
+        for(int i = 0; i < quantity; i++) {
             mcRandomDropItem(location, is, chance);
+        }
     }
-    
+
+    /**
+     * Drop an item at a given location.
+     *
+     * @param location The location to drop the item at
+     * @param itemStack The item to drop
+     */
     public static void mcDropItem(Location location, ItemStack itemStack) {
+
         // We can't get the item until we spawn it and we want to make it cancellable, so we have a custom event.
         McMMOItemSpawnEvent event = new McMMOItemSpawnEvent(location, itemStack);
         Bukkit.getPluginManager().callEvent(event);
-        if(event.isCancelled()) return;
-        
-        location.getWorld().dropItemNaturally(location, itemStack);
-    }
 
-    public static boolean isOre(Block block)
-    {
-        switch (block.getType()) {
-        case COAL_ORE:
-        case DIAMOND_ORE:
-        case GLOWING_REDSTONE_ORE:
-        case GOLD_ORE:
-        case IRON_ORE:
-        case LAPIS_ORE:
-        case REDSTONE_ORE:
-            return true;
+        if (event.isCancelled()) {
+            return;
+        }
+        else {
+            location.getWorld().dropItemNaturally(location, itemStack);
         }
-        return false;
     }
-    
-    public static void convertToMySQL()
-    {
-        if(!LoadProperties.useMySQL)
+
+    /**
+     * Convert FlatFile data to MySQL data.
+     */
+    public static void convertToMySQL() {
+        if (!LoadProperties.useMySQL) {
             return;
-        
-        Bukkit.getScheduler().scheduleAsyncDelayedTask(Bukkit.getServer().getPluginManager().getPlugin("mcMMO"), new Runnable(){
+        }
+
+        Bukkit.getScheduler().scheduleAsyncDelayedTask(Bukkit.getPluginManager().getPlugin("mcMMO"), new Runnable() {
             public void run() {
                 String location = "plugins/mcMMO/FlatFileStuff/mcmmo.users";
+
                 try {
+
                     //Open the user file
                     FileReader file = new FileReader(location);
                     BufferedReader in = new BufferedReader(file);
                     String line = "";
-                    String playerName = null, mining = null, party = null, miningXP = null, woodcutting = null, woodCuttingXP = null, repair = null, unarmed = null, herbalism = null, excavation = null, archery = null, swords = null, axes = null, acrobatics = null, repairXP = null, unarmedXP = null, herbalismXP = null, excavationXP = null, archeryXP = null, swordsXP = null, axesXP = null, acrobaticsXP = null, taming = null, tamingXP = null, fishing = null, fishingXP = null;
-                    int id = 0, theCount = 0;
+                    String playerName = null;
+                    String party = null;
+                    String mining = null;
+                    String woodcutting = null;
+                    String repair = null;
+                    String unarmed = null;
+                    String herbalism = null;
+                    String excavation = null;
+                    String archery = null;
+                    String swords = null;
+                    String axes = null;
+                    String acrobatics = null;
+                    String taming = null;
+                    String fishing = null;
+                    String miningXP = null;
+                    String woodCuttingXP = null;
+                    String repairXP = null;
+                    String unarmedXP = null;
+                    String herbalismXP = null;
+                    String excavationXP = null;
+                    String archeryXP = null;
+                    String swordsXP = null;
+                    String axesXP = null;
+                    String acrobaticsXP = null;
+                    String tamingXP = null;
+                    String fishingXP = null;
+                    int id = 0;
+                    int theCount = 0;
+
                     while ((line = in.readLine()) != null) {
+
                         //Find if the line contains the player we want.
                         String[] character = line.split(":");
                         playerName = character[0];
+
                         //Check for things we don't want put in the DB
-                        if (playerName == null
-                                || playerName.equals("null")
-                                || playerName
-                                        .equals("#Storage place for user information"))
+                        if (playerName == null || playerName.equals("null") || playerName.equals("#Storage place for user information")) {
                             continue;
+                        }
 
-                        //Get Mining
-                        if (character.length > 1)
+                        if (character.length > 1) {
                             mining = character[1];
-                        //Party
-                        if (character.length > 3)
+                        }
+
+                        if (character.length > 3) {
                             party = character[3];
-                        //Mining XP
-                        if (character.length > 4)
+                        }
+
+                        if (character.length > 4) {
                             miningXP = character[4];
-                        if (character.length > 5)
+                        }
+
+                        if (character.length > 5) {
                             woodcutting = character[5];
-                        if (character.length > 6)
+                        }
+
+                        if (character.length > 6) {
                             woodCuttingXP = character[6];
-                        if (character.length > 7)
+                        }
+
+                        if (character.length > 7) {
                             repair = character[7];
-                        if (character.length > 8)
+                        }
+
+                        if (character.length > 8) {
                             unarmed = character[8];
-                        if (character.length > 9)
+                        }
+
+                        if (character.length > 9) {
                             herbalism = character[9];
-                        if (character.length > 10)
+                        }
+
+                        if (character.length > 10) {
                             excavation = character[10];
-                        if (character.length > 11)
+                        }
+
+                        if (character.length > 11) {
                             archery = character[11];
-                        if (character.length > 12)
+                        }
+
+                        if (character.length > 12) {
                             swords = character[12];
-                        if (character.length > 13)
+                        }
+
+                        if (character.length > 13) {
                             axes = character[13];
-                        if (character.length > 14)
+                        }
+
+                        if (character.length > 14) {
                             acrobatics = character[14];
-                        if (character.length > 15)
+                        }
+
+                        if (character.length > 15) {
                             repairXP = character[15];
-                        if (character.length > 16)
+                        }
+
+                        if (character.length > 16) {
                             unarmedXP = character[16];
-                        if (character.length > 17)
+                        }
+
+                        if (character.length > 17) {
                             herbalismXP = character[17];
-                        if (character.length > 18)
+                        }
+
+                        if (character.length > 18) {
                             excavationXP = character[18];
-                        if (character.length > 19)
+                        }
+
+                        if (character.length > 19) {
                             archeryXP = character[19];
-                        if (character.length > 20)
+                        }
+
+                        if (character.length > 20) {
                             swordsXP = character[20];
-                        if (character.length > 21)
+                        }
+
+                        if (character.length > 21) {
                             axesXP = character[21];
-                        if (character.length > 22)
+                        }
+
+                        if (character.length > 22) {
                             acrobaticsXP = character[22];
-                        if (character.length > 24)
+                        }
+
+                        if (character.length > 24) {
                             taming = character[24];
-                        if (character.length > 25)
+                        }
+
+                        if (character.length > 25) {
                             tamingXP = character[25];
-                        if (character.length > 34)
+                        }
+
+                        if (character.length > 34) {
                             fishing = character[34];
-                        if (character.length > 35)
+                        }
+
+                        if (character.length > 35) {
                             fishingXP = character[35];
+                        }
 
                         //Check to see if the user is in the DB
                         id = mcMMO.database.getInt("SELECT id FROM "
@@ -374,6 +408,7 @@ public class m {
 
                         if (id > 0) {
                             theCount++;
+
                             //Update the skill values
                             mcMMO.database.write("UPDATE "
                                     + LoadProperties.MySQLtablePrefix
@@ -415,8 +450,10 @@ public class m {
                                     + getInt(acrobaticsXP) + ", fishing = "
                                     + getInt(fishingXP) + " WHERE user_id = "
                                     + id);
-                        } else {
+                        }
+                        else {
                             theCount++;
+
                             //Create the user in the DB
                             mcMMO.database.write("INSERT INTO "
                                     + LoadProperties.MySQLtablePrefix
@@ -478,16 +515,14 @@ public class m {
                                     + id);
                         }
                     }
-                    System.out
-                            .println("[mcMMO] MySQL Updated from users file, "
-                                    + theCount
-                                    + " items added/updated to MySQL DB");
+
+                    System.out.println("[mcMMO] MySQL Updated from users file, " + theCount + " items added/updated to MySQL DB");
                     in.close();
-                } catch (Exception e) {
-                    log.log(Level.SEVERE, "Exception while reading " + location
-                            + " (Are you sure you formatted it correctly?)", e);
+                }
+                catch (Exception e) {
+                    log.log(Level.SEVERE, "Exception while reading " + location + " (Are you sure you formatted it correctly?)", e);
                 }
             }
         }, 1);
     }
-}
+}

+ 531 - 365
src/main/java/com/gmail/nossr50/mcMMO.java

@@ -17,8 +17,6 @@ import com.gmail.nossr50.locale.mcLocale;
 import com.gmail.nossr50.party.Party;
 import com.gmail.nossr50.skills.*;
 
-import org.bukkit.Bukkit;
-
 import java.io.BufferedInputStream;
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
@@ -35,6 +33,7 @@ import java.util.HashMap;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import org.bukkit.Bukkit;
 import org.bukkit.plugin.Plugin;
 import org.bukkit.plugin.PluginDescriptionFile;
 import org.bukkit.plugin.java.JavaPlugin;
@@ -46,367 +45,534 @@ import org.bukkit.entity.Player;
 import org.getspout.spoutapi.SpoutManager;
 import org.getspout.spoutapi.player.FileManager;
 
+public class mcMMO extends JavaPlugin {
+
+    public static String maindirectory = "plugins" + File.separator + "mcMMO";
+    public static File file = new File(maindirectory + File.separator + "config.yml");
+    public static File versionFile = new File(maindirectory + File.separator + "VERSION");
+    public static final Logger log = Logger.getLogger("Minecraft"); 
+
+    private final mcPlayerListener playerListener = new mcPlayerListener(this);
+    private final mcBlockListener blockListener = new mcBlockListener(this);
+    private final mcEntityListener entityListener = new mcEntityListener(this);
+
+    //Queue for block data change for R2+ fix
+    public ArrayDeque<Block> changeQueue = new ArrayDeque<Block>();
+    public ArrayDeque<Block> fastChangeQueue = new ArrayDeque<Block>();
+
+    private Runnable mcMMO_Timer = new mcTimer(this); //BLEED AND REGENERATION
+    private Runnable mcMMO_SaveTimer = new mcSaveTimer(this); //Periodic saving of Player Data
+    private Runnable ChangeDataValueTimer = new ChangeDataValueTimer(changeQueue); //R2 block place workaround
+    private Runnable FastChangeDataValueTimer = new ChangeDataValueTimer(fastChangeQueue); //R2 block place workaround for instant-break stuff
+
+    //Alias - Command
+    public HashMap<String, String> aliasMap = new HashMap<String, String>();
+
+    public static Database database = null;
+    public Misc misc = new Misc(this);
+
+    //Config file stuff
+    LoadProperties config;
+    LoadTreasures config2;
+
+    //Jar stuff
+    public static File mcmmo;
+
+    /**
+     * Things to be run when the plugin is enabled.
+     */
+    public void onEnable() {
+        final Plugin thisPlugin = this;
+        mcmmo = this.getFile();
+        new File(maindirectory).mkdir();
+
+        if (!versionFile.exists()) {
+            updateVersion();
+        }
+        else {
+            String vnum = readVersion();
+
+            //This will be changed to whatever version preceded when we actually need updater code.
+            //Version 1.0.48 is the first to implement this, no checking before that version can be done.
+            if (vnum.equalsIgnoreCase("1.0.48")) {
+                updateFrom(1);
+            }
+
+            //Just add in more else if blocks for versions that need updater code.  Increment the updateFrom age int as we do so.
+            //Catch all for versions not matching and no specific code being needed
+            else if (!vnum.equalsIgnoreCase(this.getDescription().getVersion())) {
+                updateFrom(-1);
+            }
+        }
+
+        this.config = new LoadProperties(this);
+        this.config.load();
+
+        this.config2 = new LoadTreasures(this);
+        this.config2.load();
+
+        Party.getInstance().loadParties();
+        new Party(this);
+
+        if (!LoadProperties.useMySQL) {
+            Users.getInstance().loadUsers();
+        }
+
+        PluginManager pm = getServer().getPluginManager();
+
+        if (pm.getPlugin("Spout") != null) {
+            LoadProperties.spoutEnabled = true;
+        }
+        else {
+            LoadProperties.spoutEnabled = false;
+        }
+
+        //Register events
+        pm.registerEvents(playerListener, this);
+        pm.registerEvents(blockListener, this);
+        pm.registerEvents(entityListener, this);
+
+        PluginDescriptionFile pdfFile = this.getDescription();
+
+        //Setup the leaderboards
+        if (LoadProperties.useMySQL) {
+            database = new Database(this);
+            database.createStructure();
+        }
+        else {
+            Leaderboard.makeLeaderboards();
+        }
+
+        for (Player player : getServer().getOnlinePlayers()) {
+            Users.addUser(player); //In case of reload add all users back into PlayerProfile
+        }
+
+        System.out.println(pdfFile.getName() + " version " + pdfFile.getVersion() + " is enabled!" );
+
+        //Periodic save timer (Saves every 10 minutes)
+        Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, mcMMO_SaveTimer, 0, LoadProperties.saveInterval * 1200);
+
+        //Bleed & Regen timer (Runs every 20 seconds)
+        Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, mcMMO_Timer, 0, 20);
+
+        //R2+ block place fix
+        Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, ChangeDataValueTimer, 0, 10);
+        Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, FastChangeDataValueTimer, 0, 1);
+
+        registerCommands();
+
+        //Spout Stuff
+        if (LoadProperties.spoutEnabled) {
+            SpoutStuff.setupSpoutConfigs();
+            SpoutStuff.registerCustomEvent();
+            SpoutStuff.extractFiles(); //Extract source materials
+
+            FileManager FM = SpoutManager.getFileManager();
+            FM.addToPreLoginCache(this, SpoutStuff.getFiles());
+        }
+
+        if (LoadProperties.statsTracking) {
+            //Plugin Metrics running in a new thread
+            new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        // create a new metrics object
+                        Metrics metrics = new Metrics();
+
+                        // 'this' in this context is the Plugin object
+                        metrics.beginMeasuringPlugin(thisPlugin);
+                    }
+                    catch (IOException e) {
+                        System.out.println("Failed to submit stats.");
+                    }
+                }
+            }).start();
+        }
+    }
+
+    /**
+     * Get profile of the player.
+     * </br>
+     * This function is designed for API usage.
+     *
+     * @param player Player whose profile to get
+     * @return the PlayerProfile object
+     */
+    public PlayerProfile getPlayerProfile(Player player) {
+        return Users.getProfile(player);
+    }
+
+    /**
+     * Check the XP of a player.
+     * </br>
+     * This function is designed for API usage.
+     *
+     * @param player
+     * @param skillType
+     */
+    public void checkXp(Player player, SkillType skillType) {
+        if (skillType == SkillType.ALL) {
+            Skills.XpCheckAll(player);
+        }
+        else {
+            Skills.XpCheckSkill(skillType, player);
+        }
+    }
+
+    /**
+     * Check if two players are in the same party.
+     * </br>
+     * This function is designed for API usage.
+     *
+     * @param playera The first player to check
+     * @param playerb The second player to check
+     * @return true if the two players are in the same party, false otherwise
+     */
+    public boolean inSameParty(Player playera, Player playerb) {
+        if (Users.getProfile(playera).inParty() && Users.getProfile(playerb).inParty()) {
+            if (Users.getProfile(playera).getParty().equals(Users.getProfile(playerb).getParty())) {
+                return true;
+            }
+            else {
+                return false;
+            }
+        }
+        else {
+            return false;
+        }
+    }
+
+    /**
+     * Get a list of all current party names.
+     * </br>
+     * This function is designed for API usage.
+     *
+     * @return the list of parties.
+     */
+    public ArrayList<String> getParties() {
+        String location = "plugins/mcMMO/mcmmo.users";
+        ArrayList<String> parties = new ArrayList<String>();
+
+        try {
+
+            //Open the users file
+            FileReader file = new FileReader(location);
+            BufferedReader in = new BufferedReader(file);
+            String line = "";
+
+            while((line = in.readLine()) != null) {
+                String[] character = line.split(":");
+                String theparty = null;
+
+                //Party
+                if (character.length > 3) {
+                    theparty = character[3];
+                }
+
+                if (!parties.contains(theparty)) {
+                    parties.add(theparty);
+                }
+            }
+            in.close();
+        }
+        catch (Exception e) {
+            log.log(Level.SEVERE, "Exception while reading " + location + " (Are you sure you formatted it correctly?)", e);
+        }
+        return parties;
+    }
+
+    /**
+     * Get the name of the party a player is in.
+     * </br>
+     * This function is designed for API usage.
+     *
+     * @param player The player to check the party name of
+     * @return the name of the player's party
+     */
+    public static String getPartyName(Player player) {
+        PlayerProfile PP = Users.getProfile(player);
+        return PP.getParty();
+    }
+
+    /**
+     * Checks if a player is in a party.
+     * </br>
+     * This function is designed for API usage.
+     *
+     * @param player The player to check
+     * @return true if the player is in a party, false otherwise
+     */
+    public static boolean inParty(Player player) {
+        PlayerProfile PP = Users.getProfile(player);
+        return PP.inParty();
+    }
+
+    /**
+     * Things to be run when the plugin is disabled.
+     */
+    public void onDisable() {
+
+        //Make sure to save player information if the server shuts down
+        for (Player x : Bukkit.getOnlinePlayers()) {
+            Users.getProfile(x).save();
+        }
+
+        Bukkit.getServer().getScheduler().cancelTasks(this); //This removes our tasks
+        System.out.println("mcMMO was disabled."); //How informative!
+    }
+
+    /**
+     * Register the commands.
+     */
+    private void registerCommands() {
+
+        //Register aliases with the aliasmap (used in the playercommandpreprocessevent to ugly alias them to actual commands)
+        //Skills commands
+        aliasMap.put(mcLocale.getString("m.SkillAcrobatics").toLowerCase(), "acrobatics");
+        aliasMap.put(mcLocale.getString("m.SkillArchery").toLowerCase(), "archery");
+        aliasMap.put(mcLocale.getString("m.SkillAxes").toLowerCase(), "axes");
+        aliasMap.put(mcLocale.getString("m.SkillExcavation").toLowerCase(), "excavation");
+        aliasMap.put(mcLocale.getString("m.SkillFishing").toLowerCase(), "fishing");
+        aliasMap.put(mcLocale.getString("m.SkillHerbalism").toLowerCase(), "herbalism");
+        aliasMap.put(mcLocale.getString("m.SkillMining").toLowerCase(), "mining");
+        aliasMap.put(mcLocale.getString("m.SkillRepair").toLowerCase(), "repair");
+        aliasMap.put(mcLocale.getString("m.SkillSwords").toLowerCase(), "swords");
+        aliasMap.put(mcLocale.getString("m.SkillTaming").toLowerCase(), "taming");
+        aliasMap.put(mcLocale.getString("m.SkillUnarmed").toLowerCase(), "unarmed");
+        aliasMap.put(mcLocale.getString("m.SkillWoodCutting").toLowerCase(), "woodcutting");
+
+        //Register commands
+        //Skills commands
+        getCommand("acrobatics").setExecutor(new AcrobaticsCommand());
+        getCommand("archery").setExecutor(new ArcheryCommand());
+        getCommand("axes").setExecutor(new AxesCommand());
+        getCommand("excavation").setExecutor(new ExcavationCommand());
+        getCommand("fishing").setExecutor(new FishingCommand());
+        getCommand("herbalism").setExecutor(new HerbalismCommand());
+        getCommand("mining").setExecutor(new MiningCommand());
+        getCommand("repair").setExecutor(new RepairCommand());
+        getCommand("swords").setExecutor(new SwordsCommand());
+        getCommand("taming").setExecutor(new TamingCommand());
+        getCommand("unarmed").setExecutor(new UnarmedCommand());
+        getCommand("woodcutting").setExecutor(new WoodcuttingCommand());
+
+        //mc* commands
+        if (LoadProperties.mcremoveEnable) {
+            getCommand("mcremove").setExecutor(new McremoveCommand());
+        }
+
+        if (LoadProperties.mcabilityEnable) {
+            getCommand("mcability").setExecutor(new McabilityCommand());
+        }
+
+        if (LoadProperties.mccEnable) {
+            getCommand("mcc").setExecutor(new MccCommand());
+        }
+
+        if (LoadProperties.mcgodEnable) {
+            getCommand("mcgod").setExecutor(new McgodCommand());
+        }
+
+        if (LoadProperties.mcmmoEnable) {
+            getCommand("mcmmo").setExecutor(new McmmoCommand());
+        }
+
+        if (LoadProperties.mcrefreshEnable) {
+            getCommand("mcrefresh").setExecutor(new McrefreshCommand(this));
+        }
+
+        if (LoadProperties.mctopEnable) {
+            getCommand("mctop").setExecutor(new MctopCommand());
+        }
+
+        if (LoadProperties.mcstatsEnable) {
+            getCommand("mcstats").setExecutor(new McstatsCommand());
+        }
+
+        //Party commands
+        if (LoadProperties.acceptEnable) {
+            getCommand("accept").setExecutor(new AcceptCommand());
+        }
+
+        if (LoadProperties.aEnable) {
+            getCommand("a").setExecutor(new ACommand());
+        }
+
+        if (LoadProperties.inviteEnable) {
+            getCommand("invite").setExecutor(new InviteCommand(this));
+        }
+
+        if (LoadProperties.partyEnable) {
+            getCommand("party").setExecutor(new PartyCommand());
+        }
+
+        if (LoadProperties.pEnable) {
+            getCommand("p").setExecutor(new PCommand());
+        }
+
+        if (LoadProperties.ptpEnable) {
+            getCommand("ptp").setExecutor(new PtpCommand(this));
+        }
+
+        //Other commands
+        if (LoadProperties.addxpEnable) {
+            getCommand("addxp").setExecutor(new AddxpCommand(this));
+        }
+
+        if (LoadProperties.addlevelsEnable) {
+            getCommand("addlevels").setExecutor(new AddlevelsCommand(this));
+        }
+
+        if (LoadProperties.mmoeditEnable) {
+            getCommand("mmoedit").setExecutor(new MmoeditCommand(this));
+        }
+
+        if (LoadProperties.inspectEnable) {
+            getCommand("inspect").setExecutor(new InspectCommand(this));
+        }
+
+        if (LoadProperties.xprateEnable) {
+            getCommand("xprate").setExecutor(new XprateCommand());
+        }
+
+        getCommand("mmoupdate").setExecutor(new MmoupdateCommand());
+
+        //Spout commands
+        if (LoadProperties.xplockEnable) {
+            getCommand("xplock").setExecutor(new XplockCommand());
+        }
+
+        getCommand("mchud").setExecutor(new MchudCommand());
+    }
+
+    /**
+     * Update mcMMO from a given version
+     * </p>
+     * It is important to always assume that you are updating from the lowest possible version.
+     * Thus, every block of updater code should be complete and self-contained; finishing all 
+     * SQL transactions and closing all file handlers, such that the next block of updater code
+     * if called will handle updating as expected.
+     *
+     * @param age Specifies which updater code to run
+     */
+    public void updateFrom(int age) {
+
+        //No updater code needed, just update the version.
+        if (age == -1) {
+            updateVersion();
+            return;
+        }
+
+        //Updater code from age 1 goes here
+        if (age <= 1) {
+            //Since age 1 is an example for now, we will just let it do nothing.
+        }
+
+        //If we are updating from age 1 but we need more to reach age 2, this will run too.
+        if (age <= 2) {
+
+        }
+        updateVersion();
+    }
+
+    /**
+     * Update the version file.
+     */
+    public void updateVersion() {
+        try {
+            versionFile.createNewFile();
+            BufferedWriter vout = new BufferedWriter(new FileWriter(versionFile));
+            vout.write(this.getDescription().getVersion());
+            vout.close();
+        }
+        catch (IOException ex) {
+            ex.printStackTrace();
+        }
+        catch (SecurityException ex) {
+            ex.printStackTrace();
+        }
+    }
+
+    /**
+     * Get the current mcMMO version.
+     *
+     * @return a String representing the current mcMMO version
+     */
+    public String readVersion() {
+        byte[] buffer = new byte[(int) versionFile.length()];
+        BufferedInputStream f = null;
+
+        try {
+            f = new BufferedInputStream(new FileInputStream(versionFile));
+            f.read(buffer);
+        }
+        catch (FileNotFoundException ex) {
+            ex.printStackTrace();
+        }
+        catch (IOException ex) {
+            ex.printStackTrace();
+        }
+        finally {
+            if (f != null) {
+                try {
+                    f.close();
+                    }
+                catch (IOException ignored) {}
+            }
+        }
+        return new String(buffer);
+    }
+
+    /*
+     * Boilerplate Custom Config Stuff
+     */
+
+    private FileConfiguration treasuresConfig = null;
+    private File treasuresConfigFile = null;
+
+    /**
+     * Reload the Treasures.yml file.
+     */
+    public void reloadTreasuresConfig() {
+        if (treasuresConfigFile == null) {
+            treasuresConfigFile = new File(getDataFolder(), "treasures.yml");
+        }
+
+        treasuresConfig = YamlConfiguration.loadConfiguration(treasuresConfigFile);
+        InputStream defConfigStream = getResource("treasures.yml"); // Look for defaults in the jar
+
+        if (defConfigStream != null) {
+            YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream);
+            treasuresConfig.setDefaults(defConfig);
+        }
+    }
+
+    /**
+     * Get the Treasures config information.
+     *
+     * @return the configuration object for treasures.yml
+     */
+    public FileConfiguration getTreasuresConfig() {
+        if (treasuresConfig == null) {
+            reloadTreasuresConfig();
+        }
+
+        return treasuresConfig;
+    }
+
+    /**
+     * Save the Treasures config informtion.
+     */
+    public void saveTreasuresConfig() {
+        if (treasuresConfig == null || treasuresConfigFile == null) {
+            return;
+        }
 
-public class mcMMO extends JavaPlugin 
-{
-	
-	public static String maindirectory = "plugins" + File.separator + "mcMMO";
-	File file = new File(maindirectory + File.separator + "config.yml");
-	static File versionFile = new File(maindirectory + File.separator + "VERSION");
-	public static final Logger log = Logger.getLogger("Minecraft"); 
-	
-	private final mcPlayerListener playerListener = new mcPlayerListener(this);
-	private final mcBlockListener blockListener = new mcBlockListener(this);
-	private final mcEntityListener entityListener = new mcEntityListener(this);
-	
-	//Queue for block data change for R2+ fix
-	public ArrayDeque<Block> changeQueue = new ArrayDeque<Block>();
-	public ArrayDeque<Block> fastChangeQueue = new ArrayDeque<Block>();
-
-	private Runnable mcMMO_Timer = new mcTimer(this); //BLEED AND REGENERATION
-	private Runnable mcMMO_SaveTimer = new mcSaveTimer(this); //Periodic saving of Player Data
-	private Runnable ChangeDataValueTimer = new ChangeDataValueTimer(changeQueue);		//R2 block place workaround
-	private Runnable FastChangeDataValueTimer = new ChangeDataValueTimer(fastChangeQueue);
-
-	//Alias - Command
-	public HashMap<String, String> aliasMap = new HashMap<String, String>();
-	
-	public static Database database = null;
-	public Misc misc = new Misc(this);
-
-	//Config file stuff
-	LoadProperties config;
-	LoadTreasures config2;
-	
-	//Jar stuff
-	public static File mcmmo;
-
-	public void onEnable() 
-	{
-	    final Plugin thisPlugin = this;
-		mcmmo = this.getFile();
-		new File(maindirectory).mkdir();
-		
-		if(!versionFile.exists()) 
-		{
-			updateVersion();
-		} else 
-		{
-			String vnum = readVersion();
-			//This will be changed to whatever version preceded when we actually need updater code.
-			//Version 1.0.48 is the first to implement this, no checking before that version can be done.
-			if(vnum.equalsIgnoreCase("1.0.48")) {
-				updateFrom(1);
-			}
-			//Just add in more else if blocks for versions that need updater code.  Increment the updateFrom age int as we do so.
-			//Catch all for versions not matching and no specific code being needed
-			else if(!vnum.equalsIgnoreCase(this.getDescription().getVersion())) updateFrom(-1);
-		}
-		
-		this.config = new LoadProperties(this);
-		this.config.load();
-		
-		this.config2 = new LoadTreasures(this);
-		this.config2.load();
-		
-		Party.getInstance().loadParties();
-		new Party(this);
-		
-		if(!LoadProperties.useMySQL)
-			Users.getInstance().loadUsers(); //Load Users file
-		/*
-		 * REGISTER EVENTS
-		 */
-
-		PluginManager pm = getServer().getPluginManager();
-
-		if(pm.getPlugin("Spout") != null)
-			LoadProperties.spoutEnabled = true;
-		else
-			LoadProperties.spoutEnabled = false;
-		
-		//Register events
-		pm.registerEvents(playerListener, this);
-		pm.registerEvents(blockListener, this);
-		pm.registerEvents(entityListener, this);
-
-		PluginDescriptionFile pdfFile = this.getDescription();
-
-		if(LoadProperties.useMySQL)
-		{
-			database = new Database(this);
-			database.createStructure();
-		} else
-			Leaderboard.makeLeaderboards(); //Make the leaderboards
-
-		for(Player player : getServer().getOnlinePlayers()){Users.addUser(player);} //In case of reload add all users back into PlayerProfile   
-		System.out.println(pdfFile.getName() + " version " + pdfFile.getVersion() + " is enabled!" );
-		
-		//Periodic save timer (Saves every 10 minutes)
-		Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, mcMMO_SaveTimer, 0, LoadProperties.saveInterval * 1200);
-		
-		Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, mcMMO_Timer, 0, 20);
-		//R2+ block place fix
-		Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, ChangeDataValueTimer, 0, 10);
-		Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, FastChangeDataValueTimer, 0, 1);
-		
-		registerCommands();
-		
-		//Spout Stuff
-		if(LoadProperties.spoutEnabled)
-		{
-			SpoutStuff.setupSpoutConfigs();
-			SpoutStuff.registerCustomEvent();
-			SpoutStuff.extractFiles(); //Extract source materials
-			
-			FileManager FM = SpoutManager.getFileManager();
-			FM.addToPreLoginCache(this, SpoutStuff.getFiles());
-		}
-		
-		if(LoadProperties.statsTracking) {
-			//Plugin Metrics running in a new thread
-			new Thread(new Runnable() {
-			    public void run() {
-			        try {
-			            // create a new metrics object
-			            Metrics metrics = new Metrics();
-	    
-			            // 'this' in this context is the Plugin object
-			            metrics.beginMeasuringPlugin(thisPlugin);
-			        } catch (IOException e) {
-			            // Failed to submit the stats :-(
-			        }
-	            }
-			}).start();
-		}
-	}
-
-	public PlayerProfile getPlayerProfile(Player player)
-	{
-		return Users.getProfile(player);
-	}
-	
-	public void checkXp(Player player, SkillType skillType)
-	{
-		if(skillType == SkillType.ALL)
-			Skills.XpCheckAll(player);
-		else
-			Skills.XpCheckSkill(skillType, player);
-	}
-	
-	public boolean inSameParty(Player playera, Player playerb)
-	{
-		if(Users.getProfile(playera).inParty() && Users.getProfile(playerb).inParty()){
-			if(Users.getProfile(playera).getParty().equals(Users.getProfile(playerb).getParty())){
-				return true;
-			} else {
-				return false;
-			}
-		} else {
-			return false;
-		}
-	}
-	public ArrayList<String> getParties(){
-		String location = "plugins/mcMMO/mcmmo.users"; 
-		ArrayList<String> parties = new ArrayList<String>();
-		try {
-			//Open the users file
-			FileReader file = new FileReader(location);
-			BufferedReader in = new BufferedReader(file);
-			String line = ""; 
-			while((line = in.readLine()) != null)
-			{
-				String[] character = line.split(":"); 
-				String theparty = null;
-				//Party
-				if(character.length > 3)
-					theparty = character[3];
-				if(!parties.contains(theparty))
-					parties.add(theparty);
-			}
-			in.close();
-		} catch (Exception e) {
-			log.log(Level.SEVERE, "Exception while reading " 
-					+ location + " (Are you sure you formatted it correctly?)", e); 
-		}
-		return parties;
-	}
-	public static String getPartyName(Player player){
-		PlayerProfile PP = Users.getProfile(player);
-		return PP.getParty();
-	}
-	public static boolean inParty(Player player){
-		PlayerProfile PP = Users.getProfile(player);
-		return PP.inParty();
-	}
-
-	public void onDisable() 
-	{
-	    //Make sure to save player information if the server shuts down
-		for(Player x : Bukkit.getServer().getOnlinePlayers())
-		{
-		    Users.getProfile(x).save();
-		}
-	    
-	    Bukkit.getServer().getScheduler().cancelTasks(this); //This removes our tasks
-		
-		System.out.println("mcMMO was disabled."); //How informative!
-	}
-	
-	private void registerCommands() {
-		//Register aliases with the aliasmap (used in the playercommandpreprocessevent to ugly alias them to actual commands)
-		//Skills commands
-		aliasMap.put(mcLocale.getString("m.SkillAcrobatics").toLowerCase(), "acrobatics");
-		aliasMap.put(mcLocale.getString("m.SkillArchery").toLowerCase(), "archery");
-		aliasMap.put(mcLocale.getString("m.SkillAxes").toLowerCase(), "axes");
-		aliasMap.put(mcLocale.getString("m.SkillExcavation").toLowerCase(), "excavation");
-		aliasMap.put(mcLocale.getString("m.SkillFishing").toLowerCase(), "fishing");
-		aliasMap.put(mcLocale.getString("m.SkillHerbalism").toLowerCase(), "herbalism");
-		aliasMap.put(mcLocale.getString("m.SkillMining").toLowerCase(), "mining");
-		aliasMap.put(mcLocale.getString("m.SkillRepair").toLowerCase(), "repair");
-		aliasMap.put(mcLocale.getString("m.SkillSwords").toLowerCase(), "swords");
-		aliasMap.put(mcLocale.getString("m.SkillTaming").toLowerCase(), "taming");
-		aliasMap.put(mcLocale.getString("m.SkillUnarmed").toLowerCase(), "unarmed");
-		aliasMap.put(mcLocale.getString("m.SkillWoodCutting").toLowerCase(), "woodcutting");
-		
-		
-		//Register commands
-		//Skills commands
-		getCommand("acrobatics").setExecutor(new AcrobaticsCommand());
-		getCommand("archery").setExecutor(new ArcheryCommand());
-		getCommand("axes").setExecutor(new AxesCommand());
-		getCommand("excavation").setExecutor(new ExcavationCommand());
-		getCommand("fishing").setExecutor(new FishingCommand());
-		getCommand("herbalism").setExecutor(new HerbalismCommand());
-		getCommand("mining").setExecutor(new MiningCommand());
-		getCommand("repair").setExecutor(new RepairCommand());
-		getCommand("swords").setExecutor(new SwordsCommand());
-		getCommand("taming").setExecutor(new TamingCommand());
-		getCommand("unarmed").setExecutor(new UnarmedCommand());
-		getCommand("woodcutting").setExecutor(new WoodcuttingCommand());
-		
-		//Mc* commands
-		if(LoadProperties.mcremoveEnable) getCommand("mcremove").setExecutor(new McremoveCommand());
-		if(LoadProperties.mcabilityEnable) getCommand("mcability").setExecutor(new McabilityCommand());
-		if(LoadProperties.mccEnable) getCommand("mcc").setExecutor(new MccCommand());
-		if(LoadProperties.mcgodEnable) getCommand("mcgod").setExecutor(new McgodCommand());
-		if(LoadProperties.mcmmoEnable) getCommand("mcmmo").setExecutor(new McmmoCommand());
-		if(LoadProperties.mcrefreshEnable) getCommand("mcrefresh").setExecutor(new McrefreshCommand(this));
-		if(LoadProperties.mctopEnable) getCommand("mctop").setExecutor(new MctopCommand());
-		
-		//Party commands
-		if(LoadProperties.acceptEnable) getCommand("accept").setExecutor(new AcceptCommand());
-		if(LoadProperties.aEnable) getCommand("a").setExecutor(new ACommand());
-		if(LoadProperties.inviteEnable) getCommand("invite").setExecutor(new InviteCommand(this));
-		if(LoadProperties.partyEnable) getCommand("party").setExecutor(new PartyCommand());
-		if(LoadProperties.pEnable) getCommand("p").setExecutor(new PCommand());
-		if(LoadProperties.ptpEnable) getCommand("ptp").setExecutor(new PtpCommand(this));
-		
-		//Other commands
-		if(LoadProperties.addxpEnable) getCommand("addxp").setExecutor(new AddxpCommand(this));
-		if(LoadProperties.addlevelsEnable) getCommand("addlevels").setExecutor(new AddlevelsCommand(this));
-		if(LoadProperties.mmoeditEnable) getCommand("mmoedit").setExecutor(new MmoeditCommand(this));
-		getCommand("mmoupdate").setExecutor(new MmoupdateCommand());
-		if(LoadProperties.mcstatsEnable) getCommand("mcstats").setExecutor(new McstatsCommand());
-		if(LoadProperties.inspectEnable) getCommand("inspect").setExecutor(new InspectCommand(this));
-		if(LoadProperties.xprateEnable) getCommand("xprate").setExecutor(new XprateCommand());
-		
-		//Spout commands
-		getCommand("mchud").setExecutor(new MchudCommand());
-		if(LoadProperties.xplockEnable) getCommand("xplock").setExecutor(new XplockCommand());
-		
-	}
-
-	/*
-	 * It is important to always assume that you are updating from the lowest possible version.
-	 * Thus, every block of updater code should be complete and self-contained; finishing all 
-	 * SQL transactions and closing all file handlers, such that the next block of updater code
-	 * if called will handle updating as expected.
-	 */
-	public void updateFrom(int age) {
-		//No updater code needed, just update the version.
-		if(age == -1) {
-			updateVersion();
-			return;
-		}
-		//Updater code from age 1 goes here
-		if(age <= 1) {
-			//Since age 1 is an example for now, we will just let it do nothing.
-			
-		}
-		//If we are updating from age 1 but we need more to reach age 2, this will run too.
-		if(age <= 2) {
-			
-		}
-		updateVersion();
-	}
-	
-	public void updateVersion() {
-		try {
-			versionFile.createNewFile();
-			BufferedWriter vout = new BufferedWriter(new FileWriter(versionFile));
-			vout.write(this.getDescription().getVersion());
-			vout.close();
-		} catch (IOException ex) {
-			ex.printStackTrace();
-		} catch (SecurityException ex) {
-			ex.printStackTrace();
-		}
-	}
-
-	public String readVersion() {
-		byte[] buffer = new byte[(int) versionFile.length()];
-		BufferedInputStream f = null;
-		try {
-			f = new BufferedInputStream(new FileInputStream(versionFile));
-			f.read(buffer);
-		} catch (FileNotFoundException ex) {
-			ex.printStackTrace();
-		} catch (IOException ex) {
-			ex.printStackTrace();
-		} finally {
-			if (f != null) try { f.close(); } catch (IOException ignored) { }
-		}
-		
-		return new String(buffer);
-	}
-	
-	/*
-	 * Boilerplate Custom Config Stuff
-	 */
-	
-	private FileConfiguration treasuresConfig = null;
-	private File treasuresConfigFile = null;
-	
-	public void reloadTreasuresConfig() {
-	    if (treasuresConfigFile == null) {
-	    treasuresConfigFile = new File(getDataFolder(), "treasures.yml");
-	    }
-	    treasuresConfig = YamlConfiguration.loadConfiguration(treasuresConfigFile);
-	 
-	    // Look for defaults in the jar
-	    InputStream defConfigStream = getResource("treasures.yml");
-	    if (defConfigStream != null) {
-	        YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream);
-	        treasuresConfig.setDefaults(defConfig);
-	    }
-	}
-	
-	public FileConfiguration getTreasuresConfig() {
-	    if (treasuresConfig == null) {
-	        reloadTreasuresConfig();
-	    }
-	    return treasuresConfig;
-	}
-	
-	public void saveTreasuresConfig() {
-	    if (treasuresConfig == null || treasuresConfigFile == null) {
-	    return;
-	    }
-	    try {
-	        treasuresConfig.save(treasuresConfigFile);
-	    } catch (IOException ex) {
-	        Logger.getLogger(JavaPlugin.class.getName()).log(Level.SEVERE, "Could not save config to " + treasuresConfigFile, ex);
-	    }
-	}
-}
+        try {
+            treasuresConfig.save(treasuresConfigFile);
+        }
+        catch (IOException ex) {
+            log.log(Level.SEVERE, "Could not save config to " + treasuresConfigFile, ex);
+        }
+    }
+}

+ 57 - 22
src/main/java/com/gmail/nossr50/mcPermissions.java

@@ -2,118 +2,153 @@ package com.gmail.nossr50;
 
 import org.bukkit.entity.Player;
 
-public class mcPermissions 
-{
+public class mcPermissions {
     private static volatile mcPermissions instance;
-    
+
     public boolean permission(Player player, String perm) {
         return player.hasPermission(perm);
     }
-    public boolean admin(Player player){
+
+    public boolean admin(Player player) {
         return player.hasPermission("mcmmo.admin");
     }
+
     public boolean mcrefresh(Player player) {
         return player.hasPermission("mcmmo.tools.mcrefresh");
     }
+
     public boolean mcremove(Player player) {
         return player.hasPermission("mcmmo.tools.mcremove");
     }
+
     public boolean mmoedit(Player player) {
         return player.hasPermission("mcmmo.tools.mmoedit");
     }
-    public boolean herbalismAbility(Player player){
+
+    public boolean herbalismAbility(Player player) {
         return player.hasPermission("mcmmo.ability.herbalism");
     }
-    public boolean excavationAbility(Player player){
+
+    public boolean excavationAbility(Player player) {
         return player.hasPermission("mcmmo.ability.excavation");
     }
-    public boolean unarmedAbility(Player player){
-    	return player.hasPermission("mcmmo.ability.unarmed");
+
+    public boolean unarmedAbility(Player player) {
+        return player.hasPermission("mcmmo.ability.unarmed");
     }
-    public boolean chimaeraWing(Player player){
-    	return player.hasPermission("mcmmo.item.chimaerawing");
+
+    public boolean chimaeraWing(Player player) {
+        return player.hasPermission("mcmmo.item.chimaerawing");
     }
-    public boolean miningAbility(Player player){
-    	return player.hasPermission("mcmmo.ability.mining");    	
+
+    public boolean miningAbility(Player player) {
+        return player.hasPermission("mcmmo.ability.mining");
     }
-    public boolean axesAbility(Player player){
-    	return player.hasPermission("mcmmo.ability.axes");
+
+    public boolean axesAbility(Player player) {
+        return player.hasPermission("mcmmo.ability.axes");
     }
-    public boolean swordsAbility(Player player){
-    	return player.hasPermission("mcmmo.ability.swords");
+
+    public boolean swordsAbility(Player player) {
+        return player.hasPermission("mcmmo.ability.swords");
     }
+
     public boolean woodCuttingAbility(Player player) {
-    	return player.hasPermission("mcmmo.ability.woodcutting");
+        return player.hasPermission("mcmmo.ability.woodcutting");
     }
+
     public boolean mcgod(Player player) {
-    	return player.hasPermission("mcmmo.tools.mcgod");
+        return player.hasPermission("mcmmo.tools.mcgod");
     }
+
     public boolean motd(Player player) {
         return player.hasPermission("mcmmo.motd");
     }
+
     public boolean mcAbility(Player player) {
         return player.hasPermission("mcmmo.commands.ability");
     }
+
     public boolean partyChat(Player player) {
         return player.hasPermission("mcmmo.chat.partychat");
     }
+
     public boolean partyLock(Player player) {
         return player.hasPermission("mcmmo.chat.partylock");
     }
+
     public boolean partyTeleport(Player player) {
         return player.hasPermission("mcmmo.commands.ptp");
     }
+
     public boolean inspect(Player player) {
         return player.hasPermission("mcmmo.commands.inspect");
     }
+
     public boolean party(Player player) {
         return player.hasPermission("mcmmo.commands.party");
     }
+
     public boolean adminChat(Player player) {
         return player.hasPermission("mcmmo.chat.adminchat");
     }
+
     public static mcPermissions getInstance() {
-    	if (instance == null) {
-    	    instance = new mcPermissions();
-    	}
-    	return instance;
+        if (instance == null) {
+            instance = new mcPermissions();
+        }
+
+        return instance;
     }
+
     public boolean taming(Player player) {
         return player.hasPermission("mcmmo.skills.taming");
     }
+
     public boolean mining(Player player) {
         return player.hasPermission("mcmmo.skills.mining");
     }
+
     public boolean blastMining(Player player) {
         return player.hasPermission("mcmmo.skills.blastmining");
     }
+
     public boolean fishing(Player player) {
         return player.hasPermission("mcmmo.skills.fishing");
     }
+
     public boolean woodcutting(Player player) {
         return player.hasPermission("mcmmo.skills.woodcutting");
     }
+
     public boolean repair(Player player) {
         return player.hasPermission("mcmmo.skills.repair");
     }
+
     public boolean unarmed(Player player) {
         return player.hasPermission("mcmmo.skills.unarmed");
     }
+
     public boolean archery(Player player) {
         return player.hasPermission("mcmmo.skills.archery");
     }
+
     public boolean herbalism(Player player) {
         return player.hasPermission("mcmmo.skills.herbalism");
     }
+
     public boolean excavation(Player player) {
         return player.hasPermission("mcmmo.skills.excavation");
     }
+
     public boolean swords(Player player) {
         return player.hasPermission("mcmmo.skills.swords");
     }
+
     public boolean axes(Player player) {
         return player.hasPermission("mcmmo.skills.axes");
     }
+
     public boolean acrobatics(Player player) {
         return player.hasPermission("mcmmo.skills.acrobatics");
     }

+ 2 - 2
src/main/java/com/gmail/nossr50/skills/BlastMining.java

@@ -10,8 +10,8 @@ import org.bukkit.event.entity.EntityDamageEvent;
 import org.bukkit.event.entity.EntityExplodeEvent;
 import org.bukkit.event.entity.ExplosionPrimeEvent;
 
+import com.gmail.nossr50.BlockChecks;
 import com.gmail.nossr50.Users;
-import com.gmail.nossr50.m;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.datatypes.SkillType;
 
@@ -89,7 +89,7 @@ public class BlastMining{
 		while(iterator.hasNext())
 		{
 			Block temp = iterator.next();
-			if(m.isOre(temp))
+			if(BlockChecks.isOre(temp.getType()))
 				ores.add(temp);
 			else
 				debris.add(temp);

+ 1 - 1
src/main/java/com/gmail/nossr50/skills/Taming.java

@@ -103,7 +103,7 @@ public class Taming
 	{
 		DamageCause cause = event.getCause();
 		Wolf wolf = (Wolf) event.getEntity();
-		Player master = (Player) wolf.getOwner();
+        Player master = (Player) wolf.getOwner();
 		int skillLevel = Users.getProfile(master).getSkillLevel(SkillType.TAMING);
 		
 		switch(cause)