📄 l1skilluse.java
字号:
if (0 < _skill.getMpConsume()) { // MPを消費するスキルであれば
_mpConsume = Math.max(_mpConsume, 1); // 最低でも1消費する。
}
// MPのオリジナルINT軽減
if (_player.getOriginalMagicConsumeReduction() > 0) {
_mpConsume -= _player.getOriginalMagicConsumeReduction();
}
}
if (currentHp < _hpConsume + 1) {
if (_user instanceof L1PcInstance) {
_player.sendPackets(new S_ServerMessage(279));
}
return false;
} else if (currentMp < _mpConsume) {
if (_user instanceof L1PcInstance) {
_player.sendPackets(new S_ServerMessage(278));
}
return false;
}
return true;
}
// 必要材料があるか?
private boolean isItemConsume() {
int itemConsume = _skill.getItemConsumeId();
int itemConsumeCount = _skill.getItemConsumeCount();
if (itemConsume == 0) {
return true; // 材料を必要としない魔法
}
if (!_player.getInventory().checkItem(itemConsume, itemConsumeCount)) {
return false; // 必要材料が足りなかった。
}
return true;
}
// 使用材料、HPMP、Lawfulをマイナスする。
private void useConsume() {
if (_user instanceof L1NpcInstance) {
// NPCの場合、HP、MPのみマイナス
int current_hp = _npc.getCurrentHp() - _hpConsume;
_npc.setCurrentHp(current_hp);
int current_mp = _npc.getCurrentMp() - _mpConsume;
_npc.setCurrentMp(current_mp);
return;
}
// HPMPをマイナス
if (isHPMPConsume()) {
if (_skillId == FINAL_BURN) { // ファイナル バーン
_player.setCurrentHp(1);
_player.setCurrentMp(0);
} else {
int current_hp = _player.getCurrentHp() - _hpConsume;
_player.setCurrentHp(current_hp);
int current_mp = _player.getCurrentMp() - _mpConsume;
_player.setCurrentMp(current_mp);
}
}
// Lawfulをマイナス
int lawful = _player.getLawful() + _skill.getLawful();
if (lawful > 32767) {
lawful = 32767;
}
if (lawful < -32767) {
lawful = -32767;
}
_player.setLawful(lawful);
int itemConsume = _skill.getItemConsumeId();
int itemConsumeCount = _skill.getItemConsumeCount();
if (itemConsume == 0) {
return; // 材料を必要としない魔法
}
// 使用材料をマイナス
_player.getInventory().consumeItem(itemConsume, itemConsumeCount);
}
// マジックリストに追加する。
private void addMagicList(L1Character cha, boolean repetition) {
if (_skillTime == 0) {
_getBuffDuration = _skill.getBuffDuration() * 1000; // 效果時間
if (_skill.getBuffDuration() == 0) {
if (_skillId == INVISIBILITY) { // インビジビリティ
cha.setSkillEffect(INVISIBILITY, 0);
}
return;
}
} else {
_getBuffDuration = _skillTime * 1000; // パラメータのtimeが0以外なら、效果時間として設定する
}
if (_skillId == SHOCK_STUN) {
_getBuffDuration = _shockStunDuration;
}
if (_skillId == CURSE_POISON) { // カーズポイズンの效果処理はL1Poisonに移譲。
return;
}
if (_skillId == CURSE_PARALYZE
|| _skillId == CURSE_PARALYZE2) { // カーズパラライズの效果処理はL1CurseParalysisに移譲。
return;
}
if (_skillId == SHAPE_CHANGE) { // シェイプチェンジの效果処理はL1PolyMorphに移譲。
return;
}
if (_skillId == BLESSED_ARMOR || _skillId == HOLY_WEAPON // 武器防具に效果がある処理はL1ItemInstanceに移譲。
|| _skillId == ENCHANT_WEAPON || _skillId == BLESS_WEAPON
|| _skillId == SHADOW_FANG) {
return;
}
if ((_skillId == ICE_LANCE || _skillId == FREEZING_BLIZZARD)
&& !_isFreeze) { // 凍結失敗
return;
}
if (_skillId == AWAKEN_ANTHARAS || _skillId == AWAKEN_FAFURION
|| _skillId == AWAKEN_VALAKAS) { // 覚醒の效果処理はL1Awakeに移譲。
return;
}
cha.setSkillEffect(_skillId, _getBuffDuration);
if (cha instanceof L1PcInstance && repetition) { // 対象がPCで既にスキルが重複している場合
L1PcInstance pc = (L1PcInstance) cha;
sendIcon(pc);
}
}
// アイコンの送信
private void sendIcon(L1PcInstance pc) {
if (_skillTime == 0) {
_getBuffIconDuration = _skill.getBuffDuration(); // 效果時間
} else {
_getBuffIconDuration = _skillTime; // パラメータのtimeが0以外なら、效果時間として設定する
}
if (_skillId == SHIELD) { // シールド
pc.sendPackets(new S_SkillIconShield(5, _getBuffIconDuration));
} else if (_skillId == SHADOW_ARMOR) { // シャドウ アーマー
pc.sendPackets(new S_SkillIconShield(3, _getBuffIconDuration));
} else if (_skillId == DRESS_DEXTERITY) { // ドレス デクスタリティー
pc.sendPackets(new S_Dexup(pc, 2, _getBuffIconDuration));
} else if (_skillId == DRESS_MIGHTY) { // ドレス マイティー
pc.sendPackets(new S_Strup(pc, 2, _getBuffIconDuration));
} else if (_skillId == GLOWING_AURA) { // グローウィング オーラ
pc.sendPackets(new S_SkillIconAura(113, _getBuffIconDuration));
} else if (_skillId == SHINING_AURA) { // シャイニング オーラ
pc.sendPackets(new S_SkillIconAura(114, _getBuffIconDuration));
} else if (_skillId == BRAVE_AURA) { // ブレイブ オーラ
pc.sendPackets(new S_SkillIconAura(116, _getBuffIconDuration));
} else if (_skillId == FIRE_WEAPON) { // ファイアー ウェポン
pc.sendPackets(new S_SkillIconAura(147, _getBuffIconDuration));
} else if (_skillId == WIND_SHOT) { // ウィンド ショット
pc.sendPackets(new S_SkillIconAura(148, _getBuffIconDuration));
} else if (_skillId == FIRE_BLESS) { // ファイアー ブレス
pc.sendPackets(new S_SkillIconAura(154, _getBuffIconDuration));
} else if (_skillId == STORM_EYE) { // ストーム アイ
pc.sendPackets(new S_SkillIconAura(155, _getBuffIconDuration));
} else if (_skillId == EARTH_BLESS) { // アース ブレス
pc.sendPackets(new S_SkillIconShield(7, _getBuffIconDuration));
} else if (_skillId == BURNING_WEAPON) { // バーニング ウェポン
pc.sendPackets(new S_SkillIconAura(162, _getBuffIconDuration));
} else if (_skillId == STORM_SHOT) { // ストーム ショット
pc.sendPackets(new S_SkillIconAura(165, _getBuffIconDuration));
} else if (_skillId == IRON_SKIN) { // アイアン スキン
pc.sendPackets(new S_SkillIconShield(10, _getBuffIconDuration));
} else if (_skillId == EARTH_SKIN) { // アース スキン
pc.sendPackets(new S_SkillIconShield(6, _getBuffIconDuration));
} else if (_skillId == PHYSICAL_ENCHANT_STR) { // フィジカル エンチャント:STR
pc.sendPackets(new S_Strup(pc, 5, _getBuffIconDuration));
} else if (_skillId == PHYSICAL_ENCHANT_DEX) { // フィジカル エンチャント:DEX
pc.sendPackets(new S_Dexup(pc, 5, _getBuffIconDuration));
} else if (_skillId == HASTE || _skillId == GREATER_HASTE) { // グレーターヘイスト
pc.sendPackets(new S_SkillHaste(pc.getId(), 1,
_getBuffIconDuration));
pc.broadcastPacket(new S_SkillHaste(pc.getId(), 1, 0));
} else if (_skillId == HOLY_WALK
|| _skillId == MOVING_ACCELERATION || _skillId == WIND_WALK) { // ホーリーウォーク、ムービングアクセレーション、ウィンドウォーク
pc.sendPackets(new S_SkillBrave(pc.getId(), 4,
_getBuffIconDuration));
pc.broadcastPacket(new S_SkillBrave(pc.getId(), 4, 0));
} else if (_skillId == SLOW
|| _skillId == MASS_SLOW || _skillId == ENTANGLE) { // スロー、エンタングル、マススロー
pc.sendPackets(new S_SkillHaste(pc.getId(), 2,
_getBuffIconDuration));
pc.broadcastPacket(new S_SkillHaste(pc.getId(), 2, 0));
} else if (_skillId == IMMUNE_TO_HARM) {
pc.sendPackets(new S_SkillIconGFX(40, _getBuffIconDuration));
}
pc.sendPackets(new S_OwnCharStatus(pc));
}
// グラフィックの送信
private void sendGrfx(boolean isSkillAction) {
int actionId = _skill.getActionId();
int castgfx = _skill.getCastGfx();
if (castgfx == 0) {
return; // 表示するグラフィックが無い
}
if (_user instanceof L1PcInstance) {
if (_skillId == FIRE_WALL || _skillId == LIFE_STREAM) {
L1PcInstance pc = (L1PcInstance) _user;
if (_skillId == FIRE_WALL) {
pc.setHeading(pc.targetDirection(_targetX, _targetY));
pc.sendPackets(new S_ChangeHeading(pc));
pc.broadcastPacket(new S_ChangeHeading(pc));
}
S_DoActionGFX gfx = new S_DoActionGFX(pc.getId(), actionId);
pc.sendPackets(gfx);
pc.broadcastPacket(gfx);
return;
}
int targetid = _target.getId();
if (_skillId == SHOCK_STUN) {
if (_targetList.size() == 0) { // 失敗
return;
} else {
if (_target instanceof L1PcInstance) {
L1PcInstance pc = (L1PcInstance) _target;
pc.sendPackets(new S_SkillSound(pc.getId(), 4434));
pc.broadcastPacket(new S_SkillSound(pc.getId(), 4434));
} else if (_target instanceof L1NpcInstance) {
_target.broadcastPacket(new S_SkillSound(_target
.getId(), 4434));
}
return;
}
}
if (_skillId == LIGHT) {
L1PcInstance pc = (L1PcInstance) _target;
pc.sendPackets(new S_Sound(145));
}
if (_targetList.size() == 0 && !(_skill.getTarget().equals("none"))) {
// ターゲット数が0で対象を指定するスキルの場合、魔法使用エフェクトだけ表示して終了
int tempchargfx = _player.getTempCharGfx();
if (tempchargfx == 5727 || tempchargfx == 5730) { // シャドウ系変身のモーション対応
actionId = ActionCodes.ACTION_SkillBuff;
} else if (tempchargfx == 5733 || tempchargfx == 5736) {
actionId = ActionCodes.ACTION_Attack;
}
if (isSkillAction) {
S_DoActionGFX gfx = new S_DoActionGFX(_player.getId(),
actionId);
_player.sendPackets(gfx);
_player.broadcastPacket(gfx);
}
return;
}
if (_skill.getTarget().equals("attack") && _skillId != 18) {
if (isPcSummonPet(_target)) { // 対象がPC、サモン、ペット
if (_player.getZoneType() == 1
|| _target.getZoneType() == 1 // 攻撃する側または攻撃される側がセーフティーゾーン
|| _player.checkNonPvP(_player, _target)) { // Non-PvP設定
_player.sendPackets(new S_UseAttackSkill(_player, 0,
castgfx, _targetX, _targetY, actionId)); // ターゲットへのモーションはなし
_player.broadcastPacket(new S_UseAttackSkill(_player,
0, castgfx, _targetX, _targetY, actionId));
return;
}
}
if (_skill.getArea() == 0) { // 単体攻撃魔法
_player.sendPackets(new S_UseAttackSkill(_player, targetid,
castgfx, _targetX, _targetY, actionId));
_player.broadcastPacket(new S_UseAttackSkill(_player,
targetid, castgfx, _targetX, _targetY, actionId));
_target.broadcastPacketExceptTargetSight(new S_DoActionGFX(
targetid, ActionCodes.ACTION_Damage), _player);
} else { // 有方向範囲攻撃魔法
L1Character[] cha = new L1Character[_targetList.size()];
int i = 0;
for (TargetStatus ts : _targetList) {
cha[i] = ts.getTarget();
i++;
}
_player.sendPackets(new S_RangeSkill(_player, cha, castgfx,
actionId, S_RangeSkill.TYPE_DIR));
_player.broadcastPacket(new S_RangeSkill(_player, cha,
castgfx, actionId, S_RangeSkill.TYPE_DIR));
}
} else if (_skill.getTarget().equals("none") && _skill.getType() ==
L1Skills.TYPE_ATTACK) { // 無方向範囲攻撃魔法
L1Character[] cha = new L1Character[_targetList.size()];
int i = 0;
for (TargetStatus ts : _targetList) {
cha[i] = ts.getTarget();
cha[i].broadcastPacketExceptTargetSight(new S_DoActionGFX(
cha[i].getId(), ActionCodes.ACTION_Damage),
_player);
i++;
}
_player.sendPackets(new S_RangeSkill(_player, cha, castgfx,
actionId, S_RangeSkill.TYPE_NODIR));
_player.broadcastPacket(new S_RangeSkill(_player, cha,
castgfx, actionId, S_RangeSkill.TYPE_NODIR));
} else { // 補助魔法
// テレポート、マステレ、テレポートトゥマザー以外
if (_skillId != 5 && _skillId != 69 && _skillId != 131) {
// 魔法を使う動作のエフェクトは使用者だけ
if (isSkillAction) {
S_DoActionGFX gfx = new S_DoActionGFX(_player.getId(),
_skill.getActionId());
_player.sendPackets(gfx);
_player.broadcastPacket(gfx);
}
if (_skillId == COUNTER_MAGIC
|| _skillId == COUNTER_BARRIER
|| _skillId == COUNTER_MIRROR) {
_player.sendPackets(new S_SkillSound(targetid,
castgfx));
} else if (_skillId == TRUE_TARGET) { // トゥルーターゲットは個別処理で送信済
return;
} else if (_skillId == AWAKEN_ANTHARAS // 覚醒:アンタラス
|| _skillId == AWAKEN_FAFURION // 覚醒:パプリオン
|| _skillId == AWAKEN_VALAKAS) { // 覚醒:ヴァラカス
if (_skillId == _player.getAwakeSkillId()) { // 再詠唱なら解除でエフェクトなし
_player.sendPackets(new S_SkillSound(targetid,
castgfx));
_player.broadcastPacket(new S_SkillSound(targetid,
castgfx));
} else {
return;
}
} else {
_player.sendPackets(new S_SkillSound(targetid,
castgfx));
_player.broadcastPacket(new S_SkillSound(targetid,
castgfx));
}
}
// スキルのエフェクト表示はターゲット全員だが、あまり必要性がないので、ステータスのみ送信
for (TargetStatus ts : _targetList) {
L1Character cha = ts.getTarget();
if (cha instanceof L1PcInstance) {
L1PcInstance pc = (L1PcInstance) cha;
pc.sendPackets(new S_OwnCharStatus(pc));
}
}
}
} else if (_user instanceof L1NpcInstance) { // NPCがスキルを使った場合
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -