diff --git a/src/engine/objects/Experience.java b/src/engine/objects/Experience.java index 6e1edae7..2fbc7541 100644 --- a/src/engine/objects/Experience.java +++ b/src/engine/objects/Experience.java @@ -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 { 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; + for(PlayerCharacter member : g.members){ - ArrayList 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(); - } - } - } - - // 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. + 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); - grantedExperience = (double) LOOTMANAGER.NORMAL_EXP_RATE * maxXPPerKill(playerCharacter.getLevel()); + if(leadership > 0) + mod += (leadership * 0.01f); - // Adjust XP for Mob Level + baseXP *= mod; - grantedExperience *= getConMod(playerCharacter, mob); + baseXP *= (1.0f / g.members.size()+0.9f); - // Process XP for this member + if(baseXP < 1) + baseXP = 1; - penalty = getGroupMemberPenalty(leadership, playerCharacter, giveEXPTo, - highestLevel); - - // Leadership Penalty Reduction - - if (leadership > 0) - penalty -= ((leadership) * 0.01) * penalty; - - // Modify for hotzone - - 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); } } }