Browse Source

expereince system rework

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

145
src/engine/objects/Experience.java

@ -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));
} }
} }
} }

Loading…
Cancel
Save