diff --git a/src/main/java/com/l2jserver/datapack/handlers/EffectMasterHandler.java b/src/main/java/com/l2jserver/datapack/handlers/EffectMasterHandler.java index e273cb7a76506b621d706cfab7a76d3f4a2365fa..2320c361aef3eddc3aa5b3ba125927eb991d1250 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 0000000000000000000000000000000000000000..05817e00d509bbc8fe239f5c974d53119bbd275a --- /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 2399f6218a5357e7ba423070e0334ccd69662109..cb04b4fcaf6b23ea4e5474a096d32a9dea26bee9 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 da19958363bab9970d101a7ab5aa5d3a6e7e0e20..109fe79d952272cf6083c6799862f000ab0a2afb 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 5f17c7cf10ce88235d6bc8f40a52dd9c241ae9c9..fb2a49f5f3bcfb12d64dc9089b5cf2c795461ae1 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" />