|  |  | @ -976,88 +976,97 @@ public class PlayerCombatStats { | 
			
		
	
		
		
			
				
					
					|  |  |  |         double grantedXP; |  |  |  |         double grantedXP; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(group != null){ |  |  |  |         if(group != null){ | 
			
		
	
		
		
			
				
					
					|  |  |  |             float leadership = 0.0f; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             PlayerCharacter leader = group.getGroupLead(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             if(leader.skills.containsKey("Leadership")) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 leadership = leader.skills.get("Leadership").getModifiedAmount(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             //Group XP
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             for(PlayerCharacter member : group.members){ |  |  |  |             for(PlayerCharacter member : group.members){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 //white mob, early exit
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 if(Experience.getConMod(member,killed) <= 0) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     continue; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 //cannot level higher than 75 unless killed is a player character
 |  |  |  |                 //can only get XP over level 75 for player kills
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 if(member.level >= 75 && !killed.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) |  |  |  |                 if(member.level >= 75 && !killed.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) | 
			
		
	
		
		
			
				
					
					|  |  |  |                     continue; |  |  |  |                     continue; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 //not in load range, do not grant XP
 |  |  |  |                 //cannot gain xp while dead
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 if(member.loc.distanceSquared(killed.loc) > MBServerStatics.CHARACTER_LOAD_RANGE * MBServerStatics.CHARACTER_LOAD_RANGE) |  |  |  |                 if(!member.isAlive()) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     continue; |  |  |  |                     continue; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 //checking to make sure killed is better than "white"
 |  |  |  |                 //out of XP range
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 double multiplier = Experience.getConMod(member,killed); |  |  |  |                 if(member.loc.distanceSquared(killed.loc) > MBServerStatics.CHARACTER_LOAD_RANGE * MBServerStatics.CHARACTER_LOAD_RANGE) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 //stop if killed is not better than "white"
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if(multiplier == 0) |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     continue; |  |  |  |                     continue; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 //get experience for current level
 |  |  |  |                 float mod; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 int currentLevel = Experience.LevelToExp[member.level]; |  |  |  |                 switch(group.members.size()){ | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |                     default: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 //get experience required for next level
 |  |  |  |                         mod = 1.0f; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 int nextLevel = Experience.LevelToExp[member.level + 1]; |  |  |  |                         break; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |                     case 2: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 //get the required experience to go form current level to next level
 |  |  |  |                         mod = 0.8f; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 int required = nextLevel - currentLevel; |  |  |  |                         break; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |                     case 3: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 //get group member divisor
 |  |  |  |                         mod = 0.73f; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                // float divisor =
 |  |  |  |                         break; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                  //       switch (group.members.size()) {
 |  |  |  |                     case 4: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                  //   case 2 -> 16.0f;
 |  |  |  |                         mod = 0.69f; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 ///    case 3 -> 18.0f;
 |  |  |  |                         break; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 //    case 4 -> 20.0f;
 |  |  |  |                     case 5: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 //    case 5 -> 21.0f;
 |  |  |  |                         mod = 0.65f; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                  //   case 6 -> 23.0f;
 |  |  |  |                         break; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 //    case 7 -> 25.0f;
 |  |  |  |                     case 6: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 //    case 8 -> 26.0f;
 |  |  |  |                         mod = 0.58f; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 //    case 9 -> 28.0f;
 |  |  |  |                         break; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 //    case 10 -> 30.0f;
 |  |  |  |                     case 7: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 //    default -> 15.0f;
 |  |  |  |                         mod = 0.54f; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 //};
 |  |  |  |                         break; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |                     case 8: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 //apply the X mob kills required rule
 |  |  |  |                         mod = 0.50f; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 //grantedXP = required / divisor;
 |  |  |  |                         break; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |                     case 9: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 if(leadership > 0) |  |  |  |                         mod = 0.47f; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     multiplier += (multiplier * (leadership * 0.01f)); |  |  |  |                         break; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |                     case 10: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 //member.grantXP((int) Math.floor(grantedXP * multiplier));
 |  |  |  |                         mod = 0.45f; | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                         break; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 double xp = getXP(member) * mod; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 member.grantXP((int) xp); | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         }else{ |  |  |  |         }else{ | 
			
		
	
		
		
			
				
					
					|  |  |  |             //Solo XP
 |  |  |  |             //Solo XP
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             //cannot level higher than 75 unless killed is a player character
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             if(this.owner.level >= 75 && !killed.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) |  |  |  |             //white mob, early exit
 | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             if(Experience.getConMod(this.owner,killed) <= 0) | 
			
		
	
		
		
			
				
					
					|  |  |  |                 return; |  |  |  |                 return; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             //checking to make sure killed is better than "white"
 |  |  |  |             //can only get XP over level 75 for player kills
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             double multiplier = Experience.getConMod(this.owner,killed); |  |  |  |             if(this.owner.level >= 75 && !killed.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 return; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             //stop if killed is not better than "white"
 |  |  |  |             //cannot gain xp while dead
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             if(multiplier == 0) |  |  |  |             if(!this.owner.isAlive()) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 return; |  |  |  |                 return; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             //get experience for current level
 |  |  |  |             this.owner.grantXP(getXP(this.owner)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             int currentLevel = Experience.LevelToExp[this.owner.level]; |  |  |  |         } | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             //get experience required for next level
 |  |  |  |     public static int getXP(PlayerCharacter pc){ | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             int nextLevel = Experience.LevelToExp[this.owner.level + 1]; |  |  |  |         double xp = 0; | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         float mod = 0.10f; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             //get the required experience to go form current level to next level
 |  |  |  |         if (pc.level >= 26 && pc.level <= 75) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             int required = nextLevel - currentLevel; |  |  |  |         { | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             mod = 0.10f - (0.001f * (pc.level - 25)); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         else if (pc.level > 75) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             mod = 0.05f; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             //apply the 15 mob kills required rule
 |  |  |  |         xp = Experience.LevelToExp[pc.level] * mod; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             grantedXP = required / 15.0f; |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             this.owner.grantXP((int) Math.floor(grantedXP * multiplier)); |  |  |  |         return (int) xp; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
	
		
		
			
				
					|  |  | 
 |