Update: Nearly perfect exp ball calculation:
Code:
public uint ExpBallExp
{
get
{
ulong exp = Database.LevelExp[Level];
return (uint)(exp * 22064 / (ulong)((Level * Level * Level / 12) + 1)); ;
}
}
To make it work really good, you have to modify the "IncreaseExp" void in Character.cs something like this:
Code:
public void IncreaseExp(uint Amount, bool isTeamExp,bool justIt)
{
if (justIt)
{
ulong CurExp = Experience;
byte CurLevel = Level;
CurExp += Amount;
while (CurLevel < 137 && CurExp > Database.LevelExp[CurLevel])
{
CurExp -= Database.LevelExp[CurLevel];
CurLevel++;
if (CurLevel >= 3)
{
if (Job <= 55 && Job >= 50)
NewSkill(new Skill() { ID = 6011 });
else if (Job <= 45 && Job >= 40)
NewSkill(new Skill() { ID = 8002 });
else if (Job >= 10 && Job <= 15)
NewSkill(new Skill() { ID = 1110 });
else if (Job >= 20 && Job <= 25)
NewSkill(new Skill() { ID = 1025 });
}
}
if (CurLevel > Level)
{
World.Action(this, Packets.GeneralData(EntityID, 0, 0, 0, 92).Get);
if (Reborn || CurLevel >= 120)
{
if (Reborn)
StatPoints += (ushort)((CurLevel - Level) * 3);
else
{
if (Level < 120)
Level = 120;
StatPoints += (ushort)((CurLevel - Level) * 3);
}
}
CurHP = MaxHP;
}
if (CurLevel > Level)
Level = CurLevel;
Experience = CurExp;
return;
}
else
{
if (Loc.Map == 1039)
{
if (Amount > Level / 2)
Amount /= (uint)(Level / 2);
}
if (Level < 137)
{
Amount = (uint)(Amount * EqStats.GemExtraExp * World.ExperienceRate);
Amount = (uint)(Amount * (EqStats.eq_pot + Level + 100 + Reborns * 5) / 100);
if (World.KOBoard[0].Name == Name) Amount *= 2;
if (DoubleExp) Amount *= 2;
if (BlessingLasts > 0) Amount = (uint)((double)Amount * 1.2);
if (Reborns >= 2)
Amount /= 3;
if (MyGuild != null)
Amount = (Amount * (100 + MyGuild.Wins)) / 100;
bool noobexp = false;
bool marrieexp = false;
#region checkmyteam for extras
if (MyTeam != null && isTeamExp)
{
foreach (Character C in MyTeam.Members)
{
if (C != null)
{
if (EntityID != C.EntityID)
{
if (Level > C.Level + 20)
noobexp = true;
if (C.Spouse == C.Name)
marrieexp = true;
}
}
}
}
#endregion
if (noobexp)
Amount *= 2;
if (marrieexp)
Amount *= 2;
#region Experience points Messages
if (!noobexp && !marrieexp && !isTeamExp && Loc.Map != 1039)
MyClient.LocalMessage(2005, Amount + " extra experience points gained for killing.");
else if (!noobexp && !marrieexp && isTeamExp && Loc.Map != 1039)
MyClient.LocalMessage(2005, Amount + " team experience points gained.");
else if (noobexp && !marrieexp && isTeamExp && Loc.Map != 1039)
MyClient.LocalMessage(2005, "You gained " + Amount + " team experience points with additional rewarding experience points due to low level teammates.");
else if (!noobexp && marrieexp && isTeamExp && Loc.Map != 1039)
MyClient.LocalMessage(2005, "You gained " + Amount + " team experience points with additional rewarding experience points due to marriage teammates.");
else if (noobexp && !marrieexp && isTeamExp && Loc.Map != 1039)
MyClient.LocalMessage(2005, "You gained " + Amount + " team experience points with additional rewarding experience points due to low level and marriage teammates.");
#endregion
ulong CurExp = Experience;
byte CurLevel = Level;
CurExp += Amount;
while (CurLevel < 137 && CurExp > Database.LevelExp[CurLevel])
{
CurExp -= Database.LevelExp[CurLevel];
CurLevel++;
if (CurLevel >= 3)
{
if (Job <= 55 && Job >= 50)
NewSkill(new Skill() { ID = 6011 });
else if (Job <= 45 && Job >= 40)
NewSkill(new Skill() { ID = 8002 });
else if (Job >= 10 && Job <= 15)
NewSkill(new Skill() { ID = 1110 });
else if (Job >= 20 && Job <= 25)
NewSkill(new Skill() { ID = 1025 });
}
}
if (CurLevel > Level)
{
World.Action(this, Packets.GeneralData(EntityID, 0, 0, 0, 92).Get);
if (Reborn || CurLevel >= 120)
{
if (Reborn)
StatPoints += (ushort)((CurLevel - Level) * 3);
else
{
if (Level < 120)
Level = 120;
StatPoints += (ushort)((CurLevel - Level) * 3);
}
}
CurHP = MaxHP;
}
if (CurLevel > Level)
Level = CurLevel;
Experience = CurExp;
}
}
}