📄 l1attack.java
字号:
dmg += attrdmg;
// ④屬性強化受到受攻擊者的 MR(魔法防禦)影響。
dmg -= mrResist / 100;
}
return dmg;
}
//~屬性強化捲軸
// ●●●● NPC から プレイヤー へのダメージ算出 ●●●●
private int calcNpcPcDamage() {
int lvl = _npc.getLevel();
double dmg = 0D;
if (lvl < 10) {
dmg = _random.nextInt(lvl) + 10D + _npc.getStr() / 2 + 1;
} else {
dmg = _random.nextInt(lvl) + _npc.getStr() / 2 + 1;
}
if (_npc instanceof L1PetInstance) {
dmg += (lvl / 16); // ペットはLV16毎に追加打撃
dmg += ((L1PetInstance) _npc).getDamageByWeapon();
}
dmg += _npc.getDmgup();
if (isUndeadDamage()) {
dmg *= 1.1;
}
dmg = dmg * getLeverage() / 10;
dmg -= calcPcDefense();
if (_npc.isWeaponBreaked()) { // NPCがウェポンブレイク中。
dmg /= 2;
}
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 (_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;
}
// ペット、サモンからプレイヤーに攻撃
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 (dmg <= 0) {
_isHit = false;
}
addNpcPoisonAttack(_npc, _targetPc);
return (int) dmg;
}
// ●●●● NPC から NPC へのダメージ算出 ●●●●
private int calcNpcNpcDamage() {
int lvl = _npc.getLevel();
double dmg = 0;
if (_npc instanceof L1PetInstance) {
dmg = _random.nextInt(_npc.getNpcTemplate().get_level())
+ _npc.getStr() / 2 + 1;
dmg += (lvl / 16); // ペットはLV16毎に追加打撃
dmg += ((L1PetInstance) _npc).getDamageByWeapon();
} else {
dmg = _random.nextInt(lvl) + _npc.getStr() / 2 + 1;
}
if (isUndeadDamage()) {
dmg *= 1.1;
}
dmg = dmg * getLeverage() / 10;
dmg -= calcNpcDamageReduction();
if (_npc.isWeaponBreaked()) { // NPCがウェポンブレイク中。
dmg /= 2;
}
addNpcPoisonAttack(_npc, _targetNpc);
if (_targetNpc.hasSkillEffect(ICE_LANCE)) {
dmg = 0;
}
if (_targetNpc.hasSkillEffect(FREEZING_BLIZZARD)) {
dmg = 0;
}
if (_targetNpc.hasSkillEffect(EARTH_BIND)) {
dmg = 0;
}
if (dmg <= 0) {
_isHit = false;
}
return (int) dmg;
}
// ●●●● プレイヤーのダメージ強化魔法 ●●●●
private double calcBuffDamage(double dmg) {
// 火武器、バーサーカーのダメージは1.5倍しない
if (_pc.hasSkillEffect(BURNING_SPIRIT)
|| (_pc.hasSkillEffect(ELEMENTAL_FIRE)
&& _weaponType != 20 && _weaponType != 62
&& _weaponType2 !=17)) {
if ((_random.nextInt(100) + 1) <= 33) {
double tempDmg = dmg;
if (_pc.hasSkillEffect(FIRE_WEAPON)) {
tempDmg -= 4;
}
if (_pc.hasSkillEffect(FIRE_BLESS)) {
tempDmg -= 4;
}
if (_pc.hasSkillEffect(BURNING_WEAPON)) {
tempDmg -= 6;
}
if (_pc.hasSkillEffect(BERSERKERS)) {
tempDmg -= 5;
}
double diffDmg = dmg - tempDmg;
dmg = tempDmg * 1.5 + diffDmg;
}
}
return dmg;
}
// ●●●● プレイヤーのACによるダメージ軽減 ●●●●
private int calcPcDefense() {
int ac = Math.max(0, 10 - _targetPc.getAc());
int acDefMax = _targetPc.getClassFeature().getAcDefenseMax(ac);
return _random.nextInt(acDefMax + 1);
}
// ●●●● NPCのダメージリダクションによる軽減 ●●●●
private int calcNpcDamageReduction() {
return _targetNpc.getNpcTemplate().get_damagereduction();
}
// ●●●● 武器の材質と祝福による追加ダメージ算出 ●●●●
private int calcMaterialBlessDmg() {
int damage = 0;
int undead = _targetNpc.getNpcTemplate().get_undead();
if ((_weaponMaterial == 14 || _weaponMaterial == 17 || _weaponMaterial == 22)
&& (undead == 1 || undead == 3)) { // 銀ミスリルオリハルコン、かつ、アンデッド系アンデッド系ボス
damage += _random.nextInt(20) + 1;
}
if (_weaponBless == 0 && (undead == 1 || undead == 2 || undead == 3)) { // 祝福武器、かつ、アンデッド系悪魔系アンデッド系ボス
damage += _random.nextInt(4) + 1;
}
if (_pc.getWeapon() != null && _weaponType != 20 && _weaponType != 62
&& weapon.getHolyDmgByMagic() != 0 && (undead == 1 || undead == 3)) {
damage += weapon.getHolyDmgByMagic();
}
return damage;
}
// ●●●● NPCのアンデッドの夜間攻撃力の変化 ●●●●
private boolean isUndeadDamage() {
boolean flag = false;
int undead = _npc.getNpcTemplate().get_undead();
boolean isNight = L1GameTimeClock.getInstance().currentTime().isNight();
if (isNight && (undead == 1 || undead == 3)) { // 18~6時、かつ、アンデッド系アンデッド系ボス
flag = true;
}
return flag;
}
// ●●●● NPCの毒攻撃を付加 ●●●●
private void addNpcPoisonAttack(L1Character attacker, L1Character target) {
if (_npc.getNpcTemplate().get_poisonatk() != 0) { // 毒攻撃あり
if (15 >= _random.nextInt(100) + 1) { // 15%の確率で毒攻撃
if (_npc.getNpcTemplate().get_poisonatk() == 1) { // 通常毒
// 3秒周期でダメージ5
L1DamagePoison.doInfection(attacker, target, 3000, 5);
} else if (_npc.getNpcTemplate().get_poisonatk() == 2) { // 沈黙毒
L1SilencePoison.doInfection(target);
} else if (_npc.getNpcTemplate().get_poisonatk() == 4) { // 麻痺毒
// 20秒後に45秒間麻痺
L1ParalysisPoison.doInfection(target, 20000, 45000);
}
}
} else if (_npc.getNpcTemplate().get_paralysisatk() != 0) { // 麻痺攻撃あり
}
}
//增加吸血吸魔武器設定 by eric1300460
public void calcStaffOfHp(double dmg) {
if(weapon.getItem().get_getHp()>0){
_drainHp = _random.nextInt(weapon.getItem().get_getHp()) + 1;
if(_drainHp>dmg){
_drainHp=(int)dmg;
}
}
}
//~增加吸血吸魔武器設定 by eric1300460
// ■■■■ マナスタッフ、鋼鉄のマナスタッフ、マナバーラードのMP吸収量算出 ■■■■
public void calcStaffOfMana() {
//增加吸血吸魔武器設定 by eric1300460
if(weapon.getItem().get_getMp()>0){
_drainMana = _random.nextInt(weapon.getItem().get_getMp()) + 1;
}
//~增加吸血吸魔武器設定 by eric1300460
if (_weaponId == 126 || _weaponId == 127) { // SOMまたは鋼鉄のSOM
int som_lvl = _weaponEnchant + 3; // 最大MP吸収量を設定
if (som_lvl < 0) {
som_lvl = 0;
}
// MP吸収量をランダム取得
_drainMana = _random.nextInt(som_lvl) + 1;
// 最大MP吸収量を9に制限
if (_drainMana > Config.MANA_DRAIN_LIMIT_PER_SOM_ATTACK) {
_drainMana = Config.MANA_DRAIN_LIMIT_PER_SOM_ATTACK;
}
} else if (_weaponId == 259) { // マナバーラード
if (_calcType == PC_PC) {
if (_targetPc.getMr() <= _random.nextInt(100) + 1) { // 確率はターゲットのMRに依存
_drainMana = 1; // 吸収量は1固定
}
} else if (_calcType == PC_NPC) {
if (_targetNpc.getMr() <= _random.nextInt(100) + 1) { // 確率はターゲットのMRに依存
_drainMana = 1; // 吸収量は1固定
}
}
}
}
// ■■■■ ディストラクションのHP吸収量算出 ■■■■
private int calcDestruction(int dmg) {
_drainHp = (dmg / 8) + 1;
if (_drainHp <= 0) {
_drainHp = 1;
}
return _drainHp;
}
// ■■■■ PCの毒攻撃を付加 ■■■■
public void addPcPoisonAttack(L1Character attacker, L1Character target) {
int chance = _random.nextInt(100) + 1;
if ((_weaponId == 13 || _weaponId == 44 // FOD、古代のダークエルフソード
|| (_weaponId != 0 && _pc.hasSkillEffect(ENCHANT_VENOM))) // エンチャント
// ベノム中
&& chance <= 10) {
// 通常毒、3秒周期、ダメージHP-5
L1DamagePoison.doInfection(attacker, target, 3000, 5);
}
}
/* ■■■■■■■■■■■■■■ 攻撃モーション送信 ■■■■■■■■■■■■■■ */
public void action() {
if (_calcType == PC_PC || _calcType == PC_NPC) {
actionPc();
} else if (_calcType == NPC_PC || _calcType == NPC_NPC) {
actionNpc();
}
}
// ●●●● プレイヤーの攻撃モーション送信 ●●●●
private void actionPc() {
_pc.setHeading(_pc.targetDirection(_targetX, _targetY)); // 向きのセット
if (_isHit) {
if (_weaponType == 20) {
if (_arrow != null) { // 矢がある場合
_pc.sendPackets(new S_UseArrowSkill(_pc, _targetId, 66,
_targetX, _targetY));
_pc.broadcastPacket(new S_UseArrowSkill(_pc, _targetId, 66,
_targetX, _targetY));
_target.broadcastPacketExceptTargetSight(new S_DoActionGFX(
_targetId, ActionCodes.ACTION_Damage), _pc);
_pc.getInventory().removeItem(_arrow, 1);
} else if (_weaponId == 190) { // 矢が無くてサイハの場合
_pc.sendPackets(new S_UseArrowSkill(_pc, _targetId, 2349,
_targetX, _targetY));
_pc.broadcastPacket(new S_UseArrowSkill(_pc, _targetId,
2349, _targetX, _targetY));
_target.broadcastPacketExceptTargetSight(new S_DoActionGFX(
_targetId, ActionCodes.ACTION_Damage), _pc);
}
} else if (_weaponType == 62 && _sting != null) { // ガントレット
_pc.sendPackets(new S_UseArrowSkill(_pc, _targetId, 2989,
_targetX, _targetY));
_pc.broadcastPacket(new S_UseArrowSkill(_pc, _targetId, 2989,
_targetX, _targetY));
_target.broadcastPacketExceptTargetSight(new S_DoActionGFX(
_targetId, ActionCodes.ACTION_Damage), _pc);
_pc.getInventory().removeItem(_sting, 1);
} else {
_pc.sendPackets(new S_AttackStatus(_pc, _targetId,
ActionCodes.ACTION_Attack));
_pc.broadcastPacket(new S_AttackStatus(_pc, _targetId,
ActionCodes.ACTION_Attack));
_target.broadcastPacketExceptTargetSight(new S_DoActionGFX(
_targetId, ActionCodes.ACTION_Damage), _pc);
}
} else {
if (_weaponType == 20 && (_weaponId == 190 || _arrow != null)) {
calcOrbit(_pc.getX(), _pc.getY(), _pc.getHeading()); // 軌道を計算
if (_arrow != null) { // 矢がある場合
_pc.sendPackets(new S_UseArrowSkill(_pc, 0, 66, _targetX,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -