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)