|  |  |  | @ -11,6 +11,7 @@ package engine.objects;@@ -11,6 +11,7 @@ package engine.objects; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | import engine.Enum; | 
			
		
	
		
			
				
					|  |  |  |  | import engine.Enum.TargetColor; | 
			
		
	
		
			
				
					|  |  |  |  | import engine.gameManager.LootManager; | 
			
		
	
		
			
				
					|  |  |  |  | import engine.gameManager.ZoneManager; | 
			
		
	
		
			
				
					|  |  |  |  | import engine.math.Vector3fImmutable; | 
			
		
	
		
			
				
					|  |  |  |  | import engine.server.MBServerStatics; | 
			
		
	
	
		
			
				
					|  |  |  | @ -352,135 +353,63 @@ public class Experience {@@ -352,135 +353,63 @@ public class Experience { | 
			
		
	
		
			
				
					|  |  |  |  |         if(killer.pvpKills.contains(mob.getObjectUUID())) | 
			
		
	
		
			
				
					|  |  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         double grantedExperience = 0.0; | 
			
		
	
		
			
				
					|  |  |  |  |         double baseXP; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (g != null) { // Do group EXP stuff
 | 
			
		
	
		
			
				
					|  |  |  |  |         if(g != null) { | 
			
		
	
		
			
				
					|  |  |  |  |             //group experience
 | 
			
		
	
		
			
				
					|  |  |  |  |             PlayerCharacter leader = g.getGroupLead(); | 
			
		
	
		
			
				
					|  |  |  |  |             float leadership = 0.0f; | 
			
		
	
		
			
				
					|  |  |  |  |             if(leader.skills.containsKey("Leadership")) | 
			
		
	
		
			
				
					|  |  |  |  |                 leadership = leader.skills.get("Leadership").getModifiedAmount(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             int leadership = 0; | 
			
		
	
		
			
				
					|  |  |  |  |             int highestLevel = 0; | 
			
		
	
		
			
				
					|  |  |  |  |             double penalty = 0.0; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             ArrayList<PlayerCharacter> giveEXPTo = new ArrayList<>(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             // Check if leader is within range of kill and then get leadership
 | 
			
		
	
		
			
				
					|  |  |  |  |             // skill
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             Vector3fImmutable killLoc = mob.getLoc(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (killLoc.distanceSquared2D(g.getGroupLead().getLoc()) < (MBServerStatics.EXP_RANGE * MBServerStatics.EXP_RANGE)) { | 
			
		
	
		
			
				
					|  |  |  |  |                 CharacterSkill leaderskill = g.getGroupLead().skills | 
			
		
	
		
			
				
					|  |  |  |  |                         .get("Leadership"); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 if (leaderskill != null) | 
			
		
	
		
			
				
					|  |  |  |  |                     leadership = leaderskill.getNumTrains(); | 
			
		
	
		
			
				
					|  |  |  |  |                 if (leadership > 90) | 
			
		
	
		
			
				
					|  |  |  |  |                     leadership = 90; // leadership caps at 90%
 | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             // Check every group member for distance to see if they get xp
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             for (PlayerCharacter pc : g.getMembers()) { | 
			
		
	
		
			
				
					|  |  |  |  |                 if (pc.isAlive()) { // Skip if the player is dead.
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                     // Check within range
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                     if (killLoc.distanceSquared2D(pc.getLoc()) < (MBServerStatics.EXP_RANGE * MBServerStatics.EXP_RANGE)) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                         giveEXPTo.add(pc); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                         // Track highest level character
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                         if (pc.getLevel() > highestLevel) | 
			
		
	
		
			
				
					|  |  |  |  |                             highestLevel = pc.getLevel(); | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             for(PlayerCharacter member : g.members){ | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             // Process every player in the group getting XP
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             for (PlayerCharacter playerCharacter : giveEXPTo) { | 
			
		
	
		
			
				
					|  |  |  |  |                 if (playerCharacter.getLevel() >= MBServerStatics.LEVELCAP) | 
			
		
	
		
			
				
					|  |  |  |  |                 if (member.getLevel() >= MBServerStatics.LEVELCAP) | 
			
		
	
		
			
				
					|  |  |  |  |                     continue; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 if(playerCharacter.level >= 75 && !mob.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) | 
			
		
	
		
			
				
					|  |  |  |  |                 if(member.level >= 75 && !mob.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) | 
			
		
	
		
			
				
					|  |  |  |  |                     continue; // cannot PVE higher than level 75
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 // Sets Max XP with server exp mod taken into account.
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 grantedExperience = (double) LOOTMANAGER.NORMAL_EXP_RATE * maxXPPerKill(playerCharacter.getLevel()); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 // Adjust XP for Mob Level
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 grantedExperience *= getConMod(playerCharacter, mob); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 // Process XP for this member
 | 
			
		
	
		
			
				
					|  |  |  |  |                 float range = member.loc.distanceSquared(killer.loc); | 
			
		
	
		
			
				
					|  |  |  |  |                 if((range * range) < (MBServerStatics.EXP_RANGE * MBServerStatics.EXP_RANGE)){ | 
			
		
	
		
			
				
					|  |  |  |  |                     baseXP = LOOTMANAGER.NORMAL_EXP_RATE * maxXPPerKill(member.getLevel()); | 
			
		
	
		
			
				
					|  |  |  |  |                     double mod = getConMod(member, mob); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 penalty = getGroupMemberPenalty(leadership, playerCharacter, giveEXPTo, | 
			
		
	
		
			
				
					|  |  |  |  |                         highestLevel); | 
			
		
	
		
			
				
					|  |  |  |  |                     if(leadership > 0) | 
			
		
	
		
			
				
					|  |  |  |  |                         mod += (leadership * 0.01f); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 // Leadership Penalty Reduction
 | 
			
		
	
		
			
				
					|  |  |  |  |                     baseXP *= mod; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 if (leadership > 0) | 
			
		
	
		
			
				
					|  |  |  |  |                     penalty -= ((leadership) * 0.01) * penalty; | 
			
		
	
		
			
				
					|  |  |  |  |                     baseXP *= (1.0f / g.members.size()+0.9f); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 // Modify for hotzone
 | 
			
		
	
		
			
				
					|  |  |  |  |                     if(baseXP < 1) | 
			
		
	
		
			
				
					|  |  |  |  |                         baseXP = 1; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 if (grantedExperience != 0) | 
			
		
	
		
			
				
					|  |  |  |  |                     if (ZoneManager.inHotZone(mob.getLoc())) | 
			
		
	
		
			
				
					|  |  |  |  |                         grantedExperience *= LOOTMANAGER.HOTZONE_EXP_RATE; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 // Check for 0 XP due to white mob, otherwise subtract penalty
 | 
			
		
	
		
			
				
					|  |  |  |  |                 // xp
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 if (grantedExperience == 0) | 
			
		
	
		
			
				
					|  |  |  |  |                     grantedExperience = 1; | 
			
		
	
		
			
				
					|  |  |  |  |                 else { | 
			
		
	
		
			
				
					|  |  |  |  |                     grantedExperience -= (penalty * 0.01) * grantedExperience; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                     // Errant Penalty Calculation
 | 
			
		
	
		
			
				
					|  |  |  |  |                     if (playerCharacter.getGuild().isEmptyGuild()) | 
			
		
	
		
			
				
					|  |  |  |  |                         grantedExperience *= 0.6; | 
			
		
	
		
			
				
					|  |  |  |  |                     member.grantXP((int) baseXP); | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 if (grantedExperience == 0) | 
			
		
	
		
			
				
					|  |  |  |  |                     grantedExperience = 1; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 //scaling
 | 
			
		
	
		
			
				
					|  |  |  |  |                 grantedExperience *= (1 / giveEXPTo.size()+0.9); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 // Grant the player the EXP
 | 
			
		
	
		
			
				
					|  |  |  |  |                 playerCharacter.grantXP((int) Math.floor(grantedExperience)); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         } else { // Give EXP to a single character
 | 
			
		
	
		
			
				
					|  |  |  |  |             //if (!killer.isAlive()) // Skip if the player is dead.
 | 
			
		
	
		
			
				
					|  |  |  |  |              //   return;
 | 
			
		
	
		
			
				
					|  |  |  |  |         }else{ | 
			
		
	
		
			
				
					|  |  |  |  |             //solo no group
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (killer.getLevel() >= MBServerStatics.LEVELCAP) | 
			
		
	
		
			
				
					|  |  |  |  |                 return; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             if(killer.level >= 75 && !mob.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) | 
			
		
	
		
			
				
					|  |  |  |  |                 return; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             // Get XP and adjust for Mob Level with world xp modifier taken into account
 | 
			
		
	
		
			
				
					|  |  |  |  |             grantedExperience = (double) LOOTMANAGER.NORMAL_EXP_RATE * maxXPPerKill(killer.getLevel()); | 
			
		
	
		
			
				
					|  |  |  |  |             grantedExperience *= getConMod(killer, mob); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             // Modify for hotzone
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (ZoneManager.inHotZone(mob.getLoc())) | 
			
		
	
		
			
				
					|  |  |  |  |                 grantedExperience *= LOOTMANAGER.HOTZONE_EXP_RATE; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             // Errant penalty
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (grantedExperience != 1) { | 
			
		
	
		
			
				
					|  |  |  |  |                 if (killer.getGuild().isEmptyGuild()) | 
			
		
	
		
			
				
					|  |  |  |  |                     grantedExperience *= 0.6f; | 
			
		
	
		
			
				
					|  |  |  |  |                 return; // cannot PVE higher than level 75
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             baseXP = LootManager.NORMAL_EXP_RATE * maxXPPerKill(killer.getLevel()); | 
			
		
	
		
			
				
					|  |  |  |  |             double mod =  getConMod(killer, mob); | 
			
		
	
		
			
				
					|  |  |  |  |             float leadership = 0.0f; | 
			
		
	
		
			
				
					|  |  |  |  |             if(killer.skills.containsKey("Leadership")) | 
			
		
	
		
			
				
					|  |  |  |  |                 leadership = killer.skills.get("Leadership").getModifiedAmount(); | 
			
		
	
		
			
				
					|  |  |  |  |             if(leadership > 0){ | 
			
		
	
		
			
				
					|  |  |  |  |                 mod += (leadership * 0.01f); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             baseXP *= mod; | 
			
		
	
		
			
				
					|  |  |  |  |             if(baseXP < 1) | 
			
		
	
		
			
				
					|  |  |  |  |                 baseXP = 1; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             //bonus for no group
 | 
			
		
	
		
			
				
					|  |  |  |  |             grantedExperience *= 1.9f; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             // Grant XP
 | 
			
		
	
		
			
				
					|  |  |  |  |             killer.grantXP((int) Math.floor(grantedExperience)); | 
			
		
	
		
			
				
					|  |  |  |  |             killer.grantXP((int) baseXP); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | 
 |