📄 l1attack.java
字号:
_hitRate += strHit[_pc.getStr()];
}
if (_pc.getDex() > 39) {
_hitRate += dexHit[39];
} else {
_hitRate += dexHit[_pc.getDex()];
}
if (_weaponType != 20 && _weaponType != 62) {
_hitRate += _weaponAddHit + _pc.getHitup() + _pc.getOriginalHitup()
+ (_weaponEnchant / 2);
} else {
_hitRate += _weaponAddHit + _pc.getBowHitup() + _pc
.getOriginalBowHitup() + (_weaponEnchant / 2);
}
if (_weaponType != 20 && _weaponType != 62) { // 防具による追加命中
_hitRate += _pc.getHitModifierByArmor();
} else {
_hitRate += _pc.getBowHitModifierByArmor();
}
int hitAc = (int) (_hitRate * 0.68 - 10) * -1;
if (hitAc <= _targetPc.getAc()) {
_hitRate = 95;
} else {
_hitRate = 95 - (hitAc - _targetPc.getAc());
}
if (_targetPc.hasSkillEffect(UNCANNY_DODGE)) {
_hitRate -= 20;
}
if (_targetPc.hasSkillEffect(MIRROR_IMAGE)) {
_hitRate -= 20;
}
if (_pc.hasSkillEffect(COOKING_2_0_N) // 料理による追加命中
|| _pc.hasSkillEffect(COOKING_2_0_S)) {
if (_weaponType != 20 && _weaponType != 62) {
_hitRate += 1;
}
}
if (_pc.hasSkillEffect(COOKING_3_2_N) // 料理による追加命中
|| _pc.hasSkillEffect(COOKING_3_2_S)) {
if (_weaponType != 20 && _weaponType != 62) {
_hitRate += 2;
}
}
if (_pc.hasSkillEffect(COOKING_2_3_N) // 料理による追加命中
|| _pc.hasSkillEffect(COOKING_2_3_S)
|| _pc.hasSkillEffect(COOKING_3_0_N)
|| _pc.hasSkillEffect(COOKING_3_0_S)) {
if (_weaponType == 20 || _weaponType == 62) {
_hitRate += 1;
}
}
if (_hitRate < MIN_HITRATE) {
_hitRate = MIN_HITRATE;
}
if (_weaponType2 == 17) {
_hitRate = 100; // キーリンクの命中率は100%
}
if (_targetPc.hasSkillEffect(ABSOLUTE_BARRIER)) {
_hitRate = 0;
}
if (_targetPc.hasSkillEffect(ICE_LANCE)) {
_hitRate = 0;
}
if (_targetPc.hasSkillEffect(FREEZING_BLIZZARD)) {
_hitRate = 0;
}
//取消地屏被攻擊動作
/*if (_targetPc.hasSkillEffect(EARTH_BIND)) {
_hitRate = 0;
}*/
int rnd = _random.nextInt(100) + 1;
if (_weaponType == 20 && _hitRate > rnd) { // 弓の場合、ヒットした場合でもERでの回避を再度行う。
return calcErEvasion();
}
return _hitRate >= rnd;
}
// ●●●● プレイヤー から NPC への命中判定 ●●●●
private boolean calcPcNpcHit() {
// NPCへの命中率
// =(PCのLv+クラス補正+STR補正+DEX補正+武器補正+DAIの枚数/2+魔法補正)×5-{NPCのAC×(-5)}
_hitRate = _pc.getLevel();
if (_pc.getStr() > 39) {
_hitRate += strHit[39];
} else {
_hitRate += strHit[_pc.getStr()];
}
if (_pc.getDex() > 39) {
_hitRate += dexHit[39];
} else {
_hitRate += dexHit[_pc.getDex()];
}
if (_weaponType != 20 && _weaponType != 62) {
_hitRate += _weaponAddHit + _pc.getHitup() + _pc.getOriginalHitup()
+ (_weaponEnchant / 2);
} else {
_hitRate += _weaponAddHit + _pc.getBowHitup() + _pc
.getOriginalBowHitup() + (_weaponEnchant / 2);
}
if (_weaponType != 20 && _weaponType != 62) { // 防具による追加命中
_hitRate += _pc.getHitModifierByArmor();
} else {
_hitRate += _pc.getBowHitModifierByArmor();
}
_hitRate *= 5;
_hitRate += _targetNpc.getAc() * 5;
if (_pc.hasSkillEffect(COOKING_2_0_N) // 料理による追加命中
|| _pc.hasSkillEffect(COOKING_2_0_S)) {
if (_weaponType != 20 && _weaponType != 62) {
_hitRate += 1;
}
}
if (_pc.hasSkillEffect(COOKING_3_2_N) // 料理による追加命中
|| _pc.hasSkillEffect(COOKING_3_2_S)) {
if (_weaponType != 20 && _weaponType != 62) {
_hitRate += 2;
}
}
if (_pc.hasSkillEffect(COOKING_2_3_N) // 料理による追加命中
|| _pc.hasSkillEffect(COOKING_2_3_S)
|| _pc.hasSkillEffect(COOKING_3_0_N)
|| _pc.hasSkillEffect(COOKING_3_0_S)) {
if (_weaponType == 20 || _weaponType == 62) {
_hitRate += 1;
}
}
if (_hitRate > 95) {
_hitRate = 95;
} else if (_hitRate < 5) {
_hitRate = 5;
}
if (_weaponType2 == 17) {
_hitRate = 100; // キーリンクの命中率は100%
}
int npcId = _targetNpc.getNpcTemplate().get_npcId();
if (npcId >= 45912 && npcId <= 45915 // 恨みに満ちたソルジャー&ソルジャーゴースト
&& !_pc.hasSkillEffect(STATUS_HOLY_WATER)) {
_hitRate = 0;
}
if (npcId == 45916 // 恨みに満ちたハメル将軍
&& !_pc.hasSkillEffect(STATUS_HOLY_MITHRIL_POWDER)) {
_hitRate = 0;
}
if (npcId == 45941 // 呪われた巫女サエル
&& !_pc.hasSkillEffect(STATUS_HOLY_WATER_OF_EVA)) {
_hitRate = 0;
}
if (npcId == 45752 // バルログ(変身前)
&& !_pc.hasSkillEffect(STATUS_CURSE_BARLOG)) {
_hitRate = 0;
}
if (npcId == 45753 // バルログ(変身後)
&& !_pc.hasSkillEffect(STATUS_CURSE_BARLOG)) {
_hitRate = 0;
}
if (npcId == 45675 // ヤヒ(変身前)
&& !_pc.hasSkillEffect(STATUS_CURSE_YAHEE)) {
_hitRate = 0;
}
if (npcId == 81082 // ヤヒ(変身後)
&& !_pc.hasSkillEffect(STATUS_CURSE_YAHEE)) {
_hitRate = 0;
}
if (npcId == 45625 // 混沌
&& !_pc.hasSkillEffect(STATUS_CURSE_YAHEE)) {
_hitRate = 0;
}
if (npcId == 45674 // 死
&& !_pc.hasSkillEffect(STATUS_CURSE_YAHEE)) {
_hitRate = 0;
}
if (npcId == 45685 // 堕落
&& !_pc.hasSkillEffect(STATUS_CURSE_YAHEE)) {
_hitRate = 0;
}
if (npcId >= 46068 && npcId <= 46091 // 欲望の洞窟側mob
&& _pc.getTempCharGfx() == 6035) {
_hitRate = 0;
}
if (npcId >= 46092 && npcId <= 46106 // 影の神殿側mob
&& _pc.getTempCharGfx() == 6034) {
_hitRate = 0;
}
int rnd = _random.nextInt(100) + 1;
return _hitRate >= rnd;
}
// ●●●● NPC から プレイヤー への命中判定 ●●●●
private boolean calcNpcPcHit() {
// PCへの命中率
// =(NPCのLv×2)×5-{NPCのAC×(-5)}
_hitRate = _npc.getLevel() * 2;
_hitRate *= 5;
_hitRate += _targetPc.getAc() * 5;
if (_npc instanceof L1PetInstance) { // ペットはLV1毎に追加命中+2
_hitRate += _npc.getLevel() * 2;
_hitRate += ((L1PetInstance) _npc).getHitByWeapon();
}
_hitRate += _npc.getHitup();
// 最低命中率をNPCのレベルに設定
if (_hitRate < _npc.getLevel()) {
_hitRate = _npc.getLevel();
}
if (_hitRate > 95) {
_hitRate = 95;
}
if (_targetPc.hasSkillEffect(UNCANNY_DODGE)) {
_hitRate -= 20;
}
if (_targetPc.hasSkillEffect(MIRROR_IMAGE)) {
_hitRate -= 20;
}
if (_hitRate < 5) {
_hitRate = 5;
}
if (_targetPc.hasSkillEffect(ABSOLUTE_BARRIER)) {
_hitRate = 0;
}
if (_targetPc.hasSkillEffect(ICE_LANCE)) {
_hitRate = 0;
}
if (_targetPc.hasSkillEffect(FREEZING_BLIZZARD)) {
_hitRate = 0;
}
//取消地屏被攻擊動作
/*if (_targetPc.hasSkillEffect(EARTH_BIND)) {
_hitRate = 0;
}*/
int rnd = _random.nextInt(100) + 1;
// NPCの攻撃レンジが10以上の場合で、2以上離れている場合弓攻撃とみなす
if (_npc.getNpcTemplate().get_ranged() >= 10
&& _hitRate > rnd
&& _npc.getLocation().getTileLineDistance(
new Point(_targetX, _targetY)) >= 2) {
return calcErEvasion();
}
return _hitRate >= rnd;
}
// ●●●● NPC から NPC への命中判定 ●●●●
private boolean calcNpcNpcHit() {
int target_ac = 10 - _targetNpc.getAc();
int attacker_lvl = _npc.getNpcTemplate().get_level();
if (target_ac != 0) {
_hitRate = (100 / target_ac * attacker_lvl); // 被攻撃者AC = 攻撃者Lv
// の時命中率100%
} else {
_hitRate = 100 / 1 * attacker_lvl;
}
if (_npc instanceof L1PetInstance) { // ペットはLV1毎に追加命中+2
_hitRate += _npc.getLevel() * 2;
_hitRate += ((L1PetInstance) _npc).getHitByWeapon();
}
if (_hitRate < attacker_lvl) {
_hitRate = attacker_lvl; // 最低命中率=Lv%
}
if (_hitRate > 95) {
_hitRate = 95; // 最高命中率は95%
}
if (_hitRate < 5) {
_hitRate = 5; // 攻撃者Lvが5未満の時は命中率5%
}
int rnd = _random.nextInt(100) + 1;
return _hitRate >= rnd;
}
// ●●●● ERによる回避判定 ●●●●
private boolean calcErEvasion() {
int er = _targetPc.getEr();
int rnd = _random.nextInt(100) + 1;
return er < rnd;
}
/* ■■■■■■■■■■■■■■■ ダメージ算出 ■■■■■■■■■■■■■■■ */
public int calcDamage() {
if (_calcType == PC_PC) {
_damage = calcPcPcDamage();
} else if (_calcType == PC_NPC) {
_damage = calcPcNpcDamage();
} else if (_calcType == NPC_PC) {
_damage = calcNpcPcDamage();
} else if (_calcType == NPC_NPC) {
_damage = calcNpcNpcDamage();
}
return _damage;
}
// ●●●● プレイヤー から プレイヤー へのダメージ算出 ●●●●
public int calcPcPcDamage() {
int weaponMaxDamage = _weaponSmall;
int weaponDamage = 0;
if (_weaponType == 58 && (_random.nextInt(100) + 1) <=
_weaponDoubleDmgChance) { // クリティカルヒット
weaponDamage = weaponMaxDamage;
_pc.sendPackets(new S_SkillSound(_pc.getId(), 3671));
_pc.broadcastPacket(new S_SkillSound(_pc.getId(), 3671));
} else if (_weaponType == 0 || _weaponType == 20 || _weaponType == 62) { // 素手、弓、ガントトレット
weaponDamage = 0;
} else {
weaponDamage = _random.nextInt(weaponMaxDamage) + 1;
}
if (_pc.hasSkillEffect(SOUL_OF_FLAME)) {
if (_weaponType != 20 && _weaponType != 62) {
weaponDamage = weaponMaxDamage;
}
}
int weaponTotalDamage = weaponDamage + _weaponAddDmg + _weaponEnchant;
if (_pc.hasSkillEffect(DOUBLE_BRAKE)
&& (_weaponType == 54 || _weaponType == 58)) {
if ((_random.nextInt(100) + 1) <= 33) {
weaponTotalDamage *= 2;
}
}
if (_weaponType == 54 && (_random.nextInt(100) + 1) <=
_weaponDoubleDmgChance) { // ダブルヒット
weaponTotalDamage *= 2;
_pc.sendPackets(new S_SkillSound(_pc.getId(), 3398));
_pc.broadcastPacket(new S_SkillSound(_pc.getId(), 3398));
}
if (_weaponId == 262 && _random.nextInt(100) + 1 <= 75) { // ディストラクション装備かつ成功確率(暫定)75%
weaponTotalDamage += calcDestruction(weaponTotalDamage);
}
double dmg;
if (_weaponType != 20 && _weaponType != 62) {
dmg = weaponTotalDamage + _statusDamage + _pc.getDmgup()
+ _pc.getOriginalDmgup();
} else {
dmg = weaponTotalDamage + _statusDamage + _pc.getBowDmgup()
+ _pc.getOriginalBowDmgup();
}
if (_weaponType == 20) { // 弓
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -