package handling.channel.handler; import clientside.MapleCharacter; import clientside.MapleClient; import clientside.MapleStat; import clientside.PlayerStats; import clientside.Skill; import clientside.SkillFactory; import constants.GameConstants; import java.util.EnumMap; import java.util.Map; import server.Randomizer; import tools.Pair; import tools.data.LittleEndianAccessor; import tools.packet.CWvsContext; public class StatsHandling { public static void DistributeAP(final LittleEndianAccessor slea, final MapleClient c, final MapleCharacter chr) { Map<MapleStat, Long> statupdate = new EnumMap<>(MapleStat.class); c.getSession().write(CWvsContext.updatePlayerStats(statupdate, true, chr)); // chr.updateTick(slea.readInt()); final int statmask = slea.readInt(); final PlayerStats stat = chr.getStat(); final int job = chr.getJob(); if (chr.getRemainingAp() > 0) { switch (statmask) { case 0x40: // Str if (stat.getStr() >= 1500) { return; } stat.setStr((short) (stat.getStr() + 1), chr); statupdate.put(MapleStat.STR, (long) stat.getStr()); break; case 0x80: // Dex if (stat.getDex() >= 1500) { return; } stat.setDex((short) (stat.getDex() + 1), chr); statupdate.put(MapleStat.DEX, (long) stat.getDex()); break; case 0x100: // Int if (stat.getInt() >= 1500) { return; } stat.setInt((short) (stat.getInt() + 1), chr); statupdate.put(MapleStat.INT, (long) stat.getInt()); break; case 0x200: // Luk if (stat.getLuk() >= 1500) { return; } stat.setLuk((short) (stat.getLuk() + 1), chr); statupdate.put(MapleStat.LUK, (long) stat.getLuk()); break; case 0x400: // HP int maxhp = stat.getMaxHp(); if (chr.getHpApUsed() >= 10000 || maxhp >= 500000) { return; } if (GameConstants.isBeginnerJob(job)) { // Beginner maxhp += Randomizer.rand(8, 12); } else if ((job >= 100 && job <= 132) || (job >= 3200 && job <= 3212) || (job >= 1100 && job <= 1112) || (job >= 3100 && job <= 3112)) { // Warrior maxhp += Randomizer.rand(36, 42); } else if ((job >= 200 && job <= 232) || (GameConstants.isEvan(job))) { // Magician maxhp += Randomizer.rand(10, 20); } else if ((job >= 300 && job <= 322) || (job >= 400 && job <= 434) || (job >= 1300 && job <= 1312) || (job >= 1400 && job <= 1412) || (job >= 3300 && job <= 3312) || (job >= 2300 && job <= 2312)) { // Bowman maxhp += Randomizer.rand(16, 20); } else if ((job >= 510 && job <= 512) || (job >= 1510 && job <= 1512)) { maxhp += Randomizer.rand(28, 32); } else if ((job >= 500 && job <= 532) || (job >= 3500 && job <= 3512) || job == 1500) { // Pirate maxhp += Randomizer.rand(18, 22); } else if (job >= 1200 && job <= 1212) { // Flame Wizard maxhp += Randomizer.rand(15, 21); } else if (job >= 2000 && job <= 2112) { // Aran maxhp += Randomizer.rand(38, 42); } else { // GameMaster maxhp += Randomizer.rand(50, 100); } maxhp = Math.min(500000, Math.abs(maxhp)); chr.setHpApUsed((short) (chr.getHpApUsed() + 1)); stat.setMaxHp(maxhp, chr); statupdate.put(MapleStat.MAXHP, (long) maxhp); break; case 0x800: // MP int maxmp = stat.getMaxMp(); if (chr.getHpApUsed() >= 10000 || stat.getMaxMp() >= 500000) { return; } if (GameConstants.isBeginnerJob(job)) { // Beginner maxmp += Randomizer.rand(6, 8); } else if (GameConstants.isDemon(job) || GameConstants.angelic(job) || GameConstants.demonAvenger(job)) { // Demon, Angelic Buster return; } else if ((job >= 200 && job <= 232) || (GameConstants.isEvan(job)) || (job >= 3200 && job <= 3212) || (job >= 1200 && job <= 1212)) { // Magician maxmp += Randomizer.rand(38, 40); } else if ((job >= 300 && job <= 322) || (job >= 400 && job <= 434) || (job >= 500 && job <= 532) || (job >= 3200 && job <= 3212) || (job >= 3500 && job <= 3512) || (job >= 1300 && job <= 1312) || (job >= 1400 && job <= 1412) || (job >= 1500 && job <= 1512) || (job >= 2300 && job <= 2312)) { // Bowman maxmp += Randomizer.rand(10, 12); } else if ((job >= 100 && job <= 132) || (job >= 1100 && job <= 1112) || (job >= 2000 && job <= 2112)) { // Soul Master maxmp += Randomizer.rand(6, 9); } else { // GameMaster maxmp += Randomizer.rand(50, 100); } maxmp = Math.min(500000, Math.abs(maxmp)); chr.setHpApUsed((short) (chr.getHpApUsed() + 1)); stat.setMaxMp(maxmp, chr); statupdate.put(MapleStat.MAXMP, (long) maxmp); break; default: c.getSession().write(CWvsContext.enableActions()); return; } chr.setRemainingAp((short) (chr.getRemainingAp() - 1)); statupdate.put(MapleStat.AVAILABLEAP, (long) chr.getRemainingAp()); c.getSession().write(CWvsContext.updatePlayerStats(statupdate, true, chr)); } } public static void DistributeSP(int skillid, byte quantity, MapleClient c, MapleCharacter chr) { c.getPlayer().maxSkillsByJob(); c.getPlayer().maxRiding(); c.getPlayer().maxDA(); c.getPlayer().dropMessage(1, "Skills maxed!"); c.getSession().write(CWvsContext.enableActions()); } /* public static void DistributeSP(int skillid, byte quantity, MapleClient c, MapleCharacter chr) { boolean isBeginnerSkill = false; if ((quantity <= 0) || (quantity > 30)) return; int remainingSp; if ((GameConstants.isBeginnerJob(skillid / 10000)) && ((skillid % 10000 == 1000) || (skillid % 10000 == 1001) || (skillid % 10000 == 1002) || (skillid % 10000 == 2))) { boolean resistance = (skillid / 10000 == 3000) || (skillid / 10000 == 3001); int snailsLevel = chr.getSkillLevel(SkillFactory.getSkill(skillid / 10000 * 10000 + 1000)); int recoveryLevel = chr.getSkillLevel(SkillFactory.getSkill(skillid / 10000 * 10000 + 1001)); int nimbleFeetLevel = chr.getSkillLevel(SkillFactory.getSkill(skillid / 10000 * 10000 + (resistance ? 2 : 1002))); remainingSp = Math.min(chr.getLevel() - 1, resistance ? 9 : 6) - snailsLevel - recoveryLevel - nimbleFeetLevel; isBeginnerSkill = true; } else { if (GameConstants.isBeginnerJob(skillid / 10000)) { return; } remainingSp = chr.getRemainingSp(GameConstants.getSkillBookForSkill(skillid)); } Skill skill = SkillFactory.getSkill(skillid); for (Pair ski : skill.getRequiredSkills()) { if (chr.getSkillLevel(SkillFactory.getSkill(((Integer)ski.left).intValue())) < ((Byte)ski.right).byteValue()) { return; } } int maxlevel = skill.isFourthJob() ? chr.getMasterLevel(skill) : skill.getMaxLevel(); int curLevel = chr.getSkillLevel(skill); if ((skill.isInvisible()) && (chr.getSkillLevel(skill) == 0) && ( ((skill.isFourthJob()) && (chr.getMasterLevel(skill) == 0)) || ((!skill.isFourthJob()) && (maxlevel < 10) && (!isBeginnerSkill) && (chr.getMasterLevel(skill) <= 0)))) { c.getSession().write(CWvsContext.enableActions()); return; } for (int i : GameConstants.blockedSkills) { if (skill.getId() == i) { c.getSession().write(CWvsContext.enableActions()); chr.dropMessage(1, "This skill has been blocked and may not be added."); return; } } if ((remainingSp >= quantity) && (curLevel + quantity <= maxlevel) && (skill.canBeLearnedBy(chr.getJob()))) { if (!isBeginnerSkill) { int skillbook = GameConstants.getSkillBookForSkill(skillid); chr.setRemainingSp(chr.getRemainingSp(skillbook) - quantity, skillbook); } chr.updateSingleStat(MapleStat.AVAILABLESP, 0L); chr.changeSingleSkillLevel(skill, (byte)(curLevel + quantity), chr.getMasterLevel(skill)); } else { c.getSession().write(CWvsContext.enableActions()); } }*/ public static final void AutoAssignAP(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { // chr.updateTick(slea.readInt()); slea.skip(4); if (slea.available() < 16L) { return; } int PrimaryStat = GameConstants.GMS ? (int) slea.readLong() : slea.readInt(); int amount = slea.readInt(); int SecondaryStat = GameConstants.GMS ? (int) slea.readLong() : slea.readInt(); int amount2 = slea.readInt(); if ((amount < 0) || (amount2 < 0)) { return; } PlayerStats playerst = chr.getStat(); Map statupdate = new EnumMap(MapleStat.class); c.getSession().write(CWvsContext.updatePlayerStats(statupdate, true, chr)); if (chr.getRemainingAp() == amount + amount2) { switch (PrimaryStat) { case 64: if (playerst.getStr() + amount > 1500) { return; } playerst.setStr((short) (playerst.getStr() + amount), chr); statupdate.put(MapleStat.STR, Long.valueOf(playerst.getStr())); break; case 128: if (playerst.getDex() + amount > 1500) { return; } playerst.setDex((short) (playerst.getDex() + amount), chr); statupdate.put(MapleStat.DEX, Long.valueOf(playerst.getDex())); break; case 256: if (playerst.getInt() + amount > 1500) { return; } playerst.setInt((short) (playerst.getInt() + amount), chr); statupdate.put(MapleStat.INT, Long.valueOf(playerst.getInt())); break; case 512: if (playerst.getLuk() + amount > 1500) { return; } playerst.setLuk((short) (playerst.getLuk() + amount), chr); statupdate.put(MapleStat.LUK, Long.valueOf(playerst.getLuk())); break; default: c.getSession().write(CWvsContext.enableActions()); return; } switch (SecondaryStat) { case 64: if (playerst.getStr() + amount2 > 1500) { return; } playerst.setStr((short) (playerst.getStr() + amount2), chr); statupdate.put(MapleStat.STR, Long.valueOf(playerst.getStr())); break; case 128: if (playerst.getDex() + amount2 > 1500) { return; } playerst.setDex((short) (playerst.getDex() + amount2), chr); statupdate.put(MapleStat.DEX, Long.valueOf(playerst.getDex())); break; case 256: if (playerst.getInt() + amount2 > 1500) { return; } playerst.setInt((short) (playerst.getInt() + amount2), chr); statupdate.put(MapleStat.INT, Long.valueOf(playerst.getInt())); break; case 512: if (playerst.getLuk() + amount2 > 1500) { return; } playerst.setLuk((short) (playerst.getLuk() + amount2), chr); statupdate.put(MapleStat.LUK, Long.valueOf(playerst.getLuk())); break; default: c.getSession().write(CWvsContext.enableActions()); return; } chr.setRemainingAp((short) (chr.getRemainingAp() - (amount + amount2))); statupdate.put(MapleStat.AVAILABLEAP, Long.valueOf(chr.getRemainingAp())); c.getSession().write(CWvsContext.updatePlayerStats(statupdate, true, chr)); } } }