📄 l1magic.java
字号:
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* http://www.gnu.org/copyleft/gpl.html
*/
package l1j.server.server.model;
import java.util.Random;
import java.util.logging.Logger;
import l1j.server.Config;
import l1j.server.server.ActionCodes;
import l1j.server.server.WarTimeController;
import l1j.server.server.datatables.SkillsTable;
import l1j.server.server.model.Instance.L1DollInstance;
import l1j.server.server.model.Instance.L1ItemInstance;
import l1j.server.server.model.Instance.L1MagicInstance;
import l1j.server.server.model.Instance.L1NpcInstance;
import l1j.server.server.model.Instance.L1PcInstance;
import l1j.server.server.model.Instance.L1PetInstance;
import l1j.server.server.model.Instance.L1SummonInstance;
import l1j.server.server.serverpackets.S_DoActionGFX;
import l1j.server.server.serverpackets.S_ServerMessage;
import l1j.server.server.serverpackets.S_SkillSound;
import l1j.server.server.templates.L1Skills;
import static l1j.server.server.model.skill.L1SkillId.*;
public class L1Magic {
private static l1j.eric.EricLogger _log = l1j.eric.EricLogger.getLogger2(L1MagicInstance.class
.getName());
private int _calcType;
private final int PC_PC = 1;
private final int PC_NPC = 2;
private final int NPC_PC = 3;
private final int NPC_NPC = 4;
private L1PcInstance _pc = null;
private L1PcInstance _targetPc = null;
private L1NpcInstance _npc = null;
private L1NpcInstance _targetNpc = null;
private int _leverage = 10; // 1/10倍で表現する。
private static Random _random = new Random();
public void setLeverage(int i) {
_leverage = i;
}
private int getLeverage() {
return _leverage;
}
public L1Magic(L1Character attacker, L1Character target) {
if (attacker instanceof L1PcInstance) {
if (target instanceof L1PcInstance) {
_calcType = PC_PC;
_pc = (L1PcInstance) attacker;
_targetPc = (L1PcInstance) target;
} else {
_calcType = PC_NPC;
_pc = (L1PcInstance) attacker;
_targetNpc = (L1NpcInstance) target;
}
} else {
if (target instanceof L1PcInstance) {
_calcType = NPC_PC;
_npc = (L1NpcInstance) attacker;
_targetPc = (L1PcInstance) target;
} else {
_calcType = NPC_NPC;
_npc = (L1NpcInstance) attacker;
_targetNpc = (L1NpcInstance) target;
}
}
}
/* ■■■■■■■■■■■■■■■ 魔法共通関数 ■■■■■■■■■■■■■■ */
private int getSpellPower() {
int spellPower = 0;
if (_calcType == PC_PC || _calcType == PC_NPC) {
spellPower = _pc.getSp();
} else if (_calcType == NPC_PC || _calcType == NPC_NPC) {
spellPower = _npc.getSp();
}
return spellPower;
}
private int getMagicLevel() {
int magicLevel = 0;
if (_calcType == PC_PC || _calcType == PC_NPC) {
magicLevel = _pc.getMagicLevel();
} else if (_calcType == NPC_PC || _calcType == NPC_NPC) {
magicLevel = _npc.getMagicLevel();
}
return magicLevel;
}
private int getMagicBonus() {
int magicBonus = 0;
if (_calcType == PC_PC || _calcType == PC_NPC) {
magicBonus = _pc.getMagicBonus();
} else if (_calcType == NPC_PC || _calcType == NPC_NPC) {
magicBonus = _npc.getMagicBonus();
}
return magicBonus;
}
private int getLawful() {
int lawful = 0;
if (_calcType == PC_PC || _calcType == PC_NPC) {
lawful = _pc.getLawful();
} else if (_calcType == NPC_PC || _calcType == NPC_NPC) {
lawful = _npc.getLawful();
}
return lawful;
}
private int getTargetMr() {
int mr = 0;
if (_calcType == PC_PC || _calcType == NPC_PC) {
mr = _targetPc.getMr();
} else {
mr = _targetNpc.getMr();
}
return mr;
}
/* ■■■■■■■■■■■■■■ 成功判定 ■■■■■■■■■■■■■ */
// ●●●● 確率系魔法の成功判定 ●●●●
// 計算方法
// 攻撃側ポイント:LV + ((MagicBonus * 3) * 魔法固有係数)
// 防御側ポイント:((LV / 2) + (MR * 3)) / 2
// 攻撃成功率:攻撃側ポイント - 防御側ポイント
public boolean calcProbabilityMagic(int skillId) {
int probability = 0;
boolean isSuccess = false;
// 攻撃者がGM権限の場合100%成功
if (_pc != null && _pc.isGm()) {
return true;
}
if (_calcType == PC_NPC && _targetNpc != null) {
int npcId = _targetNpc.getNpcTemplate().get_npcId();
if (npcId >= 45912 && npcId <= 45915 // 恨みに満ちたソルジャー&ソルジャーゴースト
&& !_pc.hasSkillEffect(STATUS_HOLY_WATER)) {
return false;
}
if (npcId == 45916 // 恨みに満ちたハメル将軍
&& !_pc.hasSkillEffect(STATUS_HOLY_MITHRIL_POWDER)) {
return false;
}
if (npcId == 45941 // 呪われた巫女サエル
&& !_pc.hasSkillEffect(STATUS_HOLY_WATER_OF_EVA)) {
return false;
}
if (npcId == 45752 // バルログ(変身前)
&& !_pc.hasSkillEffect(STATUS_CURSE_BARLOG)) {
return false;
}
if (npcId == 45753 // バルログ(変身後)
&& !_pc.hasSkillEffect(STATUS_CURSE_BARLOG)) {
return false;
}
if (npcId == 45675 // ヤヒ(変身前)
&& !_pc.hasSkillEffect(STATUS_CURSE_YAHEE)) {
return false;
}
if (npcId == 81082 // ヤヒ(変身後)
&& !_pc.hasSkillEffect(STATUS_CURSE_YAHEE)) {
return false;
}
if (npcId == 45625 // 混沌
&& !_pc.hasSkillEffect(STATUS_CURSE_YAHEE)) {
return false;
}
if (npcId == 45674 // 死
&& !_pc.hasSkillEffect(STATUS_CURSE_YAHEE)) {
return false;
}
if (npcId == 45685 // 堕落
&& !_pc.hasSkillEffect(STATUS_CURSE_YAHEE)) {
return false;
}
if (npcId >= 46068 && npcId <= 46091 // 欲望の洞窟側mob
&& _pc.getTempCharGfx() == 6035) {
return false;
}
if (npcId >= 46092 && npcId <= 46106 // 影の神殿側mob
&& _pc.getTempCharGfx() == 6034) {
return false;
}
}
if (!checkZone(skillId)) {
return false;
}
if (skillId == CANCELLATION) {
if (_calcType == PC_PC && _pc != null && _targetPc != null) {
// 自分自身の場合は100%成功
if (_pc.getId() == _targetPc.getId()) {
return true;
}
// 同じクランの場合は100%成功
if (_pc.getClanid() > 0
&& (_pc.getClanid() == _targetPc.getClanid())) {
return true;
}
// 同じパーティの場合は100%成功
if (_pc.isInParty()) {
if (_pc.getParty().isMember(_targetPc)) {
return true;
}
}
// それ以外の場合、セーフティゾーン内では無效
if (_pc.getZoneType() == 1 || _targetPc.getZoneType() == 1) {
return false;
}
}
// 対象がNPC、使用者がNPCの場合は100%成功
if (_calcType == PC_NPC
|| _calcType == NPC_PC || _calcType == NPC_NPC) {
return true;
}
}
// アースバインド中はWB、キャンセレーション以外無效
if (_calcType == PC_PC || _calcType == NPC_PC) {
if (_targetPc.hasSkillEffect(EARTH_BIND)) {
if (skillId != WEAPON_BREAK
&& skillId != CANCELLATION) {
return false;
}
}
} else {
if (_targetNpc.hasSkillEffect(EARTH_BIND)) {
if (skillId != WEAPON_BREAK
&& skillId != CANCELLATION) {
return false;
}
}
}
probability = calcProbability(skillId);
Random random = new Random();
int rnd = random.nextInt(100) + 1;
if (probability > 90) {
probability = 90; // 最高成功率を90%とする。
}
if (probability >= rnd) {
isSuccess = true;
} else {
isSuccess = false;
}
// 確率系魔法メッセージ
if (!Config.ALT_ATKMSG) {
return isSuccess;
}
if (Config.ALT_ATKMSG) {
if ((_calcType == PC_PC || _calcType == PC_NPC)
&& !_pc.isGm()) {
return isSuccess;
}
if ((_calcType == PC_PC || _calcType == NPC_PC)
&& !_targetPc.isGm()) {
return isSuccess;
}
}
String msg0 = "";
String msg1 = " 造成 ";
String msg2 = "";
String msg3 = "";
String msg4 = "";
if (_calcType == PC_PC || _calcType == PC_NPC) { // アタッカーがPCの場合
msg0 = _pc.getName();
} else if (_calcType == NPC_PC) { // アタッカーがNPCの場合
msg0 = _npc.getName();
}
msg2 = " 命中率 " + probability +" % ";
if (_calcType == NPC_PC || _calcType == PC_PC) { // ターゲットがPCの場合
msg4 = _targetPc.getName();
} else if (_calcType == PC_NPC) { // ターゲットがNPCの場合
msg4 = _targetNpc.getName();
}
if (isSuccess == true) {
msg3 = "成功";
} else {
msg3 = "失敗";
}
if (_calcType == PC_PC || _calcType == PC_NPC) { // アタッカーがPCの場合
_pc.sendPackets(new S_ServerMessage(166, msg0, msg1, msg2, msg3,
msg4)); // \f1%0が%4%1%3 %2
}
if (_calcType == NPC_PC || _calcType == PC_PC) { // ターゲットがPCの場合
_targetPc.sendPackets(new S_ServerMessage(166, msg0, msg1, msg2,
msg3, msg4)); // \f1%0が%4%1%3 %2
}
return isSuccess;
}
private boolean checkZone(int skillId) {
if (_pc != null && _targetPc != null) {
if (_pc.getZoneType() == 1 || _targetPc.getZoneType() == 1) { // セーフティーゾーン
if (skillId == WEAPON_BREAK || skillId == SLOW
|| skillId == CURSE_PARALYZE || skillId == MANA_DRAIN
|| skillId == DARKNESS || skillId == WEAKNESS
|| skillId == DISEASE || skillId == DECAY_POTION
|| skillId == MASS_SLOW || skillId == ENTANGLE
|| skillId == ERASE_MAGIC || skillId == EARTH_BIND
|| skillId == AREA_OF_SILENCE || skillId == WIND_SHACKLE
|| skillId == STRIKER_GALE || skillId == SHOCK_STUN
|| skillId == FOG_OF_SLEEPING || skillId == ICE_LANCE
|| skillId == FREEZING_BLIZZARD
|| skillId == POLLUTE_WATER
|| skillId == ELEMENTAL_FALL_DOWN
|| skillId == RETURN_TO_NATURE) {
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -