diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java index 80412d7523..0693eea287 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java @@ -28,7 +28,7 @@ import com.l2jmobius.gameserver.model.stats.Stats; public class AbstractStatAddEffect extends AbstractEffect { private final Stats _stat; - private final double _amount; + protected final double _amount; public AbstractStatAddEffect(StatsSet params, Stats stat) { diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index dbfd92ec67..69fdccb780 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -92,12 +92,6 @@ public final class EnergyAttack extends AbstractEffect return; } - final double distance = attacker.calculateDistance(effected, true, false); - if (distance > effected.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Integer.MAX_VALUE)) - { - return; - } - if (_overHit && effected.isAttackable()) { ((L2Attackable) effected).overhitEnabled(true); diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java index 05210d1b92..7b24baa2ef 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java @@ -17,6 +17,12 @@ package handlers.effecthandlers; import com.l2jmobius.gameserver.model.StatsSet; +import com.l2jmobius.gameserver.model.actor.L2Character; +import com.l2jmobius.gameserver.model.events.EventType; +import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureDamageReceived; +import com.l2jmobius.gameserver.model.events.listeners.FunctionEventListener; +import com.l2jmobius.gameserver.model.events.returns.DamageReturn; +import com.l2jmobius.gameserver.model.skills.Skill; import com.l2jmobius.gameserver.model.stats.Stats; /** @@ -28,4 +34,25 @@ public class SphericBarrier extends AbstractStatAddEffect { super(params, Stats.SPHERIC_BARRIER_RANGE); } + + @Override + public void onStart(L2Character effector, L2Character effected, Skill skill) + { + effected.addListener(new FunctionEventListener(effected, EventType.ON_CREATURE_DAMAGE_RECEIVED, (OnCreatureDamageReceived event) -> onDamageReceivedEvent(event), this)); + } + + @Override + public void onExit(L2Character effector, L2Character effected, Skill skill) + { + effected.removeListenerIf(EventType.ON_CREATURE_DAMAGE_RECEIVED, listener -> listener.getOwner() == this); + } + + private DamageReturn onDamageReceivedEvent(OnCreatureDamageReceived event) + { + if (event.getAttacker().calculateDistance(event.getTarget(), true, false) > _amount) + { + return new DamageReturn(false, true, false, 0); + } + return new DamageReturn(false, false, false, event.getDamage()); + } } diff --git a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/stats/Formulas.java index b96c619912..83718a32cf 100644 --- a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/stats/Formulas.java @@ -78,11 +78,6 @@ public final class Formulas public static double calcBlowDamage(L2Character attacker, L2Character target, Skill skill, boolean backstab, double power, byte shld, boolean ss) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - return 0; - } - double defence = target.getPDef(); switch (shld) @@ -137,11 +132,6 @@ public final class Formulas public static double calcMagicDam(L2Character attacker, L2Character target, Skill skill, double mAtk, double power, double mDef, boolean sps, boolean bss, boolean mcrit) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - return 0; - } - // Bonus Spirit shot final double shotsBonus = bss ? (4 * attacker.getStat().getValue(Stats.SHOTS_BONUS)) : sps ? (2 * attacker.getStat().getValue(Stats.SHOTS_BONUS)) : 1; final double critMod = mcrit ? (2 * calcCritDamage(attacker, target, skill)) : 1; // TODO not really a proper way... find how it works then implement. // damage += attacker.getStat().getValue(Stats.MAGIC_CRIT_DMG_ADD, 0); @@ -663,12 +653,10 @@ public final class Formulas } } - if (!resisted) + final double sphericBarrierRange = target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, 0); + if (!resisted && (sphericBarrierRange > 0)) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - resisted = true; - } + resisted = attacker.calculateDistance(target, true, false) > sphericBarrierRange; } if (resisted) @@ -1326,11 +1314,6 @@ public final class Formulas */ public static double calcAutoAttackDamage(L2Character attacker, L2Character target, byte shld, boolean crit, boolean ss) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - return 0; - } - // DEFENCE CALCULATION (pDef + sDef) double defence = target.getPDef(); diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java index 80412d7523..0693eea287 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java +++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java @@ -28,7 +28,7 @@ import com.l2jmobius.gameserver.model.stats.Stats; public class AbstractStatAddEffect extends AbstractEffect { private final Stats _stat; - private final double _amount; + protected final double _amount; public AbstractStatAddEffect(StatsSet params, Stats stat) { diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index dbfd92ec67..69fdccb780 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -92,12 +92,6 @@ public final class EnergyAttack extends AbstractEffect return; } - final double distance = attacker.calculateDistance(effected, true, false); - if (distance > effected.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Integer.MAX_VALUE)) - { - return; - } - if (_overHit && effected.isAttackable()) { ((L2Attackable) effected).overhitEnabled(true); diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java index 05210d1b92..7b24baa2ef 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java +++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java @@ -17,6 +17,12 @@ package handlers.effecthandlers; import com.l2jmobius.gameserver.model.StatsSet; +import com.l2jmobius.gameserver.model.actor.L2Character; +import com.l2jmobius.gameserver.model.events.EventType; +import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureDamageReceived; +import com.l2jmobius.gameserver.model.events.listeners.FunctionEventListener; +import com.l2jmobius.gameserver.model.events.returns.DamageReturn; +import com.l2jmobius.gameserver.model.skills.Skill; import com.l2jmobius.gameserver.model.stats.Stats; /** @@ -28,4 +34,25 @@ public class SphericBarrier extends AbstractStatAddEffect { super(params, Stats.SPHERIC_BARRIER_RANGE); } + + @Override + public void onStart(L2Character effector, L2Character effected, Skill skill) + { + effected.addListener(new FunctionEventListener(effected, EventType.ON_CREATURE_DAMAGE_RECEIVED, (OnCreatureDamageReceived event) -> onDamageReceivedEvent(event), this)); + } + + @Override + public void onExit(L2Character effector, L2Character effected, Skill skill) + { + effected.removeListenerIf(EventType.ON_CREATURE_DAMAGE_RECEIVED, listener -> listener.getOwner() == this); + } + + private DamageReturn onDamageReceivedEvent(OnCreatureDamageReceived event) + { + if (event.getAttacker().calculateDistance(event.getTarget(), true, false) > _amount) + { + return new DamageReturn(false, true, false, 0); + } + return new DamageReturn(false, false, false, event.getDamage()); + } } diff --git a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/stats/Formulas.java index b96c619912..83718a32cf 100644 --- a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/stats/Formulas.java @@ -78,11 +78,6 @@ public final class Formulas public static double calcBlowDamage(L2Character attacker, L2Character target, Skill skill, boolean backstab, double power, byte shld, boolean ss) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - return 0; - } - double defence = target.getPDef(); switch (shld) @@ -137,11 +132,6 @@ public final class Formulas public static double calcMagicDam(L2Character attacker, L2Character target, Skill skill, double mAtk, double power, double mDef, boolean sps, boolean bss, boolean mcrit) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - return 0; - } - // Bonus Spirit shot final double shotsBonus = bss ? (4 * attacker.getStat().getValue(Stats.SHOTS_BONUS)) : sps ? (2 * attacker.getStat().getValue(Stats.SHOTS_BONUS)) : 1; final double critMod = mcrit ? (2 * calcCritDamage(attacker, target, skill)) : 1; // TODO not really a proper way... find how it works then implement. // damage += attacker.getStat().getValue(Stats.MAGIC_CRIT_DMG_ADD, 0); @@ -663,12 +653,10 @@ public final class Formulas } } - if (!resisted) + final double sphericBarrierRange = target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, 0); + if (!resisted && (sphericBarrierRange > 0)) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - resisted = true; - } + resisted = attacker.calculateDistance(target, true, false) > sphericBarrierRange; } if (resisted) @@ -1326,11 +1314,6 @@ public final class Formulas */ public static double calcAutoAttackDamage(L2Character attacker, L2Character target, byte shld, boolean crit, boolean ss) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - return 0; - } - // DEFENCE CALCULATION (pDef + sDef) double defence = target.getPDef(); diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java index 80412d7523..0693eea287 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java +++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java @@ -28,7 +28,7 @@ import com.l2jmobius.gameserver.model.stats.Stats; public class AbstractStatAddEffect extends AbstractEffect { private final Stats _stat; - private final double _amount; + protected final double _amount; public AbstractStatAddEffect(StatsSet params, Stats stat) { diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index dbfd92ec67..69fdccb780 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -92,12 +92,6 @@ public final class EnergyAttack extends AbstractEffect return; } - final double distance = attacker.calculateDistance(effected, true, false); - if (distance > effected.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Integer.MAX_VALUE)) - { - return; - } - if (_overHit && effected.isAttackable()) { ((L2Attackable) effected).overhitEnabled(true); diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java index 05210d1b92..7b24baa2ef 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java +++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java @@ -17,6 +17,12 @@ package handlers.effecthandlers; import com.l2jmobius.gameserver.model.StatsSet; +import com.l2jmobius.gameserver.model.actor.L2Character; +import com.l2jmobius.gameserver.model.events.EventType; +import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureDamageReceived; +import com.l2jmobius.gameserver.model.events.listeners.FunctionEventListener; +import com.l2jmobius.gameserver.model.events.returns.DamageReturn; +import com.l2jmobius.gameserver.model.skills.Skill; import com.l2jmobius.gameserver.model.stats.Stats; /** @@ -28,4 +34,25 @@ public class SphericBarrier extends AbstractStatAddEffect { super(params, Stats.SPHERIC_BARRIER_RANGE); } + + @Override + public void onStart(L2Character effector, L2Character effected, Skill skill) + { + effected.addListener(new FunctionEventListener(effected, EventType.ON_CREATURE_DAMAGE_RECEIVED, (OnCreatureDamageReceived event) -> onDamageReceivedEvent(event), this)); + } + + @Override + public void onExit(L2Character effector, L2Character effected, Skill skill) + { + effected.removeListenerIf(EventType.ON_CREATURE_DAMAGE_RECEIVED, listener -> listener.getOwner() == this); + } + + private DamageReturn onDamageReceivedEvent(OnCreatureDamageReceived event) + { + if (event.getAttacker().calculateDistance(event.getTarget(), true, false) > _amount) + { + return new DamageReturn(false, true, false, 0); + } + return new DamageReturn(false, false, false, event.getDamage()); + } } diff --git a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/stats/Formulas.java index b96c619912..83718a32cf 100644 --- a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/stats/Formulas.java @@ -78,11 +78,6 @@ public final class Formulas public static double calcBlowDamage(L2Character attacker, L2Character target, Skill skill, boolean backstab, double power, byte shld, boolean ss) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - return 0; - } - double defence = target.getPDef(); switch (shld) @@ -137,11 +132,6 @@ public final class Formulas public static double calcMagicDam(L2Character attacker, L2Character target, Skill skill, double mAtk, double power, double mDef, boolean sps, boolean bss, boolean mcrit) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - return 0; - } - // Bonus Spirit shot final double shotsBonus = bss ? (4 * attacker.getStat().getValue(Stats.SHOTS_BONUS)) : sps ? (2 * attacker.getStat().getValue(Stats.SHOTS_BONUS)) : 1; final double critMod = mcrit ? (2 * calcCritDamage(attacker, target, skill)) : 1; // TODO not really a proper way... find how it works then implement. // damage += attacker.getStat().getValue(Stats.MAGIC_CRIT_DMG_ADD, 0); @@ -663,12 +653,10 @@ public final class Formulas } } - if (!resisted) + final double sphericBarrierRange = target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, 0); + if (!resisted && (sphericBarrierRange > 0)) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - resisted = true; - } + resisted = attacker.calculateDistance(target, true, false) > sphericBarrierRange; } if (resisted) @@ -1326,11 +1314,6 @@ public final class Formulas */ public static double calcAutoAttackDamage(L2Character attacker, L2Character target, byte shld, boolean crit, boolean ss) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - return 0; - } - // DEFENCE CALCULATION (pDef + sDef) double defence = target.getPDef(); diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java index 80412d7523..0693eea287 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java @@ -28,7 +28,7 @@ import com.l2jmobius.gameserver.model.stats.Stats; public class AbstractStatAddEffect extends AbstractEffect { private final Stats _stat; - private final double _amount; + protected final double _amount; public AbstractStatAddEffect(StatsSet params, Stats stat) { diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index dbfd92ec67..69fdccb780 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -92,12 +92,6 @@ public final class EnergyAttack extends AbstractEffect return; } - final double distance = attacker.calculateDistance(effected, true, false); - if (distance > effected.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Integer.MAX_VALUE)) - { - return; - } - if (_overHit && effected.isAttackable()) { ((L2Attackable) effected).overhitEnabled(true); diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java index 05210d1b92..7b24baa2ef 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java @@ -17,6 +17,12 @@ package handlers.effecthandlers; import com.l2jmobius.gameserver.model.StatsSet; +import com.l2jmobius.gameserver.model.actor.L2Character; +import com.l2jmobius.gameserver.model.events.EventType; +import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureDamageReceived; +import com.l2jmobius.gameserver.model.events.listeners.FunctionEventListener; +import com.l2jmobius.gameserver.model.events.returns.DamageReturn; +import com.l2jmobius.gameserver.model.skills.Skill; import com.l2jmobius.gameserver.model.stats.Stats; /** @@ -28,4 +34,25 @@ public class SphericBarrier extends AbstractStatAddEffect { super(params, Stats.SPHERIC_BARRIER_RANGE); } + + @Override + public void onStart(L2Character effector, L2Character effected, Skill skill) + { + effected.addListener(new FunctionEventListener(effected, EventType.ON_CREATURE_DAMAGE_RECEIVED, (OnCreatureDamageReceived event) -> onDamageReceivedEvent(event), this)); + } + + @Override + public void onExit(L2Character effector, L2Character effected, Skill skill) + { + effected.removeListenerIf(EventType.ON_CREATURE_DAMAGE_RECEIVED, listener -> listener.getOwner() == this); + } + + private DamageReturn onDamageReceivedEvent(OnCreatureDamageReceived event) + { + if (event.getAttacker().calculateDistance(event.getTarget(), true, false) > _amount) + { + return new DamageReturn(false, true, false, 0); + } + return new DamageReturn(false, false, false, event.getDamage()); + } } diff --git a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/stats/Formulas.java index e22b97099c..7bdfe14377 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/stats/Formulas.java @@ -78,11 +78,6 @@ public final class Formulas public static double calcBlowDamage(L2Character attacker, L2Character target, Skill skill, boolean backstab, double power, byte shld, boolean ss) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - return 0; - } - double defence = target.getPDef(); switch (shld) @@ -137,11 +132,6 @@ public final class Formulas public static double calcMagicDam(L2Character attacker, L2Character target, Skill skill, double mAtk, double power, double mDef, boolean sps, boolean bss, boolean mcrit) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - return 0; - } - // Bonus Spirit shot final double shotsBonus = bss ? (4 * attacker.getStat().getValue(Stats.SHOTS_BONUS)) : sps ? (2 * attacker.getStat().getValue(Stats.SHOTS_BONUS)) : 1; final double critMod = mcrit ? (2 * calcCritDamage(attacker, target, skill)) : 1; // TODO not really a proper way... find how it works then implement. // damage += attacker.getStat().getValue(Stats.MAGIC_CRIT_DMG_ADD, 0); @@ -663,12 +653,10 @@ public final class Formulas } } - if (!resisted) + final double sphericBarrierRange = target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, 0); + if (!resisted && (sphericBarrierRange > 0)) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - resisted = true; - } + resisted = attacker.calculateDistance(target, true, false) > sphericBarrierRange; } if (resisted) @@ -1326,11 +1314,6 @@ public final class Formulas */ public static double calcAutoAttackDamage(L2Character attacker, L2Character target, byte shld, boolean crit, boolean ss) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - return 0; - } - // DEFENCE CALCULATION (pDef + sDef) double defence = target.getPDef(); diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java index 80412d7523..0693eea287 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java @@ -28,7 +28,7 @@ import com.l2jmobius.gameserver.model.stats.Stats; public class AbstractStatAddEffect extends AbstractEffect { private final Stats _stat; - private final double _amount; + protected final double _amount; public AbstractStatAddEffect(StatsSet params, Stats stat) { diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index dbfd92ec67..69fdccb780 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -92,12 +92,6 @@ public final class EnergyAttack extends AbstractEffect return; } - final double distance = attacker.calculateDistance(effected, true, false); - if (distance > effected.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Integer.MAX_VALUE)) - { - return; - } - if (_overHit && effected.isAttackable()) { ((L2Attackable) effected).overhitEnabled(true); diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java index 05210d1b92..7b24baa2ef 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java @@ -17,6 +17,12 @@ package handlers.effecthandlers; import com.l2jmobius.gameserver.model.StatsSet; +import com.l2jmobius.gameserver.model.actor.L2Character; +import com.l2jmobius.gameserver.model.events.EventType; +import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureDamageReceived; +import com.l2jmobius.gameserver.model.events.listeners.FunctionEventListener; +import com.l2jmobius.gameserver.model.events.returns.DamageReturn; +import com.l2jmobius.gameserver.model.skills.Skill; import com.l2jmobius.gameserver.model.stats.Stats; /** @@ -28,4 +34,25 @@ public class SphericBarrier extends AbstractStatAddEffect { super(params, Stats.SPHERIC_BARRIER_RANGE); } + + @Override + public void onStart(L2Character effector, L2Character effected, Skill skill) + { + effected.addListener(new FunctionEventListener(effected, EventType.ON_CREATURE_DAMAGE_RECEIVED, (OnCreatureDamageReceived event) -> onDamageReceivedEvent(event), this)); + } + + @Override + public void onExit(L2Character effector, L2Character effected, Skill skill) + { + effected.removeListenerIf(EventType.ON_CREATURE_DAMAGE_RECEIVED, listener -> listener.getOwner() == this); + } + + private DamageReturn onDamageReceivedEvent(OnCreatureDamageReceived event) + { + if (event.getAttacker().calculateDistance(event.getTarget(), true, false) > _amount) + { + return new DamageReturn(false, true, false, 0); + } + return new DamageReturn(false, false, false, event.getDamage()); + } } diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/stats/Formulas.java index 6eeab5c93b..f0bf7a6a82 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/stats/Formulas.java @@ -78,11 +78,6 @@ public final class Formulas public static double calcBlowDamage(L2Character attacker, L2Character target, Skill skill, boolean backstab, double power, byte shld, boolean ss) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - return 0; - } - double defence = target.getPDef(); switch (shld) @@ -137,11 +132,6 @@ public final class Formulas public static double calcMagicDam(L2Character attacker, L2Character target, Skill skill, double mAtk, double power, double mDef, boolean sps, boolean bss, boolean mcrit) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - return 0; - } - // Bonus Spirit shot final double shotsBonus = bss ? (4 * attacker.getStat().getValue(Stats.SHOTS_BONUS)) : sps ? (2 * attacker.getStat().getValue(Stats.SHOTS_BONUS)) : 1; final double critMod = mcrit ? (2 * calcCritDamage(attacker, target, skill)) : 1; // TODO not really a proper way... find how it works then implement. // damage += attacker.getStat().getValue(Stats.MAGIC_CRIT_DMG_ADD, 0); @@ -663,12 +653,10 @@ public final class Formulas } } - if (!resisted) + final double sphericBarrierRange = target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, 0); + if (!resisted && (sphericBarrierRange > 0)) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - resisted = true; - } + resisted = attacker.calculateDistance(target, true, false) > sphericBarrierRange; } if (resisted) @@ -1326,11 +1314,6 @@ public final class Formulas */ public static double calcAutoAttackDamage(L2Character attacker, L2Character target, byte shld, boolean crit, boolean ss) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - return 0; - } - // DEFENCE CALCULATION (pDef + sDef) double defence = target.getPDef(); diff --git a/L2J_Mobius_Classic_2.0_Zaken/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java b/L2J_Mobius_Classic_2.0_Zaken/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java index 80412d7523..0693eea287 100644 --- a/L2J_Mobius_Classic_2.0_Zaken/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java +++ b/L2J_Mobius_Classic_2.0_Zaken/dist/game/data/scripts/handlers/effecthandlers/AbstractStatAddEffect.java @@ -28,7 +28,7 @@ import com.l2jmobius.gameserver.model.stats.Stats; public class AbstractStatAddEffect extends AbstractEffect { private final Stats _stat; - private final double _amount; + protected final double _amount; public AbstractStatAddEffect(StatsSet params, Stats stat) { diff --git a/L2J_Mobius_Classic_2.0_Zaken/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/L2J_Mobius_Classic_2.0_Zaken/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index dbfd92ec67..69fdccb780 100644 --- a/L2J_Mobius_Classic_2.0_Zaken/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/L2J_Mobius_Classic_2.0_Zaken/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -92,12 +92,6 @@ public final class EnergyAttack extends AbstractEffect return; } - final double distance = attacker.calculateDistance(effected, true, false); - if (distance > effected.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Integer.MAX_VALUE)) - { - return; - } - if (_overHit && effected.isAttackable()) { ((L2Attackable) effected).overhitEnabled(true); diff --git a/L2J_Mobius_Classic_2.0_Zaken/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java b/L2J_Mobius_Classic_2.0_Zaken/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java index 05210d1b92..7b24baa2ef 100644 --- a/L2J_Mobius_Classic_2.0_Zaken/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java +++ b/L2J_Mobius_Classic_2.0_Zaken/dist/game/data/scripts/handlers/effecthandlers/SphericBarrier.java @@ -17,6 +17,12 @@ package handlers.effecthandlers; import com.l2jmobius.gameserver.model.StatsSet; +import com.l2jmobius.gameserver.model.actor.L2Character; +import com.l2jmobius.gameserver.model.events.EventType; +import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureDamageReceived; +import com.l2jmobius.gameserver.model.events.listeners.FunctionEventListener; +import com.l2jmobius.gameserver.model.events.returns.DamageReturn; +import com.l2jmobius.gameserver.model.skills.Skill; import com.l2jmobius.gameserver.model.stats.Stats; /** @@ -28,4 +34,25 @@ public class SphericBarrier extends AbstractStatAddEffect { super(params, Stats.SPHERIC_BARRIER_RANGE); } + + @Override + public void onStart(L2Character effector, L2Character effected, Skill skill) + { + effected.addListener(new FunctionEventListener(effected, EventType.ON_CREATURE_DAMAGE_RECEIVED, (OnCreatureDamageReceived event) -> onDamageReceivedEvent(event), this)); + } + + @Override + public void onExit(L2Character effector, L2Character effected, Skill skill) + { + effected.removeListenerIf(EventType.ON_CREATURE_DAMAGE_RECEIVED, listener -> listener.getOwner() == this); + } + + private DamageReturn onDamageReceivedEvent(OnCreatureDamageReceived event) + { + if (event.getAttacker().calculateDistance(event.getTarget(), true, false) > _amount) + { + return new DamageReturn(false, true, false, 0); + } + return new DamageReturn(false, false, false, event.getDamage()); + } } diff --git a/L2J_Mobius_Classic_2.0_Zaken/java/com/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_Classic_2.0_Zaken/java/com/l2jmobius/gameserver/model/stats/Formulas.java index 6eeab5c93b..f0bf7a6a82 100644 --- a/L2J_Mobius_Classic_2.0_Zaken/java/com/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_Classic_2.0_Zaken/java/com/l2jmobius/gameserver/model/stats/Formulas.java @@ -78,11 +78,6 @@ public final class Formulas public static double calcBlowDamage(L2Character attacker, L2Character target, Skill skill, boolean backstab, double power, byte shld, boolean ss) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - return 0; - } - double defence = target.getPDef(); switch (shld) @@ -137,11 +132,6 @@ public final class Formulas public static double calcMagicDam(L2Character attacker, L2Character target, Skill skill, double mAtk, double power, double mDef, boolean sps, boolean bss, boolean mcrit) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - return 0; - } - // Bonus Spirit shot final double shotsBonus = bss ? (4 * attacker.getStat().getValue(Stats.SHOTS_BONUS)) : sps ? (2 * attacker.getStat().getValue(Stats.SHOTS_BONUS)) : 1; final double critMod = mcrit ? (2 * calcCritDamage(attacker, target, skill)) : 1; // TODO not really a proper way... find how it works then implement. // damage += attacker.getStat().getValue(Stats.MAGIC_CRIT_DMG_ADD, 0); @@ -663,12 +653,10 @@ public final class Formulas } } - if (!resisted) + final double sphericBarrierRange = target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, 0); + if (!resisted && (sphericBarrierRange > 0)) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - resisted = true; - } + resisted = attacker.calculateDistance(target, true, false) > sphericBarrierRange; } if (resisted) @@ -1326,11 +1314,6 @@ public final class Formulas */ public static double calcAutoAttackDamage(L2Character attacker, L2Character target, byte shld, boolean crit, boolean ss) { - if (attacker.calculateDistance(target, true, false) > target.getStat().getValue(Stats.SPHERIC_BARRIER_RANGE, Double.MAX_VALUE)) - { - return 0; - } - // DEFENCE CALCULATION (pDef + sDef) double defence = target.getPDef();