expereince system rework
This commit is contained in:
@@ -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<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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 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;
|
||||
return; // cannot PVE higher than level 75
|
||||
|
||||
// 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;
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user