📄 l1magic.java
字号:
}
return dmg;
}
// ●●●● プレイヤーNPC から NPC へのダメージ算出 ●●●●
private int calcNpcMagicDamage(int skillId) {
int dmg = 0;
if (skillId == FINAL_BURN) {
if (_calcType == PC_PC || _calcType == PC_NPC) {
dmg = _pc.getCurrentMp();
} else {
dmg = _npc.getCurrentMp();
}
} else {
dmg = calcMagicDiceDamage(skillId);
dmg = (dmg * getLeverage()) / 10;
}
if (_calcType == PC_NPC) { // プレイヤーからペット、サモンに攻撃
boolean isNowWar = false;
int castleId = L1CastleLocation.getCastleIdByArea(_targetNpc);
if (castleId > 0) {
isNowWar = WarTimeController.getInstance().isNowWar(castleId);
}
if (!isNowWar) {
if (_targetNpc instanceof L1PetInstance) {
dmg /= 8;
}
if (_targetNpc instanceof L1SummonInstance) {
L1SummonInstance summon = (L1SummonInstance) _targetNpc;
if (summon.isExsistMaster()) {
dmg /= 8;
}
}
}
}
if (_targetNpc.hasSkillEffect(ICE_LANCE)) {
dmg = 0;
}
if (_targetNpc.hasSkillEffect(FREEZING_BLIZZARD)) {
dmg = 0;
}
if (_targetNpc.hasSkillEffect(EARTH_BIND)) {
dmg = 0;
}
if (_calcType == PC_NPC && _targetNpc != null) {
int npcId = _targetNpc.getNpcTemplate().get_npcId();
if (npcId >= 45912 && npcId <= 45915 // 恨みに満ちたソルジャー&ソルジャーゴースト
&& !_pc.hasSkillEffect(STATUS_HOLY_WATER)) {
dmg = 0;
}
if (npcId == 45916 // 恨みに満ちたハメル将軍
&& !_pc.hasSkillEffect(STATUS_HOLY_MITHRIL_POWDER)) {
dmg = 0;
}
if (npcId == 45941 // 呪われた巫女サエル
&& !_pc.hasSkillEffect(STATUS_HOLY_WATER_OF_EVA)) {
dmg = 0;
}
if (npcId == 45752 // バルログ(変身前)
&& !_pc.hasSkillEffect(STATUS_CURSE_BARLOG)) {
dmg = 0;
}
if (npcId == 45753 // バルログ(変身後)
&& !_pc.hasSkillEffect(STATUS_CURSE_BARLOG)) {
dmg = 0;
}
if (npcId == 45675 // ヤヒ(変身前)
&& !_pc.hasSkillEffect(STATUS_CURSE_YAHEE)) {
dmg = 0;
}
if (npcId == 81082 // ヤヒ(変身後)
&& !_pc.hasSkillEffect(STATUS_CURSE_YAHEE)) {
dmg = 0;
}
if (npcId == 45625 // 混沌
&& !_pc.hasSkillEffect(STATUS_CURSE_YAHEE)) {
dmg = 0;
}
if (npcId == 45674 // 死
&& !_pc.hasSkillEffect(STATUS_CURSE_YAHEE)) {
dmg = 0;
}
if (npcId == 45685 // 堕落
&& !_pc.hasSkillEffect(STATUS_CURSE_YAHEE)) {
dmg = 0;
}
if (npcId >= 46068 && npcId <= 46091 // 欲望の洞窟側mob
&& _pc.getTempCharGfx() == 6035) {
dmg = 0;
}
if (npcId >= 46092 && npcId <= 46106 // 影の神殿側mob
&& _pc.getTempCharGfx() == 6034) {
dmg = 0;
}
}
return dmg;
}
// ●●●● damage_dice、damage_dice_count、damage_value、SPから魔法ダメージを算出 ●●●●
private int calcMagicDiceDamage(int skillId) {
L1Skills l1skills = SkillsTable.getInstance().getTemplate(skillId);
int dice = l1skills.getDamageDice();
int diceCount = l1skills.getDamageDiceCount();
int value = l1skills.getDamageValue();
int magicDamage = 0;
int charaIntelligence = 0;
Random random = new Random();
for (int i = 0; i < diceCount; i++) {
magicDamage += (random.nextInt(dice) + 1);
}
magicDamage += value;
if (_calcType == PC_PC || _calcType == PC_NPC) {
int weaponAddDmg = 0; // 武器による追加ダメージ
L1ItemInstance weapon = _pc.getWeapon();
if (weapon != null) {
weaponAddDmg = weapon.getItem().getMagicDmgModifier();
}
magicDamage += weaponAddDmg;
}
if (_calcType == PC_PC || _calcType == PC_NPC) {
int spByItem = _pc.getSp() - _pc.getTrueSp(); // アイテムによるSP変動
charaIntelligence = _pc.getInt() + spByItem - 12;
} else if (_calcType == NPC_PC || _calcType == NPC_NPC) {
int spByItem = _npc.getSp() - _npc.getTrueSp(); // アイテムによるSP変動
charaIntelligence = _npc.getInt() + spByItem - 12;
}
if (charaIntelligence < 1) {
charaIntelligence = 1;
}
double attrDeffence = calcAttrResistance(l1skills.getAttr());
double coefficient = (1.0 - attrDeffence + charaIntelligence * 3.0 / 32.0);
if (coefficient < 0) {
coefficient = 0;
}
magicDamage *= coefficient;
double criticalCoefficient = 1.5; // 魔法クリティカル
int rnd = random.nextInt(100) + 1;
if (_calcType == PC_PC || _calcType == PC_NPC) {
if (l1skills.getSkillLevel() <= 6) {
if (rnd <= (10 + _pc.getOriginalMagicCritical())) {
magicDamage *= criticalCoefficient;
}
}
} else if (_calcType == NPC_PC || _calcType == NPC_NPC) {
if (rnd <= 10) {
magicDamage *= criticalCoefficient;
}
}
if (_calcType == PC_PC || _calcType == PC_NPC) { // オリジナルINTによる魔法ダメージ
magicDamage += _pc.getOriginalMagicDamage();
}
return magicDamage;
}
// ●●●● ヒール回復量(対アンデッドにはダメージ)を算出 ●●●●
public int calcHealing(int skillId) {
L1Skills l1skills = SkillsTable.getInstance().getTemplate(skillId);
int dice = l1skills.getDamageDice();
int value = l1skills.getDamageValue();
int magicDamage = 0;
int magicBonus = getMagicBonus();
if (magicBonus > 10) {
magicBonus = 10;
}
Random random = new Random();
int diceCount = value + magicBonus;
for (int i = 0; i < diceCount; i++) {
magicDamage += (random.nextInt(dice) + 1);
}
double alignmentRevision = 1.0;
if (getLawful() > 0) {
alignmentRevision += (getLawful() / 32768.0);
}
magicDamage *= alignmentRevision;
magicDamage = (magicDamage * getLeverage()) / 10;
return magicDamage;
}
// ●●●● MRによるダメージ軽減 ●●●●
private int calcMrDefense(int dmg) {
int mr = getTargetMr();
double mrFloor = 0;
if (_calcType == PC_PC || _calcType == PC_NPC) {
if (mr <= 100) {
mrFloor = Math.floor((mr - _pc.getOriginalMagicHit()) / 2);
} else if (mr >= 100) {
mrFloor = Math.floor((mr - _pc.getOriginalMagicHit()) / 10);
}
} else if (_calcType == NPC_PC || _calcType == NPC_NPC) {
if (mr <= 100) {
mrFloor = Math.floor(mr / 2);
} else if (mr >= 100) {
mrFloor = Math.floor(mr / 10);
}
}
double mrCoefficient = 0;
if (mr <= 100) {
mrCoefficient = 1 - 0.01 * mrFloor;
} else if (mr >= 100) {
mrCoefficient = 0.6 - 0.01 * mrFloor;
}
dmg *= mrCoefficient;
return dmg;
}
// ●●●● 属性によるダメージ軽減 ●●●●
// attr:0.無属性魔法,1.地魔法,2.火魔法,4.水魔法,8.風魔法(,16.光魔法)
private double calcAttrResistance(int attr) {
int resist = 0;
if (_calcType == PC_PC || _calcType == NPC_PC) {
if (attr == L1Skills.ATTR_EARTH) {
resist = _targetPc.getEarth();
} else if (attr == L1Skills.ATTR_FIRE) {
resist = _targetPc.getFire();
} else if (attr == L1Skills.ATTR_WATER) {
resist = _targetPc.getWater();
} else if (attr == L1Skills.ATTR_WIND) {
resist = _targetPc.getWind();
}
} else if (_calcType == PC_NPC || _calcType == NPC_NPC) {
}
int resistFloor = (int) (0.32 * Math.abs(resist));
if (resist >= 0) {
resistFloor *= 1;
} else {
resistFloor *= -1;
}
double attrDeffence = resistFloor / 32.0;
return attrDeffence;
}
/* ■■■■■■■■■■■■■■■ 計算結果反映 ■■■■■■■■■■■■■■■ */
public void commit(int damage, int drainMana) {
if (_calcType == PC_PC || _calcType == NPC_PC) {
commitPc(damage, drainMana);
} else if (_calcType == PC_NPC || _calcType == NPC_NPC) {
commitNpc(damage, drainMana);
}
// ダメージ値及び命中率確認用メッセージ
if (!Config.ALT_ATKMSG) {
return;
}
if (Config.ALT_ATKMSG) {
if ((_calcType == PC_PC || _calcType == PC_NPC)
&& !_pc.isGm()) {
return;
}
if ((_calcType == PC_PC || _calcType == NPC_PC)
&& !_targetPc.isGm()) {
return;
}
}
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();
}
if (_calcType == NPC_PC || _calcType == PC_PC) { // ターゲットがPCの場合
msg4 = _targetPc.getName();
msg2 = " 你目前剩餘 " + _targetPc.getCurrentHp()+"點HP";
} else if (_calcType == PC_NPC) { // ターゲットがNPCの場合
msg4 = _targetNpc.getName();
msg2 = " 怪物目前剩餘 " + _targetNpc.getCurrentHp()+"點HP";
}
msg3 = damage + " 點傷害";;
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
}
}
// ●●●● プレイヤーに計算結果を反映 ●●●●
private void commitPc(int damage, int drainMana) {
if (_calcType == PC_PC) {
if (drainMana > 0 && _targetPc.getCurrentMp() > 0) {
if (drainMana > _targetPc.getCurrentMp()) {
drainMana = _targetPc.getCurrentMp();
}
int newMp = _pc.getCurrentMp() + drainMana;
_pc.setCurrentMp(newMp);
}
_targetPc.receiveManaDamage(_pc, drainMana);
_targetPc.receiveDamage(_pc, damage);
} else if (_calcType == NPC_PC) {
_targetPc.receiveDamage(_npc, damage);
}
}
// ●●●● NPCに計算結果を反映 ●●●●
private void commitNpc(int damage, int drainMana) {
if (_calcType == PC_NPC) {
if (drainMana > 0) {
int drainValue = _targetNpc.drainMana(drainMana);
int newMp = _pc.getCurrentMp() + drainValue;
_pc.setCurrentMp(newMp);
}
_targetNpc.ReceiveManaDamage(_pc, drainMana);
_targetNpc.receiveDamage(_pc, damage);
} else if (_calcType == NPC_NPC) {
_targetNpc.receiveDamage(_npc, damage);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -