Use listeners for abstract conditional hp effect.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@@ -6970,6 +6970,7 @@
|
||||
<value level="14">129.3</value>
|
||||
</amount>
|
||||
<mode>DIFF</mode>
|
||||
<hpPercent>30</hpPercent>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
|
Reference in New Issue
Block a user