ソースを参照

More generic cleanup.

GJ 13 年 前
コミット
e9e7d462f7

+ 2 - 2
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));
                 }
@@ -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"));

+ 7 - 6
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;
@@ -56,7 +57,7 @@ public class mcBlockListener implements Listener
     	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))
+    	if(BlockChecks.shouldBeWatched(mat))
     	{	
     		//Only needed for blocks that use their block data (wood, pumpkins, etc.)
     	    boolean shouldBeChanged = true;
@@ -171,7 +172,7 @@ public class mcBlockListener implements Listener
     	}
     	
     	//Change the byte back when broken
-    	if(block.getData() == 5 && m.shouldBeWatched(block.getType()))
+    	if(block.getData() == 5 && BlockChecks.shouldBeWatched(block.getType()))
     	{
     		block.setData((byte) 0);
     		if(plugin.misc.blockWatchList.contains(block))
@@ -192,7 +193,7 @@ public class mcBlockListener implements Listener
     	/*
     	 * ABILITY PREPARATION CHECKS
     	 */
-    	if(m.abilityBlockCheck(mat))
+    	if(BlockChecks.abilityBlockCheck(mat))
     	{
 	   		if(PP.getHoePreparationMode() && Herbalism.canBeGreenTerra(block))
 	   			Skills.abilityCheck(player, SkillType.HERBALISM);
@@ -300,7 +301,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);
+    }
 }

+ 4 - 3
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;
@@ -177,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);
@@ -247,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))
@@ -337,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);
     }
-}
+}

+ 433 - 364
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,437 @@ 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!
+    }
+    
+    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 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);
-	    }
-	}
+    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);
+        }
+    }
 }

+ 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);