Use a Map to store AbstractConditionalHpEffect character updates.

This commit is contained in:
MobiusDev 2018-11-26 14:46:41 +00:00
parent 7d861fe649
commit 51205e38a1
10 changed files with 110 additions and 100 deletions

View File

@ -16,6 +16,8 @@
*/ */
package handlers.effecthandlers; package handlers.effecthandlers;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.StatsSet;
@ -33,8 +35,7 @@ import com.l2jmobius.gameserver.model.stats.Stats;
abstract class AbstractConditionalHpEffect extends AbstractStatEffect abstract class AbstractConditionalHpEffect extends AbstractStatEffect
{ {
private final int _hpPercent; private final int _hpPercent;
private final AtomicBoolean _active = new AtomicBoolean(); private final Map<L2Character, AtomicBoolean> _updates = new ConcurrentHashMap<>();
private final AtomicBoolean _update = new AtomicBoolean();
protected AbstractConditionalHpEffect(StatsSet params, Stats stat) protected AbstractConditionalHpEffect(StatsSet params, Stats stat)
{ {
@ -52,10 +53,9 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
// Register listeners // Register listeners
if ((_hpPercent > 0) && !_active.get()) if ((_hpPercent > 0) && !_updates.containsKey(effected))
{ {
_active.set(true); _updates.put(effected, new AtomicBoolean(canPump(effector, effected, skill)));
_update.set(canPump(effector, effected, skill));
final ListenersContainer container = effected; final ListenersContainer container = effected;
container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this));
} }
@ -71,7 +71,7 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
effected.removeListenerIf(listener -> listener.getOwner() == this); effected.removeListenerIf(listener -> listener.getOwner() == this);
_active.set(false); _updates.remove(effected);
} }
@Override @Override
@ -83,17 +83,18 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
private void onHpChange(OnCreatureHpChange event) private void onHpChange(OnCreatureHpChange event)
{ {
final L2Character activeChar = event.getCreature(); final L2Character activeChar = event.getCreature();
final AtomicBoolean update = _updates.get(activeChar);
if (canPump(null, activeChar, null)) if (canPump(null, activeChar, null))
{ {
if (_update.get()) if (update.get())
{ {
_update.set(false); update.set(false);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }
else if (!_update.get()) else if (!update.get())
{ {
_update.set(true); update.set(true);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }

View File

@ -16,6 +16,8 @@
*/ */
package handlers.effecthandlers; package handlers.effecthandlers;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.StatsSet;
@ -33,8 +35,7 @@ import com.l2jmobius.gameserver.model.stats.Stats;
abstract class AbstractConditionalHpEffect extends AbstractStatEffect abstract class AbstractConditionalHpEffect extends AbstractStatEffect
{ {
private final int _hpPercent; private final int _hpPercent;
private final AtomicBoolean _active = new AtomicBoolean(); private final Map<L2Character, AtomicBoolean> _updates = new ConcurrentHashMap<>();
private final AtomicBoolean _update = new AtomicBoolean();
protected AbstractConditionalHpEffect(StatsSet params, Stats stat) protected AbstractConditionalHpEffect(StatsSet params, Stats stat)
{ {
@ -52,10 +53,9 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
// Register listeners // Register listeners
if ((_hpPercent > 0) && !_active.get()) if ((_hpPercent > 0) && !_updates.containsKey(effected))
{ {
_active.set(true); _updates.put(effected, new AtomicBoolean(canPump(effector, effected, skill)));
_update.set(canPump(effector, effected, skill));
final ListenersContainer container = effected; final ListenersContainer container = effected;
container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this));
} }
@ -71,7 +71,7 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
effected.removeListenerIf(listener -> listener.getOwner() == this); effected.removeListenerIf(listener -> listener.getOwner() == this);
_active.set(false); _updates.remove(effected);
} }
@Override @Override
@ -83,17 +83,18 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
private void onHpChange(OnCreatureHpChange event) private void onHpChange(OnCreatureHpChange event)
{ {
final L2Character activeChar = event.getCreature(); final L2Character activeChar = event.getCreature();
final AtomicBoolean update = _updates.get(activeChar);
if (canPump(null, activeChar, null)) if (canPump(null, activeChar, null))
{ {
if (_update.get()) if (update.get())
{ {
_update.set(false); update.set(false);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }
else if (!_update.get()) else if (!update.get())
{ {
_update.set(true); update.set(true);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }

View File

@ -16,6 +16,8 @@
*/ */
package handlers.effecthandlers; package handlers.effecthandlers;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.StatsSet;
@ -33,8 +35,7 @@ import com.l2jmobius.gameserver.model.stats.Stats;
abstract class AbstractConditionalHpEffect extends AbstractStatEffect abstract class AbstractConditionalHpEffect extends AbstractStatEffect
{ {
private final int _hpPercent; private final int _hpPercent;
private final AtomicBoolean _active = new AtomicBoolean(); private final Map<L2Character, AtomicBoolean> _updates = new ConcurrentHashMap<>();
private final AtomicBoolean _update = new AtomicBoolean();
protected AbstractConditionalHpEffect(StatsSet params, Stats stat) protected AbstractConditionalHpEffect(StatsSet params, Stats stat)
{ {
@ -52,10 +53,9 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
// Register listeners // Register listeners
if ((_hpPercent > 0) && !_active.get()) if ((_hpPercent > 0) && !_updates.containsKey(effected))
{ {
_active.set(true); _updates.put(effected, new AtomicBoolean(canPump(effector, effected, skill)));
_update.set(canPump(effector, effected, skill));
final ListenersContainer container = effected; final ListenersContainer container = effected;
container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this));
} }
@ -71,7 +71,7 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
effected.removeListenerIf(listener -> listener.getOwner() == this); effected.removeListenerIf(listener -> listener.getOwner() == this);
_active.set(false); _updates.remove(effected);
} }
@Override @Override
@ -83,17 +83,18 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
private void onHpChange(OnCreatureHpChange event) private void onHpChange(OnCreatureHpChange event)
{ {
final L2Character activeChar = event.getCreature(); final L2Character activeChar = event.getCreature();
final AtomicBoolean update = _updates.get(activeChar);
if (canPump(null, activeChar, null)) if (canPump(null, activeChar, null))
{ {
if (_update.get()) if (update.get())
{ {
_update.set(false); update.set(false);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }
else if (!_update.get()) else if (!update.get())
{ {
_update.set(true); update.set(true);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }

View File

@ -16,6 +16,8 @@
*/ */
package handlers.effecthandlers; package handlers.effecthandlers;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.StatsSet;
@ -33,8 +35,7 @@ import com.l2jmobius.gameserver.model.stats.Stats;
abstract class AbstractConditionalHpEffect extends AbstractStatEffect abstract class AbstractConditionalHpEffect extends AbstractStatEffect
{ {
private final int _hpPercent; private final int _hpPercent;
private final AtomicBoolean _active = new AtomicBoolean(); private final Map<L2Character, AtomicBoolean> _updates = new ConcurrentHashMap<>();
private final AtomicBoolean _update = new AtomicBoolean();
protected AbstractConditionalHpEffect(StatsSet params, Stats stat) protected AbstractConditionalHpEffect(StatsSet params, Stats stat)
{ {
@ -52,10 +53,9 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
// Register listeners // Register listeners
if ((_hpPercent > 0) && !_active.get()) if ((_hpPercent > 0) && !_updates.containsKey(effected))
{ {
_active.set(true); _updates.put(effected, new AtomicBoolean(canPump(effector, effected, skill)));
_update.set(canPump(effector, effected, skill));
final ListenersContainer container = effected; final ListenersContainer container = effected;
container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this));
} }
@ -71,7 +71,7 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
effected.removeListenerIf(listener -> listener.getOwner() == this); effected.removeListenerIf(listener -> listener.getOwner() == this);
_active.set(false); _updates.remove(effected);
} }
@Override @Override
@ -83,17 +83,18 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
private void onHpChange(OnCreatureHpChange event) private void onHpChange(OnCreatureHpChange event)
{ {
final L2Character activeChar = event.getCreature(); final L2Character activeChar = event.getCreature();
final AtomicBoolean update = _updates.get(activeChar);
if (canPump(null, activeChar, null)) if (canPump(null, activeChar, null))
{ {
if (_update.get()) if (update.get())
{ {
_update.set(false); update.set(false);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }
else if (!_update.get()) else if (!update.get())
{ {
_update.set(true); update.set(true);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }

View File

@ -16,6 +16,8 @@
*/ */
package handlers.effecthandlers; package handlers.effecthandlers;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.StatsSet;
@ -33,8 +35,7 @@ import com.l2jmobius.gameserver.model.stats.Stats;
abstract class AbstractConditionalHpEffect extends AbstractStatEffect abstract class AbstractConditionalHpEffect extends AbstractStatEffect
{ {
private final int _hpPercent; private final int _hpPercent;
private final AtomicBoolean _active = new AtomicBoolean(); private final Map<L2Character, AtomicBoolean> _updates = new ConcurrentHashMap<>();
private final AtomicBoolean _update = new AtomicBoolean();
protected AbstractConditionalHpEffect(StatsSet params, Stats stat) protected AbstractConditionalHpEffect(StatsSet params, Stats stat)
{ {
@ -52,10 +53,9 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
// Register listeners // Register listeners
if ((_hpPercent > 0) && !_active.get()) if ((_hpPercent > 0) && !_updates.containsKey(effected))
{ {
_active.set(true); _updates.put(effected, new AtomicBoolean(canPump(effector, effected, skill)));
_update.set(canPump(effector, effected, skill));
final ListenersContainer container = effected; final ListenersContainer container = effected;
container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this));
} }
@ -71,7 +71,7 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
effected.removeListenerIf(listener -> listener.getOwner() == this); effected.removeListenerIf(listener -> listener.getOwner() == this);
_active.set(false); _updates.remove(effected);
} }
@Override @Override
@ -83,17 +83,18 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
private void onHpChange(OnCreatureHpChange event) private void onHpChange(OnCreatureHpChange event)
{ {
final L2Character activeChar = event.getCreature(); final L2Character activeChar = event.getCreature();
final AtomicBoolean update = _updates.get(activeChar);
if (canPump(null, activeChar, null)) if (canPump(null, activeChar, null))
{ {
if (_update.get()) if (update.get())
{ {
_update.set(false); update.set(false);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }
else if (!_update.get()) else if (!update.get())
{ {
_update.set(true); update.set(true);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }

View File

@ -16,6 +16,8 @@
*/ */
package handlers.effecthandlers; package handlers.effecthandlers;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.StatsSet;
@ -33,8 +35,7 @@ import com.l2jmobius.gameserver.model.stats.Stats;
abstract class AbstractConditionalHpEffect extends AbstractStatEffect abstract class AbstractConditionalHpEffect extends AbstractStatEffect
{ {
private final int _hpPercent; private final int _hpPercent;
private final AtomicBoolean _active = new AtomicBoolean(); private final Map<L2Character, AtomicBoolean> _updates = new ConcurrentHashMap<>();
private final AtomicBoolean _update = new AtomicBoolean();
protected AbstractConditionalHpEffect(StatsSet params, Stats stat) protected AbstractConditionalHpEffect(StatsSet params, Stats stat)
{ {
@ -52,10 +53,9 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
// Register listeners // Register listeners
if ((_hpPercent > 0) && !_active.get()) if ((_hpPercent > 0) && !_updates.containsKey(effected))
{ {
_active.set(true); _updates.put(effected, new AtomicBoolean(canPump(effector, effected, skill)));
_update.set(canPump(effector, effected, skill));
final ListenersContainer container = effected; final ListenersContainer container = effected;
container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this));
} }
@ -71,7 +71,7 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
effected.removeListenerIf(listener -> listener.getOwner() == this); effected.removeListenerIf(listener -> listener.getOwner() == this);
_active.set(false); _updates.remove(effected);
} }
@Override @Override
@ -83,17 +83,18 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
private void onHpChange(OnCreatureHpChange event) private void onHpChange(OnCreatureHpChange event)
{ {
final L2Character activeChar = event.getCreature(); final L2Character activeChar = event.getCreature();
final AtomicBoolean update = _updates.get(activeChar);
if (canPump(null, activeChar, null)) if (canPump(null, activeChar, null))
{ {
if (_update.get()) if (update.get())
{ {
_update.set(false); update.set(false);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }
else if (!_update.get()) else if (!update.get())
{ {
_update.set(true); update.set(true);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }

View File

@ -16,6 +16,8 @@
*/ */
package handlers.effecthandlers; package handlers.effecthandlers;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.StatsSet;
@ -33,8 +35,7 @@ import com.l2jmobius.gameserver.model.stats.Stats;
abstract class AbstractConditionalHpEffect extends AbstractStatEffect abstract class AbstractConditionalHpEffect extends AbstractStatEffect
{ {
private final int _hpPercent; private final int _hpPercent;
private final AtomicBoolean _active = new AtomicBoolean(); private final Map<L2Character, AtomicBoolean> _updates = new ConcurrentHashMap<>();
private final AtomicBoolean _update = new AtomicBoolean();
protected AbstractConditionalHpEffect(StatsSet params, Stats stat) protected AbstractConditionalHpEffect(StatsSet params, Stats stat)
{ {
@ -52,10 +53,9 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
// Register listeners // Register listeners
if ((_hpPercent > 0) && !_active.get()) if ((_hpPercent > 0) && !_updates.containsKey(effected))
{ {
_active.set(true); _updates.put(effected, new AtomicBoolean(canPump(effector, effected, skill)));
_update.set(canPump(effector, effected, skill));
final ListenersContainer container = effected; final ListenersContainer container = effected;
container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this));
} }
@ -71,7 +71,7 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
effected.removeListenerIf(listener -> listener.getOwner() == this); effected.removeListenerIf(listener -> listener.getOwner() == this);
_active.set(false); _updates.remove(effected);
} }
@Override @Override
@ -83,17 +83,18 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
private void onHpChange(OnCreatureHpChange event) private void onHpChange(OnCreatureHpChange event)
{ {
final L2Character activeChar = event.getCreature(); final L2Character activeChar = event.getCreature();
final AtomicBoolean update = _updates.get(activeChar);
if (canPump(null, activeChar, null)) if (canPump(null, activeChar, null))
{ {
if (_update.get()) if (update.get())
{ {
_update.set(false); update.set(false);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }
else if (!_update.get()) else if (!update.get())
{ {
_update.set(true); update.set(true);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }

View File

@ -16,6 +16,8 @@
*/ */
package handlers.effecthandlers; package handlers.effecthandlers;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.StatsSet;
@ -33,8 +35,7 @@ import com.l2jmobius.gameserver.model.stats.Stats;
abstract class AbstractConditionalHpEffect extends AbstractStatEffect abstract class AbstractConditionalHpEffect extends AbstractStatEffect
{ {
private final int _hpPercent; private final int _hpPercent;
private final AtomicBoolean _active = new AtomicBoolean(); private final Map<L2Character, AtomicBoolean> _updates = new ConcurrentHashMap<>();
private final AtomicBoolean _update = new AtomicBoolean();
protected AbstractConditionalHpEffect(StatsSet params, Stats stat) protected AbstractConditionalHpEffect(StatsSet params, Stats stat)
{ {
@ -52,10 +53,9 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
// Register listeners // Register listeners
if ((_hpPercent > 0) && !_active.get()) if ((_hpPercent > 0) && !_updates.containsKey(effected))
{ {
_active.set(true); _updates.put(effected, new AtomicBoolean(canPump(effector, effected, skill)));
_update.set(canPump(effector, effected, skill));
final ListenersContainer container = effected; final ListenersContainer container = effected;
container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this));
} }
@ -71,7 +71,7 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
effected.removeListenerIf(listener -> listener.getOwner() == this); effected.removeListenerIf(listener -> listener.getOwner() == this);
_active.set(false); _updates.remove(effected);
} }
@Override @Override
@ -83,17 +83,18 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
private void onHpChange(OnCreatureHpChange event) private void onHpChange(OnCreatureHpChange event)
{ {
final L2Character activeChar = event.getCreature(); final L2Character activeChar = event.getCreature();
final AtomicBoolean update = _updates.get(activeChar);
if (canPump(null, activeChar, null)) if (canPump(null, activeChar, null))
{ {
if (_update.get()) if (update.get())
{ {
_update.set(false); update.set(false);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }
else if (!_update.get()) else if (!update.get())
{ {
_update.set(true); update.set(true);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }

View File

@ -16,6 +16,8 @@
*/ */
package handlers.effecthandlers; package handlers.effecthandlers;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.StatsSet;
@ -33,8 +35,7 @@ import com.l2jmobius.gameserver.model.stats.Stats;
abstract class AbstractConditionalHpEffect extends AbstractStatEffect abstract class AbstractConditionalHpEffect extends AbstractStatEffect
{ {
private final int _hpPercent; private final int _hpPercent;
private final AtomicBoolean _active = new AtomicBoolean(); private final Map<L2Character, AtomicBoolean> _updates = new ConcurrentHashMap<>();
private final AtomicBoolean _update = new AtomicBoolean();
protected AbstractConditionalHpEffect(StatsSet params, Stats stat) protected AbstractConditionalHpEffect(StatsSet params, Stats stat)
{ {
@ -52,10 +53,9 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
// Register listeners // Register listeners
if ((_hpPercent > 0) && !_active.get()) if ((_hpPercent > 0) && !_updates.containsKey(effected))
{ {
_active.set(true); _updates.put(effected, new AtomicBoolean(canPump(effector, effected, skill)));
_update.set(canPump(effector, effected, skill));
final ListenersContainer container = effected; final ListenersContainer container = effected;
container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this));
} }
@ -71,7 +71,7 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
effected.removeListenerIf(listener -> listener.getOwner() == this); effected.removeListenerIf(listener -> listener.getOwner() == this);
_active.set(false); _updates.remove(effected);
} }
@Override @Override
@ -83,17 +83,18 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
private void onHpChange(OnCreatureHpChange event) private void onHpChange(OnCreatureHpChange event)
{ {
final L2Character activeChar = event.getCreature(); final L2Character activeChar = event.getCreature();
final AtomicBoolean update = _updates.get(activeChar);
if (canPump(null, activeChar, null)) if (canPump(null, activeChar, null))
{ {
if (_update.get()) if (update.get())
{ {
_update.set(false); update.set(false);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }
else if (!_update.get()) else if (!update.get())
{ {
_update.set(true); update.set(true);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }

View File

@ -16,6 +16,8 @@
*/ */
package handlers.effecthandlers; package handlers.effecthandlers;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.StatsSet;
@ -33,8 +35,7 @@ import com.l2jmobius.gameserver.model.stats.Stats;
abstract class AbstractConditionalHpEffect extends AbstractStatEffect abstract class AbstractConditionalHpEffect extends AbstractStatEffect
{ {
private final int _hpPercent; private final int _hpPercent;
private final AtomicBoolean _active = new AtomicBoolean(); private final Map<L2Character, AtomicBoolean> _updates = new ConcurrentHashMap<>();
private final AtomicBoolean _update = new AtomicBoolean();
protected AbstractConditionalHpEffect(StatsSet params, Stats stat) protected AbstractConditionalHpEffect(StatsSet params, Stats stat)
{ {
@ -52,10 +53,9 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
// Register listeners // Register listeners
if ((_hpPercent > 0) && !_active.get()) if ((_hpPercent > 0) && !_updates.containsKey(effected))
{ {
_active.set(true); _updates.put(effected, new AtomicBoolean(canPump(effector, effected, skill)));
_update.set(canPump(effector, effected, skill));
final ListenersContainer container = effected; final ListenersContainer container = effected;
container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this)); container.addListener(new ConsumerEventListener(container, EventType.ON_CREATURE_HP_CHANGE, (OnCreatureHpChange event) -> onHpChange(event), this));
} }
@ -71,7 +71,7 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
} }
effected.removeListenerIf(listener -> listener.getOwner() == this); effected.removeListenerIf(listener -> listener.getOwner() == this);
_active.set(false); _updates.remove(effected);
} }
@Override @Override
@ -83,17 +83,18 @@ abstract class AbstractConditionalHpEffect extends AbstractStatEffect
private void onHpChange(OnCreatureHpChange event) private void onHpChange(OnCreatureHpChange event)
{ {
final L2Character activeChar = event.getCreature(); final L2Character activeChar = event.getCreature();
final AtomicBoolean update = _updates.get(activeChar);
if (canPump(null, activeChar, null)) if (canPump(null, activeChar, null))
{ {
if (_update.get()) if (update.get())
{ {
_update.set(false); update.set(false);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }
else if (!_update.get()) else if (!update.get())
{ {
_update.set(true); update.set(true);
activeChar.getStat().recalculateStats(true); activeChar.getStat().recalculateStats(true);
} }
} }