浏览代码

Version 1.1.17

nossr50 13 年之前
父节点
当前提交
bb276209b5

+ 9 - 0
src/Changelog.txt

@@ -1,7 +1,16 @@
 Changelog:
 #Versions without changelogs probably had very small misc fixes, like tweaks to the source code
 Version 1.1.17
+XP gained in combat is now softcapped by the remaining health of the entity you are damaging, preventing many exploits.
+Compiled against latest Spout & CraftBukkit
+Added World PVP check to Ignition, should no longer ignore PVP settings
+Enemies should no longer grant XP when hit during their death
+Fixed an exploit that led to unlimited ability use
+Possibly fixed a bug where the same player would be listed multiple times in mctop
+Added author and description to plugin.yml
+
 /mmoedit and /addxp are useable from the console now
+Swearword's statistics tracking removed (He stopped the service, so its gone now.. On a positive note, I did find out 1000-1500 servers installed mcMMO a day)
 
 Version 1.1.16
 Added Melons to Herbalism xp tables

+ 87 - 40
src/com/gmail/nossr50/Combat.java

@@ -102,48 +102,69 @@ public class Combat
 			    					&& ((PPd.getLastLogin()+5)*1000) < System.currentTimeMillis()
 			    					&& defender.getHealth() >= 1)
 			    			{
-			    				int xp = (int) (event.getDamage() * 2 * LoadProperties.pvpxprewardmodifier);
+			    				//Prevent a ridiculous amount of XP being granted by capping it at the remaining health of the mob
+				      			int hpLeft = defender.getHealth(), xpinc = 0;
+				      			
+				      			if(hpLeft < event.getDamage())
+				      				xpinc = event.getDamage();
+				      			else
+				      				xpinc = hpLeft;
+				      			
+			    				int xp = (int) (xpinc * 2 * LoadProperties.pvpxprewardmodifier);
 			    				
 				    			if(m.isAxes(attacker.getItemInHand()) && mcPermissions.getInstance().axes(attacker))
-				    				PPa.addXP(SkillType.AXES, xp*10);
+				    				PPa.addXP(SkillType.AXES, xp*10, attacker);
 				    			if(m.isSwords(attacker.getItemInHand()) && mcPermissions.getInstance().swords(attacker))
-				    				PPa.addXP(SkillType.SWORDS, xp*10);
+				    				PPa.addXP(SkillType.SWORDS, xp*10, attacker);
 				    			if(attacker.getItemInHand().getTypeId() == 0 && mcPermissions.getInstance().unarmed(attacker))
-				    				PPa.addXP(SkillType.UNARMED, xp*10);
+				    				PPa.addXP(SkillType.UNARMED, xp*10, attacker);
 			    			}
 			    		}
 		      		}
 		      		
 		      		if(event.getEntity() instanceof Monster && !pluginx.misc.mobSpawnerList.contains(event.getEntity()))
 		      		{
+		      			//Prevent XP from being handed out if the Monster is dead
+		      			Monster monster = (Monster)event.getEntity();
+		      			if(monster.getHealth() < 1)
+		      				return;
+		      			
+		      			//Prevent a ridiculous amount of XP being granted by capping it at the remaining health of the mob
+		      			int hpLeft = monster.getHealth(), xpinc = 0;
+		      			
+		      			if(hpLeft < event.getDamage())
+		      				xpinc = event.getDamage();
+		      			else
+		      				xpinc = hpLeft;
+		      			
 		      			int xp = 0;
 		      			if(event.getEntity() instanceof Enderman)
-		      				xp = (event.getDamage() * 3);
+		      				xp = (xpinc * 3);
 		      			if(event.getEntity() instanceof Creeper)
-							xp = (event.getDamage() * 4);
+							xp = (xpinc * 4);
 		      			if(event.getEntity() instanceof Silverfish)
-		      				xp = (event.getDamage() * 3);
+		      				xp = (xpinc * 3);
 		      			if(event.getEntity() instanceof CaveSpider)
-		      				xp = (event.getDamage() * 3);
+		      				xp = (xpinc * 3);
 						if(event.getEntity() instanceof Spider)
-							xp = (event.getDamage() * 3);
+							xp = (xpinc * 3);
 						if(event.getEntity() instanceof Skeleton)
-							xp = (event.getDamage() * 2);
+							xp = (xpinc * 2);
 						if(event.getEntity() instanceof Zombie)
-							xp = (event.getDamage() * 2);
+							xp = (xpinc * 2);
 						if(event.getEntity() instanceof PigZombie)
-							xp = (event.getDamage() * 3);
+							xp = (xpinc * 3);
 						if(event.getEntity() instanceof Slime)
-							xp = (event.getDamage() * 3);
+							xp = (xpinc * 3);
 						if(event.getEntity() instanceof Ghast)
-							xp = (event.getDamage() * 3);
+							xp = (xpinc * 3);
 
 						if(m.isSwords(attacker.getItemInHand()) && mcPermissions.getInstance().swords(attacker))
-							PPa.addXP(SkillType.SWORDS, xp*10);
+							PPa.addXP(SkillType.SWORDS, xp*10, attacker);
 						else if(m.isAxes(attacker.getItemInHand()) && mcPermissions.getInstance().axes(attacker))
-							PPa.addXP(SkillType.AXES, xp*10);
+							PPa.addXP(SkillType.AXES, xp*10, attacker);
 						else if(attacker.getItemInHand().getTypeId() == 0 && mcPermissions.getInstance().unarmed(attacker))
-							PPa.addXP(SkillType.UNARMED, xp*10);
+							PPa.addXP(SkillType.UNARMED, xp*10, attacker);
 		      		}
 		      		Skills.XpCheckAll(attacker);
 		      		
@@ -214,32 +235,45 @@ public class Combat
 						int xp = 0;
 						if(event.getEntity() instanceof Monster)
 						{
+							//Prevent XP from being handed out if the Monster is dead
+			      			Monster monster = (Monster)event.getEntity();
+			      			if(monster.getHealth() < 1)
+			      				return;
+			      			
+			      			//Prevent a ridiculous amount of XP being granted by capping it at the remaining health of the mob
+			      			int hpLeft = monster.getHealth(), xpinc = 0;
+			      			
+			      			if(hpLeft < event.getDamage())
+			      				xpinc = event.getDamage();
+			      			else
+			      				xpinc = hpLeft;
+			      			
 			      			if(event.getEntity() instanceof Creeper)
-								xp = (event.getDamage() * 6);
+								xp = (xpinc * 6);
 			      			if(event.getEntity() instanceof Enderman)
-			      				xp = (event.getDamage() * 5);
+			      				xp = (xpinc * 5);
 			      			if(event.getEntity() instanceof Silverfish)
-			      				xp = (event.getDamage() * 3);
+			      				xp = (xpinc * 3);
 			      			if(event.getEntity() instanceof CaveSpider)
-			      				xp = (event.getDamage() * 3);
+			      				xp = (xpinc * 3);
 							if(event.getEntity() instanceof Spider)
-								xp = (event.getDamage() * 5);
+								xp = (xpinc * 5);
 							if(event.getEntity() instanceof Skeleton)
-								xp = (event.getDamage() * 3);
+								xp = (xpinc * 3);
 							if(event.getEntity() instanceof Zombie)
-								xp = (event.getDamage() * 3);
+								xp = (xpinc * 3);
 							if(event.getEntity() instanceof PigZombie)
-								xp = (event.getDamage() * 4);
+								xp = (xpinc * 4);
 							if(event.getEntity() instanceof Slime)
-								xp = (event.getDamage() * 4);
+								xp = (xpinc * 4);
 							if(event.getEntity() instanceof Ghast)
-								xp = (event.getDamage() * 4);
-							Users.getProfile(master).addXP(SkillType.TAMING, xp*10);
+								xp = (xpinc * 4);
+							Users.getProfile(master).addXP(SkillType.TAMING, xp*10, master);
 						}
 						if(event.getEntity() instanceof Player)
 						{
 							xp = (event.getDamage() * 2);
-							Users.getProfile(master).addXP(SkillType.TAMING, xp*10);
+							Users.getProfile(master).addXP(SkillType.TAMING, xp*10, master);
 						}
 						Skills.XpCheckSkill(SkillType.TAMING, master);
 					}
@@ -348,27 +382,40 @@ public class Combat
     		 */
     		if(!pluginx.misc.mobSpawnerList.contains(x) && x instanceof Monster)
     		{
+    			//Prevent XP from being handed out if the Monster is dead
+      			Monster monster = (Monster)x;
+      			if(monster.getHealth() < 1)
+      				return;
+      			
+      			//Prevent a ridiculous amount of XP being granted by capping it at the remaining health of the mob
+      			int hpLeft = monster.getHealth(), xpinc = 0;
+      			
+      			if(hpLeft < event.getDamage())
+      				xpinc = event.getDamage();
+      			else
+      				xpinc = hpLeft;
+      			
     			//XP
     			if(x instanceof Creeper)
-    				PPa.addXP(SkillType.ARCHERY, (event.getDamage() * 4)*10);
+    				PPa.addXP(SkillType.ARCHERY, (xpinc * 4)*10, attacker);
     			if(x instanceof Enderman)
-    				PPa.addXP(SkillType.ARCHERY, (event.getDamage() * 3)*10);
+    				PPa.addXP(SkillType.ARCHERY, (xpinc * 3)*10, attacker);
     			if(x instanceof Silverfish)
-    				PPa.addXP(SkillType.ARCHERY, (event.getDamage() * 2)*10);
+    				PPa.addXP(SkillType.ARCHERY, (xpinc * 2)*10, attacker);
     			if(x instanceof CaveSpider)
-    				PPa.addXP(SkillType.ARCHERY, (event.getDamage() * 3)*10);
+    				PPa.addXP(SkillType.ARCHERY, (xpinc * 3)*10, attacker);
 				if(x instanceof Spider)
-					PPa.addXP(SkillType.ARCHERY, (event.getDamage() * 3)*10);
+					PPa.addXP(SkillType.ARCHERY, (xpinc * 3)*10, attacker);
 				if(x instanceof Skeleton)
-					PPa.addXP(SkillType.ARCHERY, (event.getDamage() * 2)*10);
+					PPa.addXP(SkillType.ARCHERY, (xpinc * 2)*10, attacker);
 				if(x instanceof Zombie)
-					PPa.addXP(SkillType.ARCHERY, (event.getDamage() * 2)*10);
+					PPa.addXP(SkillType.ARCHERY, (xpinc * 2)*10, attacker);
 				if(x instanceof PigZombie)
-					PPa.addXP(SkillType.ARCHERY, (event.getDamage() * 3)*10);
+					PPa.addXP(SkillType.ARCHERY, (xpinc * 3)*10, attacker);
 				if(x instanceof Slime)
-					PPa.addXP(SkillType.ARCHERY, (event.getDamage() * 3)*10);
+					PPa.addXP(SkillType.ARCHERY, (xpinc * 3)*10, attacker);
 				if(x instanceof Ghast)
-					PPa.addXP(SkillType.ARCHERY, (event.getDamage() * 3)*10);
+					PPa.addXP(SkillType.ARCHERY, (xpinc * 3)*10, attacker);
     		}
     		/*
     		 * Attacker is Player
@@ -394,7 +441,7 @@ public class Combat
     	    				&& ((PPd.getLastLogin()+5)*1000) < System.currentTimeMillis() && !attacker.getName().equals(defender.getName()))
     	    		{
     	    			int xp = (int) ((event.getDamage() * 2) * 10);
-    	    			PPa.addXP(SkillType.ARCHERY, xp);
+    	    			PPa.addXP(SkillType.ARCHERY, xp, attacker);
     	    		}
     				/*
     				 * DAZE PROC

+ 8 - 1
src/com/gmail/nossr50/Leaderboard.java

@@ -21,6 +21,7 @@ import java.io.File;
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -59,11 +60,17 @@ public class Leaderboard
         	FileReader file = new FileReader(location);
         	BufferedReader in = new BufferedReader(file);
         	String line = ""; //$NON-NLS-1$
+        	ArrayList<String> players = new ArrayList<String>();
         	while((line = in.readLine()) != null)
         	{
         		String[] character = line.split(":"); //$NON-NLS-1$
         		String p = character[0];
-
+        		
+        		//Prevent the same player from being added multiple times
+        		if(players.contains(p))
+        			continue;
+        		else
+        			players.add(p);
 
     			int Plvl = 0;
     			

+ 3 - 3
src/com/gmail/nossr50/command/Commands.java

@@ -953,7 +953,7 @@ public class Commands
 					if(isPlayer(split[1]) && m.isInt(split[3]) && Skills.isSkill(split[2]))
 					{
 						int newvalue = Integer.valueOf(split[3]);
-						Users.getProfile(getPlayer(split[1])).addXP(Skills.getSkillType(split[2]), newvalue);
+						Users.getProfile(getPlayer(split[1])).addXP(Skills.getSkillType(split[2]), newvalue, getPlayer(split[1]));
 						getPlayer(split[1]).sendMessage(ChatColor.GREEN+"Experience granted!"); 
 						player.sendMessage(ChatColor.RED+split[2]+" has been modified."); 
 						Skills.XpCheckAll(getPlayer(split[1]));
@@ -962,7 +962,7 @@ public class Commands
 				else if(split.length == 3 && m.isInt(split[2]) && Skills.isSkill(split[1]))
 				{
 					int newvalue = Integer.valueOf(split[2]);
-					Users.getProfile(player).addXP(Skills.getSkillType(split[1]), newvalue);
+					Users.getProfile(player).addXP(Skills.getSkillType(split[1]), newvalue, player);
 					player.sendMessage(ChatColor.RED+split[1]+" has been modified."); 
 				} else {
 					player.sendMessage(ChatColor.RED+"Usage is /"+LoadProperties.addxp+" playername skillname xp");  
@@ -977,7 +977,7 @@ public class Commands
 					if(isPlayer(split[1]) && m.isInt(split[3]) && Skills.isSkill(split[2]))
 					{
 						int newvalue = Integer.valueOf(split[3]);
-						Users.getProfile(getPlayer(split[1])).addXP(Skills.getSkillType(split[2]), newvalue);
+						Users.getProfile(getPlayer(split[1])).addXP(Skills.getSkillType(split[2]), newvalue, getPlayer(split[1]));
 						getPlayer(split[1]).sendMessage(ChatColor.GREEN+"Experience granted!"); 
 						System.out.println(split[2]+" has been modified for "+getPlayer(split[1]).getName()+".");
 						Skills.XpCheckAll(getPlayer(split[1]));

+ 4 - 1
src/com/gmail/nossr50/datatypes/PlayerProfile.java

@@ -27,6 +27,7 @@ import java.util.logging.Logger;
 
 
 import org.bukkit.Bukkit;
+import org.bukkit.GameMode;
 import org.bukkit.Location;
 import org.bukkit.entity.Player;
 import com.gmail.nossr50.config.LoadProperties;
@@ -949,8 +950,10 @@ public class PlayerProfile
 	 * @param skillType The skill to add XP to
 	 * @param newvalue The amount of XP to add
 	 */
-	public void addXP(SkillType skillType, int newvalue)
+	public void addXP(SkillType skillType, int newvalue, Player thisplayer)
 	{
+		if(thisplayer.getGameMode() == GameMode.CREATIVE)
+			return;
 		if(skillType == SkillType.ALL)
 		{
 			for(SkillType x : SkillType.values())

+ 7 - 7
src/com/gmail/nossr50/listeners/mcBlockListener.java

@@ -171,13 +171,13 @@ public class mcBlockListener extends BlockListener
 	    				WoodCutting.woodCuttingProcCheck(player, block);
 	    				//Default
 	    				if(block.getData() == (byte)0)
-	    					PP.addXP(SkillType.WOODCUTTING, LoadProperties.mpine);
+	    					PP.addXP(SkillType.WOODCUTTING, LoadProperties.mpine, player);
 	    				//Spruce
 	    				if(block.getData() == (byte)1)
-	    					PP.addXP(SkillType.WOODCUTTING, LoadProperties.mspruce);
+	    					PP.addXP(SkillType.WOODCUTTING, LoadProperties.mspruce, player);
 	    				//Birch
 	    				if(block.getData() == (byte)2)
-	    					PP.addXP(SkillType.WOODCUTTING, LoadProperties.mbirch);
+	    					PP.addXP(SkillType.WOODCUTTING, LoadProperties.mbirch, player);
 					}
     			}
     		} else 
@@ -187,13 +187,13 @@ public class mcBlockListener extends BlockListener
 	    			WoodCutting.woodCuttingProcCheck(player, block);
 	    			//Default
     				if(block.getData() == (byte)0)
-    					PP.addXP(SkillType.WOODCUTTING, LoadProperties.mpine);
+    					PP.addXP(SkillType.WOODCUTTING, LoadProperties.mpine, player);
     				//Spruce
     				if(block.getData() == (byte)1)
-    					PP.addXP(SkillType.WOODCUTTING, LoadProperties.mspruce);
+    					PP.addXP(SkillType.WOODCUTTING, LoadProperties.mspruce, player);
     				//Birch
     				if(block.getData() == (byte)2)
-    					PP.addXP(SkillType.WOODCUTTING, LoadProperties.mbirch);
+    					PP.addXP(SkillType.WOODCUTTING, LoadProperties.mbirch, player);
     			}
    			}
     		Skills.XpCheckSkill(SkillType.WOODCUTTING, player);
@@ -226,7 +226,7 @@ public class mcBlockListener extends BlockListener
     						if(!plugin.misc.blockWatchList.contains(block))
     						{
 	    						WoodCutting.woodCuttingProcCheck(player, blockx);
-	    						PP.addXP(SkillType.WOODCUTTING, LoadProperties.mpine);
+	    						PP.addXP(SkillType.WOODCUTTING, LoadProperties.mpine, player);
     						}
     					}
     					if(blockx.getTypeId() == 18)

+ 3 - 0
src/com/gmail/nossr50/listeners/mcPlayerListener.java

@@ -16,6 +16,7 @@
 */
 package com.gmail.nossr50.listeners;
 
+import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import org.bukkit.Bukkit;
@@ -259,6 +260,8 @@ public class mcPlayerListener extends PlayerListener
 			{
 				ColouredConsoleSender ccs = (ColouredConsoleSender) Bukkit.getServer();
 				ccs.sendMessage(ChatColor.AQUA+"[A]"+format); //Colors, woot!
+			} else {
+				log.log(Level.INFO, "[A]"+format);
 			}
 		}
 	}

+ 0 - 2
src/com/gmail/nossr50/mcMMO.java

@@ -29,7 +29,6 @@ import com.gmail.nossr50.party.Party;
 import com.gmail.nossr50.skills.*;
 import com.nijikokun.bukkit.Permissions.Permissions;
 
-import org.blockface.bukkitstats.CallHome;
 import org.bukkit.Bukkit;
 import java.io.BufferedInputStream;
 import java.io.BufferedReader;
@@ -190,7 +189,6 @@ public class mcMMO extends JavaPlugin
 		System.out.println(pdfFile.getName() + " version " + pdfFile.getVersion() + " is enabled!" );
 		
 		Bukkit.getServer().getScheduler().scheduleAsyncRepeatingTask(this, mcMMO_Timer, 0, 20);
-		CallHome.load(this); //Swearword's blockface usage statistics, only dials home once
 	}
 
 	public PlayerProfile getPlayerProfile(Player player)

+ 4 - 4
src/com/gmail/nossr50/skills/Acrobatics.java

@@ -52,7 +52,7 @@ public class Acrobatics {
 				 */
 				if(player.getHealth() - newDamage >= 1){
 					if(!event.isCancelled())
-						PP.addXP(SkillType.ACROBATICS, (event.getDamage() * 8)*10);
+						PP.addXP(SkillType.ACROBATICS, (event.getDamage() * 8)*10, player);
 					Skills.XpCheckSkill(SkillType.ACROBATICS, player);
 					event.setDamage(newDamage);
 					if(event.getDamage() <= 0)
@@ -65,7 +65,7 @@ public class Acrobatics {
 				}
 			} else if (!event.isCancelled()){
 				if(player.getHealth() - event.getDamage() >= 1){
-					PP.addXP(SkillType.ACROBATICS, (event.getDamage() * 12)*10);
+					PP.addXP(SkillType.ACROBATICS, (event.getDamage() * 12)*10, player);
 					Skills.XpCheckSkill(SkillType.ACROBATICS, player);
 				}
 			}
@@ -80,7 +80,7 @@ public class Acrobatics {
 	    		if(Math.random() * 4000 <= PPd.getSkillLevel(SkillType.ACROBATICS)){
 	    			defender.sendMessage(ChatColor.GREEN+"**DODGE**");
 	    			if(System.currentTimeMillis() >= 5000 + PPd.getRespawnATS() && defender.getHealth() >= 1){
-	    				PPd.addXP(SkillType.ACROBATICS, (event.getDamage() * 12)*1);
+	    				PPd.addXP(SkillType.ACROBATICS, (event.getDamage() * 12)*1, defender);
 	    				Skills.XpCheckSkill(SkillType.ACROBATICS, defender);
 	    			}
 	    			event.setDamage(event.getDamage() / 2);
@@ -91,7 +91,7 @@ public class Acrobatics {
 			} else if(Math.random() * 4000 <= 800) {
 				defender.sendMessage(ChatColor.GREEN+"**DODGE**");
 				if(System.currentTimeMillis() >= 5000 + PPd.getRespawnATS() && defender.getHealth() >= 1){
-					PPd.addXP(SkillType.ACROBATICS, (event.getDamage() * 12)*10);
+					PPd.addXP(SkillType.ACROBATICS, (event.getDamage() * 12)*10, defender);
 					Skills.XpCheckSkill(SkillType.ACROBATICS, defender);
 				}
 				event.setDamage(event.getDamage() / 2);

+ 5 - 0
src/com/gmail/nossr50/skills/Archery.java

@@ -17,6 +17,7 @@
 package com.gmail.nossr50.skills;
 
 import org.bukkit.Location;
+import org.bukkit.World;
 import org.bukkit.entity.Entity;
 import org.bukkit.entity.Player;
 import org.bukkit.event.entity.EntityDamageByEntityEvent;
@@ -58,6 +59,10 @@ public class Archery
 	}
 	public static void ignitionCheck(Entity x, EntityDamageByEntityEvent event, Player attacker)
 	{
+		//Check to see if PVP for this world is disabled before executing
+		if(!x.getWorld().getPVP())
+			return;
+		
 		PlayerProfile PPa = Users.getProfile(attacker);
 		if(Math.random() * 100 >= 75)
 		{

+ 1 - 1
src/com/gmail/nossr50/skills/Excavation.java

@@ -273,7 +273,7 @@ public class Excavation
     	}
     	
     	//Handle XP related tasks
-    	PP.addXP(SkillType.EXCAVATION, xp);
+    	PP.addXP(SkillType.EXCAVATION, xp, player);
     	Skills.XpCheckSkill(SkillType.EXCAVATION, player);
     }
 }

+ 8 - 8
src/com/gmail/nossr50/skills/Herbalism.java

@@ -81,7 +81,7 @@ public class Herbalism
 			Material mat = Material.getMaterial(296);
 			Location loc = block.getLocation();
 			ItemStack is = new ItemStack(mat, 1, (byte)0, (byte)0);
-			PP.addXP(SkillType.HERBALISM, LoadProperties.mwheat);
+			PP.addXP(SkillType.HERBALISM, LoadProperties.mwheat, player);
 	    	loc.getWorld().dropItemNaturally(loc, is);
 	    	
 	    	//DROP SOME SEEDS
@@ -161,7 +161,7 @@ public class Herbalism
     	{
     		mat = Material.getMaterial(296);
 			is = new ItemStack(mat, 1, (byte)0, (byte)0);
-    		PP.addXP(SkillType.HERBALISM, LoadProperties.mwheat);
+    		PP.addXP(SkillType.HERBALISM, LoadProperties.mwheat, player);
     		if(player != null)
     		{
 	    		if(Math.random() * 1000 <= PP.getSkillLevel(SkillType.HERBALISM))
@@ -235,7 +235,7 @@ public class Herbalism
 		    		    	{
 		    		    		loc.getWorld().dropItemNaturally(target.getLocation(), is);
 		    		    	}
-		    		    	PP.addXP(SkillType.HERBALISM, LoadProperties.mcactus);
+		    		    	PP.addXP(SkillType.HERBALISM, LoadProperties.mcactus, player);
 	    				}
 	    			}
 	    			x++;
@@ -274,7 +274,7 @@ public class Herbalism
 		    		    	{
 		    		    		loc.getWorld().dropItemNaturally(target.getLocation(), is);
 		    		    	}
-		    		    	PP.addXP(SkillType.HERBALISM, LoadProperties.msugar);
+		    		    	PP.addXP(SkillType.HERBALISM, LoadProperties.msugar, player);
 	    				}
 	    			}
 	    			x++;
@@ -293,7 +293,7 @@ public class Herbalism
 		    			loc.getWorld().dropItemNaturally(loc, is);
 		    		}
 	    		}
-	    		PP.addXP(SkillType.HERBALISM, LoadProperties.mpumpkin);
+	    		PP.addXP(SkillType.HERBALISM, LoadProperties.mpumpkin, player);
 	    	}
 	    	//Melon
 	    	if(type == 103)
@@ -305,7 +305,7 @@ public class Herbalism
 	    		{
 	    			loc.getWorld().dropItemNaturally(loc, is);
 	    		}
-				PP.addXP(SkillType.HERBALISM, LoadProperties.mmelon);
+				PP.addXP(SkillType.HERBALISM, LoadProperties.mmelon, player);
 	    	}
     		//Mushroom
 	    	if(type == 39 || type == 40)
@@ -319,7 +319,7 @@ public class Herbalism
 		    			loc.getWorld().dropItemNaturally(loc, is);
 		    		}
 	    		}
-	    		PP.addXP(SkillType.HERBALISM, LoadProperties.mmushroom);
+	    		PP.addXP(SkillType.HERBALISM, LoadProperties.mmushroom, player);
 	    	}
 	    	//Flower
 	    	if(type == 37 || type == 38){
@@ -330,7 +330,7 @@ public class Herbalism
 		    			loc.getWorld().dropItemNaturally(loc, is);
 		    		}
 	    		}
-	    		PP.addXP(SkillType.HERBALISM, LoadProperties.mflower);
+	    		PP.addXP(SkillType.HERBALISM, LoadProperties.mflower, player);
 	    	}
     	}
     	Skills.XpCheckSkill(SkillType.HERBALISM, player);

+ 2 - 2
src/com/gmail/nossr50/skills/Mining.java

@@ -233,7 +233,7 @@ public class Mining
     		else
     			blockProcCheck(block, player);
     	}
-    	PP.addXP(SkillType.MINING, xp);
+    	PP.addXP(SkillType.MINING, xp, player);
     	Skills.XpCheckSkill(SkillType.MINING, player);
     }
     /*
@@ -422,7 +422,7 @@ public class Mining
     		block.setType(Material.AIR);
     	}
     	if(block.getData() != (byte) 5)
-    		PP.addXP(SkillType.MINING, xp);
+    		PP.addXP(SkillType.MINING, xp, player);
     	if(LoadProperties.spoutEnabled)
     		SpoutStuff.playSoundForPlayer(SoundEffect.POP, player, block.getLocation());
     	

+ 8 - 8
src/com/gmail/nossr50/skills/Repair.java

@@ -70,7 +70,7 @@ public class Repair {
 	        			durabilityAfter = player.getItemInHand().getDurability();
 	        			dif = (short) (durabilityBefore - durabilityAfter);
 	        			dif = (short) (dif * 6); //Boost XP
-	        			PP.addXP(SkillType.REPAIR, dif*10);
+	        			PP.addXP(SkillType.REPAIR, dif*10, player);
 	        			
 	        			//CLANG CLANG
 	        			if(LoadProperties.spoutEnabled)
@@ -85,7 +85,7 @@ public class Repair {
 	            		durabilityAfter = player.getItemInHand().getDurability();
 	            		dif = (short) (durabilityBefore - durabilityAfter);
 	            		dif = (short) (dif * 2); //Boost XP
-	            		PP.addXP(SkillType.REPAIR, dif*10);
+	            		PP.addXP(SkillType.REPAIR, dif*10, player);
 	            		
 	            		//CLANG CLANG
 	        			if(LoadProperties.spoutEnabled)
@@ -97,7 +97,7 @@ public class Repair {
         				durabilityAfter = player.getItemInHand().getDurability();
 	            		dif = (short) (durabilityBefore - durabilityAfter);
 	            		dif = (short) (dif * 4); //Boost XP of Gold to around Iron
-        				PP.addXP(SkillType.REPAIR, dif*10);
+        				PP.addXP(SkillType.REPAIR, dif*10, player);
         				
         				//CLANG CLANG
 	        			if(LoadProperties.spoutEnabled)
@@ -135,7 +135,7 @@ public class Repair {
 	        			//STONE NERF
 	        			dif = (short) (dif / 2);
 	        			
-            			PP.addXP(SkillType.REPAIR, dif*10);
+            			PP.addXP(SkillType.REPAIR, dif*10, player);
         			} else if(isWoodTools(is) && hasItem(player,rWood)){
         				removeItem(player,rWood);
             			/*
@@ -153,7 +153,7 @@ public class Repair {
 	        			//WOOD NERF
 	        			dif = (short) (dif / 2);
 	        			
-            			PP.addXP(SkillType.REPAIR, dif*10);
+            			PP.addXP(SkillType.REPAIR, dif*10, player);
         			} else if(isIronTools(is) && hasItem(player, rIron)){
             			removeItem(player, rIron);
             			/*
@@ -168,7 +168,7 @@ public class Repair {
 	        				dif = (short) (dif / 2);
 	        			if(m.isHoe(is))
 	        				dif = (short) (dif / 2);
-            			PP.addXP(SkillType.REPAIR, dif*10);
+            			PP.addXP(SkillType.REPAIR, dif*10, player);
             			
             			//CLANG CLANG
 	        			if(LoadProperties.spoutEnabled)
@@ -187,7 +187,7 @@ public class Repair {
 	        				dif = (short) (dif / 2);
 	        			if(m.isHoe(is))
 	        				dif = (short) (dif / 2);
-            			PP.addXP(SkillType.REPAIR, dif*10);
+            			PP.addXP(SkillType.REPAIR, dif*10, player);
             			
             			//CLANG CLANG
 	        			if(LoadProperties.spoutEnabled)
@@ -204,7 +204,7 @@ public class Repair {
 	        				dif = (short) (dif / 2);
 	        			if(m.isHoe(is))
 	        				dif = (short) (dif / 2);
-            			PP.addXP(SkillType.REPAIR, dif*10);
+            			PP.addXP(SkillType.REPAIR, dif*10, player);
             			
             			//CLANG CLANG
 	        			if(LoadProperties.spoutEnabled)

+ 1 - 1
src/com/gmail/nossr50/skills/Skills.java

@@ -226,7 +226,7 @@ public class Skills
     	PlayerProfile PP = Users.getProfile(player);
     	if(PP != null)
     	{
-	    	if(!PP.getAbilityUse())
+	    	if(!PP.getAbilityUse() || PP.getSuperBreakerMode() || PP.getSerratedStrikesMode() || PP.getTreeFellerMode() || PP.getGreenTerraMode() || PP.getBerserkMode() || PP.getGigaDrillBreakerMode())
 	    		return;
 	    	if(mcPermissions.getInstance().miningAbility(player) && m.isMiningPick(player.getItemInHand()) && !PP.getPickaxePreparationMode())
 	    	{

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

@@ -52,6 +52,7 @@ public class Taming
 						return x;
 				}
 			}
+			return null;
 		}
 		return null;
 	}
@@ -61,7 +62,7 @@ public class Taming
 		Player owner = (Player)theWolf.getOwner();
 		if(owner != null)
 		{
-		return owner.getName();
+			return owner.getName();
 		}
 		else
 			return "Offline Master";

+ 1 - 1
src/plugin.yml

@@ -1,6 +1,6 @@
 name: mcMMO
 main: com.gmail.nossr50.mcMMO
-version: 1.1.17 ALPHA WIP #1
+version: 1.1.17
 softdepend: [Spout]
 author: nossr50
 description: mcMMO takes core Minecraft game mechanics and expands them to add an extensive RPG experience, the goal of the project has always been a quality RPG experience. Everything in mcMMO is carefully thought out and is constantly improving. mcMMO adds eleven skills to train in and level in, while also offering a high level of customization for server admins. There are countless features, including custom sounds, graphical elements, and more added when running mcMMO in conjunction with Spout. I carefully read feedback and evaluate the mechanics of mcMMO in every update to provide an ever-evolving experience.