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
	 MobiusDev
					MobiusDev