Skill.java
上传用户:gwt600
上传日期:2021-06-03
资源大小:704k
文件大小:11k
源码类别:

游戏

开发平台:

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.client;
  19. import java.util.ArrayList;
  20. import java.util.List;
  21. import net.sf.odinms.provider.MapleData;
  22. import net.sf.odinms.provider.MapleDataTool;
  23. import net.sf.odinms.server.MapleStatEffect;
  24. import net.sf.odinms.server.life.Element;
  25. public class Skill implements ISkill {
  26.     private int id;
  27.     private List<MapleStatEffect> effects = new ArrayList<MapleStatEffect>();
  28.     private Element element;
  29.     private int animationTime;
  30.     private Skill(int id) {
  31.         super();
  32.         this.id = id;
  33.     }
  34.     @Override
  35.     public int getId() {
  36.         return id;
  37.     }
  38.     public static Skill loadFromData(int id, MapleData data) {
  39.         Skill ret = new Skill(id);
  40.         boolean isBuff = false;
  41.         int skillType = MapleDataTool.getInt("skillType", data, -1);
  42.         String elem = MapleDataTool.getString("elemAttr", data, null);
  43.         if (elem != null) {
  44.             ret.element = Element.getFromChar(elem.charAt(0));
  45.         } else {
  46.             ret.element = Element.NEUTRAL;
  47.         }
  48.         // unfortunatly this is only set for a few skills so we have to do some more to figure out if it's a buff &#65533;.o
  49.         MapleData effect = data.getChildByPath("effect");
  50.         if (skillType != -1) {
  51.             if (skillType == 2) {
  52.                 isBuff = true;
  53.             }
  54.         } else {
  55.             MapleData action = data.getChildByPath("action");
  56.             MapleData hit = data.getChildByPath("hit");
  57.             MapleData ball = data.getChildByPath("ball");
  58.             isBuff = effect != null && hit == null && ball == null;
  59.             isBuff |= action != null && MapleDataTool.getString("0", action, "").equals("alert2");
  60.             switch (id) {
  61.                 case 1121006: // rush
  62.                 case 1221007: // rush
  63. case 1321003: // rush
  64.                 case 1311005: // sacrifice
  65. case 2121001: //big bang
  66. case 2221001: //big bang
  67. case 2321001: //big bang
  68.                 case 2111002: // explosion
  69.                 case 2111003: // poison mist
  70.                 case 2301002: // heal
  71.                 case 3110001: // mortal blow
  72.                 case 3210001: // mortal blow
  73.                 case 4101005: // drain
  74.                 case 4111003: // shadow web
  75.                     case 4221004:
  76.                         case 5121009:
  77.                 case 4201004: // steal
  78.                 case 4221006: // smokescreen
  79.                 case 9101000: // heal + dispel
  80.                 case 5201006: // Recoil Shot
  81.                 case 5111004: // Energy Drain
  82.                 case 1121001: // monster magnet
  83.                 case 1221001: // monster magnet
  84.                 case 1321001: // monster magnet
  85.                     isBuff = false;
  86.                     break;
  87.                 case 1001: // recovery
  88.                 case 1002: // nimble feet 
  89.                 case 1004: // monster riding
  90.                 case 1005: // echo of hero
  91.                 case 1001003: // iron body
  92.                 case 1101004: // sword booster
  93.                 case 1201004: // sword booster
  94.                 case 1101005: // axe booster
  95.                 case 1201005: // bw booster
  96.                 case 1301004: // spear booster
  97.                 case 1301005: // polearm booster 
  98.                 case 3101002: // bow booster
  99.                 case 3201002: // crossbow booster
  100.                 case 4101003: // claw booster
  101.                 case 4201002: // dagger booster
  102.                 case 1101007: // power guard
  103.                 case 1201007: // power guard
  104.                 case 1101006: // rage
  105.                 case 1301006: // iron will
  106.                 case 1301007: // hyperbody
  107.                 case 1111002: // combo attack
  108.                 case 1211006: // blizzard charge bw
  109.                 case 1211004: // fire charge bw
  110.                 case 1211008: // lightning charge bw
  111.                 case 1221004: // divine charge bw
  112.                 case 1211003: // fire charge sword
  113.                 case 1211005: // ice charge sword
  114.                 case 1211007: // thunder charge sword
  115.                 case 1221003: // holy charge sword
  116.                 case 1311008: // dragon blood
  117.                 case 1121000: // maple warrior
  118.                 case 1221000: // maple warrior
  119.                 case 1321000: // maple warrior
  120.                 case 2121000: // maple warrior
  121.                 case 2221000: // maple warrior
  122.                 case 2321000: // maple warrior
  123.                 case 3121000: // maple warrior
  124.                 case 3221000: // maple warrior
  125.                 case 4121000: // maple warrior
  126.                 case 4221000: // maple warrior
  127.                 case 1121002: // power stance
  128.                 case 1221002: // power stance
  129.                 case 1321002: // power stance
  130.                 case 1121010: // enrage
  131. case 1321007: // beholder
  132.                 case 1320008: // beholder healing
  133.                 case 1320009: // beholder buff
  134.                 case 2001002: // magic guard
  135.                 case 2001003: // magic armor
  136.                 case 2101001: // meditation
  137.                 case 2201001: // meditation
  138.                 case 2301003: // invincible
  139.                 case 2301004: // bless
  140.                 case 2111005: // spell booster
  141.                 case 2211005: // spell booster
  142.                 case 2311003: // holy symbol
  143.                 case 2311006: // summon dragon
  144.                 case 2121004: // infinity
  145.                 case 2221004: // infinity
  146.                 case 2321004: // infinity
  147.                 case 2321005: // holy shield
  148.                 case 2121005: // elquines
  149.                 case 2221005: // ifrit
  150.                 case 2321003: // bahamut
  151.                 case 3121006: // phoenix
  152.                 case 3221005: // frostprey
  153.                 case 3111002: // puppet
  154.                 case 3211002: // puppet
  155.                 case 3111005: // silver hawk
  156.                 case 3211005: // golden eagle
  157.                 case 3001003: // focus
  158.                 case 3101004: // soul arrow bow
  159.                 case 3201004: // soul arrow crossbow
  160.                 case 3121002: // sharp eyes
  161.                 case 3221002: // sharp eyes
  162.                 case 3121008: // concentrate
  163.                 case 3221006: // blind
  164.                 case 4001003: // dark sight
  165.                 case 4101004: // haste
  166.                 case 4201003: // haste
  167.                 case 4111001: // meso up
  168.                 case 4111002: // shadow partner
  169.                 case 4121006: // shadow stars
  170.                 case 4211003: // pick pocket
  171.                 case 4211005: // meso guard
  172.                 case 5111005: // Transformation (Buccaneer)
  173.                 case 5121003: // Super Transformation (Viper)
  174.                 case 5220002: // wrath of the octopi
  175.                 case 5211001: // Pirate octopus summon
  176.                 case 5211002: // Pirate bird summon
  177.                 case 5221006: // BattleShip
  178.                 case 9001000: // haste
  179.                 case 9101001: // super haste
  180.                 case 9101002: // holy symbol
  181.                 case 9101003: // bless
  182.                 case 9101004: // hide
  183.                 case 9101008: // hyper body
  184.                 case 1121011: // hero's will
  185.                 case 1221012: // hero's will
  186.                 case 1321010: // hero's will
  187.                 case 2321009: // hero's will
  188.                 case 2221008: // hero's will
  189.                 case 2121008: // hero's will
  190.                 case 3121009: // hero's will
  191.                 case 3221008: // hero's will
  192.                 case 4121009: // hero's will
  193.                 case 4221008: // hero's will
  194.                 case 2101003: // slow
  195.                 case 2201003: // slow
  196.                 case 2111004: // seal
  197.                 case 2211004: // seal
  198.                 case 1111007: // armor crash
  199.                 case 1211009: // magic crash
  200.                 case 1311007: // power crash
  201.                 case 2311005: // doom 
  202.                 case 2121002: // mana reflection
  203.                 case 2221002: // mana reflection
  204.                 case 2321002: // mana reflection
  205.                 case 2311001: // dispel
  206.                 case 1201006: // threaten 
  207.                 case 4121004: // ninja ambush
  208.                     isBuff = true;
  209.                     break;
  210.             }
  211.         }
  212.         for (MapleData level : data.getChildByPath("level")) {
  213.             MapleStatEffect statEffect = MapleStatEffect.loadSkillEffectFromData(level, id, isBuff);
  214.             ret.effects.add(statEffect);
  215.         }
  216.         ret.animationTime = 0;
  217.         if (effect != null) {
  218.             for (MapleData effectEntry : effect) {
  219.                 ret.animationTime += MapleDataTool.getIntConvert("delay", effectEntry, 0);
  220.             }
  221.         }
  222.         return ret;
  223.     }
  224.     @Override
  225.     public MapleStatEffect getEffect(int level) {
  226.         return effects.get(level - 1);
  227.     }
  228.     @Override
  229.     public int getMaxLevel() {
  230.         return effects.size();
  231.     }
  232.     @Override
  233.     public boolean canBeLearnedBy(MapleJob job) {
  234.         int jid = job.getId();
  235.         int skillForJob = id / 10000;
  236.         if (jid / 100 != skillForJob / 100 && skillForJob / 100 != 0) { // wrong job
  237.             return false;
  238.         }
  239.         if ((skillForJob / 10) % 10 > (jid / 10) % 10) { // wrong 2nd job
  240.             return false;
  241.         }
  242.         if (skillForJob % 10 > jid % 10) { // wrong 3rd/4th job
  243.             return false;
  244.         }
  245.         return true;
  246.     }
  247.     @Override
  248.     public boolean isFourthJob() {
  249.         return ((id / 10000) % 10) == 2;
  250.     }
  251.     @Override
  252.     public Element getElement() {
  253.         return element;
  254.     }
  255.     @Override
  256.     public int getAnimationTime() {
  257.         return animationTime;
  258.     }
  259.     @Override
  260.     public boolean isBeginnerSkill() {
  261.         boolean output = false;
  262.         String idString = String.valueOf(id);
  263.         if (idString.length() == 4 || idString.length() == 1) {
  264.             output = true;
  265.         }
  266.         return output;
  267.     }
  268.     @Override
  269.     public boolean isGMSkill() {
  270.         if (id > 9000000) {
  271.             return true;
  272.         }
  273.         return false;
  274.     }
  275. }