Browse Source

expereince system rework

lakebane
FatBoy-DOTC 1 week ago
parent
commit
27cb704837
  1. 143
      src/engine/objects/Experience.java

143
src/engine/objects/Experience.java

@ -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
penalty = getGroupMemberPenalty(leadership, playerCharacter, giveEXPTo,
highestLevel);
// Leadership Penalty Reduction
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);
if(leadership > 0)
penalty -= ((leadership) * 0.01) * penalty;
mod += (leadership * 0.01f);
// Modify for hotzone
baseXP *= mod;
if (grantedExperience != 0)
if (ZoneManager.inHotZone(mob.getLoc()))
grantedExperience *= LOOTMANAGER.HOTZONE_EXP_RATE;
baseXP *= (1.0f / g.members.size()+0.9f);
// Check for 0 XP due to white mob, otherwise subtract penalty
// xp
if(baseXP < 1)
baseXP = 1;
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);
}
}
}

Loading…
Cancel
Save