public void gainExp(int gain, boolean show, boolean inChat, boolean white) {
int equip = (gain / 10) * pendantExp;
int total = gain + equip;
if (level < getMaxLevel()) {
if ((long) this.exp.get() + (long) total > (long) Integer.MAX_VALUE) {
int gainFirst = ExpTable.getExpNeededForLevel(level) - this.exp.get();
total -= gainFirst + 1;
this.gainExp(gainFirst + 1, false, inChat, white);
}
updateSingleStat(MapleStat.EXP, this.exp.addAndGet(total));
if (show && gain != 0) {
client.announce(MaplePacketCreator.getShowExpGain(gain, equip, inChat, white));
}
while (level < getMaxLevel() && exp.get() >= ExpTable.getExpNeededForLevel(level)) {
levelUp(true);
}
if (exp.get() >= ExpTable.getExpNeededForLevel(level)) {
levelUp(true);
int need = ExpTable.getExpNeededForLevel(level);
if (exp.get() >= need) {
setExp(need - 1);
updateSingleStat(MapleStat.EXP, need);
}
}
}
}