diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/EffectMasterHandler.java
index b32ec97a5e..3c6cbb4bca 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -185,6 +185,7 @@ public final class EffectMasterHandler
EffectHandler.getInstance().registerHandler("LimitCp", LimitCp::new);
EffectHandler.getInstance().registerHandler("LimitHp", LimitHp::new);
EffectHandler.getInstance().registerHandler("LimitMp", LimitMp::new);
+ EffectHandler.getInstance().registerHandler("LimitSkill", LimitSkill::new);
EffectHandler.getInstance().registerHandler("Lucky", Lucky::new);
EffectHandler.getInstance().registerHandler("MagicAccuracy", MagicAccuracy::new);
EffectHandler.getInstance().registerHandler("MagicalAbnormalDispelAttack", MagicalAbnormalDispelAttack::new);
@@ -340,6 +341,7 @@ public final class EffectMasterHandler
EffectHandler.getInstance().registerHandler("TeleportToPlayer", TeleportToPlayer::new);
EffectHandler.getInstance().registerHandler("TeleportToSummon", TeleportToSummon::new);
EffectHandler.getInstance().registerHandler("TeleportToTarget", TeleportToTarget::new);
+ EffectHandler.getInstance().registerHandler("TrackLimitedSkill", TrackLimitedSkill::new);
EffectHandler.getInstance().registerHandler("FlyAway", FlyAway::new);
EffectHandler.getInstance().registerHandler("TransferDamageToPlayer", TransferDamageToPlayer::new);
EffectHandler.getInstance().registerHandler("TransferDamageToSummon", TransferDamageToSummon::new);
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/LimitSkill.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/LimitSkill.java
new file mode 100644
index 0000000000..9f17aeaa5d
--- /dev/null
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/LimitSkill.java
@@ -0,0 +1,132 @@
+/*
+ * 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 com.l2jmobius.gameserver.model.StatsSet;
+import com.l2jmobius.gameserver.model.actor.L2Character;
+import com.l2jmobius.gameserver.model.effects.AbstractEffect;
+import com.l2jmobius.gameserver.model.skills.BuffInfo;
+import com.l2jmobius.gameserver.model.skills.Skill;
+
+/**
+ * @author Ofelin
+ */
+public class LimitSkill extends AbstractEffect
+{
+ private final static int LIMIT_OF_AEORE = 11833;
+ private final static int LIMIT_OF_SIGEL = 19526;
+ private final static int LIMIT_OF_ISS = 19527;
+ private final static int BATTLE_RAPSODY = 11544;
+ private final static int OVERLORDS_DIGNITY = 19439;
+ private final static int PROTECTION_OF_FATE = 10019;
+ private final static int NINE_AEGIS = 10024;
+ private final static int CELESTIAL_PROTECTION = 11758;
+ private final static int CELESTIAL_PARTY_PROTECTION = 11759;
+
+ public LimitSkill(StatsSet params)
+ {
+ }
+
+ @Override
+ public void onStart(L2Character effector, L2Character effected, Skill skill)
+ {
+ switch (skill.getId())
+ {
+ case LIMIT_OF_AEORE: // Limit of Aeore
+ {
+ decreaseAeoreBuffDuration(effector, effected, skill);
+ break;
+ }
+ case LIMIT_OF_SIGEL: // Limit of Sigel
+ {
+ decreaseSigelBuffDuration(effector, effected, skill);
+ break;
+ }
+ case LIMIT_OF_ISS: // Limit of Iss
+ {
+ decreaseIssBuffDuration(effector, effected, skill);
+ break;
+ }
+ }
+ }
+
+ private void decreaseAeoreBuffDuration(L2Character effector, L2Character effected, Skill skill)
+ {
+ switch (skill.getLevel())
+ {
+ case 1:
+ case 2:
+ {
+ modifyDuration(CELESTIAL_PROTECTION, effected, (int) (10 * 0.50)); // Decrease active effect of Celestial Protection by 50%
+ modifyDuration(CELESTIAL_PARTY_PROTECTION, effected, (int) (10 * 0.50)); // Decrease active effect of Celestial Party Protection by 50%
+ break;
+ }
+ }
+ }
+
+ private void decreaseSigelBuffDuration(L2Character effector, L2Character effected, Skill skill)
+ {
+ switch (skill.getLevel())
+ {
+ case 1:
+ {
+ modifyDuration(PROTECTION_OF_FATE, effected, (int) (30 * 0.80)); // Decrease active effect of Protection of Fate by 20%
+ modifyDuration(NINE_AEGIS, effected, (int) (30 * 0.80)); // Decrease active effect of Nine Aegis by 20%
+ break;
+ }
+ case 2:
+ {
+ modifyDuration(PROTECTION_OF_FATE, effected, (int) (30 * 0.20)); // Decrease active effect of Protection of Fate by 80%
+ modifyDuration(NINE_AEGIS, effected, (int) (30 * 0.20)); // Decrease active effect of Nine Aegis by 80%
+ break;
+ }
+ }
+ }
+
+ private void decreaseIssBuffDuration(L2Character effector, L2Character effected, Skill skill)
+ {
+ switch (skill.getLevel())
+ {
+ case 1:
+ {
+ modifyDuration(BATTLE_RAPSODY, effected, (int) (30 * 0.80)); // Decrease active effect of Battle Rhapsody by 20%
+ modifyDuration(OVERLORDS_DIGNITY, effected, (int) (30 * 0.80)); // Decrease active effect of Overlord's Dignity by 20%
+ break;
+ }
+ case 2:
+ {
+ modifyDuration(BATTLE_RAPSODY, effected, (int) (30 * 0.20)); // Decrease active effect of Battle Rhapsody by 80%
+ modifyDuration(OVERLORDS_DIGNITY, effected, (int) (30 * 0.20)); // Decrease active effect of Overlord's Dignity by 80%
+ break;
+ }
+ }
+ }
+
+ private void modifyDuration(int skillId, L2Character effected, int duration)
+ {
+ for (BuffInfo buff : effected.getEffectList().getEffects())
+ {
+ if (buff.getSkill().getId() == skillId)
+ {
+ if (duration > 0)
+ {
+ buff.setAbnormalTime(duration);
+ }
+ }
+ }
+ }
+}
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/TrackLimitedSkill.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/TrackLimitedSkill.java
new file mode 100644
index 0000000000..6a4e573fe1
--- /dev/null
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/TrackLimitedSkill.java
@@ -0,0 +1,170 @@
+/*
+ * 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 com.l2jmobius.gameserver.model.CharEffectList;
+import com.l2jmobius.gameserver.model.StatsSet;
+import com.l2jmobius.gameserver.model.actor.L2Character;
+import com.l2jmobius.gameserver.model.effects.AbstractEffect;
+import com.l2jmobius.gameserver.model.holders.SkillHolder;
+import com.l2jmobius.gameserver.model.skills.BuffInfo;
+import com.l2jmobius.gameserver.model.skills.Skill;
+
+/**
+ * @author Ofelin
+ */
+public class TrackLimitedSkill extends AbstractEffect
+{
+ private final static int LIMIT_OF_AEORE = 11833;
+ private final static int LIMIT_OF_SIGEL = 19526;
+ private final static int LIMIT_OF_ISS = 19527;
+ private final static int BATTLE_RAPSODY = 11544;
+ private final static int OVERLORDS_DIGNITY = 19439;
+ private final static int PROTECTION_OF_FATE = 10019;
+ private final static int NINE_AEGIS = 10024;
+ private final static int CELESTIAL_PROTECTION = 11758;
+ private final static int CELESTIAL_PARTY_PROTECTION = 11759;
+ private int limitAeoreLevel = 0;
+ private int limitSigelLevel = 0;
+ private int limitIssLevel = 0;
+
+ public TrackLimitedSkill(StatsSet param)
+ {
+ }
+
+ @Override
+ public void onStart(L2Character effector, L2Character effected, Skill skill)
+ {
+ trackAeoreLimit(effector, effected, skill, LIMIT_OF_AEORE); // Tracking Aeore Limit Debuff
+ trackSigelLimit(effector, effected, skill, LIMIT_OF_SIGEL); // Tracking Sigel Limit Debuff
+ trackIssLimit(effector, effected, skill, LIMIT_OF_ISS); // Tracking Iss Limit Debuff
+ }
+
+ @Override
+ public void onExit(L2Character effector, L2Character effected, Skill skill)
+ {
+ if ((skill.getId() == BATTLE_RAPSODY) || (skill.getId() == OVERLORDS_DIGNITY))
+ {
+ increaseLimit(effector, effected, skill, limitIssLevel);
+ }
+ else if ((skill.getId() == PROTECTION_OF_FATE) || (skill.getId() == NINE_AEGIS))
+ {
+ increaseLimit(effector, effected, skill, limitSigelLevel);
+ }
+ else if ((skill.getId() == CELESTIAL_PROTECTION) || (skill.getId() == CELESTIAL_PARTY_PROTECTION))
+ {
+ increaseLimit(effector, effected, skill, limitAeoreLevel);
+ }
+ }
+
+ private void trackAeoreLimit(L2Character effector, L2Character effected, Skill skill, int limitSkillId)
+ {
+ limitAeoreLevel = 0;
+ CharEffectList effectList = effected.getEffectList();
+ for (BuffInfo debuff : effectList.getDebuffs())
+ {
+ if (debuff.getSkill().getId() == limitSkillId)
+ {
+ limitAeoreLevel = debuff.getSkill().getLevel();
+
+ if (limitAeoreLevel == 3)
+ {
+ effected.getEffectList().remove(effectList.getBuffInfoBySkillId(CELESTIAL_PROTECTION), false, false, false); // Remove Celestial Protection
+ effected.getEffectList().remove(effectList.getBuffInfoBySkillId(CELESTIAL_PARTY_PROTECTION), false, false, false); // Remove Celestial Party Protection
+ }
+ else
+ {
+ new SkillHolder(LIMIT_OF_AEORE, limitAeoreLevel).getSkill().applyEffects(effector, effected);
+ }
+ }
+ }
+ }
+
+ private void trackSigelLimit(L2Character effector, L2Character effected, Skill skill, int limitSkillId)
+ {
+ limitSigelLevel = 0;
+ CharEffectList effectList = effected.getEffectList();
+ for (BuffInfo debuff : effectList.getDebuffs())
+ {
+ if (debuff.getSkill().getId() == limitSkillId)
+ {
+ limitSigelLevel = debuff.getSkill().getLevel();
+
+ if (limitSigelLevel == 3)
+ {
+ effected.getEffectList().remove(effectList.getBuffInfoBySkillId(PROTECTION_OF_FATE), false, false, false); // Remove Protection of Fate
+ effected.getEffectList().remove(effectList.getBuffInfoBySkillId(NINE_AEGIS), false, false, false); // Remove Nine Aegis
+ }
+ else
+ {
+ new SkillHolder(LIMIT_OF_SIGEL, limitSigelLevel).getSkill().applyEffects(effector, effected);
+ }
+ }
+ }
+ }
+
+ private void trackIssLimit(L2Character effector, L2Character effected, Skill skill, int limitSkillId)
+ {
+ limitIssLevel = 0;
+ CharEffectList effectList = effected.getEffectList();
+ for (BuffInfo debuff : effectList.getDebuffs())
+ {
+ if (debuff.getSkill().getId() == limitSkillId)
+ {
+ limitIssLevel = debuff.getSkill().getLevel();
+ if (limitIssLevel == 3)
+ {
+ effected.getEffectList().remove(effectList.getBuffInfoBySkillId(BATTLE_RAPSODY), false, false, false); // Remove Battle Rhapsody
+ effected.getEffectList().remove(effectList.getBuffInfoBySkillId(OVERLORDS_DIGNITY), false, false, false); // Remove Overlord's Dignity
+ }
+ else
+ {
+ new SkillHolder(LIMIT_OF_ISS, limitIssLevel).getSkill().applyEffects(effector, effected);
+ }
+ }
+ }
+ }
+
+ private void increaseLimit(L2Character effector, L2Character effected, Skill skill, int limitLevel)
+ {
+ if (limitLevel < 3)
+ {
+ switch (skill.getId())
+ {
+ case BATTLE_RAPSODY: // Battle Rhapsody
+ case OVERLORDS_DIGNITY: // Overlord's Dignity
+ {
+ // limitIssLevel++;
+ new SkillHolder(LIMIT_OF_ISS, ++limitIssLevel).getSkill().applyEffects(effector, effected);
+ break;
+ }
+ case PROTECTION_OF_FATE: // Protection of Fate
+ case NINE_AEGIS: // Nine Aegis
+ {
+ new SkillHolder(LIMIT_OF_SIGEL, ++limitSigelLevel).getSkill().applyEffects(effector, effected);
+ break;
+ }
+ case CELESTIAL_PROTECTION: // Celestial Protection
+ case CELESTIAL_PARTY_PROTECTION: // Celestial Party Protection
+ {
+ new SkillHolder(LIMIT_OF_AEORE, ++limitAeoreLevel).getSkill().applyEffects(effector, effected);
+ break;
+ }
+ }
+ }
+ }
+}
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/10000-10099.xml b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/10000-10099.xml
index 2a89872e2f..c224d9bb81 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/10000-10099.xml
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/10000-10099.xml
@@ -1558,6 +1558,7 @@
DIFF
+
@@ -1797,9 +1798,7 @@
-
-
-
+
2
15
@@ -1844,6 +1843,7 @@
DIFF
+
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/11500-11599.xml b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/11500-11599.xml
index 3992d8d245..67a5ed4f37 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/11500-11599.xml
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/11500-11599.xml
@@ -3148,6 +3148,7 @@
DIFF
+
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/11700-11799.xml b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/11700-11799.xml
index 2aac2542b7..cd983bb9a6 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/11700-11799.xml
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/11700-11799.xml
@@ -784,14 +784,8 @@
4504
+
-
-
-
- 11833
- 1
-
-
@@ -857,14 +851,8 @@
4504
+
-
-
-
- 11834
- 1
-
-
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/11800-11899.xml b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/11800-11899.xml
index 188e868a22..785b8520f6 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/11800-11899.xml
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/11800-11899.xml
@@ -1387,42 +1387,21 @@
-
+
- icon.skill11758
- 9
- 70
- INVINCIBILITY_SPECIAL
- A2
- 1
- 1
- true
- NONE
- NONE;STRIDER;WYVERN;WOLF
- 5
- -2
- 0
- 99
- true
+ 1
+ 60
false
- SELF
- SINGLE
+ icon.skill11833
+ true
+ A2
+ 1
+ NONE;STRIDER;WYVERN;WOLF
-
- 5
- DIFF
-
-
- 1
- DIFF
-
-
- 1
- DIFF
-
+
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/19400-19499.xml b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/19400-19499.xml
index efa403b771..cd9750c196 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/19400-19499.xml
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/19400-19499.xml
@@ -831,7 +831,7 @@
5
12
@@ -983,10 +983,61 @@
- icon.skill0000
- A1
+ icon.skill19439
+ 30
+ 1000
+ A2
+ 916
3000
- 30000
+ 500
+ 687
+ RHAPSODY
+ NONE
+ NONE
+ 5
+ 89
+ 5
+ 600000
+ SELF
+ PARTY
+ FRIEND
+
+
+ 100
+ PER
+
+
+ 100
+ PER
+
+
+ 100
+ PER
+
+
+ 100
+ PER
+
+
+
+ {0.6 + 0.4 * subIndex}
+
+ PER
+
+
+
+ {0.6 + 0.4 * subIndex}
+
+ PER
+
+
+
+ {2 * subIndex}
+
+ DIFF
+
+
+
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/19500- 19599.xml b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/19500- 19599.xml
new file mode 100644
index 0000000000..8e494b14af
--- /dev/null
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/19500- 19599.xml
@@ -0,0 +1,30 @@
+
+
+
+ 1
+ 60
+ false
+ icon.skill19526
+ true
+ A2
+ 1
+ NONE;STRIDER;WYVERN;WOLF
+
+
+
+
+
+
+ 1
+ 60
+ false
+ icon.skill19527
+ true
+ A2
+ 1
+ NONE;STRIDER;WYVERN;WOLF
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/documentation.txt
index 9879483551..66f0b5f9d5 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/documentation.txt
@@ -154,6 +154,7 @@ Lethal: Upon success sets enemy Player's CP to 1 and enemy NPC's HP to 50%.
LimitCp: Sets maximum recoverable CP through heals.
LimitHp: Sets maximum recoverable HP through heals.
LimitMp: Sets maximum recoverable MP through heals.
+LimitSkill: Limits skill duration. (l2jmobius)
Lucky: dummy effect since behavior is hardcoded
MagicAccuracy: M. Accuracy stat.
MagicalAbnormalDispelAttack: Magical attack that does damage only if it manages to dispel the given AbnormalType
@@ -308,6 +309,7 @@ TeleportToNpc: Teleports to a specified Npc Id.
TeleportToPlayer: Teleports to targeted player. (l2jmobius)
TeleportToSummon: Teleports to your summon.
TeleportToTarget: Teleports to your target.
+TrackLimitedSkill: Checks limit skill duration, see LimitSkill effect. (l2jmobius)
TransferDamageToPlayer: Transfers portion of incoming damage from target to you.
TransferDamageToSummon: Transfers portion of incoming damage towards your summon.
TransferHate: Transfers Npc's hate from you to your target.
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/EffectMasterHandler.java
index b32ec97a5e..3c6cbb4bca 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -185,6 +185,7 @@ public final class EffectMasterHandler
EffectHandler.getInstance().registerHandler("LimitCp", LimitCp::new);
EffectHandler.getInstance().registerHandler("LimitHp", LimitHp::new);
EffectHandler.getInstance().registerHandler("LimitMp", LimitMp::new);
+ EffectHandler.getInstance().registerHandler("LimitSkill", LimitSkill::new);
EffectHandler.getInstance().registerHandler("Lucky", Lucky::new);
EffectHandler.getInstance().registerHandler("MagicAccuracy", MagicAccuracy::new);
EffectHandler.getInstance().registerHandler("MagicalAbnormalDispelAttack", MagicalAbnormalDispelAttack::new);
@@ -340,6 +341,7 @@ public final class EffectMasterHandler
EffectHandler.getInstance().registerHandler("TeleportToPlayer", TeleportToPlayer::new);
EffectHandler.getInstance().registerHandler("TeleportToSummon", TeleportToSummon::new);
EffectHandler.getInstance().registerHandler("TeleportToTarget", TeleportToTarget::new);
+ EffectHandler.getInstance().registerHandler("TrackLimitedSkill", TrackLimitedSkill::new);
EffectHandler.getInstance().registerHandler("FlyAway", FlyAway::new);
EffectHandler.getInstance().registerHandler("TransferDamageToPlayer", TransferDamageToPlayer::new);
EffectHandler.getInstance().registerHandler("TransferDamageToSummon", TransferDamageToSummon::new);
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/LimitSkill.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/LimitSkill.java
new file mode 100644
index 0000000000..9f17aeaa5d
--- /dev/null
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/LimitSkill.java
@@ -0,0 +1,132 @@
+/*
+ * 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 com.l2jmobius.gameserver.model.StatsSet;
+import com.l2jmobius.gameserver.model.actor.L2Character;
+import com.l2jmobius.gameserver.model.effects.AbstractEffect;
+import com.l2jmobius.gameserver.model.skills.BuffInfo;
+import com.l2jmobius.gameserver.model.skills.Skill;
+
+/**
+ * @author Ofelin
+ */
+public class LimitSkill extends AbstractEffect
+{
+ private final static int LIMIT_OF_AEORE = 11833;
+ private final static int LIMIT_OF_SIGEL = 19526;
+ private final static int LIMIT_OF_ISS = 19527;
+ private final static int BATTLE_RAPSODY = 11544;
+ private final static int OVERLORDS_DIGNITY = 19439;
+ private final static int PROTECTION_OF_FATE = 10019;
+ private final static int NINE_AEGIS = 10024;
+ private final static int CELESTIAL_PROTECTION = 11758;
+ private final static int CELESTIAL_PARTY_PROTECTION = 11759;
+
+ public LimitSkill(StatsSet params)
+ {
+ }
+
+ @Override
+ public void onStart(L2Character effector, L2Character effected, Skill skill)
+ {
+ switch (skill.getId())
+ {
+ case LIMIT_OF_AEORE: // Limit of Aeore
+ {
+ decreaseAeoreBuffDuration(effector, effected, skill);
+ break;
+ }
+ case LIMIT_OF_SIGEL: // Limit of Sigel
+ {
+ decreaseSigelBuffDuration(effector, effected, skill);
+ break;
+ }
+ case LIMIT_OF_ISS: // Limit of Iss
+ {
+ decreaseIssBuffDuration(effector, effected, skill);
+ break;
+ }
+ }
+ }
+
+ private void decreaseAeoreBuffDuration(L2Character effector, L2Character effected, Skill skill)
+ {
+ switch (skill.getLevel())
+ {
+ case 1:
+ case 2:
+ {
+ modifyDuration(CELESTIAL_PROTECTION, effected, (int) (10 * 0.50)); // Decrease active effect of Celestial Protection by 50%
+ modifyDuration(CELESTIAL_PARTY_PROTECTION, effected, (int) (10 * 0.50)); // Decrease active effect of Celestial Party Protection by 50%
+ break;
+ }
+ }
+ }
+
+ private void decreaseSigelBuffDuration(L2Character effector, L2Character effected, Skill skill)
+ {
+ switch (skill.getLevel())
+ {
+ case 1:
+ {
+ modifyDuration(PROTECTION_OF_FATE, effected, (int) (30 * 0.80)); // Decrease active effect of Protection of Fate by 20%
+ modifyDuration(NINE_AEGIS, effected, (int) (30 * 0.80)); // Decrease active effect of Nine Aegis by 20%
+ break;
+ }
+ case 2:
+ {
+ modifyDuration(PROTECTION_OF_FATE, effected, (int) (30 * 0.20)); // Decrease active effect of Protection of Fate by 80%
+ modifyDuration(NINE_AEGIS, effected, (int) (30 * 0.20)); // Decrease active effect of Nine Aegis by 80%
+ break;
+ }
+ }
+ }
+
+ private void decreaseIssBuffDuration(L2Character effector, L2Character effected, Skill skill)
+ {
+ switch (skill.getLevel())
+ {
+ case 1:
+ {
+ modifyDuration(BATTLE_RAPSODY, effected, (int) (30 * 0.80)); // Decrease active effect of Battle Rhapsody by 20%
+ modifyDuration(OVERLORDS_DIGNITY, effected, (int) (30 * 0.80)); // Decrease active effect of Overlord's Dignity by 20%
+ break;
+ }
+ case 2:
+ {
+ modifyDuration(BATTLE_RAPSODY, effected, (int) (30 * 0.20)); // Decrease active effect of Battle Rhapsody by 80%
+ modifyDuration(OVERLORDS_DIGNITY, effected, (int) (30 * 0.20)); // Decrease active effect of Overlord's Dignity by 80%
+ break;
+ }
+ }
+ }
+
+ private void modifyDuration(int skillId, L2Character effected, int duration)
+ {
+ for (BuffInfo buff : effected.getEffectList().getEffects())
+ {
+ if (buff.getSkill().getId() == skillId)
+ {
+ if (duration > 0)
+ {
+ buff.setAbnormalTime(duration);
+ }
+ }
+ }
+ }
+}
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/TrackLimitedSkill.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/TrackLimitedSkill.java
new file mode 100644
index 0000000000..6a4e573fe1
--- /dev/null
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/TrackLimitedSkill.java
@@ -0,0 +1,170 @@
+/*
+ * 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 com.l2jmobius.gameserver.model.CharEffectList;
+import com.l2jmobius.gameserver.model.StatsSet;
+import com.l2jmobius.gameserver.model.actor.L2Character;
+import com.l2jmobius.gameserver.model.effects.AbstractEffect;
+import com.l2jmobius.gameserver.model.holders.SkillHolder;
+import com.l2jmobius.gameserver.model.skills.BuffInfo;
+import com.l2jmobius.gameserver.model.skills.Skill;
+
+/**
+ * @author Ofelin
+ */
+public class TrackLimitedSkill extends AbstractEffect
+{
+ private final static int LIMIT_OF_AEORE = 11833;
+ private final static int LIMIT_OF_SIGEL = 19526;
+ private final static int LIMIT_OF_ISS = 19527;
+ private final static int BATTLE_RAPSODY = 11544;
+ private final static int OVERLORDS_DIGNITY = 19439;
+ private final static int PROTECTION_OF_FATE = 10019;
+ private final static int NINE_AEGIS = 10024;
+ private final static int CELESTIAL_PROTECTION = 11758;
+ private final static int CELESTIAL_PARTY_PROTECTION = 11759;
+ private int limitAeoreLevel = 0;
+ private int limitSigelLevel = 0;
+ private int limitIssLevel = 0;
+
+ public TrackLimitedSkill(StatsSet param)
+ {
+ }
+
+ @Override
+ public void onStart(L2Character effector, L2Character effected, Skill skill)
+ {
+ trackAeoreLimit(effector, effected, skill, LIMIT_OF_AEORE); // Tracking Aeore Limit Debuff
+ trackSigelLimit(effector, effected, skill, LIMIT_OF_SIGEL); // Tracking Sigel Limit Debuff
+ trackIssLimit(effector, effected, skill, LIMIT_OF_ISS); // Tracking Iss Limit Debuff
+ }
+
+ @Override
+ public void onExit(L2Character effector, L2Character effected, Skill skill)
+ {
+ if ((skill.getId() == BATTLE_RAPSODY) || (skill.getId() == OVERLORDS_DIGNITY))
+ {
+ increaseLimit(effector, effected, skill, limitIssLevel);
+ }
+ else if ((skill.getId() == PROTECTION_OF_FATE) || (skill.getId() == NINE_AEGIS))
+ {
+ increaseLimit(effector, effected, skill, limitSigelLevel);
+ }
+ else if ((skill.getId() == CELESTIAL_PROTECTION) || (skill.getId() == CELESTIAL_PARTY_PROTECTION))
+ {
+ increaseLimit(effector, effected, skill, limitAeoreLevel);
+ }
+ }
+
+ private void trackAeoreLimit(L2Character effector, L2Character effected, Skill skill, int limitSkillId)
+ {
+ limitAeoreLevel = 0;
+ CharEffectList effectList = effected.getEffectList();
+ for (BuffInfo debuff : effectList.getDebuffs())
+ {
+ if (debuff.getSkill().getId() == limitSkillId)
+ {
+ limitAeoreLevel = debuff.getSkill().getLevel();
+
+ if (limitAeoreLevel == 3)
+ {
+ effected.getEffectList().remove(effectList.getBuffInfoBySkillId(CELESTIAL_PROTECTION), false, false, false); // Remove Celestial Protection
+ effected.getEffectList().remove(effectList.getBuffInfoBySkillId(CELESTIAL_PARTY_PROTECTION), false, false, false); // Remove Celestial Party Protection
+ }
+ else
+ {
+ new SkillHolder(LIMIT_OF_AEORE, limitAeoreLevel).getSkill().applyEffects(effector, effected);
+ }
+ }
+ }
+ }
+
+ private void trackSigelLimit(L2Character effector, L2Character effected, Skill skill, int limitSkillId)
+ {
+ limitSigelLevel = 0;
+ CharEffectList effectList = effected.getEffectList();
+ for (BuffInfo debuff : effectList.getDebuffs())
+ {
+ if (debuff.getSkill().getId() == limitSkillId)
+ {
+ limitSigelLevel = debuff.getSkill().getLevel();
+
+ if (limitSigelLevel == 3)
+ {
+ effected.getEffectList().remove(effectList.getBuffInfoBySkillId(PROTECTION_OF_FATE), false, false, false); // Remove Protection of Fate
+ effected.getEffectList().remove(effectList.getBuffInfoBySkillId(NINE_AEGIS), false, false, false); // Remove Nine Aegis
+ }
+ else
+ {
+ new SkillHolder(LIMIT_OF_SIGEL, limitSigelLevel).getSkill().applyEffects(effector, effected);
+ }
+ }
+ }
+ }
+
+ private void trackIssLimit(L2Character effector, L2Character effected, Skill skill, int limitSkillId)
+ {
+ limitIssLevel = 0;
+ CharEffectList effectList = effected.getEffectList();
+ for (BuffInfo debuff : effectList.getDebuffs())
+ {
+ if (debuff.getSkill().getId() == limitSkillId)
+ {
+ limitIssLevel = debuff.getSkill().getLevel();
+ if (limitIssLevel == 3)
+ {
+ effected.getEffectList().remove(effectList.getBuffInfoBySkillId(BATTLE_RAPSODY), false, false, false); // Remove Battle Rhapsody
+ effected.getEffectList().remove(effectList.getBuffInfoBySkillId(OVERLORDS_DIGNITY), false, false, false); // Remove Overlord's Dignity
+ }
+ else
+ {
+ new SkillHolder(LIMIT_OF_ISS, limitIssLevel).getSkill().applyEffects(effector, effected);
+ }
+ }
+ }
+ }
+
+ private void increaseLimit(L2Character effector, L2Character effected, Skill skill, int limitLevel)
+ {
+ if (limitLevel < 3)
+ {
+ switch (skill.getId())
+ {
+ case BATTLE_RAPSODY: // Battle Rhapsody
+ case OVERLORDS_DIGNITY: // Overlord's Dignity
+ {
+ // limitIssLevel++;
+ new SkillHolder(LIMIT_OF_ISS, ++limitIssLevel).getSkill().applyEffects(effector, effected);
+ break;
+ }
+ case PROTECTION_OF_FATE: // Protection of Fate
+ case NINE_AEGIS: // Nine Aegis
+ {
+ new SkillHolder(LIMIT_OF_SIGEL, ++limitSigelLevel).getSkill().applyEffects(effector, effected);
+ break;
+ }
+ case CELESTIAL_PROTECTION: // Celestial Protection
+ case CELESTIAL_PARTY_PROTECTION: // Celestial Party Protection
+ {
+ new SkillHolder(LIMIT_OF_AEORE, ++limitAeoreLevel).getSkill().applyEffects(effector, effected);
+ break;
+ }
+ }
+ }
+ }
+}
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/10000-10099.xml b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/10000-10099.xml
index 2a89872e2f..c224d9bb81 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/10000-10099.xml
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/10000-10099.xml
@@ -1558,6 +1558,7 @@
DIFF
+
@@ -1797,9 +1798,7 @@
-
-
-
+
2
15
@@ -1844,6 +1843,7 @@
DIFF
+
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/11500-11599.xml b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/11500-11599.xml
index 3992d8d245..67a5ed4f37 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/11500-11599.xml
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/11500-11599.xml
@@ -3148,6 +3148,7 @@
DIFF
+
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/11700-11799.xml b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/11700-11799.xml
index 2aac2542b7..cd983bb9a6 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/11700-11799.xml
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/11700-11799.xml
@@ -784,14 +784,8 @@
4504
+
-
-
-
- 11833
- 1
-
-
@@ -857,14 +851,8 @@
4504
+
-
-
-
- 11834
- 1
-
-
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/11800-11899.xml b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/11800-11899.xml
index 188e868a22..785b8520f6 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/11800-11899.xml
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/11800-11899.xml
@@ -1387,42 +1387,21 @@
-
+
- icon.skill11758
- 9
- 70
- INVINCIBILITY_SPECIAL
- A2
- 1
- 1
- true
- NONE
- NONE;STRIDER;WYVERN;WOLF
- 5
- -2
- 0
- 99
- true
+ 1
+ 60
false
- SELF
- SINGLE
+ icon.skill11833
+ true
+ A2
+ 1
+ NONE;STRIDER;WYVERN;WOLF
-
- 5
- DIFF
-
-
- 1
- DIFF
-
-
- 1
- DIFF
-
+
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/19400-19499.xml b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/19400-19499.xml
index efa403b771..cd9750c196 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/19400-19499.xml
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/19400-19499.xml
@@ -831,7 +831,7 @@
5
12
@@ -983,10 +983,61 @@
- icon.skill0000
- A1
+ icon.skill19439
+ 30
+ 1000
+ A2
+ 916
3000
- 30000
+ 500
+ 687
+ RHAPSODY
+ NONE
+ NONE
+ 5
+ 89
+ 5
+ 600000
+ SELF
+ PARTY
+ FRIEND
+
+
+ 100
+ PER
+
+
+ 100
+ PER
+
+
+ 100
+ PER
+
+
+ 100
+ PER
+
+
+
+ {0.6 + 0.4 * subIndex}
+
+ PER
+
+
+
+ {0.6 + 0.4 * subIndex}
+
+ PER
+
+
+
+ {2 * subIndex}
+
+ DIFF
+
+
+
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/19500- 19599.xml b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/19500- 19599.xml
new file mode 100644
index 0000000000..102278c1cd
--- /dev/null
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/19500- 19599.xml
@@ -0,0 +1,30 @@
+
+
+
+ 1
+ 60
+ false
+ icon.skill19526
+ true
+ A2
+ 1
+ NONE;STRIDER;WYVERN;WOLF
+
+
+
+
+
+
+ 1
+ 60
+ false
+ icon.skill19527
+ true
+ A2
+ 1
+ NONE;STRIDER;WYVERN;WOLF
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/documentation.txt
index 9879483551..66f0b5f9d5 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/documentation.txt
@@ -154,6 +154,7 @@ Lethal: Upon success sets enemy Player's CP to 1 and enemy NPC's HP to 50%.
LimitCp: Sets maximum recoverable CP through heals.
LimitHp: Sets maximum recoverable HP through heals.
LimitMp: Sets maximum recoverable MP through heals.
+LimitSkill: Limits skill duration. (l2jmobius)
Lucky: dummy effect since behavior is hardcoded
MagicAccuracy: M. Accuracy stat.
MagicalAbnormalDispelAttack: Magical attack that does damage only if it manages to dispel the given AbnormalType
@@ -308,6 +309,7 @@ TeleportToNpc: Teleports to a specified Npc Id.
TeleportToPlayer: Teleports to targeted player. (l2jmobius)
TeleportToSummon: Teleports to your summon.
TeleportToTarget: Teleports to your target.
+TrackLimitedSkill: Checks limit skill duration, see LimitSkill effect. (l2jmobius)
TransferDamageToPlayer: Transfers portion of incoming damage from target to you.
TransferDamageToSummon: Transfers portion of incoming damage towards your summon.
TransferHate: Transfers Npc's hate from you to your target.