|
|
@ -11,6 +11,7 @@ package engine.objects; |
|
|
|
|
|
|
|
|
|
|
|
import engine.Enum; |
|
|
|
import engine.Enum; |
|
|
|
import engine.Enum.TargetColor; |
|
|
|
import engine.Enum.TargetColor; |
|
|
|
|
|
|
|
import engine.gameManager.LootManager; |
|
|
|
import engine.gameManager.ZoneManager; |
|
|
|
import engine.gameManager.ZoneManager; |
|
|
|
import engine.math.Vector3fImmutable; |
|
|
|
import engine.math.Vector3fImmutable; |
|
|
|
import engine.server.MBServerStatics; |
|
|
|
import engine.server.MBServerStatics; |
|
|
@ -352,135 +353,63 @@ public class Experience { |
|
|
|
if(killer.pvpKills.contains(mob.getObjectUUID())) |
|
|
|
if(killer.pvpKills.contains(mob.getObjectUUID())) |
|
|
|
return; |
|
|
|
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; |
|
|
|
for(PlayerCharacter member : g.members){ |
|
|
|
int highestLevel = 0; |
|
|
|
|
|
|
|
double penalty = 0.0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ArrayList<PlayerCharacter> giveEXPTo = new ArrayList<>(); |
|
|
|
if (member.getLevel() >= MBServerStatics.LEVELCAP) |
|
|
|
|
|
|
|
|
|
|
|
// 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) |
|
|
|
|
|
|
|
continue; |
|
|
|
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
|
|
|
|
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, |
|
|
|
member.grantXP((int) baseXP); |
|
|
|
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; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (grantedExperience == 0) |
|
|
|
|
|
|
|
grantedExperience = 1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//scaling
|
|
|
|
|
|
|
|
grantedExperience *= (1 / giveEXPTo.size()+0.9); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Grant the player the EXP
|
|
|
|
|
|
|
|
playerCharacter.grantXP((int) Math.floor(grantedExperience)); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
}else{ |
|
|
|
} else { // Give EXP to a single character
|
|
|
|
//solo no group
|
|
|
|
//if (!killer.isAlive()) // Skip if the player is dead.
|
|
|
|
|
|
|
|
// return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (killer.getLevel() >= MBServerStatics.LEVELCAP) |
|
|
|
if (killer.getLevel() >= MBServerStatics.LEVELCAP) |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
if(killer.level >= 75 && !mob.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) |
|
|
|
if(killer.level >= 75 && !mob.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) |
|
|
|
return; |
|
|
|
return; // cannot PVE higher than level 75
|
|
|
|
|
|
|
|
|
|
|
|
// Get XP and adjust for Mob Level with world xp modifier taken into account
|
|
|
|
baseXP = LootManager.NORMAL_EXP_RATE * maxXPPerKill(killer.getLevel()); |
|
|
|
grantedExperience = (double) LOOTMANAGER.NORMAL_EXP_RATE * maxXPPerKill(killer.getLevel()); |
|
|
|
double mod = getConMod(killer, mob); |
|
|
|
grantedExperience *= getConMod(killer, mob); |
|
|
|
float leadership = 0.0f; |
|
|
|
|
|
|
|
if(killer.skills.containsKey("Leadership")) |
|
|
|
// Modify for hotzone
|
|
|
|
leadership = killer.skills.get("Leadership").getModifiedAmount(); |
|
|
|
if (ZoneManager.inHotZone(mob.getLoc())) |
|
|
|
if(leadership > 0){ |
|
|
|
grantedExperience *= LOOTMANAGER.HOTZONE_EXP_RATE; |
|
|
|
mod += (leadership * 0.01f); |
|
|
|
|
|
|
|
|
|
|
|
// Errant penalty
|
|
|
|
|
|
|
|
if (grantedExperience != 1) { |
|
|
|
|
|
|
|
if (killer.getGuild().isEmptyGuild()) |
|
|
|
|
|
|
|
grantedExperience *= 0.6f; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
baseXP *= mod; |
|
|
|
|
|
|
|
if(baseXP < 1) |
|
|
|
|
|
|
|
baseXP = 1; |
|
|
|
|
|
|
|
|
|
|
|
//bonus for no group
|
|
|
|
killer.grantXP((int) baseXP); |
|
|
|
grantedExperience *= 1.9f; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Grant XP
|
|
|
|
|
|
|
|
killer.grantXP((int) Math.floor(grantedExperience)); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|