DistributeSPHandler.java
Upload User: gwt600
Upload Date: 2021-06-03
Package Size: 704k
Code Size: 3k
Category:

Games

Development Platform:

Java

  1. /*
  2. This file is part of the OdinMS Maple Story Server
  3. Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc> 
  4. Matthias Butz <matze@odinms.de>
  5. Jan Christian Meyer <vimes@odinms.de>
  6. This program is free software: you can redistribute it and/or modify
  7. it under the terms of the GNU Affero General Public License version 3
  8. as published by the Free Software Foundation. You may not use, modify
  9. or distribute this program under any other version of the
  10. GNU Affero General Public License.
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU Affero General Public License for more details.
  15. You should have received a copy of the GNU Affero General Public License
  16. along with this program.  If not, see <http://www.gnu.org/licenses/>.
  17.  */
  18. package net.sf.odinms.net.channel.handler;
  19. import net.sf.odinms.client.ISkill;
  20. import net.sf.odinms.client.MapleCharacter;
  21. import net.sf.odinms.client.MapleClient;
  22. import net.sf.odinms.client.MapleStat;
  23. import net.sf.odinms.client.SkillFactory;
  24. import net.sf.odinms.net.AbstractMaplePacketHandler;
  25. import net.sf.odinms.tools.data.input.SeekableLittleEndianAccessor;
  26. public class DistributeSPHandler extends AbstractMaplePacketHandler {
  27.     private class SP {
  28.         private ISkill skill;
  29.         private MapleClient c;
  30.         SP(MapleClient c, ISkill skill) {
  31.             this.skill = skill;
  32.             this.c = c;
  33.         }
  34.         public ISkill getSkill() {
  35.             return skill;
  36.         }
  37.         public MapleClient getClient() {
  38.             return c;
  39.         }
  40.     }
  41.     private void addSP(SP sp) {
  42.         ISkill skill = sp.getSkill();
  43.         MapleCharacter player = sp.getClient().getPlayer();
  44.         int remainingSp = player.getRemainingSp();
  45.         switch (skill.getId()) {
  46.             case 8:
  47.             case 1003:
  48.             case 1004:
  49.             case 1005:
  50.                 player.getClient().disconnect();
  51.                 return;
  52.             case 1000:
  53.             case 1001:
  54.             case 1002:
  55.                 int snailsLevel = player.getSkillLevel(SkillFactory.getSkill(1000));
  56.                 int recoveryLevel = player.getSkillLevel(SkillFactory.getSkill(1001));
  57.                 int nimbleFeetLevel = player.getSkillLevel(SkillFactory.getSkill(1002));
  58.                 remainingSp = Math.min((player.getLevel() - 1), 6) - snailsLevel - recoveryLevel - nimbleFeetLevel;
  59.         }
  60.         int maxlevel = skill.isFourthJob() ? player.getMasterLevel(skill) : skill.getMaxLevel();
  61.         int curLevel = player.getSkillLevel(skill);
  62.         if (remainingSp > 0 && curLevel + 1 <= maxlevel && skill.canBeLearnedBy(player.getJob())) {
  63.             if (!skill.isBeginnerSkill()) {
  64.                 player.setRemainingSp(player.getRemainingSp() - 1);
  65.             }
  66.             player.updateSingleStat(MapleStat.AVAILABLESP, player.getRemainingSp());
  67.             player.changeSkillLevel(skill, curLevel + 1, player.getMasterLevel(skill));
  68.         } else if (!skill.canBeLearnedBy(player.getJob())) {
  69.             player.getClient().disconnect();
  70.             return;
  71.         } else if (!(remainingSp > 0 && curLevel + 1 <= maxlevel)) {
  72.             return;
  73.         }
  74.     }
  75.     @Override
  76.     public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
  77.         slea.readInt();
  78.         SP sp = new SP(c, SkillFactory.getSkill(slea.readInt()));
  79.         addSP(sp);
  80.     }
  81. }