313 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			313 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Java
		
	
	
	
| package client;
 | |
| 
 | |
| import constants.GameConstants;
 | |
| 
 | |
| import java.util.Iterator;
 | |
| 
 | |
| import provider.MapleDataTool;
 | |
| import provider.MapleData;
 | |
| 
 | |
| import java.util.ArrayList;
 | |
| 
 | |
| import server.life.Element;
 | |
| import server.MapleStatEffect;
 | |
| 
 | |
| import java.util.List;
 | |
| 
 | |
| public class Skill implements ISkill {
 | |
|     private String name;
 | |
|     private final List<MapleStatEffect> effects;
 | |
|     private Element element;
 | |
|     private byte level;
 | |
|     private final int id;
 | |
|     private int animationTime;
 | |
|     private int requiredSkill;
 | |
|     private int masterLevel;
 | |
|     private boolean action;
 | |
|     private boolean invisible;
 | |
|     private boolean chargeskill;
 | |
|     private boolean timeLimited;
 | |
| 
 | |
|     public Skill(final int id) {
 | |
|         this.name = "";
 | |
|         this.effects = (List<MapleStatEffect>) new ArrayList();
 | |
|         this.id = id;
 | |
|     }
 | |
| 
 | |
|     public void setName(final String name) {
 | |
|         this.name = name;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public int getId() {
 | |
|         return this.id;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public String getName() {
 | |
|         return this.name;
 | |
|     }
 | |
| 
 | |
|     public static final Skill loadFromData(final int id, final MapleData data) {
 | |
|         final Skill ret = new Skill(id);
 | |
|         boolean isBuff = false;
 | |
|         final int skillType = MapleDataTool.getInt("skillType", data, -1);
 | |
|         final String elem = MapleDataTool.getString("elemAttr", data, null);
 | |
|         if (elem != null) {
 | |
|             ret.element = Element.getFromChar(elem.charAt(0));
 | |
|         } else {
 | |
|             ret.element = Element.NEUTRAL;
 | |
|         }
 | |
|         ret.invisible = (MapleDataTool.getInt("invisible", data, 0) > 0);
 | |
|         ret.timeLimited = (MapleDataTool.getInt("timeLimited", data, 0) > 0);
 | |
|         ret.masterLevel = MapleDataTool.getInt("masterLevel", data, 0);
 | |
|         final MapleData effect = data.getChildByPath("effect");
 | |
|         if (skillType != -1) {
 | |
|             if (skillType == 2) {
 | |
|                 isBuff = true;
 | |
|             }
 | |
|         } else {
 | |
|             final MapleData action_ = data.getChildByPath("action");
 | |
|             final MapleData hit = data.getChildByPath("hit");
 | |
|             final MapleData ball = data.getChildByPath("ball");
 | |
|             boolean action = false;
 | |
|             if (action_ == null) {
 | |
|                 if (data.getChildByPath("prepare/action") != null) {
 | |
|                     action = true;
 | |
|                 } else {
 | |
|                     switch (id) {
 | |
|                         case 3101005:
 | |
|                         case 4221001:
 | |
|                         case 4321000:
 | |
|                         case 4321001:
 | |
|                         case 4331001:
 | |
|                         case 5201001:
 | |
|                         case 5221009: {
 | |
|                             action = true;
 | |
|                             break;
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             } else {
 | |
|                 action = true;
 | |
|             }
 | |
|             ret.action = action;
 | |
|             isBuff = (effect != null && hit == null && ball == null);
 | |
|             isBuff |= (action_ != null && MapleDataTool.getString("0", action_, "").equals("alert2"));
 | |
|             switch (id) {
 | |
|                 case 2111002:
 | |
|                 case 2111003:
 | |
|                 case 2121001:
 | |
|                 case 2221001:
 | |
|                 case 2301002:
 | |
|                 case 2321001:
 | |
|                 case 4211001:
 | |
|                 case 12111005: {
 | |
|                     isBuff = false;
 | |
|                     break;
 | |
|                 }
 | |
|                 case 1004:
 | |
|                 case 1026:
 | |
|                 case 1111002:
 | |
|                 case 1111007:
 | |
|                 case 1211009:
 | |
|                 case 1311007:
 | |
|                 case 1320009:
 | |
|                 case 4111001:
 | |
|                 case 4211003:
 | |
|                 case 4321000:
 | |
|                 case 4331003:
 | |
|                 case 4341002:
 | |
|                 case 5001005:
 | |
|                 case 5110001:
 | |
|                 case 5111005:
 | |
|                 case 5121003:
 | |
|                 case 5121009:
 | |
|                 case 5211001:
 | |
|                 case 5211002:
 | |
|                 case 5211006:
 | |
|                 case 5220002:
 | |
|                 case 5220011:
 | |
|                 case 9001004:
 | |
|                 case 9101004:
 | |
|                 case 10001004:
 | |
|                 case 10001026:
 | |
|                 case 11111001:
 | |
|                 case 12101005:
 | |
|                 case 13111005:
 | |
|                 case 15001003:
 | |
|                 case 15100004:
 | |
|                 case 15101006:
 | |
|                 case 15111002:
 | |
|                 case 15111005:
 | |
|                 case 15111006:
 | |
|                 case 20001004:
 | |
|                 case 20001026:
 | |
|                 case 20011004:
 | |
|                 case 20011026:
 | |
|                 case 21000000:
 | |
|                 case 21101003:
 | |
|                 case 22121001:
 | |
|                 case 22131001:
 | |
|                 case 22141002:
 | |
|                 case 22151002:
 | |
|                 case 22151003:
 | |
|                 case 22171000:
 | |
|                 case 22171004:
 | |
|                 case 22181000:
 | |
|                 case 22181003:
 | |
|                 case 30001004:
 | |
|                 case 30001026:
 | |
|                 case 32001003:
 | |
|                 case 32101002:
 | |
|                 case 32101003:
 | |
|                 case 32110000:
 | |
|                 case 32120000:
 | |
|                 case 32120001:
 | |
|                 case 33111003:
 | |
|                 case 35001001:
 | |
|                 case 35001002:
 | |
|                 case 35101002:
 | |
|                 case 35101007:
 | |
|                 case 35101009:
 | |
|                 case 35111007:
 | |
|                 case 35120000:
 | |
|                 case 35121005:
 | |
|                 case 35121006:
 | |
|                 case 35121013: {
 | |
|                     isBuff = true;
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         ret.chargeskill = (data.getChildByPath("keydown") != null);
 | |
|         for (final MapleData level : data.getChildByPath("level")) {
 | |
|             ret.effects.add(MapleStatEffect.loadSkillEffectFromData(level, id, isBuff, Byte.parseByte(level.getName())));
 | |
|         }
 | |
|         final MapleData reqDataRoot = data.getChildByPath("req");
 | |
|         if (reqDataRoot != null) {
 | |
|             for (final MapleData reqData : reqDataRoot.getChildren()) {
 | |
|                 ret.requiredSkill = Integer.parseInt(reqData.getName());
 | |
|                 ret.level = (byte) MapleDataTool.getInt(reqData, 1);
 | |
|             }
 | |
|         }
 | |
|         ret.animationTime = 0;
 | |
|         if (effect != null) {
 | |
|             for (final MapleData effectEntry : effect) {
 | |
|                 final Skill skill = ret;
 | |
|                 skill.animationTime += MapleDataTool.getIntConvert("delay", effectEntry, 0);
 | |
|             }
 | |
|         }
 | |
|         return ret;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public MapleStatEffect getEffect(final int level) {
 | |
|         if (this.effects.size() < level) {
 | |
|             if (this.effects.size() > 0) {
 | |
|                 return (MapleStatEffect) this.effects.get(this.effects.size() - 1);
 | |
|             }
 | |
|             return null;
 | |
|         } else {
 | |
|             if (level <= 0) {
 | |
|                 return (MapleStatEffect) this.effects.get(0);
 | |
|             }
 | |
|             return (MapleStatEffect) this.effects.get(level - 1);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public MapleStatEffect getEffect1(final int level) {
 | |
|         if (this.effects.size() <= level) {
 | |
|             for (int a = 0; a < this.effects.size(); ++a) {
 | |
|                 if (((MapleStatEffect) this.effects.get(a)).getLevel() == level) {
 | |
|                     return (MapleStatEffect) this.effects.get(a);
 | |
|                 }
 | |
|             }
 | |
|             return null;
 | |
|         }
 | |
|         if (level <= 0) {
 | |
|             return (MapleStatEffect) this.effects.get(0);
 | |
|         }
 | |
|         return (MapleStatEffect) this.effects.get(level - 1);
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public boolean hasAction() {
 | |
|         return this.action;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public boolean isChargeSkill() {
 | |
|         return this.chargeskill;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public boolean isInvisible() {
 | |
|         return this.invisible;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public boolean hasRequiredSkill() {
 | |
|         return this.level > 0;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public int getRequiredSkillLevel() {
 | |
|         return this.level;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public int getRequiredSkillId() {
 | |
|         return this.requiredSkill;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public byte getMaxLevel() {
 | |
|         return (byte) this.effects.size();
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public boolean canBeLearnedBy(final int job) {
 | |
|         final int jid = job;
 | |
|         final int skillForJob = this.id / 10000;
 | |
|         return jid / 100 == skillForJob / 100 && jid / 1000 == skillForJob / 1000 && (!GameConstants.isAdventurer(skillForJob) || GameConstants.isAdventurer(job)) && (!GameConstants.isKOC(skillForJob) || GameConstants.isKOC(job)) && (!GameConstants.isAran(skillForJob) || GameConstants.isAran(job)) && skillForJob / 10 % 10 <= jid / 10 % 10 && skillForJob % 10 <= jid % 10;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public boolean isTimeLimited() {
 | |
|         return this.timeLimited;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public boolean isFourthJob() {
 | |
|         if (this.id / 10000 >= 2212 && this.id / 10000 < 3000) {
 | |
|             return this.id / 10000 % 10 >= 7;
 | |
|         }
 | |
|         if (this.id / 10000 >= 430 && this.id / 10000 <= 434) {
 | |
|             return this.id / 10000 % 10 == 4 || this.getMasterLevel() > 0;
 | |
|         }
 | |
|         return this.id / 10000 % 10 == 2;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public Element getElement() {
 | |
|         return this.element;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public int getAnimationTime() {
 | |
|         return this.animationTime;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public int getMasterLevel() {
 | |
|         return this.masterLevel;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public boolean isBeginnerSkill() {
 | |
|         final int jobId = this.id / 10000;
 | |
|         return jobId == 0 || jobId == 1000 || jobId == 2000 || jobId == 2001 || jobId == 3000;
 | |
|     }
 | |
| }
 |