Double hp wash doesn't work. I got 156 int on my Hermit. I used my ap into mp, got 11 mp from it. My ap reset took out more than I gained (12 mp) It should be gaining 20 to 24 ish. Did not happen.
Are you able to find any documentation online which states the calculation that is used for when adding MP ability points to your character? I cannot seem to find much information about this.
After a ton of search... I think I finally found some documentations.. http://www.southperry.net/showthread.php?t=20730 http://www.southperry.net/showthread.php?t=15014&highlight=double+washing In both threads it's claimed to be int * 0,075, which makes sense. And it is the same for every class, I can guarantee that much. Just for warriors you need to remember the impact of Improved Maxhp Increase when adding unused APs to HP, and with mages the effect of Improved Maxmp Increase when adding unused points to MP and when taking them out from MP. Also for mages, the more INT you have, the more a reset will take out from MP, probably the same int * 0,075 formula. A thing, for a Warrior using 160 int, double washing, would actually be triple~6x washing... That's why I call it MP washing.
Adding or removing into MP gives a random number within a certain range which is why you gained a different amount when increasing to decreasing the MP. There is nothing in the source that takes into account the amount of INT you have when deciding how much extra MP to give you when adding ability points to MP. Only levelling up takes into account your total INT and deciding how much MP to give you upon a level up. Those links are dated from well after v62. I would most likely need to see some documentation from at least a date near v62 or preferably before v62 for me to class this as a bug... Levelling up... Code: public void levelUp() { ISkill improvingMaxHP = null; int improvingMaxHPLevel = 0; ISkill improvingMaxMP = SkillFactory.getSkill(2000001); int improvingMaxMPLevel = getSkillLevel(improvingMaxMP); remainingAp += 5; if (job == MapleJob.BEGINNER) { maxhp += rand(12, 16); maxmp += rand(10, 12); } else if (job.isA(MapleJob.WARRIOR)) { improvingMaxHP = SkillFactory.getSkill(1000001); improvingMaxHPLevel = getSkillLevel(improvingMaxHP); maxhp += rand(24, 28); maxmp += rand(4, 6); } else if (job.isA(MapleJob.MAGICIAN)) { maxhp += rand(10, 14); maxmp += rand(22, 24); } else if (job.isA(MapleJob.BOWMAN) || job.isA(MapleJob.THIEF) || job.isA(MapleJob.GM)) { maxhp += rand(20, 24); maxmp += rand(14, 16); } else if (job.isA(MapleJob.PIRATE)) { improvingMaxHP = SkillFactory.getSkill(5100000); improvingMaxHPLevel = getSkillLevel(improvingMaxHP); maxhp += rand(22, 28); maxmp += rand(18, 23); } if (improvingMaxHPLevel > 0) { maxhp += improvingMaxHP.getEffect(improvingMaxHPLevel).getX(); } if (improvingMaxMPLevel > 0) { maxmp += improvingMaxMP.getEffect(improvingMaxMPLevel).getX(); } maxmp += getTotalInt() / 10; exp.addAndGet(-ExpTable.getExpNeededForLevel(level + 1)); level += 1; if (level == 200 && !isGM()) { exp.set(0); MaplePacket packet = MaplePacketCreator.serverNotice(6, "[Congrats] " + getName() + " has reached Level 200! Congratulate " + getName() + " on such an amazing achievement!"); try { getClient().getChannelServer().getWorldInterface().broadcastMessage(getName(), packet.getBytes()); } catch (RemoteException e) { getClient().getChannelServer().reconnectWorld(); } } maxhp = Math.min(30000, maxhp); maxmp = Math.min(30000, maxmp); List<Pair<MapleStat, Integer>> statup = new ArrayList<Pair<MapleStat, Integer>>(8); statup.add(new Pair<MapleStat, Integer>(MapleStat.AVAILABLEAP, Integer.valueOf(remainingAp))); statup.add(new Pair<MapleStat, Integer>(MapleStat.MAXHP, Integer.valueOf(maxhp))); statup.add(new Pair<MapleStat, Integer>(MapleStat.MAXMP, Integer.valueOf(maxmp))); statup.add(new Pair<MapleStat, Integer>(MapleStat.HP, Integer.valueOf(maxhp))); statup.add(new Pair<MapleStat, Integer>(MapleStat.MP, Integer.valueOf(maxmp))); statup.add(new Pair<MapleStat, Integer>(MapleStat.EXP, Integer.valueOf(exp.get()))); statup.add(new Pair<MapleStat, Integer>(MapleStat.LEVEL, Integer.valueOf(level))); if (job != MapleJob.BEGINNER) { remainingSp += 3; statup.add(new Pair<MapleStat, Integer>(MapleStat.AVAILABLESP, Integer.valueOf(remainingSp))); } setHp(maxhp); setMp(maxmp); getClient().getSession().write(MaplePacketCreator.updatePlayerStats(statup)); getMap().broadcastMessage(this, MaplePacketCreator.showLevelup(getId()), false); recalcLocalStats(); silentPartyUpdate(); guildUpdate(); } Adding HP & MP... Code: case 2048: // HP int MaxHP = c.getPlayer().getMaxHp(); if (c.getPlayer().getHpApUsed() == 10000 || MaxHP == 30000) return; ISkill improvingMaxHP = null; int improvingMaxHPLevel = 0; if (c.getPlayer().getJob().isA(MapleJob.BEGINNER)) { MaxHP += rand(8, 12); } else if (c.getPlayer().getJob().isA(MapleJob.WARRIOR)) { improvingMaxHP = SkillFactory.getSkill(1000001); improvingMaxHPLevel = c.getPlayer().getSkillLevel(improvingMaxHP); if (improvingMaxHPLevel >= 1) { MaxHP += rand(20, 24) + improvingMaxHP.getEffect(improvingMaxHPLevel).getY(); } else { MaxHP += rand(20, 24); } } else if (c.getPlayer().getJob().isA(MapleJob.MAGICIAN)) { MaxHP += rand(6, 10); } else if (c.getPlayer().getJob().isA(MapleJob.BOWMAN)) { MaxHP += rand(16, 20); } else if (c.getPlayer().getJob().isA(MapleJob.THIEF)) { MaxHP += rand(20, 24); } else if (c.getPlayer().getJob().isA(MapleJob.PIRATE)) { improvingMaxHP = SkillFactory.getSkill(5100000); improvingMaxHPLevel = c.getPlayer().getSkillLevel(improvingMaxHP); if (improvingMaxHPLevel >= 1) { MaxHP += rand(16, 20) + improvingMaxHP.getEffect(improvingMaxHPLevel).getY(); } else { MaxHP += rand(16, 20); } } MaxHP = Math.min(30000, MaxHP); c.getPlayer().setHpApUsed(c.getPlayer().getHpApUsed() + 1); c.getPlayer().setMaxHp(MaxHP); statupdate.add(new Pair<MapleStat, Integer>(MapleStat.MAXHP, MaxHP)); break; case 8192: // MP int MaxMP = c.getPlayer().getMaxMp(); if (c.getPlayer().getMpApUsed() == 10000 || c.getPlayer().getMaxMp() == 30000) return; if (c.getPlayer().getJob().isA(MapleJob.BEGINNER)) { MaxMP += rand(6, 8); } else if (c.getPlayer().getJob().isA(MapleJob.WARRIOR)) { MaxMP += rand(2, 4); } else if (c.getPlayer().getJob().isA(MapleJob.MAGICIAN)) { ISkill improvingMaxMP = SkillFactory.getSkill(2000001); int improvingMaxMPLevel = c.getPlayer().getSkillLevel(improvingMaxMP); if (improvingMaxMPLevel >= 1) { MaxMP += rand(18, 20) + improvingMaxMP.getEffect(improvingMaxMPLevel).getY(); } else { MaxMP += rand(18, 20); } } else if (c.getPlayer().getJob().isA(MapleJob.BOWMAN)) { MaxMP += rand(10, 12); } else if (c.getPlayer().getJob().isA(MapleJob.THIEF)) { MaxMP += rand(10, 12); } else if (c.getPlayer().getJob().isA(MapleJob.PIRATE)) { MaxMP += rand(10, 12); } MaxMP = Math.min(30000, MaxMP); c.getPlayer().setMpApUsed(c.getPlayer().getMpApUsed() + 1); c.getPlayer().setMaxMp(MaxMP); statupdate.add(new Pair<MapleStat, Integer>(MapleStat.MAXMP, MaxMP)); break;
Probably not possible to get a proof.. People were still learning about HP washing back then and the biggest forums from that time do not have any documentations left, or have shut down. Ah well. Though I do know that the same thing is missing from v83 servers that originates from the odinms source. Do not know why that is.