From fd43297a14a03bf01695cb8e502fbe1d1e3e90c8 Mon Sep 17 00:00:00 2001 From: MobiusDev <8391001+MobiusDevelopment@users.noreply.github.com> Date: Tue, 28 Nov 2017 18:30:40 +0000 Subject: [PATCH] Separated RebalanceHP effect for summons. --- .../scripts/handlers/EffectMasterHandler.java | 1 + .../handlers/effecthandlers/RebalanceHP.java | 186 ++++++------------ .../effecthandlers/RebalanceHPSummon.java | 111 +++++++++++ .../game/data/stats/skills/documentation.txt | 1 + .../scripts/handlers/EffectMasterHandler.java | 1 + .../handlers/effecthandlers/RebalanceHP.java | 186 ++++++------------ .../effecthandlers/RebalanceHPSummon.java | 111 +++++++++++ .../game/data/stats/skills/documentation.txt | 1 + .../scripts/handlers/EffectMasterHandler.java | 1 + .../handlers/effecthandlers/RebalanceHP.java | 186 ++++++------------ .../effecthandlers/RebalanceHPSummon.java | 111 +++++++++++ .../game/data/stats/skills/documentation.txt | 1 + .../scripts/handlers/EffectMasterHandler.java | 1 + .../handlers/effecthandlers/RebalanceHP.java | 186 ++++++------------ .../effecthandlers/RebalanceHPSummon.java | 111 +++++++++++ .../game/data/stats/skills/documentation.txt | 1 + .../scripts/handlers/EffectMasterHandler.java | 1 + .../handlers/effecthandlers/RebalanceHP.java | 186 ++++++------------ .../effecthandlers/RebalanceHPSummon.java | 111 +++++++++++ .../game/data/stats/skills/documentation.txt | 1 + 20 files changed, 890 insertions(+), 605 deletions(-) create mode 100644 L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java create mode 100644 L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java create mode 100644 L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java create mode 100644 L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java create mode 100644 L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/EffectMasterHandler.java index 07d2f9cf70..21fc5fd20b 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -257,6 +257,7 @@ public final class EffectMasterHandler EffectHandler.getInstance().registerHandler("RandomizeHate", RandomizeHate::new); EffectHandler.getInstance().registerHandler("RealDamage", RealDamage::new); EffectHandler.getInstance().registerHandler("RebalanceHP", RebalanceHP::new); + EffectHandler.getInstance().registerHandler("RebalanceHPSummon", RebalanceHPSummon::new); EffectHandler.getInstance().registerHandler("Recovery", Recovery::new); EffectHandler.getInstance().registerHandler("ReduceDamage", ReduceDamage::new); EffectHandler.getInstance().registerHandler("ReduceCancel", ReduceCancel::new); diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java index dfa3ce0847..4da04876fc 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java @@ -60,150 +60,94 @@ public final class RebalanceHP extends AbstractEffect double fullHP = 0; double currentHPs = 0; final L2Party party = effector.getParty(); - - switch (skill.getTargetType()) + if (party != null) { - case MY_PARTY: + for (L2PcInstance member : party.getMembers()) { - if (party != null) + if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) { - for (L2PcInstance member : party.getMembers()) + fullHP += member.getMaxHp(); + currentHPs += member.getCurrentHp(); + } + + final L2Summon summon = member.getPet(); + if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) + { + fullHP += summon.getMaxHp(); + currentHPs += summon.getCurrentHp(); + } + + for (L2Summon servitors : member.getServitors().values()) + { + if (!servitors.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, servitors, true)) { - if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) + fullHP += servitors.getMaxHp(); + currentHPs += servitors.getCurrentHp(); + } + } + } + + double percentHP = currentHPs / fullHP; + for (L2PcInstance member : party.getMembers()) + { + if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) + { + double newHP = member.getMaxHp() * percentHP; + if (newHP > member.getCurrentHp()) // The target gets healed + { + // The heal will be blocked if the current hp passes the limit + if (member.getCurrentHp() > member.getMaxRecoverableHp()) { - fullHP += member.getMaxHp(); - currentHPs += member.getCurrentHp(); + newHP = member.getCurrentHp(); } - - final L2Summon summon = member.getPet(); - if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) + else if (newHP > member.getMaxRecoverableHp()) { - fullHP += summon.getMaxHp(); - currentHPs += summon.getCurrentHp(); - } - - for (L2Summon servitors : member.getServitors().values()) - { - fullHP += servitors.getMaxHp(); - currentHPs += servitors.getCurrentHp(); + newHP = member.getMaxRecoverableHp(); } } - final double percentHP = currentHPs / fullHP; - for (L2PcInstance member : party.getMembers()) - { - if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) - { - double newHP = member.getMaxHp() * percentHP; - if (newHP > member.getCurrentHp()) // The target gets healed - { - // The heal will be blocked if the current hp passes the limit - if (member.getCurrentHp() > member.getMaxRecoverableHp()) - { - newHP = member.getCurrentHp(); - } - else if (newHP > member.getMaxRecoverableHp()) - { - newHP = member.getMaxRecoverableHp(); - } - } - - member.setCurrentHp(newHP); - } - - final L2Summon summon = member.getPet(); - if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) - { - double newHP = summon.getMaxHp() * percentHP; - if (newHP > summon.getCurrentHp()) // The target gets healed - { - // The heal will be blocked if the current hp passes the limit - if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) - { - newHP = summon.getCurrentHp(); - } - else if (newHP > summon.getMaxRecoverableHp()) - { - newHP = summon.getMaxRecoverableHp(); - } - } - summon.setCurrentHp(newHP); - } - - for (L2Summon servitors : member.getServitors().values()) - { - if (!servitors.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) - { - double newHP = servitors.getMaxHp() * percentHP; - if (newHP > servitors.getCurrentHp()) // The target gets healed - { - // The heal will be blocked if the current hp passes the limit - if (servitors.getCurrentHp() > servitors.getMaxRecoverableHp()) - { - newHP = servitors.getCurrentHp(); - } - else if (newHP > servitors.getMaxRecoverableHp()) - { - newHP = servitors.getMaxRecoverableHp(); - } - } - servitors.setCurrentHp(newHP); - } - } - } - } - break; - } - case SUMMON: - { - for (L2Summon summon : effector.getServitors().values()) - { - if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) - { - fullHP += summon.getMaxHp(); - currentHPs += summon.getCurrentHp(); - } + member.setCurrentHp(newHP); } - fullHP += effector.getMaxHp(); - fullHP += effector.getCurrentHp(); - - final double percentHP = currentHPs / fullHP; - for (L2Summon summon : effector.getServitors().values()) + final L2Summon summon = member.getPet(); + if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) { - if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) + double newHP = summon.getMaxHp() * percentHP; + if (newHP > summon.getCurrentHp()) // The target gets healed { - double newHP = summon.getMaxHp() * percentHP; - if (newHP > summon.getCurrentHp()) // The target gets healed + // The heal will be blocked if the current hp passes the limit + if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) + { + newHP = summon.getCurrentHp(); + } + else if (newHP > summon.getMaxRecoverableHp()) + { + newHP = summon.getMaxRecoverableHp(); + } + } + summon.setCurrentHp(newHP); + } + + for (L2Summon servitors : member.getServitors().values()) + { + if (!servitors.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, servitors, true)) + { + double newHP = servitors.getMaxHp() * percentHP; + if (newHP > servitors.getCurrentHp()) // The target gets healed { // The heal will be blocked if the current hp passes the limit - if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) + if (servitors.getCurrentHp() > servitors.getMaxRecoverableHp()) { - newHP = summon.getCurrentHp(); + newHP = servitors.getCurrentHp(); } - else if (newHP > summon.getMaxRecoverableHp()) + else if (newHP > servitors.getMaxRecoverableHp()) { - newHP = summon.getMaxRecoverableHp(); + newHP = servitors.getMaxRecoverableHp(); } } - - summon.setCurrentHp(newHP); + servitors.setCurrentHp(newHP); } } - - double newHP = effector.getMaxHp() * percentHP; - if (newHP > effector.getCurrentHp()) - { - if (effector.getCurrentHp() > effector.getMaxRecoverableHp()) - { - newHP = effector.getCurrentHp(); - } - else if (newHP > effector.getMaxRecoverableHp()) - { - newHP = effector.getMaxRecoverableHp(); - } - } - effector.setCurrentHp(newHP); } } } diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java new file mode 100644 index 0000000000..19a82ed230 --- /dev/null +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java @@ -0,0 +1,111 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package handlers.effecthandlers; + +import com.l2jmobius.gameserver.model.StatsSet; +import com.l2jmobius.gameserver.model.actor.L2Character; +import com.l2jmobius.gameserver.model.actor.L2Summon; +import com.l2jmobius.gameserver.model.effects.AbstractEffect; +import com.l2jmobius.gameserver.model.effects.L2EffectType; +import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; +import com.l2jmobius.gameserver.model.skills.Skill; +import com.l2jmobius.gameserver.util.Util; + +/** + * Rebalance HP effect implementation. + * @author Adry_85, earendil + */ +public class RebalanceHPSummon extends AbstractEffect +{ + public RebalanceHPSummon(StatsSet params) + { + } + + @Override + public L2EffectType getEffectType() + { + return L2EffectType.REBALANCE_HP; + } + + @Override + public boolean isInstant() + { + return true; + } + + @Override + public void instant(L2Character effector, L2Character effected, Skill skill, L2ItemInstance item) + { + if (!effector.isPlayer()) + { + return; + } + + double fullHP = 0; + double currentHPs = 0; + + for (L2Summon summon : effector.getServitors().values()) + { + if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) + { + fullHP += summon.getMaxHp(); + currentHPs += summon.getCurrentHp(); + } + } + + fullHP += effector.getMaxHp(); + currentHPs += effector.getCurrentHp(); + + double percentHP = currentHPs / fullHP; + for (L2Summon summon : effector.getServitors().values()) + { + if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) + { + double newHP = summon.getMaxHp() * percentHP; + if (newHP > summon.getCurrentHp()) // The target gets healed + { + // The heal will be blocked if the current hp passes the limit + if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) + { + newHP = summon.getCurrentHp(); + } + else if (newHP > summon.getMaxRecoverableHp()) + { + newHP = summon.getMaxRecoverableHp(); + } + } + + summon.setCurrentHp(newHP); + } + } + + double newHP = effector.getMaxHp() * percentHP; + if (newHP > effector.getCurrentHp()) // The target gets healed + { + // The heal will be blocked if the current hp passes the limit + if (effector.getCurrentHp() > effector.getMaxRecoverableHp()) + { + newHP = effector.getCurrentHp(); + } + else if (newHP > effector.getMaxRecoverableHp()) + { + newHP = effector.getMaxRecoverableHp(); + } + } + effector.setCurrentHp(newHP); + } +} diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_1.0_Ertheia/dist/game/data/stats/skills/documentation.txt index c4f6ad75ed..fe9e4bd4e1 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/stats/skills/documentation.txt @@ -226,6 +226,7 @@ PvpPhysicalSkillDefenceBonus: Physical skill defence stat when taking damage fro RandomizeHate: Target NPC stops hating you and starts hating random target with your hate. RealDamage: Static damage. RebalanceHP: Balances targets' current HP. +RebalanceHPSummon: Balances targets' current HP for summons. Recovery: Decreases death penalty level. ReduceCancel: Magic skill casting interruption stat. ReduceDropPenalty: Reduces EXP lost and death penalty chance. diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/EffectMasterHandler.java index 07d2f9cf70..21fc5fd20b 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -257,6 +257,7 @@ public final class EffectMasterHandler EffectHandler.getInstance().registerHandler("RandomizeHate", RandomizeHate::new); EffectHandler.getInstance().registerHandler("RealDamage", RealDamage::new); EffectHandler.getInstance().registerHandler("RebalanceHP", RebalanceHP::new); + EffectHandler.getInstance().registerHandler("RebalanceHPSummon", RebalanceHPSummon::new); EffectHandler.getInstance().registerHandler("Recovery", Recovery::new); EffectHandler.getInstance().registerHandler("ReduceDamage", ReduceDamage::new); EffectHandler.getInstance().registerHandler("ReduceCancel", ReduceCancel::new); diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java index dfa3ce0847..4da04876fc 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java +++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java @@ -60,150 +60,94 @@ public final class RebalanceHP extends AbstractEffect double fullHP = 0; double currentHPs = 0; final L2Party party = effector.getParty(); - - switch (skill.getTargetType()) + if (party != null) { - case MY_PARTY: + for (L2PcInstance member : party.getMembers()) { - if (party != null) + if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) { - for (L2PcInstance member : party.getMembers()) + fullHP += member.getMaxHp(); + currentHPs += member.getCurrentHp(); + } + + final L2Summon summon = member.getPet(); + if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) + { + fullHP += summon.getMaxHp(); + currentHPs += summon.getCurrentHp(); + } + + for (L2Summon servitors : member.getServitors().values()) + { + if (!servitors.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, servitors, true)) { - if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) + fullHP += servitors.getMaxHp(); + currentHPs += servitors.getCurrentHp(); + } + } + } + + double percentHP = currentHPs / fullHP; + for (L2PcInstance member : party.getMembers()) + { + if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) + { + double newHP = member.getMaxHp() * percentHP; + if (newHP > member.getCurrentHp()) // The target gets healed + { + // The heal will be blocked if the current hp passes the limit + if (member.getCurrentHp() > member.getMaxRecoverableHp()) { - fullHP += member.getMaxHp(); - currentHPs += member.getCurrentHp(); + newHP = member.getCurrentHp(); } - - final L2Summon summon = member.getPet(); - if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) + else if (newHP > member.getMaxRecoverableHp()) { - fullHP += summon.getMaxHp(); - currentHPs += summon.getCurrentHp(); - } - - for (L2Summon servitors : member.getServitors().values()) - { - fullHP += servitors.getMaxHp(); - currentHPs += servitors.getCurrentHp(); + newHP = member.getMaxRecoverableHp(); } } - final double percentHP = currentHPs / fullHP; - for (L2PcInstance member : party.getMembers()) - { - if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) - { - double newHP = member.getMaxHp() * percentHP; - if (newHP > member.getCurrentHp()) // The target gets healed - { - // The heal will be blocked if the current hp passes the limit - if (member.getCurrentHp() > member.getMaxRecoverableHp()) - { - newHP = member.getCurrentHp(); - } - else if (newHP > member.getMaxRecoverableHp()) - { - newHP = member.getMaxRecoverableHp(); - } - } - - member.setCurrentHp(newHP); - } - - final L2Summon summon = member.getPet(); - if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) - { - double newHP = summon.getMaxHp() * percentHP; - if (newHP > summon.getCurrentHp()) // The target gets healed - { - // The heal will be blocked if the current hp passes the limit - if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) - { - newHP = summon.getCurrentHp(); - } - else if (newHP > summon.getMaxRecoverableHp()) - { - newHP = summon.getMaxRecoverableHp(); - } - } - summon.setCurrentHp(newHP); - } - - for (L2Summon servitors : member.getServitors().values()) - { - if (!servitors.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) - { - double newHP = servitors.getMaxHp() * percentHP; - if (newHP > servitors.getCurrentHp()) // The target gets healed - { - // The heal will be blocked if the current hp passes the limit - if (servitors.getCurrentHp() > servitors.getMaxRecoverableHp()) - { - newHP = servitors.getCurrentHp(); - } - else if (newHP > servitors.getMaxRecoverableHp()) - { - newHP = servitors.getMaxRecoverableHp(); - } - } - servitors.setCurrentHp(newHP); - } - } - } - } - break; - } - case SUMMON: - { - for (L2Summon summon : effector.getServitors().values()) - { - if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) - { - fullHP += summon.getMaxHp(); - currentHPs += summon.getCurrentHp(); - } + member.setCurrentHp(newHP); } - fullHP += effector.getMaxHp(); - fullHP += effector.getCurrentHp(); - - final double percentHP = currentHPs / fullHP; - for (L2Summon summon : effector.getServitors().values()) + final L2Summon summon = member.getPet(); + if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) { - if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) + double newHP = summon.getMaxHp() * percentHP; + if (newHP > summon.getCurrentHp()) // The target gets healed { - double newHP = summon.getMaxHp() * percentHP; - if (newHP > summon.getCurrentHp()) // The target gets healed + // The heal will be blocked if the current hp passes the limit + if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) + { + newHP = summon.getCurrentHp(); + } + else if (newHP > summon.getMaxRecoverableHp()) + { + newHP = summon.getMaxRecoverableHp(); + } + } + summon.setCurrentHp(newHP); + } + + for (L2Summon servitors : member.getServitors().values()) + { + if (!servitors.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, servitors, true)) + { + double newHP = servitors.getMaxHp() * percentHP; + if (newHP > servitors.getCurrentHp()) // The target gets healed { // The heal will be blocked if the current hp passes the limit - if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) + if (servitors.getCurrentHp() > servitors.getMaxRecoverableHp()) { - newHP = summon.getCurrentHp(); + newHP = servitors.getCurrentHp(); } - else if (newHP > summon.getMaxRecoverableHp()) + else if (newHP > servitors.getMaxRecoverableHp()) { - newHP = summon.getMaxRecoverableHp(); + newHP = servitors.getMaxRecoverableHp(); } } - - summon.setCurrentHp(newHP); + servitors.setCurrentHp(newHP); } } - - double newHP = effector.getMaxHp() * percentHP; - if (newHP > effector.getCurrentHp()) - { - if (effector.getCurrentHp() > effector.getMaxRecoverableHp()) - { - newHP = effector.getCurrentHp(); - } - else if (newHP > effector.getMaxRecoverableHp()) - { - newHP = effector.getMaxRecoverableHp(); - } - } - effector.setCurrentHp(newHP); } } } diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java new file mode 100644 index 0000000000..19a82ed230 --- /dev/null +++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java @@ -0,0 +1,111 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package handlers.effecthandlers; + +import com.l2jmobius.gameserver.model.StatsSet; +import com.l2jmobius.gameserver.model.actor.L2Character; +import com.l2jmobius.gameserver.model.actor.L2Summon; +import com.l2jmobius.gameserver.model.effects.AbstractEffect; +import com.l2jmobius.gameserver.model.effects.L2EffectType; +import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; +import com.l2jmobius.gameserver.model.skills.Skill; +import com.l2jmobius.gameserver.util.Util; + +/** + * Rebalance HP effect implementation. + * @author Adry_85, earendil + */ +public class RebalanceHPSummon extends AbstractEffect +{ + public RebalanceHPSummon(StatsSet params) + { + } + + @Override + public L2EffectType getEffectType() + { + return L2EffectType.REBALANCE_HP; + } + + @Override + public boolean isInstant() + { + return true; + } + + @Override + public void instant(L2Character effector, L2Character effected, Skill skill, L2ItemInstance item) + { + if (!effector.isPlayer()) + { + return; + } + + double fullHP = 0; + double currentHPs = 0; + + for (L2Summon summon : effector.getServitors().values()) + { + if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) + { + fullHP += summon.getMaxHp(); + currentHPs += summon.getCurrentHp(); + } + } + + fullHP += effector.getMaxHp(); + currentHPs += effector.getCurrentHp(); + + double percentHP = currentHPs / fullHP; + for (L2Summon summon : effector.getServitors().values()) + { + if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) + { + double newHP = summon.getMaxHp() * percentHP; + if (newHP > summon.getCurrentHp()) // The target gets healed + { + // The heal will be blocked if the current hp passes the limit + if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) + { + newHP = summon.getCurrentHp(); + } + else if (newHP > summon.getMaxRecoverableHp()) + { + newHP = summon.getMaxRecoverableHp(); + } + } + + summon.setCurrentHp(newHP); + } + } + + double newHP = effector.getMaxHp() * percentHP; + if (newHP > effector.getCurrentHp()) // The target gets healed + { + // The heal will be blocked if the current hp passes the limit + if (effector.getCurrentHp() > effector.getMaxRecoverableHp()) + { + newHP = effector.getCurrentHp(); + } + else if (newHP > effector.getMaxRecoverableHp()) + { + newHP = effector.getMaxRecoverableHp(); + } + } + effector.setCurrentHp(newHP); + } +} diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_2.5_Underground/dist/game/data/stats/skills/documentation.txt index c4f6ad75ed..fe9e4bd4e1 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_2.5_Underground/dist/game/data/stats/skills/documentation.txt @@ -226,6 +226,7 @@ PvpPhysicalSkillDefenceBonus: Physical skill defence stat when taking damage fro RandomizeHate: Target NPC stops hating you and starts hating random target with your hate. RealDamage: Static damage. RebalanceHP: Balances targets' current HP. +RebalanceHPSummon: Balances targets' current HP for summons. Recovery: Decreases death penalty level. ReduceCancel: Magic skill casting interruption stat. ReduceDropPenalty: Reduces EXP lost and death penalty chance. diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/EffectMasterHandler.java index 07d2f9cf70..21fc5fd20b 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -257,6 +257,7 @@ public final class EffectMasterHandler EffectHandler.getInstance().registerHandler("RandomizeHate", RandomizeHate::new); EffectHandler.getInstance().registerHandler("RealDamage", RealDamage::new); EffectHandler.getInstance().registerHandler("RebalanceHP", RebalanceHP::new); + EffectHandler.getInstance().registerHandler("RebalanceHPSummon", RebalanceHPSummon::new); EffectHandler.getInstance().registerHandler("Recovery", Recovery::new); EffectHandler.getInstance().registerHandler("ReduceDamage", ReduceDamage::new); EffectHandler.getInstance().registerHandler("ReduceCancel", ReduceCancel::new); diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java index dfa3ce0847..4da04876fc 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java +++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java @@ -60,150 +60,94 @@ public final class RebalanceHP extends AbstractEffect double fullHP = 0; double currentHPs = 0; final L2Party party = effector.getParty(); - - switch (skill.getTargetType()) + if (party != null) { - case MY_PARTY: + for (L2PcInstance member : party.getMembers()) { - if (party != null) + if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) { - for (L2PcInstance member : party.getMembers()) + fullHP += member.getMaxHp(); + currentHPs += member.getCurrentHp(); + } + + final L2Summon summon = member.getPet(); + if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) + { + fullHP += summon.getMaxHp(); + currentHPs += summon.getCurrentHp(); + } + + for (L2Summon servitors : member.getServitors().values()) + { + if (!servitors.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, servitors, true)) { - if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) + fullHP += servitors.getMaxHp(); + currentHPs += servitors.getCurrentHp(); + } + } + } + + double percentHP = currentHPs / fullHP; + for (L2PcInstance member : party.getMembers()) + { + if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) + { + double newHP = member.getMaxHp() * percentHP; + if (newHP > member.getCurrentHp()) // The target gets healed + { + // The heal will be blocked if the current hp passes the limit + if (member.getCurrentHp() > member.getMaxRecoverableHp()) { - fullHP += member.getMaxHp(); - currentHPs += member.getCurrentHp(); + newHP = member.getCurrentHp(); } - - final L2Summon summon = member.getPet(); - if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) + else if (newHP > member.getMaxRecoverableHp()) { - fullHP += summon.getMaxHp(); - currentHPs += summon.getCurrentHp(); - } - - for (L2Summon servitors : member.getServitors().values()) - { - fullHP += servitors.getMaxHp(); - currentHPs += servitors.getCurrentHp(); + newHP = member.getMaxRecoverableHp(); } } - final double percentHP = currentHPs / fullHP; - for (L2PcInstance member : party.getMembers()) - { - if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) - { - double newHP = member.getMaxHp() * percentHP; - if (newHP > member.getCurrentHp()) // The target gets healed - { - // The heal will be blocked if the current hp passes the limit - if (member.getCurrentHp() > member.getMaxRecoverableHp()) - { - newHP = member.getCurrentHp(); - } - else if (newHP > member.getMaxRecoverableHp()) - { - newHP = member.getMaxRecoverableHp(); - } - } - - member.setCurrentHp(newHP); - } - - final L2Summon summon = member.getPet(); - if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) - { - double newHP = summon.getMaxHp() * percentHP; - if (newHP > summon.getCurrentHp()) // The target gets healed - { - // The heal will be blocked if the current hp passes the limit - if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) - { - newHP = summon.getCurrentHp(); - } - else if (newHP > summon.getMaxRecoverableHp()) - { - newHP = summon.getMaxRecoverableHp(); - } - } - summon.setCurrentHp(newHP); - } - - for (L2Summon servitors : member.getServitors().values()) - { - if (!servitors.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) - { - double newHP = servitors.getMaxHp() * percentHP; - if (newHP > servitors.getCurrentHp()) // The target gets healed - { - // The heal will be blocked if the current hp passes the limit - if (servitors.getCurrentHp() > servitors.getMaxRecoverableHp()) - { - newHP = servitors.getCurrentHp(); - } - else if (newHP > servitors.getMaxRecoverableHp()) - { - newHP = servitors.getMaxRecoverableHp(); - } - } - servitors.setCurrentHp(newHP); - } - } - } - } - break; - } - case SUMMON: - { - for (L2Summon summon : effector.getServitors().values()) - { - if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) - { - fullHP += summon.getMaxHp(); - currentHPs += summon.getCurrentHp(); - } + member.setCurrentHp(newHP); } - fullHP += effector.getMaxHp(); - fullHP += effector.getCurrentHp(); - - final double percentHP = currentHPs / fullHP; - for (L2Summon summon : effector.getServitors().values()) + final L2Summon summon = member.getPet(); + if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) { - if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) + double newHP = summon.getMaxHp() * percentHP; + if (newHP > summon.getCurrentHp()) // The target gets healed { - double newHP = summon.getMaxHp() * percentHP; - if (newHP > summon.getCurrentHp()) // The target gets healed + // The heal will be blocked if the current hp passes the limit + if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) + { + newHP = summon.getCurrentHp(); + } + else if (newHP > summon.getMaxRecoverableHp()) + { + newHP = summon.getMaxRecoverableHp(); + } + } + summon.setCurrentHp(newHP); + } + + for (L2Summon servitors : member.getServitors().values()) + { + if (!servitors.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, servitors, true)) + { + double newHP = servitors.getMaxHp() * percentHP; + if (newHP > servitors.getCurrentHp()) // The target gets healed { // The heal will be blocked if the current hp passes the limit - if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) + if (servitors.getCurrentHp() > servitors.getMaxRecoverableHp()) { - newHP = summon.getCurrentHp(); + newHP = servitors.getCurrentHp(); } - else if (newHP > summon.getMaxRecoverableHp()) + else if (newHP > servitors.getMaxRecoverableHp()) { - newHP = summon.getMaxRecoverableHp(); + newHP = servitors.getMaxRecoverableHp(); } } - - summon.setCurrentHp(newHP); + servitors.setCurrentHp(newHP); } } - - double newHP = effector.getMaxHp() * percentHP; - if (newHP > effector.getCurrentHp()) - { - if (effector.getCurrentHp() > effector.getMaxRecoverableHp()) - { - newHP = effector.getCurrentHp(); - } - else if (newHP > effector.getMaxRecoverableHp()) - { - newHP = effector.getMaxRecoverableHp(); - } - } - effector.setCurrentHp(newHP); } } } diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java new file mode 100644 index 0000000000..19a82ed230 --- /dev/null +++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java @@ -0,0 +1,111 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package handlers.effecthandlers; + +import com.l2jmobius.gameserver.model.StatsSet; +import com.l2jmobius.gameserver.model.actor.L2Character; +import com.l2jmobius.gameserver.model.actor.L2Summon; +import com.l2jmobius.gameserver.model.effects.AbstractEffect; +import com.l2jmobius.gameserver.model.effects.L2EffectType; +import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; +import com.l2jmobius.gameserver.model.skills.Skill; +import com.l2jmobius.gameserver.util.Util; + +/** + * Rebalance HP effect implementation. + * @author Adry_85, earendil + */ +public class RebalanceHPSummon extends AbstractEffect +{ + public RebalanceHPSummon(StatsSet params) + { + } + + @Override + public L2EffectType getEffectType() + { + return L2EffectType.REBALANCE_HP; + } + + @Override + public boolean isInstant() + { + return true; + } + + @Override + public void instant(L2Character effector, L2Character effected, Skill skill, L2ItemInstance item) + { + if (!effector.isPlayer()) + { + return; + } + + double fullHP = 0; + double currentHPs = 0; + + for (L2Summon summon : effector.getServitors().values()) + { + if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) + { + fullHP += summon.getMaxHp(); + currentHPs += summon.getCurrentHp(); + } + } + + fullHP += effector.getMaxHp(); + currentHPs += effector.getCurrentHp(); + + double percentHP = currentHPs / fullHP; + for (L2Summon summon : effector.getServitors().values()) + { + if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) + { + double newHP = summon.getMaxHp() * percentHP; + if (newHP > summon.getCurrentHp()) // The target gets healed + { + // The heal will be blocked if the current hp passes the limit + if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) + { + newHP = summon.getCurrentHp(); + } + else if (newHP > summon.getMaxRecoverableHp()) + { + newHP = summon.getMaxRecoverableHp(); + } + } + + summon.setCurrentHp(newHP); + } + } + + double newHP = effector.getMaxHp() * percentHP; + if (newHP > effector.getCurrentHp()) // The target gets healed + { + // The heal will be blocked if the current hp passes the limit + if (effector.getCurrentHp() > effector.getMaxRecoverableHp()) + { + newHP = effector.getCurrentHp(); + } + else if (newHP > effector.getMaxRecoverableHp()) + { + newHP = effector.getMaxRecoverableHp(); + } + } + effector.setCurrentHp(newHP); + } +} diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_3.0_Helios/dist/game/data/stats/skills/documentation.txt index c4f6ad75ed..fe9e4bd4e1 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_3.0_Helios/dist/game/data/stats/skills/documentation.txt @@ -226,6 +226,7 @@ PvpPhysicalSkillDefenceBonus: Physical skill defence stat when taking damage fro RandomizeHate: Target NPC stops hating you and starts hating random target with your hate. RealDamage: Static damage. RebalanceHP: Balances targets' current HP. +RebalanceHPSummon: Balances targets' current HP for summons. Recovery: Decreases death penalty level. ReduceCancel: Magic skill casting interruption stat. ReduceDropPenalty: Reduces EXP lost and death penalty chance. diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/EffectMasterHandler.java index 980dbf1447..314466d346 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -261,6 +261,7 @@ public final class EffectMasterHandler EffectHandler.getInstance().registerHandler("RandomizeHate", RandomizeHate::new); EffectHandler.getInstance().registerHandler("RealDamage", RealDamage::new); EffectHandler.getInstance().registerHandler("RebalanceHP", RebalanceHP::new); + EffectHandler.getInstance().registerHandler("RebalanceHPSummon", RebalanceHPSummon::new); EffectHandler.getInstance().registerHandler("Recovery", Recovery::new); EffectHandler.getInstance().registerHandler("ReduceDamage", ReduceDamage::new); EffectHandler.getInstance().registerHandler("ReduceCancel", ReduceCancel::new); diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java index dfa3ce0847..4da04876fc 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java @@ -60,150 +60,94 @@ public final class RebalanceHP extends AbstractEffect double fullHP = 0; double currentHPs = 0; final L2Party party = effector.getParty(); - - switch (skill.getTargetType()) + if (party != null) { - case MY_PARTY: + for (L2PcInstance member : party.getMembers()) { - if (party != null) + if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) { - for (L2PcInstance member : party.getMembers()) + fullHP += member.getMaxHp(); + currentHPs += member.getCurrentHp(); + } + + final L2Summon summon = member.getPet(); + if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) + { + fullHP += summon.getMaxHp(); + currentHPs += summon.getCurrentHp(); + } + + for (L2Summon servitors : member.getServitors().values()) + { + if (!servitors.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, servitors, true)) { - if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) + fullHP += servitors.getMaxHp(); + currentHPs += servitors.getCurrentHp(); + } + } + } + + double percentHP = currentHPs / fullHP; + for (L2PcInstance member : party.getMembers()) + { + if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) + { + double newHP = member.getMaxHp() * percentHP; + if (newHP > member.getCurrentHp()) // The target gets healed + { + // The heal will be blocked if the current hp passes the limit + if (member.getCurrentHp() > member.getMaxRecoverableHp()) { - fullHP += member.getMaxHp(); - currentHPs += member.getCurrentHp(); + newHP = member.getCurrentHp(); } - - final L2Summon summon = member.getPet(); - if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) + else if (newHP > member.getMaxRecoverableHp()) { - fullHP += summon.getMaxHp(); - currentHPs += summon.getCurrentHp(); - } - - for (L2Summon servitors : member.getServitors().values()) - { - fullHP += servitors.getMaxHp(); - currentHPs += servitors.getCurrentHp(); + newHP = member.getMaxRecoverableHp(); } } - final double percentHP = currentHPs / fullHP; - for (L2PcInstance member : party.getMembers()) - { - if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) - { - double newHP = member.getMaxHp() * percentHP; - if (newHP > member.getCurrentHp()) // The target gets healed - { - // The heal will be blocked if the current hp passes the limit - if (member.getCurrentHp() > member.getMaxRecoverableHp()) - { - newHP = member.getCurrentHp(); - } - else if (newHP > member.getMaxRecoverableHp()) - { - newHP = member.getMaxRecoverableHp(); - } - } - - member.setCurrentHp(newHP); - } - - final L2Summon summon = member.getPet(); - if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) - { - double newHP = summon.getMaxHp() * percentHP; - if (newHP > summon.getCurrentHp()) // The target gets healed - { - // The heal will be blocked if the current hp passes the limit - if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) - { - newHP = summon.getCurrentHp(); - } - else if (newHP > summon.getMaxRecoverableHp()) - { - newHP = summon.getMaxRecoverableHp(); - } - } - summon.setCurrentHp(newHP); - } - - for (L2Summon servitors : member.getServitors().values()) - { - if (!servitors.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) - { - double newHP = servitors.getMaxHp() * percentHP; - if (newHP > servitors.getCurrentHp()) // The target gets healed - { - // The heal will be blocked if the current hp passes the limit - if (servitors.getCurrentHp() > servitors.getMaxRecoverableHp()) - { - newHP = servitors.getCurrentHp(); - } - else if (newHP > servitors.getMaxRecoverableHp()) - { - newHP = servitors.getMaxRecoverableHp(); - } - } - servitors.setCurrentHp(newHP); - } - } - } - } - break; - } - case SUMMON: - { - for (L2Summon summon : effector.getServitors().values()) - { - if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) - { - fullHP += summon.getMaxHp(); - currentHPs += summon.getCurrentHp(); - } + member.setCurrentHp(newHP); } - fullHP += effector.getMaxHp(); - fullHP += effector.getCurrentHp(); - - final double percentHP = currentHPs / fullHP; - for (L2Summon summon : effector.getServitors().values()) + final L2Summon summon = member.getPet(); + if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) { - if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) + double newHP = summon.getMaxHp() * percentHP; + if (newHP > summon.getCurrentHp()) // The target gets healed { - double newHP = summon.getMaxHp() * percentHP; - if (newHP > summon.getCurrentHp()) // The target gets healed + // The heal will be blocked if the current hp passes the limit + if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) + { + newHP = summon.getCurrentHp(); + } + else if (newHP > summon.getMaxRecoverableHp()) + { + newHP = summon.getMaxRecoverableHp(); + } + } + summon.setCurrentHp(newHP); + } + + for (L2Summon servitors : member.getServitors().values()) + { + if (!servitors.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, servitors, true)) + { + double newHP = servitors.getMaxHp() * percentHP; + if (newHP > servitors.getCurrentHp()) // The target gets healed { // The heal will be blocked if the current hp passes the limit - if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) + if (servitors.getCurrentHp() > servitors.getMaxRecoverableHp()) { - newHP = summon.getCurrentHp(); + newHP = servitors.getCurrentHp(); } - else if (newHP > summon.getMaxRecoverableHp()) + else if (newHP > servitors.getMaxRecoverableHp()) { - newHP = summon.getMaxRecoverableHp(); + newHP = servitors.getMaxRecoverableHp(); } } - - summon.setCurrentHp(newHP); + servitors.setCurrentHp(newHP); } } - - double newHP = effector.getMaxHp() * percentHP; - if (newHP > effector.getCurrentHp()) - { - if (effector.getCurrentHp() > effector.getMaxRecoverableHp()) - { - newHP = effector.getCurrentHp(); - } - else if (newHP > effector.getMaxRecoverableHp()) - { - newHP = effector.getMaxRecoverableHp(); - } - } - effector.setCurrentHp(newHP); } } } diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java new file mode 100644 index 0000000000..19a82ed230 --- /dev/null +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java @@ -0,0 +1,111 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package handlers.effecthandlers; + +import com.l2jmobius.gameserver.model.StatsSet; +import com.l2jmobius.gameserver.model.actor.L2Character; +import com.l2jmobius.gameserver.model.actor.L2Summon; +import com.l2jmobius.gameserver.model.effects.AbstractEffect; +import com.l2jmobius.gameserver.model.effects.L2EffectType; +import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; +import com.l2jmobius.gameserver.model.skills.Skill; +import com.l2jmobius.gameserver.util.Util; + +/** + * Rebalance HP effect implementation. + * @author Adry_85, earendil + */ +public class RebalanceHPSummon extends AbstractEffect +{ + public RebalanceHPSummon(StatsSet params) + { + } + + @Override + public L2EffectType getEffectType() + { + return L2EffectType.REBALANCE_HP; + } + + @Override + public boolean isInstant() + { + return true; + } + + @Override + public void instant(L2Character effector, L2Character effected, Skill skill, L2ItemInstance item) + { + if (!effector.isPlayer()) + { + return; + } + + double fullHP = 0; + double currentHPs = 0; + + for (L2Summon summon : effector.getServitors().values()) + { + if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) + { + fullHP += summon.getMaxHp(); + currentHPs += summon.getCurrentHp(); + } + } + + fullHP += effector.getMaxHp(); + currentHPs += effector.getCurrentHp(); + + double percentHP = currentHPs / fullHP; + for (L2Summon summon : effector.getServitors().values()) + { + if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) + { + double newHP = summon.getMaxHp() * percentHP; + if (newHP > summon.getCurrentHp()) // The target gets healed + { + // The heal will be blocked if the current hp passes the limit + if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) + { + newHP = summon.getCurrentHp(); + } + else if (newHP > summon.getMaxRecoverableHp()) + { + newHP = summon.getMaxRecoverableHp(); + } + } + + summon.setCurrentHp(newHP); + } + } + + double newHP = effector.getMaxHp() * percentHP; + if (newHP > effector.getCurrentHp()) // The target gets healed + { + // The heal will be blocked if the current hp passes the limit + if (effector.getCurrentHp() > effector.getMaxRecoverableHp()) + { + newHP = effector.getCurrentHp(); + } + else if (newHP > effector.getMaxRecoverableHp()) + { + newHP = effector.getMaxRecoverableHp(); + } + } + effector.setCurrentHp(newHP); + } +} diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/skills/documentation.txt index a9b94b0bf3..a96a9d4e06 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/skills/documentation.txt @@ -230,6 +230,7 @@ PvpPhysicalSkillDefenceBonus: Physical skill defence stat when taking damage fro RandomizeHate: Target NPC stops hating you and starts hating random target with your hate. RealDamage: Static damage. RebalanceHP: Balances targets' current HP. +RebalanceHPSummon: Balances targets' current HP for summons. Recovery: Decreases death penalty level. ReduceCancel: Magic skill casting interruption stat. ReduceDropPenalty: Reduces EXP lost and death penalty chance. diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/EffectMasterHandler.java index 60b8d8e62b..cac16a920d 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -256,6 +256,7 @@ public final class EffectMasterHandler EffectHandler.getInstance().registerHandler("RandomizeHate", RandomizeHate::new); EffectHandler.getInstance().registerHandler("RealDamage", RealDamage::new); EffectHandler.getInstance().registerHandler("RebalanceHP", RebalanceHP::new); + EffectHandler.getInstance().registerHandler("RebalanceHPSummon", RebalanceHPSummon::new); EffectHandler.getInstance().registerHandler("Recovery", Recovery::new); EffectHandler.getInstance().registerHandler("ReduceDamage", ReduceDamage::new); EffectHandler.getInstance().registerHandler("ReduceCancel", ReduceCancel::new); diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java index dfa3ce0847..4da04876fc 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java @@ -60,150 +60,94 @@ public final class RebalanceHP extends AbstractEffect double fullHP = 0; double currentHPs = 0; final L2Party party = effector.getParty(); - - switch (skill.getTargetType()) + if (party != null) { - case MY_PARTY: + for (L2PcInstance member : party.getMembers()) { - if (party != null) + if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) { - for (L2PcInstance member : party.getMembers()) + fullHP += member.getMaxHp(); + currentHPs += member.getCurrentHp(); + } + + final L2Summon summon = member.getPet(); + if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) + { + fullHP += summon.getMaxHp(); + currentHPs += summon.getCurrentHp(); + } + + for (L2Summon servitors : member.getServitors().values()) + { + if (!servitors.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, servitors, true)) { - if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) + fullHP += servitors.getMaxHp(); + currentHPs += servitors.getCurrentHp(); + } + } + } + + double percentHP = currentHPs / fullHP; + for (L2PcInstance member : party.getMembers()) + { + if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) + { + double newHP = member.getMaxHp() * percentHP; + if (newHP > member.getCurrentHp()) // The target gets healed + { + // The heal will be blocked if the current hp passes the limit + if (member.getCurrentHp() > member.getMaxRecoverableHp()) { - fullHP += member.getMaxHp(); - currentHPs += member.getCurrentHp(); + newHP = member.getCurrentHp(); } - - final L2Summon summon = member.getPet(); - if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) + else if (newHP > member.getMaxRecoverableHp()) { - fullHP += summon.getMaxHp(); - currentHPs += summon.getCurrentHp(); - } - - for (L2Summon servitors : member.getServitors().values()) - { - fullHP += servitors.getMaxHp(); - currentHPs += servitors.getCurrentHp(); + newHP = member.getMaxRecoverableHp(); } } - final double percentHP = currentHPs / fullHP; - for (L2PcInstance member : party.getMembers()) - { - if (!member.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, member, true)) - { - double newHP = member.getMaxHp() * percentHP; - if (newHP > member.getCurrentHp()) // The target gets healed - { - // The heal will be blocked if the current hp passes the limit - if (member.getCurrentHp() > member.getMaxRecoverableHp()) - { - newHP = member.getCurrentHp(); - } - else if (newHP > member.getMaxRecoverableHp()) - { - newHP = member.getMaxRecoverableHp(); - } - } - - member.setCurrentHp(newHP); - } - - final L2Summon summon = member.getPet(); - if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) - { - double newHP = summon.getMaxHp() * percentHP; - if (newHP > summon.getCurrentHp()) // The target gets healed - { - // The heal will be blocked if the current hp passes the limit - if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) - { - newHP = summon.getCurrentHp(); - } - else if (newHP > summon.getMaxRecoverableHp()) - { - newHP = summon.getMaxRecoverableHp(); - } - } - summon.setCurrentHp(newHP); - } - - for (L2Summon servitors : member.getServitors().values()) - { - if (!servitors.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) - { - double newHP = servitors.getMaxHp() * percentHP; - if (newHP > servitors.getCurrentHp()) // The target gets healed - { - // The heal will be blocked if the current hp passes the limit - if (servitors.getCurrentHp() > servitors.getMaxRecoverableHp()) - { - newHP = servitors.getCurrentHp(); - } - else if (newHP > servitors.getMaxRecoverableHp()) - { - newHP = servitors.getMaxRecoverableHp(); - } - } - servitors.setCurrentHp(newHP); - } - } - } - } - break; - } - case SUMMON: - { - for (L2Summon summon : effector.getServitors().values()) - { - if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) - { - fullHP += summon.getMaxHp(); - currentHPs += summon.getCurrentHp(); - } + member.setCurrentHp(newHP); } - fullHP += effector.getMaxHp(); - fullHP += effector.getCurrentHp(); - - final double percentHP = currentHPs / fullHP; - for (L2Summon summon : effector.getServitors().values()) + final L2Summon summon = member.getPet(); + if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) { - if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) + double newHP = summon.getMaxHp() * percentHP; + if (newHP > summon.getCurrentHp()) // The target gets healed { - double newHP = summon.getMaxHp() * percentHP; - if (newHP > summon.getCurrentHp()) // The target gets healed + // The heal will be blocked if the current hp passes the limit + if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) + { + newHP = summon.getCurrentHp(); + } + else if (newHP > summon.getMaxRecoverableHp()) + { + newHP = summon.getMaxRecoverableHp(); + } + } + summon.setCurrentHp(newHP); + } + + for (L2Summon servitors : member.getServitors().values()) + { + if (!servitors.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, servitors, true)) + { + double newHP = servitors.getMaxHp() * percentHP; + if (newHP > servitors.getCurrentHp()) // The target gets healed { // The heal will be blocked if the current hp passes the limit - if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) + if (servitors.getCurrentHp() > servitors.getMaxRecoverableHp()) { - newHP = summon.getCurrentHp(); + newHP = servitors.getCurrentHp(); } - else if (newHP > summon.getMaxRecoverableHp()) + else if (newHP > servitors.getMaxRecoverableHp()) { - newHP = summon.getMaxRecoverableHp(); + newHP = servitors.getMaxRecoverableHp(); } } - - summon.setCurrentHp(newHP); + servitors.setCurrentHp(newHP); } } - - double newHP = effector.getMaxHp() * percentHP; - if (newHP > effector.getCurrentHp()) - { - if (effector.getCurrentHp() > effector.getMaxRecoverableHp()) - { - newHP = effector.getCurrentHp(); - } - else if (newHP > effector.getMaxRecoverableHp()) - { - newHP = effector.getMaxRecoverableHp(); - } - } - effector.setCurrentHp(newHP); } } } diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java new file mode 100644 index 0000000000..19a82ed230 --- /dev/null +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/RebalanceHPSummon.java @@ -0,0 +1,111 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package handlers.effecthandlers; + +import com.l2jmobius.gameserver.model.StatsSet; +import com.l2jmobius.gameserver.model.actor.L2Character; +import com.l2jmobius.gameserver.model.actor.L2Summon; +import com.l2jmobius.gameserver.model.effects.AbstractEffect; +import com.l2jmobius.gameserver.model.effects.L2EffectType; +import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; +import com.l2jmobius.gameserver.model.skills.Skill; +import com.l2jmobius.gameserver.util.Util; + +/** + * Rebalance HP effect implementation. + * @author Adry_85, earendil + */ +public class RebalanceHPSummon extends AbstractEffect +{ + public RebalanceHPSummon(StatsSet params) + { + } + + @Override + public L2EffectType getEffectType() + { + return L2EffectType.REBALANCE_HP; + } + + @Override + public boolean isInstant() + { + return true; + } + + @Override + public void instant(L2Character effector, L2Character effected, Skill skill, L2ItemInstance item) + { + if (!effector.isPlayer()) + { + return; + } + + double fullHP = 0; + double currentHPs = 0; + + for (L2Summon summon : effector.getServitors().values()) + { + if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) + { + fullHP += summon.getMaxHp(); + currentHPs += summon.getCurrentHp(); + } + } + + fullHP += effector.getMaxHp(); + currentHPs += effector.getCurrentHp(); + + double percentHP = currentHPs / fullHP; + for (L2Summon summon : effector.getServitors().values()) + { + if (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) + { + double newHP = summon.getMaxHp() * percentHP; + if (newHP > summon.getCurrentHp()) // The target gets healed + { + // The heal will be blocked if the current hp passes the limit + if (summon.getCurrentHp() > summon.getMaxRecoverableHp()) + { + newHP = summon.getCurrentHp(); + } + else if (newHP > summon.getMaxRecoverableHp()) + { + newHP = summon.getMaxRecoverableHp(); + } + } + + summon.setCurrentHp(newHP); + } + } + + double newHP = effector.getMaxHp() * percentHP; + if (newHP > effector.getCurrentHp()) // The target gets healed + { + // The heal will be blocked if the current hp passes the limit + if (effector.getCurrentHp() > effector.getMaxRecoverableHp()) + { + newHP = effector.getCurrentHp(); + } + else if (newHP > effector.getMaxRecoverableHp()) + { + newHP = effector.getMaxRecoverableHp(); + } + } + effector.setCurrentHp(newHP); + } +} diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/stats/skills/documentation.txt index ff4539897f..f60642995a 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/stats/skills/documentation.txt @@ -225,6 +225,7 @@ PvpPhysicalSkillDefenceBonus: Physical skill defence stat when taking damage fro RandomizeHate: Target NPC stops hating you and starts hating random target with your hate. RealDamage: Static damage. RebalanceHP: Balances targets' current HP. +RebalanceHPSummon: Balances targets' current HP for summons. Recovery: Decreases death penalty level. ReduceCancel: Magic skill casting interruption stat. ReduceDropPenalty: Reduces EXP lost and death penalty chance.