Double HP Wash

Discussion in 'Closed Bug/Glitch Reports' started by Celiu, Aug 19, 2013.

Thread Status:
Not open for further replies.
  1. Celiu
    Offline

    Celiu Well-Known Member

    Joined:
    Aug 13, 2013
    Messages:
    1,145
    Likes Received:
    1,608
    Level:
    190
    Guild:
    Aeon
    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.
     
  2. Matt
    Offline

    Matt Administrator

    Joined:
    May 8, 2013
    Messages:
    10,843
    Likes Received:
    15,027
    Gender:
    Male
    Location:
    United Kingdom
    Country Flag:
    IGN:
    Matt
    Level:
    N/A
    Guild:
    Staff
    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.
     
  3. Vergil
    Offline

    Vergil Well-Known Member

    Joined:
    Jul 26, 2013
    Messages:
    77
    Likes Received:
    2
    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.
     
  4. Matt
    Offline

    Matt Administrator

    Joined:
    May 8, 2013
    Messages:
    10,843
    Likes Received:
    15,027
    Gender:
    Male
    Location:
    United Kingdom
    Country Flag:
    IGN:
    Matt
    Level:
    N/A
    Guild:
    Staff
    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;
     
  5. Vergil
    Offline

    Vergil Well-Known Member

    Joined:
    Jul 26, 2013
    Messages:
    77
    Likes Received:
    2
    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.
     
Thread Status:
Not open for further replies.

Share This Page