From 0038104d78abd248d84cf93650945cef9d5ea50c Mon Sep 17 00:00:00 2001 From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com> Date: Tue, 11 Jun 2019 09:11:03 +0000 Subject: [PATCH] Additional weakness calculations. --- .../handlers/effecthandlers/AttackTrait.java | 12 ++- .../handlers/effecthandlers/DefenceTrait.java | 19 +++- .../handlers/effecthandlers/EnergyAttack.java | 3 +- .../effecthandlers/PhysicalAttack.java | 3 +- .../effecthandlers/PhysicalAttackHpLink.java | 3 +- .../effecthandlers/PhysicalAttackSaveHp.java | 3 +- .../PhysicalAttackWeaponBonus.java | 3 +- .../effecthandlers/PhysicalSoulAttack.java | 3 +- .../model/actor/stat/CreatureStat.java | 86 +++++++++++++++++-- .../gameserver/model/stats/Formulas.java | 32 +++++-- .../gameserver/model/stats/TraitType.java | 30 +++++++ .../handlers/effecthandlers/AttackTrait.java | 12 ++- .../handlers/effecthandlers/DefenceTrait.java | 19 +++- .../handlers/effecthandlers/EnergyAttack.java | 3 +- .../effecthandlers/PhysicalAttack.java | 3 +- .../effecthandlers/PhysicalAttackHpLink.java | 3 +- .../effecthandlers/PhysicalAttackSaveHp.java | 3 +- .../PhysicalAttackWeaponBonus.java | 3 +- .../effecthandlers/PhysicalSoulAttack.java | 3 +- .../model/actor/stat/CreatureStat.java | 86 +++++++++++++++++-- .../gameserver/model/stats/Formulas.java | 32 +++++-- .../gameserver/model/stats/TraitType.java | 30 +++++++ .../handlers/effecthandlers/AttackTrait.java | 12 ++- .../handlers/effecthandlers/DefenceTrait.java | 19 +++- .../handlers/effecthandlers/EnergyAttack.java | 3 +- .../effecthandlers/PhysicalAttack.java | 3 +- .../effecthandlers/PhysicalAttackHpLink.java | 3 +- .../effecthandlers/PhysicalAttackSaveHp.java | 3 +- .../PhysicalAttackWeaponBonus.java | 3 +- .../effecthandlers/PhysicalSoulAttack.java | 3 +- .../model/actor/stat/CreatureStat.java | 86 +++++++++++++++++-- .../gameserver/model/stats/Formulas.java | 32 +++++-- .../gameserver/model/stats/TraitType.java | 30 +++++++ .../handlers/effecthandlers/AttackTrait.java | 12 ++- .../handlers/effecthandlers/DefenceTrait.java | 19 +++- .../handlers/effecthandlers/EnergyAttack.java | 3 +- .../effecthandlers/PhysicalAttack.java | 3 +- .../effecthandlers/PhysicalAttackHpLink.java | 3 +- .../effecthandlers/PhysicalAttackSaveHp.java | 3 +- .../PhysicalAttackWeaponBonus.java | 3 +- .../effecthandlers/PhysicalSoulAttack.java | 3 +- .../model/actor/stat/CreatureStat.java | 86 +++++++++++++++++-- .../gameserver/model/stats/Formulas.java | 32 +++++-- .../gameserver/model/stats/TraitType.java | 30 +++++++ .../handlers/effecthandlers/AttackTrait.java | 12 ++- .../handlers/effecthandlers/DefenceTrait.java | 19 +++- .../handlers/effecthandlers/EnergyAttack.java | 3 +- .../effecthandlers/PhysicalAttack.java | 3 +- .../effecthandlers/PhysicalAttackHpLink.java | 3 +- .../effecthandlers/PhysicalAttackSaveHp.java | 3 +- .../PhysicalAttackWeaponBonus.java | 3 +- .../effecthandlers/PhysicalSoulAttack.java | 3 +- .../game/data/stats/skills/08900-08999.xml | 3 - .../model/actor/stat/CreatureStat.java | 86 +++++++++++++++++-- .../gameserver/model/stats/Formulas.java | 32 +++++-- .../gameserver/model/stats/TraitType.java | 30 +++++++ .../handlers/effecthandlers/AttackTrait.java | 12 ++- .../handlers/effecthandlers/DefenceTrait.java | 19 +++- .../handlers/effecthandlers/EnergyAttack.java | 3 +- .../effecthandlers/PhysicalAttack.java | 3 +- .../effecthandlers/PhysicalAttackHpLink.java | 3 +- .../effecthandlers/PhysicalAttackSaveHp.java | 3 +- .../PhysicalAttackWeaponBonus.java | 3 +- .../effecthandlers/PhysicalSoulAttack.java | 3 +- .../game/data/stats/skills/08900-08999.xml | 3 - .../model/actor/stat/CreatureStat.java | 86 +++++++++++++++++-- .../gameserver/model/stats/Formulas.java | 32 +++++-- .../gameserver/model/stats/TraitType.java | 30 +++++++ .../handlers/effecthandlers/AttackTrait.java | 12 ++- .../handlers/effecthandlers/DefenceTrait.java | 19 +++- .../handlers/effecthandlers/EnergyAttack.java | 3 +- .../effecthandlers/PhysicalAttack.java | 3 +- .../effecthandlers/PhysicalAttackHpLink.java | 3 +- .../effecthandlers/PhysicalAttackSaveHp.java | 3 +- .../PhysicalAttackWeaponBonus.java | 3 +- .../effecthandlers/PhysicalSoulAttack.java | 3 +- .../game/data/stats/skills/08900-08999.xml | 3 - .../model/actor/stat/CreatureStat.java | 86 +++++++++++++++++-- .../gameserver/model/stats/Formulas.java | 32 +++++-- .../gameserver/model/stats/TraitType.java | 30 +++++++ .../handlers/effecthandlers/AttackTrait.java | 12 ++- .../handlers/effecthandlers/DefenceTrait.java | 19 +++- .../handlers/effecthandlers/EnergyAttack.java | 3 +- .../effecthandlers/PhysicalAttack.java | 3 +- .../effecthandlers/PhysicalAttackHpLink.java | 3 +- .../effecthandlers/PhysicalAttackSaveHp.java | 3 +- .../PhysicalAttackWeaponBonus.java | 3 +- .../effecthandlers/PhysicalSoulAttack.java | 3 +- .../model/actor/stat/CreatureStat.java | 86 +++++++++++++++++-- .../gameserver/model/stats/Formulas.java | 32 +++++-- .../gameserver/model/stats/TraitType.java | 30 +++++++ .../handlers/effecthandlers/AttackTrait.java | 12 ++- .../handlers/effecthandlers/DefenceTrait.java | 19 +++- .../handlers/effecthandlers/EnergyAttack.java | 3 +- .../effecthandlers/PhysicalAttack.java | 3 +- .../effecthandlers/PhysicalAttackHpLink.java | 3 +- .../effecthandlers/PhysicalAttackSaveHp.java | 3 +- .../PhysicalAttackWeaponBonus.java | 3 +- .../effecthandlers/PhysicalSoulAttack.java | 3 +- .../model/actor/stat/CreatureStat.java | 86 +++++++++++++++++-- .../gameserver/model/stats/Formulas.java | 32 +++++-- .../gameserver/model/stats/TraitType.java | 30 +++++++ .../handlers/effecthandlers/AttackTrait.java | 12 ++- .../handlers/effecthandlers/DefenceTrait.java | 19 +++- .../handlers/effecthandlers/EnergyAttack.java | 3 +- .../effecthandlers/PhysicalAttack.java | 3 +- .../effecthandlers/PhysicalAttackHpLink.java | 3 +- .../effecthandlers/PhysicalAttackSaveHp.java | 3 +- .../PhysicalAttackWeaponBonus.java | 3 +- .../effecthandlers/PhysicalSoulAttack.java | 3 +- .../model/actor/stat/CreatureStat.java | 86 +++++++++++++++++-- .../gameserver/model/stats/Formulas.java | 32 +++++-- .../gameserver/model/stats/TraitType.java | 30 +++++++ .../handlers/effecthandlers/AttackTrait.java | 12 ++- .../handlers/effecthandlers/DefenceTrait.java | 19 +++- .../handlers/effecthandlers/EnergyAttack.java | 3 +- .../effecthandlers/PhysicalAttack.java | 3 +- .../effecthandlers/PhysicalAttackHpLink.java | 3 +- .../effecthandlers/PhysicalAttackSaveHp.java | 3 +- .../PhysicalAttackWeaponBonus.java | 3 +- .../effecthandlers/PhysicalSoulAttack.java | 3 +- .../model/actor/stat/CreatureStat.java | 86 +++++++++++++++++-- .../gameserver/model/stats/Formulas.java | 32 +++++-- .../gameserver/model/stats/TraitType.java | 30 +++++++ .../handlers/effecthandlers/AttackTrait.java | 12 ++- .../handlers/effecthandlers/DefenceTrait.java | 19 +++- .../handlers/effecthandlers/EnergyAttack.java | 3 +- .../effecthandlers/PhysicalAttack.java | 3 +- .../effecthandlers/PhysicalAttackHpLink.java | 3 +- .../effecthandlers/PhysicalAttackSaveHp.java | 3 +- .../PhysicalAttackWeaponBonus.java | 3 +- .../effecthandlers/PhysicalSoulAttack.java | 3 +- .../model/actor/stat/CreatureStat.java | 86 +++++++++++++++++-- .../gameserver/model/stats/Formulas.java | 32 +++++-- .../gameserver/model/stats/TraitType.java | 30 +++++++ 135 files changed, 2100 insertions(+), 273 deletions(-) diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java index 9df5b90529..3cdadad6a2 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,11 +50,20 @@ public final class AttackTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _attackTraits.entrySet()) { effected.getStat().mergeAttackTrait(trait.getKey(), trait.getValue()); } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _attackTraits.entrySet()) + { + effected.getStat().removeAttackTrait(trait.getKey(), trait.getValue()); + } + } } diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java index 1f3920a0ba..0214d1df61 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,7 +50,7 @@ public final class DefenceTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _defenceTraits.entrySet()) { @@ -63,4 +64,20 @@ public final class DefenceTrait extends AbstractEffect } } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _defenceTraits.entrySet()) + { + if (trait.getValue() < 2.0f) + { + effected.getStat().removeDefenceTrait(trait.getKey(), trait.getValue()); + } + else + { + effected.getStat().removeInvulnerableTrait(trait.getKey()); + } + } + } } diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index f36b4be75a..f2c1613953 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -125,6 +125,7 @@ public final class EnergyAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(attacker, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(attacker, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(attacker, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(attacker, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(attacker, effected, skill, true); @@ -148,7 +149,7 @@ public final class EnergyAttack extends AbstractEffect // ATTACK CALCULATION ((77 * ((pAtk * lvlMod) + power) * (1 + (0.1 * chargesConsumed)) / pdef) * skillPower) + skillPowerAdd // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (77 * ((attacker.getPAtk() * attacker.getLevelMod()) + _power + effector.getStat().getValue(Stats.SKILL_POWER_ADD, 0))) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * energyChargesBoost * pvpPveMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * energyChargesBoost * pvpPveMod; } damage = Math.max(0, damage * effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1)); diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java index 28f03616cc..5cb6635ec6 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java @@ -141,6 +141,7 @@ public final class PhysicalAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -168,7 +169,7 @@ public final class PhysicalAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java index f2bd264530..e0182d7a42 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java @@ -101,6 +101,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -127,7 +128,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); damage *= -((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2; } diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java index 0f1db612ea..1da8ce17a2 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java @@ -114,6 +114,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -140,7 +141,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java index 5d5a93da7e..6e8bed6af4 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java @@ -134,6 +134,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -161,7 +162,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java index 8d43deff89..e09ec28eb5 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java @@ -128,6 +128,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -155,7 +156,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index 3736463d85..a4b69a0925 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -87,6 +87,11 @@ public class CreatureStat public CreatureStat(Creature creature) { _creature = creature; + for (int i = 0; i < TraitType.values().length; i++) + { + _attackTraitValues[i] = 1; + _defenceTraitValues[i] = 1; + } } /** @@ -583,8 +588,33 @@ public class CreatureStat public void mergeAttackTrait(TraitType traitType, float value) { - _attackTraitValues[traitType.ordinal()] *= value; - _attackTraits.add(traitType); + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] *= value; + _attackTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeAttackTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] /= value; + if (_attackTraitValues[traitType.ordinal()] == 1) + { + _attackTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getAttackTrait(TraitType traitType) @@ -615,8 +645,33 @@ public class CreatureStat public void mergeDefenceTrait(TraitType traitType, float value) { - _defenceTraitValues[traitType.ordinal()] *= value; - _defenceTraits.add(traitType); + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] *= value; + _defenceTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeDefenceTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] /= value; + if (_defenceTraitValues[traitType.ordinal()] == 1) + { + _defenceTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getDefenceTrait(TraitType traitType) @@ -647,7 +702,28 @@ public class CreatureStat public void mergeInvulnerableTrait(TraitType traitType) { - _invulnerableTraits.add(traitType); + _lock.readLock().lock(); + try + { + _invulnerableTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeInvulnerableTrait(TraitType traitType) + { + _lock.readLock().lock(); + try + { + _invulnerableTraits.remove(traitType); + } + finally + { + _lock.readLock().unlock(); + } } public boolean isInvulnerableTrait(TraitType traitType) diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/Formulas.java index a83af5aca0..1dc2e5f29a 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -94,14 +94,15 @@ public final class Formulas } // Critical - final double criticalMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1)); + final double criticalMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1); final double criticalPositionMod = attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target)); - final double criticalVulnMod = (target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1)); - final double criticalAddMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0)); + final double criticalVulnMod = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1); + final double criticalAddMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0); final double criticalAddVuln = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_ADD, 0); // Trait, elements final double weaponTraitMod = calcWeaponTraitBonus(attacker, target); final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, true); @@ -122,8 +123,8 @@ public final class Formulas // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ - final double baseMod = ((77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence); - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; return damage; } @@ -136,6 +137,7 @@ public final class Formulas // Trait, elements final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, mcrit); @@ -178,7 +180,7 @@ public final class Formulas } } - damage = damage * critMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + damage = damage * critMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; damage *= attacker.getStat().getValue(Stats.MAGICAL_SKILL_POWER, 1); return damage; @@ -1270,8 +1272,20 @@ public final class Formulas } } - final double result = (attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType)) + 1.0; - return CommonUtil.constrain(result, 0.05, 2.0); + return Math.max(attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType), 0.05); + } + + public static double calcWeaknessBonus(Creature attacker, Creature target, TraitType traitType) + { + double result = 1; + for (TraitType trait : TraitType.getAllWeakness()) + { + if ((traitType != trait) && target.getStat().hasDefenceTrait(trait) && attacker.getStat().hasAttackTrait(trait) && !target.getStat().isInvulnerableTrait(traitType)) + { + result *= Math.max(attacker.getStat().getAttackTrait(trait) - target.getStat().getDefenceTrait(trait), 0.05); + } + } + return result; } public static double calcWeaponTraitBonus(Creature attacker, Creature target) @@ -1300,7 +1314,7 @@ public final class Formulas } } - return CommonUtil.constrain((weaponTraitBonus * weaknessBonus), 0.05, 2.0); + return Math.max(weaponTraitBonus * weaknessBonus, 0.05); } public static double getBasicPropertyResistBonus(BasicProperty basicProperty, Creature target) diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/TraitType.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/TraitType.java index abf37ea7e5..4c34ba4378 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/TraitType.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/TraitType.java @@ -16,6 +16,9 @@ */ package org.l2jmobius.gameserver.model.stats; +import java.util.ArrayList; +import java.util.List; + /** * @author UnAfraid, NosBit */ @@ -88,6 +91,33 @@ public enum TraitType SPIRIT_WEAKNESS(2); private final int _type; // 1 = weapon, 2 = weakness, 3 = resistance + private final static List _weaknesses = new ArrayList<>(); + static + { + _weaknesses.add(BUG_WEAKNESS); + _weaknesses.add(ANIMAL_WEAKNESS); + _weaknesses.add(PLANT_WEAKNESS); + _weaknesses.add(BEAST_WEAKNESS); + _weaknesses.add(DRAGON_WEAKNESS); + _weaknesses.add(GIANT_WEAKNESS); + _weaknesses.add(CONSTRUCT_WEAKNESS); + _weaknesses.add(VALAKAS); + _weaknesses.add(ANESTHESIA); + _weaknesses.add(DEMONIC_WEAKNESS); + _weaknesses.add(DIVINE_WEAKNESS); + _weaknesses.add(ELEMENTAL_WEAKNESS); + _weaknesses.add(FAIRY_WEAKNESS); + _weaknesses.add(HUMAN_WEAKNESS); + _weaknesses.add(HUMANOID_WEAKNESS); + _weaknesses.add(UNDEAD_WEAKNESS); + _weaknesses.add(EMBRYO_WEAKNESS); + _weaknesses.add(SPIRIT_WEAKNESS); + } + + public static List getAllWeakness() + { + return _weaknesses; + } TraitType(int type) { diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java index 9df5b90529..3cdadad6a2 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java +++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,11 +50,20 @@ public final class AttackTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _attackTraits.entrySet()) { effected.getStat().mergeAttackTrait(trait.getKey(), trait.getValue()); } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _attackTraits.entrySet()) + { + effected.getStat().removeAttackTrait(trait.getKey(), trait.getValue()); + } + } } diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java index 1f3920a0ba..0214d1df61 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java +++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,7 +50,7 @@ public final class DefenceTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _defenceTraits.entrySet()) { @@ -63,4 +64,20 @@ public final class DefenceTrait extends AbstractEffect } } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _defenceTraits.entrySet()) + { + if (trait.getValue() < 2.0f) + { + effected.getStat().removeDefenceTrait(trait.getKey(), trait.getValue()); + } + else + { + effected.getStat().removeInvulnerableTrait(trait.getKey()); + } + } + } } diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index f36b4be75a..f2c1613953 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -125,6 +125,7 @@ public final class EnergyAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(attacker, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(attacker, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(attacker, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(attacker, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(attacker, effected, skill, true); @@ -148,7 +149,7 @@ public final class EnergyAttack extends AbstractEffect // ATTACK CALCULATION ((77 * ((pAtk * lvlMod) + power) * (1 + (0.1 * chargesConsumed)) / pdef) * skillPower) + skillPowerAdd // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (77 * ((attacker.getPAtk() * attacker.getLevelMod()) + _power + effector.getStat().getValue(Stats.SKILL_POWER_ADD, 0))) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * energyChargesBoost * pvpPveMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * energyChargesBoost * pvpPveMod; } damage = Math.max(0, damage * effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1)); diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java index 28f03616cc..5cb6635ec6 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java +++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java @@ -141,6 +141,7 @@ public final class PhysicalAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -168,7 +169,7 @@ public final class PhysicalAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java index f2bd264530..e0182d7a42 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java +++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java @@ -101,6 +101,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -127,7 +128,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); damage *= -((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2; } diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java index 0f1db612ea..1da8ce17a2 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java +++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java @@ -114,6 +114,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -140,7 +141,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java index 5d5a93da7e..6e8bed6af4 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java +++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java @@ -134,6 +134,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -161,7 +162,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java index 8d43deff89..e09ec28eb5 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java +++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java @@ -128,6 +128,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -155,7 +156,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index 3736463d85..a4b69a0925 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -87,6 +87,11 @@ public class CreatureStat public CreatureStat(Creature creature) { _creature = creature; + for (int i = 0; i < TraitType.values().length; i++) + { + _attackTraitValues[i] = 1; + _defenceTraitValues[i] = 1; + } } /** @@ -583,8 +588,33 @@ public class CreatureStat public void mergeAttackTrait(TraitType traitType, float value) { - _attackTraitValues[traitType.ordinal()] *= value; - _attackTraits.add(traitType); + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] *= value; + _attackTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeAttackTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] /= value; + if (_attackTraitValues[traitType.ordinal()] == 1) + { + _attackTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getAttackTrait(TraitType traitType) @@ -615,8 +645,33 @@ public class CreatureStat public void mergeDefenceTrait(TraitType traitType, float value) { - _defenceTraitValues[traitType.ordinal()] *= value; - _defenceTraits.add(traitType); + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] *= value; + _defenceTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeDefenceTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] /= value; + if (_defenceTraitValues[traitType.ordinal()] == 1) + { + _defenceTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getDefenceTrait(TraitType traitType) @@ -647,7 +702,28 @@ public class CreatureStat public void mergeInvulnerableTrait(TraitType traitType) { - _invulnerableTraits.add(traitType); + _lock.readLock().lock(); + try + { + _invulnerableTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeInvulnerableTrait(TraitType traitType) + { + _lock.readLock().lock(); + try + { + _invulnerableTraits.remove(traitType); + } + finally + { + _lock.readLock().unlock(); + } } public boolean isInvulnerableTrait(TraitType traitType) diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/stats/Formulas.java index a83af5aca0..1dc2e5f29a 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -94,14 +94,15 @@ public final class Formulas } // Critical - final double criticalMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1)); + final double criticalMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1); final double criticalPositionMod = attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target)); - final double criticalVulnMod = (target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1)); - final double criticalAddMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0)); + final double criticalVulnMod = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1); + final double criticalAddMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0); final double criticalAddVuln = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_ADD, 0); // Trait, elements final double weaponTraitMod = calcWeaponTraitBonus(attacker, target); final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, true); @@ -122,8 +123,8 @@ public final class Formulas // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ - final double baseMod = ((77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence); - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; return damage; } @@ -136,6 +137,7 @@ public final class Formulas // Trait, elements final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, mcrit); @@ -178,7 +180,7 @@ public final class Formulas } } - damage = damage * critMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + damage = damage * critMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; damage *= attacker.getStat().getValue(Stats.MAGICAL_SKILL_POWER, 1); return damage; @@ -1270,8 +1272,20 @@ public final class Formulas } } - final double result = (attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType)) + 1.0; - return CommonUtil.constrain(result, 0.05, 2.0); + return Math.max(attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType), 0.05); + } + + public static double calcWeaknessBonus(Creature attacker, Creature target, TraitType traitType) + { + double result = 1; + for (TraitType trait : TraitType.getAllWeakness()) + { + if ((traitType != trait) && target.getStat().hasDefenceTrait(trait) && attacker.getStat().hasAttackTrait(trait) && !target.getStat().isInvulnerableTrait(traitType)) + { + result *= Math.max(attacker.getStat().getAttackTrait(trait) - target.getStat().getDefenceTrait(trait), 0.05); + } + } + return result; } public static double calcWeaponTraitBonus(Creature attacker, Creature target) @@ -1300,7 +1314,7 @@ public final class Formulas } } - return CommonUtil.constrain((weaponTraitBonus * weaknessBonus), 0.05, 2.0); + return Math.max(weaponTraitBonus * weaknessBonus, 0.05); } public static double getBasicPropertyResistBonus(BasicProperty basicProperty, Creature target) diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/stats/TraitType.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/stats/TraitType.java index abf37ea7e5..4c34ba4378 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/stats/TraitType.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/stats/TraitType.java @@ -16,6 +16,9 @@ */ package org.l2jmobius.gameserver.model.stats; +import java.util.ArrayList; +import java.util.List; + /** * @author UnAfraid, NosBit */ @@ -88,6 +91,33 @@ public enum TraitType SPIRIT_WEAKNESS(2); private final int _type; // 1 = weapon, 2 = weakness, 3 = resistance + private final static List _weaknesses = new ArrayList<>(); + static + { + _weaknesses.add(BUG_WEAKNESS); + _weaknesses.add(ANIMAL_WEAKNESS); + _weaknesses.add(PLANT_WEAKNESS); + _weaknesses.add(BEAST_WEAKNESS); + _weaknesses.add(DRAGON_WEAKNESS); + _weaknesses.add(GIANT_WEAKNESS); + _weaknesses.add(CONSTRUCT_WEAKNESS); + _weaknesses.add(VALAKAS); + _weaknesses.add(ANESTHESIA); + _weaknesses.add(DEMONIC_WEAKNESS); + _weaknesses.add(DIVINE_WEAKNESS); + _weaknesses.add(ELEMENTAL_WEAKNESS); + _weaknesses.add(FAIRY_WEAKNESS); + _weaknesses.add(HUMAN_WEAKNESS); + _weaknesses.add(HUMANOID_WEAKNESS); + _weaknesses.add(UNDEAD_WEAKNESS); + _weaknesses.add(EMBRYO_WEAKNESS); + _weaknesses.add(SPIRIT_WEAKNESS); + } + + public static List getAllWeakness() + { + return _weaknesses; + } TraitType(int type) { diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java index 9df5b90529..3cdadad6a2 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java +++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,11 +50,20 @@ public final class AttackTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _attackTraits.entrySet()) { effected.getStat().mergeAttackTrait(trait.getKey(), trait.getValue()); } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _attackTraits.entrySet()) + { + effected.getStat().removeAttackTrait(trait.getKey(), trait.getValue()); + } + } } diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java index 1f3920a0ba..0214d1df61 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java +++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,7 +50,7 @@ public final class DefenceTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _defenceTraits.entrySet()) { @@ -63,4 +64,20 @@ public final class DefenceTrait extends AbstractEffect } } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _defenceTraits.entrySet()) + { + if (trait.getValue() < 2.0f) + { + effected.getStat().removeDefenceTrait(trait.getKey(), trait.getValue()); + } + else + { + effected.getStat().removeInvulnerableTrait(trait.getKey()); + } + } + } } diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index f36b4be75a..f2c1613953 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -125,6 +125,7 @@ public final class EnergyAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(attacker, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(attacker, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(attacker, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(attacker, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(attacker, effected, skill, true); @@ -148,7 +149,7 @@ public final class EnergyAttack extends AbstractEffect // ATTACK CALCULATION ((77 * ((pAtk * lvlMod) + power) * (1 + (0.1 * chargesConsumed)) / pdef) * skillPower) + skillPowerAdd // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (77 * ((attacker.getPAtk() * attacker.getLevelMod()) + _power + effector.getStat().getValue(Stats.SKILL_POWER_ADD, 0))) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * energyChargesBoost * pvpPveMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * energyChargesBoost * pvpPveMod; } damage = Math.max(0, damage * effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1)); diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java index 28f03616cc..5cb6635ec6 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java +++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java @@ -141,6 +141,7 @@ public final class PhysicalAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -168,7 +169,7 @@ public final class PhysicalAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java index f2bd264530..e0182d7a42 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java +++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java @@ -101,6 +101,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -127,7 +128,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); damage *= -((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2; } diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java index 0f1db612ea..1da8ce17a2 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java +++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java @@ -114,6 +114,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -140,7 +141,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java index 5d5a93da7e..6e8bed6af4 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java +++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java @@ -134,6 +134,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -161,7 +162,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java index 8d43deff89..e09ec28eb5 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java +++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java @@ -128,6 +128,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -155,7 +156,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index 3736463d85..a4b69a0925 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -87,6 +87,11 @@ public class CreatureStat public CreatureStat(Creature creature) { _creature = creature; + for (int i = 0; i < TraitType.values().length; i++) + { + _attackTraitValues[i] = 1; + _defenceTraitValues[i] = 1; + } } /** @@ -583,8 +588,33 @@ public class CreatureStat public void mergeAttackTrait(TraitType traitType, float value) { - _attackTraitValues[traitType.ordinal()] *= value; - _attackTraits.add(traitType); + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] *= value; + _attackTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeAttackTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] /= value; + if (_attackTraitValues[traitType.ordinal()] == 1) + { + _attackTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getAttackTrait(TraitType traitType) @@ -615,8 +645,33 @@ public class CreatureStat public void mergeDefenceTrait(TraitType traitType, float value) { - _defenceTraitValues[traitType.ordinal()] *= value; - _defenceTraits.add(traitType); + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] *= value; + _defenceTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeDefenceTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] /= value; + if (_defenceTraitValues[traitType.ordinal()] == 1) + { + _defenceTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getDefenceTrait(TraitType traitType) @@ -647,7 +702,28 @@ public class CreatureStat public void mergeInvulnerableTrait(TraitType traitType) { - _invulnerableTraits.add(traitType); + _lock.readLock().lock(); + try + { + _invulnerableTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeInvulnerableTrait(TraitType traitType) + { + _lock.readLock().lock(); + try + { + _invulnerableTraits.remove(traitType); + } + finally + { + _lock.readLock().unlock(); + } } public boolean isInvulnerableTrait(TraitType traitType) diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/stats/Formulas.java index a83af5aca0..1dc2e5f29a 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -94,14 +94,15 @@ public final class Formulas } // Critical - final double criticalMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1)); + final double criticalMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1); final double criticalPositionMod = attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target)); - final double criticalVulnMod = (target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1)); - final double criticalAddMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0)); + final double criticalVulnMod = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1); + final double criticalAddMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0); final double criticalAddVuln = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_ADD, 0); // Trait, elements final double weaponTraitMod = calcWeaponTraitBonus(attacker, target); final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, true); @@ -122,8 +123,8 @@ public final class Formulas // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ - final double baseMod = ((77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence); - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; return damage; } @@ -136,6 +137,7 @@ public final class Formulas // Trait, elements final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, mcrit); @@ -178,7 +180,7 @@ public final class Formulas } } - damage = damage * critMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + damage = damage * critMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; damage *= attacker.getStat().getValue(Stats.MAGICAL_SKILL_POWER, 1); return damage; @@ -1270,8 +1272,20 @@ public final class Formulas } } - final double result = (attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType)) + 1.0; - return CommonUtil.constrain(result, 0.05, 2.0); + return Math.max(attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType), 0.05); + } + + public static double calcWeaknessBonus(Creature attacker, Creature target, TraitType traitType) + { + double result = 1; + for (TraitType trait : TraitType.getAllWeakness()) + { + if ((traitType != trait) && target.getStat().hasDefenceTrait(trait) && attacker.getStat().hasAttackTrait(trait) && !target.getStat().isInvulnerableTrait(traitType)) + { + result *= Math.max(attacker.getStat().getAttackTrait(trait) - target.getStat().getDefenceTrait(trait), 0.05); + } + } + return result; } public static double calcWeaponTraitBonus(Creature attacker, Creature target) @@ -1300,7 +1314,7 @@ public final class Formulas } } - return CommonUtil.constrain((weaponTraitBonus * weaknessBonus), 0.05, 2.0); + return Math.max(weaponTraitBonus * weaknessBonus, 0.05); } public static double getBasicPropertyResistBonus(BasicProperty basicProperty, Creature target) diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/stats/TraitType.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/stats/TraitType.java index abf37ea7e5..4c34ba4378 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/stats/TraitType.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/stats/TraitType.java @@ -16,6 +16,9 @@ */ package org.l2jmobius.gameserver.model.stats; +import java.util.ArrayList; +import java.util.List; + /** * @author UnAfraid, NosBit */ @@ -88,6 +91,33 @@ public enum TraitType SPIRIT_WEAKNESS(2); private final int _type; // 1 = weapon, 2 = weakness, 3 = resistance + private final static List _weaknesses = new ArrayList<>(); + static + { + _weaknesses.add(BUG_WEAKNESS); + _weaknesses.add(ANIMAL_WEAKNESS); + _weaknesses.add(PLANT_WEAKNESS); + _weaknesses.add(BEAST_WEAKNESS); + _weaknesses.add(DRAGON_WEAKNESS); + _weaknesses.add(GIANT_WEAKNESS); + _weaknesses.add(CONSTRUCT_WEAKNESS); + _weaknesses.add(VALAKAS); + _weaknesses.add(ANESTHESIA); + _weaknesses.add(DEMONIC_WEAKNESS); + _weaknesses.add(DIVINE_WEAKNESS); + _weaknesses.add(ELEMENTAL_WEAKNESS); + _weaknesses.add(FAIRY_WEAKNESS); + _weaknesses.add(HUMAN_WEAKNESS); + _weaknesses.add(HUMANOID_WEAKNESS); + _weaknesses.add(UNDEAD_WEAKNESS); + _weaknesses.add(EMBRYO_WEAKNESS); + _weaknesses.add(SPIRIT_WEAKNESS); + } + + public static List getAllWeakness() + { + return _weaknesses; + } TraitType(int type) { diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java index 9df5b90529..3cdadad6a2 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,11 +50,20 @@ public final class AttackTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _attackTraits.entrySet()) { effected.getStat().mergeAttackTrait(trait.getKey(), trait.getValue()); } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _attackTraits.entrySet()) + { + effected.getStat().removeAttackTrait(trait.getKey(), trait.getValue()); + } + } } diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java index 1f3920a0ba..0214d1df61 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,7 +50,7 @@ public final class DefenceTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _defenceTraits.entrySet()) { @@ -63,4 +64,20 @@ public final class DefenceTrait extends AbstractEffect } } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _defenceTraits.entrySet()) + { + if (trait.getValue() < 2.0f) + { + effected.getStat().removeDefenceTrait(trait.getKey(), trait.getValue()); + } + else + { + effected.getStat().removeInvulnerableTrait(trait.getKey()); + } + } + } } diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index f36b4be75a..f2c1613953 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -125,6 +125,7 @@ public final class EnergyAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(attacker, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(attacker, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(attacker, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(attacker, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(attacker, effected, skill, true); @@ -148,7 +149,7 @@ public final class EnergyAttack extends AbstractEffect // ATTACK CALCULATION ((77 * ((pAtk * lvlMod) + power) * (1 + (0.1 * chargesConsumed)) / pdef) * skillPower) + skillPowerAdd // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (77 * ((attacker.getPAtk() * attacker.getLevelMod()) + _power + effector.getStat().getValue(Stats.SKILL_POWER_ADD, 0))) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * energyChargesBoost * pvpPveMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * energyChargesBoost * pvpPveMod; } damage = Math.max(0, damage * effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1)); diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java index 28f03616cc..5cb6635ec6 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java @@ -141,6 +141,7 @@ public final class PhysicalAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -168,7 +169,7 @@ public final class PhysicalAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java index f2bd264530..e0182d7a42 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java @@ -101,6 +101,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -127,7 +128,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); damage *= -((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2; } diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java index 0f1db612ea..1da8ce17a2 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java @@ -114,6 +114,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -140,7 +141,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java index 5d5a93da7e..6e8bed6af4 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java @@ -134,6 +134,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -161,7 +162,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java index 8d43deff89..e09ec28eb5 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java @@ -128,6 +128,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -155,7 +156,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index 3736463d85..a4b69a0925 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -87,6 +87,11 @@ public class CreatureStat public CreatureStat(Creature creature) { _creature = creature; + for (int i = 0; i < TraitType.values().length; i++) + { + _attackTraitValues[i] = 1; + _defenceTraitValues[i] = 1; + } } /** @@ -583,8 +588,33 @@ public class CreatureStat public void mergeAttackTrait(TraitType traitType, float value) { - _attackTraitValues[traitType.ordinal()] *= value; - _attackTraits.add(traitType); + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] *= value; + _attackTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeAttackTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] /= value; + if (_attackTraitValues[traitType.ordinal()] == 1) + { + _attackTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getAttackTrait(TraitType traitType) @@ -615,8 +645,33 @@ public class CreatureStat public void mergeDefenceTrait(TraitType traitType, float value) { - _defenceTraitValues[traitType.ordinal()] *= value; - _defenceTraits.add(traitType); + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] *= value; + _defenceTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeDefenceTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] /= value; + if (_defenceTraitValues[traitType.ordinal()] == 1) + { + _defenceTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getDefenceTrait(TraitType traitType) @@ -647,7 +702,28 @@ public class CreatureStat public void mergeInvulnerableTrait(TraitType traitType) { - _invulnerableTraits.add(traitType); + _lock.readLock().lock(); + try + { + _invulnerableTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeInvulnerableTrait(TraitType traitType) + { + _lock.readLock().lock(); + try + { + _invulnerableTraits.remove(traitType); + } + finally + { + _lock.readLock().unlock(); + } } public boolean isInvulnerableTrait(TraitType traitType) diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/Formulas.java index d5ef771379..0f20e8cf54 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -94,14 +94,15 @@ public final class Formulas } // Critical - final double criticalMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1)); + final double criticalMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1); final double criticalPositionMod = attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target)); - final double criticalVulnMod = (target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1)); - final double criticalAddMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0)); + final double criticalVulnMod = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1); + final double criticalAddMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0); final double criticalAddVuln = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_ADD, 0); // Trait, elements final double weaponTraitMod = calcWeaponTraitBonus(attacker, target); final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, true); @@ -122,8 +123,8 @@ public final class Formulas // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ - final double baseMod = ((77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence); - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; return damage; } @@ -136,6 +137,7 @@ public final class Formulas // Trait, elements final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, mcrit); @@ -178,7 +180,7 @@ public final class Formulas } } - damage = damage * critMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + damage = damage * critMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; damage *= attacker.getStat().getValue(Stats.MAGICAL_SKILL_POWER, 1); return damage; @@ -1270,8 +1272,20 @@ public final class Formulas } } - final double result = (attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType)) + 1.0; - return CommonUtil.constrain(result, 0.05, 2.0); + return Math.max(attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType), 0.05); + } + + public static double calcWeaknessBonus(Creature attacker, Creature target, TraitType traitType) + { + double result = 1; + for (TraitType trait : TraitType.getAllWeakness()) + { + if ((traitType != trait) && target.getStat().hasDefenceTrait(trait) && attacker.getStat().hasAttackTrait(trait) && !target.getStat().isInvulnerableTrait(traitType)) + { + result *= Math.max(attacker.getStat().getAttackTrait(trait) - target.getStat().getDefenceTrait(trait), 0.05); + } + } + return result; } public static double calcWeaponTraitBonus(Creature attacker, Creature target) @@ -1300,7 +1314,7 @@ public final class Formulas } } - return CommonUtil.constrain((weaponTraitBonus * weaknessBonus), 0.05, 2.0); + return Math.max(weaponTraitBonus * weaknessBonus, 0.05); } public static double getBasicPropertyResistBonus(BasicProperty basicProperty, Creature target) diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/TraitType.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/TraitType.java index abf37ea7e5..4c34ba4378 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/TraitType.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/TraitType.java @@ -16,6 +16,9 @@ */ package org.l2jmobius.gameserver.model.stats; +import java.util.ArrayList; +import java.util.List; + /** * @author UnAfraid, NosBit */ @@ -88,6 +91,33 @@ public enum TraitType SPIRIT_WEAKNESS(2); private final int _type; // 1 = weapon, 2 = weakness, 3 = resistance + private final static List _weaknesses = new ArrayList<>(); + static + { + _weaknesses.add(BUG_WEAKNESS); + _weaknesses.add(ANIMAL_WEAKNESS); + _weaknesses.add(PLANT_WEAKNESS); + _weaknesses.add(BEAST_WEAKNESS); + _weaknesses.add(DRAGON_WEAKNESS); + _weaknesses.add(GIANT_WEAKNESS); + _weaknesses.add(CONSTRUCT_WEAKNESS); + _weaknesses.add(VALAKAS); + _weaknesses.add(ANESTHESIA); + _weaknesses.add(DEMONIC_WEAKNESS); + _weaknesses.add(DIVINE_WEAKNESS); + _weaknesses.add(ELEMENTAL_WEAKNESS); + _weaknesses.add(FAIRY_WEAKNESS); + _weaknesses.add(HUMAN_WEAKNESS); + _weaknesses.add(HUMANOID_WEAKNESS); + _weaknesses.add(UNDEAD_WEAKNESS); + _weaknesses.add(EMBRYO_WEAKNESS); + _weaknesses.add(SPIRIT_WEAKNESS); + } + + public static List getAllWeakness() + { + return _weaknesses; + } TraitType(int type) { diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java index 9df5b90529..3cdadad6a2 100644 --- a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java +++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,11 +50,20 @@ public final class AttackTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _attackTraits.entrySet()) { effected.getStat().mergeAttackTrait(trait.getKey(), trait.getValue()); } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _attackTraits.entrySet()) + { + effected.getStat().removeAttackTrait(trait.getKey(), trait.getValue()); + } + } } diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java index 1f3920a0ba..0214d1df61 100644 --- a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java +++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,7 +50,7 @@ public final class DefenceTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _defenceTraits.entrySet()) { @@ -63,4 +64,20 @@ public final class DefenceTrait extends AbstractEffect } } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _defenceTraits.entrySet()) + { + if (trait.getValue() < 2.0f) + { + effected.getStat().removeDefenceTrait(trait.getKey(), trait.getValue()); + } + else + { + effected.getStat().removeInvulnerableTrait(trait.getKey()); + } + } + } } diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index f36b4be75a..f2c1613953 100644 --- a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -125,6 +125,7 @@ public final class EnergyAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(attacker, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(attacker, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(attacker, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(attacker, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(attacker, effected, skill, true); @@ -148,7 +149,7 @@ public final class EnergyAttack extends AbstractEffect // ATTACK CALCULATION ((77 * ((pAtk * lvlMod) + power) * (1 + (0.1 * chargesConsumed)) / pdef) * skillPower) + skillPowerAdd // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (77 * ((attacker.getPAtk() * attacker.getLevelMod()) + _power + effector.getStat().getValue(Stats.SKILL_POWER_ADD, 0))) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * energyChargesBoost * pvpPveMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * energyChargesBoost * pvpPveMod; } damage = Math.max(0, damage * effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1)); diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java index 28f03616cc..5cb6635ec6 100644 --- a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java +++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java @@ -141,6 +141,7 @@ public final class PhysicalAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -168,7 +169,7 @@ public final class PhysicalAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java index f2bd264530..e0182d7a42 100644 --- a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java +++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java @@ -101,6 +101,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -127,7 +128,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); damage *= -((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2; } diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java index 0f1db612ea..1da8ce17a2 100644 --- a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java +++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java @@ -114,6 +114,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -140,7 +141,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java index 5d5a93da7e..6e8bed6af4 100644 --- a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java +++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java @@ -134,6 +134,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -161,7 +162,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java index 8d43deff89..e09ec28eb5 100644 --- a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java +++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java @@ -128,6 +128,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -155,7 +156,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/08900-08999.xml b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/08900-08999.xml index 5e93b5b64d..69230fe753 100644 --- a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/08900-08999.xml +++ b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/08900-08999.xml @@ -98,9 +98,6 @@ 50 PER - - 300 - diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index 3736463d85..a4b69a0925 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -87,6 +87,11 @@ public class CreatureStat public CreatureStat(Creature creature) { _creature = creature; + for (int i = 0; i < TraitType.values().length; i++) + { + _attackTraitValues[i] = 1; + _defenceTraitValues[i] = 1; + } } /** @@ -583,8 +588,33 @@ public class CreatureStat public void mergeAttackTrait(TraitType traitType, float value) { - _attackTraitValues[traitType.ordinal()] *= value; - _attackTraits.add(traitType); + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] *= value; + _attackTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeAttackTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] /= value; + if (_attackTraitValues[traitType.ordinal()] == 1) + { + _attackTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getAttackTrait(TraitType traitType) @@ -615,8 +645,33 @@ public class CreatureStat public void mergeDefenceTrait(TraitType traitType, float value) { - _defenceTraitValues[traitType.ordinal()] *= value; - _defenceTraits.add(traitType); + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] *= value; + _defenceTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeDefenceTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] /= value; + if (_defenceTraitValues[traitType.ordinal()] == 1) + { + _defenceTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getDefenceTrait(TraitType traitType) @@ -647,7 +702,28 @@ public class CreatureStat public void mergeInvulnerableTrait(TraitType traitType) { - _invulnerableTraits.add(traitType); + _lock.readLock().lock(); + try + { + _invulnerableTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeInvulnerableTrait(TraitType traitType) + { + _lock.readLock().lock(); + try + { + _invulnerableTraits.remove(traitType); + } + finally + { + _lock.readLock().unlock(); + } } public boolean isInvulnerableTrait(TraitType traitType) diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/stats/Formulas.java index d5ef771379..0f20e8cf54 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -94,14 +94,15 @@ public final class Formulas } // Critical - final double criticalMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1)); + final double criticalMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1); final double criticalPositionMod = attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target)); - final double criticalVulnMod = (target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1)); - final double criticalAddMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0)); + final double criticalVulnMod = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1); + final double criticalAddMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0); final double criticalAddVuln = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_ADD, 0); // Trait, elements final double weaponTraitMod = calcWeaponTraitBonus(attacker, target); final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, true); @@ -122,8 +123,8 @@ public final class Formulas // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ - final double baseMod = ((77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence); - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; return damage; } @@ -136,6 +137,7 @@ public final class Formulas // Trait, elements final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, mcrit); @@ -178,7 +180,7 @@ public final class Formulas } } - damage = damage * critMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + damage = damage * critMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; damage *= attacker.getStat().getValue(Stats.MAGICAL_SKILL_POWER, 1); return damage; @@ -1270,8 +1272,20 @@ public final class Formulas } } - final double result = (attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType)) + 1.0; - return CommonUtil.constrain(result, 0.05, 2.0); + return Math.max(attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType), 0.05); + } + + public static double calcWeaknessBonus(Creature attacker, Creature target, TraitType traitType) + { + double result = 1; + for (TraitType trait : TraitType.getAllWeakness()) + { + if ((traitType != trait) && target.getStat().hasDefenceTrait(trait) && attacker.getStat().hasAttackTrait(trait) && !target.getStat().isInvulnerableTrait(traitType)) + { + result *= Math.max(attacker.getStat().getAttackTrait(trait) - target.getStat().getDefenceTrait(trait), 0.05); + } + } + return result; } public static double calcWeaponTraitBonus(Creature attacker, Creature target) @@ -1300,7 +1314,7 @@ public final class Formulas } } - return CommonUtil.constrain((weaponTraitBonus * weaknessBonus), 0.05, 2.0); + return Math.max(weaponTraitBonus * weaknessBonus, 0.05); } public static double getBasicPropertyResistBonus(BasicProperty basicProperty, Creature target) diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/stats/TraitType.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/stats/TraitType.java index abf37ea7e5..4c34ba4378 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/stats/TraitType.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/stats/TraitType.java @@ -16,6 +16,9 @@ */ package org.l2jmobius.gameserver.model.stats; +import java.util.ArrayList; +import java.util.List; + /** * @author UnAfraid, NosBit */ @@ -88,6 +91,33 @@ public enum TraitType SPIRIT_WEAKNESS(2); private final int _type; // 1 = weapon, 2 = weakness, 3 = resistance + private final static List _weaknesses = new ArrayList<>(); + static + { + _weaknesses.add(BUG_WEAKNESS); + _weaknesses.add(ANIMAL_WEAKNESS); + _weaknesses.add(PLANT_WEAKNESS); + _weaknesses.add(BEAST_WEAKNESS); + _weaknesses.add(DRAGON_WEAKNESS); + _weaknesses.add(GIANT_WEAKNESS); + _weaknesses.add(CONSTRUCT_WEAKNESS); + _weaknesses.add(VALAKAS); + _weaknesses.add(ANESTHESIA); + _weaknesses.add(DEMONIC_WEAKNESS); + _weaknesses.add(DIVINE_WEAKNESS); + _weaknesses.add(ELEMENTAL_WEAKNESS); + _weaknesses.add(FAIRY_WEAKNESS); + _weaknesses.add(HUMAN_WEAKNESS); + _weaknesses.add(HUMANOID_WEAKNESS); + _weaknesses.add(UNDEAD_WEAKNESS); + _weaknesses.add(EMBRYO_WEAKNESS); + _weaknesses.add(SPIRIT_WEAKNESS); + } + + public static List getAllWeakness() + { + return _weaknesses; + } TraitType(int type) { diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java index 9df5b90529..3cdadad6a2 100644 --- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java +++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,11 +50,20 @@ public final class AttackTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _attackTraits.entrySet()) { effected.getStat().mergeAttackTrait(trait.getKey(), trait.getValue()); } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _attackTraits.entrySet()) + { + effected.getStat().removeAttackTrait(trait.getKey(), trait.getValue()); + } + } } diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java index 1f3920a0ba..0214d1df61 100644 --- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java +++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,7 +50,7 @@ public final class DefenceTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _defenceTraits.entrySet()) { @@ -63,4 +64,20 @@ public final class DefenceTrait extends AbstractEffect } } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _defenceTraits.entrySet()) + { + if (trait.getValue() < 2.0f) + { + effected.getStat().removeDefenceTrait(trait.getKey(), trait.getValue()); + } + else + { + effected.getStat().removeInvulnerableTrait(trait.getKey()); + } + } + } } diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index f36b4be75a..f2c1613953 100644 --- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -125,6 +125,7 @@ public final class EnergyAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(attacker, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(attacker, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(attacker, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(attacker, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(attacker, effected, skill, true); @@ -148,7 +149,7 @@ public final class EnergyAttack extends AbstractEffect // ATTACK CALCULATION ((77 * ((pAtk * lvlMod) + power) * (1 + (0.1 * chargesConsumed)) / pdef) * skillPower) + skillPowerAdd // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (77 * ((attacker.getPAtk() * attacker.getLevelMod()) + _power + effector.getStat().getValue(Stats.SKILL_POWER_ADD, 0))) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * energyChargesBoost * pvpPveMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * energyChargesBoost * pvpPveMod; } damage = Math.max(0, damage * effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1)); diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java index 28f03616cc..5cb6635ec6 100644 --- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java +++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java @@ -141,6 +141,7 @@ public final class PhysicalAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -168,7 +169,7 @@ public final class PhysicalAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java index f2bd264530..e0182d7a42 100644 --- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java +++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java @@ -101,6 +101,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -127,7 +128,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); damage *= -((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2; } diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java index 0f1db612ea..1da8ce17a2 100644 --- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java +++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java @@ -114,6 +114,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -140,7 +141,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java index 5d5a93da7e..6e8bed6af4 100644 --- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java +++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java @@ -134,6 +134,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -161,7 +162,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java index 8d43deff89..e09ec28eb5 100644 --- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java +++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java @@ -128,6 +128,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -155,7 +156,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/08900-08999.xml b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/08900-08999.xml index 5e93b5b64d..69230fe753 100644 --- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/08900-08999.xml +++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/08900-08999.xml @@ -98,9 +98,6 @@ 50 PER - - 300 - diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index 3736463d85..a4b69a0925 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -87,6 +87,11 @@ public class CreatureStat public CreatureStat(Creature creature) { _creature = creature; + for (int i = 0; i < TraitType.values().length; i++) + { + _attackTraitValues[i] = 1; + _defenceTraitValues[i] = 1; + } } /** @@ -583,8 +588,33 @@ public class CreatureStat public void mergeAttackTrait(TraitType traitType, float value) { - _attackTraitValues[traitType.ordinal()] *= value; - _attackTraits.add(traitType); + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] *= value; + _attackTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeAttackTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] /= value; + if (_attackTraitValues[traitType.ordinal()] == 1) + { + _attackTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getAttackTrait(TraitType traitType) @@ -615,8 +645,33 @@ public class CreatureStat public void mergeDefenceTrait(TraitType traitType, float value) { - _defenceTraitValues[traitType.ordinal()] *= value; - _defenceTraits.add(traitType); + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] *= value; + _defenceTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeDefenceTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] /= value; + if (_defenceTraitValues[traitType.ordinal()] == 1) + { + _defenceTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getDefenceTrait(TraitType traitType) @@ -647,7 +702,28 @@ public class CreatureStat public void mergeInvulnerableTrait(TraitType traitType) { - _invulnerableTraits.add(traitType); + _lock.readLock().lock(); + try + { + _invulnerableTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeInvulnerableTrait(TraitType traitType) + { + _lock.readLock().lock(); + try + { + _invulnerableTraits.remove(traitType); + } + finally + { + _lock.readLock().unlock(); + } } public boolean isInvulnerableTrait(TraitType traitType) diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/Formulas.java index d5ef771379..0f20e8cf54 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -94,14 +94,15 @@ public final class Formulas } // Critical - final double criticalMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1)); + final double criticalMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1); final double criticalPositionMod = attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target)); - final double criticalVulnMod = (target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1)); - final double criticalAddMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0)); + final double criticalVulnMod = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1); + final double criticalAddMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0); final double criticalAddVuln = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_ADD, 0); // Trait, elements final double weaponTraitMod = calcWeaponTraitBonus(attacker, target); final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, true); @@ -122,8 +123,8 @@ public final class Formulas // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ - final double baseMod = ((77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence); - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; return damage; } @@ -136,6 +137,7 @@ public final class Formulas // Trait, elements final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, mcrit); @@ -178,7 +180,7 @@ public final class Formulas } } - damage = damage * critMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + damage = damage * critMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; damage *= attacker.getStat().getValue(Stats.MAGICAL_SKILL_POWER, 1); return damage; @@ -1270,8 +1272,20 @@ public final class Formulas } } - final double result = (attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType)) + 1.0; - return CommonUtil.constrain(result, 0.05, 2.0); + return Math.max(attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType), 0.05); + } + + public static double calcWeaknessBonus(Creature attacker, Creature target, TraitType traitType) + { + double result = 1; + for (TraitType trait : TraitType.getAllWeakness()) + { + if ((traitType != trait) && target.getStat().hasDefenceTrait(trait) && attacker.getStat().hasAttackTrait(trait) && !target.getStat().isInvulnerableTrait(traitType)) + { + result *= Math.max(attacker.getStat().getAttackTrait(trait) - target.getStat().getDefenceTrait(trait), 0.05); + } + } + return result; } public static double calcWeaponTraitBonus(Creature attacker, Creature target) @@ -1300,7 +1314,7 @@ public final class Formulas } } - return CommonUtil.constrain((weaponTraitBonus * weaknessBonus), 0.05, 2.0); + return Math.max(weaponTraitBonus * weaknessBonus, 0.05); } public static double getBasicPropertyResistBonus(BasicProperty basicProperty, Creature target) diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/TraitType.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/TraitType.java index abf37ea7e5..4c34ba4378 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/TraitType.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/TraitType.java @@ -16,6 +16,9 @@ */ package org.l2jmobius.gameserver.model.stats; +import java.util.ArrayList; +import java.util.List; + /** * @author UnAfraid, NosBit */ @@ -88,6 +91,33 @@ public enum TraitType SPIRIT_WEAKNESS(2); private final int _type; // 1 = weapon, 2 = weakness, 3 = resistance + private final static List _weaknesses = new ArrayList<>(); + static + { + _weaknesses.add(BUG_WEAKNESS); + _weaknesses.add(ANIMAL_WEAKNESS); + _weaknesses.add(PLANT_WEAKNESS); + _weaknesses.add(BEAST_WEAKNESS); + _weaknesses.add(DRAGON_WEAKNESS); + _weaknesses.add(GIANT_WEAKNESS); + _weaknesses.add(CONSTRUCT_WEAKNESS); + _weaknesses.add(VALAKAS); + _weaknesses.add(ANESTHESIA); + _weaknesses.add(DEMONIC_WEAKNESS); + _weaknesses.add(DIVINE_WEAKNESS); + _weaknesses.add(ELEMENTAL_WEAKNESS); + _weaknesses.add(FAIRY_WEAKNESS); + _weaknesses.add(HUMAN_WEAKNESS); + _weaknesses.add(HUMANOID_WEAKNESS); + _weaknesses.add(UNDEAD_WEAKNESS); + _weaknesses.add(EMBRYO_WEAKNESS); + _weaknesses.add(SPIRIT_WEAKNESS); + } + + public static List getAllWeakness() + { + return _weaknesses; + } TraitType(int type) { diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java index 9df5b90529..3cdadad6a2 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,11 +50,20 @@ public final class AttackTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _attackTraits.entrySet()) { effected.getStat().mergeAttackTrait(trait.getKey(), trait.getValue()); } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _attackTraits.entrySet()) + { + effected.getStat().removeAttackTrait(trait.getKey(), trait.getValue()); + } + } } diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java index 1f3920a0ba..0214d1df61 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,7 +50,7 @@ public final class DefenceTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _defenceTraits.entrySet()) { @@ -63,4 +64,20 @@ public final class DefenceTrait extends AbstractEffect } } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _defenceTraits.entrySet()) + { + if (trait.getValue() < 2.0f) + { + effected.getStat().removeDefenceTrait(trait.getKey(), trait.getValue()); + } + else + { + effected.getStat().removeInvulnerableTrait(trait.getKey()); + } + } + } } diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index f36b4be75a..f2c1613953 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -125,6 +125,7 @@ public final class EnergyAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(attacker, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(attacker, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(attacker, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(attacker, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(attacker, effected, skill, true); @@ -148,7 +149,7 @@ public final class EnergyAttack extends AbstractEffect // ATTACK CALCULATION ((77 * ((pAtk * lvlMod) + power) * (1 + (0.1 * chargesConsumed)) / pdef) * skillPower) + skillPowerAdd // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (77 * ((attacker.getPAtk() * attacker.getLevelMod()) + _power + effector.getStat().getValue(Stats.SKILL_POWER_ADD, 0))) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * energyChargesBoost * pvpPveMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * energyChargesBoost * pvpPveMod; } damage = Math.max(0, damage * effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1)); diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java index 28f03616cc..5cb6635ec6 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java @@ -141,6 +141,7 @@ public final class PhysicalAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -168,7 +169,7 @@ public final class PhysicalAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java index f2bd264530..e0182d7a42 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java @@ -101,6 +101,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -127,7 +128,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); damage *= -((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2; } diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java index 0f1db612ea..1da8ce17a2 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java @@ -114,6 +114,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -140,7 +141,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java index 5d5a93da7e..6e8bed6af4 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java @@ -134,6 +134,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -161,7 +162,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java index 8d43deff89..e09ec28eb5 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java @@ -128,6 +128,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -155,7 +156,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/08900-08999.xml b/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/08900-08999.xml index 5e93b5b64d..69230fe753 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/08900-08999.xml +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/08900-08999.xml @@ -98,9 +98,6 @@ 50 PER - - 300 - diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index 3736463d85..a4b69a0925 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -87,6 +87,11 @@ public class CreatureStat public CreatureStat(Creature creature) { _creature = creature; + for (int i = 0; i < TraitType.values().length; i++) + { + _attackTraitValues[i] = 1; + _defenceTraitValues[i] = 1; + } } /** @@ -583,8 +588,33 @@ public class CreatureStat public void mergeAttackTrait(TraitType traitType, float value) { - _attackTraitValues[traitType.ordinal()] *= value; - _attackTraits.add(traitType); + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] *= value; + _attackTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeAttackTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] /= value; + if (_attackTraitValues[traitType.ordinal()] == 1) + { + _attackTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getAttackTrait(TraitType traitType) @@ -615,8 +645,33 @@ public class CreatureStat public void mergeDefenceTrait(TraitType traitType, float value) { - _defenceTraitValues[traitType.ordinal()] *= value; - _defenceTraits.add(traitType); + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] *= value; + _defenceTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeDefenceTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] /= value; + if (_defenceTraitValues[traitType.ordinal()] == 1) + { + _defenceTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getDefenceTrait(TraitType traitType) @@ -647,7 +702,28 @@ public class CreatureStat public void mergeInvulnerableTrait(TraitType traitType) { - _invulnerableTraits.add(traitType); + _lock.readLock().lock(); + try + { + _invulnerableTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeInvulnerableTrait(TraitType traitType) + { + _lock.readLock().lock(); + try + { + _invulnerableTraits.remove(traitType); + } + finally + { + _lock.readLock().unlock(); + } } public boolean isInvulnerableTrait(TraitType traitType) diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/Formulas.java index d5ef771379..0f20e8cf54 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -94,14 +94,15 @@ public final class Formulas } // Critical - final double criticalMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1)); + final double criticalMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1); final double criticalPositionMod = attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target)); - final double criticalVulnMod = (target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1)); - final double criticalAddMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0)); + final double criticalVulnMod = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1); + final double criticalAddMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0); final double criticalAddVuln = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_ADD, 0); // Trait, elements final double weaponTraitMod = calcWeaponTraitBonus(attacker, target); final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, true); @@ -122,8 +123,8 @@ public final class Formulas // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ - final double baseMod = ((77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence); - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; return damage; } @@ -136,6 +137,7 @@ public final class Formulas // Trait, elements final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, mcrit); @@ -178,7 +180,7 @@ public final class Formulas } } - damage = damage * critMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + damage = damage * critMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; damage *= attacker.getStat().getValue(Stats.MAGICAL_SKILL_POWER, 1); return damage; @@ -1270,8 +1272,20 @@ public final class Formulas } } - final double result = (attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType)) + 1.0; - return CommonUtil.constrain(result, 0.05, 2.0); + return Math.max(attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType), 0.05); + } + + public static double calcWeaknessBonus(Creature attacker, Creature target, TraitType traitType) + { + double result = 1; + for (TraitType trait : TraitType.getAllWeakness()) + { + if ((traitType != trait) && target.getStat().hasDefenceTrait(trait) && attacker.getStat().hasAttackTrait(trait) && !target.getStat().isInvulnerableTrait(traitType)) + { + result *= Math.max(attacker.getStat().getAttackTrait(trait) - target.getStat().getDefenceTrait(trait), 0.05); + } + } + return result; } public static double calcWeaponTraitBonus(Creature attacker, Creature target) @@ -1300,7 +1314,7 @@ public final class Formulas } } - return CommonUtil.constrain((weaponTraitBonus * weaknessBonus), 0.05, 2.0); + return Math.max(weaponTraitBonus * weaknessBonus, 0.05); } public static double getBasicPropertyResistBonus(BasicProperty basicProperty, Creature target) diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/TraitType.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/TraitType.java index 40d7bc7b8c..8b7958b8ba 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/TraitType.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/TraitType.java @@ -16,6 +16,9 @@ */ package org.l2jmobius.gameserver.model.stats; +import java.util.ArrayList; +import java.util.List; + /** * @author UnAfraid, NosBit */ @@ -88,6 +91,33 @@ public enum TraitType SPIRIT_WEAKNESS(2); private final int _type; // 1 = weapon, 2 = weakness, 3 = resistance + private final static List _weaknesses = new ArrayList<>(); + static + { + _weaknesses.add(BUG_WEAKNESS); + _weaknesses.add(ANIMAL_WEAKNESS); + _weaknesses.add(PLANT_WEAKNESS); + _weaknesses.add(BEAST_WEAKNESS); + _weaknesses.add(DRAGON_WEAKNESS); + _weaknesses.add(GIANT_WEAKNESS); + _weaknesses.add(CONSTRUCT_WEAKNESS); + _weaknesses.add(VALAKAS); + _weaknesses.add(ANESTHESIA); + _weaknesses.add(DEMONIC_WEAKNESS); + _weaknesses.add(DIVINE_WEAKNESS); + _weaknesses.add(ELEMENTAL_WEAKNESS); + _weaknesses.add(FAIRY_WEAKNESS); + _weaknesses.add(HUMAN_WEAKNESS); + _weaknesses.add(HUMANOID_WEAKNESS); + _weaknesses.add(UNDEAD_WEAKNESS); + _weaknesses.add(EMBRYO_WEAKNESS); + _weaknesses.add(SPIRIT_WEAKNESS); + } + + public static List getAllWeakness() + { + return _weaknesses; + } TraitType(int type) { diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java index 9df5b90529..3cdadad6a2 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,11 +50,20 @@ public final class AttackTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _attackTraits.entrySet()) { effected.getStat().mergeAttackTrait(trait.getKey(), trait.getValue()); } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _attackTraits.entrySet()) + { + effected.getStat().removeAttackTrait(trait.getKey(), trait.getValue()); + } + } } diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java index 1f3920a0ba..0214d1df61 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,7 +50,7 @@ public final class DefenceTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _defenceTraits.entrySet()) { @@ -63,4 +64,20 @@ public final class DefenceTrait extends AbstractEffect } } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _defenceTraits.entrySet()) + { + if (trait.getValue() < 2.0f) + { + effected.getStat().removeDefenceTrait(trait.getKey(), trait.getValue()); + } + else + { + effected.getStat().removeInvulnerableTrait(trait.getKey()); + } + } + } } diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index f36b4be75a..f2c1613953 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -125,6 +125,7 @@ public final class EnergyAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(attacker, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(attacker, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(attacker, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(attacker, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(attacker, effected, skill, true); @@ -148,7 +149,7 @@ public final class EnergyAttack extends AbstractEffect // ATTACK CALCULATION ((77 * ((pAtk * lvlMod) + power) * (1 + (0.1 * chargesConsumed)) / pdef) * skillPower) + skillPowerAdd // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (77 * ((attacker.getPAtk() * attacker.getLevelMod()) + _power + effector.getStat().getValue(Stats.SKILL_POWER_ADD, 0))) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * energyChargesBoost * pvpPveMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * energyChargesBoost * pvpPveMod; } damage = Math.max(0, damage * effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1)); diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java index 28f03616cc..5cb6635ec6 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java @@ -141,6 +141,7 @@ public final class PhysicalAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -168,7 +169,7 @@ public final class PhysicalAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java index f2bd264530..e0182d7a42 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java @@ -101,6 +101,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -127,7 +128,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); damage *= -((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2; } diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java index 0f1db612ea..1da8ce17a2 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java @@ -114,6 +114,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -140,7 +141,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java index 5d5a93da7e..6e8bed6af4 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java @@ -134,6 +134,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -161,7 +162,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java index 8d43deff89..e09ec28eb5 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java @@ -128,6 +128,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -155,7 +156,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index 513b341b70..84f6d73f03 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -87,6 +87,11 @@ public class CreatureStat public CreatureStat(Creature creature) { _creature = creature; + for (int i = 0; i < TraitType.values().length; i++) + { + _attackTraitValues[i] = 1; + _defenceTraitValues[i] = 1; + } } /** @@ -573,8 +578,33 @@ public class CreatureStat public void mergeAttackTrait(TraitType traitType, float value) { - _attackTraitValues[traitType.ordinal()] *= value; - _attackTraits.add(traitType); + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] *= value; + _attackTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeAttackTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] /= value; + if (_attackTraitValues[traitType.ordinal()] == 1) + { + _attackTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getAttackTrait(TraitType traitType) @@ -605,8 +635,33 @@ public class CreatureStat public void mergeDefenceTrait(TraitType traitType, float value) { - _defenceTraitValues[traitType.ordinal()] *= value; - _defenceTraits.add(traitType); + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] *= value; + _defenceTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeDefenceTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] /= value; + if (_defenceTraitValues[traitType.ordinal()] == 1) + { + _defenceTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getDefenceTrait(TraitType traitType) @@ -637,7 +692,28 @@ public class CreatureStat public void mergeInvulnerableTrait(TraitType traitType) { - _invulnerableTraits.add(traitType); + _lock.readLock().lock(); + try + { + _invulnerableTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeInvulnerableTrait(TraitType traitType) + { + _lock.readLock().lock(); + try + { + _invulnerableTraits.remove(traitType); + } + finally + { + _lock.readLock().unlock(); + } } public boolean isInvulnerableTrait(TraitType traitType) diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/Formulas.java index c1a1d04b72..6c114ed822 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -94,14 +94,15 @@ public final class Formulas } // Critical - final double criticalMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1)); + final double criticalMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1); final double criticalPositionMod = attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target)); - final double criticalVulnMod = (target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1)); - final double criticalAddMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0)); + final double criticalVulnMod = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1); + final double criticalAddMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0); final double criticalAddVuln = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_ADD, 0); // Trait, elements final double weaponTraitMod = calcWeaponTraitBonus(attacker, target); final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, true); @@ -122,8 +123,8 @@ public final class Formulas // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ - final double baseMod = ((77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence); - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; return damage; } @@ -136,6 +137,7 @@ public final class Formulas // Trait, elements final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, mcrit); @@ -178,7 +180,7 @@ public final class Formulas } } - damage = damage * critMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + damage = damage * critMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; damage *= attacker.getStat().getValue(Stats.MAGICAL_SKILL_POWER, 1); return damage; @@ -1270,8 +1272,20 @@ public final class Formulas } } - final double result = (attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType)) + 1.0; - return CommonUtil.constrain(result, 0.05, 2.0); + return Math.max(attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType), 0.05); + } + + public static double calcWeaknessBonus(Creature attacker, Creature target, TraitType traitType) + { + double result = 1; + for (TraitType trait : TraitType.getAllWeakness()) + { + if ((traitType != trait) && target.getStat().hasDefenceTrait(trait) && attacker.getStat().hasAttackTrait(trait) && !target.getStat().isInvulnerableTrait(traitType)) + { + result *= Math.max(attacker.getStat().getAttackTrait(trait) - target.getStat().getDefenceTrait(trait), 0.05); + } + } + return result; } public static double calcWeaponTraitBonus(Creature attacker, Creature target) @@ -1300,7 +1314,7 @@ public final class Formulas } } - return CommonUtil.constrain((weaponTraitBonus * weaknessBonus), 0.05, 2.0); + return Math.max(weaponTraitBonus * weaknessBonus, 0.05); } public static double getBasicPropertyResistBonus(BasicProperty basicProperty, Creature target) diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/TraitType.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/TraitType.java index abf37ea7e5..4c34ba4378 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/TraitType.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/TraitType.java @@ -16,6 +16,9 @@ */ package org.l2jmobius.gameserver.model.stats; +import java.util.ArrayList; +import java.util.List; + /** * @author UnAfraid, NosBit */ @@ -88,6 +91,33 @@ public enum TraitType SPIRIT_WEAKNESS(2); private final int _type; // 1 = weapon, 2 = weakness, 3 = resistance + private final static List _weaknesses = new ArrayList<>(); + static + { + _weaknesses.add(BUG_WEAKNESS); + _weaknesses.add(ANIMAL_WEAKNESS); + _weaknesses.add(PLANT_WEAKNESS); + _weaknesses.add(BEAST_WEAKNESS); + _weaknesses.add(DRAGON_WEAKNESS); + _weaknesses.add(GIANT_WEAKNESS); + _weaknesses.add(CONSTRUCT_WEAKNESS); + _weaknesses.add(VALAKAS); + _weaknesses.add(ANESTHESIA); + _weaknesses.add(DEMONIC_WEAKNESS); + _weaknesses.add(DIVINE_WEAKNESS); + _weaknesses.add(ELEMENTAL_WEAKNESS); + _weaknesses.add(FAIRY_WEAKNESS); + _weaknesses.add(HUMAN_WEAKNESS); + _weaknesses.add(HUMANOID_WEAKNESS); + _weaknesses.add(UNDEAD_WEAKNESS); + _weaknesses.add(EMBRYO_WEAKNESS); + _weaknesses.add(SPIRIT_WEAKNESS); + } + + public static List getAllWeakness() + { + return _weaknesses; + } TraitType(int type) { diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java index 9df5b90529..3cdadad6a2 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,11 +50,20 @@ public final class AttackTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _attackTraits.entrySet()) { effected.getStat().mergeAttackTrait(trait.getKey(), trait.getValue()); } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _attackTraits.entrySet()) + { + effected.getStat().removeAttackTrait(trait.getKey(), trait.getValue()); + } + } } diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java index 1f3920a0ba..0214d1df61 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,7 +50,7 @@ public final class DefenceTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _defenceTraits.entrySet()) { @@ -63,4 +64,20 @@ public final class DefenceTrait extends AbstractEffect } } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _defenceTraits.entrySet()) + { + if (trait.getValue() < 2.0f) + { + effected.getStat().removeDefenceTrait(trait.getKey(), trait.getValue()); + } + else + { + effected.getStat().removeInvulnerableTrait(trait.getKey()); + } + } + } } diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index f36b4be75a..f2c1613953 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -125,6 +125,7 @@ public final class EnergyAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(attacker, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(attacker, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(attacker, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(attacker, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(attacker, effected, skill, true); @@ -148,7 +149,7 @@ public final class EnergyAttack extends AbstractEffect // ATTACK CALCULATION ((77 * ((pAtk * lvlMod) + power) * (1 + (0.1 * chargesConsumed)) / pdef) * skillPower) + skillPowerAdd // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (77 * ((attacker.getPAtk() * attacker.getLevelMod()) + _power + effector.getStat().getValue(Stats.SKILL_POWER_ADD, 0))) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * energyChargesBoost * pvpPveMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * energyChargesBoost * pvpPveMod; } damage = Math.max(0, damage * effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1)); diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java index 28f03616cc..5cb6635ec6 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java @@ -141,6 +141,7 @@ public final class PhysicalAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -168,7 +169,7 @@ public final class PhysicalAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java index f2bd264530..e0182d7a42 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java @@ -101,6 +101,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -127,7 +128,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); damage *= -((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2; } diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java index 0f1db612ea..1da8ce17a2 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java @@ -114,6 +114,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -140,7 +141,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java index 5d5a93da7e..6e8bed6af4 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java @@ -134,6 +134,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -161,7 +162,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java index 8d43deff89..e09ec28eb5 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java @@ -128,6 +128,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -155,7 +156,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index 513b341b70..84f6d73f03 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -87,6 +87,11 @@ public class CreatureStat public CreatureStat(Creature creature) { _creature = creature; + for (int i = 0; i < TraitType.values().length; i++) + { + _attackTraitValues[i] = 1; + _defenceTraitValues[i] = 1; + } } /** @@ -573,8 +578,33 @@ public class CreatureStat public void mergeAttackTrait(TraitType traitType, float value) { - _attackTraitValues[traitType.ordinal()] *= value; - _attackTraits.add(traitType); + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] *= value; + _attackTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeAttackTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] /= value; + if (_attackTraitValues[traitType.ordinal()] == 1) + { + _attackTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getAttackTrait(TraitType traitType) @@ -605,8 +635,33 @@ public class CreatureStat public void mergeDefenceTrait(TraitType traitType, float value) { - _defenceTraitValues[traitType.ordinal()] *= value; - _defenceTraits.add(traitType); + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] *= value; + _defenceTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeDefenceTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] /= value; + if (_defenceTraitValues[traitType.ordinal()] == 1) + { + _defenceTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getDefenceTrait(TraitType traitType) @@ -637,7 +692,28 @@ public class CreatureStat public void mergeInvulnerableTrait(TraitType traitType) { - _invulnerableTraits.add(traitType); + _lock.readLock().lock(); + try + { + _invulnerableTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeInvulnerableTrait(TraitType traitType) + { + _lock.readLock().lock(); + try + { + _invulnerableTraits.remove(traitType); + } + finally + { + _lock.readLock().unlock(); + } } public boolean isInvulnerableTrait(TraitType traitType) diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/Formulas.java index c1a1d04b72..6c114ed822 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -94,14 +94,15 @@ public final class Formulas } // Critical - final double criticalMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1)); + final double criticalMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1); final double criticalPositionMod = attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target)); - final double criticalVulnMod = (target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1)); - final double criticalAddMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0)); + final double criticalVulnMod = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1); + final double criticalAddMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0); final double criticalAddVuln = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_ADD, 0); // Trait, elements final double weaponTraitMod = calcWeaponTraitBonus(attacker, target); final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, true); @@ -122,8 +123,8 @@ public final class Formulas // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ - final double baseMod = ((77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence); - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; return damage; } @@ -136,6 +137,7 @@ public final class Formulas // Trait, elements final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, mcrit); @@ -178,7 +180,7 @@ public final class Formulas } } - damage = damage * critMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + damage = damage * critMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; damage *= attacker.getStat().getValue(Stats.MAGICAL_SKILL_POWER, 1); return damage; @@ -1270,8 +1272,20 @@ public final class Formulas } } - final double result = (attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType)) + 1.0; - return CommonUtil.constrain(result, 0.05, 2.0); + return Math.max(attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType), 0.05); + } + + public static double calcWeaknessBonus(Creature attacker, Creature target, TraitType traitType) + { + double result = 1; + for (TraitType trait : TraitType.getAllWeakness()) + { + if ((traitType != trait) && target.getStat().hasDefenceTrait(trait) && attacker.getStat().hasAttackTrait(trait) && !target.getStat().isInvulnerableTrait(traitType)) + { + result *= Math.max(attacker.getStat().getAttackTrait(trait) - target.getStat().getDefenceTrait(trait), 0.05); + } + } + return result; } public static double calcWeaponTraitBonus(Creature attacker, Creature target) @@ -1300,7 +1314,7 @@ public final class Formulas } } - return CommonUtil.constrain((weaponTraitBonus * weaknessBonus), 0.05, 2.0); + return Math.max(weaponTraitBonus * weaknessBonus, 0.05); } public static double getBasicPropertyResistBonus(BasicProperty basicProperty, Creature target) diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/TraitType.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/TraitType.java index abf37ea7e5..4c34ba4378 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/TraitType.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/TraitType.java @@ -16,6 +16,9 @@ */ package org.l2jmobius.gameserver.model.stats; +import java.util.ArrayList; +import java.util.List; + /** * @author UnAfraid, NosBit */ @@ -88,6 +91,33 @@ public enum TraitType SPIRIT_WEAKNESS(2); private final int _type; // 1 = weapon, 2 = weakness, 3 = resistance + private final static List _weaknesses = new ArrayList<>(); + static + { + _weaknesses.add(BUG_WEAKNESS); + _weaknesses.add(ANIMAL_WEAKNESS); + _weaknesses.add(PLANT_WEAKNESS); + _weaknesses.add(BEAST_WEAKNESS); + _weaknesses.add(DRAGON_WEAKNESS); + _weaknesses.add(GIANT_WEAKNESS); + _weaknesses.add(CONSTRUCT_WEAKNESS); + _weaknesses.add(VALAKAS); + _weaknesses.add(ANESTHESIA); + _weaknesses.add(DEMONIC_WEAKNESS); + _weaknesses.add(DIVINE_WEAKNESS); + _weaknesses.add(ELEMENTAL_WEAKNESS); + _weaknesses.add(FAIRY_WEAKNESS); + _weaknesses.add(HUMAN_WEAKNESS); + _weaknesses.add(HUMANOID_WEAKNESS); + _weaknesses.add(UNDEAD_WEAKNESS); + _weaknesses.add(EMBRYO_WEAKNESS); + _weaknesses.add(SPIRIT_WEAKNESS); + } + + public static List getAllWeakness() + { + return _weaknesses; + } TraitType(int type) { diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java index 9df5b90529..3cdadad6a2 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,11 +50,20 @@ public final class AttackTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _attackTraits.entrySet()) { effected.getStat().mergeAttackTrait(trait.getKey(), trait.getValue()); } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _attackTraits.entrySet()) + { + effected.getStat().removeAttackTrait(trait.getKey(), trait.getValue()); + } + } } diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java index 1f3920a0ba..0214d1df61 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,7 +50,7 @@ public final class DefenceTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _defenceTraits.entrySet()) { @@ -63,4 +64,20 @@ public final class DefenceTrait extends AbstractEffect } } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _defenceTraits.entrySet()) + { + if (trait.getValue() < 2.0f) + { + effected.getStat().removeDefenceTrait(trait.getKey(), trait.getValue()); + } + else + { + effected.getStat().removeInvulnerableTrait(trait.getKey()); + } + } + } } diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index f36b4be75a..f2c1613953 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -125,6 +125,7 @@ public final class EnergyAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(attacker, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(attacker, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(attacker, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(attacker, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(attacker, effected, skill, true); @@ -148,7 +149,7 @@ public final class EnergyAttack extends AbstractEffect // ATTACK CALCULATION ((77 * ((pAtk * lvlMod) + power) * (1 + (0.1 * chargesConsumed)) / pdef) * skillPower) + skillPowerAdd // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (77 * ((attacker.getPAtk() * attacker.getLevelMod()) + _power + effector.getStat().getValue(Stats.SKILL_POWER_ADD, 0))) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * energyChargesBoost * pvpPveMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * energyChargesBoost * pvpPveMod; } damage = Math.max(0, damage * effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1)); diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java index 28f03616cc..5cb6635ec6 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java @@ -141,6 +141,7 @@ public final class PhysicalAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -168,7 +169,7 @@ public final class PhysicalAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java index f2bd264530..e0182d7a42 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java @@ -101,6 +101,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -127,7 +128,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); damage *= -((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2; } diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java index 0f1db612ea..1da8ce17a2 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java @@ -114,6 +114,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -140,7 +141,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java index 5d5a93da7e..6e8bed6af4 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java @@ -134,6 +134,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -161,7 +162,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java index 8d43deff89..e09ec28eb5 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java @@ -128,6 +128,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -155,7 +156,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index 513b341b70..84f6d73f03 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -87,6 +87,11 @@ public class CreatureStat public CreatureStat(Creature creature) { _creature = creature; + for (int i = 0; i < TraitType.values().length; i++) + { + _attackTraitValues[i] = 1; + _defenceTraitValues[i] = 1; + } } /** @@ -573,8 +578,33 @@ public class CreatureStat public void mergeAttackTrait(TraitType traitType, float value) { - _attackTraitValues[traitType.ordinal()] *= value; - _attackTraits.add(traitType); + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] *= value; + _attackTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeAttackTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] /= value; + if (_attackTraitValues[traitType.ordinal()] == 1) + { + _attackTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getAttackTrait(TraitType traitType) @@ -605,8 +635,33 @@ public class CreatureStat public void mergeDefenceTrait(TraitType traitType, float value) { - _defenceTraitValues[traitType.ordinal()] *= value; - _defenceTraits.add(traitType); + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] *= value; + _defenceTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeDefenceTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] /= value; + if (_defenceTraitValues[traitType.ordinal()] == 1) + { + _defenceTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getDefenceTrait(TraitType traitType) @@ -637,7 +692,28 @@ public class CreatureStat public void mergeInvulnerableTrait(TraitType traitType) { - _invulnerableTraits.add(traitType); + _lock.readLock().lock(); + try + { + _invulnerableTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeInvulnerableTrait(TraitType traitType) + { + _lock.readLock().lock(); + try + { + _invulnerableTraits.remove(traitType); + } + finally + { + _lock.readLock().unlock(); + } } public boolean isInvulnerableTrait(TraitType traitType) diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/Formulas.java index c1a1d04b72..6c114ed822 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -94,14 +94,15 @@ public final class Formulas } // Critical - final double criticalMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1)); + final double criticalMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1); final double criticalPositionMod = attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target)); - final double criticalVulnMod = (target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1)); - final double criticalAddMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0)); + final double criticalVulnMod = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1); + final double criticalAddMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0); final double criticalAddVuln = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_ADD, 0); // Trait, elements final double weaponTraitMod = calcWeaponTraitBonus(attacker, target); final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, true); @@ -122,8 +123,8 @@ public final class Formulas // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ - final double baseMod = ((77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence); - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; return damage; } @@ -136,6 +137,7 @@ public final class Formulas // Trait, elements final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, mcrit); @@ -178,7 +180,7 @@ public final class Formulas } } - damage = damage * critMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + damage = damage * critMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; damage *= attacker.getStat().getValue(Stats.MAGICAL_SKILL_POWER, 1); return damage; @@ -1270,8 +1272,20 @@ public final class Formulas } } - final double result = (attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType)) + 1.0; - return CommonUtil.constrain(result, 0.05, 2.0); + return Math.max(attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType), 0.05); + } + + public static double calcWeaknessBonus(Creature attacker, Creature target, TraitType traitType) + { + double result = 1; + for (TraitType trait : TraitType.getAllWeakness()) + { + if ((traitType != trait) && target.getStat().hasDefenceTrait(trait) && attacker.getStat().hasAttackTrait(trait) && !target.getStat().isInvulnerableTrait(traitType)) + { + result *= Math.max(attacker.getStat().getAttackTrait(trait) - target.getStat().getDefenceTrait(trait), 0.05); + } + } + return result; } public static double calcWeaponTraitBonus(Creature attacker, Creature target) @@ -1300,7 +1314,7 @@ public final class Formulas } } - return CommonUtil.constrain((weaponTraitBonus * weaknessBonus), 0.05, 2.0); + return Math.max(weaponTraitBonus * weaknessBonus, 0.05); } public static double getBasicPropertyResistBonus(BasicProperty basicProperty, Creature target) diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/TraitType.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/TraitType.java index abf37ea7e5..4c34ba4378 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/TraitType.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/TraitType.java @@ -16,6 +16,9 @@ */ package org.l2jmobius.gameserver.model.stats; +import java.util.ArrayList; +import java.util.List; + /** * @author UnAfraid, NosBit */ @@ -88,6 +91,33 @@ public enum TraitType SPIRIT_WEAKNESS(2); private final int _type; // 1 = weapon, 2 = weakness, 3 = resistance + private final static List _weaknesses = new ArrayList<>(); + static + { + _weaknesses.add(BUG_WEAKNESS); + _weaknesses.add(ANIMAL_WEAKNESS); + _weaknesses.add(PLANT_WEAKNESS); + _weaknesses.add(BEAST_WEAKNESS); + _weaknesses.add(DRAGON_WEAKNESS); + _weaknesses.add(GIANT_WEAKNESS); + _weaknesses.add(CONSTRUCT_WEAKNESS); + _weaknesses.add(VALAKAS); + _weaknesses.add(ANESTHESIA); + _weaknesses.add(DEMONIC_WEAKNESS); + _weaknesses.add(DIVINE_WEAKNESS); + _weaknesses.add(ELEMENTAL_WEAKNESS); + _weaknesses.add(FAIRY_WEAKNESS); + _weaknesses.add(HUMAN_WEAKNESS); + _weaknesses.add(HUMANOID_WEAKNESS); + _weaknesses.add(UNDEAD_WEAKNESS); + _weaknesses.add(EMBRYO_WEAKNESS); + _weaknesses.add(SPIRIT_WEAKNESS); + } + + public static List getAllWeakness() + { + return _weaknesses; + } TraitType(int type) { diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java index 9df5b90529..3cdadad6a2 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,11 +50,20 @@ public final class AttackTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _attackTraits.entrySet()) { effected.getStat().mergeAttackTrait(trait.getKey(), trait.getValue()); } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _attackTraits.entrySet()) + { + effected.getStat().removeAttackTrait(trait.getKey(), trait.getValue()); + } + } } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java index 1f3920a0ba..0214d1df61 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,7 +50,7 @@ public final class DefenceTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _defenceTraits.entrySet()) { @@ -63,4 +64,20 @@ public final class DefenceTrait extends AbstractEffect } } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _defenceTraits.entrySet()) + { + if (trait.getValue() < 2.0f) + { + effected.getStat().removeDefenceTrait(trait.getKey(), trait.getValue()); + } + else + { + effected.getStat().removeInvulnerableTrait(trait.getKey()); + } + } + } } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index f36b4be75a..f2c1613953 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -125,6 +125,7 @@ public final class EnergyAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(attacker, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(attacker, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(attacker, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(attacker, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(attacker, effected, skill, true); @@ -148,7 +149,7 @@ public final class EnergyAttack extends AbstractEffect // ATTACK CALCULATION ((77 * ((pAtk * lvlMod) + power) * (1 + (0.1 * chargesConsumed)) / pdef) * skillPower) + skillPowerAdd // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (77 * ((attacker.getPAtk() * attacker.getLevelMod()) + _power + effector.getStat().getValue(Stats.SKILL_POWER_ADD, 0))) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * energyChargesBoost * pvpPveMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * energyChargesBoost * pvpPveMod; } damage = Math.max(0, damage * effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1)); diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java index 28f03616cc..5cb6635ec6 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java @@ -141,6 +141,7 @@ public final class PhysicalAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -168,7 +169,7 @@ public final class PhysicalAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java index f2bd264530..e0182d7a42 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java @@ -101,6 +101,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -127,7 +128,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); damage *= -((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2; } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java index 0f1db612ea..1da8ce17a2 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java @@ -114,6 +114,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -140,7 +141,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java index 5d5a93da7e..6e8bed6af4 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java @@ -134,6 +134,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -161,7 +162,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java index 8d43deff89..e09ec28eb5 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java @@ -128,6 +128,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -155,7 +156,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index 513b341b70..84f6d73f03 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -87,6 +87,11 @@ public class CreatureStat public CreatureStat(Creature creature) { _creature = creature; + for (int i = 0; i < TraitType.values().length; i++) + { + _attackTraitValues[i] = 1; + _defenceTraitValues[i] = 1; + } } /** @@ -573,8 +578,33 @@ public class CreatureStat public void mergeAttackTrait(TraitType traitType, float value) { - _attackTraitValues[traitType.ordinal()] *= value; - _attackTraits.add(traitType); + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] *= value; + _attackTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeAttackTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] /= value; + if (_attackTraitValues[traitType.ordinal()] == 1) + { + _attackTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getAttackTrait(TraitType traitType) @@ -605,8 +635,33 @@ public class CreatureStat public void mergeDefenceTrait(TraitType traitType, float value) { - _defenceTraitValues[traitType.ordinal()] *= value; - _defenceTraits.add(traitType); + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] *= value; + _defenceTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeDefenceTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] /= value; + if (_defenceTraitValues[traitType.ordinal()] == 1) + { + _defenceTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getDefenceTrait(TraitType traitType) @@ -637,7 +692,28 @@ public class CreatureStat public void mergeInvulnerableTrait(TraitType traitType) { - _invulnerableTraits.add(traitType); + _lock.readLock().lock(); + try + { + _invulnerableTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeInvulnerableTrait(TraitType traitType) + { + _lock.readLock().lock(); + try + { + _invulnerableTraits.remove(traitType); + } + finally + { + _lock.readLock().unlock(); + } } public boolean isInvulnerableTrait(TraitType traitType) diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/Formulas.java index c1a1d04b72..6c114ed822 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -94,14 +94,15 @@ public final class Formulas } // Critical - final double criticalMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1)); + final double criticalMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1); final double criticalPositionMod = attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target)); - final double criticalVulnMod = (target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1)); - final double criticalAddMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0)); + final double criticalVulnMod = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1); + final double criticalAddMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0); final double criticalAddVuln = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_ADD, 0); // Trait, elements final double weaponTraitMod = calcWeaponTraitBonus(attacker, target); final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, true); @@ -122,8 +123,8 @@ public final class Formulas // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ - final double baseMod = ((77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence); - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; return damage; } @@ -136,6 +137,7 @@ public final class Formulas // Trait, elements final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, mcrit); @@ -178,7 +180,7 @@ public final class Formulas } } - damage = damage * critMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + damage = damage * critMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; damage *= attacker.getStat().getValue(Stats.MAGICAL_SKILL_POWER, 1); return damage; @@ -1270,8 +1272,20 @@ public final class Formulas } } - final double result = (attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType)) + 1.0; - return CommonUtil.constrain(result, 0.05, 2.0); + return Math.max(attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType), 0.05); + } + + public static double calcWeaknessBonus(Creature attacker, Creature target, TraitType traitType) + { + double result = 1; + for (TraitType trait : TraitType.getAllWeakness()) + { + if ((traitType != trait) && target.getStat().hasDefenceTrait(trait) && attacker.getStat().hasAttackTrait(trait) && !target.getStat().isInvulnerableTrait(traitType)) + { + result *= Math.max(attacker.getStat().getAttackTrait(trait) - target.getStat().getDefenceTrait(trait), 0.05); + } + } + return result; } public static double calcWeaponTraitBonus(Creature attacker, Creature target) @@ -1300,7 +1314,7 @@ public final class Formulas } } - return CommonUtil.constrain((weaponTraitBonus * weaknessBonus), 0.05, 2.0); + return Math.max(weaponTraitBonus * weaknessBonus, 0.05); } public static double getBasicPropertyResistBonus(BasicProperty basicProperty, Creature target) diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/TraitType.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/TraitType.java index abf37ea7e5..4c34ba4378 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/TraitType.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/TraitType.java @@ -16,6 +16,9 @@ */ package org.l2jmobius.gameserver.model.stats; +import java.util.ArrayList; +import java.util.List; + /** * @author UnAfraid, NosBit */ @@ -88,6 +91,33 @@ public enum TraitType SPIRIT_WEAKNESS(2); private final int _type; // 1 = weapon, 2 = weakness, 3 = resistance + private final static List _weaknesses = new ArrayList<>(); + static + { + _weaknesses.add(BUG_WEAKNESS); + _weaknesses.add(ANIMAL_WEAKNESS); + _weaknesses.add(PLANT_WEAKNESS); + _weaknesses.add(BEAST_WEAKNESS); + _weaknesses.add(DRAGON_WEAKNESS); + _weaknesses.add(GIANT_WEAKNESS); + _weaknesses.add(CONSTRUCT_WEAKNESS); + _weaknesses.add(VALAKAS); + _weaknesses.add(ANESTHESIA); + _weaknesses.add(DEMONIC_WEAKNESS); + _weaknesses.add(DIVINE_WEAKNESS); + _weaknesses.add(ELEMENTAL_WEAKNESS); + _weaknesses.add(FAIRY_WEAKNESS); + _weaknesses.add(HUMAN_WEAKNESS); + _weaknesses.add(HUMANOID_WEAKNESS); + _weaknesses.add(UNDEAD_WEAKNESS); + _weaknesses.add(EMBRYO_WEAKNESS); + _weaknesses.add(SPIRIT_WEAKNESS); + } + + public static List getAllWeakness() + { + return _weaknesses; + } TraitType(int type) { diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java index 9df5b90529..3cdadad6a2 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,11 +50,20 @@ public final class AttackTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _attackTraits.entrySet()) { effected.getStat().mergeAttackTrait(trait.getKey(), trait.getValue()); } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _attackTraits.entrySet()) + { + effected.getStat().removeAttackTrait(trait.getKey(), trait.getValue()); + } + } } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java index 1f3920a0ba..0214d1df61 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.effects.AbstractEffect; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.stats.TraitType; @@ -49,7 +50,7 @@ public final class DefenceTrait extends AbstractEffect } @Override - public void pump(Creature effected, Skill skill) + public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item) { for (Entry trait : _defenceTraits.entrySet()) { @@ -63,4 +64,20 @@ public final class DefenceTrait extends AbstractEffect } } } + + @Override + public void onExit(Creature effector, Creature effected, Skill skill) + { + for (Entry trait : _defenceTraits.entrySet()) + { + if (trait.getValue() < 2.0f) + { + effected.getStat().removeDefenceTrait(trait.getKey(), trait.getValue()); + } + else + { + effected.getStat().removeInvulnerableTrait(trait.getKey()); + } + } + } } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java index f36b4be75a..f2c1613953 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java @@ -125,6 +125,7 @@ public final class EnergyAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(attacker, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(attacker, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(attacker, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(attacker, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(attacker, effected, skill, true); @@ -148,7 +149,7 @@ public final class EnergyAttack extends AbstractEffect // ATTACK CALCULATION ((77 * ((pAtk * lvlMod) + power) * (1 + (0.1 * chargesConsumed)) / pdef) * skillPower) + skillPowerAdd // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (77 * ((attacker.getPAtk() * attacker.getLevelMod()) + _power + effector.getStat().getValue(Stats.SKILL_POWER_ADD, 0))) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * energyChargesBoost * pvpPveMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * energyChargesBoost * pvpPveMod; } damage = Math.max(0, damage * effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1)); diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java index 28f03616cc..5cb6635ec6 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttack.java @@ -141,6 +141,7 @@ public final class PhysicalAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -168,7 +169,7 @@ public final class PhysicalAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * abnormalMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java index f2bd264530..e0182d7a42 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackHpLink.java @@ -101,6 +101,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -127,7 +128,7 @@ public final class PhysicalAttackHpLink extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); damage *= -((effector.getCurrentHp() * 2) / effector.getMaxHp()) + 2; } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java index 0f1db612ea..1da8ce17a2 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackSaveHp.java @@ -114,6 +114,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -140,7 +141,7 @@ public final class PhysicalAttackSaveHp extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java index 5d5a93da7e..6e8bed6af4 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalAttackWeaponBonus.java @@ -134,6 +134,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -161,7 +162,7 @@ public final class PhysicalAttackWeaponBonus extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * ssmod * critMod * weaponBonus * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java index 8d43deff89..e09ec28eb5 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/PhysicalSoulAttack.java @@ -128,6 +128,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // Trait, elements final double weaponTraitMod = Formulas.calcWeaponTraitBonus(effector, effected); final double generalTraitMod = Formulas.calcGeneralTraitBonus(effector, effected, skill.getTraitType(), true); + final double weaknessMod = Formulas.calcWeaknessBonus(effector, effected, skill.getTraitType()); final double attributeMod = Formulas.calcAttributeBonus(effector, effected, skill); final double pvpPveMod = Formulas.calculatePvpPveBonus(effector, effected, skill, true); final double randomMod = effector.getRandomDamageMultiplier(); @@ -155,7 +156,7 @@ public final class PhysicalSoulAttack extends AbstractEffect // ATTACK CALCULATION 77 * ((pAtk * lvlMod) + power) / pdef            RANGED ATTACK CALCULATION 70 * ((pAtk * lvlMod) + power + patk + power) / pdef // ```````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``````````````````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ final double baseMod = (weaponMod * ((attack * effector.getLevelMod()) + power + rangedBonus)) / defence; - damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * attributeMod * pvpPveMod * randomMod; + damage = baseMod * soulsMod * ssmod * critMod * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * pvpPveMod * randomMod; damage *= effector.getStat().getValue(Stats.PHYSICAL_SKILL_POWER, 1); } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index 513b341b70..84f6d73f03 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -87,6 +87,11 @@ public class CreatureStat public CreatureStat(Creature creature) { _creature = creature; + for (int i = 0; i < TraitType.values().length; i++) + { + _attackTraitValues[i] = 1; + _defenceTraitValues[i] = 1; + } } /** @@ -573,8 +578,33 @@ public class CreatureStat public void mergeAttackTrait(TraitType traitType, float value) { - _attackTraitValues[traitType.ordinal()] *= value; - _attackTraits.add(traitType); + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] *= value; + _attackTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeAttackTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _attackTraitValues[traitType.ordinal()] /= value; + if (_attackTraitValues[traitType.ordinal()] == 1) + { + _attackTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getAttackTrait(TraitType traitType) @@ -605,8 +635,33 @@ public class CreatureStat public void mergeDefenceTrait(TraitType traitType, float value) { - _defenceTraitValues[traitType.ordinal()] *= value; - _defenceTraits.add(traitType); + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] *= value; + _defenceTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeDefenceTrait(TraitType traitType, float value) + { + _lock.readLock().lock(); + try + { + _defenceTraitValues[traitType.ordinal()] /= value; + if (_defenceTraitValues[traitType.ordinal()] == 1) + { + _defenceTraits.remove(traitType); + } + } + finally + { + _lock.readLock().unlock(); + } } public float getDefenceTrait(TraitType traitType) @@ -637,7 +692,28 @@ public class CreatureStat public void mergeInvulnerableTrait(TraitType traitType) { - _invulnerableTraits.add(traitType); + _lock.readLock().lock(); + try + { + _invulnerableTraits.add(traitType); + } + finally + { + _lock.readLock().unlock(); + } + } + + public void removeInvulnerableTrait(TraitType traitType) + { + _lock.readLock().lock(); + try + { + _invulnerableTraits.remove(traitType); + } + finally + { + _lock.readLock().unlock(); + } } public boolean isInvulnerableTrait(TraitType traitType) diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/Formulas.java index c1a1d04b72..6c114ed822 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -94,14 +94,15 @@ public final class Formulas } // Critical - final double criticalMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1)); + final double criticalMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1); final double criticalPositionMod = attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target)); - final double criticalVulnMod = (target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1)); - final double criticalAddMod = (attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0)); + final double criticalVulnMod = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1); + final double criticalAddMod = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_ADD, 0); final double criticalAddVuln = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_ADD, 0); // Trait, elements final double weaponTraitMod = calcWeaponTraitBonus(attacker, target); final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, true); @@ -122,8 +123,8 @@ public final class Formulas // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ - final double baseMod = ((77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence); - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; return damage; } @@ -136,6 +137,7 @@ public final class Formulas // Trait, elements final double generalTraitMod = calcGeneralTraitBonus(attacker, target, skill.getTraitType(), true); + final double weaknessMod = calcWeaknessBonus(attacker, target, skill.getTraitType()); final double attributeMod = calcAttributeBonus(attacker, target, skill); final double randomMod = attacker.getRandomDamageMultiplier(); final double pvpPveMod = calculatePvpPveBonus(attacker, target, skill, mcrit); @@ -178,7 +180,7 @@ public final class Formulas } } - damage = damage * critMod * generalTraitMod * attributeMod * randomMod * pvpPveMod; + damage = damage * critMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; damage *= attacker.getStat().getValue(Stats.MAGICAL_SKILL_POWER, 1); return damage; @@ -1270,8 +1272,20 @@ public final class Formulas } } - final double result = (attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType)) + 1.0; - return CommonUtil.constrain(result, 0.05, 2.0); + return Math.max(attacker.getStat().getAttackTrait(traitType) - target.getStat().getDefenceTrait(traitType), 0.05); + } + + public static double calcWeaknessBonus(Creature attacker, Creature target, TraitType traitType) + { + double result = 1; + for (TraitType trait : TraitType.getAllWeakness()) + { + if ((traitType != trait) && target.getStat().hasDefenceTrait(trait) && attacker.getStat().hasAttackTrait(trait) && !target.getStat().isInvulnerableTrait(traitType)) + { + result *= Math.max(attacker.getStat().getAttackTrait(trait) - target.getStat().getDefenceTrait(trait), 0.05); + } + } + return result; } public static double calcWeaponTraitBonus(Creature attacker, Creature target) @@ -1300,7 +1314,7 @@ public final class Formulas } } - return CommonUtil.constrain((weaponTraitBonus * weaknessBonus), 0.05, 2.0); + return Math.max(weaponTraitBonus * weaknessBonus, 0.05); } public static double getBasicPropertyResistBonus(BasicProperty basicProperty, Creature target) diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/TraitType.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/TraitType.java index abf37ea7e5..4c34ba4378 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/TraitType.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/TraitType.java @@ -16,6 +16,9 @@ */ package org.l2jmobius.gameserver.model.stats; +import java.util.ArrayList; +import java.util.List; + /** * @author UnAfraid, NosBit */ @@ -88,6 +91,33 @@ public enum TraitType SPIRIT_WEAKNESS(2); private final int _type; // 1 = weapon, 2 = weakness, 3 = resistance + private final static List _weaknesses = new ArrayList<>(); + static + { + _weaknesses.add(BUG_WEAKNESS); + _weaknesses.add(ANIMAL_WEAKNESS); + _weaknesses.add(PLANT_WEAKNESS); + _weaknesses.add(BEAST_WEAKNESS); + _weaknesses.add(DRAGON_WEAKNESS); + _weaknesses.add(GIANT_WEAKNESS); + _weaknesses.add(CONSTRUCT_WEAKNESS); + _weaknesses.add(VALAKAS); + _weaknesses.add(ANESTHESIA); + _weaknesses.add(DEMONIC_WEAKNESS); + _weaknesses.add(DIVINE_WEAKNESS); + _weaknesses.add(ELEMENTAL_WEAKNESS); + _weaknesses.add(FAIRY_WEAKNESS); + _weaknesses.add(HUMAN_WEAKNESS); + _weaknesses.add(HUMANOID_WEAKNESS); + _weaknesses.add(UNDEAD_WEAKNESS); + _weaknesses.add(EMBRYO_WEAKNESS); + _weaknesses.add(SPIRIT_WEAKNESS); + } + + public static List getAllWeakness() + { + return _weaknesses; + } TraitType(int type) {