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())