package handling.channel.handler; import client.MapleCharacter; import client.MapleClient; import client.MapleStat; import client.PlayerStats; import client.Skill; import client.SkillEntry; import client.SkillFactory; import constants.GameConstants; import java.util.EnumMap; import java.util.HashMap; import java.util.Map; import server.Randomizer; import tools.MaplePacketCreator; import tools.Pair; import tools.data.input.SeekableLittleEndianAccessor; public class StatsHandling { /** * 分配能力点 * @param slea * @param c * @param chr */ public static void DistributeAP(SeekableLittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { // 2E 40 00 00 00 Map statupdate = new EnumMap(MapleStat.class); c.getSession().write(MaplePacketCreator.updatePlayerStats(statupdate, true, chr)); PlayerStats stat = chr.getStat(); int job = chr.getJob(); if (chr.getRemainingAp() > 0) { switch (slea.readInt()) { case 0x40: stat.setStr((short) (stat.getStr() + 1), chr); statupdate.put(MapleStat.力量, (long) stat.getStr()); break; case 0x80: stat.setDex((short) (stat.getDex() + 1), chr); statupdate.put(MapleStat.敏捷, (long) stat.getDex()); break; case 0x100: stat.setInt((short) (stat.getInt() + 1), chr); statupdate.put(MapleStat.智力, (long) stat.getInt()); break; case 0x200: stat.setLuk((short) (stat.getLuk() + 1), chr); statupdate.put(MapleStat.运气, (long) stat.getLuk()); break; case 0x800: int maxhp = stat.getMaxHp(); if (GameConstants.is新手职业(job)) { maxhp += Randomizer.rand(8, 12); } else if (((job >= 100) && (job <= 132)) ) { maxhp += Randomizer.rand(36, 42); } else if (((job >= 200) && (job <= 232))) { maxhp += Randomizer.rand(10, 20); } else if (((job >= 300) && (job <= 322)) || ((job >= 400) && (job <= 434))) { maxhp += Randomizer.rand(16, 20); } else if (((job >= 510) && (job <= 512)) ) { maxhp += Randomizer.rand(28, 32); } else if (((job >= 500) && (job <= 532)) ) { maxhp += Randomizer.rand(18, 22); } else { maxhp += Randomizer.rand(18, 26); } maxhp = Math.min(chr.getMaxHpForSever(), Math.abs(maxhp)); chr.setHpApUsed((short) (chr.getHpApUsed() + 1)); stat.setMaxHp(maxhp, chr); statupdate.put(MapleStat.MAXHP, (long) maxhp); break; case 0x2000: int maxmp = stat.getMaxMp(); if ((chr.getHpApUsed() >= 10000) || (stat.getMaxMp() >= chr.getMaxMpForSever())) { return; } if (GameConstants.is新手职业(job)) { maxmp += Randomizer.rand(6, 8); } else { if (((job >= 200) && (job <= 232))) { maxmp += Randomizer.rand(38, 40); } else if (((job >= 300) && (job <= 322)) || ((job >= 400) && (job <= 434)) || ((job >= 500) && (job <= 532))) { maxmp += Randomizer.rand(10, 12); } else if (((job >= 100) && (job <= 132))) { maxmp += Randomizer.rand(6, 9); } else { maxmp += Randomizer.rand(6, 12); } } maxmp = Math.min(chr.getMaxMpForSever(), Math.abs(maxmp)); chr.setHpApUsed((short) (chr.getHpApUsed() + 1)); stat.setMaxMp(maxmp, chr); statupdate.put(MapleStat.MAXMP, (long) maxmp); break; default: c.getSession().write(MaplePacketCreator.updatePlayerStats(new EnumMap(MapleStat.class), true, chr)); return; } chr.setRemainingAp((short) (chr.getRemainingAp() - 1)); statupdate.put(MapleStat.AVAILABLEAP, (long) chr.getRemainingAp()); c.getSession().write(MaplePacketCreator.updatePlayerStats(statupdate, true, chr)); } } /** * 添加技能点 * @param slea * @param c * @param chr */ public static void DistributeSP(SeekableLittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { // 30 40 42 0F 00 int skillid = slea.readInt(); boolean isBeginnerSkill = false; int remainingSp = chr.getRemainingSp(); if (skillid == 1000 || skillid == 1001 || skillid == 1002) { 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; } Skill skill = SkillFactory.getSkill(skillid); if (skill == null) { if (chr.isShowPacket()) { chr.dropMessage(5, "加技能点错误 - 技能为空 当前技能ID: " + skillid); } c.getSession().write(MaplePacketCreator.enableActions()); return; } for (Pair<String, Integer> ski : skill.getRequiredSkills()) { switch (ski.left) { case "level": if (chr.getLevel() < ski.right) { if (chr.isShowPacket()) { chr.dropMessage(5, "加技能点错误 - 技能要求等级: " + ski.right + " 当前角色等级: " + chr.getLevel()); } c.getSession().write(MaplePacketCreator.enableActions()); return; } break; default: int left = Integer.parseInt(ski.left); if (chr.getSkillLevel(SkillFactory.getSkill(left)) < ski.right) { if (chr.isShowPacket()) { chr.dropMessage(5, "加技能点错误 - 前置技能: " + left + " - " + SkillFactory.getSkillName(left) + " 的技能等级不足."); } c.getSession().write(MaplePacketCreator.enableActions()); return; } break; } } int maxlevel = skill.getMaxLevel(); int curLevel = chr.getSkillLevel(skill); if ((skill.isInvisible()) && (curLevel == 0) && (((maxlevel < 10) && (!isBeginnerSkill)))) { if (chr.isShowPacket()) { chr.dropMessage(5, "加技能点错误 - 3"); } c.getSession().write(MaplePacketCreator.enableActions()); return; } if (chr.isShowPacket()) { chr.dropMessage(5, "开始加技能点 - 技能ID: " + skillid + "当前技能等级: " + curLevel + " 该技能最大等级: " + maxlevel); } if ((remainingSp >= 0) && (curLevel + 1 <= maxlevel) && (skill.canBeLearnedBy(chr.getJob()))) { if (!isBeginnerSkill) { chr.setRemainingSp(chr.getRemainingSp() - 1); } Map statup = new EnumMap(MapleStat.class); statup.put(MapleStat.AVAILABLESP, (long)chr.getRemainingSp()); c.getSession().write(MaplePacketCreator.updatePlayerStats(statup, true, chr)); chr.changeSingleSkillLevel(skill, (byte) (curLevel + 1), chr.getMasterLevel(skill)); } else { if (chr.isShowPacket()) { chr.dropMessage(5, "加技能点错误 - SP点数不足够或者技能不是改角色的技能."); } c.getSession().write(MaplePacketCreator.enableActions()); } } }