diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java index b048c3d206..1ca4addfa7 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java @@ -16,27 +16,85 @@ */ package handlers.effecthandlers; +import java.util.concurrent.atomic.AtomicBoolean; + 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.ListenersContainer; +import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; +import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jmobius.gameserver.model.skills.Skill; import com.l2jmobius.gameserver.model.stats.Stats; /** - * @author UnAfraid + * @author Mobius */ abstract class AbstractConditionalHpEffect extends AbstractStatEffect { private final int _hpPercent; + private final AtomicBoolean _actived = new AtomicBoolean(); + private final AtomicBoolean _updated = new AtomicBoolean(); protected AbstractConditionalHpEffect(StatsSet params, Stats stat) { super(params, stat); - _hpPercent = params.getInt("hpPercent", -1); + _hpPercent = params.getInt("hpPercent", 0); + } + + @Override + public void onStart(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + // Register listeners + if ((_hpPercent > 0) && !_actived.get()) + { + _actived.set(true); + _updated.set(canPump(effector, effected, skill)); + final ListenersContainer container = effected; + container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); + } + } + + @Override + public void onExit(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + effected.removeListenerIf(listener -> listener.getOwner() == this); + _actived.set(false); } @Override public boolean canPump(L2Character effector, L2Character effected, Skill skill) { - return ((_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent)); + return (_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent); + } + + private void onHpChange(OnCreatureHpChange event) + { + final L2Character activeChar = event.getCreature(); + if (canPump(null, activeChar, null)) + { + if (_updated.get()) + { + _updated.set(false); + activeChar.getStat().recalculateStats(true); + } + } + else if (!_updated.get()) + { + _updated.set(true); + activeChar.getStat().recalculateStats(true); + } } } \ No newline at end of file diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/stats/skills/00200-00299.xml b/L2J_Mobius_1.0_Ertheia/dist/game/data/stats/skills/00200-00299.xml index e86d2801c4..8b74915278 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/stats/skills/00200-00299.xml +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/stats/skills/00200-00299.xml @@ -6290,6 +6290,7 @@ 129.3 DIFF + 30 diff --git a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java index f1d5b120e9..5b21d2c0a5 100644 --- a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java +++ b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java @@ -19,7 +19,6 @@ package com.l2jmobius.gameserver.model.actor.status; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; import com.l2jmobius.commons.concurrent.ThreadPool; @@ -51,8 +50,6 @@ public class CharStatus private static final byte REGEN_FLAG_HP = 1; private static final byte REGEN_FLAG_MP = 2; - private final AtomicInteger _previousHpPercent = new AtomicInteger(); - public CharStatus(L2Character activeChar) { _activeChar = activeChar; @@ -175,10 +172,7 @@ public class CharStatus if (value > 0) { - final double oldHp = _currentHp; - final double newHp = Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0); - setCurrentHp(newHp); - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(activeChar, oldHp, newHp), activeChar); + setCurrentHp(Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0)); } if ((activeChar.getCurrentHp() < 0.5)) // Die @@ -247,7 +241,6 @@ public class CharStatus // place holder, only PcStatus has CP public void setCurrentCp(double newCp, boolean broadcastPacket) { - } public final double getCurrentHp() @@ -269,7 +262,7 @@ public class CharStatus public boolean setCurrentHp(double newHp, boolean broadcastPacket) { // Get the Max HP of the L2Character - final int currentHp = (int) _currentHp; + final int oldHp = (int) _currentHp; final double maxHp = _activeChar.getStat().getMaxHp(); synchronized (this) @@ -302,30 +295,16 @@ public class CharStatus } } - final boolean hpWasChanged = currentHp != _currentHp; + final boolean hpWasChanged = oldHp != _currentHp; // Send the Server->Client packet StatusUpdate with current HP and MP to all other L2PcInstance to inform if (hpWasChanged) { - final int lastHpPercent = _previousHpPercent.get(); - final int currentHpPercent = (int) ((_currentHp * 100) / maxHp); - //@formatter:off - if (((lastHpPercent >= 60) && (currentHpPercent <= 60)) - || ((currentHpPercent >= 60) && (lastHpPercent <= 60)) - || ((lastHpPercent >= 30) && (currentHpPercent <= 30)) - || ((currentHpPercent >= 30) && (lastHpPercent <= 30))) - //@formatter:on - { - if (_previousHpPercent.compareAndSet(lastHpPercent, currentHpPercent)) - { - _activeChar.getStat().recalculateStats(broadcastPacket); - } - } - if (broadcastPacket) { _activeChar.broadcastStatusUpdate(); } + EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, _currentHp), getActiveChar()); } return hpWasChanged; diff --git a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java index 8f7427e7cc..3ba3aa818b 100644 --- a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java +++ b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java @@ -26,8 +26,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.stat.PcStat; import com.l2jmobius.gameserver.model.effects.EffectFlag; import com.l2jmobius.gameserver.model.entity.Duel; -import com.l2jmobius.gameserver.model.events.EventDispatcher; -import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; import com.l2jmobius.gameserver.model.skills.AbnormalType; import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.model.stats.Stats; @@ -272,7 +270,6 @@ public class PcStatus extends PlayableStatus if (value > 0) { - final double oldHp = getCurrentHp(); double newHp = Math.max(getCurrentHp() - value, getActiveChar().isUndying() ? 1 : 0); if (newHp <= 0) { @@ -295,8 +292,6 @@ public class PcStatus extends PlayableStatus } } setCurrentHp(newHp); - - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, newHp), getActiveChar()); } if ((getActiveChar().getCurrentHp() < 0.5) && !isHPConsumption && !getActiveChar().isUndying()) diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java index b048c3d206..1ca4addfa7 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java +++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java @@ -16,27 +16,85 @@ */ package handlers.effecthandlers; +import java.util.concurrent.atomic.AtomicBoolean; + 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.ListenersContainer; +import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; +import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jmobius.gameserver.model.skills.Skill; import com.l2jmobius.gameserver.model.stats.Stats; /** - * @author UnAfraid + * @author Mobius */ abstract class AbstractConditionalHpEffect extends AbstractStatEffect { private final int _hpPercent; + private final AtomicBoolean _actived = new AtomicBoolean(); + private final AtomicBoolean _updated = new AtomicBoolean(); protected AbstractConditionalHpEffect(StatsSet params, Stats stat) { super(params, stat); - _hpPercent = params.getInt("hpPercent", -1); + _hpPercent = params.getInt("hpPercent", 0); + } + + @Override + public void onStart(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + // Register listeners + if ((_hpPercent > 0) && !_actived.get()) + { + _actived.set(true); + _updated.set(canPump(effector, effected, skill)); + final ListenersContainer container = effected; + container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); + } + } + + @Override + public void onExit(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + effected.removeListenerIf(listener -> listener.getOwner() == this); + _actived.set(false); } @Override public boolean canPump(L2Character effector, L2Character effected, Skill skill) { - return ((_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent)); + return (_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent); + } + + private void onHpChange(OnCreatureHpChange event) + { + final L2Character activeChar = event.getCreature(); + if (canPump(null, activeChar, null)) + { + if (_updated.get()) + { + _updated.set(false); + activeChar.getStat().recalculateStats(true); + } + } + else if (!_updated.get()) + { + _updated.set(true); + activeChar.getStat().recalculateStats(true); + } } } \ No newline at end of file diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/stats/skills/00200-00299.xml b/L2J_Mobius_2.5_Underground/dist/game/data/stats/skills/00200-00299.xml index 9484c9d6bb..d6f7f796db 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/stats/skills/00200-00299.xml +++ b/L2J_Mobius_2.5_Underground/dist/game/data/stats/skills/00200-00299.xml @@ -6290,6 +6290,7 @@ 129.3 DIFF + 30 diff --git a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java index f1d5b120e9..5b21d2c0a5 100644 --- a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java +++ b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java @@ -19,7 +19,6 @@ package com.l2jmobius.gameserver.model.actor.status; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; import com.l2jmobius.commons.concurrent.ThreadPool; @@ -51,8 +50,6 @@ public class CharStatus private static final byte REGEN_FLAG_HP = 1; private static final byte REGEN_FLAG_MP = 2; - private final AtomicInteger _previousHpPercent = new AtomicInteger(); - public CharStatus(L2Character activeChar) { _activeChar = activeChar; @@ -175,10 +172,7 @@ public class CharStatus if (value > 0) { - final double oldHp = _currentHp; - final double newHp = Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0); - setCurrentHp(newHp); - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(activeChar, oldHp, newHp), activeChar); + setCurrentHp(Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0)); } if ((activeChar.getCurrentHp() < 0.5)) // Die @@ -247,7 +241,6 @@ public class CharStatus // place holder, only PcStatus has CP public void setCurrentCp(double newCp, boolean broadcastPacket) { - } public final double getCurrentHp() @@ -269,7 +262,7 @@ public class CharStatus public boolean setCurrentHp(double newHp, boolean broadcastPacket) { // Get the Max HP of the L2Character - final int currentHp = (int) _currentHp; + final int oldHp = (int) _currentHp; final double maxHp = _activeChar.getStat().getMaxHp(); synchronized (this) @@ -302,30 +295,16 @@ public class CharStatus } } - final boolean hpWasChanged = currentHp != _currentHp; + final boolean hpWasChanged = oldHp != _currentHp; // Send the Server->Client packet StatusUpdate with current HP and MP to all other L2PcInstance to inform if (hpWasChanged) { - final int lastHpPercent = _previousHpPercent.get(); - final int currentHpPercent = (int) ((_currentHp * 100) / maxHp); - //@formatter:off - if (((lastHpPercent >= 60) && (currentHpPercent <= 60)) - || ((currentHpPercent >= 60) && (lastHpPercent <= 60)) - || ((lastHpPercent >= 30) && (currentHpPercent <= 30)) - || ((currentHpPercent >= 30) && (lastHpPercent <= 30))) - //@formatter:on - { - if (_previousHpPercent.compareAndSet(lastHpPercent, currentHpPercent)) - { - _activeChar.getStat().recalculateStats(broadcastPacket); - } - } - if (broadcastPacket) { _activeChar.broadcastStatusUpdate(); } + EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, _currentHp), getActiveChar()); } return hpWasChanged; diff --git a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java index 8f7427e7cc..3ba3aa818b 100644 --- a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java +++ b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java @@ -26,8 +26,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.stat.PcStat; import com.l2jmobius.gameserver.model.effects.EffectFlag; import com.l2jmobius.gameserver.model.entity.Duel; -import com.l2jmobius.gameserver.model.events.EventDispatcher; -import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; import com.l2jmobius.gameserver.model.skills.AbnormalType; import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.model.stats.Stats; @@ -272,7 +270,6 @@ public class PcStatus extends PlayableStatus if (value > 0) { - final double oldHp = getCurrentHp(); double newHp = Math.max(getCurrentHp() - value, getActiveChar().isUndying() ? 1 : 0); if (newHp <= 0) { @@ -295,8 +292,6 @@ public class PcStatus extends PlayableStatus } } setCurrentHp(newHp); - - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, newHp), getActiveChar()); } if ((getActiveChar().getCurrentHp() < 0.5) && !isHPConsumption && !getActiveChar().isUndying()) diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java index b048c3d206..1ca4addfa7 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java +++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java @@ -16,27 +16,85 @@ */ package handlers.effecthandlers; +import java.util.concurrent.atomic.AtomicBoolean; + 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.ListenersContainer; +import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; +import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jmobius.gameserver.model.skills.Skill; import com.l2jmobius.gameserver.model.stats.Stats; /** - * @author UnAfraid + * @author Mobius */ abstract class AbstractConditionalHpEffect extends AbstractStatEffect { private final int _hpPercent; + private final AtomicBoolean _actived = new AtomicBoolean(); + private final AtomicBoolean _updated = new AtomicBoolean(); protected AbstractConditionalHpEffect(StatsSet params, Stats stat) { super(params, stat); - _hpPercent = params.getInt("hpPercent", -1); + _hpPercent = params.getInt("hpPercent", 0); + } + + @Override + public void onStart(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + // Register listeners + if ((_hpPercent > 0) && !_actived.get()) + { + _actived.set(true); + _updated.set(canPump(effector, effected, skill)); + final ListenersContainer container = effected; + container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); + } + } + + @Override + public void onExit(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + effected.removeListenerIf(listener -> listener.getOwner() == this); + _actived.set(false); } @Override public boolean canPump(L2Character effector, L2Character effected, Skill skill) { - return ((_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent)); + return (_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent); + } + + private void onHpChange(OnCreatureHpChange event) + { + final L2Character activeChar = event.getCreature(); + if (canPump(null, activeChar, null)) + { + if (_updated.get()) + { + _updated.set(false); + activeChar.getStat().recalculateStats(true); + } + } + else if (!_updated.get()) + { + _updated.set(true); + activeChar.getStat().recalculateStats(true); + } } } \ No newline at end of file diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/stats/skills/00200-00299.xml b/L2J_Mobius_3.0_Helios/dist/game/data/stats/skills/00200-00299.xml index 599e57cd75..221f5e85af 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/stats/skills/00200-00299.xml +++ b/L2J_Mobius_3.0_Helios/dist/game/data/stats/skills/00200-00299.xml @@ -6290,6 +6290,7 @@ 129.3 DIFF + 30 diff --git a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java index f1d5b120e9..5b21d2c0a5 100644 --- a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java +++ b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java @@ -19,7 +19,6 @@ package com.l2jmobius.gameserver.model.actor.status; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; import com.l2jmobius.commons.concurrent.ThreadPool; @@ -51,8 +50,6 @@ public class CharStatus private static final byte REGEN_FLAG_HP = 1; private static final byte REGEN_FLAG_MP = 2; - private final AtomicInteger _previousHpPercent = new AtomicInteger(); - public CharStatus(L2Character activeChar) { _activeChar = activeChar; @@ -175,10 +172,7 @@ public class CharStatus if (value > 0) { - final double oldHp = _currentHp; - final double newHp = Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0); - setCurrentHp(newHp); - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(activeChar, oldHp, newHp), activeChar); + setCurrentHp(Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0)); } if ((activeChar.getCurrentHp() < 0.5)) // Die @@ -247,7 +241,6 @@ public class CharStatus // place holder, only PcStatus has CP public void setCurrentCp(double newCp, boolean broadcastPacket) { - } public final double getCurrentHp() @@ -269,7 +262,7 @@ public class CharStatus public boolean setCurrentHp(double newHp, boolean broadcastPacket) { // Get the Max HP of the L2Character - final int currentHp = (int) _currentHp; + final int oldHp = (int) _currentHp; final double maxHp = _activeChar.getStat().getMaxHp(); synchronized (this) @@ -302,30 +295,16 @@ public class CharStatus } } - final boolean hpWasChanged = currentHp != _currentHp; + final boolean hpWasChanged = oldHp != _currentHp; // Send the Server->Client packet StatusUpdate with current HP and MP to all other L2PcInstance to inform if (hpWasChanged) { - final int lastHpPercent = _previousHpPercent.get(); - final int currentHpPercent = (int) ((_currentHp * 100) / maxHp); - //@formatter:off - if (((lastHpPercent >= 60) && (currentHpPercent <= 60)) - || ((currentHpPercent >= 60) && (lastHpPercent <= 60)) - || ((lastHpPercent >= 30) && (currentHpPercent <= 30)) - || ((currentHpPercent >= 30) && (lastHpPercent <= 30))) - //@formatter:on - { - if (_previousHpPercent.compareAndSet(lastHpPercent, currentHpPercent)) - { - _activeChar.getStat().recalculateStats(broadcastPacket); - } - } - if (broadcastPacket) { _activeChar.broadcastStatusUpdate(); } + EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, _currentHp), getActiveChar()); } return hpWasChanged; diff --git a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java index 8f7427e7cc..3ba3aa818b 100644 --- a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java +++ b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java @@ -26,8 +26,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.stat.PcStat; import com.l2jmobius.gameserver.model.effects.EffectFlag; import com.l2jmobius.gameserver.model.entity.Duel; -import com.l2jmobius.gameserver.model.events.EventDispatcher; -import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; import com.l2jmobius.gameserver.model.skills.AbnormalType; import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.model.stats.Stats; @@ -272,7 +270,6 @@ public class PcStatus extends PlayableStatus if (value > 0) { - final double oldHp = getCurrentHp(); double newHp = Math.max(getCurrentHp() - value, getActiveChar().isUndying() ? 1 : 0); if (newHp <= 0) { @@ -295,8 +292,6 @@ public class PcStatus extends PlayableStatus } } setCurrentHp(newHp); - - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, newHp), getActiveChar()); } if ((getActiveChar().getCurrentHp() < 0.5) && !isHPConsumption && !getActiveChar().isUndying()) diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java index b048c3d206..1ca4addfa7 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java @@ -16,27 +16,85 @@ */ package handlers.effecthandlers; +import java.util.concurrent.atomic.AtomicBoolean; + 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.ListenersContainer; +import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; +import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jmobius.gameserver.model.skills.Skill; import com.l2jmobius.gameserver.model.stats.Stats; /** - * @author UnAfraid + * @author Mobius */ abstract class AbstractConditionalHpEffect extends AbstractStatEffect { private final int _hpPercent; + private final AtomicBoolean _actived = new AtomicBoolean(); + private final AtomicBoolean _updated = new AtomicBoolean(); protected AbstractConditionalHpEffect(StatsSet params, Stats stat) { super(params, stat); - _hpPercent = params.getInt("hpPercent", -1); + _hpPercent = params.getInt("hpPercent", 0); + } + + @Override + public void onStart(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + // Register listeners + if ((_hpPercent > 0) && !_actived.get()) + { + _actived.set(true); + _updated.set(canPump(effector, effected, skill)); + final ListenersContainer container = effected; + container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); + } + } + + @Override + public void onExit(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + effected.removeListenerIf(listener -> listener.getOwner() == this); + _actived.set(false); } @Override public boolean canPump(L2Character effector, L2Character effected, Skill skill) { - return ((_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent)); + return (_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent); + } + + private void onHpChange(OnCreatureHpChange event) + { + final L2Character activeChar = event.getCreature(); + if (canPump(null, activeChar, null)) + { + if (_updated.get()) + { + _updated.set(false); + activeChar.getStat().recalculateStats(true); + } + } + else if (!_updated.get()) + { + _updated.set(true); + activeChar.getStat().recalculateStats(true); + } } } \ No newline at end of file diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/skills/00200-00299.xml b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/skills/00200-00299.xml index e408a7bf84..4a85b1186d 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/skills/00200-00299.xml +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/skills/00200-00299.xml @@ -6318,6 +6318,7 @@ 129.3 DIFF + 30 diff --git a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java index f1d5b120e9..5b21d2c0a5 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java @@ -19,7 +19,6 @@ package com.l2jmobius.gameserver.model.actor.status; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; import com.l2jmobius.commons.concurrent.ThreadPool; @@ -51,8 +50,6 @@ public class CharStatus private static final byte REGEN_FLAG_HP = 1; private static final byte REGEN_FLAG_MP = 2; - private final AtomicInteger _previousHpPercent = new AtomicInteger(); - public CharStatus(L2Character activeChar) { _activeChar = activeChar; @@ -175,10 +172,7 @@ public class CharStatus if (value > 0) { - final double oldHp = _currentHp; - final double newHp = Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0); - setCurrentHp(newHp); - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(activeChar, oldHp, newHp), activeChar); + setCurrentHp(Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0)); } if ((activeChar.getCurrentHp() < 0.5)) // Die @@ -247,7 +241,6 @@ public class CharStatus // place holder, only PcStatus has CP public void setCurrentCp(double newCp, boolean broadcastPacket) { - } public final double getCurrentHp() @@ -269,7 +262,7 @@ public class CharStatus public boolean setCurrentHp(double newHp, boolean broadcastPacket) { // Get the Max HP of the L2Character - final int currentHp = (int) _currentHp; + final int oldHp = (int) _currentHp; final double maxHp = _activeChar.getStat().getMaxHp(); synchronized (this) @@ -302,30 +295,16 @@ public class CharStatus } } - final boolean hpWasChanged = currentHp != _currentHp; + final boolean hpWasChanged = oldHp != _currentHp; // Send the Server->Client packet StatusUpdate with current HP and MP to all other L2PcInstance to inform if (hpWasChanged) { - final int lastHpPercent = _previousHpPercent.get(); - final int currentHpPercent = (int) ((_currentHp * 100) / maxHp); - //@formatter:off - if (((lastHpPercent >= 60) && (currentHpPercent <= 60)) - || ((currentHpPercent >= 60) && (lastHpPercent <= 60)) - || ((lastHpPercent >= 30) && (currentHpPercent <= 30)) - || ((currentHpPercent >= 30) && (lastHpPercent <= 30))) - //@formatter:on - { - if (_previousHpPercent.compareAndSet(lastHpPercent, currentHpPercent)) - { - _activeChar.getStat().recalculateStats(broadcastPacket); - } - } - if (broadcastPacket) { _activeChar.broadcastStatusUpdate(); } + EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, _currentHp), getActiveChar()); } return hpWasChanged; diff --git a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java index 8f7427e7cc..3ba3aa818b 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java @@ -26,8 +26,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.stat.PcStat; import com.l2jmobius.gameserver.model.effects.EffectFlag; import com.l2jmobius.gameserver.model.entity.Duel; -import com.l2jmobius.gameserver.model.events.EventDispatcher; -import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; import com.l2jmobius.gameserver.model.skills.AbnormalType; import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.model.stats.Stats; @@ -272,7 +270,6 @@ public class PcStatus extends PlayableStatus if (value > 0) { - final double oldHp = getCurrentHp(); double newHp = Math.max(getCurrentHp() - value, getActiveChar().isUndying() ? 1 : 0); if (newHp <= 0) { @@ -295,8 +292,6 @@ public class PcStatus extends PlayableStatus } } setCurrentHp(newHp); - - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, newHp), getActiveChar()); } if ((getActiveChar().getCurrentHp() < 0.5) && !isHPConsumption && !getActiveChar().isUndying()) diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java index b048c3d206..1ca4addfa7 100644 --- a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java +++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java @@ -16,27 +16,85 @@ */ package handlers.effecthandlers; +import java.util.concurrent.atomic.AtomicBoolean; + 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.ListenersContainer; +import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; +import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jmobius.gameserver.model.skills.Skill; import com.l2jmobius.gameserver.model.stats.Stats; /** - * @author UnAfraid + * @author Mobius */ abstract class AbstractConditionalHpEffect extends AbstractStatEffect { private final int _hpPercent; + private final AtomicBoolean _actived = new AtomicBoolean(); + private final AtomicBoolean _updated = new AtomicBoolean(); protected AbstractConditionalHpEffect(StatsSet params, Stats stat) { super(params, stat); - _hpPercent = params.getInt("hpPercent", -1); + _hpPercent = params.getInt("hpPercent", 0); + } + + @Override + public void onStart(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + // Register listeners + if ((_hpPercent > 0) && !_actived.get()) + { + _actived.set(true); + _updated.set(canPump(effector, effected, skill)); + final ListenersContainer container = effected; + container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); + } + } + + @Override + public void onExit(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + effected.removeListenerIf(listener -> listener.getOwner() == this); + _actived.set(false); } @Override public boolean canPump(L2Character effector, L2Character effected, Skill skill) { - return ((_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent)); + return (_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent); + } + + private void onHpChange(OnCreatureHpChange event) + { + final L2Character activeChar = event.getCreature(); + if (canPump(null, activeChar, null)) + { + if (_updated.get()) + { + _updated.set(false); + activeChar.getStat().recalculateStats(true); + } + } + else if (!_updated.get()) + { + _updated.set(true); + activeChar.getStat().recalculateStats(true); + } } } \ No newline at end of file diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/00200-00299.xml b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/00200-00299.xml index e408a7bf84..4a85b1186d 100644 --- a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/00200-00299.xml +++ b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/00200-00299.xml @@ -6318,6 +6318,7 @@ 129.3 DIFF + 30 diff --git a/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java b/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java index f1d5b120e9..5b21d2c0a5 100644 --- a/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java +++ b/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java @@ -19,7 +19,6 @@ package com.l2jmobius.gameserver.model.actor.status; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; import com.l2jmobius.commons.concurrent.ThreadPool; @@ -51,8 +50,6 @@ public class CharStatus private static final byte REGEN_FLAG_HP = 1; private static final byte REGEN_FLAG_MP = 2; - private final AtomicInteger _previousHpPercent = new AtomicInteger(); - public CharStatus(L2Character activeChar) { _activeChar = activeChar; @@ -175,10 +172,7 @@ public class CharStatus if (value > 0) { - final double oldHp = _currentHp; - final double newHp = Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0); - setCurrentHp(newHp); - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(activeChar, oldHp, newHp), activeChar); + setCurrentHp(Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0)); } if ((activeChar.getCurrentHp() < 0.5)) // Die @@ -247,7 +241,6 @@ public class CharStatus // place holder, only PcStatus has CP public void setCurrentCp(double newCp, boolean broadcastPacket) { - } public final double getCurrentHp() @@ -269,7 +262,7 @@ public class CharStatus public boolean setCurrentHp(double newHp, boolean broadcastPacket) { // Get the Max HP of the L2Character - final int currentHp = (int) _currentHp; + final int oldHp = (int) _currentHp; final double maxHp = _activeChar.getStat().getMaxHp(); synchronized (this) @@ -302,30 +295,16 @@ public class CharStatus } } - final boolean hpWasChanged = currentHp != _currentHp; + final boolean hpWasChanged = oldHp != _currentHp; // Send the Server->Client packet StatusUpdate with current HP and MP to all other L2PcInstance to inform if (hpWasChanged) { - final int lastHpPercent = _previousHpPercent.get(); - final int currentHpPercent = (int) ((_currentHp * 100) / maxHp); - //@formatter:off - if (((lastHpPercent >= 60) && (currentHpPercent <= 60)) - || ((currentHpPercent >= 60) && (lastHpPercent <= 60)) - || ((lastHpPercent >= 30) && (currentHpPercent <= 30)) - || ((currentHpPercent >= 30) && (lastHpPercent <= 30))) - //@formatter:on - { - if (_previousHpPercent.compareAndSet(lastHpPercent, currentHpPercent)) - { - _activeChar.getStat().recalculateStats(broadcastPacket); - } - } - if (broadcastPacket) { _activeChar.broadcastStatusUpdate(); } + EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, _currentHp), getActiveChar()); } return hpWasChanged; diff --git a/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java b/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java index 8f7427e7cc..3ba3aa818b 100644 --- a/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java +++ b/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java @@ -26,8 +26,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.stat.PcStat; import com.l2jmobius.gameserver.model.effects.EffectFlag; import com.l2jmobius.gameserver.model.entity.Duel; -import com.l2jmobius.gameserver.model.events.EventDispatcher; -import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; import com.l2jmobius.gameserver.model.skills.AbnormalType; import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.model.stats.Stats; @@ -272,7 +270,6 @@ public class PcStatus extends PlayableStatus if (value > 0) { - final double oldHp = getCurrentHp(); double newHp = Math.max(getCurrentHp() - value, getActiveChar().isUndying() ? 1 : 0); if (newHp <= 0) { @@ -295,8 +292,6 @@ public class PcStatus extends PlayableStatus } } setCurrentHp(newHp); - - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, newHp), getActiveChar()); } if ((getActiveChar().getCurrentHp() < 0.5) && !isHPConsumption && !getActiveChar().isUndying()) diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java index b048c3d206..1ca4addfa7 100644 --- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java +++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java @@ -16,27 +16,85 @@ */ package handlers.effecthandlers; +import java.util.concurrent.atomic.AtomicBoolean; + 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.ListenersContainer; +import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; +import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jmobius.gameserver.model.skills.Skill; import com.l2jmobius.gameserver.model.stats.Stats; /** - * @author UnAfraid + * @author Mobius */ abstract class AbstractConditionalHpEffect extends AbstractStatEffect { private final int _hpPercent; + private final AtomicBoolean _actived = new AtomicBoolean(); + private final AtomicBoolean _updated = new AtomicBoolean(); protected AbstractConditionalHpEffect(StatsSet params, Stats stat) { super(params, stat); - _hpPercent = params.getInt("hpPercent", -1); + _hpPercent = params.getInt("hpPercent", 0); + } + + @Override + public void onStart(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + // Register listeners + if ((_hpPercent > 0) && !_actived.get()) + { + _actived.set(true); + _updated.set(canPump(effector, effected, skill)); + final ListenersContainer container = effected; + container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); + } + } + + @Override + public void onExit(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + effected.removeListenerIf(listener -> listener.getOwner() == this); + _actived.set(false); } @Override public boolean canPump(L2Character effector, L2Character effected, Skill skill) { - return ((_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent)); + return (_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent); + } + + private void onHpChange(OnCreatureHpChange event) + { + final L2Character activeChar = event.getCreature(); + if (canPump(null, activeChar, null)) + { + if (_updated.get()) + { + _updated.set(false); + activeChar.getStat().recalculateStats(true); + } + } + else if (!_updated.get()) + { + _updated.set(true); + activeChar.getStat().recalculateStats(true); + } } } \ No newline at end of file diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/00200-00299.xml b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/00200-00299.xml index e408a7bf84..4a85b1186d 100644 --- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/00200-00299.xml +++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/00200-00299.xml @@ -6318,6 +6318,7 @@ 129.3 DIFF + 30 diff --git a/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java b/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java index f1d5b120e9..5b21d2c0a5 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java +++ b/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java @@ -19,7 +19,6 @@ package com.l2jmobius.gameserver.model.actor.status; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; import com.l2jmobius.commons.concurrent.ThreadPool; @@ -51,8 +50,6 @@ public class CharStatus private static final byte REGEN_FLAG_HP = 1; private static final byte REGEN_FLAG_MP = 2; - private final AtomicInteger _previousHpPercent = new AtomicInteger(); - public CharStatus(L2Character activeChar) { _activeChar = activeChar; @@ -175,10 +172,7 @@ public class CharStatus if (value > 0) { - final double oldHp = _currentHp; - final double newHp = Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0); - setCurrentHp(newHp); - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(activeChar, oldHp, newHp), activeChar); + setCurrentHp(Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0)); } if ((activeChar.getCurrentHp() < 0.5)) // Die @@ -247,7 +241,6 @@ public class CharStatus // place holder, only PcStatus has CP public void setCurrentCp(double newCp, boolean broadcastPacket) { - } public final double getCurrentHp() @@ -269,7 +262,7 @@ public class CharStatus public boolean setCurrentHp(double newHp, boolean broadcastPacket) { // Get the Max HP of the L2Character - final int currentHp = (int) _currentHp; + final int oldHp = (int) _currentHp; final double maxHp = _activeChar.getStat().getMaxHp(); synchronized (this) @@ -302,30 +295,16 @@ public class CharStatus } } - final boolean hpWasChanged = currentHp != _currentHp; + final boolean hpWasChanged = oldHp != _currentHp; // Send the Server->Client packet StatusUpdate with current HP and MP to all other L2PcInstance to inform if (hpWasChanged) { - final int lastHpPercent = _previousHpPercent.get(); - final int currentHpPercent = (int) ((_currentHp * 100) / maxHp); - //@formatter:off - if (((lastHpPercent >= 60) && (currentHpPercent <= 60)) - || ((currentHpPercent >= 60) && (lastHpPercent <= 60)) - || ((lastHpPercent >= 30) && (currentHpPercent <= 30)) - || ((currentHpPercent >= 30) && (lastHpPercent <= 30))) - //@formatter:on - { - if (_previousHpPercent.compareAndSet(lastHpPercent, currentHpPercent)) - { - _activeChar.getStat().recalculateStats(broadcastPacket); - } - } - if (broadcastPacket) { _activeChar.broadcastStatusUpdate(); } + EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, _currentHp), getActiveChar()); } return hpWasChanged; diff --git a/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java b/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java index 673db6ab4c..12206a8dda 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java +++ b/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java @@ -26,8 +26,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.stat.PcStat; import com.l2jmobius.gameserver.model.effects.EffectFlag; import com.l2jmobius.gameserver.model.entity.Duel; -import com.l2jmobius.gameserver.model.events.EventDispatcher; -import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; import com.l2jmobius.gameserver.model.skills.AbnormalType; import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.model.stats.Stats; @@ -272,7 +270,6 @@ public class PcStatus extends PlayableStatus if (value > 0) { - final double oldHp = getCurrentHp(); double newHp = Math.max(getCurrentHp() - value, getActiveChar().isUndying() ? 1 : 0); if (newHp <= 0) { @@ -295,8 +292,6 @@ public class PcStatus extends PlayableStatus } } setCurrentHp(newHp); - - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, newHp), getActiveChar()); } if ((getActiveChar().getCurrentHp() < 0.5) && !isHPConsumption && !getActiveChar().isUndying()) diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java index b048c3d206..1ca4addfa7 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java @@ -16,27 +16,85 @@ */ package handlers.effecthandlers; +import java.util.concurrent.atomic.AtomicBoolean; + 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.ListenersContainer; +import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; +import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jmobius.gameserver.model.skills.Skill; import com.l2jmobius.gameserver.model.stats.Stats; /** - * @author UnAfraid + * @author Mobius */ abstract class AbstractConditionalHpEffect extends AbstractStatEffect { private final int _hpPercent; + private final AtomicBoolean _actived = new AtomicBoolean(); + private final AtomicBoolean _updated = new AtomicBoolean(); protected AbstractConditionalHpEffect(StatsSet params, Stats stat) { super(params, stat); - _hpPercent = params.getInt("hpPercent", -1); + _hpPercent = params.getInt("hpPercent", 0); + } + + @Override + public void onStart(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + // Register listeners + if ((_hpPercent > 0) && !_actived.get()) + { + _actived.set(true); + _updated.set(canPump(effector, effected, skill)); + final ListenersContainer container = effected; + container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); + } + } + + @Override + public void onExit(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + effected.removeListenerIf(listener -> listener.getOwner() == this); + _actived.set(false); } @Override public boolean canPump(L2Character effector, L2Character effected, Skill skill) { - return ((_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent)); + return (_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent); + } + + private void onHpChange(OnCreatureHpChange event) + { + final L2Character activeChar = event.getCreature(); + if (canPump(null, activeChar, null)) + { + if (_updated.get()) + { + _updated.set(false); + activeChar.getStat().recalculateStats(true); + } + } + else if (!_updated.get()) + { + _updated.set(true); + activeChar.getStat().recalculateStats(true); + } } } \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/stats/skills/00200-00299.xml b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/stats/skills/00200-00299.xml index c605c38d63..98cc5f8891 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/stats/skills/00200-00299.xml +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/stats/skills/00200-00299.xml @@ -6478,6 +6478,7 @@ 129.3 DIFF + 30 diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java index f1d5b120e9..5b21d2c0a5 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java @@ -19,7 +19,6 @@ package com.l2jmobius.gameserver.model.actor.status; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; import com.l2jmobius.commons.concurrent.ThreadPool; @@ -51,8 +50,6 @@ public class CharStatus private static final byte REGEN_FLAG_HP = 1; private static final byte REGEN_FLAG_MP = 2; - private final AtomicInteger _previousHpPercent = new AtomicInteger(); - public CharStatus(L2Character activeChar) { _activeChar = activeChar; @@ -175,10 +172,7 @@ public class CharStatus if (value > 0) { - final double oldHp = _currentHp; - final double newHp = Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0); - setCurrentHp(newHp); - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(activeChar, oldHp, newHp), activeChar); + setCurrentHp(Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0)); } if ((activeChar.getCurrentHp() < 0.5)) // Die @@ -247,7 +241,6 @@ public class CharStatus // place holder, only PcStatus has CP public void setCurrentCp(double newCp, boolean broadcastPacket) { - } public final double getCurrentHp() @@ -269,7 +262,7 @@ public class CharStatus public boolean setCurrentHp(double newHp, boolean broadcastPacket) { // Get the Max HP of the L2Character - final int currentHp = (int) _currentHp; + final int oldHp = (int) _currentHp; final double maxHp = _activeChar.getStat().getMaxHp(); synchronized (this) @@ -302,30 +295,16 @@ public class CharStatus } } - final boolean hpWasChanged = currentHp != _currentHp; + final boolean hpWasChanged = oldHp != _currentHp; // Send the Server->Client packet StatusUpdate with current HP and MP to all other L2PcInstance to inform if (hpWasChanged) { - final int lastHpPercent = _previousHpPercent.get(); - final int currentHpPercent = (int) ((_currentHp * 100) / maxHp); - //@formatter:off - if (((lastHpPercent >= 60) && (currentHpPercent <= 60)) - || ((currentHpPercent >= 60) && (lastHpPercent <= 60)) - || ((lastHpPercent >= 30) && (currentHpPercent <= 30)) - || ((currentHpPercent >= 30) && (lastHpPercent <= 30))) - //@formatter:on - { - if (_previousHpPercent.compareAndSet(lastHpPercent, currentHpPercent)) - { - _activeChar.getStat().recalculateStats(broadcastPacket); - } - } - if (broadcastPacket) { _activeChar.broadcastStatusUpdate(); } + EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, _currentHp), getActiveChar()); } return hpWasChanged; diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java index 8f7427e7cc..3ba3aa818b 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java @@ -26,8 +26,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.stat.PcStat; import com.l2jmobius.gameserver.model.effects.EffectFlag; import com.l2jmobius.gameserver.model.entity.Duel; -import com.l2jmobius.gameserver.model.events.EventDispatcher; -import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; import com.l2jmobius.gameserver.model.skills.AbnormalType; import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.model.stats.Stats; @@ -272,7 +270,6 @@ public class PcStatus extends PlayableStatus if (value > 0) { - final double oldHp = getCurrentHp(); double newHp = Math.max(getCurrentHp() - value, getActiveChar().isUndying() ? 1 : 0); if (newHp <= 0) { @@ -295,8 +292,6 @@ public class PcStatus extends PlayableStatus } } setCurrentHp(newHp); - - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, newHp), getActiveChar()); } if ((getActiveChar().getCurrentHp() < 0.5) && !isHPConsumption && !getActiveChar().isUndying()) diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java index b048c3d206..1ca4addfa7 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java @@ -16,27 +16,85 @@ */ package handlers.effecthandlers; +import java.util.concurrent.atomic.AtomicBoolean; + 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.ListenersContainer; +import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; +import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jmobius.gameserver.model.skills.Skill; import com.l2jmobius.gameserver.model.stats.Stats; /** - * @author UnAfraid + * @author Mobius */ abstract class AbstractConditionalHpEffect extends AbstractStatEffect { private final int _hpPercent; + private final AtomicBoolean _actived = new AtomicBoolean(); + private final AtomicBoolean _updated = new AtomicBoolean(); protected AbstractConditionalHpEffect(StatsSet params, Stats stat) { super(params, stat); - _hpPercent = params.getInt("hpPercent", -1); + _hpPercent = params.getInt("hpPercent", 0); + } + + @Override + public void onStart(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + // Register listeners + if ((_hpPercent > 0) && !_actived.get()) + { + _actived.set(true); + _updated.set(canPump(effector, effected, skill)); + final ListenersContainer container = effected; + container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); + } + } + + @Override + public void onExit(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + effected.removeListenerIf(listener -> listener.getOwner() == this); + _actived.set(false); } @Override public boolean canPump(L2Character effector, L2Character effected, Skill skill) { - return ((_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent)); + return (_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent); + } + + private void onHpChange(OnCreatureHpChange event) + { + final L2Character activeChar = event.getCreature(); + if (canPump(null, activeChar, null)) + { + if (_updated.get()) + { + _updated.set(false); + activeChar.getStat().recalculateStats(true); + } + } + else if (!_updated.get()) + { + _updated.set(true); + activeChar.getStat().recalculateStats(true); + } } } \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/stats/skills/00200-00299.xml b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/stats/skills/00200-00299.xml index c605c38d63..98cc5f8891 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/stats/skills/00200-00299.xml +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/stats/skills/00200-00299.xml @@ -6478,6 +6478,7 @@ 129.3 DIFF + 30 diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java b/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java index f1d5b120e9..5b21d2c0a5 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java @@ -19,7 +19,6 @@ package com.l2jmobius.gameserver.model.actor.status; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; import com.l2jmobius.commons.concurrent.ThreadPool; @@ -51,8 +50,6 @@ public class CharStatus private static final byte REGEN_FLAG_HP = 1; private static final byte REGEN_FLAG_MP = 2; - private final AtomicInteger _previousHpPercent = new AtomicInteger(); - public CharStatus(L2Character activeChar) { _activeChar = activeChar; @@ -175,10 +172,7 @@ public class CharStatus if (value > 0) { - final double oldHp = _currentHp; - final double newHp = Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0); - setCurrentHp(newHp); - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(activeChar, oldHp, newHp), activeChar); + setCurrentHp(Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0)); } if ((activeChar.getCurrentHp() < 0.5)) // Die @@ -247,7 +241,6 @@ public class CharStatus // place holder, only PcStatus has CP public void setCurrentCp(double newCp, boolean broadcastPacket) { - } public final double getCurrentHp() @@ -269,7 +262,7 @@ public class CharStatus public boolean setCurrentHp(double newHp, boolean broadcastPacket) { // Get the Max HP of the L2Character - final int currentHp = (int) _currentHp; + final int oldHp = (int) _currentHp; final double maxHp = _activeChar.getStat().getMaxHp(); synchronized (this) @@ -302,30 +295,16 @@ public class CharStatus } } - final boolean hpWasChanged = currentHp != _currentHp; + final boolean hpWasChanged = oldHp != _currentHp; // Send the Server->Client packet StatusUpdate with current HP and MP to all other L2PcInstance to inform if (hpWasChanged) { - final int lastHpPercent = _previousHpPercent.get(); - final int currentHpPercent = (int) ((_currentHp * 100) / maxHp); - //@formatter:off - if (((lastHpPercent >= 60) && (currentHpPercent <= 60)) - || ((currentHpPercent >= 60) && (lastHpPercent <= 60)) - || ((lastHpPercent >= 30) && (currentHpPercent <= 30)) - || ((currentHpPercent >= 30) && (lastHpPercent <= 30))) - //@formatter:on - { - if (_previousHpPercent.compareAndSet(lastHpPercent, currentHpPercent)) - { - _activeChar.getStat().recalculateStats(broadcastPacket); - } - } - if (broadcastPacket) { _activeChar.broadcastStatusUpdate(); } + EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, _currentHp), getActiveChar()); } return hpWasChanged; diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java b/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java index 8f7427e7cc..3ba3aa818b 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java @@ -26,8 +26,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.stat.PcStat; import com.l2jmobius.gameserver.model.effects.EffectFlag; import com.l2jmobius.gameserver.model.entity.Duel; -import com.l2jmobius.gameserver.model.events.EventDispatcher; -import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; import com.l2jmobius.gameserver.model.skills.AbnormalType; import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.model.stats.Stats; @@ -272,7 +270,6 @@ public class PcStatus extends PlayableStatus if (value > 0) { - final double oldHp = getCurrentHp(); double newHp = Math.max(getCurrentHp() - value, getActiveChar().isUndying() ? 1 : 0); if (newHp <= 0) { @@ -295,8 +292,6 @@ public class PcStatus extends PlayableStatus } } setCurrentHp(newHp); - - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, newHp), getActiveChar()); } if ((getActiveChar().getCurrentHp() < 0.5) && !isHPConsumption && !getActiveChar().isUndying()) diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java index b048c3d206..1ca4addfa7 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java @@ -16,27 +16,85 @@ */ package handlers.effecthandlers; +import java.util.concurrent.atomic.AtomicBoolean; + 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.ListenersContainer; +import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; +import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jmobius.gameserver.model.skills.Skill; import com.l2jmobius.gameserver.model.stats.Stats; /** - * @author UnAfraid + * @author Mobius */ abstract class AbstractConditionalHpEffect extends AbstractStatEffect { private final int _hpPercent; + private final AtomicBoolean _actived = new AtomicBoolean(); + private final AtomicBoolean _updated = new AtomicBoolean(); protected AbstractConditionalHpEffect(StatsSet params, Stats stat) { super(params, stat); - _hpPercent = params.getInt("hpPercent", -1); + _hpPercent = params.getInt("hpPercent", 0); + } + + @Override + public void onStart(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + // Register listeners + if ((_hpPercent > 0) && !_actived.get()) + { + _actived.set(true); + _updated.set(canPump(effector, effected, skill)); + final ListenersContainer container = effected; + container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); + } + } + + @Override + public void onExit(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + effected.removeListenerIf(listener -> listener.getOwner() == this); + _actived.set(false); } @Override public boolean canPump(L2Character effector, L2Character effected, Skill skill) { - return ((_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent)); + return (_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent); + } + + private void onHpChange(OnCreatureHpChange event) + { + final L2Character activeChar = event.getCreature(); + if (canPump(null, activeChar, null)) + { + if (_updated.get()) + { + _updated.set(false); + activeChar.getStat().recalculateStats(true); + } + } + else if (!_updated.get()) + { + _updated.set(true); + activeChar.getStat().recalculateStats(true); + } } } \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/stats/skills/00200-00299.xml b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/stats/skills/00200-00299.xml index 9c12b407bf..92d48d72cb 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/stats/skills/00200-00299.xml +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/stats/skills/00200-00299.xml @@ -6995,6 +6995,7 @@ 129.3 DIFF + 30 diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java b/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java index f1d5b120e9..5b21d2c0a5 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java @@ -19,7 +19,6 @@ package com.l2jmobius.gameserver.model.actor.status; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; import com.l2jmobius.commons.concurrent.ThreadPool; @@ -51,8 +50,6 @@ public class CharStatus private static final byte REGEN_FLAG_HP = 1; private static final byte REGEN_FLAG_MP = 2; - private final AtomicInteger _previousHpPercent = new AtomicInteger(); - public CharStatus(L2Character activeChar) { _activeChar = activeChar; @@ -175,10 +172,7 @@ public class CharStatus if (value > 0) { - final double oldHp = _currentHp; - final double newHp = Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0); - setCurrentHp(newHp); - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(activeChar, oldHp, newHp), activeChar); + setCurrentHp(Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0)); } if ((activeChar.getCurrentHp() < 0.5)) // Die @@ -247,7 +241,6 @@ public class CharStatus // place holder, only PcStatus has CP public void setCurrentCp(double newCp, boolean broadcastPacket) { - } public final double getCurrentHp() @@ -269,7 +262,7 @@ public class CharStatus public boolean setCurrentHp(double newHp, boolean broadcastPacket) { // Get the Max HP of the L2Character - final int currentHp = (int) _currentHp; + final int oldHp = (int) _currentHp; final double maxHp = _activeChar.getStat().getMaxHp(); synchronized (this) @@ -302,30 +295,16 @@ public class CharStatus } } - final boolean hpWasChanged = currentHp != _currentHp; + final boolean hpWasChanged = oldHp != _currentHp; // Send the Server->Client packet StatusUpdate with current HP and MP to all other L2PcInstance to inform if (hpWasChanged) { - final int lastHpPercent = _previousHpPercent.get(); - final int currentHpPercent = (int) ((_currentHp * 100) / maxHp); - //@formatter:off - if (((lastHpPercent >= 60) && (currentHpPercent <= 60)) - || ((currentHpPercent >= 60) && (lastHpPercent <= 60)) - || ((lastHpPercent >= 30) && (currentHpPercent <= 30)) - || ((currentHpPercent >= 30) && (lastHpPercent <= 30))) - //@formatter:on - { - if (_previousHpPercent.compareAndSet(lastHpPercent, currentHpPercent)) - { - _activeChar.getStat().recalculateStats(broadcastPacket); - } - } - if (broadcastPacket) { _activeChar.broadcastStatusUpdate(); } + EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, _currentHp), getActiveChar()); } return hpWasChanged; diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java b/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java index 8f7427e7cc..3ba3aa818b 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java @@ -26,8 +26,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.stat.PcStat; import com.l2jmobius.gameserver.model.effects.EffectFlag; import com.l2jmobius.gameserver.model.entity.Duel; -import com.l2jmobius.gameserver.model.events.EventDispatcher; -import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; import com.l2jmobius.gameserver.model.skills.AbnormalType; import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.model.stats.Stats; @@ -272,7 +270,6 @@ public class PcStatus extends PlayableStatus if (value > 0) { - final double oldHp = getCurrentHp(); double newHp = Math.max(getCurrentHp() - value, getActiveChar().isUndying() ? 1 : 0); if (newHp <= 0) { @@ -295,8 +292,6 @@ public class PcStatus extends PlayableStatus } } setCurrentHp(newHp); - - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, newHp), getActiveChar()); } if ((getActiveChar().getCurrentHp() < 0.5) && !isHPConsumption && !getActiveChar().isUndying()) diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java index b048c3d206..1ca4addfa7 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/AbstractConditionalHpEffect.java @@ -16,27 +16,85 @@ */ package handlers.effecthandlers; +import java.util.concurrent.atomic.AtomicBoolean; + 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.ListenersContainer; +import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; +import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jmobius.gameserver.model.skills.Skill; import com.l2jmobius.gameserver.model.stats.Stats; /** - * @author UnAfraid + * @author Mobius */ abstract class AbstractConditionalHpEffect extends AbstractStatEffect { private final int _hpPercent; + private final AtomicBoolean _actived = new AtomicBoolean(); + private final AtomicBoolean _updated = new AtomicBoolean(); protected AbstractConditionalHpEffect(StatsSet params, Stats stat) { super(params, stat); - _hpPercent = params.getInt("hpPercent", -1); + _hpPercent = params.getInt("hpPercent", 0); + } + + @Override + public void onStart(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + // Register listeners + if ((_hpPercent > 0) && !_actived.get()) + { + _actived.set(true); + _updated.set(canPump(effector, effected, skill)); + final ListenersContainer container = effected; + container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); + } + } + + @Override + public void onExit(L2Character effector, L2Character effected, Skill skill) + { + // Augmentation option + if (skill == null) + { + return; + } + + effected.removeListenerIf(listener -> listener.getOwner() == this); + _actived.set(false); } @Override public boolean canPump(L2Character effector, L2Character effected, Skill skill) { - return ((_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent)); + return (_hpPercent <= 0) || (effected.getCurrentHpPercent() <= _hpPercent); + } + + private void onHpChange(OnCreatureHpChange event) + { + final L2Character activeChar = event.getCreature(); + if (canPump(null, activeChar, null)) + { + if (_updated.get()) + { + _updated.set(false); + activeChar.getStat().recalculateStats(true); + } + } + else if (!_updated.get()) + { + _updated.set(true); + activeChar.getStat().recalculateStats(true); + } } } \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/stats/skills/00200-00299.xml b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/stats/skills/00200-00299.xml index 53f50a9b88..1974f68a2d 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/stats/skills/00200-00299.xml +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/stats/skills/00200-00299.xml @@ -6970,6 +6970,7 @@ 129.3 DIFF + 30 diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java index f1d5b120e9..5b21d2c0a5 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/actor/status/CharStatus.java @@ -19,7 +19,6 @@ package com.l2jmobius.gameserver.model.actor.status; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; import com.l2jmobius.commons.concurrent.ThreadPool; @@ -51,8 +50,6 @@ public class CharStatus private static final byte REGEN_FLAG_HP = 1; private static final byte REGEN_FLAG_MP = 2; - private final AtomicInteger _previousHpPercent = new AtomicInteger(); - public CharStatus(L2Character activeChar) { _activeChar = activeChar; @@ -175,10 +172,7 @@ public class CharStatus if (value > 0) { - final double oldHp = _currentHp; - final double newHp = Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0); - setCurrentHp(newHp); - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(activeChar, oldHp, newHp), activeChar); + setCurrentHp(Math.max(_currentHp - value, activeChar.isUndying() ? 1 : 0)); } if ((activeChar.getCurrentHp() < 0.5)) // Die @@ -247,7 +241,6 @@ public class CharStatus // place holder, only PcStatus has CP public void setCurrentCp(double newCp, boolean broadcastPacket) { - } public final double getCurrentHp() @@ -269,7 +262,7 @@ public class CharStatus public boolean setCurrentHp(double newHp, boolean broadcastPacket) { // Get the Max HP of the L2Character - final int currentHp = (int) _currentHp; + final int oldHp = (int) _currentHp; final double maxHp = _activeChar.getStat().getMaxHp(); synchronized (this) @@ -302,30 +295,16 @@ public class CharStatus } } - final boolean hpWasChanged = currentHp != _currentHp; + final boolean hpWasChanged = oldHp != _currentHp; // Send the Server->Client packet StatusUpdate with current HP and MP to all other L2PcInstance to inform if (hpWasChanged) { - final int lastHpPercent = _previousHpPercent.get(); - final int currentHpPercent = (int) ((_currentHp * 100) / maxHp); - //@formatter:off - if (((lastHpPercent >= 60) && (currentHpPercent <= 60)) - || ((currentHpPercent >= 60) && (lastHpPercent <= 60)) - || ((lastHpPercent >= 30) && (currentHpPercent <= 30)) - || ((currentHpPercent >= 30) && (lastHpPercent <= 30))) - //@formatter:on - { - if (_previousHpPercent.compareAndSet(lastHpPercent, currentHpPercent)) - { - _activeChar.getStat().recalculateStats(broadcastPacket); - } - } - if (broadcastPacket) { _activeChar.broadcastStatusUpdate(); } + EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, _currentHp), getActiveChar()); } return hpWasChanged; diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java index 8f7427e7cc..3ba3aa818b 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/actor/status/PcStatus.java @@ -26,8 +26,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.stat.PcStat; import com.l2jmobius.gameserver.model.effects.EffectFlag; import com.l2jmobius.gameserver.model.entity.Duel; -import com.l2jmobius.gameserver.model.events.EventDispatcher; -import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureHpChange; import com.l2jmobius.gameserver.model.skills.AbnormalType; import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.model.stats.Stats; @@ -272,7 +270,6 @@ public class PcStatus extends PlayableStatus if (value > 0) { - final double oldHp = getCurrentHp(); double newHp = Math.max(getCurrentHp() - value, getActiveChar().isUndying() ? 1 : 0); if (newHp <= 0) { @@ -295,8 +292,6 @@ public class PcStatus extends PlayableStatus } } setCurrentHp(newHp); - - EventDispatcher.getInstance().notifyEventAsync(new OnCreatureHpChange(getActiveChar(), oldHp, newHp), getActiveChar()); } if ((getActiveChar().getCurrentHp() < 0.5) && !isHPConsumption && !getActiveChar().isUndying())