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);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -6318,6 +6318,7 @@
 | 
			
		||||
					<value level="14">129.3</value>
 | 
			
		||||
				</amount>
 | 
			
		||||
				<mode>DIFF</mode>
 | 
			
		||||
				<hpPercent>30</hpPercent>
 | 
			
		||||
			</effect>
 | 
			
		||||
		</effects>
 | 
			
		||||
	</skill>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user