PIN system + player ranking fix + rebalanced equip EXP calculations

Added the PIN feature. Fixed ranking now calculating ranks now
world-based instead of overall. Rebalanced equip exp gain and made
cosmetic equipments no more leveling up (cosmetics leveling up are
useless).
This commit is contained in:
ronancpl
2017-06-03 20:02:19 -03:00
parent 02cc9efb00
commit 809d90564c
43 changed files with 193 additions and 78 deletions

View File

@@ -32,6 +32,7 @@ import constants.ServerConstants;
/**
* @author Matze
* @author Quit
* @author Ronan
*/
public class RankingWorker implements Runnable {
private Connection con;
@@ -43,16 +44,17 @@ public class RankingWorker implements Runnable {
reset.executeUpdate();
}
private void updateRanking(int job) throws SQLException {
String sqlCharSelect = "SELECT c.id, " + (job != -1 ? "c.jobRank, c.jobRankMove" : "c.rank, c.rankMove") + ", a.lastlogin AS lastlogin, a.loggedin FROM characters AS c LEFT JOIN accounts AS a ON c.accountid = a.id ";
private void updateRanking(int job, int world) throws SQLException {
String sqlCharSelect = "SELECT c.id, " + (job != -1 ? "c.jobRank, c.jobRankMove" : "c.rank, c.rankMove") + ", a.lastlogin AS lastlogin, a.loggedin FROM characters AS c LEFT JOIN accounts AS a ON c.accountid = a.id WHERE c.world = ? ";
if (job != -1) {
sqlCharSelect += "WHERE c.job DIV 100 = ? ";
sqlCharSelect += "AND c.job DIV 100 = ? ";
}
sqlCharSelect += "ORDER BY c.level DESC , c.exp DESC , c.fame DESC , c.meso DESC";
PreparedStatement charSelect = con.prepareStatement(sqlCharSelect);
PreparedStatement charSelect = con.prepareStatement(sqlCharSelect);
charSelect.setInt(1, world);
if (job != -1) {
charSelect.setInt(1, job);
charSelect.setInt(2, job);
}
ResultSet rs = charSelect.executeQuery();
PreparedStatement ps = con.prepareStatement("UPDATE characters SET " + (job != -1 ? "jobRank = ?, jobRankMove = ? " : "rank = ?, rankMove = ? ") + "WHERE id = ?");
@@ -87,12 +89,14 @@ public class RankingWorker implements Runnable {
resetMoveRank(false);
}
updateRanking(-1); //overall ranking
for (int i = 0; i <= MapleJob.getMax(); i++) {
updateRanking(i);
for(int j = 0; j < Server.getInstance().getWorlds().size(); j++) {
updateRanking(-1, j); //overall ranking
for (int i = 0; i <= MapleJob.getMax(); i++) {
updateRanking(i, j);
}
con.commit();
}
con.commit();
con.setAutoCommit(true);
lastUpdate = System.currentTimeMillis();
} catch (SQLException ex) {

View File

@@ -601,7 +601,7 @@ public abstract class AbstractDealDamageHandler extends AbstractMaplePacketHandl
MapleStatEffect effect = skill.getEffect(ret.skilllevel);
if (magic) {
// Since the skill is magic based, use the magic formula
// Since the skill is magic based, use the magic formula
if(chr.getJob() == MapleJob.IL_ARCHMAGE || chr.getJob() == MapleJob.IL_MAGE) {
int skillLvl = chr.getSkillLevel(ILMage.ELEMENT_AMPLIFICATION);
if(skillLvl > 0)
@@ -611,7 +611,7 @@ public abstract class AbstractDealDamageHandler extends AbstractMaplePacketHandl
if(skillLvl > 0)
calcDmgMax = calcDmgMax * SkillFactory.getSkill(FPMage.ELEMENT_AMPLIFICATION).getEffect(skillLvl).getY() / 100;
} else if(chr.getJob() == MapleJob.BLAZEWIZARD3 || chr.getJob() == MapleJob.BLAZEWIZARD4) {
int skillLvl = chr.getSkillLevel(BlazeWizard.ELEMENT_AMPLIFICATION);
int skillLvl = chr.getSkillLevel(BlazeWizard.ELEMENT_AMPLIFICATION);
if(skillLvl > 0)
calcDmgMax = calcDmgMax * SkillFactory.getSkill(BlazeWizard.ELEMENT_AMPLIFICATION).getEffect(skillLvl).getY() / 100;
} else if(chr.getJob() == MapleJob.EVAN7 || chr.getJob() == MapleJob.EVAN8 || chr.getJob() == MapleJob.EVAN9 || chr.getJob() == MapleJob.EVAN10) {
@@ -622,16 +622,16 @@ public abstract class AbstractDealDamageHandler extends AbstractMaplePacketHandl
calcDmgMax *= effect.getMatk();
if(ret.skill == Cleric.HEAL) {
// This formula is still a bit wonky, but it is fairly accurate.
// This formula is still a bit wonky, but it is fairly accurate.
calcDmgMax = (int) Math.round((chr.getTotalInt() * 4.8 + chr.getTotalLuk() * 4) * chr.getTotalMagic() / 1000);
calcDmgMax = calcDmgMax * effect.getHp() / 100;
}
} else if(ret.skill == Hermit.SHADOW_MESO) {
// Shadow Meso also has its own formula
calcDmgMax = effect.getMoneyCon() * 10;
calcDmgMax = (int) Math.floor(calcDmgMax * 1.5);
} else if(ret.skill == Hermit.SHADOW_MESO) {
// Shadow Meso also has its own formula
calcDmgMax = effect.getMoneyCon() * 10;
calcDmgMax = (int) Math.floor(calcDmgMax * 1.5);
} else {
// Normal damage formula for skills
// Normal damage formula for skills
calcDmgMax = calcDmgMax * effect.getDamage() / 100;
}
}
@@ -646,9 +646,12 @@ public abstract class AbstractDealDamageHandler extends AbstractMaplePacketHandl
MapleStatEffect ceffect = SkillFactory.getSkill(advcomboid).getEffect(chr.getSkillLevel(advcomboid));
calcDmgMax = (int) Math.floor(calcDmgMax * (ceffect.getDamage() + 50) / 100 + 0.20 + (comboBuff - 5) * 0.04);
} else {
// Normal Combo
MapleStatEffect ceffect = SkillFactory.getSkill(oid).getEffect(chr.getSkillLevel(oid));
calcDmgMax = (int) Math.floor(calcDmgMax * (ceffect.getDamage() + 50) / 100 + Math.floor((comboBuff - 1) * (chr.getSkillLevel(oid) / 6)) / 100);
// Normal Combo
int skillLv = chr.getSkillLevel(oid);
if(skillLv <= 0) skillLv = SkillFactory.getSkill(oid).getMaxLevel();
MapleStatEffect ceffect = SkillFactory.getSkill(oid).getEffect(skillLv);
calcDmgMax = (int) Math.floor(calcDmgMax * (ceffect.getDamage() + 50) / 100 + Math.floor((comboBuff - 1) * (skillLv / 6)) / 100);
}
if(GameConstants.isFinisherSkill(ret.skill)) {

View File

@@ -87,7 +87,9 @@ public final class CloseRangeDamageHandler extends AbstractDealDamageHandler {
if (advComboSkillLevel > 0) {
ceffect = advcombo.getEffect(advComboSkillLevel);
} else {
ceffect = combo.getEffect(player.getSkillLevel(combo));
int comboLv = player.getSkillLevel(combo);
if(comboLv <= 0) comboLv = SkillFactory.getSkill(oid).getMaxLevel();
ceffect = combo.getEffect(comboLv);
}
if (orbcount < ceffect.getX() + 1) {
int neworbcount = orbcount + 1;
@@ -96,7 +98,10 @@ public final class CloseRangeDamageHandler extends AbstractDealDamageHandler {
neworbcount++;
}
}
int duration = combo.getEffect(player.getSkillLevel(oid)).getDuration();
int olv = player.getSkillLevel(oid);
if(olv <= 0) olv = SkillFactory.getSkill(oid).getMaxLevel();
int duration = combo.getEffect(olv).getDuration();
List<Pair<MapleBuffStat, Integer>> stat = Collections.singletonList(new Pair<>(MapleBuffStat.COMBO, neworbcount));
player.setBuffedValue(MapleBuffStat.COMBO, neworbcount);
duration -= (int) (System.currentTimeMillis() - player.getBuffedStarttime(MapleBuffStat.COMBO));

View File

@@ -30,7 +30,6 @@ public final class AfterLoginHandler extends AbstractMaplePacketHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
System.out.println("after login");
byte c2 = slea.readByte();
byte c3 = 5;

View File

@@ -65,7 +65,7 @@ public final class LoginPasswordHandler implements MaplePacketHandler {
return;
}
if (c.finishLogin() == 0) {
login(c);
login(c);
} else {
c.announce(MaplePacketCreator.getLoginFailed(7));
}