Removed AttackDamagePosition effect.
This commit is contained in:
@@ -44,7 +44,6 @@ public final class EffectMasterHandler
|
|||||||
EffectHandler.getInstance().registerHandler("AttackAttribute", AttackAttribute::new);
|
EffectHandler.getInstance().registerHandler("AttackAttribute", AttackAttribute::new);
|
||||||
EffectHandler.getInstance().registerHandler("AttackAttributeAdd", AttackAttributeAdd::new);
|
EffectHandler.getInstance().registerHandler("AttackAttributeAdd", AttackAttributeAdd::new);
|
||||||
EffectHandler.getInstance().registerHandler("AttackBehind", AttackBehind::new);
|
EffectHandler.getInstance().registerHandler("AttackBehind", AttackBehind::new);
|
||||||
EffectHandler.getInstance().registerHandler("AttackDamagePosition", AttackDamagePosition::new);
|
|
||||||
EffectHandler.getInstance().registerHandler("AttackTrait", AttackTrait::new);
|
EffectHandler.getInstance().registerHandler("AttackTrait", AttackTrait::new);
|
||||||
EffectHandler.getInstance().registerHandler("Backstab", Backstab::new);
|
EffectHandler.getInstance().registerHandler("Backstab", Backstab::new);
|
||||||
EffectHandler.getInstance().registerHandler("Betray", Betray::new);
|
EffectHandler.getInstance().registerHandler("Betray", Betray::new);
|
||||||
|
@@ -1,53 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the L2J Mobius project.
|
|
||||||
*
|
|
||||||
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package handlers.effecthandlers;
|
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.MathUtil;
|
|
||||||
import com.l2jmobius.gameserver.enums.Position;
|
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
|
||||||
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
|
|
||||||
import com.l2jmobius.gameserver.model.skills.BuffInfo;
|
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Nik
|
|
||||||
*/
|
|
||||||
public class AttackDamagePosition extends AbstractEffect
|
|
||||||
{
|
|
||||||
protected final double _amount;
|
|
||||||
protected final Position _position;
|
|
||||||
|
|
||||||
public AttackDamagePosition(StatsSet params)
|
|
||||||
{
|
|
||||||
_amount = params.getDouble("amount");
|
|
||||||
_position = params.getEnum("position", Position.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void pump(L2Character effected, Skill skill)
|
|
||||||
{
|
|
||||||
effected.getStat().mergePositionTypeValue(Stats.ATTACK_DAMAGE, _position, (_amount / 100) + 1, MathUtil::mul);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onExit(BuffInfo info)
|
|
||||||
{
|
|
||||||
info.getEffected().getStat().mergePositionTypeValue(Stats.ATTACK_DAMAGE, _position, (_amount / 100) + 1, MathUtil::div);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -85,21 +85,6 @@ public final class Backstab extends AbstractEffect
|
|||||||
damage *= 2;
|
damage *= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, true, true, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, true);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, true, true, false);
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (effector.isPlayer())
|
|
||||||
// {
|
|
||||||
// final L2PcInstance activePlayer = effector.getActingPlayer();
|
|
||||||
// activePlayer.sendDamageMessage(effected, skill, (int) damage, true, false);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -94,7 +94,7 @@ public final class DamOverTime extends AbstractEffect
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info.getEffected().reduceCurrentHp(damage, info.getEffector(), info.getSkill(), true, false, false, false);
|
info.getEffector().doAttack(damage, info.getEffected(), info.getSkill(), true, false, false, false);
|
||||||
return info.getSkill().isToggle();
|
return info.getSkill().isToggle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -74,7 +74,7 @@ public final class DamOverTimePercent extends AbstractEffect
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info.getEffected().reduceCurrentHp(damage, info.getEffector(), info.getSkill(), true, false, false, false);
|
info.getEffector().doAttack(damage, info.getEffected(), info.getSkill(), true, false, false, false);
|
||||||
|
|
||||||
return info.getSkill().isToggle();
|
return info.getSkill().isToggle();
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -25,7 +24,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Death Link effect implementation.
|
* Death Link effect implementation.
|
||||||
@@ -70,26 +68,6 @@ public final class DeathLink extends AbstractEffect
|
|||||||
|
|
||||||
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
||||||
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power * (-((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2), effected.getMDef(), sps, bss, mcrit);
|
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power * (-((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2), effected.getMDef(), sps, bss, mcrit);
|
||||||
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (damage > 0)
|
|
||||||
{
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -162,10 +162,6 @@ public final class EnergyAttack extends AbstractEffect
|
|||||||
|
|
||||||
damage = Math.max(0, damage);
|
damage = Math.max(0, damage);
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(attacker, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// attacker.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -117,18 +117,6 @@ public final class FatalBlow extends AbstractEffect
|
|||||||
damage *= 2;
|
damage *= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, true, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, true);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, true, false);
|
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, true, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -87,16 +87,6 @@ public final class HpDrain extends AbstractEffect
|
|||||||
final double hpFinal = ((effector.getCurrentHp() + hpAdd) > effector.getMaxHp() ? effector.getMaxHp() : (effector.getCurrentHp() + hpAdd));
|
final double hpFinal = ((effector.getCurrentHp() + hpAdd) > effector.getMaxHp() ? effector.getMaxHp() : (effector.getCurrentHp() + hpAdd));
|
||||||
effector.setCurrentHp(hpFinal);
|
effector.setCurrentHp(hpFinal);
|
||||||
|
|
||||||
if (damage > 0)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
{
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -69,7 +69,7 @@ public final class HpToOwner extends AbstractEffect
|
|||||||
|
|
||||||
final double damage = _power * getTicksMultiplier();
|
final double damage = _power * getTicksMultiplier();
|
||||||
|
|
||||||
info.getEffected().reduceCurrentHp(damage, info.getEffector(), info.getSkill(), true, false, false, false);
|
info.getEffector().doAttack(damage, info.getEffected(), info.getSkill(), true, false, false, false);
|
||||||
if (_stealAmount > 0)
|
if (_stealAmount > 0)
|
||||||
{
|
{
|
||||||
final double amount = (damage * _stealAmount) / 100;
|
final double amount = (damage * _stealAmount) / 100;
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -26,7 +25,6 @@ import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
|||||||
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Abnormal-depending dispel Attack effect implementation.
|
* Magical Abnormal-depending dispel Attack effect implementation.
|
||||||
@@ -74,25 +72,6 @@ public final class MagicalAbnormalDispelAttack extends AbstractEffect
|
|||||||
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
||||||
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, effected.getMDef(), sps, bss, mcrit);
|
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, effected.getMDef(), sps, bss, mcrit);
|
||||||
|
|
||||||
if (damage > 0)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
{
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Attackable;
|
import com.l2jmobius.gameserver.model.actor.L2Attackable;
|
||||||
@@ -26,7 +25,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Attack effect implementation.
|
* Magical Attack effect implementation.
|
||||||
@@ -86,34 +84,6 @@ public final class MagicalAttack extends AbstractEffect
|
|||||||
damage *= _debuffModifier;
|
damage *= _debuffModifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
|
|
||||||
// Absorb HP from the damage inflicted
|
|
||||||
double absorbPercent = effector.getStat().getValue(Stats.ABSORB_DAMAGE_PERCENT, 0) * effector.getStat().getValue(Stats.ABSORB_DAMAGE_DEFENCE, 1);
|
|
||||||
if ((absorbPercent > 0) && (Rnd.nextDouble() < effector.getStat().getValue(Stats.ABSORB_DAMAGE_CHANCE)))
|
|
||||||
{
|
|
||||||
int absorbDamage = (int) Math.min(absorbPercent * damage, effector.getMaxRecoverableHp() - effector.getCurrentHp());
|
|
||||||
absorbDamage = Math.min(absorbDamage, (int) effected.getCurrentHp());
|
|
||||||
if (absorbDamage > 0)
|
|
||||||
{
|
|
||||||
effector.setCurrentHp(effector.getCurrentHp() + absorbDamage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -25,7 +24,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Attack By Abnormal effect implementation.
|
* Magical Attack By Abnormal effect implementation.
|
||||||
@@ -73,34 +71,6 @@ public final class MagicalAttackByAbnormal extends AbstractEffect
|
|||||||
// each buff increase +30%
|
// each buff increase +30%
|
||||||
damage *= (((effected.getBuffCount() * 0.3) + 1.3) / 4);
|
damage *= (((effected.getBuffCount() * 0.3) + 1.3) / 4);
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
|
|
||||||
// Absorb HP from the damage inflicted
|
|
||||||
double absorbPercent = effector.getStat().getValue(Stats.ABSORB_DAMAGE_PERCENT, 0) * effector.getStat().getValue(Stats.ABSORB_DAMAGE_DEFENCE, 1);
|
|
||||||
if ((absorbPercent > 0) && (Rnd.nextDouble() < effector.getStat().getValue(Stats.ABSORB_DAMAGE_CHANCE)))
|
|
||||||
{
|
|
||||||
int absorbDamage = (int) Math.min(absorbPercent * damage, effector.getMaxRecoverableHp() - effector.getCurrentHp());
|
|
||||||
absorbDamage = Math.min(absorbDamage, (int) effected.getCurrentHp());
|
|
||||||
if (absorbDamage > 0)
|
|
||||||
{
|
|
||||||
effector.setCurrentHp(effector.getCurrentHp() + absorbDamage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -20,7 +20,6 @@ import java.util.Collections;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -30,7 +29,6 @@ import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
|||||||
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Attack By Abnormal Slot effect implementation.
|
* Magical Attack By Abnormal Slot effect implementation.
|
||||||
@@ -90,34 +88,6 @@ public final class MagicalAttackByAbnormalSlot extends AbstractEffect
|
|||||||
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
||||||
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, effected.getMDef(), sps, bss, mcrit);
|
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, effected.getMDef(), sps, bss, mcrit);
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
|
|
||||||
// Absorb HP from the damage inflicted
|
|
||||||
double absorbPercent = effector.getStat().getValue(Stats.ABSORB_DAMAGE_PERCENT, 0) * effector.getStat().getValue(Stats.ABSORB_DAMAGE_DEFENCE, 1);
|
|
||||||
if ((absorbPercent > 0) && (Rnd.nextDouble() < effector.getStat().getValue(Stats.ABSORB_DAMAGE_CHANCE)))
|
|
||||||
{
|
|
||||||
int absorbDamage = (int) Math.min(absorbPercent * damage, effector.getMaxRecoverableHp() - effector.getCurrentHp());
|
|
||||||
absorbDamage = Math.min(absorbDamage, (int) effected.getCurrentHp());
|
|
||||||
if (absorbDamage > 0)
|
|
||||||
{
|
|
||||||
effector.setCurrentHp(effector.getCurrentHp() + absorbDamage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -25,7 +24,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Attack effect implementation.
|
* Magical Attack effect implementation.
|
||||||
@@ -88,34 +86,6 @@ public final class MagicalAttackRange extends AbstractEffect
|
|||||||
damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, mDef, sps, bss, mcrit);
|
damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, mDef, sps, bss, mcrit);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
|
|
||||||
// Absorb HP from the damage inflicted
|
|
||||||
double absorbPercent = effector.getStat().getValue(Stats.ABSORB_DAMAGE_PERCENT, 0) * effector.getStat().getValue(Stats.ABSORB_DAMAGE_DEFENCE, 1);
|
|
||||||
if ((absorbPercent > 0) && (Rnd.nextDouble() < effector.getStat().getValue(Stats.ABSORB_DAMAGE_CHANCE)))
|
|
||||||
{
|
|
||||||
int absorbDamage = (int) Math.min(absorbPercent * damage, effector.getMaxRecoverableHp() - effector.getCurrentHp());
|
|
||||||
absorbDamage = Math.min(absorbDamage, (int) effected.getCurrentHp());
|
|
||||||
if (absorbDamage > 0)
|
|
||||||
{
|
|
||||||
effector.setCurrentHp(effector.getCurrentHp() + absorbDamage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -80,7 +80,7 @@ public final class MagicalDamOverTime extends AbstractEffect
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info.getEffected().reduceCurrentHp(damage, info.getEffector(), info.getSkill(), true, false, false, false);
|
info.getEffector().doAttack(damage, info.getEffected(), info.getSkill(), true, false, false, false);
|
||||||
return info.getSkill().isToggle();
|
return info.getSkill().isToggle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -25,7 +24,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
import com.l2jmobius.gameserver.network.SystemMessageId;
|
import com.l2jmobius.gameserver.network.SystemMessageId;
|
||||||
import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
||||||
|
|
||||||
@@ -82,25 +80,6 @@ public final class MagicalSoulAttack extends AbstractEffect
|
|||||||
final double mAtk = effector.getMAtk() * (chargedSouls > 0 ? (1.3 + (chargedSouls * 0.05)) : 1);
|
final double mAtk = effector.getMAtk() * (chargedSouls > 0 ? (1.3 + (chargedSouls * 0.05)) : 1);
|
||||||
final double damage = Formulas.calcMagicDam(effector, effected, skill, mAtk, _power, effected.getMDef(), sps, bss, mcrit);
|
final double damage = Formulas.calcMagicDam(effector, effected, skill, mAtk, _power, effected.getMDef(), sps, bss, mcrit);
|
||||||
|
|
||||||
if (damage > 0)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
{
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -172,10 +172,6 @@ public final class PhysicalAttack extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -134,10 +134,6 @@ public final class PhysicalAttackHpLink extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected.
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -144,9 +144,6 @@ public final class PhysicalAttackSaveHp extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
final double minHp = (effected.getMaxHp() * _saveHp) / 100;
|
final double minHp = (effected.getMaxHp() * _saveHp) / 100;
|
||||||
|
|
||||||
if ((effected.getCurrentHp() - damage) < minHp)
|
if ((effected.getCurrentHp() - damage) < minHp)
|
||||||
@@ -154,7 +151,6 @@ public final class PhysicalAttackSaveHp extends AbstractEffect
|
|||||||
damage = effected.getCurrentHp() - minHp;
|
damage = effected.getCurrentHp() - minHp;
|
||||||
}
|
}
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -165,10 +165,6 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -159,10 +159,6 @@ public final class PhysicalSoulAttack extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -90,22 +90,6 @@ public final class SoulBlow extends AbstractEffect
|
|||||||
damage *= 1 + (chargedSouls * 0.04);
|
damage *= 1 + (chargedSouls * 0.04);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, true, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, true);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, true, false);
|
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (effector.isPlayer())
|
|
||||||
// {
|
|
||||||
// final L2PcInstance activePlayer = effector.getActingPlayer();
|
|
||||||
// activePlayer.sendDamageMessage(effected, skill, (int) damage, true, false);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -890,15 +890,7 @@
|
|||||||
<!-- Rear Damage + 3%. -->
|
<!-- Rear Damage + 3%. -->
|
||||||
<operateType>P</operateType>
|
<operateType>P</operateType>
|
||||||
<icon>icon.skill0030</icon>
|
<icon>icon.skill0030</icon>
|
||||||
<effects>
|
<!-- TODO: Handle rear damage stat -->
|
||||||
<effect name="AttackDamagePosition">
|
|
||||||
<amount>
|
|
||||||
<value level="1">3</value>
|
|
||||||
<value level="2">6</value>
|
|
||||||
</amount>
|
|
||||||
<position>BACK</position>
|
|
||||||
</effect>
|
|
||||||
</effects>
|
|
||||||
</skill>
|
</skill>
|
||||||
<skill id="19145" toLevel="2" name="Noble Death Whisper">
|
<skill id="19145" toLevel="2" name="Noble Death Whisper">
|
||||||
<!-- Physical Critical Damage + 3%. -->
|
<!-- Physical Critical Damage + 3%. -->
|
||||||
|
@@ -13,7 +13,6 @@ AreaDamage: Topography (Danger Zone) resistance stat.
|
|||||||
AttackAttribute: Stat that increases specific attack attribute.
|
AttackAttribute: Stat that increases specific attack attribute.
|
||||||
AttackAttributeAdd: Stat that increases all attack attribute.
|
AttackAttributeAdd: Stat that increases all attack attribute.
|
||||||
AttackBehind: Enables all attacks regardless of position to land towards the back.
|
AttackBehind: Enables all attacks regardless of position to land towards the back.
|
||||||
AttackDamagePosition: Bonus damage depending on player position towards the target.
|
|
||||||
AttackTrait: Stat that manages all attack traits.
|
AttackTrait: Stat that manages all attack traits.
|
||||||
Backstab: Inflicts physical damage according to the backstab formula.
|
Backstab: Inflicts physical damage according to the backstab formula.
|
||||||
Betray: Causes the target summon to attack its owner.
|
Betray: Causes the target summon to attack its owner.
|
||||||
|
@@ -55,7 +55,6 @@ import com.l2jmobius.gameserver.enums.BasicProperty;
|
|||||||
import com.l2jmobius.gameserver.enums.CategoryType;
|
import com.l2jmobius.gameserver.enums.CategoryType;
|
||||||
import com.l2jmobius.gameserver.enums.InstanceType;
|
import com.l2jmobius.gameserver.enums.InstanceType;
|
||||||
import com.l2jmobius.gameserver.enums.ItemSkillType;
|
import com.l2jmobius.gameserver.enums.ItemSkillType;
|
||||||
import com.l2jmobius.gameserver.enums.Position;
|
|
||||||
import com.l2jmobius.gameserver.enums.Race;
|
import com.l2jmobius.gameserver.enums.Race;
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.enums.StatusUpdateType;
|
import com.l2jmobius.gameserver.enums.StatusUpdateType;
|
||||||
@@ -4397,7 +4396,8 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
|||||||
|
|
||||||
if (!reflect && !isDOT)
|
if (!reflect && !isDOT)
|
||||||
{
|
{
|
||||||
damage *= getStat().getPositionTypeValue(Stats.ATTACK_DAMAGE, Position.getPosition(this, target));
|
// TODO: Implement AttackDamagePosition effect
|
||||||
|
// damage *= getStat().getPositionTypeValue(Stats.ATTACK_DAMAGE, Position.getPosition(this, target));
|
||||||
|
|
||||||
// Counterattacks happen before damage received.
|
// Counterattacks happen before damage received.
|
||||||
if (!target.isDead() && (skill != null))
|
if (!target.isDead() && (skill != null))
|
||||||
|
@@ -44,7 +44,6 @@ public final class EffectMasterHandler
|
|||||||
EffectHandler.getInstance().registerHandler("AttackAttribute", AttackAttribute::new);
|
EffectHandler.getInstance().registerHandler("AttackAttribute", AttackAttribute::new);
|
||||||
EffectHandler.getInstance().registerHandler("AttackAttributeAdd", AttackAttributeAdd::new);
|
EffectHandler.getInstance().registerHandler("AttackAttributeAdd", AttackAttributeAdd::new);
|
||||||
EffectHandler.getInstance().registerHandler("AttackBehind", AttackBehind::new);
|
EffectHandler.getInstance().registerHandler("AttackBehind", AttackBehind::new);
|
||||||
EffectHandler.getInstance().registerHandler("AttackDamagePosition", AttackDamagePosition::new);
|
|
||||||
EffectHandler.getInstance().registerHandler("AttackTrait", AttackTrait::new);
|
EffectHandler.getInstance().registerHandler("AttackTrait", AttackTrait::new);
|
||||||
EffectHandler.getInstance().registerHandler("Backstab", Backstab::new);
|
EffectHandler.getInstance().registerHandler("Backstab", Backstab::new);
|
||||||
EffectHandler.getInstance().registerHandler("Betray", Betray::new);
|
EffectHandler.getInstance().registerHandler("Betray", Betray::new);
|
||||||
|
@@ -1,53 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the L2J Mobius project.
|
|
||||||
*
|
|
||||||
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package handlers.effecthandlers;
|
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.MathUtil;
|
|
||||||
import com.l2jmobius.gameserver.enums.Position;
|
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
|
||||||
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
|
|
||||||
import com.l2jmobius.gameserver.model.skills.BuffInfo;
|
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Nik
|
|
||||||
*/
|
|
||||||
public class AttackDamagePosition extends AbstractEffect
|
|
||||||
{
|
|
||||||
protected final double _amount;
|
|
||||||
protected final Position _position;
|
|
||||||
|
|
||||||
public AttackDamagePosition(StatsSet params)
|
|
||||||
{
|
|
||||||
_amount = params.getDouble("amount");
|
|
||||||
_position = params.getEnum("position", Position.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void pump(L2Character effected, Skill skill)
|
|
||||||
{
|
|
||||||
effected.getStat().mergePositionTypeValue(Stats.ATTACK_DAMAGE, _position, (_amount / 100) + 1, MathUtil::mul);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onExit(BuffInfo info)
|
|
||||||
{
|
|
||||||
info.getEffected().getStat().mergePositionTypeValue(Stats.ATTACK_DAMAGE, _position, (_amount / 100) + 1, MathUtil::div);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -85,21 +85,6 @@ public final class Backstab extends AbstractEffect
|
|||||||
damage *= 2;
|
damage *= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, true, true, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, true);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, true, true, false);
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (effector.isPlayer())
|
|
||||||
// {
|
|
||||||
// final L2PcInstance activePlayer = effector.getActingPlayer();
|
|
||||||
// activePlayer.sendDamageMessage(effected, skill, (int) damage, true, false);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -94,7 +94,7 @@ public final class DamOverTime extends AbstractEffect
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info.getEffected().reduceCurrentHp(damage, info.getEffector(), info.getSkill(), true, false, false, false);
|
info.getEffector().doAttack(damage, info.getEffected(), info.getSkill(), true, false, false, false);
|
||||||
return info.getSkill().isToggle();
|
return info.getSkill().isToggle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -74,7 +74,7 @@ public final class DamOverTimePercent extends AbstractEffect
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info.getEffected().reduceCurrentHp(damage, info.getEffector(), info.getSkill(), true, false, false, false);
|
info.getEffector().doAttack(damage, info.getEffected(), info.getSkill(), true, false, false, false);
|
||||||
|
|
||||||
return info.getSkill().isToggle();
|
return info.getSkill().isToggle();
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -25,7 +24,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Death Link effect implementation.
|
* Death Link effect implementation.
|
||||||
@@ -70,26 +68,6 @@ public final class DeathLink extends AbstractEffect
|
|||||||
|
|
||||||
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
||||||
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power * (-((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2), effected.getMDef(), sps, bss, mcrit);
|
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power * (-((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2), effected.getMDef(), sps, bss, mcrit);
|
||||||
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (damage > 0)
|
|
||||||
{
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -162,10 +162,6 @@ public final class EnergyAttack extends AbstractEffect
|
|||||||
|
|
||||||
damage = Math.max(0, damage);
|
damage = Math.max(0, damage);
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(attacker, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// attacker.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -117,18 +117,6 @@ public final class FatalBlow extends AbstractEffect
|
|||||||
damage *= 2;
|
damage *= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, true, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, true);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, true, false);
|
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, true, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -87,16 +87,6 @@ public final class HpDrain extends AbstractEffect
|
|||||||
final double hpFinal = ((effector.getCurrentHp() + hpAdd) > effector.getMaxHp() ? effector.getMaxHp() : (effector.getCurrentHp() + hpAdd));
|
final double hpFinal = ((effector.getCurrentHp() + hpAdd) > effector.getMaxHp() ? effector.getMaxHp() : (effector.getCurrentHp() + hpAdd));
|
||||||
effector.setCurrentHp(hpFinal);
|
effector.setCurrentHp(hpFinal);
|
||||||
|
|
||||||
if (damage > 0)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
{
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -69,7 +69,7 @@ public final class HpToOwner extends AbstractEffect
|
|||||||
|
|
||||||
final double damage = _power * getTicksMultiplier();
|
final double damage = _power * getTicksMultiplier();
|
||||||
|
|
||||||
info.getEffected().reduceCurrentHp(damage, info.getEffector(), info.getSkill(), true, false, false, false);
|
info.getEffector().doAttack(damage, info.getEffected(), info.getSkill(), true, false, false, false);
|
||||||
if (_stealAmount > 0)
|
if (_stealAmount > 0)
|
||||||
{
|
{
|
||||||
final double amount = (damage * _stealAmount) / 100;
|
final double amount = (damage * _stealAmount) / 100;
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -26,7 +25,6 @@ import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
|||||||
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Abnormal-depending dispel Attack effect implementation.
|
* Magical Abnormal-depending dispel Attack effect implementation.
|
||||||
@@ -74,25 +72,6 @@ public final class MagicalAbnormalDispelAttack extends AbstractEffect
|
|||||||
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
||||||
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, effected.getMDef(), sps, bss, mcrit);
|
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, effected.getMDef(), sps, bss, mcrit);
|
||||||
|
|
||||||
if (damage > 0)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
{
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Attackable;
|
import com.l2jmobius.gameserver.model.actor.L2Attackable;
|
||||||
@@ -26,7 +25,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Attack effect implementation.
|
* Magical Attack effect implementation.
|
||||||
@@ -86,34 +84,6 @@ public final class MagicalAttack extends AbstractEffect
|
|||||||
damage *= _debuffModifier;
|
damage *= _debuffModifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
|
|
||||||
// Absorb HP from the damage inflicted
|
|
||||||
double absorbPercent = effector.getStat().getValue(Stats.ABSORB_DAMAGE_PERCENT, 0) * effector.getStat().getValue(Stats.ABSORB_DAMAGE_DEFENCE, 1);
|
|
||||||
if ((absorbPercent > 0) && (Rnd.nextDouble() < effector.getStat().getValue(Stats.ABSORB_DAMAGE_CHANCE)))
|
|
||||||
{
|
|
||||||
int absorbDamage = (int) Math.min(absorbPercent * damage, effector.getMaxRecoverableHp() - effector.getCurrentHp());
|
|
||||||
absorbDamage = Math.min(absorbDamage, (int) effected.getCurrentHp());
|
|
||||||
if (absorbDamage > 0)
|
|
||||||
{
|
|
||||||
effector.setCurrentHp(effector.getCurrentHp() + absorbDamage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -25,7 +24,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Attack By Abnormal effect implementation.
|
* Magical Attack By Abnormal effect implementation.
|
||||||
@@ -73,34 +71,6 @@ public final class MagicalAttackByAbnormal extends AbstractEffect
|
|||||||
// each buff increase +30%
|
// each buff increase +30%
|
||||||
damage *= (((effected.getBuffCount() * 0.3) + 1.3) / 4);
|
damage *= (((effected.getBuffCount() * 0.3) + 1.3) / 4);
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
|
|
||||||
// Absorb HP from the damage inflicted
|
|
||||||
double absorbPercent = effector.getStat().getValue(Stats.ABSORB_DAMAGE_PERCENT, 0) * effector.getStat().getValue(Stats.ABSORB_DAMAGE_DEFENCE, 1);
|
|
||||||
if ((absorbPercent > 0) && (Rnd.nextDouble() < effector.getStat().getValue(Stats.ABSORB_DAMAGE_CHANCE)))
|
|
||||||
{
|
|
||||||
int absorbDamage = (int) Math.min(absorbPercent * damage, effector.getMaxRecoverableHp() - effector.getCurrentHp());
|
|
||||||
absorbDamage = Math.min(absorbDamage, (int) effected.getCurrentHp());
|
|
||||||
if (absorbDamage > 0)
|
|
||||||
{
|
|
||||||
effector.setCurrentHp(effector.getCurrentHp() + absorbDamage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -20,7 +20,6 @@ import java.util.Collections;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -30,7 +29,6 @@ import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
|||||||
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Attack By Abnormal Slot effect implementation.
|
* Magical Attack By Abnormal Slot effect implementation.
|
||||||
@@ -90,34 +88,6 @@ public final class MagicalAttackByAbnormalSlot extends AbstractEffect
|
|||||||
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
||||||
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, effected.getMDef(), sps, bss, mcrit);
|
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, effected.getMDef(), sps, bss, mcrit);
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
|
|
||||||
// Absorb HP from the damage inflicted
|
|
||||||
double absorbPercent = effector.getStat().getValue(Stats.ABSORB_DAMAGE_PERCENT, 0) * effector.getStat().getValue(Stats.ABSORB_DAMAGE_DEFENCE, 1);
|
|
||||||
if ((absorbPercent > 0) && (Rnd.nextDouble() < effector.getStat().getValue(Stats.ABSORB_DAMAGE_CHANCE)))
|
|
||||||
{
|
|
||||||
int absorbDamage = (int) Math.min(absorbPercent * damage, effector.getMaxRecoverableHp() - effector.getCurrentHp());
|
|
||||||
absorbDamage = Math.min(absorbDamage, (int) effected.getCurrentHp());
|
|
||||||
if (absorbDamage > 0)
|
|
||||||
{
|
|
||||||
effector.setCurrentHp(effector.getCurrentHp() + absorbDamage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -25,7 +24,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Attack effect implementation.
|
* Magical Attack effect implementation.
|
||||||
@@ -88,34 +86,6 @@ public final class MagicalAttackRange extends AbstractEffect
|
|||||||
damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, mDef, sps, bss, mcrit);
|
damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, mDef, sps, bss, mcrit);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
|
|
||||||
// Absorb HP from the damage inflicted
|
|
||||||
double absorbPercent = effector.getStat().getValue(Stats.ABSORB_DAMAGE_PERCENT, 0) * effector.getStat().getValue(Stats.ABSORB_DAMAGE_DEFENCE, 1);
|
|
||||||
if ((absorbPercent > 0) && (Rnd.nextDouble() < effector.getStat().getValue(Stats.ABSORB_DAMAGE_CHANCE)))
|
|
||||||
{
|
|
||||||
int absorbDamage = (int) Math.min(absorbPercent * damage, effector.getMaxRecoverableHp() - effector.getCurrentHp());
|
|
||||||
absorbDamage = Math.min(absorbDamage, (int) effected.getCurrentHp());
|
|
||||||
if (absorbDamage > 0)
|
|
||||||
{
|
|
||||||
effector.setCurrentHp(effector.getCurrentHp() + absorbDamage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -80,7 +80,7 @@ public final class MagicalDamOverTime extends AbstractEffect
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info.getEffected().reduceCurrentHp(damage, info.getEffector(), info.getSkill(), true, false, false, false);
|
info.getEffector().doAttack(damage, info.getEffected(), info.getSkill(), true, false, false, false);
|
||||||
return info.getSkill().isToggle();
|
return info.getSkill().isToggle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -25,7 +24,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
import com.l2jmobius.gameserver.network.SystemMessageId;
|
import com.l2jmobius.gameserver.network.SystemMessageId;
|
||||||
import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
||||||
|
|
||||||
@@ -82,25 +80,6 @@ public final class MagicalSoulAttack extends AbstractEffect
|
|||||||
final double mAtk = effector.getMAtk() * (chargedSouls > 0 ? (1.3 + (chargedSouls * 0.05)) : 1);
|
final double mAtk = effector.getMAtk() * (chargedSouls > 0 ? (1.3 + (chargedSouls * 0.05)) : 1);
|
||||||
final double damage = Formulas.calcMagicDam(effector, effected, skill, mAtk, _power, effected.getMDef(), sps, bss, mcrit);
|
final double damage = Formulas.calcMagicDam(effector, effected, skill, mAtk, _power, effected.getMDef(), sps, bss, mcrit);
|
||||||
|
|
||||||
if (damage > 0)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
{
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -172,10 +172,6 @@ public final class PhysicalAttack extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -134,10 +134,6 @@ public final class PhysicalAttackHpLink extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected.
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -144,9 +144,6 @@ public final class PhysicalAttackSaveHp extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
final double minHp = (effected.getMaxHp() * _saveHp) / 100;
|
final double minHp = (effected.getMaxHp() * _saveHp) / 100;
|
||||||
|
|
||||||
if ((effected.getCurrentHp() - damage) < minHp)
|
if ((effected.getCurrentHp() - damage) < minHp)
|
||||||
@@ -154,7 +151,6 @@ public final class PhysicalAttackSaveHp extends AbstractEffect
|
|||||||
damage = effected.getCurrentHp() - minHp;
|
damage = effected.getCurrentHp() - minHp;
|
||||||
}
|
}
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -165,10 +165,6 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -159,10 +159,6 @@ public final class PhysicalSoulAttack extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -90,22 +90,6 @@ public final class SoulBlow extends AbstractEffect
|
|||||||
damage *= 1 + (chargedSouls * 0.04);
|
damage *= 1 + (chargedSouls * 0.04);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, true, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, true);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, true, false);
|
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (effector.isPlayer())
|
|
||||||
// {
|
|
||||||
// final L2PcInstance activePlayer = effector.getActingPlayer();
|
|
||||||
// activePlayer.sendDamageMessage(effected, skill, (int) damage, true, false);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -890,15 +890,7 @@
|
|||||||
<!-- Rear Damage + 3%. -->
|
<!-- Rear Damage + 3%. -->
|
||||||
<operateType>P</operateType>
|
<operateType>P</operateType>
|
||||||
<icon>icon.skill0030</icon>
|
<icon>icon.skill0030</icon>
|
||||||
<effects>
|
<!-- TODO: Handle rear damage stat -->
|
||||||
<effect name="AttackDamagePosition">
|
|
||||||
<amount>
|
|
||||||
<value level="1">3</value>
|
|
||||||
<value level="2">6</value>
|
|
||||||
</amount>
|
|
||||||
<position>BACK</position>
|
|
||||||
</effect>
|
|
||||||
</effects>
|
|
||||||
</skill>
|
</skill>
|
||||||
<skill id="19145" toLevel="2" name="Noble Death Whisper">
|
<skill id="19145" toLevel="2" name="Noble Death Whisper">
|
||||||
<!-- Physical Critical Damage + 3%. -->
|
<!-- Physical Critical Damage + 3%. -->
|
||||||
|
@@ -13,7 +13,6 @@ AreaDamage: Topography (Danger Zone) resistance stat.
|
|||||||
AttackAttribute: Stat that increases specific attack attribute.
|
AttackAttribute: Stat that increases specific attack attribute.
|
||||||
AttackAttributeAdd: Stat that increases all attack attribute.
|
AttackAttributeAdd: Stat that increases all attack attribute.
|
||||||
AttackBehind: Enables all attacks regardless of position to land towards the back.
|
AttackBehind: Enables all attacks regardless of position to land towards the back.
|
||||||
AttackDamagePosition: Bonus damage depending on player position towards the target.
|
|
||||||
AttackTrait: Stat that manages all attack traits.
|
AttackTrait: Stat that manages all attack traits.
|
||||||
Backstab: Inflicts physical damage according to the backstab formula.
|
Backstab: Inflicts physical damage according to the backstab formula.
|
||||||
Betray: Causes the target summon to attack its owner.
|
Betray: Causes the target summon to attack its owner.
|
||||||
|
@@ -55,7 +55,6 @@ import com.l2jmobius.gameserver.enums.BasicProperty;
|
|||||||
import com.l2jmobius.gameserver.enums.CategoryType;
|
import com.l2jmobius.gameserver.enums.CategoryType;
|
||||||
import com.l2jmobius.gameserver.enums.InstanceType;
|
import com.l2jmobius.gameserver.enums.InstanceType;
|
||||||
import com.l2jmobius.gameserver.enums.ItemSkillType;
|
import com.l2jmobius.gameserver.enums.ItemSkillType;
|
||||||
import com.l2jmobius.gameserver.enums.Position;
|
|
||||||
import com.l2jmobius.gameserver.enums.Race;
|
import com.l2jmobius.gameserver.enums.Race;
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.enums.StatusUpdateType;
|
import com.l2jmobius.gameserver.enums.StatusUpdateType;
|
||||||
@@ -4397,7 +4396,8 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
|||||||
|
|
||||||
if (!reflect && !isDOT)
|
if (!reflect && !isDOT)
|
||||||
{
|
{
|
||||||
damage *= getStat().getPositionTypeValue(Stats.ATTACK_DAMAGE, Position.getPosition(this, target));
|
// TODO: Implement AttackDamagePosition effect
|
||||||
|
// damage *= getStat().getPositionTypeValue(Stats.ATTACK_DAMAGE, Position.getPosition(this, target));
|
||||||
|
|
||||||
// Counterattacks happen before damage received.
|
// Counterattacks happen before damage received.
|
||||||
if (!target.isDead() && (skill != null))
|
if (!target.isDead() && (skill != null))
|
||||||
|
@@ -44,7 +44,6 @@ public final class EffectMasterHandler
|
|||||||
EffectHandler.getInstance().registerHandler("AttackAttribute", AttackAttribute::new);
|
EffectHandler.getInstance().registerHandler("AttackAttribute", AttackAttribute::new);
|
||||||
EffectHandler.getInstance().registerHandler("AttackAttributeAdd", AttackAttributeAdd::new);
|
EffectHandler.getInstance().registerHandler("AttackAttributeAdd", AttackAttributeAdd::new);
|
||||||
EffectHandler.getInstance().registerHandler("AttackBehind", AttackBehind::new);
|
EffectHandler.getInstance().registerHandler("AttackBehind", AttackBehind::new);
|
||||||
EffectHandler.getInstance().registerHandler("AttackDamagePosition", AttackDamagePosition::new);
|
|
||||||
EffectHandler.getInstance().registerHandler("AttackTrait", AttackTrait::new);
|
EffectHandler.getInstance().registerHandler("AttackTrait", AttackTrait::new);
|
||||||
EffectHandler.getInstance().registerHandler("Backstab", Backstab::new);
|
EffectHandler.getInstance().registerHandler("Backstab", Backstab::new);
|
||||||
EffectHandler.getInstance().registerHandler("Betray", Betray::new);
|
EffectHandler.getInstance().registerHandler("Betray", Betray::new);
|
||||||
|
@@ -1,53 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the L2J Mobius project.
|
|
||||||
*
|
|
||||||
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package handlers.effecthandlers;
|
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.MathUtil;
|
|
||||||
import com.l2jmobius.gameserver.enums.Position;
|
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
|
||||||
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
|
|
||||||
import com.l2jmobius.gameserver.model.skills.BuffInfo;
|
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Nik
|
|
||||||
*/
|
|
||||||
public class AttackDamagePosition extends AbstractEffect
|
|
||||||
{
|
|
||||||
protected final double _amount;
|
|
||||||
protected final Position _position;
|
|
||||||
|
|
||||||
public AttackDamagePosition(StatsSet params)
|
|
||||||
{
|
|
||||||
_amount = params.getDouble("amount");
|
|
||||||
_position = params.getEnum("position", Position.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void pump(L2Character effected, Skill skill)
|
|
||||||
{
|
|
||||||
effected.getStat().mergePositionTypeValue(Stats.ATTACK_DAMAGE, _position, (_amount / 100) + 1, MathUtil::mul);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onExit(BuffInfo info)
|
|
||||||
{
|
|
||||||
info.getEffected().getStat().mergePositionTypeValue(Stats.ATTACK_DAMAGE, _position, (_amount / 100) + 1, MathUtil::div);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -85,21 +85,6 @@ public final class Backstab extends AbstractEffect
|
|||||||
damage *= 2;
|
damage *= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, true, true, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, true);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, true, true, false);
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (effector.isPlayer())
|
|
||||||
// {
|
|
||||||
// final L2PcInstance activePlayer = effector.getActingPlayer();
|
|
||||||
// activePlayer.sendDamageMessage(effected, skill, (int) damage, true, false);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -94,7 +94,7 @@ public final class DamOverTime extends AbstractEffect
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info.getEffected().reduceCurrentHp(damage, info.getEffector(), info.getSkill(), true, false, false, false);
|
info.getEffector().doAttack(damage, info.getEffected(), info.getSkill(), true, false, false, false);
|
||||||
return info.getSkill().isToggle();
|
return info.getSkill().isToggle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -74,7 +74,7 @@ public final class DamOverTimePercent extends AbstractEffect
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info.getEffected().reduceCurrentHp(damage, info.getEffector(), info.getSkill(), true, false, false, false);
|
info.getEffector().doAttack(damage, info.getEffected(), info.getSkill(), true, false, false, false);
|
||||||
|
|
||||||
return info.getSkill().isToggle();
|
return info.getSkill().isToggle();
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -25,7 +24,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Death Link effect implementation.
|
* Death Link effect implementation.
|
||||||
@@ -70,26 +68,6 @@ public final class DeathLink extends AbstractEffect
|
|||||||
|
|
||||||
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
||||||
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power * (-((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2), effected.getMDef(), sps, bss, mcrit);
|
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power * (-((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2), effected.getMDef(), sps, bss, mcrit);
|
||||||
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (damage > 0)
|
|
||||||
{
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -162,10 +162,6 @@ public final class EnergyAttack extends AbstractEffect
|
|||||||
|
|
||||||
damage = Math.max(0, damage);
|
damage = Math.max(0, damage);
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(attacker, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// attacker.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -117,18 +117,6 @@ public final class FatalBlow extends AbstractEffect
|
|||||||
damage *= 2;
|
damage *= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, true, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, true);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, true, false);
|
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, true, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -87,16 +87,6 @@ public final class HpDrain extends AbstractEffect
|
|||||||
final double hpFinal = ((effector.getCurrentHp() + hpAdd) > effector.getMaxHp() ? effector.getMaxHp() : (effector.getCurrentHp() + hpAdd));
|
final double hpFinal = ((effector.getCurrentHp() + hpAdd) > effector.getMaxHp() ? effector.getMaxHp() : (effector.getCurrentHp() + hpAdd));
|
||||||
effector.setCurrentHp(hpFinal);
|
effector.setCurrentHp(hpFinal);
|
||||||
|
|
||||||
if (damage > 0)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
{
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -69,7 +69,7 @@ public final class HpToOwner extends AbstractEffect
|
|||||||
|
|
||||||
final double damage = _power * getTicksMultiplier();
|
final double damage = _power * getTicksMultiplier();
|
||||||
|
|
||||||
info.getEffected().reduceCurrentHp(damage, info.getEffector(), info.getSkill(), true, false, false, false);
|
info.getEffector().doAttack(damage, info.getEffected(), info.getSkill(), true, false, false, false);
|
||||||
if (_stealAmount > 0)
|
if (_stealAmount > 0)
|
||||||
{
|
{
|
||||||
final double amount = (damage * _stealAmount) / 100;
|
final double amount = (damage * _stealAmount) / 100;
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -26,7 +25,6 @@ import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
|||||||
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Abnormal-depending dispel Attack effect implementation.
|
* Magical Abnormal-depending dispel Attack effect implementation.
|
||||||
@@ -74,25 +72,6 @@ public final class MagicalAbnormalDispelAttack extends AbstractEffect
|
|||||||
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
||||||
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, effected.getMDef(), sps, bss, mcrit);
|
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, effected.getMDef(), sps, bss, mcrit);
|
||||||
|
|
||||||
if (damage > 0)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
{
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Attackable;
|
import com.l2jmobius.gameserver.model.actor.L2Attackable;
|
||||||
@@ -26,7 +25,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Attack effect implementation.
|
* Magical Attack effect implementation.
|
||||||
@@ -86,34 +84,6 @@ public final class MagicalAttack extends AbstractEffect
|
|||||||
damage *= _debuffModifier;
|
damage *= _debuffModifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
|
|
||||||
// Absorb HP from the damage inflicted
|
|
||||||
double absorbPercent = effector.getStat().getValue(Stats.ABSORB_DAMAGE_PERCENT, 0) * effector.getStat().getValue(Stats.ABSORB_DAMAGE_DEFENCE, 1);
|
|
||||||
if ((absorbPercent > 0) && (Rnd.nextDouble() < effector.getStat().getValue(Stats.ABSORB_DAMAGE_CHANCE)))
|
|
||||||
{
|
|
||||||
int absorbDamage = (int) Math.min(absorbPercent * damage, effector.getMaxRecoverableHp() - effector.getCurrentHp());
|
|
||||||
absorbDamage = Math.min(absorbDamage, (int) effected.getCurrentHp());
|
|
||||||
if (absorbDamage > 0)
|
|
||||||
{
|
|
||||||
effector.setCurrentHp(effector.getCurrentHp() + absorbDamage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -25,7 +24,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Attack By Abnormal effect implementation.
|
* Magical Attack By Abnormal effect implementation.
|
||||||
@@ -73,34 +71,6 @@ public final class MagicalAttackByAbnormal extends AbstractEffect
|
|||||||
// each buff increase +30%
|
// each buff increase +30%
|
||||||
damage *= (((effected.getBuffCount() * 0.3) + 1.3) / 4);
|
damage *= (((effected.getBuffCount() * 0.3) + 1.3) / 4);
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
|
|
||||||
// Absorb HP from the damage inflicted
|
|
||||||
double absorbPercent = effector.getStat().getValue(Stats.ABSORB_DAMAGE_PERCENT, 0) * effector.getStat().getValue(Stats.ABSORB_DAMAGE_DEFENCE, 1);
|
|
||||||
if ((absorbPercent > 0) && (Rnd.nextDouble() < effector.getStat().getValue(Stats.ABSORB_DAMAGE_CHANCE)))
|
|
||||||
{
|
|
||||||
int absorbDamage = (int) Math.min(absorbPercent * damage, effector.getMaxRecoverableHp() - effector.getCurrentHp());
|
|
||||||
absorbDamage = Math.min(absorbDamage, (int) effected.getCurrentHp());
|
|
||||||
if (absorbDamage > 0)
|
|
||||||
{
|
|
||||||
effector.setCurrentHp(effector.getCurrentHp() + absorbDamage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -20,7 +20,6 @@ import java.util.Collections;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -30,7 +29,6 @@ import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
|||||||
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Attack By Abnormal Slot effect implementation.
|
* Magical Attack By Abnormal Slot effect implementation.
|
||||||
@@ -90,34 +88,6 @@ public final class MagicalAttackByAbnormalSlot extends AbstractEffect
|
|||||||
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
||||||
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, effected.getMDef(), sps, bss, mcrit);
|
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, effected.getMDef(), sps, bss, mcrit);
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
|
|
||||||
// Absorb HP from the damage inflicted
|
|
||||||
double absorbPercent = effector.getStat().getValue(Stats.ABSORB_DAMAGE_PERCENT, 0) * effector.getStat().getValue(Stats.ABSORB_DAMAGE_DEFENCE, 1);
|
|
||||||
if ((absorbPercent > 0) && (Rnd.nextDouble() < effector.getStat().getValue(Stats.ABSORB_DAMAGE_CHANCE)))
|
|
||||||
{
|
|
||||||
int absorbDamage = (int) Math.min(absorbPercent * damage, effector.getMaxRecoverableHp() - effector.getCurrentHp());
|
|
||||||
absorbDamage = Math.min(absorbDamage, (int) effected.getCurrentHp());
|
|
||||||
if (absorbDamage > 0)
|
|
||||||
{
|
|
||||||
effector.setCurrentHp(effector.getCurrentHp() + absorbDamage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -25,7 +24,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Attack effect implementation.
|
* Magical Attack effect implementation.
|
||||||
@@ -88,34 +86,6 @@ public final class MagicalAttackRange extends AbstractEffect
|
|||||||
damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, mDef, sps, bss, mcrit);
|
damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, mDef, sps, bss, mcrit);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
|
|
||||||
// Absorb HP from the damage inflicted
|
|
||||||
double absorbPercent = effector.getStat().getValue(Stats.ABSORB_DAMAGE_PERCENT, 0) * effector.getStat().getValue(Stats.ABSORB_DAMAGE_DEFENCE, 1);
|
|
||||||
if ((absorbPercent > 0) && (Rnd.nextDouble() < effector.getStat().getValue(Stats.ABSORB_DAMAGE_CHANCE)))
|
|
||||||
{
|
|
||||||
int absorbDamage = (int) Math.min(absorbPercent * damage, effector.getMaxRecoverableHp() - effector.getCurrentHp());
|
|
||||||
absorbDamage = Math.min(absorbDamage, (int) effected.getCurrentHp());
|
|
||||||
if (absorbDamage > 0)
|
|
||||||
{
|
|
||||||
effector.setCurrentHp(effector.getCurrentHp() + absorbDamage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -80,7 +80,7 @@ public final class MagicalDamOverTime extends AbstractEffect
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info.getEffected().reduceCurrentHp(damage, info.getEffector(), info.getSkill(), true, false, false, false);
|
info.getEffector().doAttack(damage, info.getEffected(), info.getSkill(), true, false, false, false);
|
||||||
return info.getSkill().isToggle();
|
return info.getSkill().isToggle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -25,7 +24,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
import com.l2jmobius.gameserver.network.SystemMessageId;
|
import com.l2jmobius.gameserver.network.SystemMessageId;
|
||||||
import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
||||||
|
|
||||||
@@ -82,25 +80,6 @@ public final class MagicalSoulAttack extends AbstractEffect
|
|||||||
final double mAtk = effector.getMAtk() * (chargedSouls > 0 ? (1.3 + (chargedSouls * 0.05)) : 1);
|
final double mAtk = effector.getMAtk() * (chargedSouls > 0 ? (1.3 + (chargedSouls * 0.05)) : 1);
|
||||||
final double damage = Formulas.calcMagicDam(effector, effected, skill, mAtk, _power, effected.getMDef(), sps, bss, mcrit);
|
final double damage = Formulas.calcMagicDam(effector, effected, skill, mAtk, _power, effected.getMDef(), sps, bss, mcrit);
|
||||||
|
|
||||||
if (damage > 0)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
{
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -172,10 +172,6 @@ public final class PhysicalAttack extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -134,10 +134,6 @@ public final class PhysicalAttackHpLink extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected.
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -144,9 +144,6 @@ public final class PhysicalAttackSaveHp extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
final double minHp = (effected.getMaxHp() * _saveHp) / 100;
|
final double minHp = (effected.getMaxHp() * _saveHp) / 100;
|
||||||
|
|
||||||
if ((effected.getCurrentHp() - damage) < minHp)
|
if ((effected.getCurrentHp() - damage) < minHp)
|
||||||
@@ -154,7 +151,6 @@ public final class PhysicalAttackSaveHp extends AbstractEffect
|
|||||||
damage = effected.getCurrentHp() - minHp;
|
damage = effected.getCurrentHp() - minHp;
|
||||||
}
|
}
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -165,10 +165,6 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -159,10 +159,6 @@ public final class PhysicalSoulAttack extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -90,22 +90,6 @@ public final class SoulBlow extends AbstractEffect
|
|||||||
damage *= 1 + (chargedSouls * 0.04);
|
damage *= 1 + (chargedSouls * 0.04);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, true, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, true);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, true, false);
|
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (effector.isPlayer())
|
|
||||||
// {
|
|
||||||
// final L2PcInstance activePlayer = effector.getActingPlayer();
|
|
||||||
// activePlayer.sendDamageMessage(effected, skill, (int) damage, true, false);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -890,15 +890,7 @@
|
|||||||
<!-- Rear Damage + 3%. -->
|
<!-- Rear Damage + 3%. -->
|
||||||
<operateType>P</operateType>
|
<operateType>P</operateType>
|
||||||
<icon>icon.skill0030</icon>
|
<icon>icon.skill0030</icon>
|
||||||
<effects>
|
<!-- TODO: Handle rear damage stat -->
|
||||||
<effect name="AttackDamagePosition">
|
|
||||||
<amount>
|
|
||||||
<value level="1">3</value>
|
|
||||||
<value level="2">6</value>
|
|
||||||
</amount>
|
|
||||||
<position>BACK</position>
|
|
||||||
</effect>
|
|
||||||
</effects>
|
|
||||||
</skill>
|
</skill>
|
||||||
<skill id="19145" toLevel="2" name="Noble Death Whisper">
|
<skill id="19145" toLevel="2" name="Noble Death Whisper">
|
||||||
<!-- Physical Critical Damage + 3%. -->
|
<!-- Physical Critical Damage + 3%. -->
|
||||||
|
@@ -13,7 +13,6 @@ AreaDamage: Topography (Danger Zone) resistance stat.
|
|||||||
AttackAttribute: Stat that increases specific attack attribute.
|
AttackAttribute: Stat that increases specific attack attribute.
|
||||||
AttackAttributeAdd: Stat that increases all attack attribute.
|
AttackAttributeAdd: Stat that increases all attack attribute.
|
||||||
AttackBehind: Enables all attacks regardless of position to land towards the back.
|
AttackBehind: Enables all attacks regardless of position to land towards the back.
|
||||||
AttackDamagePosition: Bonus damage depending on player position towards the target.
|
|
||||||
AttackTrait: Stat that manages all attack traits.
|
AttackTrait: Stat that manages all attack traits.
|
||||||
Backstab: Inflicts physical damage according to the backstab formula.
|
Backstab: Inflicts physical damage according to the backstab formula.
|
||||||
Betray: Causes the target summon to attack its owner.
|
Betray: Causes the target summon to attack its owner.
|
||||||
|
@@ -55,7 +55,6 @@ import com.l2jmobius.gameserver.enums.BasicProperty;
|
|||||||
import com.l2jmobius.gameserver.enums.CategoryType;
|
import com.l2jmobius.gameserver.enums.CategoryType;
|
||||||
import com.l2jmobius.gameserver.enums.InstanceType;
|
import com.l2jmobius.gameserver.enums.InstanceType;
|
||||||
import com.l2jmobius.gameserver.enums.ItemSkillType;
|
import com.l2jmobius.gameserver.enums.ItemSkillType;
|
||||||
import com.l2jmobius.gameserver.enums.Position;
|
|
||||||
import com.l2jmobius.gameserver.enums.Race;
|
import com.l2jmobius.gameserver.enums.Race;
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.enums.StatusUpdateType;
|
import com.l2jmobius.gameserver.enums.StatusUpdateType;
|
||||||
@@ -4397,7 +4396,8 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
|||||||
|
|
||||||
if (!reflect && !isDOT)
|
if (!reflect && !isDOT)
|
||||||
{
|
{
|
||||||
damage *= getStat().getPositionTypeValue(Stats.ATTACK_DAMAGE, Position.getPosition(this, target));
|
// TODO: Implement AttackDamagePosition effect
|
||||||
|
// damage *= getStat().getPositionTypeValue(Stats.ATTACK_DAMAGE, Position.getPosition(this, target));
|
||||||
|
|
||||||
// Counterattacks happen before damage received.
|
// Counterattacks happen before damage received.
|
||||||
if (!target.isDead() && (skill != null))
|
if (!target.isDead() && (skill != null))
|
||||||
|
@@ -44,7 +44,6 @@ public final class EffectMasterHandler
|
|||||||
EffectHandler.getInstance().registerHandler("AttackAttribute", AttackAttribute::new);
|
EffectHandler.getInstance().registerHandler("AttackAttribute", AttackAttribute::new);
|
||||||
EffectHandler.getInstance().registerHandler("AttackAttributeAdd", AttackAttributeAdd::new);
|
EffectHandler.getInstance().registerHandler("AttackAttributeAdd", AttackAttributeAdd::new);
|
||||||
EffectHandler.getInstance().registerHandler("AttackBehind", AttackBehind::new);
|
EffectHandler.getInstance().registerHandler("AttackBehind", AttackBehind::new);
|
||||||
EffectHandler.getInstance().registerHandler("AttackDamagePosition", AttackDamagePosition::new);
|
|
||||||
EffectHandler.getInstance().registerHandler("AttackTrait", AttackTrait::new);
|
EffectHandler.getInstance().registerHandler("AttackTrait", AttackTrait::new);
|
||||||
EffectHandler.getInstance().registerHandler("Backstab", Backstab::new);
|
EffectHandler.getInstance().registerHandler("Backstab", Backstab::new);
|
||||||
EffectHandler.getInstance().registerHandler("Betray", Betray::new);
|
EffectHandler.getInstance().registerHandler("Betray", Betray::new);
|
||||||
|
@@ -1,53 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the L2J Mobius project.
|
|
||||||
*
|
|
||||||
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package handlers.effecthandlers;
|
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.MathUtil;
|
|
||||||
import com.l2jmobius.gameserver.enums.Position;
|
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
|
||||||
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
|
|
||||||
import com.l2jmobius.gameserver.model.skills.BuffInfo;
|
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Nik
|
|
||||||
*/
|
|
||||||
public class AttackDamagePosition extends AbstractEffect
|
|
||||||
{
|
|
||||||
protected final double _amount;
|
|
||||||
protected final Position _position;
|
|
||||||
|
|
||||||
public AttackDamagePosition(StatsSet params)
|
|
||||||
{
|
|
||||||
_amount = params.getDouble("amount");
|
|
||||||
_position = params.getEnum("position", Position.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void pump(L2Character effected, Skill skill)
|
|
||||||
{
|
|
||||||
effected.getStat().mergePositionTypeValue(Stats.ATTACK_DAMAGE, _position, (_amount / 100) + 1, MathUtil::mul);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onExit(BuffInfo info)
|
|
||||||
{
|
|
||||||
info.getEffected().getStat().mergePositionTypeValue(Stats.ATTACK_DAMAGE, _position, (_amount / 100) + 1, MathUtil::div);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -85,21 +85,6 @@ public final class Backstab extends AbstractEffect
|
|||||||
damage *= 2;
|
damage *= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, true, true, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, true);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, true, true, false);
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (effector.isPlayer())
|
|
||||||
// {
|
|
||||||
// final L2PcInstance activePlayer = effector.getActingPlayer();
|
|
||||||
// activePlayer.sendDamageMessage(effected, skill, (int) damage, true, false);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -94,7 +94,7 @@ public final class DamOverTime extends AbstractEffect
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info.getEffected().reduceCurrentHp(damage, info.getEffector(), info.getSkill(), true, false, false, false);
|
info.getEffector().doAttack(damage, info.getEffected(), info.getSkill(), true, false, false, false);
|
||||||
return info.getSkill().isToggle();
|
return info.getSkill().isToggle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -74,7 +74,7 @@ public final class DamOverTimePercent extends AbstractEffect
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info.getEffected().reduceCurrentHp(damage, info.getEffector(), info.getSkill(), true, false, false, false);
|
info.getEffector().doAttack(damage, info.getEffected(), info.getSkill(), true, false, false, false);
|
||||||
|
|
||||||
return info.getSkill().isToggle();
|
return info.getSkill().isToggle();
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -25,7 +24,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Death Link effect implementation.
|
* Death Link effect implementation.
|
||||||
@@ -70,26 +68,6 @@ public final class DeathLink extends AbstractEffect
|
|||||||
|
|
||||||
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
||||||
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power * (-((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2), effected.getMDef(), sps, bss, mcrit);
|
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power * (-((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2), effected.getMDef(), sps, bss, mcrit);
|
||||||
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (damage > 0)
|
|
||||||
{
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -162,10 +162,6 @@ public final class EnergyAttack extends AbstractEffect
|
|||||||
|
|
||||||
damage = Math.max(0, damage);
|
damage = Math.max(0, damage);
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(attacker, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// attacker.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -117,18 +117,6 @@ public final class FatalBlow extends AbstractEffect
|
|||||||
damage *= 2;
|
damage *= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, true, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, true);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, true, false);
|
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, true, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -87,16 +87,6 @@ public final class HpDrain extends AbstractEffect
|
|||||||
final double hpFinal = ((effector.getCurrentHp() + hpAdd) > effector.getMaxHp() ? effector.getMaxHp() : (effector.getCurrentHp() + hpAdd));
|
final double hpFinal = ((effector.getCurrentHp() + hpAdd) > effector.getMaxHp() ? effector.getMaxHp() : (effector.getCurrentHp() + hpAdd));
|
||||||
effector.setCurrentHp(hpFinal);
|
effector.setCurrentHp(hpFinal);
|
||||||
|
|
||||||
if (damage > 0)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
{
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -69,7 +69,7 @@ public final class HpToOwner extends AbstractEffect
|
|||||||
|
|
||||||
final double damage = _power * getTicksMultiplier();
|
final double damage = _power * getTicksMultiplier();
|
||||||
|
|
||||||
info.getEffected().reduceCurrentHp(damage, info.getEffector(), info.getSkill(), true, false, false, false);
|
info.getEffector().doAttack(damage, info.getEffected(), info.getSkill(), true, false, false, false);
|
||||||
if (_stealAmount > 0)
|
if (_stealAmount > 0)
|
||||||
{
|
{
|
||||||
final double amount = (damage * _stealAmount) / 100;
|
final double amount = (damage * _stealAmount) / 100;
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -26,7 +25,6 @@ import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
|||||||
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Abnormal-depending dispel Attack effect implementation.
|
* Magical Abnormal-depending dispel Attack effect implementation.
|
||||||
@@ -74,25 +72,6 @@ public final class MagicalAbnormalDispelAttack extends AbstractEffect
|
|||||||
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
||||||
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, effected.getMDef(), sps, bss, mcrit);
|
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, effected.getMDef(), sps, bss, mcrit);
|
||||||
|
|
||||||
if (damage > 0)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
{
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Attackable;
|
import com.l2jmobius.gameserver.model.actor.L2Attackable;
|
||||||
@@ -26,7 +25,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Attack effect implementation.
|
* Magical Attack effect implementation.
|
||||||
@@ -86,34 +84,6 @@ public final class MagicalAttack extends AbstractEffect
|
|||||||
damage *= _debuffModifier;
|
damage *= _debuffModifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
|
|
||||||
// Absorb HP from the damage inflicted
|
|
||||||
double absorbPercent = effector.getStat().getValue(Stats.ABSORB_DAMAGE_PERCENT, 0) * effector.getStat().getValue(Stats.ABSORB_DAMAGE_DEFENCE, 1);
|
|
||||||
if ((absorbPercent > 0) && (Rnd.nextDouble() < effector.getStat().getValue(Stats.ABSORB_DAMAGE_CHANCE)))
|
|
||||||
{
|
|
||||||
int absorbDamage = (int) Math.min(absorbPercent * damage, effector.getMaxRecoverableHp() - effector.getCurrentHp());
|
|
||||||
absorbDamage = Math.min(absorbDamage, (int) effected.getCurrentHp());
|
|
||||||
if (absorbDamage > 0)
|
|
||||||
{
|
|
||||||
effector.setCurrentHp(effector.getCurrentHp() + absorbDamage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -25,7 +24,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Attack By Abnormal effect implementation.
|
* Magical Attack By Abnormal effect implementation.
|
||||||
@@ -73,34 +71,6 @@ public final class MagicalAttackByAbnormal extends AbstractEffect
|
|||||||
// each buff increase +30%
|
// each buff increase +30%
|
||||||
damage *= (((effected.getBuffCount() * 0.3) + 1.3) / 4);
|
damage *= (((effected.getBuffCount() * 0.3) + 1.3) / 4);
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
|
|
||||||
// Absorb HP from the damage inflicted
|
|
||||||
double absorbPercent = effector.getStat().getValue(Stats.ABSORB_DAMAGE_PERCENT, 0) * effector.getStat().getValue(Stats.ABSORB_DAMAGE_DEFENCE, 1);
|
|
||||||
if ((absorbPercent > 0) && (Rnd.nextDouble() < effector.getStat().getValue(Stats.ABSORB_DAMAGE_CHANCE)))
|
|
||||||
{
|
|
||||||
int absorbDamage = (int) Math.min(absorbPercent * damage, effector.getMaxRecoverableHp() - effector.getCurrentHp());
|
|
||||||
absorbDamage = Math.min(absorbDamage, (int) effected.getCurrentHp());
|
|
||||||
if (absorbDamage > 0)
|
|
||||||
{
|
|
||||||
effector.setCurrentHp(effector.getCurrentHp() + absorbDamage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -20,7 +20,6 @@ import java.util.Collections;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -30,7 +29,6 @@ import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
|||||||
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Attack By Abnormal Slot effect implementation.
|
* Magical Attack By Abnormal Slot effect implementation.
|
||||||
@@ -90,34 +88,6 @@ public final class MagicalAttackByAbnormalSlot extends AbstractEffect
|
|||||||
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
final boolean mcrit = Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill);
|
||||||
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, effected.getMDef(), sps, bss, mcrit);
|
final double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, effected.getMDef(), sps, bss, mcrit);
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
|
|
||||||
// Absorb HP from the damage inflicted
|
|
||||||
double absorbPercent = effector.getStat().getValue(Stats.ABSORB_DAMAGE_PERCENT, 0) * effector.getStat().getValue(Stats.ABSORB_DAMAGE_DEFENCE, 1);
|
|
||||||
if ((absorbPercent > 0) && (Rnd.nextDouble() < effector.getStat().getValue(Stats.ABSORB_DAMAGE_CHANCE)))
|
|
||||||
{
|
|
||||||
int absorbDamage = (int) Math.min(absorbPercent * damage, effector.getMaxRecoverableHp() - effector.getCurrentHp());
|
|
||||||
absorbDamage = Math.min(absorbDamage, (int) effected.getCurrentHp());
|
|
||||||
if (absorbDamage > 0)
|
|
||||||
{
|
|
||||||
effector.setCurrentHp(effector.getCurrentHp() + absorbDamage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -25,7 +24,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magical Attack effect implementation.
|
* Magical Attack effect implementation.
|
||||||
@@ -88,34 +86,6 @@ public final class MagicalAttackRange extends AbstractEffect
|
|||||||
damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, mDef, sps, bss, mcrit);
|
damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, mDef, sps, bss, mcrit);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
|
|
||||||
// Absorb HP from the damage inflicted
|
|
||||||
double absorbPercent = effector.getStat().getValue(Stats.ABSORB_DAMAGE_PERCENT, 0) * effector.getStat().getValue(Stats.ABSORB_DAMAGE_DEFENCE, 1);
|
|
||||||
if ((absorbPercent > 0) && (Rnd.nextDouble() < effector.getStat().getValue(Stats.ABSORB_DAMAGE_CHANCE)))
|
|
||||||
{
|
|
||||||
int absorbDamage = (int) Math.min(absorbPercent * damage, effector.getMaxRecoverableHp() - effector.getCurrentHp());
|
|
||||||
absorbDamage = Math.min(absorbDamage, (int) effected.getCurrentHp());
|
|
||||||
if (absorbDamage > 0)
|
|
||||||
{
|
|
||||||
effector.setCurrentHp(effector.getCurrentHp() + absorbDamage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -80,7 +80,7 @@ public final class MagicalDamOverTime extends AbstractEffect
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info.getEffected().reduceCurrentHp(damage, info.getEffector(), info.getSkill(), true, false, false, false);
|
info.getEffector().doAttack(damage, info.getEffected(), info.getSkill(), true, false, false, false);
|
||||||
return info.getSkill().isToggle();
|
return info.getSkill().isToggle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package handlers.effecthandlers;
|
package handlers.effecthandlers;
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.Rnd;
|
|
||||||
import com.l2jmobius.gameserver.enums.ShotType;
|
import com.l2jmobius.gameserver.enums.ShotType;
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
import com.l2jmobius.gameserver.model.StatsSet;
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||||
@@ -25,7 +24,6 @@ import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
|||||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||||
import com.l2jmobius.gameserver.model.stats.Formulas;
|
import com.l2jmobius.gameserver.model.stats.Formulas;
|
||||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
|
||||||
import com.l2jmobius.gameserver.network.SystemMessageId;
|
import com.l2jmobius.gameserver.network.SystemMessageId;
|
||||||
import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
||||||
|
|
||||||
@@ -82,25 +80,6 @@ public final class MagicalSoulAttack extends AbstractEffect
|
|||||||
final double mAtk = effector.getMAtk() * (chargedSouls > 0 ? (1.3 + (chargedSouls * 0.05)) : 1);
|
final double mAtk = effector.getMAtk() * (chargedSouls > 0 ? (1.3 + (chargedSouls * 0.05)) : 1);
|
||||||
final double damage = Formulas.calcMagicDam(effector, effected, skill, mAtk, _power, effected.getMDef(), sps, bss, mcrit);
|
final double damage = Formulas.calcMagicDam(effector, effected, skill, mAtk, _power, effected.getMDef(), sps, bss, mcrit);
|
||||||
|
|
||||||
if (damage > 0)
|
effector.doAttack(damage, effected, skill, false, false, mcrit, false);
|
||||||
{
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
|
||||||
if (!effected.isRaid() && Formulas.calcAtkBreak(effected, damage))
|
|
||||||
{
|
|
||||||
effected.breakAttack();
|
|
||||||
effected.breakCast();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shield Deflect Magic: Reflect all damage on caster.
|
|
||||||
if (effected.getStat().getValue(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0) > Rnd.get(100))
|
|
||||||
{
|
|
||||||
effector.reduceCurrentHp(damage, effected, skill, false, false, mcrit, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, mcrit, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, mcrit, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -172,10 +172,6 @@ public final class PhysicalAttack extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -134,10 +134,6 @@ public final class PhysicalAttackHpLink extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected.
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -144,9 +144,6 @@ public final class PhysicalAttackSaveHp extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
final double minHp = (effected.getMaxHp() * _saveHp) / 100;
|
final double minHp = (effected.getMaxHp() * _saveHp) / 100;
|
||||||
|
|
||||||
if ((effected.getCurrentHp() - damage) < minHp)
|
if ((effected.getCurrentHp() - damage) < minHp)
|
||||||
@@ -154,7 +151,6 @@ public final class PhysicalAttackSaveHp extends AbstractEffect
|
|||||||
damage = effected.getCurrentHp() - minHp;
|
damage = effected.getCurrentHp() - minHp;
|
||||||
}
|
}
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -165,10 +165,6 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -159,10 +159,6 @@ public final class PhysicalSoulAttack extends AbstractEffect
|
|||||||
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
damage = effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if damage should be reflected
|
effector.doAttack(damage, effected, skill, false, false, critical, false);
|
||||||
Formulas.calcCounterAttack(effector, effected, skill, critical);
|
|
||||||
|
|
||||||
effected.reduceCurrentHp(damage, effector, skill, false, false, critical, false);
|
|
||||||
// effector.sendDamageMessage(effected, skill, (int) damage, critical, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user