📄 l1skilluse.java
字号:
if (!isAttrAgrees()) { // 精霊魔法で、属性が一致しなければ何もしない。
return false;
}
if (_skillId == ELEMENTAL_PROTECTION && pc.getElfAttr() == 0) {
pc.sendPackets(new S_ServerMessage(280)); // \f1魔法が失敗しました。
return false;
}
// スキルディレイ中使用不可
if (pc.isSkillDelay()) {
return false;
}
// サイレンス状態では使用不可
if (pc.hasSkillEffect(SILENCE)
|| pc.hasSkillEffect(AREA_OF_SILENCE)
|| pc.hasSkillEffect(STATUS_POISON_SILENCE)) {
pc.sendPackets(new S_ServerMessage(285)); // \f1その状態では魔法を使えません。
return false;
}
// DIGはロウフルでのみ使用可
if (_skillId == DISINTEGRATE && pc.getLawful() < 500) {
// このメッセージであってるか未確認
pc.sendPackets(new S_ServerMessage(352, "$967")); // この魔法を利用するには性向値が%0でなければなりません。
return false;
}
// 同じキューブは效果範囲外であれば配置可能
if (_skillId == CUBE_IGNITION || _skillId == CUBE_QUAKE
|| _skillId == CUBE_SHOCK || _skillId == CUBE_BALANCE) {
boolean isNearSameCube = false;
int gfxId = 0;
for (L1Object obj : L1World.getInstance()
.getVisibleObjects(pc, 3)) {
if (obj instanceof L1EffectInstance) {
L1EffectInstance effect = (L1EffectInstance) obj;
gfxId = effect.getGfxId();
if (_skillId == CUBE_IGNITION && gfxId == 6706
|| _skillId == CUBE_QUAKE && gfxId == 6712
|| _skillId == CUBE_SHOCK && gfxId == 6718
|| _skillId == CUBE_BALANCE && gfxId == 6724) {
isNearSameCube = true;
break;
}
}
}
if (isNearSameCube) {
pc.sendPackets(new S_ServerMessage(1412)); // すでに床にキューブが召喚されています。
return false;
}
}
// 覚醒状態では覚醒スキル以外使用不可
if (pc.getAwakeSkillId() == AWAKEN_ANTHARAS
&& _skillId != AWAKEN_ANTHARAS
|| pc.getAwakeSkillId() == AWAKEN_FAFURION
&& _skillId != AWAKEN_FAFURION
|| pc.getAwakeSkillId() == AWAKEN_VALAKAS
&& _skillId != AWAKEN_VALAKAS) {
pc.sendPackets(new S_ServerMessage(1385)); // 現在の状態では覚醒魔法が使えません。
return false;
}
if (isItemConsume() == false && !_player.isGm()) { // 消費アイテムはあるか
_player.sendPackets(new S_ServerMessage(299)); // 詠唱する材料がありません。
return false;
}
}
// スキル使用者がNPCの場合のチェック
else if (_user instanceof L1NpcInstance) {
// サイレンス状態では使用不可
if (_user.hasSkillEffect(SILENCE)) {
// NPCにサイレンスが掛かっている場合は1回だけ使用をキャンセルさせる效果。
_user.removeSkillEffect(SILENCE);
return false;
}
}
// PC、NPC共通のチェック
if (!isHPMPConsume()) { // 消費HP、MPはあるか
return false;
}
return true;
}
/**
* スペルスクロール使用時に使用者の状態からスキルが使用可能であるか判断する
*
* @return false スキルが使用不可能な状態である場合
*/
private boolean isSpellScrollUsable() {
// スペルスクロールを使用するのはPCのみ
L1PcInstance pc = (L1PcInstance) _user;
if (pc.isParalyzed()) { // 麻痺凍結状態か
return false;
}
// インビジ中に使用不可のスキル
if ((pc.isInvisble() || pc.isInvisDelay()) && !isInvisUsableSkill()) {
return false;
}
return true;
}
// インビジ中に使用可能なスキルかを返す
private boolean isInvisUsableSkill() {
for (int skillId : CAST_WITH_INVIS) {
if (skillId == _skillId) {
return true;
}
}
return false;
}
public void handleCommands(L1PcInstance player, int skillId, int targetId,
int x, int y, String message, int timeSecs, int type) {
L1Character attacker = null;
handleCommands(player, skillId, targetId, x, y, message, timeSecs,
type, attacker);
}
public void handleCommands(L1PcInstance player, int skillId, int targetId,
int x, int y, String message, int timeSecs, int type,
L1Character attacker) {
try {
// 事前チェックをしているか?
if (!isCheckedUseSkill()) {
boolean isUseSkill = checkUseSkill(player, skillId, targetId,
x, y, message, timeSecs, type, attacker);
if (!isUseSkill) {
failSkill();
return;
}
}
if (type == TYPE_NORMAL) { // 魔法詠唱時
runSkill();
useConsume();
sendGrfx(true);
sendFailMessageHandle();
setDelay();
} else if (type == TYPE_LOGIN) { // ログイン時(HPMP材料消費なし、グラフィックなし)
runSkill();
} else if (type == TYPE_SPELLSC) { // スペルスクロール使用時(HPMP材料消費なし)
runSkill();
sendGrfx(true);
} else if (type == TYPE_GMBUFF) { // GMBUFF使用時(HPMP材料消費なし、魔法モーションなし)
runSkill();
sendGrfx(false);
} else if (type == TYPE_NPCBUFF) { // NPCBUFF使用時(HPMP材料消費なし)
runSkill();
sendGrfx(true);
}
setCheckedUseSkill(false);
} catch (Exception e) {
_log.log(Level.SEVERE, "", e);
}
}
/**
* スキルの失敗処理(PCのみ)
*/
private void failSkill() {
// HPが足りなくてスキルが使用できない場合のみ、MPのみ消費したいが未実装(必要ない?)
// その他の場合は何も消費されない。
// useConsume(); // HP、MPは減らす
setCheckedUseSkill(false);
// テレポートスキル
if (_skillId == TELEPORT || _skillId == MASS_TELEPORT
|| _skillId == TELEPORT_TO_MATHER) {
// テレポートできない場合でも、クライアント側は応答を待っている
// テレポート待ち状態の解除(第2引数に意味はない)
_player.sendPackets(new S_Paralysis(
S_Paralysis.TYPE_TELEPORT_UNLOCK, false));
}
}
// ターゲットか?
private boolean isTarget(L1Character cha) throws Exception {
boolean _flg = false;
if (cha instanceof L1PcInstance) {
L1PcInstance pc = (L1PcInstance) cha;
if (pc.isGhost() || pc.isGmInvis()) {
return false;
}
}
if (_calcType == NPC_PC
&& (cha instanceof L1PcInstance || cha instanceof L1PetInstance || cha instanceof L1SummonInstance)) {
_flg = true;
}
// 破壊不可能なドアは対象外
if (cha instanceof L1DoorInstance) {
if (cha.getMaxHp() == 0 || cha.getMaxHp() == 1) {
return false;
}
}
// マジックドールは対象外
if (cha instanceof L1DollInstance && _skillId != HASTE) {
return false;
}
// 元のターゲットがPet、Summon以外のNPCの場合、PC、Pet、Summonは対象外
if (_calcType == PC_NPC
&& _target instanceof L1NpcInstance
&& !(_target instanceof L1PetInstance)
&& !(_target instanceof L1SummonInstance)
&& (cha instanceof L1PetInstance
|| cha instanceof L1SummonInstance || cha instanceof L1PcInstance)) {
return false;
}
// 元のターゲットがガード以外のNPCの場合、ガードは対象外
if (_calcType == PC_NPC
&& _target instanceof L1NpcInstance
&& !(_target instanceof L1GuardInstance)
&& cha instanceof L1GuardInstance) {
return false;
}
// NPC対PCでターゲットがモンスターの場合ターゲットではない。
if ((_skill.getTarget().equals("attack") || _skill.getType() == L1Skills.TYPE_ATTACK)
&& _calcType == NPC_PC
&& !(cha instanceof L1PetInstance)
&& !(cha instanceof L1SummonInstance)
&& !(cha instanceof L1PcInstance)) {
return false;
}
// NPC対NPCで使用者がMOBで、ターゲットがMOBの場合ターゲットではない。
if ((_skill.getTarget().equals("attack")
|| _skill.getType() == L1Skills.TYPE_ATTACK)
&& _calcType == NPC_NPC
&& _user instanceof L1MonsterInstance
&& cha instanceof L1MonsterInstance) {
return false;
}
// 無方向範囲攻撃魔法で攻撃できないNPCは対象外
if (_skill.getTarget().equals("none")
&& _skill.getType() == L1Skills.TYPE_ATTACK
&& (cha instanceof L1AuctionBoardInstance
|| cha instanceof L1BoardInstance
|| cha instanceof L1CrownInstance
|| cha instanceof L1DwarfInstance
|| cha instanceof L1EffectInstance
|| cha instanceof L1FieldObjectInstance
|| cha instanceof L1FurnitureInstance
|| cha instanceof L1HousekeeperInstance
|| cha instanceof L1MerchantInstance
|| cha instanceof L1TeleporterInstance)) {
return false;
}
// 攻撃系スキルで対象が自分は対象外
if (_skill.getType() == L1Skills.TYPE_ATTACK
&& cha.getId() == _user.getId()) {
return false;
}
// ターゲットが自分でH-Aの場合效果無し
if (cha.getId() == _user.getId() && _skillId == HEAL_ALL) {
return false;
}
if (((_skill.getTargetTo() & L1Skills.TARGET_TO_PC) == L1Skills.TARGET_TO_PC
|| (_skill.getTargetTo() & L1Skills.TARGET_TO_CLAN) == L1Skills.TARGET_TO_CLAN || (_skill
.getTargetTo() & L1Skills.TARGET_TO_PARTY) == L1Skills.TARGET_TO_PARTY)
&& cha.getId() == _user.getId() && _skillId != HEAL_ALL) {
return true; // ターゲットがパーティーかクラン員のものは自分に效果がある。(ただし、ヒールオールは除外)
}
// スキル使用者がPCで、PKモードではない場合、自分のサモンペットは対象外
if (_user instanceof L1PcInstance
&& (_skill.getTarget().equals("attack") || _skill.getType() == L1Skills.TYPE_ATTACK)
&& _isPK == false) {
if (cha instanceof L1SummonInstance) {
L1SummonInstance summon = (L1SummonInstance) cha;
if (_player.getId() == summon.getMaster().getId()) {
return false;
}
} else if (cha instanceof L1PetInstance) {
L1PetInstance pet = (L1PetInstance) cha;
if (_player.getId() == pet.getMaster().getId()) {
return false;
}
}
}
if ((_skill.getTarget().equals("attack")
|| _skill.getType() == L1Skills.TYPE_ATTACK)
&& !(cha instanceof L1MonsterInstance)
&& _isPK == false
&& _target instanceof L1PcInstance) {
L1PcInstance enemy = (L1PcInstance) cha;
// カウンターディテクション
if (_skillId == COUNTER_DETECTION && enemy.getZoneType() != 1
&& (cha.hasSkillEffect(INVISIBILITY)
|| cha.hasSkillEffect(BLIND_HIDING))) {
return true; // インビジかブラインドハイディング中
}
if (_player.getClanid() != 0 && enemy.getClanid() != 0) { // クラン所属中
// 全戦争リストを取得
for (L1War war : L1World.getInstance().getWarList()) {
if (war.CheckClanInWar(_player.getClanname())) { // 自クランが戦争に参加中
if (war.CheckClanInSameWar( // 同じ戦争に参加中
_player.getClanname(), enemy.getClanname())) {
if (L1CastleLocation.checkInAllWarArea(enemy.getX(),
enemy.getY(), enemy.getMapId())) {
return true;
}
}
}
}
}
return false; // 攻撃スキルでPKモードじゃない場合
}
if (_user.glanceCheck(cha.getX(), cha.getY()) == false
&& _skill.getIsThrough() == false) {
// エンチャント、復活スキルは障害物の判定をしない
if (!(_skill.getType() == L1Skills.TYPE_CHANGE || _skill.getType() == L1Skills.TYPE_RESTORE)) {
return false; // 直線上に障害物がある
}
}
if (cha.hasSkillEffect(ICE_LANCE)
&& (_skillId == ICE_LANCE || _skillId == FREEZING_BLIZZARD)) {
return false; // アイスランス中にアイスランス、フリージングブリザード
}
if (cha.hasSkillEffect(FREEZING_BLIZZARD)
&& (_skillId == ICE_LANCE || _skillId == FREEZING_BLIZZARD)) {
return false; // フリージングブリザード中にアイスランス、フリージングブリザード
}
if (cha.hasSkillEffect(EARTH_BIND) && _skillId == EARTH_BIND) {
return false; // アース バインド中にアース バインド
}
if (!(cha instanceof L1MonsterInstance)
&& (_skillId == TAMING_MONSTER || _skillId == CREATE_ZOMBIE)) {
return false; // ターゲットがモンスターじゃない(テイミングモンスター)
}
if (cha.isDead()
&& (_skillId != CREATE_ZOMBIE
&& _skillId != RESURRECTION
&& _skillId != GREATER_RESURRECTION
&& _skillId != CALL_OF_NATURE)) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -