📄 l1magic.java
字号:
}
}
return true;
}
private int calcProbability(int skillId) {
L1Skills l1skills = SkillsTable.getInstance().getTemplate(skillId);
int attackLevel = 0;
int defenseLevel = 0;
int mr = 0;
int probability = 0;
if (_calcType == PC_PC || _calcType == PC_NPC) {
attackLevel = _pc.getLevel();
} else {
attackLevel = _npc.getLevel();
}
if (_calcType == PC_PC || _calcType == NPC_PC) {
defenseLevel = _targetPc.getLevel();
} else {
defenseLevel = _targetNpc.getLevel();
if (skillId == RETURN_TO_NATURE) {
if (_targetNpc instanceof L1SummonInstance) {
L1SummonInstance summon = (L1SummonInstance) _targetNpc;
defenseLevel = summon.getMaster().getLevel();
}
}
}
if (skillId == ELEMENTAL_FALL_DOWN || skillId == RETURN_TO_NATURE
|| skillId == ENTANGLE || skillId == ERASE_MAGIC
|| skillId == AREA_OF_SILENCE || skillId == WIND_SHACKLE
|| skillId == STRIKER_GALE || skillId == POLLUTE_WATER
|| skillId == EARTH_BIND) {
// 成功確率は 魔法固有係数 × LV差 + 基本確率
probability = (int) (((l1skills.getProbabilityDice()) / 10D)
* (attackLevel - defenseLevel)) + l1skills
.getProbabilityValue();
// オリジナルINTによる魔法命中
if (_calcType == PC_PC || _calcType == PC_NPC) {
probability += 2 * _pc.getOriginalMagicHit();
}
} else if (skillId == SHOCK_STUN
|| skillId == COUNTER_BARRIER) {
// 成功確率は 基本確率 + LV差1毎に+-1%
probability = l1skills.getProbabilityValue() + attackLevel - defenseLevel;
// オリジナルINTによる魔法命中
if (_calcType == PC_PC || _calcType == PC_NPC) {
probability += 2 * _pc.getOriginalMagicHit();
}
} else if(l1skills.getProbabilityDice()==0){ //不成文解決方法
probability = 100;
} else {
Random random = new Random();
int dice = l1skills.getProbabilityDice();
int diceCount = 0;
if (_calcType == PC_PC || _calcType == PC_NPC) {
if (_pc.isWizard()) {
diceCount = getMagicBonus() + getMagicLevel() + 1;
} else if (_pc.isElf()) {
diceCount = getMagicBonus() + getMagicLevel() - 1;
} else {
diceCount = getMagicBonus() + getMagicLevel() - 1;
}
} else {
diceCount = getMagicBonus() + getMagicLevel();
}
if (diceCount < 1) {
diceCount = 1;
}
for (int i = 0; i < diceCount; i++) {
probability += (random.nextInt(dice) + 1);
}
probability = probability * getLeverage() / 10;
// オリジナルINTによる魔法命中
if (_calcType == PC_PC || _calcType == PC_NPC) {
probability += 2 * _pc.getOriginalMagicHit();
}
probability -= getTargetMr();
if (skillId == TAMING_MONSTER) {
double probabilityRevision = 1;
if ((_targetNpc.getMaxHp() * 1 / 4) > _targetNpc.getCurrentHp()) {
probabilityRevision = 1.3;
} else if ((_targetNpc.getMaxHp() * 2 / 4) > _targetNpc
.getCurrentHp()) {
probabilityRevision = 1.2;
} else if ((_targetNpc.getMaxHp() * 3 / 4) > _targetNpc
.getCurrentHp()) {
probabilityRevision = 1.1;
}
probability *= probabilityRevision;
}
}
// 状態異常に対する耐性
if (skillId == EARTH_BIND) {
if (_calcType == PC_PC || _calcType == NPC_PC) {
probability -= _targetPc.getRegistSustain();
}
} else if (skillId == SHOCK_STUN) {
if (_calcType == PC_PC || _calcType == NPC_PC) {
probability -= 2 * _targetPc.getRegistStun();
}
} else if (skillId == CURSE_PARALYZE) {
if (_calcType == PC_PC || _calcType == NPC_PC) {
probability -= _targetPc.getRegistStone();
}
} else if (skillId == FOG_OF_SLEEPING) {
if (_calcType == PC_PC || _calcType == NPC_PC) {
probability -= _targetPc.getRegistSleep();
}
} else if (skillId == ICE_LANCE
|| skillId == FREEZING_BLIZZARD) {
if (_calcType == PC_PC || _calcType == NPC_PC) {
probability -= _targetPc.getRegistFreeze();
}
} else if (skillId == CURSE_BLIND
|| skillId == DARKNESS || skillId == DARK_BLIND) {
if (_calcType == PC_PC || _calcType == NPC_PC) {
probability -= _targetPc.getRegistBlind();
}
}
return probability;
}
/* ■■■■■■■■■■■■■■ 魔法ダメージ算出 ■■■■■■■■■■■■■■ */
public int calcMagicDamage(int skillId) {
int damage = 0;
if (_calcType == PC_PC || _calcType == NPC_PC) {
damage = calcPcMagicDamage(skillId);
} else if (_calcType == PC_NPC || _calcType == NPC_NPC) {
damage = calcNpcMagicDamage(skillId);
}
damage = calcMrDefense(damage);
// ダメージ最大値は対象の現在のHPと同じにする。
if (_calcType == PC_PC || _calcType == NPC_PC) {
if (damage > _targetPc.getCurrentHp()) {
damage = _targetPc.getCurrentHp();
}
} else {
if (damage > _targetNpc.getCurrentHp()) {
damage = _targetNpc.getCurrentHp();
}
}
return damage;
}
// ●●●● プレイヤー へのファイアーウォールの魔法ダメージ算出 ●●●●
public int calcPcFireWallDamage() {
int dmg = 0;
double attrDeffence = calcAttrResistance(L1Skills.ATTR_FIRE);
L1Skills l1skills = SkillsTable.getInstance().getTemplate(FIRE_WALL);
dmg = (int) ((1.0 - attrDeffence) * l1skills.getDamageValue());
if (_targetPc.hasSkillEffect(ABSOLUTE_BARRIER)) {
dmg = 0;
}
if (_targetPc.hasSkillEffect(ICE_LANCE)) {
dmg = 0;
}
if (_targetPc.hasSkillEffect(FREEZING_BLIZZARD)) {
dmg = 0;
}
if (_targetPc.hasSkillEffect(EARTH_BIND)) {
dmg = 0;
}
if (dmg < 0) {
dmg = 0;
}
return dmg;
}
// ●●●● NPC へのファイアーウォールの魔法ダメージ算出 ●●●●
public int calcNpcFireWallDamage() {
int dmg = 0;
double attrDeffence = calcAttrResistance(L1Skills.ATTR_FIRE);
L1Skills l1skills = SkillsTable.getInstance().getTemplate(FIRE_WALL);
dmg = (int) ((1.0 - attrDeffence) * l1skills.getDamageValue());
if (_targetNpc.hasSkillEffect(ICE_LANCE)) {
dmg = 0;
}
if (_targetNpc.hasSkillEffect(FREEZING_BLIZZARD)) {
dmg = 0;
}
if (_targetNpc.hasSkillEffect(EARTH_BIND)) {
dmg = 0;
}
if (dmg < 0) {
dmg = 0;
}
return dmg;
}
// ●●●● プレイヤーNPC から プレイヤー への魔法ダメージ算出 ●●●●
private int calcPcMagicDamage(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;
}
dmg -= _targetPc.getDamageReductionByArmor(); // 防具によるダメージ軽減
Object[] targetDollList = _targetPc.getDollList().values().toArray(); // マジックドールによるダメージ軽減
for (Object dollObject : targetDollList) {
L1DollInstance doll = (L1DollInstance) dollObject;
dmg -= doll.getDamageReductionByDoll();
}
if (_targetPc.hasSkillEffect(COOKING_1_0_S) // 料理によるダメージ軽減
|| _targetPc.hasSkillEffect(COOKING_1_1_S)
|| _targetPc.hasSkillEffect(COOKING_1_2_S)
|| _targetPc.hasSkillEffect(COOKING_1_3_S)
|| _targetPc.hasSkillEffect(COOKING_1_4_S)
|| _targetPc.hasSkillEffect(COOKING_1_5_S)
|| _targetPc.hasSkillEffect(COOKING_1_6_S)
|| _targetPc.hasSkillEffect(COOKING_2_0_S)
|| _targetPc.hasSkillEffect(COOKING_2_1_S)
|| _targetPc.hasSkillEffect(COOKING_2_2_S)
|| _targetPc.hasSkillEffect(COOKING_2_3_S)
|| _targetPc.hasSkillEffect(COOKING_2_4_S)
|| _targetPc.hasSkillEffect(COOKING_2_5_S)
|| _targetPc.hasSkillEffect(COOKING_2_6_S)
|| _targetPc.hasSkillEffect(COOKING_3_0_S)
|| _targetPc.hasSkillEffect(COOKING_3_1_S)
|| _targetPc.hasSkillEffect(COOKING_3_2_S)
|| _targetPc.hasSkillEffect(COOKING_3_3_S)
|| _targetPc.hasSkillEffect(COOKING_3_4_S)
|| _targetPc.hasSkillEffect(COOKING_3_5_S)
|| _targetPc.hasSkillEffect(COOKING_3_6_S)) {
dmg -= 5;
}
if (_targetPc.hasSkillEffect(COOKING_1_7_S) // デザートによるダメージ軽減
|| _targetPc.hasSkillEffect(COOKING_2_7_S)
|| _targetPc.hasSkillEffect(COOKING_3_7_S)) {
dmg -= 5;
}
if (_targetPc.hasSkillEffect(REDUCTION_ARMOR)) {
int targetPcLvl = _targetPc.getLevel();
if (targetPcLvl < 50) {
targetPcLvl = 50;
}
dmg -= (targetPcLvl - 50) / 5 + 1;
}
if (_targetPc.hasSkillEffect(DRAGON_SKIN)) {
dmg -= 2;
}
if (_targetPc.hasSkillEffect(PATIENCE)) {
dmg -= 2;
}
if (_calcType == NPC_PC) { // ペット、サモンからプレイヤーに攻撃
boolean isNowWar = false;
int castleId = L1CastleLocation.getCastleIdByArea(_targetPc);
if (castleId > 0) {
isNowWar = WarTimeController.getInstance().isNowWar(castleId);
}
if (!isNowWar) {
if (_npc instanceof L1PetInstance) {
dmg /= 8;
}
if (_npc instanceof L1SummonInstance) {
L1SummonInstance summon = (L1SummonInstance) _npc;
if (summon.isExsistMaster()) {
dmg /= 8;
}
}
}
}
if (_targetPc.hasSkillEffect(IMMUNE_TO_HARM)) {
dmg /= 2;
}
if (_targetPc.hasSkillEffect(ABSOLUTE_BARRIER)) {
dmg = 0;
}
if (_targetPc.hasSkillEffect(ICE_LANCE)) {
dmg = 0;
}
if (_targetPc.hasSkillEffect(FREEZING_BLIZZARD)) {
dmg = 0;
}
if (_targetPc.hasSkillEffect(EARTH_BIND)) {
dmg = 0;
}
if (_targetPc.hasSkillEffect(COUNTER_MIRROR)) {
if (_calcType == PC_PC) {
if (_targetPc.getWis() >= _random.nextInt(100)) {
_pc.sendPackets(new S_DoActionGFX(_pc.getId(),
ActionCodes.ACTION_Damage));
_pc.broadcastPacket(new S_DoActionGFX(_pc.getId(),
ActionCodes.ACTION_Damage));
_targetPc.sendPackets(new S_SkillSound(_targetPc.getId(),
4395));
_targetPc.broadcastPacket(new S_SkillSound(_targetPc
.getId(), 4395));
_pc.receiveDamage(_targetPc, dmg);
dmg = 0;
_targetPc.killSkillEffectTimer(COUNTER_MIRROR);
}
} else if (_calcType == NPC_PC) {
int npcId = _npc.getNpcTemplate().get_npcId();
if (npcId == 45681 || npcId == 45682 || npcId == 45683
|| npcId == 45684) {
} else if (!_npc.getNpcTemplate().get_IsErase()) {
} else {
if (_targetPc.getWis() >= _random.nextInt(100)) {
_npc.broadcastPacket(new S_DoActionGFX(_npc.getId(),
ActionCodes.ACTION_Damage));
_targetPc.sendPackets(new S_SkillSound(_targetPc
.getId(), 4395));
_targetPc.broadcastPacket(new S_SkillSound(_targetPc
.getId(), 4395));
_npc.receiveDamage(_targetPc, dmg);
dmg = 0;
_targetPc.killSkillEffectTimer(COUNTER_MIRROR);
}
}
}
}
if (dmg < 0) {
dmg = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -