فهرست منبع

0.9.25 - Herbalism Overhaul

nossr50 14 سال پیش
والد
کامیت
7d67e68cd6

+ 30 - 0
mcMMO/Changelog.txt

@@ -1,5 +1,35 @@
 Changelog:
 #Versions without changelogs probably had very small misc fixes, like tweaks to the source code#
+
+Version 0.9.25
+Fixed issue with anti-exploits and Herbalism
+MySpawn works like a hearthstone now, no inv pentality, 1hr cooldown
+Added Green Terra Ability to Herbalism
+Added Green Thumb ability to Herbalism
+Fixed Repair not working for Iron Tools
+Fixed bug where Axes Ability checked for Unarmed Ability Permission
+Added Cocoa Beans to Excavation XP/Loot Tables, Found in Grass/Dirt
+Using Super Breaker on Obsidian significantly damages it compared to other materials
+Added Obsidian to Mining XP Table/Super Breaker
+Added Pumpkins/Reeds/Cactus to Herbalism XP Tables/Double Drops
+Corrected "mcMMMO" to "mcMMO" in MOTD
+
+Version 0.9.24
+PLAYER_BED_ENTER removed due to its unusual issues
+Added info about the Wiki to the motd
+/mcrefresh will reset if you were recently hurt (Chimaera Wing/HP Regen)
+Fixed Armor Repair not adding XP
+Boosted Repair XP of Armor to match Tools
+Repairing Armor won't trigger Super Repair twice anymore
+Setting your MySpawn now just requires right clicking a bed (still requires the setmyspawn permission node)
+
+Version 0.9.23
+Players will now announce ability usage within a short distance to nearby players
+Chimaera Wing now takes the world into account
+Acrobatics won't give XP on death, and will fail if you would've died after the damage reduction
+Added yet another check to see if a Player is not in the Users system for NPC mod compatibility
+
+
 Version 0.9.22
 Fixed bug where chimaera wing was unusable after being hurt even after the cooldown
 

+ 26 - 0
mcMMO/com/gmail/nossr50/Tree.java

@@ -0,0 +1,26 @@
+package com.gmail.nossr50;
+
+import java.util.ArrayList;
+
+import org.bukkit.entity.Player;
+
+public class Tree {
+
+	TreeNode root;
+
+	public Tree(){}
+
+	public void add(Player p, int in )
+	{
+	if(root == null)
+	root = new TreeNode(p, in);
+	else
+	root.add(p,in);
+	}
+	
+	public Player[] inOrder()
+	{
+	return (Player[]) root.inOrder(new ArrayList<Player>()).toArray();
+	}
+
+}

+ 44 - 0
mcMMO/com/gmail/nossr50/TreeNode.java

@@ -0,0 +1,44 @@
+package com.gmail.nossr50;
+
+import java.util.ArrayList;
+
+import org.bukkit.entity.Player;
+
+public class TreeNode {
+	TreeNode left = null
+	, right = null;
+	Player player;
+	int stat;
+
+	public TreeNode(Player p, int in) {stat = in; player = p;}
+
+	public void add (Player p, int in) {
+		if (in <= stat)
+		{
+			if (left == null)
+				left = new TreeNode(p,in);
+			else
+				left.add(p, in);
+		}
+		else if(in > stat)
+		{
+		if (right == null)
+			right = new TreeNode(p,in);
+		else
+			right.add(p, in);
+		}
+	}
+	
+	public ArrayList<Player> inOrder(ArrayList<Player> a)
+	{
+	if(left != null)
+	a = left.inOrder(a);
+
+	a.add(player);
+
+	if(right != null)
+	a = right.inOrder(a);
+
+	return a;
+	}
+}

+ 20 - 12
mcMMO/com/gmail/nossr50/mcAcrobatics.java

@@ -5,6 +5,8 @@ import org.bukkit.Location;
 import org.bukkit.entity.Player;
 import org.bukkit.event.entity.EntityDamageEvent;
 
+import com.gmail.nossr50.PlayerList.PlayerProfile;
+
 
 public class mcAcrobatics {
 	private static volatile mcAcrobatics instance;
@@ -16,7 +18,8 @@ public class mcAcrobatics {
     	}
 	public void acrobaticsCheck(Player player, EntityDamageEvent event, Location loc, int xx, int y, int z){
     	if(player != null && mcPermissions.getInstance().acrobatics(player)){
-    		int acrovar = mcUsers.getProfile(player).getAcrobaticsInt();
+    		PlayerProfile PP = mcUsers.getProfile(player.getName());
+    		int acrovar = PP.getAcrobaticsInt();
     		if(player.isSneaking())
     			acrovar = acrovar * 2;
 			if(Math.random() * 1000 <= acrovar){
@@ -26,19 +29,24 @@ public class mcAcrobatics {
 				int newDamage = event.getDamage() - threshold;
 				if(newDamage < 0)
 					newDamage = 0;
-				if(!event.isCancelled())
-					mcUsers.getProfile(player).addAcrobaticsGather((event.getDamage() * 8) * mcLoadProperties.xpGainMultiplier);
-				mcSkills.getInstance().XpCheck(player);
-				event.setDamage(newDamage);
-				if(event.getDamage() <= 0)
-					event.setCancelled(true);
-				if(player.isSneaking()){
-					player.sendMessage(ChatColor.GREEN+"**GRACEFUL ROLL**");
-				} else {
-					player.sendMessage("**ROLL**");
+				/*
+				 * Check for death
+				 */
+				if(player.getHealth() - newDamage >= 1){
+					if(!event.isCancelled())
+						PP.addAcrobaticsGather((event.getDamage() * 8) * mcLoadProperties.xpGainMultiplier);
+					mcSkills.getInstance().XpCheck(player);
+					event.setDamage(newDamage);
+					if(event.getDamage() <= 0)
+						event.setCancelled(true);
+					if(player.isSneaking()){
+						player.sendMessage(ChatColor.GREEN+"**GRACEFUL ROLL**");
+					} else {
+						player.sendMessage("**ROLL**");
+					}
 				}
 			} else if (!mcConfig.getInstance().isBlockWatched(loc.getWorld().getBlockAt(xx, y, z)) && !event.isCancelled()){
-				mcUsers.getProfile(player).addAcrobaticsGather((event.getDamage() * 12) * mcLoadProperties.xpGainMultiplier);
+				PP.addAcrobaticsGather((event.getDamage() * 12) * mcLoadProperties.xpGainMultiplier);
 				mcSkills.getInstance().XpCheck(player);
 			}
     	}

+ 38 - 25
mcMMO/com/gmail/nossr50/mcBlockListener.java

@@ -43,14 +43,27 @@ public class mcBlockListener extends BlockListener {
     
     public void onBlockBreak(BlockBreakEvent event) {
     	Player player = event.getPlayer();
-    	PlayerProfile PP = mcUsers.getProfile(player);
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
     	Block block = event.getBlock();
     	ItemStack inhand = player.getItemInHand();
     	if(event.isCancelled())
     		return;
     	if (event instanceof FakeBlockBreakEvent) 
     		return;
+    	/*
+		* Check if the Timer is doing its job
+		*/
+   		mcSkills.getInstance().monitorSkills(player);
     	
+   		/*
+   		 * HERBALISM
+   		 */
+   		if(mcPermissions.getInstance().herbalismAbility(player)&& PP.getGreenTerraMode() && block.getTypeId() == 59 && block.getData() == (byte) 0x07){
+   			mcHerbalism.getInstance().greenTerraCheck(player, block, plugin);
+   			mcHerbalism.getInstance().greenTerraWheat(player, block, event);
+   		}
+   		
+   		
     	/*
     	 * MINING
     	 */
@@ -89,11 +102,7 @@ public class mcBlockListener extends BlockListener {
    					&& PP.getTreeFellerMode() 
    					&& block.getTypeId() == 17
    					&& mcm.getInstance().blockBreakSimulate(block, player, plugin)){
-   				/*
-   				* Check if the Timer is doing its job
-   				*/
-   	    		mcSkills.getInstance().monitorSkills(player);
-   	    		
+   				
     			mcWoodCutting.getInstance().treeFeller(block, player);
     			for(Block blockx : mcConfig.getInstance().getTreeFeller()){
     				if(blockx != null){
@@ -132,8 +141,11 @@ public class mcBlockListener extends BlockListener {
     	/*
     	 * HERBALISM
     	 */
-    	if(mcPermissions.getInstance().herbalism(player) && block.getData() != (byte) 5)
-       		mcHerbalism.getInstance().herbalismProcCheck(block, player);
+    	if(mcPermissions.getInstance().herbalism(player) && mcHerbalism.getInstance().canBeGreenTerra(block)){
+    		mcHerbalism.getInstance().greenTerraCheck(player, block, plugin);
+    		if(block.getData() != (byte) 5)
+    			mcHerbalism.getInstance().herbalismProcCheck(block, player, event);
+    	}
     	//Change the byte back when broken
     	if(block.getData() == 5)
     		block.setData((byte) 0);
@@ -142,20 +154,33 @@ public class mcBlockListener extends BlockListener {
     	if(event.isCancelled())
     		return;
     	Player player = event.getPlayer();
-    	PlayerProfile PP = mcUsers.getProfile(player);
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
     	ItemStack inhand = player.getItemInHand();
     	Block block = event.getBlock();
+    	/*
+		* Check if the Timer is doing its job
+		*/
+   		mcSkills.getInstance().monitorSkills(player);
     	/*
     	 * ABILITY PREPARATION CHECKS
     	 */
+   		if(PP.getHoePreparationMode() && mcHerbalism.getInstance().canBeGreenTerra(block))
+    		mcHerbalism.getInstance().greenTerraCheck(player, block, plugin);
     	if(PP.getAxePreparationMode() && block.getTypeId() == 17)
-    		mcWoodCutting.getInstance().treeFellerCheck(player, block);
+    		mcWoodCutting.getInstance().treeFellerCheck(player, block, plugin);
     	if(PP.getPickaxePreparationMode())
-    		mcMining.getInstance().superBreakerCheck(player, block);
+    		mcMining.getInstance().superBreakerCheck(player, block, plugin);
     	if(PP.getShovelPreparationMode() && mcExcavation.getInstance().canBeGigaDrillBroken(block))
-    		mcExcavation.getInstance().gigaDrillBreakerActivationCheck(player, block);
+    		mcExcavation.getInstance().gigaDrillBreakerActivationCheck(player, block, plugin);
     	if(PP.getFistsPreparationMode() && mcExcavation.getInstance().canBeGigaDrillBroken(block))
-    		mcSkills.getInstance().berserkActivationCheck(player);
+    		mcSkills.getInstance().berserkActivationCheck(player, plugin);
+    	/*
+    	 * GREEN TERRA STUFF
+    	 */
+    	if(PP.getGreenTerraMode() && mcPermissions.getInstance().herbalismAbility(player) && PP.getGreenTerraMode()){
+   			mcHerbalism.getInstance().greenTerra(player, block);
+   		}
+    	
     	/*
     	 * GIGA DRILL BREAKER CHECKS
     	 */
@@ -163,10 +188,6 @@ public class mcBlockListener extends BlockListener {
     			&& mcm.getInstance().blockBreakSimulate(block, player, plugin) 
     			&& mcExcavation.getInstance().canBeGigaDrillBroken(block) 
     			&& mcm.getInstance().isShovel(inhand)){
-    		/*
-			* Check if the Timer is doing its job
-			*/
-    		mcSkills.getInstance().monitorSkills(player);
     		
     		if(mcm.getInstance().getTier(player) >= 2)
     			mcExcavation.getInstance().excavationProcCheck(block, player);
@@ -191,10 +212,6 @@ public class mcBlockListener extends BlockListener {
     		&& mcm.getInstance().blockBreakSimulate(block, player, plugin) 
     		&& player.getItemInHand().getTypeId() == 0 
     		&& mcExcavation.getInstance().canBeGigaDrillBroken(block)){
-    		/*
-			* Check if the Timer is doing its job
-			*/
-    		mcSkills.getInstance().monitorSkills(player);
 		   	Material mat = Material.getMaterial(block.getTypeId());
 		   	if(block.getTypeId() == 2)
 		   		mat = Material.DIRT;
@@ -210,10 +227,6 @@ public class mcBlockListener extends BlockListener {
     	if(PP.getSuperBreakerMode() 
     			&& mcMining.getInstance().canBeSuperBroken(block)
     			&& mcm.getInstance().blockBreakSimulate(block, player, plugin)){
-    		/*
-			* Check if the Timer is doing its job
-			*/
-    		mcSkills.getInstance().monitorSkills(player);
     		
     		if(mcLoadProperties.miningrequirespickaxe){
     			if(mcm.getInstance().isMiningPick(inhand))

+ 102 - 87
mcMMO/com/gmail/nossr50/mcCombat.java

@@ -18,6 +18,8 @@ import org.bukkit.event.entity.EntityDamageByProjectileEvent;
 import org.bukkit.event.entity.EntityDamageEvent;
 import org.bukkit.inventory.ItemStack;
 
+import com.gmail.nossr50.PlayerList.PlayerProfile;
+
 
 public class mcCombat {
 	private static mcMMO plugin;
@@ -37,13 +39,16 @@ public class mcCombat {
     			event.setCancelled(true);
     			return;
     		}
+    		PlayerProfile PPa = mcUsers.getProfile(attacker.getName());
     		Player defender = (Player)x;
+    		PlayerProfile PPd = mcUsers.getProfile(defender.getName());
+    		
     		/*
     		 * COMPATABILITY CHECKS (Stuff that wouldn't happen normally in MC basically...)
     		 */
-    		if(mcUsers.getProfile(defender) == null)
+    		if(mcUsers.getProfile(defender.getName()) == null)
     			mcUsers.addUser(defender);
-    		if(attacker != null && defender != null && mcUsers.getProfile(attacker).inParty() && mcUsers.getProfile(defender).inParty()){
+    		if(attacker != null && defender != null && mcUsers.getProfile(attacker.getName()).inParty() && mcUsers.getProfile(defender.getName()).inParty()){
 				if(mcParty.getInstance().inSameParty(defender, attacker)){
 					event.setCancelled(true);
 					return;
@@ -60,9 +65,9 @@ public class mcCombat {
 				
 				//Bonus just for having unarmed
 				int bonus = 2;
-				if (mcUsers.getProfile(attacker).getUnarmedInt() >= 250)
+				if (PPa.getUnarmedInt() >= 250)
 					bonus++;
-				if (mcUsers.getProfile(attacker).getUnarmedInt() >= 500)
+				if (PPa.getUnarmedInt() >= 500)
 					bonus++;
 				event.setDamage(calculateDamage(event, bonus));
 				
@@ -85,14 +90,14 @@ public class mcCombat {
     		 * PVP XP
     		 */
     		if(attacker != null && defender != null && mcLoadProperties.pvpxp){
-    			if(mcUsers.getProfile(defender).inParty() && mcUsers.getProfile(attacker).inParty() && mcParty.getInstance().inSameParty(attacker, defender))
+    			if(PPd.inParty() && PPa.inParty() && mcParty.getInstance().inSameParty(attacker, defender))
     				return;
     			if(mcm.getInstance().isAxes(attacker.getItemInHand()))
-    				mcUsers.getProfile(attacker).addAxesGather((event.getDamage() * 3) * mcLoadProperties.pvpxprewardmodifier);
+    				PPa.addAxesGather((event.getDamage() * 3) * mcLoadProperties.pvpxprewardmodifier);
     			if(mcm.getInstance().isSwords(attacker.getItemInHand()))
-    				mcUsers.getProfile(attacker).addSwordsGather((event.getDamage() * 3) * mcLoadProperties.pvpxprewardmodifier);
+    				PPa.addSwordsGather((event.getDamage() * 3) * mcLoadProperties.pvpxprewardmodifier);
     			if(attacker.getItemInHand().getTypeId() == 0)
-    				mcUsers.getProfile(attacker).addUnarmedGather((event.getDamage() * 3) * mcLoadProperties.pvpxprewardmodifier);
+    				PPa.addUnarmedGather((event.getDamage() * 3) * mcLoadProperties.pvpxprewardmodifier);
     		}
     		/*
     		 * CHECK FOR LEVEL UPS
@@ -101,23 +106,24 @@ public class mcCombat {
 		}
     }
     public void playerVersusSquidChecks(EntityDamageByEntityEvent event, Player attacker, Entity x, int type){
+    	PlayerProfile PPa = mcUsers.getProfile(attacker.getName());
     	if(x instanceof Squid){
     		if(!mcConfig.getInstance().isBleedTracked(x)){
     			bleedCheck(attacker, x);
     		}
 			Squid defender = (Squid)event.getEntity();
 			if(mcm.getInstance().isSwords(attacker.getItemInHand()) && defender.getHealth() > 0 && mcPermissions.getInstance().swords(attacker)){
-					mcUsers.getProfile(attacker).addSwordsGather(10 * mcLoadProperties.xpGainMultiplier);
+					PPa.addSwordsGather(10 * mcLoadProperties.xpGainMultiplier);
 			}
 			mcSkills.getInstance().XpCheck(attacker);
 			if(mcm.getInstance().isAxes(attacker.getItemInHand()) 
 					&& defender.getHealth() > 0 
 					&& mcPermissions.getInstance().axes(attacker)){
-					mcUsers.getProfile(attacker).addAxesGather(10 * mcLoadProperties.xpGainMultiplier);
+					PPa.addAxesGather(10 * mcLoadProperties.xpGainMultiplier);
 					mcSkills.getInstance().XpCheck(attacker);
 			}
 			if(mcm.getInstance().isAxes(attacker.getItemInHand()) && mcPermissions.getInstance().axes(attacker)){
-				if(mcUsers.getProfile(attacker).getAxesInt() >= 500){
+				if(PPa.getAxesInt() >= 500){
 					event.setDamage(calculateDamage(event, 4));
 				}
 			}
@@ -130,21 +136,22 @@ public class mcCombat {
     			
     			//Bonus just for having unarmed
     			int bonus = 2;
-    			if (mcUsers.getProfile(attacker).getUnarmedInt() >= 250)
+    			if (PPa.getUnarmedInt() >= 250)
     				bonus++;
-    			if (mcUsers.getProfile(attacker).getUnarmedInt() >= 500)
+    			if (PPa.getUnarmedInt() >= 500)
     				bonus++;
     			event.setDamage(calculateDamage(event, bonus));
     			
     			//XP
 					if(defender.getHealth() != 0){
-					mcUsers.getProfile(attacker).addUnarmedGather(10 * mcLoadProperties.xpGainMultiplier);
+					PPa.addUnarmedGather(10 * mcLoadProperties.xpGainMultiplier);
 					mcSkills.getInstance().XpCheck(attacker);
 					}
     			}
 		}
     }
     public void playerVersusAnimalsChecks(Entity x, Player attacker, EntityDamageByEntityEvent event, int type){
+    	PlayerProfile PPa = mcUsers.getProfile(attacker.getName());
     	if(x instanceof Animals){
     		if(!mcConfig.getInstance().isBleedTracked(x)){
     			bleedCheck(attacker, x);
@@ -153,22 +160,23 @@ public class mcCombat {
     		if(mcm.getInstance().isAxes(attacker.getItemInHand()) && mcPermissions.getInstance().axes(attacker)){
 				if(defender.getHealth() <= 0)
 					return;
-				if(mcUsers.getProfile(attacker).getAxesInt() >= 500){
+				if(PPa.getAxesInt() >= 500){
 					event.setDamage(calculateDamage(event, 4));
 				}
 			}
 			if(type == 0 && mcPermissions.getInstance().unarmed(attacker)){
 				//Bonus just for having unarmed
 				int bonus = 2;
-				if (mcUsers.getProfile(attacker).getUnarmedInt() >= 250)
+				if (PPa.getUnarmedInt() >= 250)
 					bonus++;
-				if (mcUsers.getProfile(attacker).getUnarmedInt() >= 500)
+				if (PPa.getUnarmedInt() >= 500)
 					bonus++;
 				event.setDamage(calculateDamage(event, bonus));
 			}
 		}
     }
     public void playerVersusMonsterChecks(EntityDamageByEntityEvent event, Player attacker, Entity x, int type){
+    	PlayerProfile PPa = mcUsers.getProfile(attacker.getName());
     	if(x instanceof Monster){
     		/*
     		 * AXE PROC CHECKS
@@ -183,15 +191,15 @@ public class mcCombat {
 					&& mcPermissions.getInstance().swords(attacker)){
 					if(!mcConfig.getInstance().isMobSpawnTracked(x)){
 					if(x instanceof Creeper)
-						mcUsers.getProfile(attacker).addSwordsGather((event.getDamage() * 4) * mcLoadProperties.xpGainMultiplier);
+						PPa.addSwordsGather((event.getDamage() * 4) * mcLoadProperties.xpGainMultiplier);
 					if(x instanceof Spider)
-						mcUsers.getProfile(attacker).addSwordsGather((event.getDamage() * 3) * mcLoadProperties.xpGainMultiplier);
+						PPa.addSwordsGather((event.getDamage() * 3) * mcLoadProperties.xpGainMultiplier);
 					if(x instanceof Skeleton)
-						mcUsers.getProfile(attacker).addSwordsGather((event.getDamage() * 2) * mcLoadProperties.xpGainMultiplier);
+						PPa.addSwordsGather((event.getDamage() * 2) * mcLoadProperties.xpGainMultiplier);
 					if(x instanceof Zombie)
-						mcUsers.getProfile(attacker).addSwordsGather((event.getDamage() * 2) * mcLoadProperties.xpGainMultiplier);
+						PPa.addSwordsGather((event.getDamage() * 2) * mcLoadProperties.xpGainMultiplier);
 					if(x instanceof PigZombie)
-						mcUsers.getProfile(attacker).addSwordsGather((event.getDamage() * 3) * mcLoadProperties.xpGainMultiplier);
+						PPa.addSwordsGather((event.getDamage() * 3) * mcLoadProperties.xpGainMultiplier);
 					}
 					mcSkills.getInstance().XpCheck(attacker);
 				}
@@ -200,15 +208,15 @@ public class mcCombat {
 					&& mcPermissions.getInstance().axes(attacker)){
 					if(!mcConfig.getInstance().isMobSpawnTracked(x)){
 					if(x instanceof Creeper)
-					mcUsers.getProfile(attacker).addAxesGather((event.getDamage() * 4) * mcLoadProperties.xpGainMultiplier);
+					PPa.addAxesGather((event.getDamage() * 4) * mcLoadProperties.xpGainMultiplier);
 					if(x instanceof Spider)
-						mcUsers.getProfile(attacker).addAxesGather((event.getDamage() * 3) * mcLoadProperties.xpGainMultiplier);
+						PPa.addAxesGather((event.getDamage() * 3) * mcLoadProperties.xpGainMultiplier);
 					if(x instanceof Skeleton)
-						mcUsers.getProfile(attacker).addAxesGather((event.getDamage() * 2) * mcLoadProperties.xpGainMultiplier);
+						PPa.addAxesGather((event.getDamage() * 2) * mcLoadProperties.xpGainMultiplier);
 					if(x instanceof Zombie)
-						mcUsers.getProfile(attacker).addAxesGather((event.getDamage() * 2) * mcLoadProperties.xpGainMultiplier);
+						PPa.addAxesGather((event.getDamage() * 2) * mcLoadProperties.xpGainMultiplier);
 					if(x instanceof PigZombie)
-						mcUsers.getProfile(attacker).addAxesGather((event.getDamage() * 3) * mcLoadProperties.xpGainMultiplier);
+						PPa.addAxesGather((event.getDamage() * 3) * mcLoadProperties.xpGainMultiplier);
 					}
 					mcSkills.getInstance().XpCheck(attacker);
 			}
@@ -216,7 +224,7 @@ public class mcCombat {
 			 * AXE DAMAGE SCALING && LOOT CHECKS
 			 */
 			if(mcm.getInstance().isAxes(attacker.getItemInHand()) && mcPermissions.getInstance().axes(attacker)){
-				if(mcUsers.getProfile(attacker).getAxesInt() >= 500){
+				if(PPa.getAxesInt() >= 500){
 					event.setDamage(calculateDamage(event, 4));
 				}
 			}
@@ -226,24 +234,24 @@ public class mcCombat {
 			
 			//Bonus just for having unarmed
 			int bonus = 2;
-			if (mcUsers.getProfile(attacker).getUnarmedInt() >= 250)
+			if (PPa.getUnarmedInt() >= 250)
 				bonus++;
-			if (mcUsers.getProfile(attacker).getUnarmedInt() >= 500)
+			if (PPa.getUnarmedInt() >= 500)
 				bonus++;
 			event.setDamage(calculateDamage(event, bonus));
 			
 			//XP
 			if(!mcConfig.getInstance().isMobSpawnTracked(x)){
 			if(x instanceof Creeper)
-				mcUsers.getProfile(attacker).addUnarmedGather((event.getDamage() * 4) * mcLoadProperties.xpGainMultiplier);
+				PPa.addUnarmedGather((event.getDamage() * 4) * mcLoadProperties.xpGainMultiplier);
 			if(x instanceof Spider)
-				mcUsers.getProfile(attacker).addUnarmedGather((event.getDamage() * 3) * mcLoadProperties.xpGainMultiplier);
+				PPa.addUnarmedGather((event.getDamage() * 3) * mcLoadProperties.xpGainMultiplier);
 			if(x instanceof Skeleton)
-				mcUsers.getProfile(attacker).addUnarmedGather((event.getDamage() * 2) * mcLoadProperties.xpGainMultiplier);
+				PPa.addUnarmedGather((event.getDamage() * 2) * mcLoadProperties.xpGainMultiplier);
 			if(x instanceof Zombie)
-				mcUsers.getProfile(attacker).addUnarmedGather((event.getDamage() * 2) * mcLoadProperties.xpGainMultiplier);
+				PPa.addUnarmedGather((event.getDamage() * 2) * mcLoadProperties.xpGainMultiplier);
 			if(x instanceof PigZombie)
-				mcUsers.getProfile(attacker).addUnarmedGather((event.getDamage() * 3) * mcLoadProperties.xpGainMultiplier);
+				PPa.addUnarmedGather((event.getDamage() * 3) * mcLoadProperties.xpGainMultiplier);
 			}
 			mcSkills.getInstance().XpCheck(attacker);
 			}
@@ -254,16 +262,17 @@ public class mcCombat {
     	Entity x = event.getEntity();
     	if(event.getProjectile().toString().equals("CraftArrow") && x instanceof Player){
     		Player defender = (Player)x;
-    		if(mcUsers.getProfile(defender) == null)
+    		PlayerProfile PPd = mcUsers.getProfile(defender.getName());
+    		if(PPd == null)
     			mcUsers.addUser(defender);
     		if(mcPermissions.getInstance().unarmed(defender) && defender.getItemInHand().getTypeId() == 0){
-	    		if(defender != null && mcUsers.getProfile(defender).getUnarmedInt() >= 1000){
+	    		if(defender != null && PPd.getUnarmedInt() >= 1000){
 	    			if(Math.random() * 1000 <= 500){
 	    				event.setCancelled(true);
 	    				defender.sendMessage(ChatColor.WHITE+"**ARROW DEFLECT**");
 	    				return;
 	    			}
-	    		} else if(defender != null && Math.random() * 1000 <= (mcUsers.getProfile(defender).getUnarmedInt() / 2)){
+	    		} else if(defender != null && Math.random() * 1000 <= (PPd.getUnarmedInt() / 2)){
 	    			event.setCancelled(true);
 	    			defender.sendMessage(ChatColor.WHITE+"**ARROW DEFLECT**");
 	    			return;
@@ -275,18 +284,19 @@ public class mcCombat {
     	 */
     	if(y instanceof Player){
     		Player attacker = (Player)y;
+    		PlayerProfile PPa = mcUsers.getProfile(attacker.getName());
     		if(event.getProjectile().toString().equals("CraftArrow") && mcPermissions.getInstance().archery(attacker)){
     			if(!mcConfig.getInstance().isTracked(x) && event.getDamage() > 0){
     				mcConfig.getInstance().addArrowTrack(x, 0);
     				if(attacker != null){
-    					if(Math.random() * 1000 <= mcUsers.getProfile(attacker).getArcheryInt()){
+    					if(Math.random() * 1000 <= PPa.getArcheryInt()){
     						mcConfig.getInstance().addArrowCount(x, 1);
     					}
     				}
     			} else {
     				if(event.getDamage() > 0){
     					if(attacker != null){
-        					if(Math.random() * 1000 <= mcUsers.getProfile(attacker).getArcheryInt()){
+        					if(Math.random() * 1000 <= PPa.getArcheryInt()){
         						mcConfig.getInstance().addArrowCount(x, 1);
         					}
         				}
@@ -297,16 +307,16 @@ public class mcCombat {
     			 */
     			if(Math.random() * 100 >= 75){
     				
-    				int ignition = 20;
-    				if(mcUsers.getProfile(attacker).getArcheryInt() >= 200)
+    				int ignition = 20;	
+    				if(PPa.getArcheryInt() >= 200)
     					ignition+=20;
-    				if(mcUsers.getProfile(attacker).getArcheryInt() >= 400)
+    				if(PPa.getArcheryInt() >= 400)
     					ignition+=20;
-    				if(mcUsers.getProfile(attacker).getArcheryInt() >= 600)
+    				if(PPa.getArcheryInt() >= 600)
     					ignition+=20;
-    				if(mcUsers.getProfile(attacker).getArcheryInt() >= 800)
+    				if(PPa.getArcheryInt() >= 800)
     					ignition+=20;
-    				if(mcUsers.getProfile(attacker).getArcheryInt() >= 1000)
+    				if(PPa.getArcheryInt() >= 1000)
     					ignition+=20;
     				
         			if(x instanceof Player){
@@ -328,58 +338,58 @@ public class mcCombat {
     			/*
     			 * TRACK ARROWS USED AGAINST THE ENTITY
     			 */
-    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 50 && mcUsers.getProfile(attacker).getArcheryInt() < 250)
+    			if(PPa.getArcheryInt() >= 50 && PPa.getArcheryInt() < 250)
     				event.setDamage(calculateDamage(event, 1));
-    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 250 && mcUsers.getProfile(attacker).getArcheryInt() < 575)
+    			if(PPa.getArcheryInt() >= 250 && PPa.getArcheryInt() < 575)
     				event.setDamage(calculateDamage(event, 2));
-    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 575 && mcUsers.getProfile(attacker).getArcheryInt() < 725)
+    			if(PPa.getArcheryInt() >= 575 && PPa.getArcheryInt() < 725)
     				event.setDamage(calculateDamage(event, 3));
-    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 725 && mcUsers.getProfile(attacker).getArcheryInt() < 1000)
+    			if(PPa.getArcheryInt() >= 725 && PPa.getArcheryInt() < 1000)
     				event.setDamage(calculateDamage(event, 4));
-    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 1000)
+    			if(PPa.getArcheryInt() >= 1000)
     				event.setDamage(calculateDamage(event, 5));
     			//XP
     			if(!mcConfig.getInstance().isMobSpawnTracked(x)){
     				if(x instanceof Creeper)
-					mcUsers.getProfile(attacker).addArcheryGather((event.getDamage() * 4) * mcLoadProperties.xpGainMultiplier);
+					PPa.addArcheryGather((event.getDamage() * 4) * mcLoadProperties.xpGainMultiplier);
 					if(x instanceof Spider)
-						mcUsers.getProfile(attacker).addArcheryGather((event.getDamage() * 3) * mcLoadProperties.xpGainMultiplier);
+						PPa.addArcheryGather((event.getDamage() * 3) * mcLoadProperties.xpGainMultiplier);
 					if(x instanceof Skeleton)
-						mcUsers.getProfile(attacker).addArcheryGather((event.getDamage() * 2) * mcLoadProperties.xpGainMultiplier);
+						PPa.addArcheryGather((event.getDamage() * 2) * mcLoadProperties.xpGainMultiplier);
 					if(x instanceof Zombie)
-						mcUsers.getProfile(attacker).addArcheryGather((event.getDamage() * 2) * mcLoadProperties.xpGainMultiplier);
+						PPa.addArcheryGather((event.getDamage() * 2) * mcLoadProperties.xpGainMultiplier);
 					if(x instanceof PigZombie)
-						mcUsers.getProfile(attacker).addArcheryGather((event.getDamage() * 3) * mcLoadProperties.xpGainMultiplier);
-    			}
+						PPa.addArcheryGather((event.getDamage() * 3) * mcLoadProperties.xpGainMultiplier);
     			}
+    		}
     		/*
     		 * Defender is Animals	
     		 */
     		if(x instanceof Animals){
-    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 50 && mcUsers.getProfile(attacker).getArcheryInt() < 250)
+    			if(PPa.getArcheryInt() >= 50 && PPa.getArcheryInt() < 250)
     				event.setDamage(calculateDamage(event, 1));
-    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 250 && mcUsers.getProfile(attacker).getArcheryInt() < 575)
+    			if(PPa.getArcheryInt() >= 250 && PPa.getArcheryInt() < 575)
     				event.setDamage(calculateDamage(event, 2));
-    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 575 && mcUsers.getProfile(attacker).getArcheryInt() < 725)
+    			if(PPa.getArcheryInt() >= 575 && PPa.getArcheryInt() < 725)
     				event.setDamage(calculateDamage(event, 3));
-    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 725 && mcUsers.getProfile(attacker).getArcheryInt() < 1000)
+    			if(PPa.getArcheryInt() >= 725 && PPa.getArcheryInt() < 1000)
     				event.setDamage(calculateDamage(event, 4));
-    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 1000)
+    			if(PPa.getArcheryInt() >= 1000)
     				event.setDamage(calculateDamage(event, 5));
     		}
     		/*
     		 * Defender is Squid
     		 */
     		if(x instanceof Squid){
-    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 50 && mcUsers.getProfile(attacker).getArcheryInt() < 250)
+    			if(PPa.getArcheryInt() >= 50 && PPa.getArcheryInt() < 250)
     				event.setDamage(calculateDamage(event, 1));
-    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 250 && mcUsers.getProfile(attacker).getArcheryInt() < 575)
+    			if(PPa.getArcheryInt() >= 250 && PPa.getArcheryInt() < 575)
     				event.setDamage(calculateDamage(event, 2));
-    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 575 && mcUsers.getProfile(attacker).getArcheryInt() < 725)
+    			if(PPa.getArcheryInt() >= 575 && PPa.getArcheryInt() < 725)
     				event.setDamage(calculateDamage(event, 3));
-    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 725 && mcUsers.getProfile(attacker).getArcheryInt() < 1000)
+    			if(PPa.getArcheryInt() >= 725 && PPa.getArcheryInt() < 1000)
     				event.setDamage(calculateDamage(event, 4));
-    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 1000)
+    			if(PPa.getArcheryInt() >= 1000)
     				event.setDamage(calculateDamage(event, 5));
     		}
     		/*
@@ -391,10 +401,11 @@ public class mcCombat {
     				return;
     			}
     			Player defender = (Player)x;
+    			PlayerProfile PPd = mcUsers.getProfile(defender.getName());
     			/*
     			 * Stuff for the daze proc
     			 */
-    	    		if(mcUsers.getProfile(attacker).inParty() && mcUsers.getProfile(defender).inParty()){
+    	    		if(PPa.inParty() && PPd.inParty()){
     					if(mcParty.getInstance().inSameParty(defender, attacker)){
     						event.setCancelled(true);
     						return;
@@ -404,7 +415,7 @@ public class mcCombat {
     	    		 * PVP XP
     	    		 */
     	    		if(mcLoadProperties.pvpxp && !mcParty.getInstance().inSameParty(attacker, defender)){
-    	    			mcUsers.getProfile(attacker).addArcheryGather((event.getDamage() * 3) * mcLoadProperties.pvpxprewardmodifier);
+    	    			PPa.addArcheryGather((event.getDamage() * 3) * mcLoadProperties.pvpxprewardmodifier);
     	    		}
     				/*
     				 * DAZE PROC
@@ -415,27 +426,27 @@ public class mcCombat {
 					} else {
 						loc.setPitch(-90);
 					}
-    				if(mcUsers.getProfile(attacker).getArcheryInt() >= 1000){
+    				if(PPa.getArcheryInt() >= 1000){
     	    			if(Math.random() * 1000 <= 500){
     	    				defender.teleportTo(loc);
     	    				defender.sendMessage(ChatColor.DARK_RED+"Touched Fuzzy. Felt Dizzy.");
     	    				attacker.sendMessage("Target was "+ChatColor.DARK_RED+"Dazed");
     	    			}
-    	    		} else if(Math.random() * 2000 <= mcUsers.getProfile(attacker).getArcheryInt()){
+    	    		} else if(Math.random() * 2000 <= PPa.getArcheryInt()){
     	    			defender.teleportTo(loc);
 	    				defender.sendMessage(ChatColor.DARK_RED+"Touched Fuzzy. Felt Dizzy.");
 	    				attacker.sendMessage("Target was "+ChatColor.DARK_RED+"Dazed");
     	    		}
     				
-					if(mcUsers.getProfile(attacker).getArcheryInt() >= 50 && mcUsers.getProfile(attacker).getArcheryInt() < 250)
+					if(PPa.getArcheryInt() >= 50 && PPa.getArcheryInt() < 250)
 	    				event.setDamage(calculateDamage(event, 1));
-	    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 250 && mcUsers.getProfile(attacker).getArcheryInt() < 575)
+	    			if(PPa.getArcheryInt() >= 250 && PPa.getArcheryInt() < 575)
 	    				event.setDamage(calculateDamage(event, 2));
-	    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 575 && mcUsers.getProfile(attacker).getArcheryInt() < 725)
+	    			if(PPa.getArcheryInt() >= 575 && PPa.getArcheryInt() < 725)
 	    				event.setDamage(calculateDamage(event, 3));
-	    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 725 && mcUsers.getProfile(attacker).getArcheryInt() < 1000)
+	    			if(PPa.getArcheryInt() >= 725 && PPa.getArcheryInt() < 1000)
 	    				event.setDamage(calculateDamage(event, 4));
-	    			if(mcUsers.getProfile(attacker).getArcheryInt() >= 1000)
+	    			if(PPa.getArcheryInt() >= 1000)
 	    				event.setDamage(calculateDamage(event, 5));
     			}
     		}
@@ -443,35 +454,37 @@ public class mcCombat {
     	}
     }
 	public boolean simulateUnarmedProc(Player player){
-    	if(mcUsers.getProfile(player).getUnarmedInt() >= 1000){
+		PlayerProfile PP = mcUsers.getProfile(player.getName());
+    	if(PP.getUnarmedInt() >= 1000){
     		if(Math.random() * 4000 <= 1000){
     			return true;
     		}
     	} else {
-    		if(Math.random() * 4000 <= mcUsers.getProfile(player).getUnarmedInt()){
+    		if(Math.random() * 4000 <= PP.getUnarmedInt()){
     			return true;
     		}
     	}
     		return false;
     }
     public void bleedCheck(Player attacker, Entity x){
+    	PlayerProfile PPa = mcUsers.getProfile(attacker.getName());
     	if(mcPermissions.getInstance().swords(attacker) && mcm.getInstance().isSwords(attacker.getItemInHand())){
-			if(mcUsers.getProfile(attacker).getSwordsInt() >= 750){
+			if(PPa.getSwordsInt() >= 750){
 				if(Math.random() * 1000 >= 750){
 					if(!(x instanceof Player))
 						mcConfig.getInstance().addToBleedQue(x);
 					if(x instanceof Player){
 						Player target = (Player)x;
-						mcUsers.getProfile(target).addBleedTicks(3);
+						mcUsers.getProfile(target.getName()).addBleedTicks(3);
 					}
 					attacker.sendMessage(ChatColor.GREEN+"**ENEMY BLEEDING**");
 				}
-			} else if (Math.random() * 1000 <= mcUsers.getProfile(attacker).getSwordsInt()){
+			} else if (Math.random() * 1000 <= PPa.getSwordsInt()){
 				if(!(x instanceof Player))
 					mcConfig.getInstance().addToBleedQue(x);
 				if(x instanceof Player){
 					Player target = (Player)x;
-					mcUsers.getProfile(target).addBleedTicks(2);
+					mcUsers.getProfile(target.getName()).addBleedTicks(2);
 				}
 				attacker.sendMessage(ChatColor.GREEN+"**ENEMY BLEEDING**");
 			}
@@ -534,7 +547,7 @@ public class mcCombat {
     				if(!target.getName().equals(attacker.getName()) && targets >= 1){
     					target.damage(event.getDamage() / 4);
     					target.sendMessage(ChatColor.DARK_RED+"Struck by Serrated Strikes!");
-        				mcUsers.getProfile(target).addBleedTicks(5);
+        				mcUsers.getProfile(target.getName()).addBleedTicks(5);
     					targets--;
     				}
     			}
@@ -560,8 +573,9 @@ public class mcCombat {
     	}
     }
     public void axeCriticalCheck(Player attacker, EntityDamageByEntityEvent event, Entity x){
+    	PlayerProfile PPa = mcUsers.getProfile(attacker.getName());
     	if(mcm.getInstance().isAxes(attacker.getItemInHand()) && mcPermissions.getInstance().axes(attacker)){
-    		if(mcUsers.getProfile(attacker).getAxesInt() >= 750){
+    		if(PPa.getAxesInt() >= 750){
     			if(Math.random() * 1000 <= 750){
     				if(x instanceof Player){
     					Player player = (Player)x;
@@ -574,7 +588,7 @@ public class mcCombat {
         			}
     				attacker.sendMessage(ChatColor.RED+"CRITICAL HIT!");
     			}
-    		} else if(Math.random() * 1000 <= mcUsers.getProfile(attacker).getAxesInt()){
+    		} else if(Math.random() * 1000 <= PPa.getAxesInt()){
     			if(x instanceof Player){
     				Player player = (Player)x;
     				player.sendMessage(ChatColor.DARK_RED + "You were CRITICALLY hit!");
@@ -589,9 +603,10 @@ public class mcCombat {
     	}
     }
     public void parryCheck(Player defender, EntityDamageByEntityEvent event, Entity y){
+    	PlayerProfile PPd = mcUsers.getProfile(defender.getName());
     	if(defender != null && mcm.getInstance().isSwords(defender.getItemInHand()) 
     			&& mcPermissions.getInstance().swords(defender)){
-			if(mcUsers.getProfile(defender).getSwordsInt() >= 900){
+			if(PPd.getSwordsInt() >= 900){
 				if(Math.random() * 3000 <= 900){
 					event.setCancelled(true);
 					defender.sendMessage(ChatColor.GREEN+"**PARRIED**");
@@ -602,7 +617,7 @@ public class mcCombat {
 					}
 				}
 			} else {
-				if(Math.random() * 3000 <= mcUsers.getProfile(defender).getSwordsInt()){
+				if(Math.random() * 3000 <= PPd.getSwordsInt()){
 					event.setCancelled(true);
 					defender.sendMessage(ChatColor.YELLOW+"*CLANG* SUCCESSFUL PARRY *CLANG*");
 					defender.getItemInHand().setDurability((short) (defender.getItemInHand().getDurability() + 1));

+ 28 - 29
mcMMO/com/gmail/nossr50/mcEntityListener.java

@@ -5,12 +5,9 @@ import net.minecraft.server.EntityLiving;
 import org.bukkit.ChatColor;
 import org.bukkit.Location;
 import org.bukkit.craftbukkit.entity.CraftEntity;
-import org.bukkit.entity.Animals;
 import org.bukkit.entity.Arrow;
 import org.bukkit.entity.Entity;
-import org.bukkit.entity.Monster;
 import org.bukkit.entity.Player;
-import org.bukkit.entity.Wolf;
 import org.bukkit.event.entity.CreatureSpawnEvent;
 import org.bukkit.event.entity.EntityDamageByEntityEvent;
 import org.bukkit.event.entity.EntityDamageByProjectileEvent;
@@ -19,7 +16,7 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
 import org.bukkit.event.entity.EntityDeathEvent;
 import org.bukkit.event.entity.EntityListener;
 import org.bukkit.inventory.ItemStack;
-import org.bukkit.util.Vector;
+import com.gmail.nossr50.PlayerList.PlayerProfile;
 
 
 public class mcEntityListener extends EntityListener {
@@ -84,8 +81,11 @@ public class mcEntityListener extends EntityListener {
         	 */
         	if(e instanceof Player){
         		Player defender = (Player)e;
+        		PlayerProfile PPd = mcUsers.getProfile(defender.getName());
         		if(defender != null && mcConfig.getInstance().isGodModeToggled(defender.getName()))
         			event.setCancelled(true);
+        		if(PPd == null)
+        			mcUsers.addUser(defender);
         		/*
         		 * PARRYING CHECK, CHECK TO SEE IF ITS A SUCCESSFUL PARRY OR NOT
         		 */
@@ -113,19 +113,25 @@ public class mcEntityListener extends EntityListener {
         		//((Player) f).sendMessage("DEBUG: EntityDamageByEntity cast correctly!");
         		int typeid = ((Player) f).getItemInHand().getTypeId();
         		Player attacker = (Player)f;
+        		/*
+        		* Check if the Timer is doing its job
+        		*/
+           		mcSkills.getInstance().monitorSkills(attacker);
+           		
+        		PlayerProfile PPa = mcUsers.getProfile(attacker.getName());
         		/*
         		 * ACTIVATE ABILITIES
         		 */
-        		if(mcUsers.getProfile(attacker).getAxePreparationMode())
-        			mcSkills.getInstance().skullSplitterCheck(attacker);
-        		if(mcUsers.getProfile(attacker).getSwordsPreparationMode())
-        			mcSkills.getInstance().serratedStrikesActivationCheck(attacker);
-        		if(mcUsers.getProfile(attacker).getFistsPreparationMode())
-        			mcSkills.getInstance().berserkActivationCheck(attacker);
+        		if(PPa.getAxePreparationMode())
+        			mcSkills.getInstance().skullSplitterCheck(attacker, plugin);
+        		if(PPa.getSwordsPreparationMode())
+        			mcSkills.getInstance().serratedStrikesActivationCheck(attacker, plugin);
+        		if(PPa.getFistsPreparationMode())
+        			mcSkills.getInstance().berserkActivationCheck(attacker, plugin);
         		/*
         		 * BERSERK DAMAGE MODIFIER
         		 */
-        		if(mcUsers.getProfile(attacker).getBerserkMode())
+        		if(PPa.getBerserkMode())
         			event.setDamage(event.getDamage() + (event.getDamage() / 2));
         		/*
         		 * Player versus Monster checks, this handles all skill damage modifiers and any procs.
@@ -148,18 +154,10 @@ public class mcEntityListener extends EntityListener {
         		 * This will do AOE damage from the axes ability
         		 */
         		
-        		if(!event.isCancelled() && mcUsers.getProfile(attacker).getSkullSplitterMode() && mcm.getInstance().isAxes(attacker.getItemInHand())){
-        			/*
-        			* Check if the Timer is doing its job
-        			*/
-            		mcSkills.getInstance().monitorSkills(attacker);
+        		if(!event.isCancelled() && PPa.getSkullSplitterMode() && mcm.getInstance().isAxes(attacker.getItemInHand())){
         			mcCombat.getInstance().applyAoeDamage(attacker, eventb, x);
         		}
-        		if(!event.isCancelled() && mcUsers.getProfile(attacker).getSerratedStrikesMode() && mcm.getInstance().isSwords(attacker.getItemInHand())){
-        			/*
-        			* Check if the Timer is doing its job
-        			*/
-            		mcSkills.getInstance().monitorSkills(attacker);
+        		if(!event.isCancelled() && PPa.getSerratedStrikesMode() && mcm.getInstance().isSwords(attacker.getItemInHand())){
         			mcCombat.getInstance().applySerratedStrikes(attacker, eventb, x);
         		}
         	}
@@ -168,6 +166,7 @@ public class mcEntityListener extends EntityListener {
         	 */
         	if(e instanceof Player){
         		Player defender = (Player)e;
+        		PlayerProfile PPd = mcUsers.getProfile(defender.getName());
         		if(f instanceof Player){
         			Player attacker = (Player)f;
         			if(mcParty.getInstance().inSameParty(defender, attacker)){
@@ -188,14 +187,14 @@ public class mcEntityListener extends EntityListener {
 	        		}
 	        		if(isArrow == false){
 	        			//defender.sendMessage("isArrow ="+isArrow);
-			    		if(mcUsers.getProfile(defender).getSwordsInt() >= 600){
+			    		if(PPd.getSwordsInt() >= 600){
 			    			if(Math.random() * 2000 <= 600){
 			    				mcCombat.getInstance().dealDamage(f, event.getDamage() / 2);
 			    				defender.sendMessage(ChatColor.GREEN+"**COUNTER-ATTACKED**");
 			    				if(f instanceof Player)
 			    					((Player) f).sendMessage(ChatColor.DARK_RED+"Hit with counterattack!");
 			    			}
-			    		} else if (Math.random() * 2000 <= mcUsers.getProfile(defender).getSwordsInt()){
+			    		} else if (Math.random() * 2000 <= PPd.getSwordsInt()){
 			    			mcCombat.getInstance().dealDamage(f, event.getDamage() / 2);
 			    			defender.sendMessage(ChatColor.GREEN+"**COUNTER-ATTACKED**");
 		    				if(f instanceof Player)
@@ -207,10 +206,10 @@ public class mcEntityListener extends EntityListener {
 	        	 * DODGE STUFF
 	        	 */
 	    		if(mcPermissions.getInstance().acrobatics(defender)){
-	    			if(mcUsers.getProfile(defender).getAcrobaticsInt() <= 800){
-			    		if(Math.random() * 4000 <= mcUsers.getProfile(defender).getAcrobaticsInt()){
+	    			if(PPd.getAcrobaticsInt() <= 800){
+			    		if(Math.random() * 4000 <= PPd.getAcrobaticsInt()){
 			    			defender.sendMessage(ChatColor.GREEN+"**DODGE**");
-			    			mcUsers.getProfile(defender).addAcrobaticsGather(event.getDamage() * 12);
+			    			PPd.addAcrobaticsGather(event.getDamage() * 12);
 			    			mcSkills.getInstance().XpCheck(defender);
 			    			event.setDamage(event.getDamage() / 2);
 			    			//Needs to do minimal damage
@@ -219,7 +218,7 @@ public class mcEntityListener extends EntityListener {
 			    		}
 	    			} else if(Math.random() * 4000 <= 800) {
 		    			defender.sendMessage(ChatColor.GREEN+"**DODGE**");
-		    			mcUsers.getProfile(defender).addAcrobaticsGather(event.getDamage() * 12);
+		    			PPd.addAcrobaticsGather(event.getDamage() * 12);
 		    			mcSkills.getInstance().XpCheck(defender);
 		    			event.setDamage(event.getDamage() / 2);
 		    			//Needs to do minimal damage
@@ -235,7 +234,7 @@ public class mcEntityListener extends EntityListener {
     	 */
     	if(x instanceof Player && !event.isCancelled()){
     		Player herpderp = (Player)x;
-    		mcUsers.getProfile(herpderp).setRecentlyHurt(System.currentTimeMillis());
+    		mcUsers.getProfile(herpderp.getName()).setRecentlyHurt(System.currentTimeMillis());
     	}
     	}
     	}
@@ -255,7 +254,7 @@ public class mcEntityListener extends EntityListener {
 		}
     	if(x instanceof Player){
     		Player player = (Player)x;
-    		mcUsers.getProfile(player).setBleedTicks(0);
+    		mcUsers.getProfile(player.getName()).setBleedTicks(0);
     	}
     }
     public boolean isPlayer(Entity entity){

+ 53 - 34
mcMMO/com/gmail/nossr50/mcExcavation.java

@@ -6,6 +6,9 @@ import org.bukkit.Material;
 import org.bukkit.block.Block;
 import org.bukkit.entity.Player;
 import org.bukkit.inventory.ItemStack;
+import org.bukkit.plugin.Plugin;
+
+import com.gmail.nossr50.PlayerList.PlayerProfile;
 
 
 public class mcExcavation {
@@ -20,27 +23,32 @@ public class mcExcavation {
     	}
     	return instance;
     	}
-	public void gigaDrillBreakerActivationCheck(Player player, Block block){
+	public void gigaDrillBreakerActivationCheck(Player player, Block block, Plugin pluginx){
+		PlayerProfile PP = mcUsers.getProfile(player.getName());
 		if(mcm.getInstance().isShovel(player.getItemInHand())){
 	    	if(block != null){
 		    	if(!mcm.getInstance().abilityBlockCheck(block))
 		    		return;
 	    	}
-	    	if(mcUsers.getProfile(player).getShovelPreparationMode()){
-    			mcUsers.getProfile(player).setShovelPreparationMode(false);
+	    	if(PP.getShovelPreparationMode()){
+    			PP.setShovelPreparationMode(false);
     		}
 	    	int ticks = 2;
-	    	int x = mcUsers.getProfile(player).getExcavationInt();
+	    	int x = PP.getExcavationInt();
     		while(x >= 50){
     			x-=50;
     			ticks++;
     		}
     		
-	    	if(!mcUsers.getProfile(player).getGigaDrillBreakerMode() && mcUsers.getProfile(player).getGigaDrillBreakerCooldown() == 0){
+	    	if(!PP.getGigaDrillBreakerMode() && PP.getGigaDrillBreakerCooldown() == 0){
 	    		player.sendMessage(ChatColor.GREEN+"**GIGA DRILL BREAKER ACTIVATED**");
-	    		mcUsers.getProfile(player).setGigaDrillBreakerTicks(ticks * 1000);
-	    		mcUsers.getProfile(player).setGigaDrillBreakerActivatedTimeStamp(System.currentTimeMillis());
-	    		mcUsers.getProfile(player).setGigaDrillBreakerMode(true);
+	    		for(Player y : pluginx.getServer().getOnlinePlayers()){
+	    			if(y != null && y != player && mcm.getInstance().getDistance(player.getLocation(), y.getLocation()) < 10)
+	    				y.sendMessage(ChatColor.GREEN+player.getName()+ChatColor.DARK_GREEN+" has used "+ChatColor.RED+"Giga Drill Breaker!");
+	    		}
+	    		PP.setGigaDrillBreakerTicks(ticks * 1000);
+	    		PP.setGigaDrillBreakerActivatedTimeStamp(System.currentTimeMillis());
+	    		PP.setGigaDrillBreakerMode(true);
 	    	}
 	    	
 	    }
@@ -54,6 +62,7 @@ public class mcExcavation {
 		}
 	}
 	public void excavationProcCheck(Block block, Player player){
+		PlayerProfile PP = mcUsers.getProfile(player.getName());
     	int type = block.getTypeId();
     	Location loc = block.getLocation();
     	ItemStack is = null;
@@ -62,17 +71,17 @@ public class mcExcavation {
     		return;
     	}
     	if(type == 2){
-    		if(mcUsers.getProfile(player).getExcavationInt() > 250){
+    		if(PP.getExcavationInt() > 250){
 	    		//CHANCE TO GET EGGS
 	    		if(mcLoadProperties.eggs == true && Math.random() * 100 > 99){
-	    			mcUsers.getProfile(player).addExcavationGather(10 * mcLoadProperties.xpGainMultiplier);
+	    			PP.addExcavationGather(10 * mcLoadProperties.xpGainMultiplier);
 					mat = Material.getMaterial(344);
 					is = new ItemStack(mat, 1, (byte)0, (byte)0);
 					loc.getWorld().dropItemNaturally(loc, is);
 	    		}
 	    		//CHANCE TO GET APPLES
 	    		if(mcLoadProperties.apples == true && Math.random() * 100 > 99){
-	    			mcUsers.getProfile(player).addExcavationGather(10 * mcLoadProperties.xpGainMultiplier);
+	    			PP.addExcavationGather(10 * mcLoadProperties.xpGainMultiplier);
 	    			mat = Material.getMaterial(260);
 					is = new ItemStack(mat, 1, (byte)0, (byte)0);
 					loc.getWorld().dropItemNaturally(loc, is);
@@ -81,39 +90,39 @@ public class mcExcavation {
     	}
     	//DIRT SAND OR GRAVEL
     	if(type == 3 || type == 13 || type == 2 || type == 12){
-    			mcUsers.getProfile(player).addExcavationGather(4 * mcLoadProperties.xpGainMultiplier);
-    		if(mcUsers.getProfile(player).getExcavationInt() > 750){
+    			PP.addExcavationGather(4 * mcLoadProperties.xpGainMultiplier);
+    		if(PP.getExcavationInt() > 750){
     			//CHANCE TO GET CAKE
     			if(mcLoadProperties.cake == true && Math.random() * 2000 > 1999){
-    				mcUsers.getProfile(player).addExcavationGather(300 * mcLoadProperties.xpGainMultiplier);
+    				PP.addExcavationGather(300 * mcLoadProperties.xpGainMultiplier);
     				mat = Material.getMaterial(354);
     				is = new ItemStack(mat, 1, (byte)0, (byte)0);
     				loc.getWorld().dropItemNaturally(loc, is);
     			}
     		}
-    		if(mcUsers.getProfile(player).getExcavationInt() > 350){
+    		if(PP.getExcavationInt() > 350){
     			//CHANCE TO GET DIAMOND
     			if(mcLoadProperties.diamond == true && Math.random() * 750 > 749){
-    				mcUsers.getProfile(player).addExcavationGather(100 * mcLoadProperties.xpGainMultiplier);
+    				PP.addExcavationGather(100 * mcLoadProperties.xpGainMultiplier);
         				mat = Material.getMaterial(264);
         				is = new ItemStack(mat, 1, (byte)0, (byte)0);
         				loc.getWorld().dropItemNaturally(loc, is);
     			}
     		}
-    		if(mcUsers.getProfile(player).getExcavationInt() > 250){
+    		if(PP.getExcavationInt() > 250){
     			//CHANCE TO GET YELLOW MUSIC
     			if(mcLoadProperties.music == true && Math.random() * 2000 > 1999){
-    				mcUsers.getProfile(player).addExcavationGather(300 * mcLoadProperties.xpGainMultiplier);
+    				PP.addExcavationGather(300 * mcLoadProperties.xpGainMultiplier);
     				mat = Material.getMaterial(2256);
     				is = new ItemStack(mat, 1, (byte)0, (byte)0);
     				loc.getWorld().dropItemNaturally(loc, is);
     			}
     			
     		}
-    		if(mcUsers.getProfile(player).getExcavationInt() > 350){
+    		if(PP.getExcavationInt() > 350){
     			//CHANCE TO GET GREEN MUSIC
     			if(mcLoadProperties.music == true && Math.random() * 2000 > 1999){
-    				mcUsers.getProfile(player).addExcavationGather(300 * mcLoadProperties.xpGainMultiplier);
+    				PP.addExcavationGather(300 * mcLoadProperties.xpGainMultiplier);
     				mat = Material.getMaterial(2257);
     				is = new ItemStack(mat, 1, (byte)0, (byte)0);
     				loc.getWorld().dropItemNaturally(loc, is);
@@ -123,15 +132,15 @@ public class mcExcavation {
     	//SAND
     	if(type == 12){
     		//CHANCE TO GET GLOWSTONE
-    		if(mcLoadProperties.glowstone == true && mcUsers.getProfile(player).getExcavationInt() > 50 && Math.random() * 100 > 95){
-    			mcUsers.getProfile(player).addExcavationGather(8 * mcLoadProperties.xpGainMultiplier);
+    		if(mcLoadProperties.glowstone == true && PP.getExcavationInt() > 50 && Math.random() * 100 > 95){
+    			PP.addExcavationGather(8 * mcLoadProperties.xpGainMultiplier);
 				mat = Material.getMaterial(348);
 				is = new ItemStack(mat, 1, (byte)0, (byte)0);
 				loc.getWorld().dropItemNaturally(loc, is);
     		}
     		//CHANCE TO GET SLOWSAND
-    		if(mcLoadProperties.slowsand == true && mcUsers.getProfile(player).getExcavationInt() > 650 && Math.random() * 200 > 199){
-    			mcUsers.getProfile(player).addExcavationGather(8 * mcLoadProperties.xpGainMultiplier);
+    		if(mcLoadProperties.slowsand == true && PP.getExcavationInt() > 650 && Math.random() * 200 > 199){
+    			PP.addExcavationGather(8 * mcLoadProperties.xpGainMultiplier);
 				mat = Material.getMaterial(88);
 				is = new ItemStack(mat, 1, (byte)0, (byte)0);
 				loc.getWorld().dropItemNaturally(loc, is);
@@ -139,9 +148,19 @@ public class mcExcavation {
     	}
     	//GRASS OR DIRT
     	if(type == 2 || type == 3){
+    		if(PP.getExcavationInt() > 50){
+    			//CHANCE FOR COCOA BEANS
+    			if(mcLoadProperties.eggs == true && Math.random() * 75 > 74){
+	    			PP.addExcavationGather(10 * mcLoadProperties.xpGainMultiplier);
+					mat = Material.getMaterial(351);
+					is = new ItemStack(mat, 1, (byte)0, (byte)0);
+					is.setDurability((byte) 3); //COCOA
+					loc.getWorld().dropItemNaturally(loc, is);
+    			}
+    		}
     		//CHANCE FOR SHROOMS
-    		if(mcLoadProperties.mushrooms == true && mcUsers.getProfile(player).getExcavationInt() > 500 && Math.random() * 200 > 199){
-    			mcUsers.getProfile(player).addExcavationGather(8 * mcLoadProperties.xpGainMultiplier);
+    		if(mcLoadProperties.mushrooms == true && PP.getExcavationInt() > 500 && Math.random() * 200 > 199){
+    			PP.addExcavationGather(8 * mcLoadProperties.xpGainMultiplier);
     			if(Math.random() * 10 > 5){
     				mat = Material.getMaterial(39);
     			} else {
@@ -151,8 +170,8 @@ public class mcExcavation {
 				loc.getWorld().dropItemNaturally(loc, is);
     		}
     		//CHANCE TO GET GLOWSTONE
-    		if(mcLoadProperties.glowstone == true && mcUsers.getProfile(player).getExcavationInt() > 25 && Math.random() * 100 > 95){
-    			mcUsers.getProfile(player).addExcavationGather(8 * mcLoadProperties.xpGainMultiplier);
+    		if(mcLoadProperties.glowstone == true && PP.getExcavationInt() > 25 && Math.random() * 100 > 95){
+    			PP.addExcavationGather(8 * mcLoadProperties.xpGainMultiplier);
     			mat = Material.getMaterial(348);
 				is = new ItemStack(mat, 1, (byte)0, (byte)0);
 				loc.getWorld().dropItemNaturally(loc, is);
@@ -161,25 +180,25 @@ public class mcExcavation {
     	//GRAVEL
     	if(type == 13){
     		//CHANCE TO GET NETHERRACK
-    		if(mcLoadProperties.netherrack == true && mcUsers.getProfile(player).getExcavationInt() > 850 && Math.random() * 200 > 199){
-    			mcUsers.getProfile(player).addExcavationGather(3 * mcLoadProperties.xpGainMultiplier);
+    		if(mcLoadProperties.netherrack == true && PP.getExcavationInt() > 850 && Math.random() * 200 > 199){
+    			PP.addExcavationGather(3 * mcLoadProperties.xpGainMultiplier);
 				mat = Material.getMaterial(87);
 				is = new ItemStack(mat, 1, (byte)0, (byte)0);
 				loc.getWorld().dropItemNaturally(loc, is);
     		}
     		//CHANCE TO GET SULPHUR
-    		if(mcLoadProperties.sulphur == true && mcUsers.getProfile(player).getExcavationInt() > 75){
+    		if(mcLoadProperties.sulphur == true && PP.getExcavationInt() > 75){
 	    		if(Math.random() * 10 > 9){
-	    			mcUsers.getProfile(player).addExcavationGather(3 * mcLoadProperties.xpGainMultiplier);
+	    			PP.addExcavationGather(3 * mcLoadProperties.xpGainMultiplier);
 	    			mat = Material.getMaterial(289);
 					is = new ItemStack(mat, 1, (byte)0, (byte)0);
 					loc.getWorld().dropItemNaturally(loc, is);
 	    		}
     		}
     		//CHANCE TO GET BONES
-    		if(mcLoadProperties.bones == true && mcUsers.getProfile(player).getExcavationInt() > 175){
+    		if(mcLoadProperties.bones == true && PP.getExcavationInt() > 175){
         		if(Math.random() * 10 > 9){
-        			mcUsers.getProfile(player).addExcavationGather(3 * mcLoadProperties.xpGainMultiplier);
+        			PP.addExcavationGather(3 * mcLoadProperties.xpGainMultiplier);
         			mat = Material.getMaterial(352);
     				is = new ItemStack(mat, 1, (byte)0, (byte)0);
     				loc.getWorld().dropItemNaturally(loc, is);

+ 175 - 24
mcMMO/com/gmail/nossr50/mcHerbalism.java

@@ -3,9 +3,14 @@ package com.gmail.nossr50;
 import org.bukkit.ChatColor;
 import org.bukkit.Location;
 import org.bukkit.Material;
+import org.bukkit.World;
 import org.bukkit.block.Block;
 import org.bukkit.entity.Player;
+import org.bukkit.event.block.BlockBreakEvent;
 import org.bukkit.inventory.ItemStack;
+import org.bukkit.plugin.Plugin;
+
+import com.gmail.nossr50.PlayerList.PlayerProfile;
 
 
 public class mcHerbalism {
@@ -20,7 +25,94 @@ public class mcHerbalism {
     	}
     	return instance;
     	}
-	public void herbalismProcCheck(Block block, Player player){
+	public void greenTerraWheat(Player player, Block block, BlockBreakEvent event){
+		event.setCancelled(true);
+		PlayerProfile PP = mcUsers.getProfile(player.getName());
+		Material mat = Material.getMaterial(296);
+		Location loc = block.getLocation();
+		ItemStack is = new ItemStack(mat, 1, (byte)0, (byte)0);
+		PP.addHerbalismGather(5 * mcLoadProperties.xpGainMultiplier);
+    	loc.getWorld().dropItemNaturally(loc, is);
+    	herbalismProcCheck(block, player, event);
+    	herbalismProcCheck(block, player, event);
+		block.setData((byte) 0x03);
+	}
+	public void greenTerra(Player player, Block block){
+		if(!hasSeeds(player) && block.getType() != Material.WHEAT)
+			player.sendMessage("You need more seeds to spread Green Terra");
+		if(hasSeeds(player) && block.getType() != Material.WHEAT){
+		removeSeeds(player);	
+		if(block.getType() == Material.DIRT)
+			block.setType(Material.GRASS);
+		if(block.getType() == Material.COBBLESTONE)
+			block.setType(Material.MOSSY_COBBLESTONE);
+		}
+	}
+	public Boolean canBeGreenTerra(Block block){
+    	int t = block.getTypeId();
+    	if(t == 4 || t == 3 || t == 59 || t == 81 || t == 83 || t == 91 || t == 86 || t == 39 || t == 46 || t == 37 || t == 38){
+    		return true;
+    	} else {
+    		return false;
+    	}
+    }
+	public boolean hasSeeds(Player player){
+    	ItemStack[] inventory = player.getInventory().getContents();
+    	for(ItemStack x : inventory){
+    		if(x != null && x.getTypeId() == 295){
+    			return true;
+    		}
+    	}
+    	return false;
+    }
+	public void removeSeeds(Player player){
+    	ItemStack[] inventory = player.getInventory().getContents();
+    	for(ItemStack x : inventory){
+    		if(x != null && x.getTypeId() == 295){
+    			if(x.getAmount() == 1){
+    				x.setTypeId(0);
+    				x.setAmount(0);
+    				player.getInventory().setContents(inventory);
+    			} else{
+    			x.setAmount(x.getAmount() - 1);
+    			player.getInventory().setContents(inventory);
+    			}
+    			return;
+    		}
+    	}
+    }
+	public void greenTerraCheck(Player player, Block block, Plugin pluginx){
+		PlayerProfile PP = mcUsers.getProfile(player.getName());
+	    if(mcm.getInstance().isHoe(player.getItemInHand())){
+	    	if(block != null){
+		    	if(!mcm.getInstance().abilityBlockCheck(block))
+		    		return;
+	    	}
+	    	if(PP.getHoePreparationMode()){
+    			PP.setHoePreparationMode(false);
+    		}
+	    	int ticks = 2;
+	    	int x = PP.getHerbalismInt();
+    		while(x >= 50){
+    			x-=50;
+    			ticks++;
+    		}
+    		
+	    	if(!PP.getGreenTerraMode() && PP.getGreenTerraCooldown() == 0){
+	    		player.sendMessage(ChatColor.GREEN+"**GREEN TERRA ACTIVATED**");
+	    		for(Player y : pluginx.getServer().getOnlinePlayers()){
+	    			if(y != null && y != player && mcm.getInstance().getDistance(player.getLocation(), y.getLocation()) < 10)
+	    				y.sendMessage(ChatColor.GREEN+player.getName()+ChatColor.DARK_GREEN+" has used "+ChatColor.RED+"Green Terra!");
+	    		}
+	    		PP.setGreenTerraTicks(ticks * 1000);
+	    		PP.setGreenTerraActivatedTimeStamp(System.currentTimeMillis());
+	    		PP.setGreenTerraMode(true);
+	    	}
+	    	
+	    }
+	}
+	public void herbalismProcCheck(Block block, Player player, BlockBreakEvent event){
+		PlayerProfile PP = mcUsers.getProfile(player.getName());
     	int type = block.getTypeId();
     	Location loc = block.getLocation();
     	ItemStack is = null;
@@ -32,80 +124,139 @@ public class mcHerbalism {
     	if(type == 59 && block.getData() == (byte) 0x7){
     		mat = Material.getMaterial(296);
 			is = new ItemStack(mat, 1, (byte)0, (byte)0);
-    		mcUsers.getProfile(player).addHerbalismGather(5 * mcLoadProperties.xpGainMultiplier);
+    		PP.addHerbalismGather(5 * mcLoadProperties.xpGainMultiplier);
     		if(player != null){
-	    		if(Math.random() * 1000 <= mcUsers.getProfile(player).getHerbalismInt()){
+	    		if(Math.random() * 1000 <= PP.getHerbalismInt()){
 	    			loc.getWorld().dropItemNaturally(loc, is);
 	    		}
     		}
+    		//GREEN THUMB
+    		if(Math.random() * 1500 <= PP.getHerbalismInt()){
+    			event.setCancelled(true);
+    			loc.getWorld().dropItemNaturally(loc, is);
+    			//block.setType(Material.WHEAT); //Change broken block to wheat
+    			block.setData((byte) 0x1); //Change it to first stage
+    			
+    			//Setup the bonuses
+    			int bonus = 0;
+    			if(PP.getHerbalismInt() >= 200)
+    				bonus++;
+    			if(PP.getHerbalismInt() >= 400)
+    				bonus++;
+    			if(PP.getHerbalismInt() >= 600)
+    				bonus++;
+    			
+    			//Change wheat to be whatever stage based on the bonus
+    			if(bonus == 1)
+    				block.setData((byte) 0x2);
+    			if(bonus == 2)
+    				block.setData((byte) 0x3);
+    			if(bonus == 3)
+    				block.setData((byte) 0x4);
+    		}
     	}
     	/*
     	 * We need to check not-wheat stuff for if it was placed by the player or not
     	 */
-    	if(!mcConfig.getInstance().isBlockWatched(block)){
+    	if(block.getData() != (byte) 5){
+    		//Cactus
+	    	if(type == 81){
+	    		mat = Material.getMaterial(block.getTypeId());
+				is = new ItemStack(mat, 1, (byte)0, (byte)0);
+	    		if(player != null){
+		    		if(Math.random() * 1000 <= PP.getHerbalismInt()){
+		    			loc.getWorld().dropItemNaturally(loc, is);
+		    		}
+	    		}
+	    		PP.addHerbalismGather(3 * mcLoadProperties.xpGainMultiplier);
+	    	}
+    		//Sugar Canes
+	    	if(type == 83){
+	    		mat = Material.getMaterial(block.getTypeId());
+				is = new ItemStack(mat, 1, (byte)0, (byte)0);
+	    		if(player != null){
+		    		if(Math.random() * 1000 <= PP.getHerbalismInt()){
+		    			loc.getWorld().dropItemNaturally(loc, is);
+		    		}
+	    		}
+	    		PP.addHerbalismGather(3 * mcLoadProperties.xpGainMultiplier);
+	    	}
+    		//Pumpkins
+	    	if(type == 91 || type == 86){
+	    		mat = Material.getMaterial(block.getTypeId());
+				is = new ItemStack(mat, 1, (byte)0, (byte)0);
+	    		if(player != null){
+		    		if(Math.random() * 1000 <= PP.getHerbalismInt()){
+		    			loc.getWorld().dropItemNaturally(loc, is);
+		    		}
+	    		}
+	    		PP.addHerbalismGather(55 * mcLoadProperties.xpGainMultiplier);
+	    	}
     		//Mushroom
 	    	if(type == 39 || type == 40){
 	    		mat = Material.getMaterial(block.getTypeId());
 				is = new ItemStack(mat, 1, (byte)0, (byte)0);
 	    		if(player != null){
-		    		if(Math.random() * 1000 <= mcUsers.getProfile(player).getHerbalismInt()){
+		    		if(Math.random() * 1000 <= PP.getHerbalismInt()){
 		    			loc.getWorld().dropItemNaturally(loc, is);
 		    		}
 	    		}
-	    		mcUsers.getProfile(player).addHerbalismGather(40 * mcLoadProperties.xpGainMultiplier);
+	    		PP.addHerbalismGather(40 * mcLoadProperties.xpGainMultiplier);
 	    	}
 	    	//Flower
 	    	if(type == 37 || type == 38){
 	    		mat = Material.getMaterial(block.getTypeId());
 				is = new ItemStack(mat, 1, (byte)0, (byte)0);
 	    		if(player != null){
-		    		if(Math.random() * 1000 <= mcUsers.getProfile(player).getHerbalismInt()){
+		    		if(Math.random() * 1000 <= PP.getHerbalismInt()){
 		    			loc.getWorld().dropItemNaturally(loc, is);
 		    		}
 	    		}
-	    		mcUsers.getProfile(player).addHerbalismGather(10 * mcLoadProperties.xpGainMultiplier);
+	    		PP.addHerbalismGather(10 * mcLoadProperties.xpGainMultiplier);
 	    	}
     	}
     	mcSkills.getInstance().XpCheck(player);
     }
 	public void breadCheck(Player player, ItemStack is){
+		PlayerProfile PP = mcUsers.getProfile(player.getName());
     	if(is.getTypeId() == 297){
-    		if(mcUsers.getProfile(player).getHerbalismInt() >= 50 && mcUsers.getProfile(player).getHerbalismInt() < 150){
+    		if(PP.getHerbalismInt() >= 50 && PP.getHerbalismInt() < 150){
     			player.setHealth(player.getHealth() + 1);
-    		} else if (mcUsers.getProfile(player).getHerbalismInt() >= 150 && mcUsers.getProfile(player).getHerbalismInt() < 250){
+    		} else if (PP.getHerbalismInt() >= 150 && PP.getHerbalismInt() < 250){
     			player.setHealth(player.getHealth() + 2);
-    		} else if (mcUsers.getProfile(player).getHerbalismInt() >= 250 && mcUsers.getProfile(player).getHerbalismInt() < 350){
+    		} else if (PP.getHerbalismInt() >= 250 && PP.getHerbalismInt() < 350){
     			player.setHealth(player.getHealth() + 3);
-    		} else if (mcUsers.getProfile(player).getHerbalismInt() >= 350 && mcUsers.getProfile(player).getHerbalismInt() < 450){
+    		} else if (PP.getHerbalismInt() >= 350 && PP.getHerbalismInt() < 450){
     			player.setHealth(player.getHealth() + 4);
-    		} else if (mcUsers.getProfile(player).getHerbalismInt() >= 450 && mcUsers.getProfile(player).getHerbalismInt() < 550){
+    		} else if (PP.getHerbalismInt() >= 450 && PP.getHerbalismInt() < 550){
     			player.setHealth(player.getHealth() + 5);
-    		} else if (mcUsers.getProfile(player).getHerbalismInt() >= 550 && mcUsers.getProfile(player).getHerbalismInt() < 650){
+    		} else if (PP.getHerbalismInt() >= 550 && PP.getHerbalismInt() < 650){
     			player.setHealth(player.getHealth() + 6);
-    		} else if (mcUsers.getProfile(player).getHerbalismInt() >= 650 && mcUsers.getProfile(player).getHerbalismInt() < 750){
+    		} else if (PP.getHerbalismInt() >= 650 && PP.getHerbalismInt() < 750){
     			player.setHealth(player.getHealth() + 7);
-    		} else if (mcUsers.getProfile(player).getHerbalismInt() >= 750){
+    		} else if (PP.getHerbalismInt() >= 750){
     			player.setHealth(player.getHealth() + 8);
     		}
     	}
     }
     public void stewCheck(Player player, ItemStack is){
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
     	if(is.getTypeId() == 282){
-    		if(mcUsers.getProfile(player).getHerbalismInt() >= 50 && mcUsers.getProfile(player).getHerbalismInt() < 150){
+    		if(PP.getHerbalismInt() >= 50 && PP.getHerbalismInt() < 150){
     			player.setHealth(player.getHealth() + 1);
-    		} else if (mcUsers.getProfile(player).getHerbalismInt() >= 150 && mcUsers.getProfile(player).getHerbalismInt() < 250){
+    		} else if (PP.getHerbalismInt() >= 150 && PP.getHerbalismInt() < 250){
     			player.setHealth(player.getHealth() + 2);
-    		} else if (mcUsers.getProfile(player).getHerbalismInt() >= 250 && mcUsers.getProfile(player).getHerbalismInt() < 350){
+    		} else if (PP.getHerbalismInt() >= 250 && PP.getHerbalismInt() < 350){
     			player.setHealth(player.getHealth() + 3);
-    		} else if (mcUsers.getProfile(player).getHerbalismInt() >= 350 && mcUsers.getProfile(player).getHerbalismInt() < 450){
+    		} else if (PP.getHerbalismInt() >= 350 && PP.getHerbalismInt() < 450){
     			player.setHealth(player.getHealth() + 4);
-    		} else if (mcUsers.getProfile(player).getHerbalismInt() >= 450 && mcUsers.getProfile(player).getHerbalismInt() < 550){
+    		} else if (PP.getHerbalismInt() >= 450 && PP.getHerbalismInt() < 550){
     			player.setHealth(player.getHealth() + 5);
-    		} else if (mcUsers.getProfile(player).getHerbalismInt() >= 550 && mcUsers.getProfile(player).getHerbalismInt() < 650){
+    		} else if (PP.getHerbalismInt() >= 550 && PP.getHerbalismInt() < 650){
     			player.setHealth(player.getHealth() + 6);
-    		} else if (mcUsers.getProfile(player).getHerbalismInt() >= 650 && mcUsers.getProfile(player).getHerbalismInt() < 750){
+    		} else if (PP.getHerbalismInt() >= 650 && PP.getHerbalismInt() < 750){
     			player.setHealth(player.getHealth() + 7);
-    		} else if (mcUsers.getProfile(player).getHerbalismInt() >= 750){
+    		} else if (PP.getHerbalismInt() >= 750){
     			player.setHealth(player.getHealth() + 8);
     		}
     	}

+ 19 - 8
mcMMO/com/gmail/nossr50/mcItem.java

@@ -1,10 +1,14 @@
 package com.gmail.nossr50;
 
 import org.bukkit.ChatColor;
+import org.bukkit.Location;
 import org.bukkit.Material;
 import org.bukkit.block.Block;
 import org.bukkit.entity.Player;
 import org.bukkit.inventory.ItemStack;
+import org.bukkit.plugin.Plugin;
+
+import com.gmail.nossr50.PlayerList.PlayerProfile;
 
 
 public class mcItem {
@@ -19,17 +23,18 @@ public class mcItem {
     	}
     	return instance;
     	}
-	public void itemChecks(Player player){
+	public void itemChecks(Player player, Plugin pluginx){
 		ItemStack inhand = player.getItemInHand();
 		if(inhand.getTypeId() == 288){
-			chimaerawing(player);
+			chimaerawing(player, pluginx);
 		}
 	}
-	public void chimaerawing(Player player){
+	public void chimaerawing(Player player, Plugin pluginx){
+		PlayerProfile PP = mcUsers.getProfile(player.getName());
 		ItemStack is = player.getItemInHand();
 		Block block = player.getLocation().getBlock();
 		if(mcPermissions.getInstance().chimaeraWing(player) && is.getTypeId() == 288){
-    		if(mcSkills.getInstance().cooldownOver(player, mcUsers.getProfile(player).getRecentlyHurt(), 60) && is.getAmount() >= mcLoadProperties.feathersConsumedByChimaeraWing){
+    		if(mcSkills.getInstance().cooldownOver(player, PP.getRecentlyHurt(), 60) && is.getAmount() >= mcLoadProperties.feathersConsumedByChimaeraWing){
     			Block derp = player.getLocation().getBlock();
     			int y = derp.getY();
     			ItemStack[] inventory = player.getInventory().getContents();
@@ -59,15 +64,21 @@ public class mcItem {
     					}
     				}
     			}
-    			if(mcUsers.getProfile(player).getMySpawn(player) != null){
-    				player.teleportTo(mcUsers.getProfile(player).getMySpawn(player));
+    			if(PP.getMySpawn(player) != null){
+    				Location mySpawn = PP.getMySpawn(player);
+    				if(mySpawn != null && pluginx.getServer().getWorld(PP.getMySpawnWorld(pluginx)) != null)
+    					mySpawn.setWorld(pluginx.getServer().getWorld(PP.getMySpawnWorld(pluginx)));
+    				if(mySpawn != null){
+	    				player.teleportTo(mySpawn);//Do it twice to prevent weird stuff
+	    				player.teleportTo(mySpawn);
+    				}
     			} else {
     				player.teleportTo(player.getWorld().getSpawnLocation());
     			}
     			player.sendMessage("**CHIMAERA WING**");
-    		} else if (!mcSkills.getInstance().cooldownOver(player, mcUsers.getProfile(player).getRecentlyHurt(), 60) && is.getAmount() >= 10) {
+    		} else if (!mcSkills.getInstance().cooldownOver(player, PP.getRecentlyHurt(), 60) && is.getAmount() >= 10) {
     			player.sendMessage("You were injured recently and must wait to use this."
-    					+ChatColor.YELLOW+" ("+mcSkills.getInstance().calculateTimeLeft(player, mcUsers.getProfile(player).getRecentlyHurt(), 60)+"s)");
+    					+ChatColor.YELLOW+" ("+mcSkills.getInstance().calculateTimeLeft(player, PP.getRecentlyHurt(), 60)+"s)");
     		} else if (is.getTypeId() == 288 && is.getAmount() <= 9){
     			player.sendMessage("You need more of that to use it");
     		}

+ 4 - 2
mcMMO/com/gmail/nossr50/mcLoadProperties.java

@@ -1,9 +1,9 @@
 package com.gmail.nossr50;
 
 public class mcLoadProperties {
-	public static Boolean archeryFireRateLimit, mushrooms, toolsLoseDurabilityFromAbilities, pvpxp, miningrequirespickaxe, woodcuttingrequiresaxe, pvp, eggs, apples, myspawnclearsinventory, cake, music, diamond, glowstone, slowsand, sulphur, netherrack, bones, coal, clay, anvilmessages;
+	public static Boolean cocoabeans, archeryFireRateLimit, mushrooms, toolsLoseDurabilityFromAbilities, pvpxp, miningrequirespickaxe, woodcuttingrequiresaxe, pvp, eggs, apples, myspawnclearsinventory, cake, music, diamond, glowstone, slowsand, sulphur, netherrack, bones, coal, clay, anvilmessages;
 	public static String addxp, mcability, mcmmo, mcc, mcrefresh, mcitem, mcgod, stats, mmoedit, ptp, party, myspawn, setmyspawn, whois, invite, accept, clearmyspawn;
-	public static int xpGainMultiplier, superBreakerCooldown, gigaDrillBreakerCooldown, treeFellerCooldown, berserkCooldown, serratedStrikeCooldown, skullSplitterCooldown, abilityDurabilityLoss, feathersConsumedByChimaeraWing, pvpxprewardmodifier, repairdiamondlevel, globalxpmodifier, miningxpmodifier, repairxpmodifier, woodcuttingxpmodifier, unarmedxpmodifier, herbalismxpmodifier, excavationxpmodifier, archeryxpmodifier, swordsxpmodifier, axesxpmodifier, acrobaticsxpmodifier;
+	public static int xpGainMultiplier, superBreakerCooldown, greenTerraCooldown, gigaDrillBreakerCooldown, treeFellerCooldown, berserkCooldown, serratedStrikeCooldown, skullSplitterCooldown, abilityDurabilityLoss, feathersConsumedByChimaeraWing, pvpxprewardmodifier, repairdiamondlevel, globalxpmodifier, miningxpmodifier, repairxpmodifier, woodcuttingxpmodifier, unarmedxpmodifier, herbalismxpmodifier, excavationxpmodifier, archeryxpmodifier, swordsxpmodifier, axesxpmodifier, acrobaticsxpmodifier;
 	
 	public static void loadMain(){
     	String propertiesFile = mcMMO.maindirectory + "mcmmo.properties";
@@ -13,6 +13,7 @@ public class mcLoadProperties {
     	/*
     	 * COOLDOWN CONTROL
     	 */
+    	greenTerraCooldown = properties.getInteger("greenTerraCooldown", 240);
     	superBreakerCooldown = properties.getInteger("superBreakerCooldown", 240);
     	gigaDrillBreakerCooldown = properties.getInteger("gigaDrillBreakerCooldown", 240);
     	treeFellerCooldown = properties.getInteger("treeFellerCooldown", 240);
@@ -58,6 +59,7 @@ public class mcLoadProperties {
     	/*
     	 * EXCAVATION LOOT TOGGLES
     	 */
+    	cocoabeans = properties.getBoolean("canExcavateCocoaBeans", true);
     	mushrooms = properties.getBoolean("canExcavateMushrooms", true);
     	glowstone = properties.getBoolean("canExcavateGlowstone", true);
     	pvp = properties.getBoolean("pvp", true);

+ 11 - 7
mcMMO/com/gmail/nossr50/mcMMO.java

@@ -1,5 +1,6 @@
 package com.gmail.nossr50;
 
+import com.gmail.nossr50.PlayerList.PlayerProfile;
 import com.nijikokun.bukkit.Permissions.Permissions;
 import com.nijiko.Messaging;
 import com.nijiko.permissions.PermissionHandler;
@@ -67,7 +68,6 @@ public class mcMMO extends JavaPlugin {
          	mcUsers.addUser(player);
         }
         PluginManager pm = getServer().getPluginManager();
-        pm.registerEvent(Event.Type.PLAYER_BED_ENTER, playerListener, Priority.Normal, this);
         pm.registerEvent(Event.Type.PLAYER_JOIN, playerListener, Priority.Normal, this);
         pm.registerEvent(Event.Type.PLAYER_LOGIN, playerListener, Priority.Normal, this);
         pm.registerEvent(Event.Type.BLOCK_DAMAGE, blockListener, Priority.Highest, this);
@@ -105,8 +105,8 @@ public class mcMMO extends JavaPlugin {
     	}
     }
     public boolean inSameParty(Player playera, Player playerb){
-    	if(mcUsers.getProfile(playera).inParty() && mcUsers.getProfile(playerb).inParty()){
-	        if(mcUsers.getProfile(playera).getParty().equals(mcUsers.getProfile(playerb).getParty())){
+    	if(mcUsers.getProfile(playera.getName()).inParty() && mcUsers.getProfile(playerb.getName()).inParty()){
+	        if(mcUsers.getProfile(playera.getName()).getParty().equals(mcUsers.getProfile(playerb.getName()).getParty())){
 	            return true;
 	        } else {
 	            return false;
@@ -116,10 +116,12 @@ public class mcMMO extends JavaPlugin {
     	}
     }
     public void addXp(Player player, String skillname, Integer newvalue){
-    	mcUsers.getProfile(player).addXpToSkill(newvalue, skillname);
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
+    	PP.addXpToSkill(newvalue, skillname);
     }
     public void modifySkill(Player player, String skillname, Integer newvalue){
-    	mcUsers.getProfile(player).modifyskill(newvalue, skillname);
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
+    	PP.modifyskill(newvalue, skillname);
     }
     public ArrayList<String> getParties(){
     	String location = "plugins/mcMMO/mcmmo.users";
@@ -147,10 +149,12 @@ public class mcMMO extends JavaPlugin {
         return parties;
 	}
     public static String getPartyName(Player player){
-    	return mcUsers.getProfile(player).getParty();
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
+    	return PP.getParty();
     }
     public static boolean inParty(Player player){
-    	return mcUsers.getProfile(player).inParty();
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
+    	return PP.inParty();
     }
     public boolean isAdminChatToggled(Player player){
     	if(mcConfig.getInstance().isAdminToggled(player.getName())){

+ 42 - 12
mcMMO/com/gmail/nossr50/mcMining.java

@@ -6,6 +6,9 @@ import org.bukkit.Material;
 import org.bukkit.block.Block;
 import org.bukkit.entity.Player;
 import org.bukkit.inventory.ItemStack;
+import org.bukkit.plugin.Plugin;
+
+import com.gmail.nossr50.PlayerList.PlayerProfile;
 
 
 public class mcMining {
@@ -21,27 +24,32 @@ public class mcMining {
     	return instance;
     	}
 	
-	public void superBreakerCheck(Player player, Block block){
+	public void superBreakerCheck(Player player, Block block, Plugin pluginx){
+		PlayerProfile PP = mcUsers.getProfile(player.getName());
 	    if(mcm.getInstance().isMiningPick(player.getItemInHand())){
 	    	if(block != null){
 		    	if(!mcm.getInstance().abilityBlockCheck(block))
 		    		return;
 	    	}
-	    	if(mcUsers.getProfile(player).getPickaxePreparationMode()){
-    			mcUsers.getProfile(player).setPickaxePreparationMode(false);
+	    	if(PP.getPickaxePreparationMode()){
+    			PP.setPickaxePreparationMode(false);
     		}
 	    	int ticks = 2;
-	    	int x = mcUsers.getProfile(player).getMiningInt();
+	    	int x = PP.getMiningInt();
     		while(x >= 50){
     			x-=50;
     			ticks++;
     		}
     		
-	    	if(!mcUsers.getProfile(player).getSuperBreakerMode() && mcUsers.getProfile(player).getSuperBreakerCooldown() == 0){
+	    	if(!PP.getSuperBreakerMode() && PP.getSuperBreakerCooldown() == 0){
 	    		player.sendMessage(ChatColor.GREEN+"**SUPER BREAKER ACTIVATED**");
-	    		mcUsers.getProfile(player).setSuperBreakerTicks(ticks * 1000);
-	    		mcUsers.getProfile(player).setSuperBreakerActivatedTimeStamp(System.currentTimeMillis());
-	    		mcUsers.getProfile(player).setSuperBreakerMode(true);
+	    		for(Player y : pluginx.getServer().getOnlinePlayers()){
+	    			if(y != null && y != player && mcm.getInstance().getDistance(player.getLocation(), y.getLocation()) < 10)
+	    				y.sendMessage(ChatColor.GREEN+player.getName()+ChatColor.DARK_GREEN+" has used "+ChatColor.RED+"Super Breaker!");
+	    		}
+	    		PP.setSuperBreakerTicks(ticks * 1000);
+	    		PP.setSuperBreakerActivatedTimeStamp(System.currentTimeMillis());
+	    		PP.setSuperBreakerMode(true);
 	    	}
 	    	
 	    }
@@ -93,14 +101,16 @@ public class mcMining {
 		}
     }
     public void blockProcCheck(Block block, Player player){
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
     	if(player != null){
-    		if(Math.random() * 1000 <= mcUsers.getProfile(player).getMiningInt()){
+    		if(Math.random() * 1000 <= PP.getMiningInt()){
     		blockProcSimulate(block);
 			return;
     		}
     	}		
 	}
     public void miningBlockCheck(Player player, Block block){
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
     	if(mcConfig.getInstance().isBlockWatched(block) || block.getData() == (byte) 5)
     		return;
     	int xp = 0;
@@ -108,6 +118,11 @@ public class mcMining {
     		xp += 3;
     		blockProcCheck(block, player);
     	}
+    	//OBSIDIAN
+    	if(block.getTypeId() == 49){
+    		xp += 15;
+    		blockProcCheck(block, player);
+    	}
     	//NETHERRACK
     	if(block.getTypeId() == 87){
     		xp += 3;
@@ -148,7 +163,7 @@ public class mcMining {
     		xp += 40;
     		blockProcCheck(block, player);
     	}
-    	mcUsers.getProfile(player).addMiningGather(xp * mcLoadProperties.xpGainMultiplier);
+    	PP.addMiningGather(xp * mcLoadProperties.xpGainMultiplier);
     	mcSkills.getInstance().XpCheck(player);
     }
     /*
@@ -156,13 +171,14 @@ public class mcMining {
      */
     public Boolean canBeSuperBroken(Block block){
     	int t = block.getTypeId();
-    	if(t == 87 || t == 89 || t == 73 || t == 74 || t == 56 || t == 21 || t == 1 || t == 16 || t == 14 || t == 15){
+    	if(t == 49 || t == 87 || t == 89 || t == 73 || t == 74 || t == 56 || t == 21 || t == 1 || t == 16 || t == 14 || t == 15){
     		return true;
     	} else {
     		return false;
     	}
     }
     public void SuperBreakerBlockCheck(Player player, Block block){
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
     	if(mcLoadProperties.toolsLoseDurabilityFromAbilities)
     		mcm.getInstance().damageTool(player, (short) mcLoadProperties.abilityDurabilityLoss);
     	Location loc = block.getLocation();
@@ -232,6 +248,20 @@ public class mcMining {
 			loc.getWorld().dropItemNaturally(loc, item);
     		block.setType(Material.AIR);
     	}
+    	//OBSIDIAN
+    	if(block.getTypeId() == 49 && mcm.getInstance().getTier(player) >= 4){
+    		if(mcLoadProperties.toolsLoseDurabilityFromAbilities)
+        		mcm.getInstance().damageTool(player, (short) 104);
+    		if(!mcConfig.getInstance().isBlockWatched(block)&& block.getData() != (byte) 5){
+    			xp += 15;
+        		blockProcCheck(block, player);
+        		blockProcCheck(block, player);
+        	}
+    		mat = Material.getMaterial(49);
+			item = new ItemStack(mat, 1, (byte)0, damage);
+			loc.getWorld().dropItemNaturally(loc, item);
+    		block.setType(Material.AIR);
+    	}
     	//DIAMOND
     	if(block.getTypeId() == 56 && mcm.getInstance().getTier(player) >= 3){
     		if(!mcConfig.getInstance().isBlockWatched(block)&& block.getData() != (byte) 5){
@@ -288,7 +318,7 @@ public class mcMining {
     		block.setType(Material.AIR);
     	}
     	if(block.getData() != (byte) 5)
-    		mcUsers.getProfile(player).addMiningGather(xp * mcLoadProperties.xpGainMultiplier);
+    		PP.addMiningGather(xp * mcLoadProperties.xpGainMultiplier);
     	mcSkills.getInstance().XpCheck(player);
     }
 }

+ 5 - 4
mcMMO/com/gmail/nossr50/mcParty.java

@@ -17,12 +17,12 @@ public class mcParty {
     	return instance;
     	}
     public boolean inSameParty(Player playera, Player playerb){
-    	if(mcUsers.getProfile(playera) == null || mcUsers.getProfile(playerb) == null){
+    	if(mcUsers.getProfile(playera.getName()) == null || mcUsers.getProfile(playerb.getName()) == null){
     		mcUsers.addUser(playera);
     		mcUsers.addUser(playerb);
     	}
-    	if(mcUsers.getProfile(playera).inParty() && mcUsers.getProfile(playerb).inParty()){
-	        if(mcUsers.getProfile(playera).getParty().equals(mcUsers.getProfile(playerb).getParty())){
+    	if(mcUsers.getProfile(playera.getName()).inParty() && mcUsers.getProfile(playerb.getName()).inParty()){
+	        if(mcUsers.getProfile(playera.getName()).getParty().equals(mcUsers.getProfile(playerb.getName()).getParty())){
 	            return true;
 	        } else {
 	            return false;
@@ -31,11 +31,12 @@ public class mcParty {
     		return false;
     	}
     }
+    
 	public int partyCount(Player player, Player[] players){
         int x = 0;
         for(Player hurrdurr : players){
         	if(player != null && hurrdurr != null){
-        	if(mcUsers.getProfile(player).getParty().equals(mcUsers.getProfile(hurrdurr).getParty()))
+        	if(mcUsers.getProfile(player.getName()).getParty().equals(mcUsers.getProfile(hurrdurr.getName()).getParty()))
         	x++;
         	}
         }

+ 7 - 7
mcMMO/com/gmail/nossr50/mcPermissions.java

@@ -44,6 +44,13 @@ public class mcPermissions {
             return true;
         }
     }
+    public boolean herbalismAbility(Player player){
+    	if (permissionsEnabled) {
+            return permission(player, "mcmmo.ability.herbalism");
+        } else {
+            return true;
+        }
+    }
     public boolean excavationAbility(Player player){
     	if (permissionsEnabled) {
             return permission(player, "mcmmo.ability.excavation");
@@ -135,13 +142,6 @@ public class mcPermissions {
             return true;
         }
     }
-    public boolean setMySpawnOther(Player player) {
-        if (permissionsEnabled) {
-            return permission(player, "mcmmo.commands.setmyspawnother");
-        } else {
-            return true;
-        }
-    }
     public boolean partyChat(Player player) {
         if (permissionsEnabled) {
             return permission(player, "mcmmo.chat.partychat");

+ 201 - 134
mcMMO/com/gmail/nossr50/mcPlayerListener.java

@@ -9,10 +9,8 @@ import org.bukkit.Material;
 import org.bukkit.block.Block;
 import org.bukkit.entity.Player;
 import org.bukkit.event.block.Action;
-import org.bukkit.event.player.PlayerBedEnterEvent;
 import org.bukkit.event.player.PlayerChatEvent;
 import org.bukkit.event.player.PlayerCommandPreprocessEvent;
-import org.bukkit.event.player.PlayerEvent;
 import org.bukkit.event.player.PlayerInteractEvent;
 import org.bukkit.event.player.PlayerJoinEvent;
 import org.bukkit.event.player.PlayerListener;
@@ -20,6 +18,8 @@ import org.bukkit.event.player.PlayerLoginEvent;
 import org.bukkit.event.player.PlayerRespawnEvent;
 import org.bukkit.inventory.ItemStack;
 
+import com.gmail.nossr50.PlayerList.PlayerProfile;
+
 
 public class mcPlayerListener extends PlayerListener {
 	protected static final Logger log = Logger.getLogger("Minecraft");
@@ -31,10 +31,11 @@ public class mcPlayerListener extends PlayerListener {
     }
     public void onPlayerRespawn(PlayerRespawnEvent event) {
     	Player player = event.getPlayer();
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
     	if(player != null){
-			Location mySpawn = mcUsers.getProfile(player).getMySpawn(player);
-			if(mySpawn != null && plugin.getServer().getWorld(mcUsers.getProfile(player).getMySpawnWorld(plugin)) != null)
-				mySpawn.setWorld(plugin.getServer().getWorld(mcUsers.getProfile(player).getMySpawnWorld(plugin)));
+			Location mySpawn = PP.getMySpawn(player);
+			if(mySpawn != null && plugin.getServer().getWorld(PP.getMySpawnWorld(plugin)) != null)
+				mySpawn.setWorld(plugin.getServer().getWorld(PP.getMySpawnWorld(plugin)));
 			if(mcPermissions.getInstance().mySpawn(player) && mySpawn != null){
 		    	event.setRespawnLocation(mySpawn);
 			}
@@ -66,16 +67,18 @@ public class mcPlayerListener extends PlayerListener {
     public void onPlayerJoin(PlayerJoinEvent event) {
     	Player player = event.getPlayer();
     	if(mcPermissions.getInstance().motd(player)){
-    		player.sendMessage(ChatColor.BLUE + "This server is running mcMMO "+plugin.getDescription().getVersion()+" type /"+ChatColor.YELLOW+mcLoadProperties.mcmmo+ChatColor.BLUE+ " for help.");
+    		player.sendMessage(ChatColor.BLUE +"This server is running mcMMO "+plugin.getDescription().getVersion()+" type /"+ChatColor.YELLOW+mcLoadProperties.mcmmo+ChatColor.BLUE+ " for help.");
+    		player.sendMessage(ChatColor.GREEN+"http://mcmmo.wikia.com"+ChatColor.BLUE+" - mcMMO Wiki");
     	}
     }
     public void onPlayerInteract(PlayerInteractEvent event) {
     	Player player = event.getPlayer();
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
     	Action action = event.getAction();
     	Block block = event.getClickedBlock();
     	//Archery Nerf
     	if(player.getItemInHand().getTypeId() == 261 && mcLoadProperties.archeryFireRateLimit){
-    		if(System.currentTimeMillis() < mcUsers.getProfile(player).getArcheryShotATS() + 1000){
+    		if(System.currentTimeMillis() < PP.getArcheryShotATS() + 1000){
     			/*
     			if(mcm.getInstance().hasArrows(player))
     				mcm.getInstance().addArrows(player);
@@ -83,7 +86,7 @@ public class mcPlayerListener extends PlayerListener {
     			player.updateInventory();
     			event.setCancelled(true);
     		} else {
-    			mcUsers.getProfile(player).setArcheryShotATS(System.currentTimeMillis());
+    			PP.setArcheryShotATS(System.currentTimeMillis());
     		}
     	}
     	/*
@@ -91,15 +94,45 @@ public class mcPlayerListener extends PlayerListener {
     	 */
     	if(action == Action.RIGHT_CLICK_BLOCK){
     		ItemStack is = player.getItemInHand();
+    		if(block != null && player != null){
+    			if(block.getTypeId() == 26 && mcPermissions.getInstance().setMySpawn(player)){
+    		    	Location loc = player.getLocation();
+    		    	if(mcPermissions.getInstance().setMySpawn(player)){
+    		    		PP.setMySpawn(loc.getX(), loc.getY(), loc.getZ(), loc.getWorld().getName());
+    		    	}
+    		    	player.sendMessage(ChatColor.DARK_AQUA + "Myspawn has been set to your current location.");
+    			}
+    		}
         	if(block != null && player != null && mcPermissions.getInstance().repair(player) && event.getClickedBlock().getTypeId() == 42){
             	mcRepair.getInstance().repairCheck(player, is, event.getClickedBlock());
             }
+        	
         	if(mcm.getInstance().abilityBlockCheck(block))
 	    	{
+        		if(block != null && mcm.getInstance().isHoe(player.getItemInHand()) && block.getTypeId() != 3){
+        			mcSkills.getInstance().hoeReadinessCheck(player);
+        		}
 	    		mcSkills.getInstance().abilityActivationCheck(player);
 	    	}
+        	
+        	//GREEN THUMB
+        	if(block != null && block.getType() == Material.COBBLESTONE && player.getItemInHand().getType() == Material.SEEDS){
+        		boolean pass = false;
+        		if(mcHerbalism.getInstance().hasSeeds(player)){
+        			mcHerbalism.getInstance().removeSeeds(player);
+	        		if(Math.random() * 1500 <= PP.getHerbalismInt()){
+	        			player.sendMessage(ChatColor.GREEN+"**GREEN THUMB**");
+	        			block.setType(Material.MOSSY_COBBLESTONE);
+	        			pass = true;
+	        		}
+	        		if(pass == false)
+	        			player.sendMessage(ChatColor.RED+"**GREEN THUMB FAIL**");
+	        		}
+        		return;
+        	}
     	}
     	if(action == Action.RIGHT_CLICK_AIR){
+    		mcSkills.getInstance().hoeReadinessCheck(player);
 		    mcSkills.getInstance().abilityActivationCheck(player);
 		    
 		    /*
@@ -114,36 +147,39 @@ public class mcPlayerListener extends PlayerListener {
     	 * ITEM CHECKS
     	 */
     	if(action == Action.RIGHT_CLICK_AIR)
-        	mcItem.getInstance().itemChecks(player);
+        	mcItem.getInstance().itemChecks(player, plugin);
     	if(action == Action.RIGHT_CLICK_BLOCK){
     		if(mcm.getInstance().abilityBlockCheck(event.getClickedBlock()))
-    			mcItem.getInstance().itemChecks(player);
-    	}
-    }
-    public void onPlayerBedEnter(PlayerBedEnterEvent event) {
-    	Player player = event.getPlayer();
-    	Location loc = player.getLocation();
-    	if(mcPermissions.getInstance().setMySpawn(player)){
-    		mcUsers.getProfile(player).setMySpawn(loc.getX(), loc.getY(), loc.getZ(), loc.getWorld().getName());
+    			mcItem.getInstance().itemChecks(player, plugin);
     	}
-    	player.sendMessage(ChatColor.DARK_AQUA + "Myspawn has been set to your current location.");
     }
     public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) {
     	Player player = event.getPlayer();
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
     	String[] split = event.getMessage().split(" ");
     	String playerName = player.getName();
     	//Check if the command is an mcMMO related help command
     	mcm.getInstance().mcmmoHelpCheck(split, player, event);
     	if(mcPermissions.permissionsEnabled && split[0].equalsIgnoreCase("/"+mcLoadProperties.mcability)){
     		event.setCancelled(true);
-    		if(mcUsers.getProfile(player).getAbilityUse()){
+    		if(PP.getAbilityUse()){
     			player.sendMessage("Ability use toggled off");
-    			mcUsers.getProfile(player).toggleAbilityUse();
+    			PP.toggleAbilityUse();
     		} else {
     			player.sendMessage("Ability use toggled on");
-    			mcUsers.getProfile(player).toggleAbilityUse();
+    			PP.toggleAbilityUse();
     		}
     	}
+    	/*
+    	if(split[0].equalsIgnoreCase("/mutechat")){
+    		event.setCancelled(true);
+    		if(PP.getPartyChatOnlyToggle() == true)
+    			player.sendMessage("Party Chat Only "+ChatColor.RED+"Off");
+    		if(PP.getPartyChatOnlyToggle() == false)
+    			player.sendMessage("Party Chat Only "+ChatColor.RED+"On");
+    		PP.togglePartyChatOnly();
+    	}
+    	*/
 		if(mcPermissions.getInstance().mcAbility(player) && split[0].equalsIgnoreCase("/"+mcLoadProperties.mcrefresh)){
 			event.setCancelled(true);
     		if(!mcPermissions.getInstance().mcrefresh(player)){
@@ -157,35 +193,43 @@ public class mcPlayerListener extends PlayerListener {
 			/*
 			 * PREP MODES
 			 */
-    		mcUsers.getProfile(player).setAxePreparationMode(false);
-    		mcUsers.getProfile(player).setFistsPreparationMode(false);
-    		mcUsers.getProfile(player).setSwordsPreparationMode(false);
-    		mcUsers.getProfile(player).setPickaxePreparationMode(false);
+    		PP.setRecentlyHurt((long) 0);
+    		PP.setHoePreparationMode(false);
+    		PP.setAxePreparationMode(false);
+    		PP.setFistsPreparationMode(false);
+    		PP.setSwordsPreparationMode(false);
+    		PP.setPickaxePreparationMode(false);
+    		/*
+    		 * GREEN TERRA
+    		 */
+    		PP.setGreenTerraMode(false);
+    		PP.setGreenTerraDeactivatedTimeStamp((long) 0);
+    		
     		/*
     		 * GIGA DRILL BREAKER
     		 */
-    		mcUsers.getProfile(player).setGigaDrillBreakerMode(false);
-    		mcUsers.getProfile(player).setGigaDrillBreakerDeactivatedTimeStamp((long) 0);
+    		PP.setGigaDrillBreakerMode(false);
+    		PP.setGigaDrillBreakerDeactivatedTimeStamp((long) 0);
     		/*
     		 * SERRATED STRIKE
     		 */
-    		mcUsers.getProfile(player).setSerratedStrikesMode(false);
-    		mcUsers.getProfile(player).setSerratedStrikesDeactivatedTimeStamp((long) 0);
+    		PP.setSerratedStrikesMode(false);
+    		PP.setSerratedStrikesDeactivatedTimeStamp((long) 0);
     		/*
     		 * SUPER BREAKER
     		 */
-    		mcUsers.getProfile(player).setSuperBreakerMode(false);
-    		mcUsers.getProfile(player).setSuperBreakerDeactivatedTimeStamp((long) 0);
+    		PP.setSuperBreakerMode(false);
+    		PP.setSuperBreakerDeactivatedTimeStamp((long) 0);
     		/*
     		 * TREE FELLER
     		 */
-    		mcUsers.getProfile(player).setTreeFellerMode(false);
-    		mcUsers.getProfile(player).setTreeFellerDeactivatedTimeStamp((long) 0);
+    		PP.setTreeFellerMode(false);
+    		PP.setTreeFellerDeactivatedTimeStamp((long) 0);
     		/*
     		 * BERSERK
     		 */
-    		mcUsers.getProfile(player).setBerserkMode(false);
-    		mcUsers.getProfile(player).setBerserkDeactivatedTimeStamp((long)0);
+    		PP.setBerserkMode(false);
+    		PP.setBerserkDeactivatedTimeStamp((long)0);
     		
     		player.sendMessage(ChatColor.GREEN+"**ABILITIES REFRESHED!**");
     	}
@@ -215,7 +259,7 @@ public class mcPlayerListener extends PlayerListener {
     		double y = plugin.getServer().getWorlds().get(0).getSpawnLocation().getY();
     		double z = plugin.getServer().getWorlds().get(0).getSpawnLocation().getZ();
     		String worldname = plugin.getServer().getWorlds().get(0).getName();
-    		mcUsers.getProfile(player).setMySpawn(x, y, z, worldname);
+    		PP.setMySpawn(x, y, z, worldname);
     		player.sendMessage(ChatColor.DARK_AQUA+"Myspawn is now cleared.");
     	}
     	if(mcPermissions.permissionsEnabled && split[0].equalsIgnoreCase("/"+mcLoadProperties.mmoedit)){
@@ -231,14 +275,14 @@ public class mcPlayerListener extends PlayerListener {
     		if(split.length == 4){
     			if(isPlayer(split[1]) && mcm.getInstance().isInt(split[3]) && mcSkills.getInstance().isSkill(split[2])){
     				int newvalue = Integer.valueOf(split[3]);
-    				mcUsers.getProfile(getPlayer(split[1])).modifyskill(newvalue, split[2]);
+    				mcUsers.getProfile(getPlayer(split[1]).getName()).modifyskill(newvalue, split[2]);
     				player.sendMessage(ChatColor.RED+split[2]+" has been modified.");
     			}
     		}
     		else if(split.length == 3){
     			if(mcm.getInstance().isInt(split[2]) && mcSkills.getInstance().isSkill(split[1])){
     				int newvalue = Integer.valueOf(split[2]);
-    				mcUsers.getProfile(player).modifyskill(newvalue, split[1]);
+    				PP.modifyskill(newvalue, split[1]);
     				player.sendMessage(ChatColor.RED+split[1]+" has been modified.");
     			}
     		} else {
@@ -261,7 +305,7 @@ public class mcPlayerListener extends PlayerListener {
     		if(split.length == 4){
     			if(isPlayer(split[1]) && mcm.getInstance().isInt(split[3]) && mcSkills.getInstance().isSkill(split[2])){
     				int newvalue = Integer.valueOf(split[3]);
-    				mcUsers.getProfile(getPlayer(split[1])).addXpToSkill(newvalue, split[2]);
+    				mcUsers.getProfile(getPlayer(split[1]).getName()).addXpToSkill(newvalue, split[2]);
     				getPlayer(split[1]).sendMessage(ChatColor.GREEN+"Experience granted!");
     				player.sendMessage(ChatColor.RED+split[2]+" has been modified.");
     			}
@@ -269,7 +313,7 @@ public class mcPlayerListener extends PlayerListener {
     		else if(split.length == 3){
     			if(mcm.getInstance().isInt(split[2]) && mcSkills.getInstance().isSkill(split[1])){
     				int newvalue = Integer.valueOf(split[2]);
-    				mcUsers.getProfile(player).addXpToSkill(newvalue, split[1]);
+    				PP.addXpToSkill(newvalue, split[1]);
     				player.sendMessage(ChatColor.RED+split[1]+" has been modified.");
     			}
     		} else {
@@ -277,7 +321,7 @@ public class mcPlayerListener extends PlayerListener {
     		}
     	}
     	
-    	if(mcUsers.getProfile(player).inParty() && split[0].equalsIgnoreCase("/"+mcLoadProperties.ptp)){
+    	if(PP.inParty() && split[0].equalsIgnoreCase("/"+mcLoadProperties.ptp)){
     		event.setCancelled(true);
     		if(!mcPermissions.getInstance().partyTeleport(player)){
     			player.sendMessage(ChatColor.YELLOW+"[mcMMO]"+ChatColor.DARK_RED +" Insufficient permissions.");
@@ -292,7 +336,8 @@ public class mcPlayerListener extends PlayerListener {
     		}
     		if(isPlayer(split[1])){
         	Player target = getPlayer(split[1]);
-        	if(mcUsers.getProfile(player).getParty().equals(mcUsers.getProfile(target).getParty())){
+        	PlayerProfile PPt = mcUsers.getProfile(target.getName());
+        	if(PP.getParty().equals(PPt.getParty())){
         	player.teleportTo(target);
         	player.sendMessage(ChatColor.GREEN+"You have teleported to "+target.getName());
         	target.sendMessage(ChatColor.GREEN+player.getName() + " has teleported to you.");
@@ -311,58 +356,59 @@ public class mcPlayerListener extends PlayerListener {
     		//if split[1] is a player
     		if(isPlayer(split[1])){
     		Player target = getPlayer(split[1]);
+    		PlayerProfile PPt = mcUsers.getProfile(target.getName());
     		double x,y,z;
     		x = target.getLocation().getX();
     		y = target.getLocation().getY();
     		z = target.getLocation().getZ();
     		player.sendMessage(ChatColor.GREEN + "~~WHOIS RESULTS~~");
     		player.sendMessage(target.getName());
-    		if(mcUsers.getProfile(target).inParty())
-    		player.sendMessage("Party: "+mcUsers.getProfile(target).getParty());
+    		if(PPt.inParty())
+    		player.sendMessage("Party: "+PPt.getParty());
     		player.sendMessage("Health: "+target.getHealth()+ChatColor.GRAY+" (20 is full health)");
     		player.sendMessage("OP: " + target.isOp());
     		player.sendMessage(ChatColor.GREEN+"mcMMO Stats for "+ChatColor.YELLOW+target.getName());
     		if(mcPermissions.getInstance().mining(target))
-    		player.sendMessage(ChatColor.YELLOW + "Mining Skill: " + ChatColor.GREEN + mcUsers.getProfile(target).getMining()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(target).getMiningGather()
-    				+"/"+mcUsers.getProfile(target).getXpToLevel("mining")+")");
+    		player.sendMessage(ChatColor.YELLOW + "Mining Skill: " + ChatColor.GREEN + PPt.getMining()+ChatColor.DARK_AQUA 
+    				+ " XP("+PPt.getMiningGather()
+    				+"/"+PPt.getXpToLevel("mining")+")");
     		if(mcPermissions.getInstance().repair(target))
-    		player.sendMessage(ChatColor.YELLOW + "Repair Skill: "+ ChatColor.GREEN + mcUsers.getProfile(target).getRepair()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(target).getRepairGather()
-    				+"/"+mcUsers.getProfile(target).getXpToLevel("repair")+")");
+    		player.sendMessage(ChatColor.YELLOW + "Repair Skill: "+ ChatColor.GREEN + PPt.getRepair()+ChatColor.DARK_AQUA 
+    				+ " XP("+PPt.getRepairGather()
+    				+"/"+PPt.getXpToLevel("repair")+")");
     		if(mcPermissions.getInstance().woodcutting(target))
-    		player.sendMessage(ChatColor.YELLOW + "Woodcutting Skill: "+ ChatColor.GREEN + mcUsers.getProfile(target).getWoodCutting()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(target).getWoodCuttingGather()
-    				+"/"+mcUsers.getProfile(target).getXpToLevel("woodcutting")+")");
+    		player.sendMessage(ChatColor.YELLOW + "Woodcutting Skill: "+ ChatColor.GREEN + PPt.getWoodCutting()+ChatColor.DARK_AQUA 
+    				+ " XP("+PPt.getWoodCuttingGather()
+    				+"/"+PPt.getXpToLevel("woodcutting")+")");
     		if(mcPermissions.getInstance().unarmed(target))
-    		player.sendMessage(ChatColor.YELLOW + "Unarmed Skill: " + ChatColor.GREEN + mcUsers.getProfile(target).getUnarmed()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(target).getUnarmedGather()
-    				+"/"+mcUsers.getProfile(target).getXpToLevel("unarmed")+")");
+    		player.sendMessage(ChatColor.YELLOW + "Unarmed Skill: " + ChatColor.GREEN + PPt.getUnarmed()+ChatColor.DARK_AQUA 
+    				+ " XP("+PPt.getUnarmedGather()
+    				+"/"+PPt.getXpToLevel("unarmed")+")");
     		if(mcPermissions.getInstance().herbalism(target))
-    		player.sendMessage(ChatColor.YELLOW + "Herbalism Skill: "+ ChatColor.GREEN +  mcUsers.getProfile(target).getHerbalism()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(target).getHerbalismGather()
-    				+"/"+mcUsers.getProfile(target).getXpToLevel("herbalism")+")");
+    		player.sendMessage(ChatColor.YELLOW + "Herbalism Skill: "+ ChatColor.GREEN +  PPt.getHerbalism()+ChatColor.DARK_AQUA 
+    				+ " XP("+PPt.getHerbalismGather()
+    				+"/"+PPt.getXpToLevel("herbalism")+")");
     		if(mcPermissions.getInstance().excavation(target))
-    		player.sendMessage(ChatColor.YELLOW + "Excavation Skill: "+ ChatColor.GREEN +  mcUsers.getProfile(target).getExcavation()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(target).getExcavationGather()
-    				+"/"+mcUsers.getProfile(target).getXpToLevel("excavation")+")");
+    		player.sendMessage(ChatColor.YELLOW + "Excavation Skill: "+ ChatColor.GREEN +  PPt.getExcavation()+ChatColor.DARK_AQUA 
+    				+ " XP("+PPt.getExcavationGather()
+    				+"/"+PPt.getXpToLevel("excavation")+")");
     		if(mcPermissions.getInstance().archery(target))
-    		player.sendMessage(ChatColor.YELLOW + "Archery Skill: " + ChatColor.GREEN + mcUsers.getProfile(target).getArchery()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(target).getArcheryGather()
-    				+"/"+mcUsers.getProfile(target).getXpToLevel("archery")+")");
+    		player.sendMessage(ChatColor.YELLOW + "Archery Skill: " + ChatColor.GREEN + PPt.getArchery()+ChatColor.DARK_AQUA 
+    				+ " XP("+PPt.getArcheryGather()
+    				+"/"+PPt.getXpToLevel("archery")+")");
     		if(mcPermissions.getInstance().swords(target))
-    		player.sendMessage(ChatColor.YELLOW + "Swords Skill: " + ChatColor.GREEN + mcUsers.getProfile(target).getSwords()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(target).getSwordsGather()
-    				+"/"+mcUsers.getProfile(target).getXpToLevel("swords")+")");
+    		player.sendMessage(ChatColor.YELLOW + "Swords Skill: " + ChatColor.GREEN + PPt.getSwords()+ChatColor.DARK_AQUA 
+    				+ " XP("+PPt.getSwordsGather()
+    				+"/"+PPt.getXpToLevel("swords")+")");
     		if(mcPermissions.getInstance().axes(target))
-    		player.sendMessage(ChatColor.YELLOW + "Axes Skill: " + ChatColor.GREEN + mcUsers.getProfile(target).getAxes()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(target).getAxesGather()
-    				+"/"+mcUsers.getProfile(target).getXpToLevel("axes")+")");
+    		player.sendMessage(ChatColor.YELLOW + "Axes Skill: " + ChatColor.GREEN + PPt.getAxes()+ChatColor.DARK_AQUA 
+    				+ " XP("+PPt.getAxesGather()
+    				+"/"+PPt.getXpToLevel("axes")+")");
     		if(mcPermissions.getInstance().acrobatics(target))
-    		player.sendMessage(ChatColor.YELLOW + "Acrobatics Skill: " + ChatColor.GREEN + mcUsers.getProfile(target).getAcrobatics()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(target).getAcrobaticsGather()
-    				+"/"+mcUsers.getProfile(target).getXpToLevel("acrobatics")+")");
-    		player.sendMessage(ChatColor.DARK_RED+"POWER LEVEL: "+ChatColor.GREEN+(mcUsers.getProfile(target).getPowerLevel()));
+    		player.sendMessage(ChatColor.YELLOW + "Acrobatics Skill: " + ChatColor.GREEN + PPt.getAcrobatics()+ChatColor.DARK_AQUA 
+    				+ " XP("+PPt.getAcrobaticsGather()
+    				+"/"+PPt.getXpToLevel("acrobatics")+")");
+    		player.sendMessage(ChatColor.DARK_RED+"POWER LEVEL: "+ChatColor.GREEN+(mcm.getInstance().getPowerLevel(target)));
     		player.sendMessage(ChatColor.GREEN+"~~COORDINATES~~");
     		player.sendMessage("X: "+x);
     		player.sendMessage("Y: "+y);
@@ -378,51 +424,51 @@ public class mcPlayerListener extends PlayerListener {
     		if(mcPermissions.getInstance().permissionsEnabled)
     			player.sendMessage(ChatColor.DARK_GRAY+"If you don't have access to a skill it will not be shown here.");
     		if(mcPermissions.getInstance().mining(player))
-    		player.sendMessage(ChatColor.YELLOW + "Mining Skill: " + ChatColor.GREEN + mcUsers.getProfile(player).getMining()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(player).getMiningGather()
-    				+"/"+mcUsers.getProfile(player).getXpToLevel("mining")+")");
+    		player.sendMessage(ChatColor.YELLOW + "Mining Skill: " + ChatColor.GREEN + PP.getMining()+ChatColor.DARK_AQUA 
+    				+ " XP("+PP.getMiningGather()
+    				+"/"+PP.getXpToLevel("mining")+")");
     		if(mcPermissions.getInstance().repair(player))
-    		player.sendMessage(ChatColor.YELLOW + "Repair Skill: "+ ChatColor.GREEN + mcUsers.getProfile(player).getRepair()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(player).getRepairGather()
-    				+"/"+mcUsers.getProfile(player).getXpToLevel("repair")+")");
+    		player.sendMessage(ChatColor.YELLOW + "Repair Skill: "+ ChatColor.GREEN + PP.getRepair()+ChatColor.DARK_AQUA 
+    				+ " XP("+PP.getRepairGather()
+    				+"/"+PP.getXpToLevel("repair")+")");
     		if(mcPermissions.getInstance().woodcutting(player))
-    		player.sendMessage(ChatColor.YELLOW + "Woodcutting Skill: "+ ChatColor.GREEN + mcUsers.getProfile(player).getWoodCutting()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(player).getWoodCuttingGather()
-    				+"/"+mcUsers.getProfile(player).getXpToLevel("woodcutting")+")");
+    		player.sendMessage(ChatColor.YELLOW + "Woodcutting Skill: "+ ChatColor.GREEN + PP.getWoodCutting()+ChatColor.DARK_AQUA 
+    				+ " XP("+PP.getWoodCuttingGather()
+    				+"/"+PP.getXpToLevel("woodcutting")+")");
     		if(mcPermissions.getInstance().unarmed(player))
-    		player.sendMessage(ChatColor.YELLOW + "Unarmed Skill: " + ChatColor.GREEN + mcUsers.getProfile(player).getUnarmed()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(player).getUnarmedGather()
-    				+"/"+mcUsers.getProfile(player).getXpToLevel("unarmed")+")");
+    		player.sendMessage(ChatColor.YELLOW + "Unarmed Skill: " + ChatColor.GREEN + PP.getUnarmed()+ChatColor.DARK_AQUA 
+    				+ " XP("+PP.getUnarmedGather()
+    				+"/"+PP.getXpToLevel("unarmed")+")");
     		if(mcPermissions.getInstance().herbalism(player))
-    		player.sendMessage(ChatColor.YELLOW + "Herbalism Skill: "+ ChatColor.GREEN +  mcUsers.getProfile(player).getHerbalism()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(player).getHerbalismGather()
-    				+"/"+mcUsers.getProfile(player).getXpToLevel("herbalism")+")");
+    		player.sendMessage(ChatColor.YELLOW + "Herbalism Skill: "+ ChatColor.GREEN +  PP.getHerbalism()+ChatColor.DARK_AQUA 
+    				+ " XP("+PP.getHerbalismGather()
+    				+"/"+PP.getXpToLevel("herbalism")+")");
     		if(mcPermissions.getInstance().excavation(player))
-    		player.sendMessage(ChatColor.YELLOW + "Excavation Skill: "+ ChatColor.GREEN +  mcUsers.getProfile(player).getExcavation()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(player).getExcavationGather()
-    				+"/"+mcUsers.getProfile(player).getXpToLevel("excavation")+")");
+    		player.sendMessage(ChatColor.YELLOW + "Excavation Skill: "+ ChatColor.GREEN +  PP.getExcavation()+ChatColor.DARK_AQUA 
+    				+ " XP("+PP.getExcavationGather()
+    				+"/"+PP.getXpToLevel("excavation")+")");
     		if(mcPermissions.getInstance().archery(player))
-    		player.sendMessage(ChatColor.YELLOW + "Archery Skill: " + ChatColor.GREEN + mcUsers.getProfile(player).getArchery()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(player).getArcheryGather()
-    				+"/"+mcUsers.getProfile(player).getXpToLevel("archery")+")");
+    		player.sendMessage(ChatColor.YELLOW + "Archery Skill: " + ChatColor.GREEN + PP.getArchery()+ChatColor.DARK_AQUA 
+    				+ " XP("+PP.getArcheryGather()
+    				+"/"+PP.getXpToLevel("archery")+")");
     		if(mcPermissions.getInstance().swords(player))
-    		player.sendMessage(ChatColor.YELLOW + "Swords Skill: " + ChatColor.GREEN + mcUsers.getProfile(player).getSwords()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(player).getSwordsGather()
-    				+"/"+mcUsers.getProfile(player).getXpToLevel("swords")+")");
+    		player.sendMessage(ChatColor.YELLOW + "Swords Skill: " + ChatColor.GREEN + PP.getSwords()+ChatColor.DARK_AQUA 
+    				+ " XP("+PP.getSwordsGather()
+    				+"/"+PP.getXpToLevel("swords")+")");
     		if(mcPermissions.getInstance().axes(player))
-    		player.sendMessage(ChatColor.YELLOW + "Axes Skill: " + ChatColor.GREEN + mcUsers.getProfile(player).getAxes()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(player).getAxesGather()
-    				+"/"+mcUsers.getProfile(player).getXpToLevel("axes")+")");
+    		player.sendMessage(ChatColor.YELLOW + "Axes Skill: " + ChatColor.GREEN + PP.getAxes()+ChatColor.DARK_AQUA 
+    				+ " XP("+PP.getAxesGather()
+    				+"/"+PP.getXpToLevel("axes")+")");
     		if(mcPermissions.getInstance().acrobatics(player))
-    		player.sendMessage(ChatColor.YELLOW + "Acrobatics Skill: " + ChatColor.GREEN + mcUsers.getProfile(player).getAcrobatics()+ChatColor.DARK_AQUA 
-    				+ " XP("+mcUsers.getProfile(player).getAcrobaticsGather()
-    				+"/"+mcUsers.getProfile(player).getXpToLevel("acrobatics")+")");
-    		player.sendMessage(ChatColor.DARK_RED+"POWER LEVEL: "+ChatColor.GREEN+(mcUsers.getProfile(player).getPowerLevel()));
+    		player.sendMessage(ChatColor.YELLOW + "Acrobatics Skill: " + ChatColor.GREEN + PP.getAcrobatics()+ChatColor.DARK_AQUA 
+    				+ " XP("+PP.getAcrobaticsGather()
+    				+"/"+PP.getXpToLevel("acrobatics")+")");
+    		player.sendMessage(ChatColor.DARK_RED+"POWER LEVEL: "+ChatColor.GREEN+(mcm.getInstance().getPowerLevel(player)));
     	}
     	//Invite Command
     	if(mcPermissions.getInstance().party(player) && split[0].equalsIgnoreCase("/"+mcLoadProperties.invite)){
     		event.setCancelled(true);
-    		if(!mcUsers.getProfile(player).inParty()){
+    		if(!PP.inParty()){
     			player.sendMessage(ChatColor.RED+"You are not in a party.");
     			return;
     		}
@@ -430,24 +476,25 @@ public class mcPlayerListener extends PlayerListener {
     			player.sendMessage(ChatColor.RED+"Usage is /"+mcLoadProperties.invite+" <playername>");
     			return;
     		}
-    		if(mcUsers.getProfile(player).inParty() && split.length >= 2 && isPlayer(split[1])){
+    		if(PP.inParty() && split.length >= 2 && isPlayer(split[1])){
     			Player target = getPlayer(split[1]);
-    			mcUsers.getProfile(target).modifyInvite(mcUsers.getProfile(player).getParty());
+    			PlayerProfile PPt = mcUsers.getProfile(target.getName());
+    			PPt.modifyInvite(PP.getParty());
     			player.sendMessage(ChatColor.GREEN+"Invite sent successfully");
-    			target.sendMessage(ChatColor.RED+"ALERT: "+ChatColor.GREEN+"You have received a party invite for "+mcUsers.getProfile(target).getInvite()+" from "+player.getName());
+    			target.sendMessage(ChatColor.RED+"ALERT: "+ChatColor.GREEN+"You have received a party invite for "+PPt.getInvite()+" from "+player.getName());
     			target.sendMessage(ChatColor.YELLOW+"Type "+ChatColor.GREEN+"/"+mcLoadProperties.accept+ChatColor.YELLOW+" to accept the invite");
     		}
     	}
     	//Accept invite
     	if(mcPermissions.getInstance().party(player) && split[0].equalsIgnoreCase("/"+mcLoadProperties.accept)){
     		event.setCancelled(true);
-    		if(mcUsers.getProfile(player).hasPartyInvite()){
-    			if(mcUsers.getProfile(player).inParty()){
+    		if(PP.hasPartyInvite()){
+    			if(PP.inParty()){
     				mcParty.getInstance().informPartyMembersQuit(player, getPlayersOnline());
     			}
-    			mcUsers.getProfile(player).acceptInvite();
+    			PP.acceptInvite();
     			mcParty.getInstance().informPartyMembers(player, getPlayersOnline());
-    			player.sendMessage(ChatColor.GREEN+"Invite accepted. You have joined party ("+mcUsers.getProfile(player).getParty()+")");
+    			player.sendMessage(ChatColor.GREEN+"Invite accepted. You have joined party ("+PP.getParty()+")");
     		} else {
     			player.sendMessage(ChatColor.RED+"You have no invites at this time");
     		}
@@ -459,16 +506,16 @@ public class mcPlayerListener extends PlayerListener {
     			player.sendMessage(ChatColor.YELLOW+"[mcMMO]"+ChatColor.DARK_RED +" Insufficient permissions.");
     			return;
     		}
-    		if(split.length == 1 && !mcUsers.getProfile(player).inParty()){
+    		if(split.length == 1 && !PP.inParty()){
     			player.sendMessage("Proper usage is "+"/"+mcLoadProperties.party+" <name> or 'q' to quit");
     			return;
     		}
-    		if(split.length == 1 && mcUsers.getProfile(player).inParty()){
+    		if(split.length == 1 && PP.inParty()){
             	String tempList = "";
             	int x = 0;
                 for(Player p : plugin.getServer().getOnlinePlayers())
                 {
-                	if(mcUsers.getProfile(player).getParty().equals(mcUsers.getProfile(p).getParty())){
+                	if(PP.getParty().equals(mcUsers.getProfile(p.getName()).getParty())){
 	                	if(p != null && x+1 >= mcParty.getInstance().partyCount(player, getPlayersOnline())){
 	                		tempList+= p.getName();
 	                		x++;
@@ -479,19 +526,19 @@ public class mcPlayerListener extends PlayerListener {
 	                	}
                 	}
                 }
-                player.sendMessage(ChatColor.GREEN+"You are in party \""+mcUsers.getProfile(player).getParty()+"\"");
+                player.sendMessage(ChatColor.GREEN+"You are in party \""+PP.getParty()+"\"");
                 player.sendMessage(ChatColor.GREEN + "Party Members ("+ChatColor.WHITE+tempList+ChatColor.GREEN+")");
     		}
-    		if(split.length > 1 && split[1].equals("q") && mcUsers.getProfile(player).inParty()){
+    		if(split.length > 1 && split[1].equals("q") && PP.inParty()){
     			mcParty.getInstance().informPartyMembersQuit(player, getPlayersOnline());
-    			mcUsers.getProfile(player).removeParty();
+    			PP.removeParty();
     			player.sendMessage(ChatColor.RED + "You have left that party");
     			return;
     		}
     		if(split.length >= 2){
-	    		if(mcUsers.getProfile(player).inParty())
+	    		if(PP.inParty())
 	    			mcParty.getInstance().informPartyMembersQuit(player, getPlayersOnline());
-		    	mcUsers.getProfile(player).setParty(split[1]);
+		    	PP.setParty(split[1]);
 		    	player.sendMessage("Joined Party: " + split[1]);
 		    	mcParty.getInstance().informPartyMembers(player, getPlayersOnline());
 	    		}
@@ -535,14 +582,28 @@ public class mcPlayerListener extends PlayerListener {
     			player.sendMessage(ChatColor.YELLOW+"[mcMMO]"+ChatColor.DARK_RED +" Insufficient permissions.");
     			return;
     		}
-    		if(mcUsers.getProfile(player).getMySpawn(player) != null){
-	    		if(mcLoadProperties.myspawnclearsinventory)
-	    			player.getInventory().clear();
+    		if(System.currentTimeMillis() < PP.getMySpawnATS() + 3600000){
+    			long x = System.currentTimeMillis();
+    			int seconds = 0;
+    			int minutes = 0;
+    			while(x < PP.getMySpawnATS() + 3600000){
+    				x+=1000;
+    				seconds++;
+    			}
+    			while(seconds >= 60){
+    				seconds-=60;
+    				minutes++;
+    			}
+    			player.sendMessage("You must wait "+minutes+"m"+seconds+"s"+" to use myspawn");
+    			return;
+    		}
+    		PP.setMySpawnATS(System.currentTimeMillis());
+    		if(PP.getMySpawn(player) != null){
 	    		player.setHealth(20);
-	    		Location mySpawn = mcUsers.getProfile(player).getMySpawn(player);
+	    		Location mySpawn = PP.getMySpawn(player);
 	    		//player.sendMessage("mcMMO DEBUG CODE 1");
-	    		if(mcUsers.getProfile(player).getMySpawnWorld(plugin) != null && !mcUsers.getProfile(player).getMySpawnWorld(plugin).equals("")){
-	    			mySpawn.setWorld(plugin.getServer().getWorld(mcUsers.getProfile(player).getMySpawnWorld(plugin)));
+	    		if(PP.getMySpawnWorld(plugin) != null && !PP.getMySpawnWorld(plugin).equals("")){
+	    			mySpawn.setWorld(plugin.getServer().getWorld(PP.getMySpawnWorld(plugin)));
 	    			//player.sendMessage("mcMMO DEBUG CODE 2");
 	    			} else {
 	    				//player.sendMessage("mcMMO DEBUG CODE 5");
@@ -554,23 +615,22 @@ public class mcPlayerListener extends PlayerListener {
 	    		//Two lines of teleporting to prevent a bug when players try teleporting from one world to another bringing them to that worlds spawn at first.
 	    		//player.sendMessage("mcMMO DEBUG CODE 4");
 	    		if(mcLoadProperties.myspawnclearsinventory)
-	    			player.sendMessage("Traveled to your MySpawn, Inventory cleared & health restored");
-	    		else
-	    			player.sendMessage("Traveled to your MySpawn, Health has been restored.");
+	    			player.sendMessage("Traveled to your MySpawn");
     		} else {
-    			player.sendMessage(ChatColor.RED+"Configure your myspawn first with /setmyspawn");
+    			player.sendMessage(ChatColor.RED+"Configure your myspawn first with a bed.");
     		}
     	}
     }
 	public void onPlayerChat(PlayerChatEvent event) {
 		Player player = event.getPlayer();
+		PlayerProfile PP = mcUsers.getProfile(player.getName());
     	String x = ChatColor.GREEN + "(" + ChatColor.WHITE + player.getName() + ChatColor.GREEN + ") ";
     	String y = ChatColor.AQUA + "{" + ChatColor.WHITE + player.getName() + ChatColor.AQUA + "} ";
     	if(mcConfig.getInstance().isPartyToggled(player.getName())){
     		event.setCancelled(true);
-    		log.log(Level.INFO, "[P]("+mcUsers.getProfile(player).getParty()+")"+"<"+player.getName()+"> "+event.getMessage());
+    		log.log(Level.INFO, "[P]("+PP.getParty()+")"+"<"+player.getName()+"> "+event.getMessage());
     		for(Player herp : plugin.getServer().getOnlinePlayers()){
-    			if(mcUsers.getProfile(herp).inParty()){
+    			if(mcUsers.getProfile(herp.getName()).inParty()){
     			if(mcParty.getInstance().inSameParty(herp, player)){
     				herp.sendMessage(x+event.getMessage());
     			}
@@ -588,5 +648,12 @@ public class mcPlayerListener extends PlayerListener {
     		}
     		return;
     	}
+    	/*
+    	 * Remove from normal chat if toggled 
+    	for(Player z : event.getRecipients()){
+    		if(mcUsers.getProfile(z.getName()).getPartyChatOnlyToggle() == true)
+    			event.getRecipients().remove(z);
+    	}
+    	*/
     	}
 }

+ 38 - 26
mcMMO/com/gmail/nossr50/mcRepair.java

@@ -5,6 +5,8 @@ import org.bukkit.block.Block;
 import org.bukkit.entity.Player;
 import org.bukkit.inventory.ItemStack;
 
+import com.gmail.nossr50.PlayerList.PlayerProfile;
+
 
 public class mcRepair {
 	private static mcMMO plugin;
@@ -19,12 +21,13 @@ public class mcRepair {
     	return instance;
     }
 	public void repairCheck(Player player, ItemStack is, Block block){
-		short durabilityBefore = is.getDurability();
+		PlayerProfile PP = mcUsers.getProfile(player.getName());
+		short durabilityBefore = player.getItemInHand().getDurability();
 		short durabilityAfter = 0;
 		short dif = 0;
     	if(block != null
     			&& mcPermissions.getInstance().repair(player)){
-        	if(player.getItemInHand().getDurability() > 0){
+        	if(player.getItemInHand().getDurability() > 0 && player.getItemInHand().getAmount() < 2){
         		/*
         		 * ARMOR
         		 */
@@ -32,29 +35,32 @@ public class mcRepair {
         			/*
         			 * DIAMOND ARMOR
         			 */
-        			if(isDiamondArmor(is) && hasDiamond(player) && mcUsers.getProfile(player).getRepairInt() >= mcLoadProperties.repairdiamondlevel){
+        			if(isDiamondArmor(is) && hasDiamond(player) && PP.getRepairInt() >= mcLoadProperties.repairdiamondlevel){
 	        			removeDiamond(player);
 	        			player.getItemInHand().setDurability(getArmorRepairAmount(is, player));
-	        			durabilityAfter = is.getDurability();
+	        			durabilityAfter = player.getItemInHand().getDurability();
+	        			player.sendMessage(String.valueOf(durabilityBefore - durabilityAfter));
 	        			dif = (short) (durabilityBefore - durabilityAfter);
-	        			mcUsers.getProfile(player).addRepairGather(dif * mcLoadProperties.xpGainMultiplier);
+	        			dif = (short) (dif * 6); //Boost XP
+	        			PP.addRepairGather(dif * mcLoadProperties.xpGainMultiplier);
         			} else if (isIronArmor(is) && hasIron(player)){
         			/*
         			 * IRON ARMOR
         			 */
 	        			removeIron(player);
 	            		player.getItemInHand().setDurability(getArmorRepairAmount(is, player));
-	            		durabilityAfter = is.getDurability();
+	            		durabilityAfter = player.getItemInHand().getDurability();
 	            		dif = (short) (durabilityBefore - durabilityAfter);
-	            		mcUsers.getProfile(player).addRepairGather(dif * mcLoadProperties.xpGainMultiplier);
+	            		dif = (short) (dif * 2); //Boost XP
+	            		PP.addRepairGather(dif * mcLoadProperties.xpGainMultiplier);
 	            	//GOLD ARMOR
         			} else if (isGoldArmor(is) && hasGold(player)){
         				removeGold(player);
         				player.getItemInHand().setDurability(getArmorRepairAmount(is, player));
-        				durabilityAfter = is.getDurability();
+        				durabilityAfter = player.getItemInHand().getDurability();
 	            		dif = (short) (durabilityBefore - durabilityAfter);
 	            		dif = (short) (dif * 4); //Boost XP of Gold to around Iron
-        				mcUsers.getProfile(player).addRepairGather(dif * mcLoadProperties.xpGainMultiplier);
+        				PP.addRepairGather(dif * mcLoadProperties.xpGainMultiplier);
         			} else {
         				needMoreVespeneGas(is, player);
         			}
@@ -67,9 +73,12 @@ public class mcRepair {
         			 * IRON TOOLS
         			 */
             		if(isIronTools(is) && hasIron(player)){
-            			is.setDurability(getToolRepairAmount(is, player));
             			removeIron(player);
-            			durabilityAfter = is.getDurability();
+            			/*
+            			 * Repair Durability and calculate dif
+            			 */
+            			player.getItemInHand().setDurability(getToolRepairAmount(is, player));
+            			durabilityAfter = player.getItemInHand().getDurability();
 	            		dif = (short) (durabilityBefore - durabilityAfter);
 	            		if(mcm.getInstance().isShovel(is))
 	        				dif = (short) (dif / 3);
@@ -77,14 +86,14 @@ public class mcRepair {
 	        				dif = (short) (dif / 2);
 	        			if(mcm.getInstance().isHoe(is))
 	        				dif = (short) (dif / 2);
-            			mcUsers.getProfile(player).addRepairGather(dif * mcLoadProperties.xpGainMultiplier);
-            		} else if (isDiamondTools(is) && hasDiamond(player) && mcUsers.getProfile(player).getRepairInt() >= mcLoadProperties.repairdiamondlevel){ //Check if its diamond and the player has diamonds
+            			PP.addRepairGather(dif * mcLoadProperties.xpGainMultiplier);
+            		} else if (isDiamondTools(is) && hasDiamond(player) && PP.getRepairInt() >= mcLoadProperties.repairdiamondlevel){ //Check if its diamond and the player has diamonds
             			/*
             			 * DIAMOND TOOLS
             			 */
-            			is.setDurability(getToolRepairAmount(is, player));
+            			player.getItemInHand().setDurability(getToolRepairAmount(is, player));
             			removeDiamond(player);
-            			durabilityAfter = is.getDurability();
+            			durabilityAfter = player.getItemInHand().getDurability();
 	            		dif = (short) (durabilityBefore - durabilityAfter);
 	            		if(mcm.getInstance().isShovel(is))
 	        				dif = (short) (dif / 3);
@@ -92,11 +101,11 @@ public class mcRepair {
 	        				dif = (short) (dif / 2);
 	        			if(mcm.getInstance().isHoe(is))
 	        				dif = (short) (dif / 2);
-            			mcUsers.getProfile(player).addRepairGather(dif * mcLoadProperties.xpGainMultiplier);
+            			PP.addRepairGather(dif * mcLoadProperties.xpGainMultiplier);
             		} else if(isGoldTools(is) && hasGold(player)){
-            			is.setDurability(getToolRepairAmount(is, player));
+            			player.getItemInHand().setDurability(getToolRepairAmount(is, player));
             			removeGold(player);
-            			durabilityAfter = is.getDurability();
+            			durabilityAfter = player.getItemInHand().getDurability();
 	            		dif = (short) (durabilityBefore - durabilityAfter);
 	            		dif = (short) (dif * 7.6); //Boost XP for Gold to that of around Iron
 	            		if(mcm.getInstance().isShovel(is))
@@ -105,7 +114,7 @@ public class mcRepair {
 	        				dif = (short) (dif / 2);
 	        			if(mcm.getInstance().isHoe(is))
 	        				dif = (short) (dif / 2);
-            			mcUsers.getProfile(player).addRepairGather(dif * mcLoadProperties.xpGainMultiplier);
+            			PP.addRepairGather(dif * mcLoadProperties.xpGainMultiplier);
             		} else {
             			needMoreVespeneGas(is, player);
             		}
@@ -263,7 +272,8 @@ public class mcRepair {
     	return false;
     }
     public short repairCalculate(Player player, short durability, short ramt){
-    	float bonus = (mcUsers.getProfile(player).getRepairInt() / 500);
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
+    	float bonus = (PP.getRepairInt() / 500);
     	bonus = (ramt * bonus);
     	ramt = ramt+=bonus;
     	if(checkPlayerProcRepair(player)){
@@ -388,12 +398,11 @@ public class mcRepair {
     		}
 			if(durability < 0)
 				durability = 0;
-			if(checkPlayerProcRepair(player))
-				durability = 0;
 			return repairCalculate(player, durability, ramt);
     }
     public void needMoreVespeneGas(ItemStack is, Player player){
-    	if ((isDiamondTools(is) || isDiamondArmor(is)) && mcUsers.getProfile(player).getRepairInt() < mcLoadProperties.repairdiamondlevel){
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
+    	if ((isDiamondTools(is) || isDiamondArmor(is)) && PP.getRepairInt() < mcLoadProperties.repairdiamondlevel){
 			player.sendMessage(ChatColor.DARK_RED +"You're not adept enough to repair Diamond");
 		} else if (isDiamondTools(is) && !hasDiamond(player) || isIronTools(is) && !hasIron(player) || isGoldTools(is) && !hasGold(player)){
 			if(isDiamondTools(is) && !hasDiamond(player))
@@ -407,12 +416,15 @@ public class mcRepair {
 			player.sendMessage(ChatColor.DARK_RED+"You need more "+ChatColor.BLUE+ "Diamonds");
 		} else if (isIronArmor(is) && !hasIron(player)){
 			player.sendMessage(ChatColor.DARK_RED+"You need more "+ChatColor.GRAY+ "Iron");
-		} else if (isGoldArmor(is) && !hasGold(player))
+		} else if (isGoldArmor(is) && !hasGold(player)){
 			player.sendMessage(ChatColor.DARK_RED+"You need more "+ChatColor.GOLD+"Gold");
-		}
+		} else if (is.getAmount() > 1)
+			player.sendMessage(ChatColor.DARK_RED+"You can't repair stacked items");
+    	}
     public boolean checkPlayerProcRepair(Player player){
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
 		if(player != null){
-			if(Math.random() * 1000 <= mcUsers.getProfile(player).getRepairInt()){
+			if(Math.random() * 1000 <= PP.getRepairInt()){
 				player.sendMessage(ChatColor.GRAY + "That felt easy.");
 				return true;
 			}

+ 148 - 94
mcMMO/com/gmail/nossr50/mcSkills.java

@@ -5,6 +5,7 @@ import org.bukkit.block.Block;
 import org.bukkit.entity.Entity;
 import org.bukkit.entity.Player;
 import org.bukkit.inventory.ItemStack;
+import org.bukkit.plugin.Plugin;
 
 import com.gmail.nossr50.PlayerList.PlayerProfile;
 
@@ -55,36 +56,54 @@ public class mcSkills {
     	return x;
     }
     public void watchCooldowns(Player player){
-    	if(!mcUsers.getProfile(player).getTreeFellerInformed() && System.currentTimeMillis() - mcUsers.getProfile(player).getTreeFellerDeactivatedTimeStamp() >= (mcLoadProperties.berserkCooldown * 1000)){
-			mcUsers.getProfile(player).setTreeFellerInformed(true);
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
+    	if(!PP.getGreenTerraInformed() && System.currentTimeMillis() - PP.getGreenTerraDeactivatedTimeStamp() >= (mcLoadProperties.greenTerraCooldown * 1000)){
+			PP.setGreenTerraInformed(true);
+    		player.sendMessage(ChatColor.GREEN+"Your "+ChatColor.YELLOW+"Green Terra "+ChatColor.GREEN+"ability is refreshed!");
+    	}
+    	if(!PP.getTreeFellerInformed() && System.currentTimeMillis() - PP.getTreeFellerDeactivatedTimeStamp() >= (mcLoadProperties.berserkCooldown * 1000)){
+			PP.setTreeFellerInformed(true);
     		player.sendMessage(ChatColor.GREEN+"Your "+ChatColor.YELLOW+"Tree Feller "+ChatColor.GREEN+"ability is refreshed!");
     	}
-    	if(!mcUsers.getProfile(player).getSuperBreakerInformed() && System.currentTimeMillis() - mcUsers.getProfile(player).getSuperBreakerDeactivatedTimeStamp() >= (mcLoadProperties.berserkCooldown * 1000)){
-			mcUsers.getProfile(player).setSuperBreakerInformed(true);
+    	if(!PP.getSuperBreakerInformed() && System.currentTimeMillis() - PP.getSuperBreakerDeactivatedTimeStamp() >= (mcLoadProperties.berserkCooldown * 1000)){
+			PP.setSuperBreakerInformed(true);
     		player.sendMessage(ChatColor.GREEN+"Your "+ChatColor.YELLOW+"Super Breaker "+ChatColor.GREEN+"ability is refreshed!");
     	}
-    	if(!mcUsers.getProfile(player).getSerratedStrikesInformed() && System.currentTimeMillis() - mcUsers.getProfile(player).getSerratedStrikesDeactivatedTimeStamp() >= (mcLoadProperties.berserkCooldown * 1000)){
-			mcUsers.getProfile(player).setSerratedStrikesInformed(true);
+    	if(!PP.getSerratedStrikesInformed() && System.currentTimeMillis() - PP.getSerratedStrikesDeactivatedTimeStamp() >= (mcLoadProperties.berserkCooldown * 1000)){
+			PP.setSerratedStrikesInformed(true);
     		player.sendMessage(ChatColor.GREEN+"Your "+ChatColor.YELLOW+"Serrated Strikes "+ChatColor.GREEN+"ability is refreshed!");
     	}
-    	if(!mcUsers.getProfile(player).getBerserkInformed() && System.currentTimeMillis() - mcUsers.getProfile(player).getBerserkDeactivatedTimeStamp() >= (mcLoadProperties.berserkCooldown * 1000)){
-			mcUsers.getProfile(player).setBerserkInformed(true);
+    	if(!PP.getBerserkInformed() && System.currentTimeMillis() - PP.getBerserkDeactivatedTimeStamp() >= (mcLoadProperties.berserkCooldown * 1000)){
+			PP.setBerserkInformed(true);
     		player.sendMessage(ChatColor.GREEN+"Your "+ChatColor.YELLOW+"Berserk "+ChatColor.GREEN+"ability is refreshed!");
     	}
-    	if(!mcUsers.getProfile(player).getSkullSplitterInformed() && System.currentTimeMillis() - mcUsers.getProfile(player).getSkullSplitterDeactivatedTimeStamp() >= (mcLoadProperties.berserkCooldown * 1000)){
-			mcUsers.getProfile(player).setSkullSplitterInformed(true);
+    	if(!PP.getSkullSplitterInformed() && System.currentTimeMillis() - PP.getSkullSplitterDeactivatedTimeStamp() >= (mcLoadProperties.berserkCooldown * 1000)){
+			PP.setSkullSplitterInformed(true);
     		player.sendMessage(ChatColor.GREEN+"Your "+ChatColor.YELLOW+"Skull Splitter "+ChatColor.GREEN+"ability is refreshed!");
     	}
-    	if(!mcUsers.getProfile(player).getGigaDrillBreakerInformed() && System.currentTimeMillis() - mcUsers.getProfile(player).getGigaDrillBreakerDeactivatedTimeStamp() >= (mcLoadProperties.berserkCooldown * 1000)){
-			mcUsers.getProfile(player).setGigaDrillBreakerInformed(true);
+    	if(!PP.getGigaDrillBreakerInformed() && System.currentTimeMillis() - PP.getGigaDrillBreakerDeactivatedTimeStamp() >= (mcLoadProperties.berserkCooldown * 1000)){
+			PP.setGigaDrillBreakerInformed(true);
     		player.sendMessage(ChatColor.GREEN+"Your "+ChatColor.YELLOW+"Giga Drill Breaker "+ChatColor.GREEN+"ability is refreshed!");
     	}
     }
+    public void hoeReadinessCheck(Player player){
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
+    	if(mcPermissions.getInstance().herbalismAbility(player) && mcm.getInstance().isHoe(player.getItemInHand()) && !PP.getHoePreparationMode()){
+    		if(!PP.getGreenTerraMode() && !cooldownOver(player, PP.getGreenTerraDeactivatedTimeStamp(), mcLoadProperties.greenTerraCooldown)){
+	    		player.sendMessage(ChatColor.RED+"You are too tired to use that ability again."
+	    				+ChatColor.YELLOW+" ("+calculateTimeLeft(player, PP.getGreenTerraDeactivatedTimeStamp(), mcLoadProperties.greenTerraCooldown)+"s)");
+	    		return;
+	    	}
+    		player.sendMessage(ChatColor.GREEN+"**YOU READY YOUR HOE**");
+			PP.setHoePreparationATS(System.currentTimeMillis());
+			PP.setHoePreparationMode(true);
+    	}
+    }
     public void abilityActivationCheck(Player player){
-    	PlayerProfile PP = mcUsers.getProfile(player);
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
     	if(!PP.getAbilityUse())
     		return;
-    	if(mcPermissions.getInstance().miningAbility(player) && mcm.getInstance().isMiningPick(player.getItemInHand()) && !mcUsers.getProfile(player).getPickaxePreparationMode()){
+    	if(mcPermissions.getInstance().miningAbility(player) && mcm.getInstance().isMiningPick(player.getItemInHand()) && !PP.getPickaxePreparationMode()){
     		if(!PP.getSuperBreakerMode() && !cooldownOver(player, PP.getSuperBreakerDeactivatedTimeStamp(), mcLoadProperties.superBreakerCooldown)){
 	    		player.sendMessage(ChatColor.RED+"You are too tired to use that ability again."
 	    				+ChatColor.YELLOW+" ("+calculateTimeLeft(player, PP.getSuperBreakerDeactivatedTimeStamp(), mcLoadProperties.superBreakerCooldown)+"s)");
@@ -132,49 +151,59 @@ public class mcSkills {
     		}
     	}
     }
-    public void serratedStrikesActivationCheck(Player player){
+    public void serratedStrikesActivationCheck(Player player, Plugin pluginx){
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
 		if(mcm.getInstance().isSwords(player.getItemInHand())){
-			if(mcUsers.getProfile(player).getSwordsPreparationMode()){
-    			mcUsers.getProfile(player).setSwordsPreparationMode(false);
+			if(PP.getSwordsPreparationMode()){
+    			PP.setSwordsPreparationMode(false);
     		}
 	    	int ticks = 2;
-	    	int x = mcUsers.getProfile(player).getSwordsInt();
+	    	int x = PP.getSwordsInt();
     		while(x >= 50){
     			x-=50;
     			ticks++;
     		}
     		
-	    	if(!mcUsers.getProfile(player).getSerratedStrikesMode() && mcUsers.getProfile(player).getSerratedStrikesCooldown() == 0){
+	    	if(!PP.getSerratedStrikesMode() && PP.getSerratedStrikesCooldown() == 0){
 	    		player.sendMessage(ChatColor.GREEN+"**SERRATED STRIKES ACTIVATED**");
-	    		mcUsers.getProfile(player).setSerratedStrikesTicks((ticks * 2) * 1000);
-	    		mcUsers.getProfile(player).setSerratedStrikesActivatedTimeStamp(System.currentTimeMillis());
-	    		mcUsers.getProfile(player).setSerratedStrikesMode(true);
+	    		for(Player y : pluginx.getServer().getOnlinePlayers()){
+	    			if(y != null && y != player && mcm.getInstance().getDistance(player.getLocation(), y.getLocation()) < 10)
+	    				y.sendMessage(ChatColor.GREEN+player.getName()+ChatColor.DARK_GREEN+" has used "+ChatColor.RED+"Serrated Strikes!");
+	    		}
+	    		PP.setSerratedStrikesTicks((ticks * 2) * 1000);
+	    		PP.setSerratedStrikesActivatedTimeStamp(System.currentTimeMillis());
+	    		PP.setSerratedStrikesMode(true);
 	    	}
 	    	
 	    }
 	}
-    public void berserkActivationCheck(Player player){
+    public void berserkActivationCheck(Player player, Plugin pluginx){
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
 		if(player.getItemInHand().getTypeId() == 0){
-			if(mcUsers.getProfile(player).getFistsPreparationMode()){
-    			mcUsers.getProfile(player).setFistsPreparationMode(false);
+			if(PP.getFistsPreparationMode()){
+    			PP.setFistsPreparationMode(false);
     		}
 	    	int ticks = 2;
-	    	int x = mcUsers.getProfile(player).getUnarmedInt();
+	    	int x = PP.getUnarmedInt();
     		while(x >= 50){
     			x-=50;
     			ticks++;
     		}
     		
-	    	if(!mcUsers.getProfile(player).getBerserkMode() && cooldownOver(player, mcUsers.getProfile(player).getBerserkDeactivatedTimeStamp(), mcLoadProperties.berserkCooldown)){
+	    	if(!PP.getBerserkMode() && cooldownOver(player, PP.getBerserkDeactivatedTimeStamp(), mcLoadProperties.berserkCooldown)){
 	    		player.sendMessage(ChatColor.GREEN+"**BERSERK ACTIVATED**");
-	    		mcUsers.getProfile(player).setBerserkTicks(ticks * 1000);
-	    		mcUsers.getProfile(player).setBerserkActivatedTimeStamp(System.currentTimeMillis());
-	    		mcUsers.getProfile(player).setBerserkMode(true);
+	    		for(Player y : pluginx.getServer().getOnlinePlayers()){
+	    			if(y != null && y != player && mcm.getInstance().getDistance(player.getLocation(), y.getLocation()) < 10)
+	    				y.sendMessage(ChatColor.GREEN+player.getName()+ChatColor.DARK_GREEN+" has used "+ChatColor.RED+"Berserk!");
+	    		}
+	    		PP.setBerserkTicks(ticks * 1000);
+	    		PP.setBerserkActivatedTimeStamp(System.currentTimeMillis());
+	    		PP.setBerserkMode(true);
 	    	}
 	    }
 	}
-    public void skullSplitterCheck(Player player){
-    	PlayerProfile PP = mcUsers.getProfile(player);
+    public void skullSplitterCheck(Player player, Plugin pluginx){
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
     	if(mcm.getInstance().isAxes(player.getItemInHand()) && mcPermissions.getInstance().axesAbility(player)){
     		/*
     		 * CHECK FOR AXE PREP MODE
@@ -183,7 +212,7 @@ public class mcSkills {
     			PP.setAxePreparationMode(false);
     		}
     		int ticks = 2;
-    		int x = mcUsers.getProfile(player).getAxesInt();
+    		int x = PP.getAxesInt();
     		while(x >= 50){
     			x-=50;
     			ticks++;
@@ -191,6 +220,10 @@ public class mcSkills {
 
     		if(!PP.getSkullSplitterMode() && cooldownOver(player, PP.getSkullSplitterDeactivatedTimeStamp(), mcLoadProperties.skullSplitterCooldown)){
     			player.sendMessage(ChatColor.GREEN+"**SKULL SPLITTER ACTIVATED**");
+    			for(Player y : pluginx.getServer().getOnlinePlayers()){
+	    			if(y != null && y != player && mcm.getInstance().getDistance(player.getLocation(), y.getLocation()) < 10)
+	    				y.sendMessage(ChatColor.GREEN+player.getName()+ChatColor.DARK_GREEN+" has used "+ChatColor.RED+"Skull Splitter!");
+	    		}
     			PP.setSkullSplitterTicks(ticks * 1000);
     			PP.setSkullSplitterActivatedTimeStamp(System.currentTimeMillis());
     			PP.setSkullSplitterMode(true);
@@ -202,12 +235,13 @@ public class mcSkills {
     	}
     }
     public void monitorSkills(Player player){
-    	PlayerProfile PP = mcUsers.getProfile(player);
-    	/*
-    	 * AXE PREPARATION MODE
-    	 */
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
     	if(PP == null)
     		mcUsers.addUser(player);
+    	if(PP.getHoePreparationMode() && System.currentTimeMillis() - PP.getHoePreparationATS() >= 4000){
+			PP.setHoePreparationMode(false);
+			player.sendMessage(ChatColor.GRAY+"**YOU LOWER YOUR HOE**");
+    	}
 		if(PP.getAxePreparationMode() && System.currentTimeMillis() - PP.getAxePreparationATS() >= 4000){
 				PP.setAxePreparationMode(false);
 				player.sendMessage(ChatColor.GRAY+"**YOU LOWER YOUR AXE**");
@@ -228,17 +262,26 @@ public class mcSkills {
 			PP.setShovelPreparationMode(false);
 			player.sendMessage(ChatColor.GRAY+"**YOU LOWER YOUR SHOVEL**");
 		}
+		/*
+		 * HERBALISM ABILITY
+		 */
+		if(mcPermissions.getInstance().herbalismAbility(player)){
+    		if(PP.getGreenTerraMode() && PP.getGreenTerraActivatedTimeStamp() + PP.getGreenTerraTicks() <= System.currentTimeMillis()){
+    				PP.setGreenTerraMode(false);
+    				PP.setGreenTerraInformed(false);
+    				player.sendMessage(ChatColor.RED+"**Green Terra has worn off**");
+    				PP.setGreenTerraDeactivatedTimeStamp(System.currentTimeMillis());
+    		}
+		}
     	/*
     	 * AXES ABILITY
     	 */
     	if(mcPermissions.getInstance().axesAbility(player)){
-    		if(mcPermissions.getInstance().unarmedAbility(player)){
-    			if(PP.getSkullSplitterMode() && PP.getSkullSplitterActivatedTimeStamp() + PP.getSkullSplitterTicks() <= System.currentTimeMillis()){
-    					PP.setSkullSplitterMode(false);
-    					PP.setSkullSplitterInformed(false);
-    					player.sendMessage(ChatColor.RED+"**Skull Splitter has worn off**");
-    					PP.setSkullSplitterDeactivatedTimeStamp(System.currentTimeMillis());
-    			}
+    		if(PP.getSkullSplitterMode() && PP.getSkullSplitterActivatedTimeStamp() + PP.getSkullSplitterTicks() <= System.currentTimeMillis()){
+    				PP.setSkullSplitterMode(false);
+    				PP.setSkullSplitterInformed(false);
+    				player.sendMessage(ChatColor.RED+"**Skull Splitter has worn off**");
+    				PP.setSkullSplitterDeactivatedTimeStamp(System.currentTimeMillis());
     		}
 		}
     	/*
@@ -298,125 +341,136 @@ public class mcSkills {
 		}
     }
     public void XpCheck(Player player){
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
     	/*
     	 * ACROBATICS
     	 */
-    	if(player != null && mcUsers.getProfile(player).getAcrobaticsGatherInt() >= mcUsers.getProfile(player).getXpToLevel("acrobatics")){
+    	if(player != null && PP.getAcrobaticsGatherInt() >= PP.getXpToLevel("acrobatics")){
 			int skillups = 0;
-			while(mcUsers.getProfile(player).getAcrobaticsGatherInt() >= mcUsers.getProfile(player).getXpToLevel("acrobatics")){
+			while(PP.getAcrobaticsGatherInt() >= PP.getXpToLevel("acrobatics")){
 				skillups++;
-				mcUsers.getProfile(player).removeAcrobaticsGather(mcUsers.getProfile(player).getXpToLevel("acrobatics"));
-				mcUsers.getProfile(player).skillUpAcrobatics(1);
+				PP.removeAcrobaticsGather(PP.getXpToLevel("acrobatics"));
+				PP.skillUpAcrobatics(1);
 			}
-			player.sendMessage(ChatColor.YELLOW+"Acrobatics skill increased by "+skillups+"."+" Total ("+mcUsers.getProfile(player).getAcrobatics()+")");	
+			if(player != null && PP.getAcrobatics() != null)
+				player.sendMessage(ChatColor.YELLOW+"Acrobatics skill increased by "+skillups+"."+" Total ("+PP.getAcrobatics()+")");	
 		}
     	/*
     	 * ARCHERY
     	 */
-    	if(mcUsers.getProfile(player).getArcheryGatherInt() >= mcUsers.getProfile(player).getXpToLevel("archery")){
+    	if(PP.getArcheryGatherInt() >= PP.getXpToLevel("archery")){
 			int skillups = 0;
-			while(mcUsers.getProfile(player).getArcheryGatherInt() >= mcUsers.getProfile(player).getXpToLevel("archery")){
+			while(PP.getArcheryGatherInt() >= PP.getXpToLevel("archery")){
 				skillups++;
-				mcUsers.getProfile(player).removeArcheryGather(mcUsers.getProfile(player).getXpToLevel("archery"));
-				mcUsers.getProfile(player).skillUpArchery(1);
+				PP.removeArcheryGather(PP.getXpToLevel("archery"));
+				PP.skillUpArchery(1);
 			}
-			player.sendMessage(ChatColor.YELLOW+"Archery skill increased by "+skillups+"."+" Total ("+mcUsers.getProfile(player).getArchery()+")");	
+			if(player != null && PP.getArchery() != null)
+				player.sendMessage(ChatColor.YELLOW+"Archery skill increased by "+skillups+"."+" Total ("+PP.getArchery()+")");	
 		}
     	/*
     	 * SWORDS
     	 */
-    	if(mcUsers.getProfile(player).getSwordsGatherInt() >= mcUsers.getProfile(player).getXpToLevel("swords")){
+    	if(PP.getSwordsGatherInt() >= PP.getXpToLevel("swords")){
 			int skillups = 0;
-			while(mcUsers.getProfile(player).getSwordsGatherInt() >= mcUsers.getProfile(player).getXpToLevel("swords")){
+			while(PP.getSwordsGatherInt() >= PP.getXpToLevel("swords")){
 				skillups++;
-				mcUsers.getProfile(player).removeSwordsGather(mcUsers.getProfile(player).getXpToLevel("swords"));
-				mcUsers.getProfile(player).skillUpSwords(1);
+				PP.removeSwordsGather(PP.getXpToLevel("swords"));
+				PP.skillUpSwords(1);
 			}
-			player.sendMessage(ChatColor.YELLOW+"Swords skill increased by "+skillups+"."+" Total ("+mcUsers.getProfile(player).getSwords()+")");	
+			if(player != null && PP.getSwords() != null)
+				player.sendMessage(ChatColor.YELLOW+"Swords skill increased by "+skillups+"."+" Total ("+PP.getSwords()+")");	
 		}
     	/*
     	 * AXES
     	 */
-		if(mcUsers.getProfile(player).getAxesGatherInt() >= mcUsers.getProfile(player).getXpToLevel("axes")){
+		if(PP.getAxesGatherInt() >= PP.getXpToLevel("axes")){
 			int skillups = 0;
-			while(mcUsers.getProfile(player).getAxesGatherInt() >= mcUsers.getProfile(player).getXpToLevel("axes")){
+			while(PP.getAxesGatherInt() >= PP.getXpToLevel("axes")){
 				skillups++;
-				mcUsers.getProfile(player).removeAxesGather(mcUsers.getProfile(player).getXpToLevel("axes"));
-				mcUsers.getProfile(player).skillUpAxes(1);
+				PP.removeAxesGather(PP.getXpToLevel("axes"));
+				PP.skillUpAxes(1);
 			}
-			player.sendMessage(ChatColor.YELLOW+"Axes skill increased by "+skillups+"."+" Total ("+mcUsers.getProfile(player).getAxes()+")");	
+			if(player != null && PP.getAxes() != null)
+				player.sendMessage(ChatColor.YELLOW+"Axes skill increased by "+skillups+"."+" Total ("+PP.getAxes()+")");	
 		}
 		/*
 		 * UNARMED
 		 */
-		if(mcUsers.getProfile(player).getUnarmedGatherInt() >= mcUsers.getProfile(player).getXpToLevel("unarmed")){
+		if(PP.getUnarmedGatherInt() >= PP.getXpToLevel("unarmed")){
 			int skillups = 0;
-			while(mcUsers.getProfile(player).getUnarmedGatherInt() >= mcUsers.getProfile(player).getXpToLevel("unarmed")){
+			while(PP.getUnarmedGatherInt() >= PP.getXpToLevel("unarmed")){
 				skillups++;
-				mcUsers.getProfile(player).removeUnarmedGather(mcUsers.getProfile(player).getXpToLevel("unarmed"));
-				mcUsers.getProfile(player).skillUpUnarmed(1);
+				PP.removeUnarmedGather(PP.getXpToLevel("unarmed"));
+				PP.skillUpUnarmed(1);
 			}
-			player.sendMessage(ChatColor.YELLOW+"Unarmed skill increased by "+skillups+"."+" Total ("+mcUsers.getProfile(player).getUnarmed()+")");	
+			if(player != null && PP.getUnarmed() != null)
+				player.sendMessage(ChatColor.YELLOW+"Unarmed skill increased by "+skillups+"."+" Total ("+PP.getUnarmed()+")");	
 		}
 		/*
 		 * HERBALISM
 		 */
-		if(mcUsers.getProfile(player).getHerbalismGatherInt() >= mcUsers.getProfile(player).getXpToLevel("herbalism")){
+		if(PP.getHerbalismGatherInt() >= PP.getXpToLevel("herbalism")){
 			int skillups = 0;
-			while(mcUsers.getProfile(player).getHerbalismGatherInt() >= mcUsers.getProfile(player).getXpToLevel("herbalism")){
+			while(PP.getHerbalismGatherInt() >= PP.getXpToLevel("herbalism")){
 				skillups++;
-				mcUsers.getProfile(player).removeHerbalismGather(mcUsers.getProfile(player).getXpToLevel("herbalism"));
-				mcUsers.getProfile(player).skillUpHerbalism(1);
+				PP.removeHerbalismGather(PP.getXpToLevel("herbalism"));
+				PP.skillUpHerbalism(1);
 			}
-			player.sendMessage(ChatColor.YELLOW+"Herbalism skill increased by "+skillups+"."+" Total ("+mcUsers.getProfile(player).getHerbalism()+")");	
+			if(player != null && PP.getHerbalism() != null)
+				player.sendMessage(ChatColor.YELLOW+"Herbalism skill increased by "+skillups+"."+" Total ("+PP.getHerbalism()+")");	
 		}
 		/*
 		 * MINING
 		 */
-		if(player != null && mcUsers.getProfile(player).getMiningGatherInt() >= mcUsers.getProfile(player).getXpToLevel("mining")){
+		if(player != null && PP.getMiningGatherInt() >= PP.getXpToLevel("mining")){
 			int skillups = 0;
-			while(mcUsers.getProfile(player).getMiningGatherInt() >= mcUsers.getProfile(player).getXpToLevel("mining")){
+			while(PP.getMiningGatherInt() >= PP.getXpToLevel("mining")){
 				skillups++;
-				mcUsers.getProfile(player).removeMiningGather(mcUsers.getProfile(player).getXpToLevel("mining"));
-				mcUsers.getProfile(player).skillUpMining(1);
+				PP.removeMiningGather(PP.getXpToLevel("mining"));
+				PP.skillUpMining(1);
 			}
-			player.sendMessage(ChatColor.YELLOW+"Mining skill increased by "+skillups+"."+" Total ("+mcUsers.getProfile(player).getMining()+")");	
+			if(player != null && PP.getMining() != null)
+				player.sendMessage(ChatColor.YELLOW+"Mining skill increased by "+skillups+"."+" Total ("+PP.getMining()+")");	
 		}
 		/*
 		 * WOODCUTTING
 		 */
-		if(player != null && mcUsers.getProfile(player).getWoodCuttingGatherInt() >= mcUsers.getProfile(player).getXpToLevel("woodcutting")){
+		if(player != null && PP.getWoodCuttingGatherInt() >= PP.getXpToLevel("woodcutting")){
 			int skillups = 0;
-			while(mcUsers.getProfile(player).getWoodCuttingGatherInt() >= mcUsers.getProfile(player).getXpToLevel("woodcutting")){
+			while(PP.getWoodCuttingGatherInt() >= PP.getXpToLevel("woodcutting")){
 				skillups++;
-				mcUsers.getProfile(player).removeWoodCuttingGather(mcUsers.getProfile(player).getXpToLevel("woodcutting"));
-				mcUsers.getProfile(player).skillUpWoodCutting(1);
+				PP.removeWoodCuttingGather(PP.getXpToLevel("woodcutting"));
+				PP.skillUpWoodCutting(1);
 			}
-			player.sendMessage(ChatColor.YELLOW+"WoodCutting skill increased by "+skillups+"."+" Total ("+mcUsers.getProfile(player).getWoodCutting()+")");	
+			if(player != null && PP.getWoodCutting() != null)
+				player.sendMessage(ChatColor.YELLOW+"WoodCutting skill increased by "+skillups+"."+" Total ("+PP.getWoodCutting()+")");	
 		}
 		/*
 		 * REPAIR
 		 */
-		if(mcUsers.getProfile(player).getRepairGatherInt() >= mcUsers.getProfile(player).getXpToLevel("repair")){
+		if(PP.getRepairGatherInt() >= PP.getXpToLevel("repair")){
 			int skillups = 0;
-			while(mcUsers.getProfile(player).getRepairGatherInt() >= mcUsers.getProfile(player).getXpToLevel("repair")){
+			while(PP.getRepairGatherInt() >= PP.getXpToLevel("repair")){
 				skillups++;
-				mcUsers.getProfile(player).removeRepairGather(mcUsers.getProfile(player).getXpToLevel("repair"));
-				mcUsers.getProfile(player).skillUpRepair(1);
+				PP.removeRepairGather(PP.getXpToLevel("repair"));
+				PP.skillUpRepair(1);
 			}
-			player.sendMessage(ChatColor.YELLOW+"Repair skill increased by "+skillups+"."+" Total ("+mcUsers.getProfile(player).getRepair()+")");	
+			if(player != null && PP.getRepair() != null)
+				player.sendMessage(ChatColor.YELLOW+"Repair skill increased by "+skillups+"."+" Total ("+PP.getRepair()+")");	
 		}
 		/*
 		 * EXCAVATION
 		 */
-		if(mcUsers.getProfile(player).getExcavationGatherInt() >= mcUsers.getProfile(player).getXpToLevel("excavation")){
+		if(PP.getExcavationGatherInt() >= PP.getXpToLevel("excavation")){
 			int skillups = 0;
-			while(mcUsers.getProfile(player).getExcavationGatherInt() >= mcUsers.getProfile(player).getXpToLevel("excavation")){
+			while(PP.getExcavationGatherInt() >= PP.getXpToLevel("excavation")){
 				skillups++;
-				mcUsers.getProfile(player).removeExcavationGather(mcUsers.getProfile(player).getXpToLevel("excavation"));
-				mcUsers.getProfile(player).skillUpExcavation(1);
+				PP.removeExcavationGather(PP.getXpToLevel("excavation"));
+				PP.skillUpExcavation(1);
 			}
-			player.sendMessage(ChatColor.YELLOW+"Excavation skill increased by "+skillups+"."+" Total ("+mcUsers.getProfile(player).getExcavation()+")");	
+			if(player != null && PP.getExcavation() != null)
+				player.sendMessage(ChatColor.YELLOW+"Excavation skill increased by "+skillups+"."+" Total ("+PP.getExcavation()+")");	
 		}
     }
     public boolean isSkill(String skillname){

+ 11 - 8
mcMMO/com/gmail/nossr50/mcTimer.java

@@ -5,6 +5,8 @@ import java.util.TimerTask;
 import org.bukkit.ChatColor;
 import org.bukkit.entity.*;
 
+import com.gmail.nossr50.PlayerList.PlayerProfile;
+
 
 public class mcTimer extends TimerTask{
 	private final mcMMO plugin;
@@ -17,9 +19,10 @@ public class mcTimer extends TimerTask{
 	public void run() {
 		Player[] playerlist = plugin.getServer().getOnlinePlayers();
 		for(Player player : playerlist){
+			PlayerProfile PP = mcUsers.getProfile(player.getName());
 			if(player == null)
 				continue;
-			if(mcUsers.getProfile(player) == null)
+			if(PP == null)
 	    		mcUsers.addUser(player);
 			/*
 			 * MONITOR SKILLS
@@ -33,31 +36,31 @@ public class mcTimer extends TimerTask{
 			/*
 			 * PLAYER BLEED MONITORING
 			 */
-			if(thecount % 2 == 0 && player != null && mcUsers.getProfile(player).getBleedTicks() >= 1){
+			if(thecount % 2 == 0 && player != null && PP.getBleedTicks() >= 1){
         		player.damage(2);
-        		mcUsers.getProfile(player).decreaseBleedTicks();
+        		PP.decreaseBleedTicks();
         	}
 			
-			if(mcPermissions.getInstance().regeneration(player) && System.currentTimeMillis() >= mcUsers.getProfile(player).getRecentlyHurt() + 60000){
+			if(mcPermissions.getInstance().regeneration(player) && System.currentTimeMillis() >= PP.getRecentlyHurt() + 60000){
 				if(thecount == 10 || thecount == 20 || thecount == 30 || thecount == 40){
 				    if(player != null &&
 				    	player.getHealth() > 0 && player.getHealth() < 20 
-				    	&& mcUsers.getProfile(player).getPowerLevel() >= 1000){
+				    	&& mcm.getInstance().getPowerLevel(player) >= 1000){
 				    	player.setHealth(mcm.getInstance().calculateHealth(player.getHealth(), 1));
 				    }
 				}
 				if(thecount == 20 || thecount == 40){
 			   		if(player != null &&
 			   			player.getHealth() > 0 && player.getHealth() < 20 
-			    		&& mcUsers.getProfile(player).getPowerLevel() >= 500 
-			    		&& mcUsers.getProfile(player).getPowerLevel() < 1000){
+			    		&& mcm.getInstance().getPowerLevel(player) >= 500 
+			    		&& mcm.getInstance().getPowerLevel(player) < 1000){
 			    		player.setHealth(mcm.getInstance().calculateHealth(player.getHealth(), 1));
 			    	}
 				}
 				if(thecount == 40){
 			    	if(player != null &&
 			    		player.getHealth() > 0 && player.getHealth() < 20  
-			    		&& mcUsers.getProfile(player).getPowerLevel() < 500){
+			    		&& mcm.getInstance().getPowerLevel(player) < 500){
 			    		player.setHealth(mcm.getInstance().calculateHealth(player.getHealth(), 1));
 			    	}
 				}

+ 73 - 42
mcMMO/com/gmail/nossr50/mcUsers.java

@@ -77,8 +77,8 @@ public class mcUsers {
 	//Output:	none
 	//Use:		Creates the player profile
 	//=====================================================================
-    public static void removeUser(Player player){
-    	players.removePlayer(player);
+    public static void removeUser(String playername){
+    	players.removePlayer(playername);
     }
 
 	//=====================================================================
@@ -87,8 +87,8 @@ public class mcUsers {
 	//Output:	PlayerList.PlayerProfile: The profile
 	//Use:		Gets the player profile
 	//=====================================================================
-    public static PlayerList.PlayerProfile getProfile(Player player){
-    	return players.findProfile(player);
+    public static PlayerList.PlayerProfile getProfile(String playername){
+    	return players.findProfile(playername);
     }
     
     public static mcUsers getInstance() {
@@ -131,9 +131,9 @@ class PlayerList
 	//Output:	None
 	//Use:		Remove the profile of the specified player
 	//=====================================================================
-	public void removePlayer(Player player)
+	public void removePlayer(String playername)
 	{
-		players.remove(findProfile(player));
+		players.remove(findProfile(playername));
 	}
 
 	//=====================================================================
@@ -142,11 +142,11 @@ class PlayerList
 	//Output:	PlayerProfile: The profile of the specified player
 	//Use:		Get the profile for the specified player
 	//=====================================================================
-	public PlayerProfile findProfile(Player player)
+	public PlayerProfile findProfile(String playername)
 	{
 		for(PlayerProfile ply : players)
 		{
-			if(ply.isPlayer(player))
+			if(ply.isPlayer(playername))
 				return ply;
 		}
 		return null;
@@ -157,12 +157,12 @@ class PlayerList
 	    protected final Logger log = Logger.getLogger("Minecraft");
 		private String playerName, gather, wgather, woodcutting, repair, mining, party, myspawn, myspawnworld, unarmed, herbalism, excavation,
 		archery, swords, axes, invite, acrobatics, repairgather, unarmedgather, herbalismgather, excavationgather, archerygather, swordsgather, axesgather, acrobaticsgather;
-		private boolean berserkInformed = true, skullSplitterInformed = true, gigaDrillBreakerInformed = true, superBreakerInformed = true, serratedStrikesInformed = true, treeFellerInformed = true, dead, abilityuse = true, treeFellerMode, superBreakerMode, gigaDrillBreakerMode, serratedStrikesMode, shovelPreparationMode, swordsPreparationMode, fistsPreparationMode, pickaxePreparationMode, axePreparationMode, skullSplitterMode, berserkMode;
+		private boolean greenTerraMode, partyChatOnly = false, greenTerraInformed = true, berserkInformed = true, skullSplitterInformed = true, gigaDrillBreakerInformed = true, superBreakerInformed = true, serratedStrikesInformed = true, treeFellerInformed = true, dead, abilityuse = true, treeFellerMode, superBreakerMode, gigaDrillBreakerMode, serratedStrikesMode, hoePreparationMode, shovelPreparationMode, swordsPreparationMode, fistsPreparationMode, pickaxePreparationMode, axePreparationMode, skullSplitterMode, berserkMode;
 		private long gigaDrillBreakerCooldown = 0, berserkCooldown = 0, superBreakerCooldown = 0, skullSplitterCooldown = 0, serratedStrikesCooldown = 0,
-		treeFellerCooldown = 0, recentlyHurt = 0, archeryShotATS = 0, berserkATS = 0, berserkDATS = 0, gigaDrillBreakerATS = 0, gigaDrillBreakerDATS = 0,
-		superBreakerATS = 0, superBreakerDATS = 0, serratedStrikesATS = 0, serratedStrikesDATS = 0, treeFellerATS = 0, treeFellerDATS = 0, 
-		skullSplitterATS = 0, skullSplitterDATS = 0, axePreparationATS = 0, pickaxePreparationATS = 0, fistsPreparationATS = 0, shovelPreparationATS = 0, swordsPreparationATS = 0;
-		private int berserkTicks = 0, bleedticks = 0, gigaDrillBreakerTicks = 0, superBreakerTicks = 0, serratedStrikesTicks = 0, skullSplitterTicks = 0, treeFellerTicks = 0;
+		greenTerraCooldown = 0, treeFellerCooldown = 0, recentlyHurt = 0, archeryShotATS = 0, berserkATS = 0, berserkDATS = 0, gigaDrillBreakerATS = 0, gigaDrillBreakerDATS = 0,
+		mySpawnATS = 0, greenTerraATS = 0, greenTerraDATS = 0, superBreakerATS = 0, superBreakerDATS = 0, serratedStrikesATS = 0, serratedStrikesDATS = 0, treeFellerATS = 0, treeFellerDATS = 0, 
+		skullSplitterATS = 0, skullSplitterDATS = 0, hoePreparationATS = 0, axePreparationATS = 0, pickaxePreparationATS = 0, fistsPreparationATS = 0, shovelPreparationATS = 0, swordsPreparationATS = 0;
+		private int berserkTicks = 0, bleedticks = 0, greenTerraTicks = 0, gigaDrillBreakerTicks = 0, superBreakerTicks = 0, serratedStrikesTicks = 0, skullSplitterTicks = 0, treeFellerTicks = 0;
 		//ATS = (Time of) Activation Time Stamp
 		//DATS = (Time of) Deactivation Time Stamp
 		Player thisplayer;
@@ -420,10 +420,12 @@ class PlayerList
 		//Output:	Player: The player this profile belongs to
 		//Use:		Finds if this profile belongs to a specified player
 		//=====================================================================
-		public boolean isPlayer(Player player)
+		public boolean isPlayer(String player)
 		{
-			return player.getName().equals(playerName);
+			return player.equals(playerName);
 		}
+		public boolean getPartyChatOnlyToggle(){return partyChatOnly;}
+		public void togglePartyChatOnly(){partyChatOnly = !partyChatOnly;}
 		public boolean getAbilityUse(){
 			return abilityuse;
 		}
@@ -434,6 +436,12 @@ class PlayerList
 				abilityuse = false;
 			}
 		}
+		public long getMySpawnATS(){
+			return mySpawnATS;
+		}
+		public void setMySpawnATS(long newvalue){
+			mySpawnATS = newvalue;
+		}
 		public void decreaseBleedTicks(){
 			if(bleedticks >= 1){
 				bleedticks--;
@@ -461,6 +469,22 @@ class PlayerList
 		public long getArcheryShotATS() {return archeryShotATS;}
 		public void setArcheryShotATS(long newvalue) {archeryShotATS = newvalue;}
 		
+		/*
+		 * HOE PREPARATION
+		 */
+		public boolean getHoePreparationMode(){
+			return hoePreparationMode;
+		}
+		public void setHoePreparationMode(Boolean bool){
+			hoePreparationMode = bool;
+		}
+		public long getHoePreparationATS(){
+			return hoePreparationATS;
+		}
+		public void setHoePreparationATS(long newvalue){
+			hoePreparationATS = newvalue;
+		}
+		
 		/*
 		 * SWORDS PREPARATION
 		 */
@@ -536,6 +560,35 @@ class PlayerList
 		public void setPickaxePreparationATS(long newvalue){
 			pickaxePreparationATS = newvalue;
 		}
+		/*
+		 * GREEN TERRA MODE
+		 */
+		public boolean getGreenTerraInformed() {return greenTerraInformed;}
+		public void setGreenTerraInformed(Boolean bool){
+			greenTerraInformed = bool;
+		}
+		public boolean getGreenTerraMode(){
+			return greenTerraMode;
+		}
+		public void setGreenTerraMode(Boolean bool){
+			greenTerraMode = bool;
+		}
+		public long getGreenTerraActivatedTimeStamp() {return greenTerraATS;}
+		public void setGreenTerraActivatedTimeStamp(Long newvalue){
+			greenTerraATS = newvalue;
+		}
+		public long getGreenTerraDeactivatedTimeStamp() {return greenTerraDATS;}
+		public void setGreenTerraDeactivatedTimeStamp(Long newvalue){
+			greenTerraDATS = newvalue;
+		}
+		public void setGreenTerraCooldown(Long newvalue){
+			greenTerraCooldown = newvalue;
+		}
+		public long getGreenTerraCooldown(){
+			return greenTerraCooldown;
+		}
+		public void setGreenTerraTicks(Integer newvalue){greenTerraTicks = newvalue;}
+		public int getGreenTerraTicks(){return greenTerraTicks;}
 		/*
 		 * BERSERK MODE
 		 */
@@ -1472,7 +1525,9 @@ class PlayerList
 				axesgather = String.valueOf(Integer.valueOf(axesgather)+newvalue);
 			}
 			save();
+			if(isPlayer(playerName)){
 			mcSkills.getInstance().XpCheck(thisplayer);
+			}
 		}
 		public void modifyskill(int newvalue, String skillname){
 			if(skillname.toLowerCase().equals("mining")){
@@ -1553,30 +1608,6 @@ class PlayerList
 				return 0;
 			}
 		}
-		public int getPowerLevel(){
-			int x = 0;
-			if(mcPermissions.getInstance().mining(thisplayer))
-				x+=getMiningInt();
-			if(mcPermissions.getInstance().woodcutting(thisplayer))
-				x+=getWoodCuttingInt();
-			if(mcPermissions.getInstance().unarmed(thisplayer))
-				x+=getUnarmedInt();
-			if(mcPermissions.getInstance().herbalism(thisplayer))
-				x+=getHerbalismInt();
-			if(mcPermissions.getInstance().excavation(thisplayer))
-				x+=getExcavationInt();
-			if(mcPermissions.getInstance().archery(thisplayer))
-				x+=getArcheryInt();
-			if(mcPermissions.getInstance().swords(thisplayer))
-				x+=getSwordsInt();
-			if(mcPermissions.getInstance().axes(thisplayer))
-				x+=getAxesInt();
-			if(mcPermissions.getInstance().acrobatics(thisplayer))
-				x+=getAcrobaticsInt();
-			if(mcPermissions.getInstance().repair(thisplayer))
-				x+=getRepairInt();
-			return x;
-		}
 		public int getMiningGatherInt() {
 			if(isInt(gather)){
 			return Integer.parseInt(gather);
@@ -1654,9 +1685,9 @@ class PlayerList
                 public Location getMySpawn(Player player){
                 	Location loc = player.getWorld().getSpawnLocation();
                 	if(isDouble(getX()) && isDouble(getY()) && isDouble(getX())){
-            		loc.setX(Double.parseDouble(mcUsers.getProfile(player).getX()));
-            		loc.setY(Double.parseDouble(mcUsers.getProfile(player).getY()));
-            		loc.setZ(Double.parseDouble(mcUsers.getProfile(player).getZ()));
+            		loc.setX(Double.parseDouble(mcUsers.getProfile(player.getName()).getX()));
+            		loc.setY(Double.parseDouble(mcUsers.getProfile(player.getName()).getY()));
+            		loc.setZ(Double.parseDouble(mcUsers.getProfile(player.getName()).getZ()));
                 	} else {
                 		return null;
                 	}

+ 13 - 6
mcMMO/com/gmail/nossr50/mcWoodCutting.java

@@ -8,6 +8,7 @@ import org.bukkit.Material;
 import org.bukkit.block.Block;
 import org.bukkit.entity.Player;
 import org.bukkit.inventory.ItemStack;
+import org.bukkit.plugin.Plugin;
 
 import com.gmail.nossr50.PlayerList.PlayerProfile;
 
@@ -27,17 +28,18 @@ public class mcWoodCutting {
     	return instance;
     	}
     public void woodCuttingProcCheck(Player player, Block block){
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
     	byte type = block.getData();
     	Material mat = Material.getMaterial(block.getTypeId());
     	if(player != null){
-    		if(Math.random() * 1000 <= mcUsers.getProfile(player).getWoodCuttingInt()){
+    		if(Math.random() * 1000 <= PP.getWoodCuttingInt()){
     			ItemStack item = new ItemStack(mat, 1, (short) 0, type);
     			block.getWorld().dropItemNaturally(block.getLocation(), item);
     		}
     	}
     }
-    public void treeFellerCheck(Player player, Block block){
-    	PlayerProfile PP = mcUsers.getProfile(player);
+    public void treeFellerCheck(Player player, Block block, Plugin pluginx){
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
     	if(mcm.getInstance().isAxes(player.getItemInHand())){
     		if(block != null){
         		if(!mcm.getInstance().abilityBlockCheck(block))
@@ -50,7 +52,7 @@ public class mcWoodCutting {
     			PP.setAxePreparationMode(false);
     		}
     		int ticks = 2;
-    		int x = mcUsers.getProfile(player).getWoodCuttingInt();
+    		int x = PP.getWoodCuttingInt();
     		while(x >= 50){
     			x-=50;
     			ticks++;
@@ -58,6 +60,10 @@ public class mcWoodCutting {
 
     		if(!PP.getTreeFellerMode() && mcSkills.getInstance().cooldownOver(player, PP.getTreeFellerDeactivatedTimeStamp(), mcLoadProperties.treeFellerCooldown)){
     			player.sendMessage(ChatColor.GREEN+"**TREE FELLING ACTIVATED**");
+    			for(Player y : pluginx.getServer().getOnlinePlayers()){
+	    			if(y != null && y != player && mcm.getInstance().getDistance(player.getLocation(), y.getLocation()) < 10)
+	    				y.sendMessage(ChatColor.GREEN+player.getName()+ChatColor.DARK_GREEN+" has used "+ChatColor.RED+"Tree Feller!");
+	    		}
     			PP.setTreeFellerTicks(ticks * 1000);
     			PP.setTreeFellerActivatedTimeStamp(System.currentTimeMillis());
     			PP.setTreeFellerMode(true);
@@ -69,10 +75,11 @@ public class mcWoodCutting {
     	}
     }
     public void treeFeller(Block block, Player player){
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
     	int radius = 1;
-    	if(mcUsers.getProfile(player).getWoodCuttingGatherInt() >= 500)
+    	if(PP.getWoodCuttingGatherInt() >= 500)
     		radius++;
-    	if(mcUsers.getProfile(player).getWoodCuttingGatherInt() >= 950)
+    	if(PP.getWoodCuttingGatherInt() >= 950)
     		radius++;
         ArrayList<Block> blocklist = new ArrayList<Block>();
         ArrayList<Block> toAdd = new ArrayList<Block>();

+ 97 - 47
mcMMO/com/gmail/nossr50/mcm.java

@@ -14,11 +14,14 @@ import org.bukkit.event.player.PlayerChatEvent;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.plugin.Plugin;
 
+import com.gmail.nossr50.PlayerList.PlayerProfile;
+
 public class mcm {
 	/*
 	 * I'm storing my functions/methods in here in an unorganized manner. Spheal with it.
 	 */
 	private static mcMMO plugin;
+	private static mcMMO pluginx;
 	public mcm(mcMMO instance) {
     	plugin = instance;
     }
@@ -30,7 +33,31 @@ public class mcm {
     	return instance;
     }
 	
-	
+	public int getPowerLevel(Player player){
+		PlayerProfile PP = mcUsers.getProfile(player.getName());
+		int x = 0;
+		if(mcPermissions.getInstance().mining(player))
+			x+=PP.getMiningInt();
+		if(mcPermissions.getInstance().woodcutting(player))
+			x+=PP.getWoodCuttingInt();
+		if(mcPermissions.getInstance().unarmed(player))
+			x+=PP.getUnarmedInt();
+		if(mcPermissions.getInstance().herbalism(player))
+			x+=PP.getHerbalismInt();
+		if(mcPermissions.getInstance().excavation(player))
+			x+=PP.getExcavationInt();
+		if(mcPermissions.getInstance().archery(player))
+			x+=PP.getArcheryInt();
+		if(mcPermissions.getInstance().swords(player))
+			x+=PP.getSwordsInt();
+		if(mcPermissions.getInstance().axes(player))
+			x+=PP.getAxesInt();
+		if(mcPermissions.getInstance().acrobatics(player))
+			x+=PP.getAcrobaticsInt();
+		if(mcPermissions.getInstance().repair(player))
+			x+=PP.getRepairInt();
+		return x;
+	}
 	public boolean blockBreakSimulate(Block block, Player player, Plugin plugin){
 
     	FakeBlockBreakEvent event = new FakeBlockBreakEvent(block, player);
@@ -180,7 +207,7 @@ public class mcm {
 	}
 	public boolean shouldBeWatched(Block block){
 		int id = block.getTypeId();
-		if(id == 17 || id == 42 || id == 87 || id == 89 || id == 2 || id == 3 || id == 12 || id == 13 || id == 21 || id == 15 || id == 14 || id == 56 || id == 38 || id == 37 || id == 39 || id == 40 || id == 24){
+		if(id == 49 || id == 81 || id == 83 || id == 86 || id == 91 || id == 1 || id == 17 || id == 42 || id == 87 || id == 89 || id == 2 || id == 3 || id == 12 || id == 13 || id == 21 || id == 15 || id == 14 || id == 56 || id == 38 || id == 37 || id == 39 || id == 40 || id == 24){
 			return true;
 		} else {
 			return false;
@@ -277,11 +304,12 @@ public class mcm {
     	}
     }
     public void mcmmoHelpCheck(String[] split, Player player, PlayerChatEvent event){
+    	PlayerProfile PP = mcUsers.getProfile(player.getName());
     	if(split[0].equalsIgnoreCase("/woodcutting")){
 			event.setCancelled(true);
-			float skillvalue = (float)mcUsers.getProfile(player).getWoodCuttingInt();
+			float skillvalue = (float)PP.getWoodCuttingInt();
 			int ticks = 2;
-			int x = mcUsers.getProfile(player).getWoodCuttingInt();
+			int x = PP.getWoodCuttingInt();
     		while(x >= 50){
     			x-=50;
     			ticks++;
@@ -299,33 +327,33 @@ public class mcm {
     	if(split[0].equalsIgnoreCase("/archery")){
 			event.setCancelled(true);
 			Integer rank = 0;
-			if(mcUsers.getProfile(player).getArcheryInt() >= 50)
+			if(PP.getArcheryInt() >= 50)
     			rank++;
-    		if(mcUsers.getProfile(player).getArcheryInt() >= 250)
+    		if(PP.getArcheryInt() >= 250)
     			rank++;
-    		if(mcUsers.getProfile(player).getArcheryInt() >= 575)
+    		if(PP.getArcheryInt() >= 575)
     			rank++;
-    		if(mcUsers.getProfile(player).getArcheryInt() >= 725)
+    		if(PP.getArcheryInt() >= 725)
     			rank++;
-    		if(mcUsers.getProfile(player).getArcheryInt() >= 1000)
+    		if(PP.getArcheryInt() >= 1000)
     			rank++;
-			float skillvalue = (float)mcUsers.getProfile(player).getArcheryInt();
+			float skillvalue = (float)PP.getArcheryInt();
     		String percentage = String.valueOf((skillvalue / 1000) * 100);
     		
     		int ignition = 20;
-			if(mcUsers.getProfile(player).getArcheryInt() >= 200)
+			if(PP.getArcheryInt() >= 200)
 				ignition+=20;
-			if(mcUsers.getProfile(player).getArcheryInt() >= 400)
+			if(PP.getArcheryInt() >= 400)
 				ignition+=20;
-			if(mcUsers.getProfile(player).getArcheryInt() >= 600)
+			if(PP.getArcheryInt() >= 600)
 				ignition+=20;
-			if(mcUsers.getProfile(player).getArcheryInt() >= 800)
+			if(PP.getArcheryInt() >= 800)
 				ignition+=20;
-			if(mcUsers.getProfile(player).getArcheryInt() >= 1000)
+			if(PP.getArcheryInt() >= 1000)
 				ignition+=20;
 			
     		String percentagedaze;
-			if(mcUsers.getProfile(player).getArcheryInt() < 1000){
+			if(PP.getArcheryInt() < 1000){
 				percentagedaze = String.valueOf((skillvalue / 2000) * 100);
 			} else {
 				percentagedaze = "50";
@@ -346,14 +374,14 @@ public class mcm {
     	if(split[0].equalsIgnoreCase("/axes")){
 			event.setCancelled(true);
 			String percentage;
-			float skillvalue = (float)mcUsers.getProfile(player).getAxesInt();
-			if(mcUsers.getProfile(player).getAxesInt() < 750){
+			float skillvalue = (float)PP.getAxesInt();
+			if(PP.getAxesInt() < 750){
 				percentage = String.valueOf((skillvalue / 1000) * 100);
 			} else {
 				percentage = "75";
 			}
 			int ticks = 2;
-			int x = mcUsers.getProfile(player).getAxesInt();
+			int x = PP.getAxesInt();
     		while(x >= 50){
     			x-=50;
     			ticks++;
@@ -367,7 +395,7 @@ public class mcm {
 			player.sendMessage(ChatColor.DARK_AQUA+"Axe Mastery (500 SKILL): "+ChatColor.GREEN+"Modifies Damage");
 			player.sendMessage(ChatColor.RED+"---[]"+ChatColor.GREEN+"YOUR STATS"+ChatColor.RED+"[]---");
 			player.sendMessage(ChatColor.RED+"Chance to crtically strike: "+ChatColor.YELLOW+percentage+"%");
-			if(mcUsers.getProfile(player).getAxesInt() < 500){
+			if(PP.getAxesInt() < 500){
 				player.sendMessage(ChatColor.GRAY+"LOCKED UNTIL 500+ SKILL (AXEMASTERY)");
 			} else {
 				player.sendMessage(ChatColor.RED+"Axe Mastery:"+ChatColor.YELLOW+" Bonus 4 damage");
@@ -378,8 +406,8 @@ public class mcm {
 			event.setCancelled(true);
 			int bleedrank = 2;
 			String percentage, parrypercentage = null, counterattackpercentage;
-			float skillvalue = (float)mcUsers.getProfile(player).getSwordsInt();
-			if(mcUsers.getProfile(player).getSwordsInt() < 750){
+			float skillvalue = (float)PP.getSwordsInt();
+			if(PP.getSwordsInt() < 750){
 				percentage = String.valueOf((skillvalue / 1000) * 100);
 			} else {
 				percentage = "75";
@@ -387,20 +415,20 @@ public class mcm {
 			if(skillvalue >= 750)
 				bleedrank+=1;
 			
-			if(mcUsers.getProfile(player).getSwordsInt() <= 900){
+			if(PP.getSwordsInt() <= 900){
 				parrypercentage = String.valueOf((skillvalue / 3000) * 100);
 			} else {
 				parrypercentage = "30";
 			}
 			
-			if(mcUsers.getProfile(player).getSwordsInt() <= 600){
+			if(PP.getSwordsInt() <= 600){
 				counterattackpercentage = String.valueOf((skillvalue / 2000) * 100);
 			} else {
 				counterattackpercentage = "30";
 			}
 			
 			int ticks = 2;
-			int x = mcUsers.getProfile(player).getSwordsInt();
+			int x = PP.getSwordsInt();
     		while(x >= 50){
     			x-=50;
     			ticks++;
@@ -426,10 +454,10 @@ public class mcm {
     	if(split[0].equalsIgnoreCase("/acrobatics")){
 			event.setCancelled(true);
 			String dodgepercentage;
-			float skillvalue = (float)mcUsers.getProfile(player).getAcrobaticsInt();
+			float skillvalue = (float)PP.getAcrobaticsInt();
     		String percentage = String.valueOf((skillvalue / 1000) * 100);
     		String gracepercentage = String.valueOf(((skillvalue / 1000) * 100) * 2);
-    		if(mcUsers.getProfile(player).getAcrobaticsInt() <= 800){
+    		if(PP.getAcrobaticsInt() <= 800){
     			dodgepercentage = String.valueOf((skillvalue / 4000 * 100));
     		} else {
     			dodgepercentage = "20";
@@ -446,10 +474,10 @@ public class mcm {
 			player.sendMessage(ChatColor.RED+"Dodge Chance: "+ChatColor.YELLOW+dodgepercentage+"%");
     	}
     	if(split[0].equalsIgnoreCase("/mining")){
-    		float skillvalue = (float)mcUsers.getProfile(player).getMiningInt();
+    		float skillvalue = (float)PP.getMiningInt();
     		String percentage = String.valueOf((skillvalue / 1000) * 100);
     		int ticks = 2;
-    		int x = mcUsers.getProfile(player).getMiningInt();
+    		int x = PP.getMiningInt();
     		while(x >= 50){
     			x-=50;
     			ticks++;
@@ -465,7 +493,7 @@ public class mcm {
 			player.sendMessage(ChatColor.RED+"Super Breaker Length: "+ChatColor.YELLOW+ticks+"s");
     	}
     	if(split[0].equalsIgnoreCase("/repair")){
-    		float skillvalue = (float)mcUsers.getProfile(player).getRepairInt();
+    		float skillvalue = (float)PP.getRepairInt();
     		String percentage = String.valueOf((skillvalue / 1000) * 100);
     		String repairmastery = String.valueOf((skillvalue / 500) * 100);
 			event.setCancelled(true);
@@ -483,15 +511,15 @@ public class mcm {
     	if(split[0].equalsIgnoreCase("/unarmed")){
 			event.setCancelled(true);
 			String percentage, arrowpercentage;
-			float skillvalue = (float)mcUsers.getProfile(player).getUnarmedInt();
+			float skillvalue = (float)PP.getUnarmedInt();
 			
-			if(mcUsers.getProfile(player).getUnarmedInt() < 1000){
+			if(PP.getUnarmedInt() < 1000){
 				percentage = String.valueOf((skillvalue / 4000) * 100);
 			} else {
 				percentage = "25";
 			}
 			
-			if(mcUsers.getProfile(player).getUnarmedInt() < 1000){
+			if(PP.getUnarmedInt() < 1000){
 				arrowpercentage = String.valueOf(((skillvalue / 1000) * 100) / 2);
 			} else {
 				arrowpercentage = "50";
@@ -499,7 +527,7 @@ public class mcm {
 			
 			
 			int ticks = 2;
-			int x = mcUsers.getProfile(player).getUnarmedInt();
+			int x = PP.getUnarmedInt();
     		while(x >= 50){
     			x-=50;
     			ticks++;
@@ -516,9 +544,9 @@ public class mcm {
 			player.sendMessage(ChatColor.RED+"---[]"+ChatColor.GREEN+"YOUR STATS"+ChatColor.RED+"[]---");
 			player.sendMessage(ChatColor.RED+"Arrow Deflect Chance: "+ChatColor.YELLOW+arrowpercentage+"%");
 			player.sendMessage(ChatColor.RED+"Disarm Chance: "+ChatColor.YELLOW+percentage+"%");
-			if(mcUsers.getProfile(player).getUnarmedInt() < 250){
+			if(PP.getUnarmedInt() < 250){
 				player.sendMessage(ChatColor.GRAY+"LOCKED UNTIL 250+ SKILL (UNARMED APPRENTICE)");
-			} else if(mcUsers.getProfile(player).getUnarmedInt() >= 250 && mcUsers.getProfile(player).getUnarmedInt() < 500){
+			} else if(PP.getUnarmedInt() >= 250 && PP.getUnarmedInt() < 500){
 				player.sendMessage(ChatColor.RED+"Unarmed Apprentice: "+ChatColor.YELLOW+"Damage Upgrade");
 				player.sendMessage(ChatColor.GRAY+"LOCKED UNTIL 500+ SKILL (UNARMED MASTERY)");
 			} else {
@@ -529,37 +557,59 @@ public class mcm {
     	if(split[0].equalsIgnoreCase("/herbalism")){
 			event.setCancelled(true);
 			int rank = 0;
-			if(mcUsers.getProfile(player).getHerbalismInt() >= 50)
+			if(PP.getHerbalismInt() >= 50)
     			rank++;
-    		if (mcUsers.getProfile(player).getHerbalismInt() >= 150)
+    		if (PP.getHerbalismInt() >= 150)
     			rank++;
-    		if (mcUsers.getProfile(player).getHerbalismInt() >= 250)
+    		if (PP.getHerbalismInt() >= 250)
     			rank++;
-    		if (mcUsers.getProfile(player).getHerbalismInt() >= 350)
+    		if (PP.getHerbalismInt() >= 350)
     			rank++;
-    		if (mcUsers.getProfile(player).getHerbalismInt() >= 450)
+    		if (PP.getHerbalismInt() >= 450)
     			rank++;
-    		if (mcUsers.getProfile(player).getHerbalismInt() >= 550)
+    		if (PP.getHerbalismInt() >= 550)
     			rank++;
-    		if (mcUsers.getProfile(player).getHerbalismInt() >= 650)
+    		if (PP.getHerbalismInt() >= 650)
     			rank++;
-    		if (mcUsers.getProfile(player).getHerbalismInt() >= 750)
+    		if (PP.getHerbalismInt() >= 750)
     			rank++;
-			float skillvalue = (float)mcUsers.getProfile(player).getHerbalismInt();
+    		int bonus = 0;
+    		if(PP.getHerbalismInt() >= 200)
+    			bonus++;
+    		if(PP.getHerbalismInt() >= 400)
+    			bonus++;
+    		if(PP.getHerbalismInt() >= 600)
+    			bonus++;
+    		
+    		int ticks = 2;
+			int x = PP.getHerbalismInt();
+    		while(x >= 50){
+    			x-=50;
+    			ticks++;
+    		}
+    		
+			float skillvalue = (float)PP.getHerbalismInt();
     		String percentage = String.valueOf((skillvalue / 1000) * 100);
+    		String gpercentage = String.valueOf((skillvalue / 1500) * 100);
 			player.sendMessage(ChatColor.RED+"-----[]"+ChatColor.GREEN+"HERBALISM"+ChatColor.RED+"[]-----");
 			player.sendMessage(ChatColor.DARK_GRAY+"XP GAIN: "+ChatColor.WHITE+"Harvesting Herbs");
 			player.sendMessage(ChatColor.RED+"---[]"+ChatColor.GREEN+"EFFECTS"+ChatColor.RED+"[]---");
+			player.sendMessage(ChatColor.DARK_AQUA+"Green Terra (ABILITY): "+ChatColor.GREEN+"Spread the Terra, 3x Drops");
+			player.sendMessage(ChatColor.DARK_AQUA+"Green Thumb (Wheat): "+ChatColor.GREEN+"Auto-Plants wheat when harvesting");
+			player.sendMessage(ChatColor.DARK_AQUA+"Green Thumb (Cobble): "+ChatColor.GREEN+"Cobblestone -> Mossy w/ Seeds");
 			player.sendMessage(ChatColor.DARK_AQUA+"Food+: "+ChatColor.GREEN+"Modifies health received from bread/stew");
-			player.sendMessage(ChatColor.DARK_AQUA+"Double Drops (Wheat): "+ChatColor.GREEN+"Double the normal loot");
+			player.sendMessage(ChatColor.DARK_AQUA+"Double Drops (All Herbs): "+ChatColor.GREEN+"Double the normal loot");
 			player.sendMessage(ChatColor.RED+"---[]"+ChatColor.GREEN+"YOUR STATS"+ChatColor.RED+"[]---");
+			player.sendMessage(ChatColor.RED+"Green Terra Length: "+ChatColor.YELLOW+ticks+"s");
+			player.sendMessage(ChatColor.RED+"Green Thumb Chance: "+gpercentage+"%");
+			player.sendMessage(ChatColor.RED+"Green Thumb Stage: Wheat grows in stage "+bonus);
 			player.sendMessage(ChatColor.RED+"Double Drop Chance: "+percentage+"%");
 			player.sendMessage(ChatColor.RED+"Food+ (Rank"+rank+"): Bonus "+rank+" healing");
     	}
     	if(split[0].equalsIgnoreCase("/excavation")){
 			event.setCancelled(true);
 			int ticks = 2;
-			int x = mcUsers.getProfile(player).getExcavationInt();
+			int x = PP.getExcavationInt();
     		while(x >= 50){
     			x-=50;
     			ticks++;

+ 1 - 1
mcMMO/plugin.yml

@@ -1,3 +1,3 @@
 name: mcMMO
 main: com.gmail.nossr50.mcMMO
-version: 0.9.21
+version: 0.9.25