MXD-Server/src/client/Skill.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;
}
}