Addition of ReuseSkillByDamageId effect.

Contributed by nasseka.
This commit is contained in:
MobiusDevelopment
2021-12-18 23:51:42 +00:00
parent 8855931d54
commit b6a2d1d2e0
7 changed files with 293 additions and 19 deletions

View File

@@ -311,6 +311,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Resurrection", Resurrection::new);
EffectHandler.getInstance().registerHandler("ResurrectionSpecial", ResurrectionSpecial::new);
EffectHandler.getInstance().registerHandler("Reuse", Reuse::new);
EffectHandler.getInstance().registerHandler("ReuseSkillByDamageId", ReuseSkillByDamageId::new);
EffectHandler.getInstance().registerHandler("ReuseSkillById", ReuseSkillById::new);
EffectHandler.getInstance().registerHandler("Root", Root::new);
EffectHandler.getInstance().registerHandler("SacrificeSummon", SacrificeSummon::new);

View File

@@ -0,0 +1,129 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package handlers.effecthandlers;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.effects.AbstractEffect;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDamageReceived;
import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.serverpackets.SkillCoolTime;
/**
* @author NasSeKa
*/
public class ReuseSkillByDamageId extends AbstractEffect
{
private final int _minAttackerLevel;
private final int _maxAttackerLevel;
private final int _minDamage;
private final int _chance;
private final int _hpPercent;
private final int _skillId;
private final int _amount;
private final InstanceType _attackerType;
public ReuseSkillByDamageId(StatSet params)
{
_minAttackerLevel = params.getInt("minAttackerLevel", 1);
_maxAttackerLevel = params.getInt("maxAttackerLevel", Integer.MAX_VALUE);
_minDamage = params.getInt("minDamage", 1);
_chance = params.getInt("chance", 100);
_hpPercent = params.getInt("hpPercent", 100);
_skillId = params.getInt("skillId", 0);
_amount = params.getInt("amount", 0);
_attackerType = params.getEnum("attackerType", InstanceType.class, InstanceType.Creature);
}
private void onDamageReceivedEvent(OnCreatureDamageReceived event)
{
if (event.isDamageOverTime() || (_chance == 0))
{
return;
}
if (event.getAttacker() == event.getTarget())
{
return;
}
if ((event.getAttacker().getLevel() < _minAttackerLevel) || (event.getAttacker().getLevel() > _maxAttackerLevel))
{
return;
}
if (event.getDamage() < _minDamage)
{
return;
}
if ((_chance < 100) && (Rnd.get(100) > _chance))
{
return;
}
if ((_hpPercent < 100) && (event.getAttacker().getCurrentHpPercent() > _hpPercent))
{
return;
}
if (!event.getAttacker().getInstanceType().isType(_attackerType))
{
return;
}
final Player player = (Player) event.getTarget();
final Skill s = player.getKnownSkill(_skillId);
if (s != null)
{
if (_amount > 0)
{
final long reuse = player.getSkillRemainingReuseTime(s.getReuseHashCode());
if (reuse > 0)
{
player.removeTimeStamp(s);
player.addTimeStamp(s, Math.max(0, reuse - _amount));
player.sendPacket(new SkillCoolTime(player));
}
}
else
{
player.removeTimeStamp(s);
player.enableSkill(s);
player.sendPacket(new SkillCoolTime(player));
}
}
}
@Override
public void onExit(Creature effector, Creature effected, Skill skill)
{
effected.removeListenerIf(EventType.ON_CREATURE_DAMAGE_RECEIVED, listener -> listener.getOwner() == this);
}
@Override
public void onStart(Creature effector, Creature effected, Skill skill, Item item)
{
effected.addListener(new ConsumerEventListener(effected, EventType.ON_CREATURE_DAMAGE_RECEIVED, (OnCreatureDamageReceived event) -> onDamageReceivedEvent(event), this));
}
}

View File

@@ -279,6 +279,7 @@ RestorationRandom: Creates items randomly from a specified list. Its multiplied
Resurrection: Resurrects target Player or Summon.
ResurrectionSpecial: Resurrects target Player or Summon only in specified instance IDs.
Reuse: Decreases skill reuse time based on its magic type.
ReuseSkillByDamageId: Resets reuse time for the skill with the specific damage id. (l2jmobius)
ReuseSkillById: Resets reuse time for the skill with the specific id. (l2jmobius)
Root: Stops movement.
SacrificeSummon: Sacrifices the players summon. (l2jmobius)