📄 l1skilluse.java
字号:
return false; // ターゲットが死亡している
}
if (cha.isDead() == false
&& (_skillId == CREATE_ZOMBIE
|| _skillId == RESURRECTION
|| _skillId == GREATER_RESURRECTION
|| _skillId == CALL_OF_NATURE)) {
return false; // ターゲットが死亡していない
}
if ((cha instanceof L1TowerInstance || cha instanceof L1DoorInstance)
&& (_skillId == CREATE_ZOMBIE
|| _skillId == RESURRECTION
|| _skillId == GREATER_RESURRECTION
|| _skillId == CALL_OF_NATURE)) {
return false; // ターゲットがガーディアンタワー、ドア
}
if (cha instanceof L1PcInstance) {
L1PcInstance pc = (L1PcInstance) cha;
if (pc.hasSkillEffect(ABSOLUTE_BARRIER)) { // アブソルートバリア中
if (_skillId == CURSE_BLIND || _skillId == WEAPON_BREAK
|| _skillId == DARKNESS || _skillId == WEAKNESS
|| _skillId == DISEASE || _skillId == FOG_OF_SLEEPING
|| _skillId == MASS_SLOW || _skillId == SLOW
|| _skillId == CANCELLATION || _skillId == SILENCE
|| _skillId == DECAY_POTION || _skillId == MASS_TELEPORT
|| _skillId == DETECTION
|| _skillId == COUNTER_DETECTION
|| _skillId == ERASE_MAGIC || _skillId == ENTANGLE
|| _skillId == PHYSICAL_ENCHANT_DEX
|| _skillId == PHYSICAL_ENCHANT_STR
|| _skillId == BLESS_WEAPON || _skillId == EARTH_SKIN
|| _skillId == IMMUNE_TO_HARM
|| _skillId == REMOVE_CURSE) {
return true;
} else {
return false;
}
}
}
if (cha instanceof L1NpcInstance) {
int hiddenStatus = ((L1NpcInstance) cha).getHiddenStatus();
if (hiddenStatus == L1NpcInstance.HIDDEN_STATUS_SINK) {
if (_skillId == DETECTION || _skillId == COUNTER_DETECTION) { // ディテク、Cディテク
return true;
} else {
return false;
}
} else if (hiddenStatus == L1NpcInstance.HIDDEN_STATUS_FLY) {
return false;
}
}
if ((_skill.getTargetTo() & L1Skills.TARGET_TO_PC) == L1Skills.TARGET_TO_PC // ターゲットがPC
&& cha instanceof L1PcInstance) {
_flg = true;
} else if ((_skill.getTargetTo() & L1Skills.TARGET_TO_NPC) == L1Skills.TARGET_TO_NPC // ターゲットがNPC
&& (cha instanceof L1MonsterInstance
|| cha instanceof L1NpcInstance
|| cha instanceof L1SummonInstance || cha instanceof L1PetInstance)) {
_flg = true;
} else if ((_skill.getTargetTo() & L1Skills.TARGET_TO_PET) == L1Skills
.TARGET_TO_PET && _user instanceof L1PcInstance) { // ターゲットがSummon,Pet
if (cha instanceof L1SummonInstance) {
L1SummonInstance summon = (L1SummonInstance) cha;
if (summon.getMaster() != null) {
if (_player.getId() == summon.getMaster().getId()) {
_flg = true;
}
}
}
if (cha instanceof L1PetInstance) {
L1PetInstance pet = (L1PetInstance) cha;
if (pet.getMaster() != null) {
if (_player.getId() == pet.getMaster().getId()) {
_flg = true;
}
}
}
}
if (_calcType == PC_PC && cha instanceof L1PcInstance) {
if ((_skill.getTargetTo() & L1Skills.TARGET_TO_CLAN) == L1Skills.TARGET_TO_CLAN
&& ((_player.getClanid() != 0 // ターゲットがクラン員
&& _player.getClanid() == ((L1PcInstance) cha).getClanid()) || _player
.isGm())) {
return true;
}
if ((_skill.getTargetTo() & L1Skills.TARGET_TO_PARTY) == L1Skills.TARGET_TO_PARTY
&& (_player.getParty() // ターゲットがパーティー
.isMember((L1PcInstance) cha) || _player.isGm())) {
return true;
}
}
return _flg;
}
// ターゲットの一覧を作成
private void makeTargetList() {
try {
if (_type == TYPE_LOGIN) { // ログイン時(死亡時、お化け屋敷のキャンセレーション含む)は使用者のみ
_targetList.add(new TargetStatus(_user));
return;
}
if (_skill.getTargetTo() == L1Skills.TARGET_TO_ME
&& (_skill.getType() & L1Skills.TYPE_ATTACK) != L1Skills.TYPE_ATTACK) {
_targetList.add(new TargetStatus(_user)); // ターゲットは使用者のみ
return;
}
// 射程距離-1の場合は画面内のオブジェクトが対象
if (_skill.getRanged() != -1) {
if (_user.getLocation().getTileLineDistance(
_target.getLocation()) > _skill.getRanged()) {
return; // 射程範囲外
}
} else {
if (!_user.getLocation().isInScreen(_target.getLocation())) {
return; // 射程範囲外
}
}
if (isTarget(_target) == false
&& !(_skill.getTarget().equals("none"))) {
// 対象が違うのでスキルが発動しない。
return;
}
if (_skillId == LIGHTNING) {
// ライトニング直線的に範囲を決める。
ArrayList<L1Object> al1object = L1World.getInstance()
.getVisibleLineObjects(_user, _target);
for (L1Object tgobj : al1object) {
if (tgobj == null) {
continue;
}
if (!(tgobj instanceof L1Character)) { // ターゲットがキャラクター以外の場合何もしない。
continue;
}
L1Character cha = (L1Character) tgobj;
if (isTarget(cha) == false) {
continue;
}
_targetList.add(new TargetStatus(cha));
}
return;
}
if (_skill.getArea() == 0) { // 単体の場合
if (_user.glanceCheck(_target.getX(), _target.getY()) // 直線上に障害物があるか
== false) {
if ((_skill.getType() & L1Skills.TYPE_ATTACK) == L1Skills.TYPE_ATTACK) {
_targetList.add(new TargetStatus(_target, false)); // ダメージも発生しないし、ダメージモーションも発生しないが、スキルは発動
return;
}
}
_targetList.add(new TargetStatus(_target));
} else { // 範囲の場合
if (!_skill.getTarget().equals("none")) {
_targetList.add(new TargetStatus(_target));
}
if (_skillId != 49
&& !(_skill.getTarget().equals("attack") || _skill
.getType() == L1Skills.TYPE_ATTACK)) {
// 攻撃系以外のスキルとH-A以外はターゲット自身を含める
_targetList.add(new TargetStatus(_user));
}
List<L1Object> objects;
if (_skill.getArea() == -1) {
objects = L1World.getInstance()
.getVisibleObjects(_user);
} else {
objects = L1World.getInstance()
.getVisibleObjects(_target, _skill.getArea());
}
for (L1Object tgobj : objects) {
if (tgobj == null) {
continue;
}
if (!(tgobj instanceof L1Character)) { // ターゲットがキャラクター以外の場合何もしない。
continue;
}
L1Character cha = (L1Character) tgobj;
if (!isTarget(cha)) {
continue;
}
_targetList.add(new TargetStatus(cha));
}
return;
}
} catch (Exception e) {
_log.finest("exception in L1Skilluse makeTargetList" + e);
}
}
// メッセージの表示(何か起こったとき)
private void sendHappenMessage(L1PcInstance pc) {
int msgID = _skill.getSysmsgIdHappen();
if (msgID > 0) {
pc.sendPackets(new S_ServerMessage(msgID));
}
}
// 失敗メッセージ表示のハンドル
private void sendFailMessageHandle() {
// 攻撃スキル以外で対象を指定するスキルが失敗した場合は失敗したメッセージをクライアントに送信
// ※攻撃スキルは障害物があっても成功時と同じアクションであるべき。
if (_skill.getType() != L1Skills.TYPE_ATTACK
&& !_skill.getTarget().equals("none")
&& _targetList.size() == 0) {
sendFailMessage();
}
}
// メッセージの表示(失敗したとき)
private void sendFailMessage() {
int msgID = _skill.getSysmsgIdFail();
if (msgID > 0 && (_user instanceof L1PcInstance)) {
_player.sendPackets(new S_ServerMessage(msgID));
}
}
// 精霊魔法の属性と使用者の属性は一致するか?(とりあえずの対処なので、対応できたら消去して下さい)
private boolean isAttrAgrees() {
int magicattr = _skill.getAttr();
if (_user instanceof L1NpcInstance) { // NPCが使った場合なんでもOK
return true;
}
if ((_skill.getSkillLevel() >= 17 && magicattr != 0) // 精霊魔法で、無属性魔法ではなく、
&& (magicattr != _player.getElfAttr() // 使用者と魔法の属性が一致しない。
&& !_player.isGm())) { // ただしGMは例外
return false;
}
return true;
}
/**
* スキルを使用するために必要なHPがあるか返す。
*
* @return HPが十分であればtrue
*/
private boolean isEnoughHp() {
return false;
}
/**
* スキルを使用するために必要なMPがあるか返す。
*
* @return MPが十分であればtrue
*/
private boolean isEnoughMp() {
return false;
}
// 必要HP、MPがあるか?
private boolean isHPMPConsume() {
_mpConsume = _skill.getMpConsume();
_hpConsume = _skill.getHpConsume();
int currentMp = 0;
int currentHp = 0;
if (_user instanceof L1NpcInstance) {
currentMp = _npc.getCurrentMp();
currentHp = _npc.getCurrentHp();
} else {
currentMp = _player.getCurrentMp();
currentHp = _player.getCurrentHp();
// MPのINT軽減
if (_player.getInt() > 12
&& _skillId > HOLY_WEAPON
&& _skillId <= FREEZING_BLIZZARD) { // LV2以上
_mpConsume--;
}
if (_player.getInt() > 13
&& _skillId > STALAC
&& _skillId <= FREEZING_BLIZZARD) { // LV3以上
_mpConsume--;
}
if (_player.getInt() > 14
&& _skillId > WEAK_ELEMENTAL
&& _skillId <= FREEZING_BLIZZARD) { // LV4以上
_mpConsume--;
}
if (_player.getInt() > 15
&& _skillId > MEDITATION
&& _skillId <= FREEZING_BLIZZARD) { // LV5以上
_mpConsume--;
}
if (_player.getInt() > 16
&& _skillId > DARKNESS
&& _skillId <= FREEZING_BLIZZARD) { // LV6以上
_mpConsume--;
}
if (_player.getInt() > 17
&& _skillId > BLESS_WEAPON
&& _skillId <= FREEZING_BLIZZARD) { // LV7以上
_mpConsume--;
}
if (_player.getInt() > 18
&& _skillId > DISEASE
&& _skillId <= FREEZING_BLIZZARD) { // LV8以上
_mpConsume--;
}
if (_player.getInt() > 12
&& _skillId >= SHOCK_STUN && _skillId <= COUNTER_BARRIER) {
_mpConsume -= (_player.getInt() - 12);
}
// MPの装備軽減
if (_skillId == PHYSICAL_ENCHANT_DEX
&& _player.getInventory().checkEquipped(20013)) { // 迅速ヘルム装備中にPE:DEX
_mpConsume /= 2;
}
if (_skillId == HASTE
&& _player.getInventory().checkEquipped(20013)) { // 迅速ヘルム装備中にヘイスト
_mpConsume /= 2;
}
if (_skillId == HEAL
&& _player.getInventory().checkEquipped(20014)) { // 治癒ヘルム装備中にヒール
_mpConsume /= 2;
}
if (_skillId == EXTRA_HEAL
&& _player.getInventory().checkEquipped(20014)) { // 治癒ヘルム装備中にエキストラヒール
_mpConsume /= 2;
}
if (_skillId == ENCHANT_WEAPON
&& _player.getInventory().checkEquipped(20015)) { // 力ヘルム装備中にエンチャントウエポン
_mpConsume /= 2;
}
if (_skillId == DETECTION
&& _player.getInventory().checkEquipped(20015)) { // 力ヘルム装備中にディテクション
_mpConsume /= 2;
}
if (_skillId == PHYSICAL_ENCHANT_STR
&& _player.getInventory().checkEquipped(20015)) { // 力ヘルム装備中にPE:STR
_mpConsume /= 2;
}
if (_skillId == HASTE
&& _player.getInventory().checkEquipped(20008)) { // マイナーウィンドヘルム装備中にヘイスト
_mpConsume /= 2;
}
if (_skillId == GREATER_HASTE
&& _player.getInventory().checkEquipped(20023)) { // ウィンドヘルム装備中にグレーターヘイスト
_mpConsume /= 2;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -