Fixed Spheric Barrier effect.

This commit is contained in:
MobiusDev
2018-03-24 15:41:33 +00:00
parent 71780660a8
commit f0076797fa
24 changed files with 186 additions and 162 deletions

View File

@@ -28,7 +28,7 @@ import com.l2jmobius.gameserver.model.stats.Stats;
public class AbstractStatAddEffect extends AbstractEffect public class AbstractStatAddEffect extends AbstractEffect
{ {
private final Stats _stat; private final Stats _stat;
private final double _amount; protected final double _amount;
public AbstractStatAddEffect(StatsSet params, Stats stat) public AbstractStatAddEffect(StatsSet params, Stats stat)
{ {

View File

@@ -92,12 +92,6 @@ public final class EnergyAttack extends AbstractEffect
return; 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()) if (_overHit && effected.isAttackable())
{ {
((L2Attackable) effected).overhitEnabled(true); ((L2Attackable) effected).overhitEnabled(true);

View File

@@ -17,6 +17,12 @@
package handlers.effecthandlers; package handlers.effecthandlers;
import com.l2jmobius.gameserver.model.StatsSet; 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; import com.l2jmobius.gameserver.model.stats.Stats;
/** /**
@@ -28,4 +34,25 @@ public class SphericBarrier extends AbstractStatAddEffect
{ {
super(params, Stats.SPHERIC_BARRIER_RANGE); 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());
}
} }

View File

@@ -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) 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(); double defence = target.getPDef();
switch (shld) 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) 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 // 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 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); 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 = attacker.calculateDistance(target, true, false) > sphericBarrierRange;
{
resisted = true;
}
} }
if (resisted) if (resisted)
@@ -1326,11 +1314,6 @@ public final class Formulas
*/ */
public static double calcAutoAttackDamage(L2Character attacker, L2Character target, byte shld, boolean crit, boolean ss) 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) // DEFENCE CALCULATION (pDef + sDef)
double defence = target.getPDef(); double defence = target.getPDef();

View File

@@ -28,7 +28,7 @@ import com.l2jmobius.gameserver.model.stats.Stats;
public class AbstractStatAddEffect extends AbstractEffect public class AbstractStatAddEffect extends AbstractEffect
{ {
private final Stats _stat; private final Stats _stat;
private final double _amount; protected final double _amount;
public AbstractStatAddEffect(StatsSet params, Stats stat) public AbstractStatAddEffect(StatsSet params, Stats stat)
{ {

View File

@@ -92,12 +92,6 @@ public final class EnergyAttack extends AbstractEffect
return; 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()) if (_overHit && effected.isAttackable())
{ {
((L2Attackable) effected).overhitEnabled(true); ((L2Attackable) effected).overhitEnabled(true);

View File

@@ -17,6 +17,12 @@
package handlers.effecthandlers; package handlers.effecthandlers;
import com.l2jmobius.gameserver.model.StatsSet; 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; import com.l2jmobius.gameserver.model.stats.Stats;
/** /**
@@ -28,4 +34,25 @@ public class SphericBarrier extends AbstractStatAddEffect
{ {
super(params, Stats.SPHERIC_BARRIER_RANGE); 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());
}
} }

View File

@@ -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) 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(); double defence = target.getPDef();
switch (shld) 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) 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 // 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 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); 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 = attacker.calculateDistance(target, true, false) > sphericBarrierRange;
{
resisted = true;
}
} }
if (resisted) if (resisted)
@@ -1326,11 +1314,6 @@ public final class Formulas
*/ */
public static double calcAutoAttackDamage(L2Character attacker, L2Character target, byte shld, boolean crit, boolean ss) 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) // DEFENCE CALCULATION (pDef + sDef)
double defence = target.getPDef(); double defence = target.getPDef();

View File

@@ -28,7 +28,7 @@ import com.l2jmobius.gameserver.model.stats.Stats;
public class AbstractStatAddEffect extends AbstractEffect public class AbstractStatAddEffect extends AbstractEffect
{ {
private final Stats _stat; private final Stats _stat;
private final double _amount; protected final double _amount;
public AbstractStatAddEffect(StatsSet params, Stats stat) public AbstractStatAddEffect(StatsSet params, Stats stat)
{ {

View File

@@ -92,12 +92,6 @@ public final class EnergyAttack extends AbstractEffect
return; 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()) if (_overHit && effected.isAttackable())
{ {
((L2Attackable) effected).overhitEnabled(true); ((L2Attackable) effected).overhitEnabled(true);

View File

@@ -17,6 +17,12 @@
package handlers.effecthandlers; package handlers.effecthandlers;
import com.l2jmobius.gameserver.model.StatsSet; 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; import com.l2jmobius.gameserver.model.stats.Stats;
/** /**
@@ -28,4 +34,25 @@ public class SphericBarrier extends AbstractStatAddEffect
{ {
super(params, Stats.SPHERIC_BARRIER_RANGE); 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());
}
} }

View File

@@ -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) 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(); double defence = target.getPDef();
switch (shld) 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) 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 // 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 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); 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 = attacker.calculateDistance(target, true, false) > sphericBarrierRange;
{
resisted = true;
}
} }
if (resisted) if (resisted)
@@ -1326,11 +1314,6 @@ public final class Formulas
*/ */
public static double calcAutoAttackDamage(L2Character attacker, L2Character target, byte shld, boolean crit, boolean ss) 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) // DEFENCE CALCULATION (pDef + sDef)
double defence = target.getPDef(); double defence = target.getPDef();

View File

@@ -28,7 +28,7 @@ import com.l2jmobius.gameserver.model.stats.Stats;
public class AbstractStatAddEffect extends AbstractEffect public class AbstractStatAddEffect extends AbstractEffect
{ {
private final Stats _stat; private final Stats _stat;
private final double _amount; protected final double _amount;
public AbstractStatAddEffect(StatsSet params, Stats stat) public AbstractStatAddEffect(StatsSet params, Stats stat)
{ {

View File

@@ -92,12 +92,6 @@ public final class EnergyAttack extends AbstractEffect
return; 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()) if (_overHit && effected.isAttackable())
{ {
((L2Attackable) effected).overhitEnabled(true); ((L2Attackable) effected).overhitEnabled(true);

View File

@@ -17,6 +17,12 @@
package handlers.effecthandlers; package handlers.effecthandlers;
import com.l2jmobius.gameserver.model.StatsSet; 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; import com.l2jmobius.gameserver.model.stats.Stats;
/** /**
@@ -28,4 +34,25 @@ public class SphericBarrier extends AbstractStatAddEffect
{ {
super(params, Stats.SPHERIC_BARRIER_RANGE); 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());
}
} }

View File

@@ -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) 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(); double defence = target.getPDef();
switch (shld) 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) 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 // 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 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); 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 = attacker.calculateDistance(target, true, false) > sphericBarrierRange;
{
resisted = true;
}
} }
if (resisted) if (resisted)
@@ -1326,11 +1314,6 @@ public final class Formulas
*/ */
public static double calcAutoAttackDamage(L2Character attacker, L2Character target, byte shld, boolean crit, boolean ss) 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) // DEFENCE CALCULATION (pDef + sDef)
double defence = target.getPDef(); double defence = target.getPDef();

View File

@@ -28,7 +28,7 @@ import com.l2jmobius.gameserver.model.stats.Stats;
public class AbstractStatAddEffect extends AbstractEffect public class AbstractStatAddEffect extends AbstractEffect
{ {
private final Stats _stat; private final Stats _stat;
private final double _amount; protected final double _amount;
public AbstractStatAddEffect(StatsSet params, Stats stat) public AbstractStatAddEffect(StatsSet params, Stats stat)
{ {

View File

@@ -92,12 +92,6 @@ public final class EnergyAttack extends AbstractEffect
return; 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()) if (_overHit && effected.isAttackable())
{ {
((L2Attackable) effected).overhitEnabled(true); ((L2Attackable) effected).overhitEnabled(true);

View File

@@ -17,6 +17,12 @@
package handlers.effecthandlers; package handlers.effecthandlers;
import com.l2jmobius.gameserver.model.StatsSet; 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; import com.l2jmobius.gameserver.model.stats.Stats;
/** /**
@@ -28,4 +34,25 @@ public class SphericBarrier extends AbstractStatAddEffect
{ {
super(params, Stats.SPHERIC_BARRIER_RANGE); 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());
}
} }

View File

@@ -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) 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(); double defence = target.getPDef();
switch (shld) 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) 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 // 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 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); 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 = attacker.calculateDistance(target, true, false) > sphericBarrierRange;
{
resisted = true;
}
} }
if (resisted) if (resisted)
@@ -1326,11 +1314,6 @@ public final class Formulas
*/ */
public static double calcAutoAttackDamage(L2Character attacker, L2Character target, byte shld, boolean crit, boolean ss) 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) // DEFENCE CALCULATION (pDef + sDef)
double defence = target.getPDef(); double defence = target.getPDef();

View File

@@ -28,7 +28,7 @@ import com.l2jmobius.gameserver.model.stats.Stats;
public class AbstractStatAddEffect extends AbstractEffect public class AbstractStatAddEffect extends AbstractEffect
{ {
private final Stats _stat; private final Stats _stat;
private final double _amount; protected final double _amount;
public AbstractStatAddEffect(StatsSet params, Stats stat) public AbstractStatAddEffect(StatsSet params, Stats stat)
{ {

View File

@@ -92,12 +92,6 @@ public final class EnergyAttack extends AbstractEffect
return; 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()) if (_overHit && effected.isAttackable())
{ {
((L2Attackable) effected).overhitEnabled(true); ((L2Attackable) effected).overhitEnabled(true);

View File

@@ -17,6 +17,12 @@
package handlers.effecthandlers; package handlers.effecthandlers;
import com.l2jmobius.gameserver.model.StatsSet; 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; import com.l2jmobius.gameserver.model.stats.Stats;
/** /**
@@ -28,4 +34,25 @@ public class SphericBarrier extends AbstractStatAddEffect
{ {
super(params, Stats.SPHERIC_BARRIER_RANGE); 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());
}
} }

View File

@@ -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) 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(); double defence = target.getPDef();
switch (shld) 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) 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 // 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 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); 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 = attacker.calculateDistance(target, true, false) > sphericBarrierRange;
{
resisted = true;
}
} }
if (resisted) if (resisted)
@@ -1326,11 +1314,6 @@ public final class Formulas
*/ */
public static double calcAutoAttackDamage(L2Character attacker, L2Character target, byte shld, boolean crit, boolean ss) 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) // DEFENCE CALCULATION (pDef + sDef)
double defence = target.getPDef(); double defence = target.getPDef();