From d722c7a961b5f70a04d15b89fb341184da26bd78 Mon Sep 17 00:00:00 2001 From: MobiusDev <8391001+MobiusDevelopment@users.noreply.github.com> Date: Tue, 14 Jul 2015 20:03:39 +0000 Subject: [PATCH] -Added two new effects (BlockTarget & Duel). -Added condition (example - Last Attack skill). -Updated DamOverTime effect - add increase charges count over time. -Updated EnergyAttack effect to new charges system. -Updated FatalBlow effect (able to increase skill power damage if target has affected by selected abnormal type). -Added parameter ignorePhysDefPercent for skills that ignores some % of enemy pDef. -Added function isInvulnerableFor(player) and updated PcCondOverride for this function. -NPC and NPC buffers data updated for Othell Ground skill Poison Zone. -Updated PhysicalAttack effect for skills, that decreases power when using some weapon types, and increases power when using some weapon types. also added isLastAttack parameter (for skill Last Attack atm). -Added stat momentumSkillPower (for Tyrr' passive). Increases power when player have more charges (max 3). -Updated some effect for working with maxSkillDamage parameter. -Updated some old and new skills to 10531. Contributed by NviX. --- .../ai/npc/NpcBuffers/NpcBufferAI.java | 7 + .../ai/npc/NpcBuffers/NpcBuffersData.xml | 18 + .../scripts/handlers/EffectMasterHandler.java | 2 + .../handlers/effecthandlers/BlockTarget.java | 60 + .../handlers/effecthandlers/DamOverTime.java | 12 + .../scripts/handlers/effecthandlers/Duel.java | 69 + .../handlers/effecthandlers/EnergyAttack.java | 31 +- .../handlers/effecthandlers/FatalBlow.java | 31 + .../effecthandlers/PhysicalAttack.java | 57 +- .../handlers/effecthandlers/StaticDamage.java | 10 +- .../dist/game/data/stats/npcs/13300-13399.xml | 257 +++- .../game/data/stats/skills/00000-00099.xml | 91 +- .../game/data/stats/skills/00200-00299.xml | 6 +- .../game/data/stats/skills/10200-10299.xml | 602 ++++++-- .../game/data/stats/skills/10300-10399.xml | 546 ++++++-- .../game/data/stats/skills/10500-10599.xml | 1240 ++++++++++------- trunk/dist/game/data/xsd/skills.xsd | 13 +- .../gameserver/engines/DocumentBase.java | 7 + .../l2jserver/gameserver/model/L2Object.java | 13 +- .../gameserver/model/PcCondOverride.java | 3 +- .../model/actor/instance/L2PcInstance.java | 78 +- .../model/actor/status/PcStatus.java | 2 +- .../model/conditions/ConditionTargetHp.java | 47 + .../gameserver/model/skills/Skill.java | 14 +- .../gameserver/model/stats/Formulas.java | 12 +- .../gameserver/model/stats/Stats.java | 1 + 26 files changed, 2227 insertions(+), 1002 deletions(-) create mode 100644 trunk/dist/game/data/scripts/handlers/effecthandlers/BlockTarget.java create mode 100644 trunk/dist/game/data/scripts/handlers/effecthandlers/Duel.java create mode 100644 trunk/java/com/l2jserver/gameserver/model/conditions/ConditionTargetHp.java diff --git a/trunk/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBufferAI.java b/trunk/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBufferAI.java index c05ca66e94..0e8ba36d55 100644 --- a/trunk/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBufferAI.java +++ b/trunk/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBufferAI.java @@ -25,6 +25,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.instance.L2TamedBeastInstance; import com.l2jserver.gameserver.model.skills.Skill; import com.l2jserver.gameserver.model.zone.ZoneId; +import com.l2jserver.gameserver.network.serverpackets.MagicSkillUse; import com.l2jserver.gameserver.util.Util; /** @@ -57,6 +58,12 @@ public class NpcBufferAI implements Runnable final Skill skill = _skillData.getSkill(); final L2PcInstance player = _npc.getSummoner().getActingPlayer(); + if (skill.getId() == 10523) + { + // fix for visual effect not show + _npc.broadcastPacket(new MagicSkillUse(_npc, skill.getId(), skill.getLevel(), 1, 0)); + } + switch (_skillData.getAffectScope()) { case PARTY: diff --git a/trunk/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBuffersData.xml b/trunk/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBuffersData.xml index 1602816473..9c6e9ba6eb 100644 --- a/trunk/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBuffersData.xml +++ b/trunk/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBuffersData.xml @@ -98,4 +98,22 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/handlers/EffectMasterHandler.java b/trunk/dist/game/data/scripts/handlers/EffectMasterHandler.java index f8bbca9249..9462a2bfb6 100644 --- a/trunk/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/trunk/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -46,6 +46,7 @@ public final class EffectMasterHandler BlockParty.class, BlockBuffSlot.class, BlockResurrection.class, + BlockTarget.class, Bluff.class, Buff.class, CallParty.class, @@ -81,6 +82,7 @@ public final class EffectMasterHandler DispelByCategory.class, DispelBySlot.class, DispelBySlotProbability.class, + Duel.class, EnableCloak.class, EnemyCharge.class, EnergyAttack.class, diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/BlockTarget.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/BlockTarget.java new file mode 100644 index 0000000000..3d1ddc4cb7 --- /dev/null +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/BlockTarget.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2004-2015 L2J Server + * + * This file is part of L2J Server. + * + * L2J Server 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 Server 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.l2jserver.gameserver.ai.CtrlIntention; +import com.l2jserver.gameserver.model.StatsSet; +import com.l2jserver.gameserver.model.actor.L2Playable; +import com.l2jserver.gameserver.model.conditions.Condition; +import com.l2jserver.gameserver.model.effects.AbstractEffect; +import com.l2jserver.gameserver.model.skills.BuffInfo; + +/** + * @author NviX + */ +public final class BlockTarget extends AbstractEffect +{ + + public BlockTarget(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params) + { + super(attachCond, applyCond, set, params); + } + + @Override + public void onStart(BuffInfo info) + { + if (info.getEffected().isPlayable()) + { + info.getEffected().setTarget(null); + info.getEffected().abortAttack(); + info.getEffected().abortCast(); + info.getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, info.getEffected()); + ((L2Playable) info.getEffected()).setLockedTarget(info.getEffected()); + } + } + + @Override + public void onExit(BuffInfo info) + { + if (info.getEffected().isPlayable()) + { + ((L2Playable) info.getEffected()).setLockedTarget(null); + } + } +} diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/DamOverTime.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/DamOverTime.java index be379cebd4..ae2c1c5809 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/DamOverTime.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/DamOverTime.java @@ -32,6 +32,7 @@ public final class DamOverTime extends AbstractEffect { private final boolean _canKill; private final double _power; + private final int _charge; public DamOverTime(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params) { @@ -39,6 +40,7 @@ public final class DamOverTime extends AbstractEffect _canKill = params.getBoolean("canKill", false); _power = params.getDouble("power", 0); + _charge = params.getInt("charge", 0); } @Override @@ -76,6 +78,16 @@ public final class DamOverTime extends AbstractEffect } } + if ((_charge != 0) && (info.getEffected().getActingPlayer().getCharges() >= _charge)) + { + info.getEffected().sendPacket(SystemMessageId.YOUR_FORCE_HAS_REACHED_MAXIMUM_CAPACITY); + return false; + } + else if (_charge != 0) + { + info.getEffected().getActingPlayer().increaseCharges(1, _charge); + } + info.getEffected().reduceCurrentHpByDOT(damage, info.getEffector(), info.getSkill()); info.getEffected().notifyDamageReceived(damage, info.getEffector(), info.getSkill(), false, true); return info.getSkill().isToggle(); diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/Duel.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/Duel.java new file mode 100644 index 0000000000..68946cfb11 --- /dev/null +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/Duel.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2004-2015 L2J Server + * + * This file is part of L2J Server. + * + * L2J Server 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 Server 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.l2jserver.gameserver.datatables.SkillData; +import com.l2jserver.gameserver.model.PcCondOverride; +import com.l2jserver.gameserver.model.StatsSet; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.conditions.Condition; +import com.l2jserver.gameserver.model.effects.AbstractEffect; +import com.l2jserver.gameserver.model.skills.BuffInfo; +import com.l2jserver.gameserver.model.skills.Skill; + +/** + * @author NviX + */ +public final class Duel extends AbstractEffect +{ + + public Duel(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params) + { + super(attachCond, applyCond, set, params); + } + + @Override + public void onStart(BuffInfo info) + { + L2PcInstance effector = info.getEffector().getActingPlayer(); + L2PcInstance effected = info.getEffected().getActingPlayer(); + + if (effected.isDead() || (effector == null) || (effected.getPvpFlag() == 0)) + { + return; + } + + Skill skill = SkillData.getInstance().getSkill(10319, 1); + skill.applyEffects(effector, effector); + + effector.setIsInvul(true); + effected.addOverrideCond(PcCondOverride.VULNERABLE_ALL_PLAYERS); + effected.setTarget(effector); + effected.setLockedTarget(effector); + } + + @Override + public void onExit(BuffInfo info) + { + info.getEffected().getActingPlayer().setLockedTarget(null); + info.getEffected().removeOverridedCond(PcCondOverride.VULNERABLE_ALL_PLAYERS); + info.getEffector().setIsInvul(false); + info.getEffector().getEffectList().remove(true, info.getEffector().getEffectList().getBuffInfoBySkillId(10319)); + } +} diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index d1e8f64362..6bccd5cbed 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -130,11 +130,27 @@ public final class EnergyAttack extends AbstractEffect weaponTypeBoost = 77; } - // charge count should be the count before casting the skill but since its reduced before calling effects - // we add skill consume charges to current charges - double energyChargesBoost = (((attacker.getCharges() + skill.getChargeConsume()) - 1) * 0.2) + 1; + double energyChargesBoost = 1; + if (attacker.getCharges() == 1) + { + energyChargesBoost = 1.1; + attacker.decreaseCharges(1); + } + else if (attacker.getCharges() == 2) + { + energyChargesBoost = 1.2; + attacker.decreaseCharges(2); + } + else if (attacker.getCharges() >= 3) + { + energyChargesBoost = 1.3; + attacker.decreaseCharges(3); + } + + double addPower = (attacker.getStat().calcStat(Stats.MOMENTUM_SKILL_POWER, 1, null, null)); attack += _power; + attack *= addPower; attack *= ssBoost; attack *= energyChargesBoost; attack *= weaponTypeBoost; @@ -157,6 +173,13 @@ public final class EnergyAttack extends AbstractEffect if (damage > 0) { + // reduce damage if target has maxdamage buff + double maxDamage = (target.getStat().calcStat(Stats.MAX_SKILL_DAMAGE, 0, null, null)); + if (maxDamage > 0) + { + damage = (int) maxDamage; + } + attacker.sendDamageMessage(target, (int) damage, false, critical, false); target.reduceCurrentHp(damage, attacker, skill); target.notifyDamageReceived(damage, attacker, skill, critical, false); @@ -165,4 +188,4 @@ public final class EnergyAttack extends AbstractEffect Formulas.calcDamageReflected(attacker, target, skill, critical); } } -} \ No newline at end of file +} diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/FatalBlow.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/FatalBlow.java index 43750ce668..8aa7154464 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/FatalBlow.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/FatalBlow.java @@ -18,6 +18,8 @@ */ package handlers.effecthandlers; +import java.util.StringTokenizer; + import com.l2jserver.gameserver.enums.ShotType; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.actor.L2Character; @@ -25,9 +27,11 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; 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.AbnormalType; import com.l2jserver.gameserver.model.skills.BuffInfo; import com.l2jserver.gameserver.model.stats.BaseStats; import com.l2jserver.gameserver.model.stats.Formulas; +import com.l2jserver.gameserver.model.stats.Stats; /** * Fatal Blow effect implementation. @@ -35,9 +39,15 @@ import com.l2jserver.gameserver.model.stats.Formulas; */ public final class FatalBlow extends AbstractEffect { + private final String _targetAbnormalType; + private final double _skillAddPower; + public FatalBlow(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params) { super(attachCond, applyCond, set, params); + + _targetAbnormalType = params.getString("targetAbnormalType", "NULL"); + _skillAddPower = params.getDouble("skillAddPower", 1); } @Override @@ -73,6 +83,20 @@ public final class FatalBlow extends AbstractEffect byte shld = Formulas.calcShldUse(activeChar, target, info.getSkill()); double damage = Formulas.calcBlowDamage(activeChar, target, info.getSkill(), shld, ss); + if (_targetAbnormalType != "NULL") + { + StringTokenizer st = new StringTokenizer(_targetAbnormalType, ","); + while (st.hasMoreTokens()) + { + String abnormal = st.nextToken().trim(); + if (target.getEffectList().getBuffInfoByAbnormalType(AbnormalType.valueOf(abnormal)) != null) + { + damage *= _skillAddPower; + break; + } + } + } + // Crit rate base crit rate for skill, modified with STR bonus boolean crit = Formulas.calcCrit(info.getSkill().getBaseCritRate() * 10 * BaseStats.STR.calcBonus(activeChar), true, target); if (crit) @@ -80,6 +104,13 @@ public final class FatalBlow extends AbstractEffect damage *= 2; } + // reduce damage if target has maxdamage buff + double maxDamage = (target.getStat().calcStat(Stats.MAX_SKILL_DAMAGE, 0, null, null)); + if (maxDamage > 0) + { + damage = (int) maxDamage; + } + target.reduceCurrentHp(damage, activeChar, info.getSkill()); target.notifyDamageReceived(damage, activeChar, info.getSkill(), crit, false); diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java index b8af7cdaa5..25fcdf20c6 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java @@ -18,12 +18,15 @@ */ package handlers.effecthandlers; +import java.util.StringTokenizer; + import com.l2jserver.gameserver.enums.ShotType; 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.items.type.WeaponType; import com.l2jserver.gameserver.model.skills.BuffInfo; import com.l2jserver.gameserver.model.stats.BaseStats; import com.l2jserver.gameserver.model.stats.Formulas; @@ -37,9 +40,21 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage; */ public final class PhysicalAttack extends AbstractEffect { + private final String _type1; + private final double _valueReduce; + private final String _type2; + private final double _valueIncrease; + private final boolean _isLastAttack; + public PhysicalAttack(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params) { super(attachCond, applyCond, set, params); + + _type1 = params.getString("weaponTypeDec", "NONE"); + _valueReduce = params.getDouble("valueDec", 1); + _type2 = params.getString("weaponTypeInc", "NONE"); + _valueIncrease = params.getDouble("valueInc", 1); + _isLastAttack = params.getBoolean("isLastAttack", false); } @Override @@ -101,6 +116,30 @@ public final class PhysicalAttack extends AbstractEffect damage *= 2; } + if ((activeChar.getActiveWeaponItem() != null) && (_type1 != "NONE") && (_type2 != "NONE")) + { + StringTokenizer st = new StringTokenizer(_type1, ","); + while (st.hasMoreTokens()) + { + String item = st.nextToken().trim(); + if (activeChar.getActiveWeaponItem().getItemType() == WeaponType.valueOf(item)) + { + damage *= _valueReduce; + break; + } + } + st = new StringTokenizer(_type2, ","); + while (st.hasMoreTokens()) + { + String item = st.nextToken().trim(); + if (activeChar.getActiveWeaponItem().getItemType() == WeaponType.valueOf(item)) + { + damage *= _valueIncrease; + break; + } + } + } + if (damage > 0) { // reduce damage if target has maxdamage buff @@ -111,8 +150,22 @@ public final class PhysicalAttack extends AbstractEffect } activeChar.sendDamageMessage(target, damage, false, crit, false); - target.reduceCurrentHp(damage, activeChar, info.getSkill()); - target.notifyDamageReceived(damage, activeChar, info.getSkill(), crit, false); + if (_isLastAttack && !target.isPlayer() && !target.isRaid()) + { + if (damage < target.getCurrentHp()) + { + target.setCurrentHp(1); + } + else + { + target.reduceCurrentHp(damage, activeChar, info.getSkill()); + } + } + else + { + target.reduceCurrentHp(damage, activeChar, info.getSkill()); + target.notifyDamageReceived(damage, activeChar, info.getSkill(), crit, false); + } // Check if damage should be reflected Formulas.calcDamageReflected(activeChar, target, info.getSkill(), crit); diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/StaticDamage.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/StaticDamage.java index ebcae17957..54aee10c31 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/StaticDamage.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/StaticDamage.java @@ -22,6 +22,7 @@ import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.conditions.Condition; import com.l2jserver.gameserver.model.effects.AbstractEffect; import com.l2jserver.gameserver.model.skills.BuffInfo; +import com.l2jserver.gameserver.model.stats.Stats; /** * Static Damage effect implementation. @@ -29,7 +30,7 @@ import com.l2jserver.gameserver.model.skills.BuffInfo; */ public final class StaticDamage extends AbstractEffect { - private final int _power; + private int _power; public StaticDamage(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params) { @@ -52,6 +53,13 @@ public final class StaticDamage extends AbstractEffect return; } + // reduce damage if target has maxdamage buff + double maxDamage = (info.getEffected().getStat().calcStat(Stats.MAX_SKILL_DAMAGE, 0, null, null)); + if (maxDamage > 0) + { + _power = (int) maxDamage; + } + info.getEffected().reduceCurrentHp(_power, info.getEffector(), info.getSkill()); info.getEffected().notifyDamageReceived(_power, info.getEffector(), info.getSkill(), false, false); diff --git a/trunk/dist/game/data/stats/npcs/13300-13399.xml b/trunk/dist/game/data/stats/npcs/13300-13399.xml index 04e8971243..c2e2ad743b 100644 --- a/trunk/dist/game/data/stats/npcs/13300-13399.xml +++ b/trunk/dist/game/data/stats/npcs/13300-13399.xml @@ -224,10 +224,15 @@ - - + + + + + + ETC - + ETC + @@ -235,15 +240,29 @@ - - + + - 398 - + + + + + + + + + + + + + + + + true - - + + @@ -1774,119 +1793,209 @@ - - + + + + + + ETC - - - - + ETC + + + + - + - + - 333 - - + + + + + + + + + + + + + + + + true - - + + - - + + + + + + ETC - - - - + ETC + + + + - + - + - 333 - - + + + + + + + + + + + + + + + + true - - + + - - + + + + + + ETC - - - - + ETC + + + + - + - + - 333 - - + + + + + + + + + + + + + + + + true - - + + - - + + + + + + ETC - - - - + ETC + + + + - + - + - 333 - - + + + + + + + + + + + + + + + + true - - + + - - + + + + + + ETC - - - - + ETC + + + + - + - + - 333 - - + + + + + + + + + + + + + + + + true - - + + diff --git a/trunk/dist/game/data/stats/skills/00000-00099.xml b/trunk/dist/game/data/stats/skills/00000-00099.xml index 54f1650433..7817ce828b 100644 --- a/trunk/dist/game/data/stats/skills/00000-00099.xml +++ b/trunk/dist/game/data/stats/skills/00000-00099.xml @@ -138,7 +138,6 @@ 1 3 5 6 8 10 11 13 15 16 18 20 21 23 25 26 28 30 31 33 35 36 38 40 41 43 45 46 48 50
76 76 76 77 77 77 78 78 78 79 79 79 80 80 80 81 81 81 82 82 82 83 83 83 84 84 84 85 85 85
- @@ -169,10 +168,7 @@ - - - - + @@ -221,11 +217,16 @@ + + + + + @@ -239,6 +240,8 @@ + + @@ -246,48 +249,10 @@ - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -114 -117 -119 -121 -124 -126 -129 -131 -133 -136 -138 -140 -142 -144 -146 -148 -150 -152 -154 -156 -157 -159 -160 -162 -163 -164 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 77 79 81 83 85 86 88 90 92 94 96 98
55 56 58 59 59 61 62 64 65 67 69 70 71 73 73 75 76 77 79 80 81 83 84 85 86 88 89 90 161 163 169 175 180 161 163 169 175 180 186 192 198
@@ -305,16 +270,17 @@ - - + + + @@ -330,41 +296,16 @@ + + - - - - + - - - - + - - - - - - - - - - - - - - - - - - - -
- 40 43 49 55 60 66 70 79
1 2 3 4 5 6 7 8
diff --git a/trunk/dist/game/data/stats/skills/00200-00299.xml b/trunk/dist/game/data/stats/skills/00200-00299.xml index c06d451a7e..f4d160df64 100644 --- a/trunk/dist/game/data/stats/skills/00200-00299.xml +++ b/trunk/dist/game/data/stats/skills/00200-00299.xml @@ -1624,7 +1624,6 @@ 1 3 5 6 8 10 11 13 15 16 18 20 21 23 25 26 28 30 31 33 35 36 38 40 41 43 45 46 48 50
76 76 76 77 77 77 78 78 78 79 79 79 80 80 80 81 81 81 82 82 82 83 83 83 84 84 84 85 85 85
- @@ -1656,10 +1655,7 @@ - - - - + diff --git a/trunk/dist/game/data/stats/skills/10200-10299.xml b/trunk/dist/game/data/stats/skills/10200-10299.xml index 83a495f70a..1892abd8aa 100644 --- a/trunk/dist/game/data/stats/skills/10200-10299.xml +++ b/trunk/dist/game/data/stats/skills/10200-10299.xml @@ -464,7 +464,7 @@ - + @@ -490,52 +490,112 @@ - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1 2 3 4 5 6
@@ -568,41 +628,132 @@ - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1 2 3 4 5 6 7 8
@@ -756,7 +907,7 @@ - + @@ -920,7 +1071,6 @@ - @@ -932,38 +1082,115 @@ - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
132 142 156 168 180 192 204 216 228 240
@@ -1156,11 +1383,14 @@ - - + + + + + @@ -1382,9 +1612,7 @@ - - @@ -1410,73 +1638,99 @@ - + - + + + +
- + 1131 1083 1037 989 942 896 848 801 753 707
- 39727 40628 41528 42429 43330 44231 45132 46033 46934 47835
- 21958 23344
+ 48735 49741 50747 51723 52759 53765 54771 55777 56783 57789
+ 44711 46723
95 98
1103 1158
+ 29000 28000 27000 26000 25000 24000 23000 22000 21000 20000
+ + + + + - - + + - + + + + + + + + +
- + + + + + + + + + + + icon.skill10284 icon.skill10284_2 icon.skill10284_3
- - 30 20 10
+ 20 10 10
2 3 3
- 1.1 1.2 1.3
+ 1.1 1.15 1.3
5 7 10
- 20 20 15
- 2 3 4
- - + 15 20 30
+ 1 2 3
+ + + + - - - - + + + - - + @@ -1489,29 +1743,24 @@
- 313
- 20
- 85
- - - - - -
- - 206 213 220 227 234 241 248 255 262 270
- 21 22 23 24 25 26 27 28 29 30
+ + + + + + + + + + +
+ + 206 213 220 227 234 241 248 255 262 270
+ 21 22 23 24 25 26 27 28 29 30
- - - - - - - @@ -1521,36 +1770,51 @@ + + + + + + + - - - - - + + + + + + + + + + + +
- 89 91 93 95 97 99
225 228 232 235 238 242
1 2 3 4 5 6
- + - - - + + + - + + +
- + 190 182 174 166 158 150 142 134 126 118
11557 11956 12754 13553 14351 15150 15948 16747
85 86 88 90 92 94 96 98
@@ -1561,34 +1825,42 @@ - - + + + - - + + + + + + + + + @@ -1596,15 +1868,21 @@ - + + + + + +
- + 137 131 125 120 114 108 102 97 91 85
61 62 63 64 65 66 67 68 69 70
1.3 1.35 1.4 1.45
1.05 1.1 1.15 1.2
85 90 95 99
+ 1 2 3 4 5 6 7 8 9 10
@@ -1619,42 +1897,64 @@ - + + - - - - - - - - - - - - - + + + + + + + + + + + + + + +
- - - 138 141 146 150 155 160 165 170
+ 138 141 146 150 155 160 165 170
+ 11557 11956 12754 13553 14351 15150 15948 16747
+ 85 86 88 90 92 94 96 98
- - - + + + + + + + + + + + + + + + + + + + + + + +
- 310 320 330 340 350 360 370 380 390 400
1 2 3 4 5 6 7 8 9 10
86 87 88 90 91 92 93 95 97 99
@@ -1689,7 +1989,6 @@
- 310 320 330 340 350 360 370 380 390 400
1 2 3 4 5 6 7 8 9 10
86 87 88 90 91 92 93 95 97 99
@@ -1715,9 +2014,6 @@
- - -
@@ -1727,16 +2023,12 @@ - - - - 310 320 330 340 350 360 370 380 390 400
1 2 3 4 5 6 7 8 9 10
86 87 88 90 91 92 93 95 97 99
@@ -1773,7 +2065,6 @@
- 310 320 330 340 350 360 370 380 390 400
1 2 3 4 5 6 7 8 9 10
86 87 88 90 91 92 93 95 97 99
@@ -1788,6 +2079,9 @@ + + + @@ -1807,7 +2101,6 @@
- 310 320 330 340 350 360 370 380 390 400
1 2 3 4 5 6 7 8 9 10
86 87 88 90 91 92 93 95 97 99
@@ -1822,6 +2115,9 @@ + + + @@ -1840,8 +2136,8 @@
- - 1810 1820 1830 1840 1850 1860 1870 1880 1890 1900
+ + 1920 2040 2160 2280 2400 2520 2640 2760 2880 3000
@@ -1850,24 +2146,24 @@ - + - - - + + + - - - + + +
- - 1810 1820 1830 1840 1850 1860 1870 1880 1890 1900
+ + 1920 2040 2160 2280 2400 2520 2640 2760 2880 3000
@@ -1876,39 +2172,39 @@ - + - - - - + + + + - - - - + + + +
- - - + - + + + - + @@ -1916,4 +2212,4 @@ - + \ No newline at end of file diff --git a/trunk/dist/game/data/stats/skills/10300-10399.xml b/trunk/dist/game/data/stats/skills/10300-10399.xml index 120de840af..78bad603db 100644 --- a/trunk/dist/game/data/stats/skills/10300-10399.xml +++ b/trunk/dist/game/data/stats/skills/10300-10399.xml @@ -1,110 +1,139 @@ - - - - - - - - - - - - - - - - - - - - - - - - + 52746 59601 65085
+ 66456 67827 69198 70569 71940 73311 74682 76053 77424 78795
90 95 99
276 297 315
+ 310 306 301 297 292 288 283 279 275 270
+ 11 12 13 14 15 16 17 18 19 20
- + + + + + + + + + + + + + + + + + + + + +
- + - - - 98 105 112 119
+ 98 105 112 119
+ 22531 26017 29503 33377
+ -100 -200 -300 -400
+ 85 90 95 99
- - - - + + + + + + + + + + + + + + + + + + +
- - + 1.02 1.03 1.04 1.05
- - + +
- - - - 85 90 95 99
1.02 1.03 1.04 1.05
+ 709 825 982 1190
- + + + + + +
- - - 62 69 76 83
+ 62 69 76 83
+ 85 90 95 99
+ -10 -12 -15 -20
- - - + + + + + + + + + - + + + + + + + + + +
- - - - 1.02 1.03 1.04 1.05
+ 583 678 807 978
85 90 95 99
@@ -112,38 +141,56 @@ - + + + + + +
- - + + + + + + + + + + + + - + + + + + + + - - - - 1.02 1.03 1.04 1.05
+ 709 825 982 1190
85 90 95 99
@@ -151,26 +198,35 @@ - + + + + + +
- - + + + + + + + + + - - - - 1.02 1.03 1.04 1.05
+ 709 825 982 1190
85 90 95 99
@@ -178,7 +234,18 @@ - + + + + + + + + + + + +
@@ -187,6 +254,7 @@ + 85 90 95 99
@@ -194,35 +262,75 @@
- - 92 98 104 110
+ 85 90 95 99
- - - + + + + + + + + - + + + + + + + + + + + + + + + + + + + +
- - - - - - + + + + + + + + + - - + + + + + + + + + + + + + + + + + - - 1.02 1.03
+ 583 678
90 90
@@ -230,14 +338,12 @@ - + + +
- - - - 1.05 1.06 1.07 1.08
85 90 95 99
@@ -247,140 +353,218 @@ - +
- - - 122 124 129 133
+ 122 124 129 133
+ 85 90 95 99
+ -173 -174 -175 -176
+ 26003 30494 35883 37680
- - - - + + + + + + + + + - + + + + + + + + + + + + + + + + + + + +
- - - - 17348 20033 22717 25700
85 90 95 99
98 105 112 119
+ -100 -200 -300 -400
- - - - - + + + - - - + + + - + + + + + + + + + + + +
- - + + + + + + + + - + - + - + + + - + + + + - - - - 22536 26428 29542 32656
85 90 95 99
122 124 129 133
+ -100 -200 -300 -400
- - - - - + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + +
- + + + + + + - - - + + + + + - - - 97 98 99
+ 1.1 1.15 1.2
+ + + + +
- - - 97 98 99
149 151 154
+ + + + + + + + + + +
- - 45 50 55
@@ -389,39 +573,62 @@ + + + + + + +
- - - - 17348 20033 22717 25700
85 90 95 99
98 105 112 119
+ -100 -200 -300 -400
- - + + + - + + + + + + + + +
- - - 97 98 99
+ 1.1 1.12 1.15
+ + + + + + + + + + + + +
- @@ -429,7 +636,18 @@ - + + + + + + + + + + + + @@ -441,18 +659,38 @@ 18005 22505 27005 30605
85 90 95 99
92 96 101 105
+ -100 -200 -300 -400
+ + + + + + - + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/trunk/dist/game/data/stats/skills/10500-10599.xml b/trunk/dist/game/data/stats/skills/10500-10599.xml index 85126e81c7..c76165a4e3 100644 --- a/trunk/dist/game/data/stats/skills/10500-10599.xml +++ b/trunk/dist/game/data/stats/skills/10500-10599.xml @@ -19,7 +19,7 @@
- + 366 388 411 433 456 478 500 523 545 568
@@ -27,26 +27,35 @@ - + + + + - + + + + + + +
- + 366 388 411 433 456 478 500 523 545 568
@@ -54,7 +63,12 @@ - + + + + + + @@ -62,46 +76,75 @@ - + + + + + +
- - 94 100 106 112 118 123 129 135 141 147
+ + + 1426 1466 1506 1546 1586 1626 1666 1706 1746 1792
- - - - - - + + - - - + + + + + + + + + + + + + + + + + - - - + + - - - + + + + + + + + + + + + + + + + +
- + 7.5 7.9 8.4 8.8 9.3 9.8 10.2 10.7 11.1 11.6
3.9 4.2 4.4 4.6 4.9 5.1 5.3 5.5 5.8 6
6.7 7.1 7.5 7.9 8.4 8.8 9.2 9.6 10 10.4
@@ -161,29 +204,34 @@
- + 574 609 644 679 715 750 785 820 855 891
- - + + + - + + - - - + + + + + +
@@ -208,47 +256,202 @@ - - - + + + + + +
- + + 59 60 62 64 66 68 71 73
+ 70 67 64 61 58 55 52 49 46 43
+ 49224 50346 51468 52591 53711 54833 55955 57077 58197 59321
+ 30 33 36 40 43 46 50 53 56 60
+ 8 8 8 8 8 8 8 8
+ 32401 33521 35765 38007 40251 42495 44737 46983
+ 8 9 10 11 12 13 14 15
+ 201 236 274 295 317 363 388 401
+ 85 86 88 90 92 94 96 98
+ 4900 4800 4700 4600 4500 4400 4300 4200 4100 4000
+ + + + + + + + + + - 59 60 62 64 66 68 71 73
- - 70 67 64 61 58 55 52 49 46 43
- 37291 38141 38991 39842 40690 41540 42390 43240 44089 44940
- 30 33 36 40 43 46 50 53 56 60
- 8 8 8 8 8 8 8 8
- 24546 25395 27095 28793 30493 32193 33892 35593
- 8 9 10 11 12 13 14 15
- 201 236 274 295 317 363 388 401
- 85 86 88 90 92 94 96 98
- - - - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + 67 68 70 73 75 77 80 82
+ 78 75 72 68 65 62 59 55 52 49
+ 30 33 36 40 43 46 50 53 56 60
+ 32427 33166 33905 34644 35383 36122 36860 37599 38338 39077
+ 85 86 88 90 92 94 96 98
+ 21344 22083 23560 25039 26516 27993 29472 30949
+ 8 9 10 11 12 13 14 15
+ 4900 4800 4700 4600 4500 4400 4300 4200 4100 4000
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + 71 73 75 78 80 83 86 88
+ 84 80 77 73 70 66 63 59 56 52
+ 34502 35288 36073 36859 37645 38430 39216 40002 40787 41573
+ 30 33 36 40 43 46 50 53 56 60
+ 3 4 5 6 7 8 9 10 11
+ 15 16 17 18 19 20 21 21
+ 22718 24289 25861 27431 29003 30574 32146 33717
+ 85 87 89 91 93 95 97 99
+ 4900 4800 4700 4600 4500 4400 4300 4200 4100 4000
+ + + + + + + + + + + + + + + @@ -270,36 +473,47 @@ + + + + + - + + + + + + +
- - - - - - 67 68 70 73 75 77 80 82
- - 78 75 72 68 65 62 59 55 52 49
+ + 90 98 106 112
+ 107 103 98 94 89 85 80 76 71 67
30 33 36 40 43 46 50 53 56 60
- 29479 30151 30823 31494 32166 32838 33509 34181 34853 35525
- 85 86 88 90 92 94 96 98
- 19404 20075 21419 22762 24105 25449 26792 28136
- 8 9 10 11 12 13 14 15
- - + 39881 40784 41688 42593 43496 44401 45305 46208 47113 48017
+ 5 8 11 14
+ 201 249 295 342
+ 3 4 5 6
+ 26320 30840 35360 38976
+ 85 90 95 99
+ 22 24 26 27
+ + + + - - - - - - + + + - + + + + @@ -322,449 +536,414 @@ - + - - - - + + +
- - - - - - 71 73 75 78 80 83 86 88
- - 84 80 77 73 70 66 63 59 56 52
- 31366 32080 32794 33508 34222 34937 35651 36365 37079 37794
- 30 33 36 40 43 46 50 53 56 60
- 3 4 5 6 7 8 9 10 11
- 15 16 17 18 19 20 21 21
- 20653 22081 23509 24938 26366 27795 29223 30651 30651
- 85 87 89 91 93 95 97 99
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - 90 98 106 112
- - 107 103 98 94 89 85 80 76 71 67
- 30 33 36 40 43 46 50 53 56 60
- 39881 40784 41688 42593 43496 44401 45305 46208 47113 48017
- 5 8 11 14
- 201 249 295 342
- 3 4 5 6
- 26320 30840 35360 38976
- 85 90 95 99
- 22 24 26 27
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - + 125 128 132 136 141 145 150 154
- 147 141 135 129 123 117 110 104 98 92
22300 22808 23316 23824 24332 24840 25348 25856 26364 26872
30 33 36 40 43 46 50 53 56 60
98 98 98 98 98 99 99 99 99 99
85 86 88 90 92 94 96 98
11903 12313 13135 13957 14779 15601 16423 17244
- + 9900 9800 9700 9600 9500 9400 9300 9200 9100 9000
+ + + - - - - + + + + + + + + + + + + + + + + + + + + +
- - - - + 138 142 147 152 156 161 166
- 159 152 146 139 132 126 119 112 106 99
30 33 36 40 43 46 50 53 56 60
23862 24405 24948 25491 26034 26577 27120 27663 28206 28749
- 98 98 98 98 98 99 99 99 99 99
85 86 88 90 92 94 96 98
13649 14529 15409 16289 17169 18049 18929
- 1 2 3 4 5 6 7
- - + 1 2 3 4 5 6 7
+ 9900 9800 9700 9600 9500 9400 9300 9200 9100 9000
+ + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + - - + +
- + + 38 40 42 44 46
+ 44 42 40 38 36 34 33 31 29 27
+ 71 72 73 74 75 76 77 78 79 80
+ 85 88 91 94 97
+ 98 98 98 98 98 99 99 99 99 99
+ 50 55 60 65 70
+ 1 2 3 4 5
+ 119000 118000 117000 116000 115000 114000 113000 112000 111000 110000
+ + + + + - + - 38 40 42 44 46
- - 44 42 40 38 36 34 33 31 29 27
- 71 72 73 74 75 76 77 78 79 80
- 85 88 91 94 97
- 50 55 60 65 70
- 1 2 3 4 5
- - - + + - - - - + - + + + + + - + + + + + + - - - + + + + +
- + 1 2 3 4 5 6
+ + + + - + - - - +
- - - - 600 600 600 600 600 600
- - + 38 39 41 43 45 47
- 45 43 41 39 37 35 33 31 30 28
610 620 630 640 650 660 670 680 690 700
85 87 90 93 96 99
- 42 43 45 46 47 49 50 51 53 54
- 800 810 820 830 840 850 860 870 880 890 900
+ 51 52 53 54 55 56 57 58 59 60
+ 910 920 930 940 950 960 970 980 990 1000
+ 6900 6800 6700 6600 6500 6400 6300 6200 6100 6000
+ + + + + + - + + - + + + + + + + + + - - - + - - - - - -
- + + 36 34 33 31 30 28 27 25 24 22
+ 51 52 53 54 55 56 57 58 59 60
+ 2 3 4 5 6 7 8 9 10 11
+ 179000 178000 177000 176000 175000 174000 173000 172000 171000 170000
- 36 34 33 31 30 28 27 25 24 22
- 51 52 53 54 55 56 57 58 59 60
- 2 3 4 5 6 7 8 9 10 11
- - - + - + - - - - - + + - + - + + +
- 21 22 23 24 25 26 27 28 29 30
- + -
- - - - + 38 41 45 47
- 45 43 41 39 37 35 33 31 30 28
31 32 33 34 35 36 37 38 39 40
- 41 42 43 44 45 46 47 48 49 50
- 1 2 3 4 5 6 7 8 9 10
+ 41 42 43 44 45 46 47 48 49 50
+ 1 2 3 4 5 6 7 8 9 10
85 90 95 99
60 65 70 75
60 70 80 90
- 25 30 35 40
+ 25 30 35 40
1 2 3 4
+ 1 2 3 4 5 6 7 8 9 10
+ 599000 598000 597000 596000 595000 594000 593000 592000 591000 590000
+ - - + + + + - + - + + + + + + - + - - - - - - - - - - - + + + + + + - + - + + + + + + - + - + + + + + + + + + + + + + + + + + + + +
- + + 76 79 83 87 91 95
+ 91 87 83 79 76 72 68 64 60 57
+ 85 87 90 93 96 99
+ 13310 13377 13378 13379 13380 13381
+ + + + - 76 79 83 87 91 95
- - 91 87 83 79 76 72 68 64 60 57
- 85 87 90 93 96 99
- 1 2 3 4 5 6
- - - - - - - - + + - + + + + +
- 85 87 90 93 96 99
687 700 721 742 762 783
0.86 0.84 0.82 0.80 0.78 0.76
@@ -772,17 +951,21 @@ 0.98 0.96 0.95 0.94 0.92 0.90
0.98 0.96 0.95 0.94 0.92 0.90
0.98 0.96 0.95 0.94 0.92 0.90
- - + 1 2 3 4 5 6
+ + + + + + + - - - + - + - + @@ -791,62 +974,53 @@
- - - - - 42 45 47
- + 45 43 41 39 37 35 33 31 30 28
11 12 13 14 15 16 17 18 19 20
90 95 100
- 100 101 102 103 104 105 106 107 108 109
91 95 99
- 523 553 585
2 3 4
+ 42 45 47
+ 149000 148000 147000 146000 145000 144000 143000 142000 141000 140000
+ - + + + + - - + - - + - + - - - - - -
- - - 60000 60000 60000 60000
- + 38 41 45 47
- 45 43 41 39 37 35 33 31 30 28
15 17 18 19 20 21 22 23 24 25
4 6 8 10
- 1 2 3 4 5 6 7 8 9 10
+ 1 2 3 4 5 6 7 8 9 10
85 90 95 99
1.1 1.2 1.3 1.4
+ 59000 58000 57000 56000 55000 54000 53000 52000 51000 50000
+ + + - + @@ -854,207 +1028,246 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + +
- + + 38 39 41 43 45 47
+ 45 43 41 39 37 35 33 31 30 28
+ 81 82 83 84 85 86 87 88 89 90
+ -1 -2 -3 -4 -5 -6 -7 -8 -9 -10
+ 85 87 90 93 96 99
+ 1 2 3 4 5 6
+ 75 76 77 78 79 80
+ 59000 58000 57000 56000 55000 54000 53000 52000 51000 50000
+ + + + + + + + - - 38 39 41 43 45 47
- - 45 43 41 39 37 35 33 31 30 28
- 81 82 83 84 85 86 87 88 89 90
- 1 2 3 4 5 6 7 8 9 10
- 85 87 90 93 96 99
- 75 76 77 78 79 80
- - - - - + + - + + - - + - - + + + + - - - + + + + - - + + + + - - + + + +
- + + 88 84 80 77 73 69 66 62 58 55
+ 86 87 88 89 90 92 93 94 95 96
+ -1 -2 -3 -4 -5 -6 -7 -8 -9 -10
+ 98 98 98 98 98 99 99 99 99 99
+ 59000 58000 57000 56000 55000 54000 53000 52000 51000 50000
+ + + + + + + - - 88 84 80 77 73 69 66 62 58 55
- 86 87 88 89 90 92 93 94 95 96
- 1 2 3 4 5 6 7 8 9 10
- - - - - - - + + + - - - +
- - - + + + - + + 68 65 62 59 56 53 51 48 45 42
+ 51 52 53 54 55 56 57 58 59 60
+ 0.69 0.68 0.67 0.66 0.65 0.64 0.63 0.62 0.61 0.6
+ + + + + + + + + + + + - - 68 65 62 59 56 53 51 48 45 42
- 61 62 63 64 65 66 67 68 69 70
- 81 82 83 84 85 86 87 88 89 90
- 516 616 716 816 916 1016 1116 1216 1316 1416
- - - - - - - - + + - +
- - + - - - + + + + + + @@ -1062,24 +1275,24 @@ - + + 45 47
+ 45 43 41 39 37 35 33 31 29 27
+ 21 22 23 24 25 26 27 28 29 30
+ 1 2 3 4 5 6 7 8 9 10
+ 30 34
+ 75 80
+ 1.4 1.45
+ 85 98
+ 599000 598000 597000 596000 595000 594000 593000 592000 591000 590000
+ + + + - 45 47
- - 45 43 41 39 37 35 33
- 21 22 23 23 24 25
- 1 2 3 4 5 6 7 8 9 10
- - 30 34
- 75 80
- 1.2 1.4
- 85 98
- - - - + @@ -1090,10 +1303,10 @@ - + - + @@ -1101,31 +1314,18 @@ - - - - - - - - - - - - - - - - - + - + + + + @@ -1133,6 +1333,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/trunk/dist/game/data/xsd/skills.xsd b/trunk/dist/game/data/xsd/skills.xsd index 7e80c7178c..0f381b80d2 100644 --- a/trunk/dist/game/data/xsd/skills.xsd +++ b/trunk/dist/game/data/xsd/skills.xsd @@ -112,6 +112,7 @@ + @@ -247,7 +248,7 @@ - + @@ -263,6 +264,13 @@ + + + + + + + @@ -395,6 +403,7 @@ + @@ -480,6 +489,8 @@ + + diff --git a/trunk/java/com/l2jserver/gameserver/engines/DocumentBase.java b/trunk/java/com/l2jserver/gameserver/engines/DocumentBase.java index 834c60aa6f..de4f64519d 100644 --- a/trunk/java/com/l2jserver/gameserver/engines/DocumentBase.java +++ b/trunk/java/com/l2jserver/gameserver/engines/DocumentBase.java @@ -115,6 +115,7 @@ import com.l2jserver.gameserver.model.conditions.ConditionTargetActiveEffectId; import com.l2jserver.gameserver.model.conditions.ConditionTargetActiveSkillId; import com.l2jserver.gameserver.model.conditions.ConditionTargetAggro; import com.l2jserver.gameserver.model.conditions.ConditionTargetClassIdRestriction; +import com.l2jserver.gameserver.model.conditions.ConditionTargetHp; import com.l2jserver.gameserver.model.conditions.ConditionTargetInvSize; import com.l2jserver.gameserver.model.conditions.ConditionTargetLevel; import com.l2jserver.gameserver.model.conditions.ConditionTargetLevelRange; @@ -1049,6 +1050,12 @@ public abstract class DocumentBase cond = joinAnd(cond, new ConditionTargetAbnormalType(abnormalType)); break; } + case "hp": + { + int hp = Integer.decode(getValue(a.getNodeValue(), template)); + cond = joinAnd(cond, new ConditionTargetHp(hp)); + break; + } case "mindistance": { int distance = Integer.decode(getValue(a.getNodeValue(), null)); diff --git a/trunk/java/com/l2jserver/gameserver/model/L2Object.java b/trunk/java/com/l2jserver/gameserver/model/L2Object.java index 182eb2c278..36b14d91ef 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2Object.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2Object.java @@ -184,7 +184,7 @@ public abstract class L2Object extends ListenersContainer implements IIdentifiab @Override public final boolean spawnMe() { - assert (getWorldRegion() == null) && (getLocation().getX() != 0) && (getLocation().getY() != 0) && (getLocation().getZ() != 0); + assert(getWorldRegion() == null) && (getLocation().getX() != 0) && (getLocation().getY() != 0) && (getLocation().getZ() != 0); synchronized (this) { @@ -569,7 +569,7 @@ public abstract class L2Object extends ListenersContainer implements IIdentifiab public void removeStatusListener(L2Character object) { - + } protected void badCoords() @@ -1007,6 +1007,15 @@ public abstract class L2Object extends ListenersContainer implements IIdentifiab return false; } + /** + * @param player + * @return {@code true} if player can ignore an invulnerable object if it's invulnerable, {@code false} otherwise. + */ + public boolean isVulnerableFor(L2Character player) + { + return !isInvul() || player.canOverrideCond(PcCondOverride.VULNERABLE_ALL_PLAYERS); + } + @Override public boolean equals(Object obj) { diff --git a/trunk/java/com/l2jserver/gameserver/model/PcCondOverride.java b/trunk/java/com/l2jserver/gameserver/model/PcCondOverride.java index 106aad01a1..d353e1ec25 100644 --- a/trunk/java/com/l2jserver/gameserver/model/PcCondOverride.java +++ b/trunk/java/com/l2jserver/gameserver/model/PcCondOverride.java @@ -38,7 +38,8 @@ public enum PcCondOverride DESTROY_ALL_ITEMS(12, "Overrides item destroy conditions"), SEE_ALL_PLAYERS(13, "Overrides the conditions to see hidden players"), TARGET_ALL(14, "Overrides target conditions"), - DROP_ALL_ITEMS(15, "Overrides item drop conditions"); + DROP_ALL_ITEMS(15, "Overrides item drop conditions"), + VULNERABLE_ALL_PLAYERS(16, "Overrides the conditions to invulnerable players"); private final int _mask; private final String _descr; diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java index be247b8e0d..bc6099f56f 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java @@ -4185,7 +4185,8 @@ public final class L2PcInstance extends L2Playable } /** - * Send packet StatusUpdate with current HP,MP and CP to the L2PcInstance and only current HP, MP and Level to all other L2PcInstance of the Party. Actions :
  • Send the Server->Client packet StatusUpdate with current HP, MP and CP to this L2PcInstance

  • + * Send packet StatusUpdate with current HP,MP and CP to the L2PcInstance and only current HP, MP and Level to all other L2PcInstance of the Party. Actions : + *
  • Send the Server->Client packet StatusUpdate with current HP, MP and CP to this L2PcInstance

  • *
  • Send the Server->Client packet PartySmallWindowUpdate with current HP, MP and Level to all other L2PcInstance of the Party
  • Caution : This method DOESN'T SEND current HP and MP to all L2PcInstance of the _statusListener */ @Override @@ -4249,8 +4250,10 @@ public final class L2PcInstance extends L2Playable /** * Send a Server->Client packet UserInfo to this L2PcInstance and CharInfo to all L2PcInstance in its _KnownPlayers. Concept : Others L2PcInstance in the detection area of the L2PcInstance are identified in _knownPlayers. In order to inform other players of this - * L2PcInstance state modifications, server just need to go through _knownPlayers to send Server->Client Packet Actions :
  • Send a Server->Client packet UserInfo to this L2PcInstance (Public and Private Data)
  • Send a Server->Client packet CharInfo to all L2PcInstance in - * _KnownPlayers of the L2PcInstance (Public data only)
  • Caution : DON'T SEND UserInfo packet to other players instead of CharInfo packet. Indeed, UserInfo packet contains PRIVATE DATA as MaxHP, STR, DEX... + * L2PcInstance state modifications, server just need to go through _knownPlayers to send Server->Client Packet Actions : + *
  • Send a Server->Client packet UserInfo to this L2PcInstance (Public and Private Data)
  • + *
  • Send a Server->Client packet CharInfo to all L2PcInstance in _KnownPlayers of the L2PcInstance (Public data only)
  • + * Caution : DON'T SEND UserInfo packet to other players instead of CharInfo packet. Indeed, UserInfo packet contains PRIVATE DATA as MaxHP, STR, DEX... */ public final void broadcastUserInfo() { @@ -4432,8 +4435,10 @@ public final class L2PcInstance extends L2Playable } /** - * Manage Interact Task with another L2PcInstance. Actions :
  • If the private store is a STORE_PRIVATE_SELL, send a Server->Client PrivateBuyListSell packet to the L2PcInstance
  • If the private store is a STORE_PRIVATE_BUY, send a Server->Client PrivateBuyListBuy packet - * to the L2PcInstance
  • If the private store is a STORE_PRIVATE_MANUFACTURE, send a Server->Client RecipeShopSellList packet to the L2PcInstance
  • + * Manage Interact Task with another L2PcInstance. Actions : + *
  • If the private store is a STORE_PRIVATE_SELL, send a Server->Client PrivateBuyListSell packet to the L2PcInstance
  • + *
  • If the private store is a STORE_PRIVATE_BUY, send a Server->Client PrivateBuyListBuy packet to the L2PcInstance
  • + *
  • If the private store is a STORE_PRIVATE_MANUFACTURE, send a Server->Client RecipeShopSellList packet to the L2PcInstance
  • * @param target The L2Character targeted */ public void doInteract(L2Character target) @@ -4507,9 +4512,13 @@ public final class L2PcInstance extends L2Playable } /** - * Manage Pickup Task. Actions :
  • Send a Server->Client packet StopMove to this L2PcInstance
  • Remove the L2ItemInstance from the world and send server->client GetItem packets
  • Send a System Message to the L2PcInstance : YOU_PICKED_UP_S1_ADENA or - * YOU_PICKED_UP_S1_S2
  • Add the Item to the L2PcInstance inventory
  • Send a Server->Client packet InventoryUpdate to this L2PcInstance with NewItem (use a new slot) or ModifiedItem (increase amount)
  • Send a Server->Client packet StatusUpdate to this L2PcInstance with - * current weight
  • Caution : If a Party is in progress, distribute Items between party members + * Manage Pickup Task. Actions : + *
  • Send a Server->Client packet StopMove to this L2PcInstance
  • + *
  • Remove the L2ItemInstance from the world and send server->client GetItem packets
  • + *
  • Send a System Message to the L2PcInstance : YOU_PICKED_UP_S1_ADENA or YOU_PICKED_UP_S1_S2
  • + *
  • Add the Item to the L2PcInstance inventory
  • + *
  • Send a Server->Client packet InventoryUpdate to this L2PcInstance with NewItem (use a new slot) or ModifiedItem (increase amount)
  • + *
  • Send a Server->Client packet StatusUpdate to this L2PcInstance with current weight
  • Caution : If a Party is in progress, distribute Items between party members * @param object The L2ItemInstance to pick up */ @Override @@ -5228,8 +5237,12 @@ public final class L2PcInstance extends L2Playable } /** - * Kill the L2Character, Apply Death Penalty, Manage gain/loss Karma and Item Drop. Actions :
  • Reduce the Experience of the L2PcInstance in function of the calculated Death Penalty
  • If necessary, unsummon the Pet of the killed L2PcInstance
  • Manage Karma gain for - * attacker and Karam loss for the killed L2PcInstance
  • If the killed L2PcInstance has Karma, manage Drop Item
  • Kill the L2PcInstance
  • + * Kill the L2Character, Apply Death Penalty, Manage gain/loss Karma and Item Drop. Actions : + *
  • Reduce the Experience of the L2PcInstance in function of the calculated Death Penalty
  • + *
  • If necessary, unsummon the Pet of the killed L2PcInstance
  • + *
  • Manage Karma gain for attacker and Karam loss for the killed L2PcInstance
  • + *
  • If the killed L2PcInstance has Karma, manage Drop Item
  • + *
  • Kill the L2PcInstance
  • * @param killer */ @Override @@ -5720,7 +5733,11 @@ public final class L2PcInstance extends L2Playable /** * Reduce the Experience (and level if necessary) of the L2PcInstance in function of the calculated Death Penalty.
    - * Actions :
  • Calculate the Experience loss
  • Set the value of _expBeforeDeath
  • Set the new Experience value of the L2PcInstance and Decrease its level if necessary
  • Send a Server->Client StatusUpdate packet with its new Experience
  • + * Actions : + *
  • Calculate the Experience loss
  • + *
  • Set the value of _expBeforeDeath
  • + *
  • Set the new Experience value of the L2PcInstance and Decrease its level if necessary
  • + *
  • Send a Server->Client StatusUpdate packet with its new Experience
  • * @param killer * @param atWar */ @@ -5795,7 +5812,9 @@ public final class L2PcInstance extends L2Playable } /** - * Stop the HP/MP/CP Regeneration task. Actions :
  • Set the RegenActive flag to False
  • Stop the HP/MP/CP Regeneration task
  • + * Stop the HP/MP/CP Regeneration task. Actions : + *
  • Set the RegenActive flag to False
  • + *
  • Stop the HP/MP/CP Regeneration task
  • */ public void stopAllTimers() { @@ -6158,7 +6177,10 @@ public final class L2PcInstance extends L2Playable } /** - * Set the Private Store type of the L2PcInstance. Values :
  • 0 : STORE_PRIVATE_NONE
  • 1 : STORE_PRIVATE_SELL
  • 2 : sellmanage

  • + * Set the Private Store type of the L2PcInstance. Values : + *
  • 0 : STORE_PRIVATE_NONE
  • + *
  • 1 : STORE_PRIVATE_SELL
  • + *
  • 2 : sellmanage

  • *
  • 3 : STORE_PRIVATE_BUY

  • *
  • 4 : buymanage

  • *
  • 5 : STORE_PRIVATE_MANUFACTURE

  • @@ -6175,7 +6197,10 @@ public final class L2PcInstance extends L2Playable } /** - * Values :
  • 0 : STORE_PRIVATE_NONE
  • 1 : STORE_PRIVATE_SELL
  • 2 : sellmanage

  • + * Values : + *
  • 0 : STORE_PRIVATE_NONE
  • + *
  • 1 : STORE_PRIVATE_SELL
  • + *
  • 2 : sellmanage

  • *
  • 3 : STORE_PRIVATE_BUY

  • *
  • 4 : buymanage

  • *
  • 5 : STORE_PRIVATE_MANUFACTURE

  • @@ -6989,8 +7014,11 @@ public final class L2PcInstance extends L2Playable } /** - * Retrieve a L2PcInstance from the characters table of the database and add it in _allObjects of the L2world. Actions :
  • Retrieve the L2PcInstance from the characters table of the database
  • Add the L2PcInstance object in _allObjects
  • Set the x,y,z position of - * the L2PcInstance and make it invisible
  • Update the overloaded status of the L2PcInstance
  • + * Retrieve a L2PcInstance from the characters table of the database and add it in _allObjects of the L2world. Actions : + *
  • Retrieve the L2PcInstance from the characters table of the database
  • + *
  • Add the L2PcInstance object in _allObjects
  • + *
  • Set the x,y,z position of the L2PcInstance and make it invisible
  • + *
  • Update the overloaded status of the L2PcInstance
  • * @param objectId Identifier of the object to initialized * @return The L2PcInstance loaded from the database */ @@ -7859,8 +7887,10 @@ public final class L2PcInstance extends L2Playable } /** - * Add a skill to the L2PcInstance _skills and its Func objects to the calculator set of the L2PcInstance and save update in the character_skills table of the database. Concept : All skills own by a L2PcInstance are identified in _skills Actions :
  • Replace - * oldSkill by newSkill or Add the newSkill
  • If an old skill has been replaced, remove all its Func objects of L2Character calculator set
  • Add Func objects of newSkill to the calculator set of the L2Character
  • + * Add a skill to the L2PcInstance _skills and its Func objects to the calculator set of the L2PcInstance and save update in the character_skills table of the database. Concept : All skills own by a L2PcInstance are identified in _skills Actions : + *
  • Replace oldSkill by newSkill or Add the newSkill
  • + *
  • If an old skill has been replaced, remove all its Func objects of L2Character calculator set
  • + *
  • Add Func objects of newSkill to the calculator set of the L2Character
  • * @param newSkill The L2Skill to add to the L2Character * @param store * @return The L2Skill replaced or null if just added a new L2Skill @@ -7891,8 +7921,10 @@ public final class L2PcInstance extends L2Playable } /** - * Remove a skill from the L2Character and its Func objects from calculator set of the L2Character and save update in the character_skills table of the database. Concept : All skills own by a L2Character are identified in _skills Actions :
  • Remove the - * skill from the L2Character _skills
  • Remove all its Func objects from the L2Character calculator set
  • Overridden in :
  • L2PcInstance : Save update in the character_skills table of the database
  • + * Remove a skill from the L2Character and its Func objects from calculator set of the L2Character and save update in the character_skills table of the database. Concept : All skills own by a L2Character are identified in _skills Actions : + *
  • Remove the skill from the L2Character _skills
  • + *
  • Remove all its Func objects from the L2Character calculator set
  • Overridden in : + *
  • L2PcInstance : Save update in the character_skills table of the database
  • * @param skill The L2Skill to remove from the L2Character * @return The L2Skill removed */ @@ -8826,7 +8858,7 @@ public final class L2PcInstance extends L2Playable switch (sklTargetType) { - // Target the player if skill type is AURA, PARTY, CLAN or SELF + // Target the player if skill type is AURA, PARTY, CLAN or SELF case AURA: case FRONT_AURA: case BEHIND_AURA: @@ -9570,7 +9602,7 @@ public final class L2PcInstance extends L2Playable } if ((magic && (item.getItem().getDefaultAction() == ActionType.SPIRITSHOT)) // - || (physical && (item.getItem().getDefaultAction() == ActionType.SOULSHOT))) + || (physical && (item.getItem().getDefaultAction() == ActionType.SOULSHOT))) { handler.useItem(this, item, false); } @@ -12855,7 +12887,7 @@ public final class L2PcInstance extends L2Playable final SystemMessage sm; - if (target.isInvul() && !target.isNpc()) + if (target.isInvul() && !target.isVulnerableFor(this) && !target.isNpc()) { sm = SystemMessage.getSystemMessage(SystemMessageId.THE_ATTACK_HAS_BEEN_BLOCKED); } diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/status/PcStatus.java b/trunk/java/com/l2jserver/gameserver/model/actor/status/PcStatus.java index 8d774361fd..5d2bb64801 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/status/PcStatus.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/status/PcStatus.java @@ -83,7 +83,7 @@ public class PcStatus extends PlayableStatus return; } - if (getActiveChar().isInvul() && !(isDOT || isHPConsumption)) + if (getActiveChar().isInvul() && !getActiveChar().isVulnerableFor(attacker) && !(isDOT || isHPConsumption)) { return; } diff --git a/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionTargetHp.java b/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionTargetHp.java new file mode 100644 index 0000000000..ad494e7c7b --- /dev/null +++ b/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionTargetHp.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2004-2015 L2J Server + * + * This file is part of L2J Server. + * + * L2J Server 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 Server 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 com.l2jserver.gameserver.model.conditions; + +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.items.L2Item; +import com.l2jserver.gameserver.model.skills.Skill; + +/** + * @author NviX + */ +public class ConditionTargetHp extends Condition +{ + private final int _hp; + + /** + * Instantiates a new condition target hp. + * @param hp the hp + */ + public ConditionTargetHp(int hp) + { + _hp = hp; + } + + @Override + public boolean testImpl(L2Character effector, L2Character effected, Skill skill, L2Item item) + { + return (effected != null) && (((effected.getCurrentHp() * 100) / effected.getMaxHp()) <= _hp); + } + +} diff --git a/trunk/java/com/l2jserver/gameserver/model/skills/Skill.java b/trunk/java/com/l2jserver/gameserver/model/skills/Skill.java index 3bc197906d..b2e5f980ff 100644 --- a/trunk/java/com/l2jserver/gameserver/model/skills/Skill.java +++ b/trunk/java/com/l2jserver/gameserver/model/skills/Skill.java @@ -200,6 +200,7 @@ public final class Skill implements IIdentifiable private final String _attribute; private final boolean _ignoreShield; + private final int _ignorePhysDefPercent; private final boolean _isSuicideAttack; private final boolean _canBeDispeled; @@ -335,6 +336,7 @@ public final class Skill implements IIdentifiable _minChance = set.getInt("minChance", Config.MIN_ABNORMAL_STATE_SUCCESS_RATE); _maxChance = set.getInt("maxChance", Config.MAX_ABNORMAL_STATE_SUCCESS_RATE); _ignoreShield = set.getBoolean("ignoreShld", false); + _ignorePhysDefPercent = set.getInt("ignorePhysDefPercent", 0); _nextActionIsAttack = set.getBoolean("nextActionAttack", false); @@ -1365,7 +1367,7 @@ public final class Skill implements IIdentifiable } // Check bad skills against target. - if ((effector != effected) && isBad() && (effected.isInvul() || (effector.isGM() && !effector.getAccessLevel().canGiveDamage()))) + if ((effector != effected) && isBad() && ((effected.isInvul() && (!effected.isVulnerableFor(effector))) || (effector.isGM() && !effector.getAccessLevel().canGiveDamage()))) { return; } @@ -1477,7 +1479,7 @@ public final class Skill implements IIdentifiable { switch (getId()) { - // TODO: replace with AI + // TODO: replace with AI case 5852: case 5853: { @@ -1652,6 +1654,14 @@ public final class Skill implements IIdentifiable return _ignoreShield; } + /** + * @return the percent of ignore defense of this skill + */ + public int getIgnorePhysDefPercent() + { + return _ignorePhysDefPercent; + } + public boolean canBeDispeled() { return _canBeDispeled; diff --git a/trunk/java/com/l2jserver/gameserver/model/stats/Formulas.java b/trunk/java/com/l2jserver/gameserver/model/stats/Formulas.java index c772540c45..a4a4f4db43 100644 --- a/trunk/java/com/l2jserver/gameserver/model/stats/Formulas.java +++ b/trunk/java/com/l2jserver/gameserver/model/stats/Formulas.java @@ -746,17 +746,23 @@ public final class Formulas } damage = (skill != null) ? ((damage * ssBoost) + skill.getPower(attacker, target, isPvP, isPvE)) : (damage * ssBoost); + double reduceDef = 1; + if (skill != null) + { + reduceDef -= (skill.getIgnorePhysDefPercent() / 100.0); + } + if (crit) { // Finally retail like formula - damage = 2 * attacker.calcStat(Stats.CRITICAL_DAMAGE, 1, target, skill) * target.calcStat(Stats.DEFENCE_CRITICAL_DAMAGE, 1, target, null) * ((70 * damage) / defence); + damage = 2 * attacker.calcStat(Stats.CRITICAL_DAMAGE, 1, target, skill) * target.calcStat(Stats.DEFENCE_CRITICAL_DAMAGE, 1, target, null) * ((70 * damage) / (defence * reduceDef)); // Crit dmg add is almost useless in normal hits... - damage += ((attacker.calcStat(Stats.CRITICAL_DAMAGE_ADD, 0, target, skill) * 70) / defence); + damage += ((attacker.calcStat(Stats.CRITICAL_DAMAGE_ADD, 0, target, skill) * 70) / (defence * reduceDef)); damage += target.calcStat(Stats.DEFENCE_CRITICAL_DAMAGE_ADD, 0, target, skill); } else { - damage = (70 * damage) / defence; + damage = (70 * damage) / (defence * reduceDef); } damage *= calcAttackTraitBonus(attacker, target); diff --git a/trunk/java/com/l2jserver/gameserver/model/stats/Stats.java b/trunk/java/com/l2jserver/gameserver/model/stats/Stats.java index 06ea0754c3..aa700a2409 100644 --- a/trunk/java/com/l2jserver/gameserver/model/stats/Stats.java +++ b/trunk/java/com/l2jserver/gameserver/model/stats/Stats.java @@ -59,6 +59,7 @@ public enum Stats CRITICAL_DAMAGE_ADD("cAtkAdd"), // this is another type for special critical damage mods - vicious stance, critical power and critical damage SA MAGIC_CRIT_DMG("mCritPower"), MAGIC_CRIT_DMG_ADD("mCritPowerAdd"), + MOMENTUM_SKILL_POWER("momentumSkillPower"), // PVP BONUS PVP_PHYSICAL_DMG("pvpPhysDmg"),