From b6a2d1d2e0ba24b00ab92cb2434fd29d5e0038e7 Mon Sep 17 00:00:00 2001 From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com> Date: Sat, 18 Dec 2021 23:51:42 +0000 Subject: [PATCH] Addition of ReuseSkillByDamageId effect. Contributed by nasseka. --- .../scripts/handlers/EffectMasterHandler.java | 1 + .../effecthandlers/ReuseSkillByDamageId.java | 129 ++++++++++++++++++ .../game/data/stats/skills/30900-30999.xml | 50 ++++--- .../game/data/stats/skills/documentation.txt | 1 + .../scripts/handlers/EffectMasterHandler.java | 1 + .../effecthandlers/ReuseSkillByDamageId.java | 129 ++++++++++++++++++ .../game/data/stats/skills/documentation.txt | 1 + 7 files changed, 293 insertions(+), 19 deletions(-) create mode 100644 L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ReuseSkillByDamageId.java create mode 100644 L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/ReuseSkillByDamageId.java diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/EffectMasterHandler.java index a766823722..046cc65905 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -314,6 +314,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); diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ReuseSkillByDamageId.java b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ReuseSkillByDamageId.java new file mode 100644 index 0000000000..6b63080adb --- /dev/null +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ReuseSkillByDamageId.java @@ -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 . + */ +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)); + } +} diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/stats/skills/30900-30999.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/stats/skills/30900-30999.xml index 7d5314ae21..e5862b5c04 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/stats/skills/30900-30999.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/stats/skills/30900-30999.xml @@ -1040,6 +1040,18 @@ 500 + + 30963 + 70 + + + 30964 + 70 + + + 30965 + 70 + @@ -2616,25 +2628,25 @@ A1 - icon.skill0000 - A2 - NONE - 5 - 1 - 5 - SELF - SINGLE - - - 100 - PER - - - 100 - PER - - - + icon.skill0000 + A2 + NONE + 5 + 1 + 5 + SELF + SINGLE + + + 20 + PER + + + 20 + PER + + + icon.skill0000 diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_10.0_MasterClass/dist/game/data/stats/skills/documentation.txt index 294a95eb2c..5a240a3185 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/stats/skills/documentation.txt @@ -281,6 +281,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) diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/EffectMasterHandler.java index be4a5e8e2c..9cb4bc8819 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -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); diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/ReuseSkillByDamageId.java b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/ReuseSkillByDamageId.java new file mode 100644 index 0000000000..6b63080adb --- /dev/null +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/ReuseSkillByDamageId.java @@ -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 . + */ +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)); + } +} diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/stats/skills/documentation.txt index 9eb9cd7c15..b4988437ce 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/stats/skills/documentation.txt @@ -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)