From a31a2654598d30187e5040b7d87b909fbdce9c44 Mon Sep 17 00:00:00 2001 From: MobiusDev <8391001+MobiusDevelopment@users.noreply.github.com> Date: Fri, 14 Sep 2018 16:42:59 +0000 Subject: [PATCH] Limit for Aeore, Iss and Sigel skills. Contributed by Ofelin. --- .../scripts/handlers/EffectMasterHandler.java | 2 + .../handlers/effecthandlers/LimitSkill.java | 132 ++++++++++++++ .../effecthandlers/TrackLimitedSkill.java | 170 ++++++++++++++++++ .../game/data/stats/skills/10000-10099.xml | 6 +- .../game/data/stats/skills/11500-11599.xml | 1 + .../game/data/stats/skills/11700-11799.xml | 16 +- .../game/data/stats/skills/11800-11899.xml | 39 +--- .../game/data/stats/skills/19400-19499.xml | 59 +++++- .../game/data/stats/skills/19500- 19599.xml | 30 ++++ .../game/data/stats/skills/documentation.txt | 2 + .../scripts/handlers/EffectMasterHandler.java | 2 + .../handlers/effecthandlers/LimitSkill.java | 132 ++++++++++++++ .../effecthandlers/TrackLimitedSkill.java | 170 ++++++++++++++++++ .../game/data/stats/skills/10000-10099.xml | 6 +- .../game/data/stats/skills/11500-11599.xml | 1 + .../game/data/stats/skills/11700-11799.xml | 16 +- .../game/data/stats/skills/11800-11899.xml | 39 +--- .../game/data/stats/skills/19400-19499.xml | 59 +++++- .../game/data/stats/skills/19500- 19599.xml | 30 ++++ .../game/data/stats/skills/documentation.txt | 2 + 20 files changed, 812 insertions(+), 102 deletions(-) create mode 100644 L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/LimitSkill.java create mode 100644 L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/TrackLimitedSkill.java create mode 100644 L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/19500- 19599.xml create mode 100644 L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/LimitSkill.java create mode 100644 L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/TrackLimitedSkill.java create mode 100644 L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/19500- 19599.xml 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.