Use listeners for abstract conditional hp effect.

This commit is contained in:
MobiusDev
2018-11-25 22:07:51 +00:00
parent b702b56954
commit 16ac14976f
40 changed files with 660 additions and 330 deletions

View File

@@ -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);
}
}
}

View File

@@ -6290,6 +6290,7 @@
<value level="14">129.3</value>
</amount>
<mode>DIFF</mode>
<hpPercent>30</hpPercent>
</effect>
</effects>
</skill>