From afdbcb7abcdf99ee8399c8329f846a21d857b47a Mon Sep 17 00:00:00 2001 From: Zoey76 <zoey_76@msn.com> Date: Thu, 10 Dec 2020 21:33:01 -0300 Subject: [PATCH] Skill fixes Added affectObject attribute. Added hitCancelTtime attribute. Added shieldDefensePercent effect parameter. Implemented MagicalAttackRange effect (takes shield defense bonus into consideration). Fixed Enemy target type, should work with ctrl key pressed down. High Five confirmed skills: Anchor (1170) Aura Burn (1172) Wind Strike (1177) Twister (1178) Flame Strike (1181) --- .../handlers/EffectMasterHandler.java | 8 +- .../instant/MagicalAttackRange.java | 99 ++++++++++++++++ .../handlers/targethandlers/Enemy.java | 16 ++- .../data/stats/skills/01100-01199.xml | 110 ++++++++++-------- src/main/resources/data/xsd/skills.xsd | 4 + 5 files changed, 183 insertions(+), 54 deletions(-) create mode 100644 src/main/java/com/l2jserver/datapack/handlers/effecthandlers/instant/MagicalAttackRange.java diff --git a/src/main/java/com/l2jserver/datapack/handlers/EffectMasterHandler.java b/src/main/java/com/l2jserver/datapack/handlers/EffectMasterHandler.java index e273cb7a76..2320c361ae 100644 --- a/src/main/java/com/l2jserver/datapack/handlers/EffectMasterHandler.java +++ b/src/main/java/com/l2jserver/datapack/handlers/EffectMasterHandler.java @@ -93,6 +93,7 @@ import com.l2jserver.datapack.handlers.effecthandlers.instant.Lethal; import com.l2jserver.datapack.handlers.effecthandlers.instant.MagicalAttack; import com.l2jserver.datapack.handlers.effecthandlers.instant.MagicalAttackByAbnormal; import com.l2jserver.datapack.handlers.effecthandlers.instant.MagicalAttackMp; +import com.l2jserver.datapack.handlers.effecthandlers.instant.MagicalAttackRange; import com.l2jserver.datapack.handlers.effecthandlers.instant.MagicalSoulAttack; import com.l2jserver.datapack.handlers.effecthandlers.instant.ManaHealByLevel; import com.l2jserver.datapack.handlers.effecthandlers.instant.Mp; @@ -202,11 +203,11 @@ public final class EffectMasterHandler { Blink.class, BlockAction.class, BlockBuff.class, + BlockBuffSlot.class, BlockChat.class, BlockDamage.class, BlockDebuff.class, BlockParty.class, - BlockBuffSlot.class, BlockResurrection.class, Bluff.class, Buff.class, @@ -275,6 +276,7 @@ public final class EffectMasterHandler { MagicalAttack.class, MagicalAttackByAbnormal.class, MagicalAttackMp.class, + MagicalAttackRange.class, MagicalSoulAttack.class, ManaHealByLevel.class, MaxCp.class, @@ -285,7 +287,6 @@ public final class EffectMasterHandler { Mute.class, NoblesseBless.class, OpenChest.class, - Unsummon.class, OpenCommonRecipeBook.class, OpenDoor.class, OpenDwarfRecipeBook.class, @@ -298,8 +299,8 @@ public final class EffectMasterHandler { PhysicalAttackMute.class, PhysicalMute.class, PhysicalSoulAttack.class, - Pumping.class, ProtectionBlessing.class, + Pumping.class, RandomizeHate.class, RebalanceHP.class, Recovery.class, @@ -355,6 +356,7 @@ public final class EffectMasterHandler { TriggerSkillByAvoid.class, TriggerSkillByDamage.class, TriggerSkillBySkill.class, + Unsummon.class, UnsummonAgathion.class, VitalityPointUp.class, }; diff --git a/src/main/java/com/l2jserver/datapack/handlers/effecthandlers/instant/MagicalAttackRange.java b/src/main/java/com/l2jserver/datapack/handlers/effecthandlers/instant/MagicalAttackRange.java new file mode 100644 index 0000000000..05817e00d5 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/handlers/effecthandlers/instant/MagicalAttackRange.java @@ -0,0 +1,99 @@ +/* + * Copyright © 2004-2020 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack 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. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.l2jserver.datapack.handlers.effecthandlers.instant; + +import static com.l2jserver.gameserver.enums.ShotType.BLESSED_SPIRITSHOTS; +import static com.l2jserver.gameserver.enums.ShotType.SPIRITSHOTS; +import static com.l2jserver.gameserver.model.effects.L2EffectType.MAGICAL_ATTACK; +import static com.l2jserver.gameserver.model.stats.Stats.VENGEANCE_SKILL_MAGIC_DAMAGE; + +import com.l2jserver.commons.util.Rnd; +import com.l2jserver.gameserver.model.StatsSet; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.conditions.Condition; +import com.l2jserver.gameserver.model.effects.AbstractEffect; +import com.l2jserver.gameserver.model.effects.L2EffectType; +import com.l2jserver.gameserver.model.skills.BuffInfo; +import com.l2jserver.gameserver.model.skills.Skill; +import com.l2jserver.gameserver.model.stats.Formulas; + +/** + * Magical Attack Range instant effect implementation. + * @author Zoey76 + * @version 2.6.2.0 + */ +public final class MagicalAttackRange extends AbstractEffect { + + private final double power; + + private final double shieldDefensePercent; + + public MagicalAttackRange(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params) { + super(attachCond, applyCond, set, params); + + power = params.getDouble("power", 0); + + shieldDefensePercent = params.getDouble("shieldDefensePercent", 0); + } + + @Override + public L2EffectType getEffectType() { + return MAGICAL_ATTACK; + } + + @Override + public boolean isInstant() { + return true; + } + + @Override + public void onStart(BuffInfo info) { + final L2Character target = info.getEffected(); + final L2Character activeChar = info.getEffector(); + final Skill skill = info.getSkill(); + + if (target.isPlayer() && target.getActingPlayer().isFakeDeath()) { + target.stopFakeDeath(true); + } + + boolean sps = skill.useSpiritShot() && activeChar.isChargedShot(SPIRITSHOTS); + boolean bss = skill.useSpiritShot() && activeChar.isChargedShot(BLESSED_SPIRITSHOTS); + final boolean mcrit = Formulas.calcMCrit(activeChar.getMCriticalHit(target, skill)); + final byte shld = Formulas.calcShldUse(activeChar, target, skill); + double damage = Formulas.calcMagicDam(activeChar, target, skill, shld, shieldDefensePercent, sps, bss, mcrit, power); + + if (damage > 0) { + // Manage attack or cast break of the target (calculating rate, sending message...) + if (!target.isRaid() && Formulas.calcAtkBreak(target, damage)) { + target.breakAttack(); + target.breakCast(); + } + + // Shield Deflect Magic: Reflect all damage on caster. + if (target.getStat().calcStat(VENGEANCE_SKILL_MAGIC_DAMAGE, 0, target, skill) > Rnd.get(100)) { + activeChar.reduceCurrentHp(damage, target, skill); + activeChar.notifyDamageReceived(damage, target, skill, mcrit, false, true); + } else { + target.reduceCurrentHp(damage, activeChar, skill); + target.notifyDamageReceived(damage, activeChar, skill, mcrit, false, false); + activeChar.sendDamageMessage(target, (int) damage, mcrit, false, false); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/handlers/targethandlers/Enemy.java b/src/main/java/com/l2jserver/datapack/handlers/targethandlers/Enemy.java index 2399f6218a..cb04b4fcaf 100644 --- a/src/main/java/com/l2jserver/datapack/handlers/targethandlers/Enemy.java +++ b/src/main/java/com/l2jserver/datapack/handlers/targethandlers/Enemy.java @@ -42,11 +42,19 @@ public class Enemy implements ITargetTypeHandler { return EMPTY_TARGET_LIST; } + if (target.isDead()) { + activeChar.sendPacket(INCORRECT_TARGET); + return EMPTY_TARGET_LIST; + } + + if (target.isAttackable()) { + return new L2Character[] { + target + }; + } + final L2PcInstance player = activeChar.getActingPlayer(); - if (target.isDead() || (!target.isAttackable() && // - (player != null) && // - !player.checkIfPvP(target) && // - !player.getCurrentSkill().isCtrlPressed())) { + if ((player == null) || !player.checkIfPvP(target) && !player.getCurrentSkill().isCtrlPressed()) { activeChar.sendPacket(INCORRECT_TARGET); return EMPTY_TARGET_LIST; } diff --git a/src/main/resources/data/stats/skills/01100-01199.xml b/src/main/resources/data/stats/skills/01100-01199.xml index da19958363..109fe79d95 100644 --- a/src/main/resources/data/stats/skills/01100-01199.xml +++ b/src/main/resources/data/stats/skills/01100-01199.xml @@ -1258,10 +1258,10 @@ </skill> <skill id="1170" levels="13" name="Anchor" enchantGroup1="1" enchantGroup2="1"> <!-- High Five Confirmed --> - <table name="#effectPoints"> -418 -457 -495 -532 -549 -566 -582 -597 -611 -624 -635 -646 -655 </table> - <table name="#magicLvl"> 44 48 52 56 58 60 62 64 66 68 70 72 74 </table> - <table name="#mpConsume2"> 31 35 38 41 43 44 46 48 49 51 52 53 55 </table> + <table name="#effectPoint"> -418 -457 -495 -532 -549 -566 -582 -597 -611 -624 -635 -646 -655 </table> + <table name="#magicLvl"> 40 48 52 56 58 60 62 64 66 68 70 72 74 </table> <table name="#mpConsume1"> 8 9 10 11 11 11 12 12 13 13 13 14 14 </table> + <table name="#mpConsume2"> 31 35 38 41 43 44 46 48 49 51 52 53 55 </table> <table name="#ench1ActivateRates"> 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 </table> <table name="#ench2ActivateRates"> 101 101 102 102 103 103 104 104 105 105 106 106 107 107 108 108 108 109 109 110 110 111 111 112 112 113 113 114 114 115 </table> <table name="#ench2MpConsume2"> 54 53 52 51 50 49 48 47 46 45 44 43 42 42 41 40 39 38 37 36 35 34 33 32 31 30 29 29 28 27 </table> @@ -1274,16 +1274,17 @@ <set name="affectScope" val="SINGLE" /> <set name="basicProperty" val="MEN" /> <set name="castRange" val="400" /> - <set name="effectPoint" val="#effectPoints" /> + <set name="effectPoint" val="#effectPoint" /> <set name="effectRange" val="900" /> + <set name="hitCancelTime" val="500" /> <set name="hitTime" val="1500" /> <set name="icon" val="icon.skill1170" /> <set name="isDebuff" val="true" /> - <set name="isMagic" val="1" /> <!-- Magic Skill --> + <set name="isMagic" val="1" /> <set name="lvlBonusRate" val="1" /> <set name="magicLvl" val="#magicLvl" /> - <set name="mpConsume2" val="#mpConsume2" /> <set name="mpConsume1" val="#mpConsume1" /> + <set name="mpConsume2" val="#mpConsume2" /> <set name="operateType" val="A2" /> <set name="reuseDelay" val="60000" /> <set name="rideState" val="NONE;STRIDER;WYVERN;WOLF" /> @@ -1365,27 +1366,30 @@ </enchant2Effects> </skill> <skill id="1172" levels="8" name="Aura Burn"> - <table name="#effectPoints"> -146 -163 -181 -194 -214 -228 -250 -265 </table> + <!-- High Five Confirmed --> + <table name="#effectPoint"> -146 -163 -181 -194 -214 -228 -250 -265 </table> <table name="#magicLvl"> 17 20 23 25 28 30 33 35 </table> - <table name="#mpConsume2"> 14 16 17 18 20 21 23 24 </table> + <table name="#magicalAttackPower"> 19 21 24 25 28 30 33 36 </table> <table name="#mpConsume1"> 4 4 5 5 5 6 6 6 </table> - <table name="#power"> 19 21 24 25 28 30 33 36 </table> + <table name="#mpConsume2"> 14 16 17 18 20 21 23 24 </table> + <set name="affectScope" val="SINGLE" /> <set name="castRange" val="150" /> - <set name="effectPoint" val="#effectPoints" /> + <set name="effectPoint" val="#effectPoint" /> <set name="effectRange" val="650" /> + <set name="hitCancelTime" val="500" /> <set name="hitTime" val="1500" /> <set name="icon" val="icon.skill1172" /> - <set name="isMagic" val="1" /> <!-- Magic Skill --> + <set name="isMagic" val="1" /> <set name="magicLvl" val="#magicLvl" /> - <set name="mpConsume2" val="#mpConsume2" /> <set name="mpConsume1" val="#mpConsume1" /> + <set name="mpConsume2" val="#mpConsume2" /> <set name="operateType" val="A1" /> <set name="reuseDelay" val="1000" /> <set name="rideState" val="NONE;STRIDER;WYVERN;WOLF" /> - <set name="targetType" val="ONE" /> + <set name="targetType" val="ENEMY" /> <effects> <effect name="MagicalAttack"> - <param power="#power" /> + <param power="#magicalAttackPower" /> </effect> </effects> </skill> @@ -1514,86 +1518,98 @@ </enchant1Effects> </skill> <skill id="1177" levels="5" name="Wind Strike"> - <table name="#effectPoints"> -92 -106 -121 -143 -162 </table> + <!-- High Five Confirmed --> + <table name="#effectPoint"> -92 -106 -121 -143 -162 </table> <table name="#magicLvl"> 1 4 7 11 14 </table> - <table name="#mpConsume2"> 7 7 8 11 12 </table> + <table name="#magicalAttackRangePower"> 12 13 15 18 21 </table> <table name="#mpConsume1"> 2 2 2 3 3 </table> - <table name="#power"> 12 13 15 18 21 </table> + <table name="#mpConsume2"> 7 7 8 11 12 </table> + <table name="#targetType"> ENEMY_ONLY ENEMY ENEMY ENEMY ENEMY </table> <set name="affectScope" val="SINGLE" /> + <set name="attributePower" val="20" /> + <set name="attributeType" val="WIND" /> <set name="castRange" val="600" /> - <set name="effectPoint" val="#effectPoints" /> + <set name="effectPoint" val="#effectPoint" /> <set name="effectRange" val="1100" /> - <set name="attributeType" val="WIND" /> - <set name="attributePower" val="20" /> + <set name="hitCancelTime" val="500" /> <set name="hitTime" val="4000" /> <set name="icon" val="icon.skill1177" /> - <set name="isMagic" val="1" /> <!-- Magic Skill --> + <set name="isMagic" val="1" /> <set name="magicLvl" val="#magicLvl" /> - <set name="mpConsume2" val="#mpConsume2" /> <set name="mpConsume1" val="#mpConsume1" /> + <set name="mpConsume2" val="#mpConsume2" /> <set name="operateType" val="A1" /> - <set name="reuseDelay" val="1000" /> + <set name="reuseDelay" val="1200" /> <set name="rideState" val="NONE;STRIDER;WYVERN;WOLF" /> - <set name="targetType" val="ENEMY_ONLY" /> + <set name="targetType" val="#targetType" /> <effects> - <effect name="MagicalAttack"> - <param power="#power" /> + <effect name="MagicalAttackRange"> + <param power="#magicalAttackRangePower" /> + <param shieldDefensePercent="40" /> </effect> </effects> </skill> <skill id="1178" levels="8" name="Twister"> - <table name="#effectPoints"> -182 -204 -227 -243 -268 -285 -313 -331 </table> + <!-- High Five Confirmed --> + <table name="#effectPoint"> -182 -204 -227 -243 -268 -285 -313 -331 </table> <table name="#magicLvl"> 17 20 23 25 28 30 33 35 </table> - <table name="#mpConsume2"> 14 16 17 18 20 21 23 24 </table> + <table name="#magicalAttackRangePower"> 23 26 29 32 35 38 42 44 </table> <table name="#mpConsume1"> 4 4 5 5 5 6 6 6 </table> - <table name="#power"> 23 26 29 32 35 38 42 44 </table> + <table name="#mpConsume2"> 14 16 17 18 20 21 23 24 </table> + <set name="affectScope" val="SINGLE" /> + <set name="attributePower" val="20" /> + <set name="attributeType" val="WIND" /> <set name="castRange" val="750" /> - <set name="effectPoint" val="#effectPoints" /> + <set name="effectPoint" val="#effectPoint" /> <set name="effectRange" val="1250" /> - <set name="attributeType" val="WIND" /> - <set name="attributePower" val="20" /> + <set name="hitCancelTime" val="500" /> <set name="hitTime" val="4000" /> <set name="icon" val="icon.skill1178" /> - <set name="isMagic" val="1" /> <!-- Magic Skill --> + <set name="isMagic" val="1" /> <set name="magicLvl" val="#magicLvl" /> - <set name="mpConsume2" val="#mpConsume2" /> <set name="mpConsume1" val="#mpConsume1" /> + <set name="mpConsume2" val="#mpConsume2" /> <set name="operateType" val="A1" /> - <set name="reuseDelay" val="1000" /> + <set name="reuseDelay" val="1200" /> <set name="rideState" val="NONE;STRIDER;WYVERN;WOLF" /> - <set name="targetType" val="ONE" /> + <set name="targetType" val="ENEMY" /> <effects> - <effect name="MagicalAttack"> - <param power="#power" /> + <effect name="MagicalAttackRange"> + <param power="#magicalAttackRangePower" /> + <param shieldDefensePercent="40" /> </effect> </effects> </skill> <skill id="1181" levels="3" name="Flame Strike"> - <table name="#effectPoints"> -204 -243 -285 </table> + <!-- High Five Confirmed --> + <table name="#effectPoint"> -204 -243 -285 </table> <table name="#magicLvl"> 20 25 30 </table> - <table name="#mpConsume2"> 23 27 32 </table> + <table name="#magicalAttackPower"> 13 16 19 </table> <table name="#mpConsume1"> 6 7 8 </table> - <table name="#power"> 13 14 14 </table> + <table name="#mpConsume2"> 23 27 32 </table> <set name="affectLimit" val="5-12" /> <set name="affectRange" val="200" /> + <set name="affectScope" val="RANGE" /> + <set name="affectObject" val="NOT_FRIEND" /> + <set name="attributePower" val="20" /> + <set name="attributeType" val="FIRE" /> <set name="castRange" val="500" /> - <set name="effectPoint" val="#effectPoints" /> + <set name="effectPoint" val="#effectPoint" /> <set name="effectRange" val="1000" /> - <set name="attributeType" val="FIRE" /> - <set name="attributePower" val="20" /> + <set name="hitCancelTime" val="500" /> <set name="hitTime" val="4000" /> <set name="icon" val="icon.skill1181" /> - <set name="isMagic" val="1" /> <!-- Magic Skill --> + <set name="isMagic" val="1" /> <set name="magicLvl" val="#magicLvl" /> - <set name="mpConsume2" val="#mpConsume2" /> <set name="mpConsume1" val="#mpConsume1" /> + <set name="mpConsume2" val="#mpConsume2" /> <set name="operateType" val="A1" /> <set name="reuseDelay" val="4000" /> <set name="rideState" val="NONE;STRIDER;WYVERN;WOLF" /> <set name="targetType" val="AREA" /> <effects> <effect name="MagicalAttack"> - <param power="#power" /> + <param power="#magicalAttackPower" /> </effect> </effects> </skill> diff --git a/src/main/resources/data/xsd/skills.xsd b/src/main/resources/data/xsd/skills.xsd index 5f17c7cf10..fb2a49f5f3 100644 --- a/src/main/resources/data/xsd/skills.xsd +++ b/src/main/resources/data/xsd/skills.xsd @@ -20,6 +20,7 @@ <xs:enumeration value="abnormalVisualEffect" /> <xs:enumeration value="activateRate" /> <xs:enumeration value="affectLimit" /> + <xs:enumeration value="affectObject" /> <xs:enumeration value="affectRange" /> <xs:enumeration value="affectScope" /> <xs:enumeration value="afterEffectId" /> @@ -41,6 +42,7 @@ <xs:enumeration value="excludedFromCheck" /> <xs:enumeration value="fanRange" /> <xs:enumeration value="hitTime" /> + <xs:enumeration value="hitCancelTime" /> <xs:enumeration value="hpConsume" /> <xs:enumeration value="icon" /> <xs:enumeration value="irreplaceableBuff" /> @@ -339,6 +341,7 @@ <xs:attribute type="xs:string" name="normal" /> <xs:attribute type="xs:string" name="ride" /> <xs:attribute type="xs:string" name="wyvern" /> + <xs:attribute type="xs:string" name="shieldDefensePercent" /> </xs:extension> </xs:simpleContent> </xs:complexType> @@ -578,6 +581,7 @@ <xs:enumeration value="MagicalAttack" /> <xs:enumeration value="MagicalAttackByAbnormal" /> <xs:enumeration value="MagicalAttackMp" /> + <xs:enumeration value="MagicalAttackRange" /> <xs:enumeration value="MagicalSoulAttack" /> <xs:enumeration value="ManaHealByLevel" /> <xs:enumeration value="MaxCp" /> -- GitLab